From 5a6b51be77da8346451725d98eec202c2f84a358 Mon Sep 17 00:00:00 2001 From: immibis Date: Wed, 19 Feb 2025 19:09:13 +0100 Subject: [PATCH] navmesh and background are included in level predef data --- compile_navmesh.py | 12 ++++++++++++ compiled_structures.h | 3 +++ game.cpp | 22 ---------------------- pinetab2_framework.cpp | 4 ++++ 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/compile_navmesh.py b/compile_navmesh.py index f081ea9..3310425 100644 --- a/compile_navmesh.py +++ b/compile_navmesh.py @@ -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") diff --git a/compiled_structures.h b/compiled_structures.h index 3f5bf87..05159e0 100644 --- a/compiled_structures.h +++ b/compiled_structures.h @@ -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; }; diff --git a/game.cpp b/game.cpp index eca60bf..44f761c 100644 --- a/game.cpp +++ b/game.cpp @@ -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; } diff --git a/pinetab2_framework.cpp b/pinetab2_framework.cpp index 80b2242..4eb286b 100644 --- a/pinetab2_framework.cpp +++ b/pinetab2_framework.cpp @@ -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;