Player start positions are defined in the navmesh file, next to the navmesh and clickregions.

master
immibis 2025-02-19 17:21:26 +01:00
parent 80a307de5f
commit 5990166a92
14 changed files with 185 additions and 56 deletions

View File

@ -151,4 +151,11 @@ for object in tree.findall("objectgroup[@name='clickable']/object"):
out.write("\t\t},\n"); out.write("\t\t},\n");
out.write("\t\t{0}\n") out.write("\t\t{0}\n")
out.write("\t},\n") # clickregions end out.write("\t},\n") # clickregions end
out.write("\t(const struct level_predef_point[]){\n") # points start
for object in tree.findall("objectgroup[@name='points']/object"):
x,y=int(object.attrib["x"]),int(object.attrib["y"])
# Note: name can contain commas to populate multiple ID fields, or arithmetic expressions
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("};\n") out.write("};\n")

View File

@ -34,8 +34,13 @@ struct level_clickregion {
int num_edges; int num_edges;
const struct level_clickregion_edge *edges; const struct level_clickregion_edge *edges;
}; };
struct level_predef_point {
int x, y;
int id;
};
struct level_predef_data { struct level_predef_data {
const struct level_clickregion *clickregions; // terminated by null entry const struct level_clickregion *clickregions; // terminated by null entry
const struct level_predef_point *points; // terminated by x=0 y=0
}; };

View File

