blob: 39fae9c1457a81a8f4a81c27249d1676f42c8738 (
plain)
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
|
#include "Spoiler.h"
#include "Rando/Rando.h"
#include <libultraship/bridge/consolevariablebridge.h>
#include "ShipUtils.h"
extern "C" {
#include "overlays/actors/ovl_En_Sth/z_en_sth.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"].value(randoStaticOption.name, (uint32_t)randoStaticOption.defaultValue);
}
if (!RANDO_SAVE_OPTIONS[RO_SHUFFLE_GOLD_SKULLTULAS]) {
RANDO_SAVE_OPTIONS[RO_SKULLTULA_TOKENS_REQUIRED] = SPIDER_HOUSE_TOKENS_REQUIRED;
}
auto startingItems = Rando::GetStartingItemsFromSpoiler(spoiler);
Rando::SetStartingItemsInSave(gSaveContext.save.shipSaveInfo.rando, startingItems);
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());
if (randoItemId == RI_UNKNOWN) {
SPDLOG_ERROR("Unknown item in spoiler for check {}: {}", randoStaticCheck.name, itemName);
throw std::runtime_error("Unknown item in spoiler: " + itemName);
}
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());
if (randoItemId == RI_UNKNOWN) {
SPDLOG_ERROR("Unknown item in spoiler for check {}: {}", randoStaticCheck.name, itemName);
throw std::runtime_error("Unknown item in spoiler: " + itemName);
}
RANDO_SAVE_CHECKS[randoCheckId].randoItemId = randoItemId;
RANDO_SAVE_CHECKS[randoCheckId].shuffled = true;
}
}
}
} // namespace Spoiler
} // namespace Rando
|