Files
banjo-kazooie/src/FP/code_A40.c

211 lines
6.1 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
Actor *FP_func_80386E30(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
void chXmasTree_update(Actor *this);
/* .data */
ActorInfo D_80391B50 = {
MARKER_BA_XMAS_TREE, ACTOR_15F_XMAS_TREE, ASSET_488_MODEL_XMAS_TREE,
0x1, NULL,
chXmasTree_update, func_80326224, FP_func_80386E30,
0, 0, 0.0f, 0
};
s32 chXmasTree_switch_spawn_position[3] = {-0x1220, 0x6A, 0x1945};
/* .code */
Actor *FP_func_80386E30(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
Actor *this = marker_getActor(marker);
func_8033A45C(5, this->unk38_31);
func_8033A45C(6, func_8031FF1C(0x13) && !func_8033A0F0(5));
return func_80325888(marker, gfx, mtx, vtx);
}
void func_80386EAC(Actor *this){
u8 tmp_a0;
item_set(ITEM_6_HOURGLASS, FALSE);
tmp_a0 = this->unk44_31;
if(tmp_a0){
func_8030DA44(tmp_a0);
this->unk44_31 = 0;
}
}
void FP_func_80386EF4(Actor *this, int arg1){
this->unk38_31 = arg1;
mapSpecificFlags_set(0, this->unk38_31);
}
void func_80386F3C(void){
levelSpecificFlags_set(0x29, TRUE);
func_803228D8();
func_803204E4(0xe, 1);
func_802E4078(MAP_53_FP_CHRISTMAS_TREE, 1, 0);
}
void func_80386F84(Actor * this){
func_80328A84(this, 2);
FP_func_80386EF4(this, 0);
}
void func_80386FB4(void){
func_8032811C(ACTOR_338_XMAS_TREE_SWITCH, chXmasTree_switch_spawn_position, 350);
}
void FP_func_80386FE0(void *marker){
Actor *this = marker_getActor(reinterpret_cast(ActorMarker *, marker));
Actor *child = spawn_child_actor(0x339, &this);
s32 pad;
child->position_x += 20.0f;
child->position_z += 25.0f;
}
void func_80387038(Actor *this){
if(func_8030E3FC(this->unk44_31))
func_8030E394(this->unk44_31);
func_8030DBB4(this->unk44_31, randf2(0.9f, 1.1f));
func_8030E2C4(this->unk44_31);
}
void func_8038709C(Actor *this){
if(this->state == 5){
if(!mapSpecificFlags_get(0))
func_80387038(this);
return;
}
if(mapSpecificFlags_get(0) && !func_8030E3FC(this->unk44_31))
func_80387038(this);
}
void chXmasTree_update(Actor *this){
f32 sp2C = time_getDelta();
u8 tmp_a0;
if(!this->unk16C_4){
this->unk16C_4 = TRUE;
this->marker->propPtr->unk8_3 = TRUE;
this->marker->collidable = FALSE;
func_803300D8(this->marker, func_80386EAC);
if(this->unk44_31 == 0){
this->unk44_31 = func_8030D90C();
sfxsource_setSfxId(this->unk44_31, SFX_415_UNKNOWN);
func_8030DD14(this->unk44_31, 3);
sfxsource_setSampleRate(this->unk44_31, 28000);
}
__spawnQueue_add_0(func_80386FB4);
__spawnQueue_add_1((GenMethod_1)FP_func_80386FE0, reinterpret_cast(s32, this->marker));
if(func_8031FF1C(0x13)){
func_80386F84(this);
mapSpecificFlags_set(2, FALSE);
}
}
this->depth_mode = 1;
if(jiggyscore_isCollected(JIGGY_2F_FP_XMAS_TREE) || levelSpecificFlags_get(0x29)){
FP_func_80386EF4(this, 1);
return;
}
switch(this->state){
case 1: // L80387268
FP_func_80386EF4(this, 0);
if(func_8031FF1C(0x13)){
func_80386F84(this);
}
break;
case 2: // L80387294
if(!mapSpecificFlags_get(2)) break;
func_80328A84(this, 3);
this->unk60 = 2.0f;
func_8025A6EC(COMUSIC_61_XMAS_TREE_LIGHTS_UP, 28000);
func_802BAFE4(0x1A);
func_80311480(0xC14, 0, NULL, NULL, NULL, NULL);
break;
case 3: // L803872F0
if(0.0 <= this->unk60){
if( 1.8 < this->unk60){
FP_func_80386EF4(this, 0);
}
else if(this->unk60 < 0.2){//L80387340
FP_func_80386EF4(this, 1);
}
else{
if(randf() < 0.2){
FP_func_80386EF4(this, this->unk38_31 ^ 1);
func_8038709C(this);
}
}//L803873AC
this->unk60 -= sp2C;
}
else{//L803873BC
if(func_802BB270()){
func_80328A84(this, 4);
FP_func_80386EF4(this, 1);
item_set(ITEM_0_HOURGLASS_TIMER, 3600 - 1);
item_set(ITEM_6_HOURGLASS, TRUE);
}
}
break;
case 4: // L80387400
if(mapSpecificFlags_get(3)){
func_80328A84(this, 6);
FP_func_80386EF4(this, 1);
item_set(ITEM_6_HOURGLASS, FALSE);
tmp_a0 = this->unk44_31;
if(tmp_a0){
func_8030DA44(tmp_a0);
this->unk44_31 = 0;
}
func_80324E38(0.0f, 3);
timedFunc_set_0(0.5f, func_80386F3C);
}
else{//L80387470
if(item_empty(ITEM_6_HOURGLASS)){
func_80328A84(this, 5);
mapSpecificFlags_set(2, FALSE);
this->unk60 = 0.1f;
if(!func_8038BFA0()){
if(!mapSpecificFlags_get(9) || mapSpecificFlags_get(1)){
func_8025A6EC(COMUSIC_3C_MINIGAME_LOSS, 28000);
func_802BAFE4(0x1a);
this->unk60 = 2.0f;
}
}
}
}
break;
case 5: // L803874EC
if(0.0 <= this->unk60){
if( 1.8 < this->unk60){
FP_func_80386EF4(this, 1);
}
else if(this->unk60 < 0.2){
FP_func_80386EF4(this, 0);
}
else{
if(randf() < 0.2){
FP_func_80386EF4(this, this->unk38_31 ^ 1);
func_8038709C(this);
}
}
this->unk60 -= sp2C;
}
else{
func_80386F84(this);
}
break;
}
}