mirror of https://github.com/AxioDL/metaforce.git
Add CVarValueReference
This commit is contained in:
parent
0b523f98c3
commit
96680d2660
|
@ -216,10 +216,13 @@ CStateManager::CStateManager(const std::weak_ptr<CScriptMailbox>& mailbox, const
|
|||
x8f0_shadowTex = g_SimplePool->GetObj("DefaultShadow");
|
||||
g_StateManager = this;
|
||||
|
||||
if (sm_logScripting == nullptr) {
|
||||
sm_logScripting = hecl::CVarManager::instance()->findOrMakeCVar(
|
||||
"stateManager.logScripting"sv, "Prints object communication to the console", false,
|
||||
hecl::CVar::EFlags::ReadOnly | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::Game);
|
||||
}
|
||||
m_logScriptingReference.emplace(&m_logScripting, sm_logScripting);
|
||||
}
|
||||
|
||||
CStateManager::~CStateManager() {
|
||||
x88c_rumbleManager->HardStopAll();
|
||||
|
@ -1326,7 +1329,7 @@ void CStateManager::SendScriptMsg(CEntity* dest, TUniqueId src, EScriptObjectMes
|
|||
return;
|
||||
}
|
||||
|
||||
if (sm_logScripting != nullptr && sm_logScripting->toBoolean()) {
|
||||
if (m_logScripting) {
|
||||
LogModule.report(logvisor::Info, FMT_STRING("Sending '{}' to '{}' id= {}"), ScriptObjectMessageToStr(msg),
|
||||
dest->GetName(), dest->GetUniqueId());
|
||||
}
|
||||
|
@ -1345,7 +1348,7 @@ void CStateManager::SendScriptMsgAlways(TUniqueId dest, TUniqueId src, EScriptOb
|
|||
return;
|
||||
}
|
||||
|
||||
if (sm_logScripting != nullptr && sm_logScripting->toBoolean()) {
|
||||
if (m_logScripting) {
|
||||
LogModule.report(logvisor::Info, FMT_STRING("Sending '{}' to '{}' id= {}"), ScriptObjectMessageToStr(msg),
|
||||
dst->GetName(), dst->GetUniqueId());
|
||||
}
|
||||
|
@ -1415,7 +1418,7 @@ void CStateManager::FreeScriptObject(TUniqueId id) {
|
|||
act->SetUseInSortedLists(false);
|
||||
}
|
||||
|
||||
if (sm_logScripting && sm_logScripting->toBoolean()) {
|
||||
if (m_logScripting) {
|
||||
LogModule.report(logvisor::Info, FMT_STRING("Removed '{}'"), ent->GetName());
|
||||
}
|
||||
}
|
||||
|
@ -2771,7 +2774,7 @@ void CStateManager::AddObject(CEntity& ent) {
|
|||
}
|
||||
}
|
||||
|
||||
if (sm_logScripting != nullptr && sm_logScripting->toBoolean()) {
|
||||
if (m_logScripting) {
|
||||
LogModule.report(logvisor::Info, FMT_STRING("Added '{}'"), ent.GetName());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -216,6 +216,8 @@ private:
|
|||
bool m_warping = false;
|
||||
std::map<TEditorId, std::set<SConnection>> m_incomingConnections;
|
||||
|
||||
bool m_logScripting = false;
|
||||
std::optional<hecl::CVarValueReference<bool>> m_logScriptingReference;
|
||||
void UpdateThermalVisor();
|
||||
static void RendererDrawCallback(void*, void*, int);
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
namespace hecl {
|
||||
namespace DNACVAR {
|
||||
enum class EType : atUint8 { Boolean, Signed, Unsigned, Real, Literal, Vec2f, Vec2d, Vec3f, Vec3d, Vec4f, Vec4d };
|
||||
|
||||
enum class EFlags {
|
||||
None = 0,
|
||||
System = (1 << 0),
|
||||
|
@ -48,6 +47,7 @@ struct CVarContainer : public athena::io::DNA<athena::Endian::Big> {
|
|||
} // namespace DNACVAR
|
||||
|
||||
class CVarManager;
|
||||
class ICVarValueReference;
|
||||
class CVar : protected DNACVAR::CVar {
|
||||
friend class CVarManager;
|
||||
Delete _d;
|
||||
|
@ -151,6 +151,13 @@ public:
|
|||
void lock();
|
||||
|
||||
void addListener(ListenerFunc func) { m_listeners.push_back(std::move(func)); }
|
||||
void addVariableReference(ICVarValueReference* v) { m_valueReferences.push_back(v); }
|
||||
void removeVariableReference(ICVarValueReference* v) {
|
||||
auto it = std::find(m_valueReferences.begin(), m_valueReferences.end(), v);
|
||||
if (it != m_valueReferences.end()) {
|
||||
m_valueReferences.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
bool isValidInput(std::string_view input) const;
|
||||
bool isValidInput(std::wstring_view input) const;
|
||||
|
@ -168,6 +175,7 @@ private:
|
|||
bool m_unlocked = false;
|
||||
bool m_wasDeserialized = false;
|
||||
std::vector<ListenerFunc> m_listeners;
|
||||
std::vector<ICVarValueReference*> m_valueReferences;
|
||||
bool safeToModify(EType type) const;
|
||||
void init(EFlags flags, bool removeColor = true);
|
||||
};
|
||||
|
@ -317,5 +325,43 @@ public:
|
|||
m_cvar->lock();
|
||||
}
|
||||
};
|
||||
class ICVarValueReference {
|
||||
protected:
|
||||
CVar* m_cvar = nullptr;
|
||||
|
||||
public:
|
||||
ICVarValueReference() = default;
|
||||
explicit ICVarValueReference(CVar* cv) : m_cvar(cv) {
|
||||
if (m_cvar != nullptr) {
|
||||
m_cvar->addVariableReference(this);
|
||||
}
|
||||
}
|
||||
virtual ~ICVarValueReference() {
|
||||
if (m_cvar != nullptr) {
|
||||
m_cvar->removeVariableReference(this);
|
||||
}
|
||||
m_cvar = nullptr;
|
||||
}
|
||||
virtual void updateValue() = 0;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class CVarValueReference : public ICVarValueReference {
|
||||
T* m_valueRef = nullptr;
|
||||
|
||||
public:
|
||||
CVarValueReference() = default;
|
||||
explicit CVarValueReference(T* t, CVar* cv) : ICVarValueReference(cv) {
|
||||
m_valueRef = t;
|
||||
if (m_valueRef && m_cvar) {
|
||||
m_cvar->toValue(*m_valueRef);
|
||||
}
|
||||
}
|
||||
|
||||
void updateValue() override {
|
||||
if (m_valueRef != nullptr && m_cvar->isModified()) {
|
||||
m_cvar->toValue(*m_valueRef);
|
||||
}
|
||||
}
|
||||
};
|
||||
} // namespace hecl
|
||||
|
|
|
@ -472,6 +472,9 @@ void CVar::lock() {
|
|||
void CVar::dispatch() {
|
||||
for (const ListenerFunc& listen : m_listeners)
|
||||
listen(this);
|
||||
for (auto* ref : m_valueReferences) {
|
||||
ref->updateValue();
|
||||
}
|
||||
}
|
||||
|
||||
bool isReal(std::string_view v) {
|
||||
|
|
Loading…
Reference in New Issue