Commit abc3b0040a039b11a123ddbac1ed9f5394b08ba0

Authored by DarkGod
2 parents eb2c6120 9a268bb9

Merge branch '3.21.2019Stuff' into 'master'

Misc is miscellaneous

Mostly simple stuff, but a bunch of changes are aimed at tuning Archmage mana balance a bit more since Disruption Shield is changed and after actually looking at the spells the cost efficiency was pretty silly.  Improving these is fine given how many misc nerfs AM is getting.

Manasurge:  Cooldown considerably reduced, stat scaling increased.  This helps keep it as a good reaction to hitting 0 mana, and the numbers were pretty bad in general.  We should really expand this to work on all the resource mana burn targets.

Thunderstorm:  Mana cost removed.  This adds a nontrivial amount of passive damage through mid game for all builds.

Fireflash:  Mana cost reduced, damage increased.

Chain Lightning:  Mana cost reduced, damage increased.

Mudslide:  Mana cost reduced.

Arcane Vortex:  Mana cost reduced, can now crit.

Stoneskin:  Mana cost decreased.

Glacial Vapors:  Fixed 8 duration, can now crit.  This spell is still pretty bad but at least in theory it sometimes has high damage efficiency maybe..?

Disruption Shield:
- Now gives 100 mana on deactivation, this is to keep the talent as a counter to mana drain albeit in a much worse way
- Deactivation threshold is 10% mana from 25% (not needed at all now?)
- Aegis mana bonus improved
- Can now crit

Aether Avatar:
- Now gains the increased mana pool size as mana
- +25% arcane penetration

Antimagic Zone:
- Cooldown increased
- Silence fixed at 3 duration

Mana Clash:  Cooldown increased.


See merge request !527
Showing 52 changed files with 387 additions and 789 deletions
... ... @@ -6875,7 +6875,7 @@ function _M:canSeeNoCache(actor, def, def_pct)
6875 6875 end
6876 6876
6877 6877 -- Blindness means can't see anything
6878   - if self:attr("blind") and not (actor == game.player) then
  6878 + if self:attr("blind") then