@ -38,7 +38,8 @@ extern struct scene {
scene_render_fn render_fn; // default standard_scene_render scene_render_fn render_fn; // default standard_scene_render
scene_animtimer_fn animtimer_fn; // default null scene_animtimer_fn animtimer_fn; // default null
scene_handle_tap_fn handle_tap_fn; // default standard_handle_tap scene_handle_tap_fn handle_tap_fn; // default standard_handle_tap
struct navmesh *navmesh; // defaults to non-null pointer to empty navmesh const struct navmesh *navmesh; // defaults to non-null pointer to empty navmesh
const struct level_predef_data *predef;
bool use_standard_inventory; // defaults to true bool use_standard_inventory; // defaults to true
bool dim_background; // defaults to false, because most scenes overwrite the whole screen bool dim_background; // defaults to false, because most scenes overwrite the whole screen
@ -97,18 +98,6 @@ extern bool need_rerender;
void fillrect(int x1, int y1, int width, int height, uint32_t pixel); void fillrect(int x1, int y1, int width, int height, uint32_t pixel);
void blit(int x, int y, int width, int height, uint32_t *pixels); void blit(int x, int y, int width, int height, uint32_t *pixels);
// game-specific constants
#define SCENE_LOBBY 1
#define SCENE_MANAGERS_OFFICE 2
#define SCENE_MANAGERS_OFFICE_SAFE 3
#define SCENE_BASEMENT 4
#define SCENE_TEXTBOX 5
#define SCENE_HALLWAY1 6
#define SCENE_HALLWAY2 7
#define SCENE_HALLWAY3 8
#define SCENE_CLOAKROOM 9
// game.cpp // game.cpp
void scene_setup(scene *s, int scene, int fromscene); void scene_setup(scene *s, int scene, int fromscene);
void onclick(int curscene, struct object *obj); void onclick(int curscene, struct object *obj);

View File

@ -3,7 +3,7 @@
#include "engine.h" #include "engine.h"
#include "objids.h" #include "objids.h"
#include "inventory.h" #include "inventory.h"
#include "compiled_structures.h"
#define BGWIDTH 1066 #define BGWIDTH 1066
@ -21,25 +21,45 @@ extern const char _binary_sprite_item_pager_raw_start[];
extern const char _binary_sprite_stickman_raw_start[]; extern const char _binary_sprite_stickman_raw_start[];
extern struct navmesh navmesh_lobby, navmesh_managers_office, navmesh_basement, navmesh_cloakroom, navmesh_hallway1, navmesh_hallway2, navmesh_hallway3; extern const struct navmesh navmesh_lobby, navmesh_managers_office, navmesh_basement, navmesh_cloakroom, navmesh_hallway1, navmesh_hallway2, navmesh_hallway3;
extern struct level_predef_data predef_basement, predef_lobby, predef_managers_office, predef_cloakroom, predef_hallway1, predef_hallway2, predef_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) { static void create_player(scene *me, int x, int y) {
const int WIDTH=51, HEIGHT=111; const int WIDTH=51, HEIGHT=111;
scene_add_object(me, OBJID_PLAYER, x-WIDTH/2, y-HEIGHT, WIDTH, HEIGHT, _binary_sprite_stickman_raw_start); scene_add_object(me, OBJID_PLAYER, x-WIDTH/2, y-HEIGHT, WIDTH, HEIGHT, _binary_sprite_stickman_raw_start);
} }
static const struct level_predef_point *find_level_predef_point(const struct level_predef_data *predef, int id) {
for(const struct level_predef_point *pt = predef->points; pt->x || pt->y; pt++) {
if(pt->id == id)
return pt;
}
return nullptr;
}
static void create_player_startpt(scene *me, int fromscene) {
int x, y;
assert(me->predef);
const struct level_predef_point *pt = (fromscene < 0 ? nullptr : find_level_predef_point(me->predef, OBJID_PLAYER_START+fromscene));
if(!pt)
pt = find_level_predef_point(me->predef, OBJID_PLAYER_START_DEFAULT);
if(pt) {
x = pt->x;
y = pt->y;
} else {
x = BGWIDTH/2;
y = BGHEIGHT/2;
}
create_player(me, x, y);
}
void scene_setup(scene *me, int scene, int fromscene) { void scene_setup(scene *me, int scene, int fromscene) {
switch(scene) { switch(scene) {
case SCENE_LOBBY: case SCENE_LOBBY:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_lobby_raw_start); scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_lobby_raw_start);
scene_load_predef(me, &predef_lobby); scene_load_predef(me, &predef_lobby);
switch(fromscene) {
case SCENE_MANAGERS_OFFICE: create_player(me, 256, 445); break;
case SCENE_CLOAKROOM: create_player(me, 777, 443); break;
default: create_player(me, 424, 675); break;
}
me->navmesh = &navmesh_lobby; me->navmesh = &navmesh_lobby;
create_player_startpt(me, fromscene);
if(fromscene == -1) { if(fromscene == -1) {
push_scene_textbox("Welcome\n\nto\n\ntestgame"); push_scene_textbox("Welcome\n\nto\n\ntestgame");
} }
@ -47,13 +67,8 @@ void scene_setup(scene *me, int scene, int fromscene) {
case SCENE_MANAGERS_OFFICE: case SCENE_MANAGERS_OFFICE:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_managers_office_raw_start); scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_managers_office_raw_start);
scene_load_predef(me, &predef_managers_office); scene_load_predef(me, &predef_managers_office);
switch(fromscene) {
case SCENE_LOBBY: create_player(me, 804, 708); break;
case SCENE_BASEMENT: create_player(me, 408, 559); break;
case SCENE_HALLWAY1: create_player(me, 664, 419); break;
default: create_player(me, 424, 675); break;
}
me->navmesh = &navmesh_managers_office; me->navmesh = &navmesh_managers_office;
create_player_startpt(me, fromscene);
break; break;
case SCENE_MANAGERS_OFFICE_SAFE: case SCENE_MANAGERS_OFFICE_SAFE:
scene_add_object(me, OBJID_BACKGROUND, 248, 0, 787, BGHEIGHT, _binary_sprite_managers_office_safe_raw_start); scene_add_object(me, OBJID_BACKGROUND, 248, 0, 787, BGHEIGHT, _binary_sprite_managers_office_safe_raw_start);
@ -68,40 +83,32 @@ void scene_setup(scene *me, int scene, int fromscene) {
if(!savefile.got_pager_from_basement) { if(!savefile.got_pager_from_basement) {
scene_add_object(me, OBJID_PAGER, 556, 520, 87, 87, _binary_sprite_item_pager_raw_start); scene_add_object(me, OBJID_PAGER, 556, 520, 87, 87, _binary_sprite_item_pager_raw_start);
} }
create_player(me, 435, 404);
me->navmesh = &navmesh_basement; me->navmesh = &navmesh_basement;
create_player_startpt(me, fromscene);
break; break;
case SCENE_CLOAKROOM: case SCENE_CLOAKROOM:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_cloakroom_raw_start); scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_cloakroom_raw_start);
scene_load_predef(me, &predef_cloakroom); scene_load_predef(me, &predef_cloakroom);
me->navmesh = &navmesh_cloakroom; me->navmesh = &navmesh_cloakroom;
create_player(me, 361, 714); create_player_startpt(me, fromscene);
break; break;
case SCENE_HALLWAY1: case SCENE_HALLWAY1:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway1_raw_start); scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway1_raw_start);
scene_load_predef(me, &predef_hallway1); scene_load_predef(me, &predef_hallway1);
me->navmesh = &navmesh_hallway1; me->navmesh = &navmesh_hallway1;
switch(fromscene) { create_player_startpt(me, fromscene);
case SCENE_MANAGERS_OFFICE: default: create_player(me, 531, 714); break;
case SCENE_HALLWAY2: create_player(me, 553, 75); break;
}
break; break;
case SCENE_HALLWAY2: case SCENE_HALLWAY2:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway2_raw_start); scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway2_raw_start);
scene_load_predef(me, &predef_hallway2); scene_load_predef(me, &predef_hallway2);
me->navmesh = &navmesh_hallway2; me->navmesh = &navmesh_hallway2;
switch(fromscene) { create_player_startpt(me, fromscene);
case SCENE_HALLWAY1: default: create_player(me, 531, 714); break;
case SCENE_HALLWAY3: create_player(me, 553, 75); break;
}
break; break;
case SCENE_HALLWAY3: case SCENE_HALLWAY3:
scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway3_raw_start); scene_add_object(me, OBJID_BACKGROUND, 0, 0, BGWIDTH, BGHEIGHT, _binary_sprite_hallway3_raw_start);
scene_load_predef(me, &predef_hallway3); scene_load_predef(me, &predef_hallway3);
me->navmesh = &navmesh_hallway3; me->navmesh = &navmesh_hallway3;
switch(fromscene) { create_player_startpt(me, fromscene);
case SCENE_HALLWAY2: default: create_player(me, 531, 714); break;
}
break; break;
} }
} }

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="40" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="8"> <map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="40" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="6" nextobjectid="9">
<imagelayer id="2" name="Image Layer 1"> <imagelayer id="2" name="Image Layer 1">
<image source="../build/default/basement.png" width="1280" height="800"/> <image source="../build/default/basement.png" width="1280" height="800"/>
</imagelayer> </imagelayer>
@ -18,4 +18,9 @@
<object id="6" name="OBJID_POPCORN_BARREL" x="733" y="293" width="83" height="148"/> <object id="6" name="OBJID_POPCORN_BARREL" x="733" y="293" width="83" height="148"/>
<object id="7" name="OBJID_POPCORN_BARREL" x="835" y="295" width="81" height="146"/> <object id="7" name="OBJID_POPCORN_BARREL" x="835" y="295" width="81" height="146"/>
</objectgroup> </objectgroup>
<objectgroup id="5" name="points">
<object id="8" name="OBJID_PLAYER_START_DEFAULT" x="435" y="416">
<point/>
</object>
</objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="3"> <map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="6" nextobjectid="4">
<imagelayer id="2" name="Image Layer 1"> <imagelayer id="2" name="Image Layer 1">
<image source="../build/default/cloakroom.png" width="1066" height="800"/> <image source="../build/default/cloakroom.png" width="1066" height="800"/>
</imagelayer> </imagelayer>
@ -11,4 +11,9 @@
<objectgroup id="3" name="clickable"> <objectgroup id="3" name="clickable">
<object id="2" name="OBJID_LEAVE_ROOM" x="283" y="437" width="157" height="276"/> <object id="2" name="OBJID_LEAVE_ROOM" x="283" y="437" width="157" height="276"/>
</objectgroup> </objectgroup>
<objectgroup id="5" name="points">
<object id="3" name="OBJID_PLAYER_START_DEFAULT" x="355" y="700">
<point/>
</object>
</objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="12"> <map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="6" nextobjectid="14">
<imagelayer id="2" name="Image Layer 1"> <imagelayer id="2" name="Image Layer 1">
<image source="../build/default/hallway1.png" width="1066" height="800"/> <image source="../build/default/hallway1.png" width="1066" height="800"/>
</imagelayer> </imagelayer>
@ -36,4 +36,12 @@
<object id="1" name="OBJID_LEAVE_ROOM" x="466" y="439" width="155" height="277"/> <object id="1" name="OBJID_LEAVE_ROOM" x="466" y="439" width="155" height="277"/>
<object id="11" name="OBJID_NEXT_ROOM" x="511" y="1" width="80" height="74"/> <object id="11" name="OBJID_NEXT_ROOM" x="511" y="1" width="80" height="74"/>
</objectgroup> </objectgroup>
<objectgroup id="5" name="points">
<object id="12" name="OBJID_PLAYER_START_DEFAULT" x="541" y="713">
<point/>
</object>
<object id="13" name="OBJID_PLAYER_START+SCENE_HALLWAY2" x="552" y="80">
<point/>
</object>
</objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="13"> <map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="6" nextobjectid="15">
<imagelayer id="2" name="Image Layer 1"> <imagelayer id="2" name="Image Layer 1">
<image source="../build/default/hallway2.png" width="1066" height="800"/> <image source="../build/default/hallway2.png" width="1066" height="800"/>
</imagelayer> </imagelayer>
@ -39,4 +39,12 @@
<object id="1" name="OBJID_LEAVE_ROOM" x="485" y="654" width="43" height="54"/> <object id="1" name="OBJID_LEAVE_ROOM" x="485" y="654" width="43" height="54"/>
<object id="2" name="OBJID_NEXT_ROOM" x="510" y="1" width="85" height="74"/> <object id="2" name="OBJID_NEXT_ROOM" x="510" y="1" width="85" height="74"/>
</objectgroup> </objectgroup>
<objectgroup id="5" name="points">
<object id="13" name="OBJID_PLAYER_START_DEFAULT" x="509" y="638">
<point/>
</object>
<object id="14" name="OBJID_PLAYER_START+SCENE_HALLWAY3" x="552" y="83">
<point/>
</object>
</objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="14"> <map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="34" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="7" nextobjectid="15">
<imagelayer id="2" name="Image Layer 1"> <imagelayer id="2" name="Image Layer 1">
<image source="../build/default/hallway3.png" width="1066" height="800"/> <image source="../build/default/hallway3.png" width="1066" height="800"/>
</imagelayer> </imagelayer>
@ -41,4 +41,9 @@
<objectgroup id="3" name="clickable"> <objectgroup id="3" name="clickable">
<object id="1" name="OBJID_LEAVE_ROOM" x="486" y="654" width="41" height="57"/> <object id="1" name="OBJID_LEAVE_ROOM" x="486" y="654" width="41" height="57"/>
</objectgroup> </objectgroup>
<objectgroup id="6" name="points">
<object id="14" name="OBJID_PLAYER_START_DEFAULT" x="503" y="635">
<point/>
</object>
</objectgroup>
</map> </map>

