Merge 1b1970cd68
into baf7691fbd
This commit is contained in:
commit
5cf84837e7
|
@ -41,6 +41,7 @@ tools/asmsplitter/c/*
|
|||
ctx.c
|
||||
tools/*dSYM/
|
||||
graphs/
|
||||
.netcoredbg_hist
|
||||
|
||||
# Assets
|
||||
*.png
|
||||
|
|
|
@ -15,10 +15,10 @@ typedef enum {
|
|||
TEXT_CHEST_GAME_REAL_GAMBLER = 0x006E,
|
||||
TEXT_ITEM_COMPASS = 0x0067,
|
||||
TEXT_CHEST_GAME_THANKS_A_LOT = 0x0084,
|
||||
TEXT_BUY_BOMBCHU_10_PROMPT = 0x008C,
|
||||
TEXT_BUY_BOMBCHUS_10_PROMPT = 0x008C,
|
||||
TEXT_GS_NO_FREEZE = 0x00B4,
|
||||
TEXT_GS_FREEZE = 0x00B5,
|
||||
TEXT_BUY_BOMBCHU_10_DESC = 0x00BC,
|
||||
TEXT_BUY_BOMBCHUS_10_DESC = 0x00BC,
|
||||
TEXT_HEART_PIECE = 0x00C2,
|
||||
TEXT_HEART_CONTAINER = 0x00C6,
|
||||
TEXT_ITEM_KEY_BOSS = 0x00C7,
|
||||
|
@ -152,6 +152,7 @@ typedef enum {
|
|||
TEXT_HBA_INITIAL_EXPLAINATION = 0x6040,
|
||||
TEXT_HBA_WANT_TO_TRY_AGAIN_YES_NO = 0x6041,
|
||||
TEXT_HBA_ALREADY_HAVE_1000 = 0x6042,
|
||||
TEXT_CARPET_SALESMAN_CUSTOM_FAIL_TO_BUY = 0x6073,
|
||||
TEXT_CARPET_SALESMAN_1 = 0x6077,
|
||||
TEXT_CARPET_SALESMAN_2 = 0x6078,
|
||||
TEXT_MARKET_GUARD_NIGHT = 0x7003,
|
||||
|
|
|
@ -291,6 +291,7 @@ typedef enum {
|
|||
VB_GIVE_ITEM_FROM_GORON,
|
||||
// Opt: *EnJs
|
||||
VB_GIVE_ITEM_FROM_CARPET_SALESMAN,
|
||||
VB_GIVE_BOMBCHUS_FROM_CARPET_SALESMAN,
|
||||
// Opt: *EnGm
|
||||
VB_GIVE_ITEM_FROM_MEDIGORON,
|
||||
// Opt: *EnMs
|
||||
|
|
|
@ -342,7 +342,7 @@ void AutoSave(GetItemEntry itemEntry) {
|
|||
case ITEM_BOMBCHU:
|
||||
case ITEM_BOMBCHUS_5:
|
||||
case ITEM_BOMBCHUS_20:
|
||||
if (!CVarGetInteger(CVAR_ENHANCEMENT("BombchuDrops"), 0)) {
|
||||
if (!CVarGetInteger(CVAR_ENHANCEMENT("EnableBombchuDrops"), 0)) {
|
||||
performSave = true;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -99,7 +99,7 @@ const std::vector<const char*> enhancementsCvars = {
|
|||
CVAR_ENHANCEMENT("BonkDamageMult"),
|
||||
CVAR_ENHANCEMENT("NoRandomDrops"),
|
||||
CVAR_ENHANCEMENT("NoHeartDrops"),
|
||||
CVAR_ENHANCEMENT("BombchuDrops"),
|
||||
CVAR_ENHANCEMENT("EnableBombchuDrops"),
|
||||
CVAR_ENHANCEMENT("GoronPot"),
|
||||
CVAR_ENHANCEMENT("FullHealthSpawn"),
|
||||
CVAR_ENHANCEMENT("DampeWin"),
|
||||
|
@ -214,6 +214,7 @@ const std::vector<const char*> enhancementsCvars = {
|
|||
CVAR_ENHANCEMENT("BowSlingshotAmmoFix"),
|
||||
CVAR_ENHANCEMENT("BetterFarore"),
|
||||
CVAR_ENHANCEMENT("DisableFirstPersonChus"),
|
||||
CVAR_ENHANCEMENT("BetterBombchuShopping"),
|
||||
CVAR_ENHANCEMENT("HyperBosses"),
|
||||
CVAR_ENHANCEMENT("RupeeDash"),
|
||||
CVAR_ENHANCEMENT("RupeeDashInterval"),
|
||||
|
@ -706,6 +707,9 @@ const std::vector<PresetEntry> enhancedPresetEntries = {
|
|||
|
||||
// Autosave
|
||||
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_LOCATION_AND_MAJOR_ITEMS),
|
||||
|
||||
// Bombchu shop doesn't sell out, and 10 bombchus cost 99 instead of 100
|
||||
PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterBombchuShopping"), 1),
|
||||
};
|
||||
|
||||
const std::vector<PresetEntry> randomizerPresetEntries = {
|
||||
|
|
|
@ -201,8 +201,8 @@ std::vector<RandomizerCheck> GetAllEmptyLocations() {
|
|||
}
|
||||
|
||||
bool IsBombchus(RandomizerGet item, bool includeShops = false){
|
||||
return (item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_DROP) || item == RG_PROGRESSIVE_BOMBCHUS ||
|
||||
(includeShops && (item == RG_BUY_BOMBCHU_10 || item == RG_BUY_BOMBCHU_20));
|
||||
return (item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_20) || item == RG_PROGRESSIVE_BOMBCHUS ||
|
||||
(includeShops && (item == RG_BUY_BOMBCHUS_10 || item == RG_BUY_BOMBCHUS_20));
|
||||
}
|
||||
|
||||
bool IsBeatableWithout(RandomizerCheck excludedCheck, bool replaceItem, RandomizerGet ignore = RG_NONE){ //RANDOTODO make excludCheck an ItemLocation
|
||||
|
|
|
@ -1776,7 +1776,7 @@ void StaticData::HintTable_Init_Item() {
|
|||
CustomMessage("plenty of blast balls", /*german*/"", /*french*/"une abondance de boules bleues")});
|
||||
// /*spanish*/bastantes estallidos
|
||||
|
||||
hintTextTable[RHT_BOMBCHU_5] = HintText(CustomMessage("Bombchus (5 pieces)", /*german*/"", /*french*/"une demi-dizaine de Missiles"),
|
||||
hintTextTable[RHT_BOMBCHUS_5] = HintText(CustomMessage("Bombchus (5 pieces)", /*german*/"", /*french*/"une demi-dizaine de Missiles"),
|
||||
// /*spanish*/unos (5) bombchus
|
||||
{
|
||||
CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"),
|
||||
|
@ -1793,7 +1793,7 @@ void StaticData::HintTable_Init_Item() {
|
|||
CustomMessage("a few trail blazers", /*german*/"", /*french*/"une poignée de zigzags éclatants")});
|
||||
// /*spanish*/un par de ratas propulsadas
|
||||
|
||||
hintTextTable[RHT_BOMBCHU_10] = HintText(CustomMessage("Bombchus (10 pieces)", /*german*/"", /*french*/"une dizaine de Missiles"),
|
||||
hintTextTable[RHT_BOMBCHUS_10] = HintText(CustomMessage("Bombchus (10 pieces)", /*german*/"", /*french*/"une dizaine de Missiles"),
|
||||
// /*spanish*/unos (10) bombchus
|
||||
{
|
||||
CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"),
|
||||
|
@ -1810,7 +1810,7 @@ void StaticData::HintTable_Init_Item() {
|
|||
CustomMessage("some trail blazers", /*german*/"", /*french*/"un paquet de zigzags éclatants")});
|
||||
// /*spanish*/unas cuantas ratas propulsadas
|
||||
|
||||
hintTextTable[RHT_BOMBCHU_20] = HintText(CustomMessage("Bombchus (20 pieces)", /*german*/"", /*french*/"une vingtaine de Missiles"),
|
||||
hintTextTable[RHT_BOMBCHUS_20] = HintText(CustomMessage("Bombchus (20 pieces)", /*german*/"", /*french*/"une vingtaine de Missiles"),
|
||||
// /*spanish*/unos (20) bombchus
|
||||
{
|
||||
CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"),
|
||||
|
|
|
@ -723,7 +723,6 @@ void GenerateItemPool() {
|
|||
|
||||
//Fixed item locations
|
||||
ctx->PlaceItemInLocation(RC_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER);
|
||||
ctx->PlaceItemInLocation(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, RG_BOMBCHU_DROP);
|
||||
|
||||
if (ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) {
|
||||
AddItemToMainPool(RG_KOKIRI_SWORD);
|
||||
|
|
|
@ -69,11 +69,6 @@ bool LocationAccess::CanBuy() const {
|
|||
placed == RG_BUY_FAIRYS_SPIRIT) {
|
||||
OtherCondition = logic->HasBottle;
|
||||
}
|
||||
// If bombchus in logic, need to have found chus to buy; if not just need bomb bag
|
||||
else if (placed == RG_BUY_BOMBCHU_10 || placed == RG_BUY_BOMBCHU_20) {
|
||||
OtherCondition =
|
||||
(!ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->Bombs) || (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->FoundBombchus);
|
||||
}
|
||||
|
||||
return SufficientWallet && OtherCondition;
|
||||
}
|
||||
|
|
|
@ -206,11 +206,13 @@ void AreaTable_Init_CastleTown() {
|
|||
Entrance(RR_THE_MARKET, {[]{return true;}}),
|
||||
});
|
||||
|
||||
areaTable[RR_MARKET_BOMBCHU_BOWLING] = Area("Market Bombchu Bowling", "Market Bombchu Bowling", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
areaTable[RR_MARKET_BOMBCHU_BOWLING] = Area("Market Bombchu Bowling", "Market Bombchu Bowling", RA_NONE, NO_DAY_NIGHT_CYCLE, {
|
||||
//Events
|
||||
EventAccess(&logic->CanPlayBowling, {[]{return (logic->ChildsWallet && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) ? logic->BombchuBag : logic->BombBag);}}),
|
||||
}, {
|
||||
//Locations
|
||||
LocationAccess(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, {[]{return logic->CanPlayBowling;}}),
|
||||
LocationAccess(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, {[]{return logic->CanPlayBowling;}}),
|
||||
LocationAccess(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, {[]{return logic->CanPlayBowling;}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_THE_MARKET, {[]{return true;}}),
|
||||
|
|
|
@ -94,7 +94,7 @@ void AreaTable_Init_DeathMountain() {
|
|||
LocationAccess(RC_GC_MAZE_LEFT_CHEST, {[]{return logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_SILVER_GAUNTLETS) || (randoCtx->GetTrickOption(RT_GC_LEFTMOST) && logic->HasExplosives && logic->CanUse(RG_HOVER_BOOTS));}}),
|
||||
LocationAccess(RC_GC_MAZE_CENTER_CHEST, {[]{return logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS);}}),
|
||||
LocationAccess(RC_GC_MAZE_RIGHT_CHEST, {[]{return logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS);}}),
|
||||
LocationAccess(RC_GC_POT_FREESTANDING_POH, {[]{return logic->IsChild && logic->GoronCityChildFire && (logic->Bombs || (logic->GoronBracelet && randoCtx->GetTrickOption(RT_GC_POT_STRENGTH)) || (logic->HasBombchus && randoCtx->GetTrickOption(RT_GC_POT)));}}),
|
||||
LocationAccess(RC_GC_POT_FREESTANDING_POH, {[]{return logic->IsChild && logic->GoronCityChildFire && (logic->Bombs || (logic->GoronBracelet && randoCtx->GetTrickOption(RT_GC_POT_STRENGTH)) || (logic->Bombchus && randoCtx->GetTrickOption(RT_GC_POT)));}}),
|
||||
LocationAccess(RC_GC_ROLLING_GORON_AS_CHILD, {[]{return logic->IsChild && (logic->HasExplosives || (logic->GoronBracelet && randoCtx->GetTrickOption(RT_GC_ROLLING_STRENGTH)));}}),
|
||||
LocationAccess(RC_GC_ROLLING_GORON_AS_ADULT, {[]{return logic->StopGCRollingGoronAsAdult;}}),
|
||||
LocationAccess(RC_GC_GS_BOULDER_MAZE, {[]{return logic->IsChild && logic->CanBlastOrSmash;}}),
|
||||
|
|
|
@ -180,7 +180,7 @@ void AreaTable_Init_DekuTree() {
|
|||
//Locations
|
||||
LocationAccess(RC_DEKU_TREE_MQ_COMPASS_CHEST, {[]{return true;}}),
|
||||
LocationAccess(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, {[]{return logic->HookshotOrBoomerang &&
|
||||
Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->HasBombchus ||
|
||||
Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->Bombchus ||
|
||||
(logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) ||
|
||||
(logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));});}}),
|
||||
}, {
|
||||
|
|
|
@ -22,7 +22,7 @@ void AreaTable_Init_ForestTemple() {
|
|||
areaTable[RR_FOREST_TEMPLE_FIRST_ROOM] = Area("Forest Temple First Room", "Forest Temple", RA_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LocationAccess(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, {[]{return true;}}),
|
||||
LocationAccess(RC_FOREST_TEMPLE_GS_FIRST_ROOM, {[]{return (logic->IsAdult && logic->Bombs) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->HasBombchus || logic->CanUse(RG_DINS_FIRE) || (randoCtx->GetTrickOption(RT_FOREST_FIRST_GS) && (logic->CanJumpslash || (logic->IsChild && logic->Bombs)));}}),
|
||||
LocationAccess(RC_FOREST_TEMPLE_GS_FIRST_ROOM, {[]{return (logic->IsAdult && logic->Bombs) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->Bombchus || logic->CanUse(RG_DINS_FIRE) || (randoCtx->GetTrickOption(RT_FOREST_FIRST_GS) && (logic->CanJumpslash || (logic->IsChild && logic->Bombs)));}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_ENTRYWAY, {[]{return true;}}),
|
||||
|
@ -299,8 +299,8 @@ void AreaTable_Init_ForestTemple() {
|
|||
//Exits
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, {[]{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT);}}),
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT);}}), //This is as far as child can get
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE, {[]{return logic->IsAdult && (logic->GoronBracelet || (randoCtx->GetTrickOption(RT_FOREST_MQ_BLOCK_PUZZLE) && logic->HasBombchus && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)));}}),
|
||||
//Trick: logic->IsAdult && (logic->GoronBracelet || (LogicForestMQBlockPuzzle && logic->HasBombchus && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)))
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_AFTER_BLOCK_PUZZLE, {[]{return logic->IsAdult && (logic->GoronBracelet || (randoCtx->GetTrickOption(RT_FOREST_MQ_BLOCK_PUZZLE) && logic->Bombchus && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)));}}),
|
||||
//Trick: logic->IsAdult && (logic->GoronBracelet || (LogicForestMQBlockPuzzle && logic->Bombchus && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)))
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, {[]{return (randoCtx->GetTrickOption(RT_FOREST_MQ_JS_HALLWAY_SWITCH) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (randoCtx->GetTrickOption(RT_FOREST_MQ_RANG_HALLWAY_SWITCH) && logic->CanUse(RG_BOOMERANG)) || (randoCtx->GetTrickOption(RT_FOREST_MQ_HOOKSHOT_HALLWAY_SWITCH) && logic->IsAdult && logic->CanUse(RG_HOOKSHOT));}}),
|
||||
//Trick (logic->Hookshot trick not added to either n64 or oot3d rando as of yet, to enable in SoH needs uncommenting in randomizer_tricks.cpp): (LogicForestMQHallwaySwitchJS && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (LogicForestMQHallwaySwitchHookshot && logic->IsAdult && logic->CanUse(RG_HOOKSHOT))
|
||||
Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, {[]{return logic->ForestTempleJoAndBeth && logic->ForestTempleAmyAndMeg;}}),
|
||||
|
|
|
@ -87,12 +87,12 @@ void AreaTable_Init_GanonsCastle() {
|
|||
|
||||
areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Area("Ganon's Castle Spirit Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {
|
||||
//Events
|
||||
EventAccess(&logic->NutPot, {[]{return logic->NutPot || (((randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslash) || logic->CanUse(RG_HOOKSHOT)) && logic->HasBombchus && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))));}}),
|
||||
EventAccess(&logic->SpiritTrialClear, {[]{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_MIRROR_SHIELD) || randoCtx->GetOption(RSK_SUNLIGHT_ARROWS)) && logic->HasBombchus && ((randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslash) || logic->CanUse(RG_HOOKSHOT));}}),
|
||||
EventAccess(&logic->NutPot, {[]{return logic->NutPot || (((randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslash) || logic->CanUse(RG_HOOKSHOT)) && logic->Bombchus && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))));}}),
|
||||
EventAccess(&logic->SpiritTrialClear, {[]{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_MIRROR_SHIELD) || randoCtx->GetOption(RSK_SUNLIGHT_ARROWS)) && logic->Bombchus && ((randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslash) || logic->CanUse(RG_HOOKSHOT));}}),
|
||||
}, {
|
||||
//Locations
|
||||
LocationAccess(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, {[]{return (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanJumpslash;}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->HasBombchus && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->Bombchus && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH));}}),
|
||||
}, {});
|
||||
|
||||
areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Area("Ganon's Castle Light Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {
|
||||
|
@ -193,16 +193,16 @@ void AreaTable_Init_GanonsCastle() {
|
|||
|
||||
areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL] = Area("Ganon's Castle MQ Spirit Castle", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {
|
||||
//Events
|
||||
EventAccess(&logic->SpiritTrialClear, {[]{return logic->IsAdult && logic->CanUse(RG_LIGHT_ARROWS) && logic->Hammer && logic->HasBombchus && ((logic->FireArrows && logic->MirrorShield) || randoCtx->GetOption(RSK_SUNLIGHT_ARROWS));}}),
|
||||
EventAccess(&logic->NutPot, {[]{return logic->NutPot || (logic->Hammer && logic->HasBombchus && logic->IsAdult && ((logic->CanUse(RG_FIRE_ARROWS) && logic->MirrorShield) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))));}}),
|
||||
EventAccess(&logic->SpiritTrialClear, {[]{return logic->IsAdult && logic->CanUse(RG_LIGHT_ARROWS) && logic->Hammer && logic->Bombchus && ((logic->FireArrows && logic->MirrorShield) || randoCtx->GetOption(RSK_SUNLIGHT_ARROWS));}}),
|
||||
EventAccess(&logic->NutPot, {[]{return logic->NutPot || (logic->Hammer && logic->Bombchus && logic->IsAdult && ((logic->CanUse(RG_FIRE_ARROWS) && logic->MirrorShield) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))));}}),
|
||||
}, {
|
||||
//Locations
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, {[]{return logic->IsAdult && (logic->Bow || randoCtx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->Hammer;}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return logic->IsAdult && (logic->Bow || randoCtx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->Hammer && logic->HasBombchus && (randoCtx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->HasBombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->HasBombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->HasBombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->HasBombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, {[]{return logic->IsAdult && (logic->Bow || randoCtx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->Hammer && logic->Bombchus && (randoCtx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->Bombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->Bombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->Bombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
LocationAccess(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, {[]{return logic->IsAdult && logic->Hammer && logic->Bombchus && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}}),
|
||||
}, {});
|
||||
|
||||
areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL] = Area("Ganon's Castle MQ Light Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, {
|
||||
|
|
|
@ -143,12 +143,14 @@ void AreaTable_Init_GerudoValley() {
|
|||
|
||||
areaTable[RR_HAUNTED_WASTELAND] = Area("Haunted Wasteland", "Haunted Wasteland", RA_HAUNTED_WASTELAND, NO_DAY_NIGHT_CYCLE, {
|
||||
//Events
|
||||
EventAccess(&logic->FairyPot, {[]{return true;}}),
|
||||
EventAccess(&logic->NutPot, {[]{return true;}}),
|
||||
EventAccess(&logic->FairyPot, {[]{return true;}}),
|
||||
EventAccess(&logic->NutPot, {[]{return true;}}),
|
||||
EventAccess(&logic->BombchuSalesman, {[]{return logic->AdultsWallet && (logic->CanJumpslash || logic->CanUse(RG_HOVER_BOOTS)) &&
|
||||
randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) ? logic->BombchuBag :logic->BombBag;}}),
|
||||
}, {
|
||||
//Locations
|
||||
LocationAccess(RC_WASTELAND_CHEST, {[]{return logic->HasFireSource;}}),
|
||||
LocationAccess(RC_WASTELAND_BOMBCHU_SALESMAN, {[]{return logic->AdultsWallet && (logic->CanJumpslash || logic->CanUse(RG_HOVER_BOOTS)) ;}}),
|
||||
LocationAccess(RC_WASTELAND_BOMBCHU_SALESMAN, {[]{return logic->AdultsWallet && (logic->CanJumpslash || logic->CanUse(RG_HOVER_BOOTS));}}),
|
||||
LocationAccess(RC_WASTELAND_GS, {[]{return logic->HookshotOrBoomerang;}}),
|
||||
}, {
|
||||
//Exits
|
||||
|
|
|
@ -152,7 +152,7 @@ void AreaTable_Init_JabuJabusBelly() {
|
|||
}, {
|
||||
//Exits
|
||||
Entrance(RR_JABU_JABUS_BELLY_LIFT_MIDDLE, {[]{return true;}}),
|
||||
Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, {[]{return logic->CanUse(RG_BOOMERANG) || (randoCtx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && ((logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW))) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)))) || (randoCtx->GetTrickOption(RT_JABU_NEAR_BOSS_EXPLOSIVES) && (logic->HasBombchus || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->Bombs)));}}),
|
||||
Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, {[]{return logic->CanUse(RG_BOOMERANG) || (randoCtx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && ((logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW))) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)))) || (randoCtx->GetTrickOption(RT_JABU_NEAR_BOSS_EXPLOSIVES) && (logic->Bombchus || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->Bombs)));}}),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -177,7 +177,8 @@ void AreaTable_Init_JabuJabusBelly() {
|
|||
//Locations
|
||||
LocationAccess(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, {[]{return true;}}),
|
||||
LocationAccess(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, {[]{return (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT))) || ChildCanAccess(RR_JABU_JABUS_BELLY_MQ_BOSS_AREA);}}),
|
||||
LocationAccess(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {[]{return (logic->IsChild || logic->CanDive || logic->CanUse(RG_IRON_BOOTS) || randoCtx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE)) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->HasBombchus || (randoCtx->GetTrickOption(RT_JABU_MQ_RANG_JUMP) && logic->CanUse(RG_BOOMERANG)));}}),
|
||||
LocationAccess(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, {[]{return (logic->IsChild || logic->CanDive || logic->CanUse(RG_IRON_BOOTS) ||
|
||||
randoCtx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE)) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->Bombchus || (randoCtx->GetTrickOption(RT_JABU_MQ_RANG_JUMP) && logic->CanUse(RG_BOOMERANG)));}}),
|
||||
LocationAccess(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, {[]{return logic->CanUse(RG_FAIRY_SLINGSHOT);}}),
|
||||
LocationAccess(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, {[]{return logic->CanUse(RG_FAIRY_SLINGSHOT);}}),
|
||||
LocationAccess(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, {[]{return true;}}),
|
||||
|
|
|
@ -19,7 +19,7 @@ void AreaTable_Init_Kakariko() {
|
|||
LocationAccess(RC_KAK_GS_SKULLTULA_HOUSE, {[]{return logic->IsChild && logic->AtNight && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_KAK_GS_GUARDS_HOUSE, {[]{return logic->IsChild && logic->AtNight && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_KAK_GS_TREE, {[]{return logic->IsChild && logic->AtNight && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_KAK_GS_WATCHTOWER, {[]{return logic->IsChild && (logic->Slingshot || logic->HasBombchus || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslash)) && logic->AtNight && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_KAK_GS_WATCHTOWER, {[]{return logic->IsChild && (logic->Slingshot || logic->Bombchus || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslash)) && logic->AtNight && logic->CanGetNightTimeGS;}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_HYRULE_FIELD, {[]{return true;}}),
|
||||
|
@ -33,7 +33,7 @@ void AreaTable_Init_Kakariko() {
|
|||
Entrance(RR_KAK_POTION_SHOP_FRONT, {[]{return logic->AtDay || logic->IsChild;}}),
|
||||
Entrance(RR_KAK_REDEAD_GROTTO, {[]{return logic->CanOpenBombGrotto;}}),
|
||||
Entrance(RR_KAK_IMPAS_LEDGE, {[]{return (logic->IsChild && logic->AtDay) || logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && randoCtx->GetTrickOption(RT_VISIBLE_COLLISION));}}),
|
||||
Entrance(RR_KAK_ROOFTOP, {[]{return logic->CanUse(RG_HOOKSHOT) || (randoCtx->GetTrickOption(RT_KAK_MAN_ON_ROOF) && (logic->IsAdult || logic->AtDay || logic->Slingshot || logic->HasBombchus || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT)));}}),
|
||||
Entrance(RR_KAK_ROOFTOP, {[]{return logic->CanUse(RG_HOOKSHOT) || (randoCtx->GetTrickOption(RT_KAK_MAN_ON_ROOF) && (logic->IsAdult || logic->AtDay || logic->Slingshot || logic->Bombchus || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT)));}}),
|
||||
Entrance(RR_KAK_IMPAS_ROOFTOP, {[]{return logic->CanUse(RG_HOOKSHOT) || (randoCtx->GetTrickOption(RT_KAK_ROOFTOP_GS) && logic->CanUse(RG_HOVER_BOOTS));}}),
|
||||
Entrance(RR_THE_GRAVEYARD, {[]{return true;}}),
|
||||
Entrance(RR_KAK_BEHIND_GATE, {[]{return logic->IsAdult || (logic->KakarikoVillageGateOpen);}}),
|
||||
|
|
|
@ -153,7 +153,7 @@ void AreaTable_Init_LostWoods() {
|
|||
//Locations
|
||||
LocationAccess(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, {[]{return logic->IsChild && logic->CanStunDeku;}}),
|
||||
LocationAccess(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, {[]{return logic->IsChild && logic->CanStunDeku;}}),
|
||||
LocationAccess(RC_LW_GS_ABOVE_THEATER, {[]{return logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_LW_BEYOND_MIDO) && logic->CanAdultAttack) || (randoCtx->GetTrickOption(RT_LW_GS_BEAN) && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->HasBombchus || logic->CanUse(RG_DINS_FIRE)))) && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_LW_GS_ABOVE_THEATER, {[]{return logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_LW_BEYOND_MIDO) && logic->CanAdultAttack) || (randoCtx->GetTrickOption(RT_LW_GS_BEAN) && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->Bombchus || logic->CanUse(RG_DINS_FIRE)))) && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, {[]{return logic->CanPlantBugs && (logic->CanChildAttack || (randoCtx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_OFF) && logic->DekuShield));}}),
|
||||
}, {
|
||||
//Exits
|
||||
|
|
|
@ -54,7 +54,7 @@ void AreaTable_Init_ShadowTemple() {
|
|||
LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, {[]{return (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->HoverBoots) || logic->GoronBracelet;}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, {[]{return (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->HoverBoots) || logic->GoronBracelet;}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, {[]{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH));}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_FREESTANDING_KEY, {[]{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot && (logic->Bombs || logic->GoronBracelet || (randoCtx->GetTrickOption(RT_SHADOW_FREESTANDING_KEY) && logic->HasBombchus));}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_FREESTANDING_KEY, {[]{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot && (logic->Bombs || logic->GoronBracelet || (randoCtx->GetTrickOption(RT_SHADOW_FREESTANDING_KEY) && logic->Bombchus));}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, {[]{return logic->CanJumpslash;}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, {[]{return logic->Hookshot || (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->HoverBoots);}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, {[]{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot;}}),
|
||||
|
@ -82,7 +82,7 @@ void AreaTable_Init_ShadowTemple() {
|
|||
LocationAccess(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, {[]{return logic->CanAdultAttack;}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}})
|
||||
Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->Bombchus)) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}})
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -159,11 +159,11 @@ void AreaTable_Init_ShadowTemple() {
|
|||
areaTable[RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT] = Area("Shadow Temple MQ Beyond Boat", "Shadow Temple", RA_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, {[]{return true;}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {[]{return logic->Bow || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus);}}),
|
||||
LocationAccess(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, {[]{return logic->Bow || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->Bombchus);}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, {[]{return logic->Bow && logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult && logic->CanUse(RG_LONGSHOT);}}),
|
||||
Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}}),
|
||||
Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, {[]{return (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->Bombchus)) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}}),
|
||||
});
|
||||
|
||||
areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Area("Shadow Temple MQ Invisible Maze", "Shadow Temple", RA_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
|
|
|
@ -31,22 +31,23 @@ void AreaTable_Init_SpiritTemple() {
|
|||
EventAccess(&logic->NutCrate, {[]{return true;}}),
|
||||
}, {
|
||||
//Locations
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot))) && (logic->Sticks || logic->CanUse(RG_DINS_FIRE));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {[]{return (logic->Boomerang || logic->Slingshot || (logic->HasBombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->Bombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, {[]{return (logic->Boomerang || logic->Slingshot || (logic->Bombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot))) && (logic->Sticks || logic->CanUse(RG_DINS_FIRE));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, {[]{return (logic->Boomerang || logic->Slingshot || (logic->Bombchus && randoCtx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives || ((logic->Nuts || logic->Boomerang) && (logic->Sticks || logic->KokiriSword || logic->Slingshot)));}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_CHILD_CLIMB] = Area("Child Spirit Temple Climb", "Spirit Temple", RA_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//RANDOTODO: Why is RSK_SHUFFLE_DUNGEON_ENTRANCES here?
|
||||
//Locations
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {[]{return logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {[]{return logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, {[]{return logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, {[]{return logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, {[]{return logic->HasProjectile(HasProjectileAge::Both) || logic->CanUse(RG_DINS_FIRE) ||
|
||||
(logic->CanTakeDamage && (logic->CanJumpslash || logic->HasProjectile(HasProjectileAge::Child))) ||
|
||||
(logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasProjectile(HasProjectileAge::Child)) ||
|
||||
((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->HasProjectile(HasProjectileAge::Adult) || (logic->CanTakeDamage && logic->CanJumpslash)));}}),
|
||||
((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->HasProjectile(HasProjectileAge::Adult) || (logic->CanTakeDamage && logic->CanJumpslash)));}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return logic->HasExplosives || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}}),
|
||||
|
@ -55,10 +56,10 @@ void AreaTable_Init_SpiritTemple() {
|
|||
areaTable[RR_SPIRIT_TEMPLE_EARLY_ADULT] = Area("Early Adult Spirit Temple", "Spirit Temple", RA_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_COMPASS_CHEST, {[]{return logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_ZELDAS_LULLABY);}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasBombchus || (logic->Bombs && logic->IsAdult && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash);}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, {[]{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->Bombchus || (logic->Bombs && logic->IsAdult && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash);}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 3);}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 3);}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {[]{return logic->CanUse(RG_SONG_OF_TIME) && (logic->Bow || logic->Hookshot || logic->HasBombchus || (logic->Bombs && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH)));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, {[]{return logic->CanUse(RG_SONG_OF_TIME) && (logic->Bow || logic->Hookshot || logic->Bombchus || (logic->Bombs && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH)));}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}}),
|
||||
|
@ -66,18 +67,18 @@ void AreaTable_Init_SpiritTemple() {
|
|||
|
||||
areaTable[RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Area("Spirit Temple Central Chamber", "Spirit Temple", RA_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MAP_CHEST, {[]{return ((logic->HasExplosives || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) &&
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MAP_CHEST, {[]{return ((logic->HasExplosives || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) &&
|
||||
|
||||
(logic->CanUse(RG_DINS_FIRE) ||
|
||||
(((logic->MagicMeter && logic->FireArrows) || randoCtx->GetTrickOption(RT_SPIRIT_MAP_CHEST)) && logic->Bow && logic->Sticks))) ||
|
||||
(((logic->Magic && logic->FireArrows) || randoCtx->GetTrickOption(RT_SPIRIT_MAP_CHEST)) && logic->Bow && logic->Sticks))) ||
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives &&
|
||||
logic->CanUse(RG_STICKS)) ||
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) &&
|
||||
(logic->CanUse(RG_FIRE_ARROWS) || (randoCtx->GetTrickOption(RT_SPIRIT_MAP_CHEST) && logic->Bow)) &&
|
||||
logic->CanUse(RG_SILVER_GAUNTLETS));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {[]{return ((logic->HasExplosives || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) &&
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, {[]{return ((logic->HasExplosives || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) &&
|
||||
(logic->CanUse(RG_DINS_FIRE) ||
|
||||
(((logic->MagicMeter && logic->FireArrows) || randoCtx->GetTrickOption(RT_SPIRIT_SUN_CHEST)) && logic->Bow && logic->Sticks))) ||
|
||||
(((logic->Magic && logic->FireArrows) || randoCtx->GetTrickOption(RT_SPIRIT_SUN_CHEST)) && logic->Bow && logic->Sticks))) ||
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives &&
|
||||
logic->CanUse(RG_STICKS)) ||
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) &&
|
||||
|
@ -89,8 +90,8 @@ void AreaTable_Init_SpiritTemple() {
|
|||
(logic->CanUse(RG_BOOMERANG) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives) ||
|
||||
(logic->Hookshot && logic->CanUse(RG_SILVER_GAUNTLETS) &&
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) ||
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && logic->Boomerang && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_GS_LOBBY, {[]{return ((logic->HasExplosives || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) &&
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && logic->Boomerang && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_GS_LOBBY, {[]{return ((logic->HasExplosives || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && randoCtx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && logic->BombchuRefill && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) &&
|
||||
randoCtx->GetTrickOption(RT_SPIRIT_LOBBY_GS) && logic->Boomerang && (logic->Hookshot || logic->HoverBoots || randoCtx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP))) ||
|
||||
(randoCtx->GetTrickOption(RT_SPIRIT_LOBBY_GS) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasExplosives && logic->CanUse(RG_BOOMERANG)) ||
|
||||
(logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->Hookshot || logic->HoverBoots || randoCtx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP)));}}),
|
||||
|
@ -117,7 +118,7 @@ void AreaTable_Init_SpiritTemple() {
|
|||
LocationAccess(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, {[]{return (randoCtx->GetTrickOption(RT_LENS_SPIRIT) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->HasExplosives;}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && (randoCtx->GetTrickOption(RT_SPIRIT_WALL) || logic->CanUse(RG_LONGSHOT) || logic->HasBombchus || ((logic->Bombs || logic->Nuts || logic->CanUse(RG_DINS_FIRE)) && (logic->Bow || logic->CanUse(RG_HOOKSHOT) || logic->Hammer)));}}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && (randoCtx->GetTrickOption(RT_SPIRIT_WALL) || logic->CanUse(RG_LONGSHOT) || logic->Bombchus || ((logic->Bombs || logic->Nuts || logic->CanUse(RG_DINS_FIRE)) && (logic->Bow || logic->CanUse(RG_HOOKSHOT) || logic->Hammer)));}}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Area("Spirit Temple Beyond Final Locked Door", "Spirit Temple", RA_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
|
@ -146,27 +147,27 @@ void AreaTable_Init_SpiritTemple() {
|
|||
//Locations
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, {[]{return true;}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, {[]{return Here(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return logic->CanBlastOrSmash;}) && ((logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {[]{return logic->HasBombchus || (logic->IsAdult && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))) || (logic->IsChild && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG)));}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, {[]{return logic->Bombchus || (logic->IsAdult && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))) || (logic->IsChild && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG)));}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_ENTRYWAY, {[]{return true;}}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_CHILD, {[]{return logic->IsChild;}}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_ADULT, {[]{return logic->HasBombchus && logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->CanUse(RG_SILVER_GAUNTLETS);}}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_ADULT, {[]{return logic->Bombchus && logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->CanUse(RG_SILVER_GAUNTLETS);}}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_MQ_CHILD] = Area("Spirit Temple MQ Child", "Spirit Temple", RA_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {
|
||||
//Events
|
||||
EventAccess(&logic->FairyPot, {[]{return logic->FairyPot || (logic->KokiriSword && logic->HasBombchus && logic->Slingshot);}}),
|
||||
EventAccess(&logic->FairyPot, {[]{return logic->FairyPot || (logic->KokiriSword && logic->Bombchus && logic->Slingshot);}}),
|
||||
}, {
|
||||
//Locations
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, {[]{return Here(RR_SPIRIT_TEMPLE_MQ_ADULT, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Hammer;});}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {[]{return logic->KokiriSword && logic->HasBombchus && logic->Slingshot && logic->CanUse(RG_DINS_FIRE);}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, {[]{return logic->KokiriSword && logic->Bombchus && logic->Slingshot && logic->CanUse(RG_DINS_FIRE);}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, {[]{return logic->KokiriSword || logic->Bombs;}}),
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {[]{return logic->HasBombchus && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (Here(RR_SPIRIT_TEMPLE_MQ_ADULT, []{return logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (randoCtx->GetTrickOption(RT_SPIRIT_MQ_FROZEN_EYE) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME)));})));}}),
|
||||
//Trick: logic->HasBombchus && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (SPIRIT_TEMPLE_MQ_ADULT.Adult() && logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQFrozenEye && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME)))))
|
||||
LocationAccess(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, {[]{return logic->Bombchus && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (Here(RR_SPIRIT_TEMPLE_MQ_ADULT, []{return logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (randoCtx->GetTrickOption(RT_SPIRIT_MQ_FROZEN_EYE) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME)));})));}}),
|
||||
//Trick: logic->Bombchus && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (SPIRIT_TEMPLE_MQ_ADULT.Adult() && logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQFrozenEye && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME)))))
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_SHARED, {[]{return logic->HasBombchus && logic->SmallKeys(RR_SPIRIT_TEMPLE, 2);}}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_SHARED, {[]{return logic->Bombchus && logic->SmallKeys(RR_SPIRIT_TEMPLE, 2);}}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_MQ_ADULT] = Area("Spirit Temple MQ Adult", "Spirit Temple", RA_SPIRIT_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
|
|
|
@ -50,10 +50,10 @@ void AreaTable_Init_WaterTemple() {
|
|||
|
||||
areaTable[RR_WATER_TEMPLE_MAP_ROOM] = Area("Water Temple Map Room", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LocationAccess(RC_WATER_TEMPLE_MAP_CHEST, {[]{return (logic->MagicMeter && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
LocationAccess(RC_WATER_TEMPLE_MAP_CHEST, {[]{return (logic->Magic && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return (logic->MagicMeter && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return (logic->Magic && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
});
|
||||
|
||||
areaTable[RR_WATER_TEMPLE_CRACKED_WALL] = Area("Water Temple Cracked Wall", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
|
@ -66,10 +66,10 @@ void AreaTable_Init_WaterTemple() {
|
|||
|
||||
areaTable[RR_WATER_TEMPLE_TORCH_ROOM] = Area("Water Temple Torch Room", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LocationAccess(RC_WATER_TEMPLE_TORCHES_CHEST, {[]{return (logic->MagicMeter && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
LocationAccess(RC_WATER_TEMPLE_TORCHES_CHEST, {[]{return (logic->Magic && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
}, {
|
||||
//Exits
|
||||
Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return (logic->MagicMeter && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
Entrance(RR_WATER_TEMPLE_EAST_LOWER, {[]{return (logic->Magic && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}}),
|
||||
});
|
||||
|
||||
areaTable[RR_WATER_TEMPLE_NORTH_LOWER] = Area("Water Temple North Lower", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, {
|
||||
|
@ -134,7 +134,7 @@ void AreaTable_Init_WaterTemple() {
|
|||
|
||||
areaTable[RR_WATER_TEMPLE_DRAGON_ROOM] = Area("Water Temple Dragon Room", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {
|
||||
//Locations
|
||||
LocationAccess(RC_WATER_TEMPLE_DRAGON_CHEST, {[]{return (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS)) || (((logic->IsAdult && randoCtx->GetTrickOption(RT_WATER_ADULT_DRAGON) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->HasBombchus)) || (logic->IsChild && randoCtx->GetTrickOption(RT_WATER_CHILD_DRAGON) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasBombchus))) && (logic->CanDive || logic->CanUse(RG_IRON_BOOTS))) ||
|
||||
LocationAccess(RC_WATER_TEMPLE_DRAGON_CHEST, {[]{return (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS)) || (((logic->IsAdult && randoCtx->GetTrickOption(RT_WATER_ADULT_DRAGON) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->Bombchus)) || (logic->IsChild && randoCtx->GetTrickOption(RT_WATER_CHILD_DRAGON) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->Bombchus))) && (logic->CanDive || logic->CanUse(RG_IRON_BOOTS))) ||
|
||||
Here(RR_WATER_TEMPLE_RIVER, []{return logic->IsAdult && logic->CanUse(RG_FAIRY_BOW) && ((randoCtx->GetTrickOption(RT_WATER_ADULT_DRAGON) && (logic->CanDive || logic->CanUse(RG_IRON_BOOTS))) || randoCtx->GetTrickOption(RT_WATER_DRAGON_JUMP_DIVE));});}}),
|
||||
}, {
|
||||
//Exits
|
||||
|
|
|
@ -97,7 +97,7 @@ void AreaTable_Init_ZorasDomain() {
|
|||
LocationAccess(RC_ZD_CHEST, {[]{return logic->IsChild && logic->CanUse(RG_STICKS);}}),
|
||||
LocationAccess(RC_ZD_KING_ZORA_THAWED, {[]{return logic->KingZoraThawed;}}),
|
||||
LocationAccess(RC_ZD_TRADE_PRESCRIPTION, {[]{return logic->KingZoraThawed && logic->Prescription;}}),
|
||||
LocationAccess(RC_ZD_GS_FROZEN_WATERFALL, {[]{return logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->Bow || (logic->MagicMeter && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))) || (randoCtx->GetTrickOption(RT_ZD_GS) && logic->CanJumpslash)) && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_ZD_GS_FROZEN_WATERFALL, {[]{return logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->Bow || (logic->Magic && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))) || (randoCtx->GetTrickOption(RT_ZD_GS) && logic->CanJumpslash)) && logic->CanGetNightTimeGS;}}),
|
||||
LocationAccess(RC_ZD_FISH_1, {[]{return logic->IsChild && logic->HasBottle;}}),
|
||||
LocationAccess(RC_ZD_FISH_2, {[]{return logic->IsChild && logic->HasBottle;}}),
|
||||
LocationAccess(RC_ZD_FISH_3, {[]{return logic->IsChild && logic->HasBottle;}}),
|
||||
|
|
|
@ -45,10 +45,10 @@ std::vector<RandomizerGet> GetMinVanillaShopItems(int total_replaced) {
|
|||
RG_BUY_ARROWS_10,
|
||||
RG_BUY_ARROWS_30,
|
||||
RG_BUY_ARROWS_50,
|
||||
RG_BUY_BOMBCHU_10,
|
||||
RG_BUY_BOMBCHU_10,
|
||||
RG_BUY_BOMBCHU_10,
|
||||
RG_BUY_BOMBCHU_20,
|
||||
RG_BUY_BOMBCHUS_10,
|
||||
RG_BUY_BOMBCHUS_10,
|
||||
RG_BUY_BOMBCHUS_10,
|
||||
RG_BUY_BOMBCHUS_20,
|
||||
RG_BUY_BOMBS_525,
|
||||
RG_BUY_BOMBS_535,
|
||||
RG_BUY_BOMBS_10,
|
||||
|
@ -67,15 +67,15 @@ std::vector<RandomizerGet> GetMinVanillaShopItems(int total_replaced) {
|
|||
//^First 32 items: Always guaranteed
|
||||
RG_BUY_BLUE_FIRE,
|
||||
RG_BUY_FISH,
|
||||
RG_BUY_BOMBCHU_10,
|
||||
RG_BUY_BOMBCHUS_10,
|
||||
RG_BUY_DEKU_NUTS_5,
|
||||
RG_BUY_ARROWS_10,
|
||||
RG_BUY_BOMBCHU_20,
|
||||
RG_BUY_BOMBCHUS_20,
|
||||
RG_BUY_BOMBS_535,
|
||||
RG_BUY_RED_POTION_30,
|
||||
//^First 40 items: Exist on shopsanity 3 or less
|
||||
RG_BUY_BOMBS_30,
|
||||
RG_BUY_BOMBCHU_20,
|
||||
RG_BUY_BOMBCHUS_20,
|
||||
RG_BUY_DEKU_NUTS_5,
|
||||
RG_BUY_ARROWS_10,
|
||||
RG_BUY_DEKU_NUTS_5,
|
||||
|
@ -83,7 +83,7 @@ std::vector<RandomizerGet> GetMinVanillaShopItems(int total_replaced) {
|
|||
RG_BUY_RED_POTION_40,
|
||||
RG_BUY_FISH,
|
||||
//^First 48 items: Exist on shopsanity 2 or less
|
||||
RG_BUY_BOMBCHU_20,
|
||||
RG_BUY_BOMBCHUS_20,
|
||||
RG_BUY_ARROWS_30,
|
||||
RG_BUY_RED_POTION_50,
|
||||
RG_BUY_ARROWS_30,
|
||||
|
|
|
@ -186,10 +186,7 @@ void WriteIngameSpoilerLog() {
|
|||
if (key == RC_GANON) {
|
||||
spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_NEVER;
|
||||
spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS;
|
||||
} else if (key == RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS) {
|
||||
spoilerData.ItemLocations[spoilerItemIndex].CollectType = COLLECTTYPE_REPEATABLE;
|
||||
spoilerData.ItemLocations[spoilerItemIndex].RevealType = REVEALTYPE_ALWAYS;
|
||||
}
|
||||
}
|
||||
// Shops
|
||||
else if (loc->IsShop()) {
|
||||
if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) {
|
||||
|
|
|
@ -251,7 +251,6 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
|
|||
rc != RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST &&
|
||||
rc != RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE &&
|
||||
rc != RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE &&
|
||||
rc != RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS &&
|
||||
// Always show ItemGet animation for ice traps
|
||||
!(getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.getItemId == RG_ICE_TRAP) &&
|
||||
(
|
||||
|
@ -825,6 +824,10 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void
|
|||
Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN);
|
||||
break;
|
||||
}
|
||||
case VB_GIVE_BOMBCHUS_FROM_CARPET_SALESMAN: {
|
||||
*should = RAND_GET_OPTION(RSK_BOMBCHUS_IN_LOGIC) == false || INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU;
|
||||
break;
|
||||
}
|
||||
case VB_GIVE_ITEM_FROM_MEDIGORON: {
|
||||
// fallthrough
|
||||
case VB_BE_ELIGIBLE_FOR_GIANTS_KNIFE_PURCHASE:
|
||||
|
@ -1407,7 +1410,7 @@ void RandomizerOnActorInitHandler(void* actorRef) {
|
|||
break;
|
||||
case EXITEM_BOMBCHUS_COUNTER:
|
||||
case EXITEM_BOMBCHUS_BOWLING:
|
||||
rc = RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS;
|
||||
//RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS was removed as a 3DS holdover not in anyones near term plans due to being pretty useless.
|
||||
break;
|
||||
case EXITEM_BULLET_BAG:
|
||||
rc = RC_LW_TARGET_IN_WOODS;
|
||||
|
|
|
@ -66,7 +66,7 @@ void Rando::StaticData::InitItemTable() {
|
|||
itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Écaille (prog.)", "Progressive Skala" }, ITEMTYPE_ITEM, 0x86, true, &logic->ProgressiveScale, RHT_PROGRESSIVE_SCALE, true);
|
||||
itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "Capacité de Noix (prog.)", "Progressive Nusskapazität" }, ITEMTYPE_ITEM, 0x87, false, &logic->noVariable, RHT_PROGRESSIVE_NUT_UPGRADE, true);
|
||||
itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "Capacité de Bâtons (prog.)", "Progressive Stick-Kapazität" }, ITEMTYPE_ITEM, 0x88, false, &logic->noVariable, RHT_PROGRESSIVE_STICK_UPGRADE, true);
|
||||
itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Kriechgrube" }, ITEMTYPE_ITEM, 0x89, true, &logic->Bombchus, RHT_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_BOMBCHUS, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, true);
|
||||
itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Kriechgrube" }, ITEMTYPE_ITEM, 0x89, true, &logic->BombchuBag, RHT_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_BOMBCHUS, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, true);
|
||||
itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Progressives magisches Messgerät" }, ITEMTYPE_ITEM, 0x8A, true, &logic->ProgressiveMagic, RHT_PROGRESSIVE_MAGIC_METER, true);
|
||||
itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Progressive Okarina" }, ITEMTYPE_ITEM, 0x8B, true, &logic->ProgressiveOcarina, RHT_PROGRESSIVE_OCARINA, true);
|
||||
itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Épée Goron (prog.)", "Progressives Goronenschwert" }, ITEMTYPE_ITEM, 0xD4, true, &logic->ProgressiveGiantKnife,RHT_PROGRESSIVE_GORONSWORD, true);
|
||||
|
@ -205,10 +205,9 @@ void Rando::StaticData::InitItemTable() {
|
|||
itemTable[RG_BOMBS_5] = Item(RG_BOMBS_5, Text{ "Bombs (5)", "Bombes (5)", "Bomben (5)" }, ITEMTYPE_REFILL, GI_BOMBS_5, false, &logic->noVariable, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBS_10] = Item(RG_BOMBS_10, Text{ "Bombs (10)", "Bombes (10)", "Bomben (10)" }, ITEMTYPE_REFILL, GI_BOMBS_10, false, &logic->noVariable, RHT_BOMBS_10, ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBS_20] = Item(RG_BOMBS_20, Text{ "Bombs (20)", "Bombes (20)", "Bomben (20)" }, ITEMTYPE_REFILL, GI_BOMBS_20, false, &logic->noVariable, RHT_BOMBS_20, ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBCHU_5] = Item(RG_BOMBCHU_5, Text{ "Bombchus (5)", "Missiles (5)", "Bombchus (5)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_5, true, &logic->Bombchus5, RHT_BOMBCHU_5, ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBCHU_10] = Item(RG_BOMBCHU_10, Text{ "Bombchus (10)", "Missiles (10)", "Bombchus (10)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_10, true, &logic->Bombchus10, RHT_BOMBCHU_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBCHU_20] = Item(RG_BOMBCHU_20, Text{ "Bombchus (20)", "Missiles (20)", "Bombchus (20)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_20, true, &logic->Bombchus20, RHT_BOMBCHU_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBCHU_DROP] = Item(RG_BOMBCHU_DROP, Text{ "Bombchu Drop", "Drop Missiles", "Bombchus" }, ITEMTYPE_DROP, GI_BOMBCHUS_10, true, &logic->BombchuDrop, RHT_NONE, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBCHU_5] = Item(RG_BOMBCHU_5, Text{ "Bombchus (5)", "Missiles (5)", "Bombchus (5)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_5, true, &logic->BombchuIcon, RHT_BOMBCHUS_5, ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBCHU_10] = Item(RG_BOMBCHU_10, Text{ "Bombchus (10)", "Missiles (10)", "Bombchus (10)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_10, true, &logic->BombchuIcon, RHT_BOMBCHUS_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_BOMBCHU_20] = Item(RG_BOMBCHU_20, Text{ "Bombchus (20)", "Missiles (20)", "Bombchus (20)" }, ITEMTYPE_REFILL, GI_BOMBCHUS_20, true, &logic->BombchuIcon, RHT_BOMBCHUS_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_ARROWS_5] = Item(RG_ARROWS_5, Text{ "Arrows (5)", "Flèches (5)", "Pfeile (5)" }, ITEMTYPE_REFILL, GI_ARROWS_SMALL, false, &logic->noVariable, RHT_ARROWS_5, ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_ARROWS_10] = Item(RG_ARROWS_10, Text{ "Arrows (10)", "Flèches (10)", "Pfeile (10)" }, ITEMTYPE_REFILL, GI_ARROWS_MEDIUM, false, &logic->noVariable, RHT_ARROWS_10, ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
itemTable[RG_ARROWS_30] = Item(RG_ARROWS_30, Text{ "Arrows (30)", "Flèches (30)", "Pfeile (30)" }, ITEMTYPE_REFILL, GI_ARROWS_LARGE, false, &logic->noVariable, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
|
||||
|
@ -230,7 +229,7 @@ void Rando::StaticData::InitItemTable() {
|
|||
itemTable[RG_BUY_DEKU_NUTS_10] = Item(RG_BUY_DEKU_NUTS_10, Text{ "Buy Deku Nut (10)", "Acheter: Noix Mojo (10)", "Deku-Nuss kaufen (10)" }, ITEMTYPE_SHOP, GI_NUTS_10, true, &logic->Nuts, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30);
|
||||
itemTable[RG_BUY_DEKU_STICK_1] = Item(RG_BUY_DEKU_STICK_1, Text{ "Buy Deku Stick (1)", "Acheter: Bâton Mojo (1)", "Deku-Stick kaufen (1)" }, ITEMTYPE_SHOP, GI_STICKS_1, true, &logic->Sticks, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10);
|
||||
itemTable[RG_BUY_BOMBS_10] = Item(RG_BUY_BOMBS_10, Text{ "Buy Bombs (10)", "Acheter: Bombes (10)", "Bomben kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBS_10, true, &logic->BuyBomb, RHT_BOMBS_10, ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50);
|
||||
itemTable[RG_BUY_FISH] = Item(RG_BUY_FISH, Text{ "Buy Fish", "Acheter: Poisson", "Fisch kaufen" }, ITEMTYPE_SHOP, GI_FISH, true, &logic->FishAccess, RHT_BOTTLE_WITH_FISH, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 200);
|
||||
itemTable[RG_BUY_FISH] = Item(RG_BUY_FISH, Text{ "Buy Fish", "Acheter: Poisson", "Fisch kaufen" }, ITEMTYPE_SHOP, GI_FISH, true, &logic->BuyFish, RHT_BOTTLE_WITH_FISH, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 200);
|
||||
itemTable[RG_BUY_RED_POTION_30] = Item(RG_BUY_RED_POTION_30, Text{ "Buy Red Potion [30]", "Acheter: Potion Rouge [30]", "Rotes Elixier kaufen [30]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, &logic->noVariable, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30);
|
||||
itemTable[RG_BUY_GREEN_POTION] = Item(RG_BUY_GREEN_POTION, Text{ "Buy Green Potion", "Acheter: Potion Verte", "Grünes Elixier kaufen" }, ITEMTYPE_SHOP, GI_POTION_GREEN, true, &logic->BuyMagicPotion, RHT_BOTTLE_WITH_GREEN_POTION,ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30);
|
||||
itemTable[RG_BUY_BLUE_POTION] = Item(RG_BUY_BLUE_POTION, Text{ "Buy Blue Potion", "Acheter: Potion Bleue", "Blaues Elixier kaufen" }, ITEMTYPE_SHOP, GI_POTION_BLUE, true, &logic->BuyMagicPotion, RHT_BOTTLE_WITH_BLUE_POTION,ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 100);
|
||||
|
@ -239,14 +238,14 @@ void Rando::StaticData::InitItemTable() {
|
|||
itemTable[RG_BUY_GORON_TUNIC] = Item(RG_BUY_GORON_TUNIC, Text{ "Buy Goron Tunic", "Acheter: Tunique Goron", "Goronen-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_GORON, true, &logic->GoronTunic, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 200);
|
||||
itemTable[RG_BUY_ZORA_TUNIC] = Item(RG_BUY_ZORA_TUNIC, Text{ "Buy Zora Tunic", "Acheter: Tunique Zora", "Zora-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_ZORA, true, &logic->ZoraTunic, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 300);
|
||||
itemTable[RG_BUY_HEART] = Item(RG_BUY_HEART, Text{ "Buy Heart", "Acheter: Coeur de Vie", "Herz kaufen" }, ITEMTYPE_SHOP, GI_HEART, false, &logic->noVariable, RHT_RECOVERY_HEART, ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10);
|
||||
itemTable[RG_BUY_BOMBCHU_10] = Item(RG_BUY_BOMBCHU_10, Text{ "Buy Bombchu (10)", "Acheter: Missiles (10)", "Bomchu kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_10, true, &logic->BuyBombchus, RHT_BOMBCHU_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 99);
|
||||
itemTable[RG_BUY_BOMBCHU_20] = Item(RG_BUY_BOMBCHU_20, Text{ "Buy Bombchu (20)", "Acheter: Missiles (20)", "Bomchu kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_20, true, &logic->BuyBombchus, RHT_BOMBCHU_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 180);
|
||||
itemTable[RG_BUY_BOMBCHUS_10] = Item(RG_BUY_BOMBCHUS_10, Text{ "Buy Bombchu (10)", "Acheter: Missiles (10)", "Bomchu kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_10, true, &logic->BuyBombchus, RHT_BOMBCHUS_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 99); //Hardcoded price. change is in z-en-girla.c.
|
||||
itemTable[RG_BUY_BOMBCHUS_20] = Item(RG_BUY_BOMBCHUS_20, Text{ "Buy Bombchu (20)", "Acheter: Missiles (20)", "Bomchu kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_20, true, &logic->BuyBombchus, RHT_BOMBCHUS_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 180);
|
||||
itemTable[RG_BUY_DEKU_SEEDS_30] = Item(RG_BUY_DEKU_SEEDS_30, Text{ "Buy Deku Seeds (30)", "Acheter: Graines Mojo (30)", "Deku-Samen kaufen (30)" }, ITEMTYPE_SHOP, GI_SEEDS_30, true, &logic->BuySeed, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30);
|
||||
itemTable[RG_SOLD_OUT] = Item(RG_SOLD_OUT, Text{ "Sold Out", "Rupture de stock", "Ausverkauft" }, ITEMTYPE_SHOP, RG_SOLD_OUT, false, &logic->noVariable, RHT_NONE, false, 0);
|
||||
itemTable[RG_BUY_BLUE_FIRE] = Item(RG_BUY_BLUE_FIRE, Text{ "Buy Blue Fire", "Acheter: Flamme Bleue", "Blaues Feuer kaufen" }, ITEMTYPE_SHOP, GI_BLUE_FIRE, true, &logic->BlueFireAccess, RHT_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 300);
|
||||
itemTable[RG_BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{ "Buy Bottle Bug", "Acheter: Insecte en bouteille", "Flaschenkäfer kaufen" }, ITEMTYPE_SHOP, GI_BUGS, true, &logic->BugsAccess, RHT_BOTTLE_WITH_BUGS, ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50);
|
||||
itemTable[RG_BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{ "Buy Bottle Bug", "Acheter: Insecte en bouteille", "Flaschenkäfer kaufen" }, ITEMTYPE_SHOP, GI_BUGS, true, &logic->BuyBugs, RHT_BOTTLE_WITH_BUGS, ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50);
|
||||
itemTable[RG_BUY_POE] = Item(RG_BUY_POE, Text{ "Buy Poe", "Acheter: Esprit", "Geist kaufen" }, ITEMTYPE_SHOP, RG_BUY_POE, false, &logic->noVariable, RHT_BOTTLE_WITH_BIG_POE, ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30);
|
||||
itemTable[RG_BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{ "Buy Fairy's Spirit", "Acheter: Esprit de Fée", "Feengeist kaufen" }, ITEMTYPE_SHOP, GI_FAIRY, true, &logic->FairyAccess, RHT_BOTTLE_WITH_FAIRY, ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50);
|
||||
itemTable[RG_BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{ "Buy Fairy's Spirit", "Acheter: Esprit de Fée", "Feengeist kaufen" }, ITEMTYPE_SHOP, GI_FAIRY, true, &logic->BuyFairy, RHT_BOTTLE_WITH_FAIRY, ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50);
|
||||
itemTable[RG_BUY_ARROWS_10] = Item(RG_BUY_ARROWS_10, Text{ "Buy Arrows (10)", "Acheter: Flèches (10)", "Pfeile kaufen (10)" }, ITEMTYPE_SHOP, GI_ARROWS_SMALL, true, &logic->BuyArrow, RHT_ARROWS_10, ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 20);
|
||||
itemTable[RG_BUY_BOMBS_20] = Item(RG_BUY_BOMBS_20, Text{ "Buy Bombs (20)", "Acheter: Bombes (20)", "Bomben kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBS_20, true, &logic->BuyBomb, RHT_BOMBS_20, ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 80);
|
||||
itemTable[RG_BUY_BOMBS_30] = Item(RG_BUY_BOMBS_30, Text{ "Buy Bombs (30)", "Acheter: Bombes (30)", "Bomben kaufen (30)" }, ITEMTYPE_SHOP, GI_BOMBS_30, true, &logic->BuyBomb, RHT_BOMBS_20, ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 120);
|
||||
|
|
|
@ -200,7 +200,6 @@ std::vector<RandomizerCheck> Rando::StaticData::overworldLocations = {
|
|||
RC_MARKET_TREASURE_CHEST_GAME_REWARD,
|
||||
RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE,
|
||||
RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE,
|
||||
RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS,
|
||||
RC_MARKET_LOST_DOG,
|
||||
RC_MARKET_SHOOTING_GALLERY_REWARD,
|
||||
RC_MARKET_10_BIG_POES,
|
||||
|
@ -668,7 +667,7 @@ void Rando::StaticData::InitLocationTable() { //
|
|||
locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, RCAREA_GERUDO_FORTRESS, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "GF South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, { Category::cVanillaGFSmallKey }, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true);
|
||||
// Haunted Wasteland
|
||||
locationTable[RC_WASTELAND_CHEST] = Location::Chest(RC_WASTELAND_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_WASTELAND, ACTOR_EN_BOX, SCENE_HAUNTED_WASTELAND, -30048, 0x00, "Chest", RHT_WASTELAND_CHEST, RG_PURPLE_RUPEE, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY);
|
||||
locationTable[RC_WASTELAND_BOMBCHU_SALESMAN] = Location::Base(RC_WASTELAND_BOMBCHU_SALESMAN, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, 0x03, "Carpet Salesman", RHT_WASTELAND_BOMBCHU_SALESMAN, RG_BOMBCHU_10, { Category::cMerchant }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY);
|
||||
locationTable[RC_WASTELAND_BOMBCHU_SALESMAN] = Location::Base(RC_WASTELAND_BOMBCHU_SALESMAN, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, 0x03, "Carpet Salesman", RHT_WASTELAND_BOMBCHU_SALESMAN, RG_BUY_BOMBCHUS_10, { Category::cMerchant }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY);
|
||||
// Desert Colossus
|
||||
locationTable[RC_COLOSSUS_FREESTANDING_POH] = Location::Collectable(RC_COLOSSUS_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, ACTOR_EN_ITEM00, SCENE_DESERT_COLOSSUS, 3334, 0x0D, "Freestanding PoH", RHT_COLOSSUS_FREESTANDING_POH, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY, true);
|
||||
locationTable[RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = Location::GrottoScrub(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DESERT_COLOSSUS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xFD), 0x39, "Deku Scrub Grotto Rear", RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RG_BUY_RED_POTION_30, { Category::cDekuScrub }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY);
|
||||
|
@ -677,7 +676,6 @@ void Rando::StaticData::InitLocationTable() { //
|
|||
locationTable[RC_MARKET_TREASURE_CHEST_GAME_REWARD] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, 0x0A, "Treasure Chest Game Reward", RHT_MARKET_TREASURE_CHEST_GAME_REWARD, RG_TREASURE_GAME_HEART, {}, SpoilerCollectionCheck::ItemGetInf(27), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true);
|
||||
locationTable[RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = Location::Base(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, 0x33, "Bombchu Bowling First Prize", RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RG_PROGRESSIVE_BOMB_BAG, {}, SpoilerCollectionCheck::ItemGetInf(17), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true);
|
||||
locationTable[RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = Location::Base(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, 0x3E, "Bombchu Bowling Second Prize", RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::ItemGetInf(18), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true);
|
||||
locationTable[RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS] = Location::Base(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_BOMBCHU_BOWLING_ALLEY, 0x00, 0x00, "Bombchu Bowling Bombchus", RHT_MARKET_BOMBCHU_BOWLING_BOMBCHUS, RG_BOMBCHU_DROP, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_LOST_DOG] = Location::Base(RC_MARKET_LOST_DOG, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_DOG_LADY_HOUSE, 0x00, 0x3E, "Lost Dog", RHT_MARKET_LOST_DOG, RG_PIECE_OF_HEART, {}, SpoilerCollectionCheck::InfTable(INFTABLE_191), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true);
|
||||
locationTable[RC_MARKET_SHOOTING_GALLERY_REWARD] = Location::Base(RC_MARKET_SHOOTING_GALLERY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_SHOOTING_GALLERY, 0x00, 0x60, "Shooting Gallery", RHT_MARKET_SHOOTING_GALLERY_REWARD, RG_PROGRESSIVE_SLINGSHOT, {}, SpoilerCollectionCheck::ItemGetInf(ITEMGETINF_0D), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true);
|
||||
locationTable[RC_MARKET_10_BIG_POES] = Location::Base(RC_MARKET_10_BIG_POES, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_MARKET_GUARD_HOUSE, 0x00, 0x0F, "10 Big Poes", RHT_MARKET_10_BIG_POES, RG_EMPTY_BOTTLE, {}, SpoilerCollectionCheck::RandomizerInf(RAND_INF_10_BIG_POES), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE, true);
|
||||
|
@ -1411,14 +1409,14 @@ void Rando::StaticData::InitLocationTable() { //
|
|||
locationTable[RC_KAK_BAZAAR_ITEM_8] = Location::Base(RC_KAK_BAZAAR_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_GIRLA, SCENE_TEST01, 0x07, 0x3F, "Bazaar Item 8", RHT_KAK_BAZAAR_ITEM_8, RG_BUY_ARROWS_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x33, 7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO);
|
||||
|
||||
// Market
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_1] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x00, 0x30, "Bombchu Shop Item 1", RHT_MARKET_BOMBCHU_SHOP_ITEM_1, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_2] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x01, 0x31, "Bombchu Shop Item 2", RHT_MARKET_BOMBCHU_SHOP_ITEM_2, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_3] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x02, 0x32, "Bombchu Shop Item 3", RHT_MARKET_BOMBCHU_SHOP_ITEM_3, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_4] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x03, 0x33, "Bombchu Shop Item 4", RHT_MARKET_BOMBCHU_SHOP_ITEM_4, RG_BUY_BOMBCHU_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_5] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x04, 0x34, "Bombchu Shop Item 5", RHT_MARKET_BOMBCHU_SHOP_ITEM_5, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_6] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x05, 0x35, "Bombchu Shop Item 6", RHT_MARKET_BOMBCHU_SHOP_ITEM_6, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_7] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x06, 0x36, "Bombchu Shop Item 7", RHT_MARKET_BOMBCHU_SHOP_ITEM_7, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_8] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x07, 0x37, "Bombchu Shop Item 8", RHT_MARKET_BOMBCHU_SHOP_ITEM_8, RG_BUY_BOMBCHU_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_1] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x00, 0x30, "Bombchu Shop Item 1", RHT_MARKET_BOMBCHU_SHOP_ITEM_1, RG_BUY_BOMBCHUS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_2] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x01, 0x31, "Bombchu Shop Item 2", RHT_MARKET_BOMBCHU_SHOP_ITEM_2, RG_BUY_BOMBCHUS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_3] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x02, 0x32, "Bombchu Shop Item 3", RHT_MARKET_BOMBCHU_SHOP_ITEM_3, RG_BUY_BOMBCHUS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_4] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x03, 0x33, "Bombchu Shop Item 4", RHT_MARKET_BOMBCHU_SHOP_ITEM_4, RG_BUY_BOMBCHUS_10, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 3), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_5] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x04, 0x34, "Bombchu Shop Item 5", RHT_MARKET_BOMBCHU_SHOP_ITEM_5, RG_BUY_BOMBCHUS_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 4), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_6] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x05, 0x35, "Bombchu Shop Item 6", RHT_MARKET_BOMBCHU_SHOP_ITEM_6, RG_BUY_BOMBCHUS_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 5), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_7] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x06, 0x36, "Bombchu Shop Item 7", RHT_MARKET_BOMBCHU_SHOP_ITEM_7, RG_BUY_BOMBCHUS_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 6), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_BOMBCHU_SHOP_ITEM_8] = Location::Base(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_BOMBCHU_SHOP, 0x07, 0x37, "Bombchu Shop Item 8", RHT_MARKET_BOMBCHU_SHOP_ITEM_8, RG_BUY_BOMBCHUS_20, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x32, 7), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_POTION_SHOP_ITEM_1] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_1, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x00, 0x30, "Potion Shop Item 1", RHT_MARKET_POTION_SHOP_ITEM_1, RG_BUY_GREEN_POTION, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 0), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_POTION_SHOP_ITEM_2] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_2, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x01, 0x31, "Potion Shop Item 2", RHT_MARKET_POTION_SHOP_ITEM_2, RG_BUY_BLUE_FIRE, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 1), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
locationTable[RC_MARKET_POTION_SHOP_ITEM_3] = Location::Base(RC_MARKET_POTION_SHOP_ITEM_3, RCQUEST_BOTH, RCTYPE_SHOP, RCAREA_MARKET, ACTOR_EN_GIRLA, SCENE_POTION_SHOP_MARKET, 0x02, 0x32, "Potion Shop Item 3", RHT_MARKET_POTION_SHOP_ITEM_3, RG_BUY_RED_POTION_30, { Category::cShop }, SpoilerCollectionCheck::ShopItem(0x31, 2), SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE);
|
||||
|
|
|
@ -158,7 +158,7 @@ namespace Rando {
|
|||
|
||||
// Magic items
|
||||
default:
|
||||
return MagicMeter && (IsMagicItem(itemName) || (IsMagicArrow(itemName) && CanUse(RG_FAIRY_BOW)));
|
||||
return Magic && (IsMagicItem(itemName) || (IsMagicArrow(itemName) && CanUse(RG_FAIRY_BOW)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -264,14 +264,14 @@ namespace Rando {
|
|||
(OcarinaCDownButton ? 1 : 0);
|
||||
NumBottles = ((NoBottles) ? 0 : (Bottles + ((DeliverLetter) ? 1 : 0)));
|
||||
HasBottle = NumBottles >= 1;
|
||||
Slingshot = (ProgressiveBulletBag >= 1) && (BuySeed || AmmoCanDrop);
|
||||
BulletBag = ProgressiveBulletBag >= 1;
|
||||
Ocarina = ProgressiveOcarina >= 1;
|
||||
OcarinaOfTime = ProgressiveOcarina >= 2;
|
||||
MagicMeter = (ProgressiveMagic >= 1) && (AmmoCanDrop || (HasBottle && BuyMagicPotion));
|
||||
BombBag = (ProgressiveBombBag >= 1) && (BuyBomb || AmmoCanDrop);
|
||||
MagicMeter = ProgressiveMagic >= 1;
|
||||
BombBag = ProgressiveBombBag >= 1;
|
||||
Hookshot = ProgressiveHookshot >= 1;
|
||||
Longshot = ProgressiveHookshot >= 2;
|
||||
Bow = (ProgressiveBow >= 1) && (BuyArrow || AmmoCanDrop);
|
||||
Quiver = ProgressiveBow >= 1;
|
||||
GoronBracelet = ProgressiveStrength >= 1;
|
||||
SilverGauntlets = ProgressiveStrength >= 2;
|
||||
GoldenGauntlets = ProgressiveStrength >= 3;
|
||||
|
@ -282,37 +282,34 @@ namespace Rando {
|
|||
AdultsWallet = ProgressiveWallet >= 2;
|
||||
BiggoronSword = BiggoronSword || ProgressiveGiantKnife >= 2;
|
||||
|
||||
// TODO: Implement Ammo Drop Setting in place of bombchu drops
|
||||
BombchuRefill = (AmmoCanDrop && (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) || BombchuIcon) &&
|
||||
ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON/*_PLUS_BOMBCHU*/)) ||
|
||||
CanPlayBowling || BombchuSalesman || BuyBombchus;
|
||||
FairyAccess = FairyPot || GossipStoneFairy || BeanPlantFairy || ButterflyFairy || FreeFairies || FairyPond || BuyFairy;
|
||||
|
||||
//Usage
|
||||
Slingshot = (BuySeed || AmmoCanDrop) && BulletBag;
|
||||
Magic = (AmmoCanDrop || (HasBottle && (BuyMagicPotion))) && MagicMeter;
|
||||
Bombs = (BuyBomb || AmmoCanDrop) && BombBag;
|
||||
Bombchus = BombchuRefill && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) ? BombchuBag : BombBag;
|
||||
Bow = (BuyArrow || AmmoCanDrop) && Quiver;
|
||||
Nuts = ((NutPot || NutCrate || DekuBabaNuts) && AmmoCanDrop) || Nuts; //RANDOTODO BuyNuts currently mixed in with Nuts, should be seperate as BuyNuts are also a Nuts source
|
||||
Sticks = (StickPot || DekuBabaSticks) || Sticks;
|
||||
Bugs = HasBottle && (BugShrub || WanderingBugs || BugRock || BuyBugs);
|
||||
BlueFire = (HasBottle && BlueFireAccess) || (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && CanUse(RG_ICE_ARROWS));
|
||||
Fish = HasBottle && (LoneFish || FishGroup || BuyFish); //is there any need to care about lone vs group?
|
||||
Fairy = HasBottle && FairyAccess;
|
||||
|
||||
// TODO: Implement Ammo Drop Setting in place of bombchu drops
|
||||
HasExplosives = Bombs || Bombchus;
|
||||
HasBoots = IronBoots || HoverBoots;
|
||||
|
||||
//you need at least 2 buttons for scarecrow song
|
||||
ScarecrowSong = ScarecrowSong || (ctx->GetOption(RSK_SKIP_SCARECROWS_SONG) && Ocarina && OcarinaButtons >= 2) || (ChildScarecrow && AdultScarecrow);
|
||||
Scarecrow = Hookshot && ScarecrowSong;
|
||||
DistantScarecrow = Longshot && ScarecrowSong;
|
||||
|
||||
//Drop Access
|
||||
DekuStickDrop = StickPot || DekuBabaSticks;
|
||||
DekuNutDrop = (NutPot || NutCrate || DekuBabaNuts) && AmmoCanDrop;
|
||||
BugsAccess = BugShrub || WanderingBugs || BugRock;
|
||||
FishAccess = LoneFish || FishGroup;
|
||||
FairyAccess = FairyPot || GossipStoneFairy || BeanPlantFairy || ButterflyFairy || FreeFairies || FairyPond;
|
||||
|
||||
|
||||
//refills
|
||||
Bombs = BombBag;
|
||||
Nuts = DekuNutDrop || Nuts;
|
||||
Sticks = DekuStickDrop || Sticks;
|
||||
Bugs = HasBottle && BugsAccess;
|
||||
BlueFire = (HasBottle && BlueFireAccess) || (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && CanUse(RG_ICE_ARROWS));
|
||||
Fish = HasBottle && FishAccess;
|
||||
Fairy = HasBottle && FairyAccess;
|
||||
|
||||
FoundBombchus = (BombchuDrop || Bombchus || Bombchus5 || Bombchus10 || Bombchus20) && (BombBag || ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC));
|
||||
CanPlayBowling = ChildsWallet && ((ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && FoundBombchus) || (!ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && BombBag));
|
||||
// TODO: Implement Ammo Drop Setting in place of bombchu drops
|
||||
HasBombchus = (BuyBombchus || (ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON/*_PLUS_BOMBCHU*/) && FoundBombchus));
|
||||
|
||||
HasExplosives = Bombs || (ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC) && HasBombchus);
|
||||
|
||||
HasBoots = IronBoots || HoverBoots;
|
||||
|
||||
//Unshuffled adult trade quest
|
||||
Eyedrops = Eyedrops || (!ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) && ClaimCheck);
|
||||
EyeballFrog = EyeballFrog || (!ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) && Eyedrops);
|
||||
|
@ -353,7 +350,7 @@ namespace Rando {
|
|||
CanOpenStormGrotto = CanUse(RG_SONG_OF_STORMS) && (ShardOfAgony || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY));
|
||||
HookshotOrBoomerang = CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG);
|
||||
CanGetNightTimeGS = (CanUse(RG_SUNS_SONG) || !ctx->GetOption(RSK_SKULLS_SUNS_SONG));
|
||||
CanBreakUpperBeehives = HookshotOrBoomerang || (ctx->GetTrickOption(RT_BOMBCHU_BEEHIVES) && HasBombchus);
|
||||
CanBreakUpperBeehives = HookshotOrBoomerang || (ctx->GetTrickOption(RT_BOMBCHU_BEEHIVES) && Bombchus);
|
||||
CanBreakLowerBeehives = CanBreakUpperBeehives || Bombs;
|
||||
CanFish = ChildsWallet && (CanUse(RG_FISHING_POLE) || !ctx->GetOption(RSK_SHUFFLE_FISHING_POLE));
|
||||
CanGetChildFish = CanFish && (IsChild || (IsAdult && !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)));
|
||||
|
@ -515,9 +512,6 @@ namespace Rando {
|
|||
WeirdEgg = false;
|
||||
HasBottle = false;
|
||||
Bombchus = false;
|
||||
Bombchus5 = false;
|
||||
Bombchus10 = false;
|
||||
Bombchus20 = false;
|
||||
MagicBean = false;
|
||||
MagicBeanPack = false;
|
||||
RutosLetter = false;
|
||||
|
@ -683,19 +677,15 @@ namespace Rando {
|
|||
CanSummonGanon = false;
|
||||
|
||||
//Drops and Bottle Contents Access
|
||||
DekuNutDrop = false;
|
||||
NutPot = false;
|
||||
NutCrate = false;
|
||||
DekuBabaNuts = false;
|
||||
DekuStickDrop = false;
|
||||
StickPot = false;
|
||||
DekuBabaSticks = false;
|
||||
BugsAccess = false;
|
||||
BugShrub = false;
|
||||
WanderingBugs = false;
|
||||
BugRock = false;
|
||||
BlueFireAccess = false;
|
||||
FishAccess = false;
|
||||
FishGroup = false;
|
||||
LoneFish = false;
|
||||
FairyAccess = false;
|
||||
|
@ -705,14 +695,17 @@ namespace Rando {
|
|||
FairyPot = false;
|
||||
FreeFairies = false;
|
||||
FairyPond = false;
|
||||
BombchuDrop = false;
|
||||
BombchuRefill = false;
|
||||
BombchuIcon = false;
|
||||
|
||||
BuyBombchus = false;
|
||||
BuySeed = false;
|
||||
BuyArrow = false;
|
||||
BuyBomb = false;
|
||||
BuyMagicPotion = false;
|
||||
MagicRefill = false;
|
||||
BuyMagicPotion = false;
|
||||
BuyFish = false;
|
||||
BuyBugs = false;
|
||||
BuyFairy = false;
|
||||
|
||||
PieceOfHeart = 0;
|
||||
HeartContainer = 0;
|
||||
|
@ -722,13 +715,15 @@ namespace Rando {
|
|||
/* These are used to simplify reading the logic, but need to be updated
|
||||
/ every time a base value is updated. */
|
||||
|
||||
Slingshot = false;
|
||||
BulletBag = false;
|
||||
Ocarina = false;
|
||||
OcarinaOfTime = false;
|
||||
BombBag = false;
|
||||
MagicMeter = false;
|
||||
BombchuBag = false;
|
||||
Magic = false;
|
||||
Hookshot = false;
|
||||
Longshot = false;
|
||||
Quiver = false;
|
||||
Bow = false;
|
||||
GoronBracelet = false;
|
||||
SilverGauntlets = false;
|
||||
|
@ -756,9 +751,7 @@ namespace Rando {
|
|||
Fairy = false;
|
||||
BottleWithBigPoe = false;
|
||||
|
||||
FoundBombchus = false;
|
||||
CanPlayBowling = false;
|
||||
HasBombchus = false;
|
||||
HasExplosives = false;
|
||||
HasBoots = false;
|
||||
IsChild = false;
|
||||
|
|
|
@ -32,13 +32,11 @@ class Logic {
|
|||
|
||||
// Child item logic
|
||||
bool KokiriSword = false;
|
||||
bool BulletBag = false;
|
||||
bool ZeldasLetter = false;
|
||||
bool WeirdEgg = false;
|
||||
bool HasBottle = false;
|
||||
bool Bombchus = false;
|
||||
bool Bombchus5 = false;
|
||||
bool Bombchus10 = false;
|
||||
bool Bombchus20 = false;
|
||||
bool MagicBean = false;
|
||||
bool MagicBeanPack = false;
|
||||
bool RutosLetter = false;
|
||||
|
@ -186,19 +184,15 @@ class Logic {
|
|||
bool NoBottles = false;
|
||||
|
||||
// Drops and Bottle Contents Access
|
||||
bool DekuNutDrop = false;
|
||||
bool NutPot = false;
|
||||
bool NutCrate = false;
|
||||
bool DekuBabaNuts = false;
|
||||
bool DekuStickDrop = false;
|
||||
bool StickPot = false;
|
||||
bool DekuBabaSticks = false;
|
||||
bool BugsAccess = false;
|
||||
bool BugShrub = false;
|
||||
bool WanderingBugs = false;
|
||||
bool BugRock = false;
|
||||
bool BlueFireAccess = false;
|
||||
bool FishAccess = false;
|
||||
bool FishGroup = false;
|
||||
bool LoneFish = false;
|
||||
bool FairyAccess = false;
|
||||
|
@ -208,15 +202,18 @@ class Logic {
|
|||
bool FairyPot = false;
|
||||
bool FreeFairies = false;
|
||||
bool FairyPond = false;
|
||||
bool BombchuDrop = false;
|
||||
bool AmmoCanDrop = false;
|
||||
bool BombchuRefill = false;
|
||||
bool BombchuIcon = false;
|
||||
|
||||
bool BuyBombchus = false;
|
||||
bool BuySeed = false;
|
||||
bool BuyArrow = false;
|
||||
bool BuyBomb = false;
|
||||
bool BuyMagicPotion = false;
|
||||
bool MagicRefill = false;
|
||||
bool BuyFish = false;
|
||||
bool BuyBugs = false;
|
||||
bool BuyFairy = false;
|
||||
|
||||
uint8_t PieceOfHeart = 0;
|
||||
uint8_t HeartContainer = 0;
|
||||
|
@ -226,14 +223,14 @@ class Logic {
|
|||
/* These are used to simplify reading the logic, but need to be updated
|
||||
/ every time a base value is updated. */
|
||||
|
||||
bool Slingshot = false;
|
||||
bool Ocarina = false;
|
||||
bool OcarinaOfTime = false;
|
||||
bool BombBag = false;
|
||||
bool BombchuBag = false;
|
||||
bool MagicMeter = false;
|
||||
bool Hookshot = false;
|
||||
bool Longshot = false;
|
||||
bool Bow = false;
|
||||
bool Quiver = false;
|
||||
bool GoronBracelet = false;
|
||||
bool SilverGauntlets = false;
|
||||
bool GoldenGauntlets = false;
|
||||
|
@ -249,7 +246,10 @@ class Logic {
|
|||
bool Scarecrow = false;
|
||||
bool DistantScarecrow = false;
|
||||
|
||||
bool Slingshot = false;
|
||||
bool Bombs = false;
|
||||
bool Magic = false;
|
||||
bool Bow = false;
|
||||
bool DekuShield = false;
|
||||
bool HylianShield = false;
|
||||
bool Nuts = false;
|
||||
|
@ -266,9 +266,8 @@ class Logic {
|
|||
bool OcarinaCUpButton = false;
|
||||
bool OcarinaCDownButton = false;
|
||||
|
||||
bool FoundBombchus = false;
|
||||
bool BombchuSalesman = false;
|
||||
bool CanPlayBowling = false;
|
||||
bool HasBombchus = false;
|
||||
bool HasExplosives = false;
|
||||
bool HasBoots = false;
|
||||
bool IsChild = false;
|
||||
|
|
|
@ -535,7 +535,8 @@ void Settings::CreateOptionDescriptions() {
|
|||
|
||||
mOptionDescriptions[RSK_FULL_WALLETS] = "Start with a full wallet. All wallet upgrades come filled with rupees.";
|
||||
mOptionDescriptions[RSK_BOMBCHUS_IN_LOGIC] =
|
||||
"Bombchus are properly considered in logic.\n"
|
||||
"Bombchus are properly considered in logic. Without this setting, any Bombchu requirement"
|
||||
" is filled by Bomb Bag + a renewable source of Bombchus\n"
|
||||
"\n"
|
||||
"The first Bombchu pack will always be 20, and subsequent packs will be "
|
||||
"5 or 10 based on how many you have.\n"
|
||||
|
@ -543,7 +544,10 @@ void Settings::CreateOptionDescriptions() {
|
|||
"\n"
|
||||
"Bombchu Bowling is opened by obtaining Bombchus.";
|
||||
mOptionDescriptions[RSK_ENABLE_BOMBCHU_DROPS] = "Once you obtain bombchus for the first time, refills can be found "
|
||||
"in bushes and other places where bomb drops can normally spawn.";
|
||||
"in bushes and other places where bomb drops can normally spawn."
|
||||
"\n"
|
||||
"If you have Bombchus in Logic disabled, you will also need a"
|
||||
"Bomb bag for bombchus to drop";
|
||||
mOptionDescriptions[RSK_BLUE_FIRE_ARROWS] =
|
||||
"Ice Arrows act like Blue Fire, making them able to melt red ice. "
|
||||
"Item placement logic will respect this option, so it might be required to use this to progress.";
|
||||
|
|
|
@ -273,9 +273,9 @@ std::unordered_map<RandomizerGet, EnGirlAShopItem> randomizerGetToEnGirlShopItem
|
|||
{ RG_BUY_DEKU_SHIELD, SI_DEKU_SHIELD },
|
||||
{ RG_BUY_GORON_TUNIC, SI_GORON_TUNIC },
|
||||
{ RG_BUY_ZORA_TUNIC, SI_ZORA_TUNIC },
|
||||
{ RG_BUY_HEART, SI_HEART },
|
||||
{ RG_BUY_BOMBCHU_10, SI_BOMBCHU_10_1 },
|
||||
{ RG_BUY_BOMBCHU_20, SI_BOMBCHU_20_1 },
|
||||
{ RG_BUY_HEART, SI_RECOVERY_HEART },
|
||||
{ RG_BUY_BOMBCHUS_10, SI_BOMBCHU_10_1 },
|
||||
{ RG_BUY_BOMBCHUS_20, SI_BOMBCHU_20_1 },
|
||||
{ RG_BUY_DEKU_SEEDS_30, SI_DEKU_SEEDS_30 },
|
||||
{ RG_BUY_BLUE_FIRE, SI_BLUE_FIRE },
|
||||
{ RG_BUY_BOTTLE_BUG, SI_BUGS },
|
||||
|
@ -436,19 +436,10 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
|
|||
case RG_BOMBCHU_5:
|
||||
case RG_BOMBCHU_10:
|
||||
case RG_BOMBCHU_20:
|
||||
case RG_PROGRESSIVE_BOMBCHUS:
|
||||
case RG_BUY_BOMBCHUS_10:
|
||||
case RG_BUY_BOMBCHUS_20:
|
||||
case RG_PROGRESSIVE_BOMBCHUS: //RANDOTODO Do we want bombchu refills to exist seperatly from bombchu bags? If so, this needs changing.
|
||||
return CAN_OBTAIN;
|
||||
case RG_BUY_BOMBCHU_10:
|
||||
case RG_BUY_BOMBCHU_20:
|
||||
case RG_BOMBCHU_DROP:
|
||||
// If Bombchus aren't in logic, you need a bomb bag to purchase them
|
||||
// If they are in logic, you need to have already obtained them somewhere else
|
||||
// Bombchu Drop is only used as a bowling reward, so it needs the same logic
|
||||
if (GetRandoSettingValue(RSK_BOMBCHUS_IN_LOGIC)) {
|
||||
return INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE;
|
||||
} else {
|
||||
return CUR_UPG_VALUE(UPG_BOMB_BAG) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE;
|
||||
}
|
||||
case RG_PROGRESSIVE_HOOKSHOT:
|
||||
switch (INV_CONTENT(ITEM_HOOKSHOT)) {
|
||||
case ITEM_NONE:
|
||||
|
@ -833,13 +824,11 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
|
|||
return GI_OCARINA_OOT;
|
||||
}
|
||||
case RG_BOMBCHU_5:
|
||||
case RG_BOMBCHU_DROP:
|
||||
return GI_BOMBCHUS_5;
|
||||
case RG_BOMBCHU_10:
|
||||
case RG_BUY_BOMBCHU_10:
|
||||
case RG_BUY_BOMBCHUS_10:
|
||||
return GI_BOMBCHUS_10;
|
||||
case RG_BOMBCHU_20:
|
||||
case RG_BUY_BOMBCHU_20:
|
||||
case RG_BUY_BOMBCHUS_20:
|
||||
return GI_BOMBCHUS_20;
|
||||
case RG_PROGRESSIVE_HOOKSHOT:
|
||||
switch (INV_CONTENT(ITEM_HOOKSHOT)) {
|
||||
|
@ -1100,7 +1089,6 @@ bool Randomizer::IsItemVanilla(RandomizerGet randoGet) {
|
|||
case RG_BOMBCHU_5:
|
||||
case RG_BOMBCHU_10:
|
||||
case RG_BOMBCHU_20:
|
||||
case RG_BOMBCHU_DROP:
|
||||
case RG_ARROWS_5:
|
||||
case RG_ARROWS_10:
|
||||
case RG_ARROWS_30:
|
||||
|
@ -1129,8 +1117,8 @@ bool Randomizer::IsItemVanilla(RandomizerGet randoGet) {
|
|||
case RG_BUY_GORON_TUNIC:
|
||||
case RG_BUY_ZORA_TUNIC:
|
||||
case RG_BUY_HEART:
|
||||
case RG_BUY_BOMBCHU_10:
|
||||
case RG_BUY_BOMBCHU_20:
|
||||
case RG_BUY_BOMBCHUS_10:
|
||||
case RG_BUY_BOMBCHUS_20:
|
||||
case RG_BUY_DEKU_SEEDS_30:
|
||||
case RG_SOLD_OUT:
|
||||
case RG_BUY_BLUE_FIRE:
|
||||
|
|
|
@ -738,7 +738,6 @@ typedef enum {
|
|||
RC_MARKET_SHOOTING_GALLERY_REWARD,
|
||||
RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE,
|
||||
RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE,
|
||||
RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS,
|
||||
RC_MARKET_LOST_DOG,
|
||||
RC_MARKET_TREASURE_CHEST_GAME_REWARD,
|
||||
RC_MARKET_10_BIG_POES,
|
||||
|
@ -1918,7 +1917,6 @@ typedef enum {
|
|||
RG_BOMBCHU_5,
|
||||
RG_BOMBCHU_10,
|
||||
RG_BOMBCHU_20,
|
||||
RG_BOMBCHU_DROP,
|
||||
RG_ARROWS_5,
|
||||
RG_ARROWS_10,
|
||||
RG_ARROWS_30,
|
||||
|
@ -1947,8 +1945,8 @@ typedef enum {
|
|||
RG_BUY_GORON_TUNIC,
|
||||
RG_BUY_ZORA_TUNIC,
|
||||
RG_BUY_HEART,
|
||||
RG_BUY_BOMBCHU_10,
|
||||
RG_BUY_BOMBCHU_20,
|
||||
RG_BUY_BOMBCHUS_10,
|
||||
RG_BUY_BOMBCHUS_20,
|
||||
RG_BUY_DEKU_SEEDS_30,
|
||||
RG_SOLD_OUT,
|
||||
RG_BUY_BLUE_FIRE,
|
||||
|
@ -3147,10 +3145,9 @@ typedef enum {
|
|||
RHT_BOMBS_5,
|
||||
RHT_BOMBS_10,
|
||||
RHT_BOMBS_20,
|
||||
RHT_BOMBCHU_5,
|
||||
RHT_BOMBCHU_10,
|
||||
RHT_BOMBCHU_20,
|
||||
RHT_BOMBCHU_DROP,
|
||||
RHT_BOMBCHUS_5,
|
||||
RHT_BOMBCHUS_10,
|
||||
RHT_BOMBCHUS_20,
|
||||
RHT_ARROWS_5,
|
||||
RHT_ARROWS_10,
|
||||
RHT_ARROWS_30,
|
||||
|
@ -3179,8 +3176,8 @@ typedef enum {
|
|||
RHT_BUY_GORON_TUNIC,
|
||||
RHT_BUY_ZORA_TUNIC,
|
||||
RHT_BUY_HEART,
|
||||
RHT_BUY_BOMBCHU_10,
|
||||
RHT_BUY_BOMBCHU_20,
|
||||
RHT_BUY_BOMBCHUS_10,
|
||||
RHT_BUY_BOMBCHUS_20,
|
||||
RHT_BUY_DEKU_SEEDS_30,
|
||||
RHT_SOLD_OUT,
|
||||
RHT_BUY_BLUE_FIRE,
|
||||
|
|
|
@ -1259,7 +1259,6 @@ bool IsCheckShuffled(RandomizerCheck rc) {
|
|||
loc->GetQuest() == RCQUEST_VANILLA && OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc->GetScene())->IsVanilla()
|
||||
) &&
|
||||
(loc->GetRCType() != RCTYPE_SHOP || (showShops && loc->GetActorParams() > 0x03)) &&
|
||||
(loc->GetRandomizerCheck() != RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS) &&
|
||||
(rc != RC_TRIFORCE_COMPLETED || !hideTriforceCompleted) &&
|
||||
(rc != RC_GIFT_FROM_SAGES || !IS_RANDO) &&
|
||||
(loc->GetRCType() != RCTYPE_SCRUB ||
|
||||
|
|
|
@ -2642,17 +2642,13 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
|
|||
else if (textId == TEXT_MEDIGORON && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){
|
||||
messageEntry = messageEntry = ctx->GetHint(RH_MEDIGORON)->GetHintMessage(MF_AUTO_FORMAT);
|
||||
}
|
||||
else if (textId == TEXT_CARPET_SALESMAN_1 && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){
|
||||
messageEntry = messageEntry = ctx->GetHint(RH_CARPET_SALESMAN)->GetHintMessage(MF_AUTO_FORMAT);
|
||||
else if (textId == TEXT_CARPET_SALESMAN_1 && !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN) && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){
|
||||
messageEntry = ctx->GetHint(RH_CARPET_SALESMAN)->GetHintMessage(MF_AUTO_FORMAT);
|
||||
}
|
||||
else if (textId == TEXT_CARPET_SALESMAN_2 && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){
|
||||
else if (textId == TEXT_CARPET_SALESMAN_2 && !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN) && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId);
|
||||
}
|
||||
else if ((textId == TEXT_BUY_BOMBCHU_10_DESC || textId == TEXT_BUY_BOMBCHU_10_PROMPT)
|
||||
&& ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC)) {
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId);
|
||||
}
|
||||
else if (textId == TEXT_SKULLTULA_PEOPLE_IM_CURSED) {
|
||||
Flags_SetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN);//set here so we can actually check if the text is run, not a good solution
|
||||
} else if (textId == TEXT_SKULLTULA_PEOPLE_IM_CURSED) {
|
||||
actorParams = GET_PLAYER(play)->targetActor->params;
|
||||
if (actorParams == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)){
|
||||
messageEntry = ctx->GetHint(RH_KAK_10_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT);
|
||||
|
@ -2753,6 +2749,9 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
|
|||
}
|
||||
else if (textId == TEXT_HBA_ALREADY_HAVE_1000 && ctx->GetOption(RSK_HBA_HINT)) {
|
||||
messageEntry = ctx->GetHint(RH_HBA_HINT)->GetHintMessage(MF_AUTO_FORMAT, 3);
|
||||
}
|
||||
else if (textId == TEXT_CARPET_SALESMAN_CUSTOM_FAIL_TO_BUY){
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId);
|
||||
}
|
||||
}
|
||||
if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) {
|
||||
|
@ -2775,17 +2774,17 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
|
|||
s16 gsCount = gSaveContext.inventory.gsTokens + (IS_RANDO ? 1 : 0);
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId);
|
||||
messageEntry.Replace("[[gsCount]]", std::to_string(gsCount));
|
||||
}
|
||||
}
|
||||
if (textId == TEXT_HEART_CONTAINER && CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts"), 0)) {
|
||||
}
|
||||
} else if ((IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0)) &&
|
||||
(textId == TEXT_BUY_BOMBCHUS_10_DESC || textId == TEXT_BUY_BOMBCHUS_10_PROMPT)) {
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId);
|
||||
} else if (textId == TEXT_HEART_CONTAINER && CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts"), 0)) {
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_HEART_CONTAINER);
|
||||
messageEntry.Replace("[[heartContainerCount]]", std::to_string(gSaveContext.sohStats.heartContainers + 1));
|
||||
}
|
||||
if (textId == TEXT_HEART_PIECE && CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts"), 0)) {
|
||||
} else if (textId == TEXT_HEART_PIECE && CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts"), 0)) {
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_HEART_PIECE);
|
||||
messageEntry.Replace("[[heartPieceCount]]", std::to_string(gSaveContext.sohStats.heartPieces + 1));
|
||||
}
|
||||
if (textId == TEXT_MARKET_GUARD_NIGHT && CVarGetInteger(CVAR_ENHANCEMENT("MarketSneak"), 0) && play->sceneNum == SCENE_MARKET_ENTRANCE_NIGHT) {
|
||||
} else if (textId == TEXT_MARKET_GUARD_NIGHT && CVarGetInteger(CVAR_ENHANCEMENT("MarketSneak"), 0) && play->sceneNum == SCENE_MARKET_ENTRANCE_NIGHT) {
|
||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_MARKET_GUARD_NIGHT);
|
||||
}
|
||||
if (textId == TEXT_FISHERMAN_LEAVE && CVarGetInteger(CVAR_ENHANCEMENT("QuitFishingAtDoor"), 0)) {
|
||||
|
|
|
@ -783,6 +783,11 @@ void DrawEnhancementsMenu() {
|
|||
UIWidgets::Tooltip("Explosions are now a static size, like in Majora's Mask and OoT3D. Makes bombchu hovering much easier.");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Prevent Bombchus Forcing First-Person", CVAR_ENHANCEMENT("DisableFirstPersonChus"), true, false);
|
||||
UIWidgets::Tooltip("Prevent bombchus from forcing the camera into first-person mode when released.");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Better Bombchu Shopping", CVAR_ENHANCEMENT("BetterBombchuShopping"), true, false,
|
||||
IS_RANDO, "This setting is forcefully enabled when you are playing a randomizer.", UIWidgets::CheckboxGraphics::Checkmark);
|
||||
UIWidgets::Tooltip("Bombchus do not sell out when bought, and a 10 pack of bombchus costs 99 rupees instead of 100."
|
||||
"\n"
|
||||
"Toggling while inside the shop will not change prices or restock any SOLD OUTs");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Aiming reticle for the bow/slingshot", CVAR_ENHANCEMENT("BowReticle"), true, false);
|
||||
UIWidgets::Tooltip("Aiming with a bow or slingshot will display a reticle as with the hookshot when the projectile is ready to fire.");
|
||||
if (UIWidgets::PaddedEnhancementCheckbox("Allow strength equipment to be toggled", CVAR_ENHANCEMENT("ToggleStrength"), true, false)) {
|
||||
|
@ -1034,7 +1039,7 @@ void DrawEnhancementsMenu() {
|
|||
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_ENABLE_BOMBCHU_DROPS) == 1;
|
||||
static const char* forceEnableBombchuDropsText =
|
||||
"This setting is forcefully enabled because a savefile\nwith \"Enable Bombchu Drops\" is loaded.";
|
||||
UIWidgets::PaddedEnhancementCheckbox("Enable Bombchu Drops", CVAR_ENHANCEMENT("BombchuDrops"), true, false,
|
||||
UIWidgets::PaddedEnhancementCheckbox("Enable Bombchu Drops", CVAR_ENHANCEMENT("EnableBombchuDrops"), true, false,
|
||||
forceEnableBombchuDrops, forceEnableBombchuDropsText, UIWidgets::CheckboxGraphics::Checkmark);
|
||||
UIWidgets::Tooltip("Bombchus will sometimes drop in place of bombs");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Trees Drop Sticks", CVAR_ENHANCEMENT("TreesDropSticks"), true, false);
|
||||
|
|
|
@ -152,7 +152,7 @@ extern "C" void OTRMessage_Init()
|
|||
"Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collecté %r[[gsCount]]%w symboles en tout!",
|
||||
TEXTBOX_TYPE_BLUE));
|
||||
CustomMessageManager::Instance->CreateMessage(
|
||||
customMessageTableID, TEXT_BUY_BOMBCHU_10_DESC,
|
||||
customMessageTableID, TEXT_BUY_BOMBCHUS_10_DESC,
|
||||
CustomMessage("\x08%rBombchu (10 pieces) 99 Rupees&%wThis looks like a toy mouse, but&it's actually a "
|
||||
"self-propelled time&bomb!\x09\x0A",
|
||||
"\x08%rKrabbelmine 10 Stück 99 Rubine&%wDas ist eine praktische Zeitbombe,&die Du als "
|
||||
|
@ -160,7 +160,7 @@ extern "C" void OTRMessage_Init()
|
|||
"\x08%rMissile 10 unités 99 Rubis&%wProfilée comme une souris&mécanique, cette arme est "
|
||||
"&destructrice!!!\x09\x0A"));
|
||||
CustomMessageManager::Instance->CreateMessage(
|
||||
customMessageTableID, TEXT_BUY_BOMBCHU_10_PROMPT,
|
||||
customMessageTableID, TEXT_BUY_BOMBCHUS_10_PROMPT,
|
||||
CustomMessage("\x08"
|
||||
"Bombchu 10 pieces 99 Rupees\x09&&\x1B%gBuy&Don't buy%w",
|
||||
"\x08Krabbelmine 10 Stück 99 Rubine\x09&&\x1B%gKaufen!&Nicht kaufen!%w",
|
||||
|
@ -187,4 +187,10 @@ extern "C" void OTRMessage_Init()
|
|||
CustomMessage("Hey! Hey!&You can't take the rod out of here!&I'm serious!^Do you want to quit?&\x1B&%gYes&No%w",
|
||||
"Hey! Hey!&Du kannst die Angel doch nicht&einfach mitnehmen!&Ganz im Ernst!^Möchtest du aufhören?&\x1B&%gJa&Nein%w", //TODO Used AI translation as placeholder
|
||||
"Holà! Holà!&Les cannes ne sortent pas d'ici!&Je suis sérieux!^Voulez-vous arrêter?&\x1B&%gOui&Non%w")); //TODO Used AI translation as placeholder
|
||||
CustomMessageManager::Instance->CreateMessage(
|
||||
customMessageTableID, TEXT_CARPET_SALESMAN_CUSTOM_FAIL_TO_BUY,
|
||||
CustomMessage("I'm sorry I can't sell you&these fine specimens,&they need an %rexperienced owner%w.^"
|
||||
"Come back when you have&had %gBombchus%w of your own.",
|
||||
"",
|
||||
""));
|
||||
}
|
||||
|
|
|
@ -1454,6 +1454,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, PlayState* play) {
|
|||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
}
|
||||
|
||||
// #region [Randomizer] [Enchancment]
|
||||
/**
|
||||
* Sometimes convert the given drop ID into a bombchu.
|
||||
* Returns the new drop type ID.
|
||||
|
@ -1483,6 +1484,7 @@ s16 EnItem00_ConvertBombDropToBombchu(s16 dropId) {
|
|||
}
|
||||
}
|
||||
}
|
||||
// #endregion
|
||||
|
||||
/**
|
||||
* Converts a given drop type ID based on link's current age, health and owned items.
|
||||
|
@ -1501,11 +1503,14 @@ s16 func_8001F404(s16 dropId) {
|
|||
}
|
||||
}
|
||||
|
||||
if ((CVarGetInteger(CVAR_ENHANCEMENT("BombchuDrops"), 0) ||
|
||||
// #region [Randomizer] [Enchancment]
|
||||
if ((CVarGetInteger(CVAR_ENHANCEMENT("EnableBombchuDrops"), 0) ||
|
||||
(IS_RANDO && Randomizer_GetSettingValue(RSK_ENABLE_BOMBCHU_DROPS) == 1)) &&
|
||||
(dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_B || dropId == ITEM00_BOMBS_SPECIAL)) {
|
||||
(dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_B || dropId == ITEM00_BOMBS_SPECIAL) &&
|
||||
(!IS_RANDO || Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) || INV_CONTENT(ITEM_BOMB) != ITEM_NONE)) {
|
||||
dropId = EnItem00_ConvertBombDropToBombchu(dropId);
|
||||
}
|
||||
// #endregion
|
||||
|
||||
// This is convoluted but it seems like it must be a single condition to match
|
||||
// clang-format off
|
||||
|
|
|
@ -1870,7 +1870,7 @@ void Randomizer_GameplayStats_SetTimestamp(uint16_t item) {
|
|||
return;
|
||||
}
|
||||
// Count any bombchu pack as bombchus
|
||||
if ((item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_DROP) || item == RG_PROGRESSIVE_BOMBCHUS) {
|
||||
if ((item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_20) || item == RG_PROGRESSIVE_BOMBCHUS) {
|
||||
if (gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] = 0) {
|
||||
gSaveContext.sohStats.itemTimestamp[ITEM_BOMBCHU] = time;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ void EnGirlA_Update(Actor* thisx, PlayState* play);
|
|||
|
||||
void EnGirlA_SetItemOutOfStock(PlayState* play, EnGirlA* this);
|
||||
void EnGirlA_UpdateStockedItem(PlayState* play, EnGirlA* this);
|
||||
void EnGirlA_InitializeItemAction(EnGirlA* this, PlayState* play);
|
||||
void EnGirlA_WaitForObject(EnGirlA* this, PlayState* play);
|
||||
void EnGirlA_Update2(EnGirlA* this, PlayState* play);
|
||||
void func_80A3C498(Actor* thisx, PlayState* play, s32 flags);
|
||||
void EnGirlA_Draw(Actor* thisx, PlayState* play);
|
||||
|
@ -213,7 +213,7 @@ static ShopItemEntry shopItemEntries[] = {
|
|||
/* SI_ZORA_TUNIC */
|
||||
{ OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, NULL, 300, 1, 0x00AB, 0x0094, GI_TUNIC_ZORA, EnGirlA_CanBuy_ZoraTunic,
|
||||
EnGirlA_ItemGive_ZoraTunic, EnGirlA_BuyEvent_ZoraTunic },
|
||||
/* SI_HEART */
|
||||
/* SI_RECOVERY_HEART */
|
||||
{ OBJECT_GI_HEART, GID_HEART, NULL, 10, 16, 0x00AC, 0x0095, GI_HEART, EnGirlA_CanBuy_Health,
|
||||
EnGirlA_ItemGive_Health, EnGirlA_BuyEvent_ShieldDiscount },
|
||||
/* SI_MILK_BOTTLE */
|
||||
|
@ -327,78 +327,139 @@ void EnGirlA_SetupAction(EnGirlA* this, EnGirlAActionFunc func) {
|
|||
this->actionFunc = func;
|
||||
}
|
||||
|
||||
s32 EnGirlA_TryChangeShopItem(EnGirlA* this, PlayState* play) {
|
||||
// #region SOH [Enhancement] [Randomizer]
|
||||
s32 EnGirlA_TryChangeShopItemShip(EnGirlA* this, PlayState* play) {
|
||||
if (!(IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0))){
|
||||
switch (this->actor.params) {
|
||||
case SI_BOMBCHU_10_2:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_06)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_10_3:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_07)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_3:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_08)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_4:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_09)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_10_4:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_0A)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_10_1:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_03)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_1:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_04)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_2:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_05)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (this->actor.params == SI_MILK_BOTTLE){
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_TALON_BOTTLE)) {
|
||||
this->actor.params = SI_RECOVERY_HEART;
|
||||
return true;
|
||||
}
|
||||
} else if (this->actor.params == SI_RANDOMIZED_ITEM) {
|
||||
ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(play->sceneNum, this->randoSlotIndex);
|
||||
if (Flags_GetRandomizerInf(shopItemIdentity.randomizerInf)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId);
|
||||
|
||||
// Undo the rotation for spiritual stones
|
||||
if (getItemEntry.getItemId >= RG_KOKIRI_EMERALD && getItemEntry.getItemId <= RG_ZORA_SAPPHIRE) {
|
||||
this->actor.shape.rot.y = this->actor.shape.rot.y - 20000;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// #endregion
|
||||
|
||||
s32 EnGirlA_TryChangeShopItem(EnGirlA* this) {
|
||||
switch (this->actor.params) {
|
||||
case SI_MILK_BOTTLE:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_TALON_BOTTLE)) {
|
||||
this->actor.params = SI_HEART;
|
||||
if (GET_ITEMGETINF(ITEMGETINF_TALON_BOTTLE)) {
|
||||
this->actor.params = SI_RECOVERY_HEART;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_10_2:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_06)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_06)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_10_3:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_07)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_07)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_3:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_08)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_08)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_4:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_09)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_09)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_10_4:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_0A)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_0A)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_10_1:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_03)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_03)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_1:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_04)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_04)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_BOMBCHU_20_2:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_05)) {
|
||||
if (GET_ITEMGETINF(ITEMGETINF_05)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SI_RANDOMIZED_ITEM: {
|
||||
ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(play->sceneNum, this->randoSlotIndex);
|
||||
if (Flags_GetRandomizerInf(shopItemIdentity.randomizerInf)) {
|
||||
this->actor.params = SI_SOLD_OUT;
|
||||
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId);
|
||||
|
||||
// Undo the rotation for spiritual stones
|
||||
if (getItemEntry.getItemId >= RG_KOKIRI_EMERALD && getItemEntry.getItemId <= RG_ZORA_SAPPHIRE) {
|
||||
this->actor.shape.rot.y = this->actor.shape.rot.y - 20000;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -413,12 +474,12 @@ void EnGirlA_InitItem(EnGirlA* this, PlayState* play) {
|
|||
osSyncPrintf("引数がおかしいよ(arg_data=%d)!!\n", this->actor.params);
|
||||
osSyncPrintf(VT_RST);
|
||||
assert((params >= SI_MAX) && (params < 0));
|
||||
//ASSERT(0, "0", "../z_en_girlA.c", 1421); zret assert, currently errors due to missing macro
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IS_RANDO || Randomizer_GetSettingValue(RSK_SHOPSANITY) == RO_SHOPSANITY_OFF) {
|
||||
this->objBankIndex = Object_GetIndex(&play->objectCtx, shopItemEntries[params].objID);
|
||||
} else {
|
||||
// #region [Randomizer]
|
||||
if (IS_RANDO && !Randomizer_GetSettingValue(RSK_SHOPSANITY) == RO_SHOPSANITY_OFF) {
|
||||
s16 objectId = shopItemEntries[params].objID;
|
||||
|
||||
if (params == SI_RANDOMIZED_ITEM) {
|
||||
|
@ -428,33 +489,48 @@ void EnGirlA_InitItem(EnGirlA* this, PlayState* play) {
|
|||
objectId = getItemEntry.objectId;
|
||||
}
|
||||
|
||||
this->objBankIndex = Object_GetIndex(&play->objectCtx, objectId);
|
||||
this->requiredObjectSlot = Object_GetIndex(&play->objectCtx, objectId);
|
||||
|
||||
// If the object isn't normally spawned by the shop scene, then spawn it now
|
||||
if (this->objBankIndex < 0) {
|
||||
this->objBankIndex = Object_Spawn(&play->objectCtx, objectId);
|
||||
if (this->requiredObjectSlot < 0) {
|
||||
this->requiredObjectSlot = Object_Spawn(&play->objectCtx, objectId);
|
||||
}
|
||||
}
|
||||
// #endregion
|
||||
else {
|
||||
this->requiredObjectSlot = Object_GetIndex(&play->objectCtx, shopItemEntries[params].objID);
|
||||
}
|
||||
|
||||
if (this->objBankIndex < 0) {
|
||||
if (this->requiredObjectSlot < 0) {
|
||||
Actor_Kill(&this->actor);
|
||||
osSyncPrintf(VT_COL(RED, WHITE));
|
||||
osSyncPrintf("バンクが無いよ!!(%s)\n", sShopItemDescriptions[params]);
|
||||
osSyncPrintf(VT_RST);
|
||||
assert(this->objBankIndex < 0);
|
||||
//ASSERT(0, "0", "../z_en_girlA.c", 1434); zret assert, currently errors due to missing macro
|
||||
return;
|
||||
}
|
||||
|
||||
this->actor.params = params;
|
||||
this->actionFunc2 = EnGirlA_InitializeItemAction;
|
||||
this->actionFunc2 = EnGirlA_WaitForObject;
|
||||
}
|
||||
|
||||
void EnGirlA_Init(Actor* thisx, PlayState* play) {
|
||||
EnGirlA* this = (EnGirlA*)thisx;
|
||||
// #region [Randomizer] [Enhancment]
|
||||
if (IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0)){
|
||||
EnGirlA* this = (EnGirlA*)thisx;
|
||||
|
||||
EnGirlA_TryChangeShopItem(this, play);
|
||||
EnGirlA_InitItem(this, play);
|
||||
osSyncPrintf("%s(%2d)初期設定\n", sShopItemDescriptions[this->actor.params], this->actor.params);
|
||||
EnGirlA_TryChangeShopItemShip(this, play);
|
||||
EnGirlA_InitItem(this, play);
|
||||
osSyncPrintf("%s(%2d)初期設定\n", sShopItemDescriptions[this->actor.params], this->actor.params);
|
||||
}
|
||||
// #endregion
|
||||
else {
|
||||
EnGirlA* this = (EnGirlA*)thisx;
|
||||
|
||||
EnGirlA_TryChangeShopItem(this);
|
||||
EnGirlA_InitItem(this, play);
|
||||
osSyncPrintf("%s(%2d)初期設定\n", sShopItemDescriptions[this->actor.params], this->actor.params);
|
||||
}
|
||||
}
|
||||
|
||||
void EnGirlA_Destroy(Actor* thisx, PlayState* play) {
|
||||
|
@ -1027,10 +1103,12 @@ void EnGirlA_BuyEvent_ObtainBombchuPack(PlayState* play, EnGirlA* this) {
|
|||
Rupees_ChangeBy(-this->basePrice);
|
||||
|
||||
// Normally, buying a bombchu pack sets a flag indicating the pack is now sold out
|
||||
// If we're in rando, skip setting that flag so they can be purchased repeatedly
|
||||
if (IS_RANDO) {
|
||||
// If they're in logic for rando, skip setting that flag so they can be purchased repeatedly
|
||||
// #region [Enhancment]
|
||||
if (IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0)) {
|
||||
return;
|
||||
}
|
||||
// #endregion
|
||||
|
||||
switch (this->actor.params) {
|
||||
case SI_BOMBCHU_10_2:
|
||||
|
@ -1145,21 +1223,35 @@ void EnGirlA_SetItemOutOfStock(PlayState* play, EnGirlA* this) {
|
|||
}
|
||||
|
||||
void EnGirlA_UpdateStockedItem(PlayState* play, EnGirlA* this) {
|
||||
ShopItemEntry* itemEntry;
|
||||
// #region [Randomizer] [Enhancment]
|
||||
if (IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0)){
|
||||
ShopItemEntry* itemEntry;
|
||||
if (EnGirlA_TryChangeShopItemShip(this, play)) {
|
||||
EnGirlA_InitItem(this, play);
|
||||
itemEntry = &shopItemEntries[this->actor.params];
|
||||
|
||||
if (EnGirlA_TryChangeShopItem(this, play)) {
|
||||
EnGirlA_InitItem(this, play);
|
||||
itemEntry = &shopItemEntries[this->actor.params];
|
||||
|
||||
if (this->actor.params == SI_RANDOMIZED_ITEM) {
|
||||
ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(play->sceneNum, this->randoSlotIndex);
|
||||
this->actor.textId = 0x9100 + (shopItemIdentity.randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1);
|
||||
if (this->actor.params == SI_RANDOMIZED_ITEM) {
|
||||
ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(play->sceneNum, this->randoSlotIndex);
|
||||
this->actor.textId = 0x9100 + (shopItemIdentity.randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1);
|
||||
} else {
|
||||
this->actor.textId = itemEntry->itemDescTextId;
|
||||
}
|
||||
} else {
|
||||
this->actor.textId = itemEntry->itemDescTextId;
|
||||
this->isInvisible = false;
|
||||
this->actor.draw = EnGirlA_Draw;
|
||||
}
|
||||
}
|
||||
// #endregion
|
||||
else {
|
||||
ShopItemEntry* itemEntry;
|
||||
if (EnGirlA_TryChangeShopItem(this)) {
|
||||
EnGirlA_InitItem(this, play);
|
||||
itemEntry = &shopItemEntries[this->actor.params];
|
||||
this->actor.textId = itemEntry->itemDescTextId;
|
||||
} else {
|
||||
this->isInvisible = false;
|
||||
this->actor.draw = EnGirlA_Draw;
|
||||
}
|
||||
} else {
|
||||
this->isInvisible = false;
|
||||
this->actor.draw = EnGirlA_Draw;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1178,13 +1270,13 @@ s32 EnGirlA_TrySetMaskItemDescription(EnGirlA* this, PlayState* play) {
|
|||
return false;
|
||||
}
|
||||
|
||||
void EnGirlA_InitializeItemAction(EnGirlA* this, PlayState* play) {
|
||||
void EnGirlA_WaitForObject(EnGirlA* this, PlayState* play) {
|
||||
s16 params = this->actor.params;
|
||||
ShopItemEntry* itemEntry = &shopItemEntries[params];
|
||||
|
||||
if (Object_IsLoaded(&play->objectCtx, this->objBankIndex)) {
|
||||
if (Object_IsLoaded(&play->objectCtx, this->requiredObjectSlot)) {
|
||||
this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED;
|
||||
this->actor.objBankIndex = this->objBankIndex;
|
||||
this->actor.objBankIndex = this->requiredObjectSlot;
|
||||
switch (this->actor.params) {
|
||||
case SI_KEATON_MASK:
|
||||
if (Flags_GetItemGetInf(ITEMGETINF_38)) {
|
||||
|
@ -1247,49 +1339,78 @@ void EnGirlA_InitializeItemAction(EnGirlA* this, PlayState* play) {
|
|||
if (!EnGirlA_TrySetMaskItemDescription(this, play)) {
|
||||
EnGirlA_SetItemDescription(play, this);
|
||||
}
|
||||
|
||||
this->setOutOfStockFunc = EnGirlA_SetItemOutOfStock;
|
||||
this->updateStockedItemFunc = EnGirlA_UpdateStockedItem;
|
||||
this->getItemId = itemEntry->getItemId;
|
||||
this->canBuyFunc = itemEntry->canBuyFunc;
|
||||
this->itemGiveFunc = itemEntry->itemGiveFunc;
|
||||
this->buyEventFunc = itemEntry->buyEventFunc;
|
||||
// If chus are in logic, make the 10 pack affordable without a wallet upgrade
|
||||
if (IS_RANDO && this->getItemId == GI_BOMBCHUS_10) {
|
||||
this->basePrice = 99;
|
||||
} else {
|
||||
this->basePrice = itemEntry->price;
|
||||
}
|
||||
this->itemCount = itemEntry->count;
|
||||
this->hiliteFunc = itemEntry->hiliteFunc;
|
||||
this->giDrawId = itemEntry->giDrawId;
|
||||
osSyncPrintf("%s(%2d)\n", sShopItemDescriptions[params], params);
|
||||
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
|
||||
Actor_SetScale(&this->actor, 0.25f);
|
||||
this->actor.shape.yOffset = 24.0f;
|
||||
this->actor.shape.shadowScale = 4.0f;
|
||||
this->actor.floorHeight = this->actor.home.pos.y;
|
||||
this->actor.gravity = 0.0f;
|
||||
EnGirlA_SetupAction(this, EnGirlA_Noop);
|
||||
this->isInitialized = true;
|
||||
this->actionFunc2 = EnGirlA_Update2;
|
||||
this->isSelected = false;
|
||||
this->yRotation = 0;
|
||||
this->yRotationInit = this->actor.shape.rot.y;
|
||||
|
||||
if (params == SI_RANDOMIZED_ITEM) {
|
||||
ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(play->sceneNum, this->randoSlotIndex);
|
||||
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId);
|
||||
this->actor.textId = 0x9100 + (shopItemIdentity.randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1);
|
||||
this->itemBuyPromptTextId = 0x9100 + ((shopItemIdentity.randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1) + NUM_SHOP_ITEMS);
|
||||
this->getItemId = getItemEntry.getItemId;
|
||||
this->basePrice = shopItemIdentity.itemPrice;
|
||||
this->giDrawId = getItemEntry.gid;
|
||||
|
||||
// Correct the rotation for spiritual stones, but only if mysterious shuffle isn't on, else it's obvious what's there in shops
|
||||
if (!CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0) && (getItemEntry.getItemId >= RG_KOKIRI_EMERALD && getItemEntry.getItemId <= RG_ZORA_SAPPHIRE)) {
|
||||
this->actor.shape.rot.y = this->actor.shape.rot.y + 20000;
|
||||
// #region [Enhancment] [Randomizer]
|
||||
if (IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0)) {
|
||||
this->setOutOfStockFunc = EnGirlA_SetItemOutOfStock;
|
||||
this->updateStockedItemFunc = EnGirlA_UpdateStockedItem;
|
||||
this->getItemId = itemEntry->getItemId;
|
||||
this->canBuyFunc = itemEntry->canBuyFunc;
|
||||
this->itemGiveFunc = itemEntry->itemGiveFunc;
|
||||
this->buyEventFunc = itemEntry->buyEventFunc;
|
||||
// If Better Bombchu Shopping is on, make the 10 pack affordable without a wallet upgrade
|
||||
if (this->getItemId == GI_BOMBCHUS_10) {
|
||||
this->basePrice = 99;
|
||||
}
|
||||
else {
|
||||
this->basePrice = itemEntry->price;
|
||||
}
|
||||
this->itemCount = itemEntry->count;
|
||||
this->hiliteFunc = itemEntry->hiliteFunc;
|
||||
this->giDrawId = itemEntry->giDrawId;
|
||||
osSyncPrintf("%s(%2d)\n", sShopItemDescriptions[params], params);
|
||||
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
|
||||
Actor_SetScale(&this->actor, 0.25f);
|
||||
this->actor.shape.yOffset = 24.0f;
|
||||
this->actor.shape.shadowScale = 4.0f;
|
||||
this->actor.floorHeight = this->actor.home.pos.y;
|
||||
this->actor.gravity = 0.0f;
|
||||
EnGirlA_SetupAction(this, EnGirlA_Noop);
|
||||
this->isInitialized = true;
|
||||
this->actionFunc2 = EnGirlA_Update2;
|
||||
this->isSelected = false;
|
||||
this->yRotation = 0;
|
||||
this->yRotationInit = this->actor.shape.rot.y;
|
||||
|
||||
if (params == SI_RANDOMIZED_ITEM) {
|
||||
ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(play->sceneNum, this->randoSlotIndex);
|
||||
GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId);
|
||||
this->actor.textId = 0x9100 + (shopItemIdentity.randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1);
|
||||
this->itemBuyPromptTextId = 0x9100 + ((shopItemIdentity.randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1) + NUM_SHOP_ITEMS);
|
||||
this->getItemId = getItemEntry.getItemId;
|
||||
this->basePrice = shopItemIdentity.itemPrice;
|
||||
this->giDrawId = getItemEntry.gid;
|
||||
|
||||
// Correct the rotation for spiritual stones, but only if mysterious shuffle isn't on, else it's obvious what's there in shops
|
||||
if (!CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0) && (getItemEntry.getItemId >= RG_KOKIRI_EMERALD && getItemEntry.getItemId <= RG_ZORA_SAPPHIRE)) {
|
||||
this->actor.shape.rot.y = this->actor.shape.rot.y + 20000;
|
||||
}
|
||||
}
|
||||
}
|
||||
// #endregion
|
||||
else {
|
||||
this->setOutOfStockFunc = EnGirlA_SetItemOutOfStock;
|
||||
this->updateStockedItemFunc = EnGirlA_UpdateStockedItem;
|
||||
this->getItemId = itemEntry->getItemId;
|
||||
this->canBuyFunc = itemEntry->canBuyFunc;
|
||||
this->itemGiveFunc = itemEntry->itemGiveFunc;
|
||||
this->buyEventFunc = itemEntry->buyEventFunc;
|
||||
this->basePrice = itemEntry->price;
|
||||
this->itemCount = itemEntry->count;
|
||||
this->hiliteFunc = itemEntry->hiliteFunc;
|
||||
this->giDrawId = itemEntry->giDrawId;
|
||||
osSyncPrintf("%s(%2d)\n", sShopItemDescriptions[params], params);
|
||||
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
|
||||
Actor_SetScale(&this->actor, 0.25f);
|
||||
this->actor.shape.yOffset = 24.0f;
|
||||
this->actor.shape.shadowScale = 4.0f;
|
||||
this->actor.floorHeight = this->actor.home.pos.y;
|
||||
this->actor.gravity = 0.0f;
|
||||
EnGirlA_SetupAction(this, EnGirlA_Noop);
|
||||
this->isInitialized = true;
|
||||
this->actionFunc2 = EnGirlA_Update2;
|
||||
this->isSelected = false;
|
||||
this->yRotation = 0;
|
||||
this->yRotationInit = this->actor.shape.rot.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ typedef struct EnGirlA {
|
|||
/* 0x0000 */ Actor actor;
|
||||
/* 0x014C */ SkelAnime skelAnime;
|
||||
/* 0x0190 */ EnGirlAActionFunc actionFunc;
|
||||
/* 0x0194 */ s8 objBankIndex;
|
||||
/* 0x0194 */ s8 requiredObjectSlot;
|
||||
/* 0x0198 */ EnGirlAActionFunc actionFunc2;
|
||||
/* 0x019C */ s32 isInitialized;
|
||||
/* 0x01A0 */ s16 itemBuyPromptTextId;
|
||||
|
@ -53,7 +53,7 @@ typedef enum {
|
|||
/* 0x0D */ SI_DEKU_SHIELD,
|
||||
/* 0x0E */ SI_GORON_TUNIC,
|
||||
/* 0x0F */ SI_ZORA_TUNIC,
|
||||
/* 0x10 */ SI_HEART,
|
||||
/* 0x10 */ SI_RECOVERY_HEART,
|
||||
/* 0x11 */ SI_MILK_BOTTLE,
|
||||
/* 0x12 */ SI_WEIRD_EGG,
|
||||
/* 0x13 */ SI_19,
|
||||
|
|
|
@ -131,7 +131,8 @@ void func_80A89160(EnJs* this, PlayState* play) {
|
|||
if (Actor_HasParent(&this->actor, play) || !GameInteractor_Should(VB_GIVE_ITEM_FROM_CARPET_SALESMAN, true, this)) {
|
||||
this->actor.parent = NULL;
|
||||
En_Js_SetupAction(this, func_80A8910C);
|
||||
Flags_SetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN);
|
||||
// Moved into the text handling to patch a text bug, not a great solution though
|
||||
// Flags_SetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN);
|
||||
} else {
|
||||
GetItemEntry itemEntry = ItemTable_Retrieve(GI_BOMBCHUS_10);
|
||||
gSaveContext.pendingSale = itemEntry.itemId;
|
||||
|
@ -148,8 +149,14 @@ void func_80A891C4(EnJs* this, PlayState* play) {
|
|||
Message_ContinueTextbox(play, 0x6075);
|
||||
func_80A89008(this);
|
||||
} else {
|
||||
Rupees_ChangeBy(-200);
|
||||
En_Js_SetupAction(this, func_80A89160);
|
||||
if (GameInteractor_Should(VB_GIVE_BOMBCHUS_FROM_CARPET_SALESMAN, true, this) ||
|
||||
(Actor_HasParent(&this->actor, play) || !GameInteractor_Should(VB_GIVE_ITEM_FROM_CARPET_SALESMAN, true, this))){
|
||||
Rupees_ChangeBy(-200);
|
||||
En_Js_SetupAction(this, func_80A89160);
|
||||
} else{
|
||||
Message_ContinueTextbox(play, 0x6073);
|
||||
func_80A89008(this);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1: // no
|
||||
|
|
|
@ -206,7 +206,7 @@ ShopItem sShopkeeperStores[][8] = {
|
|||
{ SI_DEKU_SEEDS_30, -50, 52, -20 },
|
||||
{ SI_ARROWS_10, -50, 76, -20 },
|
||||
{ SI_ARROWS_30, -80, 52, -3 },
|
||||
{ SI_HEART, -80, 76, -3 } },
|
||||
{ SI_RECOVERY_HEART, -80, 76, -3 } },
|
||||
|
||||
{ { SI_GREEN_POTION, 50, 52, -20 },
|
||||
{ SI_BLUE_FIRE, 50, 76, -20 },
|
||||
|
@ -238,7 +238,7 @@ ShopItem sShopkeeperStores[][8] = {
|
|||
{ { SI_HYLIAN_SHIELD, 50, 52, -20 },
|
||||
{ SI_BOMBS_5_R35, 50, 76, -20 },
|
||||
{ SI_DEKU_NUTS_5, 80, 52, -3 },
|
||||
{ SI_HEART, 80, 76, -3 },
|
||||
{ SI_RECOVERY_HEART, 80, 76, -3 },
|
||||
{ SI_ARROWS_10, -50, 52, -20 },
|
||||
{ SI_ARROWS_50, -50, 76, -20 },
|
||||
{ SI_DEKU_STICK, -80, 52, -3 },
|
||||
|
@ -247,7 +247,7 @@ ShopItem sShopkeeperStores[][8] = {
|
|||
{ { SI_HYLIAN_SHIELD, 50, 52, -20 },
|
||||
{ SI_BOMBS_5_R25, 50, 76, -20 },
|
||||
{ SI_DEKU_NUTS_5, 80, 52, -3 },
|
||||
{ SI_HEART, 80, 76, -3 },
|
||||
{ SI_RECOVERY_HEART, 80, 76, -3 },
|
||||
{ SI_ARROWS_10, -50, 52, -20 },
|
||||
{ SI_ARROWS_50, -50, 76, -20 },
|
||||
{ SI_DEKU_STICK, -80, 52, -3 },
|
||||
|
@ -256,15 +256,15 @@ ShopItem sShopkeeperStores[][8] = {
|
|||
{ { SI_MILK_BOTTLE, 50, 52, -20 },
|
||||
{ SI_DEKU_NUTS_5, 50, 76, -20 },
|
||||
{ SI_DEKU_NUTS_10, 80, 52, -3 },
|
||||
{ SI_HEART, 80, 76, -3 },
|
||||
{ SI_RECOVERY_HEART, 80, 76, -3 },
|
||||
{ SI_WEIRD_EGG, -50, 52, -20 },
|
||||
{ SI_DEKU_STICK, -50, 76, -20 },
|
||||
{ SI_HEART, -80, 52, -3 },
|
||||
{ SI_HEART, -80, 76, -3 } },
|
||||
{ SI_RECOVERY_HEART, -80, 52, -3 },
|
||||
{ SI_RECOVERY_HEART, -80, 76, -3 } },
|
||||
|
||||
{ { SI_ZORA_TUNIC, 50, 52, -20 },
|
||||
{ SI_ARROWS_10, 50, 76, -20 },
|
||||
{ SI_HEART, 80, 52, -3 },
|
||||
{ SI_RECOVERY_HEART, 80, 52, -3 },
|
||||
{ SI_ARROWS_30, 80, 76, -3 },
|
||||
{ SI_DEKU_NUTS_5, -50, 52, -20 },
|
||||
{ SI_ARROWS_50, -50, 76, -20 },
|
||||
|
@ -276,9 +276,9 @@ ShopItem sShopkeeperStores[][8] = {
|
|||
{ SI_BOMBS_20, 80, 52, -3 },
|
||||
{ SI_BOMBS_30, 80, 76, -3 },
|
||||
{ SI_GORON_TUNIC, -50, 52, -20 },
|
||||
{ SI_HEART, -50, 76, -20 },
|
||||
{ SI_RECOVERY_HEART, -50, 76, -20 },
|
||||
{ SI_RED_POTION_R40, -80, 52, -3 },
|
||||
{ SI_HEART, -80, 76, -3 } },
|
||||
{ SI_RECOVERY_HEART, -80, 76, -3 } },
|
||||
|
||||
{ { SI_19, 50, 52, -20 },
|
||||
{ SI_19, 50, 76, -20 },
|
||||
|
|
Loading…
Reference in New Issue