Files
banjo-kazooie/src/core2/ch/icecube.c
banjo.decomp 4c3d4df97b rename animctrl to anctrl to match source debug string and tooie naming
rename `rumbleManager` to `bamotor`
2024-10-30 19:51:58 -05:00

382 lines
12 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#define _HorzDist3v(v1, v2) ((v1[0]-v2[0])*(v1[0]-v2[0]) + (v1[2]-v2[2])*(v1[2]-v2[2]))
extern void func_802D729C(Actor *, f32);
extern Actor *bundle_spawn_f32(enum actor_e, f32[3]);
void chicecube_update(Actor *this);
Actor *chicecube_draw(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
/* .data */
ActorAnimationInfo D_80372B50[] = {
{0x000, 0.0f},
{ASSET_233_ANIM_ICECUBE, 999999.0f},
{ASSET_233_ANIM_ICECUBE, 1.2f},
{ASSET_233_ANIM_ICECUBE, 999999.0f},
{ASSET_233_ANIM_ICECUBE, 999999.0f},
{ASSET_233_ANIM_ICECUBE, 1.2f}
};
ActorInfo D_80372B80 = {
MARKER_250_ICECUBE_A, ACTOR_37D_ICECUBE_A, ASSET_504_MODEL_ICECUBE,
1, D_80372B50,
chicecube_update, actor_update_func_80326224, chicecube_draw,
0, 0, 0.0f, 0
};
ActorInfo D_80372BA4 = {
MARKER_25F_ICECUBE_B, ACTOR_3A0_ICECUBE_B, ASSET_504_MODEL_ICECUBE,
1, D_80372B50,
chicecube_update, actor_update_func_80326224, chicecube_draw,
0, 0, 0.0f, 0
};
s32 D_80372BC8[3] = {220, 220, 230};
s32 D_80372BD4[3] = {200, 200, 255};
/*.code */
Actor *chicecube_draw(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
Actor *actor = marker_getActor(marker);
func_8033A45C(3, actor->unk38_31);
actor = actor_draw(marker, gfx, mtx, vtx);
return actor;
}
int func_80359DF4(Actor *this, s32 arg1){
if(func_80329530(this, arg1) && func_803292E0(this))
return 1;
return 0;
}
int func_80359E38(Actor *this, s32 arg1, s32 arg2){
int sp1C = 0;
if(arg1 < this->alpha_124_19 + arg2){
this->alpha_124_19 = arg1;
sp1C = 1;
}
else{
this->alpha_124_19 += arg2;
}
actor_setOpacity(this, this->alpha_124_19);
return sp1C;
}
int func_80359EBC(Actor *this, s32 arg1, s32 arg2){
int sp1C = 0;
if((this->alpha_124_19 - arg2) < arg1){
this->alpha_124_19 = arg1;
sp1C = 1;
}
else{
this->alpha_124_19 -= arg2;
}
actor_setOpacity(this, this->alpha_124_19);
return sp1C;
}
int func_80359F40(Actor *this, f32 arg1[3]){
f32 sp24;
f32 sp20;
sp24 = func_80257204(this->position[0], this->position[2], arg1[0], arg1[2]);
if((globalTimer_getTime() & 0xF) == 4){
this->velocity[2] = (f32)randi2(-45, 45);
}
sp20 = this->yaw;
sp24 += this->velocity[2];
this->yaw = sp24;
if(func_80329030(this, 0)){
this->yaw = sp20;
return 1;
}
else{
this->yaw = sp20;
return 0;
}
}
int func_80359FEC(f32 arg0[3], f32 arg1[3], s32 arg2){
if(_HorzDist3v(arg0, arg1) < arg2*arg2)
return 1;
return 0;
}
void func_8035A04C(f32 position[3], s32 cnt, enum asset_e model_id, f32 scale){
ParticleEmitter *pCtrl = partEmitMgr_newEmitter(cnt);
particleEmitter_setModel(pCtrl, model_id);
particleEmitter_setPosition(pCtrl, position);
particleEmitter_setSpawnPositionRange(pCtrl, -100.0f*scale, 0.0f, -100.0f*scale, 100.0f*scale, 200.0f*scale, 100.0f*scale);
particleEmitter_setAccelerationRange(pCtrl, 0.0f, -1000.0f, 0.0f, 0.0f, -1000.0f, 0.0f);
particleEmitter_setParticleVelocityRange(pCtrl, -400.0f*scale, 450.0f*scale, -400.0f*scale, 400.0f*scale, 600.0f*scale, 400.0f*scale);
particleEmitter_setAngularVelocityRange(pCtrl, 100.0f*scale, 100.0f*scale, 100.0f*scale, 250.0f*scale, 250.0f*scale, 250.0f*scale);
particleEmitter_setStartingScaleRange(pCtrl, scale*0.2, scale*0.4);
particleEmitter_setSpawnIntervalRange(pCtrl, 0.0f, 0.02f);
particleEmitter_setParticleLifeTimeRange(pCtrl, 2.2f, 2.2f);
particleEmitter_setFade(pCtrl, 0.0f, 0.3f);
particleEmitter_emitN(pCtrl, cnt);
}
void func_8035A228(f32 position[3], s32 cnt, enum asset_e sprite_id, f32 scale){
ParticleEmitter *pCtrl = partEmitMgr_newEmitter(cnt);
particleEmitter_setRGB(pCtrl, D_80372BC8);
particleEmitter_setSprite(pCtrl, sprite_id);
particleEmitter_setPosition(pCtrl, position);
particleEmitter_setSpawnPositionRange(pCtrl, -50.0f*scale, 0.0f, -50.0f*scale, 50.0f*scale, 200.0f*scale, 50.0f*scale);
particleEmitter_setAccelerationRange(pCtrl, 0.0f, -10.0f, 0.0f, 0.0f, -10.0f, 0.0f);
particleEmitter_setParticleVelocityRange(pCtrl, -280.0f*scale, 0.0f, -280.0f*scale, 280.0f*scale, 280.0f*scale, 280.0f*scale);
particleEmitter_setStartingScaleRange(pCtrl, scale*0.6, scale*0.8);
particleEmitter_setFinalScaleRange(pCtrl, scale*1.0, scale*1.4);
particleEmitter_setSpawnIntervalRange(pCtrl, 0.0f, 0.01f);
particleEmitter_setParticleLifeTimeRange(pCtrl, 1.2f, 1.8f);
particleEmitter_setFade(pCtrl, 0.0f, 0.01f);
particleEmitter_emitN(pCtrl, cnt);
}
void func_8035A3F8(f32 position[3], s32 cnt, enum asset_e sprite_id, f32 scale){
ParticleEmitter *pCtrl = partEmitMgr_newEmitter(cnt);
particleEmitter_setRGB(pCtrl, D_80372BD4);
particleEmitter_setSprite(pCtrl, sprite_id);
particleEmitter_setPosition(pCtrl, position);
particleEmitter_setAccelerationRange(pCtrl, 0.0f, -10.0f, 0.0f, 0.0f, -10.0f, 0.0f);
particleEmitter_setParticleVelocityRange(pCtrl, -60.0f*scale, 0.0f, -60.0f*scale, 60.0f*scale, 60.0f*scale, 60.0f*scale);
particleEmitter_setStartingScaleRange(pCtrl, scale*0.4, scale*0.6);
particleEmitter_setFinalScaleRange(pCtrl, scale*0.8, scale*1.2);
particleEmitter_setSpawnIntervalRange(pCtrl, 0.0f, 0.01f);
particleEmitter_setParticleLifeTimeRange(pCtrl, 0.5f, 0.7f);
particleEmitter_setFade(pCtrl, 0.0f, 0.3f);
particleEmitter_setDrawMode(pCtrl, 4);
particleEmitter_emitN(pCtrl, cnt);
}
void func_8035A594(f32 position[3], f32 arg1, f32 arg2){
int i;
int v0;
for(i = 60; i != 380; i+=160){
v0 = i;
if(i > 360)
v0 = i - 360;
if(v0 < arg1 && arg2 < v0){
func_8030E878(SFX_28_RUSTLING_NOISE, randf2(1.6f, 1.7f), 17000, position, 500.0f, 1000.0f);
}
}
}
void func_8035A694(Actor *this){
f32 sp3C;
f32 sp38;
s32 tmp_v0;
f32 sp28[3];
sp3C = this->yaw;
sp38 = this->actor_specific_1_f * 1.5 + 1.0;
tmp_v0 = globalTimer_getTime();
this->yaw += sp38;
if(360.0f < this->yaw)
this->yaw -= 360.0f;
if(this->marker->unk14_21 && !(tmp_v0 & 1)){
func_8034A174(this->marker->unk44, 5, sp28);
func_8035A3F8(sp28, 1, ASSET_70D_SPRITE_SMOKE_1, this->scale);
}
func_8035A594(this->position, this->yaw, sp3C);
}
void __chicecube_spawnHalfCubes(ActorMarker *marker){
Actor *actor = marker_getActor(marker);
Actor *other;
f32 sp54[3];
int i;
f32 pad[1];
sp54[0] = actor->position[0];
sp54[1] = actor->position[1];
sp54[2] = actor->position[2];
sp54[1] += 100.0f;
for(i = 0; i < 2; i++){//L8035A7FC
bundle_setYaw((i & 1)? actor->yaw : actor->yaw + 180.0f);
other = bundle_spawn_f32(BUNDLE_21__ICECUBE_B, sp54);
other->unkF4_8 = 1; //don't spawn more
other->scale = randf2(0.5f, 0.6f)*actor->scale;
actor->yaw = randi2(0, 359);
}
if(marker);
}
//__chicecube_ow
void __chicecube_ow(ActorMarker *marker, ActorMarker *other_marker){
Actor *actor = marker_getActor(marker);
FUNC_8030E8B4(SFX_1D_HITTING_AN_ENEMY_1, 0.9f, 22000, actor->position, 1500, 3000);
actor->velocity[1] = 0.8f;
actor->actor_specific_1_f = 0.0f;
}
//__chicecube_die
void __chicecube_die(ActorMarker *marker, ActorMarker *other_marker){
Actor *actor = marker_getActor(marker);
FUNC_8030E8B4(SFX_B6_GLASS_BREAKING_1, 1.0f, 32000, actor->position, 1500, 4500);
actor->velocity[1] = 0.0f;
func_8035A04C(actor->position, 12, ASSET_505_MODEL_ICECUBE_CHUNK, actor->scale);
func_8035A228(actor->position, 6, ASSET_700_SPRITE_DUST, actor->scale);
if(actor->unkF4_8 != 1){
__spawnQueue_add_1((GenFunction_1)__chicecube_spawnHalfCubes, reinterpret_cast(s32, actor->marker));
}
marker_despawn(actor->marker);
}
void func_8035A998(Actor *this){
subaddie_set_state_with_direction(this, 1, 0.0001f, 1);
actor_playAnimationOnce(this);
this->unk38_31 = 0;
}
void func_8035A9E0(Actor *this){
subaddie_set_state_with_direction(this, 3, anctrl_getAnimTimer(this->anctrl), 1);
actor_loopAnimation(this);
this->unk38_31 = 1;
this->actor_specific_1_f = 0.0f;
}
void func_8035AA40(Actor *this){
subaddie_set_state_with_direction(this, 5, 0.9999f, 0);
actor_playAnimationOnce(this);
this->unk38_31 = 1;
}
void chicecube_update(Actor *this){
f32 sp3C = time_getDelta();
f32 sp30[3];
if(map_get() == MAP_27_FP_FREEZEEZY_PEAK){
if(maSlalom_isActive()){
actor_collisionOff(this);
this->unk58_0 = FALSE;
return;
}
actor_collisionOn(this);
this->unk58_0 = TRUE;
}//L8035AAF4
if(!subaddie_playerIsWithinSphere(this, 3000))
return;
func_802D729C(this, 3.4 * this->scale);
if(!this->volatile_initialized){
this->volatile_initialized = TRUE;
marker_setCollisionScripts(this->marker, __chicecube_ow, NULL, __chicecube_die);
this->marker->propPtr->unk8_3 = FALSE;
actor_collisionOff(this);
this->alpha_124_19 = 0x50;
actor_setOpacity(this, this->alpha_124_19);
this->unk38_31 = 0;
this->lifetime_value = 1.0f;
}//L8035ABC0
if(this->lifetime_value <= 0.0){
if(-99999.0 != this->lifetime_value){
this->lifetime_value = -99999.0f;
actor_collisionOn(this);
this->unk1C[0] =this->position[0];
this->unk1C[1] =this->position[1];
this->unk1C[2] =this->position[2];
this->velocity[0] = this->yaw;
}
}
else{//L8035AC3C
this->lifetime_value -= sp3C;
}
if(0.0 >= this->velocity[1]){
this->velocity[1] = 0.0f;
}
else{
this->velocity[1] -= sp3C;
return;
}
switch(this->state){
case 1: // L8035AC9C
anctrl_setAnimTimer(this->anctrl, 0.0f);
if( func_80359DF4(this, 900)
|| (this->unkF4_8 == 2 && volatileFlag_get(VOLATILE_FLAG_C1_IN_FINAL_CHARACTER_PARADE))
){
subaddie_set_state_with_direction(this, 2, 0.0001f, 1);
actor_playAnimationOnce(this);
this->unk38_31 = 0x1;
}
break;
case 2: // L8035AD10
if(actor_animationIsAt(this, 0.1f)){
FUNC_8030E8B4(SFX_112_TINKER_ATTENTION, 1.3f, 23000, this->position, 1500, 4500);
}
if( func_80359E38(this, 0xff, 0xa)
&& 0.98 < anctrl_getAnimTimer(this->anctrl)
){
func_8035A9E0(this);
}
break;
case 3: // L8035AD88
anctrl_setAnimTimer(this->anctrl, 0.999f);
if (this->actor_specific_1_f + 0.28 < 18.0) {
this->actor_specific_1_f = this->actor_specific_1_f + 0.28;
}
else {
this->actor_specific_1_f = 18.0f;
}
func_8035A694(this);
if(!func_80359DF4(this, 1300)){
subaddie_set_state_with_direction(this, 4, anctrl_getAnimTimer(this->anctrl), 1);
actor_loopAnimation(this);
this->unk38_31 = 1;
}
else{
player_getPosition(sp30);
if(!func_80359F40(this, sp30)){
func_8035A998(this);
}
}
break;
case 4: // L8035AE64
anctrl_setAnimTimer(this->anctrl, 0.999f);
if (this->actor_specific_1_f - 0.28 > 8.0) {
this->actor_specific_1_f = this->actor_specific_1_f - 0.28;
}
else {
this->actor_specific_1_f = 8.0f;
}
func_8035A694(this);
if(func_80359DF4(this, 900)){
func_8035A9E0(this);
}
else if(func_80359FEC(this->position, this->unk1C, 0x14)){//L8035AEEC
if(func_803294F0(this, 0xa, (s32)this->velocity[0])){
func_8035AA40(this);
}
}
else{//L8035AF38
if(!func_80359F40(this, this->unk1C)){
func_8035AA40(this);
}
}
break;
case 5: // L8035AF58
if(actor_animationIsAt(this, 0.25f)){
FUNC_8030E8B4(SFX_112_TINKER_ATTENTION, 1.3f, 23000, this->position, 1500, 4500);
}
if( anctrl_getAnimTimer(this->anctrl) < 0.1
&& func_80359EBC(this, 0x50, 0xA)
){
func_8035A998(this);
}
break;
}
}