View File

@ -1,13 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="40" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="21"> <map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="40" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="6" nextobjectid="24">
<imagelayer id="2" name="Image Layer 1"> <imagelayer id="2" name="Image Layer 1">
<image source="../build/default/lobby.png" width="1066" height="800"/> <image source="../build/default/lobby.png" width="1066" height="800"/>
</imagelayer> </imagelayer>
<objectgroup id="3" name="clickable">
<object id="1" name="OBJID_DOOR_TO_MANAGERS_OFFICE_FROM_LOBBY" x="227" y="312" width="64" height="128"/>
<object id="19" name="OBJID_LEAVE_ROOM" x="468" y="720" width="83" height="79"/>
<object id="20" name="OBJID_LOBBY_TO_CLOAKROOM" x="752" y="319" width="51" height="121"/>
</objectgroup>
<objectgroup id="4" name="navmesh"> <objectgroup id="4" name="navmesh">
<object id="10" x="178" y="440"> <object id="10" x="178" y="440">
<polygon points="0,0 112,83 159,-1"/> <polygon points="0,0 112,83 159,-1"/>
@ -31,4 +26,20 @@
<polygon points="186,81 -5,84 21,261 283,261"/> <polygon points="186,81 -5,84 21,261 283,261"/>
</object> </object>
</objectgroup> </objectgroup>
<objectgroup id="3" name="clickable">
<object id="1" name="OBJID_DOOR_TO_MANAGERS_OFFICE_FROM_LOBBY" x="227" y="312" width="64" height="128"/>
<object id="19" name="OBJID_LEAVE_ROOM" x="468" y="720" width="83" height="79"/>
<object id="20" name="OBJID_LOBBY_TO_CLOAKROOM" x="752" y="319" width="51" height="121"/>
</objectgroup>
<objectgroup id="5" name="points">
<object id="21" name="OBJID_PLAYER_START_DEFAULT" x="352" y="684">
<point/>
</object>
<object id="22" name="OBJID_PLAYER_START+SCENE_MANAGERS_OFFICE" x="256" y="443">
<point/>
</object>
<object id="23" name="OBJID_PLAYER_START+SCENE_CLOAKROOM" x="775" y="443">
<point/>
</object>
</objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="30" height="20" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="25"> <map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="35" height="25" tilewidth="32" tileheight="32" infinite="0" nextlayerid="6" nextobjectid="28">
<imagelayer id="2" name="Image Layer 1"> <imagelayer id="2" name="Image Layer 1">
<image source="../build/default/managers_office.png" width="1280" height="800"/> <image source="../build/default/managers_office.png" width="1280" height="800"/>
</imagelayer> </imagelayer>
@ -48,4 +48,15 @@
</object> </object>
<object id="24" name="OBJID_MANAGERS_OFFICE_TO_HALLWAY" x="614" y="236" width="105" height="181"/> <object id="24" name="OBJID_MANAGERS_OFFICE_TO_HALLWAY" x="614" y="236" width="105" height="181"/>
</objectgroup> </objectgroup>
<objectgroup id="5" name="points">
<object id="25" name="OBJID_PLAYER_START_DEFAULT" x="814" y="715">
<point/>
</object>
<object id="26" name="OBJID_PLAYER_START+SCENE_HALLWAY1" x="665" y="417">
<point/>
</object>
<object id="27" name="OBJID_PLAYER_START+SCENE_BASEMENT" x="405" y="561">
<point/>
</object>
</objectgroup>
</map> </map>

