Browse Source

add no-fuel and fast-movement debug flags

Thomas B 1 month ago
parent
commit
7b4fda4cd0
6 changed files with 138 additions and 46 deletions
  1. 3
    0
      src/config.h
  2. 79
    20
      src/game.c
  3. 8
    6
      src/main.c
  4. 1
    1
      src/main.h
  5. 41
    12
      src/maps.c
  6. 6
    7
      src/window.c

+ 3
- 0
src/config.h View File

@@ -33,7 +33,10 @@ enum debug_flag {
33 33
     DBG_MARKER = (1 << 1),
34 34
     DBG_GOD_MODE = (1 << 2),
35 35
     DBG_NO_OBJ = (1 << 3),
36
+    DBG_NO_FUEL = (1 << 4),
37
+    DBG_FAST = (1 << 5),
36 38
 
39
+    // TODO could be something other than flags
37 40
     DBG_CLEAR_SCORE = (1 << 6),
38 41
     DBG_ZERO_SCORE = (1 << 7),
39 42
 };

+ 79
- 20
src/game.c View File

@@ -44,6 +44,7 @@
44 44
 #define SPEED_MAX_ACC 23
45 45
 #define SPEED_MAX_ACC_DIAG 16
46 46
 #define SPEED_MAX_IDLE 16
47
+#define SPEED_MAX_DBG 256
47 48
 
48 49
 #define POWER_MAX 0x1FF
49 50
 #define POWER_SHIFT 1
@@ -187,70 +188,120 @@ int32_t game(void) NONBANKED {
187 188
         }
188 189
 
189 190
         if (key_down(J_A) && (power > 0)) {
190
-            if (power >= POWER_DEC) {
191
-                power -= POWER_DEC;
192
-            } else {
193
-                power = 0;
191
+            if (!(conf_get()->debug_flags & DBG_NO_FUEL)) {
192
+                if (power >= POWER_DEC) {
193
+                    power -= POWER_DEC;
194
+                } else {
195
+                    power = 0;
196
+                }
194 197
             }
195 198
 
196 199
             switch (rot) {
197 200
                 case ROT_0:
198 201
                     spd_y -= SPEED_INC;
199
-                    if (spd_y < -SPEED_MAX_ACC) spd_y = -SPEED_MAX_ACC;
202
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
203
+                        if (spd_y < -SPEED_MAX_ACC) spd_y = -SPEED_MAX_ACC;
204
+                    } else {
205
+                        if (spd_y < -SPEED_MAX_DBG) spd_y = -SPEED_MAX_DBG;
206
+                    }
200 207
                     acc |= ACC_Y;
201 208
                     break;
202 209
 
203 210
                 case ROT_45:
204 211
                     spd_y -= SPEED_INC;
205
-                    if (spd_y < -SPEED_MAX_ACC_DIAG) spd_y += SPEED_DEC;
212
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
213
+                        if (spd_y < -SPEED_MAX_ACC_DIAG) spd_y = -SPEED_MAX_ACC_DIAG;
214
+                    } else {
215
+                        if (spd_y < -SPEED_MAX_DBG) spd_y = -SPEED_MAX_DBG;
216
+                    }
206 217
                     acc |= ACC_Y;
207 218
                     spd_x += SPEED_INC;
208
-                    if (spd_x > SPEED_MAX_ACC_DIAG) spd_x -= SPEED_DEC;
219
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
220
+                        if (spd_x > SPEED_MAX_ACC_DIAG) spd_x = SPEED_MAX_ACC_DIAG;
221
+                    } else {
222
+                        if (spd_x > SPEED_MAX_DBG) spd_x = SPEED_MAX_DBG;
223
+                    }
209 224
                     acc |= ACC_X;
210 225
                     break;
211 226
 
212 227
                 case ROT_90:
213 228
                     spd_x += SPEED_INC;
