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) ...@@ -2150,7 +2150,7 @@ function _M:onTakeHit(value, src, death_note)
return 0 return 0
end 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 self.turn_procs.phase_shift = true
local nx, ny = util.findFreeGrid(self.x, self.y, 1, true, {[Map.ACTOR]=true}) local nx, ny = util.findFreeGrid(self.x, self.y, 1, true, {[Map.ACTOR]=true})
if nx then if nx then
...@@ -5077,6 +5077,8 @@ local sustainCallbackCheck = { ...@@ -5077,6 +5077,8 @@ local sustainCallbackCheck = {
callbackOnBlock = "talents_on_block", callbackOnBlock = "talents_on_block",
callbackOnChangeLevel = "talents_on_change_level", callbackOnChangeLevel = "talents_on_change_level",
callbackOnEffectSave = "talents_on_effect_save", callbackOnEffectSave = "talents_on_effect_save",
callbackOnPartyAdd = "talents_on_party_add",
callbackOnPartyRemove = "talents_on_party_remove",
} }
_M.sustainCallbackCheck = sustainCallbackCheck _M.sustainCallbackCheck = sustainCallbackCheck
...@@ -5813,6 +5815,7 @@ function _M:getTalentCooldown(t, base) ...@@ -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[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.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) local eff = self:hasEffect(self.EFF_BURNING_HEX)
if eff and not self:attr("talent_reuse") then if eff and not self:attr("talent_reuse") then
......
...@@ -1585,6 +1585,7 @@ function _M:getTextualDesc(compare_with, use_actor) ...@@ -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, "mana_regen", "%+.2f", "Mana each turn: ")
compare_fields(w, compare_with, field, "hate_regen", "%+.2f", "Hate 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, "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, "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, "positive_regen_ref_mod", "%+.2f", "P.Energy each turn: ")
compare_fields(w, compare_with, field, "negative_regen_ref_mod", "%+.2f", "N.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) ...@@ -48,6 +48,12 @@ function _M:addMember(actor, def)
print("[PARTY] error trying to add existing actor: ", actor.uid, actor.name) print("[PARTY] error trying to add existing actor: ", actor.uid, actor.name)
return false return false
end 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 if type(def.control) == "nil" then def.control = "no" end
def.title = def.title or "Party member" def.title = def.title or "Party member"
self.members[actor] = def self.members[actor] = def
...@@ -88,6 +94,7 @@ function _M:removeMember(actor, silent) ...@@ -88,6 +94,7 @@ function _M:removeMember(actor, silent)
end end
return false return false
end end
local olddef = self.members[actor]
table.remove(self.m_list, self.members[actor].index) table.remove(self.m_list, self.members[actor].index)
self.members[actor] = nil self.members[actor] = nil
...@@ -98,6 +105,11 @@ function _M:removeMember(actor, silent) ...@@ -98,6 +105,11 @@ function _M:removeMember(actor, silent)
self.members[self.m_list[i]].index = i self.members[self.m_list[i]].index = i
end 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 -- Notify the UI
game.player.changed = true game.player.changed = true
end end
......
...@@ -347,10 +347,14 @@ end ...@@ -347,10 +347,14 @@ end
--- Try to totally evade an attack --- Try to totally evade an attack
function _M:checkEvasion(target) 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") 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("checkEvasion", evasion, target.level, self.level)
print("=> evasion chance", evasion) print("=> evasion chance", evasion)
return rng.percent(evasion) return rng.percent(evasion)
...@@ -1286,6 +1290,9 @@ function _M:combatArmor() ...@@ -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 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") add = add + self:callTalent(self.T_ARMOUR_OF_SHADOWS,"ArmourBonus")
end 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 if self:knowTalent(self.T_CARBON_SPIKES) and self:isTalentActive(self.T_CARBON_SPIKES) then
add = add + self.carbon_armor add = add + self.carbon_armor
end end
...@@ -1640,7 +1647,7 @@ function _M:getDammod(combat) ...@@ -1640,7 +1647,7 @@ function _M:getDammod(combat)
dammod[stat] = (dammod[stat] or 0) + val dammod[stat] = (dammod[stat] or 0) + val
end 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 if self:knowTalent(self.T_ARCANE_MIGHT) then add('mag', 0.5) end
return dammod return dammod
...@@ -2051,7 +2058,7 @@ function _M:combatMindpower(mod, add) ...@@ -2051,7 +2058,7 @@ function _M:combatMindpower(mod, add)
end end
if self:knowTalent(self.T_SUPERPOWER) then if self:knowTalent(self.T_SUPERPOWER) then
add = add + 50 * self:getStr() / 100 add = add + 60 * self:getStr() / 100
end end
if self:knowTalent(self.T_GESTURE_OF_POWER) then if self:knowTalent(self.T_GESTURE_OF_POWER) then
......
...@@ -62,14 +62,37 @@ local ans = { ...@@ -62,14 +62,37 @@ local ans = {
{"I want to change your talents.", action=change_talents}, {"I want to change your talents.", action=change_talents},
{"I want to change your tactics.", action=change_tactics}, {"I want to change your tactics.", action=change_tactics},
{"I want to take direct control.", action=change_control}, {"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."}, {"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", newChat{ id="welcome",
text = [[#LIGHT_GREEN#*The golem talks in a monotonous voice*#WHITE# text = [[#LIGHT_GREEN#*The golem talks in a monotonous voice*#WHITE#
Yes master.]], Yes master.]],
answers = ans answers = ans
} }
end
return "welcome" return "welcome"
...@@ -556,6 +556,11 @@ newEntity{ base = "BASE_GEM", ...@@ -556,6 +556,11 @@ newEntity{ base = "BASE_GEM",
desc = [[A piece of the scorched wood taken from the remains of Snaproot.]], desc = [[A piece of the scorched wood taken from the remains of Snaproot.]],
cost = 100, cost = 100,
material_level = 4, material_level = 4,
color_attributes = {
damage_type = 'FIRE',
alt_damage_type = 'FLAMESHOCK',
particle = 'flame',
},
identified = false, identified = false,
imbue_powers = { imbue_powers = {
resists = { [DamageType.NATURE] = 25, [DamageType.DARKNESS] = 10, [DamageType.COLD] = 10 }, resists = { [DamageType.NATURE] = 25, [DamageType.DARKNESS] = 10, [DamageType.COLD] = 10 },
...@@ -764,6 +769,11 @@ newEntity{ base = "BASE_STAFF", ...@@ -764,6 +769,11 @@ newEntity{ base = "BASE_STAFF",
inc_damage = {[DamageType.ARCANE] = 35 }, inc_damage = {[DamageType.ARCANE] = 35 },
learn_talent = {[Talents.T_COMMAND_STAFF] = 1 }, 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", newEntity{ base = "BASE_AMULET",
...@@ -966,13 +976,24 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS", ...@@ -966,13 +976,24 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS",
color = colors.WHITE, image = "object/artifact/crystal_focus.png", color = colors.WHITE, image = "object/artifact/crystal_focus.png",
level_range = {5, 12}, level_range = {5, 12},
desc = [[This crystal radiates the power of the Spellblaze itself.]], 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, rarity = 200,
identified = false, identified = false,
cost = 50, cost = 50,
material_level = 2, 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, 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) 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} local oldname = o:getName{do_color=true}
...@@ -1034,6 +1055,27 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS", ...@@ -1034,6 +1055,27 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS",
o.special_combat.block = o.special_combat.block * 1.25 o.special_combat.block = o.special_combat.block * 1.25
end end
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), end),
resolvers.genericlast(function(o) if o.wielder.learn_talent then o.wielder.learn_talent["T_COMMAND_STAFF"] = nil 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, fake_ego = true,
...@@ -1057,7 +1099,7 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS", ...@@ -1057,7 +1099,7 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_FOCUS",
who:sortInven() who:sortInven()
who.changed = true who.changed = true
game.logPlayer(who, "You fix the crystal on the %s and create the %s.", oldname, o:getName{do_color=true}) game.logPlayer(who, "You fix the crystal on the %s and create the %s.", oldname, o:getName{do_color=true})
end) end)
end, end,
...@@ -1072,13 +1114,24 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_HEART", ...@@ -1072,13 +1114,24 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_HEART",
color = colors.RED, image = "object/artifact/crystal_heart.png", color = colors.RED, image = "object/artifact/crystal_heart.png",
level_range = {35, 42}, level_range = {35, 42},
desc = [[This crystal is huge, easily the size of your head. It sparkles brilliantly almost of its own accord.]], 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, rarity = 250,
identified = false, identified = false,
cost = 200, cost = 200,
material_level = 5, 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, 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. -- 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) 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} local oldname = o:getName{do_color=true}
...@@ -1121,6 +1174,27 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_HEART", ...@@ -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 o.wielder.combat_def = ((o.wielder.combat_def or 0) + 2) * 1.7
-- Same for armour. Yay crap cloth! -- Same for armour. Yay crap cloth!
o.wielder.combat_armor = ((o.wielder.combat_armor or 0) + 3) * 1.7 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), end),
} }
game.zone:applyEgo(o, crystalline_ego, "object", true) game.zone:applyEgo(o, crystalline_ego, "object", true)
......
...@@ -314,6 +314,11 @@ newEntity{ base = "BASE_GEM", ...@@ -314,6 +314,11 @@ newEntity{ base = "BASE_GEM",
cost = 200, cost = 200,
quest = 1, quest = 1,
material_level = 5, material_level = 5,
color_attributes = {
damage_type = 'NATURE',
alt_damage_type = 'SPYDRIC_POISON',
particle = 'slime',
},
wielder = { wielder = {
inc_stats = {[Stats.STAT_CON] = 15, }, inc_stats = {[Stats.STAT_CON] = 15, },
healing_factor = 0.3, healing_factor = 0.3,
......
...@@ -707,6 +707,11 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS", ...@@ -707,6 +707,11 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS",
identified = false, identified = false,
cost = 200, cost = 200,
material_level = 5, material_level = 5,
color_attributes = {
damage_type = 'BLIGHT',
alt_damage_type = 'DRAINLIFE',
particle = 'slime',
},
carrier = { carrier = {
lite = 2, lite = 2,
}, },
...@@ -716,6 +721,7 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS", ...@@ -716,6 +721,7 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS",
confusion_immune = 0.3, confusion_immune = 0.3,
fear_immune = 0.3, fear_immune = 0.3,
resists={[DamageType.MIND] = 30,}, resists={[DamageType.MIND] = 30,},
sentient_telos = 1,
}, },
imbue_powers = { 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, }, 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", ...@@ -757,6 +763,28 @@ newEntity{ base = "BASE_GEM", define_as = "GEM_TELOS",
end) end)
return {id=true, used=true} return {id=true, used=true}
end }, 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 -- 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", ...@@ -40,6 +40,11 @@ newEntity{ base = "BASE_GEM",
cost = 200, cost = 200,
identified = false, identified = false,
material_level = 4, material_level = 4,
color_attributes = {
damage_type = 'LIGHTNING',
alt_damage_type = 'LIGHTNING_DAZE',
particle = 'lightning_explosion',
},
wielder = { wielder = {
inc_stats = {[Stats.STAT_DEX] = 8, [Stats.STAT_CUN] = 8 }, inc_stats = {[Stats.STAT_DEX] = 8, [Stats.STAT_CUN] = 8 },
inc_damage = {[DamageType.LIGHTNING] = 20 }, inc_damage = {[DamageType.LIGHTNING] = 20 },
...@@ -327,6 +332,11 @@ newEntity{ base = "BASE_GEM", ...@@ -327,6 +332,11 @@ newEntity{ base = "BASE_GEM",
identified = false, identified = false,
rarity = 250, rarity = 250,
material_level = 3, 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. 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.]], This star is the culmination of their craft. Light radiates from its ever-shifting yellow surface.]],
cost = 400, cost = 400,
...@@ -938,8 +948,17 @@ newEntity{ base = "BASE_CLOTH_ARMOR", ...@@ -938,8 +948,17 @@ newEntity{ base = "BASE_CLOTH_ARMOR",
resists={[DamageType.NATURE] = 30}, resists={[DamageType.NATURE] = 30},
on_melee_hit={[DamageType.POISON] = 20, [DamageType.SLIME] = 20}, 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", newEntity{ base = "BASE_HELM", define_as = "HELM_KROLTAR",
power_source = {technique=true}, power_source = {technique=true},
unique = true, unique = true,
...@@ -1700,7 +1719,7 @@ newEntity{ base = "BASE_MACE", ...@@ -1700,7 +1719,7 @@ newEntity{ base = "BASE_MACE",
unided_name = "a strangely colored bone", unique = true, unided_name = "a strangely colored bone", unique = true,
moddable_tile = "special/%s_club_ureslaks_femur", moddable_tile = "special/%s_club_ureslaks_femur",
moddable_tile_big = true, 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}, level_range = {42, 50},
require = { stat = { str=45, dex=30 }, }, require = { stat = { str=45, dex=30 }, },
rarity = 400, rarity = 400,
...@@ -1762,6 +1781,71 @@ newEntity{ base = "BASE_MACE", ...@@ -1762,6 +1781,71 @@ newEntity{ base = "BASE_MACE",
inc_damage = { all = 12, [DamageType.ARCANE] = 30 }, 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", newEntity{ base = "BASE_WARAXE",
...@@ -1961,47 +2045,6 @@ newEntity{ base = "BASE_AMULET", ...@@ -1961,47 +2045,6 @@ newEntity{ base = "BASE_AMULET",
use_talent = { id = Talents.T_ARCANE_EYE, level = 2, power = 60 }, 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", newEntity{ base = "BASE_DIGGER",
power_source = {technique=true}, power_source = {technique=true},
unique = true, unique = true,
...@@ -4847,6 +4890,11 @@ newEntity{ base = "BASE_GEM", --Thanks SageAcrin and Graziel! ...@@ -4847,6 +4890,11 @@ newEntity{ base = "BASE_GEM", --Thanks SageAcrin and Graziel!
cost = 200, cost = 200,
identified = false, identified = false,
material_level = 3, material_level = 3,
color_attributes = {
damage_type = 'LIGHTNING',
alt_damage_type = 'LIGHTNING_DAZE',
particle = 'lightning_explosion',
},
wielder = { wielder = {
inc_stats = {[Stats.STAT_MAG] = 5, [Stats.STAT_CON] = 5, }, inc_stats = {[Stats.STAT_MAG] = 5, [Stats.STAT_CON] = 5, },
inc_damage = {[DamageType.FIRE] = 10, [DamageType.COLD] = 10, [DamageType.LIGHTNING] = 10, }, inc_damage = {[DamageType.FIRE] = 10, [DamageType.COLD] = 10, [DamageType.LIGHTNING] = 10, },
......
...@@ -33,13 +33,17 @@ newLore{ ...@@ -33,13 +33,17 @@ newLore{
#FIREBRICK#Pain#LAST#. Everywhere, but where is worst... #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. 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{ newLore{
...@@ -57,28 +61,32 @@ newLore{ ...@@ -57,28 +61,32 @@ newLore{
id = "argoniel-2", id = "argoniel-2",
category = "high peak", category = "high peak",
name = "Argoniel's blood-runed athame", 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 it will be
#{italic}#so#{normal}# #{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{ newLore{
id = "elandar-2", id = "elandar-2",
category = "high peak", category = "high peak",
name = "Elandar's journal (2)", 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. 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...? ...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.]], 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 ...@@ -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.]] 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 -- Misc bosses
......
...@@ -104,7 +104,7 @@ newTalent{ ...@@ -104,7 +104,7 @@ newTalent{
return not checkMaxSummon(self, silent) return not checkMaxSummon(self, silent)
end, end,
on_detonate = function(self, t, m) 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) self:project(tg, m.x, m.y, function(px, py)
local target = game.level.map(px, py, Map.ACTOR) local target = game.level.map(px, py, Map.ACTOR)
if not target or self:reactionToward(target) < 0 then return end if not target or self:reactionToward(target) < 0 then return end
......
...@@ -206,6 +206,7 @@ newTalent{ ...@@ -206,6 +206,7 @@ newTalent{
target.dream_plane_on_die = target.on_die target.dream_plane_on_die = target.on_die
target.on_die = function(self, ...) target.on_die = function(self, ...)
self.dream_plane_trapper:removeEffect(self.EFF_DREAMSCAPE) self.dream_plane_trapper:removeEffect(self.EFF_DREAMSCAPE)
self.dream_plane_trapper = nil
local args = {...} local args = {...}
game:onTickEnd(function() game:onTickEnd(function()
if self.dream_plane_on_die then self:dream_plane_on_die(unpack(args)) end if self.dream_plane_on_die then self:dream_plane_on_die(unpack(args)) end
......
...@@ -51,6 +51,7 @@ local function makeGolem(self) ...@@ -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 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, end,
equipdoll = "alchemist_golem", equipdoll = "alchemist_golem",
is_alchemist_golem = 1,
infravision = 10, infravision = 10,
rank = 3, rank = 3,
size_category = 4, size_category = 4,
......
...@@ -228,7 +228,7 @@ newTalent{ ...@@ -228,7 +228,7 @@ newTalent{
self.talents_cd[t.id] = math.max(cooldown - 1, 0) self.talents_cd[t.id] = math.max(cooldown - 1, 0)
end end
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, 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) archery_onhit = function(self, t, target, x, y)
if not target or not target:canBe("knockback") then return end if not target or not target:canBe("knockback") then return end
...@@ -289,9 +289,9 @@ newTalent{ ...@@ -289,9 +289,9 @@ newTalent{
no_energy = true, no_energy = true,
tactical = { BUFF = 2 }, tactical = { BUFF = 2 },
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end, 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, 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, 60))/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, 30, 10, 20)) end, getTurn = function(self, t) return math.floor(self:combatTalentLimit(t, 25, 5, 15)) end,
on_pre_use = function(self, t, silent) on_pre_use = function(self, t, silent)
if not archerPreUse(self, t, silent, "sling") then return false end if not archerPreUse(self, t, silent, "sling") then return false end
return true return true
......
...@@ -90,6 +90,10 @@ newTalent{ ...@@ -90,6 +90,10 @@ newTalent{
self.turn_procs.first_blood_shoot = target.life self.turn_procs.first_blood_shoot = target.life
end end
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, end,
archery_onhit = function(self, t, target, x, y) archery_onhit = function(self, t, target, x, y)
if self:knowTalent(self.T_MASTER_MARKSMAN) then if self:knowTalent(self.T_MASTER_MARKSMAN) then
...@@ -97,8 +101,9 @@ newTalent{ ...@@ -97,8 +101,9 @@ newTalent{
if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end
if target:hasEffect(target.EFF_PIN_DOWN) then if target:hasEffect(target.EFF_PIN_DOWN) then
local eff = target:hasEffect(target.EFF_PIN_DOWN) local eff = target:hasEffect(target.EFF_PIN_DOWN)
chance = chance + eff.mark chance = 100
eff.mark = 0 self.turn_procs.auto_phys_crit = nil
target:removeEffect(target.EFF_PIN_DOWN)
end end
if self.turn_procs.first_blood_shoot then chance = chance + 50 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 if rng.percent(chance) then target:setEffect(target.EFF_MARKED, 5, {src=self}) end
...@@ -202,13 +207,18 @@ newTalent{ ...@@ -202,13 +207,18 @@ newTalent{
self.turn_procs.first_blood_ss = target.life self.turn_procs.first_blood_ss = target.life
end end
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, end,
archery_onhit = function(self, t, target, x, y) archery_onhit = function(self, t, target, x, y)
local chance = t.getChance(self,t) local chance = t.getChance(self,t)
if target:hasEffect(target.EFF_PIN_DOWN) then if target:hasEffect(target.EFF_PIN_DOWN) then
local eff = target:hasEffect(target.EFF_PIN_DOWN) local eff = target:hasEffect(target.EFF_PIN_DOWN)
chance = chance + eff.mark chance = 100
eff.mark = 0 self.turn_procs.auto_phys_crit = nil
target:removeEffect(target.EFF_PIN_DOWN)
end end
if self.turn_procs.first_blood_ss then chance = chance + 50 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 if rng.percent(chance) then target:setEffect(target.EFF_MARKED, 5, {src=self}) end
...@@ -255,7 +265,6 @@ newTalent{ ...@@ -255,7 +265,6 @@ newTalent{
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.0, 1.4) end, 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, 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, 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, on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getChance = function(self,t) getChance = function(self,t)
local chance = 20 local chance = 20
...@@ -266,11 +275,10 @@ newTalent{ ...@@ -266,11 +275,10 @@ newTalent{
return chance return chance
end, end,
archery_onhit = function(self, t, target, x, y) archery_onhit = function(self, t, target, x, y)
if target:canBe("pin") and target:checkHit(self:combatAttack(), target:combatPhysicalResist()) then if target:canBe("pin") then
target:setEffect(target.EFF_PIN_DOWN, t.getDuration(self, t), {power=t.getCritPower(self,t), pin=1, mark=100}) target:setEffect(target.EFF_PINNED, t.getDuration(self, t), {apply_power=self:combatAttack()})
else
target:setEffect(target.EFF_PIN_DOWN, t.getDuration(self, t), {power=t.getCritPower(self,t), pin=0, mark=100})
end end
target:setEffect(target.EFF_PIN_DOWN, t.getDuration(self, t), {src=self})
local chance = t.getChance(self,t) local chance = t.getChance(self,t)
if rng.percent(chance) then target:setEffect(target.EFF_MARKED, 5, {src=self}) end if rng.percent(chance) then target:setEffect(target.EFF_MARKED, 5, {src=self}) end
end, end,
...@@ -287,12 +295,11 @@ newTalent{ ...@@ -287,12 +295,11 @@ newTalent{
local dam = t.getDamage(self,t)*100 local dam = t.getDamage(self,t)*100
local dur = t.getDuration(self,t) local dur = t.getDuration(self,t)
local mark = t.getMarkChance(self,t) local mark = t.getMarkChance(self,t)
local power = t.getCritPower(self,t)
local chance = t.getChance(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. This shot has a 20%% chance to mark the target.
The chance to pin increases with your Accuracy.]]): The chance to pin increases with your Accuracy.]]):
format(dam, dur, mark, power, chance) format(dam, dur, mark, chance)
end, end,
} }
...@@ -316,7 +323,7 @@ newTalent{ ...@@ -316,7 +323,7 @@ newTalent{
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end, 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, 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, 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) getChance = function(self,t)
local chance = 20 local chance = 20
if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end
...@@ -361,7 +368,7 @@ newTalent{ ...@@ -361,7 +368,7 @@ newTalent{
stamina = 15, stamina = 15,
require = techs_dex_req4, require = techs_dex_req4,
range = 0, 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 } }, tactical = { ATTACKAREA = { weapon = 2 }, ESCAPE = { knockback = 2 } },
requires_target = true, requires_target = true,
target = function(self, t) target = function(self, t)
...@@ -370,7 +377,7 @@ newTalent{ ...@@ -370,7 +377,7 @@ newTalent{
end, end,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) 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, 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) getChance = function(self,t)
local chance = 20 local chance = 20
if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end if self:hasEffect(self.EFF_TRUESHOT) then chance = chance * 2 end
...@@ -452,20 +459,16 @@ newTalent{ ...@@ -452,20 +459,16 @@ newTalent{
if self.ai and self.ai == "party_member" then if self.ai and self.ai == "party_member" then
return 0 return 0
elseif self.ai then elseif self.ai then
return 3 return 6
else else
return 3 return 6
end end
end, require = techs_dex_req1, end, require = techs_dex_req1,
range = archery_range, range = archery_range,
requires_target = true, requires_target = true,
tactical = { ATTACK = { weapon = 2 } }, tactical = { ATTACK = { weapon = 2 } },
getDamage = function(self, t) getDamage = function(self, t)
local dam = self:combatTalentWeaponDamage(t, 1.1, 2.4) return self:combatTalentWeaponDamage(t, 1.1, 2.3)
if self:isTalentActive(self.T_CONCEALMENT) then
dam = dam + (dam * self:callTalent(self.T_CONCEALMENT, "getDamage")/100)
end
return dam
end, end,
getApr = function(self, t) return self:getDex(40,true) end, getApr = function(self, t) return self:getDex(40,true) end,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end, on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
...@@ -543,11 +546,7 @@ newTalent{ ...@@ -543,11 +546,7 @@ newTalent{
end, end,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end, on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end,
getDamage = function(self, t) getDamage = function(self, t)
local dam = self:combatTalentWeaponDamage(t, 0.6, 1.4) return 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
end, end,
action = function(self, t) action = function(self, t)
local tg = self:getTalentTarget(t) local tg = self:getTalentTarget(t)
...@@ -629,18 +628,18 @@ newTalent{ ...@@ -629,18 +628,18 @@ newTalent{
requires_target = true, requires_target = true,
tactical = { ATTACK = { weapon = 2 } }, tactical = { ATTACK = { weapon = 2 } },
getDamage = function(self, t) getDamage = function(self, t)
local dam = self:combatTalentWeaponDamage(t, 0.7, 1.5) return 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
end, end,
no_npc_use = true,
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent) end, 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) archery_onhit = function(self, t, target, x, y)
if target:hasEffect(target.EFF_MARKED) then if target:hasEffect(target.EFF_MARKED) then
target:removeEffect(target.EFF_MARKED) 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 end
if not target.turn_procs.called_shot_silence then if not target.turn_procs.called_shot_silence then
target.turn_procs.called_shot_silence = true target.turn_procs.called_shot_silence = true
...@@ -652,14 +651,14 @@ newTalent{ ...@@ -652,14 +651,14 @@ newTalent{
elseif not target.turn_procs.called_shot_disarm then elseif not target.turn_procs.called_shot_disarm then
target.turn_procs.called_shot_disarm = true target.turn_procs.called_shot_disarm = true
if target:canBe("disarm") then 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 else
game.logSeen(target, "%s resists the disarm!", target.name:capitalize()) game.logSeen(target, "%s resists the disarm!", target.name:capitalize())
end end
elseif not target.turn_procs.called_shot_slow then elseif not target.turn_procs.called_shot_slow then
target.turn_procs.called_shot_slow = true target.turn_procs.called_shot_slow = true
if target:canBe("slow") then 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 else
game.logSeen(target, "%s resists the slow!", target.name:capitalize()) game.logSeen(target, "%s resists the slow!", target.name:capitalize())
end end
...@@ -676,13 +675,16 @@ newTalent{ ...@@ -676,13 +675,16 @@ newTalent{
local target = game.level.map(x, y, game.level.map.ACTOR) local target = game.level.map(x, y, game.level.map.ACTOR)
if not target then return nil end if not target then return nil end
local shots=1 local targets = self:archeryAcquireTargets(tg, {x=target.x, y=target.y})
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})
if not targets then return nil end if not targets then return nil end
local dam = t.getDamage(self,t) local dam = t.getDamage(self,t)
self:archeryShoot(targets, t, nil, {mult=dam}) 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 return true
end, end,
...@@ -702,9 +704,9 @@ newTalent{ ...@@ -702,9 +704,9 @@ newTalent{
points = 5, points = 5,
mode = "passive", mode = "passive",
require = techs_dex_req4, 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, 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) proc = function(self, t)
if not self:isTalentCoolingDown(t) then if not self:isTalentCoolingDown(t) then
self:setEffect(self.EFF_BULLSEYE, 2, {src=self, power=self:callTalent(self.T_BULLSEYE, "getSpeed")}) self:setEffect(self.EFF_BULLSEYE, 2, {src=self, power=self:callTalent(self.T_BULLSEYE, "getSpeed")})
......
...@@ -166,7 +166,7 @@ newTalent{ ...@@ -166,7 +166,7 @@ newTalent{
no_energy = true, no_energy = true,
points = 5, points = 5,
cooldown = 25, cooldown = 25,
stamina = 50, stamina = 30,
require = techs_dex_req4, require = techs_dex_req4,
random_ego = "attack", random_ego = "attack",
tactical = { BUFF = 3 }, tactical = { BUFF = 3 },
......
...@@ -444,8 +444,8 @@ newTalent{ ...@@ -444,8 +444,8 @@ newTalent{
require = techs_dex_req_high3, require = techs_dex_req_high3,
fixed_cooldown = true, fixed_cooldown = true,
getFireDamage = function(self, t) return self:combatTalentPhysicalDamage(t, 10, 100) end, getFireDamage = function(self, t) return self:combatTalentPhysicalDamage(t, 10, 100) end,
getPoisonDamage = function(self, t) return self:combatTalentPhysicalDamage(t, 20, 240) end, getPoisonDamage = function(self, t) return self:combatTalentPhysicalDamage(t, 20, 250) end,
getResistPenalty = function(self, t) return math.floor(self:combatTalentLimit(t, 25, 5, 20)) end, getResistPenalty = function(self, t) return math.floor(self:combatTalentLimit(t, 35, 10, 25)) end,
info = function(self, t) info = function(self, t)
local fire = t.getFireDamage(self,t) local fire = t.getFireDamage(self,t)
local poison = t.getPoisonDamage(self,t) local poison = t.getPoisonDamage(self,t)
......
...@@ -229,7 +229,7 @@ newTalent{ ...@@ -229,7 +229,7 @@ newTalent{
tactical = { ESCAPE = 2, DEFEND = 2 }, tactical = { ESCAPE = 2, DEFEND = 2 },
getDamageReduction = function(self, t) return self:combatTalentLimit(t, 70, 15, 60) end, getDamageReduction = function(self, t) return self:combatTalentLimit(t, 70, 15, 60) end,
getSpeed = function(self, t) return self:combatTalentScale(t, 150, 350) 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) action = function(self, t)
local power = t.getDamageReduction(self,t) local power = t.getDamageReduction(self,t)
local speed = t.getSpeed(self,t) local speed = t.getSpeed(self,t)
......
...@@ -130,31 +130,29 @@ newTalent{ ...@@ -130,31 +130,29 @@ newTalent{
end end
return true return true
end, 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, 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, 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, getRadius = function(self, t) return math.ceil(self:combatTalentLimit(t, 0, 8.9, 4.5)) end,
sustain_lists = "break_with_stealth", sustain_lists = "break_with_stealth",
activate = function(self, t) activate = function(self, t)
local ret = {} 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 return ret
end, end,
deactivate = function(self, t, p) deactivate = function(self, t, p)
return true return true
end, end,
callbackOnActBase = function(self, t) 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, end,
info = function(self, t) info = function(self, t)
local avoid = t.getAvoidance(self,t)*3 local avoid = t.getAvoidance(self,t)*3
local dam = t.getDamage(self,t)
local range = t.getSight(self,t) local range = t.getSight(self,t)
local radius = t.getRadius(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. 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.]]): 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, end,
} }
...@@ -219,9 +217,9 @@ newTalent{ ...@@ -219,9 +217,9 @@ newTalent{
sustain_stamina = 50, sustain_stamina = 50,
tactical = { BUFF = 2 }, tactical = { BUFF = 2 },
on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent, "bow") end, 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, 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, getMarkChance = function(self, t) return math.floor(self:combatTalentScale(t, 2, 10)) end,
sustain_slots = 'archery_stance', sustain_slots = 'archery_stance',
activate = function(self, t) activate = function(self, t)
...@@ -251,7 +249,7 @@ newTalent{ ...@@ -251,7 +249,7 @@ newTalent{
local dam = t.getDamage(self,t) local dam = t.getDamage(self,t)
local mark = t.getMarkChance(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%%. 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.]]): The physical power and accuracy increase with your Dexterity.]]):
format(power, speed, mark, dam, dam*5) format(power, speed, mark, dam, dam*5)
end, end,
...@@ -262,7 +260,7 @@ newTalent{ ...@@ -262,7 +260,7 @@ newTalent{
type = {"technique/sniper", 4}, type = {"technique/sniper", 4},
points = 5, points = 5,
random_ego = "attack", random_ego = "attack",
stamina = 30, stamina = 20,
cooldown = 8, cooldown = 8,
require = techs_dex_req_high4, require = techs_dex_req_high4,
range = archery_range, range = archery_range,
......