Draw endgame box

This commit is contained in:
hkz 2025-07-25 09:48:48 +02:00
commit fb6463dd40
6 changed files with 69 additions and 5 deletions

View file

@ -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_ */

View file

@ -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++) {

View file

@ -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_ */

View file

@ -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;
}

View file

@ -13,4 +13,6 @@ typedef enum {
key read_kb(void);
uint8_t read_any_key(void);
#endif /* _INPUT_HEADER_ */

View file

@ -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);