summaryrefslogtreecommitdiff
path: root/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2025-02-03 14:40:51 -0600
committerGarrett Cox <garrettjcox@gmail.com>2025-02-03 14:40:51 -0600
commit79bd07938b407f56dba0d08a91a629021782fec7 (patch)
tree63516d82e5106ce54f3aa12daf6c2f12abd6304b /mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp
parentc915a3308d985b92bca028ac702d73e7b84e28b2 (diff)
Initial starting items implementation
Diffstat (limited to 'mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp')
-rw-r--r--mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp66
1 files changed, 58 insertions, 8 deletions
diff --git a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp
index aa5bbc4a2..ca0955582 100644
--- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp
+++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp
@@ -58,16 +58,62 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) {
// Persist options to the save
gSaveContext.save.shipSaveInfo.rando.finalSeed = finalSeed;
for (auto& [randoOptionId, randoStaticOption] : Rando::StaticData::Options) {
- RANDO_SAVE_OPTIONS[randoOptionId] = CVarGetInteger(randoStaticOption.cvar, 0);
+ uint32_t defaults = 0;
+ switch (randoOptionId) {
+ case RO_STARTING_ITEMS_2:
+ defaults = -2145385984;
+ break;
+ case RO_STARTING_ITEMS_3:
+ defaults = 2048;
+ break;
+ default:
+ break;
+ }
+ RANDO_SAVE_OPTIONS[randoOptionId] = CVarGetInteger(randoStaticOption.cvar, defaults);
+ }
+
+ if (RANDO_SAVE_OPTIONS[RO_STARTING_HEALTH] != 3) {
+ gSaveContext.save.saveInfo.playerData.healthCapacity =
+ gSaveContext.save.saveInfo.playerData.health = RANDO_SAVE_OPTIONS[RO_STARTING_HEALTH] * 0x10;
+ }
+
+ if (RANDO_SAVE_OPTIONS[RO_STARTING_CONSUMABLES]) {
+ GiveItem(RI_DEKU_STICK);
+ GiveItem(RI_DEKU_NUT);
+ AMMO(ITEM_DEKU_STICK) = CUR_CAPACITY(UPG_DEKU_STICKS);
+ AMMO(ITEM_DEKU_NUT) = CUR_CAPACITY(UPG_DEKU_NUTS);
+ }
+
+ std::vector<RandoItemId> startingItems = {};
+ for (size_t i = 0; i < Rando::StaticData::StartingItemsMap.size(); i++) {
+ RandoItemId itemId = Rando::StaticData::StartingItemsMap[i];
+ RandoOptionId optionId;
+ if (i < 32) {
+ optionId = RO_STARTING_ITEMS_1;
+ } else if (i < 64) {
+ optionId = RO_STARTING_ITEMS_2;
+ } else {
+ optionId = RO_STARTING_ITEMS_3;
+ }
+ uint32_t startingItemsBits = RANDO_SAVE_OPTIONS[optionId];
+ if ((startingItemsBits & (1 << i)) != 0) {
+ startingItems.push_back(itemId);
+ }
}
- // TODO: This should be driven by the UI
- std::vector<RandoItemId> startingItems = {
- RI_PROGRESSIVE_SWORD,
- RI_SHIELD_HERO,
- RI_OCARINA,
- RI_SONG_TIME,
- };
+ if (RANDO_SAVE_OPTIONS[RO_STARTING_MAPS_AND_COMPASSES]) {
+ std::vector<RandoItemId> MapsAndCompasses = {
+ RI_GREAT_BAY_COMPASS, RI_GREAT_BAY_MAP, RI_SNOWHEAD_COMPASS,
+ RI_SNOWHEAD_MAP, RI_STONE_TOWER_COMPASS, RI_STONE_TOWER_MAP,
+ RI_TINGLE_MAP_CLOCK_TOWN, RI_TINGLE_MAP_GREAT_BAY, RI_TINGLE_MAP_ROMANI_RANCH,
+ RI_TINGLE_MAP_SNOWHEAD, RI_TINGLE_MAP_STONE_TOWER, RI_TINGLE_MAP_WOODFALL,
+ RI_WOODFALL_COMPASS, RI_WOODFALL_MAP,
+ };
+
+ for (RandoItemId itemId : MapsAndCompasses) {
+ startingItems.push_back(itemId);
+ }
+ }
std::unordered_map<RandoCheckId, bool> checkPool;
std::vector<RandoItemId> itemPool;
@@ -261,6 +307,10 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) {
GiveItem(ConvertItem(startingItem));
}
+ if (RANDO_SAVE_OPTIONS[RO_STARTING_RUPEES]) {
+ gSaveContext.save.saveInfo.playerData.rupees = CUR_CAPACITY(UPG_WALLET);
+ }
+
if (RANDO_SAVE_OPTIONS[RO_LOGIC] == RO_LOGIC_VANILLA) {
GiveItem(RI_SWORD_KOKIRI);
GiveItem(RI_SHIELD_HERO);