Files
banjo-kazooie/src/CCW/code_2B00.c
2022-07-15 17:09:41 -05:00

171 lines
5.2 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
typedef struct{
u8 unk0;
u8 unk1;
u8 unk2;
u8 unk3;
}Struct_CCW_2B00_0;
void func_80389268(Actor *this);
void func_80388FD4(Actor *this);
/* .data */
Struct_CCW_2B00_0 D_8038ED10[] = {
{0, 0x40, 0, 5},
{0, 0x43, 1, 5},
{0, 0x44, 2, 5},
{0, 0x45, 3, 15}
};
ActorAnimationInfo D_8038ED20[] = {
{0, 0.0f},
{0, 0.0f},
{0, 0.0f},
{0, 0.0f},
{ASSET_D4_ANIM_SWITCH_DOWN, 0.5f},
{ASSET_D4_ANIM_SWITCH_DOWN, 100000000.0f}
};
ActorInfo D_8038ED50 = { 0x133, 0x1E3, 0x52E, 0x1, NULL, func_80389268, func_80326224, func_80325E78, 0, 0x4000, 0.0f, 0};
ActorInfo D_8038ED74 = { 0x132, 0x1E2, 0x4F5, 0x5, D_8038ED20, func_80388FD4, func_80326224, func_80325888, 0, 0, 0.0f, 0};
ActorInfo D_8038ED98 = { 0x131, 0x16D, 0x52E, 0x1, NULL, func_80389268, func_80326224, func_80325E78, 0, 0x4000, 0.0f, 0};
ActorInfo D_8038EDBC = { 0x130, 0x16C, 0x4F6, 0x5, D_8038ED20, func_80388FD4, func_80326224, func_80325888, 0, 0, 0.0f, 0};
ActorInfo D_8038EDE0 = { 0x12F, 0x16B, 0x52E, 0x1, NULL, func_80389268, func_80326224, func_80325E78, 0, 0x4000, 0.0f, 0};
ActorInfo D_8038EE04 = { 0x12E, 0x16A, 0x4F7, 0x5, D_8038ED20, func_80388FD4, func_80326224, func_80325888, 0, 0, 0.0f, 0};
ActorInfo D_8038EE28 = { 0x12D, 0x169, 0x52E, 0x1, NULL, func_80389268, func_80326224, func_80325E78, 0, 0x4000, 0.0f, 0};
ActorInfo D_8038EE4C = { 0x12C, 0x168, 0x4F8, 0x5, D_8038ED20, func_80388FD4, func_80326224, func_80325888, 0, 0, 0.0f, 0};
/* .code */
s32 func_80388EF0(Actor *this){
switch(this->marker->unk14_20){
case 0x133: //L80388F28
case 0x132: //L80388F28
return 0;
case 0x131: //L80388F30
case 0x130: //L80388F30
return 1;
case 0x12F: //L80388F38
case 0x12E: //L80388F38
return 2;
case 0x12D: //L80388F40
case 0x12C: //L80388F40
return 3;
default:
return 0;
}
}
void func_80388F50(ActorMarker *marker, ActorMarker *other_marker){
Actor *this;
this = marker_getActor(marker);
if ((func_8028ECAC() != 1) && !this->unk38_0) {
this->unk38_0 = TRUE;
actor_collisionOff(this);
func_80328B8C(this, 4, 0.0f, 1);
actor_playAnimationOnce(this);
func_8030E6D4(SFX_90_SWITCH_PRESS);
}
}
void func_80388FD4(Actor *this) {
if (!this->initialized) {
this->unk138_31 = this->unk124_0 = TRUE;
this->marker->propPtr->unk8_3 = TRUE;
this->unk10_12 = func_80388EF0(this);
this->initialized = TRUE;
}
if (!this->unk16C_4) {
if (func_8031FF1C(this->unk10_12 + 0x8B)) {
actor_playAnimationOnce(this);
func_80328B8C(this, 4, 0.999f, 1);
actor_collisionOff(this);
} else {
marker_setCollisionScripts(this->marker, 0, &func_80388F50, 0);
}
this->unk38_0 = FALSE;
this->unk16C_4 = TRUE;
}
if( (this->state == 4)
&& this->unk38_0
&& actor_animationIsAt(this, 0.999f)
){
func_802D6264(1.1f, 0x40, this->unk10_12 + 0x3C, 0x2B, D_8038ED10[this->unk10_12].unk3, this->unk10_12 + 0x8B);
func_80324E38(0.5f, 3);
timedFunc_set_2(1.1f, levelSpecificFlags_set, this->unk10_12 + 7, TRUE);
func_80324E38(5.6f, 0);
}
}
void func_803891B0(void* marker) {
Actor* actor = marker_getActor(reinterpret_cast(ActorMarker*, marker));
actor->unk44_31 = func_8030ED2C(SFX_3EC_CCW_DOOR_OPENING, 3);
func_8030DD90(actor->unk44_31, 0);
sfxsource_setSampleRate(actor->unk44_31, 0x2AF8);
func_8030DBB4(actor->unk44_31, 0.3f);
func_8030E2C4(actor->unk44_31);
}
void func_8038921C(void* marker) {
Actor* actor = marker_getActor(reinterpret_cast(ActorMarker*, marker));
func_8030E394(actor->unk44_31);
func_8030DA44(actor->unk44_31);
actor->unk44_31 = 0U;
FUNC_8030E624(SFX_6C_LOCKUP_CLOSING, 1.0f, 25000);
}
void func_80389268(Actor *this) {
ActorProp *temp_v1;
u32 temp_v0;
u32 temp_v1_2;
if(!this->initialized) {
this->unk58_2 = FALSE;
this->unk10_12 = func_80388EF0(this);
this->marker->propPtr->unk8_3 = TRUE;
actor_collisionOff(this);
this->initialized = TRUE;
}
if (!this->unk16C_4) {
this->unk1C[0] = this->position[0];
this->unk1C[1] = this->position[1];
this->unk1C[2] = this->position[2];
this->unk1C[1] += 250.0f;
this->unk16C_4 = TRUE;
if (func_8031FF1C(this->unk10_12 + 0x8B)) {
func_80328A84(this, 3);
}
}
switch (this->state) { /* irregular */
case 1:
if (levelSpecificFlags_get(this->unk10_12 + 7)) {
timedFunc_set_1(0.05f, func_803891B0, (s32) this->marker);
timedFunc_set_1(4.0f, func_8038921C, (s32) this->marker);
func_80328A84(this, 2);
}
break;
case 2:
this->position[1] += 60.0f * time_getDelta();
if (this->unk1C[1] <= this->position[1]) {
levelSpecificFlags_set(this->unk10_12 + 7, FALSE);
func_80328A84(this, 3);
}
break;
case 3:
this->position[1] = this->unk1C[1];
break;
}
}