From 66d2a68c4533552b65163bf4b3c8f140b57594c6 Mon Sep 17 00:00:00 2001 From: Vsevolod Kremianskii Date: Mon, 12 Apr 2021 13:08:19 +0700 Subject: [PATCH] Load all UTD fields --- src/game/object/door.cpp | 12 ++--- src/game/object/door.h | 30 ++++++++---- src/game/object/door_blueprint.cpp | 72 +++++++++++++++++++--------- src/game/object/object.cpp | 4 +- src/game/object/object.h | 6 +-- src/game/script/routines_objects.cpp | 6 +-- 6 files changed, 81 insertions(+), 49 deletions(-) diff --git a/src/game/object/door.cpp b/src/game/object/door.cpp index 99b57be4..7a5a7952 100644 --- a/src/game/object/door.cpp +++ b/src/game/object/door.cpp @@ -53,10 +53,11 @@ void Door::loadFromGIT(const GffStruct &gffs) { string templateResRef(boost::to_lower_copy(gffs.getString("TemplateResRef"))); loadFromBlueprint(templateResRef); - _linkedTo = boost::to_lower_copy(gffs.getString("LinkedTo")); _linkedToModule = boost::to_lower_copy(gffs.getString("LinkedToModule")); + _linkedTo = boost::to_lower_copy(gffs.getString("LinkedTo")); + _linkedToFlags = gffs.getInt("LinkedToFlags"); + _transitionDestin = Strings::instance().get(gffs.getInt("TransitionDestin")); - loadTransitionDestinFromGIT(gffs); loadTransformFromGIT(gffs); } @@ -75,13 +76,6 @@ void Door::loadFromBlueprint(const string &resRef) { _open2Walkmesh = Walkmeshes::instance().get(modelName + "2", ResourceType::Dwk); } -void Door::loadTransitionDestinFromGIT(const GffStruct &gffs) { - int transDestStrRef = gffs.getInt("TransitionDestin"); - if (transDestStrRef != -1) { - _transitionDestin = Strings::instance().get(transDestStrRef); - } -} - void Door::loadTransformFromGIT(const GffStruct &gffs) { _position[0] = gffs.getFloat("X"); _position[1] = gffs.getFloat("Y"); diff --git a/src/game/object/door.h b/src/game/object/door.h index 35a06787..21b7301c 100644 --- a/src/game/object/door.h +++ b/src/game/object/door.h @@ -41,7 +41,6 @@ public: void open(const std::shared_ptr &triggerrer); void close(const std::shared_ptr &triggerrer); - bool isLockable() const { return _lockable; } bool isLocked() const { return _locked; } bool isStatic() const { return _static; } bool isKeyRequired() const { return _keyRequired; } @@ -59,19 +58,39 @@ public: void setLocked(bool locked); private: - bool _lockable { false }; bool _locked { false }; int _genericType { 0 }; bool _static { false }; bool _keyRequired { false }; std::string _linkedToModule; std::string _linkedTo; + int _linkedToFlags { 0 }; std::string _transitionDestin; + Faction _faction { Faction::Invalid }; + int _closeLockDC { 0 }; + bool _interruptable { false }; + int _openLockDC { 0 }; + int _portraitId { 0 }; + int _animationState { 0 }; + int _appearance { 0 }; + int _hardness { 0 }; + int _fortitude { 0 }; + int _reflex { 0 }; + int _will { 0 }; + int _loadScreenID { 0 }; // Scripts std::string _onOpen; std::string _onFailToOpen; + std::string _onClosed; + std::string _onDamaged; + std::string _onDeath; + std::string _onMeleeAttacked; + std::string _onSpellCastAt; + std::string _onUnlock; + std::string _onClick; + std::string _onLock; // END Scripts @@ -86,14 +105,7 @@ private: void loadTransitionDestinFromGIT(const resource::GffStruct &gffs); void loadTransformFromGIT(const resource::GffStruct &gffs); - // Blueprint - void loadUTD(const resource::GffStruct &utd); - - void loadNameFromUTD(const resource::GffStruct &utd); - void loadScriptsFromUTD(const resource::GffStruct &utd); - - // END Blueprint }; } // namespace game diff --git a/src/game/object/door_blueprint.cpp b/src/game/object/door_blueprint.cpp index f7a3606d..32fbf058 100644 --- a/src/game/object/door_blueprint.cpp +++ b/src/game/object/door_blueprint.cpp @@ -34,33 +34,59 @@ namespace reone { namespace game { void Door::loadUTD(const GffStruct &utd) { - _blueprintResRef = boost::to_lower_copy(utd.getString("TemplateResRef")); - _conversation = boost::to_lower_copy(utd.getString("Conversation")); - _currentHitPoints = utd.getInt("CurrentHP"); - _genericType = utd.getInt("GenericType"); - _hitPoints = utd.getInt("HP"); - _keyRequired = utd.getBool("KeyRequired"); - _lockable = utd.getBool("Lockable"); - _locked = utd.getBool("Locked"); - _minOneHP = utd.getBool("Min1HP"); - _static = utd.getBool("Static"); _tag = boost::to_lower_copy(utd.getString("Tag")); + _name = Strings::instance().get(utd.getInt("LocName")); + _blueprintResRef = boost::to_lower_copy(utd.getString("TemplateResRef")); + _closeLockDC = utd.getInt("CloseLockDC"); + _conversation = boost::to_lower_copy(utd.getString("Conversation")); + _interruptable = utd.getBool("Interruptable"); + _faction = utd.getEnum("Faction", Faction::Invalid); + _plot = utd.getBool("Plot"); + _minOneHP = utd.getBool("Min1HP"); + _keyRequired = utd.getBool("KeyRequired"); + _locked = utd.getBool("Locked"); + _openLockDC = utd.getInt("OpenLockDC"); + _portraitId = utd.getInt("PortraitId"); + _animationState = utd.getInt("AnimationState"); + _appearance = utd.getInt("Appearance"); + _hitPoints = utd.getInt("HP"); + _currentHitPoints = utd.getInt("CurrentHP"); + _hardness = utd.getInt("Hardness"); + _fortitude = utd.getInt("Fort"); + _reflex = utd.getInt("Ref"); + _will = utd.getInt("Will"); + _loadScreenID = utd.getInt("LoadScreenID"); + _genericType = utd.getInt("GenericType"); + _static = utd.getBool("Static"); - loadNameFromUTD(utd); - loadScriptsFromUTD(utd); -} - -void Door::loadNameFromUTD(const GffStruct &utd) { - int locNameStrRef = utd.getInt("LocName", -1); - if (locNameStrRef != -1) { - _name = Strings::instance().get(locNameStrRef); - } -} - -void Door::loadScriptsFromUTD(const GffStruct &utd) { + _onClosed = utd.getString("OnClosed"); + _onDamaged = utd.getString("OnDamaged"); + _onDeath = utd.getString("OnDeath"); _onHeartbeat = utd.getString("OnHeartbeat"); - _onFailToOpen = utd.getString("OnFailToOpen"); + _onLock = utd.getString("OnLock"); + _onMeleeAttacked = utd.getString("OnMeleeAttacked"); _onOpen = utd.getString("OnOpen"); + _onSpellCastAt = utd.getString("OnSpellCastAt"); + _onUnlock = utd.getString("OnUnlock"); + _onUserDefined = utd.getString("OnUserDefined"); + _onClick = utd.getString("OnClick"); + _onFailToOpen = utd.getString("OnFailToOpen"); + + // These fields are ignored as being most likely unused: + // + // - AutoRemoveKey + // - Lockable + // - TrapDetectable + // - TrapDetectDC + // - TrapDisarmable + // - DisarmDC + // - TrapFlag + // - TrapOneShot + // - TrapType + // - KeyName + // - OnDisarm + // - OnLock + // - OnTrapTriggered } } // namespace game diff --git a/src/game/object/object.cpp b/src/game/object/object.cpp index ffe1d922..704f81b3 100644 --- a/src/game/object/object.cpp +++ b/src/game/object/object.cpp @@ -46,8 +46,8 @@ void Object::setMaxHitPoints(int maxHitPoints) { _maxHitPoints = maxHitPoints; } -void Object::setPlotFlag(int flag) { - _plotFlag = flag; +void Object::setPlotFlag(bool plot) { + _plot = plot; } void Object::setCommandable(bool value) { diff --git a/src/game/object/object.h b/src/game/object/object.h index 4ae7396a..091601c3 100644 --- a/src/game/object/object.h +++ b/src/game/object/object.h @@ -43,9 +43,9 @@ public: const std::string &name() const { return _name; } const std::string &conversation() const { return _conversation; } ActionQueue &actionQueue() { return _actionQueue; } - int plotFlag() const { return _plotFlag; } + bool plotFlag() const { return _plot; } - void setPlotFlag(int flag); + void setPlotFlag(bool plot); void setCommandable(bool value); // Hit Points @@ -82,7 +82,7 @@ protected: int _maxHitPoints { 0 }; int _currentHitPoints { 0 }; bool _dead { false }; - int _plotFlag { 0 }; + bool _plot { false }; bool _commandable { true }; // Scripts diff --git a/src/game/script/routines_objects.cpp b/src/game/script/routines_objects.cpp index bb7bded5..083a2b85 100644 --- a/src/game/script/routines_objects.cpp +++ b/src/game/script/routines_objects.cpp @@ -337,7 +337,7 @@ Variable Routines::getObjectType(const VariablesList &args, ExecutionContext &ct } Variable Routines::getPlotFlag(const VariablesList &args, ExecutionContext &ctx) { - int result = 0; + bool result = false; auto target = getObjectOrCaller(args, 0, ctx); if (target) { @@ -346,12 +346,12 @@ Variable Routines::getPlotFlag(const VariablesList &args, ExecutionContext &ctx) debug("Script: getPlotFlag: target is invalid", 1, DebugChannels::script); } - return Variable::ofInt(result); + return Variable::ofInt(static_cast(result)); } Variable Routines::setPlotFlag(const VariablesList &args, ExecutionContext &ctx) { auto target = getObject(args, 0); - int plotFlag = getInt(args, 1); + bool plotFlag = getBool(args, 1); if (target) { target->setPlotFlag(plotFlag);