diff --git a/game/modules/tome/data/general/objects/brotherhood-artifacts.lua b/game/modules/tome/data/general/objects/brotherhood-artifacts.lua index e1effb370a3140893475229bf12cde6b1dd114e3..5ae99007c4543caf79cb217c3f04bdd6d8731f79 100644 --- a/game/modules/tome/data/general/objects/brotherhood-artifacts.lua +++ b/game/modules/tome/data/general/objects/brotherhood-artifacts.lua @@ -296,7 +296,7 @@ newEntity{ base = "BASE_INFUSION", inscription_kind = "utility", inscription_data = { cooldown = 15, - dur = 5, + dur = 10, -- to 10 from 5, because this should be really good armor = 50, hard = 30, }, diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua index f83442de71cac410bed5355a24ac6185aa035592..fe39eb3c8943c4d32922828665b4b0e7d5211b22 100644 --- a/game/modules/tome/data/general/objects/world-artifacts.lua +++ b/game/modules/tome/data/general/objects/world-artifacts.lua @@ -26,8 +26,63 @@ for def, e in pairs(game.state:getWorldArtifacts()) do print("Importing "..e.name.." into world artifacts") end - -- This file describes artifacts not bound to a special location, they can be found anywhere + +newEntity{ base = "BASE_GEM", + power_source = {arcane=true}, + unique = true, + unided_name = "windy gem", + name = "Windborne Azurite", subtype = "blue", + color = colors.BLUE, image = "object/sapphire.png", + level_range = {18, 40}, + desc = [[Air currents swirl around this bright blue jewel.]], + rarity = 240, + cost = 200, + identified = false, + material_level = 4, + wielder = { + inc_stats = {[Stats.STAT_DEX] = 10, [Stats.STAT_CUN] = 10 }, + inc_damage = {[DamageType.LIGHTNING] = 20 }, + cancel_damage_chance = 10, -- add to tooltip + damage_affinity={ + [DamageType.LIGHTNING] = 20, + }, + movement_speed = 0.2, + }, + imbue_powers = { + inc_stats = {[Stats.STAT_DEX] = 10, [Stats.STAT_CUN] = 10 }, + inc_damage = {[DamageType.LIGHTNING] = 20 }, + cancel_damage_chance = 10, -- add to tooltip + damage_affinity={ + [DamageType.LIGHTNING] = 20, + }, + movement_speed = 0.2, + }, + +} + +-- Low base values because you can stack affinity and resist +-- The 3rd type is pretty meaningless balance-wise. Magic debuffs hardly matter. The real advantage is the affinity. +newEntity{ base = "BASE_INFUSION", + name = "Primal Infusion", unique=true, image = "object/artifact/tree_of_life.png", + desc = [[This wild infusion has evolved.]], + unided_name = "pulsing infusion", + level_range = {15, 40}, + rarity = 300, + cost = 300, + material_level = 3, + + inscription_kind = "protect", + inscription_data = { + cooldown = 20, + dur = 6, + power = 10, + use_stat_mod = 0.1, + what = {physical=true, mental=true, magical=true}, + }, + inscription_talent = "INFUSION:_PRIMAL", +} + newEntity{ base = "BASE_STAFF", power_source = {arcane=true}, unique = true, @@ -5920,11 +5975,10 @@ newEntity{ base = "BASE_SHIELD", end, } --- Disrupt the backline by attacking the frontline --- Effect works better fighting in the open --- Damage stats are pretty bad, not entirely sure they need to be --- Arcane if necessary, ideally nature scaling off dex. Dex is thematic with wind. --- Aesthetic Themes: Blue, windy, lightning, storm, speed +-- No longer hits your own projectiles +-- Hopefully fixed LUA errors with DamageType require +-- Significant rescaling. Base damage cut by 50%, crit by 5%. The reason these hilariously bad numbers happened was derping and not accounting for the awesomeness of the 100% dex scaling. APR is still extremely high. +-- Proc chance is now 100% up from 25%. No matter how I test this--even at 100% and 500% global action speed--it is often a pain in the ass to get procs just to test. This is supposed to be one of the main features of the item. newEntity{ base = "BASE_KNIFE", --Shibari's #1 power_source = {nature=true}, unique = true, @@ -5938,24 +5992,31 @@ newEntity{ base = "BASE_KNIFE", --Shibari's #1 color=colors.BLUE, require = { stat = { dex=30}}, combat = { - dam = 30, + dam = 15, apr = 20, - physcrit = 18, + physcrit = 10, dammod = {dex=1}, - special_on_hit = {desc="25% chance for lightning to strike and destroy any projectiles in a radius of 10, dealing damage and stunning enemies around the projectile.", on_kill=1, fct=function(combat, who, target) - if not rng.percent(25) then return end + special_on_hit = {desc="Causes lightning to strike and destroy any projectiles in a radius of 10 dealing damage and dazing enemies in a radius of 5 around it.", on_kill=1, fct=function(combat, who, target) local grids = core.fov.circle_grids(who.x, who.y, 10, true) for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do local i = 0 local p = game.level.map(x, y, engine.Map.PROJECTILE+i) - while p do + while p do + local DamageType = require "engine.DamageType" -- I don't entirely follow why this is necessary + if p.src and (p.src == who) then return end -- Keep Arcane Blade procs from hitting them since the projectile is still on top of them. + if p.name then + game.logPlayer(who, "#GREEN#Lightning strikes the " .. p.name .. "!") + else + game.logPlayer(who, "#GREEN#Shantiz strikes down a projectile!") + end + p:terminate(x, y) game.level:removeEntity(p, true) p.dead = true - game.level.map:particleEmitter(x, y, 5, "ball_lightning_beam", {radius=5, tx=x, ty=y}) -- I'm terrible with graphical stuff but I thought I'd at least try? + game.level.map:particleEmitter(x, y, 5, "ball_lightning_beam", {radius=5, tx=x, ty=y}) local tg = {type="ball", radius=5, selffire=false} - local dam = who:mindCrit(30+(2*who:getDex())) -- generous because of the bad damage type, spell or phys crit would both be fine + local dam = 4*who:getDex() -- no more crit or base damage. no real reason, just like it better. who:project(tg, x, y, DamageType.LIGHTNING, dam) @@ -5973,9 +6034,9 @@ newEntity{ base = "BASE_KNIFE", --Shibari's #1 }, }, wielder = { - inc_stats = { [Stats.STAT_DEX] = 12 }, - slow_projectiles = 40, -- synergy with proc - quick_weapon_swap = 1, -- thematic, also makes this more useful when caught in the open. In general I like this mechanic and would like to see more of it. + inc_stats = { [Stats.STAT_DEX] = 20 }, + slow_projectiles = 40, + quick_weapon_swap = 1, }, } --[=[ diff --git a/game/modules/tome/data/talents/misc/inscriptions.lua b/game/modules/tome/data/talents/misc/inscriptions.lua index 1c78b82d302b78b791ce675d0c583a79e8e4069c..d4f4874c9075684685108370140e74183ecc26ad 100644 --- a/game/modules/tome/data/talents/misc/inscriptions.lua +++ b/game/modules/tome/data/talents/misc/inscriptions.lua @@ -184,6 +184,80 @@ newInscription{ end, } +-- fixedart wild variant +newInscription{ + name = "Infusion: Primal", image = "talents/infusion__wild.png", + type = {"inscriptions/infusions", 1}, + points = 1, + no_energy = true, + tactical = { + DEFEND = 3, + CURE = function(self, t, target) + local nb = 0 + local data = self:getInscriptionData(t.short_name) + for eff_id, p in pairs(self.tmp) do + local e = self.tempeffect_def[eff_id] + if data.what[e.type] and e.status == "detrimental" then + nb = nb + 1 + end + end + return nb + end + }, + action = function(self, t) + local data = self:getInscriptionData(t.short_name) + + local target = self + local effs = {} + local force = {} + local known = false + + -- Go through all temporary effects + for eff_id, p in pairs(target.tmp) do + local e = target.tempeffect_def[eff_id] + if data.what[e.type] and e.status == "detrimental" and e.subtype["cross tier"] then + force[#force+1] = {"effect", eff_id} + elseif data.what[e.type] and e.status == "detrimental" then + effs[#effs+1] = {"effect", eff_id} + end + end + + -- Cross tier effects are always removed and not part of the random game, otherwise it is a huge nerf to wild infusion + for i = 1, #force do + local eff = force[i] + if eff[1] == "effect" then + target:removeEffect(eff[2]) + known = true + end + end + + for i = 1, 1 do + if #effs == 0 then break end + local eff = rng.tableRemove(effs) + + if eff[1] == "effect" then + target:removeEffect(eff[2]) + known = true + end + end + if known then + game.logSeen(self, "%s is cured!", self.name:capitalize()) + end + self:setEffect(self.EFF_PRIMAL_ATTUNEMENT, data.dur, {power=data.power + data.inc_stat}) + return true + end, + info = function(self, t) + local data = self:getInscriptionData(t.short_name) + local what = table.concat(table.keys(data.what), ", ") + return ([[Activate the infusion to cure yourself of %s effects and increase affinity for all damage by %d%% for %d turns.]]):format(what, data.power+data.inc_stat, data.dur) + end, + short_info = function(self, t) + local data = self:getInscriptionData(t.short_name) + local what = table.concat(table.keys(data.what), ", ") + return ([[affinity %d%%; cure %s]]):format(data.power + data.inc_stat, what) + end, +} + newInscription{ name = "Infusion: Movement", type = {"inscriptions/infusions", 1}, @@ -210,6 +284,8 @@ newInscription{ end, } + + newInscription{ name = "Infusion: Sun", type = {"inscriptions/infusions", 1}, @@ -306,6 +382,7 @@ newInscription{ end, } +-- Opportunity cost for this is HUGE, it should not hit friendly, also buffed duration newInscription{ name = "Infusion: Wild Growth", type = {"inscriptions/infusions", 1}, @@ -315,7 +392,7 @@ newInscription{ radius = 5, direct_hit = true, target = function(self, t) - return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t} + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, friendlyfire = false, talent=t} end, getDamage = function(self, t) return 10 + self:combatMindpower() * 3.6 end, action = function(self, t) @@ -539,6 +616,7 @@ newInscription{ end, } + newInscription{ name = "Rune: Vision", type = {"inscriptions/runes", 1}, diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua index d307ce92b463807867fc020f19346e1a12ad6fa7..f49de2deff2d84ae4de0cc9c43ec1e8b504429ad 100644 --- a/game/modules/tome/data/timed_effects/physical.lua +++ b/game/modules/tome/data/timed_effects/physical.lua @@ -182,6 +182,7 @@ newEffect{ end, } + newEffect{ name = "CRIPPLING_POISON", image = "talents/crippling_poison.png", desc = "Crippling Poison", @@ -684,6 +685,25 @@ newEffect{ end, } +-- artifact wild infusion +newEffect{ + name = "PRIMAL_ATTUNEMENT", image = "talents/infusion__wild.png", + desc = "Primal Attunement", + long_desc = function(self, eff) return ("The target is attuned to the wild, increasing all damage affinity by %d%%."):format(eff.power) end, + type = "physical", + subtype = { nature=true }, + status = "beneficial", + parameters = { power=20 }, + on_gain = function(self, err) return "#Target# attunes to the wild.", "+Primal" end, + on_lose = function(self, err) return "#Target# is no longer one with nature.", "-Primal" end, + activate = function(self, eff) + eff.pid = self:addTemporaryValue("damage_affinity", {all=eff.power}) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("damage_affinity", eff.pid) + end, +} + newEffect{ name = "PURGE_BLIGHT", image = "talents/infusion__wild.png", desc = "Purge Blight",