Commit c0bd9cd201aaa4d56268264b7320015006c5d66d

Authored by DarkGod
2 parents cd40b3fd 9b214c3c

Merge branch 'master' of git.net-core.org:tome/t-engine4

Showing 100 changed files with 671 additions and 510 deletions

Too many changes to show.

To preserve performance only 100 of 100+ files are displayed.

  1 +-- TE4 - T-Engine 4
  2 +-- Copyright (C) 2009 - 2019 Nicolas Casalini
  3 +--
  4 +-- This program is free software: you can redistribute it and/or modify
  5 +-- it under the terms of the GNU General Public License as published by
  6 +-- the Free Software Foundation, either version 3 of the License, or
  7 +-- (at your option) any later version.
  8 +--
  9 +-- This program is distributed in the hope that it will be useful,
  10 +-- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +-- GNU General Public License for more details.
  13 +--
  14 +-- You should have received a copy of the GNU General Public License
  15 +-- along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +--
  17 +-- Nicolas Casalini "DarkGod"
  18 +-- darkgod@te4.org
  19 +
  20 +require "engine.class"
  21 +require "bit"
  22 +
  23 +--- Provide some helper functions for description
  24 +-- @classmod engine.generator.interface.ActorTalentsDescHelper
  25 +module(..., package.seeall, class.make)
  26 +local acc, def, pp, sp, mp, ps, ss, ms = _t"Accuracy", _t"Defense", _t"Physical Power", _t"Spellpower", _t"Mindpower", _t"Physical Save", _t"Spell Save", _t"Mental Save"
  27 +
  28 +_M.power_save_simple_pairs = {
  29 + ap = { acc, ps },
  30 + as = { acc, ss },
  31 + am = { acc, ms },
  32 + pp = { pp, ps },
  33 + ps = { pp, ss },
  34 + pm = { pp, ms },
  35 + sp = { sp, ps },
  36 + ss = { sp, ss },
  37 + sm = { sp, ms },
  38 + mp = { mp, ps },
  39 + ms = { mp, ss },
  40 + mm = { mp, ms },
  41 +}
  42 +_M.powers_saves = {
  43 + a = acc,
  44 + acc = acc,
  45 + atk = acc,
  46 + attack = acc,
  47 + accuracy = acc,
  48 + pp = pp,
  49 + physicalpower = pp,
  50 + sp = sp,
  51 + spellpower = sp,
  52 + mp = mp,
  53 + mindpower = mp,
  54 + d = def,
  55 + def = def,
  56 + defense = def,
  57 + ps = ps,
  58 + physicalsave = ps,
  59 + ss = ss,
  60 + spellsave = ss,
  61 + ms = ms,
  62 + mindsave = ms,
  63 +}
  64 +_M.powers = {
  65 + p = pp,
  66 + s = sp,
  67 + m = mp,
  68 +}
  69 +_M.saves = {
  70 + p = ps,
  71 + s = ss,
  72 + m = ms,
  73 +}
  74 +
  75 +_M.concat = function(...)
  76 + local arg = { ... }
  77 + local transformed = {}
  78 + for _, v in ipairs(arg) do
  79 + transformed[#transformed + 1] = _M.powers_saves[v] or _t(tostring(v))
  80 + end
  81 + return transformed
  82 +end
  83 +_M.max = _M.concat
  84 +
  85 +-- possible input:
  86 +-- 1. power: "pp", "ps", etc; save: nil stored in power_save_simple_pairs
  87 +-- 2. power: string/table; save: string/table
  88 +-- string: search in _M.powers/saves/powers_saves and replace with proper desc
  89 +-- tables: simply concat them with "/"
  90 +_M.vs = function(power, save)
  91 + if not save and _M.power_save_simple_pairs[power] then
  92 + local pair = _M.power_save_simple_pairs[power]
  93 + return string.tformat("(%s vs %s)", pair[1], pair[2])
  94 + end
  95 + if type(power) == "table" then
  96 + power = table.concat(power, "/")
  97 + else
  98 + power = _M.powers[power] or _M.powers_saves[power] or power
  99 + end
  100 + if type(save) == "table" then
  101 + save = table.concat(save, "/")
  102 + else
  103 + save = _M.saves[save] or _M.powers_saves[save] or save
  104 + end
  105 + if power and save then
  106 + return string.tformat("(%s vs %s)", power, save)
  107 + else
  108 + return _t"(Bypass Saves)"
  109 + end
  110 +end
\ No newline at end of file
... ...
... ... @@ -1007,6 +1007,7 @@ newDamageType{
1007 1007 }
1008 1008
1009 1009 -- Temporal + Stun
  1010 +-- Deprecated
1010 1011 newDamageType{
1011 1012 name = _t("temporal stun", "damage type"), type = "TEMPORALSTUN",
1012 1013 projector = function(src, x, y, type, dam, state)
... ... @@ -1063,7 +1064,7 @@ newDamageType{
1063 1064 local target = game.level.map(x, y, Map.ACTOR)
1064 1065 if target then
1065 1066 if target:canBe("silence") then
1066   - target:setEffect(target.EFF_SILENCED, math.ceil(dam.dur), {apply_power=dam.power_check or src:combatMindpower() * 0.7})
  1067 + target:setEffect(target.EFF_SILENCED, math.ceil(dam.dur), {apply_power=dam.power_check or src:combatMindpower()})
1067 1068 else
1068 1069 game.logSeen(target, "%s resists the silence!", target:getName():capitalize())
1069 1070 end
... ... @@ -1102,7 +1103,7 @@ newDamageType{
1102 1103 local target = game.level.map(x, y, Map.ACTOR)
1103 1104 if target and rng.percent(dam) then
1104 1105 if target:canBe("silence") then
1105   - target:setEffect(target.EFF_SILENCED, 4, {apply_power=src:combatAttack()*0.7, no_ct_effect=true})
  1106 + target:setEffect(target.EFF_SILENCED, 4, {apply_power=src:combatAttack(), no_ct_effect=true})
1106 1107 else
1107 1108 game.logSeen(target, "%s resists the silence!", target:getName():capitalize())
1108 1109 end
... ... @@ -1126,6 +1127,8 @@ newDamageType{
1126 1127 end
1127 1128 end,
1128 1129 }
  1130 +
  1131 +-- Deprecated
1129 1132 newDamageType{
1130 1133 name = _t("blindness", "damage type"), type = "BLINDPHYSICAL",
1131 1134 projector = function(src, x, y, type, dam, state)
... ... @@ -1360,23 +1363,49 @@ newDamageType{
1360 1363 useImplicitCrit(src, state)
1361 1364 local chance = 25
1362 1365 local do_wet = false
1363   - if _G.type(dam) == "table" then chance, dam, do_wet = dam.chance, dam.dam, dam.do_wet end
  1366 + local apply_power
  1367 + if _G.type(dam) == "table" then chance, dam, do_wet, apply_power = dam.chance, dam.dam, dam.do_wet, dam.apply_power end
1364 1368
1365 1369 local target = game.level.map(x, y, Map.ACTOR)
1366 1370 if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 50 end
1367 1371
1368 1372 local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
1369 1373 if rng.percent(chance) then
1370   - DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5}, state)
  1374 + DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5, apply_power=apply_power}, state)
1371 1375 end
1372 1376 if target and do_wet and not target:hasEffect(target.EFF_FROZEN) then
1373   - target:setEffect(target.EFF_WET, 3, {apply_power=math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
  1377 + target:setEffect(target.EFF_WET, 3, {apply_power=apply_power or math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
1374 1378 end
1375 1379 return realdam
1376 1380 end,
1377 1381 }
1378 1382
  1383 +-- Cold damage + freeze chance
  1384 +newDamageType{
  1385 + name = _t("ice", "damage type"), type = "ICE_MIND", text_color = "#1133F3#",
  1386 + projector = function(src, x, y, type, dam, state)
  1387 + state = initState(state)
  1388 + useImplicitCrit(src, state)
  1389 + local chance = 25
  1390 + local do_wet = false
  1391 + local apply_power
  1392 + if _G.type(dam) == "table" then chance, dam, do_wet, apply_power = dam.chance, dam.dam, dam.do_wet, dam.apply_power end
  1393 +
  1394 + local target = game.level.map(x, y, Map.ACTOR)
  1395 + if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 50 end
  1396 +
  1397 + local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
  1398 + if rng.percent(chance) then
  1399 + DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5, apply_power=apply_power or src:combatMindpower()}, state)
  1400 + end
  1401 + if target and do_wet and not target:hasEffect(target.EFF_FROZEN) then
  1402 + target:setEffect(target.EFF_WET, 3, {apply_power=apply_power or src:combatMindpower(), min_dur=1})
  1403 + end
  1404 + return realdam
  1405 + end,
  1406 +}
1379 1407 -- Cold damage + freeze chance + 20% slow
  1408 +-- Deprecated
1380 1409 newDamageType{
1381 1410 name = _t("slowing ice", "damage type"), type = "ICE_SLOW", text_color = "#1133F3#",
1382 1411 projector = function(src, x, y, type, dam, state)
... ... @@ -1407,9 +1436,10 @@ newDamageType{
1407 1436 local target = game.level.map(x, y, Map.ACTOR)
1408 1437 if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 50 end
1409 1438
1410   - local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
  1439 + dam = _G.type(dam) == "number" and {dam=dam} or dam
  1440 + local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam, state)
1411 1441 if rng.percent(chance) then
1412   - DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5}, state)
  1442 + DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam.dam*1.5, apply_power=dam.apply_power}, state)
