Files
banjo-kazooie/src/core2/code_45310.c
2022-11-28 16:45:46 -06:00

527 lines
17 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern f32 func_8025715C(f32, f32);
extern f32 func_802575BC(f32);
extern f32 func_80309B24(f32[3]);
extern void func_8030DBB4(u8, f32);
extern void func_802CC340(Actor *, f32[3]);
extern void func_80335A8C(void *, s32);
extern bool func_80320DB0(f32[3], f32, f32[3], u32);
typedef struct {
u8 unk0;
f32 unk4;
f32 unk8[3];
f32 unk14;
f32 unk18[3];
f32 unk24;
f32 unk28;
f32 unk2C;
s16 unk30[3];
s16 unk36;
u8 unk38;
u8 unk39;
u8 unk3A;
}ActorLocal_Core2_45310;
Actor *func_802CCA7C(ActorMarker *, Gfx **, Mtx **, Vtx **);
void func_802CCC5C(Actor *this);
/* .data */
ActorInfo D_80367130 = {
MARKER_C2_BUZZBOMB, ACTOR_134_BUZZBOMB, ASSET_3ED_MODEL_BUZZBOMB,
0, NULL,
func_802CCC5C, NULL, func_802CCA7C,
0, 0, 1.0f, 0
};
/* .code */
bool func_802CC2A0(Actor *this) {
ActorLocal_Core2_45310 * local;
s32 pad30;
f32 sp2C[3];
f32 sp20[3];
local = (ActorLocal_Core2_45310 *)&this->local;
if (!this->marker->unk14_21) {
return TRUE;
}
func_80255FE4(sp20, local->unk8, local->unk18, func_802575BC(local->unk4 + 0.05));
sp20[1] += 60.0f;
return func_80320DB0(sp20, 50.0f, sp2C, 0) == 0;
}
void func_802CC340(Actor *this, f32 arg1[3]) {
ActorLocal_Core2_45310 * local;
f32 phi_f2;
f32 sp1C[3];
local = (ActorLocal_Core2_45310 *)&this->local;
local->unk3A = 2;
local->unk4 = 0.0f;
local->unk8[0] = this->position[0];\
local->unk8[1] = this->position[1];\
local->unk8[2] = this->position[2];
local->unk18[0] = arg1[0];
local->unk18[1] = arg1[1];
local->unk18[2] = arg1[2];
local->unk14 = this->yaw;
local->unk14 =(local->unk14 >= 360.0f) ? local->unk14 - 360.0f : local->unk14;
local->unk14 =(local->unk14 <= -360.0f) ? local->unk14 + 360.0f : local->unk14;
local->unk24 = local->unk14;
sp1C[0] = local->unk18[0] - local->unk8[0];
sp1C[1] = local->unk18[1] - local->unk8[1];
sp1C[2] = local->unk18[2] - local->unk8[2];
phi_f2 = func_8025715C(sp1C[0], sp1C[2]);
if ((phi_f2 - local->unk14) > 180.0f) {
phi_f2 = phi_f2 - 360.0f;
}
if ((phi_f2 - local->unk14) < -180.0f) {
phi_f2 = phi_f2 + 360.0f;
}
local->unk24 = phi_f2;
}
void func_802CC4A4(Actor *this, f32 arg1[3]) {
ActorLocal_Core2_45310 * local;
f32 sp28;
f32 sp1C[3];
f32 phi_f2;
f32 phi_f12;
local = (ActorLocal_Core2_45310 *)&this->local;
local->unk18[0] = arg1[0];
local->unk18[1] = arg1[1];
local->unk18[2] = arg1[2];
sp1C[0] = local->unk18[0] - local->unk8[0];
sp1C[1] = local->unk18[1] - local->unk8[1];
sp1C[2] = local->unk18[2] - local->unk8[2];
phi_f2 = func_8025715C(sp1C[0], sp1C[2]);
phi_f12 = phi_f2 - local->unk14;
if(phi_f12 > 180.0f){
phi_f2 = phi_f2 - 360.0f;
}
else if(phi_f12 < -180.0f){
phi_f2 = phi_f2 + 360.0f;
}
local->unk24 = phi_f2;
}
bool func_802CC57C(Actor *this, f32 arg1[3]) {
ActorLocal_Core2_45310 * local;
f32 sp40[3];
f32 sp34[3];
f32 sp28[3];
s32 sp24;
local = (ActorLocal_Core2_45310 *)&this->local;
sp40[0] = arg1[0];
sp40[1] = arg1[1];
sp40[2] = arg1[2];
sp28[0] = this->position[0];
sp28[1] = this->position[1] + 30.0f;
sp28[2] = this->position[2];
if (local->unk39 > 0) {
local->unk39--;
return 0;
}
sp24 = func_80309B48(sp28, sp40, sp34, 0);
if (sp24 != 0) {
local->unk39 = randi2(5, 0xA);
} else {
local->unk39 = 0;
}
return sp24 == 0;
}
void func_802CC640(Actor *this, s32 next_state) {
ActorLocal_Core2_45310 * local;
s32 phi_s0;
f32 sp54[3];
f32 sp48[3];
local = (ActorLocal_Core2_45310 *)&this->local;
if (this->state == 0) {
func_80335924(this->unk148, 0xF9, 0.0f, 0.45f);
func_80335A8C(this->unk148, 1);
}
this->state = next_state;
local->unk36 = 0;
local->unk28 = 0.0f;
if (this->state == 1) {
local->unk28 = randf2(0.0f, 2.0f);
}
if (this->state == 2) {
func_80335924(this->unk148, 0xF9, 0.3f, 0.45f);
func_80335A8C(this->unk148, 1);
for(phi_s0 = 0; phi_s0 < 10; phi_s0++){
sp54[0] = this->position[0];
sp54[1] = (f32) local->unk30[1];
sp54[2] = this->position[2];
sp54[0] += randf2(-300.0f, 300.0f);
sp54[1] += randf2(100.0f, 300.0f);
sp54[2] += randf2(-300.0f, 300.0f);
if(func_80329210(this, sp54)){
break;
}
}
if (phi_s0 == 0xA) {
sp54[0] = (f32) local->unk30[0];
sp54[1] = (f32) local->unk30[1];
sp54[2] = (f32) local->unk30[2];
sp54[1] += 200.0f;
}
func_802CC340(this, sp54);
}
if (this->state == 3) {
player_getPosition(sp48);
sp48[1] += 90.0f;
func_802CC340(this, sp48);
}
if (this->state == 5) {
func_8028F55C(1, this->marker);
FUNC_8030E624(SFX_1F_HITTING_AN_ENEMY_3, 1.2f, 32200);
func_80335924(this->unk148, 0xF9, 0.4f, 1.0f);
func_80335A8C(this->unk148, 1);
timed_playSfx(0.8f, 0x3FC, randf2(0.97f, 1.05f), 32000);
local->unk3A = 0;
local->unk28 = 2.0f;
}
if (this->state == 4) {
local->unk28 = 3.5f;
}
if (this->state == 6) {
this->unk138_27 = 1;
this->marker->collidable = FALSE;
this->unk10_1 = FALSE;
FUNC_8030E624(SFX_1F_HITTING_AN_ENEMY_3, 1.2f, 32200);
func_80335924(this->unk148, 0x110, 0.3f, 0.45f);
func_80335A8C(this->unk148, 1);
local->unk36 = 0x3E8;
local->unk3A = 0;
}
if (this->state == 7) {
local->unk2C = 0.0f;
}
if (this->state == 8) {
marker_despawn(this->marker);
}
}
void func_802CC9FC(ActorMarker *marker, ActorMarker *other){
Actor *this;
this = marker_getActor(marker);
if (this->state < 5) {
func_802CC640(this, 5);
}
}
void func_802CCA3C(ActorMarker *marker, ActorMarker *other){
Actor *this;
this = marker_getActor(marker);
if (this->state < 6U) {
func_802CC640(this, 6);
}
}
Actor *func_802CCA7C(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx) {
Actor *this;
ActorLocal_Core2_45310 * local;
this = marker_getActor(marker);
local = (ActorLocal_Core2_45310 *)&this->local;
if (this->state == 0) {
return this;
}
this->unk124_11 = 1;
if (this->state == 7) {
this->alpha_124_19 = (1.0f - local->unk2C) * 255.0f;
} else {
this->alpha_124_19 = 0xff;
}
return func_80325888(marker, gfx, mtx, vtx);
}
void func_802CCBC8(Actor *this) {
ActorLocal_Core2_45310 * local;
local = (ActorLocal_Core2_45310 * )&this->local;
if(local->unk0 != 0){
func_8030DA44(local->unk0);
}
}
void func_802CCBF4(Actor *this) {
ActorLocal_Core2_45310 * local;
local = (ActorLocal_Core2_45310 * )&this->local;
local->unk0 = func_8030D90C();
func_8030DBB4(local->unk0, 0.9f);
sfxsource_setSfxId(local->unk0, 0x3FA);
func_8030DD14(local->unk0, 2);
sfxsource_setSampleRate(local->unk0, 0);
}
void func_802CCC5C(Actor *this) {
f32 spC4[3];
ActorLocal_Core2_45310 * local;
s32 spBC;
f32 spB8;
f32 temp_f0;
f32 spB0;
f32 spAC;
f32 spA8;
f32 phi_f12;
f32 phi_f2;
f32 sp9C;
f32 sp30;
f32 sp8C[3];
f32 sp80[3];
f32 sp74[3];
f32 sp68[3];
f32 sp5C[3];
f32 sp58;
f32 sp4C[3];
f32 sp40[3];
spBC = 0;
spB8 = time_getDelta();
local = (ActorLocal_Core2_45310 * )&this->local;
if (!this->unk16C_4) {
this->unk16C_4 = TRUE;
this->marker->unk30 = func_802CCBC8;
local->unk38 = 0;
local->unk39 = 0;
local->unk3A = 0;
local->unk28 = 0.0f;
marker_setCollisionScripts(this->marker, func_802CC9FC, NULL, func_802CCA3C);
local->unk30[0] = (s16) this->position[0];
local->unk30[1] = (s16) this->position[1];
local->unk30[2] = (s16) this->position[2];
local->unk30[1] = (s16) func_80309724(this->position);
temp_f0 = func_80309B24(this->position);
if (local->unk30[1] < temp_f0) {
local->unk30[1] = (s16) (s32) temp_f0;
}
local->unk0 = 0;
func_802CC640(this, 1);
}
if (!subaddie_playerIsWithinSphere(this, 4000)) {
if (local->unk0 != 0) {
func_8030DA44(local->unk0);
local->unk0 = 0;
}
} else {
if (local->unk0 == 0) {
func_802CCBF4(this);
}
player_getPosition(spC4);
if(this->state != 0){
if (this->state < 6) {
spB0 = func_8030E200(local->unk0);
if (local->unk3A == 1) {
spAC = 0.9f;
spA8 = 1.0f;
} else {
spAC = 0.8f;
spA8 = 0.9f;
}
if (spB0 < spAC) {
spB0 = spB0 + 0.02;
} else if (spA8 < spB0) {
spB0 = spB0 - 0.02;
} else {
spB0 += randf2(-0.05, 0.05);
spB0 = (spB0 < spAC) ? spAC : MIN(spA8 , spB0);
}
func_8030DBB4(local->unk0, spB0);
phi_f12 = 1.0f - ml_vec3f_distance(spC4, this->position) / 2000.0f;
if(0.0f > phi_f12){
phi_f12 = 0.0f;
}
if (phi_f12 > 0.0f) {
sfxsource_setSampleRate(local->unk0, (s32) (phi_f12 * 10000.0f));
func_8030E2C4(local->unk0);
}
}
}
if (this->unk10_25 != 0) {
if (func_8025773C(&local->unk28, spB8) != 0) {
spBC = 2;
}
if (local->unk3A == 2) {
if (this->state == 3) {
local->unk4 += 2 * spB8;
} else {
local->unk4 += 1 * spB8;
}
if (local->unk4 >= 1.0f) {
local->unk4 = 1.0f;
if (func_803203FC(UNKFLAGS1_C1_IN_FINAL_CHARACTER_PARADE)) {
local->unk3A = 0;
} else {
if (this->state == 2) {
local->unk3A = 1;
} else if (this->state == 3) {
if (func_8033567C(this->unk148) != 0x10E) {
func_80335924(this->unk148, 0x10E, 0.2f, 0.75f);
func_80335A8C(this->unk148, 2);
} else if (0.575 <= func_80335684(this->unk148)) {
local->unk3A = 1;
}
}
}
}
if (local->unk3A == 2) {
sp9C = func_802575BC(local->unk4);
this->yaw = local->unk14 + (sp9C*(local->unk24 - local->unk14));
} else {
local->unk4 = 0.0f;
local->unk14 = (f32) local->unk24;
}
}
if (local->unk3A == 1) {
sp30 = 1 * spB8;
if ( !func_802CC2A0(this)
|| ((this->state == 3) && !func_80329210(this, this->position))) {
local->unk18[0] = this->position[0];
local->unk18[1] = this->position[1];
local->unk18[2] = this->position[2];
local->unk4 = 1.0f;
}
local->unk4 += sp30;
if (local->unk4 >= 1.0f) {
local->unk3A = 0;
local->unk4 = 1.0f;
}
sp9C = func_802575BC(local->unk4);
func_80255FE4(this->position, local->unk8, local->unk18, sp9C);
this->yaw = local->unk14 + (sp9C * (local->unk24 - local->unk14));
if ((func_8033567C(this->unk148) == 0x10E) && (func_80335794(this->unk148) > 0)) {
func_80335924(this->unk148, 0x10F, 0.1f, 0.45f);
func_80335A8C(this->unk148, 1);
}
if( (local->unk3A == 0)
|| ((func_8033567C(this->unk148) == 0x10F) && (0.7 <= local->unk4))) {
func_80335924(this->unk148, 0xF9, 0.3f, 0.45f);
func_80335A8C(this->unk148, 1);
}
if (this->state == 3) {
if (0.2 <= local->unk4) {
if (0.8 < local->unk4) {
phi_f2 = 0.0f;
} else {
phi_f2 = 1.0 - ((local->unk4 - 0.2) / 0.6);
}
func_8030DBB4(local->unk0, phi_f2 * 0.3999999999999999 + 1.0);
}
}
}
if (this->state == 1) {
player_getPosition(sp8C);
func_8024C5CC(sp80);
func_8024C5A8(sp74);
sp5C[0] = this->position[0] - sp80[0];
sp5C[1] = this->position[1] - sp80[1];
sp5C[2] = this->position[2] - sp80[2];
sp58 = sp74[0] * sp5C[0] + sp74[1] * sp5C[1] + sp74[2] * sp5C[2];
sp8C[1] += 90.0f;
if( func_80329210(this, sp8C)
&& (sp8C[1] < (local->unk30[1] + 0x12C))
&& !func_8028F25C()
&& (sp58 > 800.0f)
&& (this->marker->unk14_21)
&& (func_8028EE84() != BSWATERGROUP_2_UNDERWATER)
&& func_802CC57C(this, sp8C)
) {
sp8C[0] = 0.0f;
sp68[0] = this->position[0];
sp68[1] = this->position[1];
sp68[2] = this->position[2];
sp68[0] = 0.0f;
if (ml_vec3f_distance(sp8C, sp68) < 800.0f) {
spBC = 3;
}
}
}
if ((this->state == 2) && (local->unk3A == 0)) {
spBC = 1;
}
if (this->state == 3) {
if (func_8028F25C() || (func_8028EE84() == BSWATERGROUP_2_UNDERWATER)) {
func_802CC640(this, 4);
} else {
if (local->unk3A == 0) {
local->unk38++;
if (local->unk38 == 3) {
spBC = 4;
local->unk38 = 0;
} else {
spBC = 1;
}
} else if ((local->unk3A == 2) || (local->unk4 < 0.5)) {
sp4C[0] = spC4[0];
sp4C[1] = spC4[1];
sp4C[2] = spC4[2];
sp4C[1] += 50.0f;
func_802CC4A4(this, sp4C);
}
}
}
if ((this->state == 5) || (this->state == 4)) {
this->position[1] += 50.0f * spB8;
this->yaw += 10.0f * spB8;
}
if (this->state == 6) {
if (func_8033567C(this->unk148) == 0x110) {
sp40[0] = this->position[0] - spC4[0];
sp40[1] = this->position[1] - spC4[1];
sp40[2] = this->position[2] - spC4[2];
sp40[1] = 0.0f;
ml_vec3f_set_length(sp40, 200.0f * spB8);
this->position[0] = this->position[0] + sp40[0];
this->position[1] = this->position[1] + sp40[1];
this->position[2] = this->position[2] + sp40[2];
this->position[1] += local->unk36 * spB8;
local->unk36 -= 3000.0f * spB8;
if (this->position[1] < func_80309724(this->position)) {
this->position[1] = func_80309724(this->position);
func_80335924(this->unk148, 0x111, 0.1f, 1.0f);
func_80335A8C(this->unk148, 2);
FUNC_8030E624(SFX_1F_HITTING_AN_ENEMY_3, 1.2f, 32200);
timed_playSfx(0.1f, SFX_66_BIRD_AUUGHH, 1.6f, 32000);
}
} else if (func_80335794(this->unk148) > 0) {
spBC = 7;
}
}
if (this->state == 7) {
local->unk2C += 0.5 * spB8;
if (local->unk2C >= 1.0f) {
spBC = 8;
}
}
if (spBC != 0) {
func_802CC640(this, spBC);
}
}
}
}