diff --git a/apps/openmw/mwlua/types/npc.cpp b/apps/openmw/mwlua/types/npc.cpp index 29147a826b..d791285cdd 100644 --- a/apps/openmw/mwlua/types/npc.cpp +++ b/apps/openmw/mwlua/types/npc.cpp @@ -107,6 +107,34 @@ namespace MWLua return MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(o.ptr()); }; + npc["getBaseDisposition"] = [](const Object& o, const Object& player) -> int { + if (player.ptr() != MWBase::Environment::get().getWorld()->getPlayerPtr()) + throw std::runtime_error("The argument must be a player!"); + const MWWorld::Class& cls = o.ptr().getClass(); + if (!cls.isNpc()) + throw std::runtime_error("NPC expected"); + return cls.getNpcStats(o.ptr()).getBaseDisposition(); + }; + + npc["setBaseDisposition"] = [](const Object& o, const Object& player, int value) { + if (player.ptr() != MWBase::Environment::get().getWorld()->getPlayerPtr()) + throw std::runtime_error("The argument must be a player!"); + const MWWorld::Class& cls = o.ptr().getClass(); + if (!cls.isNpc()) + throw std::runtime_error("NPC expected"); + cls.getNpcStats(o.ptr()).setBaseDisposition(value); + }; + + npc["modBaseDisposition"] = [](const Object& o, const Object& player, int value) { + if (player.ptr() != MWBase::Environment::get().getWorld()->getPlayerPtr()) + throw std::runtime_error("The argument must be a player!"); + const MWWorld::Class& cls = o.ptr().getClass(); + if (!cls.isNpc()) + throw std::runtime_error("NPC expected"); + auto& stats = cls.getNpcStats(o.ptr()); + stats.setBaseDisposition(stats.getBaseDisposition() + value); + }; + npc["getFactionRank"] = [](const Object& actor, std::string_view faction) { const MWWorld::Ptr ptr = actor.ptr(); ESM::RefId factionId = parseFactionId(faction); diff --git a/files/lua_api/openmw/types.lua b/files/lua_api/openmw/types.lua index 0bfafb17c8..aba3d06363 100644 --- a/files/lua_api/openmw/types.lua +++ b/files/lua_api/openmw/types.lua @@ -1003,6 +1003,27 @@ -- @param openmw.core#GameObject player The player that you want to check the disposition for. -- @return #number +--- +-- Returns the current base disposition of the provided NPC. This is their base disposition, before modifiers such as personality and faction relations are taken into account. +-- @function [parent=#NPC] getBaseDisposition +-- @param openmw.core#GameObject object +-- @param openmw.core#GameObject player The player that you want to check the disposition for. +-- @return #number + +--- +-- Set the base disposition of the provided NPC. +-- @function [parent=#NPC] setBaseDisposition +-- @param openmw.core#GameObject object +-- @param openmw.core#GameObject player The player that you want to set the disposition for. +-- @param #number value BaseDisposition is set to this value + +--- +-- Modify the base disposition of the provided NPC by a certain amount. +-- @function [parent=#NPC] modBaseDisposition +-- @param openmw.core#GameObject object +-- @param openmw.core#GameObject player The player that you want to modify the disposition for. +-- @param #number value Base disposition modification value + --- -- Get the total weight that the actor can carry. -- @function [parent=#NPC] getCapacity