214
-                    if (spd_x > SPEED_MAX_ACC) spd_x = SPEED_MAX_ACC;
229
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
230
+                        if (spd_x > SPEED_MAX_ACC) spd_x = SPEED_MAX_ACC;
231
+                    } else {
232
+                        if (spd_x > SPEED_MAX_DBG) spd_x = SPEED_MAX_DBG;
233
+                    }
215 234
                     acc |= ACC_X;
216 235
                     break;
217 236
 
218 237
                 case ROT_135:
219 238
                     spd_x += SPEED_INC;
220
-                    if (spd_x > SPEED_MAX_ACC_DIAG) spd_x -= SPEED_DEC;
239
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
240
+                        if (spd_x > SPEED_MAX_ACC_DIAG) spd_x = SPEED_MAX_ACC_DIAG;
241
+                    } else {
242
+                        if (spd_x > SPEED_MAX_DBG) spd_x = SPEED_MAX_DBG;
243
+                    }
221 244
                     acc |= ACC_X;
222 245
                     spd_y += SPEED_INC;
223
-                    if (spd_y > SPEED_MAX_ACC_DIAG) spd_y -= SPEED_DEC;
246
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
247
+                        if (spd_y > SPEED_MAX_ACC_DIAG) spd_y = SPEED_MAX_ACC_DIAG;
248
+                    } else {
249
+                        if (spd_y > SPEED_MAX_DBG) spd_y = SPEED_MAX_DBG;
250
+                    }
224 251
                     acc |= ACC_Y;
225 252
                     break;
226 253
 
227 254
                 case ROT_180:
228 255
                     spd_y += SPEED_INC;
229
-                    if (spd_y > SPEED_MAX_ACC) spd_y = SPEED_MAX_ACC;
256
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
257
+                        if (spd_y > SPEED_MAX_ACC) spd_y = SPEED_MAX_ACC;
258
+                    } else {
259
+                        if (spd_y > SPEED_MAX_DBG) spd_y = SPEED_MAX_DBG;
260
+                    }
230 261
                     acc |= ACC_Y;
231 262
                     break;
232 263
 
233 264
                 case ROT_225:
234 265
                     spd_y += SPEED_INC;
235
-                    if (spd_y > SPEED_MAX_ACC_DIAG) spd_y -= SPEED_DEC;
266
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
267
+                        if (spd_y > SPEED_MAX_ACC_DIAG) spd_y = SPEED_MAX_ACC_DIAG;
268
+                    } else {
269
+                        if (spd_y > SPEED_MAX_DBG) spd_y = SPEED_MAX_DBG;
270
+                    }
236 271
                     acc |= ACC_Y;
237 272
                     spd_x -= SPEED_INC;
238
-                    if (spd_x < -SPEED_MAX_ACC_DIAG) spd_x += SPEED_DEC;
273
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
274
+                        if (spd_x < -SPEED_MAX_ACC_DIAG) spd_x = -SPEED_MAX_ACC_DIAG;
275
+                    } else {
276
+                        if (spd_x < -SPEED_MAX_DBG) spd_x = -SPEED_MAX_DBG;
277
+                    }
239 278
                     acc |= ACC_X;
240 279
                     break;
241 280
 
242 281
                 case ROT_270:
243 282
                     spd_x -= SPEED_INC;
244
-                    if (spd_x < -SPEED_MAX_ACC) spd_x = -SPEED_MAX_ACC;
283
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
284
+                        if (spd_x < -SPEED_MAX_ACC) spd_x = -SPEED_MAX_ACC;
285
+                    } else {
286
+                        if (spd_x < -SPEED_MAX_DBG) spd_x = -SPEED_MAX_DBG;
287
+                    }
245 288
                     acc |= ACC_X;
246 289
                     break;
247 290
 
248 291
                 case ROT_315:
249 292
                     spd_x -= SPEED_INC;
