mirror of
https://codeberg.org/hkzlab/TK2048.git
synced 2025-12-26 04:32:23 +11:00
Draw endgame box
This commit is contained in:
parent
f18b23b08a
commit
fb6463dd40
6 changed files with 69 additions and 5 deletions
|
|
@ -12,12 +12,13 @@
|
|||
// = > ?
|
||||
// Then graphic characters follow
|
||||
|
||||
#define ALPHA_OFFSET 8
|
||||
#define SYMBOL_OFFSET (28 * 8)
|
||||
#define NUM_OFFSET (48 * 8)
|
||||
|
||||
#define CHAR_HEIGHT 8
|
||||
|
||||
#define ALPHA_OFFSET (1 * CHAR_HEIGHT
|
||||
#define SYMBOL_OFFSET (28 * CHAR_HEIGHT)
|
||||
#define NUM_OFFSET (48 * CHAR_HEIGHT)
|
||||
#define GRAPH_OFFSET (58 * CHAR_HEIGHT)
|
||||
|
||||
const uint8_t* const CHARSET = (uint8_t*)0xF200;
|
||||
|
||||
#endif /* _CHARSET_HEADER_ */
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
#include "graph_misc_data.h"
|
||||
#include "arrows_pic.h"
|
||||
|
||||
#define SCREEN_WIDTH 280
|
||||
#define SCREEN_HEIGHT 192
|
||||
|
||||
#define SCREEN_WIDTH_B 40
|
||||
#define GRID_CELL_SIDE 35
|
||||
|
||||
|
|
@ -102,6 +105,42 @@ void draw_tiles(void) {
|
|||
draw_field_borders_on_buffer(0x0F, back_buf);
|
||||
}
|
||||
|
||||
#define ENDGAME_BOX_X_OFFSET 2
|
||||
#define ENDGAME_BOX_Y_OFFSET 16
|
||||
void ddraw_endgame_box(int8_t done, uint16_t score, uint16_t hi_score) {
|
||||
// Clear the part of the screen where we'll draw
|
||||
clear_box(SCREEN_WIDTH_B - (ENDGAME_BOX_X_OFFSET * 2), SCREEN_HEIGHT - (ENDGAME_BOX_Y_OFFSET * 2), ENDGAME_BOX_X_OFFSET, ENDGAME_BOX_Y_OFFSET, front_buf);
|
||||
|
||||
// Horizontal lines
|
||||
for(uint8_t row = 0; row < CHAR_HEIGHT; row++) {
|
||||
uint16_t offset_top = line_offset_map[ENDGAME_BOX_Y_OFFSET + CHAR_HEIGHT + row] + ENDGAME_BOX_X_OFFSET + 1;
|
||||
uint16_t offset_bottom = line_offset_map[SCREEN_HEIGHT - ENDGAME_BOX_Y_OFFSET - CHAR_HEIGHT + row] + ENDGAME_BOX_X_OFFSET + 1;
|
||||
for(uint8_t col = 0; col < SCREEN_WIDTH_B - ((ENDGAME_BOX_X_OFFSET * 2) + 2); col++) {
|
||||
front_buf[offset_top + col] = CHARSET[GRAPH_OFFSET + (12 * CHAR_HEIGHT) + row];
|
||||
front_buf[offset_bottom + col] = CHARSET[GRAPH_OFFSET + (12 * CHAR_HEIGHT) + row];
|
||||
}
|
||||
}
|
||||
|
||||
// Corners
|
||||
for(uint8_t row = 0; row < CHAR_HEIGHT; row++) {
|
||||
uint16_t offset_top = line_offset_map[ENDGAME_BOX_Y_OFFSET + CHAR_HEIGHT + row] + ENDGAME_BOX_X_OFFSET + 1;
|
||||
uint16_t offset_bottom = line_offset_map[SCREEN_HEIGHT - ENDGAME_BOX_Y_OFFSET - CHAR_HEIGHT + row] + ENDGAME_BOX_X_OFFSET + 1;
|
||||
|
||||
front_buf[offset_top] = CHARSET[GRAPH_OFFSET + (25 * CHAR_HEIGHT) + row];
|
||||
front_buf[offset_bottom] = CHARSET[GRAPH_OFFSET + (27 * CHAR_HEIGHT) + row];
|
||||
front_buf[offset_top + (SCREEN_WIDTH_B - ((ENDGAME_BOX_X_OFFSET * 2) + 2))] = CHARSET[GRAPH_OFFSET + (26 * CHAR_HEIGHT) + row];
|
||||
front_buf[offset_bottom + (SCREEN_WIDTH_B - ((ENDGAME_BOX_X_OFFSET * 2) + 2))] = CHARSET[GRAPH_OFFSET + (28 * CHAR_HEIGHT) + row];
|
||||
}
|
||||
|
||||
// Vertical lines
|
||||
for(uint8_t row = 0; row < ((SCREEN_HEIGHT - (ENDGAME_BOX_Y_OFFSET * 3) - CHAR_HEIGHT)) + 1; row++) {
|
||||
uint16_t offset = line_offset_map[ENDGAME_BOX_Y_OFFSET + (CHAR_HEIGHT * 2) + row] + ENDGAME_BOX_X_OFFSET + 1;
|
||||
|
||||
front_buf[offset] = CHARSET[GRAPH_OFFSET + (19 * CHAR_HEIGHT) + (row % CHAR_HEIGHT)];
|
||||
front_buf[offset + (SCREEN_WIDTH_B - ((ENDGAME_BOX_X_OFFSET * 2) + 2))] = CHARSET[GRAPH_OFFSET + (19 * CHAR_HEIGHT) + (row % CHAR_HEIGHT)];
|
||||
}
|
||||
}
|
||||
|
||||
// Note that the horizontal values here are in group of 7 pixels
|
||||
void clear_box(uint8_t w, uint8_t h, uint8_t off_x, uint8_t off_y, uint8_t *disp_buf) {
|
||||
for(uint8_t y = off_y; y < off_y + h; y++) {
|
||||
|
|
|
|||
|
|
@ -28,5 +28,6 @@ void ddraw_single_tile(uint8_t offset);
|
|||
void swap_display_buffers(void);
|
||||
void clear_box(uint8_t w, uint8_t h, uint8_t off_x, uint8_t off_y, uint8_t *disp_buf);
|
||||
void ddraw_direction_arrows(arrow_direction dir);
|
||||
void ddraw_endgame_box(int8_t done, uint16_t score, uint16_t hi_score);
|
||||
|
||||
#endif /* _GAME_GRAPHICS_HEADER_ */
|
||||
|
|
|
|||
|
|
@ -34,3 +34,10 @@ key read_kb(void) {
|
|||
return K_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t read_any_key(void) {
|
||||
PEEK(IO_KB_CTRL_LOW);
|
||||
|
||||
POKE(IO_DATAOUT, 0xFF);
|
||||
return PEEK(IO_DATAIN) & DATAIN_KB_MASK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,4 +13,6 @@ typedef enum {
|
|||
|
||||
key read_kb(void);
|
||||
|
||||
uint8_t read_any_key(void);
|
||||
|
||||
#endif /* _INPUT_HEADER_ */
|
||||
|
|
|
|||
16
src/main.c
16
src/main.c
|
|
@ -25,6 +25,7 @@
|
|||
#define WIN_SCORE_BONUS 10000
|
||||
|
||||
void init(void);
|
||||
void clear_display(void);
|
||||
|
||||
// Low level initialization
|
||||
void init(void) {
|
||||
|
|
@ -35,6 +36,10 @@ void init(void) {
|
|||
PEEK(IO_DISPLAY_PAGE1); // Select the first display page
|
||||
|
||||
// Clear display memory
|
||||
clear_display();
|
||||
}
|
||||
|
||||
void clear_display(void) {
|
||||
memset((void*)DISPLAY_PAGE_1, 0, DISPLAY_PAGE_SIZE);
|
||||
memset((void*)DISPLAY_PAGE_2, 0, DISPLAY_PAGE_SIZE);
|
||||
}
|
||||
|
|
@ -52,10 +57,19 @@ __task int main(void) {
|
|||
|
||||
// Check if we have a new high-score
|
||||
if (score > hi_score) hi_score = score;
|
||||
|
||||
// TODO: Draw a screen and wait for a key press here here
|
||||
BELL1();
|
||||
ddraw_endgame_box(done, score, hi_score);
|
||||
while(!read_any_key()) {
|
||||
lfsr_update();
|
||||
}
|
||||
BELL1();
|
||||
clear_display(); // Clear display again
|
||||
|
||||
// Reset the game, calculate the initial score depending on which tiles we randomly get
|
||||
score = reset_game();
|
||||
|
||||
|
||||
// Draw the initial state of the game
|
||||
draw_game_background();
|
||||
draw_number(moves_count, MOVES_TEXT_WIDTH, MOVES_TEXT_X, MOVES_TEXT_Y);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue