#include #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 f32 func_80257204(f32, f32, f32, 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, animctrl_getAnimTimer(this->animctrl), 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(func_8038BFA0()){ 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 animctrl_setAnimTimer(this->animctrl, 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 < animctrl_getAnimTimer(this->animctrl) ){ func_8035A9E0(this); } break; case 3: // L8035AD88 animctrl_setAnimTimer(this->animctrl, 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, animctrl_getAnimTimer(this->animctrl), 1); actor_loopAnimation(this); this->unk38_31 = 1; } else{ player_getPosition(sp30); if(!func_80359F40(this, sp30)){ func_8035A998(this); } } break; case 4: // L8035AE64 animctrl_setAnimTimer(this->animctrl, 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( animctrl_getAnimTimer(this->animctrl) < 0.1 && func_80359EBC(this, 0x50, 0xA) ){ func_8035A998(this); } break; } }