mirror of
https://github.com/HarbourMasters/Shipwright
synced 2026-06-01 01:48:49 -04:00
Merge pull request #1051 from garrettjoecox/keysanity
Keysanity + Shuffle Compasses & Maps
This commit is contained in:
+101
-23
@@ -1751,29 +1751,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;
|
||||
@@ -1781,6 +1758,100 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
|
||||
gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]++;
|
||||
return ITEM_NONE;
|
||||
}
|
||||
} else if (
|
||||
(item >= ITEM_GERUDO_FORTRESS_SMALL_KEY && item <= ITEM_GANONS_CASTLE_SMALL_KEY) ||
|
||||
(item >= ITEM_FOREST_TEMPLE_BOSS_KEY && item <= ITEM_GANONS_CASTLE_BOSS_KEY) ||
|
||||
(item >= ITEM_DEKU_TREE_MAP && item <= ITEM_ICE_CAVERN_MAP) ||
|
||||
(item >= ITEM_DEKU_TREE_COMPASS && item <= ITEM_ICE_CAVERN_COMPASS)
|
||||
) {
|
||||
int mapIndex = gSaveContext.mapIndex;
|
||||
switch (item) {
|
||||
case ITEM_DEKU_TREE_MAP:
|
||||
case ITEM_DEKU_TREE_COMPASS:
|
||||
mapIndex = SCENE_YDAN;
|
||||
break;
|
||||
case ITEM_DODONGOS_CAVERN_MAP:
|
||||
case ITEM_DODONGOS_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_DDAN;
|
||||
break;
|
||||
case ITEM_JABU_JABUS_BELLY_MAP:
|
||||
case ITEM_JABU_JABUS_BELLY_COMPASS:
|
||||
mapIndex = SCENE_BDAN;
|
||||
break;
|
||||
case ITEM_FOREST_TEMPLE_MAP:
|
||||
case ITEM_FOREST_TEMPLE_COMPASS:
|
||||
case ITEM_FOREST_TEMPLE_SMALL_KEY:
|
||||
case ITEM_FOREST_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_BMORI1;
|
||||
break;
|
||||
case ITEM_FIRE_TEMPLE_MAP:
|
||||
case ITEM_FIRE_TEMPLE_COMPASS:
|
||||
case ITEM_FIRE_TEMPLE_SMALL_KEY:
|
||||
case ITEM_FIRE_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HIDAN;
|
||||
break;
|
||||
case ITEM_WATER_TEMPLE_MAP:
|
||||
case ITEM_WATER_TEMPLE_COMPASS:
|
||||
case ITEM_WATER_TEMPLE_SMALL_KEY:
|
||||
case ITEM_WATER_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_MIZUSIN;
|
||||
break;
|
||||
case ITEM_SPIRIT_TEMPLE_MAP:
|
||||
case ITEM_SPIRIT_TEMPLE_COMPASS:
|
||||
case ITEM_SPIRIT_TEMPLE_SMALL_KEY:
|
||||
case ITEM_SPIRIT_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_JYASINZOU;
|
||||
break;
|
||||
case ITEM_SHADOW_TEMPLE_MAP:
|
||||
case ITEM_SHADOW_TEMPLE_COMPASS:
|
||||
case ITEM_SHADOW_TEMPLE_SMALL_KEY:
|
||||
case ITEM_SHADOW_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HAKADAN;
|
||||
break;
|
||||
case ITEM_BOTTOM_OF_THE_WELL_MAP:
|
||||
case ITEM_BOTTOM_OF_THE_WELL_COMPASS:
|
||||
case ITEM_BOTTOM_OF_THE_WELL_SMALL_KEY:
|
||||
mapIndex = SCENE_HAKADANCH;
|
||||
break;
|
||||
case ITEM_ICE_CAVERN_MAP:
|
||||
case ITEM_ICE_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_ICE_DOUKUTO;
|
||||
break;
|
||||
case ITEM_GANONS_CASTLE_BOSS_KEY:
|
||||
mapIndex = SCENE_GANON;
|
||||
break;
|
||||
case ITEM_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
|
||||
mapIndex = SCENE_MEN;
|
||||
break;
|
||||
case ITEM_GERUDO_FORTRESS_SMALL_KEY:
|
||||
mapIndex = SCENE_GERUDOWAY;
|
||||
break;
|
||||
case ITEM_GANONS_CASTLE_SMALL_KEY:
|
||||
mapIndex = SCENE_GANONTIKA;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((item >= ITEM_GERUDO_FORTRESS_SMALL_KEY) && (item <= ITEM_GANONS_CASTLE_SMALL_KEY)) {
|
||||
if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) {
|
||||
gSaveContext.inventory.dungeonKeys[mapIndex] = 1;
|
||||
return ITEM_NONE;
|
||||
} else {
|
||||
gSaveContext.inventory.dungeonKeys[mapIndex]++;
|
||||
return ITEM_NONE;
|
||||
}
|
||||
} else {
|
||||
int bitmask;
|
||||
if ((item >= ITEM_DEKU_TREE_MAP) && (item <= ITEM_ICE_CAVERN_MAP)) {
|
||||
bitmask = gBitFlags[2];
|
||||
} else if ((item >= ITEM_DEKU_TREE_COMPASS) && (item <= ITEM_ICE_CAVERN_COMPASS)) {
|
||||
bitmask = gBitFlags[1];
|
||||
} else {
|
||||
bitmask = gBitFlags[0];
|
||||
}
|
||||
|
||||
gSaveContext.inventory.dungeonItems[mapIndex] |= bitmask;
|
||||
return ITEM_NONE;
|
||||
}
|
||||
} else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) {
|
||||
if (CUR_UPG_VALUE(UPG_QUIVER) == 0) {
|
||||
Inventory_ChangeUpgrade(UPG_QUIVER, 1);
|
||||
@@ -2294,6 +2365,13 @@ u8 Item_CheckObtainability(u8 item) {
|
||||
} else {
|
||||
return ITEM_NONE;
|
||||
}
|
||||
} else if (
|
||||
(item >= ITEM_GERUDO_FORTRESS_SMALL_KEY) && (item <= ITEM_GANONS_CASTLE_SMALL_KEY) ||
|
||||
(item >= ITEM_FOREST_TEMPLE_BOSS_KEY) && (item <= ITEM_GANONS_CASTLE_BOSS_KEY) ||
|
||||
(item >= ITEM_DEKU_TREE_MAP) && (item <= ITEM_ICE_CAVERN_MAP) ||
|
||||
(item >= ITEM_DEKU_TREE_COMPASS) && (item <= ITEM_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) {
|
||||
|
||||
+124
-5
@@ -416,6 +416,95 @@ void GiveLinkDungeonReward(GetItemID getItemId) {
|
||||
}
|
||||
}
|
||||
|
||||
void GiveLinkDungeonItem(GetItemID getItemId) {
|
||||
int mapIndex;
|
||||
|
||||
switch (getItemId) {
|
||||
case GI_DEKU_TREE_MAP:
|
||||
case GI_DEKU_TREE_COMPASS:
|
||||
mapIndex = SCENE_YDAN;
|
||||
break;
|
||||
case GI_DODONGOS_CAVERN_MAP:
|
||||
case GI_DODONGOS_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_DDAN;
|
||||
break;
|
||||
case GI_JABU_JABUS_BELLY_MAP:
|
||||
case GI_JABU_JABUS_BELLY_COMPASS:
|
||||
mapIndex = SCENE_BDAN;
|
||||
break;
|
||||
case GI_FOREST_TEMPLE_MAP:
|
||||
case GI_FOREST_TEMPLE_COMPASS:
|
||||
case GI_FOREST_TEMPLE_SMALL_KEY:
|
||||
case GI_FOREST_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_BMORI1;
|
||||
break;
|
||||
case GI_FIRE_TEMPLE_MAP:
|
||||
case GI_FIRE_TEMPLE_COMPASS:
|
||||
case GI_FIRE_TEMPLE_SMALL_KEY:
|
||||
case GI_FIRE_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HIDAN;
|
||||
break;
|
||||
case GI_WATER_TEMPLE_MAP:
|
||||
case GI_WATER_TEMPLE_COMPASS:
|
||||
case GI_WATER_TEMPLE_SMALL_KEY:
|
||||
case GI_WATER_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_MIZUSIN;
|
||||
break;
|
||||
case GI_SPIRIT_TEMPLE_MAP:
|
||||
case GI_SPIRIT_TEMPLE_COMPASS:
|
||||
case GI_SPIRIT_TEMPLE_SMALL_KEY:
|
||||
case GI_SPIRIT_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_JYASINZOU;
|
||||
break;
|
||||
case GI_SHADOW_TEMPLE_MAP:
|
||||
case GI_SHADOW_TEMPLE_COMPASS:
|
||||
case GI_SHADOW_TEMPLE_SMALL_KEY:
|
||||
case GI_SHADOW_TEMPLE_BOSS_KEY:
|
||||
mapIndex = SCENE_HAKADAN;
|
||||
break;
|
||||
case GI_BOTTOM_OF_THE_WELL_MAP:
|
||||
case GI_BOTTOM_OF_THE_WELL_COMPASS:
|
||||
case GI_BOTTOM_OF_THE_WELL_SMALL_KEY:
|
||||
mapIndex = SCENE_HAKADANCH;
|
||||
break;
|
||||
case GI_ICE_CAVERN_MAP:
|
||||
case GI_ICE_CAVERN_COMPASS:
|
||||
mapIndex = SCENE_ICE_DOUKUTO;
|
||||
break;
|
||||
case GI_GANONS_CASTLE_BOSS_KEY:
|
||||
mapIndex = SCENE_GANON;
|
||||
break;
|
||||
case GI_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
|
||||
mapIndex = SCENE_MEN;
|
||||
break;
|
||||
case GI_GERUDO_FORTRESS_SMALL_KEY:
|
||||
mapIndex = SCENE_GERUDOWAY;
|
||||
break;
|
||||
case GI_GANONS_CASTLE_SMALL_KEY:
|
||||
mapIndex = SCENE_GANONTIKA;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((getItemId >= GI_GERUDO_FORTRESS_SMALL_KEY) && (getItemId <= GI_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 >= GI_DEKU_TREE_MAP) && (getItemId <= GI_ICE_CAVERN_MAP)) {
|
||||
bitmask = gBitFlags[2];
|
||||
} else if ((getItemId >= GI_DEKU_TREE_COMPASS) && (getItemId <= GI_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);
|
||||
|
||||
@@ -689,11 +778,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;
|
||||
}
|
||||
}
|
||||
@@ -790,6 +880,13 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
|
||||
GiveLinkMagic(giid);
|
||||
} else if (giid == GI_DOUBLE_DEFENSE) {
|
||||
GiveLinkDoubleDefense();
|
||||
} else if (
|
||||
(giid >= GI_GERUDO_FORTRESS_SMALL_KEY && giid <= GI_GANONS_CASTLE_SMALL_KEY) ||
|
||||
(giid >= GI_FOREST_TEMPLE_BOSS_KEY && giid <= GI_GANONS_CASTLE_BOSS_KEY) ||
|
||||
(giid >= GI_DEKU_TREE_MAP && giid <= GI_ICE_CAVERN_MAP) ||
|
||||
(giid >= GI_DEKU_TREE_COMPASS && giid <= GI_ICE_CAVERN_COMPASS)
|
||||
) {
|
||||
GiveLinkDungeonItem(giid);
|
||||
} else {
|
||||
s32 iid = Randomizer_GetItemIDFromGetItemID(giid);
|
||||
if (iid != -1) INV_CONTENT(iid) = iid;
|
||||
@@ -816,9 +913,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));
|
||||
|
||||
Reference in New Issue
Block a user