sm64pc/src/game/behaviors/tumbling_bridge.inc.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);
}