Browse Source

fix: hide leftover sprites on game over/victory and add VICTORY text

master
Matteo Benedetto 3 days ago
parent
commit
0dceedc842
  1. 53
      prepare_victory.py
  2. 13
      src/main.c
  3. 62
      src/victory_bg.c
  4. 2
      src/victory_bg.h

53
prepare_victory.py

@ -30,20 +30,69 @@ palette_img[(np_img >= 64) & (np_img < 128)] = 2
palette_img[(np_img >= 128) & (np_img < 192)] = 1
palette_img[np_img >= 192] = 0
# Draw VICTORY! text
font = {
'V': ["# #", "# #", "# #", "# #", "# #", " # # ", " # "],
'I': [" ### ", " # ", " # ", " # ", " # ", " # ", " ### "],
'C': [" ### ", "# #", "# ", "# ", "# ", "# #", " ### "],
'T': ["#####", " # ", " # ", " # ", " # ", " # ", " # "],
'O': [" ### ", "# #", "# #", "# #", "# #", "# #", " ### "],
'R': ["#### ", "# #", "# #", "#### ", "# # ", "# # ", "# #"],
'Y': ["# #", "# #", " # # ", " # ", " # ", " # ", " # "],
'!': [" # ", " # ", " # ", " # ", " ", " # ", " # "]
}
text_str = "VICTORY!"
scale = 2
char_w = 5 * scale
char_h = 7 * scale
spacing = 1 * scale
start_x = (160 - len(text_str) * (char_w + spacing)) // 2
start_y = 144 - char_h - 24 # A bit higher to leave room for the timer
is_text_mask = np.zeros_like(palette_img, dtype=bool)
box_pad = 2
for y in range(start_y - box_pad, start_y + char_h + box_pad):
for x in range(start_x - box_pad, start_x + len(text_str) * (char_w + spacing) + box_pad):
if 0 <= y < 144 and 0 <= x < 160:
palette_img[y, x] = 3 # Black background
is_text_mask[y, x] = True
for i, char in enumerate(text_str):
if char in font:
glyph = font[char]
for row in range(7):
for col in range(5):
if glyph[row][col] == '#':
for sy in range(scale):
for sx in range(scale):
py = start_y + row * scale + sy
px = start_x + i * (char_w + spacing) + col * scale + sx
if 0 <= py < 144 and 0 <= px < 160:
palette_img[py, px] = 0 # White text
is_text_mask[py, px] = True
tiles = []
is_text_tile = []
for y in range(0, 144, 8):
for x in range(0, 160, 8):
tile = palette_img[y:y+8, x:x+8]
t_tuple = tuple(map(tuple, tile))
tiles.append(t_tuple)
is_text_tile.append(np.any(is_text_mask[y:y+8, x:x+8]))
unique_tiles = list(collections.OrderedDict.fromkeys(tiles))
if len(unique_tiles) > 256:
print("WARNING: More than 256 unique tiles! Reducing...")
text_unique = list(collections.OrderedDict.fromkeys([tiles[i] for i in range(len(tiles)) if is_text_tile[i]]))
counts = collections.Counter(tiles)
most_common = [t for t, c in counts.most_common(256)]
reduced_unique = most_common
for t in text_unique:
if t in counts:
del counts[t]
most_common = [t for t, c in counts.most_common(256 - len(text_unique))]
reduced_unique = text_unique + most_common
for i in range(len(tiles)):
if tiles[i] not in reduced_unique:
t_arr = np.array(tiles[i])

13
src/main.c

