Shipwright/soh/soh/Enhancements/randomizer/3drando/item.cpp

85 lines
2.5 KiB
C++

#include "item.hpp"
#include <array>
#include "item_location.hpp"
#include "logic.hpp"
#include "random.hpp"
#include "item_pool.hpp"
#include "settings.hpp"
#include "z64item.h"
Item::Item(Text name_, ItemType type_, int getItemId_, bool advancement_, bool* logicVar_, uint32_t hintKey_,
uint16_t price_)
: name(std::move(name_)),
type(type_),
getItemId(getItemId_),
advancement(advancement_),
logicVar(logicVar_),
hintKey(hintKey_),
price(price_) {}
Item::Item(Text name_, ItemType type_, int getItemId_, bool advancement_, uint8_t* logicVar_, uint32_t hintKey_,
uint16_t price_)
: name(std::move(name_)),
type(type_),
getItemId(getItemId_),
advancement(advancement_),
logicVar(logicVar_),
hintKey(hintKey_),
price(price_) {}
Item::~Item() = default;
void Item::ApplyEffect() {
//If this is a key ring, logically add as many keys as we could need
if (FOREST_TEMPLE_KEY_RING <= hintKey && hintKey <= GANONS_CASTLE_KEY_RING) {
*std::get<uint8_t*>(logicVar) += 10;
}
else {
if (std::holds_alternative<bool*>(logicVar)) {
*std::get<bool*>(logicVar) = true;
} else {
*std::get<uint8_t*>(logicVar) += 1;
}
}
Logic::UpdateHelpers();
}
void Item::UndoEffect() {
if (FOREST_TEMPLE_KEY_RING <= hintKey && hintKey <= GANONS_CASTLE_KEY_RING) {
*std::get<uint8_t*>(logicVar) -= 10;
}
else {
if (std::holds_alternative<bool*>(logicVar)) {
*std::get<bool*>(logicVar) = false;
} else {
*std::get<uint8_t*>(logicVar) -= 1;
}
}
Logic::UpdateHelpers();
}
ItemOverride_Value Item::Value() const {
ItemOverride_Value val;
val.all = 0;
val.itemId = getItemId;
if (getItemId == GI_ICE_TRAP) {
val.looksLikeItemId = RandomElement(IceTrapModels);
}
if (!Settings::ColoredBossKeys && (getItemId >= 0x95 && getItemId <= 0x9A)) { //Boss keys
val.looksLikeItemId = GI_KEY_BOSS;
}
if (!Settings::ColoredKeys && (getItemId >= 0xAF && getItemId <= 0xB7)) { //Small keys
val.looksLikeItemId = GI_KEY_SMALL;
}
if (type == ITEMTYPE_SHOP) {
// With the current shopsanity implementation, we need a way to detect
// regular shop items. This method should have no unintended side effects
// unless there was a multiworld with 256 players... so, it should be fine.
val.player = 0xFF;
}
return val;
}