1413 1443 end
1414 1444 return realdam
1415 1445 end,
... ... @@ -1424,9 +1454,10 @@ newDamageType{
1424 1454 local chance = 0
1425 1455 local target = game.level.map(x, y, Map.ACTOR)
1426 1456 if target and target:hasEffect(target.EFF_WET) then dam = dam * 1.3 chance = 15 end
1427   - local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
  1457 + dam = _G.type(dam) == "number" and {dam=dam} or dam
  1458 + local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam, state)
1428 1459 if rng.percent(chance) then
1429   - DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.2}, state)
  1460 + DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam.dam*1.2, apply_power=dam.apply_power}, state)
1430 1461 end
1431 1462 return realdam
1432 1463 end,
... ... @@ -1442,9 +1473,8 @@ newDamageType{
1442 1473 DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam, state)
1443 1474 local target = game.level.map(x, y, Map.ACTOR)
1444 1475 if target then
1445   - local apply = dam.apply_power
1446 1476 if target:attr("negative_status_effect_immune_frozen") or (target:canBe("pin") and not target:attr("fly") and not target:attr("levitation")) then
1447   - target:setEffect(target.EFF_FROZEN_FEET, dam.dur, {apply_power=dam.apply_power})
  1477 + target:setEffect(target.EFF_FROZEN_FEET, dam.dur, {apply_power=dam.apply_power or (src.combatSpellpower and math.max(src:combatSpellpower(), src:combatMindpower()))})
