1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#include "Spoiler.h"
#include "Rando/Rando.h"
#include "public/bridge/consolevariablebridge.h"
#include "ShipUtils.h"
namespace Rando {
namespace Spoiler {
void ApplyToSaveContext(nlohmann::json spoiler) {
gSaveContext.save.shipSaveInfo.rando.finalSeed = spoiler["finalSeed"].get<uint32_t>();
for (auto& [randoOptionId, randoStaticOption] : Rando::StaticData::Options) {
RANDO_SAVE_OPTIONS[randoOptionId] = spoiler["options"][randoStaticOption.name].get<uint32_t>();
}
std::string startingItemsSave = spoiler["startingItems"].get<std::string>();
strncpy(RANDO_STARTING_ITEMS, startingItemsSave.c_str(), startingItemsSave.size() + 1);
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 = convertStartingItemsToRandoItemId(RANDO_STARTING_ITEMS, ",");
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);
}
}
for (RandoItemId startingItem : startingItems) {
GiveItem(ConvertItem(startingItem));
}
if (RANDO_SAVE_OPTIONS[RO_STARTING_RUPEES]) {
gSaveContext.save.saveInfo.playerData.rupees = CUR_CAPACITY(UPG_WALLET);
}
for (auto& [randoCheckId, randoStaticCheck] : Rando::StaticData::Checks) {
if (randoStaticCheck.randoCheckId == RC_UNKNOWN) {
continue;
}
if (!spoiler["checks"].contains(randoStaticCheck.name)) {
RANDO_SAVE_CHECKS[randoCheckId].randoItemId = randoStaticCheck.randoItemId;
RANDO_SAVE_CHECKS[randoCheckId].shuffled = false;
continue;
}
// Check if it's an object or a string
if (spoiler["checks"][randoStaticCheck.name].is_object()) {
std::string itemName = spoiler["checks"][randoStaticCheck.name]["randoItemId"].get<std::string>();
RandoItemId randoItemId = Rando::StaticData::GetItemIdFromName(itemName.c_str());
RANDO_SAVE_CHECKS[randoCheckId].randoItemId = randoItemId;
RANDO_SAVE_CHECKS[randoCheckId].shuffled = true;
// If it has a price, set it
if (spoiler["checks"][randoStaticCheck.name].contains("price")) {
RANDO_SAVE_CHECKS[randoCheckId].price =
spoiler["checks"][randoStaticCheck.name]["price"].get<uint16_t>();
}
} else {
std::string itemName = spoiler["checks"][randoStaticCheck.name].get<std::string>();
RandoItemId randoItemId = Rando::StaticData::GetItemIdFromName(itemName.c_str());
RANDO_SAVE_CHECKS[randoCheckId].randoItemId = randoItemId;
RANDO_SAVE_CHECKS[randoCheckId].shuffled = true;
}
}
}
} // namespace Spoiler
} // namespace Rando
|