sm64pc/src/game/behaviors/ttc_pit_block.inc.c

72 lines
2.0 KiB
C

/**
* Behavior for bhvTTCPitBlock. This is the block that moves up and down near the
* Pit and the Pendulum star.
*/
/**
* Collision models. The second one is unused.
*/
static void *sTTCPitBlockCollisionModels[] = {
ttc_seg7_collision_07015754,
ttc_seg7_collision_070157D8,
};
/**
* The speed of movement, and the time to wait before moving.
* If the wait time is negative (before moving down on random setting), wait
* a random amount of time instead.
*/
struct TTCPitBlockProperties {
s16 speed;
s16 waitTime;
};
/**
* Properties for the pit block on each speed setting when moving up and down,
* respectively.
*/
static struct TTCPitBlockProperties sTTCPitBlockProperties[][2] = {
/* TTC_SPEED_SLOW */ { { 11, 20 }, { -9, 30 } },
/* TTC_SPEED_FAST */ { { 18, 15 }, { -11, 15 } },
/* TTC_SPEED_RANDOM */ { { 11, 20 }, { -9, -1 } },
/* TTC_SPEED_STOPPED */ { { 0, 0 }, { 0, 0 } },
};
/**
* Init function for bhvTTCPitBlock.
*/
void bhv_ttc_pit_block_init(void) {
o->collisionData = segmented_to_virtual(sTTCPitBlockCollisionModels[o->oBehParams2ndByte]);
o->oTTCPitBlockPeakY = o->oPosY + 330.0f;
if (gTTCSpeedSetting == TTC_SPEED_STOPPED) {
o->oPosY += 330.0f;
}
}
/**
* Update function for bhvTTCPitBlock.
* Move up and down, pausing before changing direction.
*/
void bhv_ttc_pit_block_update(void) {
if (o->oTimer > o->oTTCPitBlockWaitTime) {
// Forward vel and gravity are zero, so this just does posY += velY
cur_obj_move_using_fvel_and_gravity();
if (clamp_f32(&o->oPosY, o->oHomeY, o->oTTCPitBlockPeakY)) {
o->oTTCPitBlockDir = o->oTTCPitBlockDir ^ 0x1;
if ((o->oTTCPitBlockWaitTime =
sTTCPitBlockProperties[gTTCSpeedSetting][o->oTTCPitBlockDir & 0x1].waitTime)
< 0) {
o->oTTCPitBlockWaitTime = random_mod_offset(10, 20, 6);
}
o->oVelY = sTTCPitBlockProperties[gTTCSpeedSetting][o->oTTCPitBlockDir].speed;
o->oTimer = 0;
}
}
}