From fb6463dd40cdffb7cfc49c9c4bc1afe94f72240f Mon Sep 17 00:00:00 2001 From: hkz Date: Fri, 25 Jul 2025 09:48:48 +0200 Subject: [PATCH] Draw endgame box --- src/charset.h | 9 +++++---- src/game_graphics.c | 39 +++++++++++++++++++++++++++++++++++++++ src/game_graphics.h | 1 + src/input.c | 7 +++++++ src/input.h | 2 ++ src/main.c | 16 +++++++++++++++- 6 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/charset.h b/src/charset.h index c2a8746..3006afb 100644 --- a/src/charset.h +++ b/src/charset.h @@ -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_ */ diff --git a/src/game_graphics.c b/src/game_graphics.c index 6ec1252..e68976f 100644 --- a/src/game_graphics.c +++ b/src/game_graphics.c @@ -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++) { diff --git a/src/game_graphics.h b/src/game_graphics.h index 0f448e8..0ed447d 100644 --- a/src/game_graphics.h +++ b/src/game_graphics.h @@ -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_ */ diff --git a/src/input.c b/src/input.c index 61a5d7b..78b6927 100644 --- a/src/input.c +++ b/src/input.c @@ -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; +} diff --git a/src/input.h b/src/input.h index 404355d..fb54328 100644 --- a/src/input.h +++ b/src/input.h @@ -13,4 +13,6 @@ typedef enum { key read_kb(void); +uint8_t read_any_key(void); + #endif /* _INPUT_HEADER_ */ diff --git a/src/main.c b/src/main.c index 033c7a6..003a16e 100644 --- a/src/main.c +++ b/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);