6879 6879
6880 6880 return false, 0
6881 6881 end
... ...
... ... @@ -2092,6 +2092,10 @@ function _M:applyRandomClass(b, data, instant)
2092 2092 end
2093 2093 b[#b+1] = resolver
2094 2094 end
  2095 + elseif resolver.__resolver == "auto_equip_filters" then
  2096 + if not data.forbid_equip then
  2097 + b[#b+1] = resolver
  2098 + end
2095 2099 elseif resolver._allow_random_boss then -- explicitly allowed resolver
2096 2100 b[#b+1] = resolver
2097 2101 end
... ...
... ... @@ -76,7 +76,7 @@ newBirthDescriptor{
76 76 -- ["cursed/unyielding"]={true, 0.0},
77 77 ["technique/combat-training"]={true, 0.3},
78 78 ["cunning/survival"]={false, 0.0},
79   - ["cursed/rampage"]={false, 0.0},
  79 + ["cursed/rampage"]={false, 0.3},
80 80 ["cursed/predator"]={true, 0.0},
81 81 ["cursed/fears"]={false, 0.0},
82 82 },
... ... @@ -90,6 +90,17 @@ newBirthDescriptor{
90 90 },
91 91 copy = {
92 92 max_life = 110,
  93 + resolvers.auto_equip_filters{
  94 + MAINHAND = {type="weapon", properties={"twohanded"}},
  95 + OFFHAND = {special=function(e, filter) -- only allow if there is already a weapon in MAINHAND
  96 + local who = filter._equipping_entity
  97 + if who then
  98 + local mh = who:getInven(who.INVEN_MAINHAND) mh = mh and mh[1]
  99 + if mh and (not mh.slot_forbid or not who:slotForbidCheck(e, who.INVEN_MAINHAND)) then return true end
  100 + end
  101 + return false
  102 + end},
  103 + },
93 104 resolvers.equipbirth{ id=true,
94 105 {type="weapon", subtype="battleaxe", name="iron battleaxe", autoreq=true, ego_chance=-1000},
95 106 {type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000}
... ...
... ... @@ -84,14 +84,17 @@ newBirthDescriptor{
84 84 },
85 85 copy = {
86 86 resolvers.auto_equip_filters{
87   - MAINHAND = {type="weapon", special=function(e, filter) -- allow any weapon that doesn't forbid OFFHAND
88   - if e.slot_forbid == "OFFHAND" then
89   - local who = filter._equipping_entity
90   - return who and not who:slotForbidCheck(e, who.INVEN_MAINHAND)
  87 + MAINHAND = {type="weapon", not_properties={"twohanded"}, special=function(e, filter) -- Allow standard 1H strength weapons and 1H staves, not currently working with ogre
  88 + local who = filter._equipping_entity
  89 + if who and e.subtype and (e.subtype == "staff" or e.subtype == "waraxe" or e.subtype == "longsword" or e.subtype == "mace") then return true end
  90 + end},
  91 + OFFHAND = {type="weapon", not_properties={"twohanded"}, special=function(e, filter)
  92 + local who = filter._equipping_entity
  93 + if who then
  94 + local mh = who:getInven(who.INVEN_MAINHAND) mh = mh and mh[1]
  95 + if mh and (not mh.slot_forbid or not who:slotForbidCheck(e, who.INVEN_MAINHAND)) and e.subtype and (e.subtype == "staff" or e.subtype == "waraxe" or e.subtype == "longsword" or e.subtype == "mace") then return true end
91 96 end
92   - return true
93 97 end},
94   - OFFHAND = {type="weapon", not_properties={"twohanded"}}
95 98 },
96 99 resolvers.equipbirth{ id=true,
97 100 {type="weapon", subtype="waraxe", name="iron waraxe", autoreq=true, ego_chance=-1000},
... ...
... ... @@ -100,6 +100,20 @@ newBirthDescriptor{
100 100 },
101 101 copy = {
102 102 max_life = 110,
  103 + resolvers.auto_equip_filters{
  104 + MAINHAND = {type="weapon", special=function(e, filter) -- Allow standard 2H strength weapons
  105 + local who = filter._equipping_entity
  106 + if who and e.subtype and (e.subtype == "battleaxe" or e.subtype == "greatsword" or e.subtype == "greatmaul") then return true end
  107 + end},
  108 + OFFHAND = {special=function(e, filter) -- only allow if there is already a weapon in MAINHAND
  109 + local who = filter._equipping_entity
  110 + if who then
  111 + local mh = who:getInven(who.INVEN_MAINHAND) mh = mh and mh[1]
  112 + if mh and (not mh.slot_forbid or not who:slotForbidCheck(e, who.INVEN_MAINHAND)) then return true end
  113 + end
  114 + return false
  115 + end},
  116 + },
103 117 resolvers.equipbirth{ id=true,
104 118 {type="armor", subtype="cloth", name="linen robe", autoreq=true, ego_chance=-1000},
105 119 {type="weapon", subtype="greatsword", name="iron greatsword", autoreq=true, ego_chance=-1000},
... ... @@ -132,7 +146,6 @@ newBirthDescriptor{
132 146 "#GOLD#Life per level:#LIGHT_BLUE# -4 (*special*)",
133 147 },
134 148 power_source = {psionic=true},
135   --- not_on_random_boss = true,
136 149 random_rarity = 3,
137 150 stats = { str=0, wil=5, cun=4, },
138 151 birth_example_particles = {
... ... @@ -171,6 +184,10 @@ newBirthDescriptor{
171 184 },
172 185 copy = {
173 186 max_life = 90,
  187 + resolvers.auto_equip_filters{
  188 + MAINHAND = {type="weapon", subtype="mindstar"},
  189 + OFFHAND = {type="weapon", subtype="mindstar"},
  190 + },
174 191 resolvers.equipbirth{ id=true,
175 192 {type="armor", subtype="cloth", name="linen robe", autoreq=true, ego_chance=-1000},
176 193 {type="weapon", subtype="mindstar", name="mossy mindstar", autoreq=true, ego_chance=-1000},
... ...
... ... @@ -312,12 +312,22 @@ newBirthDescriptor{
312 312 },
313 313 copy = {
314 314 max_life = 100,
315   --- talent_cd_reduction={[ActorTalents.T_FLAME]=-3, [ActorTalents.T_LIGHTNING]=-3, [ActorTalents.T_EARTHEN_MISSILES]=-3, },
  315 + resolvers.auto_equip_filters{
  316 + MAINHAND = {type="weapon", properties={"twohanded"}},
  317 + OFFHAND = {special=function(e, filter) -- only allow if there is already a weapon in MAINHAND
  318 + local who = filter._equipping_entity
  319 + if who then
  320 + local mh = who:getInven(who.INVEN_MAINHAND) mh = mh and mh[1]
  321 + if mh and (not mh.slot_forbid or not who:slotForbidCheck(e, who.INVEN_MAINHAND)) then return true end
  322 + end
  323 + return false
  324 + end},
  325 + },
316 326 resolvers.equipbirth{ id=true,
317 327 {type="weapon", subtype="greatsword", name="iron greatsword", autoreq=true, ego_chance=-1000, ego_chance=-1000},
318 328 {type="armor", subtype="light", name="rough leather armour", autoreq=true, ego_chance=-1000, ego_chance=-1000},
319 329 },
320   - resolvers.inscription("RUNE:_MANASURGE", {cooldown=25, dur=10, mana=620}),
  330 + resolvers.inscription("RUNE:_MANASURGE", {cooldown=25, dur=10, mana=620}, 3),
321 331 },
322 332 copy_add = {
323 333 life_rating = 2,
... ...
... ... @@ -94,6 +94,10 @@ newBirthDescriptor{
94 94 },
95 95 copy = {
96 96 max_life = 90,
  97 + resolvers.auto_equip_filters{
  98 + MAINHAND = {type="weapon", subtype="mindstar"},
  99 + OFFHAND = {type="weapon", subtype="mindstar"},
  100 + },
97 101 resolvers.equipbirth{ id=true,
98 102 {type="weapon", subtype="mindstar", name="mossy mindstar", autoreq=true, ego_chance=-1000},
99 103 {type="weapon", subtype="mindstar", name="mossy mindstar", autoreq=true, ego_chance=-1000},
... ... @@ -153,6 +157,17 @@ newBirthDescriptor{
153 157 copy = {
154 158 drake_touched = 2,
155 159 max_life = 110,
  160 + resolvers.auto_equip_filters{ -- This could be improved to check learned trees since Wyrmics can use a lot of weapons
  161 + MAINHAND = {type="weapon", properties={"twohanded"}},
  162 + OFFHAND = {special=function(e, filter) -- only allow if there is already a weapon in MAINHAND
  163 + local who = filter._equipping_entity
  164 + if who then
  165 + local mh = who:getInven(who.INVEN_MAINHAND) mh = mh and mh[1]
  166 + if mh and (not mh.slot_forbid or not who:slotForbidCheck(e, who.INVEN_MAINHAND)) then return true end
  167 + end
  168 + return false
  169 + end},
  170 + },
156 171 resolvers.equipbirth{ id=true,
157 172 {type="weapon", subtype="battleaxe", name="iron battleaxe", autoreq=true, ego_chance=-1000},
158 173 {type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000} },
... ...
... ... @@ -21,21 +21,24 @@ local reward = {
21 21 all = {
22 22 ["technique/conditioning"] = true,
23 23 ["cunning/survival"] = true,
  24 + ["wild-gift/harmony"] = true,
24 25 },
25 26 normal = {
26 27 ["spell/divination"] = true,
27 28 ["spell/staff-combat"] = true,
28 29 ["spell/stone-alchemy"] = true,
29 30 ["celestial/chants"] = true,
30   - ["celestial/light"] = true,
31 31 ["chronomancy/chronomancy"] = true,
  32 + ["corruption/curses"] = true,
  33 + ["corruption/vile-life"] = true,
  34 + ["corruption/hexes"] = true,
32 35 },
33 36 antimagic = {
34 37 ["wild-gift/call"] = true,
35 38 ["wild-gift/mindstar-mastery"] = true,
36   - ["technique/mobility"] = true,
37   - ["technique/field-control"] = true,
38 39 ["psionic/dreaming"] = true,
  40 + ["psionic/augmented-mobility"] = true,
  41 + ["psionic/feedback"] = true,
39 42 },
40 43 }
41 44 local function generate_rewards()
... ... @@ -47,10 +50,10 @@ local function generate_rewards()
47 50 local tt_def = game.player:getTalentTypeFrom(tt)
48 51 local cat = tt_def.type:gsub("/.*", "")
49 52 local doit = function(npc, player)
50   - if player:knowTalentType(tt) == nil then player:setTalentTypeMastery(tt, 0.9) end
  53 + if player:knowTalentType(tt) == nil then player:setTalentTypeMastery(tt, 1.0) end
51 54 player:learnTalentType(tt, true)
52 55 end
53   - answers[#answers+1] = {("[%s (at mastery %0.2f)]"):format(cat:capitalize().." / "..tt_def.name:capitalize(), 0.9),
  56 + answers[#answers+1] = {("[%s (at mastery %0.2f)]"):format(cat:capitalize().." / "..tt_def.name:capitalize(), 1.0),
54 57 action=doit,
55 58 on_select=function(npc, player)
56 59 game.tooltip_x, game.tooltip_y = 1, 1
... ...
... ... @@ -101,6 +101,5 @@ newEntity{ base = "BASE_NPC_CAT",
101 101 [Talents.T_RUSH]={base=3, every=8, max=5},
102 102 [Talents.T_LETHALITY]={base=3, every=8, max=5},
103 103 [Talents.T_CRIPPLE]={base=3, every=8, max=5},
104   - [Talents.T_EXPOSE_WEAKNESS]={base=3, every=8, max=5},
105 104 },
106 105 }
... ...
... ... @@ -208,7 +208,6 @@ newEntity{ base = "BASE_NPC_SKELETON",
208 208 [Talents.T_DUAL_WEAPON_MASTERY]={base=1, every=10, max=7},
209 209 [Talents.T_TEMPO]={base=1, every=10, max=7},
210 210 [Talents.T_FLURRY]={base=1, every=10, max=7},
211   - [Talents.T_EXPOSE_WEAKNESS]={base=1, every=10, max=7},
212 211 [Talents.T_LETHALITY]={base=1, every=10, max=7},
213 212 [Talents.T_WEAPON_COMBAT]={base=1, every=10, max=7},
214 213 [Talents.T_KNIFE_MASTERY]={base=1, every=10, max=7},
... ...
... ... @@ -144,7 +144,6 @@ newEntity{ base = "BASE_NPC_THIEF", define_as = "THIEF_ASSASSIN",
144 144 combat_armor = 3, combat_def = 10,
145 145 resolvers.talents{
146 146 [Talents.T_STEALTH]={base=3, every=6, max=7},
147   - [Talents.T_EXPOSE_WEAKNESS]={base=3, every=6, max=7},
148 147 [Talents.T_DUAL_WEAPON_MASTERY]={base=2, every=6, max=6},
149 148 [Talents.T_TEMPO]={base=2, every=6, max=6},
150 149 [Talents.T_DUAL_STRIKE]={base=1, every=6, max=6},
... ...
... ... @@ -21,10 +21,6 @@ local Stats = require "engine.interface.ActorStats"
21 21 local Talents = require "engine.interface.ActorTalents"
22 22 local DamageType = require "engine.DamageType"
23 23
24   ---load("/data/general/objects/egos/charged-attack.lua")
25   ---load("/data/general/objects/egos/charged-defensive.lua")
26   ---load("/data/general/objects/egos/charged-utility.lua")
27   -
28 24 newEntity{
29 25 power_source = {technique=true},
30 26 name = "cruel ", prefix=true, instant_resolve=true,
... ... @@ -97,16 +93,15 @@ newEntity{
97 93 power_source = {arcane=true},
98 94 name = "blighted ", prefix=true, instant_resolve=true,
99 95 keywords = {blight=true},
100   - level_range = {30, 50},
  96 + level_range = {20, 50},
101 97 greater_ego = 1,
102 98 rarity = 30,
103 99 cost = 40,
104 100 wielder = {
105 101 vim_on_crit = resolvers.mbonus_material(5, 1),
106 102 max_vim = resolvers.mbonus_material(30, 10),
107   - melee_project = {
108   - [DamageType.ITEM_BLIGHT_DISEASE] = resolvers.mbonus_material(15, 5),
109   - },
  103 + combat_spellpower = resolvers.mbonus_material(10, 2),
  104 + combat_spellcrit = resolvers.mbonus_material(5, 5),
110 105 },
111 106 }
112 107
... ... @@ -114,31 +109,30 @@ newEntity{
114 109 power_source = {arcane=true},
115 110 name = "ethereal ", prefix=true, instant_resolve=true,
116 111 keywords = {ethereal=true},
117   - level_range = {30, 50},
  112 + level_range = {20, 50},
118 113 greater_ego = 1,
119 114 rarity = 30,
120 115 cost = 40,
121 116 wielder = {
122 117 combat_spellpower = resolvers.mbonus_material(5, 3),
123 118 combat_def = resolvers.mbonus_material(15, 10),
124   - damage_shield_penetrate = resolvers.mbonus_material(40, 10),
125   - melee_project = {
126   - [DamageType.RANDOM_CONFUSION] = resolvers.mbonus_material(8, 4),
127   - },
  119 + damage_shield_penetrate = resolvers.mbonus_material(20, 10),
  120 + shield_factor=resolvers.mbonus_material(15, 5),
128 121 },
129 122 }
130 123
  124 +-- Applies all of a Command Staff subtype instead of just one selected element.. I think
131 125 newEntity{
132 126 power_source = {arcane=true},
133 127 name = "greater ", prefix=true, instant_resolve=true,
134 128 keywords = {greater=true},
135   - level_range = {30, 50},
  129 + level_range = {20, 50},
136 130 greater_ego = 1,
137 131 rarity = 30,
138 132 cost = 45,
139 133 combat = {is_greater = true,},
140 134 wielder = {
141   - combat_spellpower = resolvers.mbonus_material(4, 3),
  135 + combat_spellpower = resolvers.mbonus_material(10, 3),
142 136 },
143 137 resolvers.command_staff(),
144 138 }
... ... @@ -147,7 +141,7 @@ newEntity{
147 141 power_source = {arcane=true},
148 142 name = "void walker's ", prefix=true, instant_resolve=true,
149 143 keywords = {['v. walkers']=true},
150   - level_range = {30, 50},
  144 + level_range = {20, 50},
151 145 greater_ego = 1,
152 146 rarity = 40,
153 147 cost = 30,
... ... @@ -178,6 +172,7 @@ newEntity{
178 172 },
179 173 }
180 174
  175 +-- this ego needs something
181 176 newEntity{
182 177 power_source = {nature=true},
183 178 name = " of illumination", suffix=true, instant_resolve=true,
... ... @@ -188,9 +183,6 @@ newEntity{
188 183 wielder = {
189 184 combat_def = resolvers.mbonus_material(10, 5),
190 185 lite = resolvers.mbonus_material(3, 2),
191   - melee_project = {
192   - [DamageType.ITEM_LIGHT_BLIND] = resolvers.mbonus_material(15, 5),
193   - },
194 186 },
195 187 resolvers.charmt(Talents.T_ILLUMINATE, {1,2}, 6, "T_GLOBAL_CD",
196 188 {no_npc_use = function(self, who) return self:restrictAIUseObject(who) end} -- don't let dumb ai do stupid things with this
... ... @@ -221,82 +213,7 @@ newEntity{
221 213 },
222 214 }
223 215
224   -newEntity{
225   - power_source = {arcane=true},
226   - name = " of projection", suffix=true, instant_resolve=true,
227   - keywords = {projection=true},
228   - level_range = {1, 50},
229   - rarity = 10,
230   - cost = 15,
231   - wielder = {
232   - combat_spellpower = resolvers.mbonus_material(3, 2),
233   - combat_spellcrit = resolvers.mbonus_material(2, 2),
234   - },
235   - resolvers.charm(
236   - function(self, who)
237   - local damtype = engine.DamageType:get(self.combat.element or "ARCANE")
238   - local range = self.use_power.range(self)
239   - local dam = who:damDesc(damtype, self.use_power.damage(self, who))
240   - local damrange = self.use_power.damrange(self, who)
241   - return ("project a bolt elemental energy from the staff (to range %d) dealing %0.2f to %0.2f %s damage"):format(range, dam, dam*damrange, damtype.name)
242   - end,
243   - 5,
244   - function(self, who)
245   - local tg = self.use_power.target(self, who)
246   - local weapon = who:hasStaffWeapon()
247   - if not weapon then
248   - game.logPlayer(who, "You have no appropriate weapon.")
249   - return
250   - end
251   - local combat = weapon.combat
252   - local explosion, particle, trail
253   -
254   - local DamageType = require "engine.DamageType"
255   - local damtype = combat.element or DamageType.ARCANE
256   - if damtype == DamageType.FIRE then explosion = "flame" particle = "bolt_fire" trail = "firetrail"
257   - elseif damtype == DamageType.COLD then explosion = "freeze" particle = "ice_shards" trail = "icetrail"
258   - elseif damtype == DamageType.ACID then explosion = "acid" particle = "bolt_acid" trail = "acidtrail"
259   - elseif damtype == DamageType.LIGHTNING then explosion = "lightning_explosion" particle = "bolt_lightning" trail = "lightningtrail"
260   - elseif damtype == DamageType.LIGHT then explosion = "light" particle = "bolt_light" trail = "lighttrail"
261   - elseif damtype == DamageType.DARKNESS then explosion = "dark" particle = "bolt_dark" trail = "darktrail"
262   - elseif damtype == DamageType.NATURE then explosion = "slime" particle = "bolt_slime" trail = "slimetrail"
263   - elseif damtype == DamageType.BLIGHT then explosion = "slime" particle = "bolt_slime" trail = "slimetrail"
264   - elseif damtype == DamageType.PHYSICAL then explosion = "dark" particle = "stone_shards" trail = "earthtrail"
265   - elseif damtype == DamageType.TEMPORAL then explosion = "light" particle = "temporal_bolt" trail = "lighttrail"
266   - else explosion = "manathrust" particle = "bolt_arcane" trail = "arcanetrail" --damtype = DamageType.ARCANE
267   - end
268   -
269   - local x, y = who:getTarget(tg)
270   - if not x or not y then return nil end
271   -
272   - -- Compute damage
273   - local dam = self.use_power.damage(self, who)
274   - local damrange = self.use_power.damrange(self, who)
275   - local damTyp = DamageType:get(damtype or "ARCANE")
276   - tg.name = damTyp.name .. " bolt"
277   - dam = rng.range(dam, dam * damrange)
278   - dam = who:spellCrit(dam)
279   -
280   - game.logSeen(who, "%s fires a bolt of %s%s#LAST# energy from %s %s!", who.name:capitalize(), damTyp.text_color, damTyp.name, who:his_her(), self:getName({no_add_name = true, do_color = true}))
281   - who:projectile(tg, x, y, damtype, dam, {type=explosion, particle=particle, trail=trail})
282   -
283   - game:playSoundNear(who, "talents/arcane")
284   - return {id=true, used=true}
285   - end,
286   - "T_GLOBAL_CD",
287   - {range = function(self, who) return 5 + self.material_level end,
288   - target = function(self, who) return {type="bolt", range=self.use_power.range(self), speed=20, display = {particle=particle, trail=trail},} end,
289   - requires_target = true,
290   - tactical = { ATTACK = function(who, t, aitarget)
291   - local weapon = who:hasStaffWeapon()
292   - if not weapon or not weapon.combat then return 1 end
293   - return {[weapon.combat.element or "ARCANE"] = 1 + (who.talents["T_STAFF_MASTERY"] or 0)/2.5} -- tactical AI adds staff skill to effective talent level of this ability
294   - end },
295   - damage = function(self, who) return who:combatDamage(self.combat) end,
296   - damrange = function(self, who) return who:combatDamageRange(self.combat) end}
297   - ),
298   -}
299   -
  216 +-- Adds wards for each element on the staff?
300 217 newEntity{
301 218 power_source = {arcane=true},
302 219 name = " of warding", suffix=true, instant_resolve=true,
... ... @@ -317,11 +234,12 @@ newEntity{
317 234 resolvers.command_staff(),
318 235 }
319 236
  237 +-- 50% of all staff elements as resistance penetration
320 238 newEntity{
321 239 power_source = {arcane=true},
322 240 name = " of breaching", suffix=true, instant_resolve=true,
323 241 keywords = {breaching=true},
324   - level_range = {30, 50},
  242 + level_range = {20, 50},
325 243 greater_ego = 1,
326 244 rarity = 30,
327 245 cost = 40,
... ... @@ -335,95 +253,21 @@ newEntity{
335 253
336 254 newEntity{
337 255 power_source = {arcane=true},
338   - name = " of blasting", suffix=true, instant_resolve=true,
339   - keywords = {blasting=true},
340   - level_range = {30, 50},
341   - greater_ego = 1,
342   - rarity = 30,
343   - cost = 40,
344   - wielder = {
345   - combat_spellpower = resolvers.mbonus_material(5, 5),
346   - combat_spellcrit = resolvers.mbonus_material(5, 5),
347   - },
348   - resolvers.charm(
349   - function(self, who)
350   - local damtype = engine.DamageType:get(self.combat.element or "ARCANE")
351   - local radius = self.use_power.radius(self)
352   - local dam = who:damDesc(damtype, self.use_power.damage(self, who))
353   - local damrange = self.use_power.damrange(self, who)
354   - return ("unleash an elemental blastwave, dealing %0.2f to %0.2f %s damage in a radius %d around the user"):format(dam, dam*damrange, damtype.name, radius)
355   - end,
356   - 10,
357   - function(self, who)
358   - local tg = self.use_power.target(self, who)
359   - local weapon = who:hasStaffWeapon()
360   - if not weapon then return end
361   - local combat = weapon.combat
362   - if not combat then return end
363   -
364   - local DamageType = require "engine.DamageType"
365   - local damtype = combat.element or DamageType.ARCANE
366   - local explosion
367   -
368   - if damtype == DamageType.FIRE then explosion = "flame"
369   - elseif damtype == DamageType.COLD then explosion = "freeze"
370   - elseif damtype == DamageType.ACID then explosion = "acid"
371   - elseif damtype == DamageType.LIGHTNING then explosion = "lightning_explosion"
372   - elseif damtype == DamageType.LIGHT then explosion = "light"
373   - elseif damtype == DamageType.DARKNESS then explosion = "dark"
374   - elseif damtype == DamageType.NATURE then explosion = "slime"
375   - elseif damtype == DamageType.BLIGHT then explosion = "slime"
376   - elseif damtype == DamageType.PHYSICAL then explosion = "dark"
377   - elseif damtype == DamageType.TEMPORAL then explosion = "light"
378   - else explosion = "manathrust" -- damtype = DamageType.ARCANE
379   - end
380   -
381   - -- Compute damage
382   - local dam = self.use_power.damage(self, who)
383   - local damrange = self.use_power.damrange(self, who)
384   - local damTyp = DamageType:get(damtype or "ARCANE")
385   - dam = rng.range(dam, dam * damrange)
386   - dam = who:spellCrit(dam)
387   -
388   - game.logSeen(who, "%s unleashes a blastwave of %s%s#LAST# energy from %s %s!", who.name:capitalize(), damTyp.text_color, damTyp.name, who:his_her(), self:getName({no_add_name = true, do_color = true}))
389   - who:project(tg, who.x, who.y, damtype, dam, {type=explosion})
390   -
391   - game:playSoundNear(who, "talents/arcane")
392   - return {id=true, used=true}
393   - end,
394   - "T_GLOBAL_CD",
395   - {range = 0,
396   - radius = function(self, who) return 1 + self.material_level end,
397   - target = function(self, who) return {type="ball", range=self.use_power.range, radius=self.use_power.radius(self, who), selffire=false} end,
398   - requires_target = true,
399   - no_npc_use = function(self, who) return self:restrictAIUseObject(who) end, -- don't let dumb ai blow up friends
400   - tactical = { ATTACKAREA = function(who, t, aitarget)
401   - local weapon = who:hasStaffWeapon()
402   - if not weapon or not weapon.combat then return 1 end
403   - return {[weapon.combat.element or "ARCANE"] = 1 + (who.talents["T_STAFF_MASTERY"] or 0)/2.5} -- tactical AI adds staff skill to effective talent level of this ability
404   - end },
405   - damage = function(self, who) return who:combatDamage(self.combat) end,
406   - damrange = function(self, who) return who:combatDamageRange(self.combat) end}
407   - ),
408   -}
409   -
410   -newEntity{
411   - power_source = {arcane=true},
412 256 name = " of channeling", suffix=true, instant_resolve=true,
413 257 keywords = {channeling=true},
414   - level_range = {30, 50},
  258 + level_range = {20, 50},
415 259 greater_ego = 1,
416 260 rarity = 20,
417 261 cost = 45,
418 262 wielder = {
419 263 combat_spellpower = resolvers.mbonus_material(10, 8),
420   - mana_regen = resolvers.mbonus_material(30, 10, function(e, v) v=v/100 return 0, v end),
  264 + mana_regen = resolvers.mbonus_material(50, 10, function(e, v) v=v/100 return 0, v end),
421 265 },
422   - resolvers.charm("channel mana (increasing mana regeneration by 500%% for ten turns)", 30,
  266 + resolvers.charm("channel mana (increasing mana regeneration by 2000%% for 5 turns)", 30,
423 267 function(self, who)
424 268 if who.mana_regen > 0 and not who:hasEffect(who.EFF_MANASURGE) then
425 269 game.logSeen(who, "%s channels mana through %s %s!", who.name:capitalize(), who:his_her(), self:getName({no_add_name = true, do_color = true}))
426   - who:setEffect(who.EFF_MANASURGE, 10, {power=who.mana_regen * 5})
  270 + who:setEffect(who.EFF_MANASURGE, 5, {power=who.mana_regen * 20})
427 271 else
428 272 if who.mana_regen < 0 then
429 273 game.logPlayer(who, "Your negative mana regeneration rate is unaffected by the staff.")
... ... @@ -444,7 +288,7 @@ newEntity{
444 288 power_source = {arcane=true},
445 289 name = " of greater warding", suffix=true, instant_resolve=true,
446 290 keywords = {['g. warding']=true},
447   - level_range = {30, 50},
  291 + level_range = {20, 50},
448 292 greater_ego = 1,
449 293 rarity = 30,
450 294 cost = 40,
... ... @@ -465,9 +309,9 @@ newEntity{
465 309 power_source = {arcane=true},
466 310 name = " of invocation", suffix=true, instant_resolve=true,
467 311 keywords = {invocation=true},
468   - level_range = {30, 50},
  312 + level_range = {20, 50},
469 313 greater_ego = 1,
470   - rarity = 30,
  314 + rarity = 50,
471 315 cost = 40,
472 316 wielder = {
473 317 combat_spellpower = resolvers.mbonus_material(5, 5),
... ... @@ -535,11 +379,12 @@ newEntity{
535 379 ),
536 380 }
537 381
  382 +-- Adds 50% of each damage element on the staff to resists.. I think
538 383 newEntity{
539 384 power_source = {arcane=true},
540 385 name = " of protection", suffix=true, instant_resolve=true,
541 386 keywords = {protection=true},
542   - level_range = {30, 50},
  387 + level_range = {20, 50},
543 388 greater_ego = 1,
544 389 rarity = 30,
545 390 cost = 40,
... ... @@ -555,7 +400,7 @@ newEntity{
555 400 power_source = {arcane=true},
556 401 name = " of wizardry", suffix=true, instant_resolve=true,
557 402 keywords = {wizardry=true},
558   - level_range = {30, 50},
  403 + level_range = {20, 50},
559 404 greater_ego = 1,
560 405 rarity = 18,
561 406 cost = 45,
... ... @@ -570,7 +415,7 @@ newEntity{
570 415 power_source = {nature=true},
571 416 name = "lifebinding ", prefix=true, instant_resolve=true,
572 417 keywords = {lifebinding=true},
573   - level_range = {30, 50},
  418 + level_range = {20, 50},
574 419 greater_ego = 1,
575 420 rarity = 16,
576 421 cost = 35,
... ... @@ -588,7 +433,7 @@ newEntity{
588 433 power_source = {arcane=true},
589 434 name = "infernal ", prefix=true, instant_resolve=true,
590 435 keywords = {infernal=true},
591   - level_range = {30, 50},
  436 + level_range = {20, 50},
592 437 greater_ego = 1,
593 438 rarity = 16,
594 439 cost = 35,
... ... @@ -606,7 +451,7 @@ newEntity{
606 451 power_source = {arcane=true},
607 452 name = "bloodlich's ", prefix=true, instant_resolve=true,
608 453 keywords = {bloodlich=true},
609   - level_range = {40, 50},
  454 + level_range = {30, 50},
610 455 greater_ego = 1,
611 456 rarity = 40,
612 457 cost = 90,
... ... @@ -628,7 +473,7 @@ newEntity{
628 473 power_source = {arcane=true},
629 474 name = "magelord's ", prefix=true, instant_resolve=true,
630 475 keywords = {magelord=true},
631   - level_range = {30, 50},
  476 + level_range = {20, 50},
632 477 greater_ego = 1,
633 478 rarity = 30,
634 479 cost = 60,
... ... @@ -669,7 +514,7 @@ newEntity{
669 514 slot_forbid = false,
670 515 twohanded = false,
671 516 keywords = {magewarrior=true},
672   - level_range = {30, 50},
  517 + level_range = {20, 50},
673 518 greater_ego = 1,
674 519 rarity = 35,
675 520 cost = 60,
... ... @@ -682,7 +527,6 @@ newEntity{
682 527 combat_spellpower = resolvers.mbonus_material(5, 5),
683 528 combat_physcrit = resolvers.mbonus_material(5, 5),
684 529 combat_spellcrit = resolvers.mbonus_material(2, 2),
685   - combat_critical_power = resolvers.mbonus_material(7, 7),
686 530 },
687 531 resolvers.genericlast(function(e)
688 532 if e.moddable_tile:find("_hand_08_0[1-5]") then
... ... @@ -691,338 +535,16 @@ newEntity{
691 535 end)
692 536 }
693 537
694   -
695   ---[[
696 538 newEntity{
697 539 power_source = {arcane=true},
698   - name = "magma ", prefix=true, instant_resolve=true,
699   - keywords = {magma=true},
700   - level_range = {1, 50},
701   - rarity = 3,
702   - cost = 5,
703   - wielder = {
704   - inc_damage={ [DamageType.FIRE] = resolvers.mbonus_material(25, 8), },
705   - },
706   -}
707   -
708   -newEntity{
709   - power_source = {arcane=true},
710   - name = "temporal ", prefix=true, instant_resolve=true,
711   - keywords = {temporal=true},
712   - level_range = {1, 50},
713   - rarity = 3,
714   - cost = 5,
715   - wielder = {
716   - inc_damage={ [DamageType.TEMPORAL] = resolvers.mbonus_material(25, 8), },
717   - },
718   -}
719   -
720   -newEntity{
721   - power_source = {arcane=true},
722   - name = "icy ", prefix=true, instant_resolve=true,
723   - keywords = {icy=true},
724   - level_range = {1, 50},
725   - rarity = 3,
726   - cost = 5,
727   - wielder = {
728   - inc_damage={ [DamageType.COLD] = resolvers.mbonus_material(25, 8), },
729   - },
730   -}
731   -
732   -newEntity{
733   - power_source = {arcane=true},
734   - name = "acidic ", prefix=true, instant_resolve=true,
735   - keywords = {acidic=true},
736   - level_range = {1, 50},
737   - rarity = 3,
738   - cost = 5,
739   - wielder = {
740   - inc_damage={ [DamageType.ACID] = resolvers.mbonus_material(25, 8), },
741   - },
742   -}
743   -
744   -newEntity{
745   - power_source = {arcane=true},
746   - name = "crackling ", prefix=true, instant_resolve=true,
747   - keywords = {crackling=true},
748   - level_range = {1, 50},
749   - rarity = 3,
750   - cost = 5,
751   - wielder = {
752   - inc_damage={ [DamageType.LIGHTNING] = resolvers.mbonus_material(25, 8), },
753   - },
754   -}
755   -
756   -newEntity{
757   - power_source = {nature=true},
758   - name = "naturalist's ", prefix=true, instant_resolve=true,
759   - keywords = {naturalist=true},
760   - level_range = {1, 50},
761   - rarity = 3,
762   - cost = 5,
763   - wielder = {
764   - inc_damage={ [DamageType.NATURE] = resolvers.mbonus_material(25, 8), },
765   - },
766   -}
767   -
768   -newEntity{
769   - power_source = {nature=true},
770   - name = "sunbathed ", prefix=true, instant_resolve=true,
771   - keywords = {sunbathed=true},
772   - level_range = {1, 50},
773   - rarity = 3,
774   - cost = 5,
775   - wielder = {
776   - inc_damage={ [DamageType.LIGHT] = resolvers.mbonus_material(25, 8), },
777   - },
778   -}
779   -
780   -newEntity{
781   - power_source = {nature=true},
782   - name = "shadow ", prefix=true, instant_resolve=true,
783   - keywords = {shadow=true},
784   - level_range = {1, 50},
785   - rarity = 3,
786   - cost = 5,
787   - wielder = {
788   - inc_damage={ [DamageType.DARKNESS] = resolvers.mbonus_material(25, 8), },
789   - },
790   -}
791   -
792   -newEntity{
793   - power_source = {arcane=true},
794   - name = " of conveyance", suffix=true, instant_resolve=true,
795   - keywords = {conveyance=true},
796   - level_range = {1, 50},
797   - rarity = 10,
798   - cost = 10,
799   - wielder = {
800   - talents_types_mastery = {
801   - ["spell/conveyance"] = resolvers.mbonus_material(1, 1, function(e, v) v=v/10 return 0, v end),
802   - },
803   - },
804   - max_power = 120, power_regen = 1,
805   - use_power = { name = "teleport you anywhere on the level, randomly", power = 70, use = function(self, who)
806   - game.level.map:particleEmitter(who.x, who.y, 1, "teleport")
807   - who:teleportRandom(who.x, who.y, 200)
808   - game.level.map:particleEmitter(who.x, who.y, 1, "teleport")
809   - game.logSeen(who, "%s uses %s!", who.name:capitalize(), self:getName{no_count=true})
810   - return {id=true, used=true}
811   - end}
812   -}
813   -
814   -newEntity{
815   - power_source = {arcane=true},
816   - name = " of blasting", suffix=true, instant_resolve=true,
817   - keywords = {blasting=true},
818   - level_range = {30, 50},
819   - greater_ego = 1,
820   - rarity = 18,
821   - cost = 45,
822   - wielder = {
823   - },
824   - max_power = 15, power_regen = 1,
825   - use_talent = { id = Talents.T_BLASTWAVE, level = 2, power = 10 },
826   -}
827   -
828   -newEntity{
829   - power_source = {nature=true},
830   - name = "lifebinding ", prefix=true, instant_resolve=true,
831   - keywords = {lifebinding=true},
832   - level_range = {30, 50},
833   - greater_ego = 1,
834   - rarity = 16,
835   - cost = 35,
836   - wielder = {
837   - combat_spellpower = resolvers.mbonus_material(7, 3),
838   - life_regen = resolvers.mbonus_material(15, 5, function(e, v) v=v/10 return 0, v end),
839   - healing_factor = resolvers.mbonus_material(20, 10, function(e, v) v=v/100 return 0, v end),
840   - inc_stats = {
841   - [Stats.STAT_CON] = resolvers.mbonus_material(4, 3),
842   - },
843   - },
844   -}
845   -
846   -newEntity{
847   - power_source = {arcane=true},
848   - name = "infernal ", prefix=true, instant_resolve=true,
849   - keywords = {infernal=true},
850   - level_range = {30, 50},
851   - greater_ego = 1,
852   - rarity = 16,
853   - cost = 35,
854   - wielder = {
855   - combat_spellpower = resolvers.mbonus_material(7, 3),
856   - see_invisible = resolvers.mbonus_material(15, 5),
857   - inc_damage = {
858   - [DamageType.FIRE] = resolvers.mbonus_material(20, 5),
859   - [DamageType.BLIGHT] = resolvers.mbonus_material(20, 5),
860   - },
861   - },
862   -}
863   -
864   -newEntity{
865   - power_source = {arcane=true},
866   - name = "chronomancer's ", prefix=true, instant_resolve=true,
867   - keywords = {chronomancer=true},
868   - level_range = {30, 50},
869   - greater_ego = 1,
870   - rarity = 16,
871   - cost = 35,
872   - wielder = {
873   - combat_spellpower = resolvers.mbonus_material(7, 3),
874   - movement_speed = 0.1,
875   - inc_damage = {
876   - [DamageType.TEMPORAL] = resolvers.mbonus_material(20, 5),
877   - },
878   - },
879   -
880   -}
881   -
882   -newEntity{
883   - power_source = {nature=true},
884   - name = "abyssal ", prefix=true, instant_resolve=true,
885   - keywords = {abyssal=true},
886   - level_range = {30, 50},
887   - greater_ego = 1,
888   - rarity = 40,
889   - cost = 80,
890   - wielder = {
891   - inc_damage = {
892   - [DamageType.COLD] = resolvers.mbonus_material(25, 5),
893   - [DamageType.DARKNESS] = resolvers.mbonus_material(25, 5),
894   - },
895   - resists_pen = {
896   - [DamageType.COLD] = resolvers.mbonus_material(15, 5),
897   - [DamageType.DARKNESS] = resolvers.mbonus_material(15, 5),
898   - },
899   - },
900   -}
901   -
902   -newEntity{
903   - power_source = {arcane=true},
904   - name = "magelord's ", prefix=true, instant_resolve=true,
905   - keywords = {magelord=true},
906   - level_range = {10, 50},
907   - greater_ego = 1,
908   - rarity = 40,
909   - cost = 60,
910   - wielder = {
911   - max_mana = resolvers.mbonus_material(100, 20),
912   - combat_spellpower = resolvers.mbonus_material(20, 5),
913   - },
914   -}
915   -
916   -newEntity{
917   - power_source = {arcane=true},
918   - name = "polar ", prefix=true, instant_resolve=true,
919   - keywords = {polar=true},
920   - level_range = {10, 50},
921   - greater_ego = 1,
922   - rarity = 15,
923   - cost = 30,
924   - wielder = {
925   - combat_spellpower = resolvers.mbonus_material(12, 3),
926   - inc_damage = {
927   - [DamageType.COLD] = resolvers.mbonus_material(15, 5),
928   - },
929   - on_melee_hit = {
930   - [DamageType.ICE] = resolvers.mbonus_material(10, 5),
931   - },
932   - },
933   -}
934   -
935   -newEntity{
936   - power_source = {arcane=true},
937   - name = "bloodlich's ", prefix=true, instant_resolve=true,
938   - keywords = {bloodlich=true},
  540 + name = " of the prodigy", suffix=true, instant_resolve=true,
  541 + keywords = {prodigy=true},
939 542 level_range = {40, 50},
940 543 greater_ego = 1,
941   - rarity = 40,
942   - cost = 90,
943   - wielder = {
944   - inc_stats = {
945   - [Stats.STAT_MAG] = resolvers.mbonus_material(9, 1),
946   - },
947   - inc_damage = {
948   - [DamageType.ACID] = resolvers.mbonus_material(10, 5),
949   - [DamageType.LIGHTNING] = resolvers.mbonus_material(10, 5),
950   - [DamageType.FIRE] = resolvers.mbonus_material(10, 5),
951   - [DamageType.COLD] = resolvers.mbonus_material(10, 5),
952   - },
953   - },
954   -}
955   -
956   -newEntity{
957   - power_source = {arcane=true},
958   - name = " of conflagration", suffix=true, instant_resolve=true,
959   - keywords = {conflagration=true},
960   - level_range = {30, 50},
961   - greater_ego = 1,
962   - rarity = 30,
963   - cost = 60,
964   - wielder = {
965   - mana_regen = resolvers.mbonus_material(50, 10, function(e, v) v=v/100 return 0, -v end),
966   - },
967   -}
968   -
969   -newEntity{
970   - power_source = {arcane=true},
971   - name = " of lightning", suffix=true, instant_resolve=true,
972   - keywords = {lightning=true},
973   - level_range = {30, 50},
974   - greater_ego = 1,
975   - rarity = 30,
976   - cost = 60,
977   - max_power = 30, power_regen = 1,
978   - use_talent = { id = Talents.T_CHAIN_LIGHTNING, level = 3, power = 20 },
979   - wielder = {
980   -
981   - },
982   -}
983   -
984   -newEntity{
985   - power_source = {arcane=true},
986   - name = " of the stars", suffix=true, instant_resolve=true,
987   - keywords = {stars=true},
988   - level_range = {1, 50},
989   - greater_ego = 1,
990   - rarity = 15,
991   - cost = 30,
992   - max_power = 30, power_regen = 1,
993   - use_talent = { id = Talents.T_STARFALL, level = 2, power = 20 },
994   - wielder = {
995   - combat_spellpower = resolvers.mbonus_material(12, 3),
996   - },
997   -}
998   -
999   -newEntity{
1000   - power_source = {arcane=true},
1001   - name = " of ruination", suffix=true, instant_resolve=true,
1002   - keywords = {ruination=true},
1003   - level_range = {1, 50},
1004   - greater_ego = 1,
1005   - rarity = 15,
1006   - cost = 30,
1007   - max_power = 40, power_regen = 1,
1008   - use_talent = { id = Talents.T_CORRUPTED_NEGATION, level = 2, power = 30 },
1009   - wielder = {
1010   - },
1011   -}
1012   -
1013   -
1014   -newEntity{
1015   - power_source = {arcane=true},
1016   - name = " of divination", suffix=true, instant_resolve=true,
1017   - keywords = {divination=true},
1018   - level_range = {1, 50},
1019   - rarity = 8,
1020   - cost = 8,
  544 + rarity = 80,
  545 + cost = 45,
1021 546 wielder = {
1022   - talents_types_mastery = {
1023   - ["spell/divination"] = resolvers.mbonus_material(1, 1, function(e, v) v=v/10 return 0, v end),
1024   - },
  547 + spellsurge_on_crit = resolvers.mbonus_material(5, 5),
  548 + inc_stats = { [Stats.STAT_MAG] = resolvers.mbonus_material(15, 5), [Stats.STAT_WIL] = resolvers.mbonus_material(15, 5), [Stats.STAT_CUN] = resolvers.mbonus_material(15, 5) },
1025 549 },
1026   -}
1027   -
1028   -]]
  550 +}
\ No newline at end of file
... ...
... ... @@ -78,7 +78,7 @@ newEntity{
78 78 local tg = self.use_power.target(self, who)
79 79 local x, y = who:getTarget(tg)
80 80 if not x or not y then return nil end
81   - local dam = {dam = who:mindCrit(self.use_power.damage(self, who)), heal_factor = 0.5, dur = 7}
  81 + local dam = {dam = who:mindCrit(self.use_power.damage(self, who)), heal_factor = 50, dur = 7}
82 82 game.logSeen(who, "%s activates %s %s!", who.name:capitalize(), who:his_her(), self:getName({no_add_name = true, do_color = true}))
83 83 who:project(tg, x, y, engine.DamageType.INSIDIOUS_POISON, dam, {type="slime"})
84 84 return {id=true, used=true}
... ...
... ... @@ -137,7 +137,7 @@ newEntity{
137 137 charm_power_def = {add=100, max=800, floor=true},
138 138 resolvers.charm(
139 139 function(self, who)
140   - local shield = self.use_power.shield(self, who)
  140 + local shield = self.use_power.shield(self, who) * (100 + (who:attr("shield_factor") or 0)) / 100
141 141 return ("create a shield absorbing up to %d damage on yourself and all friendly characters within 10 spaces for %d turns"):
142 142 format(shield, 4) end,
143 143 20,
... ...
... ... @@ -136,15 +136,7 @@ newEntity{ theme={physical=true}, name="stamina regeneration", points = 1, rarit
136 136 newEntity{ theme={physical=true}, name="increased stamina", points = 1, rarity = 14, level_range = {1, 50},
137 137 wielder = { max_stamina = resolvers.randartmax(5, 50), },
138 138 }
139   -newEntity{ theme={physical=true, defense=true}, name="life regeneration", points = 1, rarity = 11, level_range = {1, 50},
140   - wielder = { life_regen = resolvers.randartmax(2, 4), },
141   -}
142   -newEntity{ theme={physical=true, defense=true}, name="increased life", points = 1, rarity = 11, level_range = {1, 50},
143   - wielder = { max_life = resolvers.randartmax(20, 100), },
144   -}
145   -newEntity{ theme={physical=true, defense=true}, name="improve heal", points = 1, rarity = 15, level_range = {1, 50},
146   - wielder = { healing_factor = resolvers.randartmax(0.05, .2), },
147   -}
  139 +
148 140 ----------------------------------------------------------------
149 141 -- Misc
150 142 ----------------------------------------------------------------
... ... @@ -164,6 +156,15 @@ newEntity{ theme={defense=true, physical=true}, name="def", points = 1, rarity =
164 156 newEntity{ theme={defense=true, physical=true}, name="armor", points = 1, rarity = 10, level_range = {1, 50},
165 157 wielder = { combat_armor = resolvers.randartmax(2, 8), },
166 158 }
  159 +newEntity{ theme={defense=true}, name="life regeneration", points = 1, rarity = 11, level_range = {1, 50},
  160 + wielder = { life_regen = resolvers.randartmax(2, 4), },
  161 +}
  162 +newEntity{ theme={defense=true}, name="increased life", points = 1, rarity = 11, level_range = {1, 50},
  163 + wielder = { max_life = resolvers.randartmax(20, 100), },
  164 +}
  165 +newEntity{ theme={defense=true}, name="improve heal", points = 1, rarity = 15, level_range = {1, 50},
  166 + wielder = { healing_factor = resolvers.randartmax(0.05, .2), },
  167 +}
167 168 ----------------------------------------------------------------
168 169 -- Saves
169 170 ----------------------------------------------------------------
... ... @@ -178,7 +179,7 @@ newEntity{ theme={defense=true, mental=true}, name="save mental", points = 1, ra
178 179 }
179 180 --------------------------------------------------------------
180 181 -- Immunities
181   ---------------------------------------------------------------
  182 +------------------------- -------------------------------------
182 183 newEntity{ theme={defense=true}, name="immune stun", points = 2, rarity = 25, level_range = {1, 50},
183 184 wielder = { stun_immune = resolvers.randartmax(0.1, 0.2), },
184 185 }
... ...
... ... @@ -295,10 +295,10 @@ newEntity{ base = "BASE_RUNE",
295 295
296 296 inscription_kind = "utility",
297 297 inscription_data = {
298   - cooldown = resolvers.rngrange(20, 30),
  298 + cooldown = resolvers.rngrange(15, 20),
299 299 dur = 10,
300 300 mana = resolvers.mbonus_level(1200, 600, function(e, v) return v * 0.003 end),
301   - use_stat_mod = 4,
  301 + use_stat_mod = 6,
302 302 },
303 303 inscription_talent = "RUNE:_MANASURGE",
304 304 }
... ...
... ... @@ -569,7 +569,7 @@ Finally The Scorpion was defeated by the alchemist Nessylia, who went to face th
569 569 physspeed = 0.15,
570 570 dammod = {dex=0.4, str=-0.6, cun=0.4,},
571 571 damrange = 0.3,
572   - talent_on_hit = { T_BITE_POISON = {level=3, chance=20}, T_PERFECT_CONTROL = {level=1, chance=5}, T_QUICK_AS_THOUGHT = {level=3, chance=5}, T_IMPLODE = {level=1, chance=5} },
  572 + talent_on_hit = { T_BITE_POISON = {level=3, chance=20}, T_QUICK_AS_THOUGHT = {level=3, chance=10}, T_IMPLODE = {level=1, chance=5} },
573 573 },
574 574 },
575 575 max_power = 24, power_regen = 1,
... ... @@ -862,7 +862,7 @@ newEntity{ base = "BASE_LEATHER_BELT",
862 862 use_power = {
863 863 name = function(self, who) return ("surround yourself with a magical shield (strength %d, based on Magic) for 10 turns"):format(self.use_power.shield(self, who)) end,
864 864 power = 20,
865   - shield = function(self, who) return 100 + who:getMag(250) end,
  865 + shield = function(self, who) return 100 + who:getMag(250) * (100 + (who:attr("shield_factor") or 0)) / 100 end,
866 866 use = function(self, who)
867 867 game.logSeen(who, "%s invokes the memory of Neira!", who.name:capitalize())
868 868 who:setEffect(who.EFF_DAMAGE_SHIELD, 10, {power=self.use_power.shield(self, who)})
... ... @@ -1103,7 +1103,7 @@ newEntity{ base = "BASE_AMULET", --Thanks Grayswandir!
1103 1103 },
1104 1104 max_power = 24, power_regen = 1,
1105 1105 use_power = {
1106   - name = function(self, who) return ("create a reflective shield (50%% reflection rate, %d strength, based on Magic) for 5 turns"):format(self.use_power.shield(self, who)) end,
  1106 + name = function(self, who) return ("create a reflective shield (50%% reflection rate, %d strength, based on Magic) for 5 turns"):format(self.use_power.shield(self, who) * (100 + (who:attr("shield_factor") or 0)) / 100) end,
1107 1107 power = 24,
1108 1108 shield = function(self, who) return 150 + 2*who:getMag(100) end,
1109 1109 use = function(self, who)
... ... @@ -1170,7 +1170,6 @@ newEntity{ base = "BASE_KNIFE", -- Thanks Grayswandir!
1170 1170 },
1171 1171 }
1172 1172
1173   --- Fix me
1174 1173 newEntity{ base = "BASE_KNIFE", --Razakai's idea, slightly modified
1175 1174 power_source = {psionic=true},
1176 1175 unique = true,
... ... @@ -1189,9 +1188,10 @@ newEntity{ base = "BASE_KNIFE", --Razakai's idea, slightly modified
1189 1188 apr = 9,
1190 1189 physcrit = 15,
1191 1190 dammod = {str=0.45, dex=0.55},
1192   - special_on_hit = {desc="deals physical damage equal to 3% of the target's missing health", fct=function(combat, who, target)
  1191 + special_on_hit = {desc="deals 60 physical damage increased by 1% for each 1% life the target has lost", fct=function(combat, who, target)
1193 1192 local tg = {type="ball", range=10, radius=0, selffire=false}
1194   - who:project(tg, target.x, target.y, engine.DamageType.PHYSICAL, (target.max_life - target.life)*0.03)
  1193 + local bonus = 1 + (1 - target.life / target.max_life)
  1194 + who:project(tg, target.x, target.y, engine.DamageType.PHYSICAL, 60*bonus)
1195 1195 end},
1196 1196 },
1197 1197 wielder = {
... ...
... ... @@ -1139,7 +1139,7 @@ newEntity{ base = "BASE_GAUNTLETS",
1139 1139 physspeed = 0.2,
1140 1140 dammod = {dex=0.4, str=-0.6, cun=0.4 },
1141 1141 melee_project={[DamageType.ARCANE] = 20},
1142   - talent_on_hit = { T_GREATER_WEAPON_FOCUS = {level=1, chance=10}, T_DISPLACEMENT_SHIELD = {level=1, chance=10} },
  1142 + talent_on_hit = { T_DISPLACEMENT_SHIELD = {level=4, chance=10} },
1143 1143 damrange = 0.3,
1144 1144 },
1145 1145 },
... ... @@ -3608,7 +3608,7 @@ newEntity{ base = "BASE_GAUNTLETS",
3608 3608 name = "Spellhunt Remnants", color = colors.GREY, image = "object/artifact/spellhunt_remnants.png",
3609 3609 unided_name = "heavily corroded voratun gauntlets",
3610 3610 desc = [[These once brilliant voratun gauntlets have fallen into a deep decay. Originally used in the spellhunt, they were often used to destroy arcane artifacts, curing the world of their influence.]],
3611   - special_desc = function(self) return "Drains arcane resources while worn." end,
  3611 + special_desc = function(self) return "Can't be worn by those with arcane powers." end,
3612 3612 -- material_level = 1, --Special: this artifact can appear anywhere and adjusts its material level to the zone
3613 3613 level_range = {1, nil},
3614 3614 rarity = 550, -- Extra rare to make it not ALWAYS appear.
... ... @@ -3620,31 +3620,25 @@ newEntity{ base = "BASE_GAUNTLETS",
3620 3620 self.power_up(self, nil, mat_level)
3621 3621 end
3622 3622 end,
3623   - on_wear = function(self, who)
  3623 + on_canwear = function(self, who)
3624 3624 if who:attr("has_arcane_knowledge") then
3625   - game.logPlayer(who, "#ORCHID#The %s begin draining your arcane resources as they are worn!", self:getName({do_color=true}))
  3625 + game.logPlayer(who, "#ORCHID#Your arcane equipment or powers conflict with the gauntlets!#LAST#", self:getName({do_color=true}))
  3626 + return true
3626 3627 end
3627 3628 end,
3628 3629 on_preaddobject = function(self, who, inven) -- generated in an actor's inventory
3629 3630 if not self.material_level then self.addedToLevel(self, game.level) end
3630 3631 end,
3631   - cost = 1000,
3632   - callbackOnAct = function(self, who) -- Burn the wearer's arcane resources while worn
3633   - if who:attr("has_arcane_knowledge") then
3634   - local burn = who:burnArcaneResources(self.material_level*2)
3635   - if burn > 0 then
3636   - game.logSeen(who, "#ORCHID#%s's %s drain %s magic!", who.name:capitalize(), self:getName({do_color=true}), who:his_her())
3637   - who:restStop("Antimagic Drain")
3638   - who:runStop("Antimagic Drain")
3639   - end
3640   - end
3641   - end,
3642 3632 wielder = {
3643 3633 combat_mindpower=4,
3644   - combat_mindcrit=1,
  3634 + combat_mindcrit=3,
3645 3635 combat_spellresist=4,
3646 3636 combat_def=1,
3647 3637 combat_armor=2,
  3638 + inc_stats = { [Stats.STAT_CUN] = 2, [Stats.STAT_WIL] = 2, },
  3639 + inc_damage = { [DamageType.NATURE] = 5 },
  3640 + resists_pen = { [DamageType.NATURE] = 5 },
  3641 + max_life = 20,
3648 3642 combat = {
3649 3643 dam = 12,
3650 3644 apr = 4,
... ... @@ -3653,7 +3647,7 @@ newEntity{ base = "BASE_GAUNTLETS",
3653 3647 dammod = {dex=0.4, str=-0.6, cun=0.4,},
3654 3648 damrange = 0.3,
3655 3649 melee_project={[DamageType.RANDOM_SILENCE] = 10},
3656   - talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=1, chance=100} },
  3650 + talent_on_hit = { },
3657 3651 },
3658 3652 },
3659 3653 power_up= function(self, who, level)
... ... @@ -3670,10 +3664,14 @@ newEntity{ base = "BASE_GAUNTLETS",
3670 3664 self.desc = [[These once brilliant voratun gauntlets appear heavily decayed. Originally used in the spellhunt, they were often used to destroy arcane artifacts, ridding the world of their influence.]]
3671 3665 self.wielder={
3672 3666 combat_mindpower=6,
3673   - combat_mindcrit=2,
  3667 + combat_mindcrit=6,
3674 3668 combat_spellresist=6,
3675 3669 combat_def=2,
3676 3670 combat_armor=3,
  3671 + inc_stats = { [Stats.STAT_CUN] = 4, [Stats.STAT_WIL] = 4, },
  3672 + inc_damage = { [DamageType.NATURE] = 10 },
  3673 + resists_pen = { [DamageType.NATURE] = 10 },
  3674 + max_life = 40,
3677 3675 combat = {
3678 3676 dam = 17,
3679 3677 apr = 8,
... ... @@ -3682,7 +3680,7 @@ newEntity{ base = "BASE_GAUNTLETS",
3682 3680 dammod = {dex=0.4, str=-0.6, cun=0.4,},
3683 3681 damrange = 0.3,
3684 3682 melee_project={[DamageType.RANDOM_SILENCE] = 12},
3685   - talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=2, chance=100} },
  3683 + talent_on_hit = { },
3686 3684 },
3687 3685 }
3688 3686 elseif level == 3 then -- LEVEL 3
... ... @@ -3690,10 +3688,14 @@ newEntity{ base = "BASE_GAUNTLETS",
3690 3688 self.desc = [[These voratun gauntlets appear to have suffered considerable damage. Originally used in the spellhunt, they were often used to destroy arcane artifacts, ridding the world of their influence.]]
3691 3689 self.wielder={
3692 3690 combat_mindpower=8,
3693   - combat_mindcrit=3,
  3691 + combat_mindcrit=9,
3694 3692 combat_spellresist=8,
3695 3693 combat_def=3,
3696 3694 combat_armor=4,
  3695 + inc_stats = { [Stats.STAT_CUN] = 6, [Stats.STAT_WIL] = 6, },
  3696 + inc_damage = { [DamageType.NATURE] = 15 },
  3697 + resists_pen = { [DamageType.NATURE] = 15 },
  3698 + max_life = 60,
3697 3699 combat = {
3698 3700 dam = 22,
3699 3701 apr = 12,
... ... @@ -3702,7 +3704,7 @@ newEntity{ base = "BASE_GAUNTLETS",
3702 3704 dammod = {dex=0.4, str=-0.6, cun=0.4,},
3703 3705 damrange = 0.3,
3704 3706 melee_project={[DamageType.RANDOM_SILENCE] = 15, [DamageType.ITEM_ANTIMAGIC_MANABURN] = 20,},
3705   - talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=3, chance=100}, [Talents.T_MANA_CLASH] = {level=1, chance=5} },
  3707 + talent_on_hit = { [Talents.T_MANA_CLASH] = {level=1, chance=5} },
3706 3708 },
3707 3709 }
3708 3710 elseif level == 4 then -- LEVEL 4
... ... @@ -3710,10 +3712,14 @@ newEntity{ base = "BASE_GAUNTLETS",
3710 3712 self.desc = [[These voratun gauntlets shine brightly beneath a thin layer of wear. Originally used in the spellhunt, they were often used to destroy arcane artifacts, ridding the world of their influence.]]
3711 3713 self.wielder={
3712 3714 combat_mindpower=10,
3713   - combat_mindcrit=4,
  3715 + combat_mindcrit=12,
3714 3716 combat_spellresist=10,
3715 3717 combat_def=4,
3716 3718 combat_armor=5,
  3719 + inc_stats = { [Stats.STAT_CUN] = 8, [Stats.STAT_WIL] = 8, },
  3720 + inc_damage = { [DamageType.NATURE] = 20 },
  3721 + resists_pen = { [DamageType.NATURE] = 20 },
  3722 + max_life = 80,
3717 3723 combat = {
3718 3724 dam = 27,
3719 3725 apr = 15,
... ... @@ -3722,7 +3728,7 @@ newEntity{ base = "BASE_GAUNTLETS",
3722 3728 dammod = {dex=0.4, str=-0.6, cun=0.4,},
3723 3729 damrange = 0.3,
3724 3730 melee_project={[DamageType.RANDOM_SILENCE] = 17, [DamageType.ITEM_ANTIMAGIC_MANABURN] = 35,},
3725   - talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=4, chance=100},