#include #include "art/game_npcs.h" #include "sys/sys.h" #include "game.h" // If this isn't enough, raise the number #define GAME_NPCS_N 32 typedef struct { uint8_t main; // alt0 and alt1 are ramps uint8_t alt0_0; uint8_t alt0_1; uint8_t alt1_0; uint8_t alt1_1; uint8_t eye_0; uint8_t eye_1; uint8_t pupil; uint8_t adornment; uint8_t shine; } game_npc_palette; game_npc_palette game_npc_palettes[1] = { {14, 12, 13, 6, 7, 6, 7, 0, 8, 7} }; #define GAME_NPC_N_PALETTES (sizeof(game_npc_palettes)/sizeof(game_npc_palettes[0])) sys_i32 game_npc_next = 0; game_npc game_npcs[GAME_NPCS_N]; game_npc* game_npc_create(sys_i32 x, sys_i32 y) { assert(game_npc_next < GAME_NPCS_N && "too many NPCs"); sys_i32 id = game_npc_next++; game_npc npc = { .x = x, .y = y, .sprite_id = 0, .palette_id = 0, .inflict_id = 0, .face_left = false, .n_dialogues = 0, .no_cake_dialogue = NULL, /* .dialogues = { doesn't matter }, */ .present = true, .n_dialogues_seen = 0, }; game_npcs[id] = npc; return &game_npcs[id]; } void game_npcs_update() { // TODO } void game_npcs_draw() { for (sys_i32 i = 0; i < game_npc_next; i++) { game_npc* n = &game_npcs[i]; if (!n->present) { continue; } game_npc_palette palette = game_npc_palettes[game_npcs[i].palette_id % GAME_NPC_N_PALETTES]; sys_dpal_set(14, palette.main); sys_dpal_set(12, palette.alt0_0); sys_dpal_set(13, palette.alt0_1); sys_dpal_set(6, palette.alt1_0); sys_dpal_set(7, palette.alt1_1); sys_dpal_set(9, palette.eye_0); sys_dpal_set(10, palette.eye_1); sys_dpal_set(1, palette.pupil); sys_dpal_set(8, palette.adornment); sys_dpal_set(11, palette.shine); // TODO: Palette sys_sprite_draw_ext( spr_game_npcs, n->sprite_id, n->x / PIXEL_SZ_MICROPIXEL - 8, n->y / PIXEL_SZ_MICROPIXEL - 8, 2, 2, n->face_left, false ); sys_dpal_reset(); } }