Make objects not run their code if the room they are in isn't loaded. (#502)

This commit is contained in:
arthurtilly
2022-11-03 11:35:47 +13:00
committed by GitHub
parent d7d0364682
commit ab94fd7f63
5 changed files with 21 additions and 7 deletions

View File

@@ -2626,6 +2626,7 @@ const BehaviorScript bhvExclamationBox[] = {
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
SET_FLOAT(oCollisionDistance, 300),
SET_HOME(),
CALL_NATIVE(bhv_init_room),
BEGIN_LOOP(),
CALL_NATIVE(bhv_exclamation_box_loop),
END_LOOP(),
@@ -3772,6 +3773,7 @@ const BehaviorScript bhvMessagePanel[] = {
DROP_TO_FLOOR(),
SET_HITBOX(/*Radius*/ 150, /*Height*/ 80),
SET_INT(oWoodenPostTotalMarioAngle, 0),
CALL_NATIVE(bhv_init_room),
CALL_NATIVE(load_object_static_model),
BEGIN_LOOP(),
SET_INT(oIntangibleTimer, 0),
@@ -5600,6 +5602,7 @@ const BehaviorScript bhvActivatedBackAndForthPlatform[] = {
const BehaviorScript bhvRecoveryHeart[] = {
BEGIN(OBJ_LIST_LEVEL),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)),
CALL_NATIVE(bhv_init_room),
BEGIN_LOOP(),
CALL_NATIVE(bhv_recovery_heart_loop),
END_LOOP(),

View File

@@ -55,6 +55,7 @@ enum ObjFlags {
OBJ_FLAG_OCCLUDE_SILHOUETTE = (1 << 20), // 0x00100000
OBJ_FLAG_OPACITY_FROM_CAMERA_DIST = (1 << 21), // 0x00200000
OBJ_FLAG_EMIT_LIGHT = (1 << 22), // 0x00400000
OBJ_FLAG_PROCESS_OUTSIDE_ROOM = (1 << 23), // 0x00800000
OBJ_FLAG_HITBOX_WAS_SET = (1 << 30), // 0x40000000
};

View File

@@ -820,6 +820,15 @@ void cur_obj_update(void) {
BhvCommandProc bhvCmdProc;
s32 bhvProcResult;
if (!(objFlags & OBJ_FLAG_PROCESS_OUTSIDE_ROOM)) {
if (o->oRoom != -1 && gMarioCurrentRoom != 0 && !is_room_loaded()) {
cur_obj_disable_rendering();
o->activeFlags |= ACTIVE_FLAG_IN_DIFFERENT_ROOM;
gNumRoomedObjectsNotInMarioRoom++;
return;
}
}
// Calculate the distance from the object to Mario.
if (objFlags & OBJ_FLAG_COMPUTE_DIST_TO_MARIO) {
o->oDistanceToMario = dist_between_objects(o, gMarioObject);

View File

@@ -1891,15 +1891,15 @@ void bhv_init_room(void) {
o->oRoom = -1;
}
u32 is_room_loaded(void) {
return gMarioCurrentRoom == o->oRoom
|| gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oRoom
|| gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oRoom;
}
void cur_obj_enable_rendering_if_mario_in_room(void) {
if (o->oRoom != -1 && gMarioCurrentRoom != 0) {
register s32 marioInRoom = (
gMarioCurrentRoom == o->oRoom
|| gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oRoom
|| gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oRoom
);
if (marioInRoom) {
if (is_room_loaded()) {
cur_obj_enable_rendering();
o->activeFlags &= ~ACTIVE_FLAG_IN_DIFFERENT_ROOM;
gNumRoomedObjectsInMarioRoom++;

View File

@@ -235,6 +235,7 @@ void cur_obj_call_action_function(ObjActionFunc actionFunctions[]);
s32 cur_obj_mario_far_away(void);
s32 is_mario_moving_fast_or_in_air(s32 speedThreshold);
s32 is_item_in_array(s8 item, s8 *array);
u32 is_room_loaded(void);
void cur_obj_enable_rendering_if_mario_in_room(void);
s32 cur_obj_set_hitbox_and_die_if_attacked(struct ObjectHitbox *hitbox, s32 deathSound, s32 noLootCoins);
void obj_explode_and_spawn_coins(f32 mistSize, s32 coinType);