@ -154,6 +154,14 @@ void main(void) {
while (1) {
if (game_over_flag || victory_flag) {
HIDE_SPRITES;
// Nascondi tutti gli sprite (spostandoli fuori dallo schermo visibile)
// Questo spiega perché prima vedevi i topi fermi: lo schermo era
// cambiato, ma gli sprite erano rimasti nelle loro posizioni.
for (uint8_t i = 0; i < 40; i++) {
move_sprite(i, 0, 0);
}
move_bkg(0, 0); // Resetta lo scrolling hardware
// Ripristina la palette normale (Nero=3, Bianco=0)
@ -239,6 +247,11 @@ void main(void) {
uint8_t keys = joypad();
// Debug cheat: forza vittoria con il tasto B
if ((keys & J_B) && !(main_prev_keys & J_B)) {
victory_flag = 1;
}
// Controllo per la Pausa
if ((keys & J_START) && !(main_prev_keys & J_START)) {
// Effetto sonoro pausa

62
src/victory_bg.c

@ -1,6 +1,6 @@
#include "victory_bg.h"
const uint8_t victory_bg_tiles[2384] = {
const uint8_t victory_bg_tiles[2480] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xF4, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF,
@ -112,28 +112,34 @@ const uint8_t victory_bg_tiles[2384] = {
0x3C, 0xFF, 0x1B, 0xFF, 0x39, 0xFF, 0x48, 0xFF, 0x64, 0xFF, 0x38, 0xFF, 0x18, 0xFF, 0x0C, 0xFF,
0x3C, 0xFF, 0xD8, 0xFF, 0x9C, 0xFF, 0x12, 0xFF, 0x26, 0xFF, 0x1C, 0xFF, 0x18, 0xFF, 0x30, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xE0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x07, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
0xFC, 0xFF, 0xF0, 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x07, 0xFF, 0x10, 0xFF, 0x0C, 0xFF, 0x03, 0xFF,
0x00, 0xFF, 0x00, 0xFF, 0xC0, 0xFF, 0xCC, 0xFF, 0xCA, 0xFF, 0x02, 0xFF, 0x73, 0xFF, 0xE3, 0xFF,
0x60, 0xFF, 0x60, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, 0xF9, 0xFF, 0xDC, 0xFF, 0xC4, 0xFF, 0xE0, 0xFF,
0x06, 0xFF, 0x0A, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x9F, 0xFF, 0x3B, 0xFF, 0x23, 0xFF, 0x07, 0xFF,
0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFF, 0x33, 0xFF, 0x53, 0xFF, 0x40, 0xFF, 0xCE, 0xFF, 0xC7, 0xFF,
0x3F, 0xFF, 0x0F, 0xFF, 0xC7, 0xFF, 0xE3, 0xFF, 0xE0, 0xFF, 0x08, 0xFF, 0x18, 0xFF, 0xC0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF,
0xFE, 0xFF, 0xF8, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x0D, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xF0, 0xFF,
0x60, 0xFF, 0xC0, 0xFF, 0x07, 0xFF, 0x0E, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x07, 0xFF,
0xF9, 0xFF, 0xFB, 0xFF, 0x7B, 0xFF, 0x09, 0xFF, 0x0C, 0xFF, 0x3D, 0xFF, 0x37, 0xFF, 0x63, 0xFF,
0x9F, 0xFF, 0xDF, 0xFF, 0xDE, 0xFF, 0x90, 0xFF, 0x30, 0xFF, 0xBC, 0xFF, 0xEC, 0xFF, 0xC6, 0xFF,
0x07, 0xFF, 0x03, 0xFF, 0xE0, 0xFF, 0x70, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xE0, 0xFF,
0xB0, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x0F, 0xFF,
0x7F, 0xFF, 0x1F, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x3C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xCC, 0xCC, 0xCC,
0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xCC, 0xCC, 0xCC, 0xF3, 0xF3, 0xF3, 0xF3,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, 0xFC,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x0F, 0x0F, 0x0F, 0x0F,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xC0, 0xC0, 0xC0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0x30, 0x30, 0x30, 0x30, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xF3, 0xF3, 0xF3, 0xF3,
0x0F, 0x0F, 0x0F, 0x0F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xCF, 0xCF, 0xCF, 0xF3, 0xF3, 0xF3, 0xF3,
0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3,
0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xF0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x0E, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x07, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x7B, 0xFF, 0x09, 0xFF, 0x0C, 0xFF, 0x3D, 0xFF, 0x37, 0xFF, 0x63, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xFF, 0x90, 0xFF, 0x30, 0xFF, 0xBC, 0xFF, 0xEC, 0xFF, 0xC6, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0x70, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xE0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x0F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xF8, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xE3, 0xFF,
0x88, 0xFF, 0x1C, 0xFF, 0x3E, 0xFF, 0x3E, 0xFF, 0x88, 0xFF, 0x47, 0xFF, 0x1F, 0xFF, 0xFE, 0xFF,
0x03, 0xFF, 0x02, 0xFF, 0x86, 0xFF, 0x66, 0xFF, 0x7C, 0xFF, 0x3C, 0xFF, 0x39, 0xFF, 0x19, 0xFF,
@ -166,9 +172,9 @@ const uint8_t victory_bg_map[360] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x6C, 0x6D, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x72, 0x75, 0x76, 0x77, 0x78, 0x6F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7C, 0x7F, 0x80, 0x81, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

2
src/victory_bg.h

@ -3,7 +3,7 @@
#include <stdint.h>
extern const uint8_t victory_bg_tiles[4096];
extern const uint8_t victory_bg_tiles[2480];
extern const uint8_t victory_bg_map[360];
#endif

Loading…
Cancel
Save