Commit 24f0744429d2176c3c74210c53be1d99613d76cc

Authored by DarkGod
2 parents 9794b6c0 3380a69e

Merge branch 'Bunny/t-engine4-1.7.3bnnsc'

Showing 36 changed files with 99 additions and 84 deletions
... ... @@ -203,7 +203,8 @@ function _M:tooltip(x, y)
203 203 if p.level <= data.level_range[1] - 10 then color = "CRIMSON"
204 204 elseif p.level <= data.level_range[1] - 4 then color = "ORANGE"
205 205 end
206   - tstr:add(true, {"font","bold"}, {"color", color}, _t"Min.level: "..data.level_range[1], {"color", "LAST"}, {"font","normal"}, true)
  206 + tstr:add(true, {"font","bold"}, {"color", color}, _t"Min.level: "..math.floor((data.level_range[1]+(game.state.birth.difficulty_level_add or 0))*(game.state.birth.difficulty_level_mult or 1)), {"color", "LAST"}, {"font","normal"}, true)
  207 + tstr:add(true, {"font","bold"}, {"color", color}, _t"Max.level: "..math.ceil((data.level_range[2]+(game.state.birth.difficulty_level_add or 0))*(game.state.birth.difficulty_level_mult or 1)), {"color", "LAST"}, {"font","normal"}, true)
207 208 end
208 209 end
209 210 end
... ...
... ... @@ -127,7 +127,7 @@ function _M:attackTarget(target, damtype, mult, noenergy, force_unarmed)
127 127 -- if ret then return false end
128 128 -- end
129 129
130   - if not target.turn_procs.warding_weapon and target:knowTalent(target.T_WARDING_WEAPON) and target:getTalentLevelRaw(target.T_WARDING_WEAPON) >= 5
  130 + if not target.turn_procs.warding_weapon and target:knowTalent(target.T_WARDING_WEAPON) and target:getTalentLevel(target.T_WARDING_WEAPON) >= 5
