Zelda64Recomp/patches/event_patches.c

615 lines
23 KiB
C

#include "patches.h"
u8 func_800FE5D0(struct PlayState* play);
void Environment_UpdateTimeBasedSequence(PlayState* play) {
s32 pad;
//! FAKE:
if (gSaveContext.sceneLayer) {}
if ((play->csCtx.state == CS_STATE_IDLE) && !(play->actorCtx.flags & ACTORCTX_FLAG_TELESCOPE_ON)) {
switch (play->envCtx.timeSeqState) {
case TIMESEQ_DAY_BGM:
break;
case TIMESEQ_FADE_DAY_BGM:
if (CURRENT_TIME > CLOCK_TIME(17, 10)) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 240);
play->envCtx.timeSeqState++;
}
break;
case TIMESEQ_NIGHT_BEGIN_SFX:
if (CURRENT_TIME >= CLOCK_TIME(18, 0)) {
play->envCtx.timeSeqState++;
}
break;
case TIMESEQ_EARLY_NIGHT_CRITTERS:
if (play->envCtx.precipitation[PRECIP_RAIN_CUR] < 9) {
Audio_PlayAmbience(play->sequenceCtx.ambienceId);
Audio_SetAmbienceChannelIO(AMBIENCE_CHANNEL_CRITTER_0, 1, 1);
}
play->envCtx.timeSeqState++;
break;
case TIMESEQ_NIGHT_DELAY:
if (CURRENT_TIME >= CLOCK_TIME(19, 0)) {
play->envCtx.timeSeqState++;
}
break;
case TIMESEQ_NIGHT_CRITTERS:
Audio_SetAmbienceChannelIO(AMBIENCE_CHANNEL_CRITTER_0, 1, 0);
Audio_SetAmbienceChannelIO(AMBIENCE_CHANNEL_CRITTER_1 << 4 | AMBIENCE_CHANNEL_CRITTER_3, 1, 1);
play->envCtx.timeSeqState++;
break;
case TIMESEQ_DAY_BEGIN_SFX:
if ((CURRENT_TIME < CLOCK_TIME(19, 0)) && (CURRENT_TIME >= CLOCK_TIME(5, 0))) {
play->envCtx.timeSeqState++;
}
break;
case TIMESEQ_MORNING_CRITTERS:
Audio_SetAmbienceChannelIO(AMBIENCE_CHANNEL_CRITTER_1 << 4 | AMBIENCE_CHANNEL_CRITTER_3, 1, 0);
Audio_SetAmbienceChannelIO(AMBIENCE_CHANNEL_CRITTER_4 << 4 | AMBIENCE_CHANNEL_CRITTER_5, 1, 1);
play->envCtx.timeSeqState++;
break;
case TIMESEQ_DAY_DELAY:
break;
default:
break;
}
}
// @recomp Don't play final hours until it's actually past midnight
if ((play->envCtx.timeSeqState != TIMESEQ_REQUEST) && (((void)0, gSaveContext.save.day) == 3) &&
(CURRENT_TIME < CLOCK_TIME(6, 0)) && !func_800FE5D0(play) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
(play->transitionMode == TRANS_MODE_OFF) && (play->csCtx.state == CS_STATE_IDLE) &&
((play->sceneId != SCENE_00KEIKOKU) || (((void)0, gSaveContext.sceneLayer) != 1)) &&
(CutsceneManager_GetCurrentCsId() == CS_ID_NONE) &&
(AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_FINAL_HOURS) &&
(AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_SONG_OF_SOARING) &&
(CURRENT_TIME > CLOCK_TIME(0, 0))) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_AMBIENCE, 0);
Audio_PlaySceneSequence(NA_BGM_FINAL_HOURS, 3 - 1);
}
}
#include "overlays/actors/ovl_En_Test6/z_en_test6.h"
#include "z64quake.h"
void func_800B7298(PlayState* play, Actor* csActor, u8 csAction); // Player_SetCsActionWithHaltedActors
void EnTest6_SharedSoTCutscene(EnTest6* this, PlayState* play);
extern CutsceneData sDoubleSoTCsCamData[];
static Vec3f sSubCamUp;
struct SoTCsAmmoDrops;
typedef void (*SoTCsAmmoDropDrawFunc)(EnTest6*, PlayState*, struct SoTCsAmmoDrops*);
typedef enum SoTCsAmmoDropType {
/* 0 */ SOTCS_AMMO_DROP_NONE,
/* 1 */ SOTCS_AMMO_DROP_ARROWS,
/* 2 */ SOTCS_AMMO_DROP_BOMB,
/* 3 */ SOTCS_AMMO_DROP_DEKU_NUT,
/* 4 */ SOTCS_AMMO_DROP_DEKU_STICK,
/* 5 */ SOTCS_AMMO_DROP_RUPEE_GREEN,
/* 6 */ SOTCS_AMMO_DROP_RUPEE_BLUE
} SoTCsAmmoDropType;
typedef struct SoTCsAmmoDrops {
/* 0x00 */ SoTCsAmmoDropType type;
/* 0x04 */ f32 scale;
/* 0x08 */ Vec3f pos;
/* 0x14 */ SoTCsAmmoDropDrawFunc draw;
} SoTCsAmmoDrops; // size = 0x18
extern SoTCsAmmoDrops sSoTCsAmmoDrops[12];
typedef enum SoTCsDrawType {
/* 0 */ SOTCS_DRAW_DOUBLE_SOT,
/* 1 */ SOTCS_DRAW_RESET_CYCLE_SOT,
/* 2 */ SOTCS_DRAW_INVERTED_SOT,
/* 99 */ SOTCS_DRAW_TYPE_NONE = 99
} SoTCsDrawType;
void EnTest6_EnableMotionBlur(s16 alpha);
void EnTest6_DisableMotionBlur(void);
void EnTest6_EnableWhiteFillScreen(PlayState* play, f32 alphaRatio);
void EnTest6_DisableWhiteFillScreen(PlayState* play);
void EnTest6_StopDoubleSoTCutscene(EnTest6* this, PlayState* play);
extern Color_RGB8 sDoubleSoTCsFogColor;
extern Color_RGB8 sDoubleSoTCsAmbientColor;
extern Color_RGB8 sDoubleSoTCsDiffuseColor;
extern s16 sDoubleSoTCsFogNear;
extern s16 sDoubleSoTCsZFar;
void EnTest6_DoubleSoTCutscene(EnTest6* this, PlayState* play) {
Input* input = CONTROLLER1(&play->state);
Player* player = GET_PLAYER(play);
Camera* subCam;
s32 pad;
s16 subCamId;
s16 pad2;
if (this->timer > 115) {
this->doubleSoTEnvLerp += 0.2f;
EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
} else if (this->timer > 90) {
this->doubleSoTEnvLerp -= 0.05f;
EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
} else if (this->timer == 90) {
this->doubleSoTEnvLerp = 0.0f;
EnTest6_DisableWhiteFillScreen(play);
}
if (this->timer == 1) {
this->doubleSoTEnvLerp = 0.0f;
EnTest6_DisableWhiteFillScreen(play);
} else if (this->timer < 17) {
this->doubleSoTEnvLerp -= 0.06666666f;
EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
} else if (this->timer < 22) {
this->doubleSoTEnvLerp += 0.2f;
EnTest6_EnableWhiteFillScreen(play, this->doubleSoTEnvLerp);
}
// @recomp Manual relocation, TODO remove when the recompiler handles this automatically.
s16* sDoubleSoTCsFogNear_ptr = actor_relocate(&this->actor, &sDoubleSoTCsFogNear);
s16* sDoubleSoTCsZFar_ptr = actor_relocate(&this->actor, &sDoubleSoTCsZFar);
Color_RGB8* sDoubleSoTCsFogColor_ptr = actor_relocate(&this->actor, &sDoubleSoTCsFogColor);
Color_RGB8* sDoubleSoTCsAmbientColor_ptr = actor_relocate(&this->actor, &sDoubleSoTCsAmbientColor);
Color_RGB8* sDoubleSoTCsDiffuseColor_ptr = actor_relocate(&this->actor, &sDoubleSoTCsDiffuseColor);
if (this->timer == 115) {
Environment_LerpAmbientColor(play, sDoubleSoTCsAmbientColor_ptr, 1.0f);
Environment_LerpDiffuseColor(play, sDoubleSoTCsDiffuseColor_ptr, 1.0f);
Environment_LerpFogColor(play, sDoubleSoTCsFogColor_ptr, 1.0f);
Environment_LerpFog(play, *sDoubleSoTCsFogNear_ptr, *sDoubleSoTCsZFar_ptr, 1.0f);
play->unk_18844 = true;
}
if (this->timer == 15) {
Environment_LerpAmbientColor(play, sDoubleSoTCsAmbientColor_ptr, 0.0f);
Environment_LerpDiffuseColor(play, sDoubleSoTCsDiffuseColor_ptr, 0.0f);
Environment_LerpFogColor(play, sDoubleSoTCsFogColor_ptr, 0.0f);
Environment_LerpFog(play, *sDoubleSoTCsFogNear_ptr, *sDoubleSoTCsZFar_ptr, 0.0f);
play->unk_18844 = false;
}
if (this->screenFillAlpha >= 20) {
Environment_LerpAmbientColor(play, sDoubleSoTCsAmbientColor_ptr, this->doubleSoTEnvLerp);
Environment_LerpDiffuseColor(play, sDoubleSoTCsDiffuseColor_ptr, this->doubleSoTEnvLerp);
Environment_LerpFogColor(play, sDoubleSoTCsFogColor_ptr, this->doubleSoTEnvLerp);
Environment_LerpFog(play, *sDoubleSoTCsFogNear_ptr, *sDoubleSoTCsZFar_ptr, this->doubleSoTEnvLerp);
play->unk_18844 = false;
}
Actor_PlaySfx_FlaggedCentered1(&player->actor, NA_SE_PL_FLYING_AIR - SFX_FLAG);
switch (this->timer) {
case 119:
EnTest6_EnableMotionBlur(50);
break;
case 115:
EnTest6_EnableMotionBlur(20);
Distortion_Request(DISTORTION_TYPE_SONG_OF_TIME);
Distortion_SetDuration(90);
this->cueId = SOTCS_CUEID_DOUBLE_INIT;
break;
case 110:
Audio_PlayFanfare(NA_BGM_SONG_OF_DOUBLE_TIME);
break;
case 38:
case 114:
this->cueId = SOTCS_CUEID_DOUBLE_WAIT;
break;
case 76:
this->cueId = SOTCS_CUEID_DOUBLE_CLOCKS_INWARD;
break;
case 61:
EnTest6_EnableMotionBlur(150);
this->cueId = SOTCS_CUEID_DOUBLE_CLOCKS_SPIN;
break;
case 51:
EnTest6_EnableMotionBlur(180);
this->cueId = SOTCS_CUEID_DOUBLE_CLOCKS_OUTWARD;
break;
case 14:
case 15:
EnTest6_EnableMotionBlur(50);
Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
this->cueId = SOTCS_CUEID_NONE;
break;
case 1:
EnTest6_DisableMotionBlur();
if (CHECK_EVENTINF(EVENTINF_HAS_DAYTIME_TRANSITION_CS)) {
this->cueId = SOTCS_CUEID_DOUBLE_END;
}
break;
default:
break;
}
EnTest6_SharedSoTCutscene(this, play);
if (this->timer == 115) {
subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
subCam = Play_GetCamera(play, subCamId);
this->subCamAt = subCam->at;
this->subCamEye = subCam->eye;
this->subCamFov = subCam->fov;
CutsceneCamera_Init(subCam, &this->csCamInfo);
}
if ((this->timer <= 115) && (this->timer >= 16)) {
// @recomp Manual relocation, TODO remove when the recompiler handles this automatically.
CutsceneData* sDoubleSoTCsCamData_reloc = actor_relocate(&this->actor, sDoubleSoTCsCamData);
CutsceneCamera_UpdateSplines((u8*)sDoubleSoTCsCamData_reloc, &this->csCamInfo);
} else if (this->timer < 16) {
subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
// @recomp Manual relocation, TODO remove when the recompiler handles this automatically.
Vec3f* sSubCamUp_ptr = KaleidoManager_GetRamAddr(&sSubCamUp);
Play_SetCameraAtEyeUp(play, subCamId, &this->subCamAt, &this->subCamEye, sSubCamUp_ptr);
Play_SetCameraFov(play, subCamId, this->subCamFov);
Play_SetCameraRoll(play, subCamId, 0);
}
switch (this->timer) {
case 116:
player->actor.freezeTimer = 2;
player->actor.shape.rot.x = 0;
player->actor.shape.rot.y = 0;
player->actor.world.pos.x = 0.0f;
player->actor.world.pos.y = 0.0f;
player->actor.world.pos.z = 0.0f;
player->actor.home.pos.x = 0.0f;
player->actor.home.pos.y = 0.0f;
player->actor.home.pos.z = 0.0f;
break;
case 98:
func_800B7298(play, NULL, PLAYER_CSACTION_64);
break;
case 68:
func_800B7298(play, NULL, PLAYER_CSACTION_65);
break;
case 52:
func_800B7298(play, NULL, PLAYER_CSACTION_88);
break;
case 43:
func_800B7298(play, NULL, PLAYER_CSACTION_114);
break;
case 38:
func_800B7298(play, NULL, PLAYER_CSACTION_WAIT);
break;
case 14:
player->actor.freezeTimer = 5;
player->actor.world.pos = player->actor.home.pos = this->actor.home.pos;
player->actor.shape.rot = this->actor.home.rot;
player->actor.focus.rot.y = player->actor.shape.rot.y;
player->currentYaw = player->actor.shape.rot.y;
player->unk_ABC = 0.0f;
player->unk_AC0 = 0.0f;
player->actor.shape.yOffset = 0.0f;
break;
default:
break;
}
if ((this->screenFillAlpha > 0) && (this->screenFillAlpha < 20)) {
EnTest6_EnableWhiteFillScreen(play, this->screenFillAlpha * 0.05f);
this->screenFillAlpha++;
if (this->screenFillAlpha >= 20) {
this->timer = 15;
this->doubleSoTEnvLerp = 0.9333333f;
}
} else if ((this->timer < 96) && (this->timer > 50) &&
(CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B))) {
this->screenFillAlpha = 1;
this->timer = 39;
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 20);
}
// @recomp Advance hour as Double SoT ends.
if (this->timer == 15) {
dsot_advance_hour(play);
}
if (DECR(this->timer) == 0) {
EnTest6_StopDoubleSoTCutscene(this, play);
}
}
void Play_InitScene(PlayState* this, s32 spawn);
/**
* Processes two different cutscenes:
* return to "Dawn of the First Day" Cs, and Song of Double Time Cs
*/
void EnTest6_SharedSoTCutscene(EnTest6* this, PlayState* play) {
s32 pad[2];
Player* player = GET_PLAYER(play);
f32 yDiff;
s32 i;
s32 cueChannel;
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_SOTCS)) {
cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_SOTCS);
this->cueId = play->csCtx.actorCues[cueChannel]->id;
switch (this->cueId) {
case SOTCS_CUEID_DOUBLE_WAIT:
break;
case SOTCS_CUEID_DOUBLE_INIT:
this->drawType = SOTCS_DRAW_DOUBLE_SOT;
this->counter = 0;
this->clockAngle = 0;
player->actor.shape.shadowDraw = NULL;
if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
this->clockSpeed = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->clockSpeed = 150.0f;
}
if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
this->clockColorGray = play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->clockColorGray = 38;
}
if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
this->clockDist = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->clockDist = 480.0f;
}
break;
case SOTCS_CUEID_DOUBLE_CLOCKS_INWARD:
if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
this->clockSpeed += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
}
if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
this->clockColorGray += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->clockColorGray += 6;
}
if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
this->clockRadialSpeed = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->clockRadialSpeed = -32.0f;
}
this->clockDist += this->clockRadialSpeed;
break;
case SOTCS_CUEID_DOUBLE_CLOCKS_SPIN:
if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
this->clockSpeed += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
}
if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
this->clockColorGray += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->clockColorGray -= 4;
}
break;
case SOTCS_CUEID_DOUBLE_CLOCKS_OUTWARD:
if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
this->clockSpeed += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
}
if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
this->clockColorGray += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->clockColorGray -= 8;
}
if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
this->clockRadialSpeed += (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->clockRadialSpeed += 20.0f;
}
this->clockDist += this->clockRadialSpeed;
if (this->clockDist > 3500.0f) {
this->clockDist = 3500.0f;
this->cueId = SOTCS_CUEID_NONE;
}
break;
case SOTCS_CUEID_RESET_INIT:
this->drawType = SOTCS_DRAW_RESET_CYCLE_SOT;
this->counter = 0;
this->clockAngle = 0;
player->actor.shape.shadowDraw = NULL;
if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
this->clockSpeed = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->clockSpeed = 100.0f;
}
if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
this->speed = (u32)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->speed = 20.0f;
}
if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
this->clockDist = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->clockDist = 300.0f;
}
this->clockAccel = 0.0f;
break;
case SOTCS_CUEID_RESET_CLOCKS_SLOW_DOWN:
if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
this->clockAccel = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->clockAccel = -5.0f;
}
this->clockSpeed += this->clockAccel;
break;
case SOTCS_CUEID_RESET_CLOCKS_SPEED_UP:
if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
this->clockAccel += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->clockAccel += 2.0f;
}
this->clockSpeed += this->clockAccel;
if (this->clockSpeed > 10000.0f) {
this->clockSpeed = 10000.0f;
this->cueId = SOTCS_CUEID_NONE;
}
break;
case SOTCS_CUEID_NONE:
default:
this->drawType = SOTCS_DRAW_TYPE_NONE;
return;
case SOTCS_CUEID_DOUBLE_END:
Play_SetRespawnData(&play->state, RESPAWN_MODE_RETURN, ((void)0, gSaveContext.save.entrance),
player->unk_3CE, PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B), &player->unk_3C0,
player->unk_3CC);
this->drawType = SOTCS_DRAW_TYPE_NONE;
play->transitionTrigger = TRANS_TRIGGER_START;
play->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entrance;
play->transitionType = TRANS_TYPE_FADE_BLACK;
if ((CURRENT_TIME > CLOCK_TIME(18, 0)) || (CURRENT_TIME < CLOCK_TIME(6, 0))) {
gSaveContext.respawnFlag = -0x63;
SET_EVENTINF(EVENTINF_TRIGGER_DAYTELOP);
} else {
gSaveContext.respawnFlag = 2;
}
play->msgCtx.ocarinaMode = OCARINA_MODE_END;
return;
}
} else {
switch (this->cueId) {
case SOTCS_CUEID_DOUBLE_INIT:
this->drawType = SOTCS_DRAW_DOUBLE_SOT;
this->counter = 0;
this->clockAngle = 0;
player->actor.shape.shadowDraw = NULL;
this->clockColorGray = 38;
this->clockSpeed = 150.0f;
this->clockDist = 480.0f;
case SOTCS_CUEID_DOUBLE_WAIT:
break;
case SOTCS_CUEID_DOUBLE_CLOCKS_INWARD:
this->clockRadialSpeed = -32.0f;
this->clockColorGray += 6;
this->clockDist += -32.0f;
break;
case SOTCS_CUEID_DOUBLE_CLOCKS_SPIN:
this->clockColorGray -= 4;
break;
case SOTCS_CUEID_DOUBLE_CLOCKS_OUTWARD:
this->clockColorGray -= 8;
this->clockRadialSpeed += 20.0f;
this->clockDist += this->clockRadialSpeed;
if (this->clockDist > 3500.0f) {
this->clockDist = 3500.0f;
this->cueId = SOTCS_CUEID_NONE;
}
break;
case SOTCS_CUEID_RESET_INIT:
this->drawType = SOTCS_DRAW_RESET_CYCLE_SOT;
this->counter = 0;
this->clockAngle = 0;
player->actor.shape.shadowDraw = NULL;
this->clockSpeed = 100.0f;
this->speed = 20.0f;
this->clockDist = 300.0f;
this->clockAccel = 0.0f;
break;
case SOTCS_CUEID_RESET_CLOCKS_SLOW_DOWN:
this->clockAccel = -5.0f;
this->clockSpeed += -5.0f;
break;
case SOTCS_CUEID_RESET_CLOCKS_SPEED_UP:
this->clockAccel += 2.0f;
this->clockSpeed += this->clockAccel;
if (this->clockSpeed > 10000.0f) {
this->clockSpeed = 10000.0f;
this->cueId = SOTCS_CUEID_NONE;
}
break;
case SOTCS_CUEID_NONE:
default:
this->drawType = SOTCS_DRAW_TYPE_NONE;
return;
case SOTCS_CUEID_DOUBLE_END:
// @recomp Disable scene reset after Double SoT ends.
return;
}
}
SoTCsAmmoDrops* sSoTCsAmmoDrops_reloc = KaleidoManager_GetRamAddr(sSoTCsAmmoDrops);
if (this->drawType == SOTCS_DRAW_RESET_CYCLE_SOT) {
for (i = 0; i < ARRAY_COUNT(sSoTCsAmmoDrops_reloc); i++) {
sSoTCsAmmoDrops_reloc[i].pos.x += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
sSoTCsAmmoDrops_reloc[i].pos.z += 2.0f * ((2.0f * Rand_ZeroOne()) - 1.0f);
sSoTCsAmmoDrops_reloc[i].pos.y += 3.0f;
if (player->actor.world.pos.y < sSoTCsAmmoDrops_reloc[i].pos.y) {
yDiff = sSoTCsAmmoDrops_reloc[i].pos.y - player->actor.world.pos.y;
if (yDiff > 550.0f) {
yDiff = 1.0f;
} else {
yDiff /= 550.0f;
}
sSoTCsAmmoDrops_reloc[i].scale = SQ(yDiff);
} else {
sSoTCsAmmoDrops_reloc[i].scale = -10.0f;
}
}
}
this->counter++;
}