#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include "sys.h"
#include "sf64object.h"
#include "sf64player.h"
#include "sf64mesg.h"
#include "fox_hud.h"

// fox_360
void AllRange_FortunaIntro(Player*);
void AllRange_GetStarWolfHits(Actor*);
void AllRange_DrawCountdown(void);
void BoBase_Update(Boss*);
void BoBase_Draw(Boss*);
void BoBaseShield_Update(Boss*);
void BoBaseShield_Draw(Boss*);
void BoShieldReactor_Update(Actor*);
void BoShieldReactor_Draw(Actor*);
void BoLaserCannon_Update(Actor*);
void BoLaserCannon_Draw(Actor*);
bool AllRange_PlayMessage(u16*, RadioCharacterId);
void AllRange_GreatFoxRepair(Player*);
void AllRange_ClearRadio(void);
void ActorAllRange_SetShadowData(Actor* this);
void ActorAllRange_SpawnTeam(void);
void ActorAllRange_PlayMessage(u16* msg, RadioCharacterId character);
void ActorAllRange_UpdateStarWolfEvents(Actor*);
void ActorAllRange_UpdateEnemyEvents(Actor*);
void ActorAllRange_ApplyDamage(Actor*);
bool func_360_80031900(Actor*);
void ActorAllRange_Update(Actor* this);
void ActorAllRange_Draw(Actor* this);

//fox_beam
void PlayerShot_CollisionCheck(PlayerShot* shot);
void PlayerShot_Impact(PlayerShot* shot);
void PlayerShot_SpawnEffect351(f32 xPos, f32 yPos, f32 zPos);
void PlayerShot_Initialize(PlayerShot*);
void PlayerShot_SpawnEffect344(f32, f32, f32, f32, f32, f32, f32, f32, f32, s32, s32);
void PlayerShot_UpdateAll(void);
void PlayerShot_DrawAll(void);

// fox_bg
void Background_DrawStarfield(void);
void Background_DrawPartialStarfield(s32, s32);
void Background_DrawBackdrop(void);
void Background_DrawSun(void);
void Background_DrawLensFlare(void);
void Background_dummy_80040CDC(void);
void Background_DrawGround(void);

// fox_boss
void Boss_AwardBonus(Boss* this);
void Boss299_Init(Boss* boss);
void Boss299_Update(Boss* boss);
void Boss299_Draw(Boss* boss);
void Boss300_Init(Boss* boss);
void Boss300_Update(Boss* boss);
void Boss300_Draw(Boss* boss);
void Boss_SpawnDebris(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, s32, s32);
void Boss_CompleteLevel(Player* player, f32 xPos, f32 yPos, f32 zPos);

// fox_tank
void Player_UpdateTankCamOnRails(Player* player);
void func_tank_800444BC(Player* player);
void func_tank_80044868(Player*);
void func_tank_80045130(Player*);
void func_tank_80045678(Player*);
void func_tank_80045E7C(Player*);
void Tank_UpdateOnRails(Player* player);
void func_tank_80046358(Player*);

// fox_demo
void Cutscene_KillPlayer(Player*);
void func_demo_80048AC0(TeamId teamId);
void Cutscene_EnterWarpZone(Player*);
void Cutscene_LevelStart(Player*);
void func_demo_8004AA84(void);
void Cutscene_AllRangeMode(Player*);
void Cutscene_LevelComplete(Player*);
void Cutscene_UTurn(Player*);
void Cutscene_KillPlayer(Player* player);
void Cutscene_PlayerDown(Player*);
void ActorCutscene_Update(Actor*);
void ActorCutscene_Draw(Actor*);
void Cutscene_DrawGreatFox(void);

// fox_display
void Display_ArwingWings(ArwingInfo*);
void Display_DrawEngineGlow(EngineGlowColor);
void Display_SetupPlayerSfxPos(Player*);
void Display_Update(void);

// fox_edata
void Ve1Wall1_Draw(Scenery*);
void Ve1Wall2_Draw(Scenery*);
void Object_ApplyWaterDistortion(void);
void AndJamesTrigger_Draw(Actor*);

