mirror of
https://github.com/HarbourMasters/Shipwright
synced 2026-06-09 12:55:53 -04:00
Merge branch 'rando-next' of https://github.com/HarbourMasters/Shipwright into get-item-rework-rando-next
Hopefully everything works here. Need to do some testing.
This commit is contained in:
@@ -1246,6 +1246,7 @@ void Audio_StepFreqLerp(FreqLerp* lerp);
|
||||
void func_800F56A8(void);
|
||||
void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId);
|
||||
s32 Audio_SetGanonDistVol(u8 targetVol);
|
||||
void Audio_PlayFanfare_Rando(ItemID getItemId);
|
||||
|
||||
// Function originally not called, so repurposing for DPad input
|
||||
void func_800EC960(u8 dpad) {
|
||||
@@ -3889,6 +3890,49 @@ void Audio_ResetSfxChannelState(void) {
|
||||
sAudioCodeReverb = 0;
|
||||
}
|
||||
|
||||
// Function to play "get-item" fanfares according to the type of item obtained (used in rando)
|
||||
// Longer fanfares for medallions/stones/songs are behind the Cvar
|
||||
void Audio_PlayFanfare_Rando(ItemID getItemId) {
|
||||
s32 temp1;
|
||||
|
||||
if (((getItemId >= GI_RUPEE_GREEN) && (getItemId <= GI_RUPEE_RED)) ||
|
||||
((getItemId >= GI_RUPEE_PURPLE) && (getItemId <= GI_RUPEE_GOLD)) ||
|
||||
((getItemId >= GI_RUPEE_GREEN_LOSE) && (getItemId <= GI_RUPEE_PURPLE_LOSE)) || (getItemId == GI_HEART)) {
|
||||
Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
|
||||
} else {
|
||||
if ((getItemId == GI_HEART_CONTAINER_2) || (getItemId == GI_HEART_CONTAINER) ||
|
||||
((getItemId == GI_HEART_PIECE) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) {
|
||||
temp1 = NA_BGM_HEART_GET | 0x900;
|
||||
} else {
|
||||
temp1 = (getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900;
|
||||
}
|
||||
// If we get a skulltula token or the "WINNER" heart, play "get small item"
|
||||
if (getItemId == GI_SKULL_TOKEN || getItemId == GI_HEART_PIECE_WIN) {
|
||||
temp1 = NA_BGM_SMALL_ITEM_GET | 0x900;
|
||||
}
|
||||
// But if the "WINNER" heart is the 4th heart piece collected, play "get heart container"
|
||||
if (getItemId == GI_HEART_PIECE_WIN && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000)) {
|
||||
temp1 = NA_BGM_HEART_GET | 0x900;
|
||||
}
|
||||
// If the setting is toggled on and we get special quest items (longer fanfares):
|
||||
if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) {
|
||||
// If we get a medallion, play the "get a medallion" fanfare
|
||||
if ((getItemId >= RG_FOREST_MEDALLION) && (getItemId <= RG_LIGHT_MEDALLION)) {
|
||||
temp1 = NA_BGM_MEDALLION_GET | 0x900;
|
||||
}
|
||||
// If it's a Spiritual Stone, play the "get a spiritual stone" fanfare
|
||||
if ((getItemId >= RG_KOKIRI_EMERALD) && (getItemId <= RG_ZORA_SAPPHIRE)) {
|
||||
temp1 = NA_BGM_SPIRITUAL_STONE | 0x900;
|
||||
}
|
||||
// If the item we're getting is a song, play the "learned a song" fanfare
|
||||
if ((getItemId >= RG_ZELDAS_LULLABY) && (getItemId <= RG_PRELUDE_OF_LIGHT)) {
|
||||
temp1 = NA_BGM_OCA_FAIRY_GET | 0x900;
|
||||
}
|
||||
}
|
||||
Audio_PlayFanfare(temp1);
|
||||
}
|
||||
}
|
||||
|
||||
void func_800F3F3C(u8 arg0) {
|
||||
if (gSoundBankMuted[0] != 1) {
|
||||
Audio_StartSeq(SEQ_PLAYER_BGM_SUB, 0, NA_BGM_VARIOUS_SFX);
|
||||
|
||||
@@ -1966,6 +1966,10 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) {
|
||||
player->getItemId = getItemId;
|
||||
player->interactRangeActor = &player->actor;
|
||||
player->getItemDirection = player->actor.shape.rot.y;
|
||||
// Player state 26 = Player is frozen
|
||||
if (player->stateFlags1 & (PLAYER_STATE1_26)) {
|
||||
player->pendingIceTrap = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,19 +33,21 @@ void GameOver_Update(GlobalContext* globalCtx) {
|
||||
gSaveContext.eventInf[1] &= ~1;
|
||||
|
||||
// search inventory for spoiling items and revert if necessary
|
||||
for (i = 0; i < ARRAY_COUNT(gSpoilingItems); i++) {
|
||||
if (INV_CONTENT(ITEM_POCKET_EGG) == gSpoilingItems[i]) {
|
||||
INV_CONTENT(gSpoilingItemReverts[i]) = gSpoilingItemReverts[i];
|
||||
if (!(gSaveContext.n64ddFlag && 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(globalCtx, j);
|
||||
// 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(globalCtx, j);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// restore "temporary B" to the B Button if not a sword item
|
||||
if (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI &&
|
||||
|
||||
@@ -2101,7 +2101,7 @@ void func_80075B44(GlobalContext* globalCtx) {
|
||||
gSaveContext.dogIsLost = true;
|
||||
func_80078884(NA_SE_EV_CHICKEN_CRY_M);
|
||||
if ((Inventory_ReplaceItem(globalCtx, ITEM_WEIRD_EGG, ITEM_CHICKEN) ||
|
||||
Inventory_ReplaceItem(globalCtx, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO)) &&
|
||||
Inventory_HatchPocketCucco(globalCtx)) &&
|
||||
globalCtx->csCtx.state == 0 && !Player_InCsMode(globalCtx)) {
|
||||
Message_StartTextbox(globalCtx, 0x3066, NULL);
|
||||
}
|
||||
|
||||
@@ -1663,6 +1663,7 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) {
|
||||
gSaveContext.eventInf[0] = gSaveContext.eventInf[1] = gSaveContext.eventInf[2] = gSaveContext.eventInf[3] = 0;
|
||||
}
|
||||
|
||||
// RANDOTODO: Use this for ice trap messages
|
||||
if (CustomMessage_RetrieveIfExists(globalCtx)) {
|
||||
osSyncPrintf("Found custom message");
|
||||
} else if (sTextIsCredits) {
|
||||
|
||||
+119
-23
@@ -3,6 +3,7 @@
|
||||
#include "textures/parameter_static/parameter_static.h"
|
||||
#include "textures/do_action_static/do_action_static.h"
|
||||
#include "textures/icon_item_static/icon_item_static.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <stdlib.h>
|
||||
@@ -1686,29 +1687,6 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
|
||||
}
|
||||
return ITEM_NONE;
|
||||
} else if (item == ITEM_KEY_SMALL) {
|
||||
// Small key exceptions for rando.
|
||||
if (gSaveContext.n64ddFlag) {
|
||||
if (globalCtx->sceneNum == 10) { // ganon's tower -> ganon's castle
|
||||
if (gSaveContext.inventory.dungeonKeys[13] < 0) {
|
||||
gSaveContext.inventory.dungeonKeys[13] = 1;
|
||||
return ITEM_NONE;
|
||||
} else {
|
||||
gSaveContext.inventory.dungeonKeys[13]++;
|
||||
return ITEM_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
if (globalCtx->sceneNum == 92) { // Desert Colossus -> Spirit Temple.
|
||||
if (gSaveContext.inventory.dungeonKeys[6] < 0) {
|
||||
gSaveContext.inventory.dungeonKeys[6] = 1;
|
||||
return ITEM_NONE;
|
||||
} else {
|
||||
gSaveContext.inventory.dungeonKeys[6]++;
|
||||
return ITEM_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] < 0) {
|
||||
gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] = 1;
|
||||
return ITEM_NONE;
|
||||
@@ -2100,6 +2078,10 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
|
||||
gSaveContext.itemGetInf[1] |= 0x8000;
|
||||
}
|
||||
|
||||
if (item >= ITEM_POCKET_EGG) {
|
||||
gSaveContext.adultTradeItems |= ADULT_TRADE_FLAG(item);
|
||||
}
|
||||
|
||||
temp = INV_CONTENT(item);
|
||||
INV_CONTENT(item) = item;
|
||||
|
||||
@@ -2241,6 +2223,98 @@ u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) {
|
||||
return ITEM_NONE;
|
||||
}
|
||||
}
|
||||
} else if ((item >= RG_GERUDO_FORTRESS_SMALL_KEY && item <= RG_GANONS_CASTLE_SMALL_KEY) ||
|
||||
(item >= RG_FOREST_TEMPLE_BOSS_KEY && item <= RG_GANONS_CASTLE_BOSS_KEY) ||
|
||||
(item >= RG_DEKU_TREE_MAP && item <= RG_ICE_CAVERN_MAP) ||
|
||||
(item >= RG_DEKU_TREE_COMPASS && item <= RG_ICE_CAVERN_COMPASS)) {
|
||||
int mapIndex = gSaveContext.mapIndex;
|
||||
switch (item) {
|
||||
case RG_DEKU_TREE_MAP:
|
||||
case RG_DEKU_TREE_COMPASS:
|
||||
mapIndex = SCENE_YDAN;
|
||||
break;
|
||||
case RG_DODONGOS_CAVERN_MAP:
|
||||
case RG_DODONGOS_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_DDAN;
|
||||
break;
|
||||
case RG_JABU_JABUS_BELLY_MAP:
|
||||
case RG_JABU_JABUS_BELLY_COMPASS:
|
||||
mapIndex = SCENE_BDAN;
|
||||
break;
|
||||
case RG_FOREST_TEMPLE_MAP:
|
||||
case RG_FOREST_TEMPLE_COMPASS:
|
||||
case RG_FOREST_TEMPLE_SMALL_KEY:
|
||||
case RG_FOREST_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_BMORI1;
|
||||
break;
|
||||
case RG_FIRE_TEMPLE_MAP:
|
||||
case RG_FIRE_TEMPLE_COMPASS:
|
||||
case RG_FIRE_TEMPLE_SMALL_KEY:
|
||||
case RG_FIRE_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HIDAN;
|
||||
break;
|
||||
case RG_WATER_TEMPLE_MAP:
|
||||
case RG_WATER_TEMPLE_COMPASS:
|
||||
case RG_WATER_TEMPLE_SMALL_KEY:
|
||||
case RG_WATER_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_MIZUSIN;
|
||||
break;
|
||||
case RG_SPIRIT_TEMPLE_MAP:
|
||||
case RG_SPIRIT_TEMPLE_COMPASS:
|
||||
case RG_SPIRIT_TEMPLE_SMALL_KEY:
|
||||
case RG_SPIRIT_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_JYASINZOU;
|
||||
break;
|
||||
case RG_SHADOW_TEMPLE_MAP:
|
||||
case RG_SHADOW_TEMPLE_COMPASS:
|
||||
case RG_SHADOW_TEMPLE_SMALL_KEY:
|
||||
case RG_SHADOW_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HAKADAN;
|
||||
break;
|
||||
case RG_BOTTOM_OF_THE_WELL_MAP:
|
||||
case RG_BOTTOM_OF_THE_WELL_COMPASS:
|
||||
case RG_BOTTOM_OF_THE_WELL_SMALL_KEY:
|
||||
mapIndex = SCENE_HAKADANCH;
|
||||
break;
|
||||
case RG_ICE_CAVERN_MAP:
|
||||
case RG_ICE_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_ICE_DOUKUTO;
|
||||
break;
|
||||
case RG_GANONS_CASTLE_BOSS_KEY:
|
||||
mapIndex = SCENE_GANON;
|
||||
break;
|
||||
case RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
|
||||
mapIndex = SCENE_MEN;
|
||||
break;
|
||||
case RG_GERUDO_FORTRESS_SMALL_KEY:
|
||||
mapIndex = SCENE_GERUDOWAY;
|
||||
break;
|
||||
case RG_GANONS_CASTLE_SMALL_KEY:
|
||||
mapIndex = SCENE_GANONTIKA;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((item >= RG_GERUDO_FORTRESS_SMALL_KEY) && (item <= RG_GANONS_CASTLE_SMALL_KEY)) {
|
||||
if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) {
|
||||
gSaveContext.inventory.dungeonKeys[mapIndex] = 1;
|
||||
return RG_NONE;
|
||||
} else {
|
||||
gSaveContext.inventory.dungeonKeys[mapIndex]++;
|
||||
return RG_NONE;
|
||||
}
|
||||
} else {
|
||||
int bitmask;
|
||||
if ((item >= RG_DEKU_TREE_MAP) && (item <= RG_ICE_CAVERN_MAP)) {
|
||||
bitmask = gBitFlags[2];
|
||||
} else if ((item >= RG_DEKU_TREE_COMPASS) && (item <= RG_ICE_CAVERN_COMPASS)) {
|
||||
bitmask = gBitFlags[1];
|
||||
} else {
|
||||
bitmask = gBitFlags[0];
|
||||
}
|
||||
|
||||
gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask;
|
||||
return RG_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
temp = gSaveContext.inventory.items[slot];
|
||||
@@ -2303,6 +2377,13 @@ u8 Item_CheckObtainability(u8 item) {
|
||||
} else {
|
||||
return ITEM_NONE;
|
||||
}
|
||||
} else if ( gSaveContext.n64ddFlag &&
|
||||
((item >= RG_GERUDO_FORTRESS_SMALL_KEY) && (item <= RG_GANONS_CASTLE_SMALL_KEY) ||
|
||||
(item >= RG_FOREST_TEMPLE_BOSS_KEY) && (item <= RG_GANONS_CASTLE_BOSS_KEY) ||
|
||||
(item >= RG_DEKU_TREE_MAP) && (item <= RG_ICE_CAVERN_MAP) ||
|
||||
(item >= RG_DEKU_TREE_COMPASS) && (item <= RG_ICE_CAVERN_COMPASS))
|
||||
) {
|
||||
return ITEM_NONE;
|
||||
} else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) {
|
||||
return ITEM_NONE;
|
||||
} else if (item == ITEM_KEY_SMALL) {
|
||||
@@ -2504,6 +2585,21 @@ s32 Inventory_ConsumeFairy(GlobalContext* globalCtx) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool Inventory_HatchPocketCucco(GlobalContext* globalCtx) {
|
||||
if (!gSaveContext.n64ddFlag) {
|
||||
return Inventory_ReplaceItem(globalCtx, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO);
|
||||
}
|
||||
|
||||
if (!PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_POCKET_EGG)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
gSaveContext.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG);
|
||||
gSaveContext.adultTradeItems |= ADULT_TRADE_FLAG(ITEM_POCKET_CUCCO);
|
||||
Inventory_ReplaceItem(globalCtx, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void func_80086D5C(s32* buf, u16 size) {
|
||||
u16 i;
|
||||
|
||||
|
||||
@@ -400,7 +400,7 @@ void Gameplay_Init(GameState* thisx) {
|
||||
gSaveContext.bgsDayCount++;
|
||||
gSaveContext.dogIsLost = true;
|
||||
if (Inventory_ReplaceItem(globalCtx, ITEM_WEIRD_EGG, ITEM_CHICKEN) ||
|
||||
Inventory_ReplaceItem(globalCtx, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO)) {
|
||||
Inventory_HatchPocketCucco(globalCtx)) {
|
||||
Message_StartTextbox(globalCtx, 0x3066, NULL);
|
||||
}
|
||||
gSaveContext.nextDayTime = 0xFFFE;
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
#include "overlays/actors/ovl_Bg_Dodoago/z_bg_dodoago.h"
|
||||
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
|
||||
#define ENTRANCE(scene, spawn, continueBgm, displayTitleCard, fadeIn, fadeOut) \
|
||||
{ \
|
||||
scene, spawn, \
|
||||
@@ -2136,7 +2138,11 @@ void func_8009EE44(GlobalContext* globalCtx) {
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 128, 128, 128, 128);
|
||||
|
||||
if ((globalCtx->roomCtx.unk_74[0] == 0) && (INV_CONTENT(ITEM_COJIRO) == ITEM_COJIRO)) {
|
||||
bool playerHasCojiro = INV_CONTENT(ITEM_COJIRO) == ITEM_COJIRO;
|
||||
if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE)) {
|
||||
playerHasCojiro = PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_COJIRO);
|
||||
}
|
||||
if ((globalCtx->roomCtx.unk_74[0] == 0) && playerHasCojiro) {
|
||||
if (globalCtx->roomCtx.unk_74[1] == 50) {
|
||||
func_8002F7DC(&GET_PLAYER(globalCtx)->actor, NA_SE_EV_CHICKEN_CRY_M);
|
||||
globalCtx->roomCtx.unk_74[0] = 1;
|
||||
|
||||
+156
-13
@@ -6,6 +6,7 @@
|
||||
|
||||
#define NUM_DUNGEONS 8
|
||||
#define NUM_TRIALS 6
|
||||
#define NUM_COWS 10
|
||||
|
||||
/**
|
||||
* Initialize new save.
|
||||
@@ -416,6 +417,95 @@ void GiveLinkDungeonReward(uint16_t getItemId) {
|
||||
}
|
||||
}
|
||||
|
||||
void GiveLinkDungeonItem(GetItemID getItemId) {
|
||||
int mapIndex;
|
||||
|
||||
switch (getItemId) {
|
||||
case RG_DEKU_TREE_MAP:
|
||||
case RG_DEKU_TREE_COMPASS:
|
||||
mapIndex = SCENE_YDAN;
|
||||
break;
|
||||
case RG_DODONGOS_CAVERN_MAP:
|
||||
case RG_DODONGOS_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_DDAN;
|
||||
break;
|
||||
case RG_JABU_JABUS_BELLY_MAP:
|
||||
case RG_JABU_JABUS_BELLY_COMPASS:
|
||||
mapIndex = SCENE_BDAN;
|
||||
break;
|
||||
case RG_FOREST_TEMPLE_MAP:
|
||||
case RG_FOREST_TEMPLE_COMPASS:
|
||||
case RG_FOREST_TEMPLE_SMALL_KEY:
|
||||
case RG_FOREST_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_BMORI1;
|
||||
break;
|
||||
case RG_FIRE_TEMPLE_MAP:
|
||||
case RG_FIRE_TEMPLE_COMPASS:
|
||||
case RG_FIRE_TEMPLE_SMALL_KEY:
|
||||
case RG_FIRE_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HIDAN;
|
||||
break;
|
||||
case RG_WATER_TEMPLE_MAP:
|
||||
case RG_WATER_TEMPLE_COMPASS:
|
||||
case RG_WATER_TEMPLE_SMALL_KEY:
|
||||
case RG_WATER_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_MIZUSIN;
|
||||
break;
|
||||
case RG_SPIRIT_TEMPLE_MAP:
|
||||
case RG_SPIRIT_TEMPLE_COMPASS:
|
||||
case RG_SPIRIT_TEMPLE_SMALL_KEY:
|
||||
case RG_SPIRIT_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_JYASINZOU;
|
||||
break;
|
||||
case RG_SHADOW_TEMPLE_MAP:
|
||||
case RG_SHADOW_TEMPLE_COMPASS:
|
||||
case RG_SHADOW_TEMPLE_SMALL_KEY:
|
||||
case RG_SHADOW_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HAKADAN;
|
||||
break;
|
||||
case RG_BOTTOM_OF_THE_WELL_MAP:
|
||||
case RG_BOTTOM_OF_THE_WELL_COMPASS:
|
||||
case RG_BOTTOM_OF_THE_WELL_SMALL_KEY:
|
||||
mapIndex = SCENE_HAKADANCH;
|
||||
break;
|
||||
case RG_ICE_CAVERN_MAP:
|
||||
case RG_ICE_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_ICE_DOUKUTO;
|
||||
break;
|
||||
case RG_GANONS_CASTLE_BOSS_KEY:
|
||||
mapIndex = SCENE_GANON;
|
||||
break;
|
||||
case RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
|
||||
mapIndex = SCENE_MEN;
|
||||
break;
|
||||
case RG_GERUDO_FORTRESS_SMALL_KEY:
|
||||
mapIndex = SCENE_GERUDOWAY;
|
||||
break;
|
||||
case RG_GANONS_CASTLE_SMALL_KEY:
|
||||
mapIndex = SCENE_GANONTIKA;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((getItemId >= RG_GERUDO_FORTRESS_SMALL_KEY) && (getItemId <= RG_GANONS_CASTLE_SMALL_KEY)) {
|
||||
if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) {
|
||||
gSaveContext.inventory.dungeonKeys[mapIndex] = 1;
|
||||
} else {
|
||||
gSaveContext.inventory.dungeonKeys[mapIndex]++;
|
||||
}
|
||||
} else {
|
||||
int bitmask;
|
||||
if ((getItemId >= RG_DEKU_TREE_MAP) && (getItemId <= RG_ICE_CAVERN_MAP)) {
|
||||
bitmask = gBitFlags[2];
|
||||
} else if ((getItemId >= RG_DEKU_TREE_COMPASS) && (getItemId <= RG_ICE_CAVERN_COMPASS)) {
|
||||
bitmask = gBitFlags[1];
|
||||
} else {
|
||||
bitmask = gBitFlags[0];
|
||||
}
|
||||
|
||||
gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask;
|
||||
}
|
||||
}
|
||||
|
||||
void GiveLinksPocketMedallion() {
|
||||
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LINKS_POCKET, RG_NONE);
|
||||
|
||||
@@ -563,13 +653,15 @@ void Sram_OpenSave() {
|
||||
gSaveContext.equips.equipment |= 2;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(gSpoilingItems); i++) {
|
||||
if (INV_CONTENT(ITEM_TRADE_ADULT) == gSpoilingItems[i]) {
|
||||
INV_CONTENT(gSpoilingItemReverts[i]) = gSpoilingItemReverts[i];
|
||||
if (!(gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE))) {
|
||||
for (i = 0; i < ARRAY_COUNT(gSpoilingItems); i++) {
|
||||
if (INV_CONTENT(ITEM_TRADE_ADULT) == gSpoilingItems[i]) {
|
||||
INV_CONTENT(gSpoilingItemReverts[i]) = gSpoilingItemReverts[i];
|
||||
|
||||
for (j = 1; j < ARRAY_COUNT(gSaveContext.equips.buttonItems); j++) {
|
||||
if (gSaveContext.equips.buttonItems[j] == gSpoilingItems[i]) {
|
||||
gSaveContext.equips.buttonItems[j] = gSpoilingItemReverts[i];
|
||||
for (j = 1; j < ARRAY_COUNT(gSaveContext.equips.buttonItems); j++) {
|
||||
if (gSaveContext.equips.buttonItems[j] == gSpoilingItems[i]) {
|
||||
gSaveContext.equips.buttonItems[j] = gSpoilingItemReverts[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -620,14 +712,20 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
|
||||
gSaveContext.trialsDone[i] = 0;
|
||||
}
|
||||
|
||||
// Sets all cows to unmilked when generating a rando save.
|
||||
for (u8 i = 0; i < NUM_COWS; i++) {
|
||||
gSaveContext.cowsMilked[i] = 0;
|
||||
}
|
||||
|
||||
// Set Cutscene flags to skip them
|
||||
gSaveContext.eventChkInf[0xC] |= 0x10; // returned to tot with medallions
|
||||
gSaveContext.eventChkInf[0xC] |= 0x20; //sheik at tot pedestal
|
||||
gSaveContext.eventChkInf[4] |= 0x20; // master sword pulled
|
||||
gSaveContext.eventChkInf[4] |= 0x8000; // entered master sword chamber
|
||||
gSaveContext.infTable[0] |= 1;
|
||||
// RANDTODO: Don't skip this scene if Don't Skip Glitch Useful Cutscenes is enabled.
|
||||
gSaveContext.infTable[17] |= 0x400; // Darunia in Fire Temple
|
||||
if (!Randomizer_GetSettingValue(RSK_ENABLE_GLITCH_CUTSCENES)) {
|
||||
gSaveContext.infTable[17] |= 0x400; // Darunia in Fire Temple
|
||||
}
|
||||
gSaveContext.cutsceneIndex = 0;
|
||||
Flags_SetEventChkInf(5);
|
||||
|
||||
@@ -682,11 +780,12 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
|
||||
INV_CONTENT(ITEM_OCARINA_FAIRY) = ITEM_OCARINA_FAIRY;
|
||||
}
|
||||
|
||||
if(Randomizer_GetSettingValue(RSK_STARTING_MAPS_COMPASSES)) {
|
||||
// "Start with" == 0 for Maps and Compasses
|
||||
if(Randomizer_GetSettingValue(RSK_STARTING_MAPS_COMPASSES) == 0) {
|
||||
uint32_t mapBitMask = 1 << 1;
|
||||
uint32_t compassBitMask = 1 << 2;
|
||||
uint32_t startingDungeonItemsBitMask = mapBitMask | compassBitMask;
|
||||
for(int scene = 0; scene <= 9; scene++) {
|
||||
for(int scene = SCENE_YDAN; scene <= SCENE_ICE_DOUKUTO; scene++) {
|
||||
gSaveContext.inventory.dungeonItems[scene] |= startingDungeonItemsBitMask;
|
||||
}
|
||||
}
|
||||
@@ -762,6 +861,13 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
|
||||
GiveLinkMagic(giid);
|
||||
} else if (giid == RG_DOUBLE_DEFENSE) {
|
||||
GiveLinkDoubleDefense();
|
||||
} else if (
|
||||
(giid >= RG_GERUDO_FORTRESS_SMALL_KEY && giid <= RG_GANONS_CASTLE_SMALL_KEY) ||
|
||||
(giid >= RG_FOREST_TEMPLE_BOSS_KEY && giid <= RG_GANONS_CASTLE_BOSS_KEY) ||
|
||||
(giid >= RG_DEKU_TREE_MAP && giid <= RG_ICE_CAVERN_MAP) ||
|
||||
(giid >= RG_DEKU_TREE_COMPASS && giid <= RG_ICE_CAVERN_COMPASS)
|
||||
) {
|
||||
GiveLinkDungeonItem(giid);
|
||||
} else {
|
||||
s32 iid = Randomizer_GetItemIDFromGetItemID(giid);
|
||||
if (iid != -1) INV_CONTENT(iid) = iid;
|
||||
@@ -788,9 +894,31 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
|
||||
GiveLinkRupees(9001);
|
||||
}
|
||||
|
||||
// For Ganon's boss key "Start With" is 0
|
||||
if(Randomizer_GetSettingValue(RSK_GANONS_BOSS_KEY) == 0) {
|
||||
gSaveContext.inventory.dungeonItems[10] |= 1;
|
||||
// "Start with" == 0 for Keysanity
|
||||
if(Randomizer_GetSettingValue(RSK_KEYSANITY) == 0) {
|
||||
// TODO: If master quest there are different key counts
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_BMORI1] = 5; // Forest
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_HIDAN] = 8; // Fire
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_MIZUSIN] = 6; // Water
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_JYASINZOU] = 5; // Spirit
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_HAKADAN] = 5; // Shadow
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_HAKADANCH] = 2; // BotW
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_MEN] = 9; // GTG
|
||||
gSaveContext.inventory.dungeonKeys[SCENE_GANONTIKA] = 2; // Ganon
|
||||
}
|
||||
|
||||
// "Start with" == 0 for Boss Kesanity
|
||||
if(Randomizer_GetSettingValue(RSK_BOSS_KEYSANITY) == 0) {
|
||||
gSaveContext.inventory.dungeonItems[SCENE_BMORI1] |= 1; // Forest
|
||||
gSaveContext.inventory.dungeonItems[SCENE_HIDAN] |= 1; // Fire
|
||||
gSaveContext.inventory.dungeonItems[SCENE_MIZUSIN] |= 1; // Water
|
||||
gSaveContext.inventory.dungeonItems[SCENE_JYASINZOU] |= 1; // Spirit
|
||||
gSaveContext.inventory.dungeonItems[SCENE_HAKADAN] |= 1; // Shadow
|
||||
}
|
||||
|
||||
// "Start with" == 2 for Ganon's Boss Key
|
||||
if(Randomizer_GetSettingValue(RSK_GANONS_BOSS_KEY) == 2) {
|
||||
gSaveContext.inventory.dungeonItems[SCENE_GANON] |= 1;
|
||||
}
|
||||
|
||||
HIGH_SCORE(HS_POE_POINTS) = 1000 - (100 * Randomizer_GetSettingValue(RSK_BIG_POE_COUNT));
|
||||
@@ -852,6 +980,21 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
|
||||
GiveLinkGerudoCard();
|
||||
}
|
||||
}
|
||||
|
||||
// shuffle adult trade quest
|
||||
if (Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE)) {
|
||||
gSaveContext.adultTradeItems = 0;
|
||||
}
|
||||
|
||||
// complete mask quest
|
||||
if (Randomizer_GetSettingValue(RSK_COMPLETE_MASK_QUEST)) {
|
||||
gSaveContext.itemGetInf[3] |= 0x100; // Sold Keaton Mask
|
||||
gSaveContext.itemGetInf[3] |= 0x200; // Sold Skull Mask
|
||||
gSaveContext.itemGetInf[3] |= 0x400; // Sold Spooky Mask
|
||||
gSaveContext.itemGetInf[3] |= 0x800; // bunny hood related
|
||||
gSaveContext.itemGetInf[3] |= 0x8000; // Obtained Mask of Truth
|
||||
gSaveContext.eventChkInf[8] |= 0x8000; // sold all masks
|
||||
}
|
||||
}
|
||||
|
||||
Save_SaveFile();
|
||||
|
||||
Reference in New Issue
Block a user