Files
banjo-kazooie/src/TTC/ch/lockup.c
banjo.decomp 4c3d4df97b rename animctrl to anctrl to match source debug string and tooie naming
rename `rumbleManager` to `bamotor`
2024-10-30 19:51:58 -05:00

160 lines
5.4 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern void func_802EE6CC(f32[3], s32[4], s32[4], s32, f32, f32, s32, s32, s32);
typedef struct {
s32 closed_ticks_counter;
s32 open_ticks_counter;
} ActorLocal_Lockup;
static Actor *__chLockup_drawFunc(ActorMarker *this, Gfx **gfx, Mtx **mtx, Vtx **vtx);
static void __chLockup_updateFunc(Actor *this);
enum ch_lockup_states_e {
CH_LOCKUP_STATE_CLOSED = 1, // L803896F0
CH_LOCKUP_STATE_OPENING = 2, // L803897DC
CH_LOCKUP_STATE_OPEN = 3, // L80389864
CH_LOCKUP_STATE_CLOSING = 4, // L803898F4
CH_LOCKUP_STATE_CLOSING2 = 5 // L803898F4
};
/* .data */
ActorAnimationInfo gChLockupAnimations[6] ={
{NULL, NULL},
{ASSET_BC_ANIM_LOCKUP, 8000000.0f},
{ASSET_BC_ANIM_LOCKUP, 4.0f},
{ASSET_BC_ANIM_LOCKUP, 8000000.0f},
{ASSET_BC_ANIM_LOCKUP, 1.4f},
{ASSET_BC_ANIM_LOCKUP, 8000000.0f}
};
ActorInfo gChLockupSlow = {
MARKER_A4_LOCKUP_SLOW, ACTOR_151_LOCKUP_SLOW, ASSET_3D4_MODEL_LOCKUP,
1, gChLockupAnimations,
__chLockup_updateFunc, actor_update_func_80326224, __chLockup_drawFunc,
2500, 0x366, 0.0f, 0
};
ActorInfo gChLockupMedium = {
MARKER_F6_LOCKUP_MEDIUM, ACTOR_152_LOCKUP_MEDIUM, ASSET_3D4_MODEL_LOCKUP,
1, gChLockupAnimations,
__chLockup_updateFunc, actor_update_func_80326224, __chLockup_drawFunc,
2500, 0x366, 0.0f, 0
};
ActorInfo gChLockupFast = {
MARKER_F7_LOCKUP_FAST, ACTOR_153_LOCKUP_FAST, ASSET_3D4_MODEL_LOCKUP,
1, gChLockupAnimations,
__chLockup_updateFunc, actor_update_func_80326224, __chLockup_drawFunc,
2500, 0x366, 0.0f, 0
};
static s32 sLockup_CloseColor[4] = {120, 120, 120, 120};
static s32 sLockup_CloseVelocity[3] = {0,0,0};
/* .code */
static Actor *__chLockup_drawFunc(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
Actor * actor = marker_getActor(marker);
func_8033A45C(3, actor->unk38_31);
func_8033A45C(4, actor->unk38_31);
actor_draw(marker, gfx, mtx, vtx);
}
static void __chLockup_close(Actor *this){
subaddie_set_state_with_direction(this, CH_LOCKUP_STATE_CLOSED, 0.2f, 1);
this->marker->collidable = FALSE;
this->unk38_31 = 0;
FUNC_8030E8B4(SFX_6C_LOCKUP_CLOSING, 1.0f, 32000, this->position, 1250, 2500);
}
static void __chLockup_open(Actor *this){
code3040_func_80389468();
subaddie_set_state_with_direction(this, CH_LOCKUP_STATE_OPENING, 0.2f, 1);
this->unk38_31 = 1;
FUNC_8030E8B4(SFX_6B_LOCKUP_OPENING, 1.0f, 32000, this->position, 1250, 2500);
}
static void __chLockup_updateFunc(Actor *this){
ActorLocal_Lockup *local = (ActorLocal_Lockup *)&this->local;
s32 tmp_v1;
int i;
if( !this->has_met_before
&& this->unkF4_8 == 0xA
&& !jiggyscore_isCollected(JIGGY_13_TTC_LOCKUP)
&& func_80329530(this, 320)
&& !func_80329530(this, 160)
&& !func_8028ECAC()
&& gcdialog_showText(ASSET_A15_DIALOG_TTC_LOCKUP_SPAWNED, 0, NULL, NULL, NULL, NULL)
){
this->has_met_before = TRUE;
}
if(!this->volatile_initialized){
this->volatile_initialized = TRUE;
}
switch(this->state){
case CH_LOCKUP_STATE_CLOSED:
if(!this->initialized){
this->marker->propPtr->unk8_3 = TRUE;
subaddie_set_state_with_direction(this, CH_LOCKUP_STATE_CLOSED, 0.2f, 1);
this->marker->collidable = FALSE;
this->unk38_31 = 0;
this->initialized = TRUE;
}
local->closed_ticks_counter++;
tmp_v1 = (this->modelCacheIndex == ACTOR_151_LOCKUP_SLOW) ? 0x1E :
(this->modelCacheIndex == ACTOR_152_LOCKUP_MEDIUM) ? 0x14 :
(this->modelCacheIndex == ACTOR_153_LOCKUP_FAST) ? 0xA :
10000;
if(!(local->closed_ticks_counter < tmp_v1)){
local->closed_ticks_counter = 0;
__chLockup_open(this);
}
break;
case CH_LOCKUP_STATE_OPENING:
if(subaddie_playerIsWithinSphere(this, 400) && func_8028FB48(0x8000000)){
func_8028F428(0xA, this->marker);
}
if(actor_animationIsAt(this, 0.5f)){
subaddie_set_state_with_direction(this, CH_LOCKUP_STATE_OPEN, 0.5f, 1);
}
if(0.15 < anctrl_getAnimTimer(this->anctrl)){
this->marker->collidable = TRUE;
}
break;
case CH_LOCKUP_STATE_OPEN:
local->open_ticks_counter++;
tmp_v1 = (this->modelCacheIndex == ACTOR_151_LOCKUP_SLOW) ? 0x1E :
(this->modelCacheIndex == ACTOR_152_LOCKUP_MEDIUM) ? 0x14 :
(this->modelCacheIndex == ACTOR_153_LOCKUP_FAST) ? 0xA :
10000;
if(!(local->open_ticks_counter < tmp_v1)){
local->open_ticks_counter = 0;
subaddie_set_state_with_direction(this, CH_LOCKUP_STATE_CLOSING, 0.5f, 1);
}
break;
case CH_LOCKUP_STATE_CLOSING:
case CH_LOCKUP_STATE_CLOSING2:
if(this->marker->unk14_21 && actor_animationIsAt(this, 0.99f)){
__chLockup_close(this);
for(i = 5; i < 0xe; i++){
func_8034A174(this->marker->unk44, i, this->unk1C);
func_802EE6CC(this->unk1C, sLockup_CloseVelocity, sLockup_CloseColor, 1, 0.4f, 50.0f, 0xb4, 0xa0, 0);
}
}
break;
}
}