55
navmesh/world.world Normal file
View File

@ -0,0 +1,55 @@
{
"maps": [
{
"fileName": "hallway2.tmx",
"height": 800,
"width": 1088,
"x": 0,
"y": 0
},
{
"fileName": "hallway1.tmx",
"height": 800,
"width": 1088,
"x": 0,
"y": 800
},
{
"fileName": "hallway3.tmx",
"height": 800,
"width": 1088,
"x": 0,
"y": -800
},
{
"fileName": "managers_office.tmx",
"height": 640,
"width": 960,
"x": 0,
"y": 1600
},
{
"fileName": "basement.tmx",
"height": 800,
"width": 1280,
"x": -672,
"y": 2400
},
{
"fileName": "lobby.tmx",
"height": 800,
"width": 1280,
"x": 736,
"y": 2400
},
{
"fileName": "cloakroom.tmx",
"height": 800,
"width": 1088,
"x": 1280,
"y": 1600
}
],
"onlyShowAdjacentMaps": false,
"type": "world"
}

View File

@ -18,4 +18,16 @@
#define OBJID_LOBBY_TO_CLOAKROOM 18 #define OBJID_LOBBY_TO_CLOAKROOM 18
#define OBJID_MANAGERS_OFFICE_TO_HALLWAY 19 #define OBJID_MANAGERS_OFFICE_TO_HALLWAY 19
#define OBJID_INVENTORY_SLOTS 0x10000000 // + slot number #define OBJID_INVENTORY_SLOTS 0x01000000 // + slot number
#define OBJID_PLAYER_START 0x02000000 // + previous scene number
#define OBJID_PLAYER_START_DEFAULT 0x02ffffff
#define SCENE_LOBBY 1
#define SCENE_MANAGERS_OFFICE 2
#define SCENE_MANAGERS_OFFICE_SAFE 3
#define SCENE_BASEMENT 4
#define SCENE_TEXTBOX 5
#define SCENE_HALLWAY1 6
#define SCENE_HALLWAY2 7
#define SCENE_HALLWAY3 8
#define SCENE_CLOAKROOM 9

