Browse Source

add second color to pause text and flip between them

Thomas B 1 month ago
parent
commit
035393ca42
7 changed files with 52 additions and 15 deletions
  1. 4
    1
      Makefile
  2. BIN
      data/pause.png
  3. 10
    3
      src/game.c
  4. 3
    1
      src/maps.c
  5. 15
    1
      src/sprite_data.c
  6. 4
    1
      src/sprite_data.h
  7. 16
    8
      src/sprites.c

+ 4
- 1
Makefile View File

117
 	,$(if $(findstring _spr24,$<),                                                          \
117
 	,$(if $(findstring _spr24,$<),                                                          \
118
 		@echo "Converting 24x24 sprite $<" &&                                           \
118
 		@echo "Converting 24x24 sprite $<" &&                                           \
119
 		$(PNGA) $< -o $@ -spr8x8 -sw 24 -sh 24 -noflip                                  \
119
 		$(PNGA) $< -o $@ -spr8x8 -sw 24 -sh 24 -noflip                                  \
120
+	,$(if $(findstring pause,$<),                                                           \
121
+		@echo "Converting 40x16 sprite $<" &&                                           \
122
+		$(PNGA) $< -o $@ -spr8x8 -sw 40 -sh 16 -noflip                                  \
120
 	,$(if $(findstring _sgb,$<),                                                            \
123
 	,$(if $(findstring _sgb,$<),                                                            \
121
 		@echo "Converting sgb border $<" &&                                             \
124
 		@echo "Converting sgb border $<" &&                                             \
122
 		$(PNGA) $< -o $@ -map -bpp 4 -max_palettes 4 -pack_mode sgb -use_map_attributes \
125
 		$(PNGA) $< -o $@ -map -bpp 4 -max_palettes 4 -pack_mode sgb -use_map_attributes \
123
 	,                                                                                       \
126
 	,                                                                                       \
124
 		@echo "Converting tile $<" &&                                                   \
127
 		@echo "Converting tile $<" &&                                                   \
125
 		$(PNGA) $< -o $@ -spr8x8                                                        \
128
 		$(PNGA) $< -o $@ -spr8x8                                                        \
126
-	))))))
129
+	)))))))
127
 
130
 
128
 $(BUILD_DIR)/%.o: %.c $(SPRITES)
131
 $(BUILD_DIR)/%.o: %.c $(SPRITES)
129
 	@mkdir -p $(@D)
132
 	@mkdir -p $(@D)

BIN
data/pause.png View File


+ 10
- 3
src/game.c View File

39
 #define BAR_OFFSET_X (4 - 80)
39
 #define BAR_OFFSET_X (4 - 80)
40
 #define HEALTH_OFFSET_Y -16
40
 #define HEALTH_OFFSET_Y -16
41
 #define POWER_OFFSET_Y 16
41
 #define POWER_OFFSET_Y 16
42
+#define PAUSE_BLINK_FRAMES 32
42
 
43
 
43
 static uint8_t pause_screen(void) {
44
 static uint8_t pause_screen(void) {
44
-    uint8_t hiwater = SPR_NUM_START;
45
-    spr_draw(SPR_PAUSE, FLIP_NONE, 0, 0, 0, &hiwater);
46
-    hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
45
+    uint8_t n = 0;
47
 
46
 
48
     while (1) {
47
     while (1) {
49
         key_read();
48
         key_read();
49
+
50
         if (key_pressed(J_START)) {
50
         if (key_pressed(J_START)) {
51
             break;
51
             break;
52
         } else if (key_pressed(J_SELECT)) {
52
         } else if (key_pressed(J_SELECT)) {
53
             return 1;
53
             return 1;
54
         }
54
         }
55
+
56
+        n = (n + 1) & (PAUSE_BLINK_FRAMES - 1);
57
+
58
+        uint8_t hiwater = SPR_NUM_START;
59
+        spr_draw(SPR_PAUSE, FLIP_NONE, 0, 0, (n < (PAUSE_BLINK_FRAMES / 2)) ? 0 : 1, &hiwater);
60
+        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
61
+
55
         vsync();
62
         vsync();
56
     }
63
     }
57
 
64
 

+ 3
- 1
src/maps.c View File

81
 
81
 
82
     SWITCH_ROM(BANK(numbers_fnt));
82
     SWITCH_ROM(BANK(numbers_fnt));
83
     set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT, numbers_fnt_PALETTE_COUNT, numbers_fnt_palettes);
83
     set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT, numbers_fnt_PALETTE_COUNT, numbers_fnt_palettes);
