diff --git a/game/BUILD b/game/BUILD index 2086469..ba774ab 100644 --- a/game/BUILD +++ b/game/BUILD @@ -5,6 +5,7 @@ cc_library( name = "game", srcs = glob(["*.c"]) + [ "art/game_collectibles.c", + "art/game_hud.c", "art/game_npcs.c", "art/game_player.c", "art/game_tiles.c", @@ -17,6 +18,7 @@ cc_library( ) add_sprites(name="game_collectibles", n=24) +add_sprites(name="game_hud", n=2) add_sprites(name="game_player", n=96) add_sprites(name="game_npcs", n=64) add_sprites(name="game_tiles", n=120) diff --git a/game/art/game_hud.aseprite b/game/art/game_hud.aseprite new file mode 100644 index 0000000..66a9fc1 Binary files /dev/null and b/game/art/game_hud.aseprite differ diff --git a/game/art/game_hud.h b/game/art/game_hud.h new file mode 100644 index 0000000..2bd636c --- /dev/null +++ b/game/art/game_hud.h @@ -0,0 +1,8 @@ +#ifndef GAME_HUD_H +#define GAME_HUD_H + +#include "sys/sys.h" + +extern sys_spritesheet spr_game_hud; + +#endif // ART_GAME_HUD_H \ No newline at end of file diff --git a/game/art/game_hud.png b/game/art/game_hud.png new file mode 100644 index 0000000..3cb1b0b Binary files /dev/null and b/game/art/game_hud.png differ diff --git a/game/game.c b/game/game.c index 0932d8f..ae37a83 100644 --- a/game/game.c +++ b/game/game.c @@ -51,4 +51,5 @@ void game_draw() { sys_camera_reset(); game_dialogue_draw(); + game_player_draw_hud(); } diff --git a/game/game_collectible.c b/game/game_collectible.c index 953f9de..41170ac 100644 --- a/game/game_collectible.c +++ b/game/game_collectible.c @@ -66,6 +66,12 @@ void game_collectibles_update() { game_collectible_bubble.x=c->x / PIXEL_SZ_MICROPIXEL; game_collectible_bubble.y=c->y / PIXEL_SZ_MICROPIXEL + game_collectible_wobb(); game_collectible_bubble.r=r * PIXEL_SZ_MICROPIXEL; + + switch (c->type) { + case GAME_COLLECTIBLE_TYPE_CAKE: game_player_collectibles.n_cake += 16; break; + case GAME_COLLECTIBLE_TYPE_MONEY_BIG: game_player_collectibles.n_dollars += 5; break; + case GAME_COLLECTIBLE_TYPE_MONEY_SMALL: game_player_collectibles.n_dollars += 1; break; + } } } } diff --git a/game/game_npc.c b/game/game_npc.c index 1db6586..353a270 100644 --- a/game/game_npc.c +++ b/game/game_npc.c @@ -1,4 +1,5 @@ #include +#include "art/game_hud.h" #include "art/game_npcs.h" #include "device/device.h" #include "sys/sys.h" @@ -46,6 +47,7 @@ game_npc* game_npc_create(sys_i32 x, sys_i32 y) { .present = true, .n_dialogues_seen = 0, + .received_cake = false, }; game_npcs[id] = npc; return &game_npcs[id]; @@ -85,7 +87,12 @@ void game_npc_trigger_dialogue(sys_i32 npc_id) { // TODO: Make it possible for the player to have the cake game_npc* npc = &game_npcs[npc_id]; - if (npc->no_cake_dialogue != NULL) { + + if ( + !npc->received_cake && + game_player_collectibles.n_cake == 0 && + npc->no_cake_dialogue != NULL + ) { dialogue = npc->no_cake_dialogue; } else if (npc->n_dialogues_seen < npc->n_dialogues) { dialogue = npc->dialogues[npc->n_dialogues_seen++]; @@ -96,6 +103,12 @@ void game_npc_trigger_dialogue(sys_i32 npc_id) { return; } + // give the NPC cake if possible + if (!npc->received_cake && game_player_collectibles.n_cake > 0) { + npc->received_cake = true; + game_player_collectibles.n_cake -= 1; + } + game_dialogue_display(dialogue); } @@ -106,7 +119,20 @@ void game_npcs_draw() { if (!n->present) { continue; } game_npc_palette palette = - game_npc_palettes[game_npcs[i].palette_id % GAME_NPC_N_PALETTES]; + game_npc_palettes[n->palette_id % GAME_NPC_N_PALETTES]; + + if (n->received_cake) { + sys_sprite_draw_ext( + spr_game_hud, + 0, + n->x / PIXEL_SZ_MICROPIXEL - 4, + n->y / PIXEL_SZ_MICROPIXEL - 18, + 1, + 1, + !n->face_left, + false + ); + } sys_dpal_set(14, palette.main); sys_dpal_set(12, palette.alt0_0); diff --git a/game/game_npc.h b/game/game_npc.h index 96c8fff..9558f9c 100644 --- a/game/game_npc.h +++ b/game/game_npc.h @@ -21,6 +21,7 @@ typedef struct { bool present; uint8_t n_dialogues_seen; + bool received_cake; } game_npc; // pointer goes to data section and will be valid forever diff --git a/game/game_player.c b/game/game_player.c index e10710e..d7ed100 100644 --- a/game/game_player.c +++ b/game/game_player.c @@ -1,3 +1,5 @@ +#include +#include "art/game_hud.h" #include "art/game_player.h" #include "art/game_tiles.h" #include "device/device.h" @@ -20,6 +22,11 @@ sys_i32 game_player_dx = 0; sys_i32 game_player_dy = 0; bool game_player_faceleft = false; +game_player_collectibles_t game_player_collectibles = { + .n_cake=0, + .n_dollars=0 +}; + typedef enum { GAME_PLAYER_ANIM_STANDING, GAME_PLAYER_ANIM_WALKING, @@ -129,6 +136,14 @@ void game_player_update(bool* allow_input) { } } + +void game_player_get_center(sys_i32* x, sys_i32* y) { + *x = game_player_bbox.x; + + // center on me, not on feet + *y = game_player_bbox.y - 8 * PIXEL_SZ_MICROPIXEL; +} + void game_player_set_camera() { sys_i32 x = game_player_bbox.x; sys_i32 y = game_player_bbox.y; @@ -182,9 +197,65 @@ void game_player_anim_add_progress(uint8_t amt) { } -void game_player_get_center(sys_i32* x, sys_i32* y) { - *x = game_player_bbox.x; +void game_player_draw_hud_number(sys_i32 number, sys_i32 x, sys_i32 y); +void game_player_draw_hud() { + sys_i32 y = 4; + if (game_player_collectibles.n_dollars > 0) { + sys_sprite_draw_ext( + spr_game_hud, + 1, + 4, y, + 1, 1, + false, false + ); + game_player_draw_hud_number(game_player_collectibles.n_dollars, 16, y); + y += 10; + } + if (game_player_collectibles.n_cake > 0) { + sys_sprite_draw_ext( + spr_game_hud, + 0, + 4, y - 1, + 1, 1, + false, false + ); + game_player_draw_hud_number(game_player_collectibles.n_cake, 16, y); + y += 10; + } +} - // center on me, not on feet - *y = game_player_bbox.y - 8 * PIXEL_SZ_MICROPIXEL; +void game_player_draw_hud_number1(sys_i32 number, sys_i32 x, sys_i32 y, uint8_t color) { + number = sys_min_i32(sys_max_i32(number, 0), 255); + + char s[2]; + s[1] = 0; + + if (number >= 100) { + sys_i32 top_digit = number / 100; + assert(0 <= top_digit && top_digit < 10); + s[0] = '0' + top_digit; + number = number % 100; + sys_print(s, x, y, color); + x += 8; + } + if (number >= 10) { + sys_i32 top_digit = number / 10; + assert(0 <= top_digit && top_digit < 10); + s[0] = '0' + top_digit; + number = number % 10; + sys_print(s, x, y, color); + x += 8; + } + sys_i32 top_digit = number; + assert(0 <= top_digit && top_digit < 10); + s[0] = '0' + top_digit; + sys_print(s, x, y, color); +} +void game_player_draw_hud_number(sys_i32 number, sys_i32 x_start, sys_i32 y_start) { + for (sys_i32 dy = -1; dy <= 1; dy++) { + for (sys_i32 dx = -1; dx <= 1; dx++) { + game_player_draw_hud_number1(number, x_start+dx, y_start+dy, 0); + } + } + game_player_draw_hud_number1(number, x_start, y_start, 7); } \ No newline at end of file diff --git a/game/game_player.h b/game/game_player.h index 457510c..d3795db 100644 --- a/game/game_player.h +++ b/game/game_player.h @@ -1,11 +1,18 @@ #ifndef GAME_PLAYER_H #define GAME_PLAYER_H +typedef struct { + sys_i32 n_cake; + sys_i32 n_dollars; +} game_player_collectibles_t; +extern game_player_collectibles_t game_player_collectibles; + void game_player_init(); void game_player_update(bool* allow_input); -void game_player_set_camera(); -void game_player_draw(); - void game_player_get_center(sys_i32* x, sys_i32* y); +void game_player_set_camera(); +void game_player_draw(); +void game_player_draw_hud(); + #endif // GAME_PLAYER_H \ No newline at end of file