simplify chest and freestanding item lookups

This commit is contained in:
gymnast86
2026-04-30 19:19:42 -07:00
parent 622920d8c0
commit d4bc2daa89
7 changed files with 334 additions and 342 deletions
+4 -3
View File
@@ -321,12 +321,13 @@ int daItem_c::_daItem_create() {
u32 params = fopAcM_GetParam(this);
u8 flag = daItem_prm::getItemBitNo(this);
u8 stageIdx = getStageID();
const auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides;
u16 key = (stageIdx << 8) | flag;
auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides;
// If we found an override for this freestanding item
if (freestandingOverrides.contains(stageIdx) && freestandingOverrides.at(stageIdx).contains(flag)) {
if (freestandingOverrides.contains(key)) {
// Clear the itemId and set it to out new itemId
params &= 0xFFFFFF00;
u8 newItemId = freestandingOverrides.at(stageIdx).at(flag);
u8 newItemId = freestandingOverrides[key];
params |= verifyProgressiveItem(newItemId);
fopAcM_SetParam(this, params);
}
+3 -2
View File
@@ -212,11 +212,12 @@ int daObjLife_c::create() {
} else {
u8 flag = getSaveBitNo();
u8 stageIdx = getStageID();
u16 key = (stageIdx << 8) | flag;
const auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides;
// If we found an override for this freestanding item
if (freestandingOverrides.contains(stageIdx) && freestandingOverrides.at(stageIdx).contains(flag)) {
if (freestandingOverrides.contains(key)) {
// Clear the itemId and set it to out new itemId
u8 overrideItem = freestandingOverrides.at(stageIdx).at(flag);
u8 overrideItem = freestandingOverrides.at(key);
itemId = verifyProgressiveItem(overrideItem);
}
}
+8 -3
View File
@@ -12,7 +12,10 @@
#include <cmath>
#include <cstring>
#if TARGET_PC
#include "dusk/randomizer/game/tools.h"
#include "dusk/randomizer/game/verify_item_functions.h"
#endif
static const f32 l_cull_size_box[6] = { -150.0f, -10.0f, -150.0f, 150.0f, 300.0f, 100.0f };
@@ -1788,12 +1791,14 @@ cPhs_Step daTbox_c::create1st() {
if (!mParamsInit) {
field_0x980 = home.angle.x;
#if TARGET_PC
// The upper 8 bits of home.angle.z hold the itemId
// The upper 8 bits of home.angle.z hold the itemId. Replace with our randomized
// item in randomizer
if (randomizer_IsActive()) {
home.angle.z &= ~0xFF00;
auto stage = dComIfGp_getStartStageName();
auto stage = getStageID();
auto tboxId = static_cast<u8>(getTboxNo());
u8 itemId = randomizer_GetContext().mTreasureChestOverrides[stage][tboxId];
u16 key = (stage << 8) | tboxId;
u8 itemId = randomizer_GetContext().mTreasureChestOverrides[key];
home.angle.z |= verifyProgressiveItem(itemId) << 8;
}
#endif
+6 -2
View File
@@ -10,7 +10,10 @@
#include "d/actor/d_a_midna.h"
#include <cstring>
#if TARGET_PC
#include "dusk/randomizer/game/tools.h"
#include "dusk/randomizer/game/verify_item_functions.h"
#endif
void daTbox2_c::initBaseMtx() {
mpModel->setBaseScale(scale);
@@ -161,9 +164,10 @@ int daTbox2_c::create1st() {
#if TARGET_PC
if (randomizer_IsActive()) {
// Get the override item for this chest
auto stage = dComIfGp_getStartStageName();
auto stage = getStageID();
u8 tboxId = getTboxNo();
u8 itemId = randomizer_GetContext().mTreasureChestOverrides[stage][tboxId];
u16 key = (stage << 8) | tboxId;
u8 itemId = randomizer_GetContext().mTreasureChestOverrides[key];
// Set the item in the params
u32 params = fopAcM_GetParam(this);
params &= 0xFFFFFF00;
+20 -39
View File
@@ -47,20 +47,14 @@ std::optional<std::string> RandomizerContext::WriteToFile() {
const std::list<u16> u16Inventory(this->mStartingInventory.begin(), this->mStartingInventory.end());
out["mStartingInventory"] = u16Inventory;
for (const auto& [stageName, chestOverride] : this->mTreasureChestOverrides) {
for (const auto& [tboxId, itemId] : chestOverride) {
out["mTreasureChestOverrides"][stageName][static_cast<u16>(tboxId)] = static_cast<u16>(itemId);
}
}
const std::unordered_map<u16, u16> u16ChestOverrides(this->mTreasureChestOverrides.begin(), this->mTreasureChestOverrides.end());
out["mTreasureChestOverrides"] = u16ChestOverrides;
const std::unordered_map<u16, u16> u16PoeOverrides(this->mPoeOverrides.begin(), this->mPoeOverrides.end());
out["mPoeOverrides"] = u16PoeOverrides;
for (const auto& [stageIdx, itemOverride] : this->mFreestandingItemOverrides) {
for (const auto& [flag, itemId] : itemOverride) {
out["mFreestandingItemOverrides"][static_cast<u16>(stageIdx)][static_cast<u16>(flag)] = static_cast<u16>(itemId);
}
}
const std::unordered_map<u16, u16> u16FreestandingItemOverrides(this->mFreestandingItemOverrides.begin(), this->mFreestandingItemOverrides.end());
out["mFreestandingItemOverrides"] = u16FreestandingItemOverrides;
const std::unordered_map<u16, u16> u16BugRewardOverrides(this->mBugRewardOverrides.begin(), this->mBugRewardOverrides.end());
out["mBugRewardOverrides"] = u16BugRewardOverrides;
@@ -131,18 +125,10 @@ std::optional<std::string> RandomizerContext::LoadFromHash(const std::string& ha
}
// Chest overrides
for (const auto& stageNode : in["mTreasureChestOverrides"]) {
const auto& stageName = stageNode.first.as<std::string>();
// Single nodes with a zero in their key will get dumped as sequences
if (stageNode.second.IsSequence()) {
this->mTreasureChestOverrides[stageName][0] = stageNode.second[0].as<u8>();
} else {
for (const auto& chestItemPair : stageNode.second) {
auto tboxId = chestItemPair.first.as<u8>();
auto itemId = chestItemPair.second.as<u8>();
this->mTreasureChestOverrides[stageName][tboxId] = itemId;
}
}
for (const auto& chestNode : in["mTreasureChestOverrides"]) {
u16 key = chestNode.first.as<u16>();
u8 itemId = chestNode.second.as<u8>();
this->mTreasureChestOverrides[key] = itemId;
}
// Poe Overrides
@@ -153,18 +139,10 @@ std::optional<std::string> RandomizerContext::LoadFromHash(const std::string& ha
}
// Freestanding overrides
for (const auto& stageNode : in["mFreestandingItemOverrides"]) {
const auto& stageIdx = stageNode.first.as<u8>();
// Single nodes with a zero in their key will get dumped as sequences
if (stageNode.second.IsSequence()) {
this->mFreestandingItemOverrides[stageIdx][0] = stageNode.second[0].as<u8>();
} else {
for (const auto& flagItemPair : stageNode.second) {
auto flag = flagItemPair.first.as<u8>();
auto itemId = flagItemPair.second.as<u8>();
this->mFreestandingItemOverrides[stageIdx][flag] = itemId;
}
}
for (const auto& itemNode : in["mFreestandingItemOverrides"]) {
u16 key = itemNode.first.as<u16>();
u8 itemId = itemNode.second.as<u8>();
this->mFreestandingItemOverrides[key] = itemId;
}
// Bug Rewards
@@ -610,11 +588,13 @@ void GenerateAndWriteSeed(std::string& generationStatusMsg) {
const auto& metaData = location->GetMetadata();
// Chest Overrides
// Keyed by u16 of 0xFF00 (stage index) and 0x00FF (tbox id)
if (location->HasCategories("Chest")) {
const auto& stage = metaData[0]["Stage"].as<std::string>();
const auto& tboxId = metaData[0]["Tbox ID"].as<u8>();
const auto& itemId = location->GetCurrentItem()->GetID();
randoData.mTreasureChestOverrides[stage][tboxId] = itemId;
u8 stage = metaData[0]["Stage"].as<u8>();
u8 tboxId = metaData[0]["Tbox ID"].as<u8>();
u8 itemId = location->GetCurrentItem()->GetID();
u16 key = (stage << 8) | tboxId;
randoData.mTreasureChestOverrides[key] = itemId;
}
// Poe Overrides
@@ -633,7 +613,8 @@ void GenerateAndWriteSeed(std::string& generationStatusMsg) {
u8 stage = metaData[0]["Stage"].as<u8>();
u8 flag = metaData[0]["Flag"].as<u8>();
u8 itemId = location->GetCurrentItem()->GetID();
randoData.mFreestandingItemOverrides[stage][flag] = itemId;
u16 key = (stage << 8) | flag;
randoData.mFreestandingItemOverrides[key] = itemId;
}
// Bug Rewards
@@ -29,9 +29,9 @@ public:
std::list<u16> mStartEventFlags{};
std::unordered_map<u8, std::list<u8>> mStartRegionFlags{};
std::list<u8> mStartingInventory{};
std::unordered_map<std::string, std::unordered_map<u8, u8>> mTreasureChestOverrides{};
std::unordered_map<u16, u8> mTreasureChestOverrides{};
std::unordered_map<u16, u8> mPoeOverrides{};
std::unordered_map<u8, std::unordered_map<u8, u8>> mFreestandingItemOverrides{};
std::unordered_map<u16, u8> mFreestandingItemOverrides{};
std::unordered_map<u8, u8> mBugRewardOverrides{};
std::unordered_map<u16, u8> mSkyCharacterOverrides{};
std::unordered_map<u16, u8> mGoldenWolfOverrides{};
File diff suppressed because it is too large Load Diff