mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-24 06:50:43 -04:00
simplify chest and freestanding item lookups
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user