diff --git a/apps/openmw/mwlua/localscripts.cpp b/apps/openmw/mwlua/localscripts.cpp index d2ef661bc7..966444b173 100644 --- a/apps/openmw/mwlua/localscripts.cpp +++ b/apps/openmw/mwlua/localscripts.cpp @@ -1,6 +1,7 @@ #include "localscripts.hpp" #include +#include #include #include "../mwbase/environment.hpp" @@ -13,6 +14,7 @@ #include "../mwmechanics/aisequence.hpp" #include "../mwmechanics/aitravel.hpp" #include "../mwmechanics/aiwander.hpp" +#include "../mwmechanics/attacktype.hpp" #include "../mwmechanics/creaturestats.hpp" #include "../mwworld/class.hpp" #include "../mwworld/ptr.hpp" @@ -63,8 +65,11 @@ namespace MWLua selfAPI["controls"] = sol::readonly_property([](SelfObject& self) { return &self.mControls; }); selfAPI["isActive"] = [](SelfObject& self) { return &self.mIsActive; }; selfAPI["enableAI"] = [](SelfObject& self, bool v) { self.mControls.mDisableAI = !v; }; - selfAPI["AttackTYPE"] = LuaUtil::makeStrictReadOnly(context.mLua->tableFromPairs( - { { "NoAttack", 0 }, { "Attack", 1 }, { "Chop", 1 }, { "Slash", 2 }, { "Thrust", 3 } })); + selfAPI["AttackTYPE"] + = LuaUtil::makeStrictReadOnly(context.mLua->tableFromPairs( + { { "NoAttack", MWMechanics::AttackType::NoAttack }, { "Any", MWMechanics::AttackType::Any }, + { "Chop", MWMechanics::AttackType::Chop }, { "Slash", MWMechanics::AttackType::Slash }, + { "Thrust", MWMechanics::AttackType::Thrust } })); using AiPackage = MWMechanics::AiPackage; sol::usertype aiPackage = context.mLua->sol().new_usertype("AiPackage"); diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 1a6f224c0a..300e2316ba 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -47,6 +47,7 @@ #include "aifollow.hpp" #include "aipursue.hpp" #include "aiwander.hpp" +#include "attacktype.hpp" #include "character.hpp" #include "creaturestats.hpp" #include "movement.hpp" @@ -239,13 +240,13 @@ namespace MWMechanics namespace { - std::string_view attackTypeName(int attackTypeNum) + std::string_view attackTypeName(AttackType attackType) { - if (attackTypeNum == 1) + if (attackType == AttackType::Chop) return "chop"; - else if (attackTypeNum == 2) + else if (attackType == AttackType::Slash) return "slash"; - else if (attackTypeNum == 3) + else if (attackType == AttackType::Thrust) return "thrust"; else return ""; @@ -376,9 +377,11 @@ namespace MWMechanics stats.setMovementFlag(MWMechanics::CreatureStats::Flag_Run, controls.mRun); stats.setMovementFlag(MWMechanics::CreatureStats::Flag_Sneak, controls.mSneak); - int attackTypeNum = controls.mUse & 3; - stats.setAttackingOrSpell(attackTypeNum != 0); - stats.setAttackType(attackTypeName(attackTypeNum)); + // Same as mUse % max AttackType int value + AttackType attackType = static_cast(controls.mUse % static_cast(AttackType::Thrust)); + + stats.setAttackingOrSpell(attackType != AttackType::NoAttack); + stats.setAttackType(attackTypeName(attackType)); controls.mChanged = false; } diff --git a/apps/openmw/mwmechanics/attacktype.hpp b/apps/openmw/mwmechanics/attacktype.hpp new file mode 100644 index 0000000000..3824f5bbe7 --- /dev/null +++ b/apps/openmw/mwmechanics/attacktype.hpp @@ -0,0 +1,16 @@ +#ifndef OPENMW_MWMECHANICS_ATTACKTYPE_H +#define OPENMW_MWMECHANICS_ATTACKTYPE_H + +namespace MWMechanics +{ + enum class AttackType + { + NoAttack, + Any, + Chop, + Slash, + Thrust + }; +} + +#endif diff --git a/files/lua_api/openmw/self.lua b/files/lua_api/openmw/self.lua index 9f13f6a8bf..acb83a3cf4 100644 --- a/files/lua_api/openmw/self.lua +++ b/files/lua_api/openmw/self.lua @@ -37,11 +37,12 @@ -- @field [parent=#ActorControls] #boolean run true - run, false - walk -- @field [parent=#ActorControls] #boolean sneak If true - sneak -- @field [parent=#ActorControls] #boolean jump If true - initiate a jump --- @field [parent=#ActorControls] #number Accepts an @{#AttackTYPE} value. Activates the readied weapon/spell according to a provided value. For weapons, keeping this value modified will charge the attack until set to @{#AttackTYPE.NoAttack}. +-- @field [parent=#ActorControls] #number use Accepts an @{#AttackTYPE} value. Activates the readied weapon/spell according to a provided value. For weapons, keeping this value modified will charge the attack until set to @{#AttackTYPE.NoAttack}. If an @{#AttackTYPE} not appropriate for a currently equipped weapon provided - an appropriate @{#AttackTYPE} will be used instead. +--- -- @type AttackTYPE -- @field #number NoAttack --- @field #number Attack +-- @field #number Any -- @field #number Chop -- @field #number Swing -- @field #number Thrust