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}, | ... | ... |
... | ... | @@ -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}, | ... | ... |
... | ... | @@ -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 | ... | ... |
-
Please register or login to post a comment