149 lines
4.2 KiB
C
149 lines
4.2 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
typedef struct {
|
|
f32 unk0[3];
|
|
f32 unkC[3];
|
|
u8 unk18;
|
|
u8 unk19;
|
|
u8 unk1A;
|
|
u8 unk1B;
|
|
} ActorLocal_FP_87E0;
|
|
|
|
Actor *func_8038EBD0(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
|
|
void func_8038ECD8(Actor *this);
|
|
|
|
/* .data */
|
|
ActorInfo D_80392470 = { 0x207, 0x339, 0x426,
|
|
0x1, NULL,
|
|
func_8038ECD8, func_80326224, func_8038EBD0,
|
|
0, 0, 0.0f, 0
|
|
};
|
|
|
|
/* .bss */
|
|
f32 D_803935D0[3];
|
|
|
|
/* .code */
|
|
Actor *func_8038EBD0(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
|
|
func_8033A45C( 2, mapSpecificFlags_get(0));
|
|
func_8033A45C( 1, mapSpecificFlags_get(0) ^ 1);
|
|
return actor_draw(marker, gfx, mtx, vtx);
|
|
}
|
|
|
|
void func_8038EC34(ActorMarker *this_marker, ActorMarker *other_marker){
|
|
Actor *this = marker_getActor(this_marker);
|
|
ActorLocal_FP_87E0 *local = (ActorLocal_FP_87E0 *)&this->local;
|
|
local->unk1B = TRUE;
|
|
}
|
|
|
|
void func_8038EC5C(Actor *this){
|
|
if(0.0f == this->unk60){
|
|
this->unk38_31++;
|
|
this->unk60 = 0.33f;
|
|
if(this->unk38_31 < 4){
|
|
func_8025A6EC(COMUSIC_2B_DING_B, 28000);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void func_8038ECD8(Actor *this){
|
|
ActorLocal_FP_87E0 *local = (ActorLocal_FP_87E0 *)&this->local;
|
|
f32 sp68[3];
|
|
s32 sp64;
|
|
f32 sp58[3];
|
|
f32 sp4C[3];
|
|
f32 sp40[3];
|
|
s32 sp3C;
|
|
f32 sp30[3];
|
|
|
|
if(jiggyscore_isCollected(JIGGY_2F_FP_XMAS_TREE)){
|
|
this->marker->collidable = FALSE;
|
|
return;
|
|
}
|
|
|
|
if(!this->unk16C_4){
|
|
this->unk16C_4 = TRUE;
|
|
marker_setCollisionScripts(this->marker, NULL, func_8038EC34, NULL);
|
|
this->marker->propPtr->unk8_3 = TRUE;
|
|
player_getPosition(D_803935D0);
|
|
local->unk1B = 0;
|
|
this->unk38_31 = 0;
|
|
local->unk1A = 0;
|
|
}
|
|
|
|
local->unk19 = 0;
|
|
if(!local->unk1A && this->marker->unk14_21){
|
|
func_8034A174(this->marker->unk44, 5, sp58);
|
|
func_8034A174(this->marker->unk44, 6, sp4C);
|
|
local->unk0[0] = sp58[0] - sp4C[0];
|
|
local->unk0[1] = sp58[1] - sp4C[1];
|
|
local->unk0[2] = sp58[2] - sp4C[2];
|
|
player_getPosition(sp40);
|
|
sp40[0] -= sp4C[0];
|
|
sp40[1] -= sp4C[1];
|
|
sp40[2] -= sp4C[2];
|
|
local->unk18 = (0.0f <= sp40[0]*local->unk0[0] + sp40[1]*local->unk0[1] + sp40[2]*local->unk0[2]) ? 0 : 1;
|
|
local->unkC[0] = sp4C[0];
|
|
local->unkC[1] = sp4C[1];
|
|
local->unkC[2] = sp4C[2];
|
|
local->unk1A = TRUE;
|
|
}//L8038EE98
|
|
|
|
if(0.0f != this->unk60){
|
|
if(time_getDelta() < this->unk60){
|
|
this->unk60 -= time_getDelta();
|
|
}else{
|
|
this->unk60 = 0.0f;
|
|
}
|
|
}//L8038EEF0
|
|
switch(this->state){
|
|
case 1: //L8038EF10
|
|
this->marker->collidable = FALSE;
|
|
if(!mapSpecificFlags_get(2)) break;
|
|
if(mapSpecificFlags_get(3)) break;
|
|
|
|
func_80328A84(this, 2);
|
|
this->unk38_31 = 0;
|
|
break;
|
|
|
|
case 2://L8038EF5C
|
|
if(!local->unk1A) return;
|
|
if(item_empty(ITEM_6_HOURGLASS)){
|
|
func_80328A84(this, 1);
|
|
}
|
|
else{
|
|
this->marker->collidable = TRUE;
|
|
player_getPosition(sp68);
|
|
sp68[0] -= local->unkC[0];
|
|
sp68[1] -= local->unkC[1];
|
|
sp68[2] -= local->unkC[2];
|
|
sp64 = (0.0f <= sp68[0]*local->unk0[0] + sp68[1]*local->unk0[1] + sp68[2]*local->unk0[2]) ? 0 : 1;
|
|
if(sp64 == (local->unk18 ^ 1)){
|
|
local->unk19 = TRUE;
|
|
if(local->unk1B){
|
|
func_8038EC5C(this);
|
|
}
|
|
else{
|
|
player_getPosition(sp68);
|
|
sp3C = func_80320B98(D_803935D0, sp68, sp30, 0);
|
|
if(sp3C){
|
|
if(*(s32 *)(sp3C + 8) << 9 < 0)
|
|
func_8038EC5C(this);
|
|
}
|
|
}
|
|
}//L8038F090
|
|
|
|
if(!(this->unk38_31 < 3)){
|
|
func_80328A84(this, 1);
|
|
mapSpecificFlags_set(3, 1);
|
|
}
|
|
}
|
|
break;
|
|
}//L8038F0BC
|
|
local->unk18 = sp64;
|
|
local->unk1B = 0;
|
|
player_getPosition(D_803935D0);
|
|
}
|