1448 1478 end
1449 1479
1450 1480 if dam.shatter_reduce and target:hasEffect(target.EFF_WET) then
... ... @@ -1465,7 +1495,7 @@ newDamageType{
1465 1495 -- Freeze it, if we pass the test
1466 1496 local sx, sy = game.level.map:getTileToScreen(x, y, true)
1467 1497 if target:canBe("stun") then
1468   - target:setEffect(target.EFF_FROZEN, dam.dur, {hp=dam.hp * 1.5, apply_power=math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
  1498 + target:setEffect(target.EFF_FROZEN, dam.dur, {hp=dam.hp * 1.5, apply_power=dam.apply_power or math.max(src:combatSpellpower(), src:combatMindpower()), min_dur=1})
1469 1499 game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, -3, _t"Frozen!", {0,255,155})
1470 1500 else
1471 1501 game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, -3, _t"Resist!", {0,255,155})
... ... @@ -1682,6 +1712,7 @@ newDamageType{
1682 1712 }
1683 1713
1684 1714 -- Darkness damage + repulsion; checks for spell power against mental resistance
  1715 +-- Deprecated
1685 1716 newDamageType{
1686 1717 name = _t("darkness repulsion", "damage type"), type = "DARKKNOCKBACK",
1687 1718 projector = function(src, x, y, type, dam, state)
... ... @@ -1740,7 +1771,7 @@ newDamageType{
1740 1771 if target and not state[target] then
1741 1772 state[target] = true
1742 1773 DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam, state)
1743   - if target:checkHit(src:combatMindpower() * 0.8, target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
  1774 + if target:checkHit(src:combatMindpower(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
1744 1775 target:knockback(src.x, src.y, 3)
1745 1776 target:crossTierEffect(target.EFF_OFFBALANCE, src:combatMindpower())
1746 1777 game.logSeen(target, "%s is knocked back!", target:getName():capitalize())
... ... @@ -1803,7 +1834,7 @@ newDamageType{
1803 1834 state = initState(state)
1804 1835 useImplicitCrit(src, state)
1805 1836 local power
1806   - if type(dam) == "table" then
  1837 + if _G.type(dam) == "table" then
1807 1838 power = dam.apply_power
1808 1839 dam = dam.dam
1809 1840 end
... ... @@ -2482,6 +2513,7 @@ newDamageType{
2482 2513 }
2483 2514
2484 2515 -- Physical + Blind
  2516 +-- Deprecated
2485 2517 newDamageType{
2486 2518 name = _t("blinding physical", "damage type"), type = "SAND",
2487 2519 projector = function(src, x, y, type, dam, state)
... ... @@ -2878,7 +2910,7 @@ newDamageType{
2878 2910 if target then
2879 2911 if target:isTalentActive(target.T_GRAVITY_LOCUS) then return end
2880 2912 if dam.slow then
2881   - target:setEffect(target.EFF_SLOW, dam.dur, {power=dam.slow, apply_power=apply, no_ct_effect=true})
  2913 + target:setEffect(target.EFF_SLOW, dam.dur, {power=dam.slow, apply_power=dam.apply, no_ct_effect=true})
2882 2914 end
2883 2915 end
2884 2916 DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam, state)
... ... @@ -3181,6 +3213,7 @@ newDamageType{
3181 3213 end,
3182 3214 }
3183 3215
  3216 +-- Deprecated
3184 3217 newDamageType{
3185 3218 name = _t("stop", "damage type"), type = "STOP",
3186 3219 projector = function(src, x, y, type, dam, state)
... ... @@ -3197,6 +3230,7 @@ newDamageType{
3197 3230 end,
3198 3231 }
3199 3232
  3233 +-- Deprecated
3200 3234 newDamageType{
3201 3235 name = _t("debilitating temporal", "damage type"), type = "RETHREAD",
3202 3236 projector = function(src, x, y, type, dam, state)
... ... @@ -3365,6 +3399,7 @@ newDamageType{
3365 3399 }
3366 3400
3367 3401 -- Darkness damage + speed reduction + minion damage inc
  3402 +-- Deprecated
3368 3403 newDamageType{
3369 3404 name = _t("decaying darkness", "damage type"), type = "RIGOR_MORTIS",
3370 3405 projector = function(src, x, y, type, dam, state)
... ... @@ -3819,6 +3854,7 @@ newDamageType{
3819 3854 end,
3820 3855 }
3821 3856
  3857 +-- Deprecated
3822 3858 newDamageType{
3823 3859 name = _t("telekinetic shove", "damage type"), type = "TK_PUSHPIN",
3824 3860 projector = function(src, x, y, type, dam, state)
... ...
... ... @@ -21,6 +21,7 @@ local tacticals = {}
21 21 local Entity = require "engine.Entity"
22 22 local Tiles = require "engine.Tiles"
23 23 local Astar = require "engine.Astar"
  24 +Desc = require("mod.class.interface.DescHelper")
24 25
25 26 ---convert TACTIC labels in talent tactical tables to lower case
26 27 function Talents.aiLowerTacticals(tactical)
... ... @@ -152,9 +153,9 @@ Talents.is_a_type = {
152 153 }
153 154
154 155 Talents.damDesc = damDesc
  156 +Talents.Desc = Desc
155 157 Talents.main_env = getfenv(1)
156 158 Talents.ai_tactics_list = tacticals
157   -
158 159 -- Summoning AI helper functions
159 160
160 161 --- Generate targeting parameters for summoning talents
... ...
... ... @@ -125,8 +125,8 @@ newTalent{
125 125 local duration = t.getDuration(self, t)
126 126 local radius = self:getTalentRadius(t)
127 127 local damage = t.getDamage(self, t)
128   - return ([[Creates a circle of radius %d at your feet; the circle protects you from silence effects while you remain in its radius while silencing and dealing %d light damage to everyone else who enters. The circle lasts %d turns.]]):
129   - tformat(radius, damDesc(self, DamageType.LIGHT, damage), duration)
  128 + return ([[Creates a circle of radius %d at your feet; the circle protects you from silence effects while you remain in its radius while silencing %s and dealing %d light damage to everyone else who enters. The circle lasts %d turns.]]):
  129 + tformat(radius, Desc.vs"sm", damDesc(self, DamageType.LIGHT, damage), duration)
130 130 end,
131 131 }
132 132
... ... @@ -165,9 +165,9 @@ newTalent{
165 165 local damage = t.getDamage(self, t)
166 166 local duration = t.getDuration(self, t)
167 167 local radius = self:getTalentRadius(t)
168   - return ([[Creates a circle of radius %d at your feet; the circle slows incoming projectiles by %d%% and attempts to push all creatures other than yourself out of its radius, inflicting %0.2f light damage and %0.2f darkness damage per turn as it does so. The circle lasts %d turns.
  168 + return ([[Creates a circle of radius %d at your feet; the circle slows incoming projectiles by %d%% and attempts to push all creatures other than yourself out of its radius %s, inflicting %0.2f light damage and %0.2f darkness damage per turn as it does so. The circle lasts %d turns.
169 169 The effects will increase with your Spellpower.]]):
170   - tformat(radius, damage*5, (damDesc (self, DamageType.LIGHT, damage)), (damDesc (self, DamageType.DARKNESS, damage)), duration)
  170 + tformat(radius, damage*5, Desc.vs"sp", (damDesc (self, DamageType.LIGHT, damage)), (damDesc (self, DamageType.DARKNESS, damage)), duration)
171 171 end,
172 172 }
173 173
... ... @@ -208,10 +208,10 @@ newTalent{
208 208 return true
209 209 end,
210 210 info = function(self, t)
211   - return ([[Conjure a surge of celestial power through your circles. Any foe standing within one of your circles will be slowed by %d%% for %d turns and take %d light and %d darkness damage.
  211 + return ([[Conjure a surge of celestial power through your circles. Any foe standing within one of your circles will be slowed %s by %d%% for %d turns and take %d light and %d darkness damage.
212 212 Residual power from the surge will emanate from your circles for %d turns; each circle you stand in will increase your celestial resources.
213 213 Shifting Shadows: +1 negative.
214 214 Sanctity: +1 postive.
215   - Warding: +0.5 postive and negative.]]):tformat(t.getSlow(self, t), t.getSlowDur(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getDuration(self, t))
  215 + Warding: +0.5 postive and negative.]]):tformat(Desc.vs(), t.getSlow(self, t), t.getSlowDur(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getDuration(self, t))
216 216 end,
217 217 }
... ...
... ... @@ -214,9 +214,9 @@ newTalent{
214 214 local damagepct = t.getLifeDamage(self, t)
215 215 local damage = t.getDamage(self, t)
216 216 return ([[Your weapon attacks burn with righteous fury, dealing %d%% of your lost HP as additional Fire damage (up to %d, Current: %d).
217   - Targets struck are also afflicted with a Martyrdom effect that causes them to take %d%% of all damage they deal for 4 turns.
  217 + Targets struck are also afflicted with a Martyrdom effect %s that causes them to take %d%% of all damage they deal for 4 turns.
218 218 The bonus damage can only occur once per turn.]]):
219   - tformat(damagepct*100, t.getMaxDamage(self, t, 10, 400), damage, martyr)
  219 + tformat(damagepct*100, t.getMaxDamage(self, t, 10, 400), damage, Desc.vs(), martyr)
220 220 end,
221 221 }
222 222
... ...
... ... @@ -57,8 +57,8 @@ newTalent{
57 57 info = function(self, t)
58 58 local damage = t.getDamage(self, t)
59 59 return ([[You strike your foe with your two handed weapon, dealing %d%% weapon damage.
60   - If the attack hits, all foes in radius 2 will have their light resistance reduced by %d%% and their damage reduced by %d%% for 5 turns.]]):
61   - tformat(100 * damage, t.getWeakness(self, t), t.getNumb(self, t))
  60 + If the attack hits, all foes in radius 2 will have their light resistance reduced by %d%% and their damage reduced by %d%% for 5 turns. %s]]):
  61 + tformat(100 * damage, t.getWeakness(self, t), t.getNumb(self, t), Desc.vs())
62 62 end,
63 63 }
64 64
... ... @@ -86,8 +86,8 @@ newTalent{
86 86 return true
87 87 end,
88 88 info = function(self, t)
89   - 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.]]):
90   - tformat(t.getPower(self, t))
  89 + 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 %s.]]):
  90 + tformat(t.getPower(self, t), Desc.vs())
91 91 end,
92 92 }
93 93
... ... @@ -121,9 +121,9 @@ newTalent{
121 121 end,
122 122 info = function(self, t)
123 123 return ([[While wielding a two handed weapon, your critical strike chance is increased by %d%%, and your melee criticals instill you with righteous strength, increasing all physical and light damage you deal by %d%%, stacking up to 3 times.
124   - In addition, your melee critical strikes leave a lasting lightburn on the target, dealing %0.2f light damage over 5 turns and reducing opponents armour by %d.
  124 + In addition, your melee critical strikes leave a lasting lightburn on the target, dealing %0.2f light damage over 5 turns and reducing opponents armour by %d. %s
125 125 The damage increases with your Spellpower.]]):
126   - tformat(t.getCrit(self, t), t.getPower(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getArmor(self, t))
  126 + tformat(t.getCrit(self, t), t.getPower(self, t), damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getArmor(self, t), Desc.vs"ss")
127 127 end,
128 128 }
129 129
... ...
... ... @@ -125,11 +125,10 @@ newTalent{
125 125 local rad = t.getMaxRadius(self,t)
126 126 local dam = t.getDamage(self,t)/2
127 127 local dur = t.getDuration(self,t)
128   - local entropy = 0
129 128 return ([[Open a radius 1 rift in spacetime at the targeted location for %d turns, increasing in radius by 1 each turn to a maximum of %d.
130   - All caught within the rift are pulled towards the center and take %0.2f gravity damage.
  129 + All caught within the rift are pulled towards the center and take %0.2f gravity damage. %s
131 130 The damage will increase with your Spellpower.]]):
132   - tformat(dur, rad, damDesc(self, DamageType.PHYSICAL, dam))
  131 + tformat(dur, rad, damDesc(self, DamageType.PHYSICAL, dam), Desc.vs"pp")
133 132 end,
134 133 }
135 134
... ... @@ -184,7 +183,7 @@ newTalent{
184 183 info = function(self, t)
185 184 local conv = t.getConversion(self, t)
186 185 local proj = t.getSlow(self, t)
187   - return ([[Create a gravity field around you that converts %d%% of all damage you deal into physical damage, slows incoming projectiles by %d%%, and causes your gravity damage to reduce the target's knockback resistance by half for two turns.]]):tformat(conv, proj)
  186 + return ([[Create a gravity field around you that converts %d%% of all damage you deal into physical damage, slows incoming projectiles by %d%%, and causes your gravity damage to reduce the target's knockback resistance by half for two turns %s.]]):tformat(conv, proj, Desc.vs())
188 187 end,
189 188 }
190 189
... ... @@ -238,10 +237,10 @@ newTalent{
238 237 end,
239 238 info = function(self, t)
240 239 return ([[Infuse your weapon with overwhelming gravitational power while spinning around.
241   - All creatures within radius 2 take %d%% weapon damage as physical (gravity) and are pulled closer.
  240 + All creatures within radius 2 take %d%% weapon damage as physical (gravity) and are pulled closer %s.
242 241 Then, all adjacent creatures take %d%% weapon damage. This second strike shields you for between %d and %d, increasing with more enemies hit. The shield lasts for 2 turns.
243 242 The shield strength will increase with your Spellpower.]]):
244   - tformat(t.getOuterDamage(self, t) * 100,
  243 + tformat(t.getOuterDamage(self, t) * 100, Desc.vs"pp",
245 244 t.getInnerDamage(self, t) * 100,
246 245 t.getShield(self, t), t.getShield(self, t)*2)
247 246 end,
... ...
... ... @@ -52,11 +52,10 @@ newTalent{
52 52 end,
53 53 info = function(self, t)
54 54 local damage = t.getDamage(self, t)
55   - return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target is stunned for %d turns and has their bleed resistance reduced by 50%%.
56   -The stun chance increases with your Physical Power.
  55 + return ([[Hits the target with your weapon, doing %d%% damage. If the attack hits, the target is stunned for %d turns and has their bleed resistance reduced by 50%%. %s
57 56
58 57 #{italic}#It may not bleed, exactly, but you'll make it hurt.#{normal}#]])
59   - :tformat(100 * damage, t.getDuration(self, t))
  58 + :tformat(100 * damage, t.getDuration(self, t), Desc.vs"pp")
60 59 end,
61 60 }
62 61
... ... @@ -172,10 +171,10 @@ newTalent{
172 171 local damage = t.getDamage(self, t)*100
173 172 local mult = t.getMult(self, t)
174 173 return ([[Put all of your physical and magical might into one devastating attack.
175   -Strike all adjacent enemies for %d%% weapon damage and daze them (using your highest power) for 3 turns.
  174 +Strike all adjacent enemies for %d%% weapon damage and daze them for 3 turns %s.
176 175
177 176 Using this talent consumes all of your Positive Energy and prevents you from generating positive energy for 5 turns.
178 177 Every point of positive energy increases the damage by %.2f%%.
179   -Every %d points of positive energy increase the radius by 1 (up to 10).]]):tformat(damage, mult, t.getRadiusScale(self, t))
  178 +Every %d points of positive energy increase the radius by 1 (up to 10).]]):tformat(damage, Desc.vs(Desc.max("pp", "sp", "mp"), "ps"), mult, t.getRadiusScale(self, t))
180 179 end,
181 180 }
... ...
... ... @@ -169,6 +169,6 @@ newTalent{
169 169 local dotDam = t.getDotDamage(self, t)
170 170 local conversion = t.getConversion(self, t)
171 171 local duration = t.getDuration(self, t)
172   - return ([[Shroud foes within radius %d in darkest light, dealing %0.2f light and %0.2f darkness damage per turn and converting %d%% of the damage they deal between light and darkness for %d turns.]]):tformat(radius, damDesc(self, DamageType.LIGHT, dotDam), damDesc(self, DamageType.DARKNESS, dotDam), conversion*100, duration)
  172 + return ([[Shroud foes within radius %d in darkest light, dealing %0.2f light and %0.2f darkness damage per turn and converting %d%% of the damage they deal between light and darkness for %d turns. %s]]):tformat(radius, damDesc(self, DamageType.LIGHT, dotDam), damDesc(self, DamageType.DARKNESS, dotDam), conversion*100, duration, Desc.vs())
173 173 end,
174 174 }
... ...
... ... @@ -349,12 +349,12 @@ end
349 349
350 350 Available glyphs are:
351 351 #ffd700#Glyph of Sunlight#LAST#: Bind sunlight into a glyph. When triggered it will release a brilliant light, dealing %0.2f light damage and healing you for %d.
352   - #7f7f7f#Glyph of Moonlight#LAST#: Bind moonlight into a glyph. When triggered it will release a fatiguing darkness, dealing %0.2f darkness damage and reducing the foes damage dealt by %d%% for %d turns.
353   - #9D9DC9#Glyph of Twilight#LAST#: Bind twilight into a glyph. When triggered it will release a burst of twilight, dealing %0.2f light and %0.2f darkness damage and knocking the foe back %d tiles.
  352 + #7f7f7f#Glyph of Moonlight#LAST#: Bind moonlight into a glyph. When triggered it will release a fatiguing darkness, dealing %0.2f darkness damage and reducing the foes damage dealt by %d%% for %d turns. %s
  353 + #9D9DC9#Glyph of Twilight#LAST#: Bind twilight into a glyph. When triggered it will release a burst of twilight, dealing %0.2f light and %0.2f darkness damage and knocking the foe back %d tiles. %s
354 354 ]]):tformat(self:getTalentRange(t), t.getDuration(self, t), t.getGlyphCD(self, t),
355 355 damDesc(self, DamageType.LIGHT, dam), heal,
356   - damDesc(self, DamageType.DARKNESS, dam), numb, numbDur,
357   - damDesc(self, DamageType.LIGHT, dam/2), damDesc(self, DamageType.DARKNESS, dam/2), dist)
  356 + damDesc(self, DamageType.DARKNESS, dam), numb, numbDur, Desc.vs(),
  357 + damDesc(self, DamageType.LIGHT, dam/2), damDesc(self, DamageType.DARKNESS, dam/2), dist, Desc.vs())
358 358 end,
359 359 }
360 360
... ...
... ... @@ -522,8 +522,8 @@ newTalent{
522 522 end,
523 523 info = function(self, t)
524 524 return ([[Your passion for singing the praises of the Moons reaches its zenith.
525   - Your Hymns now fire shadowy beams that will hit up to %d of your foes within radius 5 for %0.2f damage, with a 25%% chance of blinding.
  525 + Your Hymns now fire shadowy beams that will hit up to %d of your foes within radius 5 for %0.2f damage, with a 25%% chance of blinding %s.
526 526 This powerful effect will drain %0.1f negative energy each time it fires at at least 1 target; no beam will fire if your negative energy is too low.
527   - These values scale with your Spellpower.]]):tformat(t.getTargetCount(self, t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getNegativeDrain(self, t))
  527 + These values scale with your Spellpower.]]):tformat(t.getTargetCount(self, t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), Desc.vs"sp", t.getNegativeDrain(self, t))
528 528 end,
529 529 }
... ...
... ... @@ -97,8 +97,8 @@ newTalent{
97 97 end,
98 98 info = function(self, t)
99 99 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.
100   - All targets struck by your Judgement will be blighted by light, reducing saves by %d, reducing critical power by %d%%, and causing light damage received to splash in radius 2 for %d%% damage against all hostile targets for 4 turns.]]):
101   - tformat(t.getMoveDamage(self, t), t.getExplosionDamage(self, t), t.getSavePen(self,t), t.getCritPen(self,t), t.getSplashPct(self,t))
  100 + All targets struck by your Judgement will be blighted by light, reducing saves by %d, reducing critical power by %d%%, and causing light damage received to splash in radius 2 for %d%% damage against all hostile targets for 4 turns %s.]]):
  101 + tformat(t.getMoveDamage(self, t), t.getExplosionDamage(self, t), t.getSavePen(self,t), t.getCritPen(self,t), t.getSplashPct(self,t), Desc.vs"ss")
102 102 end,
103 103 }
104 104
... ... @@ -156,9 +156,9 @@ newTalent{
156 156 end,
157 157 info = function(self, t)
158 158 return ([[Your Radiance is so powerful it burns all foes caught in it, dealing %0.1f light damage to all foes caught inside every turn.
159   - Each enemy effected has a %d%% chance of being dazed and blinded by the light for 3 turns. The daze and blind can be applied to each enemy at most once every 7 turns.
  159 + Each enemy effected has a %d%% chance of being dazed and blinded by the light for 3 turns %s. The daze and blind can be applied to each enemy at most once every 7 turns.
160 160 The damage increases with your Spellpower.]]):
161   - tformat(damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getDaze(self, t))
  161 + tformat(damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getDaze(self, t), Desc.vs"sp")
162 162 end,
163 163 }
164 164
... ... @@ -178,10 +178,10 @@ newTalent{
178 178 end,
179 179 info = function(self, t)
180 180 return ([[The light of your Radiance allows you to see that which would normally be unseen and strike that which would normally be protected.
181   - All enemies in your Radiance aura have their invisibility and stealth power reduced by %d; all actors affected by illumination have their defense reduced by %d as well as all evasion bonuses from being unseen negated.
  181 + All enemies in your Radiance aura have their invisibility and stealth power reduced by %d; all actors affected by illumination have their defense reduced by %d as well as all evasion bonuses from being unseen negated. %s
182 182 In addition, your light damage is increased by %d%% and your strikes ignore %d%% of the light resistance of your targets.
183 183 The invisibility, stealth power, and defense reductions increase with your Spellpower.]]):
184   - tformat(t.getPower(self, t), t.getDef(self, t), t.getLightDamageIncrease(self, t), t.getResPen(self, t))
  184 + tformat(t.getPower(self, t), t.getDef(self, t), Desc.vs(), t.getLightDamageIncrease(self, t), t.getResPen(self, t))
185 185 end,
186 186 }
187 187
... ...
... ... @@ -173,8 +173,8 @@ newTalent{
173 173 info = function(self, t)
174 174 local radius = self:getTalentRadius(t)
175 175 local damage = t.getDamage(self, t)
176   - return ([[A star falls on a radius %d area, doing %0.2f darkness damage on impact and stunning all within the area for 4 turns.
  176 + return ([[A star falls on a radius %d area, doing %0.2f darkness damage on impact and stunning all within the area for 4 turns %s.
177 177 The damage dealt will increase with your Spellpower.]]):
178   - tformat(radius, damDesc(self, DamageType.DARKNESS, damage))
  178 + tformat(radius, damDesc(self, DamageType.DARKNESS, damage), Desc.vs"sp")
179 179 end,
180 180 }
... ...
... ... @@ -81,9 +81,9 @@ newTalent{
81 81 info = function(self, t)
82 82 local damage = t.getDamage(self, t)
83 83 return ([[Calls forth a ray of light from the Sun, doing %0.1f Light damage to the target.
84   - At level 3 the ray will be so intense it will also blind the target and everyone in a radius 2 around it for %d turns.
  84 + At level 3 the ray will be so intense it will also blind the target and everyone in a radius 2 around it for %d turns. %s
85 85 The damage dealt will increase with your Spellpower.]]):
86   - tformat(damDesc(self, DamageType.LIGHT, damage), t.getDuration(self, t))
  86 + tformat(damDesc(self, DamageType.LIGHT, damage), t.getDuration(self, t), Desc.vs"sp")
87 87 end,
88 88 }
89 89
... ...
... ... @@ -110,11 +110,11 @@ newTalent{
110 110 local duration = t.getDuration(self, t)
111 111 local res = t.getRes(self, t)
112 112 local resdur = t.getResDuration(self, t)
113   - return ([[Invokes the Sun to cause a flare within radius %d, blinding your foes for %d turns and lighting up the area.
  113 + return ([[Invokes the Sun to cause a flare within radius %d, blinding your foes for %d turns %s and lighting up the area.
114 114 All enemies effected will take %0.2f light damage.
115 115 At talent level 3 you gain %d%% light, darkness, and fire resistance for %d turns.
116 116 The damage done and resistances will increase with your Spellpower.]]):
117   - tformat(radius, duration, damDesc(self, DamageType.LIGHT, damage), res, resdur )
  117 + tformat(radius, duration, Desc.vs"sp" , damDesc(self, DamageType.LIGHT, damage), res, resdur )
118 118 end,
119 119 }
120 120
... ...
... ... @@ -182,9 +182,9 @@ newTalent{
182 182 end,
183 183 info = function(self, t)
184 184 local duration = t.getConfuseDuration(self, t)
185   - return ([[Let out a mental cry that shatters the will of your targets within radius %d, dealing %0.2f darkness damage and confusing (%d%% to act randomly) them for %d turns.
  185 + return ([[Let out a mental cry that shatters the will of your targets within radius %d, dealing %0.2f darkness damage and confusing (%d%% to act randomly) them for %d turns %s.
186 186 The damage will improve with your spellpower and the duration will improve with your Cunning.]]):
187   - tformat(self:getTalentRadius(t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getConfuseEfficency(self,t), duration)
  187 + tformat(self:getTalentRadius(t), damDesc(self, DamageType.DARKNESS, t.getDamage(self, t)), t.getConfuseEfficency(self,t), duration, Desc.vs"sm")
188 188 end,
189 189 }
190 190
... ...
... ... @@ -44,8 +44,8 @@ newTalent{
44 44 info = function(self, t)
45 45 local damage = t.getDamage(self, t)
46 46 local damagestat = t.getDamageStat(self, t)
47   - return ([[Projects a bolt of temporal energy that deals %0.2f temporal damage, and reduces the targets three highest stats by %d for 3 turns.
48   - The damage dealt will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), damagestat)
  47 + return ([[Projects a bolt of temporal energy that deals %0.2f temporal damage, and reduces the targets three highest stats by %d for 3 turns. %s
  48 + The damage dealt will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), damagestat, Desc.vs"ss")
49 49 end,
50 50 }
51 51
... ... @@ -82,8 +82,8 @@ newTalent{
82 82 info = function(self, t)
83 83 local duration = t.getConfuseDuration(self, t)
84 84 local radius = self:getTalentRadius(t)
85   - return ([[Reverts the minds of all creatures in a radius %d cone to an infantile state, in effect confusing them (%d%% to act randomly) for %d turns.]]):
86   - tformat(radius, t.getConfuseEfficency(self, t), duration)
  85 + return ([[Reverts the minds of all creatures in a radius %d cone to an infantile state, in effect confusing them (%d%% to act randomly) for %d turns %s.]]):
  86 + tformat(radius, t.getConfuseEfficency(self, t), duration, Desc.vs"sm")
87 87 end,
88 88 }
89 89
... ...
... ... @@ -774,8 +774,8 @@ newTalent{
774 774 return t.doAction(self, t, true)
775 775 end,
776 776 info = function(self, t)
777   - return ([[Stuns up to five targets in a radius %d ball.]]):
778   - tformat(self:getTalentRadius(t))
  777 + return ([[Stuns up to five targets in a radius %d ball %s.]]):
  778 + tformat(self:getTalentRadius(t), Desc.vs"sp")
779 779 end,
780 780 }
781 781
... ... @@ -1306,7 +1306,7 @@ newTalent{
1306 1306 return t.doAction(self, t, true)
1307 1307 end,
1308 1308 info = function(self, t)
1309   - return ([[Creates a gravity well in a radius %d ball, pinning up to five targets.]]):tformat(self:getTalentRadius(t))
  1309 + return ([[Creates a gravity well in a radius %d ball, pinning up to five targets %s.]]):tformat(self:getTalentRadius(t), Desc.vs"sp")
1310 1310 end,
1311 1311 }
1312 1312
... ... @@ -1568,8 +1568,8 @@ newTalent{
1568 1568 return t.doAction(self, t, true)
1569 1569 end,
1570 1570 info = function(self, t)
1571   - return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns.]]):
1572   - tformat(getAnomalyRadius(self, t), getAnomalyDuration(self, t))
  1571 + return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns %s.]]):
  1572 + tformat(getAnomalyRadius(self, t), getAnomalyDuration(self, t), Desc.vs"ss")
1573 1573 end,
1574 1574 }
1575 1575
... ...
... ... @@ -60,10 +60,10 @@ newTalent{
60 60 info = function(self, t)
61 61 local damage = t.getDamage(self, t) * 100
62 62 local duration = t.getDuration(self, t)
63   - return ([[Attack with your melee weapons for %d%% weapon damage as physical and temporal (warp) damage. If either attack hits you may stun, blind, pin, or confuse the target for %d turns.
  63 + return ([[Attack with your melee weapons for %d%% weapon damage as physical and temporal (warp) damage. If either attack hits you may stun, blind, pin, or confuse the target for %d turns %s.
64 64
65 65 Blade Threading talents will freely swap to your dual-weapons when activated if you have them in your secondary slots. Additionally you may use the Attack talent in a similar manner.]])
66   - :tformat(damage, duration)
  66 + :tformat(damage, duration, Desc.vs("sp", Desc.max("ps", "ms")))
67 67 end
68 68 }
69 69
... ... @@ -256,9 +256,9 @@ newTalent{
256 256 local shear = t.getShear(self, t)
257 257 local radius = self:getTalentRadius(t)
258 258 return ([[Attack up to three adjacent targets for %d%% weapon damage. If any attack hits you'll create a temporal shear dealing %0.2f temporal damage in a radius %d cone.
259   - Each target you hit with your weapons beyond the first increases the damage of the shear by 25%%. Targets reduced below 20%% of maximum life by the shear may be instantly slain.
  259 + Each target you hit with your weapons beyond the first increases the damage of the shear by 25%%. Targets reduced below 20%% of maximum life by the shear may be instantly slain %s.
260 260 The cone damage improves with your Spellpower.]])
261   - :tformat(damage, damDesc(self, DamageType.TEMPORAL, shear), radius)
  261 + :tformat(damage, damDesc(self, DamageType.TEMPORAL, shear), radius, Desc.vs"sp")
262 262 end
263 263 }
264 264
... ...
... ... @@ -215,11 +215,11 @@ newTalent{
215 215 local damage = t.getDamage(self, t) * 100
216 216 local radius = self:getTalentRadius(t)
217 217 local aoe = t.getDamageAoE(self, t)
218   - return ([[Fire an arrow for %d%% weapon damage. When the arrow reaches its destination or hits a target it will draw in all other targets in a radius of %d and inflict %0.2f physical damage.
  218 + return ([[Fire an arrow for %d%% weapon damage. When the arrow reaches its destination or hits a target it will draw in all other targets %s in a radius of %d and inflict %0.2f physical damage.
219 219 Each target moved beyond the first increases the damage %0.2f (up to %0.2f bonus damage).
220 220 Targets take reduced damage the further they are from the epicenter (20%% less per tile).
221 221 The additional damage scales with your Spellpower.]])
222   - :tformat(damage, radius, damDesc(self, DamageType.PHYSICAL, aoe), damDesc(self, DamageType.PHYSICAL, aoe/8), damDesc(self, DamageType.PHYSICAL, aoe/2))
  222 + :tformat(damage, Desc.vs"sp", radius, damDesc(self, DamageType.PHYSICAL, aoe), damDesc(self, DamageType.PHYSICAL, aoe/8), damDesc(self, DamageType.PHYSICAL, aoe/2))
223 223 end
224 224 }
225 225
... ...
... ... @@ -132,9 +132,9 @@ newTalent{
132 132 info = function(self, t)
133 133 local talentcount = t.getTalentCount(self, t)
134 134 local cooldown = t.getCooldown(self, t)
135   - return ([[You sap the target's energy and add it to your own, placing up to %d random talents on cooldown for %d turns.
  135 + return ([[You sap the target's energy and add it to your own, placing up to %d random talents on cooldown for %d turns %s.
136 136 For each talent put on cooldown, you reduce the cooldown of one of your talents currently on cooldown by %d turns.]]):
137   - tformat(talentcount, cooldown, cooldown)
  137 + tformat(talentcount, cooldown, Desc.vs"ss", cooldown)
138 138 end,
139 139 }
140 140
... ... @@ -194,6 +194,6 @@ newTalent{
194 194 end,
195 195 info = function(self, t)
196 196 local duration = t.getDuration(self, t)
197   - return ([[Each turn, for the next %d turns, one of the target's sustained talents will be deactivated.]]):tformat(duration)
  197 + return ([[Each turn, for the next %d turns, one of the target's sustained talents will be deactivated %s.]]):tformat(duration, Desc.vs"ss")
198 198 end,
199 199 }
... ...
... ... @@ -140,9 +140,9 @@ newTalent{
140 140 local damage = t.getDamage(self, t)
141 141 local duration = t.getDuration(self, t)
142 142 local radius = self:getTalentRadius(t)
143   - return ([[Deals %0.2f temporal damage over %d turns to all targets in a radius of %d. Targets with Reality Smearing active will instead recover %d life over four turns.
  143 + return ([[Deals %0.2f temporal damage over %d turns to all targets in a radius of %d %s. Targets with Reality Smearing active will instead recover %d life over four turns.
144 144 If a target is reduced below 20%% life while Attenuate is active it may be instantly slain.
145   - The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration, radius, damage *0.4)
  145 + The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration, radius, Desc.vs"ss", damage *0.4)
146 146 end,
147 147 }
148 148
... ...
... ... @@ -95,12 +95,11 @@ newTalent{
95 95 return true
96 96 end,
97 97 info = function(self, t)
98   - local damage = t.getDamage(self, t)
99 98 local radius = self:getTalentRadius(t)
100   - return ([[Sends out a blast wave of gravity in a radius %d cone, dealing %0.2f base physical (gravity) damage and knocking back targets caught in the area.
  99 + return ([[Sends out a blast wave of gravity in a radius %d cone, dealing %0.2f base physical (gravity) damage and knocking back targets caught in the area %s.
101 100 Targets knocked into walls or other targets take 25%% additional damage and deal 25%% damage to targets they're knocked into.
102 101 Closer targets will be knocked back further and the damage will scale with your Spellpower.]]):
103   - tformat(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
  102 + tformat(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), Desc.vs"sp")
104 103 end,
105 104 }
106 105
... ... @@ -175,11 +174,11 @@ newTalent{
175 174 info = function(self, t)
176 175 local damage = t.getDamage(self, t)
177 176 local radius = self:getTalentRadius(t)
178   - return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spell's center and inflicts %0.2f physical (gravity) damage.
  177 + return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spell's center %s and inflicts %0.2f physical (gravity) damage.
179 178 Each target moved beyond the first increases the damage by %0.2f (up to a maximum of %0.2f bonus damage).
180 179 Targets take reduced damage the further they are from the epicenter (20%% less per tile).
181 180 The damage dealt will scale with your Spellpower.]])
182   - :tformat(radius, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.PHYSICAL, damage/8), damDesc(self, DamageType.PHYSICAL, damage/2))
  181 + :tformat(radius, Desc.vs"sp", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.PHYSICAL, damage/8), damDesc(self, DamageType.PHYSICAL, damage/2))
183 182 end,
184 183 }
185 184
... ... @@ -217,7 +216,7 @@ newTalent{
217 216 local proj = t.getSlow(self, t)
218 217 local anti = t.getAnti(self, t)
219 218 return ([[Create a gravity field around you that converts %d%% all damage you deal into physical damage, slows incoming projectiles by %d%%, and protects you from all gravity damage and effects.
220   - Additionally, damage dealt by Repulsion Blast has a %d%% chance to reduce the target's knockback resistance by half for two turns.]]):tformat(conv, proj, anti)
  219 + Additionally, damage dealt by Repulsion Blast has a %d%% chance to reduce the target's knockback resistance by half for two turns %s.]]):tformat(conv, proj, anti, Desc.vs())
221 220 end,
222 221 }
223 222
... ... @@ -263,7 +262,7 @@ newTalent{
263 262 local duration = t.getDuration(self, t)
264 263 local radius = self:getTalentRadius(t)
265 264 local slow = t.getSlow(self, t)
266   - return ([[Increases local gravity in a radius of %d for %d turns, dealing %0.2f physical (gravity) damage as well as decreasing the global speed of all affected targets by %d%%.
267   - The damage done will scale with your Spellpower.]]):tformat(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), slow*100)
  265 + return ([[Increases local gravity in a radius of %d for %d turns, dealing %0.2f physical (gravity) damage as well as decreasing the global speed of all affected targets by %d%% %s.
  266 + The damage done will scale with your Spellpower.]]):tformat(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), slow*100, Desc.vs"sp")
268 267 end,
269 268 }
... ...
... ... @@ -205,7 +205,7 @@ newTalent{
205 205 local power = t.getPower(self, t)
206 206 local duration = t.getDuration(self, t)
207 207 return ([[Attack the target with either your ranged or melee weapons for %d%% weapon damage. For the next %d turns random targeting, such as from Blink Blade and Warden's Call, will focus on this target.
208   - Attacks against this target gain %d%% critical chance and critical strike power while you take %d%% less damage from all enemies whose rank is lower then that of your focus target.]])
209   - :tformat(damage, duration, power, power, power)
  208 + Attacks against this target gain %d%% critical chance and critical strike power %s while you take %d%% less damage from all enemies whose rank is lower then that of your focus target.]])
  209 + :tformat(damage, duration, power, Desc.vs(), power)
210 210 end
211 211 }
\ No newline at end of file
... ...
... ... @@ -332,8 +332,8 @@ newTalent{
332 332 info = function(self, t)
333 333 local regress = t.getRegression(self, t)
334 334 local aging = t.getAgingChance(self, t)
335   - return ([[While your cosmic cycle is expanding, creatures in its radius have a %d%% chance to suffer the effects of aging; pinning, blinding, or confusing them for 3 turns.
  335 + return ([[While your cosmic cycle is expanding, creatures in its radius have a %d%% chance to suffer the effects of aging; pinning %s, blinding %s, or confusing %s them for 3 turns.
336 336 While your cosmic cycle is contracting, creatures in its radius suffer from age regression; reducing their three highest stats by %d.
337   - The chance and stat reduction will scale with your Spellpower.]]):tformat(aging, regress)
  337 + The chance and stat reduction will scale with your Spellpower.]]):tformat(aging, Desc.vs"sp", Desc.vs"sp", Desc.vs"sm", regress)
338 338 end,
339 339 }
\ No newline at end of file
... ...
... ... @@ -331,9 +331,9 @@ newTalent{
331 331 info = function(self, t)
332 332 local digs = t.getDigs(self, t)
333 333 local chance = t.getChance(self, t)
334   - return ([[While active your physical and temporal damage has a %d%% chance to remove one beneficial physical or magical temporary effect (respectively) from targets you hit.
  334 + return ([[While active your physical and temporal damage has a %d%% chance to remove one beneficial physical or magical temporary effect (respectively) from targets you hit %s.
335 335 Only one physical and one magical effect may be removed per turn from each target.
336 336 Additionally your Dust to Dust spell now digs up to %d tiles into walls.]]):
337   - tformat(chance, digs)
  337 + tformat(chance, Desc.vs(), digs)
338 338 end,
339 339 }
\ No newline at end of file
... ...
... ... @@ -172,9 +172,9 @@ newTalent{
172 172 local damage = t.getDamage(self, t)
173 173 local radius = self:getTalentRadius(t)
174 174 local duration = t.getDuration(self, t)
175   - return ([[Creates a time distortion in a radius of %d that lasts for %d turns, decreasing global speed by %d%% for 3 turns and inflicting %0.2f temporal damage each turn to all targets within the area.
  175 + return ([[Creates a time distortion in a radius of %d that lasts for %d turns, decreasing global speed by %d%% for 3 turns %s and inflicting %0.2f temporal damage each turn to all targets within the area.
176 176 The slow effect and damage dealt will scale with your Spellpower.]]):
177   - tformat(radius, duration, 100 * slow, damDesc(self, DamageType.TEMPORAL, damage))
  177 + tformat(radius, duration, 100 * slow, Desc.vs"sp", damDesc(self, DamageType.TEMPORAL, damage))
178 178 end,
179 179 }
180 180
... ... @@ -715,8 +715,8 @@ newTalent{
715 715 local range = self:getTalentRange(t)
716 716 local duration = t.getConfuseDuration(self, t)
717 717 local power = t.getConfuseEfficency(self, t)
718   - return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d. The targeted creature will be confused (power %d%%) for %d turns.
719   - The spell's hit chance will increase with your Spellpower.]]):tformat (range, power, duration)
  718 + return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d. The targeted creature will be confused (power %d%%) for %d turns %s.
  719 + The spell's hit chance will increase with your Spellpower.]]):tformat (range, power, duration, Desc.vs"sm")
720 720 end,
721 721 }
722 722
... ... @@ -783,9 +783,9 @@ newTalent{
783 783 local stun = t.getDuration(self, t)
784 784 local damage = t.getDamage(self, t)
785 785 return ([[Violently fold the space between yourself and another point within range.
786   - You teleport to the target location, and leave a temporal wake behind that stuns for %d turns and deals %0.2f temporal and %0.2f physical warp damage to targets in the path.
  786 + You teleport to the target location, and leave a temporal wake behind that stuns for %d turns %s and deals %0.2f temporal and %0.2f physical warp damage to targets in the path.
787 787 The damage will scale with your Spellpower.]]):
788   - tformat(stun, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2))
  788 + tformat(stun, Desc.vs"sp", damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2))
789 789 end,
790 790 }
791 791
... ...
... ... @@ -148,10 +148,10 @@ newTalent{
148 148 local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
149 149 local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
150 150 local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
151   - return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you and inflict %0.2f physical and %0.2f temporal (warp) damage.
  151 + return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you %s and inflict %0.2f physical and %0.2f temporal (warp) damage.
152 152 The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns.
153 153 The damage caused by your Warp Mines will improve with your Spellpower.]]):
154   - tformat(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
  154 + tformat(Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
155 155 end,
156 156 }
157 157
... ... @@ -198,10 +198,10 @@ newTalent{
198 198 local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
199 199 local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
200 200 local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
201   - return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you and inflict %0.2f physical and %0.2f temporal (warp) damage.
  201 + return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you %s and inflict %0.2f physical and %0.2f temporal (warp) damage.
202 202 The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns.
203 203 The damage caused by your Warp Mines will improve with your Spellpower.]]):
204   - tformat(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
  204 + tformat(Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
205 205 end,
206 206 }
207 207
... ... @@ -235,12 +235,12 @@ newTalent{
235 235 local detect = t.trapPower(self,t)*0.8
236 236 local disarm = t.trapPower(self,t)
237 237 local duration = t.getDuration(self, t)
238   - return ([[Learn to lay Warp Mines in a radius of 1. Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f physical and %0.2f temporal (warp) damage.
  238 + return ([[Learn to lay Warp Mines in a radius of 1. Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used %s and inflict %0.2f physical and %0.2f temporal (warp) damage.
239 239 The mines are hidden traps (%d detection and %d disarm power based on your Magic), last for %d turns, and each have a ten turn cooldown.
240 240 Investing in this talent improves the range of all Spacetime Folding talents and the damage caused by your Warp Mines will improve with your Spellpower.
241 241
242 242 Current Spacetime Folding Range: %d]]):
243   - tformat(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration, range) --I5
  243 + tformat(Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration, range) --I5
244 244 end,
245 245 }
246 246
... ... @@ -390,11 +390,11 @@ newTalent{
390 390 local chance = t.getChance(self, t)
391 391 local damage = t.getDamage(self, t)/2
392 392 local radius = self:getTalentRadius(t)
393   - return ([[Tether the target to the location for %d turns.
394   - Each turn the target has a %d%% chance per tile it's travelled away from the tether to be teleported back, inflicting %0.2f physical and %0.2f temporal (warp) damage to all enemies in a radius of %d at both the entrance and exit locations.
  393 + return ([[Tether the target to the location for %d turns %s.
  394 + Each turn the target has a %d%% chance per tile it's travelled away from the tether to be teleported back %s, inflicting %0.2f physical and %0.2f temporal (warp) damage to all enemies in a radius of %d at both the entrance and exit locations.
395 395 If the target has already been tethered, it will also be tethered to the new location. The old tether still exists and can function normally, but cannot be extended by any means.
396 396 The damage will scale with your Spellpower.]])
397   - :tformat(duration, chance, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), radius)
  397 + :tformat(duration, Desc.vs(), chance, Desc.vs"ss", damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), radius)
398 398 end,
399 399 }
400 400
... ... @@ -448,8 +448,9 @@ newTalent{
448 448 info = function(self, t)
449 449 local range = t.getTeleport(self, t)
450 450 local duration = t.getDuration(self, t)
451   - return ([[Randomly teleports all enemies within a radius of three. Enemies will be teleported between %d and %d tiles from you and may be stunned, blinded, confused, or pinned for %d turns.
452   - The chance of teleportion will scale with your Spellpower.]]):tformat(range / 2, range, duration)
  451 + return ([[Randomly teleports all enemies within a radius of three %s.
  452 + Enemies will be teleported between %d and %d tiles from you and may be stunned %s, blinded %s, confused %s, or pinned %s for %d turns.]]
  453 + ):tformat(Desc.vs"ss", range / 2, range, Desc.vs"sp",Desc.vs"sp",Desc.vs"sm",Desc.vs"sp", duration)
453 454 end,
454 455 }
455 456
... ... @@ -505,8 +506,8 @@ newTalent{
505 506 info = function(self, t)
506 507 local damage = t.getDamage(self, t)/2
507 508 local duration = t.getDuration(self, t)
508   - return ([[Create a radius three anti-teleport field for %d turns and daze all enemies in the area of effect for two turns.
  509 + return ([[Create a radius three anti-teleport field %s for %d turns and daze all enemies in the area of effect for two turns %s.
509 510 Enemies attempting to teleport while anchored take %0.2f physical and %0.2f temporal (warp) damage.
510   - The damage will scale with your Spellpower.]]):tformat(duration, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
  511 + The damage will scale with your Spellpower.]]):tformat(Desc.vs"ss", duration, Desc.vs(), damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
511 512 end,
512 513 }
\ No newline at end of file
... ...
... ... @@ -86,7 +86,7 @@ newTalent{
86 86 info = function(self, t)
87 87 local range = self:getTalentRange(t)
88 88 return ([[Teleports you to up to %d tiles away, to a targeted location in line of sight.
89   - At talent level 5 you may swap positions with a target creature.]]):tformat(range)
  89 + At talent level 5 you may swap positions with a target creature %s.]]):tformat(range, Desc.vs"ss")
90 90 end,
91 91 }
92 92
... ... @@ -234,7 +234,8 @@ newTalent{
234 234 local duration = t.getDuration(self, t)
235 235 local radius = self:getTalentRadius(t)
236 236 local range = self:getTalentRange(t)
237   - return ([[You fold the space between yourself and a second point within a range of %d, creating a pair of wormholes. Any creature stepping on either wormhole will be teleported near the other (radius %d accuracy).
  237 + return ([[You fold the space between yourself and a second point within a range of %d, creating a pair of wormholes. Any creature stepping on either wormhole will be teleported near the other (radius %d accuracy).
  238 + To teleport hostile creatures, you need to bypass spell save with your spellpower.
238 239 The wormholes will last %d turns and must be placed at least two tiles apart.
239 240 The chance of teleporting enemies will scale with your Spellpower.]])
240 241 :tformat(range, radius, duration)
... ... @@ -293,7 +294,7 @@ newTalent{
293 294 local radius = self:getTalentRadius(t)
294 295 local duration = t.getDuration(self, t)
295 296 return ([[When you teleport you fire a pulse that jolts enemies out of phase in a radius of %d around both the start and the destination point.
296   - Each target has a %d%% chance per tile you travelled to be stunned, blinded, confused, or pinned for %d turns.]]):
297   - tformat(radius, chance, duration)
  297 + Each target has a %d%% chance per tile you travelled to be stunned, blinded, confused, or pinned for %d turns %s.]]):
  298 + tformat(radius, chance, duration, Desc.vs("sp", Desc.max("ps", "ms")))
298 299 end,
299 300 }
\ No newline at end of file
... ...
... ... @@ -113,9 +113,9 @@ newTalent{
113 113 local damage = t.getDamage(self, t)
114 114 local radius = self:getTalentRadius(t)
115 115 local duration = t.getDuration(self, t)
116   - return ([[Inflicts %0.2f temporal damage, and attempts to stun all targets in a radius %d ball for %d turns.
  116 + return ([[Inflicts %0.2f temporal damage, and attempts to stun all targets in a radius %d ball for %d turns %s.
117 117 The damage will scale with your Spellpower.]]):
118   - tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, duration)
  118 + tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, duration, Desc.vs"sp")
119 119 end,
120 120 }
121 121
... ...
... ... @@ -79,9 +79,9 @@ newTalent{
79 79 local resists = t.getResists(self, t)
80 80 local duration = t.getDuration(self, t)
81 81 return ([[When you hit with Weapon Folding you have a %d%% chance of dealing an additional %0.2f temporal damage to enemies in a radius of %d.
82   - Affected targets may also have their physical and temporal resistance reduced by %d%% for %d turns.
  82 + Affected targets may also have their physical and temporal resistance reduced by %d%% for %d turns %s.
83 83 This effect has a cooldown. If it triggers while on cooldown it will reduce the cooldown of Fold Gravity and Fold Warp by one turn.]])
84   - :tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, duration)
  84 + :tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, Desc.vs"ss", duration)
85 85 end,
86 86 }
87 87
... ... @@ -125,9 +125,9 @@ newTalent{
125 125 local radius = self:getTalentRadius(t)
126 126 local duration = t.getDuration(self, t)
127 127 return ([[When you hit with Weapon Folding you have a %d%% chance of dealing an additional %0.2f physical and %0.2f temporal (warp) damage to enemies in a radius of %d.
128   - Each target hit may be stunned, blinded, pinned, or confused for %d turns.
  128 + Each target hit may be stunned, blinded, pinned, or confused for %d turns %s.
129 129 This effect has a cooldown. If it triggers while on cooldown it will reduce the cooldown of Fold Gravity and Fold Fate by one turn.]])
130   - :tformat(chance, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2), radius, duration)
  130 + :tformat(chance, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2), radius, Desc.vs("sp", Desc.max("ms", "ps")), duration)
131 131 end,
132 132 }
133 133
... ... @@ -173,9 +173,9 @@ newTalent{
173 173 local slow = t.getSlow(self, t)
174 174 local duration = t.getDuration(self, t)
175 175 return ([[When you hit with Weapon Folding you have a %d%% chance of dealing an additional %0.2f physical (gravity) damage to enemies in a radius of %d.
176   - Affected targets may also be slowed, decreasing their global speed speed by %d%% for %d turns
  176 + Affected targets may also be slowed, decreasing their global speed speed by %d%% for %d turns %s.
177 177 This effect has a cooldown. If it triggers while on cooldown it will reduce the cooldown of Fold Fate and Fold Warp by one turn.]])
178   - :tformat(chance, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration)
  178 + :tformat(chance, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration, Desc.vs"sp")
179 179 end,
180 180 }
181 181
... ... @@ -283,13 +283,14 @@ newTalent{
283 283 local resists = t.getResists(self, t)
284 284 return ([[You now have a %d%% chance to Fold Fate, Gravity, or Warp into your Weapon Folding damage.
285 285
286   - Fold Fate: Deals %0.2f temporal damage to enemies in a radius of %d. Affected targets may lose %d%% physical and temporal resistance for %d turns.
287   - Fold Warp: Deals %0.2f physical and %0.2f temporal damage to enemies in a radius of %d. Affected targets may be stunned, blinded, confused, or pinned for %d turns.
288   - Fold Gravity: Deals %0.2f physical damage to enemies in a radius of %d. Affected targets will be slowed (%d%%) for %d turns.
  286 + Fold Fate: Deals %0.2f temporal damage to enemies in a radius of %d. Affected targets may lose %d%% physical and temporal resistance for %d turns %s.
  287 + Fold Warp: Deals %0.2f physical and %0.2f temporal damage to enemies in a radius of %d. Affected targets may be stunned %s, blinded %s, confused %s, or pinned %s for %d turns.
  288 + Fold Gravity: Deals %0.2f physical damage to enemies in a radius of %d. Affected targets will be slowed (%d%%) for %d turns %s.
289 289
290 290 Each Fold has an eight turn cooldown. If an effect would be triggered while on cooldown it will reduce the cooldown of the other two Folds by one turn.]])
291   - :tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, duration, damDesc(self, DamageType.PHYSICAL, damage/2), damDesc(self, DamageType.TEMPORAL, damage/2), radius,
292   - duration, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration)
  291 + :tformat(chance, damDesc(self, DamageType.TEMPORAL, damage), radius, resists, duration, Desc.vs"ss",
  292 + damDesc(self, DamageType.PHYSICAL, damage/2), damDesc(self, DamageType.TEMPORAL, damage/2), radius, Desc.vs"sp",Desc.vs"sp",Desc.vs"sm",Desc.vs"sp",
  293 + duration, damDesc(self, DamageType.PHYSICAL, damage), radius, slow, duration, Desc.vs"sp")
293 294 end,
294 295 }
295 296
... ... @@ -341,8 +342,8 @@ newTalent{
341 342 local duration = t.getDuration(self, t)
342 343 local damage = t.getDamage(self, t) * 100
343 344 return ([[Attack the target with either your ranged or melee weapons for %d%% damage.
344   - If the attack hits you'll breach the target's immunities, reducing armor hardiness, stun, pin, blindness, and confusion immunity by 50%% for %d turns.
  345 + If the attack hits you'll breach the target's immunities, reducing armor hardiness, stun, pin, blindness, and confusion immunity by 50%% for %d turns %s.
345 346 Breach chance scales with your Spellpower.]])
346   - :tformat(damage, duration)
  347 + :tformat(damage, duration, Desc.vs"ss")
347 348 end
348 349 }
\ No newline at end of file
... ...
... ... @@ -457,7 +457,7 @@ newTalent{
457 457 local duration =t.getDuration(self, t)
458 458 local affinity = t.getResists(self, t)
459 459 return ([[Command your Temporal Hounds to breathe time, dealing %0.2f temporal damage and reducing the three highest stats of all targets in a radius %d cone.
460   - Affected targets will have their stats reduced by %d for %d turns. You are immune to the breath of your own hounds and your hounds are immune to stat damage from other hounds.
461   - When you learn this talent, your hounds gain %d%% temporal damage affinity.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, stat_damage, duration, affinity)
  460 + Affected targets will have their stats reduced by %d for %d turns %s. You are immune to the breath of your own hounds and your hounds are immune to stat damage from other hounds.
  461 + When you learn this talent, your hounds gain %d%% temporal damage affinity.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), radius, stat_damage, duration, Desc.vs"ss", affinity)
462 462 end,
463 463 }
... ...
... ... @@ -205,9 +205,9 @@ newTalent{
205 205 info = function(self, t)
206 206 local braid = t.getBraid(self, t)
207 207 local duration = t.getDuration(self, t)
208   - return ([[Your Rethread now braids the lifelines of all targets it hits for %d turns. Braided targets take %d%% of all damage dealt to other braided targets.
  208 + return ([[Your Rethread now braids the lifelines of all targets it hits for %d turns %s. Braided targets take %d%% of all damage dealt to other braided targets.
209 209 The amount of damage shared will scale with your Spellpower.]])
210   - :tformat(duration, braid)
  210 + :tformat(duration, Desc.vs(), braid)
211 211 end
212 212 }
213 213
... ... @@ -292,11 +292,11 @@ newTalent{
292 292 info = function(self, t)
293 293 local duration = t.getDuration(self, t)
294 294 local power = t.getPower(self, t)
295   - return ([[Over the next %d turns, you attempt to remove the target from the timeline, lowering its resistance to physical and temporal damage by %d%%.
  295 + return ([[Over the next %d turns, you attempt to remove the target from the timeline, lowering its resistance to physical and temporal damage by %d%% %s.
296 296 If you manage to kill the target while the spell is in effect, you'll be returned to the point in time you cast this spell and the target will be slain.
297 297 This spell splits the timeline. Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.
298 298 The resistance penalty will scale with your Spellpower.]])
299   - :tformat(duration, power)
  299 + :tformat(duration, power, Desc.vs"ss")
300 300 end,
301 301 }
302 302
... ...
... ... @@ -215,8 +215,8 @@ newTalent{
215 215 info = function(self, t)
216 216 local damage = t.getDamage(self, t)
217 217 local duration = t.getDuration(self, t)
218   - return ([[Inflicts %0.2f temporal damage. If your target survives, it may be removed from time for %d turns.
219   - The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration)
  218 + return ([[Inflicts %0.2f temporal damage. If your target survives, it may be removed from time for %d turns %s.
  219 + The damage will scale with your Spellpower.]]):tformat(damDesc(self, DamageType.TEMPORAL, damage), duration, Desc.vs"ss")
220 220 end,
221 221 }
222 222
... ...
... ... @@ -110,9 +110,8 @@ newTalent{
110 110 return true
111 111 end,
112 112 info = function(self, t)
113   - return ([[Project a corrupted blast of power that removes up to %d magical or physical effects or any type of sustain and deals %0.2f blight damage to any creatures caught in the radius 3 ball.
114   - For each effect, the creature has a chance to resist based on its spell save.
115   - The damage will increase with your Spellpower.]]):tformat(t.getRemoveCount(self, t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 28, 120)))
  113 + return ([[Project a corrupted blast of power that removes up to %d magical or physical effects or any type of sustain %s and deals %0.2f blight damage to any creatures caught in the radius 3 ball.
  114 + The damage will increase with your Spellpower.]]):tformat(t.getRemoveCount(self, t), Desc.vs"ss", damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 28, 120)))
116 115 end,
117 116 }
118 117
... ... @@ -142,10 +141,10 @@ newTalent{
142 141 return true
143 142 end,
144 143 info = function(self, t)
145   - return ([[Infects the target with a corrosive worm for 6 turns that reduces blight and acid resistance by %d%% and feeds off damage taken.
  144 + return ([[Infects the target with a corrosive worm for 6 turns %s that reduces blight and acid resistance by %d%% and feeds off damage taken.
146 145 When this effect ends or the target dies the worm will explode, dealing %d acid damage in a 4 radius ball. This damage will increase by %d%% of all damage taken while infected.
147 146 The damage dealt by the effect will increase with spellpower.]]):
148   - tformat(t.getResist(self,t), t.getDamage(self, t), t.getPercent(self, t))
  147 + tformat(Desc.vs"ss", t.getResist(self,t), t.getDamage(self, t), t.getPercent(self, t))
149 148 end,
150 149 }
151 150
... ... @@ -207,13 +206,13 @@ newTalent{
207 206 info = function(self, t)
208 207 local dam = damDesc(self, DamageType.BLIGHT, t.getDamage(self,t))
209 208 local power, heal_factor, fail = t.getEffects(self, t)
210   - return ([[A furious storm of blighted poison rages around the caster in a radius of %d for %d turns. Each creature hit by the storm takes %0.2f blight damage and is poisoned for %0.2f blight damage over 4 turns.
  209 + return ([[A furious storm of blighted poison %s rages around the caster in a radius of %d for %d turns. Each creature hit by the storm takes %0.2f blight damage and is poisoned for %0.2f blight damage over 4 turns.
211 210 At talent level 2 you have a chance to inflict Insidious Blight, which reduces healing by %d%%.
212 211 At talent level 4 you have a chance to inflict Numbing Blight, which reduces all damage dealt by %d%%.
213 212 At talent level 6 you have a chance to inflict Crippling Blight, which causes talents to have a %d%% chance of failure.
214 213 Each possible effect is equally likely.
215 214 The poison damage dealt is capable of a critical strike.
216 215 The damage will increase with your Spellpower.]]):
217   - tformat(self:getTalentRadius(t), t.getDuration(self, t), dam/4, dam, heal_factor, power, fail)
  216 + tformat(Desc.vs"ss", self:getTalentRadius(t), t.getDuration(self, t), dam/4, dam, heal_factor, power, fail)
218 217 end,
219 218 }
\ No newline at end of file
... ...
... ... @@ -71,9 +71,9 @@ newTalent{
71 71 end,
72 72 info = function(self, t)
73 73 return ([[You extract corrupted blood from your own body, hitting everything in a frontal cone of radius %d for %0.2f blight damage.
74   - Each creature hit has a %d%% chance of being infected by a random disease, doing %0.2f blight damage and weakening either Constitution, Strength or Dexterity for 6 turns.
  74 + Each creature hit has a %d%% chance of being infected by a random disease %s, doing %0.2f blight damage and weakening either Constitution, Strength or Dexterity for 6 turns.
75 75 The damage will increase with your Spellpower.]]):
76   - tformat(self:getTalentRadius(t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 10, 190)), t.getChance(self, t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 10, 220)))
  76 + tformat(self:getTalentRadius(t), damDesc(self, DamageType.BLIGHT, self:combatTalentSpellDamage(t, 10, 190)), t.getChance(self, t), Desc.vs"ss", damDesc(self, DamageType.BLIGHT, self: