All Changes
This commit is contained in:
committed by
Banjo Kazooie
parent
fd208f77ca
commit
c2dd933d22
348
src/core2/hazards.c
Normal file
348
src/core2/hazards.c
Normal file
@@ -0,0 +1,348 @@
|
||||
#include <ultra64.h>
|
||||
#include "functions.h"
|
||||
#include "variables.h"
|
||||
|
||||
#include "core2/ba/timer.h"
|
||||
#include "core2/statetimer.h"
|
||||
#include "bs/iFrame.h"
|
||||
|
||||
/* .bss */
|
||||
u8 hazardSfxId;
|
||||
u8 frozenEffectsState;
|
||||
u8 swampEffectsState;
|
||||
f32 playerPosition[3];
|
||||
f32 effectTimer;
|
||||
|
||||
/*.code */
|
||||
bool isOnFloor(void) {
|
||||
return floor_isCurrentFloorunk59() && floor_getCurrentFloorYPosition() > player_getYPosition();
|
||||
}
|
||||
|
||||
void freeHazardSfxId(void) {
|
||||
sfxsource_freeSfxsourceByIndex(hazardSfxId);
|
||||
}
|
||||
|
||||
void hazards_reset(void) {
|
||||
baflag_clear(BA_FLAG_13_TOUCHING_DANGEROUS_GROUND);
|
||||
hazardSfxId = sfxsource_createSfxsourceAndReturnIndex();
|
||||
swampEffectsState = 0;
|
||||
}
|
||||
|
||||
void triggerFrozenHazardEffects(void) {
|
||||
basfx_80299E48();
|
||||
sfxSource_triggerCallbackByIndex(hazardSfxId);
|
||||
sfxsource_setSfxId(hazardSfxId, SFX_14D_BANJO_FREEZING);
|
||||
sfxsource_setSampleRate(hazardSfxId, 30000);
|
||||
sfxsource_playSfxAtVolume(hazardSfxId, 1.2f);
|
||||
sfxSource_setunk43_7ByIndex(hazardSfxId, 3);
|
||||
sfxSource_func_8030E2C4(hazardSfxId);
|
||||
|
||||
frozenEffectsState = 2;
|
||||
effectTimer = 1.0f;
|
||||
}
|
||||
|
||||
void triggerHotHazardEffects(void) {
|
||||
sfxSource_triggerCallbackByIndex(hazardSfxId);
|
||||
sfxsource_setSfxId(hazardSfxId, SFX_B0_SIZZLING_NOISE);
|
||||
sfxsource_setSampleRate(hazardSfxId, 32000);
|
||||
sfxsource_playSfxAtVolume(hazardSfxId, randf2(0.7f, 0.8f));
|
||||
sfxSource_setunk43_7ByIndex(hazardSfxId, 3);
|
||||
sfxSource_func_8030E2C4(hazardSfxId);
|
||||
}
|
||||
|
||||
void spawnPiranhaParticles(void) {
|
||||
f32 player_position[3];
|
||||
|
||||
player_getPosition(player_position);
|
||||
actor_spawnWithYaw_f32(ACTOR_188_PIRANHA_WATER_PARTICLES, player_position, (s32)yaw_get());
|
||||
}
|
||||
|
||||
void triggerSwampHazardEffects(void) {
|
||||
__spawnQueue_add_0(&spawnPiranhaParticles);
|
||||
FUNC_8030E624(SFX_A_BANJO_LANDING_05, 1.0f, 28000);
|
||||
sfxSource_triggerCallbackByIndex(hazardSfxId);
|
||||
sfxsource_setSfxId(hazardSfxId, SFX_6D_CROC_BITE);
|
||||
sfxsource_setSampleRate(hazardSfxId, 22000);
|
||||
sfxSource_setunk43_7ByIndex(hazardSfxId, 3);
|
||||
|
||||
player_getPosition(playerPosition);
|
||||
playerPosition[1] = floor_getCurrentFloorYPosition();
|
||||
|
||||
swampEffectsState = 4;
|
||||
effectTimer = 0.0f;
|
||||
}
|
||||
|
||||
void triggerHazardEffects(void) {
|
||||
switch (map_get()) {
|
||||
case MAP_12_GV_GOBIS_VALLEY:
|
||||
case MAP_31_RBB_RUSTY_BUCKET_BAY:
|
||||
case MAP_3C_RBB_KITCHEN:
|
||||
case MAP_6E_GL_GV_LOBBY:
|
||||
case MAP_8E_GL_FURNACE_FUN:
|
||||
triggerHotHazardEffects();
|
||||
break;
|
||||
|
||||
case MAP_27_FP_FREEZEEZY_PEAK:
|
||||
case MAP_7F_FP_WOZZAS_CAVE:
|
||||
triggerFrozenHazardEffects();
|
||||
break;
|
||||
|
||||
case MAP_D_BGS_BUBBLEGLOOP_SWAMP:
|
||||
case MAP_72_GL_BGS_LOBBY:
|
||||
triggerSwampHazardEffects();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void updateFrozenEffects(void) {
|
||||
if (frozenEffectsState == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((isOnFloor() == 0) && (func_8028F2FC() == 0) && (func_8030E3FC(hazardSfxId) != 0)) {
|
||||
sfxSource_triggerCallbackByIndex(hazardSfxId);
|
||||
frozenEffectsState = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
effectTimer = ml_max_f(0.0f, effectTimer - time_getDelta());
|
||||
|
||||
if (effectTimer != 0.0f) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (frozenEffectsState == 1) { // Seems to never be able to trigger
|
||||
triggerFrozenHazardEffects();
|
||||
} else if (frozenEffectsState == 2) {
|
||||
sfxSource_triggerCallbackByIndex(hazardSfxId);
|
||||
sfxsource_setSfxId(hazardSfxId, SFX_134_FREEZING_SHIVER);
|
||||
sfxsource_setSampleRate(hazardSfxId, 20000);
|
||||
sfxsource_playSfxAtVolume(hazardSfxId, 1.2f);
|
||||
sfxSource_setunk43_7ByIndex(hazardSfxId, 3);
|
||||
sfxSource_func_8030E2C4(hazardSfxId);
|
||||
frozenEffectsState = 2;
|
||||
effectTimer = 1.5f;
|
||||
}
|
||||
}
|
||||
|
||||
void updateBurnSfx(void) {
|
||||
f32 delta_time;
|
||||
s32 sample_rate;
|
||||
|
||||
if (func_8030E3FC(hazardSfxId) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
delta_time = time_getDelta();
|
||||
sample_rate = sfxSource_getSampleRate(hazardSfxId) - (s32) (delta_time * 30000.0);
|
||||
|
||||
if (sample_rate <= 0) {
|
||||
sfxSource_triggerCallbackByIndex(hazardSfxId);
|
||||
return;
|
||||
}
|
||||
|
||||
sfxsource_setSampleRate(hazardSfxId, sample_rate);
|
||||
}
|
||||
|
||||
// Interesting to note, this update function plays the sfx while the other ones wait until after Banjo
|
||||
// has been damaged.
|
||||
void updateSwampEffects(void) {
|
||||
if (swampEffectsState == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
effectTimer = ml_max_f(0.0f, effectTimer - time_getDelta());
|
||||
|
||||
if (effectTimer > 0.0f) {
|
||||
return;
|
||||
}
|
||||
|
||||
swampEffectsState -= 1;
|
||||
effectTimer = randf2(0.12f, 0.22f);
|
||||
sfxsource_playSfxAtVolume(hazardSfxId, randf2(0.95f, 1.05f));
|
||||
sfxSource_func_8030E2C4(hazardSfxId);
|
||||
}
|
||||
|
||||
void updateHazardEffects(void) {
|
||||
switch (map_get()) {
|
||||
case MAP_12_GV_GOBIS_VALLEY:
|
||||
case MAP_31_RBB_RUSTY_BUCKET_BAY:
|
||||
case MAP_3C_RBB_KITCHEN:
|
||||
case MAP_6E_GL_GV_LOBBY:
|
||||
case MAP_8E_GL_FURNACE_FUN:
|
||||
updateBurnSfx();
|
||||
break;
|
||||
|
||||
case MAP_27_FP_FREEZEEZY_PEAK:
|
||||
case MAP_7F_FP_WOZZAS_CAVE:
|
||||
updateFrozenEffects();
|
||||
break;
|
||||
|
||||
case MAP_D_BGS_BUBBLEGLOOP_SWAMP:
|
||||
case MAP_72_GL_BGS_LOBBY:
|
||||
updateSwampEffects();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool isPlayerInHazard(void) {
|
||||
f32 player_position[3];
|
||||
|
||||
switch (map_get()) {
|
||||
case MAP_D_BGS_BUBBLEGLOOP_SWAMP:
|
||||
case MAP_12_GV_GOBIS_VALLEY:
|
||||
case MAP_1B_MMM_MAD_MONSTER_MANSION:
|
||||
case MAP_3C_RBB_KITCHEN:
|
||||
case MAP_43_CCW_SPRING:
|
||||
case MAP_44_CCW_SUMMER:
|
||||
case MAP_45_CCW_AUTUMN:
|
||||
case MAP_46_CCW_WINTER:
|
||||
case MAP_6E_GL_GV_LOBBY:
|
||||
case MAP_72_GL_BGS_LOBBY:
|
||||
case MAP_8E_GL_FURNACE_FUN:
|
||||
return func_80294610(0xE000) && player_isStable();
|
||||
|
||||
case MAP_31_RBB_RUSTY_BUCKET_BAY:
|
||||
player_getPosition(player_position);
|
||||
return player_inWater() && ml_vec3f_inside_box_f(player_position, -9000.0f, -3000.0f, -3850.0f, -6820.0f, -700.0f, -1620.0f);
|
||||
|
||||
case MAP_27_FP_FREEZEEZY_PEAK:
|
||||
case MAP_7F_FP_WOZZAS_CAVE:
|
||||
return player_inWater();
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool canTakeGroundDamage(void) {
|
||||
enum bs_e bs_state;
|
||||
|
||||
bs_state = bs_getState();
|
||||
|
||||
switch (map_get()) {
|
||||
case MAP_D_BGS_BUBBLEGLOOP_SWAMP:
|
||||
case MAP_12_GV_GOBIS_VALLEY:
|
||||
case MAP_1B_MMM_MAD_MONSTER_MANSION:
|
||||
case MAP_27_FP_FREEZEEZY_PEAK:
|
||||
case MAP_31_RBB_RUSTY_BUCKET_BAY:
|
||||
case MAP_3C_RBB_KITCHEN:
|
||||
case MAP_43_CCW_SPRING:
|
||||
case MAP_44_CCW_SUMMER:
|
||||
case MAP_45_CCW_AUTUMN:
|
||||
case MAP_46_CCW_WINTER:
|
||||
case MAP_6E_GL_GV_LOBBY:
|
||||
case MAP_72_GL_BGS_LOBBY:
|
||||
case MAP_7F_FP_WOZZAS_CAVE:
|
||||
case MAP_8E_GL_FURNACE_FUN:
|
||||
return isPlayerInHazard()
|
||||
&& bsStoredState_getTransformation() == TRANSFORM_1_BANJO
|
||||
&& stateTimer_isDone(STATE_TIMER_2_LONGLEG)
|
||||
&& player_movementGroup() != BSGROUP_3_WONDERWING
|
||||
&& player_movementGroup() != BSGROUP_9_LONG_LEG
|
||||
&& baflag_isFalse(BA_FLAG_E_TOUCHING_WADING_BOOTS)
|
||||
&& bs_state != BS_25_LONGLEG_ENTER
|
||||
&& player_getWaterState() != BSWATERGROUP_2_UNDERWATER
|
||||
&& func_8028EC04() < 1U
|
||||
&& bsiFrame_getState() != IFRAME_INVICIBLE
|
||||
&& bs_getState() != BS_3D_FALL_TUMBLING
|
||||
&& player_isDead() < 1U;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void hazards_update(void) {
|
||||
bool can_take_ground_damage;
|
||||
BKCollisionTri *collision;
|
||||
s32 sp1C;
|
||||
s32 sp18;
|
||||
|
||||
updateHazardEffects();
|
||||
|
||||
if (map_get() == MAP_12_GV_GOBIS_VALLEY) {
|
||||
sp18 = 0;
|
||||
sp1C = 0;
|
||||
|
||||
collision = func_802946F0();
|
||||
|
||||
if (collision != NULL) {
|
||||
sp1C = collision->flags & 0x4000;
|
||||
}
|
||||
|
||||
collision = func_8029463C();
|
||||
|
||||
if (collision != NULL) {
|
||||
sp18 = (collision->flags & 0x4000) && player_isStable();
|
||||
}
|
||||
|
||||
if (sp1C || sp18) {
|
||||
baMotor_80250D94(1.0f, 0.5f, 0.4f);
|
||||
player_checkHazardInterrupt(0xD);
|
||||
}
|
||||
}
|
||||
|
||||
can_take_ground_damage = canTakeGroundDamage();
|
||||
batimer_decrement(BA_TIMER_HAZARDS);
|
||||
|
||||
if (can_take_ground_damage) {
|
||||
if (map_get() == MAP_8E_GL_FURNACE_FUN) {
|
||||
if (bs_checkInterrupt(BS_INTR_13_FF_DEATH_SQUARE)) {
|
||||
triggerHazardEffects();
|
||||
}
|
||||
} else {
|
||||
|
||||
if (batimer_isZero(4)) {
|
||||
batimer_set(4, 4.0f);
|
||||
|
||||
if (player_checkHazardInterrupt(0xD)) { // If not invincible, reduces health
|
||||
triggerHazardEffects();
|
||||
baMotor_80250D94(1.0f, 0.5f, 0.4f);
|
||||
}
|
||||
|
||||
if (item_empty(ITEM_14_HEALTH)) {
|
||||
bs_checkInterrupt(BS_INTR_13_FF_DEATH_SQUARE);
|
||||
}
|
||||
}
|
||||
|
||||
switch (map_get()) { // Show dialog associated with touching a hazard for the first time
|
||||
case MAP_43_CCW_SPRING:
|
||||
case MAP_44_CCW_SUMMER:
|
||||
case MAP_45_CCW_AUTUMN:
|
||||
case MAP_46_CCW_WINTER:
|
||||
progressDialog_showDialogMaskZero(FILEPROG_AA_HAS_TOUCHED_CCW_BRAMBLE_FIELD);
|
||||
break;
|
||||
|
||||
case MAP_D_BGS_BUBBLEGLOOP_SWAMP:
|
||||
case MAP_72_GL_BGS_LOBBY:
|
||||
progressDialog_showDialogMaskZero(FILEPROG_F_HAS_TOUCHED_PIRANHA_WATER);
|
||||
break;
|
||||
|
||||
case MAP_3C_RBB_KITCHEN:
|
||||
progressDialog_showDialogMaskZero(FILEPROG_A9_HAS_TOUCHED_RBB_OVEN);
|
||||
break;
|
||||
|
||||
case MAP_12_GV_GOBIS_VALLEY:
|
||||
case MAP_6E_GL_GV_LOBBY:
|
||||
case MAP_8E_GL_FURNACE_FUN:
|
||||
progressDialog_showDialogMaskZero(FILEPROG_10_HAS_TOUCHED_SAND_EEL_SAND);
|
||||
break;
|
||||
|
||||
case MAP_27_FP_FREEZEEZY_PEAK:
|
||||
case MAP_7F_FP_WOZZAS_CAVE:
|
||||
progressDialog_showDialogMaskZero(FILEPROG_14_HAS_TOUCHED_FP_ICY_WATER);
|
||||
break;
|
||||
|
||||
case MAP_1B_MMM_MAD_MONSTER_MANSION:
|
||||
if (!isOnFloor()) {
|
||||
progressDialog_showDialogMaskZero(FILEPROG_86_HAS_TOUCHED_MMM_THORN_HEDGE);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
baflag_set(BA_FLAG_13_TOUCHING_DANGEROUS_GROUND);
|
||||
} else {
|
||||
baflag_clear(BA_FLAG_13_TOUCHING_DANGEROUS_GROUND);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user