Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • amagad/t-engine4
  • HirumaKai/t-engine4
  • Hogulus/t-engine4
  • Inkie/t-engine4
  • Liberty/t-engine4
  • Lokean/t-engine4
  • Mawootad/t-engine4
  • Michelle/t-engine4
  • MrFrog/t-engine4
  • Nagyhal/t-engine4
  • Recaiden/t-engine4
  • RootOfAllThings/t-engine4
  • Sebsebeleb/t-engine4
  • Sheila/t-engine4
  • Shibari/t-engine4
  • Stof/t-engine4
  • Umbral/t-engine4
  • tome/t-engine4
  • 0player/t-engine4
  • BreezyIdiot/t-engine4
  • Bunny/t-engine4
  • Effigy/t-engine4
  • Hachem_Muche/t-engine4
  • razakai/t-engine4
  • Zireael/t-engine4
  • cinornu/t-engine4
  • edge2054/t-engine4
  • gordaxx727/t-engine4
  • grayswandir/t-engine4
  • helminthauge/t-engine4
  • housepet/t-engine4
  • minqmay/t-engine4
  • nsrr/t-engine4
  • orange/t-engine4
  • otowakotori/t-engine4
  • purequestion/t-engine4
  • rexorcorum/t-engine4
  • rgeens/t-engine4
  • sageacrin/t-engine4
  • stuntofthelitter/t-engine4
  • tiger_eye/t-engine4
  • xelivous/t-engine4
  • yutio888/t-engine4