View File

@ -229,6 +229,7 @@ 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) { void scene_load_predef(struct scene *sc, const struct level_predef_data *predef) {
sc->predef = predef;
for(const struct level_clickregion *cr = predef->clickregions; cr->num_edges; cr++) { 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); struct object *obj = scene_add_object(sc, cr->id, cr->x, cr->y, cr->width, cr->height, nullptr);
obj->clickregion = cr; obj->clickregion = cr;
@ -352,7 +353,7 @@ static double is_point_in_tri(int x, int y, const struct navmesh_tri *tri) {
static int find_navmesh_tri(int x, int y, int tolerance) { static int find_navmesh_tri(int x, int y, int tolerance) {
int best_tri = -1; int best_tri = -1;
double best_dist = tolerance; double best_dist = tolerance;
struct navmesh *cur_navmesh = top_scene.navmesh; const struct navmesh *cur_navmesh = top_scene.navmesh;
for(int i = 0; i < cur_navmesh->num_tris; i++) { for(int i = 0; i < cur_navmesh->num_tris; i++) {
double dist = is_point_in_tri(x, y, &cur_navmesh->tris[i]); double dist = is_point_in_tri(x, y, &cur_navmesh->tris[i]);
if(dist == 0) if(dist == 0)
@ -392,7 +393,7 @@ void start_player_walk_to_point(int targetX, int targetY) {
void standard_handle_tap(struct scene *scene, int x, int y) { void standard_handle_tap(struct scene *scene, int x, int y) {
uint32_t walkgen = player_walk_generation; uint32_t walkgen = player_walk_generation;
int sceneid = scene->id; int sceneid = scene->id;
struct navmesh *cur_navmesh = top_scene.navmesh; const struct navmesh *cur_navmesh = top_scene.navmesh;
struct object *objects = top_scene.objects; struct object *objects = top_scene.objects;
for(int i = 0; i < MAX_OBJECTS_PER_SCENE; i++) { for(int i = 0; i < MAX_OBJECTS_PER_SCENE; i++) {
if(!objects[i].id) continue; if(!objects[i].id) continue;
@ -443,7 +444,7 @@ static void update_player_walk_script_on_frame(struct script *scr, int wakeupMod
deliver_script_wakeup(SCRIPT_WAKEUP_OTHER_SCRIPT, script_id, SCRIPT_WAKEUP_OTHER_SCRIPT_INTERRUPTED, 0, 0, 0, 0); deliver_script_wakeup(SCRIPT_WAKEUP_OTHER_SCRIPT, script_id, SCRIPT_WAKEUP_OTHER_SCRIPT_INTERRUPTED, 0, 0, 0, 0);
return; return;
} }
struct navmesh *cur_navmesh = top_scene.navmesh; const struct navmesh *cur_navmesh = top_scene.navmesh;
if(player_walk_script->currentNavmeshTri == -1) { if(player_walk_script->currentNavmeshTri == -1) {
// something weird happened. just teleport player and end movement. // something weird happened. just teleport player and end movement.