diff --git a/game/engine/Savefile.lua b/game/engine/Savefile.lua index e2c24fa9cf95930c2d1999d6f3aeca209449e108..a6adb5b4e4d2f9036b09ccbe4e8ad60b144accee 100644 --- a/game/engine/Savefile.lua +++ b/game/engine/Savefile.lua @@ -130,7 +130,7 @@ end function _M:loadReal(load) if self.loaded[load] then return self.loaded[load] end local f = fs.open(self.load_dir..load, "r") - print("loading", load) +-- print("loading", load) local lines = {} while true do local l = f:read() diff --git a/game/engine/class.lua b/game/engine/class.lua index eb31aeb0a1feff99ad1e4cf6f99f396d91cd4621..4094960f107e04b8290d467206b7fa261686f926 100644 --- a/game/engine/class.lua +++ b/game/engine/class.lua @@ -173,7 +173,7 @@ local function deserialize(string, src) if err then print("error deserializing", string, err) end setfenv(f, { setLoaded = function(name, t) - print("[setLoaded]", name, t) +-- print("[setLoaded]", name, t) engine.Savefile.current_save.loaded[name] = t end, loadstring = loadstring, diff --git a/game/engine/interface/GameMusic.lua b/game/engine/interface/GameMusic.lua index 4e6eac82bd976ffdbbb62df54923aabb0880d54d..7594d27281ec595deea7c6763afac940be1bd94c 100644 --- a/game/engine/interface/GameMusic.lua +++ b/game/engine/interface/GameMusic.lua @@ -16,6 +16,7 @@ end function _M:playMusic(name) name = name or self.current_music + if not name then return end local m = self.loaded_musics[name] if not m then self.loaded_musics[name] = core.sound.newMusic("/data/music/"..name) diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 0934f53ff34dd5c94a226f6a783975cbe256c270..463d04adadaab84ff084ac0277445307dd9f7ab4 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -108,6 +108,8 @@ function _M:act() t.do_storm(self, t) end + if self:attr("stunned") then self.energy.value = 0 end + -- Suffocate ? local air_level = game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "air_level") if air_level then self:suffocate(-air_level, self) end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index f0567ca2e43e62f7474effdca8e3ca12b8a7d222..a59d40da9cb866955448fd977b8f4a8450180f09 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -382,7 +382,7 @@ function _M:setupCommands() self.key:addCommands{ [{"_d","ctrl"}] = function() - if config.settings.tome.cheat then self:changeLevel(5, "tower-amon-sul") end + if config.settings.tome.cheat then self:changeLevel(7, "sandworm-lair") end end, } self.key:addBinds diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua index 51dce4c06dca45f14017ab5be1b4d54707c873eb..401ee5fc6cd5c4a5718a8350d6573bb43ff9be54 100644 --- a/game/modules/tome/class/Object.lua +++ b/game/modules/tome/class/Object.lua @@ -14,6 +14,8 @@ module(..., package.seeall, class.inherit( )) function _M:init(t, no_default) + t.encumber = t.encumber or 0 + engine.Object.init(self, t, no_default) engine.interface.ObjectActivable.init(self, t) engine.interface.ObjectIdentify.init(self, t) diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua index 438a96dff39451a0cecba20928aaa97e41585977..4662b2866c3357c9fee18c2ba3e4df0b52384cf0 100644 --- a/game/modules/tome/class/interface/Combat.lua +++ b/game/modules/tome/class/interface/Combat.lua @@ -152,7 +152,7 @@ function _M:archeryShoot(damtype, mult, on_hit, tg, params) dam = rng.range(dam, dam * damrange) print("[ATTACK] after range", dam) local crit - dam, crit = self:physicalCrit(dam, ammo) + dam, crit = self:physicalCrit(dam, ammo, target) print("[ATTACK] after crit", dam) dam = dam * mult print("[ATTACK] after mult", dam) @@ -233,7 +233,7 @@ function _M:attackTargetWith(target, weapon, damtype, mult) dam = rng.range(dam, dam * damrange) print("[ATTACK] after range", dam) local crit - dam, crit = self:physicalCrit(dam, weapon) + dam, crit = self:physicalCrit(dam, weapon, target) print("[ATTACK] after crit", dam) dam = dam * mult print("[ATTACK] after mult", dam) @@ -381,15 +381,16 @@ function _M:combatSpellSpeed() end --- Computes physical crit for a damage -function _M:physicalCrit(dam, weapon) +function _M:physicalCrit(dam, weapon, target) if self:isTalentActive(self.T_STEALTH) and self:knowTalent(self.T_SHADOWSTRIKE) then return dam * (2 + self:getTalentLevel(self.T_SHADOWSTRIKE) / 5), true end local chance = self:combatCrit(weapon) local crit = false - if self:knowTalent(self.T_BACKSTAB) then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end + if self:knowTalent(self.T_BACKSTAB) and target:attr("stunned") then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end + print("[PHYS CRIT %]", chance) if rng.percent(chance) then dam = dam * 2 crit = true @@ -405,8 +406,9 @@ function _M:spellCrit(dam) local chance = self:combatSpellCrit() local crit = false - if self:knowTalent(self.T_BACKSTAB) then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end +-- if self:knowTalent(self.T_BACKSTAB) then chance = chance + self:getTalentLevel(self.T_BACKSTAB) * 10 end + print("[SPELL CRIT %]", chance) if rng.percent(chance) then dam = dam * 2 crit = true diff --git a/game/modules/tome/data/talents/cunning/dirty.lua b/game/modules/tome/data/talents/cunning/dirty.lua index 4f17e97a3c8ce591b1e1aea1e69c62cbccb60d82..01820d09a7cd4542b10b383ffd077d0d8caf5797 100644 --- a/game/modules/tome/data/talents/cunning/dirty.lua +++ b/game/modules/tome/data/talents/cunning/dirty.lua @@ -76,3 +76,39 @@ newTalent{ end, } +newTalent{ + name = "Cripple", + type = {"cunning/dirty", 4}, + points = 5, + cooldown = 25, + stamina = 30, + require = cuns_req4, + action = function(self, t) + local tg = {type="hit", range=self:getTalentRange(t)} + local x, y, target = self:getTarget(tg) + if not x or not y or not target then return nil end + if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end + local hitted = self:attackTarget(target, nil, 0.9 + self:getTalentLevel(t) / 9, true) + + if hitted then + if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) then + local tw = target:getInven("MAINHAND") + if tw then + tw = tw[1] and tw[1].combat + end + tw = tw or target.combat + local atk = target:combatAttack(tw) * (10 + self:getTalentLevel(t) * 3) / 100 + local dam = target:combatDamage(tw) * (10 + self:getTalentLevel(t) * 4) / 100 + target:setEffect(target.EFF_CRIPPLE, 3 + math.ceil(self:getTalentLevel(t)), {atk=atk, dam=dam}) + else + game.logSeen(target, "%s is not crippled!", target.name:capitalize()) + end + end + + return true + end, + info = function(self, t) + return ([[You hit your target doing %d%% damage. If your attack hits the target is cripple for %d turns, losing %d%% attack and %d%% damage.]]): + format(100 * (0.9 + self:getTalentLevel(t) / 9), 3 + math.ceil(self:getTalentLevel(t)), 10 + self:getTalentLevel(t) * 3, 10 + self:getTalentLevel(t) * 4) + end, +} diff --git a/game/modules/tome/data/talents/cunning/lethality.lua b/game/modules/tome/data/talents/cunning/lethality.lua index 7df0d51221e712df80d9799251620cdbf48ef153..fb72020e0dfe7ff462d58998e10d6a74ce31dd37 100644 --- a/game/modules/tome/data/talents/cunning/lethality.lua +++ b/game/modules/tome/data/talents/cunning/lethality.lua @@ -37,4 +37,23 @@ newTalent{ The APR will increase with Cunning.]]): format(100 * (0.8 + self:getTalentLevel(t) / 10), 4 + (self:getTalentLevel(t) * self:getCun()) / 20, 5 + math.ceil(self:getTalentLevel(t))) end, -} \ No newline at end of file +} + +newTalent{ + name = "Willful Combat", + type = {"cunning/lethality", 3}, + points = 5, + cooldown = 60, + stamina = 25, + require = cuns_req3, + action = function(self, t) + local dur = 3 + math.ceil(self:getTalentLevel(t) * 1.5) + local power = self:getWil(70) + self:setEffect(self.EFF_WILLFUL_COMBAT, dur, {power=power}) + return true + end, + info = function(self, t) + return ([[For a %d turns you put all your will into your blows, additing %d (based on Willpower) damage to each strikes.]]): + format(3 + math.ceil(self:getTalentLevel(t) * 1.5), self:getWil(70)) + end, +} diff --git a/game/modules/tome/data/talents/cunning/survival.lua b/game/modules/tome/data/talents/cunning/survival.lua index 405513c2a42db072933e121c1ee10b347f1fed30..8079d77ed3ae0bdb5bf4c01ee183605a81780917 100644 --- a/game/modules/tome/data/talents/cunning/survival.lua +++ b/game/modules/tome/data/talents/cunning/survival.lua @@ -40,3 +40,15 @@ newTalent{ format(self:getTalentLevel(t) * self:getCun(25)) end, } + +newTalent{ + name = "Long Strides", + type = {"cunning/survival", 4}, + require = cuns_req4, + mode = "passive", + points = 5, + info = function(self, t) + return ([[Reduces the movement penality when moving over dangerous terrain.]]): + format() + end, +} diff --git a/game/modules/tome/data/talents/techniques/archery.lua b/game/modules/tome/data/talents/techniques/archery.lua index e56e1c3f6a8087302cd0e6e8647b119517176d6c..66f99469f6b30727f16c218d91a6733ea08c6ba8 100644 --- a/game/modules/tome/data/talents/techniques/archery.lua +++ b/game/modules/tome/data/talents/techniques/archery.lua @@ -128,7 +128,7 @@ newTalent{ end, } --------------------------------- Urtility ----------------------------------- +-------------------------------- Utility ----------------------------------- newTalent{ name = "Ammo Creation", diff --git a/game/modules/tome/data/timed_effects.lua b/game/modules/tome/data/timed_effects.lua index cd5aadcf90bfc8ae4a1c196cc22a97316851118c..dcb94c33c4dfa33ba26775413df266fc879e3238 100644 --- a/game/modules/tome/data/timed_effects.lua +++ b/game/modules/tome/data/timed_effects.lua @@ -89,14 +89,10 @@ newEffect{ self.color_b = 155 game.level.map:updateMap(self.x, self.y) - -- Frozen, cannot act - self.energy.value = 0 - end, - on_timeout = function(self, eff) - -- Frozen, cannot act - self.energy.value = 0 + eff.tmpid = self:addTemporaryValue("stunned", 1) end, deactivate = function(self, eff) + self:removeTemporaryValue("stunned", eff.tmpid) self.color_r = eff.old_r self.color_g = eff.old_g self.color_b = eff.old_b @@ -112,12 +108,14 @@ newEffect{ on_gain = function(self, err) return "#Target# is stunned by the burning flame!", "+Burning Shock" end, on_lose = function(self, err) return "#Target# is not stunned anymore.", "-Burning Shock" end, activate = function(self, eff) - self.energy.value = 0 + eff.tmpid = self:addTemporaryValue("stunned", 1) end, on_timeout = function(self, eff) - self.energy.value = 0 DamageType:get(DamageType.FIRE).projector(eff.src, self.x, self.y, DamageType.FIRE, eff.power) end, + deactivate = function(self, eff) + self:removeTemporaryValue("stunned", eff.tmpid) + end, } newEffect{ @@ -129,12 +127,10 @@ newEffect{ on_gain = function(self, err) return "#Target# is stunned!", "+Stunned" end, on_lose = function(self, err) return "#Target# is not stunned anymore.", "-Stunned" end, activate = function(self, eff) - -- Frozen, cannot act - self.energy.value = 0 + eff.tmpid = self:addTemporaryValue("stunned", 1) end, - on_timeout = function(self, eff) - -- Frozen, cannot act - self.energy.value = 0 + deactivate = function(self, eff) + self:removeTemporaryValue("stunned", eff.tmpid) end, } @@ -550,3 +546,37 @@ newEffect{ self:removeTemporaryValue("inc_stats", eff.tmpid) end, } + +newEffect{ + name = "CRIPPLE", + desc = "Cripple", + type = "physical", + status = "detrimental", + parameters = { atk=10, dam=10 }, + on_gain = function(self, err) return "#Target# is crippled." end, + on_lose = function(self, err) return "#Target# is not cripple anymore." end, + activate = function(self, eff) + eff.atkid = self:addTemporaryValue("combat_atk", -eff.atk) + eff.damid = self:addTemporaryValue("combat_dam", -eff.dam) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("combat_atk", eff.atkid) + self:removeTemporaryValue("combat_dam", eff.damid) + end, +} + +newEffect{ + name = "WILLFUL_COMBAT", + desc = "Willful Combat", + type = "physical", + status = "beneficial", + parameters = { power=10 }, + on_gain = function(self, err) return "#Target# lashes out with pure willpower." end, + on_lose = function(self, err) return "#Target# willpower rush ends.." end, + activate = function(self, eff) + eff.tmpid = self:addTemporaryValue("combat_dam", eff.power) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("combat_dam", eff.tmpid) + end, +} diff --git a/ideas/cunning.ods b/ideas/cunning.ods index 58e479e81f19319e7c7f14322aef39f7e20fe018..4f3b823ab01ac7fe9959d7d006d265c14ab24e8c 100644 Binary files a/ideas/cunning.ods and b/ideas/cunning.ods differ