Skip to content

Commit c198cae

Browse files
committed
Version 0.8
1 parent 9c1a53e commit c198cae

File tree

10 files changed

+38
-39
lines changed

10 files changed

+38
-39
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@
5353
"ranges": "c",
5454
"span": "c",
5555
"strings.h": "c",
56-
"snake.h": "c"
56+
"snake.h": "c",
57+
"memory": "c"
5758
},
5859
"editor.rulers": [
5960
80

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ The basis for this remake is the original port by Mosaik Software available [her
3333

3434
**Version History**
3535

36+
*Version 0.8 (20/12/2023)*
37+
38+
* Fixed Responsiveness of Controls in main game
39+
* In easy mode, Nibbler now remembers on a level which gems are eaten
40+
* In the High Score Table, no additional keypress is needed to finish entering a score
41+
3642
*Version 0.7 (12/12/2023)*
3743

3844
* Added a difficulty toggle

inc/debug.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
#include <main.h>
2222

2323
/* Debug Defines to allow easier testing */
24-
#define DEBUG_SKIP_DEMO
25-
#define DEBUG_SKIP_TITLE
26-
#define DEBUG_SKIP_BETWEEN
24+
#undef DEBUG_SKIP_DEMO
25+
#undef DEBUG_SKIP_TITLE
26+
#undef DEBUG_SKIP_BETWEEN
2727
#undef DEBUG_NO_COLLISION_DETECTION
2828
#define DEBUG_LEVEL_SKIP
2929

inc/game.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,13 @@ u32 g_start(void);
3232
void g_stop(void);
3333

3434
/* Private Functions */
35-
static bool g_play_level(const u8 level, const u8 gems);
35+
static bool g_play_level(const u8 level, u8 *gems_left);
3636
static void g_interrupt(void);
37-
static void g_load_level(const u8 level, u8 *gems_left, const bool reset);
37+
static void g_load_level(const u8 level, u8 *gems_left, const bool reset_gems);
3838
static void g_reset_snake(snake_t *snake, snake_t *snake_buf);
3939
static bool g_test_can_move(
4040
const u8 *pf, const u8 w, const snake_t *snake, const dir_t dir);
4141
static void g_display_HUD(void);
4242
static void g_redraw_score(const u32 score);
43-
static void g_redraw_gems(const u8 gems_left);
4443
static void g_display_lives(const u8 x, const u8 y);
4544

inc/video.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
/* Public Functions */
2323
void v_draw_logo(void);
2424
void v_draw_pf(const u8 *pf, const pos_t *loc, const dim_t *sz);
25-
void v_draw_gems(const gem_t *gems, const pos_t *loc, const dim_t *sz);
25+
void v_draw_gems(const gem_t *gems, const pos_t *loc);
2626
void v_draw_snake(const snake_t *snake, const pos_t *loc);
2727
void v_erase_snake_seg(const snake_t *snake, const pos_t *loc, const u8 seg);
2828
void v_draw_snake_seg(

nibdx.dsk

0 Bytes
Binary file not shown.

src/data/strings.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const char *const g_strings[] = {
2424
"A REMAKE BY", "DAVE MOORE (c) 2024", " ORIGINAL BY ",
2525
" CHRISTOPH VON RHEIN & ROMAN MAJER ", " (C) MOSAIK SOFTWARE 1984 ",
2626
"BASED ON NIBBLER BY", "JOSEPH H. ULOWETZ & JOHN M. JAUGILAS ",
27-
"(C) ROCK-OLA MFG CORP 1982", "V0.7: 12/12/2023", "",
27+
"(C) ROCK-OLA MFG CORP 1982", "V0.8: 20/12/2023", "",
2828
/* Title Screen 10-29 */
2929
"1.", "2.", "3.", "4.", "9.", "0.", "DIFFICULTY", "SET CONTROLS",
3030
"MUSIC/SFX ON/OFF", "SHOW INSTRUCTONS", "PLAY GAME", "QUIT",

src/game.c

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ static snake_t sn_buf;
5656
static const u8 sn_len = 10;
5757
static const u8 sn_max = 62;
5858

59+
/* Whither or not we need to reset gems */
60+
static bool easy_mode;
61+
static bool reset_gems = false;
62+
5963
/* Set default options and hiscores (precalculated for speed) */
6064
void g_setup(void) {
6165

@@ -81,10 +85,13 @@ u32 g_start(void) {
8185
u8 gems_left;
8286
bool reset_gems = true;
8387

88+
/* Initial Settings */
8489
level = 1;
8590
round = 1;
8691
lives = 3;
8792
score = 0;
93+
easy_mode = g_options[0];
94+
reset_gems = true;
8895

8996
/* Keep going until game over! */
9097
while (!game_over) {
@@ -98,12 +105,13 @@ u32 g_start(void) {
98105
/* Load the appropriate level data */
99106
g_load_level(level, &gems_left, reset_gems);
100107
g_reset_snake(&sn, &sn_buf);
108+
if (easy_mode)
109+
reset_gems = false;
101110

102111
/* Draw the fixed elements of the HUD */
103112
g_display_HUD();
104-
g_redraw_gems(gems_left);
105113
v_draw_pf(pf, &pf_loc, &pf_sz);
106-
v_draw_gems(gems, &pf_loc, &pf_sz);
114+
v_draw_gems(gems, &pf_loc);
107115
v_draw_snake(&sn, &pf_loc);
108116

109117
/*
@@ -121,7 +129,7 @@ u32 g_start(void) {
121129
g_clock_on = true;
122130

123131
/* Start the game */
124-
lvl_complete = g_play_level(level, gems_left);
132+
lvl_complete = g_play_level(level, &gems_left);
125133
g_stop();
126134
g_clock_on = false;
127135

@@ -150,11 +158,9 @@ u32 g_start(void) {
150158
game_over = true;
151159
} else {
152160
v_wipe_scr(true);
161+
cpct_removeInterruptHandler();
153162
--lives;
154-
if (!g_options[0])
155-
reset_gems = true;
156-
else
157-
reset_gems = false;
163+
reset_gems = !easy_mode;
158164
}
159165
}
160166
}
@@ -172,15 +178,14 @@ void g_stop(void) {
172178
}
173179

174180
/* Handle the Game Level Playing */
175-
static bool g_play_level(const u8 level, const u8 gems_total) {
181+
static bool g_play_level(const u8 level, u8* gems_left) {
176182

177183
volatile bool finished = false, success = false;
178184
volatile u16 count = 0;
179185
bool move_l = false, move_r = false;
180186
bool paused, moved;
181187
u16 key_l, key_r;
182188
u8 c_offset = g_options[1] ? 0 : 2;
183-
u8 gems_left = gems_total;
184189
dir_t dir = DIR_EAST;
185190
const u8 diff_c = g_options[0] ? 5 : 2;
186191
const u8 diff_mod = g_options[0] ? 1 : 10;
@@ -249,16 +254,13 @@ static bool g_play_level(const u8 level, const u8 gems_total) {
249254
gems[gem_ate].active = false;
250255
gems[gem_ate].loc.x = 0;
251256
gems[gem_ate].loc.y = 0;
252-
--gems_left;
257+
--*gems_left;
253258
score += level * level * round * 10 * diff_mod;
254259
g_redraw_score(score);
255-
g_redraw_gems(gems_left);
256-
DEBUG_NUM(gems_left, true);
257-
DEBUG_RESET(true);
258260
}
259261

260262
/* If we have eaten all the Gems! */
261-
if (gems_left == 0) {
263+
if (*gems_left == 0) {
262264

263265
success = true;
264266
break;
@@ -377,14 +379,6 @@ static void g_redraw_score(const u32 score) {
377379
width = u_get_width(score);
378380
v_print_n(score, 16 + (20 - (width * 2)), y, 1);
379381
}
380-
381-
/* Display Remaining Gems */
382-
static void g_redraw_gems(const u8 gems_left) {
383-
384-
u8 y = (hud_loc.y + 2) * LINE_PY;
385-
v_print(g_strings[58], 32, y, 2);
386-
v_print_n(gems_left, 32, y, 1);
387-
}
388382

389383
/* Draw Remaining Lives */
390384
static void g_display_lives(const u8 x, const u8 y) {
@@ -448,7 +442,7 @@ static void g_interrupt(void) {
448442
}
449443

450444
/* Load data for current level */
451-
static void g_load_level(const u8 level, u8 *gems_left, const bool reset) {
445+
static void g_load_level(const u8 level, u8 *gems_left, const bool reset_gems) {
452446

453447
pos_t* gem_source;
454448

@@ -457,8 +451,8 @@ static void g_load_level(const u8 level, u8 *gems_left, const bool reset) {
457451
cpct_memcpy(&pf, g_game_pf[level - 1], sizeof(pf));
458452

459453
/* Reload the Gems if necessary */
460-
if (reset) {
461-
// TODO: in easy mode, stop resetting gems left after a loss of life
454+
if (reset_gems) {
455+
462456
*gems_left = g_game_pf_count[level - 1];
463457
cpct_memset(&gems, 0x00, sizeof(gem_t));
464458
gem_source = g_game_gems[level - 1];
@@ -473,7 +467,8 @@ static void g_load_level(const u8 level, u8 *gems_left, const bool reset) {
473467
gems[i].active = false;
474468
}
475469
}
476-
}
470+
} else
471+
*gems_left = *gems_left;
477472
}
478473

479474
/* Reset Game Snake to starting position and size */

src/hiscore.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void h_start(const u32 score) {
4545

4646
/* Handle Initial Input */
4747
y = ei_loc.y * LINE_PY;
48-
while (len <= 3) {
48+
while (len <= 2) {
4949

5050
if (count % 200 == 0) {
5151

src/lib/video.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ void v_draw_pf(const u8 *pf, const pos_t *loc, const dim_t *sz) {
208208
}
209209

210210
/* Draw the Gems on a Playfield */
211-
void v_draw_gems(const gem_t *gems, const pos_t *loc, const dim_t *sz) {
211+
void v_draw_gems(const gem_t *gems, const pos_t *loc) {
212212

213213
int top_x = loc->x * LINE_PX, top_y = loc->y * LINE_PY;
214214
u8 *pos;
@@ -314,8 +314,6 @@ void v_erase_snake_timed(const snake_t *snake, const pos_t *loc, const int n) {
314314
u_wait(n);
315315
}
316316

317-
DEBUG_STR("erer", true);
318-
319317
x = (snake->body[0].x + loc->x) * CHAR_BYTES_W;
320318
y = (snake->body[0].y + loc->y) * CHAR_BYTES_H;
321319
head_pos = v_get_sp(x, y);

0 commit comments

Comments
 (0)