mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-11-01 08:05:07 -04:00
2eaed8d81e
* The mother of all commits * Removed `GI_SWORD_MASTER`; "Master Sword" Items now actually give MS * Removed dupe MS entries in item pool; updated GIMESSAGE (should stop crashing on non-Windows); re-added MS in item list * Give Adult Link a freebie with shuffle MS on; cihld -> adult no longer gives MS; ToT Master Sword now gives correct item * add master sword GI draw func based on ToT MS object * Force `MasterSword` logic var to only update upon getting MS * Dorf funny line now activates with LA and MS in inv * Apply suggestions * Updated RAND_INF; Check Tracker changes; Gave RAND_INF and ice trap logic to ToT MS check; Fixed swordless behavior for HBA/fishing * ToT MS Check now works in check tracker; Visual bug where box hovers over non-existent MS gone; Fixed RAND_INF check with ToT MS pedestal; Ganon no longer gives free MS * adult equips no longer reset in MS shuffle * Apply (most) locacc review suggestions Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> * Reorganized swordless check for interface to fit edge cases; getting master sword no longer highlights box * Edge case for BGS but no bow * Fix implicit declaration error for GI hooks (#9) * Adjusted `CanAdultAttack/Damage`; applied logic suggestions * Fixed build errors (hopefully) * Cleanup merge * get shit working again * Tidied up remaining uses of DD flag as rando indicator * make master sword invisible and fix ms flag (#10) * Add text to sheik if go mode is obtained but barrier is still up * overhaul swordless behavior in `func_80083108` * reworked ToT MS Check to have an actual GI * suggestions * Apply suggestions * Better swordless handling with temp B (#11) * better swordless handling with temp B * prevent auto save in fishing pond * prevent auto save during bombchu bowling * enum fix --------- Co-authored-by: Adam Bird <archez39@me.com> Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> Co-authored-by: RaelCappra <rael.cappra@gmail.com> Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
151 lines
5.2 KiB
C
151 lines
5.2 KiB
C
#include "global.h"
|
|
|
|
void GameOver_Init(PlayState* play) {
|
|
play->gameOverCtx.state = GAMEOVER_INACTIVE;
|
|
}
|
|
|
|
void GameOver_FadeInLights(PlayState* play) {
|
|
GameOverContext* gameOverCtx = &play->gameOverCtx;
|
|
|
|
if ((gameOverCtx->state >= GAMEOVER_DEATH_WAIT_GROUND && gameOverCtx->state < GAMEOVER_REVIVE_START) ||
|
|
(gameOverCtx->state >= GAMEOVER_REVIVE_RUMBLE && gameOverCtx->state < GAMEOVER_REVIVE_FADE_OUT)) {
|
|
Environment_FadeInGameOverLights(play);
|
|
}
|
|
}
|
|
|
|
// This variable cannot be moved into this file as all of z_message_PAL rodata is in the way
|
|
extern s16 gGameOverTimer;
|
|
|
|
void GameOver_Update(PlayState* play) {
|
|
GameOverContext* gameOverCtx = &play->gameOverCtx;
|
|
s16 i;
|
|
s16 j;
|
|
s32 v90;
|
|
s32 v91;
|
|
s32 v92;
|
|
|
|
switch (gameOverCtx->state) {
|
|
case GAMEOVER_DEATH_START:
|
|
Message_CloseTextbox(play);
|
|
|
|
gSaveContext.timer1State = 0;
|
|
gSaveContext.timer2State = 0;
|
|
gSaveContext.eventInf[1] &= ~1;
|
|
|
|
// search inventory for spoiling items and revert if necessary
|
|
if (!(IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE))) {
|
|
for (i = 0; i < ARRAY_COUNT(gSpoilingItems); i++) {
|
|
if (INV_CONTENT(ITEM_POCKET_EGG) == gSpoilingItems[i]) {
|
|
INV_CONTENT(gSpoilingItemReverts[i]) = gSpoilingItemReverts[i];
|
|
|
|
// search c buttons for the found spoiling item and revert if necessary
|
|
for (j = 1; j < ARRAY_COUNT(gSaveContext.equips.buttonItems); j++) {
|
|
if (gSaveContext.equips.buttonItems[j] == gSpoilingItems[i]) {
|
|
gSaveContext.equips.buttonItems[j] = gSpoilingItemReverts[i];
|
|
Interface_LoadItemIcon1(play, j);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// restore "temporary B" to the B Button if not a sword item
|
|
if (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI &&
|
|
gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER &&
|
|
gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS &&
|
|
gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE) {
|
|
|
|
if (gSaveContext.buttonStatus[0] != BTN_ENABLED) {
|
|
gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0];
|
|
Interface_RandoRestoreSwordless();
|
|
} else {
|
|
gSaveContext.equips.buttonItems[0] = ITEM_NONE;
|
|
}
|
|
}
|
|
|
|
gSaveContext.nayrusLoveTimer = 2000;
|
|
gSaveContext.naviTimer = 0;
|
|
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
|
|
gSaveContext.natureAmbienceId = NATURE_ID_DISABLED;
|
|
gSaveContext.eventInf[0] = 0;
|
|
gSaveContext.eventInf[1] = 0;
|
|
gSaveContext.eventInf[2] = 0;
|
|
gSaveContext.eventInf[3] = 0;
|
|
for (int buttonIndex = 0; buttonIndex < ARRAY_COUNT(gSaveContext.buttonStatus); buttonIndex++) {
|
|
gSaveContext.buttonStatus[buttonIndex] = BTN_ENABLED;
|
|
}
|
|
gSaveContext.unk_13E7 = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = 0;
|
|
|
|
Environment_InitGameOverLights(play);
|
|
gGameOverTimer = 20;
|
|
v90 = VREG(90);
|
|
v91 = VREG(91);
|
|
v92 = VREG(92);
|
|
|
|
func_800AA000(0.0f, ((v90 > 0x64) ? 0xFF : (v90 * 0xFF) / 0x64), (CLAMP_MAX(v91 * 3, 0xFF)),
|
|
((v92 > 0x64) ? 0xFF : (v92 * 0xFF) / 0x64));
|
|
|
|
gameOverCtx->state = GAMEOVER_DEATH_WAIT_GROUND;
|
|
break;
|
|
|
|
case GAMEOVER_DEATH_WAIT_GROUND:
|
|
break;
|
|
|
|
case GAMEOVER_DEATH_DELAY_MENU:
|
|
gGameOverTimer--;
|
|
|
|
if (gGameOverTimer == 0) {
|
|
play->pauseCtx.state = 8;
|
|
gameOverCtx->state++;
|
|
func_800AA15C();
|
|
}
|
|
break;
|
|
|
|
case GAMEOVER_REVIVE_START:
|
|
gameOverCtx->state++;
|
|
gGameOverTimer = 0;
|
|
Environment_InitGameOverLights(play);
|
|
ShrinkWindow_SetVal(0x20);
|
|
return;
|
|
|
|
case GAMEOVER_REVIVE_RUMBLE:
|
|
gGameOverTimer = 50;
|
|
gameOverCtx->state++;
|
|
|
|
v90 = VREG(90);
|
|
v91 = VREG(91);
|
|
v92 = VREG(92);
|
|
|
|
func_800AA000(0.0f, ((v90 > 0x64) ? 0xFF : (v90 * 0xFF) / 0x64), (CLAMP_MAX(v91 * 3, 0xFF)),
|
|
((v92 > 0x64) ? 0xFF : (v92 * 0xFF) / 0x64));
|
|
break;
|
|
|
|
case GAMEOVER_REVIVE_WAIT_GROUND:
|
|
gGameOverTimer--;
|
|
|
|
if (gGameOverTimer == 0) {
|
|
gGameOverTimer = 64;
|
|
gameOverCtx->state++;
|
|
}
|
|
break;
|
|
|
|
case GAMEOVER_REVIVE_WAIT_FAIRY:
|
|
gGameOverTimer--;
|
|
|
|
if (gGameOverTimer == 0) {
|
|
gGameOverTimer = 50;
|
|
gameOverCtx->state++;
|
|
}
|
|
break;
|
|
|
|
case GAMEOVER_REVIVE_FADE_OUT:
|
|
Environment_FadeOutGameOverLights(play);
|
|
gGameOverTimer--;
|
|
|
|
if (gGameOverTimer == 0) {
|
|
gameOverCtx->state = GAMEOVER_INACTIVE;
|
|
}
|
|
break;
|
|
}
|
|
}
|