summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbriaguya <70942617+briaguya-ai@users.noreply.github.com>2022-12-13 21:57:59 -0500
committerGitHub <noreply@github.com>2022-12-13 21:57:59 -0500
commite71583d47c1d0e4346e8839e8fa65bf4de5a91eb (patch)
treea7298a361adca39fda4366ddabd8d7fc72c52378
parent5965cdb19345c42b890423ec4f5abce00145ac30 (diff)
fix: populate merchant prices table with expensive scrub prices (#2181)
* fix: populate merchant prices with vanilla scrub prices * temporary expensive scrub workaround Co-authored-by: briaguya <briaguya@alice>
-rw-r--r--soh/soh/Enhancements/randomizer/randomizer.cpp64
-rw-r--r--soh/soh/Enhancements/randomizer/randomizer.h1
-rw-r--r--soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c7
3 files changed, 71 insertions, 1 deletions
diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp
index 1302ac4de..bb58d3240 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.cpp
+++ b/soh/soh/Enhancements/randomizer/randomizer.cpp
@@ -1162,6 +1162,65 @@ void Randomizer::ParseMasterQuestDungeonsFile(const char* spoilerFileName) {
}
}
+int16_t Randomizer::GetVanillaMerchantPrice(RandomizerCheck check) {
+ switch (check) {
+ case RC_HF_DEKU_SCRUB_GROTTO:
+ return 10;
+ case RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT:
+ case RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS:
+ case RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR:
+ return 15;
+ case RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT:
+ case RC_LH_DEKU_SCRUB_GROTTO_LEFT:
+ case RC_GC_DEKU_SCRUB_GROTTO_LEFT:
+ case RC_DMC_DEKU_SCRUB_GROTTO_LEFT:
+ case RC_LLR_DEKU_SCRUB_GROTTO_LEFT:
+ case RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT:
+ case RC_JABU_JABUS_BELLY_DEKU_SCRUB:
+ case RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT:
+ return 20;
+ case RC_LW_DEKU_SCRUB_NEAR_BRIDGE:
+ case RC_LW_DEKU_SCRUB_GROTTO_REAR:
+ case RC_LW_DEKU_SCRUB_GROTTO_FRONT:
+ case RC_SFM_DEKU_SCRUB_GROTTO_REAR:
+ case RC_SFM_DEKU_SCRUB_GROTTO_FRONT:
+ case RC_LH_DEKU_SCRUB_GROTTO_RIGHT:
+ case RC_LH_DEKU_SCRUB_GROTTO_CENTER:
+ case RC_GV_DEKU_SCRUB_GROTTO_REAR:
+ case RC_GV_DEKU_SCRUB_GROTTO_FRONT:
+ case RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR:
+ case RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT:
+ case RC_GC_DEKU_SCRUB_GROTTO_RIGHT:
+ case RC_GC_DEKU_SCRUB_GROTTO_CENTER:
+ case RC_DMC_DEKU_SCRUB:
+ case RC_DMC_DEKU_SCRUB_GROTTO_RIGHT:
+ case RC_DMC_DEKU_SCRUB_GROTTO_CENTER:
+ case RC_ZR_DEKU_SCRUB_GROTTO_REAR:
+ case RC_ZR_DEKU_SCRUB_GROTTO_FRONT:
+ case RC_LLR_DEKU_SCRUB_GROTTO_RIGHT:
+ case RC_LLR_DEKU_SCRUB_GROTTO_CENTER:
+ case RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT:
+ case RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT:
+ case RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS:
+ case RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT:
+ case RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT:
+ case RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT:
+ case RC_GANONS_CASTLE_DEKU_SCRUB_LEFT:
+ case RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT:
+ case RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER:
+ case RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT:
+ case RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT:
+ return 40;
+ case RC_DEKU_TREE_MQ_DEKU_SCRUB:
+ case RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY:
+ case RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE:
+ return 50;
+ default:
+ // we check for -1 when calling this to know if we don't have a price
+ return -1;
+ }
+}
+
void Randomizer::ParseItemLocationsFile(const char* spoilerFileName, bool silent) {
std::ifstream spoilerFileStream(sanitize(spoilerFileName));
if (!spoilerFileStream)
@@ -1186,7 +1245,6 @@ void Randomizer::ParseItemLocationsFile(const char* spoilerFileName, bool silent
if (it->is_structured()) {
json itemJson = *it;
for (auto itemit = itemJson.begin(); itemit != itemJson.end(); ++itemit) {
- // todo handle prices
if (itemit.key() == "item") {
gSaveContext.itemLocations[randomizerCheck].check = randomizerCheck;
gSaveContext.itemLocations[randomizerCheck].get.rgID = SpoilerfileGetNameToEnum[itemit.value()];
@@ -1204,6 +1262,10 @@ void Randomizer::ParseItemLocationsFile(const char* spoilerFileName, bool silent
gSaveContext.itemLocations[randomizerCheck].check = SpoilerfileCheckNameToEnum[it.key()];
gSaveContext.itemLocations[randomizerCheck].get.rgID = SpoilerfileGetNameToEnum[it.value()];
gSaveContext.itemLocations[randomizerCheck].get.fakeRgID = RG_NONE;
+ int16_t price = GetVanillaMerchantPrice(randomizerCheck);
+ if (price != -1) {
+ merchantPrices[gSaveContext.itemLocations[randomizerCheck].check] = price;
+ }
}
}
diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h
index 98b04f6c4..0af90e5d0 100644
--- a/soh/soh/Enhancements/randomizer/randomizer.h
+++ b/soh/soh/Enhancements/randomizer/randomizer.h
@@ -31,6 +31,7 @@ class Randomizer {
void ParseEntranceDataFile(const char* spoilerFileName, bool silent);
bool IsItemVanilla(RandomizerGet randoGet);
GetItemEntry GetItemEntryFromRGData(RandomizerGetData rgData, GetItemID ogItemId, bool checkObtainability = true);
+ int16_t GetVanillaMerchantPrice(RandomizerCheck check);
public:
Randomizer();
diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c
index 492842d1e..4051ad619 100644
--- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c
+++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c
@@ -178,6 +178,13 @@ void EnDns_Init(Actor* thisx, PlayState* play) {
this->dnsItemEntry->itemPrice = this->scrubIdentity.itemPrice;
}
+ if (Randomizer_GetSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_EXPENSIVE) {
+ // temporary workaround: always use 40 rupees as price instead of 70
+ if (this->actor.params == 0x0006) {
+ this->dnsItemEntry->itemPrice = 40;
+ }
+ }
+
if (this->scrubIdentity.isShuffled) {
this->dnsItemEntry->getItemId = this->scrubIdentity.getItemId;
this->dnsItemEntry->purchaseableCheck = EnDns_RandomizerPurchaseableCheck;