navmesh and background are included in level predef data

master
immibis 2025-02-19 19:09:13 +01:00
parent dd3168f5dd
commit 5a6b51be77
4 changed files with 19 additions and 22 deletions

View File

@ -134,6 +134,16 @@ for dest in range(len(polys)):
out.write("};\n")
out.write(f"extern const struct navmesh navmesh_{basename} = {{{len(polys)}, {basename}_triangles, {basename}_pathfind}};\n")
background = tree.find("imagelayer/image")
bgidentifier, bgwidth, bgheight = "(const unsigned char*)0", 0, 0
if background is not None:
bgidentifier = background.attrib["source"].split("/")[-1]
if "." in bgidentifier: bgidentifier = bgidentifier[:bgidentifier.rindex(".")] # remove .png
bgidentifier = "_binary_sprite_"+bgidentifier+"_raw_start"
out.write(f"extern const unsigned char {bgidentifier}[];\n")
bgwidth = int(background.attrib["width"])
bgheight = int(background.attrib["height"])
out.write("extern const struct level_predef_data predef_"+basename+" = {\n")
out.write("\t(const struct level_clickregion[]){\n") # clickregions start
for object in tree.findall("objectgroup[@name='clickable']/object"):
@ -158,4 +168,6 @@ for object in tree.findall("objectgroup[@name='points']/object"):
out.write(f"\t\t{{{x},{y},{object.attrib['name']}}},\n")
out.write("\t\t{0}\n")
out.write("\t},\n") # points end
out.write("\t&navmesh_"+basename+",\n")
out.write(f"\t{bgidentifier}, {bgwidth}, {bgheight},\n")
out.write("};\n")

View File

@ -41,6 +41,9 @@ struct level_predef_point {
struct level_predef_data {
const struct level_clickregion *clickregions; // terminated by null entry
const struct level_predef_point *points; // terminated by x=0 y=0
const struct navmesh *navmesh;
const unsigned char *background;
int bgwidth, bgheight;
};

View File

@ -9,19 +9,11 @@
#define BGWIDTH 1066
#define BGHEIGHT 800
extern const char _binary_sprite_lobby_raw_start[];
extern const char _binary_sprite_managers_office_raw_start[];
extern const char _binary_sprite_managers_office_safe_raw_start[];
extern const char _binary_sprite_basement_raw_start[];
extern const char _binary_sprite_cloakroom_raw_start[];
extern const char _binary_sprite_hallway1_raw_start[];
extern const char _binary_sprite_hallway2_raw_start[];
extern const char _binary_sprite_hallway3_raw_start[];
extern const char _binary_sprite_item_pager_raw_start[];
extern const char _binary_sprite_stickman_raw_start[];
extern const struct navmesh navmesh_lobby, navmesh_managers_office, navmesh_basement, navmesh_cloakroom, navmesh_hallway1, navmesh_hallway2, navmesh_hallway3;
extern const struct level_predef_data predef_basement, predef_lobby, predef_managers_office, predef_cloakroom, predef_hallway1, predef_hallway2, predef_hallway3;
static void create_player(scene *me, int x, int y) {
@ -56,18 +48,14 @@ static void create_player_startpt(scene *me, int fromscene) {
void scene_setup(scene *me, int scene, int fromscene) {
switch(scene) {
case SCENE_LOBBY:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_lobby_raw_start);
scene_load_predef(me, &predef_lobby);
me->navmesh = &navmesh_lobby;
create_player_startpt(me, fromscene);
if(fromscene == -1) {
push_scene_textbox("Welcome\n\nto\n\ntestgame");
}
break;
case SCENE_MANAGERS_OFFICE:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_managers_office_raw_start);
scene_load_predef(me, &predef_managers_office);
me->navmesh = &navmesh_managers_office;
create_player_startpt(me, fromscene);
break;
case SCENE_MANAGERS_OFFICE_SAFE:
@ -78,36 +66,26 @@ void scene_setup(scene *me, int scene, int fromscene) {
me->use_standard_inventory = false;
break;
case SCENE_BASEMENT:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_basement_raw_start);
scene_load_predef(me, &predef_basement);
if(!savefile.got_pager_from_basement) {
scene_add_object(me, OBJID_PAGER, 556, 520, 87, 87, _binary_sprite_item_pager_raw_start);
}
me->navmesh = &navmesh_basement;
create_player_startpt(me, fromscene);
break;
case SCENE_CLOAKROOM:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_cloakroom_raw_start);
scene_load_predef(me, &predef_cloakroom);
me->navmesh = &navmesh_cloakroom;
create_player_startpt(me, fromscene);
break;
case SCENE_HALLWAY1:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway1_raw_start);
scene_load_predef(me, &predef_hallway1);
me->navmesh = &navmesh_hallway1;
create_player_startpt(me, fromscene);
break;
case SCENE_HALLWAY2:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway2_raw_start);
scene_load_predef(me, &predef_hallway2);
me->navmesh = &navmesh_hallway2;
create_player_startpt(me, fromscene);
break;
case SCENE_HALLWAY3:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway3_raw_start);
scene_load_predef(me, &predef_hallway3);
me->navmesh = &navmesh_hallway3;
create_player_startpt(me, fromscene);
break;
}

View File

@ -230,6 +230,10 @@ struct object *scene_add_object(struct scene *sc, int id, int x, int y, int widt
void scene_load_predef(struct scene *sc, const struct level_predef_data *predef) {
sc->predef = predef;
sc->navmesh = predef->navmesh;
if(predef->background) {
scene_add_object(sc, OBJID_BACKGROUND, 0, 0, predef->bgwidth, predef->bgheight, (const char*)predef->background);
}
for(const struct level_clickregion *cr = predef->clickregions; cr->num_edges; cr++) {
struct object *obj = scene_add_object(sc, cr->id, cr->x, cr->y, cr->width, cr->height, nullptr);
obj->clickregion = cr;