196 lines
6.2 KiB
C
196 lines
6.2 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
|
|
|
|
extern void func_802DABA0(ParticleEmitter *, f32[3], f32, enum asset_e);
|
|
extern void func_8033A45C(s32, s32);
|
|
extern void func_802DB548(void);
|
|
|
|
enum ccw_season_e
|
|
{
|
|
SPRING,
|
|
SUMMER,
|
|
AUTUMN,
|
|
WINTER
|
|
};
|
|
|
|
typedef struct {
|
|
f32 unk0;
|
|
f32 unk4;
|
|
u8 unk8;
|
|
u8 unk9;
|
|
u8 unkA;
|
|
u8 unkB;
|
|
u32 unkC_31:3;
|
|
u32 unkC_28:1;
|
|
u32 season:28;
|
|
s16 unk10;
|
|
s16 unk12;
|
|
f32 unk14;
|
|
u8 pad18[0x18];
|
|
void (*unk30)(void);
|
|
void (*unk34)(ActorMarker *, s32);
|
|
u8 pad38[4];
|
|
f32 unk3C;
|
|
} ActorLocal_CCW_8050;
|
|
|
|
void chgrublinhood_update(Actor *this);
|
|
Actor *chgrublinhood_draw(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
|
|
|
|
/* .data */
|
|
ActorAnimationInfo chGrublinHood_animations[] = {
|
|
{0x000, 0.0f},
|
|
{0x243, 4.0f},
|
|
{0x243, 0.7f},
|
|
{0x245, 0.7f},
|
|
{0x244, 0.9f},
|
|
{0x246, 1.6f},
|
|
{0x243, 1.5f},
|
|
{0x245, 0.5f},
|
|
{0x243, 1.5f},
|
|
{0x243, 1e+06f},
|
|
{0x243, 1e+06f}
|
|
};
|
|
|
|
ActorInfo chGrublinHood = {
|
|
MARKER_1E2_GRUBLIN_HOOD, ACTOR_375_GRUBLIN_HOOD, ASSET_52C_MODEL_GRUBLIN_HOOD,
|
|
0x1, chGrublinHood_animations,
|
|
chgrublinhood_update, actor_update_func_80326224, chgrublinhood_draw,
|
|
2500, 0, 1.0f, 0
|
|
};
|
|
|
|
/* .code */
|
|
void __chgrublinhood_emitHat(ParticleEmitter *pCtrl, Actor *actor, enum asset_e model_id){
|
|
static ParticleSettingsVelocityAccelerationPosition D_8038F9AC = {
|
|
{{-200.0f, 200.0f, -200.0f}, {200.0f, 400.0f, 200.0f}},
|
|
{{ 0.0f, -1800.0f, 0.0f}, { 0.0f, -1800.0f, 0.0f}},
|
|
{{ -50.0f, 200.0f, -50.0f}, { 50.0f, 400.0f, 50.0f}}
|
|
};
|
|
|
|
func_802DABA0(pCtrl, actor->position, actor->scale, model_id);
|
|
particleEmitter_setAngularVelocityRange(pCtrl,
|
|
-600.0f, -600.0f, -600.0f,
|
|
600.0f, 600.0f, 600.0f
|
|
);
|
|
particleEmitter_setVelocityAccelerationAndPositionRanges(pCtrl, &D_8038F9AC);
|
|
particleEmitter_emitN(pCtrl, 1);
|
|
}
|
|
|
|
void __chgrublinhood_die(ActorMarker* marker, s32 arg1) {
|
|
Actor* actor = marker_getActor(marker);
|
|
ParticleEmitter *pCtrl;
|
|
|
|
subaddie_set_state_with_direction(actor, 5, 0.0f, 1);
|
|
actor_playAnimationOnce(actor);
|
|
FUNC_8030E8B4(SFX_C2_GRUBLIN_EGH, 1.0f, 32000, actor->position, 1250, 2500);
|
|
pCtrl = partEmitMgr_newEmitter(1);
|
|
__chgrublinhood_emitHat(pCtrl, actor, ASSET_52D_MODEL_GRUBLIN_HOOD_HAT);
|
|
__spawnQueue_add_4((GenFunction_4)spawnQueue_actor_f32, ACTOR_4C_STEAM, reinterpret_cast(s32,actor->position_x), reinterpret_cast(s32,actor->position_y), reinterpret_cast(s32,actor->position_z));
|
|
actor_collisionOff(actor);
|
|
actor->has_met_before = TRUE;
|
|
}
|
|
|
|
Actor *chgrublinhood_draw(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
|
|
Actor *this;
|
|
ActorLocal_CCW_8050 *local;
|
|
|
|
this = marker_getActor(marker);
|
|
local = (ActorLocal_CCW_8050 *)&this->local;
|
|
func_8033A45C(3, (local->season == SUMMER) ? 1 : 2);
|
|
func_8033A45C(4, (local->season == SUMMER) ? 1 : 2);
|
|
func_8033A45C(5, (local->season < AUTUMN) ? 1 : 2);
|
|
func_8033A45C(6, (local->season < AUTUMN) ? 1 : 2);
|
|
func_8033A45C(7, (local->season < AUTUMN) ? 1 : 2);
|
|
func_8033A45C(8, (local->season < AUTUMN) ? 1 : 2);
|
|
func_8033A45C(9, (local->season == SUMMER) ? 1 : 0);
|
|
func_8033A45C(10, (local->season < AUTUMN) ? 0 : (local->season == AUTUMN) ? 1 : 2);
|
|
func_8033A45C(11, (local->season < AUTUMN) ? 0 : (local->season == AUTUMN) ? 1 : 2);
|
|
func_8033A45C(12, (local->season == WINTER) ? 2 : 1);
|
|
func_8033A45C(13, (local->season == WINTER) ? 1 : 0);
|
|
func_8033A45C(14, (this->has_met_before)? FALSE : TRUE);
|
|
return actor_draw(marker, gfx, mtx, vtx);
|
|
}
|
|
|
|
void __chgrublinhood_initialize(Actor *this){
|
|
ActorLocal_CCW_8050 *local = (ActorLocal_CCW_8050 *)&this->local;
|
|
|
|
local->unk8 = 6;
|
|
local->unk9 = 0xC;
|
|
local->unkA = 0x10;
|
|
local->unkB = 8;
|
|
local->unkC_31 = 1;
|
|
local->unk10 = 0x29;
|
|
local->unk12 = 25000;
|
|
local->unkC_28 = 1;
|
|
local->unk30 = func_802DB548;
|
|
local->unk34 = __chgrublinhood_die;
|
|
local->unk0 = 5.0f;
|
|
local->unk4 = 8.0f;
|
|
local->unk14 = 1.0f;
|
|
local->unk3C = 1.5f;
|
|
}
|
|
|
|
enum ccw_season_e __get_current_season(Actor *this){
|
|
switch(map_get()){
|
|
case MAP_43_CCW_SPRING: //// 8038E930
|
|
case MAP_4A_CCW_SPRING_MUMBOS_SKULL:// 8038E930
|
|
case MAP_5B_CCW_SPRING_ZUBBA_HIVE:// 8038E930
|
|
case MAP_5E_CCW_SPRING_NABNUTS_HOUSE:// 8038E930
|
|
case MAP_65_CCW_SPRING_WHIPCRACK_ROOM:// 8038E930
|
|
return SPRING;
|
|
|
|
case MAP_44_CCW_SUMMER:// 8038E938
|
|
case MAP_4B_CCW_SUMMER_MUMBOS_SKULL:// 8038E938
|
|
case MAP_5A_CCW_SUMMER_ZUBBA_HIVE:// 8038E938
|
|
case MAP_5F_CCW_SUMMER_NABNUTS_HOUSE:// 8038E938
|
|
case MAP_66_CCW_SUMMER_WHIPCRACK_ROOM:// 8038E938
|
|
return SUMMER;
|
|
|
|
case MAP_45_CCW_AUTUMN:// 8038E940
|
|
case MAP_4C_CCW_AUTUMN_MUMBOS_SKULL:// 8038E940
|
|
case MAP_5C_CCW_AUTUMN_ZUBBA_HIVE:// 8038E940
|
|
case MAP_60_CCW_AUTUMN_NABNUTS_HOUSE:// 8038E940
|
|
case MAP_63_CCW_AUTUMN_NABNUTS_WATER_SUPPLY:// 8038E940
|
|
case MAP_67_CCW_AUTUMN_WHIPCRACK_ROOM:// 8038E940
|
|
return AUTUMN;
|
|
|
|
case MAP_46_CCW_WINTER:// 8038E948
|
|
case MAP_4D_CCW_WINTER_MUMBOS_SKULL:// 8038E948
|
|
case MAP_61_CCW_WINTER_NABNUTS_HOUSE:// 8038E948
|
|
case MAP_62_CCW_WINTER_HONEYCOMB_ROOM:// 8038E948
|
|
case MAP_64_CCW_WINTER_NABNUTS_WATER_SUPPLY:// 8038E948
|
|
case MAP_68_CCW_WINTER_WHIPCRACK_ROOM:// 8038E948
|
|
return WINTER;
|
|
|
|
default:
|
|
return SPRING;
|
|
|
|
}
|
|
}
|
|
|
|
void chgrublinhood_update(Actor *this) {
|
|
ActorLocal_CCW_8050 *local;
|
|
f32 temp_a0;
|
|
|
|
local = (ActorLocal_CCW_8050 *)&this->local;
|
|
|
|
if (!this->volatile_initialized) {
|
|
__chgrublinhood_initialize(this);
|
|
local->season = __get_current_season(this);
|
|
}
|
|
|
|
if(local->season < 4){
|
|
func_802DB5A0(this);
|
|
if (this->state == 5) {
|
|
if (actor_animationIsAt(this, 0.18f)) {
|
|
FUNC_8030E8B4(SFX_2_CLAW_SWIPE, 1.0f, 28000, this->position, 1250, 2500);
|
|
}
|
|
if (actor_animationIsAt(this, 0.7f)) {
|
|
FUNC_8030E8B4(SFX_1F_HITTING_AN_ENEMY_3, 1.0f, 28000, this->position, 1250, 2500);
|
|
}
|
|
}
|
|
}
|
|
}
|