mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-08-03 23:36:59 -04:00
Write an _onJailTimeServed engine handler and do all of jail skill modifications in lua.
This commit is contained in:
parent
7943d1147f
commit
c970f38e96
@ -75,6 +75,7 @@ namespace MWBase
|
|||||||
const MWRender::AnimPriority& priority, int blendMask, bool autodisable, float speedmult,
|
const MWRender::AnimPriority& priority, int blendMask, bool autodisable, float speedmult,
|
||||||
std::string_view start, std::string_view stop, float startpoint, uint32_t loops, bool loopfallback)
|
std::string_view start, std::string_view stop, float startpoint, uint32_t loops, bool loopfallback)
|
||||||
= 0;
|
= 0;
|
||||||
|
virtual void jailTimeServed(const MWWorld::Ptr& actor, int days) = 0;
|
||||||
virtual void skillLevelUp(const MWWorld::Ptr& actor, ESM::RefId skillId, std::string_view source) = 0;
|
virtual void skillLevelUp(const MWWorld::Ptr& actor, ESM::RefId skillId, std::string_view source) = 0;
|
||||||
virtual void skillUse(const MWWorld::Ptr& actor, ESM::RefId skillId, int useType, float scale) = 0;
|
virtual void skillUse(const MWWorld::Ptr& actor, ESM::RefId skillId, int useType, float scale) = 0;
|
||||||
virtual void onHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, const MWWorld::Ptr& weapon,
|
virtual void onHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, const MWWorld::Ptr& weapon,
|
||||||
|
@ -87,17 +87,6 @@ namespace MWGui
|
|||||||
|
|
||||||
// We should not worsen corprus when in prison
|
// We should not worsen corprus when in prison
|
||||||
player.getClass().getCreatureStats(player).getActiveSpells().skipWorsenings(mDays * 24);
|
player.getClass().getCreatureStats(player).getActiveSpells().skipWorsenings(mDays * 24);
|
||||||
|
MWBase::Environment::get().getLuaManager()->jailTimeServed(player, mDays);
|
||||||
const auto& skillStore = MWBase::Environment::get().getESMStore()->get<ESM::Skill>();
|
|
||||||
std::set<const ESM::Skill*> skills;
|
|
||||||
for (int day = 0; day < mDays; ++day)
|
|
||||||
{
|
|
||||||
auto& prng = MWBase::Environment::get().getWorld()->getPrng();
|
|
||||||
const ESM::Skill* skill = skillStore.searchRandom({}, prng);
|
|
||||||
skills.insert(skill);
|
|
||||||
|
|
||||||
MWMechanics::SkillValue& value = player.getClass().getNpcStats(player).getSkill(skill->mId);
|
|
||||||
MWBase::Environment::get().getLuaManager()->skillLevelUp(player, skill->mId, "jail");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,6 +113,15 @@ namespace MWLua
|
|||||||
scripts->onSkillLevelUp(event.mSkill, event.mSource);
|
scripts->onSkillLevelUp(event.mSkill, event.mSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void operator()(const OnJailTimeServed& event) const
|
||||||
|
{
|
||||||
|
MWWorld::Ptr actor = getPtr(event.mActor);
|
||||||
|
if (actor.isEmpty())
|
||||||
|
return;
|
||||||
|
if (auto* scripts = getLocalScripts(actor))
|
||||||
|
scripts->onJailTimeServed(event.mDays);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MWWorld::Ptr getPtr(ESM::RefNum id) const
|
MWWorld::Ptr getPtr(ESM::RefNum id) const
|
||||||
{
|
{
|
||||||
|
@ -70,8 +70,13 @@ namespace MWLua
|
|||||||
std::string mSkill;
|
std::string mSkill;
|
||||||
std::string mSource;
|
std::string mSource;
|
||||||
};
|
};
|
||||||
|
struct OnJailTimeServed
|
||||||
|
{
|
||||||
|
ESM::RefNum mActor;
|
||||||
|
int mDays;
|
||||||
|
};
|
||||||
using Event = std::variant<OnActive, OnInactive, OnConsume, OnActivate, OnUseItem, OnNewExterior, OnTeleported,
|
using Event = std::variant<OnActive, OnInactive, OnConsume, OnActivate, OnUseItem, OnNewExterior, OnTeleported,
|
||||||
OnAnimationTextKey, OnSkillUse, OnSkillLevelUp>;
|
OnAnimationTextKey, OnSkillUse, OnSkillLevelUp, OnJailTimeServed>;
|
||||||
|
|
||||||
void clear() { mQueue.clear(); }
|
void clear() { mQueue.clear(); }
|
||||||
void addToQueue(Event e) { mQueue.push_back(std::move(e)); }
|
void addToQueue(Event e) { mQueue.push_back(std::move(e)); }
|
||||||
|
@ -232,7 +232,7 @@ namespace MWLua
|
|||||||
[&](LuaUtil::LuaView& view) { addPackage("openmw.self", sol::make_object(view.sol(), &mData)); });
|
[&](LuaUtil::LuaView& view) { addPackage("openmw.self", sol::make_object(view.sol(), &mData)); });
|
||||||
registerEngineHandlers({ &mOnActiveHandlers, &mOnInactiveHandlers, &mOnConsumeHandlers, &mOnActivatedHandlers,
|
registerEngineHandlers({ &mOnActiveHandlers, &mOnInactiveHandlers, &mOnConsumeHandlers, &mOnActivatedHandlers,
|
||||||
&mOnTeleportedHandlers, &mOnAnimationTextKeyHandlers, &mOnPlayAnimationHandlers, &mOnSkillUse,
|
&mOnTeleportedHandlers, &mOnAnimationTextKeyHandlers, &mOnPlayAnimationHandlers, &mOnSkillUse,
|
||||||
&mOnSkillLevelUp });
|
&mOnSkillLevelUp, &mOnJailTimeServed });
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalScripts::setActive(bool active, bool callHandlers)
|
void LocalScripts::setActive(bool active, bool callHandlers)
|
||||||
|
@ -89,6 +89,7 @@ namespace MWLua
|
|||||||
{
|
{
|
||||||
callEngineHandlers(mOnSkillLevelUp, skillId, source);
|
callEngineHandlers(mOnSkillLevelUp, skillId, source);
|
||||||
}
|
}
|
||||||
|
void onJailTimeServed(int days) { callEngineHandlers(mOnJailTimeServed, days); }
|
||||||
|
|
||||||
void applyStatsCache();
|
void applyStatsCache();
|
||||||
|
|
||||||
@ -118,6 +119,7 @@ namespace MWLua
|
|||||||
EngineHandlerList mOnPlayAnimationHandlers{ "_onPlayAnimation" };
|
EngineHandlerList mOnPlayAnimationHandlers{ "_onPlayAnimation" };
|
||||||
EngineHandlerList mOnSkillUse{ "_onSkillUse" };
|
EngineHandlerList mOnSkillUse{ "_onSkillUse" };
|
||||||
EngineHandlerList mOnSkillLevelUp{ "_onSkillLevelUp" };
|
EngineHandlerList mOnSkillLevelUp{ "_onSkillLevelUp" };
|
||||||
|
EngineHandlerList mOnJailTimeServed{ "_onJailTimeServed" };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -490,6 +490,12 @@ namespace MWLua
|
|||||||
EngineEvents::OnSkillLevelUp{ getId(actor), skillId.serializeText(), std::string(source) });
|
EngineEvents::OnSkillLevelUp{ getId(actor), skillId.serializeText(), std::string(source) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LuaManager::jailTimeServed(const MWWorld::Ptr& actor, int days)
|
||||||
|
{
|
||||||
|
mEngineEvents.addToQueue(
|
||||||
|
EngineEvents::OnJailTimeServed{ getId(actor), days });
|
||||||
|
}
|
||||||
|
|
||||||
void LuaManager::onHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, const MWWorld::Ptr& weapon,
|
void LuaManager::onHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, const MWWorld::Ptr& weapon,
|
||||||
const MWWorld::Ptr& ammo, int attackType, float attackStrength, float damage, bool isHealth,
|
const MWWorld::Ptr& ammo, int attackType, float attackStrength, float damage, bool isHealth,
|
||||||
const osg::Vec3f& hitPos, bool successful, MWMechanics::DamageSourceType sourceType)
|
const osg::Vec3f& hitPos, bool successful, MWMechanics::DamageSourceType sourceType)
|
||||||
|
@ -92,6 +92,7 @@ namespace MWLua
|
|||||||
bool loopfallback) override;
|
bool loopfallback) override;
|
||||||
void skillUse(const MWWorld::Ptr& actor, ESM::RefId skillId, int useType, float scale) override;
|
void skillUse(const MWWorld::Ptr& actor, ESM::RefId skillId, int useType, float scale) override;
|
||||||
void skillLevelUp(const MWWorld::Ptr& actor, ESM::RefId skillId, std::string_view source) override;
|
void skillLevelUp(const MWWorld::Ptr& actor, ESM::RefId skillId, std::string_view source) override;
|
||||||
|
void jailTimeServed(const MWWorld::Ptr& actor, int days) override;
|
||||||
void onHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, const MWWorld::Ptr& weapon,
|
void onHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& victim, const MWWorld::Ptr& weapon,
|
||||||
const MWWorld::Ptr& ammo, int attackType, float attackStrength, float damage, bool isHealth,
|
const MWWorld::Ptr& ammo, int attackType, float attackStrength, float damage, bool isHealth,
|
||||||
const osg::Vec3f& hitPos, bool successful, MWMechanics::DamageSourceType sourceType) override;
|
const osg::Vec3f& hitPos, bool successful, MWMechanics::DamageSourceType sourceType) override;
|
||||||
|
@ -37,30 +37,7 @@ local function processAutomaticDoors()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local jailDays = 0
|
|
||||||
local jailReport = nil
|
|
||||||
|
|
||||||
local function skillLevelUpHandler(skillid, source, params)
|
local function skillLevelUpHandler(skillid, source, params)
|
||||||
if not params.skillIncreaseValue then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if source == 'jail' then
|
|
||||||
-- All jail time skill changes are reported one by one, and then collected into
|
|
||||||
-- a single report after all changes are made.
|
|
||||||
if not jailReport then
|
|
||||||
jailReport = {}
|
|
||||||
jailDays = 0
|
|
||||||
end
|
|
||||||
-- Record the skill change for use by the report in determining if the skill
|
|
||||||
-- increased or decreased
|
|
||||||
jailReport[skillid] = params.skillIncreaseValue + (jailReport[skillid] or 0)
|
|
||||||
|
|
||||||
-- For now we can know that this will be called exactly once per day in jail.
|
|
||||||
-- Allowing this script to track how many days were spent in jail.
|
|
||||||
jailDays = jailDays + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
local skillStat = NPC.stats.skills[skillid](self)
|
local skillStat = NPC.stats.skills[skillid](self)
|
||||||
if (skillStat.base >= 100 and params.skillIncreaseValue > 0) or
|
if (skillStat.base >= 100 and params.skillIncreaseValue > 0) or
|
||||||
(skillStat.base <= 0 and params.skillIncreaseValue < 0) then
|
(skillStat.base <= 0 and params.skillIncreaseValue < 0) then
|
||||||
@ -109,27 +86,44 @@ local function skillLevelUpHandler(skillid, source, params)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function doJailReport()
|
local function jailTimeServed(days)
|
||||||
|
if not days or days <= 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local oldSkillLevels = {}
|
||||||
|
local skillByNumber = {}
|
||||||
|
for skillid, skillStat in pairs(NPC.stats.skills) do
|
||||||
|
oldSkillLevels[skillid] = skillStat(self).base
|
||||||
|
skillByNumber[#skillByNumber+1] = skillid
|
||||||
|
end
|
||||||
|
|
||||||
|
math.randomseed(core.getSimulationTime())
|
||||||
|
for day=1,days do
|
||||||
|
local skillid = skillByNumber[math.random(#skillByNumber)]
|
||||||
|
-- skillLevelUp() handles skill-based increase/decrease
|
||||||
|
I.SkillProgression.skillLevelUp(skillid, I.SkillProgression.SKILL_INCREASE_SOURCES.Jail)
|
||||||
|
end
|
||||||
|
|
||||||
local message = ''
|
local message = ''
|
||||||
if days == 1 then
|
if days == 1 then
|
||||||
message = string.format(core.getGMST('sNotifyMessage42'), jailDays)
|
message = string.format(core.getGMST('sNotifyMessage42'), days)
|
||||||
else
|
else
|
||||||
message = string.format(core.getGMST('sNotifyMessage43'), jailDays)
|
message = string.format(core.getGMST('sNotifyMessage43'), days)
|
||||||
end
|
end
|
||||||
for skillid, diff in pairs(jailReport) do
|
for skillid, skillStat in pairs(NPC.stats.skills) do
|
||||||
local skillBase = NPC.stats.skills[skillid](self).base
|
local diff = skillStat(self).base - oldSkillLevels[skillid]
|
||||||
local skillMsg = core.getGMST('sNotifyMessage39')
|
if diff ~= 0 then
|
||||||
if diff < 0 then
|
local skillMsg = core.getGMST('sNotifyMessage39')
|
||||||
skillMsg = core.getGMST('sNotifyMessage44')
|
if diff < 0 then
|
||||||
|
skillMsg = core.getGMST('sNotifyMessage44')
|
||||||
|
end
|
||||||
|
local skillRecord = Skill.record(skillid)
|
||||||
|
message = message..'\n'..string.format(skillMsg, skillRecord.name, skillStat(self).base)
|
||||||
end
|
end
|
||||||
local skillRecord = Skill.record(skillid)
|
|
||||||
message = message..'\n'..string.format(skillMsg, skillRecord.name, skillBase)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
ui.showMessageBox(message)
|
I.UI.showInteractiveMessage(message)
|
||||||
|
|
||||||
jailReport = nil
|
|
||||||
jailDays = 0
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function skillUsedHandler(skillid, params)
|
local function skillUsedHandler(skillid, params)
|
||||||
@ -166,6 +160,7 @@ I.SkillProgression.addSkillLevelUpHandler(skillLevelUpHandler)
|
|||||||
return {
|
return {
|
||||||
engineHandlers = {
|
engineHandlers = {
|
||||||
onUpdate = onUpdate,
|
onUpdate = onUpdate,
|
||||||
|
_onJailTimeServed = jailTimeServed,
|
||||||
},
|
},
|
||||||
|
|
||||||
eventHandlers = {
|
eventHandlers = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user