84
-    set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT + numbers_fnt_PALETTE_COUNT, numbers_fnt_PALETTE_COUNT, num_pal_inv);
85
     set_win_data(fnt_off, numbers_fnt_TILE_COUNT, numbers_fnt_tiles);
84
     set_win_data(fnt_off, numbers_fnt_TILE_COUNT, numbers_fnt_tiles);
86
 
85
 
86
+    SWITCH_ROM(BANK(maps));
87
+    set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT + numbers_fnt_PALETTE_COUNT, numbers_fnt_PALETTE_COUNT, num_pal_inv);
88
+
87
     if (is_splash) {
89
     if (is_splash) {
88
         SWITCH_ROM(BANK(text_fnt));
90
         SWITCH_ROM(BANK(text_fnt));
89
         set_win_data(fnt_off + numbers_fnt_TILE_COUNT, text_fnt_TILE_COUNT, text_fnt_tiles);
91
         set_win_data(fnt_off + numbers_fnt_TILE_COUNT, text_fnt_TILE_COUNT, text_fnt_tiles);

+ 15
- 1
src/sprite_data.c View File

32
 
32
 
33
 BANKREF(power_palettes)
33
 BANKREF(power_palettes)
34
 
34
 
35
+/*
36
+ * OCP0: Rocketship (1)
37
+ * OCP1: Rocketship (2)
38
+ * OCP2: Light
39
+ * OCP3: Dark
40
+ * OCP4: Shot
41
+ * OCP5: Health
42
+ * OCP6: Power
43
+ * OCP7: Pause
44
+ *
45
+ * Explosion uses OCP0 to OCP3 at end of game.
46
+ * Pause is flipped in-place for animating the pause screen colors.
47
+ */
48
+
35
 const palette_color_t power_palettes[4] = {
49
 const palette_color_t power_palettes[4] = {
36
   //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
50
   //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
37
     RGB8(  0,  0,  0), RGB8(  0,240,  0), RGB8(  0,196,  0), RGB8(  0,116,  0)
51
     RGB8(  0,  0,  0), RGB8(  0,240,  0), RGB8(  0,196,  0), RGB8(  0,116,  0)
143
         .ti = pause_tiles,
157
         .ti = pause_tiles,
144
         .pa = pause_palettes,
158
         .pa = pause_palettes,
145
         .pa_n = pause_PALETTE_COUNT,
159
         .pa_n = pause_PALETTE_COUNT,
146
-        .pa_i = OAMF_CGB_PAL7,
160
+        .pa_i = OAMF_CGB_PAL7 | PALETTE_DYNAMIC_LOAD_IP,
147
         .cnt = pause_TILE_COUNT,
161
         .cnt = pause_TILE_COUNT,
148
         .off = TILE_NUM_START,
162
         .off = TILE_NUM_START,
149
         .bank = BANK(pause),
163
         .bank = BANK(pause),

+ 4
- 1
src/sprite_data.h View File

32
 // Metasprite tiles are loaded into VRAM starting at tile number 0
32
 // Metasprite tiles are loaded into VRAM starting at tile number 0
33
 #define TILE_NUM_START 0
33
 #define TILE_NUM_START 0
34
 
34
 
35
-#define PALETTE_DYNAMIC_LOAD 0xF0
35
+#define PALETTE_PRELOAD 0x00
36
+#define PALETTE_DYNAMIC_LOAD 0x10
37
+#define PALETTE_DYNAMIC_LOAD_IP 0x20
36
 #define PALETTE_NO_FLAGS 0x0F
38
 #define PALETTE_NO_FLAGS 0x0F
39
+#define PALETTE_ALL_FLAGS 0xF0
37
 
40
 
38
 #define ARR_LEN(x) (sizeof(x) / sizeof(x[0]))
41
 #define ARR_LEN(x) (sizeof(x) / sizeof(x[0]))
39
 
42
 

+ 16
- 8
src/sprites.c View File

45
             SWITCH_ROM(metasprites[i].bank);
45
             SWITCH_ROM(metasprites[i].bank);
46
         }
46
         }
47
 
47
 
48
-        if ((metasprites[i].pa != NULL) && (!(metasprites[i].pa_i & 0xF0))) {
48
+        if ((metasprites[i].pa != NULL) && ((metasprites[i].pa_i & PALETTE_ALL_FLAGS) == PALETTE_PRELOAD)) {
49
             set_sprite_palette(metasprites[i].pa_i, metasprites[i].pa_n, metasprites[i].pa);
49
             set_sprite_palette(metasprites[i].pa_i, metasprites[i].pa_n, metasprites[i].pa);
50
         }
50
         }
51
     }
51
     }
