diff --git a/data/behavior_data.c b/data/behavior_data.c index 9f9f7843a..529c0ef43 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -4603,6 +4603,7 @@ const BehaviorScript bhvLllDrawbridgeSpawner[] = { BEGIN(OBJ_LIST_DEFAULT), ID(id_bhvLllDrawbridgeSpawner), HIDE(), + CALL_NATIVE(bhv_lll_drawbridge_spawner_init), BEGIN_LOOP(), CALL_NATIVE(bhv_lll_drawbridge_spawner_loop), END_LOOP(), diff --git a/src/game/behavior_actions.h b/src/game/behavior_actions.h index 3b0c624cc..cca0c65e6 100644 --- a/src/game/behavior_actions.h +++ b/src/game/behavior_actions.h @@ -325,6 +325,7 @@ void bhv_celebration_star_init(void); void bhv_celebration_star_loop(void); void bhv_celebration_star_sparkle_loop(void); void bhv_star_key_collection_puff_spawner_loop(void); +void bhv_lll_drawbridge_spawner_init(void); void bhv_lll_drawbridge_spawner_loop(void); void bhv_lll_drawbridge_loop(void); void bhv_small_bomp_init(void); diff --git a/src/game/behaviors/drawbridge.inc.c b/src/game/behaviors/drawbridge.inc.c index 0fd049059..22c311e4e 100644 --- a/src/game/behaviors/drawbridge.inc.c +++ b/src/game/behaviors/drawbridge.inc.c @@ -1,22 +1,35 @@ // drawbridge.c.inc -void bhv_lll_drawbridge_spawner_loop(void) { - struct Object *drawbridge1, *drawbridge2; +void bhv_lll_drawbridge_spawner_init(void) { + struct Object *drawbridge[2]; - drawbridge1 = spawn_object(o, MODEL_LLL_DRAWBRIDGE_PART, bhvLllDrawbridge); - drawbridge1->oMoveAngleYaw = o->oMoveAngleYaw; - drawbridge1->oPosX += coss(o->oMoveAngleYaw) * 640.0f; - drawbridge1->oPosZ += sins(o->oMoveAngleYaw) * 640.0f; + drawbridge[0] = spawn_object(o, MODEL_LLL_DRAWBRIDGE_PART, bhvLllDrawbridge); + drawbridge[0]->oMoveAngleYaw = o->oMoveAngleYaw; + drawbridge[0]->oPosX += coss(o->oMoveAngleYaw) * 640.0f; + drawbridge[0]->oPosZ += sins(o->oMoveAngleYaw) * 640.0f; - drawbridge2 = spawn_object(o, MODEL_LLL_DRAWBRIDGE_PART, bhvLllDrawbridge); - drawbridge2->oMoveAngleYaw = o->oMoveAngleYaw + 0x8000; - drawbridge2->oPosX += coss(o->oMoveAngleYaw) * -640.0f; - drawbridge2->oPosZ += sins(o->oMoveAngleYaw) * -640.0f; + drawbridge[1] = spawn_object(o, MODEL_LLL_DRAWBRIDGE_PART, bhvLllDrawbridge); + drawbridge[1]->oMoveAngleYaw = o->oMoveAngleYaw + 0x8000; + drawbridge[1]->oPosX += coss(o->oMoveAngleYaw) * -640.0f; + drawbridge[1]->oPosZ += sins(o->oMoveAngleYaw) * -640.0f; - o->activeFlags = ACTIVE_FLAG_DEACTIVATED; + if (!network_sync_object_initialized(o)) { + network_init_object(o, 3000.0f); + for (int i = 0; i < 2; i++) { + network_init_object_field(o, &drawbridge[i]->oFaceAngleRoll); + network_init_object_field(o, &drawbridge[i]->oAction); + network_init_object_field(o, &drawbridge[i]->oPrevAction); + network_init_object_field(o, &drawbridge[i]->oTimer); + } + } + + //o->activeFlags = ACTIVE_FLAG_DEACTIVATED; } +void bhv_lll_drawbridge_spawner_loop(void) { } + void bhv_lll_drawbridge_loop(void) { + s32 globalTimer = gGlobalTimer; switch (o->oAction) { diff --git a/src/game/behaviors/lll_floating_wood_piece.inc.c b/src/game/behaviors/lll_floating_wood_piece.inc.c index 7994e2d9f..4be9fc0ee 100644 --- a/src/game/behaviors/lll_floating_wood_piece.inc.c +++ b/src/game/behaviors/lll_floating_wood_piece.inc.c @@ -1,6 +1,11 @@ // lll_floating_wood_piece.c.inc void bhv_lll_wood_piece_loop(void) { + if (!network_sync_object_initialized(o)) { + network_init_object(o, 1000.0f); + network_init_object_field(o, &o->oLllWoodPieceOscillationTimer); + } + if (o->oTimer == 0) o->oPosY -= 100.0f; o->oPosY += sins(o->oLllWoodPieceOscillationTimer) * 3.0f; diff --git a/src/game/behaviors/lll_hexagonal_ring.inc.c b/src/game/behaviors/lll_hexagonal_ring.inc.c index a0a4d6b78..809d4eb6e 100644 --- a/src/game/behaviors/lll_hexagonal_ring.inc.c +++ b/src/game/behaviors/lll_hexagonal_ring.inc.c @@ -15,12 +15,17 @@ void hexagonal_ring_spawn_flames(void) { } void bhv_lll_rotating_hexagonal_ring_loop(void) { + if (!network_sync_object_initialized(o)) { + struct SyncObject* so = network_init_object(o, 4000.0f); + so->keepRandomSeed = FALSE; + network_init_object_field(o, &o->oAngleVelYaw); + } UNUSED s32 unused; o->oCollisionDistance = 4000.0f; o->oDrawingDistance = 8000.0f; switch (o->oAction) { case 0: - if (gMarioObject->platform == o) + if (cur_obj_is_any_player_on_platform()) o->oAction++; o->oAngleVelYaw = 0x100; break; @@ -30,7 +35,7 @@ void bhv_lll_rotating_hexagonal_ring_loop(void) { o->oAction++; break; case 2: - if (gMarioObject->platform != o) + if (cur_obj_is_any_player_on_platform()) o->oAction++; if (o->oTimer > 128) o->oAction++; diff --git a/src/game/behaviors/lll_octagonal_rotating_mesh.inc.c b/src/game/behaviors/lll_octagonal_rotating_mesh.inc.c index 7fc4936ff..5dfb06567 100644 --- a/src/game/behaviors/lll_octagonal_rotating_mesh.inc.c +++ b/src/game/behaviors/lll_octagonal_rotating_mesh.inc.c @@ -41,7 +41,7 @@ s32 lll_octagonal_mesh_move(s16 *a0, s32 a1) { } s32 lll_octagonal_mesh_find_y_offset(s32 *a0, f32 *a1, s32 a2, s32 a3) { - if (cur_obj_is_mario_on_platform()) { + if (cur_obj_is_any_player_on_platform()) { if (a0[0] < 0x4000) a0[0] += a2; else @@ -60,6 +60,13 @@ s32 lll_octagonal_mesh_find_y_offset(s32 *a0, f32 *a1, s32 a2, s32 a3) { } void bhv_lll_moving_octagonal_mesh_platform_loop(void) { + if (!network_sync_object_initialized(o)) { + network_init_object(o, 4000.0f); + network_init_object_field(o, &o->oHorizontalMovementUnkF8); + network_init_object_field(o, &o->oHorizontalMovementUnkF4); + network_init_object_field(o, &o->oHorizontalMovementUnk100); + network_init_object_field(o, &o->oForwardVel); + } if (o->oAction == 0) { o->oHorizontalMovementUnkF8 = 0; o->oAction++; diff --git a/src/game/behaviors/lll_rotating_hex_flame.inc.c b/src/game/behaviors/lll_rotating_hex_flame.inc.c index fc7073305..710794d6f 100644 --- a/src/game/behaviors/lll_rotating_hex_flame.inc.c +++ b/src/game/behaviors/lll_rotating_hex_flame.inc.c @@ -61,6 +61,10 @@ void (*sRotatingCwFireBarsActions[])(void) = { fire_bar_act_0, fire_bar_act_1, fire_bar_act_2, fire_bar_act_3 }; void bhv_lll_rotating_block_fire_bars_loop(void) { + if (!network_sync_object_initialized(o)) { + network_init_object(o, 4000.0f); + network_init_object_field(o, &o->oAngleVelYaw); + } cur_obj_call_action_function(sRotatingCwFireBarsActions); if (o->oBehParams2ndByte == 0) load_object_collision_model(); diff --git a/src/game/behaviors/lll_sinking_rectangle.inc.c b/src/game/behaviors/lll_sinking_rectangle.inc.c index bda4a8443..07d945dd4 100644 --- a/src/game/behaviors/lll_sinking_rectangle.inc.c +++ b/src/game/behaviors/lll_sinking_rectangle.inc.c @@ -16,6 +16,11 @@ void sinking_rectangular_plat_actions(f32 a0, s32 a1) { } void bhv_lll_sinking_rectangular_platform_loop(void) { + if (!network_sync_object_initialized(o)) { + struct SyncObject* so = network_init_object(o, 1000.0f); + network_init_object_field(o, &o->oLllWoodPieceOscillationTimer); + network_init_object_field(o, &o->oFaceAnglePitch); + } f32 sp1C = 0.4f; s32 sp18 = 0x100; if (o->oMoveAngleYaw != 0) @@ -27,6 +32,10 @@ void bhv_lll_sinking_rectangular_platform_loop(void) { } void bhv_lll_sinking_square_platforms_loop(void) { + if (!network_sync_object_initialized(o)) { + network_init_object(o, 1000.0f); + network_init_object_field(o, &o->oLllWoodPieceOscillationTimer); + } f32 sp1C = 0.5f; s32 sp18 = 0x100; sinking_rectangular_plat_actions(sp1C, sp18); diff --git a/src/game/behaviors/lll_sinking_rock_block.inc.c b/src/game/behaviors/lll_sinking_rock_block.inc.c index 056d0aaa6..25517e8f1 100644 --- a/src/game/behaviors/lll_sinking_rock_block.inc.c +++ b/src/game/behaviors/lll_sinking_rock_block.inc.c @@ -1,6 +1,11 @@ // lll_sinking_rock_block.c.inc void bhv_lll_sinking_rock_block_loop(void) { + if (!network_sync_object_initialized(o)) { + network_init_object(o, 1000.0f); + network_init_object_field(o, &o->oSinkWhenSteppedOnUnk104); + network_init_object_field(o, &o->oGraphYOffset); + } lll_octagonal_mesh_find_y_offset(&o->oSinkWhenSteppedOnUnk104, &o->oSinkWhenSteppedOnUnk108, 124, -110); o->oGraphYOffset = 0.0f; o->oPosY = o->oHomeY + o->oSinkWhenSteppedOnUnk108; diff --git a/src/game/behaviors/platform_on_track.inc.c b/src/game/behaviors/platform_on_track.inc.c index 3a9464803..d878dffe6 100644 --- a/src/game/behaviors/platform_on_track.inc.c +++ b/src/game/behaviors/platform_on_track.inc.c @@ -117,13 +117,7 @@ static void platform_on_track_act_init(void) { * Wait for mario to stand on the platform for 20 frames, then begin moving. */ static void platform_on_track_act_wait_for_mario(void) { - u8 anyMarioOnPlatform = FALSE; - for (int i = 0; i < MAX_PLAYERS; i++) { - if (!is_player_active(&gMarioStates[i])) { continue; } - if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; } - } - - if (anyMarioOnPlatform) { + if (cur_obj_is_any_player_on_platform()) { if (o->oTimer > 20) { o->oAction = PLATFORM_ON_TRACK_ACT_MOVE_ALONG_TRACK; if (network_owns_object(o)) { network_send_object(o); } @@ -223,13 +217,7 @@ static void platform_on_track_act_move_along_track(void) { } } - u8 anyMarioOnPlatform = FALSE; - for (int i = 0; i < MAX_PLAYERS; i++) { - if (!is_player_active(&gMarioStates[i])) { continue; } - if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; } - } - - if (!anyMarioOnPlatform) { + if (!cur_obj_is_any_player_on_platform()) { platform_on_track_mario_not_on_platform(); } else { o->oTimer = 0; @@ -253,13 +241,7 @@ static void platform_on_track_act_pause_briefly(void) { static void platform_on_track_act_fall(void) { cur_obj_move_using_vel_and_gravity(); - u8 anyMarioOnPlatform = FALSE; - for (int i = 0; i < MAX_PLAYERS; i++) { - if (!is_player_active(&gMarioStates[i])) { continue; } - if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; } - } - - if (!anyMarioOnPlatform) { + if (!cur_obj_is_any_player_on_platform()) { platform_on_track_mario_not_on_platform(); } else { o->oTimer = 0; @@ -324,16 +306,10 @@ void bhv_platform_on_track_update(void) { break; } - u8 anyMarioOnPlatform = FALSE; - for (int i = 0; i < MAX_PLAYERS; i++) { - if (!is_player_active(&gMarioStates[i])) { continue; } - if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; } - } - if (!o->oPlatformOnTrackIsNotSkiLift) { platform_on_track_rock_ski_lift(); } else if (o->oPlatformOnTrackType == PLATFORM_ON_TRACK_TYPE_CARPET) { - if (!o->oPlatformOnTrackWasStoodOn && anyMarioOnPlatform) { + if (!o->oPlatformOnTrackWasStoodOn && cur_obj_is_any_player_on_platform()) { o->oPlatformOnTrackOffsetY = -8.0f; o->oPlatformOnTrackWasStoodOn = TRUE; } diff --git a/src/game/behaviors/rolling_log.inc.c b/src/game/behaviors/rolling_log.inc.c index dd88e552a..f3dc7dc86 100644 --- a/src/game/behaviors/rolling_log.inc.c +++ b/src/game/behaviors/rolling_log.inc.c @@ -6,6 +6,16 @@ // hypothesis is that the object in the middle here used to be // a rolling log of another variation. +static void bhv_rolling_log_network_init(void) { + network_init_object(o, 4000.0f); + network_init_object_field(o, &o->oAngleVelPitch); + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oMoveAnglePitch); + network_init_object_field(o, &o->oPitouneUnkF4); + network_init_object_field(o, &o->oPitouneUnkF8); + network_init_object_field(o, &o->oPitouneUnkFC); +} + void bhv_ttm_rolling_log_init(void) { o->oPitouneUnkF8 = 3970.0f; o->oPitouneUnkFC = 3654.0f; @@ -16,14 +26,32 @@ void bhv_ttm_rolling_log_init(void) { o->oVelZ = 0; o->oFaceAnglePitch = 0; o->oAngleVelPitch = 0; + bhv_rolling_log_network_init(); } void rolling_log_roll_log(void) { f32 sp24; - if (gMarioObject->platform == o) { - sp24 = (gMarioObject->header.gfx.pos[2] - o->oPosZ) * coss(-1*o->oMoveAngleYaw) - - (gMarioObject->header.gfx.pos[0] - o->oPosX) * sins(-1*o->oMoveAngleYaw); + f32 x = 0; + f32 y = 0; + f32 z = 0; + u8 playersTouched = 0; + for (int i = 0; i < MAX_PLAYERS; i++) { + if (!is_player_active(&gMarioStates[i])) { continue; } + if (gMarioStates[i].marioObj->platform != o) { continue; } + x += gMarioObject->header.gfx.pos[0]; + y += gMarioObject->header.gfx.pos[1]; + z += gMarioObject->header.gfx.pos[2]; + playersTouched++; + if (i == 0) { marioOnPlatform = TRUE; } + } + + if (playersTouched > 0) { + x /= (f32)playersTouched; + y /= (f32)playersTouched; + z /= (f32)playersTouched; + + sp24 = (z - o->oPosZ) * coss(-1*o->oMoveAngleYaw) - (x - o->oPosX) * sins(-1*o->oMoveAngleYaw); if (sp24 > 0) o->oAngleVelPitch += 0x10; else @@ -112,6 +140,13 @@ void volcano_act_3(void) { } void bhv_volcano_trap_loop(void) { + if (!network_sync_object_initialized(o)) { + network_init_object(o, 4000.0f); + network_init_object_field(o, &o->oRollingLogUnkF4); + network_init_object_field(o, &o->oAngleVelPitch); + network_init_object_field(o, &o->oFaceAnglePitch); + } + switch (o->oAction) { case 0: if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1000)) { @@ -151,4 +186,5 @@ void bhv_lll_rolling_log_init(void) { o->oVelZ = 0; o->oFaceAnglePitch = 0; o->oAngleVelPitch = 0; + bhv_rolling_log_network_init(); } diff --git a/src/game/behaviors/tilting_inverted_pyramid.inc.c b/src/game/behaviors/tilting_inverted_pyramid.inc.c index ebce64fc9..fdefe9f4e 100644 --- a/src/game/behaviors/tilting_inverted_pyramid.inc.c +++ b/src/game/behaviors/tilting_inverted_pyramid.inc.c @@ -81,19 +81,36 @@ void bhv_tilting_inverted_pyramid_loop(void) { Mat4 *transform = &o->transform; UNUSED s32 unused2[7]; - if (gMarioObject->platform == o) { + f32 x = 0; + f32 y = 0; + f32 z = 0; + u8 playersTouched = 0; + for (int i = 0; i < MAX_PLAYERS; i++) { + if (!is_player_active(&gMarioStates[i])) { continue; } + if (gMarioStates[i].marioObj->platform != o) { continue; } + x += gMarioStates[i].marioObj->oPosX; + y += gMarioStates[i].marioObj->oPosY; + z += gMarioStates[i].marioObj->oPosZ; + playersTouched++; + if (i == 0) { marioOnPlatform = TRUE; } + } + + if (playersTouched > 0) { + x /= (f32)playersTouched; + y /= (f32)playersTouched; + z /= (f32)playersTouched; get_mario_pos(&mx, &my, &mz); - dist[0] = gMarioObject->oPosX - o->oPosX; - dist[1] = gMarioObject->oPosY - o->oPosY; - dist[2] = gMarioObject->oPosZ - o->oPosZ; + dist[0] = x - o->oPosX; + dist[1] = y - o->oPosY; + dist[2] = z - o->oPosZ; linear_mtxf_mul_vec3f(*transform, posBeforeRotation, dist); - dx = gMarioObject->oPosX - o->oPosX; + dx = x - o->oPosX; dy = 500.0f; - dz = gMarioObject->oPosZ - o->oPosZ; + dz = z - o->oPosZ; d = sqrtf(dx * dx + dy * dy + dz * dz); - + //! Always true since dy = 500, making d >= 500. if (d != 0.0f) { // Normalizing @@ -107,8 +124,8 @@ void bhv_tilting_inverted_pyramid_loop(void) { dz = 0.0f; } - if (o->oTiltingPyramidMarioOnPlatform == TRUE) - marioOnPlatform++; + /*if (o->oTiltingPyramidMarioOnPlatform == TRUE) + marioOnPlatform++;*/ o->oTiltingPyramidMarioOnPlatform = TRUE; } else { diff --git a/src/game/behaviors/whomp.inc.c b/src/game/behaviors/whomp.inc.c index fee3fdb94..eab8c8fde 100644 --- a/src/game/behaviors/whomp.inc.c +++ b/src/game/behaviors/whomp.inc.c @@ -185,12 +185,7 @@ void king_whomp_on_ground(void) { void whomp_on_ground(void) { if (o->oSubAction == 0) { - u8 anyMarioOnPlatform = FALSE; - for (int i = 0; i < MAX_PLAYERS; i++) { - if (!is_player_active(&gMarioStates[i])) { continue; } - if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; } - } - if (anyMarioOnPlatform) { + if (cur_obj_is_any_player_on_platform()) { if (cur_obj_is_mario_ground_pounding_platform()) { o->oNumLootCoins = 5; obj_spawn_loot_yellow_coins(o, 5, 20.0f); diff --git a/src/game/obj_behaviors.h b/src/game/obj_behaviors.h index c43444dbe..8b5fbea7f 100644 --- a/src/game/obj_behaviors.h +++ b/src/game/obj_behaviors.h @@ -127,6 +127,7 @@ void celeb_star_act_face_camera(void); void bhv_celebration_star_loop(void); void bhv_celebration_star_sparkle_loop(void); void bhv_star_key_collection_puff_spawner_loop(void); +void bhv_lll_drawbridge_spawner_init(void); void bhv_lll_drawbridge_spawner_loop(void); void bhv_lll_drawbridge_loop(void); void bhv_small_bomp_init(void);