113 lines
3.7 KiB
C
113 lines
3.7 KiB
C
// tumbling_bridge.c.inc
|
|
|
|
#include "levels/wf/header.h"
|
|
#include "levels/bbh/header.h"
|
|
#include "levels/lll/header.h"
|
|
#include "levels/bitfs/header.h"
|
|
|
|
struct Struct8032F34C sTumblingBridgeParams[] = {
|
|
{ 9, -512, 0x80, MODEL_WF_TUMBLING_BRIDGE_PART, wf_seg7_collision_tumbling_bridge },
|
|
{ 9, -412, 103, MODEL_BBH_TUMBLING_PLATFORM_PART, bbh_seg7_collision_07026B1C },
|
|
{ 9, -512, 0x80, MODEL_LLL_FALLING_PLATFORM, lll_seg7_collision_0701D21C },
|
|
{ 9, -512, 0x80, MODEL_BITFS_TUMBLING_PLATFORM_PART, bitfs_seg7_collision_07015288 }
|
|
};
|
|
|
|
void bhv_tumbling_bridge_platform_loop(void) {
|
|
switch (o->oAction) {
|
|
case 0:
|
|
if (gMarioObject->platform == o) {
|
|
o->oAction++;
|
|
o->oTumblingBridgeUnkF4 = random_sign() * 0x80;
|
|
}
|
|
break;
|
|
case 1:
|
|
cur_obj_update_floor_height();
|
|
if (o->oTimer > 5) {
|
|
o->oAction++;
|
|
cur_obj_play_sound_2(SOUND_GENERAL_PLATFORM);
|
|
}
|
|
break;
|
|
case 2:
|
|
if (o->oAngleVelPitch < 0x400)
|
|
o->oAngleVelPitch += 0x80;
|
|
if (o->oAngleVelRoll > -0x400 && o->oAngleVelRoll < 0x400)
|
|
o->oAngleVelRoll += o->oTumblingBridgeUnkF4; // acceleration?
|
|
o->oGravity = -3.0f;
|
|
cur_obj_rotate_face_angle_using_vel();
|
|
cur_obj_move_using_fvel_and_gravity();
|
|
if (o->oPosY < o->oFloorHeight - 300.0f)
|
|
o->oAction++;
|
|
break;
|
|
case 3:
|
|
break;
|
|
}
|
|
if (o->parentObj->oAction == 3)
|
|
obj_mark_for_deletion(o);
|
|
}
|
|
|
|
void tumbling_bridge_act_1(void) {
|
|
struct Object *platformObj;
|
|
s32 i;
|
|
s32 bridgeID = o->oBehParams2ndByte;
|
|
s32 relativePlatformX;
|
|
s32 relativePlatformZ;
|
|
s32 relativePlatformY = 0;
|
|
s32 relativeInitialPlatformY = 0;
|
|
|
|
for (i = 0; i < sTumblingBridgeParams[bridgeID].numBridgeSections; i++) {
|
|
relativePlatformX = 0;
|
|
relativePlatformZ = 0;
|
|
|
|
if (bridgeID == 3)
|
|
relativePlatformX = sTumblingBridgeParams[bridgeID].bridgeRelativeStartingXorZ
|
|
+ sTumblingBridgeParams[bridgeID].platformWidth * i;
|
|
else
|
|
relativePlatformZ = sTumblingBridgeParams[bridgeID].bridgeRelativeStartingXorZ
|
|
+ sTumblingBridgeParams[bridgeID].platformWidth * i;
|
|
|
|
if (cur_obj_has_behavior(bhvLllTumblingBridge)) {
|
|
if (i % 3 == 0)
|
|
relativePlatformY -= 150;
|
|
relativeInitialPlatformY = 450;
|
|
}
|
|
|
|
platformObj = spawn_object_relative(
|
|
0, relativePlatformX, relativePlatformY + relativeInitialPlatformY, relativePlatformZ, o,
|
|
sTumblingBridgeParams[bridgeID].model, bhvTumblingBridgePlatform);
|
|
|
|
obj_set_collision_data(platformObj, sTumblingBridgeParams[bridgeID].segAddr);
|
|
}
|
|
|
|
o->oAction = 2;
|
|
}
|
|
|
|
void tumbling_bridge_act_2(void) {
|
|
cur_obj_hide();
|
|
if (cur_obj_has_behavior(bhvLllTumblingBridge))
|
|
cur_obj_unhide();
|
|
else if (o->oDistanceToMario > 1200.0f) {
|
|
o->oAction = 3;
|
|
cur_obj_unhide();
|
|
}
|
|
}
|
|
|
|
void tumbling_bridge_act_3(void) {
|
|
cur_obj_unhide();
|
|
o->oAction = 0;
|
|
}
|
|
|
|
void tumbling_bridge_act_0(void) {
|
|
if (cur_obj_has_behavior(bhvLllTumblingBridge) || o->oDistanceToMario < 1000.0f)
|
|
o->oAction = 1;
|
|
}
|
|
|
|
void (*sTumblingBridgeActions[])(void) = { tumbling_bridge_act_0, tumbling_bridge_act_1,
|
|
tumbling_bridge_act_2, tumbling_bridge_act_3 };
|
|
|
|
s16 D_8032F38C[] = { -51, 0, 0, -461, 0, 0, -512, 0, 0, -2611, 0,
|
|
0, -2360, 0, 0, 214, 0, 0, -50, 1945, 1, 0 };
|
|
|
|
void bhv_tumbling_bridge_loop(void) {
|
|
cur_obj_call_action_function(sTumblingBridgeActions);
|
|
}
|