// fox_edisplay
void Graphics_SetScaleMtx(f32);
void Sprite168_Draw(Sprite*);
void MeteoBall_Draw(Actor*);
void MeHopBot_Draw(Actor*);
void MeteoTunnel_Draw(Scenery*);
void Scenery_DrawTitaniaBones(Scenery*);
void CoIBeam_Draw(Scenery*);
void CoMoleMissile_Draw(CoMoleMissile*);
void Sprite167_Draw(Sprite*);
void FogShadow_Draw(Sprite*);
void CoBuilding9_Draw(Scenery*);
void CoBuilding10_Draw(Scenery*);
void ActorDebris_Draw(Actor*);
void Actor_DrawEngineAndContrails(Actor*);
void Actor_DrawEngineGlow(Actor*, EngineGlowColor);
void ActorTeamArwing_Draw(Actor*);
void MeMolarRock_Draw(Actor*);
void MeMeteor2_Draw(MeMeteor2*);
void MeLaserCannon1_Draw(MeLaserCannon1*);
void ActorMissileSeek_Draw(Actor*);
void CoSkibot_Draw(CoSkibot*);
void CoRadar_Draw(CoRadar*);
void ItemCheckpoint_Draw(Item*);
void ItemSilverRing_Draw(Item*);
void ItemSilverStar_Draw(Item*);
void ItemGoldRing_Draw(Item*);
void ItemBomb_Draw(Item*);
void ItemLasers_Draw(Item*);
void ItemMeteoWarp_Draw(Item*);
void Object_ClampSfxSource(f32*);
void Object_SetSfxSourceToPos(f32*, Vec3f*);
void Object_UpdateSfxSource(f32*);
void Object_SetSfxSourceToView(f32*, Vec3f*);
void Display_SetSecondLight(Vec3f*);
bool func_edisplay_8005F9DC(Vec3f*);

// fox_enmy
void Object_Draw(s32 );
void Effect_Draw(u8 );
void TexturedLine_Draw(void);
void TexturedLine_DrawPath(s32);
void Object_PlayerSfx(f32* , u32 , s32 );
void Object_Kill(Object*, f32*);
bool func_enmy_80060FE4(Vec3f*, f32);
void Object_SetInfo(ObjectInfo* info, u32 objId);
void Scenery_Initialize(Scenery*);
void Sprite_Initialize(Sprite*);
void Actor_Initialize(Actor*);
void Boss_Initialize(Boss*);
void Item_Initialize(Item*);
void Effect_Initialize(Effect*);
void func_enmy_80061B68(void);
void func_enmy_80061CD0(void);
void func_enmy_80061E48(Actor* , f32 , f32 , f32 );
void ActorEvent_Load(Actor* , ObjectInit* , s32 );
void Object_Load(ObjectInit* , f32 , f32 , f32 , f32 );
void func_enmy_80062568(void);
void func_enmy_80062B60(f32 xPos, f32 zPos, s32 state, f32 scale);
void func_enmy_80062C38(f32, f32);
bool Object_CheckHitboxCollision(Vec3f* pos, f32* hitboxData, Object* obj, f32 xRot, f32 yRot, f32 zRot);
bool Object_CheckSingleHitbox(Vec3f*, f32*, Vec3f*);
bool Object_CheckPolyCollision(Vec3f* , Vec3f* , ObjectId , Object* );
s32 Object_CheckCollision(s32 index, Vec3f* pos, Vec3f* vel, s32 mode);
void Scenery_UpdateTitaniaBones(Scenery*);
void func_enmy_800654E4(Object*);
void ActorMissileSeek_Update(Actor*);
void func_enmy_800660F0(Actor*);
void Actor_Despawn(Actor*);
void CoSkibot_Update(CoSkibot*);
void func_enmy_8006684C(Actor*);
void CoRadar_Update(CoRadar*);
void MeMolarRock_Update(Actor*);
void func_enmy_80066C00(Scenery*);
void CoBuilding9_Update(Scenery*);
void Sprite167_Update(Sprite*);
void SceneryRotateTowardsCamera(Scenery*);
void Item_CheckBounds(Item*);
void Item_SpinPickup(Item*);
void Actor_SpawnDebris70(f32, f32, f32, f32, f32, f32, f32, f32);
void ActorSupplies_Update(Actor*);
void ActorSupplies_Draw(Actor*);
void func_enmy_80067A40(void);
void Item1up_Update(Item*);
void ItemPickup_Update(Item*);
void ItemLasers_Update(Item*);
void ItemSupplyRing_Update(Item*);
void ItemSilverStar_Update(Item*);
void ItemGoldRing_Update(Item*);
void ItemWingRepair_Update(Item*);
void ItemMeteoWarp_Update(Item*);
void ItemCheckpoint_Update(Item*);
void ItemRingCheck_Update(Item*);
void ItemPathChange_Update(Item*);
void Sprite_UpdateDoodad(Sprite*);
void Object_Dying(s32, ObjectId);
void Effect_Move(Effect*);
void Actor_Move(Actor*);
void Boss_Move(Boss*);
void Scenery_Move(Scenery*);
void Sprite_Move(Sprite*);
void Item_Move(Item*);
void Actor_Update(Actor*);
void Boss_Update(Boss*);
void Scenery_Update(Scenery*);
void Sprite_Update(Sprite*);
void Item_Update(Item*);
void Effect_Update(Effect*);
void TexturedLine_Update(TexturedLine*);
void TexturedLine_UpdateAll(void);
void Object_Update(void);

