summaryrefslogtreecommitdiff
path: root/src/engine/fox_play.c
diff options
context:
space:
mode:
authorAlejandro Asenjo Nitti <96613413+sonicdcer@users.noreply.github.com>2024-08-12 11:58:54 -0300
committerGitHub <noreply@github.com>2024-08-12 11:58:54 -0300
commit0251769d1699b7f4bc7a6f05de6f52cf2ca4f29a (patch)
treeb4a8984774446718076fcaa8feb5c5366e741480 /src/engine/fox_play.c
parent83c54429159331ced13e2a97c3fbb17549a72b4e (diff)
General docs (#269)
* fox_display.c DOCS * PRINTF * actor->destroy boolean * corneria docs * Boss->unk_04C to Boss->animFrame * aCoGrangaWalkingAnim * more corneria docs * Spawner * Spawner code refined * Spawner description * Actor Spawn guard * Molar Rock (name by @inspectredc) * more docs * actor docs * initial disassembly config for lodgenet * correct vram addresses for lodgenet * Actor Docs * More actor docs * more actor docs * correction * correction * more actor docs * Preliminary work for Effect documentation * Change Init for Setup * fox_play cleanup and defake * fox_zo function names * fox_so function renaming * more object docs * venom 1 actors * actor docs * some fox_bo docs * some fox_fo corrections * fox_ma obj->this * fox_ma renamings * fox_ma docs * fox_ti Actors * revert permuter settings to ido * some renames on fox_andross.c * fox_sy actors * object names * corrections * some effect comments * fix AudioTable struct and data to avoid UB * uintptr_t in audio * audio load changes * event id enum usage in fox_sy * clear padding in sPlaylists * HUD_FoBase_ExplodeCs * HUD
Diffstat (limited to 'src/engine/fox_play.c')
-rw-r--r--src/engine/fox_play.c1159
1 files changed, 857 insertions, 302 deletions
diff --git a/src/engine/fox_play.c b/src/engine/fox_play.c
index 6651bf43..7fc39ca5 100644
--- a/src/engine/fox_play.c
+++ b/src/engine/fox_play.c
@@ -86,6 +86,7 @@ void Play_UpdateDynaFloor(void) {
f32 sp84;
gDynaFloorTimer++;
+
switch (gCurrentLevel) {
case LEVEL_SOLAR:
if ((gGameFrameCount % 2) != 0) {
@@ -100,6 +101,7 @@ void Play_UpdateDynaFloor(void) {
sp88 = 2.2f;
sp84 = 0.5f;
break;
+
case LEVEL_ZONESS:
if ((gGameFrameCount % 2) != 0) {
spB4 = SEGMENTED_TO_VIRTUAL(D_ZO_6009ED0);
@@ -114,29 +116,38 @@ void Play_UpdateDynaFloor(void) {
sp84 = 2.0f;
break;
}
+
var_s3 = D_ctx_801782CC;
var_s5 = D_ctx_801782D4;
var_s4 = D_ctx_801782DC;
var_s0 = D_ctx_801782E4;
var_s1 = D_ctx_801782EC;
+
for (i = 0; i < 17 * 17; i++, var_s3++, var_s5++, var_s4++, var_s0++, var_s1++, spB0++) {
Math_SmoothStepToF(var_s3, *var_s5, sp8C, *var_s4, 0.0f);
Math_SmoothStepToF(var_s4, 100.0f, 1.0f, sp84, 0.0f);
+
if ((gDynaFloorTimer & spA8) == (i & spA8)) {
*var_s5 = RAND_FLOAT(sp90);
*var_s4 = 0.0f;
}
+
*var_s0 += *var_s1;
*var_s1 -= 0.5f;
if (*var_s0 < 0.0f) {
*var_s1 = *var_s0 = 0.0f;
}
+
spB4[*spB0].n.ob[1] = (s16) *var_s3 + (s16) *var_s0;
+
Matrix_RotateZ(gCalcMatrix, *var_s3 * sp88 * M_DTOR, MTXF_NEW);
+
spC4.x = 120.0f;
spC4.y = 0.0f;
spC4.z = 0.0f;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &spC4, &spB8);
+
spB4[*spB0].n.n[0] = spB8.x;
spB4[*spB0].n.n[1] = spB8.y;
spB4[*spB0].n.n[2] = spB8.z;
@@ -154,6 +165,7 @@ void Player_WingEffects(Player* player) {
player->xRock = SIN_DEG(player->rockPhase * 0.7f) * 0.5f;
player->bobPhase += 10.0f;
player->rockPhase += 8.0f;
+
if ((gLevelType == LEVELTYPE_PLANET) ||
((player->alternateView == true) && (gLevelMode == LEVELMODE_ON_RAILS))) {
player->yBob = -SIN_DEG(player->bobPhase) * 0.5f;
@@ -177,9 +189,9 @@ void Player_DamageEffects(Player* player) {
player->hit1.z, 1.0f);
}
if (((gGameFrameCount % 2U) == 0) && (Rand_ZeroOne() < 0.5f) && !gVersusMode) {
- func_effect_8007C484(RAND_FLOAT_CENTERED(5.0f) + player->hit1.x, RAND_FLOAT(5.0f) + player->hit1.y,
- player->hit1.z, player->vel.x, player->vel.y, player->vel.z,
- RAND_FLOAT(0.02f) + 0.02f, player->num + 1);
+ Effect_Effect389_Spawn(RAND_FLOAT_CENTERED(5.0f) + player->hit1.x, RAND_FLOAT(5.0f) + player->hit1.y,
+ player->hit1.z, player->vel.x, player->vel.y, player->vel.z,
+ RAND_FLOAT(0.02f) + 0.02f, player->num + 1);
}
}
if (player->wings.leftState <= WINGSTATE_BROKEN) {
@@ -188,12 +200,13 @@ void Player_DamageEffects(Player* player) {
player->hit2.z, 1.0f);
}
if (((gGameFrameCount % 2U) == 0) && (Rand_ZeroOne() < 0.5f) && !gVersusMode) {
- func_effect_8007C484(RAND_FLOAT_CENTERED(5.0f) + player->hit2.x, RAND_FLOAT(5.0f) + player->hit2.y,
- player->hit2.z, player->vel.x, player->vel.y, player->vel.z,
- RAND_FLOAT(0.02f) + 0.02f, player->num + 1);
+ Effect_Effect389_Spawn(RAND_FLOAT_CENTERED(5.0f) + player->hit2.x, RAND_FLOAT(5.0f) + player->hit2.y,
+ player->hit2.z, player->vel.x, player->vel.y, player->vel.z,
+ RAND_FLOAT(0.02f) + 0.02f, player->num + 1);
}
}
}
+
var_v1 = 7;
if (player->shields < 64) {
if (player->shields > 16) {
@@ -205,21 +218,23 @@ void Player_DamageEffects(Player* player) {
if (player->shields > 48) {
var_v1 = 64 - 1;
}
+
if (!player->alternateView || (gLevelMode == LEVELMODE_ALL_RANGE)) {
sp40 = 0.0f;
if (player->form == FORM_LANDMASTER) {
sp40 = 30.0f;
}
+
if ((gGameFrameCount & var_v1) == 0) {
func_effect_8007D10C(player->pos.x + RAND_FLOAT_CENTERED(10.0f),
player->pos.y + sp40 + RAND_FLOAT(10.0f),
player->trueZpos + RAND_FLOAT_CENTERED(10.0f), 2.2f);
}
if (((gGameFrameCount & (var_v1 >> 2)) == 0) && (Rand_ZeroOne() < 0.5f)) {
- func_effect_8007C484(player->pos.x + RAND_FLOAT_CENTERED(30.0f),
- player->pos.y + sp40 + RAND_FLOAT(10.0f),
- player->trueZpos + RAND_FLOAT_CENTERED(30.0f), player->vel.x, player->vel.y,
- player->vel.z, 0.04f + RAND_FLOAT(0.03f), player->num + 1);
+ Effect_Effect389_Spawn(player->pos.x + RAND_FLOAT_CENTERED(30.0f),
+ player->pos.y + sp40 + RAND_FLOAT(10.0f),
+ player->trueZpos + RAND_FLOAT_CENTERED(30.0f), player->vel.x, player->vel.y,
+ player->vel.z, 0.04f + RAND_FLOAT(0.03f), player->num + 1);
if (player->dmgEffectTimer == 0) {
player->dmgEffectTimer = 2;
}
@@ -239,22 +254,26 @@ void Player_WaterEffects(Player* player) {
if (gGroundSurface == SURFACE_WATER) {
Matrix_Translate(gCalcMatrix, player->pos.x, player->pos.y, player->trueZpos, MTXF_NEW);
+
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + 180.0f) * M_DTOR, MTXF_APPLY);
Matrix_RotateX(gCalcMatrix, -((player->rot.x + player->aerobaticPitch) * M_DTOR), MTXF_APPLY);
Matrix_RotateZ(gCalcMatrix, -(player->bankAngle * M_DTOR), MTXF_APPLY);
+
Matrix_MultVec3f(gCalcMatrix, &sp54, &sp3C);
Matrix_MultVec3f(gCalcMatrix, &sp48, &sp30);
+
if (player->pos.y < (gGroundHeight + 100.0f)) {
if ((sp3C.y < gGroundHeight + 80.0f) && ((gGameFrameCount % 2) == 0)) {
if (sPlayWingSplashSfx) {}
- func_effect_8007ACE0(sp3C.x, gGroundHeight, sp3C.z, 0.1f, 2.0f,
- player->rot.y + player->yRot_114 + 20.0f);
+ Effect_Effect372_Spawn1(sp3C.x, gGroundHeight, sp3C.z, 0.1f, 2.0f,
+ player->rot.y + player->yRot_114 + 20.0f);
}
if ((sp30.y < gGroundHeight + 80.0f) && ((gGameFrameCount % 2) == 0)) {
- func_effect_8007ACE0(sp30.x, gGroundHeight, sp30.z, 0.1f, 2.0f,
- player->rot.y + player->yRot_114 - 20.0f);
+ Effect_Effect372_Spawn1(sp30.x, gGroundHeight, sp30.z, 0.1f, 2.0f,
+ player->rot.y + player->yRot_114 - 20.0f);
}
}
+
if ((sp30.y < gGroundHeight + 80.0f) || (sp3C.y < gGroundHeight + 80.0f)) {
if (!sPlayWingSplashSfx) {
sPlayWingSplashSfx = true;
@@ -300,6 +319,7 @@ void Play_InitVsStage(void) {
}
break;
}
+
for (i = 0, j = 0; i < 199; j++) {
if (gLevelObjects[j].id <= OBJ_INVALID) {
break;
@@ -315,6 +335,7 @@ void Play_InitVsStage(void) {
i++;
}
}
+
for (i = 5, j = 0; i < 199; j++) {
if (gLevelObjects[j].id <= OBJ_INVALID) {
break;
@@ -337,25 +358,25 @@ void Play_dummy_800A5330(void) {
}
void Play_Setup360_CO(void) {
- Sprite* sprite;
+ Boss* boss = &gBosses[0];
Scenery360* scenery360;
+ Sprite* sprite;
s32 i;
- s32 j;
gLevelObjects = SEGMENTED_TO_VIRTUAL(aCoAllRangeLevelObjects);
- for (j = 0, scenery360 = gScenery360; j < 200; j++) {
- if (gLevelObjects[j].id <= OBJ_INVALID) {
+ for (i = 0, scenery360 = gScenery360; i < 200; i++) {
+ if (gLevelObjects[i].id <= OBJ_INVALID) {
break;
}
- if (gLevelObjects[j].id < OBJ_SCENERY_MAX) {
+ if (gLevelObjects[i].id < OBJ_SCENERY_MAX) {
Scenery360_Initialize(scenery360);
scenery360->obj.status = OBJ_ACTIVE;
- scenery360->obj.id = gLevelObjects[j].id;
- scenery360->obj.pos.x = gLevelObjects[j].xPos;
- scenery360->obj.pos.z = gLevelObjects[j].zPos1;
- scenery360->obj.pos.y = gLevelObjects[j].yPos;
- scenery360->obj.rot.y = gLevelObjects[j].rot.y;
+ scenery360->obj.id = gLevelObjects[i].id;
+ scenery360->obj.pos.x = gLevelObjects[i].xPos;
+ scenery360->obj.pos.z = gLevelObjects[i].zPos1;
+ scenery360->obj.pos.y = gLevelObjects[i].yPos;
+ scenery360->obj.rot.y = gLevelObjects[i].rot.y;
Object_SetInfo(&scenery360->info, scenery360->obj.id);
if (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_1) {
scenery360->info.dList = D_CO_6020760;
@@ -364,90 +385,92 @@ void Play_Setup360_CO(void) {
}
}
- for (j = 0, sprite = gSprites; j < ARRAY_COUNT(gSprites); j++) {
- if (gLevelObjects[j].id <= OBJ_INVALID) {
+ for (i = 0, sprite = gSprites; i < ARRAY_COUNT(gSprites); i++) {
+ if (gLevelObjects[i].id <= OBJ_INVALID) {
break;
}
- if (gLevelObjects[j].id == OBJ_SPRITE_CO_TREE) {
+ if (gLevelObjects[i].id == OBJ_SPRITE_CO_TREE) {
Sprite_Initialize(sprite);
sprite->obj.status = OBJ_INIT;
- sprite->obj.id = gLevelObjects[j].id;
- sprite->obj.pos.x = gLevelObjects[j].xPos;
- sprite->obj.pos.z = gLevelObjects[j].zPos1;
- sprite->obj.pos.y = gLevelObjects[j].yPos;
+ sprite->obj.id = gLevelObjects[i].id;
+ sprite->obj.pos.x = gLevelObjects[i].xPos;
+ sprite->obj.pos.z = gLevelObjects[i].zPos1;
+ sprite->obj.pos.y = gLevelObjects[i].yPos;
Object_SetInfo(&sprite->info, sprite->obj.id);
sprite++;
}
}
- i = 0; // fake?
- Boss_Initialize(&gBosses[i]);
- gBosses[i].obj.status = OBJ_INIT;
- gBosses[i].obj.pos.x = 0.0f;
- gBosses[i].obj.pos.y = 0.0f;
- gBosses[i].obj.pos.z = 0.0f;
- gBosses[i].obj.id = OBJ_BOSS_CO_GRANGA;
- Object_SetInfo(&gBosses[i].info, gBosses[i].obj.id);
+
+ Boss_Initialize(&boss[0]);
+ boss[0].obj.status = OBJ_INIT;
+ boss[0].obj.pos.x = 0.0f;
+ boss[0].obj.pos.y = 0.0f;
+ boss[0].obj.pos.z = 0.0f;
+ boss[0].obj.id = OBJ_BOSS_CO_GRANGA;
+ Object_SetInfo(&boss[0].info, boss[0].obj.id);
}
void Play_Setup360_SY(void) {
+ Boss* boss = &gBosses[0];
Scenery360* scenery360;
s32 i;
- s32 j;
gLevelObjects = SEGMENTED_TO_VIRTUAL(D_SY_6030B14);
- for (j = 0, scenery360 = gScenery360; j < 200; j++) {
- if (gLevelObjects[j].id <= OBJ_INVALID) {
+ for (i = 0, scenery360 = gScenery360; i < 200; i++) {
+ if (gLevelObjects[i].id <= OBJ_INVALID) {
break;
}
- if (gLevelObjects[j].id < OBJ_SCENERY_MAX) {
+ if (gLevelObjects[i].id < OBJ_SCENERY_MAX) {
Scenery360_Initialize(scenery360);
scenery360->obj.status = OBJ_ACTIVE;
- scenery360->obj.id = gLevelObjects[j].id;
- scenery360->obj.pos.x = gLevelObjects[j].xPos;
- scenery360->obj.pos.z = gLevelObjects[j].zPos1;
- scenery360->obj.pos.y = gLevelObjects[j].yPos;
- scenery360->obj.rot.y = gLevelObjects[j].rot.y;
+ scenery360->obj.id = gLevelObjects[i].id;
+ scenery360->obj.pos.x = gLevelObjects[i].xPos;
+ scenery360->obj.pos.z = gLevelObjects[i].zPos1;
+ scenery360->obj.pos.y = gLevelObjects[i].yPos;
+ scenery360->obj.rot.y = gLevelObjects[i].rot.y;
Object_SetInfo(&scenery360->info, scenery360->obj.id);
scenery360++;
}
}
- i = 0; // fake?
- Boss_Initialize(&gBosses[i]);
- gBosses[i].obj.status = OBJ_INIT;
- gBosses[i].obj.pos.x = 0.0f;
- gBosses[i].obj.pos.y = 0.0f;
- gBosses[i].obj.pos.z = 0.0f;
- gBosses[i].obj.id = OBJ_BOSS_SY;
- Object_SetInfo(&gBosses[i].info, gBosses[i].obj.id);
- i = 1;
- Boss_Initialize(&gBosses[i]);
- gBosses[i].obj.status = OBJ_INIT;
- gBosses[i].obj.pos.x = 0.0f;
- gBosses[i].obj.pos.y = 0.0f;
- gBosses[i].obj.pos.z = 0.0f;
- gBosses[i].obj.id = OBJ_BOSS_SY;
- Object_SetInfo(&gBosses[i].info, gBosses[i].obj.id);
- i = 2;
- Boss_Initialize(&gBosses[i]);
- gBosses[i].obj.status = OBJ_INIT;
- gBosses[i].obj.pos.x = 0.0f;
- gBosses[i].obj.pos.y = 0.0f;
- gBosses[i].obj.pos.z = 0.0f;
- gBosses[i].obj.id = OBJ_BOSS_SY;
- Object_SetInfo(&gBosses[i].info, gBosses[i].obj.id);
+
+ Boss_Initialize(&boss[0]);
+ boss[0].obj.status = OBJ_INIT;
+ boss[0].obj.pos.x = 0.0f;
+ boss[0].obj.pos.y = 0.0f;
+ boss[0].obj.pos.z = 0.0f;
+ boss[0].obj.id = OBJ_BOSS_SY_SHOGUN;
+ Object_SetInfo(&boss[0].info, boss[0].obj.id);
+
+ Boss_Initialize(&boss[1]);
+ boss[1].obj.status = OBJ_INIT;
+ boss[1].obj.pos.x = 0.0f;
+ boss[1].obj.pos.y = 0.0f;
+ boss[1].obj.pos.z = 0.0f;
+ boss[1].obj.id = OBJ_BOSS_SY_SHOGUN;
+ Object_SetInfo(&boss[1].info, boss[1].obj.id);
+
+ Boss_Initialize(&boss[2]);
+ boss[2].obj.status = OBJ_INIT;
+ boss[2].obj.pos.x = 0.0f;
+ boss[2].obj.pos.y = 0.0f;
+ boss[2].obj.pos.z = 0.0f;
+ boss[2].obj.id = OBJ_BOSS_SY_SHOGUN;
+ Object_SetInfo(&boss[2].info, boss[2].obj.id);
}
void Play_Setup360_AND(void) {
- s32 i = 0; // fake?
-
- Boss_Initialize(&gBosses[i]);
- gBosses[i].obj.status = OBJ_INIT;
- gBosses[i].obj.pos.x = 0.0f;
- gBosses[i].obj.pos.y = 0.0f;
- gBosses[i].obj.pos.z = 0.0f;
- gBosses[i].obj.id = OBJ_BOSS_321;
- Object_SetInfo(&gBosses[i].info, gBosses[i].obj.id);
+ Boss* boss = &gBosses[0];
+
+ Boss_Initialize(boss);
+ boss->obj.status = OBJ_INIT;
+
+ boss->obj.pos.x = 0.0f;
+ boss->obj.pos.y = 0.0f;
+ boss->obj.pos.z = 0.0f;
+
+ boss->obj.id = OBJ_BOSS_AND_BRAIN;
+ Object_SetInfo(&boss->info, boss->obj.id);
}
void Play_Setup(void) {
@@ -500,6 +523,7 @@ void Play_InitEnvironment(void) {
} else {
sEnvironment = SEGMENTED_TO_VIRTUAL(D_800D2F98[gCurrentLevel]);
}
+
if (!D_ctx_8017782C) {
if (gCurrentLevel == LEVEL_SOLAR) {
Audio_SetHeatAlarmParams(255, 1);
@@ -509,6 +533,7 @@ void Play_InitEnvironment(void) {
} else if (gCurrentLevel == LEVEL_AQUAS) {
sEnvironment = SEGMENTED_TO_VIRTUAL(&D_AQ_602E584);
}
+
gBgmSeqId = sEnvironment->seqId;
gLevelType = sEnvironment->type;
gGroundType = sEnvironment->unk04;
@@ -518,15 +543,19 @@ void Play_InitEnvironment(void) {
gFogBlue = sEnvironment->fogB;
gFogNear = sEnvironment->fogN;
gFogFar = sEnvironment->fogF;
+
gLight1R = gLight2R = D_ctx_80161A70 = sEnvironment->lightR;
gLight1G = gLight2G = D_ctx_80161A74 = sEnvironment->lightG;
gLight1B = gLight2B = D_ctx_80161A78 = sEnvironment->lightB;
+
gAmbientR = sEnvironment->ambR;
gAmbientG = sEnvironment->ambG;
gAmbientB = sEnvironment->ambB;
+
gEnvLightxRot = gLight2xRotTarget = D_ctx_80178520 = gLight1xRot = gLight1xRotTarget = sEnvironment->lightDir.x;
gEnvLightyRot = gLight2yRotTarget = D_ctx_80178524 = gLight1yRot = gLight1yRotTarget = sEnvironment->lightDir.y;
gEnvLightzRot = gLight2zRotTarget = D_ctx_80178528 = gLight1zRot = gLight1zRotTarget = sEnvironment->lightDir.z;
+
gProjectFar = 12800.0f;
gLight2colorStep = 40;
D_ctx_80178544 = 40;
@@ -539,7 +568,9 @@ void Play_GenerateStarfield(void) {
MEM_ARRAY_ALLOCATE(gStarOffsetsX, 1000);
MEM_ARRAY_ALLOCATE(gStarOffsetsY, 1000);
MEM_ARRAY_ALLOCATE(gStarFillColors, 1000);
+
Rand_SetSeed(1, 29000, 9876);
+
for (i = 0; i < 1000; i++) {
gStarOffsetsX[i] = RAND_FLOAT_SEEDED(480.0f) - 80.0f;
gStarOffsetsY[i] = RAND_FLOAT_SEEDED(360.0f) - 60.0f;
@@ -551,6 +582,7 @@ void Play_SetupStarfield(void) {
Play_GenerateStarfield();
gGroundHeight = -25000.0f;
gStarCount = 600;
+
if (gCurrentLevel == LEVEL_AREA_6) {
gStarCount = 300;
}
@@ -659,17 +691,19 @@ void Play_ClearObjectData(void) {
Object_Kill(&gPlayerShots[i].obj, gPlayerShots[i].sfxSource);
PlayerShot_Initialize(&gPlayerShots[i]);
}
+
gDrawSmallRocks = D_ctx_801782BC = D_ctx_801782C0 = D_ctx_801782D0 = gBossActive = gKillEventActors =
gGroundClipMode = gPrevEventActorIndex = gFormationLeaderIndex = gRingPassCount = 0;
gFormationInitPos.x = gFormationInitPos.y = gFormationInitPos.z = gFormationInitRot.x = gFormationInitRot.y =
gFormationInitRot.z = 0.0f;
+
for (i = 0; i < ARRAY_COUNT(gTeamArrowsViewPos); i++) {
gTeamArrowsViewPos[i].x = gTeamArrowsViewPos[i].y = gTeamArrowsViewPos[i].z = 100.0f;
}
- for (i = 0; i < ARRAY_COUNT(gActor194yPos); i++) {
- gActor194Status[i] = 0;
- for (j = 0; j < ARRAY_COUNT(*gActor194yPos); j++) {
- gActor194yPos[i][j] = -5000.0f;
+ for (i = 0; i < ARRAY_COUNT(gMeMoraYpos); i++) {
+ gMeMoraStatus[i] = 0;
+ for (j = 0; j < ARRAY_COUNT(*gMeMoraYpos); j++) {
+ gMeMoraYpos[i][j] = -5000.0f;
}
}
}
@@ -688,8 +722,10 @@ void Play_UpdateFillScreen(void) {
}
}
}
+
gFillScreenAlphaStep = 16;
Math_SmoothStepToF(&gLight3Brightness, 0.0f, 1.0f, 0.04f, 0.001f);
+
if (gScreenFlashTimer != 0) {
gScreenFlashTimer--;
if ((gScreenFlashTimer & 2) != 0) {
@@ -728,6 +764,7 @@ void Play_SetupDebris(Actor* actor, s32 state, f32 xPos, f32 yPos, f32 zPos) {
actor->obj.pos.y = yPos;
actor->obj.pos.z = zPos;
actor->gravity = 0.5f;
+
if ((state == 0) || (state == 1)) {
actor->vel.y = RAND_FLOAT(5.0f) + 10.0f;
actor->vel.x = 10.0f;
@@ -752,6 +789,7 @@ void Play_SetupDebris(Actor* actor, s32 state, f32 xPos, f32 yPos, f32 zPos) {
actor->timer_0BC = RAND_INT(25.0f) + 25;
actor->gravity = 0.0f;
}
+
if (state == 2) {
actor->scale = RAND_FLOAT(1.5f) + 0.75f;
} else if (state == 4) {
@@ -824,19 +862,24 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
player->dmgType = damage;
player->hitDirection = direction;
+
if ((damage == 39) || (damage == 41) || (damage == 42) || (damage == 43)) {
damage = 40;
}
+
if (gExpertMode) {
player->damage = damage * 2;
} else {
player->damage = damage;
}
+
if (player->damage != 0) {
player->radioDamageTimer = 4;
}
+
player->unk_284 = 0;
player->hitTimer = 20;
+
if (player->dmgType > 40) {
sp34 = (player->boostSpeed * 0.3f) + 20.0f;
player->mercyTimer = 5;
@@ -847,6 +890,7 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
} else {
player->mercyTimer = 20;
}
+
if (gHasShield[player->num]) {
Player_PlaySfx(player->sfxSource, NA_SE_DAMAGE_S, player->num);
gShieldTimer[player->num] = 5;
@@ -866,9 +910,12 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
Player_PlaySfx(player->sfxSource, NA_SE_DAMAGE_L, player->num);
}
}
+
Matrix_RotateY(gCalcMatrix, player->yRot_114 * M_DTOR, MTXF_NEW);
Matrix_RotateZ(gCalcMatrix, player->bankAngle * M_DTOR, MTXF_APPLY);
+
sp44.z = 0.0f;
+
switch (player->hitDirection) {
case 0:
player->dmgEffectTimer = 20;
@@ -876,10 +923,10 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
player->knockback.y = 0.f;
player->knockback.z = 0.f;
break;
+
case 1:
sp44.x = -sp34;
sp44.y = 0.0f;
-
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38);
player->knockback.x = sp38.x;
player->knockback.y = sp38.y;
@@ -887,10 +934,10 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
Play_SpawnHitmark(player->hit1.x - player->vel.x, player->hit1.y, player->hit1.z - player->vel.z);
Player_DamageWings(player, 1, 20);
break;
+
case 2:
sp44.x = sp34;
sp44.y = 0.0f;
-
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38);
player->knockback.x = sp38.x;
player->knockback.y = sp38.y;
@@ -898,6 +945,7 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
Play_SpawnHitmark(player->hit2.x - player->vel.x, player->hit2.y, player->hit2.z - player->vel.z);
Player_DamageWings(player, 2, 20);
break;
+
case 3:
player->dmgEffectTimer = 20;
Play_SpawnHitmark(player->hit4.x - player->vel.x, player->hit4.y, player->hit4.z - player->vel.z);
@@ -909,12 +957,14 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
player->knockback.y = sp38.y;
player->knockback.z = sp38.z;
}
+
if (Rand_ZeroOne() < 0.5f) {
Player_DamageWings(player, 1, 15);
} else {
Player_DamageWings(player, 2, 15);
}
break;
+
case 4:
player->dmgEffectTimer = 20;
Play_SpawnHitmark(player->hit3.x - player->vel.x, player->hit3.y, player->hit3.z - player->vel.z);
@@ -931,6 +981,7 @@ void Player_ApplyDamage(Player* player, s32 direction, s32 damage) {
}
break;
}
+
if ((gCurrentLevel == LEVEL_VENOM_1) && (player->dmgType == 42)) {
if (player->pos.x > 0.0f) {
player->knockback.x = -30.0f;
@@ -947,6 +998,7 @@ f32 D_800D2FEC[5] = {
void Player_GroundedCollision(Player* player, u32 arg1, f32 arg2, f32 arg3) {
player->hitDirection = arg1;
+
switch (arg1) {
case 1:
case 2:
@@ -958,6 +1010,7 @@ void Player_GroundedCollision(Player* player, u32 arg1, f32 arg2, f32 arg3) {
}
Math_SmoothStepToF(&player->baseSpeed, 2.0f, 1.0f, 2.0f, 0.00001f);
break;
+
case 3:
case 4:
player->pos.z = player->basePos.z;
@@ -969,6 +1022,7 @@ void Player_GroundedCollision(Player* player, u32 arg1, f32 arg2, f32 arg3) {
player->trueZpos = player->pos.z;
Math_SmoothStepToF(&player->baseSpeed, 2.0f, 1.0f, 2.0f, 0.00001f);
break;
+
case 0:
case 5:
break;
@@ -1019,15 +1073,19 @@ bool Play_CheckDynaFloorCollision(f32* arg0, s32* arg1, f32 xPos, f32 yPos, f32
sp9C = (s32) ((xPos + 2400.0f) / 300.0f);
sp98 = (s32) ((zPos + gPathProgress + 1500.0f + 2400.0f) / 300.0f);
+
if ((sp9C < 0) || (sp9C >= 16) || (sp98 < 0) || (sp98 >= 16)) {
return false;
}
+
sp90 = Math_ModF(xPos + 2400.0f, 300.0f);
sp94 = Math_ModF(zPos + gPathProgress + 1500.0f + 2400.0f, 300.0f);
sp8C = (sp98 * 17) + sp9C;
+
x0 = spA4[spA0[sp8C]].n.ob[0] * 3.0f;
y0 = spA4[spA0[sp8C]].n.ob[1] * 2.0f;
z0 = spA4[spA0[sp8C]].n.ob[2] * 3.0f;
+
if (sp90 < sp94) {
x1 = spA4[spA0[sp8C + 18]].n.ob[0] * 3.0f;
y1 = spA4[spA0[sp8C + 18]].n.ob[1] * 2.0f;
@@ -1070,8 +1128,9 @@ bool Play_CheckSingleHitbox(Hitbox* hitbox, f32 arg1, f32 arg2, f32 arg3, f32 ar
(fabsf(hitbox->x.offset + arg1 - arg4) < (hitbox->x.size + D_ctx_8017853C)) &&
(fabsf(hitbox->y.offset + arg2 - arg5) < (hitbox->y.size + D_ctx_8017853C))) {
return true;
+ } else {
+ return false;
}
- return false;
}
s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32 xPos, f32 yPos, f32 zPos, f32 xRot,
@@ -1089,7 +1148,7 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
if (count != 0) {
hitboxData++;
for (i = 0; i < count; i++, hitboxData += 6) {
- spA0 = 0;
+ spA0 = false;
if (*hitboxData == HITBOX_ROTATED) {
Matrix_RotateZ(gCalcMatrix, -hitboxData[3] * M_DTOR, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, -hitboxData[1] * M_DTOR, MTXF_APPLY);
@@ -1098,7 +1157,7 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
Matrix_RotateX(gCalcMatrix, -xRot * M_DTOR, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, -yRot * M_DTOR, MTXF_APPLY);
hitboxData += 4;
- spA0 = 1;
+ spA0 = true;
} else {
if (*hitboxData >= HITBOX_SHADOW) {
hitboxData++;
@@ -1107,12 +1166,14 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
Matrix_RotateX(gCalcMatrix, -xRot * M_DTOR, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, -yRot * M_DTOR, MTXF_APPLY);
}
+
if (!((arg9 == 0) && (argA == 0) && (argB == 0))) {
Matrix_RotateZ(gCalcMatrix, -argB * M_DTOR, MTXF_APPLY);
Matrix_RotateX(gCalcMatrix, -arg9 * M_DTOR, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, -argA * M_DTOR, MTXF_APPLY);
}
- if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && (spA0 == 0)) {
+
+ if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && !spA0) {
var_fv0 = player->hit3.x;
var_fv1 = player->hit3.y;
var_fa0 = player->hit3.z;
@@ -1125,6 +1186,7 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
var_fv1 = sp88.y + yPos;
var_fa0 = sp88.z + zPos;
}
+
if (Play_CheckSingleHitbox((Hitbox*) hitboxData, xPos, yPos, zPos, var_fv0, var_fv1, var_fa0)) {
*index = i + 1;
if (hitboxData[-1] == HITBOX_SHADOW) {
@@ -1135,8 +1197,9 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
}
return 3;
}
+
if (hitboxData[-1] < HITBOX_SHADOW) {
- if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && (spA0 == 0)) {
+ if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && !spA0) {
var_fv0 = player->hit4.x;
var_fv1 = player->hit4.y;
var_fa0 = player->hit4.z;
@@ -1149,11 +1212,13 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
var_fv1 = sp88.y + yPos;
var_fa0 = sp88.z + zPos;
}
+
if (Play_CheckSingleHitbox((Hitbox*) hitboxData, xPos, yPos, zPos, var_fv0, var_fv1, var_fa0)) {
*index = i + 1;
return 4;
}
- if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && (spA0 == 0)) {
+
+ if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && !spA0) {
var_fv0 = player->hit1.x;
var_fv1 = player->hit1.y;
var_fa0 = player->hit1.z;
@@ -1166,11 +1231,13 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
var_fv1 = sp88.y + yPos;
var_fa0 = sp88.z + zPos;
}
+
if (Play_CheckSingleHitbox((Hitbox*) hitboxData, xPos, yPos, zPos, var_fv0, var_fv1, var_fa0)) {
*index = i + 1;
return 1;
}
- if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && (spA0 == 0)) {
+
+ if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && !spA0) {
var_fv0 = player->hit2.x;
var_fv1 = player->hit2.y;
var_fa0 = player->hit2.z;
@@ -1183,6 +1250,7 @@ s32 Player_CheckHitboxCollision(Player* player, f32* hitboxData, s32* index, f32
var_fv1 = sp88.y + yPos;
var_fa0 = sp88.z + zPos;
}
+
if (Play_CheckSingleHitbox((Hitbox*) hitboxData, xPos, yPos, zPos, var_fv0, var_fv1, var_fa0)) {
*index = i + 1;
return 2;
@@ -1210,8 +1278,9 @@ bool Play_CheckPolyCollision(ObjectId objId, f32 arg1, f32 arg2, f32 arg3, f32 a
sp48.z = arg3;
useCol2 = false;
+
switch (objId) {
- case OBJ_ACTOR_180:
+ case OBJ_ACTOR_ME_MOLAR_ROCK:
colId = COL1_0;
break;
case OBJ_SCENERY_CO_BUMP_4:
@@ -1219,19 +1288,19 @@ bool Play_CheckPolyCollision(ObjectId objId, f32 arg1, f32 arg2, f32 arg3, f32 a
colId = COL2_1;
useCol2 = true;
break;
- case OBJ_SCENERY_149:
+ case OBJ_SCENERY_FO_MOUNTAIN_2:
colId = COL1_5;
break;
- case OBJ_SCENERY_150:
+ case OBJ_SCENERY_FO_MOUNTAIN_3:
colId = COL1_6;
break;
- case OBJ_BOSS_FO:
+ case OBJ_BOSS_FO_BASE:
colId = COL1_4;
break;
- case OBJ_BOSS_VE2:
+ case OBJ_BOSS_VE2_BASE:
colId = COL1_9;
break;
- case OBJ_BOSS_309:
+ case OBJ_BOSS_BO_BASE:
colId = COL1_7;
break;
case ACTOR_EVENT_ID:
@@ -1243,19 +1312,19 @@ bool Play_CheckPolyCollision(ObjectId objId, f32 arg1, f32 arg2, f32 arg3, f32 a
case OBJ_SCENERY_ME_TUNNEL:
colId = COL1_1;
break;
- case OBJ_SCENERY_120:
+ case OBJ_SCENERY_AQ_CORAL_REEF_2:
colId = COL2_18;
useCol2 = true;
break;
- case OBJ_SCENERY_124:
+ case OBJ_SCENERY_AQ_BUMP_1:
colId = COL2_15;
useCol2 = true;
break;
- case OBJ_SCENERY_126:
+ case OBJ_SCENERY_AQ_BUMP_2:
colId = COL2_16;
useCol2 = true;
break;
- case OBJ_SCENERY_47:
+ case OBJ_SCENERY_ZO_ISLAND:
colId = COL2_7;
useCol2 = true;
break;
@@ -1264,102 +1333,102 @@ bool Play_CheckPolyCollision(ObjectId objId, f32 arg1, f32 arg2, f32 arg3, f32 a
useCol2 = true;
break;
case OBJ_SCENERY_CO_BUMP_3:
- case OBJ_SCENERY_69:
+ case OBJ_SCENERY_MA_TERRAIN_BUMP:
colId = COL2_3;
useCol2 = true;
break;
- case OBJ_SCENERY_143:
+ case OBJ_SCENERY_VS_KA_FLBASE:
colId = COL2_17;
useCol2 = true;
break;
- case OBJ_SCENERY_140:
+ case OBJ_SCENERY_VS_PYRAMID_1:
colId = COL2_4;
useCol2 = true;
break;
- case OBJ_SCENERY_141:
+ case OBJ_SCENERY_VS_PYRAMID_2:
colId = COL2_6;
useCol2 = true;
break;
- case OBJ_SCENERY_117:
+ case OBJ_SCENERY_AQ_CORAL_REEF_1:
colId = COL2_14;
useCol2 = true;
break;
- case OBJ_SCENERY_70:
+ case OBJ_SCENERY_MA_FLOOR_1:
colId = COL2_8;
useCol2 = true;
break;
- case OBJ_SCENERY_72:
+ case OBJ_SCENERY_MA_FLOOR_3:
colId = COL2_9;
useCol2 = true;
break;
- case OBJ_SCENERY_71:
+ case OBJ_SCENERY_MA_FLOOR_2:
colId = COL2_10;
useCol2 = true;
break;
- case OBJ_SCENERY_73:
+ case OBJ_SCENERY_MA_FLOOR_4:
colId = COL2_11;
useCol2 = true;
break;
- case OBJ_SCENERY_67:
+ case OBJ_SCENERY_MA_WALL_3:
colId = COL2_12;
useCol2 = true;
break;
- case OBJ_SCENERY_74:
+ case OBJ_SCENERY_MA_FLOOR_5:
colId = COL2_13;
useCol2 = true;
break;
- case OBJ_SCENERY_118:
- case OBJ_SCENERY_119:
- case OBJ_SCENERY_121:
- case OBJ_SCENERY_122:
- case OBJ_SCENERY_123:
- case OBJ_SCENERY_125:
- case OBJ_SCENERY_127:
- case OBJ_SCENERY_128:
- case OBJ_SCENERY_129:
- case OBJ_SCENERY_130:
- case OBJ_SCENERY_131:
- case OBJ_SCENERY_132:
- case OBJ_SCENERY_133:
- case OBJ_SCENERY_134:
- case OBJ_SCENERY_135:
- case OBJ_SCENERY_136:
- case OBJ_SCENERY_137:
- case OBJ_SCENERY_138:
- case OBJ_SCENERY_139:
- case OBJ_SCENERY_142:
- case OBJ_SCENERY_144:
- case OBJ_SCENERY_145:
- case OBJ_SCENERY_146:
+ case OBJ_SCENERY_AQ_TUNNEL_1:
+ case OBJ_SCENERY_AQ_ARCH:
+ case OBJ_SCENERY_AQ_ROCK:
+ case OBJ_SCENERY_AQ_WALL_1:
+ case OBJ_SCENERY_AQ_ROOF:
+ case OBJ_SCENERY_AQ_TUNNEL_2:
+ case OBJ_SCENERY_VE1_TEMPLE_ENTRANCE:
+ case OBJ_SCENERY_VE1_TEMPLE_INTERIOR_1:
+ case OBJ_SCENERY_VE1_TEMPLE_INTERIOR_2:
+ case OBJ_SCENERY_VE1_TEMPLE_INTERIOR_3:
+ case OBJ_SCENERY_AND_PASSAGE:
+ case OBJ_SCENERY_AND_DOOR:
+ case OBJ_SCENERY_TR_BUILDING:
+ case OBJ_SCENERY_AND_PATH_INTERSECTION:
+ case OBJ_SCENERY_AND_PATH_WALLS:
+ case OBJ_SCENERY_AND_PATH_EXIT:
+ case OBJ_SCENERY_AND_PATH_ENTRANCE:
+ case OBJ_SCENERY_VS_BUILDING_1:
+ case OBJ_SCENERY_VS_BUILDING_2:
+ case OBJ_SCENERY_VS_ARCH:
+ case OBJ_SCENERY_VS_SPACE_JUNK_1:
+ case OBJ_SCENERY_VS_SPACE_JUNK_2:
+ case OBJ_SCENERY_VS_SPACE_JUNK_3:
case OBJ_SCENERY_147:
- case OBJ_SCENERY_148:
+ case OBJ_SCENERY_FO_MOUNTAIN_1:
case OBJ_SCENERY_CO_BUILDING_9:
case OBJ_SCENERY_CO_BUILDING_10:
case OBJ_SCENERY_IBEAM:
- case OBJ_SCENERY_ZO_ROCK_1:
- case OBJ_SCENERY_44:
- case OBJ_SCENERY_45:
- case OBJ_SCENERY_46:
- case OBJ_SCENERY_48:
- case OBJ_SCENERY_49:
- case OBJ_SCENERY_50:
- case OBJ_SCENERY_51:
- case OBJ_SCENERY_52:
- case OBJ_SCENERY_53:
+ case OBJ_SCENERY_ZO_ROCK:
+ case OBJ_SCENERY_ZO_OIL_RIG_1:
+ case OBJ_SCENERY_ZO_OIL_RIG_2:
+ case OBJ_SCENERY_ZO_OIL_RIG_3:
+ case OBJ_SCENERY_VE1_WALL_1:
+ case OBJ_SCENERY_VE1_WALL_2:
+ case OBJ_SCENERY_VE1_WALL_3:
+ case OBJ_SCENERY_VE1_HALLWAY_OBSTACLE:
+ case OBJ_SCENERY_VE1_GENERATOR:
+ case OBJ_SCENERY_VE1_WATCH_POST:
case OBJ_SCENERY_CO_WATERFALL:
case OBJ_SCENERY_CO_ROCKWALL:
case OBJ_SCENERY_CO_DOORS:
- case OBJ_SCENERY_57:
- case OBJ_SCENERY_58:
- case OBJ_SCENERY_59:
- case OBJ_SCENERY_60:
- case OBJ_SCENERY_61:
- case OBJ_SCENERY_62:
+ case OBJ_SCENERY_TI_PILLAR:
+ case OBJ_SCENERY_TI_BRIDGE:
+ case OBJ_SCENERY_MA_BUILDING_1:
+ case OBJ_SCENERY_MA_BUILDING_2:
+ case OBJ_SCENERY_MA_TOWER:
+ case OBJ_SCENERY_MA_WALL_1:
case OBJ_SCENERY_63:
- case OBJ_SCENERY_64:
- case OBJ_SCENERY_65:
- case OBJ_SCENERY_66:
- case OBJ_SCENERY_68:
+ case OBJ_SCENERY_MA_GUILLOTINE:
+ case OBJ_SCENERY_MA_PROXIMITY_LIGHT:
+ case OBJ_SCENERY_MA_WALL_2:
+ case OBJ_SCENERY_MA_WALL_4:
default:
colId = COL2_0;
useCol2 = true;
@@ -1378,27 +1447,32 @@ bool Play_CheckPolyCollision(ObjectId objId, f32 arg1, f32 arg2, f32 arg3, f32 a
return false;
}
-s32 Player_CheckPolyCollision(Player* player, ObjectId objId, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6,
- f32 arg7) {
+s32 Player_CheckPolyCollision(Player* player, ObjectId objId, f32 x, f32 y, f32 z, f32 arg5, f32 arg6, f32 arg7) {
Vec3f sp84;
Vec3f sp78;
Vec3f sp6C;
Vec3f sp60;
Vec3f sp54;
- sp84.x = arg2;
- sp84.y = arg3;
- sp84.z = arg4;
+ sp84.x = x;
+ sp84.y = y;
+ sp84.z = z;
+
Matrix_RotateY(gCalcMatrix, -arg6 * M_DTOR, MTXF_NEW);
+
sp78.x = player->vel.x;
sp78.y = player->vel.y;
sp78.z = player->vel.z;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp78, &sp54);
+
if ((player->form == FORM_LANDMASTER) || (player->form == FORM_ON_FOOT)) {
sp78.x = player->pos.x - sp84.x;
sp78.y = player->pos.y - sp84.y;
sp78.z = player->trueZpos - sp84.z;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp78, &sp6C);
+
if (Play_CheckPolyCollision(objId, sp84.x, sp84.y, sp84.z, sp6C.x + sp84.x, sp6C.y + sp84.y, sp6C.z + sp84.z,
&sp60, &sp54)) {
player->pos.y = sp60.y;
@@ -1414,39 +1488,51 @@ s32 Player_CheckPolyCollision(Player* player, ObjectId objId, f32 arg2, f32 arg3
return 0;
}
}
+
sp78.x = player->hit3.x - sp84.x;
sp78.y = player->hit3.y - sp84.y;
sp78.z = player->hit3.z - sp84.z;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp78, &sp6C);
if (Play_CheckPolyCollision(objId, sp84.x, sp84.y, sp84.z, sp6C.x + sp84.x, sp6C.y + sp84.y, sp6C.z + sp84.z, &sp60,
&sp54)) {
return 3;
}
+
sp78.x = player->hit4.x - sp84.x;
sp78.y = player->hit4.y - sp84.y;
sp78.z = player->hit4.z - sp84.z;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp78, &sp6C);
+
if (Play_CheckPolyCollision(objId, sp84.x, sp84.y, sp84.z, sp6C.x + sp84.x, sp6C.y + sp84.y, sp6C.z + sp84.z, &sp60,
&sp54)) {
return 4;
}
+
sp78.x = player->hit1.x - sp84.x;
sp78.y = player->hit1.y - sp84.y;
sp78.z = player->hit1.z - sp84.z;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp78, &sp6C);
+
if (Play_CheckPolyCollision(objId, sp84.x, sp84.y, sp84.z, sp6C.x + sp84.x, sp6C.y + sp84.y, sp6C.z + sp84.z, &sp60,
&sp54)) {
return 1;
}
+
sp78.x = player->hit2.x - sp84.x;
sp78.y = player->hit2.y - sp84.y;
sp78.z = player->hit2.z - sp84.z;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp78, &sp6C);
+
if (Play_CheckPolyCollision(objId, sp84.x, sp84.y, sp84.z, sp6C.x + sp84.x, sp6C.y + sp84.y, sp6C.z + sp84.z, &sp60,
&sp54)) {
return 2;
+ } else {
+ return 0;
}
- return 0;
}
void Player_CheckItemCollect(Player* player) {
@@ -1609,9 +1695,9 @@ void Player_CollisionCheck(Player* player) {
Player_ApplyDamage(player, 1, 21);
}
if (gCurrentLevel == LEVEL_FORTUNA) {
- func_effect_8007BC7C(player->hit1.x, player->hit1.y, player->hit1.z, 6.0f);
- func_effect_8007BC7C(player->hit1.x, player->hit1.y, player->hit1.z, 6.0f);
- func_effect_8007BC7C(player->hit1.x, player->hit1.y, player->hit1.z, 6.0f);
+ Effect_Effect362_Spawn(player->hit1.x, player->hit1.y, player->hit1.z, 6.0f);
+ Effect_Effect362_Spawn(player->hit1.x, player->hit1.y, player->hit1.z, 6.0f);
+ Effect_Effect362_Spawn(player->hit1.x, player->hit1.y, player->hit1.z, 6.0f);
}
}
if ((player->hit2.y < (gGroundHeight + 13.0f)) && (player->state_1C8 != PLAYERSTATE_1C8_DOWN)) {
@@ -1622,9 +1708,9 @@ void Player_CollisionCheck(Player* player) {
Player_ApplyDamage(player, 2, 21);
}
if (gCurrentLevel == LEVEL_FORTUNA) {
- func_effect_8007BC7C(player->hit2.x, player->hit2.y, player->hit2.z, 6.0f);
- func_effect_8007BC7C(player->hit2.x, player->hit2.y, player->hit2.z, 6.0f);
- func_effect_8007BC7C(player->hit2.x, player->hit2.y, player->hit2.z, 6.0f);
+ Effect_Effect362_Spawn(player->hit2.x, player->hit2.y, player->hit2.z, 6.0f);
+ Effect_Effect362_Spawn(player->hit2.x, player->hit2.y, player->hit2.z, 6.0f);
+ Effect_Effect362_Spawn(player->hit2.x, player->hit2.y, player->hit2.z, 6.0f);
}
}
} else if ((player->form == FORM_LANDMASTER) && !gVersusMode) {
@@ -1639,16 +1725,23 @@ void Player_CollisionCheck(Player* player) {
if ((gCurrentLevel == LEVEL_SECTOR_Y) || (gCurrentLevel == LEVEL_VENOM_ANDROSS)) {
sp8C = 4000.0f;
}
+
for (i = 0, scenery360 = gScenery360; i < 200; i++, scenery360++) {
if (scenery360->obj.status == OBJ_ACTIVE) {
spC8.x = scenery360->obj.pos.x - player->pos.x;
spC8.z = scenery360->obj.pos.z - player->trueZpos;
+
if (sqrtf(SQ(spC8.x) + SQ(spC8.z)) < sp8C) {
- if ((scenery360->obj.id == OBJ_SCENERY_117) || (scenery360->obj.id == OBJ_SCENERY_143) ||
- (scenery360->obj.id == OBJ_SCENERY_141) || (scenery360->obj.id == OBJ_SCENERY_149) ||
- (scenery360->obj.id == OBJ_SCENERY_150) || (scenery360->obj.id == OBJ_SCENERY_148) ||
- (scenery360->obj.id == OBJ_SCENERY_160) || (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_1) ||
- (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_3) || (scenery360->obj.id == OBJ_SCENERY_140)) {
+ if ((scenery360->obj.id == OBJ_SCENERY_AQ_CORAL_REEF_1) ||
+ (scenery360->obj.id == OBJ_SCENERY_VS_KA_FLBASE) ||
+ (scenery360->obj.id == OBJ_SCENERY_VS_PYRAMID_2) ||
+ (scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_2) ||
+ (scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_3) ||
+ (scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_1) ||
+ (scenery360->obj.id == OBJ_SCENERY_VE2_MOUNTAIN) ||
+ (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_1) ||
+ (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_3) ||
+ (scenery360->obj.id == OBJ_SCENERY_VS_PYRAMID_1)) {
temp_v0 = Player_CheckPolyCollision(player, scenery360->obj.id, scenery360->obj.pos.x,
scenery360->obj.pos.y, scenery360->obj.pos.z,
scenery360->obj.rot.x, scenery360->obj.rot.y,
@@ -1661,6 +1754,7 @@ void Player_CollisionCheck(Player* player) {
Player_ApplyDamage(player, temp_v0, scenery360->info.damage);
}
}
+
if ((gCurrentLevel == LEVEL_FORTUNA) || (gCurrentLevel == LEVEL_VENOM_2)) {
temp_v0 = Player_CheckHitboxCollision(
player, scenery360->info.hitbox, &sp98, scenery360->obj.pos.x,
@@ -1695,7 +1789,8 @@ void Player_CollisionCheck(Player* player) {
scenery360->obj.pos.z);
} else {
Player_ApplyDamage(player, temp_v0, scenery360->info.damage);
- if (scenery360->obj.id == OBJ_SCENERY_131) {
+
+ if (scenery360->obj.id == OBJ_SCENERY_AND_PASSAGE) {
Matrix_RotateY(gCalcMatrix, (scenery360->obj.rot.y + 180.0f) * M_DTOR,
MTXF_NEW);
Matrix_MultVec3f(gCalcMatrix, &D_800D3040[sp98 - 1], &spBC);
@@ -1710,9 +1805,10 @@ void Player_CollisionCheck(Player* player) {
player->yRot_114 = scenery360->obj.rot.y + 180.0f;
player->mercyTimer = 5;
}
- if ((scenery360->obj.id == OBJ_SCENERY_135) ||
- (scenery360->obj.id == OBJ_SCENERY_136)) {
- if (scenery360->obj.id == OBJ_SCENERY_135) {
+
+ if ((scenery360->obj.id == OBJ_SCENERY_AND_PATH_WALLS) ||
+ (scenery360->obj.id == OBJ_SCENERY_AND_PATH_EXIT)) {
+ if (scenery360->obj.id == OBJ_SCENERY_AND_PATH_WALLS) {
Matrix_RotateY(gCalcMatrix, (scenery360->obj.rot.y + 180.0f) * M_DTOR,
MTXF_NEW);
Matrix_MultVec3f(gCalcMatrix, &D_800D3088[sp98 - 1], &spBC);
@@ -1720,15 +1816,19 @@ void Player_CollisionCheck(Player* player) {
Matrix_RotateY(gCalcMatrix, scenery360->obj.rot.y * M_DTOR, MTXF_NEW);
Matrix_MultVec3f(gCalcMatrix, &D_800D30B8[sp98 - 1], &spBC);
}
+
player->knockback.x = spBC.x;
player->knockback.y = spBC.y;
player->knockback.z = spBC.z;
+
player->rot.y = 0.0f;
player->rot.x = 0.0f;
+
player->pos.x = player->basePos.x;
player->pos.y = player->basePos.y;
player->pos.z = player->basePos.z;
- if (scenery360->obj.id == OBJ_SCENERY_135) {
+
+ if (scenery360->obj.id == OBJ_SCENERY_AND_PATH_WALLS) {
player->yRot_114 = scenery360->obj.rot.y + 180.0f;
} else {
player->yRot_114 = scenery360->obj.rot.y;
@@ -1743,18 +1843,20 @@ void Player_CollisionCheck(Player* player) {
}
} else {
for (i = 0, scenery = gScenery; i < ARRAY_COUNT(gScenery); i++, scenery++) {
- if ((scenery->obj.status == OBJ_ACTIVE) && (scenery->obj.id != OBJ_SCENERY_58) &&
- (scenery->obj.id != OBJ_SCENERY_105) && (scenery->obj.id != OBJ_SCENERY_59) &&
- (scenery->obj.id != OBJ_SCENERY_60) && (scenery->obj.id != OBJ_SCENERY_61) &&
- (scenery->obj.id != OBJ_SCENERY_66) && (scenery->obj.id != OBJ_SCENERY_67) &&
- (scenery->obj.id != OBJ_SCENERY_70) && (scenery->obj.id != OBJ_SCENERY_72) &&
- (scenery->obj.id != OBJ_SCENERY_71) && (scenery->obj.id != OBJ_SCENERY_73) &&
- (scenery->obj.id != OBJ_SCENERY_74) && (scenery->obj.id != OBJ_SCENERY_69) &&
+ if ((scenery->obj.status == OBJ_ACTIVE) && (scenery->obj.id != OBJ_SCENERY_TI_BRIDGE) &&
+ (scenery->obj.id != OBJ_SCENERY_MA_TRAIN_TRACK_13) &&
+ (scenery->obj.id != OBJ_SCENERY_MA_BUILDING_1) && (scenery->obj.id != OBJ_SCENERY_MA_BUILDING_2) &&
+ (scenery->obj.id != OBJ_SCENERY_MA_TOWER) && (scenery->obj.id != OBJ_SCENERY_MA_WALL_2) &&
+ (scenery->obj.id != OBJ_SCENERY_MA_WALL_3) && (scenery->obj.id != OBJ_SCENERY_MA_FLOOR_1) &&
+ (scenery->obj.id != OBJ_SCENERY_MA_FLOOR_3) && (scenery->obj.id != OBJ_SCENERY_MA_FLOOR_2) &&
+ (scenery->obj.id != OBJ_SCENERY_MA_FLOOR_4) && (scenery->obj.id != OBJ_SCENERY_MA_FLOOR_5) &&
+ (scenery->obj.id != OBJ_SCENERY_MA_TERRAIN_BUMP) &&
((player->trueZpos - 2000.0f) < scenery->obj.pos.z)) {
if ((scenery->obj.id == OBJ_SCENERY_CO_BUMP_1) || (scenery->obj.id == OBJ_SCENERY_CO_BUMP_4) ||
- (scenery->obj.id == OBJ_SCENERY_CO_BUMP_5) || (scenery->obj.id == OBJ_SCENERY_47) ||
- (scenery->obj.id == OBJ_SCENERY_117) || (scenery->obj.id == OBJ_SCENERY_120) ||
- (scenery->obj.id == OBJ_SCENERY_124) || (scenery->obj.id == OBJ_SCENERY_126) ||
+ (scenery->obj.id == OBJ_SCENERY_CO_BUMP_5) || (scenery->obj.id == OBJ_SCENERY_ZO_ISLAND) ||
+ (scenery->obj.id == OBJ_SCENERY_AQ_CORAL_REEF_1) ||
+ (scenery->obj.id == OBJ_SCENERY_AQ_CORAL_REEF_2) ||
+ (scenery->obj.id == OBJ_SCENERY_AQ_BUMP_1) || (scenery->obj.id == OBJ_SCENERY_AQ_BUMP_2) ||
(scenery->obj.id == OBJ_SCENERY_CO_BUMP_2) || (scenery->obj.id == OBJ_SCENERY_CO_BUMP_3)) {
spC8.x = scenery->obj.pos.x - player->pos.x;
spC8.z = scenery->obj.pos.z - player->trueZpos;
@@ -1800,9 +1902,9 @@ void Player_CollisionCheck(Player* player) {
}
} else {
Player_ApplyDamage(player, temp_v0, scenery->info.damage);
- if ((scenery->obj.id == OBJ_SCENERY_48) ||
+ if ((scenery->obj.id == OBJ_SCENERY_VE1_WALL_1) ||
(scenery->obj.id == OBJ_SCENERY_CO_ROCKWALL) ||
- (scenery->obj.id == OBJ_SCENERY_49)) {
+ (scenery->obj.id == OBJ_SCENERY_VE1_WALL_2)) {
Matrix_RotateY(gCalcMatrix, scenery->obj.rot.y * M_DTOR, MTXF_NEW);
spC8.x = -(player->baseSpeed + player->boostSpeed) * 0.7f;
spC8.y = 0.0f;
@@ -1813,7 +1915,7 @@ void Player_CollisionCheck(Player* player) {
player->knockback.y = spBC.y;
player->pos.x = player->basePos.x;
player->mercyTimer = 5;
- } else if (scenery->obj.id == OBJ_SCENERY_50) {
+ } else if (scenery->obj.id == OBJ_SCENERY_VE1_WALL_3) {
if (player->pos.x < scenery->obj.pos.x) {
player->knockback.x = -30.0f;
player->rot.y = 45.0f;
@@ -1824,7 +1926,7 @@ void Player_CollisionCheck(Player* player) {
player->knockback.y = 0.0f;
player->pos.x = player->basePos.x;
player->mercyTimer = 5;
- } else if (scenery->obj.id == OBJ_SCENERY_131) {
+ } else if (scenery->obj.id == OBJ_SCENERY_AND_PASSAGE) {
Matrix_RotateY(gCalcMatrix, (scenery->obj.rot.y + 180.0f) * M_DTOR, MTXF_NEW);
Matrix_RotateZ(gCalcMatrix, -scenery->obj.rot.z * M_DTOR, MTXF_APPLY);
Matrix_MultVec3f(gCalcMatrix, &D_800D3040[sp98 - 1], &spBC);
@@ -1842,10 +1944,11 @@ void Player_CollisionCheck(Player* player) {
}
}
}
+
for (i = 0, boss = gBosses; i < ARRAY_COUNT(gBosses); i++, boss++) {
if (boss->obj.status == OBJ_ACTIVE) {
- if ((boss->obj.id == OBJ_BOSS_VE2) || (boss->obj.id == OBJ_BOSS_FO) ||
- (boss->obj.id == OBJ_BOSS_SZ_GREAT_FOX) || (boss->obj.id == OBJ_BOSS_309)) {
+ if ((boss->obj.id == OBJ_BOSS_VE2_BASE) || (boss->obj.id == OBJ_BOSS_FO_BASE) ||
+ (boss->obj.id == OBJ_BOSS_SZ_GREAT_FOX) || (boss->obj.id == OBJ_BOSS_BO_BASE)) {
temp_v0 =
Player_CheckPolyCollision(player, boss->obj.id, boss->obj.pos.x, boss->obj.pos.y,
boss->obj.pos.z, boss->obj.rot.x, boss->obj.rot.y, boss->obj.rot.z);
@@ -1854,7 +1957,8 @@ void Player_CollisionCheck(Player* player) {
break;
}
}
- if (boss->obj.id == OBJ_BOSS_310) {
+
+ if (boss->obj.id == OBJ_BOSS_BO_BASE_SHIELD) {
spfD4.x = fabsf(boss->obj.pos.x - player->pos.x) * .8333333f;
spfD4.y = fabsf(boss->obj.pos.y - player->pos.y) * 2;
spfD4.z = fabsf(boss->obj.pos.z - player->trueZpos) * 0.8333333f;
@@ -1864,11 +1968,10 @@ void Player_CollisionCheck(Player* player) {
player->mercyTimer = 5;
player->knockback.y = 30.0f;
boss->dmgType = DMG_BEAM;
- func_effect_8007BFFC(player->pos.x + RAND_FLOAT_CENTERED(10.0f),
- player->pos.y + RAND_FLOAT(10.0f),
- player->trueZpos + RAND_FLOAT_CENTERED(10.0f), 0.0f, 15.0f, 0.0f, 2.0f, 5);
+ Effect386_Spawn1(player->pos.x + RAND_FLOAT_CENTERED(10.0f), player->pos.y + RAND_FLOAT(10.0f),
+ player->trueZpos + RAND_FLOAT_CENTERED(10.0f), 0.0f, 15.0f, 0.0f, 2.0f, 5);
for (j = 0; j < 10; j++) {
- func_effect_8007C484(
+ Effect_Effect389_Spawn(
player->pos.x + RAND_FLOAT_CENTERED(30.0f), player->pos.y + RAND_FLOAT(10.0f),
player->trueZpos + RAND_FLOAT_CENTERED(30.0f), player->vel.x, 20.0f + player->vel.y,
player->vel.z, RAND_FLOAT(0.1f) + 0.1f, player->num + 11);
@@ -1876,7 +1979,7 @@ void Player_CollisionCheck(Player* player) {
break;
}
} else {
- if (boss->obj.id == OBJ_BOSS_KA) {
+ if (boss->obj.id == OBJ_BOSS_KA_SAUCERER) {
spfD4.x = fabsf(boss->obj.pos.x - player->pos.x);
spfD4.y = fabsf(boss->obj.pos.y - 300.0f - player->pos.y) * 7.42f;
spfD4.z = fabsf(boss->obj.pos.z - player->trueZpos);
@@ -1897,7 +2000,7 @@ void Player_CollisionCheck(Player* player) {
player->whooshTimer = 4;
}
} else {
- if ((boss->obj.id == OBJ_BOSS_320) && (boss->timer_056 != 0) && (sp98 == 5)) {
+ if ((boss->obj.id == OBJ_BOSS_AND_ANDROSS) && (boss->timer_056 != 0) && (sp98 == 5)) {
break;
}
Player_ApplyDamage(player, temp_v0, boss->info.damage);
@@ -1905,7 +2008,7 @@ void Player_CollisionCheck(Player* player) {
(sp98 >= 9)) {
player->knockback.y = -100.0f;
}
- if ((boss->obj.id == OBJ_BOSS_320) && (sp98 < 5)) {
+ if ((boss->obj.id == OBJ_BOSS_AND_ANDROSS) && (sp98 < 5)) {
player->knockback.x = boss->fwork[14];
player->knockback.y = boss->fwork[15];
}
@@ -1914,9 +2017,10 @@ void Player_CollisionCheck(Player* player) {
}
}
}
+
for (i = 0, actor = gActors; i < ARRAY_COUNT(gActors); i++, actor++) {
if ((actor->obj.status == OBJ_ACTIVE) && (actor->timer_0C2 == 0)) {
- if (actor->obj.id == OBJ_ACTOR_180) {
+ if (actor->obj.id == OBJ_ACTOR_ME_MOLAR_ROCK) {
temp_v0 = Player_CheckPolyCollision(player, actor->obj.id, actor->obj.pos.x, actor->obj.pos.y,
actor->obj.pos.z, actor->obj.rot.x, actor->obj.rot.y,
actor->obj.rot.z);
@@ -1971,7 +2075,7 @@ void Player_CollisionCheck(Player* player) {
}
}
}
- } else if ((OBJ_ACTOR_205 <= actor->obj.id) && (actor->obj.id <= OBJ_ACTOR_213)) {
+ } else if ((OBJ_ACTOR_MA_LOCOMOTIVE <= actor->obj.id) && (actor->obj.id <= OBJ_ACTOR_MA_TRAIN_CAR_7)) {
temp_v0 = Player_CheckHitboxCollision(
player, actor->info.hitbox, &sp98, actor->fwork[25] + actor->obj.pos.x,
actor->fwork[8] + actor->obj.pos.y + 25.0f, actor->obj.pos.z, actor->fwork[29],
@@ -2004,7 +2108,7 @@ void Player_CollisionCheck(Player* player) {
}
if (actor->info.damage) {
Player_ApplyDamage(player, temp_v0, actor->info.damage);
- if (actor->obj.id == OBJ_ACTOR_225) {
+ if (actor->obj.id == OBJ_ACTOR_TI_LANDMINE) {
player->knockback.y = 0.0f;
}
} else {
@@ -2015,6 +2119,7 @@ void Player_CollisionCheck(Player* player) {
}
}
}
+
for (i = 0, sprite = gSprites; i < ARRAY_COUNT(gSprites); i++, sprite++) {
if (sprite->obj.status == OBJ_ACTIVE) {
if ((player->trueZpos - 200.0f) < sprite->obj.pos.z) {
@@ -2024,7 +2129,7 @@ void Player_CollisionCheck(Player* player) {
if (temp_v0 != 0) {
if ((sprite->obj.id == OBJ_SPRITE_FO_POLE) || (sprite->obj.id == OBJ_SPRITE_CO_POLE) ||
(sprite->obj.id == OBJ_SPRITE_TI_CACTUS) || (sprite->obj.id == OBJ_SPRITE_CO_TREE)) {
- sprite->destroy = 1;
+ sprite->destroy = true;
player->hitTimer = 6;
player->hitDirection = 0;
} else {
@@ -2035,7 +2140,9 @@ void Player_CollisionCheck(Player* player) {
}
}
}
+
Player_CheckItemCollect(player);
+
if (gCamCount == 4) {
for (opponent = &gPlayer[3], i = 3; i >= 0; i--, opponent--) {
if ((i != gPlayerNum) && (opponent->state_1C8 == PLAYERSTATE_1C8_ACTIVE)) {
@@ -2043,20 +2150,24 @@ void Player_CollisionCheck(Player* player) {
if (player->form == FORM_ON_FOOT) {
spC8.x = 4.0f;
}
+
spC8.y = 25.0f;
if (opponent->form == FORM_ON_FOOT) {
spC8.y = 4.0f;
}
spBC.x = spBC.z = spC8.x + spC8.y;
+
spC8.x = 23.0f;
if (player->form == FORM_ON_FOOT) {
spC8.x = 7.0f;
}
+
spC8.y = 23.0f;
if (opponent->form == FORM_ON_FOOT) {
spC8.y = 7.0f;
}
spBC.y = spC8.x + spC8.y;
+
if ((fabsf(opponent->trueZpos - player->trueZpos) <= spBC.z) &&
(fabsf(opponent->pos.y - player->pos.y) <= spBC.y) &&
(fabsf(opponent->pos.x - player->pos.x) <= spBC.x)) {
@@ -2080,12 +2191,13 @@ void Player_CollisionCheck(Player* player) {
}
}
}
+
if (gUseDynaFloor) {
if (Play_CheckDynaFloorCollision(&sp94, &sp90, player->hit4.x, player->hit4.y, player->hit4.z)) {
if (gCurrentLevel == LEVEL_ZONESS) {
player->rot.x = (player->baseSpeed + player->boostSpeed) * 0.8f;
player->hitTimer = 15;
- func_effect_8007B228(player->hit4.x, sp94, player->hit4.z, 1.0f);
+ Effect_Effect381_Spawn(player->hit4.x, sp94, player->hit4.z, 1.0f);
} else {
if (player->hitTimer == 0) {
Player_ApplyDamage(player, 4, 10);
@@ -2095,15 +2207,16 @@ void Player_CollisionCheck(Player* player) {
}
if (player->state_1C8 == PLAYERSTATE_1C8_DOWN) {
player->radioDamageTimer = 2;
- func_effect_8007AFD0(player->pos.x, player->trueZpos, 30.0f, 0.0f, 5.0f);
- func_effect_8007AFD0(player->pos.x, player->trueZpos, -30.0f, 0.0f, 5.0f);
+ Effect_Effect382_Spawn(player->pos.x, player->trueZpos, 30.0f, 0.0f, 5.0f);
+ Effect_Effect382_Spawn(player->pos.x, player->trueZpos, -30.0f, 0.0f, 5.0f);
}
}
+
if (Play_CheckDynaFloorCollision(&sp94, &sp90, player->pos.x + ((player->hit1.x - player->pos.x) * 1.5f),
player->pos.y + (player->hit1.y - player->pos.y) * 1.5f, player->hit1.z)) {
if (gCurrentLevel == LEVEL_ZONESS) {
- func_effect_8007B228(player->pos.x + (player->hit1.x - player->pos.x) * 1.5f, sp94, player->hit1.z,
- 1.0f);
+ Effect_Effect381_Spawn(player->pos.x + (player->hit1.x - player->pos.x) * 1.5f, sp94, player->hit1.z,
+ 1.0f);
} else {
if (player->hitTimer == 0) {
Player_ApplyDamage(player, 1, 10);
@@ -2111,11 +2224,12 @@ void Player_CollisionCheck(Player* player) {
player->knockback.y = 30.0f;
}
}
+
if (Play_CheckDynaFloorCollision(&sp94, &sp90, player->pos.x + ((player->hit2.x - player->pos.x) * 1.5f),
player->pos.y + (player->hit2.y - player->pos.y) * 1.5f, player->hit2.z)) {
if (gCurrentLevel == LEVEL_ZONESS) {
- func_effect_8007B228(player->pos.x + (player->hit2.x - player->pos.x) * 1.5f, sp94, player->hit2.z,
- 1.0f);
+ Effect_Effect381_Spawn(player->pos.x + (player->hit2.x - player->pos.x) * 1.5f, sp94, player->hit2.z,
+ 1.0f);
} else {
if (player->hitTimer == 0) {
Player_ApplyDamage(player, 2, 40);
@@ -2162,8 +2276,10 @@ void Player_FloorCheck(Player* player) {
if (player->hideShadow) {
return;
}
+
player->groundPos.x = player->pos.x;
player->groundPos.z = player->trueZpos - player->pos.y;
+
if (gGroundType != 4) {
if (gCamCount == 1) {
player->groundPos.y = gGroundHeight + 3.0f;
@@ -2175,16 +2291,19 @@ void Player_FloorCheck(Player* player) {
}
player->shadowRotX = player->shadowRotZ = player->groundRotY = 0.0f;
}
+
sp100 = 0.0f;
spFC = 0.0f;
spF8 = 0.0f;
+
if (gCamCount != 1) {
if (player->form == FORM_ON_FOOT) {
for (sp144 = 0; sp144 < 200; sp144++) {
scenery360 = &gScenery360[sp144];
if ((scenery360->obj.status == OBJ_ACTIVE) &&
- ((scenery360->obj.id == OBJ_SCENERY_143) || (scenery360->obj.id == OBJ_SCENERY_140) ||
- (scenery360->obj.id == OBJ_SCENERY_141)) &&
+ ((scenery360->obj.id == OBJ_SCENERY_VS_KA_FLBASE) ||
+ (scenery360->obj.id == OBJ_SCENERY_VS_PYRAMID_1) ||
+ (scenery360->obj.id == OBJ_SCENERY_VS_PYRAMID_2)) &&
(fabsf(scenery360->obj.pos.x - player->pos.x) < 2000.0f) &&
(fabsf(scenery360->obj.pos.z - player->trueZpos) < 2000.0f)) {
spC8.x = scenery360->obj.pos.x;
@@ -2194,9 +2313,9 @@ void Player_FloorCheck(Player* player) {
spD4.y = gGroundHeight;
spD4.z = player->trueZpos;
colId = COL2_4;
- if (scenery360->obj.id == OBJ_SCENERY_141) {
+ if (scenery360->obj.id == OBJ_SCENERY_VS_PYRAMID_2) {
colId = COL2_6;
- } else if (scenery360->obj.id == OBJ_SCENERY_143) {
+ } else if (scenery360->obj.id == OBJ_SCENERY_VS_KA_FLBASE) {
colId = COL2_17;
}
if (func_col2_800A3690(&spD4, &spC8, colId, &spBC)) {
@@ -2214,9 +2333,10 @@ void Player_FloorCheck(Player* player) {
player->groundPos.z = player->trueZpos;
for (sp144 = 0, scenery360 = gScenery360; sp144 < 200; sp144++, scenery360++) {
if ((scenery360->obj.status == OBJ_ACTIVE) &&
- ((scenery360->obj.id == OBJ_SCENERY_150) || (scenery360->obj.id == OBJ_SCENERY_149) ||
- (scenery360->obj.id == OBJ_SCENERY_148) || (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_1) ||
- (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_3)) &&
+ ((scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_3) ||
+ (scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_2) ||
+ (scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_1) ||
+ (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_1) || (scenery360->obj.id == OBJ_SCENERY_CO_BUMP_3)) &&
(fabsf(scenery360->obj.pos.x - player->pos.x) < 2500.0f) &&
(fabsf(scenery360->obj.pos.z - player->trueZpos) < 2500.0f)) {
tempx = scenery360->obj.pos.x;
@@ -2235,8 +2355,9 @@ void Player_FloorCheck(Player* player) {
spC8.y = tempy;
spC8.z = tempz;
- if ((scenery360->obj.id == OBJ_SCENERY_149) || (scenery360->obj.id == OBJ_SCENERY_150)) {
- if (scenery360->obj.id == OBJ_SCENERY_149) {
+ if ((scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_2) ||
+ (scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_3)) {
+ if (scenery360->obj.id == OBJ_SCENERY_FO_MOUNTAIN_2) {
colId = COL1_5;
} else {
colId = COL1_6;
@@ -2272,7 +2393,7 @@ void Player_FloorCheck(Player* player) {
tempz = scenery->obj.pos.z;
sp120 = scenery->obj.rot.y;
if ((scenery->obj.id == OBJ_SCENERY_CO_BUMP_3) || (scenery->obj.id == OBJ_SCENERY_CO_BUMP_2) ||
- (scenery->obj.id == OBJ_SCENERY_47) || (scenery->obj.id == OBJ_SCENERY_CO_BUMP_4) ||
+ (scenery->obj.id == OBJ_SCENERY_ZO_ISLAND) || (scenery->obj.id == OBJ_SCENERY_CO_BUMP_4) ||
(scenery->obj.id == OBJ_SCENERY_CO_BUMP_5)) {
Matrix_RotateY(gCalcMatrix, -sp120 * M_DTOR, MTXF_NEW);
for (var_fs1 = var_fs0 = -50.0f; var_fs0 > -500.0f; var_fs0 -= 5.0f, var_fs1 -= 5.0f) {
@@ -2292,7 +2413,7 @@ void Player_FloorCheck(Player* player) {
colId = COL2_0;
- if (scenery->obj.id == OBJ_SCENERY_47) {
+ if (scenery->obj.id == OBJ_SCENERY_ZO_ISLAND) {
colId = COL2_7;
}
if (scenery->obj.id == OBJ_SCENERY_CO_BUMP_2) {
@@ -2409,11 +2530,14 @@ void Play_InitLevel(void) {
gTeamLowHealthMsgTimer = -1;
break;
}
+
gUseDynaFloor = 0;
+
switch (gCurrentLevel) {
case LEVEL_SECTOR_Z:
gGreatFoxIntact = true;
break;
+
case LEVEL_METEO:
case LEVEL_SECTOR_X:
if (gLevelPhase == 1) {
@@ -2428,32 +2552,37 @@ void Play_InitLevel(void) {
gAmbientB = 100;
}
break;
+
case LEVEL_VENOM_ANDROSS:
gDrawGround = false;
gDrawBackdrop = 6;
D_Andross_801A7F58 = D_Andross_801A7F60 = D_Andross_801A7F68 = D_Andross_801A7F70 = D_Andross_801A7F78 =
0.0f;
break;
+
case LEVEL_AQUAS:
gVIsPerFrame = 3;
D_bg_8015F970 = 1600.0f;
D_AQ_801C4188 = 128.0f;
- Aquas_801A9824();
+ Aquas_InitLevel();
break;
+
case LEVEL_TITANIA:
Titania_80188F30();
gTeamShields[TEAM_ID_SLIPPY] = -2;
break;
+
case LEVEL_MACBETH:
- Macbeth_80199920();
+ Macbeth_InitLevel();
break;
+
case LEVEL_ZONESS:
- MEM_ARRAY_ALLOCATE(gZOSnakePosRots, 200);
- ptr = (u8*) gZOSnakePosRots;
- for (i = 0; i < 200 * sizeof(*gZOSnakePosRots); i++, ptr++) {
+ MEM_ARRAY_ALLOCATE(gZoDodoraPosRots, 200);
+ ptr = (u8*) gZoDodoraPosRots;
+ for (i = 0; i < 200 * sizeof(*gZoDodoraPosRots); i++, ptr++) {
*ptr = 0;
}
- gZOSnakeWaypointCount = 0;
+ gZoDodoraWaypointCount = 0;
/* fallthrough */
case LEVEL_SOLAR:
gUseDynaFloor = true;
@@ -2487,6 +2616,7 @@ void Play_InitLevel(void) {
mesh = SEGMENTED_TO_VIRTUAL(D_ZO_6009ED0);
break;
}
+
for (i = 0; i < 17 * 17; i++, mesh++) {
if (mesh->v.ob[0] == 800) {
mesh->v.ob[0] = 1400;
@@ -2507,6 +2637,7 @@ void Play_InitLevel(void) {
mesh = SEGMENTED_TO_VIRTUAL(D_ZO_600C780);
break;
}
+
for (i = 0; i < 17 * 17; i++, mesh++) {
if (mesh->v.ob[0] == 800) {
mesh->v.ob[0] = 1400;
@@ -2527,6 +2658,7 @@ void Player_ResetVsData(void) {
s32 j;
gVsMatchState = VS_STATE_0;
+
for (i = 0; i < 4; i++) {
gVsPoints[i] = 0;
for (j = 0; j < 10; j++) {
@@ -2542,6 +2674,7 @@ void Player_InitVersus(void) {
s32 i;
Player_ResetVsData();
+
for (i = 0; i < 4; i++) {
gPlayerNum = i;
Player_Initialize(&gPlayer[i]);
@@ -2556,6 +2689,7 @@ void Play_Init(void) {
s32 i;
gArwingSpeed = 40.0f;
+
for (i = 0; i < ARRAY_COUNT(gControllerRumbleEnabled); i++) {
gControllerRumbleEnabled[i] = 0;
}
@@ -2565,21 +2699,27 @@ void Play_Init(void) {
} else {
gEnemyShotSpeed = 100;
}
+
gPauseEnabled = false;
gVIsPerFrame = 2;
- D_ctx_80177C70 = 0;
+ gFovYMode = 0;
gTeamHelpActor = NULL;
gTeamHelpTimer = 0;
+
Audio_KillSfxById(NA_SE_OB_ROUTE_EXPLOSION1);
Audio_KillSfxById(NA_SE_DEMO_SIREN);
+
Memory_FreeAll();
+
gTraining360MsgTimer = gTraining360MsgIndex = gShowBossHealth = gStarWolfMsgTimer = gAllRangeWingRepairTimer =
gAllRangeSuppliesSent = 0;
D_display_800CA220 = 0;
gShowLevelClearStatusScreen = 0;
+
if (gCurrentLevel != LEVEL_VERSUS) {
gSceneSetup = 0;
}
+
gShowHud = 1;
gDrawGround = gDrawBackdrop = 1;
gAqDrawMode = sOverheadCam = 0;
@@ -2587,6 +2727,7 @@ void Play_Init(void) {
gLevelMode = LEVELMODE_ON_RAILS;
gPathTexScroll = D_bg_8015F968 = 0.0f;
D_hud_800D1970 = gVersusMode = gHideRadio = gChangeTo360 = false;
+
if (gCurrentLevel >= LEVEL_FORTUNA) {
gLevelMode = LEVELMODE_ALL_RANGE;
if (gCurrentLevel == LEVEL_VERSUS) {
@@ -2597,6 +2738,7 @@ void Play_Init(void) {
if ((gCurrentLevel == LEVEL_VENOM_ANDROSS) && (gLevelPhase == 1)) {
gLevelMode = LEVELMODE_ALL_RANGE;
}
+
gVsMatchStart = false;
Play_InitEnvironment();
gDropHitCountItem = gTeamLowHealthMsgTimer = gStartAndrossFightTimer = gSoShieldsEmpty = gAllRangeEventTimer =
@@ -2606,8 +2748,10 @@ void Play_Init(void) {
if (gCurrentLevel == LEVEL_SECTOR_X) {
gMissionStatus = MISSION_ACCOMPLISHED;
}
+
gWaterLevel = -25000.0f;
D_ctx_80177950 = 1.0f;
+
if ((gCurrentLevel == LEVEL_VENOM_2) && (gLevelPhase == 2)) {
gFillScreenRed = gFillScreenGreen = gFillScreenBlue = 255;
} else {
@@ -2633,39 +2777,49 @@ void Play_Init(void) {
} else {
gStarCount = 0;
}
+
gFogAlpha = 255;
gLight1rotStep = 5.0f;
gLight2rotStep = 5.0f;
D_ctx_80178538 = 5.0f;
Play_ClearObjectData();
D_ctx_801782C8 = 0;
+
if (gCurrentLevel == LEVEL_TITANIA) {
Ground_801B5110(0.0f, 0.0f, 200.0f);
}
if (gCurrentLevel == LEVEL_AQUAS) {
gWaterLevel = 1000.0f;
}
+
gLoadLevelObjects = false;
gCamCount = 1;
+
if (gCurrentLevel == LEVEL_VERSUS) {
gCamCount = 4;
}
+
for (i = TEAM_ID_FALCO; i < TEAM_ID_MAX; i++) {
gTeamShields[i] = gSavedTeamShields[i];
}
+
MEM_ARRAY_ALLOCATE(gPlayer, gCamCount);
Player_InitializeAll();
+
for (i = 0; i < gCamCount; i++) {
gPlayer[i].state_1C8 = PLAYERSTATE_1C8_INIT;
gPlayerGlareAlphas[i] = D_ctx_801783C0[i] = 0;
gControllerRumbleTimers[i] = 0;
gPlayerScores[i] = 0;
}
+
if (gLevelMode == LEVELMODE_ALL_RANGE) {
MEM_ARRAY_ALLOCATE(gScenery360, 200);
+
for (i = 0; i < 200; i++) {
gScenery360[i].obj.status = OBJ_FREE;
}
+
switch (gCurrentLevel) {
case LEVEL_SECTOR_Z:
if (!D_ctx_8017782C) {
@@ -2673,28 +2827,33 @@ void Play_Init(void) {
ActorAllRange_SpawnTeam();
}
break;
+
case LEVEL_FORTUNA:
Fortuna_LoadLevelObjects();
ActorAllRange_SpawnTeam();
break;
+
case LEVEL_KATINA:
Katina_Init();
if (!D_ctx_8017782C) {
ActorAllRange_SpawnTeam();
}
break;
+
case LEVEL_BOLSE:
if (!D_ctx_8017782C) {
- Bolse_80191ED8();
+ Bolse_LoadLevelObjects();
ActorAllRange_SpawnTeam();
}
break;
+
case LEVEL_VENOM_2:
Venom2_LoadLevelObjects();
if (gLevelPhase == 0) {
ActorAllRange_SpawnTeam();
}
break;
+
case LEVEL_VENOM_ANDROSS:
if (gLevelPhase == 1) {
if (gAllRangeCheckpoint == 0) {
@@ -2704,6 +2863,7 @@ void Play_Init(void) {
}
}
break;
+
case LEVEL_VERSUS:
Play_InitVsStage();
gTeamLowHealthMsgTimer = -1;
@@ -2719,21 +2879,29 @@ void Player_SetupArwingShot(Player* player, PlayerShot* shot, f32 arg2, f32 arg3
Vec3f sp2C;
PlayerShot_Initialize(shot);
+
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + 180.0f) * M_DTOR, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, -((player->xRot_120 + player->rot.x + player->aerobaticPitch) * M_DTOR), MTXF_APPLY);
Matrix_RotateZ(gCalcMatrix, -((player->bankAngle + player->rockAngle) * M_DTOR), MTXF_APPLY);
+
Matrix_Translate(gCalcMatrix, player->xShake, player->yBob, 0.0f, MTXF_APPLY);
+
if (gVersusMode && (shotId <= PLAYERSHOT_TWIN_LASER)) {
speed *= 0.5f;
}
+
sp44.x = 0.0f;
sp44.y = 0.0f;
sp44.z = speed;
+
Matrix_MultVec3f(gCalcMatrix, &sp44, &sp38);
+
sp44.x = arg2;
sp44.y = -5.0f + arg3;
sp44.z = 0.0f;
+
Matrix_MultVec3f(gCalcMatrix, &sp44, &sp2C);
+
shot->obj.status = SHOT_ACTIVE;
shot->vel.x = sp38.x;
shot->vel.y = sp38.y;
@@ -2746,6 +2914,7 @@ void Player_SetupArwingShot(Player* player, PlayerShot* shot, f32 arg2, f32 arg3
} else {
shot->timer = 37;
}
+
if (shot->obj.id == PLAYERSHOT_LOCK_SEARCH) {
shot->obj.pos.x = player->pos.x + sp2C.x;
shot->obj.pos.y = player->pos.y + sp2C.y;
@@ -2756,9 +2925,11 @@ void Player_SetupArwingShot(Player* player, PlayerShot* shot, f32 arg2, f32 arg3
shot->obj.pos.y = player->pos.y + sp2C.y + (sp38.y * 1.2);
shot->obj.pos.z = player->trueZpos + sp2C.z + (sp38.z * 1.2f);
}
+
shot->obj.rot.x = player->xRot_120 + player->rot.x + player->aerobaticPitch;
shot->obj.rot.y = player->rot.y + player->yRot_114;
shot->obj.rot.z = player->bankAngle;
+
if (shotId == PLAYERSHOT_LOCK_ON) {
if (gCurrentLevel == LEVEL_AQUAS) {
shot->unk_58 = RAND_INT(360.0f);
@@ -2826,8 +2997,8 @@ void Player_SetupTankShot(Player* player, PlayerShot* shot, PlayerShotId shotId,
shot->obj.rot.z = player->rot.z;
shot->timer = 40;
shot->obj.id = shotId;
-
shot->sourceId = player->num;
+
if (shotId == PLAYERSHOT_LOCK_ON) {
if (speed <= 65.0f) {
shot->unk_5C = 1;
@@ -2852,11 +3023,13 @@ void Player_TankCannon(Player* player) {
void Player_ArwingLaser(Player* player) {
s32 i;
- LaserStrength laser = gLaserStrength[gPlayerNum];
+ LaserStrength laser;
+ laser = gLaserStrength[gPlayerNum];
if (player->wings.unk_14 > -8.0f) {
laser = LASERS_SINGLE;
}
+
switch (laser) {
case LASERS_SINGLE:
for (i = 0; i < ARRAY_COUNT(gPlayerShots) - 1; i++) {
@@ -2897,6 +3070,7 @@ void Player_SmartBomb(Player* player) {
} else {
gBombCount[player->num]--;
}
+
if (player->form == FORM_ARWING) {
Player_SetupArwingShot(player, &gPlayerShots[ARRAY_COUNT(gPlayerShots) - 1], 0.0f, 0.0f, PLAYERSHOT_BOMB,
180.0f);
@@ -2905,8 +3079,10 @@ void Player_SmartBomb(Player* player) {
} else {
Player_SetupOnFootShot(player, &gPlayerShots[ARRAY_COUNT(gPlayerShots) - 1], PLAYERSHOT_BOMB);
}
+
gPlayerShots[ARRAY_COUNT(gPlayerShots) - 1].unk_48 = 30.0f;
gPlayerShots[ARRAY_COUNT(gPlayerShots) - 1].unk_60 = 0;
+
Audio_InitBombSfx(player->num, 1);
Audio_PlayBombFlightSfx(player->num, gPlayerShots[ARRAY_COUNT(gPlayerShots) - 1].sfxSource);
}
@@ -2918,17 +3094,21 @@ void Player_SetupOnFootShot(Player* player, PlayerShot* shot, PlayerShotId shotI
Vec3f sp44;
PlayerShot_Initialize(shot);
+
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + player->damageShake + 180.0f) * M_DTOR, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, -((player->rot.x + player->damageShake) * M_DTOR), MTXF_APPLY);
Matrix_RotateZ(gCalcMatrix, -((player->bankAngle + player->rockAngle + player->damageShake) * M_DTOR), MTXF_APPLY);
Matrix_RotateX(gCalcMatrix, player->unk_154 * M_DTOR, MTXF_APPLY);
+
sp5C.x = 0.0f;
sp5C.y = 0.0f;
+
if (shotId == PLAYERSHOT_BOMB) {
sp5C.z = 100.0f;
} else {
sp5C.z = 150.0f;
}
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp5C, &sp50);
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + player->damageShake + 180.0f) * M_DTOR, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, -((player->rot.x + player->damageShake) * M_DTOR), MTXF_APPLY);
@@ -2936,13 +3116,17 @@ void Player_SetupOnFootShot(Player* player, PlayerShot* shot, PlayerShotId shotI
Matrix_Translate(gCalcMatrix, 0.0f, player->yBob, 0, MTXF_APPLY);
Matrix_Translate(gCalcMatrix, -10.0f, 25.0f, 0.0f, MTXF_APPLY);
Matrix_RotateX(gCalcMatrix, player->unk_154 * M_DTOR, MTXF_APPLY);
+
sp5C.x = 0.0f;
sp5C.y = 0.0f;
sp5C.z = 0;
+
Matrix_MultVec3f(gCalcMatrix, &sp5C, &sp44);
+
shot->vel.x = sp50.x;
shot->vel.y = sp50.y;
shot->vel.z = sp50.z;
+
shot->obj.pos.x = player->pos.x + sp44.x;
shot->obj.pos.y = player->pos.y + sp44.y;
shot->obj.pos.z = player->trueZpos + sp44.z;
@@ -2980,6 +3164,7 @@ bool Player_CanLockOn(s32 playerNum) {
return false;
}
}
+
if (gVersusMode) {
for (i = 0; i < gCamCount; i++) {
if (((gPlayer[playerNum].state_1C8 == PLAYERSTATE_1C8_ACTIVE) ||
@@ -3004,6 +3189,7 @@ bool Player_UpdateLockOn(Player* player) {
if (gChargeTimers[player->num] == 20) {
Object_PlayerSfx(player->sfxSource, NA_SE_LOCK_SEARCH, player->num);
}
+
if (!((gInputHold->button & R_TRIG) && (gInputHold->button & Z_TRIG) && (player->form == FORM_ARWING) &&
(player->state_1C8 == PLAYERSTATE_1C8_ACTIVE)) &&
((gGameFrameCount % 4) == 0) && Player_CanLockOn(player->num)) {
@@ -3047,6 +3233,7 @@ bool Player_UpdateLockOn(Player* player) {
break;
}
}
+
if (gChargeTimers[player->num] > 10) {
if ((gPlayerShots[14 - player->num].obj.status == SHOT_FREE) ||
(gPlayerShots[14 - player->num].obj.id != PLAYERSHOT_LOCK_ON) ||
@@ -3066,20 +3253,24 @@ bool Player_UpdateLockOn(Player* player) {
}
gChargeTimers[player->num] = 0;
}
+
if (gInputPress->button & B_BUTTON) {
hasBombTarget = false;
+
for (i = 0; i < ARRAY_COUNT(gActors); i++) {
if ((gActors[i].obj.status == OBJ_ACTIVE) && (gActors[i].lockOnTimers[player->num] != 0)) {
hasBombTarget = true;
break;
}
}
+
for (i = 0; i < gCamCount; i++) {
if (gVsLockOnTimers[i][player->num] != 0) {
hasBombTarget = true;
break;
}
}
+
if (hasBombTarget && (gBombCount[player->num] != 0) &&
(gPlayerShots[ARRAY_COUNT(gPlayerShots) - 1].obj.status == SHOT_FREE)) {
gBombCount[player->num]--;
@@ -3105,6 +3296,7 @@ void Player_Shoot(Player* player) {
if ((player->wings.rightState <= WINGSTATE_BROKEN) || (player->wings.leftState <= WINGSTATE_BROKEN)) {
gLaserStrength[player->num] = LASERS_SINGLE;
}
+
if (!Player_UpdateLockOn(player)) {
if (gLaserStrength[gPlayerNum] > LASERS_SINGLE) {
Math_SmoothStepToF(&player->wings.unk_14, -10.0f, 1.0f, 0.5f, 0.0f);
@@ -3124,6 +3316,7 @@ void Player_Shoot(Player* player) {
Player_SmartBomb(player);
}
break;
+
case FORM_LANDMASTER:
if (!Player_UpdateLockOn(player)) {
if (gShootButton[player->num] & gInputPress->button) {
@@ -3132,6 +3325,7 @@ void Player_Shoot(Player* player) {
Player_SmartBomb(player);
}
break;
+
case FORM_ON_FOOT:
if (gInputPress->button & A_BUTTON) {
player->shotTimer = 0;
@@ -3160,6 +3354,7 @@ void Player_ArwingBank(Player* player) {
} else if ((player->wings.leftState <= WINGSTATE_BROKEN) && (player->wings.rightState == WINGSTATE_INTACT)) {
sp3C = 17.0f;
}
+
sp38 = 0.1f;
if ((gInputHold->button & Z_TRIG) && !(gInputHold->button & R_TRIG)) {
sp3C = 90.0f;
@@ -3188,7 +3383,9 @@ void Player_ArwingBank(Player* player) {
}
}
}
+
Math_SmoothStepToF(&player->zRotBank, sp3C, sp38, 10.0f, 0.f);
+
if (gInputPress->button & Z_TRIG) {
player->sfx.bank = 1;
if (player->rollInputTimerL != 0) {
@@ -3200,6 +3397,7 @@ void Player_ArwingBank(Player* player) {
player->rollInputTimerL = 10;
}
}
+
if (gInputPress->button & R_TRIG) {
player->sfx.bank = 1;
if (player->rollInputTimerR != 0) {
@@ -3216,6 +3414,7 @@ void Player_ArwingBank(Player* player) {
void Player_UseTankJets(Player* player) {
Math_SmoothStepToF(&player->unk_170, 0.0f, 1.0f, 0.2f, 0.0f);
Math_SmoothStepToF(&player->unk_16C, 0.0f, 1.0f, 0.2f, 0.0f);
+
if (gInputPress->button & Z_TRIG) {
if ((player->rollInputTimerL != 0) && (player->zRotBank > 0.0f) && (player->boostMeter < 10.0f)) {
player->rollState = 1;
@@ -3225,6 +3424,7 @@ void Player_UseTankJets(Player* player) {
player->rollInputTimerL = 10;
}
}
+
if (gInputPress->button & R_TRIG) {
if ((player->rollInputTimerR != 0) && (player->zRotBank < 0.0f) && (player->boostMeter < 10.0f)) {
player->rollState = 1;
@@ -3234,6 +3434,7 @@ void Player_UseTankJets(Player* player) {
player->rollInputTimerR = 10;
}
}
+
player->unk_18C = fabsf(SIN_DEG(player->zRotBank) * 25.0f);
player->unk_18C += fabsf(SIN_DEG(player->zRotBarrelRoll) * 20.0f);
}
@@ -3245,12 +3446,15 @@ void Player_UpdatePath(Player* player) {
player->zPathVel = -player->vel.z;
player->zPath += -player->vel.z;
+
gPathVelZ = -player->vel.z;
gPathProgress = player->zPath;
gPathTexScroll += player->zPathVel;
+
if (gGroundType == 4) {
gPathGroundScroll = player->zPathVel;
}
+
if (!gBossActive && (player->zPath > 500000.0f)) {
player->zPath = 0.0f;
player->pos.z = 0.0f;
@@ -3267,6 +3471,7 @@ void Player_UpdatePath(Player* player) {
break;
}
}
+
while (true) {
if (player->bankAngle < -360.0f) {
player->bankAngle += 360.0f;
@@ -3274,6 +3479,7 @@ void Player_UpdatePath(Player* player) {
break;
}
}
+
if (gCurrentLevel == LEVEL_UNK_15) {
Math_SmoothStepToF(&player->pathStep, 10.0f, 0.1f, 0.5f, 0.0001f);
player->pos.x += Math_SmoothStepToF(&player->xPath, player->xPathTarget, 0.1f, player->pathStep, 0.0001f);
@@ -3283,6 +3489,7 @@ void Player_UpdatePath(Player* player) {
gPathVelX = Math_SmoothStepToF(&player->xPath, player->xPathTarget, 0.1f, player->pathStep, 0.0001f);
gPathVelY = Math_SmoothStepToF(&player->yPath, player->yPathTarget, 0.1f, player->pathStep, 0.0001f);
}
+
if (player->pathChangeTimer != 0) {
player->pathChangeTimer--;
Math_SmoothStepToF(&player->yRot_114, player->pathChangeYaw, 0.03f, 0.5f, 0.0001f);
@@ -3364,16 +3571,22 @@ void Player_MoveArwing360(Player* player) {
gPlayerTurnRate = 2.3f;
gPlayerTurnStickMod = 0.68f;
+
sp7C = -gInputPress->stick_x;
sp78 = gInputPress->stick_y;
+
Math_SmoothStepToAngle(&player->aerobaticPitch, 0.0f, 0.1f, 5.0f, 0.01f);
Matrix_RotateZ(gCalcMatrix, -player->zRotBank * M_DTOR, MTXF_NEW);
+
sp4C.x = sp7C * 0.75f;
sp4C.y = sp78 * 0.75f;
sp4C.z = 0.0f;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp4C, &sp40);
+
sp60 = sp40.y;
sp5C = sp58 = 0.0f;
+
if (sp40.x < -5.0f) {
sp5C = -sp40.x;
}
@@ -3386,16 +3599,20 @@ void Player_MoveArwing360(Player* player) {
Math_SmoothStepToF(&player->wings.unk_08, -sp60 - sp5C, 0.1f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_0C, -sp60 + sp58, 0.1f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_10, -sp60 - sp58, 0.1f, 100.0f, 0.0f);
+
scale = 0.1f;
if ((player->zRotBank > 10.0f) && (sp7C > 0)) {
gPlayerTurnRate *= 2.0f;
scale = 0.2f;
}
+
if ((player->zRotBank < -10.0f) && (sp7C < 0)) {
gPlayerTurnRate *= 2.0f;
scale = 0.2f;
}
+
Math_SmoothStepToF(&player->rot.y, sp7C * gPlayerTurnStickMod, scale, gPlayerTurnRate, 0.03f);
+
scale = 0.03f;
if ((player->zRotBank > 10.0f) && (sp7C > 0)) {
scale = 0.05f;
@@ -3403,7 +3620,9 @@ void Player_MoveArwing360(Player* player) {
if ((player->zRotBank < -10.0f) && (sp7C < 0)) {
scale = 0.05f;
}
+
Math_SmoothStepToF(&player->yRotVel_11C, player->rot.y * scale, 0.1f, 0.8f, 0.05f);
+
player->yRot_114 += player->yRotVel_11C;
if (player->yRot_114 >= 360.0f) {
player->yRot_114 -= 360.0f;
@@ -3411,33 +3630,44 @@ void Player_MoveArwing360(Player* player) {
if (player->yRot_114 < 0.0f) {
player->yRot_114 += 360.0f;
}
+
gPlayerTurnRate = 2.3f;
var_fa1 = 0.1f;
temp = -sp78 * gPlayerTurnStickMod;
+
if ((temp <= 0.0f) && (player->pos.y < (gGroundHeight + 50.0f))) {
gPlayerTurnRate *= 2.0f;
temp = 0.0f;
var_fa1 = 0.2f;
}
+
Math_SmoothStepToF(&player->rot.x, temp, var_fa1, gPlayerTurnRate, 0.03f);
+
var_fv1 = 1.5f;
if (player->pos.y < (gGroundHeight + 70.0f)) {
var_fv1 = 0.8f;
}
+
if (!((gInputHold->button & R_TRIG) && (gInputHold->button & Z_TRIG)) &&
!(!(gInputHold->button & R_TRIG) && !(gInputHold->button & Z_TRIG))) {
var_fv1 = 0.1f;
}
+
var_fv0 = 4.0f;
if (sp7C == 0) {
var_fv0 = 1.0f;
}
+
Math_SmoothStepToF(&player->rot.z, sp7C * 0.6f * var_fv1, 0.1f, var_fv0, 0.03f);
+
player->bankAngle = player->rot.z + player->zRotBank + player->zRotBarrelRoll;
+
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + 180.0f) * M_DTOR, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, -((player->xRot_120 + player->rot.x + player->aerobaticPitch) * M_DTOR), MTXF_APPLY);
+
sp4C.x = 0.0f;
sp4C.y = 0.0f;
+
if (player->wings.rightState <= WINGSTATE_BROKEN) {
sp4C.x -= 2.5f;
sp4C.y -= 2.5f;
@@ -3447,15 +3677,20 @@ void Player_MoveArwing360(Player* player) {
sp4C.y -= 2.5f;
}
sp4C.z = player->baseSpeed + player->boostSpeed;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp4C, &sp40);
+
player->vel.x = sp40.x;
player->vel.z = sp40.z;
player->vel.y = sp40.y;
+
player->pos.x += player->vel.x;
player->pos.y += player->vel.y;
+
if ((player->pathHeight < player->pos.y) && (player->vel.y >= 0.0f)) {
Math_SmoothStepToF(&player->pos.y, player->pathHeight, 0.1f, fabsf(player->vel.y * 1.5f) + 5.0f, 0.0f);
}
+
if ((player->pos.y < player->pathFloor) && (player->vel.y <= 0.0f)) {
if (player->pathFloor >= 0.0f) {
player->pos.y = player->pathFloor;
@@ -3463,13 +3698,17 @@ void Player_MoveArwing360(Player* player) {
Math_SmoothStepToF(&player->pos.y, player->pathFloor, 0.1f, fabsf(player->vel.y * 1.5f) + 5.0f, 0.0f);
}
}
+
player->pos.z += player->vel.z;
+
if (player->pathHeight - 100.0f < player->pos.y) {
player->flags_228 = PFLAG_228_3;
}
+
if (player->pos.y < -(player->pathHeight - 100.0f)) {
player->flags_228 = PFLAG_228_2;
}
+
Player_CheckBounds360(player);
player->trueZpos = player->pos.z;
Player_WingEffects(player);
@@ -3478,36 +3717,43 @@ void Player_MoveArwing360(Player* player) {
void Player_PerformLoop(Player* player) {
f32 temp;
- f32 sp58;
+ f32 sp58 = 60.0f;
Vec3f sp4C;
Vec3f sp40;
- sp58 = 60.0f;
if (gVersusMode) {
gVsLockOnTimers[player->num][0] = gVsLockOnTimers[player->num][1] = gVsLockOnTimers[player->num][2] =
gVsLockOnTimers[player->num][3] = 0;
}
+
if (player->aerobaticPitch > 240.0f) {
sp58 = -50.0f;
}
+
Math_SmoothStepToF(&player->wings.unk_04, sp58, 0.3f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_08, sp58, 0.3f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_0C, sp58, 0.3f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_10, sp58, 0.3f, 100.0f, 0.0f);
+
if (player->aerobaticPitch < 180.0f) {
player->pos.y += 2.0f;
}
+
player->boostCooldown = true;
+
if (gLevelMode == LEVELMODE_ON_RAILS) {
player->boostMeter += 2.0f;
} else {
player->boostMeter += 1.0f;
}
+
if (player->boostMeter > 90.0f) {
player->boostMeter = 90.0f;
}
+
player->unk_190 = 2;
Math_SmoothStepToF(&player->aerobaticPitch, 360.0f, 0.1f, 5.0f, 0.001f);
+
if (player->aerobaticPitch > 350.0f) {
player->somersault = false;
if (gLevelMode != LEVELMODE_ON_RAILS) {
@@ -3522,20 +3768,28 @@ void Player_PerformLoop(Player* player) {
}
Math_SmoothStepToF(&player->rot.z, 0.0f, 0.1f, 5.0f, 0.0f);
Math_SmoothStepToF(&player->rot.x, 0.0f, 0.1f, 5.0f, 0.0f);
+
temp = -gInputPress->stick_x * 0.68f;
+
Math_SmoothStepToF(&player->rot.y, temp, 0.1f, 2.0f, 0.0f);
+
player->bankAngle = player->rot.z + player->zRotBank + player->zRotBarrelRoll;
+
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + 180.0f) * M_DTOR, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, -((player->xRot_120 + player->rot.x + player->aerobaticPitch) * M_DTOR), MTXF_APPLY);
+
sp4C.x = 0.0f;
sp4C.y = 0.0f;
sp4C.z = player->baseSpeed;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp4C, &sp40);
+
player->vel.x = sp40.x;
player->vel.z = sp40.z;
player->vel.y = sp40.y;
player->pos.x += player->vel.x;
player->pos.y += player->vel.y;
+
if (player->pos.y < player->pathFloor + player->yPath) {
player->pos.y = player->pathFloor + player->yPath;
player->vel.y = 0.0f;
@@ -3764,14 +4018,17 @@ void Player_MoveTank360(Player* player) {
if (var_fv1 < player->unk_17C) {
player->unk_17C -= 3.0f;
}
+
if (player->unk_180 < 0) {
player->unk_180 += 3.0f;
}
if (player->unk_180 > 0) {
player->unk_180 -= 3.0f;
}
+
gPlayerTurnRate = 3.0f;
gPlayerTurnStickMod = 0.6666f;
+
sp5C = gInputPress->stick_x;
if (sp5C == 0) {
Math_SmoothStepToF(&player->rot.y, -sp5C * gPlayerTurnStickMod, 0.1f, gPlayerTurnRate * 0.5f, 0.1f);
@@ -3779,6 +4036,7 @@ void Player_MoveTank360(Player* player) {
Math_SmoothStepToF(&player->rot.y, -sp5C * gPlayerTurnStickMod, 0.1f, gPlayerTurnRate, 0.1f);
}
player->rot_104.y = player->rot.y;
+
var_fa0 = 0.03f;
var_fa1 = 1.5f;
if ((player->zRotBank > 10.0f) && (sp5C < 0.0f)) {
@@ -3799,29 +4057,38 @@ void Player_MoveTank360(Player* player) {
var_fa1 = 20.0f;
}
}
+
Math_SmoothStepToF(&player->yRotVel_11C, player->rot.y * var_fa0, 0.1f, var_fa1, 0.05f);
+
player->yRot_114 += player->yRotVel_11C;
player->yRot_114 = Math_ModF(player->yRot_114, 360.0f);
+
Matrix_RotateX(gCalcMatrix, player->rot_104.x * M_DTOR, MTXF_NEW);
Matrix_RotateZ(gCalcMatrix, player->rot_104.z * M_DTOR, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + 180.0f) * M_DTOR, MTXF_APPLY);
+
sp44.x = 0.0f;
sp44.y = 0.0f;
sp44.z = player->baseSpeed;
sp44.z -= fabsf((player->unk_184 * 0.4f * player->baseSpeed) / 15.0f);
sp44.z += SIN_DEG(player->unk_000) * player->boostSpeed;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38);
+
player->vel.x = sp38.x;
player->vel.z = sp38.z;
+
if (player->unk_16C > 0.2f) {
Math_SmoothStepToF(&player->unk_184, player->baseSpeed * 0.5f, 1.0f, 1.0f, 0);
}
+
if (player->unk_170 > 0.2f) {
Math_SmoothStepToF(&player->unk_184, -player->baseSpeed * 0.5f, 1.0f, 1.0f, 0);
}
if (!(player->unk_170 > 0.2f) && !(player->unk_16C > 0.2f) && player->grounded) {
Math_SmoothStepToF(&player->unk_184, 0.0f, 1.0f, 0.75f, 0.0f);
}
+
if (player->rollState != 0) {
if (player->rollRate < 0) {
player->unk_184 = 15.0f;
@@ -3830,21 +4097,27 @@ void Player_MoveTank360(Player* player) {
player->unk_184 = -15.0f;
}
}
+
sp44.x = -player->unk_184;
sp44.y = 0;
sp44.z = 0;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38);
+
player->pos.x += sp38.x;
player->pos.z += sp38.z;
player->pos.x += player->vel.x;
player->vel.y -= player->gravity;
player->pos.y += player->vel.y;
+
if (player->grounded) {
Math_SmoothStepToAngle(&player->rot.x, player->rot_104.x, 0.2f, 5.0f, 0.005f);
Math_SmoothStepToAngle(&player->rot.z, player->rot_104.z, 0.2f, 5.0f, 0.005f);
Math_SmoothStepToF(&player->unk_000, 0.0f, 0.1f, 5.0f, 0.00001f);
}
+
player->grounded = false;
+
if (player->pos.y <= gGroundHeight - 5.0f) {
player->pos.y = gGroundHeight - 5.0f;
if (player->vel.y < -20.0f) {
@@ -3853,16 +4126,19 @@ void Player_MoveTank360(Player* player) {
player->vel.y = 0.0f;
player->grounded = true;
}
+
if (player->vel.y < -80.0f) {
player->vel.y = -80.0f;
}
if (player->vel.y > 20.0f) {
player->vel.y = 20.0f;
}
+
player->pos.z += player->vel.z;
Player_CheckBounds360(player);
player->trueZpos = player->pos.z;
player->bankAngle = player->rot.z + player->zRotBank + player->zRotBarrelRoll;
+
if (player->grounded) {
player->rockPhase += player->baseSpeed * 5.0f;
player->rockAngle = SIN_DEG(player->rockPhase) * 0.7f;
@@ -3901,6 +4177,7 @@ void Player_MoveOnFoot(Player* player) {
s32 pad;
player->camRoll = 0.0f;
+
var_fa0 = 0.0f;
if (player->pos.y > 10.0f) {
var_fa0 = 20.0f;
@@ -3908,6 +4185,7 @@ void Player_MoveOnFoot(Player* player) {
if (player->pos.y > 300.0f) {
var_fa0 = 40.0f;
}
+
sp74 = gInputPress->stick_y * 0.8f;
if (sp74 < -40.0f) {
sp74 = -40.0f;
@@ -3915,17 +4193,22 @@ void Player_MoveOnFoot(Player* player) {
if (var_fa0 < sp74) {
sp74 = var_fa0;
}
+
Math_SmoothStepToF(&player->unk_154, sp74, 0.1f, 3.0f, 0.00001f);
Math_SmoothStepToF(&player->unk_180, 0.0f, 0.15f, 5.0f, 0.00001f);
Math_SmoothStepToF(&player->unk_158, sp74, 0.2f, 5.0f, 0.00001f);
+
gPlayerTurnRate = 3.0f;
gPlayerTurnStickMod = 0.666f;
+
sp74 = gInputPress->stick_x;
sp70 = gInputPress->stick_y;
Math_SmoothStepToF(&player->rot.y, -sp74 * gPlayerTurnStickMod * 0.6f, 0.5f, gPlayerTurnRate, 0.001f);
Math_SmoothStepToF(&player->rot.z, -sp74 * gPlayerTurnStickMod * 0.2f * player->baseSpeed / 15.0f, 0.2f, 5.0f,
0.001f);
+
player->bankAngle = player->rot.z;
+
if ((sp74 != 0.0f) || (sp70 != 0.0f)) {
Math_SmoothStepToF(&player->unk_15C, sp74 * gPlayerTurnStickMod, 0.9f, 2.0f * gPlayerTurnRate, 0.1f);
Math_SmoothStepToF(&player->unk_164, sp74 * 0.3f, 0.1f, 10.0f, 0.00001f);
@@ -3944,7 +4227,9 @@ void Player_MoveOnFoot(Player* player) {
Math_SmoothStepToF(&player->unk_164, player->unk_174, 0.1f, 10.0f, 0.00001f);
Math_SmoothStepToF(&player->unk_168, player->unk_178, 0.1f, 10.0f, 0.00001f);
}
+
player->rot_104.y = player->rot.y;
+
if (player->baseSpeed < 1.5f) {
var_fv0 = 0.12f;
var_fa0 = 3.0f;
@@ -3952,37 +4237,50 @@ void Player_MoveOnFoot(Player* player) {
var_fv0 = 0.08f;
var_fa0 = 1.5f;
}
+
Math_SmoothStepToF(&player->yRotVel_11C, -sp74 * gPlayerTurnStickMod * var_fv0, 0.2f, var_fa0, 0.0f);
+
player->yRot_114 += player->yRotVel_11C;
player->yRot_114 = Math_ModF(player->yRot_114, 360.0f);
+
Matrix_RotateX(gCalcMatrix, player->rot_104.x * M_DTOR, MTXF_NEW);
Matrix_RotateZ(gCalcMatrix, player->rot_104.z * M_DTOR, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + player->rot.y + 180.0f) * M_DTOR, MTXF_APPLY);
+
sp58.x = 0.0f;
sp58.y = 0.0f;
sp58.z = player->baseSpeed;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp58, &sp4C);
+
player->vel.x = sp4C.x;
player->vel.z = sp4C.z;
player->pos.x += player->vel.x;
+
if ((player->pos.y < 40.0f) || (player->pos.y > 670.0f)) {
player->rot_104.z = 0.0f;
player->rot_104.x = 0.0f;
}
+
Math_SmoothStepToAngle(&player->xRot_0FC, player->rot_104.x, 0.15f, 15.0f, 0.005f);
Math_SmoothStepToAngle(&player->zRot_0FC, player->rot_104.z, 0.15f, 15.0f, 0.005f);
+
if (player->grounded) {
if (player->baseSpeed > 1.0f) {
player->unk_00C += player->unk_008;
+
if ((s32) player->unk_00C >= Animation_GetFrameCount(&D_versus_301CFEC)) {
player->unk_00C = 0.0f;
}
+
player->yBob = 2.0f * SIN_DEG((player->unk_20C + 7) * 24.0f);
if (player->yBob < -0.5f) {
player->yBob = -0.5f;
}
+
player->yBob -= 3.0f;
player->unk_20C = player->unk_00C;
+
switch (gPlayerNum) {
case 0:
sp44 = Animation_GetFrameData(&D_versus_301CFEC, player->unk_20C, sp78);
@@ -3997,10 +4295,13 @@ void Player_MoveOnFoot(Player* player) {
sp44 = Animation_GetFrameData(&D_versus_301C3A8, player->unk_20C, sp78);
break;
}
+
Math_SmoothStepToVec3fArray(sp78, player->jointTable, 1, sp44, 1.0f, player->unk_010, 0.01f);
+
if (player->unk_010 < 50.0f) {
player->unk_010 += 2.0f;
}
+
sp64 = player->baseSpeed;
if (gGameFrameCount & 4) {
sp64 = 2.0f * player->baseSpeed;
@@ -4014,6 +4315,7 @@ void Player_MoveOnFoot(Player* player) {
player->unk_010 = 0.0f;
}
}
+
switch (gPlayerNum) {
case 0:
sp48 = SEGMENTED_TO_VIRTUAL(D_versus_302E56C);
@@ -4036,6 +4338,7 @@ void Player_MoveOnFoot(Player* player) {
player->unk_00C = 0.0f;
}
}
+
if (!player->grounded) {
switch (gPlayerNum) {
case 0:
@@ -4053,6 +4356,7 @@ void Player_MoveOnFoot(Player* player) {
}
Math_SmoothStepToVec3fArray(sp48, player->jointTable, 1, 24, 0.2f, 10.0f, 0.01f);
}
+
player->gravity = 2.0f;
if ((gInputPress->button & Z_TRIG) && player->grounded) {
player->vel.y = 12.0f;
@@ -4060,15 +4364,18 @@ void Player_MoveOnFoot(Player* player) {
if ((gInputHold->button & Z_TRIG) && (player->vel.y > 0.0f)) {
player->gravity = 1.5f;
}
+
player->grounded = false;
player->vel.y -= player->gravity;
player->pos.y += player->vel.y;
+
if (player->pos.y <= gGroundHeight) {
player->grounded = true;
player->pos.y = 0.0f;
player->vel.y = 0.0f;
player->rot.x += (player->pos.y - player->rot.x) * 0.05f;
}
+
if (player->vel.y < -50.0f) {
player->vel.y = -50.0f;
}
@@ -4098,6 +4405,7 @@ void Player_Setup(Player* playerx) {
gTiStartLandmaster = 0;
player->shields = 255;
+
if (gVersusMode) {
switch (gHandicap[gPlayerNum]) {
case 1:
@@ -4108,8 +4416,10 @@ void Player_Setup(Player* playerx) {
break;
}
}
+
player->wings.rightState = WINGSTATE_INTACT;
player->wings.leftState = WINGSTATE_INTACT;
+
if (gExpertMode) {
gLeftWingHealth[gPlayerNum] = 10;
gRightWingHealth[gPlayerNum] = 10;
@@ -4136,6 +4446,7 @@ void Player_Setup(Player* playerx) {
player->groundPos.y = -1000.0f;
player->cam.at.z = player->cam.eye.z - 1000.0f;
D_ctx_80177950 = 1.0f;
+
if ((gLevelType == LEVELTYPE_SPACE) && (gCurrentLevel != LEVEL_BOLSE)) {
player->hideShadow = true;
player->unk_0A8 = 3000.0f;
@@ -4152,8 +4463,10 @@ void Player_Setup(Player* playerx) {
player->pathFloor = gGroundHeight + 40.0f;
player->unk_0A8 = 3000.0f;
}
+
player->baseSpeed = gArwingSpeed;
player->pos.y = 350.0f;
+
switch (gCurrentLevel) {
case LEVEL_MACBETH:
case LEVEL_TITANIA:
@@ -4172,6 +4485,7 @@ void Player_Setup(Player* playerx) {
player->pos.y = 0.0f;
}
break;
+
case LEVEL_AQUAS:
player->form = FORM_BLUE_MARINE;
player->gravity = 0.0f;
@@ -4180,14 +4494,17 @@ void Player_Setup(Player* playerx) {
player->pathHeight = 720.0f;
player->pathFloor = gGroundHeight + 30.0f;
break;
+
case LEVEL_SOLAR:
case LEVEL_ZONESS:
player->pathFloor = -450.0f;
break;
}
+
if (gCurrentLevel != LEVEL_CORNERIA) {
gSavedGroundSurface = SURFACE_GRASS;
}
+
gGoldRingCount[0] = gSavedGoldRingCount[0];
do {
if (gGoldRingCount[0] > 3) {
@@ -4198,6 +4515,7 @@ void Player_Setup(Player* playerx) {
if (gGoldRingCount[0] == 3) {
gGoldRingCount[0] = 0;
}
+
gHitCount = gSavedHitCount;
if ((gCurrentLevel == LEVEL_VENOM_ANDROSS) || ((gCurrentLevel == LEVEL_VENOM_2) && (gLevelPhase == 2))) {
if (D_ctx_80177C9C != 0) {
@@ -4213,9 +4531,11 @@ void Player_Setup(Player* playerx) {
}
gHitCount = gSavedHitCount = D_ctx_80177CA4;
}
+
D_hud_80161720[0] = 0.0f;
D_hud_80161720[1] = 0.0f;
D_hud_80161720[2] = 0.0f;
+
gDisplayedHitCount = gHitCount;
D_hud_80161730 = 0;
gMissedZoSearchlight = gSavedZoSearchlightStatus;
@@ -4223,6 +4543,7 @@ void Player_Setup(Player* playerx) {
gGroundSurface = gSavedGroundSurface;
gPathProgress = player->zPath = gSavedPathProgress;
player->pos.z = player->trueZpos = -player->zPath;
+
if ((gSavedObjectLoadIndex > 0) && (gLevelMode == LEVELMODE_ON_RAILS)) {
if (gCurrentLevel == LEVEL_MACBETH) {
sp2E = gObjectLoadIndex;
@@ -4231,6 +4552,7 @@ void Player_Setup(Player* playerx) {
}
func_enmy_80062568();
}
+
if (player->form == FORM_LANDMASTER) {
player->pos.z -= 200.0f;
player->trueZpos -= 200.0f;
@@ -4247,18 +4569,22 @@ void Player_Setup(Player* playerx) {
player->pos.z = D_800D3124[gPlayerNum];
player->yRot_114 = D_800D3154[gPlayerNum];
player->form = gPlayerForms[gPlayerNum];
+
switch (player->form) {
case FORM_ARWING:
break;
+
case FORM_LANDMASTER:
player->pos.y = 0.0f;
player->baseSpeed = 15.0f;
player->gravity = 3.0f;
break;
+
case FORM_ON_FOOT:
player->pos.y = 0.0f;
player->baseSpeed = 15.0f;
player->groundPos.y = 0;
+
switch (gPlayerNum) {
case 0:
sp38 = SEGMENTED_TO_VIRTUAL(D_versus_302E56C);
@@ -4273,6 +4599,7 @@ void Player_Setup(Player* playerx) {
sp38 = SEGMENTED_TO_VIRTUAL(D_versus_302E65C);
break;
}
+
for (j = 0; j < 30; j++, sp38++) {
player->jointTable[j] = *sp38;
}
@@ -4280,8 +4607,10 @@ void Player_Setup(Player* playerx) {
}
Camera_Update360(player, true);
}
+
player->state_1C8 = PLAYERSTATE_1C8_ACTIVE;
player->wingPosition = gLevelType;
+
if ((gLevelMode == LEVELMODE_ALL_RANGE) && !gVersusMode) {
player->pos.z = 8000.0f;
player->pos.y = 670.0f;
@@ -4300,14 +4629,17 @@ void Player_Setup(Player* playerx) {
player->unk_014 = 1.0f;
player->unk_018 = 1.0f;
}
+
if (D_ctx_8017782C && (gSavedObjectLoadIndex == 0)) {
gLeveLClearStatus[gCurrentLevel] = 0;
+
for (j = 0; j < 10; j++) {
D_ctx_80177A10[j] = 0;
D_ctx_80177A48[j] = 0.0f;
}
D_ctx_8017782C = false;
gAllRangeCheckpoint = 0;
+
switch (gCurrentLevel) {
case LEVEL_CORNERIA:
player->state_1C8 = PLAYERSTATE_1C8_LEVEL_INTRO;
@@ -4359,6 +4691,7 @@ void Player_Setup(Player* playerx) {
Macbeth_801ACFBC();
}
}
+
if (player->state_1C8 == PLAYERSTATE_1C8_LEVEL_INTRO) {
player->draw = true;
switch (gCurrentLevel) {
@@ -4406,6 +4739,7 @@ void Player_Setup(Player* playerx) {
if ((gCurrentLevel == LEVEL_TRAINING)) {
gClearPlayerInfo = true;
}
+
if (gClearPlayerInfo && !gVersusMode) {
for (j = TEAM_ID_FALCO; j < TEAM_ID_MAX; j++) {
gTeamShields[j] = gSavedTeamShields[j] = gPrevPlanetTeamShields[j] = gPrevPlanetSavedTeamShields[j] = 255;
@@ -4427,16 +4761,21 @@ void Player_Setup(Player* playerx) {
gClearPlayerInfo = false;
}
}
+
if ((gCurrentLevel == LEVEL_TRAINING)) {
gClearPlayerInfo = true;
}
+
player->sfx.levelType = gLevelType;
player->sfx.form = player->form;
- func_display_80057814(player);
+
+ Display_SetupPlayerSfxPos(player);
+
if (!gVersusMode && (((gCurrentLevel != LEVEL_TITANIA) && (gCurrentLevel != LEVEL_SOLAR)) || gVersusMode ||
(player->state_1C8 != PLAYERSTATE_1C8_LEVEL_INTRO))) {
Audio_StartPlayerNoise(gPlayerNum);
}
+
if ((player->form == FORM_ARWING) && !gVersusMode) {
switch (player->wingPosition) {
case 0:
@@ -4450,6 +4789,7 @@ void Player_Setup(Player* playerx) {
break;
}
}
+
if (gLaserStrength[gPlayerNum] > LASERS_SINGLE) {
player->wings.unk_14 = -10.0f;
}
@@ -4472,12 +4812,14 @@ void Player_UpdateArwingRoll(Player* player) {
Math_SmoothStepToF(&player->unk_150, 1.0f, 0.05f, 10.0f, 0.0001f);
player->zRotBarrelRoll = Math_ModF(player->zRotBarrelRoll, 360.0f);
+
if (player->barrelRollAlpha > 0) {
player->barrelRollAlpha -= 30;
if (player->barrelRollAlpha <= 0) {
player->barrelRollAlpha = 0;
}
}
+
if (player->meteoWarpTimer == 0) {
if (player->rollState == 0) {
Math_SmoothStepToF(&player->zRotBarrelRoll, 0.0f, 0.1f, 10.0f, 0.00001f);
@@ -4497,6 +4839,7 @@ void Player_UpdateArwingRoll(Player* player) {
if (player->rollTimer != 0) {
player->rollTimer--;
}
+
if (player->rollState != 0) {
player->rollInputTimerR = 0;
player->rollInputTimerL = 0;
@@ -4523,20 +4866,9 @@ void Player_UpdateArwingRoll(Player* player) {
}
void Player_UpdateTankRoll(Player* player) {
- f32 temp_fv0;
- f32 temp_fv0_2;
- s32* temp_v1;
- s32 temp_t3;
- s32 temp_t4;
- s32 temp_v0;
- s32 temp_v0_2;
- s32 temp_v0_3;
- s32 temp_v0_4;
- s32 var_v0;
-
player->zRotBarrelRoll = Math_ModF(player->zRotBarrelRoll, 360.0f);
+
if (player->rollState == 0) {
- temp_fv0 = player->zRotBarrelRoll;
if (player->zRotBarrelRoll > 0.0f) {
player->zRotBarrelRoll -= (player->zRotBarrelRoll * 0.1f);
if (player->zRotBarrelRoll < 0.1f) {
@@ -4550,7 +4882,7 @@ void Player_UpdateTankRoll(Player* player) {
}
}
}
- temp_v0 = player->rollInputTimerL;
+
if (player->rollInputTimerL != 0) {
player->rollInputTimerL--;
}
@@ -4560,6 +4892,7 @@ void Player_UpdateTankRoll(Player* player) {
if (player->rollTimer != 0) {
player->rollTimer--;
}
+
if (player->rollState != 0) {
player->rollInputTimerR = 0;
player->rollInputTimerL = 0;
@@ -4570,12 +4903,14 @@ void Player_UpdateTankRoll(Player* player) {
player->zRotBank = 0.0f;
}
}
+
if (player->zRotBank < 0.0f) {
player->zRotBank += 8.0f;
if (player->zRotBank > 0.0f) {
player->zRotBank = 0.0f;
}
}
+
if (player->rollTimer == 0) {
if (player->rollRate > 0) {
player->rollRate -= 2;
@@ -4589,6 +4924,7 @@ void Player_UpdateTankRoll(Player* player) {
} else {
Math_SmoothStepToF(&D_ctx_801779A8[player->num], 30.0f, 1.0f, 30.0f, 0.0f);
}
+
if ((player->rollTimer >= 5) && (player->mercyTimer == 0)) {
if (player->rollRate > 0) {
player->unk_170 = 1.3f;
@@ -4597,6 +4933,7 @@ void Player_UpdateTankRoll(Player* player) {
player->unk_16C = 1.3f;
}
}
+
if (gVersusMode) {
gVsLockOnTimers[player->num][0] = gVsLockOnTimers[player->num][1] = gVsLockOnTimers[player->num][2] =
gVsLockOnTimers[player->num][3] = 0;
@@ -4613,6 +4950,7 @@ void Player_ArwingBoost(Player* player) {
(gInputHold->button & gBoostButton[player->num])) {
player->boostCooldown = true;
}
+
if (gLevelMode == LEVELMODE_ON_RAILS) {
sp28 = 3.0f;
sp2C = 0.5f;
@@ -4621,8 +4959,11 @@ void Player_ArwingBoost(Player* player) {
sp28 = 1.5f;
sp2C = 0.35f;
}
+
player->sfx.boost = 0;
+
var = gInputPress->stick_y; // fake?
+
if (gLoopDownTimers[gPlayerNum] != 0) {
gLoopDownTimers[gPlayerNum]--;
}
@@ -4739,7 +5080,7 @@ void Player_ArwingBoost2(Player* player) {
void Player_ArwingBrake(Player* player) {
f32 sp34;
f32 sp30;
- s32 var;
+ s32 stickY;
if (gLevelMode == LEVELMODE_ON_RAILS) {
sp30 = 3.0f;
@@ -4748,17 +5089,21 @@ void Player_ArwingBrake(Player* player) {
sp30 = 1.5f;
sp34 = 0.35f;
}
- player->sfx.brake = 0;
- var = gInputPress->stick_y; // fake?
+
+ player->sfx.brake = false;
+
+ stickY = gInputPress->stick_y; // fake?
+
if (gUturnDownTimers[gPlayerNum] != 0) {
gUturnDownTimers[gPlayerNum]--;
}
if (gUturnBrakeTimers[gPlayerNum] != 0) {
gUturnBrakeTimers[gPlayerNum]--;
}
- if (var >= -50) {
+ if (stickY >= -50) {
gUturnDownTimers[gPlayerNum] = 5;
}
+
if ((gUturnDownTimers[gPlayerNum] > 0) && (gUturnDownTimers[gPlayerNum] < 5) && (gDrawBackdrop < 5) &&
(gUturnBrakeTimers[gPlayerNum] != 0)) {
gUturnDownTimers[gPlayerNum] = 0;
@@ -4774,6 +5119,7 @@ void Player_ArwingBrake(Player* player) {
gCoUturnCount++;
}
}
+
if ((gInputHold->button & gBrakeButton[player->num]) && !(gInputHold->button & gBoostButton[player->num]) &&
(player->state_1C8 != PLAYERSTATE_1C8_U_TURN) && !player->boostCooldown) {
if (player->boostMeter == 0.0f) {
@@ -4782,24 +5128,28 @@ void Player_ArwingBrake(Player* player) {
gUturnBrakeTimers[gPlayerNum] = 5;
}
}
+
if (gLevelType == LEVELTYPE_PLANET) {
Math_SmoothStepToF(&player->wings.unk_04, 90.0f, 0.2f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_08, -90.0f, 0.2f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_0C, 90.0f, 0.2f, 100.0f, 0.0f);
Math_SmoothStepToF(&player->wings.unk_10, -90.0f, 0.2f, 100.0f, 0.0f);
}
+
player->boostMeter += sp30;
if (player->boostMeter > 90.0f) {
player->boostCooldown = true;
player->boostMeter = 90.0f;
}
+
player->unk_190 = 0.3f;
player->boostSpeed -= 1.0f;
if (player->boostSpeed < -20.0f) {
player->boostSpeed = -20.0f;
}
+
Math_SmoothStepToF(&player->camDist, 180.0f, 0.1f, 10.0f, 0.0f);
- player->sfx.brake = 1;
+ player->sfx.brake = true;
Math_SmoothStepToF(&D_ctx_801779A8[player->num], 25.0f, 1.0f, 5.0f, 0.0f);
} else if (player->boostMeter > 0.0f) {
player->boostMeter -= sp34;
@@ -4824,12 +5174,14 @@ void Player_TankBoostBrake(Player* player) {
Math_SmoothStepToF(&player->boostMeter, 0.0f, 1.0f, 1.0f, 0.0f);
}
player->boostActive = false;
+
if (player->boostMeter == 0.0f) {
player->boostCooldown = false;
} else if (!(gInputHold->button & Z_TRIG) && !(gInputHold->button & R_TRIG) &&
!(gInputHold->button & gBoostButton[player->num]) && !(gInputHold->button & gBrakeButton[player->num])) {
player->boostCooldown = true;
}
+
sp2C = 20.0f;
if ((gInputHold->button & gBoostButton[player->num]) && !player->boostCooldown) {
if (player->boostMeter == 0.0f) {
@@ -4846,6 +5198,7 @@ void Player_TankBoostBrake(Player* player) {
player->boostCooldown = true;
}
}
+
if ((gInputHold->button & gBrakeButton[player->num]) && !player->boostCooldown) {
if (player->boostMeter == 0.0f) {
Player_PlaySfx(player->sfxSource, NA_SE_ARWING_BRAKE, player->num);
@@ -4862,22 +5215,29 @@ void Player_TankBoostBrake(Player* player) {
}
void Player_UpdateTankJets(Player* player) {
- f32 temp;
- f32 temp2;
+ f32 stickY;
+ s32 pad;
player->gravity = 3.0f;
+
if ((gInputHold->button & Z_TRIG) && !player->boostCooldown) {
if (player->boostMeter == 0.0f) {
Player_PlaySfx(player->sfxSource, NA_SE_ARWING_BOOST, player->num);
}
+
player->unk_188 = 0.0f;
+
player->zRotBank += 4.0f;
if (player->zRotBank > 50.0f) {
player->zRotBank = 50.0f;
}
+
Math_SmoothStepToF(&player->unk_170, 1.0f, 1.0f, 0.4f, 0.0f);
+
player->boostActive = true;
+
Math_SmoothStepToF(&player->boostMeter, 90.0f, 1.0f, 0.7f, 0.0f);
+
if (player->boostMeter >= 90.0f) {
player->boostCooldown = true;
}
@@ -4898,14 +5258,20 @@ void Player_UpdateTankJets(Player* player) {
if (player->boostMeter == 0.0f) {
Player_PlaySfx(player->sfxSource, NA_SE_ARWING_BOOST, player->num);
}
+
player->unk_188 = 0.0f;
+
player->zRotBank -= 4.0f;
if (player->zRotBank < -50.0f) {
player->zRotBank = -50.0f;
}
+
Math_SmoothStepToF(&player->unk_16C, 1.0f, 1.0f, 0.4f, 0.0f);
+
player->boostActive = true;
+
Math_SmoothStepToF(&player->boostMeter, 90.0f, 1.0f, 0.7f, 0.0f);
+
if (player->boostMeter >= 90.0f) {
player->boostCooldown = true;
}
@@ -4920,27 +5286,28 @@ void Player_UpdateTankJets(Player* player) {
}
}
}
+
if ((player->unk_16C > 0.2f) && (player->unk_170 > 0.2f) && (player->radioDamageTimer == 0)) {
player->zRotBank += (((__cosf(gGameFrameCount * M_DTOR * 8.0f) * 10.0f) - player->zRotBank) * 0.1f);
Math_SmoothStepToAngle(&player->rot.x, 0.0f, 0.05f, 5.0f, 0.00001f);
Math_SmoothStepToAngle(&player->rot.z, 0.0f, 0.05f, 5.0f, 0.00001f);
- temp = gInputPress->stick_y;
- Math_SmoothStepToF(&player->unk_000, temp * 0.5f, 0.05f, 5.0f, 0.00001f);
+ stickY = gInputPress->stick_y;
+ Math_SmoothStepToF(&player->unk_000, stickY * 0.5f, 0.05f, 5.0f, 0.00001f);
Math_SmoothStepToF(&player->boostSpeed, 30.0f, 0.5f, 5.0f, 0.0f);
player->gravity = -0.4f;
Math_SmoothStepToF(&D_ctx_801779A8[player->num], 30.0f, 1.0f, 10.0f, 0.0f);
if ((gCamCount == 1) && ((gGameFrameCount % 2) == 0)) {
- func_effect_8007BC7C(RAND_FLOAT_CENTERED(20.0f) + player->pos.x, player->groundPos.y + 10.0f,
- player->trueZpos - 10.0f, RAND_FLOAT(2.0f) + 4.0f);
+ Effect_Effect362_Spawn(RAND_FLOAT_CENTERED(20.0f) + player->pos.x, player->groundPos.y + 10.0f,
+ player->trueZpos - 10.0f, RAND_FLOAT(2.0f) + 4.0f);
}
} else if ((gCamCount == 1) && ((gGameFrameCount % 4) == 0) && (player->rollState == 0)) {
if ((player->unk_16C > 0.2f) && (player->radioDamageTimer == 0)) {
- func_effect_8007BC7C(RAND_FLOAT_CENTERED(10.0f) + (player->pos.x - 57.0f), player->groundPos.y + 10.0f,
- player->trueZpos - 10.0f, RAND_FLOAT(2.0f) + 3.0f);
+ Effect_Effect362_Spawn(RAND_FLOAT_CENTERED(10.0f) + (player->pos.x - 57.0f), player->groundPos.y + 10.0f,
+ player->trueZpos - 10.0f, RAND_FLOAT(2.0f) + 3.0f);
}
if ((player->unk_170 > 0.2f) && (player->radioDamageTimer == 0)) {
- func_effect_8007BC7C(RAND_FLOAT_CENTERED(10.0f) + (player->pos.x + 57.0f), player->groundPos.y + 10.0f,
- player->trueZpos - 10.0f, RAND_FLOAT(2.0f) + 3.0f);
+ Effect_Effect362_Spawn(RAND_FLOAT_CENTERED(10.0f) + (player->pos.x + 57.0f), player->groundPos.y + 10.0f,
+ player->trueZpos - 10.0f, RAND_FLOAT(2.0f) + 3.0f);
}
}
}
@@ -4953,9 +5320,11 @@ void Player_UpdateEffects(Player* player) {
s32 i;
player->xShake = 0.0f;
+
player->basePos.x = player->pos.x;
player->basePos.y = player->pos.y;
player->basePos.z = player->pos.z;
+
if (player->csTimer != 0) {
player->csTimer--;
}
@@ -4971,6 +5340,7 @@ void Player_UpdateEffects(Player* player) {
if (player->dmgEffectTimer != 0) {
player->dmgEffectTimer--;
}
+
if (gVersusMode) {
for (i = 0; i < gCamCount; i++) {
if ((gVsLockOnTimers[player->num][i] != 0) && !(gControllerHold[i].button & A_BUTTON)) {
@@ -4978,6 +5348,7 @@ void Player_UpdateEffects(Player* player) {
}
}
}
+
if (gRightWingFlashTimer[player->num] != 0) {
gRightWingFlashTimer[player->num]--;
if (gRightWingFlashTimer[player->num] == 1000) {
@@ -4996,17 +5367,22 @@ void Player_UpdateEffects(Player* player) {
if (gRightWingDebrisTimer[player->num] != 0) {
gRightWingDebrisTimer[player->num]--;
}
+
if (gShieldTimer[player->num] != 0) {
gShieldTimer[player->num]--;
Math_SmoothStepToF(&gShieldAlpha[player->num], 128.0f, 1.0f, 40.0f, 0.01f);
} else {
Math_SmoothStepToF(&gShieldAlpha[player->num], 0.0f, 1.0f, 10.0f, 0.01f);
}
+
Math_SmoothStepToF(&gMuzzleFlashScale[player->num], 0.0f, 1.0f, 0.4f, 0.01f);
+
if ((player->form == FORM_LANDMASTER) && (player->unk_1A0 != 0)) {
player->unk_1A0--;
}
+
player->dmgEffect = player->dmgEffectTimer & 1;
+
if (player->dmgEffectTimer != 0) {
gFillScreenAlphaStep = 8;
}
@@ -5015,6 +5391,7 @@ void Player_UpdateEffects(Player* player) {
gFillScreenRed = 255;
gFillScreenGreen = gFillScreenBlue = 0;
}
+
if (player->timer_278 != 0) {
if ((player->timer_278 % 8) == 0) {
if (player->timer_278 & 8) {
@@ -5025,11 +5402,13 @@ void Player_UpdateEffects(Player* player) {
}
player->timer_278--;
}
+
if (player->hitTimer > 0) {
if (player->hitTimer > 3) {
*gControllerRumble = 1;
}
player->hitTimer--;
+
if (player->form == FORM_ARWING) {
player->damageShake =
SIN_DEG(player->hitTimer * 400.0f) * player->hitTimer * D_800D3164[player->hitDirection];
@@ -5042,6 +5421,7 @@ void Player_UpdateEffects(Player* player) {
SIN_DEG(player->hitTimer * 400.0f) * player->hitTimer * D_800D3164[player->hitDirection] * 1.5f;
player->xShake = 0.0f;
}
+
if ((gLevelMode != LEVELMODE_UNK_2) &&
((player->knockback.x != 0.f) || (player->knockback.y != 0.f) || (player->knockback.z != 0.f)) &&
((player->dmgType >= 40) || (player->dmgType == 21))) {
@@ -5050,18 +5430,23 @@ void Player_UpdateEffects(Player* player) {
player->rot.y = 0;
Math_SmoothStepToF(&player->boostSpeed, 0, 1.0f, 5.0f, 0);
}
+
if (player->hitTimer == 0) {
player->damageShake = 0;
}
}
+
player->pos.x += player->knockback.x;
player->pos.y += player->knockback.y;
+
if (gLevelMode == LEVELMODE_ALL_RANGE) {
player->pos.z += player->knockback.z;
Math_SmoothStepToF(&player->knockback.z, 0, 0.1f, 1.0f, 0.5f);
}
+
Math_SmoothStepToF(&player->knockback.x, 0, 0.1f, 1.0f, 0.5f);
Math_SmoothStepToF(&player->knockback.y, 0, 0.1f, 1.0f, 0.5f);
+
player->contrailScale -= 0.02f;
if (player->contrailScale < 0.0f) {
player->contrailScale = 0.0f;
@@ -5080,6 +5465,7 @@ void Player_UpdateShields(Player* player) {
player->damage = 0;
}
}
+
if (player->heal > 0) {
player->damage = 0;
player->heal -= 2;
@@ -5096,19 +5482,19 @@ void Player_UpdateShields(Player* player) {
}
void Player_LowHealthAlarm(Player* player) {
- s32 var_v0;
+ s32 mask;
Player_UpdateShields(player);
if (player->shields < 128) {
if (player->shields > 80) {
- var_v0 = 64 - 1;
+ mask = 64 - 1;
} else if (player->shields > 40) {
- var_v0 = 32 - 1;
+ mask = 32 - 1;
} else {
- var_v0 = 16 - 1;
+ mask = 16 - 1;
}
- if ((gGameFrameCount & var_v0) == 0) {
+ if ((gGameFrameCount & mask) == 0) {
Object_PlayerSfx(player->sfxSource, NA_SE_SHIELD_BUZZER, player->num);
}
}
@@ -5119,6 +5505,7 @@ void Play_dummy_800B41E0(Player* player) {
void Player_Down(Player* player) {
player->state_1C8 = PLAYERSTATE_1C8_DOWN;
+
if (!gVersusMode) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM, 1);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 1);
@@ -5147,16 +5534,19 @@ void Player_UpdateOnRails(Player* player) {
gInputHold->button = gBoostButton[player->num];
player->boostMeter = 1.0f;
}
+
Player_ArwingBank(player);
Player_ArwingBoost(player);
Player_ArwingBrake(player);
Play_dummy_800B41E0(player);
Player_UpdateArwingRoll(player);
+
if (player->somersault) {
Player_PerformLoop(player);
} else {
Player_MoveArwingOnRails(player);
}
+
Player_UpdatePath(player);
Player_Shoot(player);
Player_CollisionCheck(player);
@@ -5164,6 +5554,7 @@ void Player_UpdateOnRails(Player* player) {
Player_WaterEffects(player);
Player_FloorCheck(player);
Player_LowHealthAlarm(player);
+
if ((player->shields <= 0) && (player->radioDamageTimer != 0)) {
Player_Down(player);
player->vel.x *= 0.2f;
@@ -5177,9 +5568,11 @@ void Player_UpdateOnRails(Player* player) {
player->csEventTimer = 120;
}
break;
+
case FORM_LANDMASTER:
Tank_UpdateOnRails(player);
break;
+
case FORM_BLUE_MARINE:
Aquas_BlueMarineBoost(player);
Aquas_BlueMarineBrake(player);
@@ -5190,6 +5583,7 @@ void Player_UpdateOnRails(Player* player) {
Player_CollisionCheck(player);
Player_FloorCheck(player);
Player_LowHealthAlarm(player);
+
if ((player->shields <= 0) && (player->radioDamageTimer != 0)) {
Player_Down(player);
}
@@ -5205,16 +5599,19 @@ void Player_Update360(Player* player) {
Player_ArwingBrake(player);
Play_dummy_800B41E0(player);
Player_UpdateArwingRoll(player);
+
if (player->somersault) {
Player_PerformLoop(player);
} else {
Player_MoveArwing360(player);
}
+
Player_Shoot(player);
Player_CollisionCheck(player);
Player_WaterEffects(player);
Player_FloorCheck(player);
Player_LowHealthAlarm(player);
+
if ((player->shields <= 0) && (player->radioDamageTimer != 0)) {
Player_Down(player);
player->vel.y = 5.0f;
@@ -5232,6 +5629,7 @@ void Player_Update360(Player* player) {
player->aerobaticPitch = 0.0f;
}
break;
+
case FORM_LANDMASTER:
Player_UseTankJets(player);
Player_UpdateTankJets(player);
@@ -5247,9 +5645,11 @@ void Player_Update360(Player* player) {
Player_Down(player);
}
break;
+
case FORM_BLUE_MARINE:
Aquas_Update360(player);
break;
+
case FORM_ON_FOOT:
Player_OnFootUpdateSpeed(player);
Player_MoveOnFoot(player);
@@ -5257,6 +5657,7 @@ void Player_Update360(Player* player) {
Player_CollisionCheck(player);
Player_FloorCheck(player);
Player_LowHealthAlarm(player);
+
if ((player->shields <= 0) && (player->radioDamageTimer != 0)) {
Player_Down(player);
}
@@ -5279,6 +5680,7 @@ void Player_LowHealthMsg(Player* player) {
teamId = RAND_INT(2.9f) + 1;
} while (gTeamShields[teamId] <= 0);
} while (0); // macro?
+
switch (teamId) {
case 1:
if (Rand_ZeroOne() < 0.5f) {
@@ -5341,7 +5743,9 @@ void Player_Update(Player* player) {
if (player->state_1C8 > PLAYERSTATE_1C8_INIT) {
Player_UpdateEffects(player);
}
+
player->flags_228 = 0;
+
if ((player->state_1C8 > PLAYERSTATE_1C8_INIT) && (player->form == FORM_ARWING) && !gVersusMode) {
switch (player->wingPosition) {
case 0:
@@ -5361,28 +5765,33 @@ void Player_Update(Player* player) {
if (sp1C4 != 0) {
player->whooshTimer--;
}
+
switch (player->state_1C8) {
case PLAYERSTATE_1C8_STANDBY:
player->draw = false;
gShowHud = 0;
gPauseEnabled = false;
break;
+
case PLAYERSTATE_1C8_INIT:
Player_Setup(player);
gFillScreenAlphaTarget = 0;
gPauseEnabled = false;
break;
+
case PLAYERSTATE_1C8_LEVEL_INTRO:
gShowHud = 0;
gPauseEnabled = false;
player->wings.modelId = 1;
Cutscene_LevelStart(player);
break;
+
case PLAYERSTATE_1C8_ACTIVE:
gShowHud = 1;
Player_LowHealthMsg(player);
player->wings.modelId = 0;
D_hud_80161704 = 255;
+
if ((!gVersusMode || gVsMatchStart) && !player->somersault && (gInputPress->button & U_CBUTTONS) &&
((player->form == FORM_ARWING) || (gVersusMode && (player->form == FORM_LANDMASTER)))) {
if (player->alternateView = 1 - player->alternateView) {
@@ -5395,12 +5804,14 @@ void Player_Update(Player* player) {
}
player->unk_014 = 0.1f;
}
+
switch (gLevelMode) {
case LEVELMODE_ON_RAILS:
gLoadLevelObjects = true;
Player_UpdateOnRails(player);
player->draw = true;
break;
+
case LEVELMODE_ALL_RANGE:
if (!gVersusMode) {
Player_Update360(player);
@@ -5431,6 +5842,7 @@ void Player_Update(Player* player) {
gPauseEnabled = false;
}
break;
+
case LEVELMODE_UNK_2:
gLoadLevelObjects = true;
Turret_Update(player);
@@ -5438,21 +5850,26 @@ void Player_Update(Player* player) {
break;
}
break;
+
case PLAYERSTATE_1C8_DOWN:
Cutscene_PlayerDown(player);
break;
+
case PLAYERSTATE_1C8_U_TURN:
if (gVersusMode) {
gVsLockOnTimers[player->num][0] = gVsLockOnTimers[player->num][1] = gVsLockOnTimers[player->num][2] =
gVsLockOnTimers[player->num][3] = 0;
}
player->wings.modelId = 1;
+
Math_SmoothStepToF(&player->wings.unk_04, 0.0f, 0.1f, 5.0f, 0);
Math_SmoothStepToF(&player->wings.unk_08, 0.0f, 0.1f, 5.0f, 0);
Math_SmoothStepToF(&player->wings.unk_0C, 0.0f, 0.1f, 5.0f, 0);
Math_SmoothStepToF(&player->wings.unk_10, 0.0f, 0.1f, 5.0f, 0);
+
Player_UpdateShields(player);
Cutscene_UTurn(player);
+
if (gCurrentLevel == LEVEL_KATINA) {
Player_CollisionCheck(player);
} else {
@@ -5460,6 +5877,7 @@ void Player_Update(Player* player) {
Player_CheckItemCollect(player);
}
break;
+
case PLAYERSTATE_1C8_LEVEL_COMPLETE:
player->alternateView = false;
gPauseEnabled = false;
@@ -5468,12 +5886,14 @@ void Player_Update(Player* player) {
Player_WaterEffects(player);
gShowHud = gChargeTimers[player->num] = 0;
break;
+
case PLAYERSTATE_1C8_ENTER_WARP_ZONE:
gPauseEnabled = false;
Player_UpdateShields(player);
Cutscene_EnterWarpZone(player);
gShowHud = 0;
break;
+
case PLAYERSTATE_1C8_START_360:
gPauseEnabled = false;
Player_UpdateShields(player);
@@ -5481,17 +5901,21 @@ void Player_Update(Player* player) {
Player_UpdateArwingRoll(player);
gChargeTimers[player->num] = player->alternateView = gShowHud = 0;
break;
+
case PLAYERSTATE_1C8_GFOX_REPAIR:
gPauseEnabled = false;
AllRange_GreatFoxRepair(player);
gShowHud = 0;
break;
+
case PLAYERSTATE_1C8_ANDROSS_MOUTH:
Andross_8018C390(player);
Player_UpdateShields(player);
break;
+
case PLAYERSTATE_1C8_12:
break;
+
case PLAYERSTATE_1C8_VS_STANDBY:
player->draw = false;
if (gPlayerInactive[player->num] == true) {
@@ -5511,11 +5935,14 @@ void Player_Update(Player* player) {
Camera_FollowPlayer(player, player->attacker - 1, 0);
}
break;
+
case PLAYERSTATE_1C8_NEXT:
gShowHud = 0;
+
if (!gVersusMode) {
gPauseEnabled = false;
}
+
player->draw = false;
player->vel.z = player->vel.x = player->vel.y = player->knockback.x = player->knockback.y = 0.0f;
@@ -5523,10 +5950,12 @@ void Player_Update(Player* player) {
player->cam.eye.x += 1.0f;
player->cam.eye.z += 1.5f;
}
+
if ((gCurrentLevel == LEVEL_ZONESS) || (gCurrentLevel == LEVEL_SOLAR)) {
Math_SmoothStepToF(&player->cam.eye.y, 500.0f, 0.05f, 10.0f, 0.0f);
Math_SmoothStepToF(&player->cam.eye.z, player->trueZpos + gPathProgress + 500.0f, 0.05f, 20.0f, 0.0f);
}
+
if (player->csTimer == 0) {
if (gCamCount == 4) {
player->state_1C8 = PLAYERSTATE_1C8_VS_STANDBY;
@@ -5535,6 +5964,7 @@ void Player_Update(Player* player) {
gFillScreenRed = gFillScreenGreen = gFillScreenBlue = 0;
gFillScreenAlphaTarget = 255;
}
+
if (gFillScreenAlpha == 255) {
Play_ClearObjectData();
gPathProgress = gPlayer[0].zPath = 0.0f;
@@ -5543,9 +5973,11 @@ void Player_Update(Player* player) {
Audio_ClearVoice();
Audio_SetEnvSfxReverb(0);
gSavedGoldRingCount[0] = gGoldRingCount[0];
+
if (gCurrentLevel == LEVEL_VENOM_ANDROSS) {
D_ctx_80177C94 = gGoldRingCount[0];
}
+
switch (gFadeoutType) {
case 7:
if (gCurrentLevel == LEVEL_TRAINING) {
@@ -5571,11 +6003,13 @@ void Player_Update(Player* player) {
gDrawMode = DRAW_NONE;
}
break;
+
case 4:
gNextGameState = GSTATE_MAP;
gLastGameState = GSTATE_PLAY;
gDrawMode = DRAW_NONE;
break;
+
default:
gDrawMode = DRAW_NONE;
break;
@@ -5584,22 +6018,25 @@ void Player_Update(Player* player) {
}
}
break;
+
default:
break;
}
- if ((D_ctx_80177C70 == 0) && (player->form == FORM_ARWING)) {
+ if ((gFovYMode == 0) && (player->form == FORM_ARWING)) {
sp1CC = 0.77699995f;
sp1C8 = 1100.0f;
- } else if (D_ctx_80177C70 == 2) {
+ } else if (gFovYMode == 2) {
sp1CC = 0.77699995f;
sp1C8 = 1100.0f;
} else {
sp1CC = 0.74f;
sp1C8 = 700.0f;
}
+
Math_SmoothStepToF(&player->unk_148, sp1CC, 1.0f, 0.05f, 0.0f);
Math_SmoothStepToF(&player->unk_14C, sp1CC, 1.0f, 0.05f, 0.0f);
Math_SmoothStepToF(&player->pathWidth, sp1C8, 1.0f, 10.0f, 0.0f);
+
if (player->form == FORM_ARWING) {
Math_SmoothStepToF(&player->unk_194, player->unk_190, 0.5f, 5.0f, 0.0f);
if (player->boostCooldown && (gPlayer[0].state_1C8 == PLAYERSTATE_1C8_ACTIVE)) {
@@ -5620,6 +6057,7 @@ void Camera_UpdateArwingOnRails(Player* player) {
f32 temp;
gCsCamEyeX = (player->pos.x - player->xPath) * player->unk_148;
+
if (((player->form == FORM_ARWING) && (player->state_1C8 == PLAYERSTATE_1C8_ACTIVE)) ||
(player->state_1C8 == PLAYERSTATE_1C8_U_TURN)) {
gCsCamEyeY = (player->pos.y - player->yPath) * player->unk_148;
@@ -5631,6 +6069,7 @@ void Camera_UpdateArwingOnRails(Player* player) {
var_fv0 = 0.0f;
var_fv1 = 0;
}
+
Math_SmoothStepToF(&player->unk_030, var_fv1 * 1.6f, 0.1f, 3.0f, 0.05f);
if (gLevelType == LEVELTYPE_SPACE) {
Math_SmoothStepToF(&player->unk_02C, var_fv0 * 0.8f, 0.1f, 3.0f, 0.05f);
@@ -5647,6 +6086,7 @@ void Camera_UpdateArwingOnRails(Player* player) {
gCsCamAtY = ((player->pos.y - player->yPath) * player->unk_14C) + 20.0f;
gCsCamAtY += player->xRock * 5.0f;
gCsCamAtY -= player->unk_02C * 0.25f;
+
switch (sOverheadCam) {
case 0:
Math_SmoothStepToF(&sOverheadCamDist, 0.0f, 0.4f, 10.0f, 0);
@@ -5655,14 +6095,16 @@ void Camera_UpdateArwingOnRails(Player* player) {
Math_SmoothStepToF(&sOverheadCamDist, 200.0f, 0.4f, 10.0f, 0);
break;
}
+
gCsCamEyeX += player->xPath;
gCsCamAtX += player->xPath;
gCsCamEyeY += player->yPath + sOverheadCamDist;
gCsCamAtZ = player->trueZpos + gPathProgress - 1.0f;
gCsCamEyeZ = 400.0f + sOverheadCamDist;
- if (D_ctx_80177C70 == 2) {
+ if (gFovYMode == 2) {
gCsCamEyeZ -= 50.0f;
}
+
if (player->somersault) {
gCsCamEyeZ += 200.0f;
gCsCamAtY = (player->pos.y - player->yPath) * 0.9f;
@@ -5673,12 +6115,14 @@ void Camera_UpdateArwingOnRails(Player* player) {
Math_SmoothStepToF(&player->unk_018, 1.0f, 1.0f, 0.05f, 0.0f);
}
gCsCamAtY += player->yPath + (sOverheadCamDist * 0.5f);
+
Math_SmoothStepToF(&player->cam.eye.x, gCsCamEyeX, player->unk_014, 1000.0f, 0.0f);
Math_SmoothStepToF(&player->cam.eye.y, gCsCamEyeY, player->unk_018, 1000.0f, 0.0f);
Math_SmoothStepToF(&player->cam.at.x, gCsCamAtX, player->unk_014, 1000.0f, 0.0f);
Math_SmoothStepToF(&player->cam.at.y, gCsCamAtY, player->unk_018, 1000.0f, 0.0f);
Math_SmoothStepToF(&player->cam.at.z, gCsCamAtZ, player->unk_014, 1000.0f, 0.0f);
Math_SmoothStepToF(&player->unk_014, 1.0f, 1.0f, 0.05f, 0.0f);
+
temp = -player->rot.z;
if (gLevelType == LEVELTYPE_PLANET) {
Math_SmoothStepToF(&player->camRoll, temp * 0.3f, 0.1f, 1.5f, 0.0f);
@@ -5696,16 +6140,20 @@ void Camera_UpdateCockpitOnRails(Player* player, s32 arg1) {
Matrix_RotateY(gCalcMatrix, (player->rot.y + player->damageShake) * M_DTOR * 0.75f, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, (player->rot.x + player->damageShake) * M_DTOR * 0.75f, MTXF_APPLY);
+
sp4C.x = 0;
sp4C.y = 0;
sp4C.z = -1000.0f;
+
Matrix_MultVec3f(gCalcMatrix, &sp4C, &sp40);
+
gCsCamEyeX = player->pos.x;
gCsCamEyeY = player->pos.y + player->yBob;
gCsCamEyeZ = player->trueZpos + gPathProgress;
gCsCamAtX = player->pos.x + sp40.x;
gCsCamAtY = player->pos.y + player->yBob + sp40.y;
gCsCamAtZ = player->trueZpos + gPathProgress + sp40.z;
+
Math_SmoothStepToF(&player->cam.eye.x, gCsCamEyeX, player->unk_014, 100.0f, 0.0f);
Math_SmoothStepToF(&player->cam.eye.y, gCsCamEyeY, player->unk_014, 100.0f, 0.0f);
Math_SmoothStepToF(&player->cam.eye.z, gCsCamEyeZ, player->unk_014, 50.0f, 0.0f);
@@ -5713,6 +6161,7 @@ void Camera_UpdateCockpitOnRails(Player* player, s32 arg1) {
Math_SmoothStepToF(&player->cam.at.y, gCsCamAtY, player->unk_014, 100.0f, 0.0f);
Math_SmoothStepToF(&player->cam.at.z, gCsCamAtZ, player->unk_014, 100.0f, 0.0f);
Math_SmoothStepToF(&player->unk_014, 1.0f, 1.0f, 0.05f, 0);
+
player->camRoll = -(player->bankAngle + player->rockAngle);
if (arg1 != 0) {
player->cam.eye.x = gCsCamEyeX;
@@ -5726,26 +6175,30 @@ void Camera_UpdateCockpitOnRails(Player* player, s32 arg1) {
void Camera_FollowPlayer(Player* player, s32 playerNum, bool arg2) {
u8 i;
- u8 var_v0;
+ u8 mask;
Vec3f sp58;
Vec3f sp4C;
- var_v0 = 0x7F;
+ mask = 0x7F;
if (gPlayer[playerNum].form == FORM_LANDMASTER) {
- var_v0 = 0xFF;
+ mask = 0xFF;
}
- if (((var_v0 & gGameFrameCount) == (gPlayerNum * 32)) || arg2) {
+
+ if (((gGameFrameCount & mask) == (gPlayerNum * 32)) || arg2) {
for (i = 0; i < 100; i++) {
playerNum = RAND_INT(3.9f);
if ((gPlayer[playerNum].state_1C8 != PLAYERSTATE_1C8_VS_STANDBY) && !gPlayerInactive[playerNum]) {
break;
}
}
+
if (i > 90) {
playerNum = 0;
}
player->attacker = playerNum + 1;
+
Matrix_RotateY(gCalcMatrix, gPlayer[playerNum].yRot_114 * M_DTOR, MTXF_NEW);
+
switch (gPlayer[playerNum].form) {
case FORM_ARWING:
sp58.x = 300.0f;
@@ -5760,6 +6213,7 @@ void Camera_FollowPlayer(Player* player, s32 playerNum, bool arg2) {
sp58.z = -300.0f;
break;
}
+
if (Rand_ZeroOne() < 0.5f) {
sp58.x *= -1.0f;
}
@@ -5769,9 +6223,11 @@ void Camera_FollowPlayer(Player* player, s32 playerNum, bool arg2) {
player->cam.eye.y = gPlayer[playerNum].pos.y + 50.0f;
player->cam.eye.z = gPlayer[playerNum].trueZpos + sp4C.z;
}
+
player->cam.at.x = gPlayer[playerNum].pos.x;
player->cam.at.y = gPlayer[playerNum].pos.y;
player->cam.at.z = gPlayer[playerNum].trueZpos;
+
switch (gPlayer[playerNum].form) {
case FORM_ARWING:
player->cam.eye.x += gPlayer[playerNum].vel.x * 0.5f;
@@ -5807,6 +6263,7 @@ void Camera_UpdateArwing360(Player* player, bool arg1) {
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + (player->damageShake * 0.2f)) * M_DTOR, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, player->damageShake * 0.2f * M_DTOR, MTXF_APPLY);
+
sp74.x = 0.0f;
sp74.y = 0.0f;
if (player->alternateView) {
@@ -5814,16 +6271,21 @@ void Camera_UpdateArwing360(Player* player, bool arg1) {
} else {
sp74.z = 300.0f - player->camDist;
}
+
if (player->somersault) {
sp74.z += 500.0f;
}
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp74, &sp68);
+
if (!gVersusMode) {
var_fv0 = -gInputPress->stick_y;
} else {
var_fv0 = -gControllerPress[player->num].stick_y;
}
+
Math_SmoothStepToF(&player->unk_02C, var_fv0, 0.05f, 5.0f, 0.0f);
+
eyeX = player->pos.x + sp68.x;
eyeY = (player->pos.y * player->unk_148) + 50.0f;
eyeY -= (player->unk_02C * 1.5f);
@@ -5832,21 +6294,27 @@ void Camera_UpdateArwing360(Player* player, bool arg1) {
atX = player->pos.x + player->damageShake;
var_fv0 = (player->somersault) ? 1.0f : 0.79f;
+
atY = (player->pos.y * (var_fv0)) + player->damageShake + (player->xRock * 5.0f);
atY += (player->unk_02C * 0.5f);
if (player->state_1C8 == PLAYERSTATE_1C8_U_TURN) {
atY = player->pos.y;
}
atZ = player->pos.z;
+
Math_SmoothStepToF(&player->unk_028, 2.0f * player->rot.y, 0.05f, 2.0f, 0.02f);
+
sp74.x = -player->unk_028;
sp74.y = 0.0f;
sp74.z = 0.f;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp74, &sp68);
+
eyeX += sp68.x;
eyeZ += sp68.z;
atX += sp68.x;
atZ += sp68.z;
+
if (player->state_1C8 == PLAYERSTATE_1C8_ACTIVE) {
Math_SmoothStepToF(&player->cam.eye.x, eyeX, player->unk_014, 30000.0f, 0);
Math_SmoothStepToF(&player->cam.eye.y, eyeY, player->unk_014, 30000.0f, 0);
@@ -5854,11 +6322,13 @@ void Camera_UpdateArwing360(Player* player, bool arg1) {
Math_SmoothStepToF(&player->camRoll, player->rot.y * -0.3f, 0.1f, 1.0f, 0);
Math_SmoothStepToF(&player->unk_014, 0.2f, 0.1f, 0.005f, 0.0f);
}
+
Math_SmoothStepToF(&player->cam.at.x, atX, player->unk_01C, 30000.0f, 0);
Math_SmoothStepToF(&player->cam.at.y, atY, player->unk_018, 30000.0f, 0);
Math_SmoothStepToF(&player->cam.at.z, atZ, player->unk_01C, 30000.0f, 0);
Math_SmoothStepToF(&player->unk_018, 0.2f, 0.1f, 0.005f, 0);
Math_SmoothStepToF(&player->unk_01C, 1.0f, 0.1f, 0.005f, 0);
+
if (arg1) {
player->cam.eye.x = eyeX;
player->cam.eye.y = eyeY;
@@ -5880,6 +6350,7 @@ void Camera_UpdateTank360(Player* player, s32 arg1) {
Matrix_RotateZ(gCalcMatrix, player->rot.z * M_DTOR, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + (player->damageShake * 0.2f)) * M_DTOR, MTXF_APPLY);
Matrix_RotateX(gCalcMatrix, player->damageShake * 0.2f * M_DTOR, MTXF_APPLY);
+
sp54.x = 0.0f;
if (player->alternateView) {
sp54.y = 150.0f;
@@ -5888,12 +6359,15 @@ void Camera_UpdateTank360(Player* player, s32 arg1) {
sp54.y = 100.0f;
sp54.z = 250.0f - player->camDist;
}
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48);
+
if (player->alternateView) {
Math_SmoothStepToF(&player->unk_02C, -player->unk_17C * 3.0f + 30.0f, 0.2f, 8.0f, 0.001f);
} else {
Math_SmoothStepToF(&player->unk_02C, -player->unk_17C * 3.0f, 0.2f, 8.0f, 0.001f);
}
+
sp44 = player->pos.x + sp48.x;
sp40 = player->pos.y + sp48.y - (player->unk_02C * 0.6f);
sp3C = player->pos.z + sp48.z;
@@ -5901,19 +6375,26 @@ void Camera_UpdateTank360(Player* player, s32 arg1) {
player->cam.at.x = player->pos.x + player->damageShake;
player->cam.at.y = player->pos.y + 60.0f + player->unk_02C + player->damageShake;
player->cam.at.z = player->pos.z;
+
Math_SmoothStepToF(&player->unk_028, 2.0f * player->rot.y, 0.05f, 2.0f, 0.02f);
+
sp54.x = -player->unk_028;
sp54.y = 0.0f;
sp54.z = 0.0f;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48);
+
sp44 += sp48.x;
sp3C += sp48.z;
+
player->cam.at.x += sp48.x;
player->cam.at.z += sp48.z;
+
Math_SmoothStepToF(&player->cam.eye.x, sp44, 0.1f, 200.0f, 0.001f);
Math_SmoothStepToF(&player->cam.eye.y, sp40, 0.1f, 200.0f, 0.001f);
Math_SmoothStepToF(&player->cam.eye.z, sp3C, 0.1f, 200.0f, 0.001f);
Math_SmoothStepToF(&player->camRoll, player->zRotBank * -0.1f, 0.1f, 1.0f, 0.01f);
+
if (arg1 != 0) {
player->cam.eye.x = sp44;
player->cam.eye.y = sp40;
@@ -5930,9 +6411,11 @@ void Camera_UpdateOnFoot360(Player* player, s32 arg1) {
Matrix_RotateZ(gCalcMatrix, player->zRot_0FC * M_DTOR, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, (player->yRot_114 + (player->damageShake * 0.02f)) * M_DTOR, MTXF_APPLY);
Matrix_RotateX(gCalcMatrix, player->damageShake * 0.02f * M_DTOR, MTXF_APPLY);
+
sp64.x = 0.0f;
sp64.y = 20.0f;
sp64.z = 60.0f - player->camDist;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp64, &sp58);
Math_SmoothStepToF(&player->unk_02C, -player->unk_158 * 0.5f, 0.07f, 3.0f, 0.001f);
@@ -5946,12 +6429,16 @@ void Camera_UpdateOnFoot360(Player* player, s32 arg1) {
player->cam.at.z = player->pos.z;
Math_SmoothStepToF(&player->unk_028, player->rot.y * (player->baseSpeed + 5.0f) * 0.04f, 0.05f, 2.0f, 0.02f);
+
sp64.x = -player->unk_028;
sp64.y = 0.0f;
sp64.z = 0.0f;
+
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp64, &sp58);
+
sp4C.x += sp58.x;
sp4C.z += sp58.z;
+
player->cam.at.x += sp58.x;
player->cam.at.z += sp58.z;
@@ -5959,6 +6446,7 @@ void Camera_UpdateOnFoot360(Player* player, s32 arg1) {
Math_SmoothStepToF(&player->cam.eye.y, sp4C.y, 0.3f, 65.0f, 0.001f);
Math_SmoothStepToF(&player->cam.eye.z, sp4C.z, 0.3f, 65.0f, 0.001f);
Math_SmoothStepToF(&player->camRoll, player->zRotBank * -0.1f, 0.1f, 1.0f, 0.01f);
+
if (arg1 != 0) {
player->cam.eye.x = sp4C.x;
player->cam.eye.y = sp4C.y;
@@ -5983,15 +6471,19 @@ void Camera_SetStarfieldPos(f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32
if (yaw <= -M_PI / 2) {
yaw += M_PI;
}
+
tempf = 0.0f;
if (gCurrentLevel == LEVEL_UNK_15) {
tempf = gPlayer[0].cam.eye.y * 0.03f;
}
+
sp30 = (-pitch * (-8.0f / 3.0f * M_RTOD) * 2.0f) + 3000.0f + gStarfieldScrollY + tempf;
sp34 = (yaw * (-8.0f / 3.0f * M_RTOD) * 2.0f) + 3000.0f + gStarfieldScrollX;
sp20 = gStarfieldX;
+
gStarfieldX = Math_ModF(sp34, SCREEN_WIDTH * 1.5f);
gStarfieldY = Math_ModF(sp30, SCREEN_HEIGHT * 1.5f);
+
if ((gGameState == GSTATE_PLAY) && (gPlayer[0].state_1C8 == PLAYERSTATE_1C8_LEVEL_INTRO) &&
(gCurrentLevel == LEVEL_METEO)) {
if (fabsf(gStarfieldX - sp20) < 50.0f) {
@@ -6034,18 +6526,22 @@ void Camera_Update(Player* player) {
Aquas_UpdateCamera(player);
}
break;
+
case LEVELMODE_ALL_RANGE:
Camera_Update360(player, false);
break;
+
case LEVELMODE_UNK_2:
Turret_UpdateCamera(player);
break;
}
break;
+
case PLAYERSTATE_1C8_U_TURN:
player->camRoll -= player->camRoll * 0.1f;
Camera_Update360(player, false);
break;
+
case PLAYERSTATE_1C8_DOWN:
if ((gLevelMode == LEVELMODE_ON_RAILS) && (player->form == FORM_ARWING)) {
player->cam.eye.x += (player->pos.x - player->cam.eye.x) * 0.1f;
@@ -6059,6 +6555,7 @@ void Camera_Update(Player* player) {
player->cam.at.z = player->trueZpos + gPathProgress - 1.0f;
}
break;
+
case PLAYERSTATE_1C8_NEXT:
case PLAYERSTATE_1C8_LEVEL_COMPLETE:
break;
@@ -6066,8 +6563,8 @@ void Camera_Update(Player* player) {
}
void Camera_SetupLights(Player* player) {
- Vec3f sp44;
- Vec3f sp38;
+ Vec3f src;
+ Vec3f dest;
f32 pad;
if ((gCurrentLevel == LEVEL_AQUAS) && (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_LEVEL_INTRO)) {
@@ -6077,6 +6574,7 @@ void Camera_SetupLights(Player* player) {
}
gLight1rotStep = gLight2rotStep = D_ctx_80178538 = 1.0f;
}
+
Math_SmoothStepToAngle(&gLight1xRot, gLight1xRotTarget, 1.0f, gLight1rotStep, 0.0f);
Math_SmoothStepToAngle(&gLight1yRot, gLight1yRotTarget, 1.0f, gLight1rotStep, 0.0f);
Math_SmoothStepToAngle(&gLight1zRot, gLight1zRotTarget, 1.0f, gLight1rotStep, 0.0f);
@@ -6117,39 +6615,54 @@ void Camera_SetupLights(Player* player) {
gLight2B = gLight2BTarget;
}
}
+
Math_SmoothStepToAngle(&gLight2xRot, gLight2xRotTarget, 1.0f, gLight2rotStep, 0.0f);
Math_SmoothStepToAngle(&gLight2yRot, gLight2yRotTarget, 1.0f, gLight2rotStep, 0.0f);
Math_SmoothStepToAngle(&gLight2zRot, gLight2zRotTarget, 1.0f, gLight2rotStep, 0.0f);
+
gLight2xRotTarget = gLight1xRotTarget = gEnvLightxRot;
gLight2yRotTarget = gLight1yRotTarget = gEnvLightyRot;
gLight2zRotTarget = gLight1zRotTarget = gEnvLightzRot;
+
gLight1rotStep = 5.0f;
+
gLight2RTarget = gLight1R;
gLight2GTarget = gLight1G;
gLight2BTarget = gLight1B;
+
pad = player->camRoll;
+
Matrix_RotateZ(gCalcMatrix, M_DTOR * pad, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, -player->camPitch, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, player->camYaw, MTXF_APPLY);
+
Matrix_Push(&gCalcMatrix);
+
Matrix_RotateX(gCalcMatrix, M_DTOR * gLight1xRot, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, M_DTOR * gLight1yRot, MTXF_APPLY);
Matrix_RotateZ(gCalcMatrix, M_DTOR * gLight1zRot, MTXF_APPLY);
- sp44.x = 0.0f;
- sp44.y = 0.0f;
- sp44.z = 100.0f;
- Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38);
- gLight1x = sp38.x;
- gLight1y = sp38.y;
- gLight1z = sp38.z;
+
+ src.x = 0.0f;
+ src.y = 0.0f;
+ src.z = 100.0f;
+
+ Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest);
+
+ gLight1x = dest.x;
+ gLight1y = dest.y;
+ gLight1z = dest.z;
+
Matrix_Pop(&gCalcMatrix);
+
Matrix_RotateX(gCalcMatrix, M_DTOR * gLight2xRot, MTXF_APPLY);
Matrix_RotateY(gCalcMatrix, M_DTOR * gLight2yRot, MTXF_APPLY);
Matrix_RotateZ(gCalcMatrix, M_DTOR * gLight2zRot, MTXF_APPLY);
- Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38);
- gLight2x = sp38.x;
- gLight2y = sp38.y;
- gLight2z = sp38.z;
+
+ Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest);
+
+ gLight2x = dest.x;
+ gLight2y = dest.y;
+ gLight2z = dest.z;
}
void Play_UpdateLevel(void) {
@@ -6165,6 +6678,7 @@ void Play_UpdateLevel(void) {
Training_SpawnEnemies();
}
break;
+
case LEVEL_VERSUS:
func_versus_800C26C8();
gVsItemSpawnTimer++;
@@ -6181,6 +6695,7 @@ void Play_UpdateLevel(void) {
gVsItemSpawnTimer = 0;
}
break;
+
case LEVEL_VENOM_2:
if ((gPlayer[0].state_1C8 != PLAYERSTATE_1C8_LEVEL_COMPLETE) && (gLevelPhase == 2)) {
gPlayer[0].state_1C8 = PLAYERSTATE_1C8_LEVEL_COMPLETE;
@@ -6195,6 +6710,7 @@ void Play_UpdateLevel(void) {
gFillScreenRed = gFillScreenGreen = gFillScreenBlue = 255;
}
break;
+
case LEVEL_VENOM_ANDROSS:
Andross_8018BDD8();
gGroundHeight = -25000.0f;
@@ -6207,6 +6723,7 @@ void Play_UpdateLevel(void) {
}
}
break;
+
case LEVEL_METEO:
Texture_Scroll(D_102FF08, 8, 8, 1);
/* fallthrough */
@@ -6219,6 +6736,7 @@ void Play_UpdateLevel(void) {
Math_SmoothStepToF(&gWarpZoneBgAlpha, 128.0f, 1.0f, 1.0f, 0.0f);
}
}
+
if ((gCurrentLevel == LEVEL_SECTOR_X) && (gLevelPhase == 0) && (gRingPassCount == 4)) {
gRingPassCount++;
gPlayer[0].state_1C8 = PLAYERSTATE_1C8_ENTER_WARP_ZONE;
@@ -6229,15 +6747,18 @@ void Play_UpdateLevel(void) {
gLeveLClearStatus[gCurrentLevel] = 1;
}
break;
+
case LEVEL_CORNERIA:
func_hud_8008C104(D_CO_603EB38, D_CO_6028A60);
if ((gGameFrameCount % 2) != 0) {
Texture_Scroll(D_CO_600CBD8, 64, 32, 3);
}
break;
+
case LEVEL_AQUAS:
func_hud_8008C104(D_AQ_603158C, D_AQ_602ACC0);
break;
+
case LEVEL_SOLAR:
Play_UpdateDynaFloor();
@@ -6287,18 +6808,24 @@ void Play_UpdateLevel(void) {
}
}
}
+
shields = MIN(gPlayer[0].shields, 255);
+
Audio_SetHeatAlarmParams(shields, heightParam);
+
if (((gGameFrameCount % 8) == 0) && (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_LEVEL_COMPLETE)) {
Solar_8019E8B8(RAND_FLOAT_CENTERED(6000.0f), -80.0f,
gPlayer[0].trueZpos + (RAND_FLOAT(2000.0f) + -6000.0f),
RAND_FLOAT(10.0f) + 20.0f); // check
}
+
func_hud_8008C104(D_SO_60229A4, D_SO_6010198);
+
if (gPlayer[0].shields == 0) {
gSoShieldsEmpty = 1;
}
break;
+
case LEVEL_ZONESS:
Play_UpdateDynaFloor();
for (gPathTexScroll; gPathTexScroll >= 20.0f; gPathTexScroll -= 20.0f) {
@@ -6307,7 +6834,9 @@ void Play_UpdateLevel(void) {
if (gPlayer[0].state_1C8 == PLAYERSTATE_1C8_NEXT) {
Texture_Scroll(D_ZO_602C2CC, 32, 32, 1);
}
+
func_hud_8008C104(D_ZO_602C2CC, D_ZO_600D990);
+
if (Play_CheckDynaFloorCollision(&sp3C, &sp40, gPlayer[0].cam.eye.x, gPlayer[0].cam.eye.y,
gPlayer[0].cam.eye.z - gPathProgress)) {
gLight1R = 0;
@@ -6336,6 +6865,7 @@ void Play_Update(void) {
s32 i;
Play_UpdateFillScreen();
+
for (i = TEAM_ID_FALCO; i <= TEAM_ID_PEPPY; i++) {
if (gTeamDamage[i] > 0) {
gTeamDamage[i] -= 2;
@@ -6345,17 +6875,21 @@ void Play_Update(void) {
}
}
}
+
for (i = 0; i < gCamCount; i++) {
gPlayer[i].num = gPlayerNum = i;
Player_Update(&gPlayer[i]);
}
+
Object_Update();
PlayerShot_UpdateAll();
BonusText_Update();
+
for (i = 0; i < gCamCount; i++) {
gPlayer[i].num = gPlayerNum = i;
Camera_Update(&gPlayer[i]);
}
+
gCameraShakeY = 0.0f;
if (gCameraShake != 0) {
f32 var_fv1;
@@ -6400,30 +6934,36 @@ void Play_Main(void) {
s32 pad2;
s32 pad3;
s32 i;
- f32 sp34;
+ f32 fovYtarget;
- switch (D_ctx_80177C70) {
+ switch (gFovYMode) {
case 0:
- sp34 = 45.0f;
+ fovYtarget = 45.0f;
break;
case 1:
- sp34 = 45.0f;
+ fovYtarget = 45.0f;
break;
case 2:
- sp34 = 55.0f;
+ fovYtarget = 55.0f;
break;
}
- Math_SmoothStepToF(&gFovY, sp34, 0.1f, 5.0f, 0.0f);
+
+ Math_SmoothStepToF(&gFovY, fovYtarget, 0.1f, 5.0f, 0.0f);
+
if (gChangeTo360) {
gChangeTo360 = false;
gLevelMode = LEVELMODE_ALL_RANGE;
+
if (gCurrentLevel != LEVEL_VENOM_ANDROSS) {
MEM_ARRAY_ALLOCATE(gScenery360, 200);
}
+
for (i = 0; i < 200; i++) {
gScenery360[i].obj.status = OBJ_FREE;
}
+
Play_ClearObjectData();
+
if (gCurrentLevel == LEVEL_CORNERIA) {
Play_Setup360_CO();
} else if (gCurrentLevel == LEVEL_SECTOR_Y) {
@@ -6433,22 +6973,27 @@ void Play_Main(void) {
} else if (gCurrentLevel == LEVEL_TRAINING) {
Training_Setup360();
}
+
Play_SetupZPos360(&gPlayer[0].pos.z);
Play_SetupZPos360(&gPlayer[0].trueZpos);
+
gPlayer[0].cam.eye.z += 15000.0f;
gPlayer[0].cam.at.z += 15000.0f;
gPlayer[0].zPath = gPlayer[0].zPathVel = gPathVelZ = gPathProgress = 0.0f;
}
+
if (gPlayState != PLAY_PAUSE) {
- PRINTF("play_time = %d\n");
+ PRINTF("play_time = %d\n", gGameFrameCount);
gGameFrameCount++;
}
+
switch (gPlayState) {
case PLAY_STANDBY:
if (gNextGameStateTimer == 0) {
gPlayState = PLAY_INIT;
}
break;
+
case PLAY_INIT:
Play_Init();
sMusicVolume = gVolumeSettings[AUDIO_TYPE_MUSIC];
@@ -6456,24 +7001,30 @@ void Play_Main(void) {
sSfxVolume = gVolumeSettings[AUDIO_TYPE_SFX];
gPlayState = PLAY_UPDATE;
break;
+
case PLAY_UPDATE:
if ((gLevelStartStatusScreenTimer != 0) || (gLevelClearScreenTimer != 0)) {
gPauseEnabled = false;
} else {
gPauseEnabled = true;
}
+
gDrawMode = DRAW_PLAY;
+
Play_Update();
+
if ((gControllerPress[gMainController].button & START_BUTTON) &&
(gPlayer[0].state_1C8 == PLAYERSTATE_1C8_LEVEL_INTRO) &&
gSaveFile.save.data.planet[sSaveSlotFromLevel[gCurrentLevel]].normalClear) {
Audio_ClearVoice();
Audio_SetEnvSfxReverb(0);
Play_ClearObjectData();
+
for (i = 0; i < gCamCount; i++) {
Audio_KillSfxBySource(gPlayer[i].sfxSource);
Audio_StopPlayerNoise(i);
}
+
gPlayState = PLAY_INIT;
gDrawMode = gVersusMode = 0;
gCamCount = 1;
@@ -6481,9 +7032,11 @@ void Play_Main(void) {
gCsFrameCount = gLevelClearScreenTimer = gLevelStartStatusScreenTimer = gRadioState = 0;
D_ctx_8017782C = false;
}
+
if (gVersusMode) {
Versus_Main();
}
+
if ((gControllerPress[gMainController].button & START_BUTTON) && gPauseEnabled) {
Audio_PlayPauseSfx(1);
gPlayState = PLAY_PAUSE;
@@ -6491,11 +7044,12 @@ void Play_Main(void) {
D_ctx_80178484 = 100000;
}
break;
+
case PLAY_PAUSE:
if (!gVersusMode) {
if ((gControllerPress[gMainController].button & R_TRIG) && (gPlayer[0].form != FORM_BLUE_MARINE) &&
(gPlayer[0].state_1C8 != PLAYERSTATE_1C8_STANDBY)) {
- if (gShowCrosshairs[0] = 1 - gShowCrosshairs[0]) {
+ if (gShowReticles[0] = 1 - gShowReticles[0]) {
AUDIO_PLAY_SFX(NA_SE_MAP_WINDOW_OPEN, gDefaultSfxSource, 4);
} else {
AUDIO_PLAY_SFX(NA_SE_MAP_WINDOW_CLOSE, gDefaultSfxSource, 4);
@@ -6504,7 +7058,7 @@ void Play_Main(void) {
} else {
for (i = 0; i < 4; i++) {
if ((gControllerPress[i].button & R_TRIG) && (gPlayer[i].form != FORM_ON_FOOT)) {
- if (gShowCrosshairs[i] = 1 - gShowCrosshairs[i]) {
+ if (gShowReticles[i] = 1 - gShowReticles[i]) {
Object_PlayerSfx(gPlayer[i].sfxSource, NA_SE_MAP_WINDOW_OPEN, i);
} else {
Object_PlayerSfx(gPlayer[i].sfxSource, NA_SE_MAP_WINDOW_CLOSE, i);
@@ -6512,6 +7066,7 @@ void Play_Main(void) {
}
}
}
+
if ((D_ctx_80177868 == 4) && (gControllerPress[gMainController].button & START_BUTTON) && gPauseEnabled) {
Audio_PlayPauseSfx(0);
gPlayState = PLAY_UPDATE;