diff --git a/src/SB/Core/x/xModel.h b/src/SB/Core/x/xModel.h index 54b862f4..44f90812 100644 --- a/src/SB/Core/x/xModel.h +++ b/src/SB/Core/x/xModel.h @@ -154,7 +154,7 @@ void xModel_SceneExit(RpWorld* world); xSphere* xModelGetLocalSBound(xModelInstance* model); void xModelGetBoneMat(xMat4x3& mat, const xModelInstance& model, size_t index); void xModelInstanceUpgradeBrotherShared(xModelInstance* inst, U32 flags); -xVec3 xModelGetBoneLocation(xModelInstance& model, U32 index); +xVec3 xModelGetBoneLocation(const xModelInstance& model, u32 index); inline void xModelSetFrame(xModelInstance* modelInst, const xMat4x3* frame) { diff --git a/src/SB/Core/x/xNPCBasic.h b/src/SB/Core/x/xNPCBasic.h index 0a2d90aa..00cfd6d7 100644 --- a/src/SB/Core/x/xNPCBasic.h +++ b/src/SB/Core/x/xNPCBasic.h @@ -86,11 +86,11 @@ struct xNPCBasic : xEnt, xFactoryInst virtual void Init(xEntAsset* asset); virtual void PostInit(); virtual void Setup(); - + virtual void PostSetup() { } - + virtual void Reset(); virtual void Process(xScene* xscn, F32 dt); virtual void BUpdate(xVec3*); diff --git a/src/SB/Game/zNPCTypeBossSB2.cpp b/src/SB/Game/zNPCTypeBossSB2.cpp index d621f29c..caac0672 100644 --- a/src/SB/Game/zNPCTypeBossSB2.cpp +++ b/src/SB/Game/zNPCTypeBossSB2.cpp @@ -64,6 +64,8 @@ #define SOUND_HIT_SLAP 8 #define SOUND_HIT_FLAIL 9 +zNPCB_SB2* _singleton; + namespace { struct sound_data_type @@ -82,8 +84,25 @@ namespace U32 flags; }; + struct curve_node + { + F32 time; + iColor_tag color; + F32 scale; + }; + + struct platform_hook + { + char* name; + }; + static U32 sound_asset_ids[10][4]; static sound_data_type sound_data[10]; + + static response_curve rc_scale; + + static xBinaryCamera boss_cam; + static const sound_asset sound_assets[12] = { { 0, "RSB_laugh", 0, 0 }, { 1, "RSB_kah", 0, 0 }, { 2, "RSB_chop_windup", 0, 0 }, { 3, "RSB_chop_swing", 0, 0 }, { 4, "RSB_swipe", 0, 0 }, { 5, "RSB_foot_loop", 0, 1 }, @@ -91,6 +110,10 @@ namespace { 7, "RSB_armhit2", 0, 0 }, { 8, "RSB_armsmash", 0, 0 }, { 9, "RSB_foor_impact", 0, 0 }, }; + static platform_hook platform_hooks[16]; + + static curve_node scale_curve[4]; + void set_alpha_blend(xModelInstance* model) { model->PipeFlags &= ~0xFF0C; @@ -106,9 +129,8 @@ namespace return f1; } - S32 tweak() + static void init_sound() { - return 0; // to-do } void reset_sound() @@ -224,6 +246,8 @@ namespace void register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char*); }; + static tweak_group tweak; + void tweak_group::load(xModelAssetParam* params, U32 size) { tweak_group::register_tweaks(true, params, size, NULL); @@ -1110,6 +1134,83 @@ xAnimTable* ZNPC_AnimTable_BossSB2() return table; } +void zNPCB_SB2::Init(xEntAsset* asset) +{ + xModelInstance * m; + + _singleton = this; + boss_cam.init(); + init_sound(); + zNPCCommon::Init(asset); + this->cfg_npc->dst_castShadow = 30.0f; + memset((void*)this->flag.face_player, 0, 0x10); + this->said_intro = 0; + + m = this->model; + this->models[0] = this->model; + + this->models[1] = m->Next; + this->models[2] = m->Next; + this->models[3] = m->Next; + + this->models[0]->Data->boundingSphere.radius = 100.0f; + this->models[1]->Data->boundingSphere.radius = 100.0f; + this->models[2]->Data->boundingSphere.radius = 100.0f; + this->models[3]->Data->boundingSphere.radius = 100.0f; + + set_alpha_blend(this->models[0]); + this->init_hands(); + this->init_bounds(); + this->reset_bounds(); + + this->penby = FALSE; + this->bupdate = 0; + this->bound.type = TRUE; + this->bound.sph.center.y = 1e38f; + this->bound.sph.r = 0.0f; + + response_curve::init((U32)&rc_scale, 0, 0, 0, 0, 0, 0); + + this->init_slugs(); +} + +void zNPCB_SB2::Setup() +{ + xEnt* ent; + xSphere o; + + this->create_glow_light(); + this->init_nodes(); + zNPCBoss::Setup(); + + for (S32 i = 0; i < 16; i++) + { + this->platforms[i].ent = 0; + zSceneFindObject(xStrHash(platform_hooks[i].name)); + } + + if (this->models[3]->Surf == NULL) + { + this->models[3]->Surf = &create_surface(); + } + + if (this->models[0]->Surf == NULL) + { + this->models[0]->Surf = &create_surface(); + } + + // models[3]->Surf->moprops = 0; + // models[0]->Surf->moprops = 7; + + this->scan_cronies(); + (xBase*)&this->newsfish->id = zSceneFindObject(xStrHash("NPC_NEWSCASTER")); + + if (this->newsfish->id != NULL) + { + this->newsfish->TalkOnScreen(1); + } +} + void zNPCB_SB2::SelfSetup() { xBehaveMgr* bmgr = xBehaveMgr_GetSelf(); @@ -1125,14 +1226,125 @@ void zNPCB_SB2::SelfSetup() psy_instinct->SetSafety(NPC_GOAL_BOSSSB2IDLE); } +void zNPCB_SB2::Reset() +{ + if(this->newsfish != 0) + { + this->newsfish->Reset(); + } + + reset_sound(); + zNPCCommon::Reset(); + memset(&flag.face_player, 0 , 0x10); + + for (S32 i = 0; i < 9; i++) + { + if (nodes[i].ent != NULL) + { + zEntDestructObj_Reset(nodes[i].ent, globals.sceneCur); + xEntShow(nodes[i].ent); + } + } + + for (S32 i = 0; i < 16; i++) + { + if (platforms[i].ent != NULL) + { + zEntEvent(this, platforms[i].ent, 10); + } + } + + this->life = 0; + this->round = 0; + + this->check_life(); + this->choose_hand(); + this->reset_speed(); + this->show_nodes(); + + this->turn.vel = 0.0f; + this->node_pulse = 0.0f; + this->flag.face_player = TRUE; + this->flag.move = MOVE_NONE; + this->player_damage_timer = 0.0f; + this->old_player_health = 0; + + this->reset_stage(); + this->set_vulnerable(TRUE); + zCameraDisableTracking(CO_BOSS); + boss_cam.start(globals.camera); + psy_instinct->GoalSet(NPC_GOAL_BOSSSB2INTRO, 0); + +} + void zNPCB_SB2::Destroy() { zNPCB_SB2::destroy_glow_light(); zNPCCommon::Destroy(); } -void zNPCB_SB2::NewTime(xScene* x, F32 y) +void zNPCB_SB2::Process(xScene* xscn, F32 dt) { + if (this->flag.updated == FALSE) + { + boss_cam.set_targets((xVec3&)globals.player.ent.model->Mat->pos, location(), + 5.0f); + this->flag.updated = TRUE; + } + + this->check_life(); + this->player_damage_timer = this->player_damage_timer - dt; + + if ((globals.player.Health < this->old_player_health) && this->old_player_health != 0) + { + this->player_damage_timer = tweak.player_damage_time; + say(1); + } + + this->old_player_health = globals.player.Health; + + if ((SomethingWonderful() & 0x23) == 0) + { + delay = delay + dt; + this->psy_instinct->Timestep(dt, 0); + } + + this->update_nodes(dt); + this->update_slugs(dt); + this->update_move(dt); + this->update_turn(dt); + this->update_camera(dt); + this->check_hit_fail(); + zNPCCommon::Process(xscn, dt); +} + +void zNPCB_SB2::NewTime(xScene* xscn, F32 dt) +{ + xVec3 tmp; + + if (this->flag.nodes_taken == NULL) + { + this->move_nodes(); + } + + for (S32 i = 0; i < 2; i++) + { + this->move_hand(this->hands[i], dt); + } + + this->update_bounds(); + this->update_platforms(dt); + this->update_slugs(dt); + + this->models[1]->Flags = this->models[1]->Flags & 0xefff; + this->models[2]->Flags = this->models[2]->Flags & 0xefff; + + this->sound_loc.mouth = xModelGetBoneLocation(*model, 4); + this->sound_loc.body = this->sound_loc.mouth; + this->sound_loc.hand[0] = xModelGetBoneLocation(*model, 16); + this->sound_loc.hand[1] = xModelGetBoneLocation(*model, 21); + + zNPCCommon::NewTime(xscn, dt); } void zNPCB_SB2::decompose() @@ -1165,8 +1377,6 @@ void zNPCB_SB2::ouchie() } - - void zNPCB_SB2::Render() { xNPCBasic::Render(); @@ -1193,27 +1403,32 @@ void zNPCB_SB2::ThanksImDone() void zNPCB_SB2::reset_speed() { - turn.accel = 0; - turn.max_vel = 0; + turn.accel = tweak.turn_accel; + turn.max_vel = tweak.turn_max_vel; } S32 zNPCB_SB2::player_platform() { - return 0; // TODO + if (((globals.player.ent.collis->colls->flags & 1) != 0)) + { + return 1; + } + + return NULL; } -void zNPCB_SB2::activate_hand(zNPCB_SB2::hand_enum, bool) +void zNPCB_SB2::activate_hand(zNPCB_SB2::hand_enum hand, bool) { hands[0].hurt_player = 1; hands[0].hit_platforms = 0x10; - penby = 0x10; + hands[0].ent->penby = 0x10; } -void zNPCB_SB2::deactivate_hand(zNPCB_SB2::hand_enum) +void zNPCB_SB2::deactivate_hand(zNPCB_SB2::hand_enum hand) { hands[0].hit_platforms = 0; hands[0].hurt_player = 0x10; - penby = 0x10; + hands[0].ent->penby = 0; } S32 zNPCB_SB2::player_on_ground() const @@ -1222,10 +1437,39 @@ S32 zNPCB_SB2::player_on_ground() const // TODO } +void zNPCB_SB2::emit_slug(zNPCB_SB2::slug_enum which) +{ + slug_data& slug = slugs[which]; + F32 launch_ang; + F32 accel_time; + + if (slug.ent->id != 0) + { + slug.stage = (zNPCB_SB2::slug_stage)1; + slug.time = 0.0f; + slug.stage_delay = tweak.karate.aim_time; + slug.vel = 0.0f; + slug.dist = 0.0f; + slug.abandoned = 0; + + xMat4x3Mul((xMat4x3*)model->Mat, 0 , 0); + xMat3x3RMulVec(&tweak.karate.emit_offset, 0, 0); + } +} + +void zNPCB_SB2::fire_slug(zNPCB_SB2::slug_enum which, zNPCB_SB2::platform_data& target) +{ + slug_data& slug = slugs[which]; + xVec3 offset; + F32 idist; + + slug.stage = SLUG_DELAY; +} + void zNPCB_SB2::abandon_slugs() { - slug_data* pCurSlug = &slugs[0]; - slug_data* pLastSlug = &pCurSlug[3]; + slug_data* pCurSlug = &slugs[0]; + slug_data* pLastSlug = &pCurSlug[3]; for (; pCurSlug != pLastSlug; pCurSlug++) { pCurSlug->abandoned = 1; diff --git a/src/SB/Game/zNPCTypeBossSB2.h b/src/SB/Game/zNPCTypeBossSB2.h index 216a5a19..e7d735c1 100644 --- a/src/SB/Game/zNPCTypeBossSB2.h +++ b/src/SB/Game/zNPCTypeBossSB2.h @@ -23,8 +23,11 @@ struct response_curve U32 nodes; // offset 0x8, U32 active_node; // offset 0xC, + static void init(U32, const void*, U32, const char*, const char**, const tweak_callback*, + void*); void end_t() const; }; + struct node { F32 t; @@ -51,6 +54,15 @@ struct zNPCB_SB2 : zNPCBoss RIGHT_HAND }; + enum slug_enum + { + BEGIN_SLUG = 0, + SLUG_KAH = 0, + SLUG_RAH = 1, + SLUG_TAY = 2, + MAX_SLUG = 3, + }; + struct node_data { zEntDestructObj* ent; @@ -97,7 +109,7 @@ struct zNPCB_SB2 : zNPCBoss xMat3x3 mat; struct { - xVec3 axis; + xVec3 axis; // 0x968 F32 ang; F32 end_ang; F32 vel; @@ -161,7 +173,7 @@ struct zNPCB_SB2 : zNPCBoss bool face_follow; bool dizzy; //0x2b6 move_enum move; - bool vulnerable; + bool vulnerable; //0x2bc bool cruise_exploding; //0x2bd bool cruise_hit_body; bool cruise_hit_target; //0x2bf @@ -180,7 +192,7 @@ struct zNPCB_SB2 : zNPCBoss zNPCNewsFish* newsfish; U8 said_intro; xModelInstance* models[4]; - node_data nodes[9]; + node_data nodes[9]; // 0x300 hand_data hands[2]; platform_data platforms[16]; bound_data bounds[5]; @@ -202,7 +214,7 @@ struct zNPCB_SB2 : zNPCBoss } ymove; struct { - xVec3 body; + xVec3 body; // 0x17d4 xVec3 mouth; //0x17e0 xVec3 hand[2]; } sound_loc; @@ -214,9 +226,14 @@ struct zNPCB_SB2 : zNPCBoss } glow_light; zNPCB_SB2(S32 myType); + void Init(xEntAsset* asset); + void Setup(); void SelfSetup(); + void Reset(); void Destroy(); + void Process(xScene* xscn, F32 dt); void NewTime(xScene*, F32); + void init_nodes(); void move_nodes(); void move_hand(zNPCB_SB2::hand_data&, F32); void update_bounds(); @@ -224,8 +241,21 @@ struct zNPCB_SB2 : zNPCBoss void update_slugs(F32); void render_debug(); void decompose(); + void update_turn(F32 dt); + void update_move(F32 dt); + void update_camera(F32 dt); + void update_nodes(F32 dt); void show_nodes(); + void check_life(); void ouchie(); + xSurface& create_surface(); + void init_hands(); + void init_bounds(); + void reset_bounds(); + void init_slugs(); + void scan_cronies(); + void check_hit_fail(); + void create_glow_light(); void destroy_glow_light(); void say(U32); void Render(); @@ -237,8 +267,10 @@ struct zNPCB_SB2 : zNPCBoss void activate_hand(zNPCB_SB2::hand_enum, bool); void deactivate_hand(zNPCB_SB2::hand_enum); S32 player_on_ground() const; + void emit_slug(zNPCB_SB2::slug_enum which); S32 slugs_ready() const; void reset_stage(); + void fire_slug(zNPCB_SB2::slug_enum which, zNPCB_SB2::platform_data& target); void abandon_slugs(); void set_vulnerable(bool); void say(int); @@ -251,7 +283,8 @@ struct zNPCB_SB2 : zNPCBoss struct zNPCGoalBossSB2Intro : zNPCGoalCommon { - zNPCGoalBossSB2Intro::zNPCGoalBossSB2Intro(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Intro::zNPCGoalBossSB2Intro(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -264,7 +297,8 @@ struct zNPCGoalBossSB2Intro : zNPCGoalCommon struct zNPCGoalBossSB2Idle : zNPCGoalCommon { - zNPCGoalBossSB2Idle::zNPCGoalBossSB2Idle(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Idle::zNPCGoalBossSB2Idle(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -278,7 +312,8 @@ struct zNPCGoalBossSB2Idle : zNPCGoalCommon struct zNPCGoalBossSB2Taunt : zNPCGoalCommon { - zNPCGoalBossSB2Taunt::zNPCGoalBossSB2Taunt(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Taunt::zNPCGoalBossSB2Taunt(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -291,7 +326,8 @@ struct zNPCGoalBossSB2Taunt : zNPCGoalCommon struct zNPCGoalBossSB2Dizzy : zNPCGoalCommon { - zNPCGoalBossSB2Dizzy::zNPCGoalBossSB2Dizzy(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Dizzy::zNPCGoalBossSB2Dizzy(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -305,7 +341,8 @@ struct zNPCGoalBossSB2Dizzy : zNPCGoalCommon struct zNPCGoalBossSB2Hit : zNPCGoalCommon { - zNPCGoalBossSB2Hit::zNPCGoalBossSB2Hit(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Hit::zNPCGoalBossSB2Hit(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -318,7 +355,8 @@ struct zNPCGoalBossSB2Hit : zNPCGoalCommon struct zNPCGoalBossSB2Hunt : zNPCGoalCommon { - zNPCGoalBossSB2Hunt::zNPCGoalBossSB2Hunt(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Hunt::zNPCGoalBossSB2Hunt(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -330,7 +368,8 @@ struct zNPCGoalBossSB2Hunt : zNPCGoalCommon struct zNPCGoalBossSB2Swipe : zNPCGoalCommon { - zNPCGoalBossSB2Swipe::zNPCGoalBossSB2Swipe(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Swipe::zNPCGoalBossSB2Swipe(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -350,7 +389,8 @@ struct zNPCGoalBossSB2Swipe : zNPCGoalCommon struct zNPCGoalBossSB2Chop : zNPCGoalCommon { - zNPCGoalBossSB2Chop::zNPCGoalBossSB2Chop(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Chop::zNPCGoalBossSB2Chop(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } @@ -368,10 +408,11 @@ struct zNPCGoalBossSB2Chop : zNPCGoalCommon struct zNPCGoalBossSB2Karate : zNPCGoalCommon { - zNPCGoalBossSB2Karate::zNPCGoalBossSB2Karate(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Karate::zNPCGoalBossSB2Karate(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } - + U8 emitted[3]; U8 started; zNPCB_SB2& owner; @@ -384,7 +425,8 @@ struct zNPCGoalBossSB2Karate : zNPCGoalCommon struct zNPCGoalBossSB2Death : zNPCGoalCommon { - zNPCGoalBossSB2Death::zNPCGoalBossSB2Death(S32 goalID, zNPCB_SB2& npc) : zNPCGoalCommon(goalID), owner(npc) + zNPCGoalBossSB2Death::zNPCGoalBossSB2Death(S32 goalID, zNPCB_SB2& npc) + : zNPCGoalCommon(goalID), owner(npc) { } diff --git a/src/SB/Game/zThrown.cpp b/src/SB/Game/zThrown.cpp index 4a990436..98e74b65 100644 --- a/src/SB/Game/zThrown.cpp +++ b/src/SB/Game/zThrown.cpp @@ -1,20 +1,35 @@ #include "zThrown.h" +#include "zGlobals.h" #include #include #include "zEvent.h" #include "zScene.h" -extern zThrownStruct zThrownList[0x20]; -extern ThrowableStats zThrowableModels[23]; -extern U32 zThrownCount; -extern U32 sFruitIsFreezy; -extern U32 sDebugDepth; -extern CarryableStats c_fruit; -extern U32 sThrowButtonMask; -extern F32 _842; // 0.5f -extern F32 _844; // 0.0f +#include "xMathInlines.h" + +zThrownStruct zThrownList[32]; +LaunchStats l_normal; +ThrowableStats zThrowableModels[23]; +U32 zThrownCount; +U32 sFruitIsFreezy; +U32 sDebugDepth; +CarryableStats c_fruit; +U32 sThrowButtonMask; + +void zThrown_Setup(zScene* sc) +{ + ThrowableStats* stats; + char tmpstr[256]; + + F32 airTime; + + c_fruit.killTimer = globals.player.carry.fruitLifetime; + airTime = xsqrt((2.0f * globals.player.carry.throwHeight) / globals.player.carry.throwGravity); + globals.player.carry.throwDistance = globals.player.carry.throwGravity * airTime; + l_normal.throwSpeedXZ = globals.player.carry.throwDistance / (2.0f * airTime); +} void zThrown_AddTempFrame(zThrownStruct* thrown) { @@ -60,6 +75,33 @@ void zThrown_PatrickLauncher(xEnt* ent, xEnt* launcher) } } +void zThrown_Remove(class xEnt* ent) +{ + U32 i; + xModelInstance* mod; + + for (i = 0; i < zThrownCount; i++) + { + } +} + +S32 zThrown_KillFruit(xEnt* ent) +{ + for (S32 i = 0; i < zThrownCount; i++) + { + if (zThrownList[i].ent == ent) + { + if (zThrownList[i].stats->carry == &c_fruit) + { + zThrownList[i].killTimer = 1e-6f; + return 1; + } + return 0; + } + } + return 0; +} + void zThrownCollide_ThrowFreeze(zThrownStruct* thrown, xEntCollis* collis, float* bounce, float* friction) { @@ -73,8 +115,8 @@ void zThrownCollide_DestructObj(zThrownStruct* thrown, xEntCollis* collis, F32* { sThrowButtonMask = 0x40; zThrownCollide_CauseDamage(thrown, collis); - *bounce = _844; - *friction = _844; + *bounce = 0.0f; + *friction = 0.0f; zEntEvent(thrown->ent, eEventDestroy); } @@ -83,16 +125,16 @@ void zThrownCollide_BSandyHead(zThrownStruct* thrown, xEntCollis* collis, F32* b { sThrowButtonMask = 0x40; zThrownCollide_CauseDamage(thrown, collis); - *bounce = _844; - *friction = _844; + *bounce = 0.0f; + *friction = 0.0f; } void zThrownCollide_Tiki(zThrownStruct* thrown, xEntCollis* collis, F32* bounce, F32* friction) { sThrowButtonMask = 0x40; zThrownCollide_CauseDamage(thrown, collis); - *bounce = _844; - *friction = _844; + *bounce = 0.0f; + *friction = 0.0f; zEntEvent(thrown->ent, eEventDestroy); } @@ -116,6 +158,20 @@ S32 zThrown_IsFruit(xEnt* ent, F32* stackHeight) return 0; } +S32 zThrown_IsStacked(xEnt* ent) +{ + for (S32 i = 0; i < zThrownCount; i++) + { + if ((zThrownList[i].stackEnt == ent) || + (zThrownList[i].stackEnt != 0 && (zThrownList[i].ent == ent))) + { + return 1; + } + } + + return 0; +} + void checkAgainstButtons(xEnt* ent) { struct diff --git a/src/SB/Game/zThrown.h b/src/SB/Game/zThrown.h index b31452a2..b02a9eb9 100644 --- a/src/SB/Game/zThrown.h +++ b/src/SB/Game/zThrown.h @@ -61,6 +61,7 @@ void zThrown_PatrickLauncher(xEnt* ent, xEnt* launcher); S32 zThrownCollide_CauseDamage(zThrownStruct* thrown, xEntCollis* collis); void zThrownCollide_ThrowFruit(zThrownStruct* thrown, xEntCollis* collis, F32* bounce, F32* friction); +S32 zThrown_KillFruit(xEnt* ent); void zThrownCollide_ThrowFreeze(zThrownStruct* thrown, xEntCollis* collis, F32* bounce, F32* friction); void zThrownCollide_DestructObj(zThrownStruct* thrown, xEntCollis* collis, F32* bounce, @@ -70,6 +71,7 @@ void zThrownCollide_BSandyHead(zThrownStruct* thrown, xEntCollis* collis, F32* b void zThrownCollide_Tiki(zThrownStruct* thrown, xEntCollis* collis, F32* bounce, F32* friction); void zThrown_AddFruit(xEnt* ent); S32 zThrown_IsFruit(xEnt* ent, F32* stackHeight); +S32 zThrown_IsStacked(xEnt* ent); void checkAgainstButtons(xEnt* ent); xBase* zThrown_ButtonIteratorCB(xBase* b, zScene* scn, void* user); void xDrawSphere(const xSphere* s, U32 unk);