250
-                    if (spd_x < -SPEED_MAX_ACC_DIAG) spd_x += SPEED_DEC;
293
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
294
+                        if (spd_x < -SPEED_MAX_ACC_DIAG) spd_x = -SPEED_MAX_ACC_DIAG;
295
+                    } else {
296
+                        if (spd_x < -SPEED_MAX_DBG) spd_x = -SPEED_MAX_DBG;
297
+                    }
251 298
                     acc |= ACC_X;
252 299
                     spd_y -= SPEED_INC;
253
-                    if (spd_y < -SPEED_MAX_ACC_DIAG) spd_y += SPEED_DEC;
300
+                    if (!(conf_get()->debug_flags & DBG_FAST)) {
301
+                        if (spd_y < -SPEED_MAX_ACC_DIAG) spd_y = -SPEED_MAX_ACC_DIAG;
302
+                    } else {
303
+                        if (spd_y < -SPEED_MAX_DBG) spd_y = -SPEED_MAX_DBG;
304
+                    }
254 305
                     acc |= ACC_Y;
255 306
                     break;
256 307
 
@@ -268,14 +319,22 @@ int32_t game(void) NONBANKED {
268 319
         // adjust speed down when not moving
269 320
         if (!(acc & ACC_X)) {
270 321
             if (spd_x != 0) {
271
-                if (spd_x > SPEED_MAX_IDLE) spd_x -= SPEED_DEC;
272
-                else if (spd_x < -SPEED_MAX_IDLE) spd_x += SPEED_DEC;
322
+                if (!(conf_get()->debug_flags & DBG_FAST)) {
323
+                    if (spd_x > SPEED_MAX_IDLE) spd_x -= SPEED_DEC;
324
+                    else if (spd_x < -SPEED_MAX_IDLE) spd_x += SPEED_DEC;
325
+                } else {
326
+                    spd_x = 0;
327
+                }
273 328
             }
274 329
         }
275 330
         if (!(acc & ACC_Y)) {
276 331
             if (spd_y != 0) {
277
-                if (spd_y > SPEED_MAX_IDLE) spd_y -= SPEED_DEC;
278
-                else if (spd_y < -SPEED_MAX_IDLE) spd_y += SPEED_DEC;
332
+                if (!(conf_get()->debug_flags & DBG_FAST)) {
333
+                    if (spd_y > SPEED_MAX_IDLE) spd_y -= SPEED_DEC;
334
+                    else if (spd_y < -SPEED_MAX_IDLE) spd_y += SPEED_DEC;
335
+                } else {
336
+                    spd_y = 0;
337
+                }
279 338
             }
280 339
         }
281 340
 

+ 8
- 6
src/main.c View File

@@ -54,10 +54,12 @@ const struct debug_entry debug_entries[DEBUG_ENTRY_COUNT] = {
54 54
     { .name = "marker",   .flag = DBG_MARKER,      .max = 1 }, // 0
55 55
     { .name = "invuln",   .flag = DBG_GOD_MODE,    .max = 1 }, // 1
56 56
     { .name = "no-spawn", .flag = DBG_NO_OBJ,      .max = 1 }, // 2
57
-    { .name = "music",    .flag = DBG_NONE,        .max = SND_COUNT }, // 3
58
-    { .name = "sfx-test", .flag = DBG_NONE,        .max = SFX_COUNT }, // 4
59
-    { .name = "cl score", .flag = DBG_CLEAR_SCORE, .max = 1 }, // 5
60
-    { .name = "0 scores", .flag = DBG_ZERO_SCORE,  .max = 1 }, // 6
57
+    { .name = "no-fuel",  .flag = DBG_NO_FUEL,     .max = 1 }, // 3
58
+    { .name = "fastmove", .flag = DBG_FAST,        .max = 1 }, // 4
59
+    { .name = "music",    .flag = DBG_NONE,        .max = SND_COUNT }, // 5
60
+    { .name = "sfx-test", .flag = DBG_NONE,        .max = SFX_COUNT }, // 6
61
+    { .name = "cl score", .flag = DBG_CLEAR_SCORE, .max = 1 }, // 7
62
+    { .name = "0 scores", .flag = DBG_ZERO_SCORE,  .max = 1 }, // 8
61 63
 };
62 64
 
63 65
 static void highscore(uint8_t is_black) NONBANKED {
@@ -405,13 +407,13 @@ static void splash(void) NONBANKED {
405 407
                     snd_music(SND_MENU);
406 408
                 }
407 409
 
408
-                if (switch_special && (debug_menu_index == 3)) {
410
+                if (switch_special && (debug_menu_index == 5)) {
409 411
                     snd_music_off();
410 412
                     if (debug_special_value > 0) {
411 413
                         snd_music(debug_special_value - 1);
412 414
                     }
413 415
                     snd_note_off();
414
-                } else if ((switch_special || (!sample_running())) && (debug_menu_index == 4)) {
416
+                } else if ((switch_special || (!sample_running())) && (debug_menu_index == 6)) {
415 417
                     if (debug_special_value > 0) {
416 418
                         sample_play(debug_special_value - 1);
417 419
                     }

+ 1
- 1
src/main.h View File

@@ -48,7 +48,7 @@ extern const struct conf_entry conf_entries[CONF_ENTRY_COUNT];
48 48
 extern uint8_t debug_menu_index;
49 49
 extern uint8_t debug_special_value;
50 50
 
51
-#define DEBUG_ENTRY_COUNT 7
51
+#define DEBUG_ENTRY_COUNT 9
52 52
 extern const struct debug_entry debug_entries[DEBUG_ENTRY_COUNT];
53 53
 
54 54
 #endif // __MAIN_H__

+ 41
- 12
src/maps.c View File

@@ -43,13 +43,9 @@ static_assert(bg_map_HEIGHT == 256, "bg_map needs to be 256x256");
43 43
 #define camera_max_x ((bg_map_mapWidth - DEVICE_SCREEN_WIDTH) * 8)
44 44
 #define camera_max_y ((bg_map_mapHeight - DEVICE_SCREEN_HEIGHT) * 8)
45 45
 
46
-#define set_bkg_sub_attr(x, y, w, h, attr, map_w) \
47
-    if (attr)                                     \
48
-        set_bkg_submap_attributes(x, y, w, h, attr, map_w)
49
-
50
-#define set_bkg_sub(x, y, w, h, map, attr, map_w) \
51
-    set_bkg_submap(x, y, w, h, map, map_w);       \
52
-    set_bkg_sub_attr(x, y, w, h, attr, map_w)
46
+#define MAP_FLIP_NONE 0x00
47
+#define MAP_FLIP_X 0x01 //(0x20 | 0x01)
48
+#define MAP_FLIP_Y 0x02 //(0x40 | 0x02)
53 49
 
54 50
 // current unscaled ship position
55 51
 static uint16_t abs_x, abs_y;
@@ -90,6 +86,29 @@ void map_title(void) NONBANKED {
90 86
     move_bkg(0, 0);
91 87
 }
92 88
 
89
+static inline void set_bkg_sub_attr(uint8_t x, uint8_t y,
90
+                                    uint8_t w, uint8_t h,
91
+                                    const uint8_t *attr,
92
+                                    uint8_t attr_val,
93
+                                    uint8_t map_w) {
94
+    if (attr) {
95
+        set_bkg_submap_attributes(x, y, w, h, attr, map_w);
96
+    } else {
97
+        VBK_REG = VBK_ATTRIBUTES;
98
+        fill_bkg_rect(x, y, w, h, attr_val);
99
+        VBK_REG = VBK_TILES;
100
+    }
101
+}
102
+
103
+static inline void set_bkg_sub(uint8_t x, uint8_t y,
104
+                               uint8_t w, uint8_t h,
105
+                               const uint8_t *map, const uint8_t *attr,
106
+                               uint8_t attr_val,
107
+                               uint8_t map_w) {
108
+    set_bkg_submap(x, y, w, h, map, map_w);
109
+    set_bkg_sub_attr(x, y, w, h, attr, attr_val, map_w);
110
+}
111
+
93 112
 void map_game(void) NONBANKED {
94 113
     START_ROM_BANK(BANK(bg_map)) {
95 114
 
@@ -135,7 +154,7 @@ void map_game(void) NONBANKED {
135 154
         set_bkg_sub(map_pos_x, map_pos_y,
136 155
                     MIN(DEVICE_SCREEN_WIDTH + 1u, bg_map_mapWidth - map_pos_x),
137 156
                     MIN(DEVICE_SCREEN_HEIGHT + 1u, bg_map_mapHeight - map_pos_y),
138
-                    bg_map_map, bg_map_MAP_ATTRIBUTES, bg_map_mapWidth);
157
+                    bg_map_map, bg_map_MAP_ATTRIBUTES, MAP_FLIP_NONE, bg_map_mapWidth);
139 158
 
140 159
 #endif // WRAP_BG
141 160
 
@@ -143,12 +162,22 @@ void map_game(void) NONBANKED {
143 162
 }
144 163
 
145 164
 void map_move(int16_t delta_x, int16_t delta_y) NONBANKED {
165
+    // TODO
166
+    if ((delta_x < 0) && (camera_x == 0)) delta_x = 0;
167
+    if ((delta_x > 0) && (camera_x >= camera_max_x)) delta_x = 0;
168
+    if ((delta_y < 0) && (camera_y == 0)) delta_y = 0;
169
+    if ((delta_y > 0) && (camera_y >= camera_max_y)) delta_y = 0;
170
+
146 171
     abs_x += delta_x;
147 172
     abs_y += delta_y;
148 173
 
149 174
     camera_x = abs_x >> POS_SCALE_BG;
150 175
     camera_y = abs_y >> POS_SCALE_BG;
151 176
 
177
+    // TODO
178
+    if (camera_x > camera_max_x) camera_x = camera_max_x;
179
+    if (camera_y > camera_max_y) camera_y = camera_max_y;
180
+
152 181
     // update hardware scroll position
153 182
     move_bkg(camera_x, camera_y);
154 183
 
@@ -164,11 +193,11 @@ void map_move(int16_t delta_x, int16_t delta_y) NONBANKED {
164 193
             if (camera_y < old_camera_y) {
165 194
                 set_bkg_sub(map_pos_x, map_pos_y,
166 195
                             MIN(DEVICE_SCREEN_WIDTH + 1, bg_map_mapWidth - map_pos_x), 1,
167
-                            bg_map_map, bg_map_MAP_ATTRIBUTES, bg_map_mapWidth);
196
+                            bg_map_map, bg_map_MAP_ATTRIBUTES, MAP_FLIP_Y, bg_map_mapWidth);
168 197
             } else if ((bg_map_mapHeight - DEVICE_SCREEN_HEIGHT) > map_pos_y) {
169 198
                 set_bkg_sub(map_pos_x, map_pos_y + DEVICE_SCREEN_HEIGHT,
170 199
                             MIN(DEVICE_SCREEN_WIDTH + 1, bg_map_mapWidth - map_pos_x), 1,
171
-                            bg_map_map, bg_map_MAP_ATTRIBUTES, bg_map_mapWidth);
200
+                            bg_map_map, bg_map_MAP_ATTRIBUTES, MAP_FLIP_NONE, bg_map_mapWidth);
172 201
             }
173 202
             old_map_pos_y = map_pos_y;
174 203
         }
@@ -178,11 +207,11 @@ void map_move(int16_t delta_x, int16_t delta_y) NONBANKED {
178 207
             if (camera_x < old_camera_x) {
179 208
                 set_bkg_sub(map_pos_x, map_pos_y,
180 209
                             1, MIN(DEVICE_SCREEN_HEIGHT + 1, bg_map_mapHeight - map_pos_y),
181
-                            bg_map_map, bg_map_MAP_ATTRIBUTES, bg_map_mapWidth);
210
+                            bg_map_map, bg_map_MAP_ATTRIBUTES, MAP_FLIP_X, bg_map_mapWidth);
182 211
             } else if ((bg_map_mapWidth - DEVICE_SCREEN_WIDTH) > map_pos_x) {
183 212
                 set_bkg_sub(map_pos_x + DEVICE_SCREEN_WIDTH, map_pos_y,
184 213
                             1, MIN(DEVICE_SCREEN_HEIGHT + 1, bg_map_mapHeight - map_pos_y),
185
-                            bg_map_map, bg_map_MAP_ATTRIBUTES, bg_map_mapWidth);
214
+                            bg_map_map, bg_map_MAP_ATTRIBUTES, MAP_FLIP_NONE, bg_map_mapWidth);
186 215
             }
187 216
             old_map_pos_x = map_pos_x;
188 217
         }

+ 6
- 7
src/window.c View File

@@ -279,16 +279,15 @@ void win_debug(void) BANKED {
279 279
                   title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H,
280 280
                   title_map_map, 0, BANK(title_map), title_map_MAP_ATTRIBUTES, BANK(title_map));
281 281
 
282
-    // TODO paging when more options added
283
-    static_assert(DEBUG_ENTRY_COUNT <= 8, "too many debug menu entries");
284
-    uint8_t off = (10 - DEBUG_ENTRY_COUNT) / 2;
282
+    // TODO prettier pagination
283
+    uint8_t off = (10 - (DEBUG_ENTRY_COUNT - debug_menu_index)) / 2;
285 284
 
286 285
     str_center("Debug Menu", 0, 0);
287 286
 
288
-    for (uint8_t i = 0; (i < DEBUG_ENTRY_COUNT) && (i < 8); i++) {
287
+    for (uint8_t i = debug_menu_index; (i < DEBUG_ENTRY_COUNT) && (i < (7 + debug_menu_index)); i++) {
289 288
         char name_buff[ENTRY_NAME_LEN + 2 + 1] = {0};
290 289
         uint8_t n_len = get_debug(name_buff, i);
291
-        str(name_buff, (LINE_WIDTH - n_len) * 2, (i * 2) + 3 + off, (debug_menu_index == i) ? 1 : 0);
290
+        str(name_buff, (LINE_WIDTH - n_len) * 2, ((i - debug_menu_index) * 2) + 3 + off, (debug_menu_index == i) ? 1 : 0);
292 291
     }
293 292
 }
294 293
 
@@ -316,12 +315,12 @@ void win_conf(void) BANKED {
316 315
                   title_map_map, 0, BANK(title_map), title_map_MAP_ATTRIBUTES, BANK(title_map));
317 316
 
318 317
     // TODO paging when more options added
319
-    static_assert(CONF_ENTRY_COUNT <= 8, "too many conf menu entries");
318
+    static_assert(CONF_ENTRY_COUNT <= 7, "too many conf menu entries");
320 319
     uint8_t off = (10 - CONF_ENTRY_COUNT) / 2;
321 320
 
322 321
     str_center("Conf Menu", 0, 0);
323 322
 
324
-    for (uint8_t i = 0; (i < CONF_ENTRY_COUNT) && (i < 8); i++) {
323
+    for (uint8_t i = 0; (i < CONF_ENTRY_COUNT) && (i < 7); i++) {
325 324
         char name_buff[ENTRY_NAME_LEN + 2 + 1] = {0};
326 325
         uint8_t n_len = get_conf(name_buff, i);
327 326
         str(name_buff, (LINE_WIDTH - n_len) * 2, (i * 2) + 3 + off, (debug_menu_index == i) ? 1 : 0);

Loading…
Cancel
Save