Files
banjo-kazooie/src/core2/ch/gravestone.c
Banjo Kazooie 9cb645df24 chsnacker documentation
snackerctl documentation
gczoombox partial documentation
several warning resolutions
2024-09-01 15:12:21 -05:00

329 lines
11 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "core2/particle.h"
Actor *func_8035ECA0(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
void func_8035F138(Actor *this);
BKModelBin *func_803257B4(ActorMarker *marker);
extern void actor_postdrawMethod(ActorMarker *);
extern f32 func_80257204(f32, f32, f32, f32);
typedef struct {
s32 unk0;
}ActorLocal_core2_D7D10;
/* .data */
ActorAnimationInfo D_80372F80[] = {
{0, 0.0f},
{ASSET_9A_ANIM_GRAVESTONE_IDLE, 8000000.0f},
{ASSET_9A_ANIM_GRAVESTONE_IDLE, 1.3f},
{ASSET_9B_ANIM_GRAVESTONE_WALK, 0.6f},
{ASSET_9B_ANIM_GRAVESTONE_WALK, 0.75f},
{ASSET_9A_ANIM_GRAVESTONE_IDLE, 1.5f},
{ASSET_1ED_ANIM_GRAVESTONE_OW, 1.0f},
{ASSET_1EE_ANIM_GRAVESTONE_DIE, 2.4f}
};
ActorInfo D_80372FC0 = {
MARKER_96_GRAVESTONE, ACTOR_C7_GRAVESTONE, ASSET_3C9_MODEL_GRAVESTONE,
0x1, D_80372F80,
func_8035F138, func_80326224, func_8035ECA0,
3500, 0, 1.2f, 0
};
ActorInfo D_80372FE4 = {
MARKER_297_GIANT_GRAVESTONE, ACTOR_3C2_GIANT_GRAVESTONE, ASSET_3C9_MODEL_GRAVESTONE,
0x1, D_80372F80,
func_8035F138, func_80326224, func_8035ECA0,
14000, 0, 3.2f, 0
};
/* .code */
Actor *func_8035ECA0(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx) {
static f32 D_80373008[3] = {0.0f, 0.0f, 0.0f};
f32 rotation[3];
Actor *this;
ActorLocal_core2_D7D10 *local;
this = marker_getActorAndRotation(marker, rotation);
local = (ActorLocal_core2_D7D10 *)&this->local;
func_8033A45C(3, (s32) this->velocity[1]);
func_8033A45C(4, local->unk0);
modelRender_preDraw( (GenFunction_1)actor_predrawMethod, (s32)this);
modelRender_postDraw((GenFunction_1)actor_postdrawMethod, (s32)marker);
modelRender_draw(gfx, mtx, this->position, rotation, this->scale, D_80373008, func_803257B4(marker));
return this;
}
bool func_8035ED60(Actor *this) {
f32 temp_f0;
f32 temp_f2;
temp_f0 = this->position[0] - this->unk1C[0];
temp_f2 = this->position[2] - this->unk1C[2];
if (((temp_f0 * temp_f0) + (temp_f2 * temp_f2)) < 110.0f) {
return TRUE;
}
return FALSE;
}
void func_8035EDB0(f32 position[3], s32 count, enum asset_e sprite) {
static s32 D_80373014[3] = {0xAA, 0xAA, 0xAA};
static struct31s D_80373020 = {{0.4f, 0.8f}, {1.4f, 2.0f}, {0.0f, 0.01f}, {1.2f, 1.8f}, 0.0f, 0.01};
static struct43s D_80373048 = {
{{-200.0f, -200.0f, -200.0f}, { 200.0f, 200.0f, 200.0f}},
{{ 0.0f, -10.0f, 0.0f}, { 0.0f, -10.0f, 0.0f}},
{{ -50.0f, 0.0f, -50.0f}, { 50.0f, 200.0f, 50.0f}}
};
ParticleEmitter *p_ctrl;
p_ctrl = partEmitMgr_newEmitter(count);
particleEmitter_setRGB(p_ctrl, D_80373014);
particleEmitter_setSprite(p_ctrl, sprite);
particleEmitter_setPosition(p_ctrl, position);
particleEmitter_setPositionVelocityAndAccelerationRanges(p_ctrl, &D_80373048);
func_802EFB98(p_ctrl, &D_80373020);
particleEmitter_setDrawMode(p_ctrl, PART_EMIT_NO_DEPTH);
particleEmitter_emitN(p_ctrl, count);
}
void func_8035EE48(Actor *this){
u8 val = this->unk44_31;
if(val != 0){
func_8030DA44(val);
this->unk44_31 = 0;
}
}
void func_8035EE80(Actor *this){
subaddie_set_state(this, 3);
actor_loopAnimation(this);
this->unk28 = 10.5f;
func_8035EE48(this);
}
void func_8035EEC0(Actor *this){
subaddie_set_state(this, 4);
actor_loopAnimation(this);
this->unk28 = 9.0f;
func_8035EE48(this);
}
void func_8035EF00(Actor *this, f32 arg1){
this->yaw_ideal = (f32)func_80329784(this);
func_80328FB0(this, arg1);
}
void func_8035EF3C(Actor *this) {
if( actor_animationIsAt(this, 0.2f)
|| actor_animationIsAt(this, 0.7f)
) {
FUNC_8030E8B4(SFX_123_BANJO_LANDING_10, 0.5f, 24000, this->position, 1750, 3500);
}
}
void func_8035EF9C(ActorMarker *marker, ActorMarker *other_marker) {
Actor *this;
ActorLocal_core2_D7D10 *local;
this = marker_getActor(marker);
local = (ActorLocal_core2_D7D10 *)&this->local;
this->velocity[2] = 0.0f;
subaddie_set_state_with_direction(this, 7, 0.02f, 1);
actor_playAnimationOnce(this);
local->unk0 = 2;
actor_collisionOff(this);
FUNC_8030E8B4(SFX_115_BUZZBOMB_DEATH, 0.6f, 32000, this->position, 1750, 3500);
FUNC_8030E8B4(SFX_1D_HITTING_AN_ENEMY_1, 0.9f, 22000, this->position, 1750, 3500);
func_8035EE48(this);
}
void func_8035F048(ActorMarker *marker, ActorMarker *other_marker) {
Actor *this;
ActorLocal_core2_D7D10 *local;
this = marker_getActor(marker);
local = (ActorLocal_core2_D7D10 *)&this->local;
FUNC_8030E8B4(SFX_F9_GRUNTLING_NOISE_1, 1.2f, 22000, this->position, 1750, 3500);
FUNC_8030E8B4(SFX_1D_HITTING_AN_ENEMY_1, 0.9f, 22000, this->position, 1750, 3500);
this->velocity[2] = 0.0f;
subaddie_set_state_with_direction(this, 6, 0.02f, 1);
actor_playAnimationOnce(this);
local->unk0 = 2;
func_8035EE48(this);
}
void func_8035F0E8(ActorMarker *marker, ActorMarker *other_marker) {
Actor *this;
ActorLocal_core2_D7D10 *local;
this = marker_getActor(marker);
local = (ActorLocal_core2_D7D10 *)&this->local;
FUNC_8030E8B4(SFX_1D_HITTING_AN_ENEMY_1, 0.9f, 22000, this->position, 1750, 3500);
this->velocity[2] = 0.8f;
func_8035EE80(this);
}
void func_8035F138(Actor *this) {
f32 sp2C;
ActorLocal_core2_D7D10 *local;
local = (ActorLocal_core2_D7D10 *)&this->local;
sp2C = time_getDelta();
if ((this->state == 1) && (animctrl_getAnimTimer(this->animctrl) < 0.04)) {
this->velocity[1] = 2.0f;
} else {
this->velocity[1] = 1.0f;
}
if (this->velocity[2] <= 0.0) {
this->velocity[2] = 0.0f;
}
else{
this->velocity[2] -= sp2C;
return;
}
switch(this->state){
case 1: //L8035F20C
if (!this->unk16C_4) {
this->unk16C_4 = TRUE;
marker_setCollisionScripts(this->marker, func_8035F0E8, func_8035F048, func_8035EF9C);
local->unk0 = 1;
this->unk1C[0] = this->position[0];
this->unk28 = 0.0f;
this->velocity[1] = 0.0f;
this->unk1C[2] = this->position[2];
this->velocity[0] = this->yaw;
}
animctrl_setAnimTimer(this->animctrl, 0.0f);
if (func_80329530(this, (s32) (this->scale * 650.0f)) && func_803292E0(this)) {
subaddie_set_state(this, 2U);
actor_playAnimationOnce(this);
this->unk1C[1] = 1.0f;
this->unk44_31 = func_8030ED2C(SFX_2C_PULLING_NOISE, 3);
func_8030E2C4(this->unk44_31);
}
break;
case 2: //L8035F2F4
if (this->unk1C[1] < 1.9) {
this->unk1C[1] += 0.1;
}
func_8030DBB4(this->unk44_31, this->unk1C[1]);
if (actor_animationIsAt(this, 0.66f)) {
FUNC_8030E8B4(SFX_F9_GRUNTLING_NOISE_1, 0.8f, 32000, this->position, 1750, 3500);
}
if (0.99 <= animctrl_getAnimTimer(this->animctrl)) {
func_8035EE80(this);
break;
}
func_8035EF00(this, 7.0f);
break;
case 3: //L8035F3AC
func_8035EF3C(this);
if (!func_80329530(this, (s32) (this->scale * 1050.0f)) || !func_803292E0(this)) {
func_8035EEC0(this);
break;
}
func_8035EF00(this, 6.0f);
if ((func_80329030(this, 2) == 0) && (func_80329480(this) != 0)) {
func_8035EEC0(this);
this->unk38_31 = 3;
break;
}
if (((this->unk28 + 0.28) <= 18.0) && ( 0.36 <= animctrl_getDuration(this->animctrl) - 0.0056000000000000008)) {
this->unk28 += 0.28;
animctrl_setDuration(this->animctrl, animctrl_getDuration(this->animctrl) - 0.0056000000000000008);
}
break;
case 4: //L8035F4FC
func_8035EF3C(this);
if (((f64)this->unk38_31 <= 0.0) && func_80329530(this, (s32) (this->scale * 1050.0f)) && func_803292E0(this)) {
func_8035EE80(this);
break;
}
this->unk38_31 -= sp2C;
if (func_8035ED60(this)) {
subaddie_set_state_with_direction(this, 5, 0.99f, 0);
actor_playAnimationOnce(this);
this->unk28 = 0.0f;
this->unk1C[1] = 1.9f;
this->unk44_31 = func_8030ED2C(SFX_2C_PULLING_NOISE, 3);
break;
}
this->yaw_ideal = (f32)(s32)func_80257204(this->position[0], this->position[2], this->unk1C[0], this->unk1C[2]);
func_80328FB0(this, 7.0f);
func_80329030(this, 2);
break;
case 5: //L8035F6F4
if (actor_animationIsAt(this, 0.36f) != 0) {
func_8030E2C4(this->unk44_31);
}
if ((this->unk44_31 != 0) && func_8030E3FC(this->unk44_31)) {
if (this->unk1C[1] > 1.0) {
this->unk1C[1] -= 0.1;
}
func_8030DBB4(this->unk44_31, this->unk1C[1]);
}
if (animctrl_getAnimTimer(this->animctrl) <= 0.02) {
subaddie_set_state_with_direction(this, 1, 0.02f, 1);
actor_playAnimationOnce(this);
this->unk28 = 0.0f;
func_8035EE48(this);
break;
}
this->yaw_ideal = this->velocity[0];
func_80328FB0(this, 7.5f);
func_80329030(this, 2);
break;
case 6: //L8035F7F0
if (actor_animationIsAt(this, 0.64f)) {
local->unk0 = 1;
}
if (0.99 <= animctrl_getAnimTimer(this->animctrl)) {
func_8035EEC0(this);
}
break;
case 7: //L8035F840
if (actor_animationIsAt(this, 0.3f)) {
FUNC_8030E8B4(SFX_1E_HITTING_AN_ENEMY_2, 0.6f, 32000, this->position, 1750, 3500);
FUNC_8030E8B4(SFX_1D_HITTING_AN_ENEMY_1, 0.9f, 26000, this->position, 1750, 3500);
}
if( actor_animationIsAt(this, 0.5f)
|| actor_animationIsAt(this, 0.7f)
) {
FUNC_8030E8B4(SFX_1F_HITTING_AN_ENEMY_3, 0.8f, 16000, this->position, 1750, 3500);
}
if (actor_animationIsAt(this, 0.8f)) {
FUNC_8030E8B4(SFX_1F_HITTING_AN_ENEMY_3, 0.8f, 14000, this->position, 1750, 3500);
}
if (actor_animationIsAt(this, 0.9f)) {
FUNC_8030E8B4(SFX_1F_HITTING_AN_ENEMY_3, 0.8f, 12000, this->position, 1750, 3500);
}
if (actor_animationIsAt(this, 0.25f)) {
func_8035EDB0(this->position, 12, ASSET_700_SPRITE_DUST);
}
if (actor_animationIsAt(this, 0.5f) != 0) {
func_80326310(this);
}
break;
}
}