//fox_enmy2
void Actor237_Update(Actor*);
void Actor237_Draw(Actor*);
void CoWaterfall_Update(Scenery*);
void MeteoBall_Update(Actor*);
void MeHopBot_Update(Actor*);
void MeMora_Update(Actor*);
void MeMora_Dying(Actor*);
void MeMora_Draw(Actor*);
void CoIBeam_Update(Scenery*);
void CoMoleMissile_Update(CoMoleMissile*);
void ActorDebris_Update(Actor*);
void MeteoTunnel_Update(Scenery*);
void Actor_SetupPlayerShot(PlayerShotId, PlayerShot*, s32, f32, f32, f32, f32, f32, f32, f32, f32, f32);
void Actor_SpawnPlayerLaser(s32 actorId, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 xRot, f32 yRot,
                            f32 zRot);
void Actor_SpawnGreatFoxLaser(s32 actorId, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 xRot, f32 yRot,
                   f32 zRot);
void ActorEvent_SpawnEffect347(f32 xPos, f32 yPos, f32 zPos, f32 scale1);
void ActorEvent_8006F254(Actor*);
void ActorEvent_Update(Actor*);
s32 SyShipDebris_Draw(Scenery*);
void ActorEvent_Draw(Actor*);
void func_enmy2_800763A4(Actor*);
void ActorEvent_Dying(Actor*);
void TiGreatFox_Update(Actor*);
void TiGreatFox_Draw(Actor*);

// fox_effect
s32 func_effect_80081B24(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
s32 BonusText_Display(f32 xPos, f32 yPos, f32 zPos, s32 hits);
void BonusText_Update(void);
void BonusText_DrawAll(void);
Effect* Effect_Load(ObjectId objId);
void Effect_FireSmoke_Spawn2(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2);
void Effect_Effect372_Draw(Effect* );
void Effect_Effect382_Draw(Effect* );
void Effect_Effect388_Draw(Effect* );
void Effect_Effect384_Draw(Effect* );
void Effect_Effect385_Draw(Effect* );
void Effect_Effect389_Draw(Effect* );
void Effect_Effect347_Draw(Effect* );
void Effect_Effect351_Draw(Effect* );
void Effect_Clouds_Draw(Effect* );
void Effect_Effect366_Draw(Effect* );
void Effect_Effect367_Draw(Effect* );
void Effect_Effect344_Draw(Effect* );
void Effect_Effect345_Draw(Effect* );
void Effect_Effect346_Draw(Effect* );
void Effect_Effect348_Draw(Effect* );
void Effect_Effect355_Draw(Effect* );
void Effect_Effect353_Draw(Effect*);
void Effect_Effect377_Draw(Effect* );
void Effect_Effect356_Draw(Effect* );
void Effect_Effect376_Draw(Effect* );
void Effect_Effect393_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect393_Update(Effect* );
void Effect_Effect393_Draw(Effect* );
void Effect_Effect357_Spawn50(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect357_Spawn80(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect357_Spawn95(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void func_effect_80079618(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect357_Update(Effect*);
void Effect_Effect357_Draw(Effect* );
void Effect_Effect383_Update(Effect* );
void Effect_Effect383_Draw(Effect* );
void Effect_Effect383_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale1);
void Effect_SetupTimedSfxAtPos(Effect* , Vec3f* pos, u32 sfxId);
void Effect_SpawnTimedSfxAtPos(Vec3f* pos, s32 sfxId);
void Effect_TimedSfx_Update(Effect*);
bool func_effect_8007A774(Player*, Effect*, f32);
void Effect_Effect359_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale1, u8, u8, u16);
void Effect_Effect359_Update(Effect359*);
void Effect_Effect359_Draw(Effect*);
void Effect_Effect372_Update(Effect*);
void Effect_Effect372_Spawn1(f32 xPos, f32 yPos, f32 zPos, f32 scale2, f32 scale1, f32 yRot);
void Effect_Effect372_Spawn2(f32 xPos, f32 yPos, f32 zPos, f32 scale2, f32 scale1);
void Effect_Effect382_Spawn(f32 xPos, f32 zPos, f32 xVel, f32 zVel, f32 scale1);
void Effect_Effect382_Update(Effect*);
void Effect_Effect381_Update(Effect*);
void Effect_Effect381_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale1);
void Effect_Effect384_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale1, s32 );
void Effect_Effect384_Update(Effect*);
void Effect_Effect385_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale1, s32 );
void Effect_Effect385_Update(Effect*);
void Effect_Clouds_Update(Effect*);
void Effect_Effect388_Update(Effect*);
void Effect_Effect389_Update(Effect*);
void Effect_Effect347_Update(Effect*);
void Effect_Effect364_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect364_Update(Effect*);
void Effect_Effect362_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect362_Update(Effect*);
void Effect_Effect364_Draw(Effect*);
void Effect_Effect361_Update(Effect*);
void Effect_Effect360_Update(Effect*);
void Effect_Effect360_361_362_Draw(Effect*);
void Effect386_Spawn1(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2, s32 timer50);
void Effect_Effect390_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2, s32 timer50);
void Effect_Effect386_Update(Effect*);
void Effect_Effect389_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2, s32 arg7);
void Effect_Effect390_Update(Effect*);
void Effect_Effect387_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 timer50);
void Effect_Effect387_Update(Effect*);
void Effect_Effect343_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect343_Update(Effect*);
void Effect_Effect343_Draw(Effect*);
void Effect_FireSmoke_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void func_effect_8007D074(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void func_effect_8007D0E0(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void func_effect_8007D10C(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect341_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void func_effect_8007D24C(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void func_effect_8007D2C8(f32 xPos, f32 yPos, f32 zPos, f32 scale2);
void Effect_Effect339_Update(Effect*);
void Effect_FireSmoke_Draw(Effect*);
void Effect_Effect340_Update(Effect*);
void Effect_Effect341_Update(Effect*);
void Effect_Effect367_Spawn(f32 xPos, f32 yPos, f32 zPos, f32 scale2, f32 scale1, s32 timer50);
void Effect_Effect375_Update(Effect*);
void Effect_Effect375_Draw(Effect*);
void Effect_Effect374_Update(Effect*);
void Effect_Effect374_Draw(Effect*);
void Effect_Effect344_Update(Effect*);
void Effect_Effect345_Update(Effect*);
void Effect_Effect342_Update(Effect*);
void Effect_Effect342_Draw(Effect*);
void Effect_Effect351_Update(Effect*);
void Effect_Effect365_Update(Effect*);
void Effect_Effect365_Draw(Effect*);
void Effect_Effect367_Update(Effect*);
void func_effect_8007E93C(Effect* this, u32 objId, f32 xPos, f32 yPos, f32 zPos, f32 speed);
void func_effect_8007EE68(ObjectId objId, Vec3f* pos, Vec3f* rot, Vec3f* arg3, Vec3f* arg4, f32 scale2);
void func_effect_8007F04C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 unkX, f32 unkY, f32 unkZ, f32 xVel, f32 yVel, f32 zVel, f32 scale2);
void Effect_EnemyLaser(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 speed);
void func_effect_8007F20C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 speed);
void Effect_Effect346_Update(Effect*);
void Effect_Effect348_Update(Effect*);
void Effect_Effect349_Update(Effect*);
void Effect_Effect350_Update(Effect*);
void Effect_Effect353_354_Update(Effect*);
bool func_effect_8007FD84(Effect*);
void Effect_Effect355_Update(Effect*);
void Effect_Effect377_Update(Effect*);
void Effect_Effect356_Update(Effect*);
void Effect_Effect376_Update(Effect*);
void Effect_Effect398_Update(Effect*);
void Effect_Effect398_Draw(Effect*);
void Effect_Effect394_Update(Effect*);
void Effect_Effect394_Draw(Effect*);
void func_effect_800815DC(void);
void func_effect_80081A8C(f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 arg4);
void func_effect_80081BEC(f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 arg4);
void Effect_Effect395_Update(Effect*);
void Effect_Effect395_Draw(Effect*);
void Effect_Effect391_Spawn(f32, f32, f32, f32, f32);
void Effect_Effect391_Update(Effect*);
void Effect_Effect391_Draw(Effect*);
void Effect_Effect399_Setup(Effect* this, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 arg7, s32 arg8);
void func_effect_80083D2C(f32 xPos, f32 yPos, f32 zPos, f32 srcZ);
void Effect_Effect399_Update(Effect*);
void Effect_Effect399_Draw(Effect*);

// fox_fade
void Wipe_Draw(WipeMode mode, s32 frame);

// fox_hud
void HUD_TeamDownWrench_Draw(s32);
void HUD_BoostGaugeOverheat_Draw(f32, f32, f32, f32);
void HUD_BoostGaugeCool_Draw(f32, f32, f32, f32);
void HUD_TeamShields_Draw(f32, f32, s32);
void HUD_TitleCard_Draw(f32, f32);
void HUD_Number_Draw(f32, f32, s32, f32, bool, s32);
void HUD_LivesCount2_Draw(f32, f32, s32);
void HUD_SetMissionTeamStatus(void);
void HUD_Bolse_Area6_SaveData(void);
void HUD_DrawStatusScreens(void);
s32 ActorMissileSeek_ModeCheck(ActorMissileSeekMode mode);
void HUD_RadioCharacterName_Draw(void);
void HUD_PlayerShieldGauge_Draw(f32 x, f32 y);
s32 HUD_RadioDamage_Type(void);
void HUD_Texture_Scroll(u8*, s32, s32, u8);
void HUD_Texture_Wave(u16*, u16*);
void HUD_DisplaySmallNumber(f32, f32, f32, s32);
void HUD_VsModePortraitTex_Draw(f32, f32, f32, s32);
void HUD_EdgeArrows_Draw(s32, bool);
s32 HUD_CountDigits(s32);
void HUD_EdgeArrows_Update(void);
s32 HUD_8008CB8C(void);
void HUD_VS_ShieldGaugeTex_Draw(f32, f32, f32, f32, f32);
void HUD_DrawBossHealth(void);
void HUD_DrawCountdown(s32* , f32);
void HUD_Shield_GoldRings_HitPoints(f32, f32);
void HUD_BombCounter_Draw(f32, f32);
void HUD_Draw(void);
void FoBase_Draw(Boss*);
void FoBase_BurnEffects(Boss*, s32);
s32 FoBase_ExplodeCs(Boss* this);
bool ActorTeamBoss_SetTarget(Actor*);
void FoBase_Update(Boss*);
bool ActorTeamBoss_ObstacleCheck(Actor*);
bool ActorTeamBoss_SomerSault(Actor*);

void ActorTeamBoss_Init(Actor*);
void ActorTeamBoss_Update(Actor* this);
void Aquas_CsIntroActors_Update(Actor*);
void Aquas_CsLevelStart(Player*);
void Aquas_AqBump2_Setup(Actor*, s32);
void Aquas_AqCoralReef2_Setup(Actor*, s32);
void Aquas_AqRock_Setup(Actor*, s32);
void Aquas_CsLevelComplete(Player*);
void Aquas_Effect363_Update(Effect*);
void Aquas_Effect363_Draw(Effect*);
void HUD_Hitpoints_Draw(f32, f32);
void Venom1_LevelStart2(Player* player);

// fox_col1
void func_col1_80098860(PlaneF* plane, Vec3f* point, Vec3f* normal);
s32 func_col1_800988B4(Vec3f* vec, PlaneF* plane);
bool func_col1_800998FC(Vec3f* objPos, Vec3f* colliderPos, Vec3f* objVel, s32 colId, Vec3f* hitPosOut,
                        f32* hitAnglesOut);

// fox_col2
bool func_col2_800A3690(Vec3f* objPos, Vec3f* colliderPos, s32 colId, Vec3f* hitDataOut);

// fox_pause
void func_pause_800A3CA0(void);

// fox_play
bool Play_CheckMedalStatus(u16);
void Play_dummy_MuteSfx(void);
s32 Play_GetMaxShields(void);
void Play_PlaySfxFirstPlayer(f32*, u32);
void Player_SetupArwingShot(Player* player, PlayerShot* shot, f32 arg2, f32 arg3, PlayerShotId shotId, f32 speed);
void Play_Setup(void);
void Play_InitEnvironment(void);
void Play_GenerateStarfield(void);
void Play_SetupStarfield(void);
void Player_PlaySfx(f32* , u32 , s32 );
void Play_PlaySfxNoPlayer(f32* , u32 );
void Play_ClearObjectData(void);
void Play_SpawnDebris(s32 , f32 , f32 , f32 );
void Player_ApplyDamage(Player* player, s32 direction, s32 damage);
bool Play_CheckDynaFloorCollision(f32* floorHeight, s32* triangleIndex, f32 xPos, f32 yPos, f32 zPos);
bool Play_CheckSingleHitbox(Hitbox* hitbox, f32 , f32 , f32 , f32 , f32 , f32 );
void Player_CollisionCheck(Player* player);
void Player_FloorCheck(Player* player);
void Player_SetupOnFootShot(Player*, PlayerShot*, PlayerShotId );
void Player_Setup(Player*);
void Player_Update360(Player*);
void Play_InitLevel(void);
void Player_InitVersus(void);
void Player_CheckBounds360(Player*);
void Player_UpdateArwingRoll(Player*);
void Player_ArwingBoost(Player*);
void Camera_UpdateArwingOnRails(Player*);
void Camera_UpdateCockpitOnRails(Player*, s32);
void Camera_FollowPlayer(Player*, s32 , bool);
void Camera_UpdateArwing360(Player*, bool);
void Camera_UpdateTank360(Player*, s32 );
void Camera_UpdateOnFoot360(Player*, s32 );
void Camera_SetStarfieldPos(f32, f32, f32, f32, f32, f32);
void Camera_Update360(Player*, bool);
void Camera_SetupLights(Player*);
void Play_SpawnVsItem(ObjectId , Item*);
void Play_Main(void);
void Play_SpawnHitmark(f32 xPos, f32 yPos, f32 zPos);
void Player_Shoot(Player* player);
void Player_UpdatePath(Player* player);
void Player_LowHealthAlarm(Player* player);
void Play_dummy_800B41E0(Player* player);
void Player_Down(Player* player);
void Player_DamageEffects(Player* player);
void Player_CheckItemCollect(Player* player);
void Player_UpdateHitbox(Player* player);
s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot,
                  f32 zRot, f32 arg9, f32 argA, f32 argB);
bool Play_CheckPolyCollision(ObjectId objId, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, Vec3f* arg7, Vec3f* arg8);
void Scenery360_Initialize(Scenery360*);

// fox_versus
s32 Versus_Main(void);
void Versus_Draw(void);
void Versus_StartMatch(void);
void func_versus_800C2190(void);
void func_versus_800C26C8(void);

void OvlMenu_CallFunction(u32, void*);
void Map_Main(void);

void Ending_Main(void);
void Ending_Draw(void);

// sf_i5_5
bool Ground_801B49D0(Actor* actor);

// libultra
void gSPSegmentLoadRes(void* value, int segNum, uintptr_t target);
void gSPDisplayList(Gfx* pkt, Gfx* dl);
void gSPDisplayListOffset(Gfx* pkt, Gfx* dl, int offset);
void gSPVertex(Gfx* pkt, uintptr_t v, int n, int v0);
void gSPInvalidateTexCache(Gfx* pkt, uintptr_t texAddr);

#endif