131 131 and rng.percent(target:callTalent(target.T_WARDING_WEAPON, "getChance")) then
132 132 local t = self:getTalentFromId(self.T_WARDING_WEAPON)
133 133 if target:getPsi() >= t.psi then
... ...
... ... @@ -146,6 +146,7 @@ newBirthDescriptor{
146 146 ["cursed/shadows"]={true, 0.3},
147 147 ["cursed/darkness"]={true, 0.3},
148 148 ["cursed/cursed-form"]={true, 0.0},
  149 + ["technique/combat-training"]={true, 0.0},
149 150 ["cunning/survival"]={false, 0.0},
150 151 ["cursed/fears"]={false, 0.3},
151 152 ["cursed/one-with-shadows"]={false, 0.3},
... ...
... ... @@ -76,7 +76,7 @@ newBirthDescriptor{
76 76 ["technique/shield-offense"]={true, 0.0},
77 77 ["technique/2hweapon-assault"]={true, 0.0},
78 78 ["technique/combat-techniques-active"]={false, 0.0},
79   - ["technique/combat-training"]={true, 0.0},
  79 + ["technique/combat-training"]={true, 0.3},
80 80 ["cunning/survival"]={false, 0.0},
81 81 ["technique/combat-techniques-passive"]={true, 0.0},
82 82 ["celestial/sun"]={true, 0.3},
... ... @@ -149,6 +149,7 @@ newBirthDescriptor{
149 149 power_source = {arcane=true},
150 150 stats = { mag=6, cun=3, },
151 151 talents_types = {
  152 + ["technique/combat-training"]={true, 0.0},
152 153 ["cunning/survival"]={false, 0.0},
153 154 ["celestial/sunlight"]={true, 0.3},
154 155 ["celestial/chants"]={true, 0.3},
... ...
... ... @@ -114,6 +114,7 @@ newBirthDescriptor{
114 114 ["chronomancy/chronomancy"]={true, 0.3},
115 115 ["chronomancy/fate-weaving"]={true, 0.3},
116 116 ["chronomancy/spacetime-weaving"]={true, 0.3},
  117 + ["technique/combat-training"]={true, 0.0},
117 118
118 119 -- locked generic
119 120 ["chronomancy/energy"]={false, 0.3},
... ...
... ... @@ -132,6 +132,7 @@ newBirthDescriptor{
132 132 end,
133 133 },
134 134 talents_types = {
  135 + ["technique/combat-training"]={true, 0.0},
135 136 ["cunning/survival"]={false, 0.0},
136 137 ["corruption/sanguisuge"]={true, 0.3},
137 138 ["corruption/hexes"]={true, 0.3},
... ...
... ... @@ -87,6 +87,7 @@ newBirthDescriptor{
87 87 ["spell/acid-alchemy"]={true, 0.3},
88 88 ["spell/frost-alchemy"]={true, 0.3},
89 89 ["spell/energy-alchemy"]={false, 0.3},
  90 + ["technique/combat-training"]={true, 0.0},
90 91 ["spell/staff-combat"]={true, 0.3},
91 92 ["cunning/survival"]={false, 0.0},
92 93 },
... ... @@ -201,6 +202,7 @@ newBirthDescriptor{
201 202 ["spell/divination"]={true, 0.3},
202 203 ["spell/conveyance"]={true, 0.3},
203 204 ["spell/aegis"]={true, 0.3},
  205 + ["technique/combat-training"]={true, 0.0},
204 206 ["cunning/survival"]={false, 0.0},
205 207 },
206 208 talents = {
... ... @@ -268,6 +270,7 @@ newBirthDescriptor{
268 270 ["spell/death"]={true, 0.3},
269 271 ["spell/animus"]={true, 0.3},
270 272 ["spell/eradication"]={false, 0.3},
  273 + ["technique/combat-training"]={true, 0.0},
271 274 ["spell/spectre"]={true, 0.3},
272 275 ["spell/necrosis"]={true, 0.3},
273 276 ["cunning/survival"]={true, 0.0},
... ...
... ... @@ -90,7 +90,7 @@ newBirthDescriptor{
90 90 ["psionic/charged-mastery"]={false, 0.3},
91 91 --Miscellaneous trees:
92 92 ["cunning/survival"]={true, 0},
93   - ["technique/combat-training"]={true, 0},
  93 + ["technique/combat-training"]={true, 0.3},
94 94 },
95 95 talents = {
96 96 [ActorTalents.T_KINETIC_SHIELD] = 1,
... ... @@ -171,6 +171,7 @@ newBirthDescriptor{
171 171 ["psionic/feedback"]={true, 0.3},
172 172 ["psionic/mentalism"]={true, 0.3},
173 173 ["cunning/survival"]={true, 0.0},
  174 + ["technique/combat-training"]={true, 0.0},
174 175
175 176 -- locked trees
176 177 ["psionic/discharge"]={false, 0.3},
... ...
... ... @@ -355,7 +355,7 @@ newBirthDescriptor{
355 355 ["cunning/dirty"]={false, 0.0},
356 356 ["cunning/tactical"]={true, 0.3},
357 357 ["cunning/survival"]={true, 0.0},
358   - ["technique/combat-training"]={true, 0.0},
  358 + ["technique/combat-training"]={true, 0.3},
359 359 ["technique/combat-techniques-active"]={true, 0.3},
360 360 ["technique/combat-techniques-passive"]={true, 0.0},
361 361 ["technique/pugilism"]={true, 0.3},
... ...
... ... @@ -212,6 +212,7 @@ newBirthDescriptor{
212 212 stats = { wil=5, cun=4, },
213 213 talents_types = {
214 214 ["cunning/survival"]={true, 0.0},
  215 + ["technique/combat-training"]={true, 0.0},
215 216 ["wild-gift/call"]={true, 0.3},
216 217 ["wild-gift/antimagic"]={true, 0.3},
217 218 ["wild-gift/mindstar-mastery"]={true, 0.3},
... ...
... ... @@ -283,8 +283,8 @@ newEntity{ base = "BASE_LITE", define_as = "WINTERTIDE_PHIAL",
283 283 material_level = 2,
284 284
285 285 wielder = {
286   - lite = 1,
287   - infravision = 6,
  286 + lite = 2,
  287 + infravision = 7,
288 288 },
289 289
290 290 max_power = 60, power_regen = 1,
... ...
... ... @@ -501,7 +501,7 @@ newEntity{ base = "BASE_KNIFE",
501 501 dam = 45,
502 502 apr = 11,
503 503 physcrit = 18,
504   - dammod = {dex=0.55,str=0.35},
  504 + dammod = {dex=0.5,str=0.5},
505 505 },
506 506 wielder = {
507 507 lite = 1,
... ... @@ -1176,7 +1176,7 @@ newEntity{ base = "BASE_KNIFE", -- Thanks Grayswandir!
1176 1176 dam = 20,
1177 1177 apr = 10,
1178 1178 physcrit = 12,
1179   - dammod = {dex=0.45,str=0.45,},
  1179 + dammod = {dex=0.5,str=0.5,},
1180 1180 lifesteal = 6,
1181 1181 melee_project = {
1182 1182 [DamageType.FIRE] = 20,
... ...
... ... @@ -370,6 +370,7 @@ newEntity{ base = "BASE_LITE", define_as = "SUMMERTIDE_PHIAL",
370 370 desc = _t[[A small crystal phial that captured Sunlight during the Summertide.]],
371 371 special_desc = function(self) return _t"When attacking in melee, deals 15 light damage and lights tiles in radius 1." end,
372 372 cost = 200,
  373 + material_level = 1,
373 374
374 375 max_power = 15, power_regen = 1,
375 376 use_power = {
... ... @@ -848,7 +849,7 @@ newEntity{ base = "BASE_KNIFE",
848 849 dam = 25,
849 850 apr = 10,
850 851 physcrit = 8,
851   - dammod = {dex=0.55,str=0.35},
  852 + dammod = {dex=0.65,str=0.35},
852 853 no_stealth_break = true,
853 854 no_garrote = true,
854 855 melee_project={[DamageType.RANDOM_SILENCE] = 10},
... ... @@ -2966,7 +2967,7 @@ newEntity{ base = "BASE_KNIFE",
2966 2967 dam = 25,
2967 2968 apr = 10,
2968 2969 physcrit = 9,
2969   - dammod = {dex=0.45,str=0.45, mag=0.1},
  2970 + dammod = {dex=0.5,str=0.5, mag=0.15},
2970 2971 convert_damage = {
2971 2972 [DamageType.DARKNESS] = 50,
2972 2973 },
... ... @@ -6140,7 +6141,7 @@ Passed on and on, this blade has developed a thirst of its own.]],
6140 6141 dam = 27,
6141 6142 apr = 8,
6142 6143 physcrit = 9,
6143   - dammod = {str=0.45, dex=0.55, mag=0.05},
  6144 + dammod = {str=0.35, dex=0.55, mag=0.2},
6144 6145 talent_on_hit = { T_DISPERSE_MAGIC = {level=1, chance=15},},
6145 6146 special_on_hit = {desc=_t"steals up to 50 mana from the target", fct=function(combat, who, target)
6146 6147 local manadrain = util.bound(target:getMana(), 0, 50)
... ... @@ -8221,7 +8222,7 @@ Their killing spree ended when one of the victims got lucky and managed to stab
8221 8222 dam = 35,
8222 8223 apr = 10,
8223 8224 physcrit = 15,
8224   - dammod = {str=0.45, dex=0.45},
  8225 + dammod = {str=0.5, dex=0.5},
8225 8226 melee_project = { [DamageType.COLD]=30 },
8226 8227 special_on_crit = {desc=_t"freezes the target", fct=function(combat, who, target)
8227 8228 if not target or target == self then return end
... ...
... ... @@ -35,7 +35,7 @@ return {
35 35 system_rotation = dir, system_rotationv = 0,
36 36 generator = function()
37 37 return {
38   - life = 42,
  38 + life = 15,
39 39 --size = 30, sizev = 2.1*64*radius/16, sizea = 0,
40 40 size = 3.5*64*radius, sizev = 0, sizea = 0,
41 41
... ... @@ -47,7 +47,7 @@ return {
47 47 r = 1, rv = 0, ra = 0,
48 48 g = 1, gv = 0, ga = 0,
49 49 b = 1, bv = 0, ba = 0,
50   - a = 1, av = 0, aa = 0,
  50 + a = 0.7, av = 0, aa = 0,
51 51 }
52 52 end, },
53 53 function(self)
... ...
... ... @@ -51,7 +51,7 @@ defineTile('2', "FLOOR", {random_filter={type="ammo", add_levels=10, tome_mod="v
51 51
52 52 return {
53 53 [[XXXXXXXXXXXXXXXXX]],
54   -[[XE$..#.....#..$EX]],
  54 +[[XE$...........$EX]],
55 55 [[X$2$##..P..##$2$X]],
56 56 [[X.$##.......##$.X]],
57 57 [[X.##...X^X...##.X]],
... ... @@ -61,7 +61,7 @@ return {
61 61 [[X.T.^.#1D1#.^.T.X]],
62 62 [[X...XXX111XXX...X]],
63 63 [[X......X#X......X]],
64   -[[X##..e.X.X.e..##X]],
  64 +[[X.#..e.X.X.e..#.X]],
65 65 [[X.##...X^X...##.X]],
66 66 [[X.$##.......##$.X]],
67 67 [[X$2$##..P..##$2$X]],
... ...
... ... @@ -55,19 +55,19 @@ defineTile('O', "FLOOR", nil, {random_filter={add_levels=15, name="orc necromanc
55 55 defineTile('K', "FLOOR", nil, {random_filter={add_levels=5, type="undead", subtype="giant", special_rarity="bonegiant_rarity"}})
56 56
57 57 return {
58   -[[...............................]],
59   -[[.#############################.]],
60   -[[.#...................+...+.K\#.]],
61   -[[.#.......o....o......#####.o\#.]],
62   -[[.#......................K#.K\#.]],
63   -[[.#.....o.................#####.]],
64   -[[.#~~~.....o...###........#o.K#.]],
65   -[[.#~O~..o......%$#........+...X.]],
66   -[[.#~~~.........###........#o.K#.]],
67   -[[.#.......o..o............#####.]],
68   -[[.#......................K#.K(#.]],
69   -[[.#....o....o.........#####.o(#.]],
70   -[[.#...................+...+.K(#.]],
71   -[[.#############################.]],
72   -[[...............................]],
  58 +[[...........................]],
  59 +[[.#########################.]],
  60 +[[.#...............+...+.K\#.]],
  61 +[[.#......o...o....#####.o\#.]],
  62 +[[.#..................K#.K\#.]],
  63 +[[.#.....o.............#####.]],
  64 +[[.#~~~...o...###......#o.K#.]],
  65 +[[.#~O~..o.....$#......+...X.]],
  66 +[[.#~~~.......###......#o.K#.]],
  67 +[[.#.....o..o..........#####.]],
  68 +[[.#..................K#.K(#.]],
  69 +[[.#...o...o.......#####.o(#.]],
  70 +[[.#...............+...+.K(#.]],
  71 +[[.#########################.]],
  72 +[[...........................]],
73 73 }
... ...
... ... @@ -50,17 +50,17 @@ defineTile('d', "FLOOR", {random_filter={add_levels=15, tome_mod="gvault"}}, {ra
50 50 return {
51 51
52 52 [[########################]],
53   -[[#$$a/##.........c##d...#]],
  53 +[[#$$a/##.........c..d...#]],
54 54 [[#$$a##.........a.a##...#]],
55   -[[#ca##....^^^^^^.c.b%%..#]],
56   -[[#c%%.....^^^^^^.a.a.##.#]],
57   -[[###......^^^^^^c.a.ba###]],
58   -[[##.......^^^/^^.caaa...X]],
59   -[[###......^^^~^^caa.b.###]],
  55 +[[#ca##....^^^^^^.c.b##..#]],
  56 +[[#c##.....^^^^^^.a.a.##.#]],
  57 +[[#.#......^^^^^^c.a.ba###]],
  58 +[[#........^^^/^^.caaa...X]],
  59 +[[#.#......^^^~^^caa.b.###]],
60 60 [[#$##.....^~~~^^a..ba##d#]],
61 61 [[#$$##....^~^^^^.c.a##..#]],
62   -[[#aaa##............%%...#]],
63   -[[#aacc%%.........c##....#]],
  62 +[[#aaa##............##...#]],
  63 +[[#aacc##.........c......#]],
64 64 [[########################]],
65 65
66 66 }
\ No newline at end of file
... ...
... ... @@ -78,20 +78,21 @@ defineTile('!', "DOOR_VAULT")
78 78 defineTile('>', "DYNAMIC_ZONE_EXIT")
79 79
80 80
81   -defineTile('b', "FLOOR", {random_filter={add_levels=20, tome_mod="gvault"}}, {random_filter={add_levels=5, name="skeleton magus"}})
  81 +defineTile('b', "FLOOR", {random_filter={add_levels=15, tome_mod="gvault"}}, {random_filter={add_levels=5, name="skeleton magus"}})
82 82 defineTile('$', "FLOOR", {random_filter={add_levels=25, type="money"}})
83   -defineTile('j', "FLOOR", {random_filter={add_levels=10, type="jewelry", tome_mod="gvault"}})
84   -defineTile('t', "FLOOR", {random_filter={add_levels=5, tome_mod="gvault"}}, turret())
  83 +defineTile('j', "FLOOR", {random_filter={add_levels=5, type="jewelry", tome_mod="vault"}})
  84 +defineTile('J', "FLOOR", {random_filter={add_levels=10, type="jewelry", tome_mod="gvault"}})
  85 +defineTile('t', "FLOOR", {random_filter={add_levels=5, tome_mod="vault"}}, turret())
85 86
86 87 local def = {
87 88 [[##############]],
88   -[[#tjj##########]],
  89 +[[#tjJ##########]],
89 90 [[#b$$##########]],
90 91 [[##.##t$..t####]],
91 92 [[#t.+...>..####]],
92 93 [[##.##...$.####]],
93 94 [[#b$$#$...t####]],
94   -[[#tjj##########]],
  95 +[[#tjJ##########]],
95 96 [[##############]],
96 97 }
97 98
... ...
... ... @@ -20,7 +20,7 @@
20 20 name = _t"Following The Way"
21 21 desc = function(self, who)
22 22 local desc = {}
23   - desc[#desc+1] = _t"You have been tasked to remove at leastg one of the threats to the yeeks.\n"
  23 + desc[#desc+1] = _t"You have been tasked to remove at least one of the threats to the yeeks.\n"
24 24 desc[#desc+1] = _t"Protect the Way, and vanquish your foes.\n"
25 25 if self:isCompleted("murgol") then
26 26 if self:isCompleted("murgol-invaded") then
... ...
... ... @@ -140,7 +140,7 @@ newTalent{
140 140 no_sustain_autoreset = true,
141 141 random_boss_rarity = 5,
142 142 rnd_boss_restrict = function(self, t, data)
143   - return data.level < 20
  143 + return true -- allow only on fixedbosses specifically granted the talent
144 144 end,
145 145 tactical = {
146 146 -- heals (negative attack) demons hurts others
... ...
... ... @@ -162,8 +162,8 @@ newTalent{
162 162 range = 1,
163 163 target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
164 164 getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
165   - getDuration = function(self, t) return self:combatTalentScale(t, 2, 4, "log") end,
166   - getDebuffs = function(self, t) return math.floor(self:combatTalentScale(t, 1, 3, "log")) end,
  165 + getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 5)) end,
  166 + getDebuffs = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3)) end,
167 167 speed = "weapon",
168 168 action = function(self, t)
169 169 local tg = self:getTalentTarget(t)
... ...
... ... @@ -40,7 +40,7 @@ newTalent{
40 40 getPin = function(self, t) return math.ceil(self:combatTalentLimit(t, 100, 25, 45)) end, -- Limit < 100%
41 41 range = 0,
42 42 radius = function(self, t)
43   - return math.floor(self:combatTalentScale(t,2.5, 4.5, nil, 0, 0, true)) --uses raw talent level
  43 + return math.floor(self:combatTalentScale(t, 2.35, 4.25))
44 44 end,
45 45 target = function(self, t)
46 46 return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
... ... @@ -90,7 +90,7 @@ newTalent{
90 90 getHeal = function(self, t) return math.floor(self:combatTalentLimit(t, 200, 62, 110)) end, -- Limit < 200%
91 91 range = 0,
92 92 radius = function(self, t)
93   - return math.floor(self:combatTalentScale(t,2.5, 4.5, nil, 0, 0, true))
  93 + return math.floor(self:combatTalentScale(t, 2.35, 4.25))
94 94 end,
95 95 target = function(self, t)
96 96 return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
... ... @@ -138,7 +138,7 @@ newTalent{
138 138 getFail = function(self, t) return self:combatTalentLimit(t, 50, 20, 35) end, -- Limit < 50%
139 139 range = 0,
140 140 radius = function(self, t)
141   - return math.floor(self:combatTalentScale(t,2.5, 4.5, nil, 0, 0, true))
  141 + return math.floor(self:combatTalentScale(t, 2.35, 4.25))
142 142 end,
143 143 target = function(self, t)
144 144 return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
... ... @@ -187,7 +187,7 @@ newTalent{
187 187 getPower = function(self, t) return math.max(0,self:combatTalentLimit(t, 50, 20, 40)) end, -- Limit < 50%
188 188 range = 0,
189 189 radius = function(self, t)
190   - return math.floor(self:combatTalentScale(t,2.5, 4.5, nil, 0, 0, true))
  190 + return math.floor(self:combatTalentScale(t, 2.35, 4.25))
191 191 end,
192 192 target = function(self, t)
193 193 return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
... ...
... ... @@ -129,7 +129,7 @@ newTalent{
129 129 on_unlearn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) - 1 end,
130 130 getMoveDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 30) end,
131 131 getDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 150) end,
132   - getRadius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 4, 0.5, 0, 0, true)) end,
  132 + getRadius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 4)) end,
133 133 action = function(self, t)
134 134 local tg = {type="hit", range=self:getTalentRange(t), selffire=false, talent=t}
135 135 local x, y = self:getTarget(tg)
... ...
... ... @@ -48,7 +48,7 @@ newTalent{
48 48 equilibrium = 5,
49 49 cooldown = 25,
50 50 range = 10,
51   - radius = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8, 0.5, 0, 0, true)) end,
  51 + radius = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end,
52 52 requires_target = true,
53 53 no_npc_use = true,
54 54 --[[ WIP: how to set up tactics: (Not implemented at this time)
... ...
... ... @@ -129,8 +129,8 @@ newTalent{
129 129 info = function(self, t)
130 130 return ([[Assume a defensive mental state.
131 131 For one turn, you will fully block the next melee attack used against you with your telekinetically-wielded weapon and then strike the attacker with it for %d%% weapon damage.
132   - At raw talent level 3 you will also disarm the attacker for 3 turns.
133   - At raw talent level 5 you will be able to reflexively block up to one attack per turn with a %d%% chance, based on your cunning. Each trigger requires and uses 10 Psi.
  132 + At talent level 3 you will also disarm the attacker for 3 turns.
  133 + At talent level 5 you will be able to reflexively block up to one attack per turn with a %d%% chance, based on your cunning. Each trigger requires and uses 10 Psi.
134 134 This requires a telekinetically-wielded weapon.]]):
135 135 tformat(100 * t.getWeaponDamage(self, t), t.getChance(self, t))
136 136 end,
... ...
... ... @@ -53,7 +53,7 @@ newTalent{
53 53 DamageType.BONEYARD, {resist=t:_getResist(self), cooldown=t:_getCooldown(self), power=t:_getPower(self), resurrect=t:_getResurrect(self)},
54 54 self:getTalentRadius(t),
55 55 5, nil,
56   - MapEffect.new{zdepth=3, color_br=255, color_bg=255, color_bb=255, effect_shader="shader_images/boneyard_ground_gfx_3.png"},
  56 + MapEffect.new{zdepth=3, alpha=85, color_br=255, color_bg=255, color_bb=255, effect_shader="shader_images/boneyard_ground_gfx_3.png"},
57 57 nil,
58 58 true, true
59 59 )
... ...
... ... @@ -24,7 +24,7 @@ newTalent{
24 24 points = 5,
25 25 mana = 5,
26 26 cooldown = 4,
27   - range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 0, true)) end,
  27 + range = function(self, t) return math.min(10, math.floor(self:combatTalentScale(t, 5, 9))) end,
28 28 radius = function(self, t) return self:callTalent(self.T_EXPLOSION_EXPERT, "getRadius") end,
29 29 direct_hit = true,
30 30 requires_target = true,
... ... @@ -154,22 +154,17 @@ newTalent{
154 154 require = spells_req2,
155 155 mode = "passive",
156 156 points = 5,
157   - on_learn = function(self, t)
158   - self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 3
159   - self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 3
160   - self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 3
161   - self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 3
162   - end,
163   - on_unlearn = function(self, t)
164   - self.resists[DamageType.FIRE] = self.resists[DamageType.FIRE] - 3
165   - self.resists[DamageType.COLD] = self.resists[DamageType.COLD] - 3
166   - self.resists[DamageType.LIGHTNING] = self.resists[DamageType.LIGHTNING] - 3
167   - self.resists[DamageType.ACID] = self.resists[DamageType.ACID] - 3
  157 + getResists = function(self, t) return self:combatTalentScale(t, 4, 17) end,
  158 + passives = function(self, t, p)
  159 + self:talentTemporaryValue(p, "resists",{[DamageType.FIRE]=t.getResists(self, t)})
  160 + self:talentTemporaryValue(p, "resists",{[DamageType.COLD]=t.getResists(self, t)})
  161 + self:talentTemporaryValue(p, "resists",{[DamageType.LIGHTNING]=t.getResists(self, t)})
  162 + self:talentTemporaryValue(p, "resists",{[DamageType.ACID]=t.getResists(self, t)})
168 163 end,
169 164 info = function(self, t)
170 165 return ([[Grants %d%% protection to you, your golem and other friendly creatures against the elemental damage of your own bombs, and against external elemental damage (fire, cold, lightning and acid) by %d%%.
171 166 At talent level 5 it also protects against all side effects of your bombs.]]):
172   - tformat(math.min(100, self:getTalentLevelRaw(t) * 20), self:getTalentLevelRaw(t) * 3)
  167 + tformat(math.min(100, self:getTalentLevelRaw(t) * 20), t.getResists(self, t))
173 168 end,
174 169 }
175 170
... ... @@ -210,7 +205,7 @@ newTalent{
210 205 points = 5,
211 206 mana = 32,
212 207 cooldown = 10,
213   - range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 0, true)) end,
  208 + range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
214 209 radius = 2,
215 210 direct_hit = true,
216 211 requires_target = true,
... ...
... ... @@ -99,13 +99,13 @@ newTalent{
99 99 if self:attr("burning_wake") and self:attr("cleansing_flame") then return 1 end
100 100 end },
101 101 range = 0,
102   - radius = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8, 0.5, 0, 0, true)) end,
  102 + radius = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end,
103 103 requires_target = true,
104 104 target = function(self, t)
105 105 return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
106 106 end,
107 107 getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 250) end,
108   - getStunDuration = function(self, t) return self:combatTalentScale(t, 3, 7, 0.5, 0, 0, true) end,
  108 + getStunDuration = function(self, t) return self:combatTalentScale(t, 2.5, 5.5) end,
109 109 action = function(self, t)
110 110 local tg = self:getTalentTarget(t)
111 111 local x, y = self:getTarget(tg)
... ... @@ -146,7 +146,7 @@ newTalent{
146 146 cooldown = 8,
147 147 tactical = { ATTACKAREA = { FIRE = 2 } },
148 148 range = 7,
149   - radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6, 0.5, 0, 0, true)) end,
  149 + radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 5.5)) end,
150 150 proj_speed = 4,
151 151 direct_hit = true,
152 152 requires_target = true,
... ...
... ... @@ -153,6 +153,12 @@ newTalent{
153 153 tactical = { DEFEND = 3, ATTACK = 2 },
154 154 getLife = function(self, t) return math.ceil(self:combatTalentScale(t, 5, 12)) end,
155 155 on_pre_use = function(self, t) return self.in_combat and not self:hasEffect(self.EFF_MIRROR_IMAGE_REAL) end,
  156 + callbackOnDeath = function(self, t)
  157 + -- Remove mirror image on death
  158 + for uid, e in pairs(game.level.entities) do
  159 + if e.is_mirror_image and e.summoner and e.summoner == self then e:disappear() end
  160 + end
  161 + end,
156 162 action = function(self, t)
157 163 if not self:canBe("summon") then game.logPlayer(self, "You cannot summon; you are suppressed!") return end
158 164
... ... @@ -242,6 +248,7 @@ newTalent{
242 248 iceblock_pierce = self.iceblock_pierce,
243 249 no_breath = 1,
244 250 remove_from_party_on_death = true,
  251 + is_mirror_image = 1,
245 252 }
246 253
247 254 image:resolve()
... ...
... ... @@ -24,7 +24,7 @@ newTalent{
24 24 mode = "passive",
25 25 points = 5,
26 26 require = { stat = { con=function(level) return 14 + level * 9 end }, },
27   - getRes = function(self, t) return self:combatTalentScale(t, 4, 15, 0.75, 0, 0, true) end,
  27 + getRes = function(self, t) return self:combatTalentScale(t, 3.16, 12.2, 0.75) end,
28 28 passives = function(self, t, p)
29 29 self:talentTemporaryValue(p, "resists", {all = t.getRes(self, t)})
30 30 end,
... ...
... ... @@ -281,6 +281,7 @@ newTalent{
281 281 points = 5,
282 282 mode = "passive",
283 283 range = 0,
  284 + no_npc_use = true,
284 285 getCrit = function(self, t) return self:combatTalentScale(t, 3, 15) end,
285 286 getCritPower = function(self, t) return self:combatTalentScale(t, 7, 20) end,
286 287 getChance = function(self, t) return self:combatTalentLimit(t, 100, 20, 45) end,
... ...
... ... @@ -99,10 +99,10 @@ newTalent {
99 99 return self:combatTalentLimit(t, 0, 0.15, .05)
100 100 end,
101 101 getReduction = function(self, t)
102   - return self:combatScale(self:combatDefense() * self:getTalentLevel(t), 5, 10, 30, 450)
  102 + return self:combatScale(self:combatDefense() * self:getTalentLevel(t), 5, 10, 30, 550)
103 103 end,
104 104 getBlockChance = function(self, t)
105   - return self:combatTalentLimit(t, 100, 25, 55)
  105 + return self:combatTalentLimit(t, 100, 20, 40)
106 106 end,
107 107 callbackOnTakeDamageBeforeResists = function(self, t, src, x, y, type, dam, tmp)
108 108 local shield = self:hasShield()
... ... @@ -113,7 +113,7 @@ newTalent {
113 113 local bt, bt_string = t2.getBlockedTypes(self, t2)
114 114 local bv = t2.getBlockValue(self, t2)
115 115 if not bt[type] then return end -- ignore types we can't block
116   - if rng.percent(chance) and dam > bv/4 and not self:isTalentCoolingDown(t2) and not eff then
  116 + if rng.percent(chance) and dam > bv/3 and not self:isTalentCoolingDown(t2) and not eff then
117 117 self:forceUseTalent(self.T_BLOCK, {ignore_energy=true})
118 118 return {dam=dam}
119 119 end
... ... @@ -124,7 +124,7 @@ newTalent {
124 124 chance = t.getBlockChance(self, t)
125 125 return ([[Control your movements to increase your defenses. This allows you to shrug off minor damage and, if you have a shield equipped, preemptively Block in reaction to incoming damage.
126 126 While this talent is activated, you are globally slowed by %0.1f%% and all damage you take is reduced by a flat %0.1f.
127   - If you have a shield equipped and Block is not on cooldown, any blockable damage that is greater than 25%% of your block value (before resistances) will have a %d%% chance to instantly activate Block.
  127 + If you have a shield equipped and Block is not on cooldown, any blockable damage that is greater than 33%% of your block value (before resistances) will have a %d%% chance to instantly activate Block.
128 128 The flat damage reduction will increase with your defense.]])
129 129 :tformat(slow, reduction, chance)
130 130 end,
... ...
... ... @@ -2763,7 +2763,7 @@ newEffect{
2763 2763 self:attackTargetWith(target, o.combat, nil, t.getWeaponDamage(self, t))
2764 2764 end
2765 2765 end
2766   - if self:getTalentLevelRaw(t) >= 3 and target:canBe("disarm") then
  2766 + if self:getTalentLevel(t) >= 3 and target:canBe("disarm") then
2767 2767 target:setEffect(target.EFF_DISARMED, 3, {apply_power=self:combatMindpower()})
2768 2768 end
2769 2769 end
... ...
... ... @@ -93,7 +93,7 @@ elseif layout == "OVERGROUND" then
93 93 -- Overground
94 94 return {
95 95 name = _t"Rhaloren Camp",
96   - level_range = {1, 5},
  96 + level_range = {1, 7},
97 97 level_scheme = "player",
98 98 max_level = 3,
99 99 decay = {300, 800},
... ...
... ... @@ -105,7 +105,7 @@ else
105 105
106 106 return {
107 107 name = _t"Scintillating Caves",
108   - level_range = {1, 5},
  108 + level_range = {1, 7},
109 109 level_scheme = "player",
110 110 max_level = 3,
111 111 decay = {300, 800},
... ...
... ... @@ -153,7 +153,7 @@ elseif layout == "DEFAULT" then
153 153
154 154 return {
155 155 name = _t"Trollmire",
156   - level_range = {1, 5},
  156 + level_range = {1, 7},
157 157 level_scheme = "player",
158 158 max_level = 3,
159 159 decay = {300, 800},
... ...