diff --git a/game/engines/default/engine/interface/ActorTalents.lua b/game/engines/default/engine/interface/ActorTalents.lua index f510797e0995ff796b563d5c43bb7344f2cf114d..fc99dc9d820c3565c09c2a1629ea110b6ccfbdab 100644 --- a/game/engines/default/engine/interface/ActorTalents.lua +++ b/game/engines/default/engine/interface/ActorTalents.lua @@ -174,7 +174,11 @@ function _M:useTalent(id, who, force_level, ignore_cd, force_target, silent, no_ -- cancel checked in coroutine success, err = coroutine.resume(co) end - if not success and err then print(debug.traceback(co)) error(err) end + if not success and err then + print(debug.traceback(co)) + self:onTalentLuaError(err) + error(err) + end elseif ab.mode == "sustained" and ab.activate and ab.deactivate then if self:isTalentCoolingDown(ab) and not ignore_cd then game.logPlayer(who, "%s is still on cooldown for %d turns.", ab.name:capitalize(), self.talents_cd[ab.id]) @@ -280,6 +284,13 @@ function _M:postUseTalent(talent, ret, silent) return true end +--- Called if a talent errors out +-- @param ab the talent +-- @param err the error +function _M:onTalentLuaError(ab, err) + return +end + --- Force a talent to activate without using energy or such -- "def" can have a field "ignore_energy" to not consume energy; other parameters can be passed and handled by an overload of this method. -- Object activation interface calls this method with an "ignore_ressources" parameter diff --git a/game/modules/tome/class/NPC.lua b/game/modules/tome/class/NPC.lua index 1813144a0255ae721c51235e29fd44e9ebdc6bdd..65e4805feead0f64d18e47a87fea5480034740b8 100644 --- a/game/modules/tome/class/NPC.lua +++ b/game/modules/tome/class/NPC.lua @@ -108,6 +108,10 @@ local function spotHostiles(self) return seen end +function _M:onTalentLuaError(ab, err) + self:useEnergy() -- prevent infinitely long erroring out turns +end + --- Try to auto use listed talents -- This should be called in your actors "act()" method function _M:automaticTalents()