Get NPCs showing up in-engine
This commit is contained in:
parent
567db0bd71
commit
f5f5e2c20b
@ -5,6 +5,7 @@ cc_library(
|
|||||||
name = "game",
|
name = "game",
|
||||||
srcs = glob(["*.c"]) + [
|
srcs = glob(["*.c"]) + [
|
||||||
"art/game_collectibles.c",
|
"art/game_collectibles.c",
|
||||||
|
"art/game_npcs.c",
|
||||||
"art/game_player.c",
|
"art/game_player.c",
|
||||||
"art/game_tiles.c",
|
"art/game_tiles.c",
|
||||||
"map/game_map.c",
|
"map/game_map.c",
|
||||||
|
@ -30,6 +30,7 @@ void game_update() {
|
|||||||
|
|
||||||
game_frame += 1;
|
game_frame += 1;
|
||||||
game_collectibles_update();
|
game_collectibles_update();
|
||||||
|
game_npcs_update();
|
||||||
game_player_update();
|
game_player_update();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -41,6 +42,7 @@ void game_draw() {
|
|||||||
sys_map_draw(map_game_map, spr_game_tiles, 0, 0, 0, 0, map_game_map.width, map_game_map.height);
|
sys_map_draw(map_game_map, spr_game_tiles, 0, 0, 0, 0, map_game_map.width, map_game_map.height);
|
||||||
|
|
||||||
game_collectibles_draw();
|
game_collectibles_draw();
|
||||||
|
game_npcs_draw();
|
||||||
game_player_draw();
|
game_player_draw();
|
||||||
|
|
||||||
sys_camera_reset();
|
sys_camera_reset();
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "game_collectible.h"
|
#include "game_collectible.h"
|
||||||
#include "game_collision.h"
|
#include "game_collision.h"
|
||||||
#include "game_math.h"
|
#include "game_math.h"
|
||||||
|
#include "game_npc.h"
|
||||||
#include "game_palette.h"
|
#include "game_palette.h"
|
||||||
#include "game_player.h"
|
#include "game_player.h"
|
||||||
|
|
||||||
|
@ -1 +1,91 @@
|
|||||||
#include "game_npc.h"
|
#include <assert.h>
|
||||||
|
#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();
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,31 @@
|
|||||||
#ifndef GAME_NPC_H
|
#ifndef GAME_NPC_H
|
||||||
#define GAME_NPC_H
|
#define GAME_NPC_H
|
||||||
|
|
||||||
|
#include "sys/sys.h"
|
||||||
|
|
||||||
|
#define GAME_NPC_MAX_N_DIALOGUES 16
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
sys_i32 x;
|
||||||
|
sys_i32 y;
|
||||||
|
|
||||||
|
uint8_t sprite_id;
|
||||||
|
uint8_t palette_id;
|
||||||
|
uint8_t inflict_id;
|
||||||
|
bool face_left;
|
||||||
|
|
||||||
|
int n_dialogues;
|
||||||
|
const char* no_cake_dialogue;
|
||||||
|
const char* dialogues[GAME_NPC_MAX_N_DIALOGUES];
|
||||||
|
|
||||||
|
bool present;
|
||||||
|
int n_dialogues_seen;
|
||||||
|
} game_npc;
|
||||||
|
|
||||||
|
// pointer goes to data section and will be valid forever
|
||||||
|
game_npc* game_npc_create(sys_i32 x, sys_i32 y);
|
||||||
|
|
||||||
|
void game_npcs_update();
|
||||||
|
void game_npcs_draw();
|
||||||
|
|
||||||
#endif // GAME_NPC_H
|
#endif // GAME_NPC_H
|
@ -11,7 +11,7 @@
|
|||||||
"iid": "7db5fd20-b0a0-11ee-9688-af2c6adbc1d6",
|
"iid": "7db5fd20-b0a0-11ee-9688-af2c6adbc1d6",
|
||||||
"jsonVersion": "1.5.3",
|
"jsonVersion": "1.5.3",
|
||||||
"appBuildId": 473703,
|
"appBuildId": 473703,
|
||||||
"nextUid": 130,
|
"nextUid": 131,
|
||||||
"identifierStyle": "Lowercase",
|
"identifierStyle": "Lowercase",
|
||||||
"toc": [],
|
"toc": [],
|
||||||
"worldLayout": "Free",
|
"worldLayout": "Free",
|
||||||
@ -3696,6 +3696,43 @@
|
|||||||
"allowedRefsEntityUid": null,
|
"allowedRefsEntityUid": null,
|
||||||
"allowedRefTags": [],
|
"allowedRefTags": [],
|
||||||
"tilesetUid": null
|
"tilesetUid": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "face_left",
|
||||||
|
"doc": null,
|
||||||
|
"__type": "Bool",
|
||||||
|
"uid": 130,
|
||||||
|
"type": "F_Bool",
|
||||||
|
"isArray": false,
|
||||||
|
"canBeNull": false,
|
||||||
|
"arrayMinLength": null,
|
||||||
|
"arrayMaxLength": null,
|
||||||
|
"editorDisplayMode": "Hidden",
|
||||||
|
"editorDisplayScale": 1,
|
||||||
|
"editorDisplayPos": "Above",
|
||||||
|
"editorLinkStyle": "StraightArrow",
|
||||||
|
"editorDisplayColor": null,
|
||||||
|
"editorAlwaysShow": false,
|
||||||
|
"editorShowInWorld": true,
|
||||||
|
"editorCutLongValues": true,
|
||||||
|
"editorTextSuffix": null,
|
||||||
|
"editorTextPrefix": null,
|
||||||
|
"useForSmartColor": false,
|
||||||
|
"exportToToc": false,
|
||||||
|
"searchable": false,
|
||||||
|
"min": null,
|
||||||
|
"max": null,
|
||||||
|
"regex": null,
|
||||||
|
"acceptFileTypes": null,
|
||||||
|
"defaultOverride": null,
|
||||||
|
"textLanguageMode": null,
|
||||||
|
"symmetricalRef": false,
|
||||||
|
"autoChainRef": true,
|
||||||
|
"allowOutOfLevelRef": true,
|
||||||
|
"allowedRefs": "OnlySame",
|
||||||
|
"allowedRefsEntityUid": null,
|
||||||
|
"allowedRefTags": [],
|
||||||
|
"tilesetUid": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -4216,7 +4253,11 @@
|
|||||||
"id": "V_String",
|
"id": "V_String",
|
||||||
"params": ["But you should go to the next screen."]
|
"params": ["But you should go to the next screen."]
|
||||||
} ] },
|
} ] },
|
||||||
{ "__identifier": "no_cake_dialogue", "__type": "String", "__value": null, "__tile": null, "defUid": 129, "realEditorValues": [] }
|
{ "__identifier": "no_cake_dialogue", "__type": "String", "__value": null, "__tile": null, "defUid": 129, "realEditorValues": [] },
|
||||||
|
{ "__identifier": "face_left", "__type": "Bool", "__value": true, "__tile": null, "defUid": 130, "realEditorValues": [{
|
||||||
|
"id": "V_Bool",
|
||||||
|
"params": [ true ]
|
||||||
|
}] }
|
||||||
],
|
],
|
||||||
"__worldX": 464,
|
"__worldX": 464,
|
||||||
"__worldY": 528
|
"__worldY": 528
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <assert.h>
|
||||||
#include "sys/sys.h"
|
#include "sys/sys.h"
|
||||||
#include "game/game.h"
|
#include "game/game.h"
|
||||||
#include "game_map.h"
|
#include "game_map.h"
|
||||||
@ -36,26 +37,44 @@ void map_game_map_collectible_money_small_create(sys_i32 x, sys_i32 y) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
game_npc* game_map_npc_in_progress = NULL;
|
||||||
|
|
||||||
void map_game_map_npc_create(sys_i32 x, sys_i32 y) {
|
void map_game_map_npc_create(sys_i32 x, sys_i32 y) {
|
||||||
// TODO
|
// center NPC
|
||||||
|
game_map_npc_in_progress = game_npc_create(
|
||||||
|
(x + 1) * TILE_SZ_MICROPIXEL,
|
||||||
|
(y + 1) * TILE_SZ_MICROPIXEL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void map_game_map_npc_set_sprite_id(sys_i32 id) {
|
void map_game_map_npc_set_sprite_id(sys_i32 id) {
|
||||||
// TODO
|
assert(game_map_npc_in_progress && "NPC has to be in progress");
|
||||||
}
|
game_map_npc_in_progress->sprite_id = id;
|
||||||
|
|
||||||
void map_game_map_npc_set_inflict_id(sys_i32 id) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
void map_game_map_npc_set_no_cake_dialogue(const char* dialogue) {
|
|
||||||
// TODO
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void map_game_map_npc_set_palette_id(sys_i32 id) {
|
void map_game_map_npc_set_palette_id(sys_i32 id) {
|
||||||
// TODO
|
assert(game_map_npc_in_progress && "NPC has to be in progress");
|
||||||
|
game_map_npc_in_progress->palette_id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void map_game_map_npc_set_inflict_id(sys_i32 id) {
|
||||||
|
assert(game_map_npc_in_progress && "NPC has to be in progress");
|
||||||
|
game_map_npc_in_progress->inflict_id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void map_game_map_npc_set_face_left(bool face_left) {
|
||||||
|
game_map_npc_in_progress->face_left = face_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
void map_game_map_npc_set_no_cake_dialogue(const char* dialogue) {
|
||||||
|
assert(game_map_npc_in_progress && "NPC has to be in progress");
|
||||||
|
game_map_npc_in_progress->no_cake_dialogue = dialogue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void map_game_map_npc_add_dialogue(const char* dialogue) {
|
void map_game_map_npc_add_dialogue(const char* dialogue) {
|
||||||
// TODO
|
assert(game_map_npc_in_progress && "NPC has to be in progress");
|
||||||
|
assert(game_map_npc_in_progress->n_dialogues < GAME_NPC_MAX_N_DIALOGUES &&
|
||||||
|
"NPC can't have too many dialogues");
|
||||||
|
sys_i32 ix = game_map_npc_in_progress->n_dialogues++;
|
||||||
|
game_map_npc_in_progress->dialogues[ix] = dialogue;
|
||||||
}
|
}
|
@ -4,6 +4,7 @@ import shared
|
|||||||
|
|
||||||
TEMPLATE = """
|
TEMPLATE = """
|
||||||
// generated code! be nice
|
// generated code! be nice
|
||||||
|
#include <stdbool.h>
|
||||||
#include "sys/sys.h"
|
#include "sys/sys.h"
|
||||||
|
|
||||||
sys_maptile map_{{map_name}}_data[{{width * height}}] = { {{ tiles|join(",") }} };
|
sys_maptile map_{{map_name}}_data[{{width * height}}] = { {{ tiles|join(",") }} };
|
||||||
@ -128,7 +129,9 @@ def load_mapdata(fname_ldtk):
|
|||||||
|
|
||||||
|
|
||||||
def format_field_value(ty, val):
|
def format_field_value(ty, val):
|
||||||
if ty == "Int":
|
if ty == "Bool":
|
||||||
|
return "true" if val else "false", "scalar", "bool"
|
||||||
|
elif ty == "Int":
|
||||||
return str(val), "scalar", "sys_i32"
|
return str(val), "scalar", "sys_i32"
|
||||||
elif ty == "String":
|
elif ty == "String":
|
||||||
if val is None:
|
if val is None:
|
||||||
@ -138,6 +141,8 @@ def format_field_value(ty, val):
|
|||||||
return [format_field_value("Int", i)[0] for i in val], "array", "sys_i32"
|
return [format_field_value("Int", i)[0] for i in val], "array", "sys_i32"
|
||||||
elif ty == "Array<String>":
|
elif ty == "Array<String>":
|
||||||
return [format_field_value("String", i)[0] for i in val], "array", "const char*"
|
return [format_field_value("String", i)[0] for i in val], "array", "const char*"
|
||||||
|
else:
|
||||||
|
assert False, f"unknown type: {ty}"
|
||||||
|
|
||||||
|
|
||||||
def annot_xy(lst, w, h):
|
def annot_xy(lst, w, h):
|
||||||
|
Loading…
Reference in New Issue
Block a user