185 lines
4.6 KiB
C
185 lines
4.6 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
extern void actor_postdrawMethod(ActorMarker *);
|
|
extern void chBottlesBonus_func_802DD080(Gfx **, Mtx **);
|
|
extern void func_80311714(s32);
|
|
|
|
Actor *func_802DEC00(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
|
|
void func_802DEE1C(Actor *this);
|
|
|
|
/* .data */
|
|
ActorAnimationInfo D_80368300[] ={
|
|
{0x000, 0.0f},
|
|
{0x2C7, 0.6f},
|
|
{0x2C6, 3.0f},
|
|
{0x2C8, 0.6f},
|
|
{0x2C8, 0.6f},
|
|
{0x2C6, 9e+09},
|
|
};
|
|
|
|
f32 D_80368330[3] = {0.0f, 0.0f, 0.0f};
|
|
|
|
ActorInfo D_8036833C = {
|
|
0x294, 0x19B, ASSET_56D_MUMBOS_HAND_WITH_PICTURE,
|
|
0x1, D_80368300,
|
|
func_802DEE1C, func_80326224, func_802DEC00,
|
|
0, 0, 0.0f, 0
|
|
};
|
|
|
|
/* .bss */
|
|
ActorMarker *D_8037DFE0;
|
|
enum level_e D_8037DFE4;
|
|
BKModelBin *D_8037DFE8;
|
|
f32 D_8037DFF0[3];
|
|
|
|
/* .code */
|
|
Actor *func_802DEC00(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
|
|
Actor *this;
|
|
f32 sp58[3];
|
|
f32 sp4C[3];
|
|
void *sp48;
|
|
|
|
|
|
this = marker_getActor(marker);
|
|
sp48 = func_8030C704();
|
|
|
|
if ((sp48 == 0) || (getGameMode() != GAME_MODE_A_SNS_PICTURE))
|
|
return this;
|
|
|
|
chBottlesBonus_func_802DD080(gfx, mtx);
|
|
sp58[0] = 0.0f;
|
|
sp58[1] = 0.0f;
|
|
sp58[2] = 50.0f;
|
|
|
|
sp4C[0] = 0.0f;
|
|
sp4C[1] = 0.0f;
|
|
sp4C[2] = 0.0f;
|
|
|
|
D_8037DFF0[0] = 0.0f;
|
|
D_8037DFF0[1] = 270.0f;
|
|
D_8037DFF0[2] = 0.0f;
|
|
modelRender_setDepthMode(MODEL_RENDER_DEPTH_FULL);
|
|
modelRender_draw(gfx, mtx, sp58, NULL, 1.0f, sp4C, D_8037DFE8);
|
|
gDPSetColorDither((*gfx)++, G_CD_DISABLE);
|
|
func_80253190(gfx);
|
|
gSPSegment((*gfx)++, 0x04, osVirtualToPhysical(sp48));
|
|
modelRender_preDraw((GenFunction_1)actor_predrawMethod, (s32)this);
|
|
modelRender_postDraw((GenFunction_1)actor_postdrawMethod, (s32)marker);
|
|
modelRender_draw(gfx, mtx, this->position, NULL, 4.5f, sp4C, marker_loadModelBin(marker));
|
|
gDPSetTextureFilter((*gfx)++, G_TF_BILERP);
|
|
gDPSetColorDither((*gfx)++, G_CD_MAGICSQ);
|
|
chBottlesBonus_func_802DD158(gfx, mtx);
|
|
return this;
|
|
}
|
|
|
|
void func_802DEDDC(Actor *this){
|
|
D_8037DFE0 = NULL;
|
|
if(D_8037DFE8 != NULL){
|
|
assetcache_release(D_8037DFE8);
|
|
D_8037DFE8 = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
void func_802DEE1C(Actor *this) {
|
|
s32 sp4C;
|
|
s32 sp48;
|
|
s32 sp44;
|
|
f32 sp38;
|
|
|
|
if (!this->initialized) {
|
|
this->initialized = TRUE;
|
|
actor_collisionOff(this);
|
|
marker_setFreeMethod(this->marker, func_802DEDDC);
|
|
actor_playAnimationOnce(this);
|
|
if (D_8037DFE8 == NULL) {
|
|
D_8037DFE8 = assetcache_get(0x56E);
|
|
}
|
|
sp4C = map_getLevel(map_get());
|
|
sp44 = sp4C == D_8037DFE4;
|
|
if (sp44) {
|
|
subaddie_set_state_with_direction(this, 2, 0.0f, 1);
|
|
actor_loopAnimation(this);
|
|
}
|
|
switch(sp4C){
|
|
case LEVEL_2_TREASURE_TROVE_COVE:
|
|
sp48 = sp44 + 0xE39;
|
|
break;
|
|
|
|
case LEVEL_5_FREEZEEZY_PEAK:
|
|
sp48 = sp44 + 0xE3B;
|
|
break;
|
|
|
|
case LEVEL_7_GOBIS_VALLEY:
|
|
default:
|
|
sp48 = sp44 + 0xE3D;
|
|
break;
|
|
}
|
|
sp38 = (f32) ((f64) (sp44 + 1) * 0.75);
|
|
timedFunc_set_1(sp38, func_80311714, 0);
|
|
func_80324DBC(sp38, sp48, 0x80, NULL, NULL, NULL, NULL);
|
|
timedFunc_set_1(sp38, func_80311714, 1);
|
|
D_8037DFE4 = sp4C;
|
|
}
|
|
switch(this->state){
|
|
case 1:
|
|
if (animctrl_isStopped(this->animctrl)) {
|
|
subaddie_set_state_with_direction(this, 2, 0.0f, 1);
|
|
actor_loopAnimation(this);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
if(animctrl_isStopped(this->animctrl)) {
|
|
volatileFlag_set(VOLATILE_FLAG_C3, 1);
|
|
this->state = 4;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
if(gctransition_8030BDC0()) {
|
|
subaddie_set_state_with_direction(this, 5, 0.0f, 1);
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
break;
|
|
|
|
case 5:
|
|
break;
|
|
}
|
|
func_803228D8();
|
|
}
|
|
|
|
void func_802DF04C(void){
|
|
Actor *this;
|
|
if(D_8037DFE0 == NULL){
|
|
this = actor_spawnWithYaw_f32(0x19B, D_80368330, 0);
|
|
D_8037DFE0 = this->marker;
|
|
}
|
|
}
|
|
|
|
void func_802DF090(s32 arg0, s32 arg1){
|
|
if(D_8037DFE0 == NULL){
|
|
__spawnQueue_add_0(func_802DF04C);
|
|
}
|
|
}
|
|
|
|
void func_802DF0C8(void) {
|
|
Actor *sp1C;
|
|
|
|
sp1C = marker_getActor(D_8037DFE0);
|
|
if (sp1C->state != 3) {
|
|
subaddie_set_state_with_direction(sp1C, 3, 0.0f, 1);
|
|
actor_playAnimationOnce(sp1C);
|
|
}
|
|
}
|
|
|
|
void func_802DF11C(s32 arg0, s32 arg1){
|
|
if(D_8037DFE0 != NULL){
|
|
func_80326310(marker_getActor(D_8037DFE0));
|
|
}
|
|
}
|