mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-12-25 09:39:00 -05:00
Merge pull request #1205 from lilDavid/bombchu-logic
Add Bombchus in Logic option
This commit is contained in:
commit
b370e3f9b2
@ -1,6 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
TEXT_BUY_BOMBCHU_10_PROMPT = 0x8C,
|
||||||
|
TEXT_BUY_BOMBCHU_10_DESC = 0xBC,
|
||||||
TEXT_GS_NO_FREEZE = 0xB4,
|
TEXT_GS_NO_FREEZE = 0xB4,
|
||||||
TEXT_GS_FREEZE = 0xB5,
|
TEXT_GS_FREEZE = 0xB5,
|
||||||
TEXT_RANDOMIZER_CUSTOM_ITEM = 0xF8,
|
TEXT_RANDOMIZER_CUSTOM_ITEM = 0xF8,
|
||||||
|
@ -2561,6 +2561,9 @@ namespace Settings {
|
|||||||
|
|
||||||
MapsAndCompasses.SetSelectedIndex(cvarSettings[RSK_STARTING_MAPS_COMPASSES]);
|
MapsAndCompasses.SetSelectedIndex(cvarSettings[RSK_STARTING_MAPS_COMPASSES]);
|
||||||
|
|
||||||
|
BombchusInLogic.SetSelectedIndex(cvarSettings[RSK_BOMBCHUS_IN_LOGIC]);
|
||||||
|
AmmoDrops.SetSelectedIndex(AMMODROPS_VANILLA); // Ensure logic knows bombchu drops aren't implemented yet
|
||||||
|
|
||||||
StartingConsumables.SetSelectedIndex(cvarSettings[RSK_STARTING_CONSUMABLES]);
|
StartingConsumables.SetSelectedIndex(cvarSettings[RSK_STARTING_CONSUMABLES]);
|
||||||
StartingMaxRupees.SetSelectedIndex(cvarSettings[RSK_FULL_WALLETS]);
|
StartingMaxRupees.SetSelectedIndex(cvarSettings[RSK_FULL_WALLETS]);
|
||||||
|
|
||||||
|
@ -575,6 +575,7 @@ std::unordered_map<std::string, RandomizerSettingKey> SpoilerfileSettingNameToEn
|
|||||||
{ "Shuffle Dungeon Items:Gerudo Fortress Keys", RSK_GERUDO_KEYS },
|
{ "Shuffle Dungeon Items:Gerudo Fortress Keys", RSK_GERUDO_KEYS },
|
||||||
{ "Shuffle Dungeon Items:Boss Keys", RSK_BOSS_KEYSANITY },
|
{ "Shuffle Dungeon Items:Boss Keys", RSK_BOSS_KEYSANITY },
|
||||||
{ "Shuffle Dungeon Items:Ganon's Boss Key", RSK_GANONS_BOSS_KEY },
|
{ "Shuffle Dungeon Items:Ganon's Boss Key", RSK_GANONS_BOSS_KEY },
|
||||||
|
{ "World Settings:Bombchus in Logic", RSK_BOMBCHUS_IN_LOGIC },
|
||||||
{ "Misc Settings:Gossip Stone Hints", RSK_GOSSIP_STONE_HINTS },
|
{ "Misc Settings:Gossip Stone Hints", RSK_GOSSIP_STONE_HINTS },
|
||||||
{ "Misc Settings:Hint Clarity", RSK_HINT_CLARITY },
|
{ "Misc Settings:Hint Clarity", RSK_HINT_CLARITY },
|
||||||
{ "Misc Settings:Hint Distribution", RSK_HINT_DISTRIBUTION },
|
{ "Misc Settings:Hint Distribution", RSK_HINT_DISTRIBUTION },
|
||||||
@ -816,6 +817,7 @@ void Randomizer::ParseRandomizerSettingsFile(const char* spoilerFileName) {
|
|||||||
case RSK_STARTING_KOKIRI_SWORD:
|
case RSK_STARTING_KOKIRI_SWORD:
|
||||||
case RSK_COMPLETE_MASK_QUEST:
|
case RSK_COMPLETE_MASK_QUEST:
|
||||||
case RSK_ENABLE_GLITCH_CUTSCENES:
|
case RSK_ENABLE_GLITCH_CUTSCENES:
|
||||||
|
case RSK_BOMBCHUS_IN_LOGIC:
|
||||||
if(it.value() == "Off") {
|
if(it.value() == "Off") {
|
||||||
gSaveContext.randoSettings[index].value = 0;
|
gSaveContext.randoSettings[index].value = 0;
|
||||||
} else if(it.value() == "On") {
|
} else if(it.value() == "On") {
|
||||||
@ -1392,7 +1394,13 @@ s16 Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) {
|
|||||||
return GI_RUPEE_BLUE;
|
return GI_RUPEE_BLUE;
|
||||||
|
|
||||||
case RG_PROGRESSIVE_BOMBCHUS:
|
case RG_PROGRESSIVE_BOMBCHUS:
|
||||||
return GI_BOMBCHUS_20; //todo progressive?
|
if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) {
|
||||||
|
return GI_BOMBCHUS_20;
|
||||||
|
}
|
||||||
|
if (AMMO(ITEM_BOMBCHU) < 5) {
|
||||||
|
return GI_BOMBCHUS_10;
|
||||||
|
}
|
||||||
|
return GI_BOMBCHUS_5;
|
||||||
|
|
||||||
case RG_PROGRESSIVE_MAGIC_METER:
|
case RG_PROGRESSIVE_MAGIC_METER:
|
||||||
switch (gSaveContext.magicLevel) {
|
switch (gSaveContext.magicLevel) {
|
||||||
@ -3074,6 +3082,7 @@ void GenerateRandomizerImgui() {
|
|||||||
cvarSettings[RSK_SHUFFLE_COWS] = CVar_GetS32("gRandomizeShuffleCows", 0);
|
cvarSettings[RSK_SHUFFLE_COWS] = CVar_GetS32("gRandomizeShuffleCows", 0);
|
||||||
cvarSettings[RSK_SHUFFLE_ADULT_TRADE] = CVar_GetS32("gRandomizeShuffleAdultTrade", 0);
|
cvarSettings[RSK_SHUFFLE_ADULT_TRADE] = CVar_GetS32("gRandomizeShuffleAdultTrade", 0);
|
||||||
cvarSettings[RSK_SHUFFLE_MAGIC_BEANS] = CVar_GetS32("gRandomizeShuffleBeans", 0);
|
cvarSettings[RSK_SHUFFLE_MAGIC_BEANS] = CVar_GetS32("gRandomizeShuffleBeans", 0);
|
||||||
|
cvarSettings[RSK_BOMBCHUS_IN_LOGIC] = CVar_GetS32("gRandomizeBombchusInLogic", 0);
|
||||||
cvarSettings[RSK_SKIP_CHILD_ZELDA] = CVar_GetS32("gRandomizeSkipChildZelda", 0);
|
cvarSettings[RSK_SKIP_CHILD_ZELDA] = CVar_GetS32("gRandomizeSkipChildZelda", 0);
|
||||||
|
|
||||||
// if we skip child zelda, we start with zelda's letter, and malon starts
|
// if we skip child zelda, we start with zelda's letter, and malon starts
|
||||||
@ -3877,7 +3886,18 @@ void DrawRandoEditor(bool& open) {
|
|||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
window->DC.CurrLineTextBaseOffset = 0.0f;
|
window->DC.CurrLineTextBaseOffset = 0.0f;
|
||||||
ImGui::PushItemWidth(-FLT_MIN);
|
ImGui::PushItemWidth(-FLT_MIN);
|
||||||
ImGui::Text("Coming soon");
|
|
||||||
|
// Bombchus in Logic
|
||||||
|
SohImGui::EnhancementCheckbox(Settings::BombchusInLogic.GetName().c_str(), "gRandomizeBombchusInLogic");
|
||||||
|
InsertHelpHoverText(
|
||||||
|
"Bombchus are properly considered in logic.\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"
|
||||||
|
"Once found, they can be replenished at the Bombchu shop.\n"
|
||||||
|
"\n"
|
||||||
|
"Bombchu Bowling is opened by obtaining Bombchus."
|
||||||
|
);
|
||||||
|
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
|
@ -1017,7 +1017,8 @@ typedef enum {
|
|||||||
RSK_ENABLE_GLITCH_CUTSCENES,
|
RSK_ENABLE_GLITCH_CUTSCENES,
|
||||||
RSK_SKULLS_SUNS_SONG,
|
RSK_SKULLS_SUNS_SONG,
|
||||||
RSK_SHUFFLE_ADULT_TRADE,
|
RSK_SHUFFLE_ADULT_TRADE,
|
||||||
RSK_SHUFFLE_MAGIC_BEANS
|
RSK_SHUFFLE_MAGIC_BEANS,
|
||||||
|
RSK_BOMBCHUS_IN_LOGIC
|
||||||
} RandomizerSettingKey;
|
} RandomizerSettingKey;
|
||||||
|
|
||||||
typedef struct ScrubIdentity {
|
typedef struct ScrubIdentity {
|
||||||
|
@ -1730,6 +1730,9 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) {
|
|||||||
messageEntry = Randomizer_GetNaviMessage();
|
messageEntry = Randomizer_GetNaviMessage();
|
||||||
} else if (Randomizer_GetSettingValue(RSK_SHUFFLE_MAGIC_BEANS) && textId == TEXT_BEAN_SALESMAN) {
|
} else if (Randomizer_GetSettingValue(RSK_SHUFFLE_MAGIC_BEANS) && textId == TEXT_BEAN_SALESMAN) {
|
||||||
messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN);
|
messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN);
|
||||||
|
} else if (Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) &&
|
||||||
|
(textId == TEXT_BUY_BOMBCHU_10_DESC || textId == TEXT_BUY_BOMBCHU_10_PROMPT)) {
|
||||||
|
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) {
|
if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) {
|
||||||
|
@ -111,5 +111,25 @@ extern "C" void OTRMessage_Init()
|
|||||||
TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM,
|
TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM,
|
||||||
"You got a %rGold Skulltula Token%w!&You've collected %r\x19%w tokens&in total!",
|
"You got a %rGold Skulltula Token%w!&You've collected %r\x19%w tokens&in total!",
|
||||||
"Du erhälst ein %rGoldene&Skulltula-Symbol%w! Du hast&insgesamt %r\x19%w symbol gesammelt!",
|
"Du erhälst ein %rGoldene&Skulltula-Symbol%w! Du hast&insgesamt %r\x19%w symbol gesammelt!",
|
||||||
"Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collecté %r\x19\%w symboles en tout!" });
|
"Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collecté %r\x19\%w symboles en tout!"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
CustomMessageManager::Instance->CreateMessage(
|
||||||
|
customMessageTableID, TEXT_BUY_BOMBCHU_10_DESC,
|
||||||
|
{
|
||||||
|
TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM,
|
||||||
|
"\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 Distanzwaffe&einsetzen kannst!\x09\x0A",
|
||||||
|
"\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,
|
||||||
|
{
|
||||||
|
TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM,
|
||||||
|
"\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",
|
||||||
|
"\x08Missiles 10 unités 99 Rubis\x09&&\x1B%gAcheter&Ne pas acheter%w",
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -143,13 +143,15 @@ void EnBomBowMan_BlinkAwake(EnBomBowlMan* this, GlobalContext* globalCtx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for Bomb Bag if Rando is enabled
|
// In randomizer, only check for bomb bag when bombchus aren't in logic
|
||||||
// RANDOTODO: Check for bombchu pack instead of bomb bag if bombchus are in logic
|
// and only check for bombchus when bombchus are in logic
|
||||||
if (gSaveContext.n64ddFlag) {
|
if (gSaveContext.n64ddFlag) {
|
||||||
if (INV_CONTENT(ITEM_BOMB) != ITEM_NONE) {
|
u8 bombchusInLogic = Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC);
|
||||||
this->actor.textId = 0xBF;
|
if ((!bombchusInLogic && INV_CONTENT(ITEM_BOMB) == ITEM_NONE) ||
|
||||||
} else {
|
(bombchusInLogic && INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE)) {
|
||||||
this->actor.textId = 0x7058;
|
this->actor.textId = 0x7058;
|
||||||
|
} else {
|
||||||
|
this->actor.textId = 0xBF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -177,11 +179,17 @@ void EnBomBowMan_CheckBeatenDC(EnBomBowlMan* this, GlobalContext* globalCtx) {
|
|||||||
this->eyeMode = CHU_GIRL_EYES_AWAKE;
|
this->eyeMode = CHU_GIRL_EYES_AWAKE;
|
||||||
this->blinkTimer = (s16)Rand_ZeroFloat(60.0f) + 20;
|
this->blinkTimer = (s16)Rand_ZeroFloat(60.0f) + 20;
|
||||||
|
|
||||||
// Check for beaten Dodongo's Cavern if not rando'd
|
bool bombchuBowlingClosed;
|
||||||
// check for bomb bag if rando'd
|
if (gSaveContext.n64ddFlag) {
|
||||||
if ((!gSaveContext.n64ddFlag &&
|
// when rando'd, check if we have bombchus if chus are in logic
|
||||||
!((gSaveContext.eventChkInf[2] & 0x20) || BREG(2))) ||
|
// and check if we have a bomb bag if chus aren't in logic
|
||||||
(gSaveContext.n64ddFlag && (INV_CONTENT(ITEM_BOMB) == ITEM_NONE))) {
|
u8 explosive = Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) ? ITEM_BOMBCHU : ITEM_BOMB;
|
||||||
|
bombchuBowlingClosed = (INV_CONTENT(explosive) == ITEM_NONE);
|
||||||
|
} else {
|
||||||
|
// if not rando'd, check if we have beaten Dodongo's Cavern
|
||||||
|
bombchuBowlingClosed = !((gSaveContext.eventChkInf[2] & 0x20) || BREG(2));
|
||||||
|
}
|
||||||
|
if (bombchuBowlingClosed) {
|
||||||
this->actionFunc = EnBomBowMan_WaitNotBeatenDC;
|
this->actionFunc = EnBomBowMan_WaitNotBeatenDC;
|
||||||
} else {
|
} else {
|
||||||
this->actor.textId = 0x18;
|
this->actor.textId = 0x18;
|
||||||
|
@ -633,8 +633,16 @@ s32 EnGirlA_CanBuy_Unk20(GlobalContext* globalCtx, EnGirlA* this) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
s32 EnGirlA_CanBuy_Bombchus(GlobalContext* globalCtx, EnGirlA* this) {
|
s32 EnGirlA_CanBuy_Bombchus(GlobalContext* globalCtx, EnGirlA* this) {
|
||||||
// When in rando, don't allow buying bombchus when the player doesn't have a bomb bag
|
// When in rando, don't allow buying bombchus when the player doesn't have required explosives
|
||||||
if (AMMO(ITEM_BOMBCHU) >= 50 || (gSaveContext.n64ddFlag && CUR_CAPACITY(UPG_BOMB_BAG) == 0)) {
|
// If bombchus are in logic, the player needs to have bombchus; otherwise they need a bomb bag
|
||||||
|
if (gSaveContext.n64ddFlag) {
|
||||||
|
u8 bombchusInLogic = Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC);
|
||||||
|
if ((!bombchusInLogic && CUR_CAPACITY(UPG_BOMB_BAG) == 0) ||
|
||||||
|
(bombchusInLogic && INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE)) {
|
||||||
|
return CANBUY_RESULT_CANT_GET_NOW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (AMMO(ITEM_BOMBCHU) >= 50) {
|
||||||
return CANBUY_RESULT_CANT_GET_NOW;
|
return CANBUY_RESULT_CANT_GET_NOW;
|
||||||
}
|
}
|
||||||
if (gSaveContext.rupees < this->basePrice) {
|
if (gSaveContext.rupees < this->basePrice) {
|
||||||
@ -861,6 +869,14 @@ void EnGirlA_BuyEvent_ZoraTunic(GlobalContext* globalCtx, EnGirlA* this) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EnGirlA_BuyEvent_ObtainBombchuPack(GlobalContext* globalCtx, EnGirlA* this) {
|
void EnGirlA_BuyEvent_ObtainBombchuPack(GlobalContext* globalCtx, EnGirlA* this) {
|
||||||
|
Rupees_ChangeBy(-this->basePrice);
|
||||||
|
|
||||||
|
// Normally, buying a bombchu pack sets a flag indicating the pack is now sold out
|
||||||
|
// If they're in logic for rando, skip setting that flag so they can be purchased repeatedly
|
||||||
|
if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (this->actor.params) {
|
switch (this->actor.params) {
|
||||||
case SI_BOMBCHU_10_2:
|
case SI_BOMBCHU_10_2:
|
||||||
gSaveContext.itemGetInf[0] |= 0x40;
|
gSaveContext.itemGetInf[0] |= 0x40;
|
||||||
@ -887,7 +903,6 @@ void EnGirlA_BuyEvent_ObtainBombchuPack(GlobalContext* globalCtx, EnGirlA* this)
|
|||||||
gSaveContext.itemGetInf[0] |= 0x20;
|
gSaveContext.itemGetInf[0] |= 0x20;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Rupees_ChangeBy(-this->basePrice);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnGirlA_Noop(EnGirlA* this, GlobalContext* globalCtx) {
|
void EnGirlA_Noop(EnGirlA* this, GlobalContext* globalCtx) {
|
||||||
@ -1053,7 +1068,13 @@ void EnGirlA_InitializeItemAction(EnGirlA* this, GlobalContext* globalCtx) {
|
|||||||
this->canBuyFunc = itemEntry->canBuyFunc;
|
this->canBuyFunc = itemEntry->canBuyFunc;
|
||||||
this->itemGiveFunc = itemEntry->itemGiveFunc;
|
this->itemGiveFunc = itemEntry->itemGiveFunc;
|
||||||
this->buyEventFunc = itemEntry->buyEventFunc;
|
this->buyEventFunc = itemEntry->buyEventFunc;
|
||||||
|
// If chus are in logic, make the 10 pack affordable without a wallet upgrade
|
||||||
|
if (gSaveContext.n64ddFlag && Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) &&
|
||||||
|
this->getItemId == GI_BOMBCHUS_10) {
|
||||||
|
this->basePrice = 99;
|
||||||
|
} else {
|
||||||
this->basePrice = itemEntry->price;
|
this->basePrice = itemEntry->price;
|
||||||
|
}
|
||||||
this->itemCount = itemEntry->count;
|
this->itemCount = itemEntry->count;
|
||||||
this->hiliteFunc = itemEntry->hiliteFunc;
|
this->hiliteFunc = itemEntry->hiliteFunc;
|
||||||
this->giDrawId = itemEntry->giDrawId;
|
this->giDrawId = itemEntry->giDrawId;
|
||||||
|
Loading…
Reference in New Issue
Block a user