diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua index 72fc581b499bad17ae41c09c5fbae941b49127c9..596ea974821dbd60cebf6469fbd0b25ac95f00ed 100644 --- a/game/modules/tome/class/interface/Combat.lua +++ b/game/modules/tome/class/interface/Combat.lua @@ -1281,6 +1281,12 @@ function _M:combatArmor() if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then add = add + self:callTalent(self.T_ARMOUR_OF_SHADOWS,"ArmourBonus") end + local light_armor = self:hasLightArmor() + if light_armor then + if self:knowTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE) then + add = add + self:callTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE, "getArmour") + end + end if self:knowTalent(self.T_CORRUPTED_SHELL) then add = add + self:getCon() / 3.5 end @@ -1297,9 +1303,6 @@ end function _M:combatArmorHardiness() local add = 0 local multi = 1 - if self:knowTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE) then - add = add + self:callTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE, "getHardiness") - end if self:hasHeavyArmor() and self:knowTalent(self.T_ARMOUR_TRAINING) then local at = Talents:getTalentFromId(Talents.T_ARMOUR_TRAINING) add = add + at.getArmorHardiness(self, at) @@ -1316,6 +1319,9 @@ function _M:combatArmorHardiness() if self:knowTalent(self.T_LIGHT_ARMOUR_TRAINING) then add = add + self:callTalent(self.T_LIGHT_ARMOUR_TRAINING, "getArmorHardiness") end + if self:knowTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE) then + add = add + self:callTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE, "getArmorHardiness") + end end if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then add = add + 50 diff --git a/game/modules/tome/data/chats/escort-quest.lua b/game/modules/tome/data/chats/escort-quest.lua index 503f4f9b9cd707247c22887213c797709955c10b..c3c268cbe5d81d0d5e0cd5171ef57c4b523a70d9 100644 --- a/game/modules/tome/data/chats/escort-quest.lua +++ b/game/modules/tome/data/chats/escort-quest.lua @@ -150,7 +150,7 @@ local reward_types = { ["psionic/feedback"] = 0.8, }, talents = { - [Talents.T_BIOFEEDBACK] = 1, + [Talents.T_RESONANCE_FIELD] = 1, [Talents.T_CONVERSION] = 1, }, saves = { spell = 4, mental = 4 }, diff --git a/game/modules/tome/data/talents/celestial/combat.lua b/game/modules/tome/data/talents/celestial/combat.lua index 1371f2de6daa6b0493be6bb2e27b0f11f4318c42..7dc2df3e52408a1f880ccf45c156de8ba407187f 100644 --- a/game/modules/tome/data/talents/celestial/combat.lua +++ b/game/modules/tome/data/talents/celestial/combat.lua @@ -31,7 +31,7 @@ newTalent{ range = 10, getDamage = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end, getShieldFlat = function(self, t) - return t.getDamage(self, t) / 2 + return t.getDamage(self, t) end, activate = function(self, t) game:playSoundNear(self, "talents/spell_generic2") @@ -45,7 +45,9 @@ newTalent{ return true end, callbackOnMeleeAttack = function(self, t, target, hitted, crit, weapon, damtype, mult, dam) + if self.turn_procs.weapon_of_light then return end if hitted and self:hasEffect(self.EFF_DAMAGE_SHIELD) and (self:reactionToward(target) < 0) then + self.turn_procs.weapon_of_light = true -- Shields can't usually merge, so change the parameters manually local shield = self:hasEffect(self.EFF_DAMAGE_SHIELD) local shield_power = t.getShieldFlat(self, t) @@ -56,6 +58,7 @@ newTalent{ shield.dur = math.max(2, shield.dur) -- Limit the number of times a shield can be extended, Bathe in Light also uses this code + -- The shield is removed instead of just blocking the extension to prevent scenarios such as maxing it out of combat then engaging, but there are likely better ways if shield.dur_extended then shield.dur_extended = shield.dur_extended + 1 if shield.dur_extended >= 20 then @@ -64,13 +67,12 @@ newTalent{ end else shield.dur_extended = 1 end end - end, info = function(self, t) local damage = t.getDamage(self, t) local shieldflat = t.getShieldFlat(self, t) return ([[Infuse your weapon with the power of the Sun, adding %0.1f light damage on each melee hit. - Additionally, if you have a temporary damage shield active, melee attacks will increase its power by %d. + Additionally, if you have a temporary damage shield active, melee hits will increase its power by %d once per turn. If the same shield is refreshed 20 times it will become unstable and explode, removing it. The damage dealt and shield bonus will increase with your Spellpower.]]): format(damDesc(self, DamageType.LIGHT, damage), shieldflat) @@ -176,7 +178,8 @@ newTalent{ local damagepct = t.getLifeDamage(self, t) local damage = t.getDamage(self, t) return ([[Your weapon attacks burn with righteous fury, dealing %d%% of your lost HP as additional Fire damage (up to %d, Current: %d). - Targets struck are also afflicted with a Martyrdom effect that causes them to take %d%% of all damage they deal for 4 turns.]]): + Targets struck are also afflicted with a Martyrdom effect that causes them to take %d%% of all damage they deal for 4 turns. + The bonus damage can only occur once per turn.]]): format(damagepct*100, t.getMaxDamage(self, t, 10, 400), damage, martyr) end, } diff --git a/game/modules/tome/data/talents/celestial/crusader.lua b/game/modules/tome/data/talents/celestial/crusader.lua index 80823d242651752a39eb517ca036b07edbb1e62f..c3450289314a755f13a27b915c80acb0ea15df80 100644 --- a/game/modules/tome/data/talents/celestial/crusader.lua +++ b/game/modules/tome/data/talents/celestial/crusader.lua @@ -81,12 +81,12 @@ newTalent{ local x, y, target = self:getTarget(tg) if not x or not y or not target then return nil end if core.fov.distance(self.x, self.y, x, y) > 5 then return nil end - target:setEffect(target.EFF_MARK_OF_LIGHT, 5, {src=self, power=t.getPower(self, t)}) + target:setEffect(target.EFF_MARK_OF_LIGHT, 3, {src=self, power=t.getPower(self, t)}) return true end, info = function(self, t) - return ([[You mark a target with light for 5 turns, causing all melee hits you deal to it to heal you for %d%% of the damage done.]]): + return ([[You mark a target with light for 3 turns, causing all melee hits you deal to it to heal you for %d%% of the damage done.]]): format(t.getPower(self, t)) end, } @@ -135,7 +135,7 @@ newTalent{ require = divi_req_high4, random_ego = "attack", points = 5, - cooldown = 9, + cooldown = 12, positive = 15, tactical = { ATTACKAREA = {LIGHT = 2} }, range = 0, diff --git a/game/modules/tome/data/talents/celestial/radiance.lua b/game/modules/tome/data/talents/celestial/radiance.lua index d8e5fefcfb698d05599100ec643da612bdab668c..c8bf8af99fefca60ea215c61cb15fbbb0053b5a6 100644 --- a/game/modules/tome/data/talents/celestial/radiance.lua +++ b/game/modules/tome/data/talents/celestial/radiance.lua @@ -18,11 +18,7 @@ -- darkgod@te4.org function radianceRadius(self) - if self:hasEffect(self.EFF_RADIANCE_DIM) then - return 1 - else - return self:getTalentRadius(self:getTalentFromId(self.T_RADIANCE)) - end + return self:getTalentRadius(self:getTalentFromId(self.T_RADIANCE)) end newTalent{ @@ -31,7 +27,7 @@ newTalent{ mode = "passive", require = divi_req1, points = 5, - radius = function(self, t) return self:combatTalentScale(t, 3, 7) end, + radius = function(self, t) return self:combatTalentLimit(t, 14, 3, 10) end, getResist = function(self, t) return self:combatTalentLimit(t, 100, 25, 75) end, passives = function(self, t, p) self:talentTemporaryValue(p, "radiance_aura", radianceRadius(self)) @@ -57,20 +53,22 @@ newTalent{ callbackOnActBase = function(self, t) local radius = radianceRadius(self) local grids = core.fov.circle_grids(self.x, self.y, radius, true) + local ss = self:isTalentActive(self.T_SEARING_SIGHT) + local ss_talent = self:getTalentFromId(self.T_SEARING_SIGHT) + local damage = ss_talent.getDamage(self, ss_talent) + local daze = ss_talent.getDaze(self, ss_talent) + for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do local target = game.level.map(x, y, Map.ACTOR) if target and self ~= target then if (self:reactionToward(target) < 0) then target:setEffect(target.EFF_ILLUMINATION, 1, {power=t.getPower(self, t), def=t.getDef(self, t)}) - local ss = self:isTalentActive(self.T_SEARING_SIGHT) - if ss then - local dist = core.fov.distance(self.x, self.y, target.x, target.y) - 1 - local coeff = math.max(0.1, 1 - (0.1*dist)) -- 10% less damage per distance - DamageType:get(DamageType.LIGHT).projector(self, target.x, target.y, DamageType.LIGHT, ss.dam * coeff) - if ss.daze and rng.percent(ss.daze) and target:canBe("stun") then - target:setEffect(target.EFF_DAZED, 3, {apply_power=self:combatSpellpower()}) + if ss and not target:hasEffect(target.EFF_DAZED) then + DamageType:get(DamageType.LIGHT).projector(self, target.x, target.y, DamageType.LIGHT, damage) + if daze and rng.percent(ss.daze) and target:canBe("stun") then + target:setEffect(target.EFF_DAZED, 5, {apply_power=self:combatSpellpower()}) end end end - end end end + end end end end, info = function(self, t) return ([[The light of your Radiance allows you to see that which would normally be unseen. @@ -81,8 +79,6 @@ newTalent{ end, } --- This doesn't work well in practice.. Its powerful but it leads to cheesy gameplay, spams combat logs, maybe even lags --- It can stay like this for now but may be worth making better newTalent{ name = "Searing Sight", type = {"celestial/radiance",3}, @@ -94,7 +90,7 @@ newTalent{ tactical = { ATTACKAREA = {LIGHT=1} }, sustain_positive = 10, getDamage = function(self, t) return self:combatTalentSpellDamage(t, 1, 35) end, - getDaze = function(self, t) return self:combatTalentLimit(t, 35, 5, 20) end, + getDaze = function(self, t) return self:combatTalentLimit(t, 35, 5, 25) end, updateParticle = function(self, t) local p = self:isTalentActive(self.T_SEARING_SIGHT) if not p then return end @@ -102,12 +98,9 @@ newTalent{ p.particle = self:addParticles(Particles.new("circle", 1, {toback=true, oversize=1, a=20, appear=4, speed=-0.2, img="radiance_circle", radius=self:getTalentRange(t)})) end, activate = function(self, t) - local daze = nil - if self:getTalentLevel(t) >= 4 then daze = t.getDaze(self, t) end return { particle = self:addParticles(Particles.new("circle", 1, {toback=true, oversize=1, a=20, appear=4, speed=-0.2, img="radiance_circle", radius=self:getTalentRange(t)})), - dam=t.getDamage(self, t), - daze=daze, + daze=t.getDaze(self, t), } end, deactivate = function(self, t, p) @@ -115,8 +108,8 @@ newTalent{ return true end, info = function(self, t) - return ([[Your Radiance is so powerful it burns all foes caught in it, doing up to %0.1f light damage (reduced with distance) to all foes caught inside. - At level 4 the light is so bright it has %d%% chance to daze them for 3 turns. + return ([[Your Radiance is so powerful it burns all foes caught in it, doing %0.1f light damage to all non-dazed foes caught inside. + Each enemy effected has a %d%% chance of being dazed for 5 turns. The damage increases with your Spellpower.]]): format(damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getDaze(self, t)) end, @@ -163,14 +156,11 @@ newTalent{ ) game.zone:addEntity(game.level, proj, "projectile", self.x, self.y) end) - - -- EFF_RADIANCE_DIM does nothing by itself its just used by radianceRadius - self:setEffect(self.EFF_RADIANCE_DIM, 5, {}) return true end, info = function(self, t) - return ([[Fire a glowing orb of light at each enemy within your Radiance. Each orb will slowly follow its target until it connects dealing %d light damage to anything else it contacts along the way. When the target is reached the orb will explode dealing %d light damage and healing you for 50%% of the damage dealt. This powerful ability will dim your Radiance, reducing its radius to 1 for 5 turns.]]): + return ([[Fire a glowing orb of light at each enemy within your Radiance. Each orb will slowly follow its target until it connects dealing %d light damage to anything else it contacts along the way. When the target is reached the orb will explode dealing %d light damage in radius 1 and healing you for 50%% of the damage dealt.]]): format(t.getMoveDamage(self, t), t.getExplosionDamage(self, t)) end, } diff --git a/game/modules/tome/data/talents/techniques/buckler-training.lua b/game/modules/tome/data/talents/techniques/buckler-training.lua index e9a835e13a34d39f8b8c86a25d6267a074bca95d..9c61bd1ed705726a66068c1b351a56e9158666e3 100644 --- a/game/modules/tome/data/talents/techniques/buckler-training.lua +++ b/game/modules/tome/data/talents/techniques/buckler-training.lua @@ -35,8 +35,11 @@ newTalent { return self:combatLimit(self:getTalentLevel(t)*10+self:getCun()*0.5, 50, 5, 15, 25, 100) end, -- called by _M:combatArmorHardiness - getHardiness = function(self, t) - return 0 --self:getTalentLevel(t) * 4; + getArmorHardiness = function(self, t) + return self:combatTalentLimit(t, 30, 10, 25) + end, + getArmour = function(self, t) + return self:combatTalentLimit(t, 20, 3, 15) end, -- called by Combat.attackTargetWith shouldEvade = function(self, t) @@ -56,11 +59,13 @@ newTalent { end, info = function(self, t) local block = t.chance(self, t) - local armor = t.getHardiness(self, t) + local armour = t.getArmour(self,t) + local hardiness = t.getArmorHardiness(self, t) return ([[Allows shields to be equipped, using Cunning instead of strength as a requirement. When you are attacked in melee, you have a %d%% chance to deflect the attack with your shield, completely evading it. + In addition, as long as you are wearing armour no heavier than leather, you gain %d Armour and %d%% Armour hardiness. The chance to deflect increases with your Cunning.]]) - :format(block, armor) + :format(block, armour, hardiness) end, } diff --git a/game/modules/tome/data/talents/techniques/skirmisher-slings.lua b/game/modules/tome/data/talents/techniques/skirmisher-slings.lua index 346707eee4089d7ef0c8740b69bcacace8a356eb..ab50960e198677c75d0b9385b17e190f87799c70 100644 --- a/game/modules/tome/data/talents/techniques/skirmisher-slings.lua +++ b/game/modules/tome/data/talents/techniques/skirmisher-slings.lua @@ -117,11 +117,11 @@ newTalent { end, on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent, "sling") end, damage_multiplier = function(self, t) - return self:combatTalentWeaponDamage(t, 0.2, 0.8) + return self:combatTalentWeaponDamage(t, 0.4, 1.2) end, -- Maximum number of shots fired. limit_shots = function(self, t) - return math.floor(self:combatTalentScale(t, 6, 11, "log")) + return math.floor(self:combatTalentScale(t, 9, 16, "log")) end, action = function(self, t) -- Get list of possible targets, possibly doubled. diff --git a/game/modules/tome/data/talents/techniques/tireless-combatant.lua b/game/modules/tome/data/talents/techniques/tireless-combatant.lua index ffa54c972b010ac5fcc23956316726a83cda381f..f9d1e98262996d71dffe0372c64ed2357be877d6 100644 --- a/game/modules/tome/data/talents/techniques/tireless-combatant.lua +++ b/game/modules/tome/data/talents/techniques/tireless-combatant.lua @@ -19,7 +19,7 @@ newTalent { short_name = "SKIRMISHER_BREATHING_ROOM", name = "Breathing Room", type = {"technique/tireless-combatant", 1}, - require = techs_wil_req1, + require = techs_strdex_req1, mode = "passive", points = 5, getRestoreRate = function(self, t) @@ -81,7 +81,7 @@ newTalent { cooldown = 10, sustain_stamina = 0, no_energy = true, - require = techs_wil_req2, + require = techs_strdex_req2, tactical = { STAMINA = 2 }, random_ego = "utility", activate = function(self, t) @@ -113,7 +113,7 @@ newTalent { short_name = "SKIRMISHER_DAUNTLESS_CHALLENGER", name = "Dauntless Challenger", type = {"technique/tireless-combatant", 3}, - require = techs_wil_req3, + require = techs_strdex_req3, mode = "passive", points = 5, getStaminaRate = function(self, t) @@ -171,7 +171,7 @@ newTalent { short_name = "SKIRMISHER_THE_ETERNAL_WARRIOR", name = "The Eternal Warrior", type = {"technique/tireless-combatant", 4}, - require = techs_wil_req4, + require = techs_strdex_req4, mode = "passive", points = 5, getResist = function(self, t) diff --git a/game/modules/tome/data/talents/uber/dex.lua b/game/modules/tome/data/talents/uber/dex.lua index 6b2a7c6997d3910f7c9373d73644c3f5ca33c04d..537b418508f619c57a9c37765172b539714af6ae 100644 --- a/game/modules/tome/data/talents/uber/dex.lua +++ b/game/modules/tome/data/talents/uber/dex.lua @@ -128,7 +128,7 @@ uberTalent{ uberTalent{ name = "Windtouched Speed", mode = "passive", - require = { special={desc="Know at least 20 talent levels of equilibrium-using talents", fct=function(self) return knowRessource(self, "equilibrium", 20) end} }, + require = { special={desc="Know at least 10 talent levels of equilibrium-using talents", fct=function(self) return knowRessource(self, "equilibrium", 10) end} }, on_learn = function(self, t) self:attr("global_speed_add", 0.2) self:attr("avoid_pressure_traps", 1)