43 results
Show changes
Commits on Source (41)
Showing
with 356 additions and 123 deletions
......@@ -2150,7 +2150,7 @@ function _M:onTakeHit(value, src, death_note)
return 0
end
if self:attr("phase_shift") and not self.turn_procs.phase_shift then
if self:attr("phase_shift") and rng.percent(self:attr("phase_shift") * 100) and not self.turn_procs.phase_shift then
self.turn_procs.phase_shift = true
local nx, ny = util.findFreeGrid(self.x, self.y, 1, true, {[Map.ACTOR]=true})
if nx then
......@@ -5077,6 +5077,8 @@ local sustainCallbackCheck = {
callbackOnBlock = "talents_on_block",
callbackOnChangeLevel = "talents_on_change_level",
callbackOnEffectSave = "talents_on_effect_save",
callbackOnPartyAdd = "talents_on_party_add",
callbackOnPartyRemove = "talents_on_party_remove",
}
_M.sustainCallbackCheck = sustainCallbackCheck
......@@ -5813,6 +5815,7 @@ function _M:getTalentCooldown(t, base)
if self.talent_cd_reduction[t.id] then cd = cd - self.talent_cd_reduction[t.id] end
if self.talent_cd_reduction.all then cd = cd - self.talent_cd_reduction.all end
if self.talent_cd_reduction.allpct then cd = cd - math.ceil(self.talent_cd_reduction.allpct * cd) end
local eff = self:hasEffect(self.EFF_BURNING_HEX)
if eff and not self:attr("talent_reuse") then
......
......@@ -1585,6 +1585,7 @@ function _M:getTextualDesc(compare_with, use_actor)
compare_fields(w, compare_with, field, "mana_regen", "%+.2f", "Mana each turn: ")
compare_fields(w, compare_with, field, "hate_regen", "%+.2f", "Hate each turn: ")
compare_fields(w, compare_with, field, "psi_regen", "%+.2f", "Psi each turn: ")
compare_fields(w, compare_with, field, "equilibrium_regen", "%+.2f", "Equilibrium each turn: ", nil, true, true)
compare_fields(w, compare_with, field, "vim_regen", "%+.2f", "Vim each turn: ")
compare_fields(w, compare_with, field, "positive_regen_ref_mod", "%+.2f", "P.Energy each turn: ")
compare_fields(w, compare_with, field, "negative_regen_ref_mod", "%+.2f", "N.Energy each turn: ")
......
......@@ -48,6 +48,12 @@ function _M:addMember(actor, def)
print("[PARTY] error trying to add existing actor: ", actor.uid, actor.name)
return false
end
-- Notify existing party members (but not the new one) that a new member is joining
for i, pm in ipairs(self.m_list) do
pm:fireTalentCheck("callbackOnPartyAdd", actor, def)
end
if type(def.control) == "nil" then def.control = "no" end
def.title = def.title or "Party member"
self.members[actor] = def
......@@ -88,6 +94,7 @@ function _M:removeMember(actor, silent)
end
return false
end
local olddef = self.members[actor]
table.remove(self.m_list, self.members[actor].index)
self.members[actor] = nil
......@@ -98,6 +105,11 @@ function _M:removeMember(actor, silent)
self.members[self.m_list[i]].index = i
end
-- Notify existing party members (but not the old one) that a new member is leaving
for i, pm in ipairs(self.m_list) do
pm:fireTalentCheck("callbackOnPartyRemove", actor, def)
end
-- Notify the UI
game.player.changed = true
end
......
......@@ -347,10 +347,14 @@ end
--- Try to totally evade an attack
function _M:checkEvasion(target)
if not target:attr("evasion") or self == target then return end
if target:attr("no_evasion") then return end
local evasion = target:attr("evasion")
if target:knowTalent(target.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(target.x, target.y) then
evasion = (evasion or 0) + 20
end
if not evasion or self == target then return end
if target:attr("no_evasion") then return end
print("checkEvasion", evasion, target.level, self.level)
print("=> evasion chance", evasion)
return rng.percent(evasion)
......@@ -1286,6 +1290,9 @@ function _M:combatArmor()
if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then
add = add + self:callTalent(self.T_ARMOUR_OF_SHADOWS,"ArmourBonus")
end
if self:knowTalent(self.T_CORRUPTED_SHELL) then
add = add + self:getCon() / 3.5
end
if self:knowTalent(self.T_CARBON_SPIKES) and self:isTalentActive(self.T_CARBON_SPIKES) then
add = add + self.carbon_armor
end
......@@ -1640,7 +1647,7 @@ function _M:getDammod(combat)
dammod[stat] = (dammod[stat] or 0) + val
end
if self:knowTalent(self.T_SUPERPOWER) then add('wil', 0.3) end
if self:knowTalent(self.T_SUPERPOWER) then add('wil', 0.4) end
if self:knowTalent(self.T_ARCANE_MIGHT) then add('mag', 0.5) end
return dammod
......@@ -2051,7 +2058,7 @@ function _M:combatMindpower(mod, add)
end
if self:knowTalent(self.T_SUPERPOWER) then
add = add + 50 * self:getStr() / 100
add = add + 60 * self:getStr() / 100
end
if self:knowTalent(self.T_GESTURE_OF_POWER) then
......
......@@ -62,14 +62,37 @@ local ans = {
{"I want to change your talents.", action=change_talents},
{"I want to change your tactics.", action=change_tactics},
{"I want to take direct control.", action=change_control},
{"I want to change your name.", action=change_name},
{"I want to change your name.", cond = function() return golem.sentient_telos == 1 end, jump="name", action=function(npc, player) npc.name = "Telos the Great and Powerful (reluctant follower of "..npc.summoner.name..")" game.log("#ROYAL_BLUE#The golem decides to change it's name to #{bold}#%s#{normal}#.", npc.name) end},
{"I want to change your name.", cond = function() return not golem.sentient_telos end, action=change_name},
{"How is it that you speak?", cond = function() return golem.sentient_telos == 1 end, jump="how_speak"},
{"Nothing, let's go."},
}
newChat{ id="how_speak",
text = [[What's the good of immortality if you can't even speak? No archmage worth his salt is going to concoct some immoral life-after-death scheme without including some sort of capacity for making his opinions known. And, by the way, your energy manipulation techniques are on the same level as those of my average pair of shoes. Though I guess you are making up for it with your golem crafting skills.]],
answers = ans
}
newChat{ id="name",
text = [[Change my name? I'm quite happy being 'Telos' thankyou. Though I wouldn't mind being 'Telos the Great and Powerful'. Do that actually. Yes!]],
answers = ans
}
if golem.sentient_telos == 1 then
newChat{ id="welcome",
text = [[I'm a golem. How droll!
Oh, did you want something?]],
answers = ans
}
else
newChat{ id="welcome",
text = [[#LIGHT_GREEN#*The golem talks in a monotonous voice*#WHITE#
Yes master.]],
answers = ans
}
end
return "welcome"
......@@ -556,6 +556,11 @@ newEntity{ base = "BASE_GEM",
desc = [[A piece of the scorched wood taken from the remains of Snaproot.]],
cost = 100,
material_level = 4,
color_attributes = {
damage_type = 'FIRE',
alt_damage_type = 'FLAMESHOCK',
particle = 'flame',
},
identified = false,
imbue_powers = {
resists = { [DamageType.NATURE] = 25, [DamageType.DARKNESS] = 10, [DamageType.COLD] = 10 },
......@@ -764,6 +769,11 @@ newEntity{ base = "BASE_STAFF",
inc_damage = {[DamageType.ARCANE] = 35 },
learn_talent = {[Talents.T_COMMAND_STAFF] = 1 },
},
set_list = { {"define_as","TELOS_BOTTOM_HALF"}, {"define_as","GEM_TELOS"} },
on_set_complete = function(self, who)
end,
on_set_broken = function(self, who)
end,
}
newEntity{ base = "BASE_AMULET",
......@@ -966,13 +976,24 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS",
color = colors.WHITE, image = "object/artifact/crystal_focus.png",
level_range = {5, 12},
desc = [[This crystal radiates the power of the Spellblaze itself.]],
special_desc = function(self) return "(The created item can be activated to recover the Focus.)" end,
rarity = 200,
identified = false,
cost = 50,
material_level = 2,
color_attributes = {
damage_type = 'ARCANE',
alt_damage_type = 'ARCANE_SILENCE',
particle = 'manathrust',
},
wielder = {
inc_stats = {[Stats.STAT_MAG] = 5 },
inc_damage = {[DamageType.ARCANE] = 20, [DamageType.BLIGHT] = 20 },
},
max_power = 1, power_regen = 1,
use_power = { name = "combine with a weapon", power = 1, use = function(self, who, gem_inven, gem_item)
use_power = { name = "combine with a weapon (makes a non enchanted weapon into an artifact)", power = 1, use = function(self, who, gem_inven, gem_item)
who:showInventory("Fuse with which weapon?", who:getInven("INVEN"), function(o) return (o.type == "weapon" or o.subtype == "hands" or o.subtype == "shield") and o.subtype ~= "mindstar" and not o.egoed and not o.unique and not o.rare and not o.archery end, function(o, item)
local oldname = o:getName{do_color=true}
......@@ -1034,6 +1055,27 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS",
o.special_combat.block = o.special_combat.block * 1.25
end
end
o.power = 1
o.max_power = 1
o.power_regen = 1
o.use_no_wear = true
o.use_power = { name = "recover the Crystal Focus (destroys this weapon)", power = 1, use = function(self, who, inven, item)
local art_list = mod.class.Object:loadList("/data/general/objects/objects-maj-eyal.lua")
local o = art_list.CRYSTAL_FOCUS:clone()
o:resolve()
o:resolve(nil, true)
o:identify(true)
who:addObject(who.INVEN_INVEN, o)
who:sortInven(who.INVEN_INVEN)
local name = self:getName({no_count=true, force_id=true, no_add_name=true})
for i, h in ipairs(who.hotkey) do
if h[2] == name then who.hotkey[i] = nil end
end
who.changed = true
game.logPlayer(who, "You created: %s", o:getName{do_color=true})
return {used=true, id=true, destroy=true}
end }
end),
resolvers.genericlast(function(o) if o.wielder.learn_talent then o.wielder.learn_talent["T_COMMAND_STAFF"] = nil end end),
fake_ego = true,
......@@ -1057,7 +1099,7 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS",
who:sortInven()
who.changed = true
game.logPlayer(who, "You fix the crystal on the %s and create the %s.", oldname, o:getName{do_color=true})
end)
end,
......@@ -1072,13 +1114,24 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_HEART",
color = colors.RED, image = "object/artifact/crystal_heart.png",
level_range = {35, 42},
desc = [[This crystal is huge, easily the size of your head. It sparkles brilliantly almost of its own accord.]],
special_desc = function(self) return "(The created item can be activated to recover the Heart.)" end,
rarity = 250,
identified = false,
cost = 200,
material_level = 5,
color_attributes = {
damage_type = 'ARCANE',
alt_damage_type = 'ARCANE_SILENCE',
particle = 'manathrust',
},
wielder = {
inc_stats = {[Stats.STAT_CON] = 5 },
resists = {[DamageType.ARCANE] = 20, [DamageType.BLIGHT] = 20 },
},
max_power = 1, power_regen = 1,
use_power = { name = "combine with a suit of body armor", power = 1, use = function(self, who, gem_inven, gem_item)
use_power = { name = "combine with a suit of body armor (makes a non enchanted armour into an artifact)", power = 1, use = function(self, who, gem_inven, gem_item)
-- Body armour only, can be cloth, light, heavy, or massive though. No clue if o.slot works for this.
who:showInventory("Fuse with which armor?", who:getInven("INVEN"), function(o) return o.type == "armor" and o.slot == "BODY" and not o.egoed and not o.unique and not o.rare end, function(o, item)
local oldname = o:getName{do_color=true}
......@@ -1121,6 +1174,27 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_HEART",
o.wielder.combat_def = ((o.wielder.combat_def or 0) + 2) * 1.7
-- Same for armour. Yay crap cloth!
o.wielder.combat_armor = ((o.wielder.combat_armor or 0) + 3) * 1.7
o.power = 1
o.max_power = 1
o.power_regen = 1
o.use_no_wear = true
o.use_power = { name = "recover the Crystal Heart (destroys this armour)", power = 1, use = function(self, who, inven, item)
local art_list = mod.class.Object:loadList("/data/general/objects/objects-maj-eyal.lua")
local o = art_list["CRYSTAL_FOCUS"]:clone()
o:resolve()
o:resolve(nil, true)
o:identify(true)
who:addObject(who.INVEN_INVEN, o)
who:sortInven(who.INVEN_INVEN)
local name = self:getName({no_count=true, force_id=true, no_add_name=true})
for i, h in ipairs(who.hotkey) do
if h[2] == name then who.hotkey[i] = nil end
end
who.changed = true
game.logPlayer(who, "You created: %s", o:getName{do_color=true})
return {used=true, id=true, destroy=true}
end }
end),
}
game.zone:applyEgo(o, crystalline_ego, "object", true)
......
......@@ -314,6 +314,11 @@ newEntity{ base = "BASE_GEM",
cost = 200,
quest = 1,
material_level = 5,
color_attributes = {
damage_type = 'NATURE',
alt_damage_type = 'SPYDRIC_POISON',
particle = 'slime',
},
wielder = {
inc_stats = {[Stats.STAT_CON] = 15, },
healing_factor = 0.3,
......
......@@ -707,6 +707,11 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS",
identified = false,
cost = 200,
material_level = 5,
color_attributes = {
damage_type = 'BLIGHT',
alt_damage_type = 'DRAINLIFE',
particle = 'slime',
},
carrier = {
lite = 2,
},
......@@ -716,6 +721,7 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS",
confusion_immune = 0.3,
fear_immune = 0.3,
resists={[DamageType.MIND] = 30,},
sentient_telos = 1,
},
imbue_powers = {
inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_DEX] = 5, [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 5, [Stats.STAT_CUN] = 5, [Stats.STAT_CON] = 5, },
......@@ -757,6 +763,28 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS",
end)
return {id=true, used=true}
end },
set_list = { {"define_as","TELOS_BOTTOM_HALF"}, {"define_as","TELOS_TOP_HALF"} },
on_set_complete = function(self, who)
local DamageType = require "engine.DamageType"
self:specialSetAdd({"wielder","spell_cooldown_reduction"}, 0.1)
self:specialWearAdd({"wielder","melee_project"}, { [engine.DamageType.DRAINLIFE] = 50 } )
game.logSeen(game.player, "#CRIMSON#Telos's gem seems to flare and glows an unearthly colour.")
end,
on_set_broken = function(self, who)
game.logPlayer(game.player, "#CRIMSON#The unearthly glow fades away.")
end,
on_wear = function(self, who)
if who.is_alchemist_golem then
self.old_golem_name = who.name
who.name = "Telos Golem (reluctant follower of "..who.summoner.name..")"
game.log("#ROYAL_BLUE#The golem decides to change it's name to #{bold}#%s#{normal}#.", who.name)
end
end,
on_takeoff = function(self, who)
if who.is_alchemist_golem then
who.name = self.old_golem_name or "I feel lost!"
end
end,
}
-- The staff that goes with the crystal above, it will not be generated randomly it is created by the crystal
......
......@@ -40,6 +40,11 @@ newEntity{ base = "BASE_GEM",
cost = 200,
identified = false,
material_level = 4,
color_attributes = {
damage_type = 'LIGHTNING',
alt_damage_type = 'LIGHTNING_DAZE',
particle = 'lightning_explosion',
},
wielder = {
inc_stats = {[Stats.STAT_DEX] = 8, [Stats.STAT_CUN] = 8 },
inc_damage = {[DamageType.LIGHTNING] = 20 },
......@@ -327,6 +332,11 @@ newEntity{ base = "BASE_GEM",
identified = false,
rarity = 250,
material_level = 3,
color_attributes = {
damage_type = 'LIGHT',
alt_damage_type = 'LIGHT_BLIND',
particle = 'light',
},
desc = [[The first Halfling mages during the Age of Allure discovered how to capture the Sunlight and infuse gems with it.
This star is the culmination of their craft. Light radiates from its ever-shifting yellow surface.]],
cost = 400,
......@@ -938,8 +948,17 @@ newEntity{ base = "BASE_CLOTH_ARMOR",
resists={[DamageType.NATURE] = 30},
on_melee_hit={[DamageType.POISON] = 20, [DamageType.SLIME] = 20},
},
on_wear = function(self, who)
if not game.state.spydre_mantra then
game.state.spydre_mantra = true
require("engine.ui.Dialog"):simpleLongPopup("Huh?", "As you wear the strange set of robes, you notice something folded into one of its pockets...", 500, function()
game.party:learnLore("shiiak-mantra")
end)
end
end,
}
newEntity{ base = "BASE_HELM", define_as = "HELM_KROLTAR",
power_source = {technique=true},
unique = true,
......@@ -1700,7 +1719,7 @@ newEntity{ base = "BASE_MACE",
unided_name = "a strangely colored bone", unique = true,
moddable_tile = "special/%s_club_ureslaks_femur",
moddable_tile_big = true,
desc = [[A shortened femur of the mighty prismatic dragon, this erratic club still pulses with Ureslak's volatile nature.]],
desc = [[A shortened femur of the mighty prismatic dragon Ureslak, this erratic club still resonates with his volatile nature.]],
level_range = {42, 50},
require = { stat = { str=45, dex=30 }, },
rarity = 400,
......@@ -1762,6 +1781,71 @@ newEntity{ base = "BASE_MACE",
inc_damage = { all = 12, [DamageType.ARCANE] = 30 },
} },
},
set_list = { {"define_as","URESLAK_CLOAK"} },
set_desc = {
ureslak = "What would happen if more of Ureslak's remains were reunited?",
},
}
newEntity{ base = "BASE_CLOAK",
power_source = {nature=true},
unique = true,
name = "Ureslak's Molted Scales", define_as = "URESLAK_CLOAK", image = "object/artifact/ureslaks_molted_scales.png",
unided_name = "scaly multi-hued cloak",
desc = [[This cloak is fashioned from the scales of some large reptilian creature. It appears to reflect every color of the rainbow.]],
level_range = {40, 50},
rarity = 400,
cost = 300,
material_level = 5,
wielder = {
resists_cap = {
[DamageType.FIRE] = 10,
[DamageType.COLD] = 10,
[DamageType.LIGHTNING] = 10,
[DamageType.NATURE] = 10,
[DamageType.DARKNESS] = 10,
[DamageType.ARCANE] = -30,
},
resists = {
[DamageType.FIRE] = 20,
[DamageType.COLD] = 20,
[DamageType.LIGHTNING] = 20,
[DamageType.NATURE] = 20,
[DamageType.DARKNESS] = 20,
[DamageType.ARCANE] = -30,
},
},
max_power = 50, power_regen = 1,
use_power = {
name = function(self, who)
local resists={"Fire", "Cold", "Lightning", "Nature", "Darkness"}
if self.set_complete then table.insert(resists, "Arcane") end
return ("energize the scales for 16 turns, increasing resistance to %s damage by 15%% just before you are damaged. (This effect lasts 5 turns and only works on one type of damage.)"):format(table.concatNice(resists, ", ", ", or "))
end,
tactical = { DEFEND = 1 },
power = 50,
use = function(self, who)
game.logSeen(who, "%s empowers %s %s!", who.name:capitalize(), who:his_her(), self:getName({do_color = true, no_add_name = true}))
local resists = table.values({engine.DamageType.FIRE, engine.DamageType.COLD, engine.DamageType.LIGHTNING, engine.DamageType.NATURE, engine.DamageType.DARKNESS2, engine.DamageType.DARKNESS})
if self.set_complete then table.insert(resists, engine.DamageType.ARCANE) end
who:setEffect(who.EFF_CHROMATIC_RESONANCE, 16, {resist_types=resists})
return {id=true, used=true}
end,
},
set_list = { {"define_as","URESLAK_FEMUR"} },
set_desc = {
ureslak = "It would go well with another part of Ureslak.",
},
on_set_complete = function(self, who)
self:specialSetAdd({"wielder","equilibrium_regen"}, -1)
self:specialSetAdd({"wielder","resists"}, {[engine.DamageType.ARCANE]=15})
self:specialSetAdd({"wielder","resists_cap"}, {[engine.DamageType.ARCANE]=15})
game.logSeen(who, "#YELLOW_GREEN#An ironic harmony surrounds Ureslak's remains as they reunite.")
end,
on_set_broken = function(self, who)
self.wielder.equilibrium_regen = nil
game.logSeen(who, "#YELLOW_GREEN#Ureslak's remains seem more unsettled.")
end,
}
newEntity{ base = "BASE_WARAXE",
......@@ -1961,47 +2045,6 @@ newEntity{ base = "BASE_AMULET",
use_talent = { id = Talents.T_ARCANE_EYE, level = 2, power = 60 },
}
newEntity{ base = "BASE_CLOAK",
power_source = {nature=true},
unique = true,
name = "Ureslak's Molted Scales", image = "object/artifact/ureslaks_molted_scales.png",
unided_name = "scaley multi-hued cloak",
desc = [[This cloak is fashioned from the scales of some large reptilian creature. It appears to reflect every color of the rainbow.]],
level_range = {40, 50},
rarity = 400,
cost = 300,
material_level = 5,
wielder = {
resists_cap = {
[DamageType.FIRE] = 10,
[DamageType.COLD] = 10,
[DamageType.LIGHTNING] = 10,
[DamageType.NATURE] = 10,
[DamageType.DARKNESS] = 10,
[DamageType.ARCANE] = -30,
},
resists = {
[DamageType.FIRE] = 20,
[DamageType.COLD] = 20,
[DamageType.LIGHTNING] = 20,
[DamageType.NATURE] = 20,
[DamageType.DARKNESS] = 20,
[DamageType.ARCANE] = -30,
},
},
max_power = 50, power_regen = 1,
use_power = {
name = function(self, who) return "empower the scales for 16 turns, increasing a resistance (fire, cold, lightning, nature, darkness) by 15% when you are about to be hit (this effect can only happen once every 5 turns and lasts 5 turns)." end,
tactical = { BUFF = 1 },
power = 50,
use = function(self, who)
game.logSeen(who, "%s empowers %s %s!", who.name:capitalize(), who:his_her(), self:getName({do_color = true, no_add_name = true}))
who:setEffect(who.EFF_URESLAK_MOLTEN_SCALES, 16, {})
return {id=true, used=true}
end,
},
}
newEntity{ base = "BASE_DIGGER",
power_source = {technique=true},
unique = true,
......@@ -4847,6 +4890,11 @@ newEntity{ base = "BASE_GEM", --Thanks SageAcrin and Graziel!
cost = 200,
identified = false,
material_level = 3,
color_attributes = {
damage_type = 'LIGHTNING',
alt_damage_type = 'LIGHTNING_DAZE',
particle = 'lightning_explosion',
},
wielder = {
inc_stats = {[Stats.STAT_MAG] = 5, [Stats.STAT_CON] = 5, },
inc_damage = {[DamageType.FIRE] = 10, [DamageType.COLD] = 10, [DamageType.LIGHTNING] = 10, },
......
......@@ -33,13 +33,17 @@ newLore{
#FIREBRICK#Pain#LAST#. Everywhere, but where is worst...
Abdomen. Broken ribs? Breathe in-- #FIREBRICK#yes they're broken#LAST#. Shallow breaths. Damned orcs. Didn't expect them on this continent, much less in a Sher'Tul ruin. Didn't even expect a Sher'Tul ruin... Carrying Ziguranth weapons, preventing healing magic from working. So now we've got #{italic}#two#{normal}# bands of past-their-prime savages working together to burn down civilization. Lovely.
Abdomen. Broken ribs? Breathe in-- #FIREBRICK#yes they're broken#LAST#. Shallow breaths. What happ-- right. Damned orcs. Didn't expect them on this continent, much less in a Sher'Tul ruin. Didn't even expect a Sher'Tul ruin... Carrying Ziguranth weapons, preventing healing magic from working. So now we've got #{italic}#two#{normal}# bands of past-their-prime savages working together to burn down civilization. Lovely.
[...]
Elandar, leaning over me, can't hug me because of my ribcage. Says I should be dead. That he found what he thinks is the fabled Blood of Life, and poured it down my throat and into my wounds. That I'm healing, but... if he was wrong, we can't go back to them. Back to #{italic}#her#{normal}# - not after last time. I can't let them take me from Elandar, not after all he's done for me, no matter what they might find if they analyze what's left in that bottle.
The pain is fading - little by little, ribs mending minute by minute, I can breathe slightly deeper before hitting that sudden wall of agony. It feels... healthy. Powerful, even. Whatever my love may have found, his gift is definitely capable of nourishing living creatures... but there are other feelings too. Feelings of being trapped. Lost. Alone. Homesick for a home I'm already standing in.
The pain is fading - little by little, ribs mending minute by minute, I can breathe slightly deeper before #FIREBRICK#hitting#last# that sudden wall of #FIREBRICK#agony#LAST#. It feels... healthy. Powerful, even. Whatever my love may have found, his gift is definitely capable of nourishing living creatures... but there are other feelings too. Feelings of being trapped. Lost. Alone. Homesick for a home I'm already lying in.
[...]
I have my theories, unsettling as they are. I believe I can use this bond... productively, without breaking my love's heart or leaving a worse world behind. I will be happy, Elandar will be happy, and #FIREBRICK#he#LAST# will be happy.]],
I have my theories, unsettling as they are, as to what's coming over me - what I suspect to have invisibly replaced my subconscious already, what I constantly feel my conscious thoughts drifting towards if I'm not focusing, why that ability to hold conscious attention on anything else seems to be slipping more every minute. Committing suicide or sending myself to an Angolwen asylum (if they were that merciful) are not options - egotistical as this sounds, I know the happiness I bring to Elandar's tragic life is the only thing that keeps him going. I believe I can use this bond and the #FIREBRICK#painfully unnatural#LAST# urges that come with it... productively, without breaking my love's heart or leaving a worse world behind. I will be happy, Elandar will be happy, and #FIREBRICK#he#LAST# will be happy.]],
}
newLore{
......@@ -57,28 +61,32 @@ newLore{
id = "argoniel-2",
category = "high peak",
name = "Argoniel's blood-runed athame",
lore = [[#{italic}#On touching the blood-dripping knife, memories flood your mind - this time, with incredible intensity. You drop the knife immediately, thankful you only picked it up by the plain handle, and not the rune-lit blade or the red pool under it. Moments later, your mind starts parsing and interpreting what it just absorbed:#{normal}#
lore = [[#{italic}#On touching the blood-dripping knife, memories flood your mind - this time, with incredible intensity. You drop the knife immediately, thankful you only touched the plain handle, and not the rune-lit blade or the red pool under it. Moments later, your mind starts parsing and interpreting what it just absorbed:#{normal}#
pain. pain loneliness and cold, so much cold and it keeps growing. in my dreams i can't move a muscle thanks to this #{italic}##FIREBRICK#[untranslatably foul profanity]#LAST##{normal}# goblin-built cage. he never had his chance. could've made the world in his image. could've made a peaceful world, one of meadows and soft rolling hills, if the other gods hadn't fought with him over it. might've made humans - in any case he watched over us, protected us from those #{italic}##FIREBRICK#[untranslatably ancient profanity]#LAST##{normal}# squid until they drove him into the void
pain. pain loneliness and cold, so much cold and it keeps growing. in my dreams i can't move a muscle thanks to this #{italic}##FIREBRICK#[untranslatably foul profanity]#LAST##{normal}# cage. he never had his chance. could've made the world in his image. could've made a peaceful world, one of meadows and soft rolling hills, if the other gods hadn't fought with him over it. might've made humans - in any case he watched over us, protected us from those #{italic}##FIREBRICK#[untranslatably ancient profanity]#LAST##{normal}# squid until they drove him into the void
he suffers on a distant world, his power leeched out bit by bit for reasons never told to him by evildoers he's never seen. this is not right. he must be free. i must be free. he must come to eyal and our vision for it will be realized
he suffers on a distant world, his power leeched out bit by bit for reasons never told to him by evildoers he's never seen. this is not right. he must be free. i must be free. he must come to eyal so our vision for it can finally be realized
it will be
#{italic}#so#{normal}#
#{italic}##FIREBRICK#b e a u t i f u l#LAST##{normal}#]],
#{italic}##FIREBRICK#b e a u t i f u l#LAST##{normal}#
]],
}
newLore{
id = "elandar-2",
category = "high peak",
name = "Elandar's journal (2)",
lore = [[...I awoke early this morning to see the love of my life altering the unique farportal we've been building together. Our plans are all on track so far, the Staff of Absorption has been integrated into the portal so it'll drain Gerlyk the moment it summons him, the orcs are too busy suspecting each other to bother investigating us... and then I discover that she's sabotaged it. This portal will #{italic}#em#{normal}#power Gerlyk when it summons him - and he surely must be insane from the loneliness of tumbling in the void of space all this time. In any case, even a sane god would be devastating to life as we know it.
...So why can't I bring myself to stop her...?
lore = [[I awoke early this morning to see the love of my life altering the unique farportal we've been building together. Our plans are all on track so far, the Staff of Absorption has been integrated into the portal so it'll drain Gerlyk the moment it summons him, the orcs are too busy suspecting each other to bother investigating us... and then I discover that she's sabotaged it. This portal will #{italic}#em#{normal}#power Gerlyk when it summons him - and he surely must be insane from the loneliness of tumbling in the void of space all this time. In any case, even a sane god would be devastating to life as we know it.
...I can't bring myself to stop her.
Argoniel, my love, I have sworn to hold your hand and walk beside you, no matter where you choose to go. If that means joining you down the road to armageddon... so be it.
Argoniel, my love, you have brought me so much joy and given me much to live for. I have sworn to hold your hand and walk beside you, no matter where you choose to go. If that means joining you down the road to a second Spellblaze... so be it.
Forgive me, Eyal.]],
}
\ No newline at end of file
......@@ -690,6 +690,28 @@ Welcome to Point Zero, agent. Enclosed are timespace coordinates to what is, qui
PS: You might encounter a... benefactor of sorts in your travels. You'll know it when you see it, ham-fistedly yanking its puppets back from the brink of death; if you see it for yourself, we regret to inform you that you've taken a one-way trip off prime Timeline-E4-RL territory for a doomed offshoot unless "he" feels like weaving you back in - and it tends to only do that to people who narrowly avert its engineered apocalypses through incredible power or luck. If you have been chosen by its schemes, play along and you might get brought back from the temporal graveyard that is the Timeline-E4-EXPADV subnetwork. We do not know what it is - a runaway creation of our own, a competing culture's weapon, or something far above ourselves - but if it has hostile intent, it has already won. So far it's been... mostly cooperative. Just make a point not to remind it that we're its competition.]]
}
newLore{
id = "shiiak-mantra",
category = "spydrë",
name = "Mantra of a Shiiak",
lore = [[Each morning I wake, happy I'm alive;
the traps of this tomb won't claim me today.
Though its curse of hunger eats at my insides,
I curse it one better by having outstayed.
Say a curse for the goblins' tortures that remained,
and a curse for the gods who stole half the world.
Say a curse for the chill that leaves magic drained,
and a curse for the star that grew dark as it swirled
But most important of all is to note,
in spite of fate's bias, only we survived.
Curse the dead all you want, but we've stayed afloat;
we're the only ones blessed with the skillset to thrive.
Our wit, strength, and teamwork outweigh cosmic powers;
they've done what they could but Spydrë is [b]ours.[/b] ]]
}
--------------------------------------------------------------
-- Misc bosses
......
......@@ -104,7 +104,7 @@ newTalent{
return not checkMaxSummon(self, silent)
end,
on_detonate = function(self, t, m)
local tg = {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t, x=m.x, y=m.y}
local tg = {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t, x=m.x, y=m.y, ignore_nullify_all_friendlyfire=true}
self:project(tg, m.x, m.y, function(px, py)
local target = game.level.map(px, py, Map.ACTOR)
if not target or self:reactionToward(target) < 0 then return end
......
......@@ -206,6 +206,7 @@ newTalent{
target.dream_plane_on_die = target.on_die
target.on_die = function(self, ...)
self.dream_plane_trapper:removeEffect(self.EFF_DREAMSCAPE)
self.dream_plane_trapper = nil
local args = {...}
game:onTickEnd(function()
if self.dream_plane_on_die then self:dream_plane_on_die(unpack(args)) end
......
......@@ -51,6 +51,7 @@ local function makeGolem(self)
if o.material_level > self.summoner:getTalentLevelRaw(self.summoner.T_GEM_GOLEM) then return "Master's Gem Golem talent too low for this gem" end
end,
equipdoll = "alchemist_golem",
is_alchemist_golem = 1,
infravision = 10,
rank = 3,
size_category = 4,
......
......@@ -228,7 +228,7 @@ newTalent{
self.talents_cd[t.id] = math.max(cooldown - 1, 0)
end
end,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.4, 2.6) end, --high damage, high opportunity cost
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 2.5) end, --high damage, high opportunity cost
getDist = function(self, t) if self:getTalentLevel(t) >= 3 then return 2 else return 1 end end,
archery_onhit = function(self, t, target, x, y)
if not target or not target:canBe("knockback") then return end
......@@ -289,9 +289,9 @@ newTalent{
no_energy = true,
tactical = { BUFF = 2 },
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getAttackSpeed = function(self, t) return math.floor(self:combatTalentScale(t, 5, 20))/100 end,
getMovementSpeed = function(self, t) return math.floor(self:combatTalentScale(t, 25, 60))/100 end,
getTurn = function(self, t) return math.floor(self:combatTalentLimit(t, 30, 10, 20)) end,
getAttackSpeed = function(self, t) return math.floor(self:combatTalentLimit(t, 40, 10, 25))/100 end,
getMovementSpeed = function(self, t) return math.floor(self:combatTalentScale(t, 25, 55))/100 end,
getTurn = function(self, t) return math.floor(self:combatTalentLimit(t, 25, 5, 15)) end,
on_pre_use = function(self, t, silent)
if not archerPreUse(self, t, silent, "sling") then return false end
return true
......
......@@ -90,6 +90,10 @@ newTalent{
self.turn_procs.first_blood_shoot = target.life
end
end
if target:hasEffect(target.EFF_PIN_DOWN) then self.turn_procs.auto_phys_crit = true end
end,
archery_onmiss = function(self, talent, target, x, y)
if target:hasEffect(target.EFF_PIN_DOWN) then self.turn_procs.auto_phys_crit = nil end
end,
archery_onhit = function(self, t, target, x, y)
if self:knowTalent(self.T_MASTER_MARKSMAN) then
......@@ -97,8 +101,9 @@ newTalent{
if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end
if target:hasEffect(target.EFF_PIN_DOWN) then
local eff = target:hasEffect(target.EFF_PIN_DOWN)
chance = chance + eff.mark
eff.mark = 0
chance = 100
self.turn_procs.auto_phys_crit = nil
target:removeEffect(target.EFF_PIN_DOWN)
end
if self.turn_procs.first_blood_shoot then chance = chance + 50 end
if rng.percent(chance) then target:setEffect(target.EFF_MARKED, 5, {src=self}) end
......@@ -202,13 +207,18 @@ newTalent{
self.turn_procs.first_blood_ss = target.life
end
end
if target:hasEffect(target.EFF_PIN_DOWN) then self.turn_procs.auto_phys_crit = true end
end,
archery_onmiss = function(self, talent, target, x, y)
if target:hasEffect(target.EFF_PIN_DOWN) then self.turn_procs.auto_phys_crit = nil end
end,
archery_onhit = function(self, t, target, x, y)
local chance = t.getChance(self,t)
if target:hasEffect(target.EFF_PIN_DOWN) then
local eff = target:hasEffect(target.EFF_PIN_DOWN)
chance = chance + eff.mark
eff.mark = 0
chance = 100
self.turn_procs.auto_phys_crit = nil
target:removeEffect(target.EFF_PIN_DOWN)
end
if self.turn_procs.first_blood_ss then chance = chance + 50 end
if rng.percent(chance) then target:setEffect(target.EFF_MARKED, 5, {src=self}) end
......@@ -255,7 +265,6 @@ newTalent{
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.0, 1.4) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5)) end,
getMarkChance = function(self, t) return math.floor(self:combatTalentScale(t, 5, 20)) end,
getCritPower = function(self, t) return math.floor(self:combatTalentScale(t, 8, 20)) end,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getChance = function(self,t)
local chance = 20
......@@ -266,11 +275,10 @@ newTalent{
return chance
end,
archery_onhit = function(self, t, target, x, y)
if target:canBe("pin") and target:checkHit(self:combatAttack(), target:combatPhysicalResist()) then
target:setEffect(target.EFF_PIN_DOWN, t.getDuration(self, t), {power=t.getCritPower(self,t), pin=1, mark=100})
else
target:setEffect(target.EFF_PIN_DOWN, t.getDuration(self, t), {power=t.getCritPower(self,t), pin=0, mark=100})
if target:canBe("pin") then
target:setEffect(target.EFF_PINNED, t.getDuration(self, t), {apply_power=self:combatAttack()})
end
target:setEffect(target.EFF_PIN_DOWN, t.getDuration(self, t), {src=self})
local chance = t.getChance(self,t)
if rng.percent(chance) then target:setEffect(target.EFF_MARKED, 5, {src=self}) end
end,
......@@ -287,12 +295,11 @@ newTalent{
local dam = t.getDamage(self,t)*100
local dur = t.getDuration(self,t)
local mark = t.getMarkChance(self,t)
local power = t.getCritPower(self,t)
local chance = t.getChance(self,t)
return ([[You fire a shot for %d%% damage that attempts to pin your target to the ground for %d turns, as well as increasing your critical strike chance and critical strike damage against the target by %d%% and increasing chance to mark by 100%% with your next Shoot or Steady Shot.
return ([[You fire a shot for %d%% damage that attempts to pin your target to the ground for %d turns, as well as giving your next Steady Shot or Shoot 100%% increased chance to critically hit and mark (regardless of whether the pin succeeds).
This shot has a 20%% chance to mark the target.
The chance to pin increases with your Accuracy.]]):
format(dam, dur, mark, power, chance)
format(dam, dur, mark, chance)
end,
}
......@@ -316,7 +323,7 @@ newTalent{
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.0, 1.5) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
getSpeedPenalty = function(self, t) return math.floor(self:combatTalentScale(t, 10, 35))/100 end,
getSpeedPenalty = function(self, t) return math.floor(self:combatTalentLimit(t, 50, 10, 40))/100 end,
getChance = function(self,t)
local chance = 20
if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end
......@@ -361,7 +368,7 @@ newTalent{
stamina = 15,
require = techs_dex_req4,
range = 0,
radius = function(self, t) return 2 + math.floor(self:combatTalentScale(t, 3.5, 5.5)) end,
radius = function(self, t) return 2 + math.floor(self:combatTalentLimit(t, 8, 3.5, 5.5)) end,
tactical = { ATTACKAREA = { weapon = 2 }, ESCAPE = { knockback = 2 } },
requires_target = true,
target = function(self, t)
......@@ -370,7 +377,7 @@ newTalent{
end,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.7, 1.5) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 5)) end,
getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 10, 3, 5)) end,
getChance = function(self,t)
local chance = 20
if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end
......@@ -452,20 +459,16 @@ newTalent{
if self.ai and self.ai == "party_member" then
return 0
elseif self.ai then
return 3
return 6
else
return 3
return 6
end
end, require = techs_dex_req1,
range = archery_range,
requires_target = true,
tactical = { ATTACK = { weapon = 2 } },
getDamage = function(self, t)
local dam = self:combatTalentWeaponDamage(t, 1.1, 2.4)
if self:isTalentActive(self.T_CONCEALMENT) then
dam = dam + (dam * self:callTalent(self.T_CONCEALMENT, "getDamage")/100)
end
return dam
return self:combatTalentWeaponDamage(t, 1.1, 2.3)
end,
getApr = function(self, t) return self:getDex(40,true) end,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
......@@ -543,11 +546,7 @@ newTalent{
end,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getDamage = function(self, t)
local dam = self:combatTalentWeaponDamage(t, 0.6, 1.4)
if self:isTalentActive(self.T_CONCEALMENT) then
dam = dam + (dam * self:callTalent(self.T_CONCEALMENT, "getDamage")/100)
end
return dam
return self:combatTalentWeaponDamage(t, 0.6, 1.4)
end,
action = function(self, t)
local tg = self:getTalentTarget(t)
......@@ -629,18 +628,18 @@ newTalent{
requires_target = true,
tactical = { ATTACK = { weapon = 2 } },
getDamage = function(self, t)
local dam = self:combatTalentWeaponDamage(t, 0.7, 1.5)
if self:isTalentActive(self.T_CONCEALMENT) then
dam = dam + (dam * self:callTalent(self.T_CONCEALMENT, "getDamage")/100)
end
return dam
return self:combatTalentWeaponDamage(t, 0.7, 1.5)
end,
no_npc_use = true,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 1, 5)) end,
archery_onhit = function(self, t, target, x, y)
if target:hasEffect(target.EFF_MARKED) then
target:removeEffect(target.EFF_MARKED)
if self:knowTalent(self.T_BULLSEYE) then self:callTalent(self.T_BULLSEYE, "proc") end
if self:knowTalent(self.T_BULLSEYE) and not self.turn_procs.bullseye then
self.turn_procs.bullseye = true
self:callTalent(self.T_BULLSEYE, "proc")
end --stop this proccing repeatedly
end
if not target.turn_procs.called_shot_silence then
target.turn_procs.called_shot_silence = true
......@@ -652,14 +651,14 @@ newTalent{
elseif not target.turn_procs.called_shot_disarm then
target.turn_procs.called_shot_disarm = true
if target:canBe("disarm") then
target:setEffect(target.EFF_DISARMED, t.getDuration(self, t), {apply_power=self:combatAttack()})
target:setEffect(target.EFF_DISARMED, t.getDuration(self, t), {apply_power=self:combatAttack(), no_ct_effect=true})
else
game.logSeen(target, "%s resists the disarm!", target.name:capitalize())
end
elseif not target.turn_procs.called_shot_slow then
target.turn_procs.called_shot_slow = true
if target:canBe("slow") then
target:setEffect(target.EFF_SLOW_MOVE, t.getDuration(self, t), {power=0.5, apply_power=self:combatAttack()})
target:setEffect(target.EFF_SLOW_MOVE, t.getDuration(self, t), {power=0.5, apply_power=self:combatAttack(), no_ct_effect=true})
else
game.logSeen(target, "%s resists the slow!", target.name:capitalize())
end
......@@ -676,13 +675,16 @@ newTalent{
local target = game.level.map(x, y, game.level.map.ACTOR)
if not target then return nil end
local shots=1
if target:hasEffect(target.EFF_MARKED) or self:isTalentActive(self.T_CONCEALMENT) then shots=3 end
local targets = self:archeryAcquireTargets(tg, {multishots=shots, x=target.x, y=target.y})
local targets = self:archeryAcquireTargets(tg, {x=target.x, y=target.y})
if not targets then return nil end
local dam = t.getDamage(self,t)
self:archeryShoot(targets, t, nil, {mult=dam})
if target:hasEffect(target.EFF_MARKED) or self:isTalentActive(self.T_CONCEALMENT) then
local targets2 = self:archeryAcquireTargets(tg, {multishots=2, x=target.x, y=target.y})
self:archeryShoot(targets2, t, nil, {mult=dam*0.25})
end
return true
end,
......@@ -702,9 +704,9 @@ newTalent{
points = 5,
mode = "passive",
require = techs_dex_req4,
getSpeed = function(self, t) return math.floor(self:combatTalentScale(t, 10, 35))/100 end,
getSpeed = function(self, t) return math.floor(self:combatTalentLimit(t, 50, 10, 30))/100 end,
getTalentCount = function(self, t) return math.floor(self:combatTalentLimit(t, 4, 1, 2.5)) end,
getCooldown = function(self, t) return math.floor(self:combatTalentScale(t, 1, 3)) end,
getCooldown = function(self, t) return math.floor(self:combatTalentLimit(t, 5, 1, 3)) end,
proc = function(self, t)
if not self:isTalentCoolingDown(t) then
self:setEffect(self.EFF_BULLSEYE, 2, {src=self, power=self:callTalent(self.T_BULLSEYE, "getSpeed")})
......
......@@ -166,7 +166,7 @@ newTalent{
no_energy = true,
points = 5,
cooldown = 25,
stamina = 50,
stamina = 30,
require = techs_dex_req4,
random_ego = "attack",
tactical = { BUFF = 3 },
......
......@@ -444,8 +444,8 @@ newTalent{
require = techs_dex_req_high3,
fixed_cooldown = true,
getFireDamage = function(self, t) return self:combatTalentPhysicalDamage(t, 10, 100) end,
getPoisonDamage = function(self, t) return self:combatTalentPhysicalDamage(t, 20, 240) end,
getResistPenalty = function(self, t) return math.floor(self:combatTalentLimit(t, 25, 5, 20)) end,
getPoisonDamage = function(self, t) return self:combatTalentPhysicalDamage(t, 20, 250) end,
getResistPenalty = function(self, t) return math.floor(self:combatTalentLimit(t, 35, 10, 25)) end,
info = function(self, t)
local fire = t.getFireDamage(self,t)
local poison = t.getPoisonDamage(self,t)
......
......@@ -229,7 +229,7 @@ newTalent{
tactical = { ESCAPE = 2, DEFEND = 2 },
getDamageReduction = function(self, t) return self:combatTalentLimit(t, 70, 15, 60) end,
getSpeed = function(self, t) return self:combatTalentScale(t, 150, 350) end,
getStamina = function(self, t) return self:combatTalentScale(t, 10, 22) end,
getStamina = function(self, t) return self:combatTalentScale(t, 10, 20) end,
action = function(self, t)
local power = t.getDamageReduction(self,t)
local speed = t.getSpeed(self,t)
......
......@@ -130,31 +130,29 @@ newTalent{
end
return true
end,
getDamage = function(self, t) return math.floor(self:combatTalentScale(t, 5, 20)) end,
getAvoidance = function(self, t) return math.floor(self:combatTalentLimit(t, 30, 10, 22)) end,
getSight = function(self, t) return math.floor(self:combatTalentScale(t, 1, 3, "log")) end,
getRadius = function(self, t) return math.ceil(self:combatTalentLimit(t, 0, 8.9, 4.5)) end,
sustain_lists = "break_with_stealth",
activate = function(self, t)
local ret = {}
self:setEffect(self.EFF_CONCEALMENT, 3, {power=t.getAvoidance(self,t), dam=t.getDamage(self,t), sight=t.getSight(self,t), charges=3})
self:setEffect(self.EFF_CONCEALMENT, 3, {power=t.getAvoidance(self,t), sight=t.getSight(self,t), charges=3})
return ret
end,
deactivate = function(self, t, p)
return true
end,
callbackOnActBase = function(self, t)
self:setEffect(self.EFF_CONCEALMENT, 3, {power=t.getAvoidance(self,t), max_power=t.getAvoidance(self,t)*3, dam=t.getDamage(self,t), sight=t.getSight(self,t), charges=3})
self:setEffect(self.EFF_CONCEALMENT, 3, {power=t.getAvoidance(self,t), max_power=t.getAvoidance(self,t)*3, sight=t.getSight(self,t), charges=3})
end,
info = function(self, t)
local avoid = t.getAvoidance(self,t)*3
local dam = t.getDamage(self,t)
local range = t.getSight(self,t)
local radius = t.getRadius(self,t)
return ([[Enter a concealed sniping stance, increasing our weapon's attack range and vision range by %d, giving all incoming damage a %d%% chance to miss you, and causing your Headshot, Volley and Called Shots to deal %d%% increased damage and behave as if the target was marked.
return ([[Enter a concealed sniping stance, increasing our weapon's attack range and vision range by %d, giving all incoming damage a %d%% chance to miss you, and causing your Headshot, Volley and Called Shots to behave as if the target was marked.
Any non-instant, non-movement action will break concealment, but the increased range and vision and damage avoidance will persist for 3 turns, with the damage avoidance decreasing in power by 33%% each turn.
This requires a bow to use, and cannot be used if there are foes in sight within range %d.]]):
format(range, avoid, dam, radius)
format(range, avoid, radius)
end,
}
......@@ -219,9 +217,9 @@ newTalent{
sustain_stamina = 50,
tactical = { BUFF = 2 },
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent, "bow") end,
getPower = function(self, t) return self:combatScale(self:getTalentLevel(t) * self:getDex(8, true), 4, 0, 54, 50) end,
getPower = function(self, t) return self:combatTalentStatDamage(t, "dex", 15, 50) end,
getSpeed = function(self, t) return math.floor(self:combatTalentLimit(t, 150, 50, 100)) end,
getDamage = function(self, t) return 1 + math.min(math.floor(self:getTalentLevel(t)),6) end, --we really don't want a flat damage bonus like this going up past 35%
getDamage = function(self, t) return self:combatTalentLimit(t, 8, 2, 6) end,
getMarkChance = function(self, t) return math.floor(self:combatTalentScale(t, 2, 10)) end,
sustain_slots = 'archery_stance',
activate = function(self, t)
......@@ -251,7 +249,7 @@ newTalent{
local dam = t.getDamage(self,t)
local mark = t.getMarkChance(self,t)
return ([[Enter a calm, focused stance, increasing physical power and accuracy by %d, projectile speed by %d%% and the chance to mark targets by an additional %d%%.
This makes your shots more effective at range, increasing all damage dealt by %d%% per tile travelled beyond 3, to a maximum of %d%% damage at range 8.
This makes your shots more effective at range, increasing all damage dealt by %0.1f%% per tile travelled beyond 3, to a maximum of %0.1f%% damage at range 8.
The physical power and accuracy increase with your Dexterity.]]):
format(power, speed, mark, dam, dam*5)
end,
......@@ -262,7 +260,7 @@ newTalent{
type = {"technique/sniper", 4},
points = 5,
random_ego = "attack",
stamina = 30,
stamina = 20,
cooldown = 8,
require = techs_dex_req_high4,
range = archery_range,
......