mirror of
https://github.com/HarbourMasters/Starship
synced 2026-06-21 08:51:44 -04:00
1509 lines
61 KiB
C
1509 lines
61 KiB
C
#include "global.h"
|
|
#include "assets/ast_landmaster.h"
|
|
#include "assets/ast_titania.h"
|
|
|
|
void func_tank_80047754(Player* player);
|
|
void func_tank_80047D38(Player* player, f32);
|
|
void func_tank_80047E7C(Player* player, f32, f32);
|
|
void func_tank_80047FBC(Player* player);
|
|
void func_tank_800481F4(Player* player);
|
|
s32 func_tank_80046E40(Player* player, f32* hitboxData, s32* index, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot,
|
|
f32 zRot, f32 arg9, f32 argA, f32 argB);
|
|
|
|
static u8 D_800C9F00 = 0;
|
|
static u8 D_800C9F04 = 0;
|
|
static u8 D_800C9F08 = 0;
|
|
static s32 D_800C9F0C = 0; // unused.
|
|
static f32 D_800C9F10 = 0.0f;
|
|
static s32 D_800C9F14 = 0;
|
|
static s32 D_800C9F18[2] = { 0, 0 }; // unused.
|
|
static f32 D_800C9F20 = 0.0f;
|
|
static f32 D_800C9F24 = 0.0f;
|
|
static f32 D_800C9F28 = 0.0f;
|
|
Vec3f D_tank_800C9F2C = { 0.0f, 0.0f, 0.0f };
|
|
static s32 D_800C9F38 = 0; // unused
|
|
|
|
void func_tank_80043280(u16* text0, u16* text1, f32 zRot) {
|
|
s32 py;
|
|
s32 px;
|
|
s32 i;
|
|
s32 j;
|
|
f32 dy;
|
|
f32 dx;
|
|
s32 pad;
|
|
Vec3f sp80;
|
|
Vec3f sp74;
|
|
|
|
Matrix_Push(&gCalcMatrix);
|
|
text0 = SEGMENTED_TO_VIRTUAL(text0);
|
|
text1 = SEGMENTED_TO_VIRTUAL(text1);
|
|
Matrix_RotateZ(gCalcMatrix, M_DTOR * zRot, MTXF_NEW);
|
|
sp74.z = 0.0f;
|
|
for (i = 0, dy = 0.0f; i < 32; i++, dy += 1.0f) {
|
|
for (j = 0, dx = 0.0f; j < 32; j++, dx += 1.0f) {
|
|
sp74.x = dx - 16.0f;
|
|
sp74.y = dy - 16.0f;
|
|
Matrix_MultVec3f(gCalcMatrix, &sp74, &sp80);
|
|
px = (s32) (sp80.x + 16.0f);
|
|
py = (s32) (sp80.y + 16.0f);
|
|
if ((px >= 0) && (px < 32) && (py >= 0) && (py < 32)) {
|
|
text0[px + 32 * py] = text1[j + 32 * i];
|
|
}
|
|
}
|
|
}
|
|
Matrix_Pop(&gCalcMatrix);
|
|
}
|
|
|
|
void Player_UpdateTankCamOnRails(Player* player) {
|
|
f32 sp54;
|
|
f32 sp50;
|
|
f32 sp4C;
|
|
f32 sp48;
|
|
s32 pad44;
|
|
f32 sp40;
|
|
s32 pad3C;
|
|
|
|
sp54 = ((player->pos.x - player->xPath) * player->unk_148) + (player->rot.y * 0.5f);
|
|
sp48 = sp54 + (player->rot.y * -5.0f);
|
|
sp40 = player->cam.eye.z - 1000.0f;
|
|
sp54 += player->xPath;
|
|
sp48 += player->xPath;
|
|
if (player->grounded) {
|
|
sp50 = player->pos.y + 100.0f + (-player->rot.x * 5.0f);
|
|
sp4C = player->pos.y + player->rot.x * 10.0f;
|
|
sp50 += player->unk_17C * 0.5f;
|
|
sp4C += player->unk_17C * -5.0f;
|
|
|
|
if (0 || (gCurrentLevel == LEVEL_MACBETH) && (D_MA_801BA1E8 == 102)) {
|
|
sp50 = player->pos.y + 45.0f + (-player->rot.x * 5.0f);
|
|
sp4C = player->pos.y + 200.0f + (player->rot.x * 10.0f);
|
|
sp50 += player->unk_17C * 0.2f;
|
|
sp4C += player->unk_17C * -3.0f;
|
|
}
|
|
if (D_MA_801BA1E8 == 99) {
|
|
sp50 = player->pos.y + 40.0f + (-player->rot.x * 5.0f);
|
|
sp4C = player->pos.y + 200.0f + (player->rot.x * 10.0f);
|
|
sp50 += player->unk_17C * 0.2f;
|
|
sp4C += player->unk_17C * -3.0f;
|
|
} else if (D_MA_801BA1E8 == 98) {
|
|
sp50 = player->pos.y + 100.0f;
|
|
sp4C = player->pos.y + (player->rot.x * 10.0f);
|
|
sp4C += player->unk_17C * -3.0f;
|
|
}
|
|
} else {
|
|
sp50 = player->pos.y + 50.0f;
|
|
sp4C = player->pos.y;
|
|
|
|
if (0 || (gCurrentLevel == LEVEL_MACBETH) && (D_MA_801BA1E8 == 102)) {
|
|
sp4C = player->pos.y + 150.0f;
|
|
}
|
|
if (D_MA_801BA1E8 == 99) {
|
|
sp4C = player->pos.y + 150.0f;
|
|
}
|
|
}
|
|
if (player->vel.y < -20.0f) {
|
|
Math_SmoothStepToF(&player->cam.at.y, sp4C - 100.0f, 0.2f, player->unk_014 * 20.0f, 0.00001f);
|
|
}
|
|
Math_SmoothStepToF(&player->cam.eye.x, sp54, 0.1f, player->unk_014 * 20.0f, 0.00001f);
|
|
Math_SmoothStepToF(&player->cam.eye.y, sp50, 0.1f, player->unk_014 * 7.0f, 0.00001f);
|
|
Math_SmoothStepToF(&player->cam.at.y, sp4C, 0.1f, player->unk_014 * 7.0f, 0.00001f);
|
|
Math_SmoothStepToF(&player->cam.at.x, sp48, 0.1f, player->unk_014 * 20.0f, 0.00001f);
|
|
Math_SmoothStepToF(&player->cam.eye.z, 200.0f, 0.1f, player->unk_014 * 10.0f, 0.0f);
|
|
Math_SmoothStepToF(&player->cam.at.z, sp40, 1.0f, player->unk_014 * 10.0f, 0.0f);
|
|
Math_SmoothStepToF(&player->camRoll, player->rot.z * -0.4f, 0.1f, 1.0f, 0.01f);
|
|
Math_SmoothStepToF(&player->unk_014, 1.0f, 1.0f, 0.1f, 0.0f);
|
|
}
|
|
|
|
void func_tank_800438E0(Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 scale) {
|
|
f32 pad[12];
|
|
|
|
Effect_Initialize(effect);
|
|
effect->obj.status = OBJ_ACTIVE;
|
|
effect->obj.id = OBJ_EFFECT_357;
|
|
effect->obj.pos.x = xPos;
|
|
effect->obj.pos.y = yPos;
|
|
effect->obj.pos.z = zPos;
|
|
effect->vel.x = RAND_FLOAT(1.0f) - RAND_FLOAT(2.0f);
|
|
effect->vel.y = RAND_FLOAT(3.0f) - (gPlayer[0].vel.z / 5.0f) + 3.0f;
|
|
effect->vel.z = RAND_FLOAT(3.0f) - (gPlayer[0].vel.z / 5.0f) + 2.0f;
|
|
effect->scale2 = (RAND_FLOAT(0.8f) + 0.3f) * scale;
|
|
effect->timer_50 = RAND_INT(5.0f) + 8;
|
|
effect->obj.rot.x = RAND_FLOAT(360.0f);
|
|
effect->unk_60.x = RAND_FLOAT_CENTERED(30.0f);
|
|
effect->unk_60.y = RAND_FLOAT_CENTERED(30.0f);
|
|
effect->unk_60.z = RAND_FLOAT_CENTERED(30.0f);
|
|
Object_SetInfo(&effect->info, effect->obj.id);
|
|
}
|
|
|
|
void func_tank_80043AA0(f32 xPos, f32 yPos, f32 zPos, f32 scale) {
|
|
s32 i;
|
|
|
|
for (i = 50; i >= 0; i--) {
|
|
if (gEffects[i].obj.status == OBJ_FREE) {
|
|
func_tank_800438E0(&gEffects[i], xPos, yPos, zPos, scale);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_80043B0C(s32 arg0) {
|
|
}
|
|
|
|
void func_tank_80043B18(Player* player) {
|
|
f32 pad;
|
|
Vec3f sp48;
|
|
Vec3f sp3C;
|
|
f32 sp38;
|
|
|
|
Matrix_Translate(gCalcMatrix, 0.0f, player->unk_18C + 30.0f, 0, MTXF_NEW);
|
|
Matrix_RotateY(gCalcMatrix, player->yRot_114 * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateX(gCalcMatrix, player->rot.x * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateZ(gCalcMatrix, (player->rot.z + player->rockAngle) * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateY(gCalcMatrix, (player->rot.y + 180.0f) * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateZ(gCalcMatrix, -player->zRotBank * M_DTOR, MTXF_APPLY);
|
|
Matrix_Translate(gCalcMatrix, 0.0f, -30.0f, 0, MTXF_APPLY);
|
|
sp48.y = 0.0f;
|
|
sp48.z = -20.0f;
|
|
sp38 = player->yRot_114;
|
|
if (player->rollState != 0) {
|
|
|
|
sp48.x = 0.0f;
|
|
sp48.z = RAND_FLOAT_CENTERED(50.0f) + -20.0f;
|
|
if (player->rollRate < 0) {
|
|
sp38 -= 65.0f;
|
|
} else {
|
|
sp38 += 65.0f;
|
|
}
|
|
Matrix_MultVec3f(gCalcMatrix, &sp48, &sp3C);
|
|
if (gCurrentLevel == LEVEL_MACBETH) {
|
|
func_tank_80043AA0(player->pos.x + sp3C.x, player->pos.y + sp3C.y, player->trueZpos + sp3C.z, 0.2f);
|
|
} else {
|
|
if (((gGameFrameCount % 2) == 0)) {
|
|
Titania_Effect368_Spawn(player->pos.x + sp3C.x, player->pos.y + sp3C.y, player->trueZpos + sp3C.z,
|
|
player->rot.y + sp38, 1.3f);
|
|
}
|
|
if (((gGameFrameCount % 4) == 0)) {
|
|
Effect_Effect359_Spawn(player->pos.x + sp3C.x, player->pos.y + sp3C.y + 20.0f,
|
|
player->trueZpos + sp3C.z, 2.0f, 255, 15, 0);
|
|
}
|
|
}
|
|
} else {
|
|
sp38 += player->zRotBank;
|
|
if (player->zRotBank > -5.0f) {
|
|
sp48.x = 36.0f;
|
|
Matrix_MultVec3f(gCalcMatrix, &sp48, &sp3C);
|
|
if (gCurrentLevel == LEVEL_MACBETH) {
|
|
if ((gGameFrameCount % 2) != 0) {
|
|
func_tank_80043AA0(player->pos.x + sp3C.x, player->pos.y + sp3C.y, player->trueZpos + sp3C.z, 0.2f);
|
|
}
|
|
} else {
|
|
if (((gGameFrameCount % 2) == 0)) {
|
|
Titania_Effect368_Spawn(player->pos.x + sp3C.x, player->pos.y + sp3C.y, player->trueZpos + sp3C.z,
|
|
player->rot.y + sp38, 1.0f);
|
|
}
|
|
if (((gGameFrameCount % 4) == 0) && (player->baseSpeed >= 5.0f)) {
|
|
Effect_Effect359_Spawn(player->pos.x + sp3C.x, player->pos.y + sp3C.y + 20.0f,
|
|
player->trueZpos + sp3C.z, 2.0f, 255, 15, 0);
|
|
}
|
|
}
|
|
}
|
|
if (player->zRotBank < 5.0f) {
|
|
sp48.x = -36.0f;
|
|
Matrix_MultVec3f(gCalcMatrix, &sp48, &sp3C);
|
|
if (gCurrentLevel == LEVEL_MACBETH) {
|
|
if (((gGameFrameCount % 2) == 0)) {
|
|
func_tank_80043AA0(player->pos.x + sp3C.x, player->pos.y + sp3C.y, player->trueZpos + sp3C.z, 0.2f);
|
|
}
|
|
} else {
|
|
if (((gGameFrameCount % 2) == 0)) {
|
|
Titania_Effect368_Spawn(player->pos.x + sp3C.x, player->pos.y + sp3C.y, player->trueZpos + sp3C.z,
|
|
player->rot.y + sp38, 1.0f);
|
|
}
|
|
if (((gGameFrameCount % 4) == 0) && (player->baseSpeed >= 5.0f)) {
|
|
Effect_Effect359_Spawn(player->pos.x + sp3C.x, player->pos.y + sp3C.y + 20.0f,
|
|
player->trueZpos + sp3C.z, 2.0f, 255, 15, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 func_tank_80044120(Hitbox* hitbox, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6) {
|
|
Vec3f sp34;
|
|
Vec3f sp28;
|
|
|
|
sp34.x = arg1 - arg4;
|
|
sp34.y = arg2 - arg5;
|
|
sp34.z = arg3 - arg6;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp34, &sp28);
|
|
return Play_CheckSingleHitbox(hitbox, arg4, arg5, arg6, sp28.x + arg4, sp28.y + arg5, sp28.z + arg6);
|
|
}
|
|
|
|
void func_tank_800441C8(Player* player, f32* hitboxData, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot) {
|
|
Hitbox* hitbox;
|
|
s32 count;
|
|
s32 i;
|
|
f32 x;
|
|
f32 y;
|
|
f32 z;
|
|
|
|
Matrix_RotateY(gCalcMatrix, -yRot * M_DTOR, MTXF_NEW);
|
|
count = *hitboxData++;
|
|
if (count != 0) {
|
|
for (i = 0; i < count; i++, hitboxData += 6) {
|
|
hitbox = (Hitbox*) hitboxData;
|
|
|
|
if (player->vel.y <= 0.0f) {
|
|
x = player->pos.x;
|
|
y = player->pos.y - 10.0f;
|
|
z = player->trueZpos;
|
|
if (func_tank_80044120(hitbox, x, y, z, xPos, yPos, zPos)) {
|
|
player->grounded = true;
|
|
if (player->vel.y < -20.0f) {
|
|
player->hitTimer = 20;
|
|
}
|
|
player->vel.y = 0.0f;
|
|
player->pos.y = yPos + 20.0f;
|
|
Math_SmoothStepToF(&player->rot.x, 0.0f, 0.3f, 5.0f, 0.0f);
|
|
Math_SmoothStepToF(&player->rot.z, 0.0f, 0.3f, 5.0f, 0.0f);
|
|
}
|
|
} else {
|
|
x = player->pos.x;
|
|
y = player->pos.y + 30.0f;
|
|
z = player->trueZpos;
|
|
if (func_tank_80044120(hitbox, x, y, z, xPos, yPos, zPos)) {
|
|
player->vel.y = 0.0f;
|
|
player->pos.y = yPos - 75.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_800443DC(Player* player) {
|
|
Scenery* scenery;
|
|
s32 i;
|
|
|
|
for (i = 0, scenery = gScenery; i < ARRAY_COUNT(gScenery); i++, scenery++) {
|
|
if ((scenery->obj.status == OBJ_ACTIVE) && (scenery->obj.id == OBJ_SCENERY_TI_BRIDGE) &&
|
|
((player->trueZpos - 2000.0f) < scenery->obj.pos.z)) {
|
|
func_tank_800441C8(player, scenery->info.hitbox, scenery->obj.pos.x, scenery->obj.pos.y, scenery->obj.pos.z,
|
|
scenery->obj.rot.x, scenery->obj.rot.y, scenery->obj.rot.z);
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_800444BC(Player* player) {
|
|
f32 pad;
|
|
f32 sp40;
|
|
f32 sp3C;
|
|
f32 sp38;
|
|
f32 sp34;
|
|
f32 sp30;
|
|
|
|
sp30 = 5.0f;
|
|
player->grounded = false;
|
|
if (player->gravity < 0.0f) {
|
|
sp30 = 0.0f;
|
|
}
|
|
sp40 = sp3C = 0.0f;
|
|
sp38 = gGroundHeight;
|
|
if (gGroundType == 4) {
|
|
Ground_801B6E20(player->pos.x, player->trueZpos + player->zPath, &sp40, &sp38, &sp3C);
|
|
}
|
|
if (gCurrentLevel == LEVEL_MACBETH) {
|
|
D_MA_801BE250[27] = gGroundHeight;
|
|
D_MA_801BE250[28] = D_MA_801BE250[29] = 0.0f;
|
|
D_800C9F10 = 0.0f;
|
|
func_tank_80047754(player);
|
|
sp38 = D_MA_801BE250[27];
|
|
sp40 = D_MA_801BE250[28];
|
|
sp3C = D_MA_801BE250[29];
|
|
}
|
|
if ((player->pos.y - sp30) < sp38) {
|
|
if (player->vel.y < -10.0f) {
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_BOUND, player->sfxSource, 0);
|
|
}
|
|
player->grounded = true;
|
|
if (player->vel.y < -20.0f) {
|
|
player->hitTimer = 20;
|
|
}
|
|
if (gTiStartLandmaster != 0) {
|
|
gTiStartLandmaster = 0;
|
|
AUDIO_PLAY_BGM(NA_BGM_STAGE_TI);
|
|
Audio_StartPlayerNoise(0);
|
|
}
|
|
|
|
player->pos.y = sp38 - 3.0f;
|
|
sp34 = (player->baseSpeed * 0.2f) + 0.2f;
|
|
player->vel.y = -3.0f;
|
|
|
|
if ((player->rot_104.x > 0.0f) && (sp40 <= 0.0f)) {
|
|
player->vel.y = player->rot_104.x * 0.5f * player->baseSpeed * 0.035f;
|
|
player->rot.x = player->rot_104.x;
|
|
}
|
|
if (player->gravity < 0.0f) {
|
|
player->vel.y = 2.0f;
|
|
if (player->vel.y) {} // fake?
|
|
player->pos.y += 7.0f;
|
|
}
|
|
player->rot_104.x = RAD_TO_DEG(sp40);
|
|
player->rot_104.z = RAD_TO_DEG(sp3C);
|
|
if (gCurrentLevel == LEVEL_MACBETH) {
|
|
if (player->rot_104.x > 90.0f) {
|
|
player->rot_104.x = -(180 - player->rot_104.x);
|
|
}
|
|
if (player->rot_104.z > 90.0f) {
|
|
player->rot_104.z = -(180 - player->rot_104.z);
|
|
}
|
|
}
|
|
if (player->rot.x < player->rot_104.x) {
|
|
player->rot.x += sp34;
|
|
}
|
|
if (player->rot.x > player->rot_104.x) {
|
|
player->rot.x -= sp34;
|
|
}
|
|
if (player->rot.z < player->rot_104.z) {
|
|
player->rot.z += sp34;
|
|
}
|
|
if (player->rot.z > player->rot_104.z) {
|
|
player->rot.z -= sp34;
|
|
}
|
|
}
|
|
if (gCurrentLevel == LEVEL_TITANIA) {
|
|
func_tank_800443DC(player);
|
|
}
|
|
}
|
|
|
|
void func_tank_80044868(Player* player) {
|
|
f32 pad;
|
|
f32 stickTilt;
|
|
f32 sp2C;
|
|
|
|
stickTilt = (gInputPress->stick_y * 0.7f) - 8.0f;
|
|
if (stickTilt < -40.0f) {
|
|
stickTilt = -40.0f;
|
|
}
|
|
if (stickTilt > 0.0f) {
|
|
stickTilt = 0.0f;
|
|
}
|
|
if (player->unk_17C < stickTilt) {
|
|
player->unk_17C += 3.0f;
|
|
}
|
|
if (stickTilt < player->unk_17C) {
|
|
player->unk_17C -= 3.0f;
|
|
}
|
|
if (player->unk_180 < 0.0f) {
|
|
player->unk_180 += 3.0f;
|
|
}
|
|
if (player->unk_180 > 0.0f) {
|
|
player->unk_180 -= 3.0f;
|
|
}
|
|
gPlayerTurnRate = 3.0f;
|
|
gPlayerTurnStickMod = 0.66f;
|
|
stickTilt = gInputPress->stick_x;
|
|
if (stickTilt == 0.0f) {
|
|
Math_SmoothStepToF(&player->rot.y, -stickTilt * gPlayerTurnStickMod, 0.1f, gPlayerTurnRate * 0.5f, 0.1f);
|
|
} else {
|
|
Math_SmoothStepToF(&player->rot.y, -stickTilt * gPlayerTurnStickMod, 0.1f, gPlayerTurnRate, 0.1f);
|
|
}
|
|
player->rot_104.y = player->rot.y;
|
|
sp2C = player->baseSpeed;
|
|
|
|
if ((gCurrentLevel == LEVEL_MACBETH) && (sp2C < 3.0f)) {
|
|
sp2C = 3.0f;
|
|
}
|
|
if (player->unk_16C > 0.2f) {
|
|
Math_SmoothStepToF(&player->unk_184, player->baseSpeed * 0.5f, 1.0f, 1.0f, 0.0f);
|
|
}
|
|
if (player->unk_170 > 0.2f) {
|
|
Math_SmoothStepToF(&player->unk_184, -player->baseSpeed * 0.5f, 1.0f, 1.0f, 0.0f);
|
|
}
|
|
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;
|
|
}
|
|
if (player->rollRate > 0) {
|
|
player->unk_184 = -15.0f;
|
|
}
|
|
}
|
|
player->vel.z = -(COS_DEG(player->rot_104.y) * COS_DEG(player->rot_104.x) * sp2C);
|
|
if ((player->vel.x < 20.0f) && (player->rot_104.z < -30.0f)) {
|
|
Math_SmoothStepToF(&player->vel.x, -player->rot_104.z * 0.5f, 0.2f, 3.0f, 0.0f);
|
|
player->unk_184 = 0.0f;
|
|
} else if ((player->vel.x > -20.0f) && (player->rot_104.z > 30.0f)) {
|
|
Math_SmoothStepToF(&player->vel.x, -player->rot_104.z * 0.5f, 0.2f, 3.0f, 0.0f);
|
|
player->unk_184 = 0.0f;
|
|
} else {
|
|
Math_SmoothStepToF(&player->vel.x, player->unk_184 - (SIN_DEG(player->rot_104.y) * sp2C), 0.5f, 5.0f, 0.0f);
|
|
}
|
|
player->vel.z += fabsf((player->unk_184 * 0.4f * player->baseSpeed) / 15.0f);
|
|
if (player->unk_000 == 0) {
|
|
player->vel.z += SIN_DEG(player->rot.x) * player->boostSpeed;
|
|
}
|
|
if (D_800C9F00 != 0) {
|
|
player->vel.z = 2.0f * D_800C9F00;
|
|
}
|
|
player->pos.x += player->vel.x;
|
|
if ((player->xPath + (player->pathWidth - 100.0f)) < player->pos.x) {
|
|
player->flags_228 = PFLAG_228_0;
|
|
}
|
|
if (player->pos.x < (player->xPath - (player->pathWidth - 100.0f))) {
|
|
player->flags_228 = PFLAG_228_1;
|
|
}
|
|
if (player->pathWidth + player->xPath < player->pos.x) {
|
|
player->pos.x = player->pathWidth + player->xPath;
|
|
player->vel.x = 0.0f;
|
|
}
|
|
if (player->pos.x < player->xPath - player->pathWidth) {
|
|
player->pos.x = player->xPath - player->pathWidth;
|
|
player->vel.x = 0.0f;
|
|
}
|
|
player->pos.y += player->vel.y;
|
|
player->vel.y -= player->gravity;
|
|
|
|
if (player->vel.y < -50.0f) {
|
|
player->vel.y = -50.0f;
|
|
}
|
|
if (player->vel.y > 20.0f) {
|
|
player->vel.y = 20.0f;
|
|
}
|
|
player->pos.z += player->vel.z;
|
|
if (player->grounded) {
|
|
player->pathHeight = 0.0f;
|
|
player->rockPhase += player->baseSpeed * 5.0f;
|
|
player->rockAngle = SIN_DEG(player->rockPhase) * 0.7f;
|
|
if (D_800C9F04 == 0) {
|
|
if (player->baseSpeed != 0.0f) {
|
|
func_tank_80043B18(player);
|
|
}
|
|
if (player->rollState != 0.0f) {
|
|
func_tank_80043B18(player);
|
|
}
|
|
}
|
|
}
|
|
if (player->baseSpeed > 0.0f) {
|
|
Texture_Scroll(D_landmaster_3002E80, 32, 32, 0);
|
|
if ((gCurrentLevel == LEVEL_TITANIA) && !gBossActive) {
|
|
func_tank_80043280(D_landmaster_3005EA8, D_TI_6009BB8, gGameFrameCount * -55.0f);
|
|
}
|
|
if ((gCurrentLevel == LEVEL_MACBETH) && (player->state_1C8 == PLAYERSTATE_1C8_LEVEL_COMPLETE)) {
|
|
func_tank_80043280(D_landmaster_3005EA8, *D_Tex_800DACB8, gGameFrameCount * -55.0f);
|
|
}
|
|
}
|
|
if (player->baseSpeed > 10.0f) {
|
|
Texture_Scroll(D_landmaster_3002E80, 32, 32, 0);
|
|
if ((gCurrentLevel == LEVEL_TITANIA) && !gBossActive) {
|
|
func_tank_80043280(D_landmaster_3005EA8, D_TI_6009BB8, gGameFrameCount * -55.0f);
|
|
}
|
|
}
|
|
Player_DamageEffects(player);
|
|
}
|
|
|
|
void func_tank_80045130(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) {
|
|
player->sfx.bank = 1;
|
|
if ((player->rollInputTimerL != 0) && (player->zRotBank > 0.0f) && (player->boostMeter < 10.0f)) {
|
|
player->rollState = 1;
|
|
player->rollTimer = 15;
|
|
player->baseRollRate = 20;
|
|
player->rollRate = 20;
|
|
player->sfx.roll = 1;
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_SLIDE, player->sfxSource, 0);
|
|
} else {
|
|
player->rollInputTimerL = 10;
|
|
}
|
|
}
|
|
if (gInputPress->button & R_TRIG) {
|
|
player->sfx.bank = 1;
|
|
if ((player->rollInputTimerR != 0) && (player->zRotBank < 0.0f) && (player->boostMeter < 10.0f)) {
|
|
player->rollState = 1;
|
|
player->rollTimer = 15;
|
|
player->baseRollRate = -20;
|
|
player->rollRate = -20;
|
|
player->sfx.roll = 1;
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_SLIDE, player->sfxSource, 0);
|
|
} else {
|
|
player->rollInputTimerR = 10;
|
|
}
|
|
}
|
|
player->unk_18C = fabsf(SIN_DEG(player->zRotBank) * 25.0f);
|
|
player->unk_18C += fabsf(SIN_DEG(player->zRotBarrelRoll) * 20.0f);
|
|
}
|
|
|
|
void func_tank_80045348(Player* player) {
|
|
f32 baseSpeedTarget = 15.0f;
|
|
f32 sp40 = 0;
|
|
f32 sp3C = 0.1f;
|
|
f32 sp38 = 3.5f;
|
|
f32 pad1;
|
|
f32 pad2;
|
|
s16 sp2E = false;
|
|
|
|
if (player->unk_19C >= 0) {
|
|
if ((gBoostButton[player->num] & gInputHold->button) && !player->boostCooldown) {
|
|
D_800C9F14++;
|
|
sp2E = true;
|
|
if (D_800C9F24 == 0.0f) {
|
|
player->unk_190 = player->unk_194 = 4.0f;
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_DASH, player->sfxSource, 0);
|
|
} else {
|
|
player->unk_190 = 2.0f;
|
|
}
|
|
baseSpeedTarget = 25.0f;
|
|
sp40 = -200.0f;
|
|
sp3C = 0.2f;
|
|
sp38 = 6.0f;
|
|
|
|
D_800C9F24 += 1.0f;
|
|
if (D_ctx_801779A8[player->num] < 25.0f) {
|
|
D_ctx_801779A8[player->num] = 25.0f;
|
|
}
|
|
|
|
Math_SmoothStepToF(&D_ctx_801779A8[player->num], 50.0f, 1.0f, 10.0f, 0.0f);
|
|
} else {
|
|
D_800C9F24 = 0.0f;
|
|
}
|
|
if ((gBrakeButton[player->num] & gInputHold->button) && !player->boostCooldown && !sp2E) {
|
|
D_800C9F14++;
|
|
baseSpeedTarget = 5.0f;
|
|
sp40 = 100.0f;
|
|
sp3C = 0.2f;
|
|
D_800C9F28 += 1.0f;
|
|
Math_SmoothStepToF(&D_ctx_801779A8[player->num], 25.0f, 1.0f, 5.0f, 0.0f);
|
|
} else {
|
|
D_800C9F28 = 0.0f;
|
|
}
|
|
Math_SmoothStepToF(&player->baseSpeed, baseSpeedTarget, sp3C, sp38, 0.001f);
|
|
Math_SmoothStepToF(&player->camDist, sp40, sp3C, sp38, 0.001f);
|
|
} else if (player->unk_19C == -1) {
|
|
Math_SmoothStepToF(&player->baseSpeed, player->unk_000, 0.1f, 2.0f, 0.01f);
|
|
}
|
|
}
|
|
|
|
void func_tank_80045678(Player* player) {
|
|
static u8 D_800C9F3C = 0;
|
|
f32 temp;
|
|
f32 pad;
|
|
|
|
player->gravity = 3.0f;
|
|
if (!(gInputHold->button & Z_TRIG)) {
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_GO_UP);
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_SLIDE);
|
|
}
|
|
if ((gInputHold->button & Z_TRIG) && !player->boostCooldown) {
|
|
D_800C9F14++;
|
|
if (D_800C9F20 == 0.0f) {
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_BURNER_HALF, player->sfxSource, 0);
|
|
}
|
|
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);
|
|
D_800C9F20 += 1.0f;
|
|
} else {
|
|
if (player->zRotBank > 0) {
|
|
player->unk_188 += 1.5f;
|
|
player->zRotBank -= player->unk_188;
|
|
if (player->zRotBank <= 0.0f) {
|
|
player->zRotBank = 0.0f;
|
|
if (player->unk_188 > 3.0f) {
|
|
player->unk_188 *= -0.4f;
|
|
player->zRotBank -= player->unk_188;
|
|
}
|
|
}
|
|
}
|
|
D_800C9F20 = 0.0f;
|
|
}
|
|
if (!(gInputHold->button & R_TRIG)) {
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_GO_UP);
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_SLIDE);
|
|
}
|
|
if ((gInputHold->button & R_TRIG) && !player->boostCooldown) {
|
|
D_800C9F14++;
|
|
if (player->unk_2C0 == 0.0f) {
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_BURNER_HALF, player->sfxSource, 0);
|
|
}
|
|
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->unk_2C0 += 1.0f;
|
|
} else {
|
|
if (player->zRotBank < 0.0f) {
|
|
player->unk_188 += 1.5f;
|
|
player->zRotBank += player->unk_188;
|
|
if (player->zRotBank >= 0.0f) {
|
|
player->zRotBank = 0.0f;
|
|
if (player->unk_188 > 3.0f) {
|
|
player->unk_188 *= -0.4f;
|
|
player->zRotBank += player->unk_188;
|
|
}
|
|
}
|
|
}
|
|
player->unk_2C0 = 0.0f;
|
|
}
|
|
Math_SmoothStepToF(&player->boostSpeed, 0.0f, 0.1f, 1.0f, 0);
|
|
if ((player->unk_16C > 0.2f) && (player->unk_170 > 0.2f) && (player->radioDamageTimer == 0)) {
|
|
if (D_800C9F3C == 0) {
|
|
D_800C9F3C = 1;
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_SLIDE);
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_BURNER_HALF);
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_GO_UP, player->sfxSource, 0);
|
|
}
|
|
player->zRotBank += ((__cosf(gGameFrameCount * M_DTOR * 8.0f) * 10.0f) - player->zRotBank) * 0.1f;
|
|
temp = -gInputPress->stick_y;
|
|
Math_SmoothStepToF(&player->rot.x, temp * 0.3f, 0.05f, 5.0f, 0.00001f);
|
|
Math_SmoothStepToF(&player->boostSpeed, 15.0f, 0.5f, 5.0f, 0.0f);
|
|
Math_SmoothStepToF(&player->rot.z, 0.0f, 0.1f, 5.0f, 0.00001f);
|
|
player->gravity = -0.4f;
|
|
player->pathHeight += player->vel.y;
|
|
|
|
if (player->pathHeight > 300.0f) {
|
|
player->gravity = 0.0f;
|
|
Math_SmoothStepToF(&player->vel.y, 0.0f, 0.1f, 2.0f, 0);
|
|
}
|
|
if ((gCamCount == 1) && ((gGameFrameCount % 2) == 0)) {
|
|
Effect_Effect359_Spawn(RAND_FLOAT_CENTERED(20.0f) + player->pos.x, player->groundPos.y + 10.0f,
|
|
player->trueZpos - 10.0f, RAND_FLOAT(2.0f) + 3.5f, 255, 16, 1);
|
|
}
|
|
} else {
|
|
D_800C9F3C = 0;
|
|
if ((gCamCount == 1) && ((gGameFrameCount % 4) == 0) && (player->rollState == 0)) {
|
|
if ((player->unk_16C > 0.2f) && (player->radioDamageTimer == 0)) {
|
|
Effect_Effect359_Spawn(RAND_FLOAT_CENTERED(10.0f) + (player->pos.x - 57.0f),
|
|
player->groundPos.y + 10.0f, player->trueZpos - 10.0f, RAND_FLOAT(1.0f) + 1.5f,
|
|
255, 15, 0);
|
|
}
|
|
if ((player->unk_170 > 0.2f) && (player->radioDamageTimer == 0)) {
|
|
Effect_Effect359_Spawn(RAND_FLOAT_CENTERED(10.0f) + (player->pos.x + 57.0f),
|
|
player->groundPos.y + 10.0f, player->trueZpos - 10.0f, RAND_FLOAT(1.0f) + 1.5f,
|
|
255, 15, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_80045E7C(Player* player) {
|
|
player->zRotBarrelRoll = Math_ModF(player->zRotBarrelRoll, 360.0f);
|
|
if (player->rollState == 0) {
|
|
if (player->zRotBarrelRoll > 0.0f) {
|
|
player->zRotBarrelRoll -= player->zRotBarrelRoll * 0.1f;
|
|
if (player->zRotBarrelRoll < 0.1f) {
|
|
player->zRotBarrelRoll = 0.0f;
|
|
}
|
|
}
|
|
if (player->zRotBarrelRoll < 0.0f) {
|
|
player->zRotBarrelRoll -= player->zRotBarrelRoll * 0.1f;
|
|
if (player->zRotBarrelRoll > -0.1f) {
|
|
player->zRotBarrelRoll = 0.0f;
|
|
}
|
|
}
|
|
}
|
|
if (player->rollInputTimerL != 0) {
|
|
player->rollInputTimerL--;
|
|
}
|
|
if (player->rollInputTimerR != 0) {
|
|
player->rollInputTimerR--;
|
|
}
|
|
if (player->rollTimer != 0) {
|
|
player->rollTimer--;
|
|
}
|
|
if (player->rollState != 0) {
|
|
player->rollInputTimerR = 0;
|
|
player->rollInputTimerL = 0;
|
|
player->zRotBarrelRoll += player->rollRate;
|
|
if (player->zRotBank > 0.0f) {
|
|
player->zRotBank -= 8.0f;
|
|
if (player->zRotBank < 0.0f) {
|
|
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) {
|
|
D_ctx_801779A8[player->num] = 25.0f;
|
|
if (player->rollRate > 0) {
|
|
player->rollRate -= 2;
|
|
}
|
|
if (player->rollRate < 0) {
|
|
player->rollRate += 2;
|
|
}
|
|
if (player->rollRate == 0) {
|
|
player->rollState = 0;
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_SLIDE);
|
|
}
|
|
}
|
|
if ((player->rollTimer >= 5) && (player->hitTimer == 0) && (player->rollState != 9)) {
|
|
if (player->rollRate > 0) {
|
|
player->unk_170 = 1.3f;
|
|
}
|
|
if (player->rollRate < 0) {
|
|
player->unk_16C = 1.3f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_800460E0(Player* player, f32* hitboxData, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7) {
|
|
s32 i;
|
|
s32 count;
|
|
|
|
Matrix_RotateY(gCalcMatrix, -arg6 * M_DTOR, MTXF_NEW);
|
|
count = *hitboxData++;
|
|
if (count != 0) {
|
|
for (i = 0; i < count; i++, hitboxData += 6) {
|
|
Vec3f spf94;
|
|
Vec3f sp88;
|
|
Vec3f sp7C;
|
|
Hitbox* hitbox = (Hitbox*) hitboxData;
|
|
|
|
spf94.x = player->pos.x;
|
|
spf94.y = arg3;
|
|
spf94.z = player->trueZpos;
|
|
|
|
sp88.x = spf94.x - arg2;
|
|
sp88.y = spf94.y - arg3;
|
|
sp88.z = spf94.z - arg4;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp88, &sp7C);
|
|
if (Play_CheckSingleHitbox(hitbox, arg2, arg3, arg4, sp7C.x + arg2, sp7C.y + arg3, sp7C.z + arg4)) {
|
|
player->groundPos.y = arg3 + 20.0f + 3.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_80046260(Player* player) {
|
|
Scenery* scenery;
|
|
s32 i;
|
|
|
|
for (i = 0, scenery = gScenery; i < ARRAY_COUNT(gScenery); i++, scenery++) {
|
|
if ((scenery->obj.status == OBJ_ACTIVE) && (scenery->obj.id == OBJ_SCENERY_TI_BRIDGE) &&
|
|
((player->trueZpos - 2000.0f) < scenery->obj.pos.z) && (scenery->obj.pos.y < player->pos.y)) {
|
|
func_tank_800460E0(player, scenery->info.hitbox, scenery->obj.pos.x, scenery->obj.pos.y, scenery->obj.pos.z,
|
|
scenery->obj.rot.x, scenery->obj.rot.y, scenery->obj.rot.z);
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_80046358(Player* player) {
|
|
f32 spD4;
|
|
f32 spD0;
|
|
f32 spCC;
|
|
s32 pad[35];
|
|
Vec3f sp34 = { 0.0f, -10.0f, 0.0f };
|
|
s32 pad1;
|
|
s32 pad2;
|
|
|
|
player->groundPos.x = player->pos.x;
|
|
player->groundPos.z = player->trueZpos + -20.0f;
|
|
player->groundPos.y = gGroundHeight + 3.0f;
|
|
player->shadowRotX = 0.0f;
|
|
player->shadowRotZ = 0.0f;
|
|
player->groundRotY = 0.0f;
|
|
Ground_801B6E20(player->groundPos.x, player->groundPos.z + player->zPath, &spD4, &spD0, &spCC);
|
|
player->groundPos.y = spD0 + 2.0f;
|
|
player->shadowRotX = spD4;
|
|
player->shadowRotZ = spCC;
|
|
}
|
|
|
|
void func_tank_8004641C(Player* player, s32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7) {
|
|
s32 pad1;
|
|
s32 pad2;
|
|
f32 sp84;
|
|
f32 sp80;
|
|
f32 sp7C;
|
|
Vec3f sp70;
|
|
Vec3f sp64;
|
|
Vec3f sp58;
|
|
Vec3f sp4C;
|
|
|
|
Matrix_RotateY(gCalcMatrix, -arg6 * M_DTOR, MTXF_NEW);
|
|
sp70.x = player->vel.x;
|
|
sp70.y = player->vel.y;
|
|
sp70.z = player->vel.z;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp70, &sp4C);
|
|
sp70.x = player->pos.x - arg2;
|
|
sp70.y = player->pos.y - arg3;
|
|
sp70.z = player->trueZpos - arg4;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp70, &sp64);
|
|
sp84 = sp64.x + arg2;
|
|
sp80 = sp64.y + arg3;
|
|
sp7C = sp64.z + arg4;
|
|
if (Play_CheckPolyCollision(arg1, arg2, arg3, arg4, sp84, sp80, sp7C, &sp58, &sp4C)) {
|
|
if (D_MA_801BE250[27] < arg3 + sp58.y) {
|
|
D_MA_801BE250[27] = arg3 + sp58.y;
|
|
if (arg1 == OBJ_SCENERY_MA_WALL_3) {
|
|
player->rollState = 0;
|
|
D_800C9F04 = 1;
|
|
}
|
|
}
|
|
D_MA_801BE250[28] = sp58.x;
|
|
D_MA_801BE250[29] = sp58.z;
|
|
} else if ((arg1 == OBJ_SCENERY_MA_WALL_3) && (D_MA_801BE250[27] == 0.0f) &&
|
|
Play_CheckPolyCollision(arg1, arg2 + 20.0f, arg3, arg4, sp84, sp80, sp7C, &sp58, &sp4C)) {
|
|
player->rollState = 9;
|
|
player->rollTimer = 15;
|
|
if ((arg6 > 90.0f) && (arg6 < 270.0f)) {
|
|
player->rollRate = player->baseRollRate = 20;
|
|
} else {
|
|
player->rollRate = player->baseRollRate = -20;
|
|
}
|
|
}
|
|
if (Play_CheckPolyCollision(arg1, arg2, arg3, arg4, sp84, arg3, sp7C, &sp58, &sp4C) &&
|
|
(D_800C9F10 <= arg3 + sp58.y)) {
|
|
D_800C9F10 = arg3 + sp58.y;
|
|
player->groundPos.x = player->pos.x;
|
|
player->groundPos.y = D_800C9F10 - 2.0f;
|
|
player->shadowRotX = sp58.x;
|
|
player->shadowRotZ = sp58.z;
|
|
}
|
|
}
|
|
|
|
static f32 D_800C9F4C[5] = { 0.0f, -1.0f, 1.0f, 0.5f, -0.5f };
|
|
|
|
void func_tank_80046704(Player* player) {
|
|
s32 pad[7];
|
|
s16 i;
|
|
Scenery* scenery;
|
|
f32 temp1;
|
|
f32 temp2;
|
|
|
|
if (D_800C9F00 > 0) {
|
|
D_800C9F00--;
|
|
}
|
|
if (1) {}
|
|
for (i = 0, scenery = gScenery; i < ARRAY_COUNT(gScenery); i++, scenery++) {
|
|
if ((scenery->obj.status == OBJ_ACTIVE) && ((player->trueZpos - 2000.0f) < scenery->obj.pos.z)) {
|
|
if ((scenery->obj.id == OBJ_SCENERY_MA_TERRAIN_BUMP) || (scenery->obj.id == OBJ_SCENERY_MA_FLOOR_1) ||
|
|
(scenery->obj.id == OBJ_SCENERY_MA_FLOOR_2) || (scenery->obj.id == OBJ_SCENERY_MA_FLOOR_3) ||
|
|
(scenery->obj.id == OBJ_SCENERY_MA_FLOOR_4) || (scenery->obj.id == OBJ_SCENERY_MA_WALL_3)) {
|
|
temp1 = scenery->obj.pos.x - player->pos.x;
|
|
temp2 = scenery->obj.pos.z - player->trueZpos;
|
|
|
|
if (sqrtf(SQ(temp1) + SQ(temp2)) < 2000.0f) {
|
|
func_tank_8004641C(player, scenery->obj.id, scenery->obj.pos.x, scenery->obj.pos.y,
|
|
scenery->obj.pos.z, scenery->obj.rot.x, scenery->obj.rot.y, scenery->obj.rot.z);
|
|
}
|
|
} else if (scenery->obj.id == OBJ_SCENERY_MA_FLOOR_5) {
|
|
if (((player->pos.x - 820.0f) <= scenery->obj.pos.x) &&
|
|
(scenery->obj.pos.x <= (player->pos.x + 820.0f)) &&
|
|
((player->pos.y - 50.0f) <= scenery->obj.pos.y) &&
|
|
(scenery->obj.pos.y <= (player->pos.y + 50.0f)) && (player->trueZpos <= scenery->obj.pos.z) &&
|
|
(scenery->obj.pos.z <= (player->trueZpos + 960.0f))) {
|
|
D_MA_801BE250[27] = scenery->obj.pos.y;
|
|
player->groundPos.x = player->pos.x;
|
|
player->groundPos.y = D_MA_801BE250[27] - 3.0f;
|
|
}
|
|
}
|
|
if ((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_GUILLOTINE_HOUSING) ||
|
|
(scenery->obj.id == OBJ_SCENERY_MA_TRAIN_TRACK_13) || (scenery->obj.id == OBJ_SCENERY_MA_WALL_2) ||
|
|
(scenery->obj.id == OBJ_SCENERY_MA_WALL_3) || (scenery->obj.id == OBJ_SCENERY_MA_WALL_4)) {
|
|
s32 temp_v0;
|
|
s32 sp94;
|
|
|
|
temp_v0 = func_tank_80046E40(player, scenery->info.hitbox, &sp94, scenery->obj.pos.x,
|
|
scenery->obj.pos.y, scenery->obj.pos.z, scenery->obj.rot.x,
|
|
scenery->obj.rot.y, scenery->obj.rot.z, 0.0f, 0.0f, 0.0f);
|
|
switch (temp_v0) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
Math_SmoothStepToF(&player->baseSpeed, 15.0f, 0.3f, 3.5f, 0.001f);
|
|
Math_SmoothStepToF(&player->camDist, 0, 0.3f, 3.5f, 0.001f);
|
|
if (temp_v0 == 1) {
|
|
player->vel.x = -10.0f;
|
|
} else {
|
|
player->vel.x = 10.0f;
|
|
}
|
|
player->pos.x = player->basePos.x;
|
|
player->knockback.x = 2.0f * D_800C9F4C[temp_v0];
|
|
player->pos.x += (D_800C9F4C[temp_v0] * 5.0f);
|
|
break;
|
|
case 3:
|
|
if ((scenery->obj.id == OBJ_SCENERY_MA_BUILDING_1) ||
|
|
(scenery->obj.id == OBJ_SCENERY_MA_BUILDING_2) ||
|
|
(scenery->obj.id == OBJ_SCENERY_GUILLOTINE_HOUSING) ||
|
|
(scenery->obj.id == OBJ_SCENERY_MA_WALL_2) || (scenery->obj.id == OBJ_SCENERY_MA_WALL_4)) {
|
|
Player_ApplyDamage(player, temp_v0, 5);
|
|
}
|
|
player->baseSpeed = -(D_800C9F00 * 1.5f);
|
|
player->vel.z = D_800C9F00 * 1.5f;
|
|
D_800C9F00 = 12;
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_WALL_HIT, player->sfxSource, 0);
|
|
break;
|
|
}
|
|
if (scenery->obj.id == OBJ_SCENERY_MA_BUILDING_1) {
|
|
if (((player->pos.x - 230.0f) <= scenery->obj.pos.x) &&
|
|
(scenery->obj.pos.x <= (player->pos.x + 230.0f)) &&
|
|
((80.0f <= player->pos.y - scenery->obj.pos.y)) &&
|
|
((player->pos.y - scenery->obj.pos.y) < 210.0f) &&
|
|
((player->trueZpos - 220.0f) <= scenery->obj.pos.z) &&
|
|
(scenery->obj.pos.z <= (player->trueZpos + 220.0f))) {
|
|
|
|
if (!(((player->pos.x - 210.0f) <= scenery->obj.pos.x) &&
|
|
(scenery->obj.pos.x <= (player->pos.x + 210.0f))) &&
|
|
(D_MA_801BE250[27] == 0.f) && (player->vel.y < 0.f)) {
|
|
player->rollState = 9;
|
|
player->rollTimer = 15;
|
|
if ((player->pos.x - 200.0f) <= scenery->obj.pos.x) {
|
|
player->rollRate = player->baseRollRate = 20;
|
|
} else {
|
|
player->rollRate = player->baseRollRate = -20;
|
|
}
|
|
} else {
|
|
D_800C9F04 = 1;
|
|
D_MA_801BE250[27] = scenery->obj.pos.y + 206.0f;
|
|
player->rollState = 0;
|
|
}
|
|
}
|
|
if (((player->pos.x - 220.0f) <= scenery->obj.pos.x) &&
|
|
(scenery->obj.pos.x <= (player->pos.x + 220.0f)) &&
|
|
((player->trueZpos - 220.0f) <= scenery->obj.pos.z) &&
|
|
(scenery->obj.pos.z <= (player->trueZpos + 220.0f)) && (player->pos.y >= 200.0f)) {
|
|
player->groundPos.y = scenery->obj.pos.y + 204.0f;
|
|
}
|
|
} else if ((scenery->obj.id == OBJ_SCENERY_MA_TRAIN_TRACK_13) && Macbeth_801A3C20(player->trueZpos)) {
|
|
if (((player->pos.x - 200.0f) < D_MA_801BE250[21]) &&
|
|
(D_MA_801BE250[21] < (player->pos.x + 200.0f))) {
|
|
player->groundPos.y = D_MA_801BE250[22] - 1.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 func_tank_80046E40(Player* player, f32* hitboxData, s32* index, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot,
|
|
f32 zRot, f32 arg9, f32 argA, f32 argB) {
|
|
s32 spB4;
|
|
s32 i;
|
|
f32 var_fa0;
|
|
f32 var_fv0;
|
|
f32 var_fv1;
|
|
f32 spA0;
|
|
Vec3f sp94;
|
|
Vec3f sp88;
|
|
|
|
spB4 = *hitboxData++;
|
|
if (spB4 != 0) {
|
|
for (i = 0; i < spB4; i++, hitboxData += 6) {
|
|
spA0 = 0;
|
|
if (hitboxData[0] == HITBOX_ROTATED) {
|
|
Matrix_RotateZ(gCalcMatrix, -hitboxData[3] * M_DTOR, MTXF_NEW);
|
|
Matrix_RotateX(gCalcMatrix, -hitboxData[1] * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateY(gCalcMatrix, -hitboxData[2] * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateZ(gCalcMatrix, -zRot * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateX(gCalcMatrix, -xRot * M_DTOR, MTXF_APPLY);
|
|
Matrix_RotateY(gCalcMatrix, -yRot * M_DTOR, MTXF_APPLY);
|
|
hitboxData += 4;
|
|
spA0 = 1.0f;
|
|
} else {
|
|
if (hitboxData[0] == HITBOX_SHADOW) {
|
|
hitboxData++;
|
|
}
|
|
Matrix_RotateZ(gCalcMatrix, -zRot * M_DTOR, MTXF_NEW);
|
|
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)) {
|
|
var_fv0 = player->hit1.x;
|
|
var_fv1 = player->hit1.y;
|
|
var_fa0 = player->hit1.z;
|
|
} else {
|
|
sp94.x = player->hit1.x - xPos;
|
|
sp94.y = player->hit1.y - yPos;
|
|
sp94.z = player->hit1.z - zPos;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp94, &sp88);
|
|
var_fv0 = sp88.x + xPos;
|
|
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)) {
|
|
var_fv0 = player->hit2.x;
|
|
var_fv1 = player->hit2.y;
|
|
var_fa0 = player->hit2.z;
|
|
} else {
|
|
sp94.x = player->hit2.x - xPos;
|
|
sp94.y = player->hit2.y - yPos;
|
|
sp94.z = player->hit2.z - zPos;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp94, &sp88);
|
|
var_fv0 = sp88.x + xPos;
|
|
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;
|
|
}
|
|
if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && (spA0 == 0)) {
|
|
var_fv0 = player->hit3.x;
|
|
var_fv1 = player->hit3.y;
|
|
var_fa0 = player->hit3.z;
|
|
} else {
|
|
sp94.x = player->hit3.x - xPos;
|
|
sp94.y = player->hit3.y - yPos;
|
|
sp94.z = player->hit3.z - zPos;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp94, &sp88);
|
|
var_fv0 = sp88.x + xPos;
|
|
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) {
|
|
return -1;
|
|
} else {
|
|
return 3;
|
|
}
|
|
}
|
|
if (hitboxData[-1] == HITBOX_SHADOW) {
|
|
return 0;
|
|
}
|
|
if ((yRot == 0.0f) && (zRot == 0.0f) && (xRot == 0.0f) && (spA0 == 0)) {
|
|
var_fv0 = player->hit4.x;
|
|
var_fv1 = player->hit4.y;
|
|
var_fa0 = player->hit4.z;
|
|
} else {
|
|
sp94.x = player->hit4.x - xPos;
|
|
sp94.y = player->hit4.y - yPos;
|
|
sp94.z = player->hit4.z - zPos;
|
|
Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp94, &sp88);
|
|
var_fv0 = sp88.x + xPos;
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void Tank_UpdateOnRails(Player* player) {
|
|
s32 pad;
|
|
|
|
player->wingPosition = 1;
|
|
func_tank_80045130(player);
|
|
D_800C9F14 = 0;
|
|
func_tank_80045678(player);
|
|
func_tank_80045348(player);
|
|
if (!player->boostCooldown) {
|
|
if (D_800C9F14 != 0) {
|
|
if (D_800C9F14 >= 2) {
|
|
player->boostMeter += 2.0f;
|
|
} else {
|
|
player->boostMeter += 1.0f;
|
|
}
|
|
if (player->boostMeter > 90.0f) {
|
|
player->boostMeter = 90.0f;
|
|
player->boostCooldown = true;
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_BURNER_HALF);
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_GO_UP);
|
|
}
|
|
} else {
|
|
if (player->boostMeter > 0.0f) {
|
|
player->boostCooldown = true;
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_BURNER_HALF);
|
|
Audio_KillSfxBySourceAndId(player->sfxSource, NA_SE_TANK_GO_UP);
|
|
}
|
|
}
|
|
} else {
|
|
player->boostMeter -= 1.0f;
|
|
if (player->boostMeter <= 0.0f) {
|
|
player->boostCooldown = false;
|
|
player->boostMeter = 0.0f;
|
|
}
|
|
}
|
|
Play_dummy_800B41E0(player);
|
|
func_tank_80045E7C(player);
|
|
func_tank_80044868(player);
|
|
D_800C9F04 = 0;
|
|
Player_UpdatePath(player);
|
|
Player_Shoot(player);
|
|
if (gCurrentLevel != LEVEL_MACBETH) {
|
|
Player_CollisionCheck(player);
|
|
} else {
|
|
player->groundPos.x = player->pos.x;
|
|
player->groundPos.z = player->trueZpos + -10.0f;
|
|
player->groundPos.y = gGroundHeight - 4.0f;
|
|
player->shadowRotX = 0.0f;
|
|
player->shadowRotZ = 0.0f;
|
|
player->groundRotY = 0.0f;
|
|
func_tank_800481F4(player);
|
|
}
|
|
if (gCurrentLevel == LEVEL_TITANIA) {
|
|
func_tank_80046358(player);
|
|
func_tank_80046260(player);
|
|
}
|
|
Player_LowHealthAlarm(player);
|
|
if ((player->shields <= 0) && (player->radioDamageTimer != 0)) {
|
|
Player_Down(player);
|
|
}
|
|
}
|
|
|
|
// lots of fake stuff here
|
|
void func_tank_80047754(Player* player) {
|
|
u8 sp2F = false;
|
|
|
|
if ((D_MA_801BE2F0[5] == 0) && (Macbeth_801A3300(player, player->trueZpos, player->rot.y) == 0)) {
|
|
if (((player->pos.x - 110.0f) < D_MA_801BE250[9]) && (D_MA_801BE250[9] < (player->pos.x + 110.0f)) &&
|
|
((player->pos.y - 60.0f) < (D_MA_801BE250[2] + 30.0f)) &&
|
|
((D_MA_801BE250[2] + 30.0f) < (player->pos.y + 60.f))) {
|
|
func_tank_80047D38(player, D_MA_801BE250[2] + 29.0f);
|
|
player->rot.x = D_MA_801BE250[3];
|
|
func_tank_80047FBC(player);
|
|
sp2F = true;
|
|
} else {
|
|
if (((player->pos.x - 150.0f) < D_MA_801BE250[9]) && (D_MA_801BE250[9] < (player->pos.x + 150.0f)) &&
|
|
((player->pos.y - 60.0f) < (D_MA_801BE250[2] + 30.0f)) &&
|
|
((D_MA_801BE250[2] + 30.0f) < (player->pos.y + 60.0f))) {
|
|
func_tank_80047E7C(player, D_MA_801BE250[9], D_MA_801BE250[2] + 30.0f);
|
|
}
|
|
if (1) {}
|
|
}
|
|
}
|
|
if (Macbeth_801A3C20(player->trueZpos)) {
|
|
player->rot.x = D_MA_801BE250[23];
|
|
if (((player->pos.x - 200.0f) < D_MA_801BE250[21]) && (D_MA_801BE250[21] < (player->pos.x + 200.0f))) {
|
|
if (((player->pos.y - 60.0f) < D_MA_801BE250[22]) && (D_MA_801BE250[22] < (player->pos.y + 60.0f))) {
|
|
func_tank_80047D38(player, D_MA_801BE250[22]);
|
|
} else {
|
|
if ((100.0f < (D_MA_801BE250[22] - player->pos.y)) && ((D_MA_801BE250[22] - player->pos.y) < 130.0f)) {
|
|
player->pathHeight = 999.0f;
|
|
player->pos.y = player->basePos.y - 1.0f;
|
|
}
|
|
goto label_29;
|
|
}
|
|
if (!(((player->pos.x - 65.0f) < D_MA_801BE250[21]) && (D_MA_801BE250[21] < (player->pos.x + 65.0f)))) {
|
|
if (!(((player->pos.x - 100.0f) < D_MA_801BE250[21]) &&
|
|
(D_MA_801BE250[21] < (player->pos.x + 100.0f)))) {
|
|
player->grounded = 9;
|
|
Math_SmoothStepToF(&player->pos.y, D_MA_801BE250[22] + 100.0f, 0.5f, 20.0f, 0);
|
|
player->vel.y = 2.0f;
|
|
Math_SmoothStepToF(&player->rot.y, 0.0f, 0.5f, 20.0f, 0);
|
|
Math_SmoothStepToF(&player->pos.x, D_MA_801BE250[21], 0.02f, 30.0f, 0);
|
|
Math_SmoothStepToF(&player->zRotBank, -30.0f, 1.0f, 10.0f, 0);
|
|
D_MA_801BE250[13] += 0; // fake?
|
|
}
|
|
player->unk_188 = 0;
|
|
if (player->pos.x < D_MA_801BE250[21]) {
|
|
player->vel.x = 0.0f;
|
|
player->pos.x += 8.0f;
|
|
} else {
|
|
player->vel.x = 0.0f;
|
|
player->pos.x -= 8.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
label_29:
|
|
|
|
if (((D_MA_801BE2F0[5] == 1) || (player->trueZpos < -116467.875f)) &&
|
|
(Macbeth_801A3790(player, player->trueZpos, player->rot.y) == 0)) {
|
|
if (((player->pos.x - 110.0f) < D_MA_801BE250[19]) && (D_MA_801BE250[19] < (player->pos.x + 110.0f)) &&
|
|
((player->pos.y - 60.0f) < (D_MA_801BE250[12] + 30.0f)) &&
|
|
((D_MA_801BE250[12] + 30.0f) < (player->pos.y + 60.0f))) {
|
|
sp2F = true;
|
|
func_tank_80047D38(player, D_MA_801BE250[12] + 29.0f);
|
|
player->rot.x = D_MA_801BE250[13]; // not fake, but weird
|
|
player->rot.x = D_MA_801BE250[13];
|
|
func_tank_80047FBC(player);
|
|
} else if (((player->pos.x - 150.0f) < D_MA_801BE250[19]) && (D_MA_801BE250[19] < (player->pos.x + 150.0f)) &&
|
|
((player->pos.y - 60.0f) < (D_MA_801BE250[12] + 30.0f)) &&
|
|
((D_MA_801BE250[12] + 30.0f) < (player->pos.y + 60.0f))) {
|
|
func_tank_80047E7C(player, D_MA_801BE250[19], D_MA_801BE250[12] + 30.0f);
|
|
}
|
|
}
|
|
if (!sp2F) {
|
|
if (!D_MA_801BE250) {}
|
|
|
|
func_tank_80046704(player);
|
|
}
|
|
}
|
|
|
|
void func_tank_80047D38(Player* player, f32 arg1) {
|
|
if ((player->unk_16C > 0.2f) && (player->unk_170 > 0.2f) && (player->radioDamageTimer == 0) &&
|
|
(player->vel.y >= 0.0f)) {
|
|
return;
|
|
}
|
|
if ((player->pos.y - 5.0f) < arg1) {
|
|
if (player->vel.y < -10.0f) {
|
|
AUDIO_PLAY_SFX(NA_SE_TANK_BOUND, player->sfxSource, 0);
|
|
player->hitTimer = 10;
|
|
}
|
|
D_800C9F04 = 1;
|
|
player->grounded = true;
|
|
Math_SmoothStepToF(&player->pos.y, arg1, 0.5f, 30.0f, 0.02f);
|
|
player->groundPos.y = arg1 - 1.0f;
|
|
D_800C9F00 = 0;
|
|
player->vel.y = 0.0f;
|
|
}
|
|
}
|
|
|
|
void func_tank_80047E7C(Player* player, f32 arg1, f32 arg2) {
|
|
player->unk_188 = 0.0f;
|
|
if (player->pos.x < arg1) {
|
|
if (player->zRotBank >= -10.0f) {
|
|
Math_SmoothStepToF(&player->zRotBank, 30.0f, 0.5f, 20.0f, 0);
|
|
} else {
|
|
Math_SmoothStepToF(&player->pos.y, arg2, 0.5f, 30.0f, 0);
|
|
if (player->rollState == 0) {
|
|
player->rollState = 9;
|
|
player->rollTimer = 15;
|
|
player->rollRate = player->baseRollRate = -20;
|
|
}
|
|
}
|
|
} else {
|
|
if (player->zRotBank <= 10.0f) {
|
|
Math_SmoothStepToF(&player->zRotBank, -30.0f, 0.5f, 20.0f, 0);
|
|
} else {
|
|
Math_SmoothStepToF(&player->pos.y, arg2, 0.5f, 30.0f, 0);
|
|
if (player->rollState == 0) {
|
|
player->rollState = 9;
|
|
player->rollTimer = 15;
|
|
player->rollRate = player->baseRollRate = 20;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void func_tank_80047FBC(Player* player) {
|
|
f32 temp_fv0;
|
|
f32 temp_fv0_2;
|
|
|
|
if (!(D_800C9F08 & 1)) {
|
|
Math_SmoothStepToF(&player->rot.z, -((player->vel.z / 5.0f) * 4.0f), 0.4f, 8.0f, 0.01f);
|
|
if (player->rot.z >= 3.0f) {
|
|
if (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_LEVEL_COMPLETE) {
|
|
AUDIO_PLAY_SFX(NA_SE_RAILWAY_BOUND, player->sfxSource, 0);
|
|
}
|
|
D_800C9F08 |= 1;
|
|
}
|
|
} else {
|
|
Math_SmoothStepToF(&player->rot.z, (player->vel.z / 5.0f) * 4.0f, 0.4f, 8.0f, 0.01f);
|
|
if (player->rot.z <= -3.0f) {
|
|
D_800C9F08 &= (u8) ~1;
|
|
}
|
|
}
|
|
if (!(D_800C9F08 & 8)) {
|
|
if (-player->vel.z / 5.0f > 3.0f) {
|
|
player->pos.y += 3.0f;
|
|
} else {
|
|
player->pos.y += -player->vel.z / 5.0f;
|
|
}
|
|
D_800C9F08 |= 8;
|
|
} else {
|
|
if (-player->vel.z / 5.0f > 2.0f) {
|
|
player->pos.y -= 2.0f;
|
|
} else {
|
|
player->pos.y -= -player->vel.z / 5.0f;
|
|
}
|
|
D_800C9F08 &= (u8) ~8;
|
|
}
|
|
}
|
|
|
|
void func_tank_800481F4(Player* player) {
|
|
s32 pad[17];
|
|
s32 i;
|
|
s32 temp_v0;
|
|
Actor* actor;
|
|
Boss* boss;
|
|
Sprite* sprite;
|
|
Scenery* scenery;
|
|
s32 sp98;
|
|
s32 pad2;
|
|
f32 var_fv1;
|
|
|
|
Player_UpdateHitbox(player);
|
|
func_tank_800444BC(player);
|
|
if (player->mercyTimer == 0) {
|
|
for (i = 0, scenery = gScenery; i < ARRAY_COUNT(gScenery); i++, scenery++) {
|
|
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_GUILLOTINE_HOUSING) &&
|
|
(scenery->obj.id != OBJ_SCENERY_MA_WALL_2) && (scenery->obj.id != OBJ_SCENERY_MA_WALL_3) &&
|
|
(scenery->obj.id != OBJ_SCENERY_MA_WALL_4) && (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)) {
|
|
var_fv1 = scenery->obj.rot.y;
|
|
if (scenery->info.action == (ObjectFunc) SceneryRotateTowardsCamera) {
|
|
var_fv1 = 0.0f;
|
|
}
|
|
temp_v0 = Player_CheckHitboxCollision(player, scenery->info.hitbox, &sp98, scenery->obj.pos.x,
|
|
scenery->obj.pos.y, scenery->obj.pos.z, scenery->obj.rot.x,
|
|
var_fv1, scenery->obj.rot.z, 0.0f, 0.0f, 0.0f);
|
|
if (temp_v0 != 0) {
|
|
if (temp_v0 < 0) {
|
|
if (temp_v0 == -1) {
|
|
gLight2colorStep = 40;
|
|
gLight2RTarget = 20;
|
|
gLight2GTarget = 20;
|
|
gLight2BTarget = 20;
|
|
player->shadowing = 80;
|
|
if (player->whooshTimer == 0) {
|
|
AUDIO_PLAY_SFX(NA_SE_PASS, player->sfxSource, 0);
|
|
}
|
|
player->whooshTimer += 2;
|
|
if (player->whooshTimer >= 4) {
|
|
player->whooshTimer = 4;
|
|
}
|
|
} else if (temp_v0 == -2) {
|
|
AUDIO_PLAY_SFX(NA_SE_PASS, player->sfxSource, 0);
|
|
}
|
|
} else {
|
|
Player_ApplyDamage(player, temp_v0, scenery->info.damage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 0, boss = gBosses; i < ARRAY_COUNT(gBosses); i++, boss++) {
|
|
if (boss->obj.status == OBJ_ACTIVE) {
|
|
temp_v0 = Player_CheckHitboxCollision(player, boss->info.hitbox, &sp98, boss->obj.pos.x,
|
|
boss->obj.pos.y, boss->obj.pos.z, boss->obj.rot.x,
|
|
boss->obj.rot.y, boss->obj.rot.z, 0.0f, 0.0f, 0.0f);
|
|
if (temp_v0 != 0) {
|
|
Player_ApplyDamage(player, temp_v0, boss->info.damage);
|
|
}
|
|
}
|
|
}
|
|
|
|
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_EVENT) {
|
|
temp_v0 = Player_CheckHitboxCollision(player, actor->info.hitbox, &sp98, actor->obj.pos.x,
|
|
actor->obj.pos.y, actor->obj.pos.z, actor->obj.rot.x,
|
|
actor->obj.rot.y, actor->obj.rot.z, actor->vwork[29].x,
|
|
actor->vwork[29].y, actor->vwork[29].z + actor->rot_0F4.z);
|
|
if (temp_v0 != 0) {
|
|
Player_ApplyDamage(player, temp_v0, actor->info.damage);
|
|
actor->dmgType = DMG_COLLISION;
|
|
actor->dmgSource = player->num + 1;
|
|
}
|
|
} else if (actor->obj.id == OBJ_ACTOR_207) {
|
|
if (func_tank_80046E40(player, actor->info.hitbox, &sp98, actor->obj.pos.x, actor->obj.pos.y,
|
|
actor->obj.pos.z, actor->obj.rot.x, actor->obj.rot.y, actor->obj.rot.z, 0.0f,
|
|
0.0f, 0.0f) != 0) {
|
|
if (player->pos.x < actor->obj.pos.x) {
|
|
player->knockback.x = (actor->vel.z > 5.0f) ? -5.0f : -1.5f;
|
|
player->rollState = 8;
|
|
player->rollTimer = 15;
|
|
player->rollRate = player->baseRollRate = 20;
|
|
} else {
|
|
player->knockback.x = (actor->vel.z > 5.0f) ? 5.0f : 1.5f;
|
|
player->rollState = 8;
|
|
player->rollTimer = 15;
|
|
player->rollRate = player->baseRollRate = -20;
|
|
}
|
|
Math_SmoothStepToF(&player->baseSpeed, 15.0f, 0.3f, 3.5f, 0.001f);
|
|
Math_SmoothStepToF(&player->camDist, 0, 0.3f, 3.5f, 0.001f);
|
|
player->vel.x = 0.0f;
|
|
player->vel.y = 30.0f;
|
|
player->pos.x = player->basePos.x;
|
|
actor->dmgType = DMG_COLLISION;
|
|
Player_ApplyDamage(player, 0, 5);
|
|
player->mercyTimer = 1;
|
|
}
|
|
} else if ((OBJ_ACTOR_MA_LOCOMOTIVE <= actor->obj.id) && (actor->obj.id <= OBJ_ACTOR_MA_TRAIN_CAR_7)) {
|
|
if (func_tank_80046E40(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], actor->fwork[26], actor->obj.rot.z, 0.0f, 0.0f,
|
|
0.0f) != 0) {
|
|
Math_SmoothStepToF(&player->baseSpeed, 15.0f, 0.3f, 3.5f, 0.001f);
|
|
Math_SmoothStepToF(&player->camDist, 0, 0.3f, 3.5f, 0.001f);
|
|
if (player->pos.x < (actor->fwork[23] + actor->obj.pos.x)) {
|
|
player->knockback.x = (actor->vel.z > 5.0f) ? -5.0f : -1.5f;
|
|
player->rollState = 8;
|
|
player->rollTimer = 15;
|
|
player->rollRate = player->baseRollRate = 20;
|
|
} else {
|
|
player->knockback.x = (actor->vel.z > 5.0f) ? 5.0f : 1.5f;
|
|
player->rollState = 8;
|
|
player->rollTimer = 15;
|
|
player->rollRate = player->baseRollRate = -20;
|
|
}
|
|
player->vel.x = 0.0f;
|
|
player->vel.y = 30.0f;
|
|
player->pos.x = player->basePos.x;
|
|
actor->dmgType = DMG_COLLISION;
|
|
if (actor->info.damage != 0) {
|
|
Player_ApplyDamage(player, 0, 20);
|
|
} else {
|
|
actor->dmgType = -1;
|
|
}
|
|
}
|
|
} else {
|
|
temp_v0 = Player_CheckHitboxCollision(player, actor->info.hitbox, &sp98, actor->obj.pos.x,
|
|
actor->obj.pos.y, actor->obj.pos.z, actor->obj.rot.x,
|
|
actor->obj.rot.y, actor->obj.rot.z, 0.0f, 0.0f, 0.0f);
|
|
if (temp_v0 != 0) {
|
|
actor->dmgType = DMG_COLLISION;
|
|
if ((actor->obj.id == OBJ_ACTOR_TI_LANDMINE) || (actor->obj.id == OBJ_MISSILE_SEEK_TEAM)) {
|
|
actor->dmgType = -1;
|
|
}
|
|
if (actor->info.damage) {
|
|
Player_ApplyDamage(player, temp_v0, actor->info.damage);
|
|
if (actor->obj.id == OBJ_ACTOR_TI_LANDMINE) {
|
|
player->knockback.y = 0.0f;
|
|
}
|
|
} else {
|
|
actor->dmgType = -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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) {
|
|
temp_v0 = Player_CheckHitboxCollision(player, sprite->info.hitbox, &sp98, sprite->obj.pos.x,
|
|
sprite->obj.pos.y, sprite->obj.pos.z, 0.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f);
|
|
if (temp_v0 != 0) {
|
|
if ((sprite->obj.id == OBJ_SPRITE_FO_POLE) || (sprite->obj.id == OBJ_SPRITE_CO_POLE) ||
|
|
(sprite->obj.id == OBJ_SPRITE_CO_TREE)) {
|
|
sprite->destroy = true;
|
|
player->hitTimer = 6;
|
|
player->hitDirection = 0;
|
|
} else if (sprite->obj.id == OBJ_SPRITE_TI_CACTUS) {
|
|
sprite->destroy = true;
|
|
} else {
|
|
Player_ApplyDamage(player, temp_v0, sprite->info.damage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Player_CheckItemCollect(player);
|
|
}
|