60
         frame = 0;
60
         frame = 0;
61
     }
61
     }
62
 
62
 
63
-    if (metasprites[sprite].pa_i & PALETTE_DYNAMIC_LOAD) {
63
+    uint8_t pa_off = 0;
64
+
65
+    if ((metasprites[sprite].pa_i & PALETTE_ALL_FLAGS) == PALETTE_DYNAMIC_LOAD) {
64
         uint8_t pa_i = frame;
66
         uint8_t pa_i = frame;
65
         if (pa_i >= metasprites[sprite].pa_n) {
67
         if (pa_i >= metasprites[sprite].pa_n) {
66
             pa_i = 0;
68
             pa_i = 0;
67
         }
69
         }
68
 
70
 
69
-        // used for explosion. just overwrite our fist four palettes. we dont need them at the end of the game.
70
-        set_sprite_palette((metasprites[sprite].pa_i & PALETTE_NO_FLAGS) + pa_i, 1, metasprites[sprite].pa + (pa_i * 1));
71
+        set_sprite_palette((metasprites[sprite].pa_i & PALETTE_NO_FLAGS) + pa_i, 1, metasprites[sprite].pa + (pa_i * 4));
72
+    } else if ((metasprites[sprite].pa_i & PALETTE_ALL_FLAGS) == PALETTE_DYNAMIC_LOAD_IP) {
73
+        pa_off = frame;
74
+        if (pa_off >= metasprites[sprite].pa_n) {
75
+            pa_off = 0;
76
+        }
77
+
78
+        set_sprite_palette((metasprites[sprite].pa_i & PALETTE_NO_FLAGS), 1, metasprites[sprite].pa + (pa_off * 4));
71
     }
79
     }
72
 
80
 
73
     switch (flip) {
81
     switch (flip) {
74
         case FLIP_Y:
82
         case FLIP_Y:
75
             *hiwater += move_metasprite_flipy(
83
             *hiwater += move_metasprite_flipy(
76
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
84
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
77
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
85
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
78
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
86
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
79
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
87
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
80
             break;
88
             break;
82
         case FLIP_XY:
90
         case FLIP_XY:
83
             *hiwater += move_metasprite_flipxy(
91
             *hiwater += move_metasprite_flipxy(
84
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
92
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
85
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
93
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
86
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
94
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
87
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
95
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
88
             break;
96
             break;
90
         case FLIP_X:
98
         case FLIP_X:
91
             *hiwater += move_metasprite_flipx(
99
             *hiwater += move_metasprite_flipx(
92
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
100
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
93
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
101
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
94
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
102
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
95
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
103
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
96
             break;
104
             break;
99
         default:
107
         default:
100
             *hiwater += move_metasprite_ex(
108
             *hiwater += move_metasprite_ex(
101
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
109
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
102
-                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
110
+                    (metasprites[sprite].pa_i - pa_off) & PALETTE_NO_FLAGS, *hiwater,
103
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
111
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
104
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
112
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
105
             break;
113
             break;

Loading…
Cancel
Save