Skip to content
Snippets Groups Projects
Commit 18f095ac authored by dg's avatar dg
Browse files

slings

git-svn-id: http://svn.net-core.org/repos/t-engine4@360 51575b47-30f0-44d4-a5cc-537603b46e54
parent b5d92dd5
No related branches found
No related tags found
No related merge requests found
......@@ -111,57 +111,59 @@ function _M:archeryShoot(damtype, mult, on_hit, tg, params)
local x, y = self:getTarget(tg)
if not x or not y then return nil end
self:project(tg, x, y, function(tx, ty)
local ammo = ammo
if not params.one_shot then
ammo = self:removeObject(self:getInven("QUIVER"), 1)
if not ammo then return end
end
if params.limit_shots then
if params.limit_shots <= 0 then return end
params.limit_shots = params.limit_shots - 1
end
for i = 1, params.multishots or 1 do
local ammo = ammo
if not params.one_shot then
ammo = self:removeObject(self:getInven("QUIVER"), 1)
if not ammo then return end
end
if params.limit_shots then
if params.limit_shots <= 0 then return end
params.limit_shots = params.limit_shots - 1
end
local target = game.level.map(tx, ty, game.level.map.ACTOR)
if not target then return end
ammo = ammo.combat
damtype = damtype or ammo.damtype or DamageType.PHYSICAL
mult = mult or 1
-- Does the blow connect? yes .. complex :/
local atk, def = self:combatAttack(weapon), target:combatDefense()
local dam, apr, armor = self:combatDamage(ammo), self:combatAPR(ammo), target:combatArmor()
print("[ATTACK] to ", target.name, " :: ", dam, apr, armor, "::", mult)
-- If hit is over 0 it connects, if it is 0 we still have 50% chance
local hitted = false
if self:checkHit(atk, def) then
print("[ATTACK] raw dam", dam, "versus", armor, "with APR", apr)
local dam = math.max(0, dam - math.max(0, armor - apr))
local damrange = self:combatDamageRange(ammo)
dam = rng.range(dam, dam * damrange)
print("[ATTACK] after range", dam)
local crit
dam, crit = self:physicalCrit(dam, ammo)
print("[ATTACK] after crit", dam)
dam = dam * mult
print("[ATTACK] after mult", dam)
if crit then game.logSeen(self, "%s performs a critical stike!", self.name:capitalize()) end
DamageType:get(damtype).projector(self, target.x, target.y, damtype, math.max(0, dam))
game.level.map:particleEmitter(target.x, target.y, 1, "archery")
hitted = true
if on_hit then on_hit(target, target.x, target.y) end
else
game.logSeen(target, "%s misses %s.", self.name:capitalize(), target.name)
end
local target = game.level.map(tx, ty, game.level.map.ACTOR)
if not target then return end
ammo = ammo.combat
damtype = damtype or ammo.damtype or DamageType.PHYSICAL
mult = mult or 1
-- Does the blow connect? yes .. complex :/
local atk, def = self:combatAttack(weapon), target:combatDefense()
local dam, apr, armor = self:combatDamage(ammo), self:combatAPR(ammo), target:combatArmor()
print("[ATTACK] to ", target.name, " :: ", dam, apr, armor, "::", mult)
-- If hit is over 0 it connects, if it is 0 we still have 50% chance
local hitted = false
if self:checkHit(atk, def) then
print("[ATTACK] raw dam", dam, "versus", armor, "with APR", apr)
local dam = math.max(0, dam - math.max(0, armor - apr))
local damrange = self:combatDamageRange(ammo)
dam = rng.range(dam, dam * damrange)
print("[ATTACK] after range", dam)
local crit
dam, crit = self:physicalCrit(dam, ammo)
print("[ATTACK] after crit", dam)
dam = dam * mult
print("[ATTACK] after mult", dam)
if crit then game.logSeen(self, "%s performs a critical stike!", self.name:capitalize()) end
DamageType:get(damtype).projector(self, target.x, target.y, damtype, math.max(0, dam))
game.level.map:particleEmitter(target.x, target.y, 1, "archery")
hitted = true
if on_hit then on_hit(target, target.x, target.y) end
else
game.logSeen(target, "%s misses %s.", self.name:capitalize(), target.name)
end
ret.speed = self:combatSpeed(weapon)
ret.hitted = hitted
end, nil, {type="manathrust"})
ret.speed = self:combatSpeed(weapon)
ret.hitted = hitted
end
end)
print("[SHOOT] speed", ret.speed, "=>", game.energy_to_act * ret.speed)
self:useEnergy(game.energy_to_act * ret.speed)
print("[SHOOT] speed", ret.speed or 1, "=>", game.energy_to_act * (ret.speed or 1))
self:useEnergy(game.energy_to_act * (ret.speed or 1))
-- If we used only one arrow, use it
if params.one_shot then self:removeObject(self:getInven("QUIVER"), 1) end
......
......@@ -24,12 +24,12 @@ newBirthDescriptor{
name = "Archer",
desc = {
"Archer",
"Their most important stats are: Strength and Dexterity",
"Their most important stats are: Dexterity and Strength",
},
stats = { dex=3, str=2, con=1, },
talents_types = {
["technique/archery-training"]={true, 0.3},
["technique/archery-cripple"]={true, 0.3},
["technique/archery-utility"]={true, 0.3},
["technique/archery-bow"]={true, 0.3},
["technique/archery-sling"]={false, 0.1},
["technique/combat-techniques-active"]={true, -0.1},
......@@ -57,12 +57,12 @@ newBirthDescriptor{
name = "Slinger",
desc = {
"Slinger",
"Their most important stats are: Strength and Dexterity",
"Their most important stats are: Dexterity and Cunning",
},
stats = { dex=3, str=2, con=1, },
talents_types = {
["technique/archery-training"]={true, 0.3},
["technique/archery-cripple"]={true, 0.3},
["technique/archery-utility"]={true, 0.3},
["technique/archery-bow"]={false, 0.1},
["technique/archery-sling"]={true, 0.3},
["technique/combat-techniques-active"]={true, -0.1},
......
......@@ -22,7 +22,7 @@ load("/data/general/objects/2hmaces.lua")
load("/data/general/objects/2haxes.lua")
load("/data/general/objects/bows.lua")
--load("/data/general/objects/slings.lua")
load("/data/general/objects/slings.lua")
-- Armours
load("/data/general/objects/shields.lua")
......
newEntity{
define_as = "BASE_SLING",
slot = "MAINHAND",
type = "weapon", subtype="sling",
display = "}", color=colors.UMBER,
encumber = 4,
rarity = 3,
combat = { talented = "sling", },
archery = "sling",
desc = [[Slings are used to shoot peebles at your foes.]],
}
newEntity{ base = "BASE_SLING",
name = "elm sling",
level_range = {1, 10},
require = { stat = { dex=11 }, },
cost = 5,
combat = {
physspeed = 0.8,
},
}
newEntity{ base = "BASE_SLING",
name = "ash sling",
level_range = {10, 20},
require = { stat = { dex=16 }, },
cost = 10,
combat = {
physspeed = 0.8,
},
}
newEntity{ base = "BASE_SLING",
name = "yew sling",
level_range = {20, 30},
require = { stat = { dex=24 }, },
cost = 15,
combat = {
physspeed = 0.8,
},
}
newEntity{ base = "BASE_SLING",
name = "elven-wood sling",
level_range = {30, 40},
require = { stat = { dex=35 }, },
cost = 25,
combat = {
physspeed = 0.8,
},
}
newEntity{ base = "BASE_SLING",
name = "dragonbone sling",
level_range = {40, 50},
require = { stat = { dex=48 }, },
cost = 35,
combat = {
physspeed = 0.8,
},
}
------------------ AMMO -------------------
newEntity{
define_as = "BASE_SHOT",
slot = "QUIVER",
type = "ammo", subtype="shot",
add_name = " (#COMBAT#)",
display = "{", color=colors.UMBER,
encumber = 3,
rarity = 3,
combat = { talented = "sling", damrange = 1.2},
archery_ammo = "sling",
desc = [[Shots are used with slings to pummel your foes to death.]],
generate_stack = resolvers.rngavg(100,200),
stacking = true,
}
newEntity{ base = "BASE_SHOT",
name = "iron shot",
level_range = {1, 10},
require = { stat = { dex=11 }, },
cost = 5,
combat = {
dam = resolvers.rngavg(7,12),
apr = 1,
physcrit = 4,
dammod = {dex=0.7, cun=0.5},
},
}
newEntity{ base = "BASE_SHOT",
name = "steel shot",
level_range = {10, 20},
require = { stat = { dex=16 }, },
cost = 10,
combat = {
dam = resolvers.rngavg(15,22),
apr = 2,
physcrit = 4.5,
dammod = {dex=0.7, cun=0.5},
},
}
newEntity{ base = "BASE_SHOT",
name = "dwarven-steel shot",
level_range = {20, 30},
require = { stat = { dex=24 }, },
cost = 15,
combat = {
dam = resolvers.rngavg(28,37),
apr = 3,
physcrit = 5,
dammod = {dex=0.7, cun=0.5},
},
}
newEntity{ base = "BASE_SHOT",
name = "galvorn shot",
level_range = {30, 40},
require = { stat = { dex=35 }, },
cost = 25,
combat = {
dam = resolvers.rngavg(40,47),
apr = 5,
physcrit = 5.5,
dammod = {dex=0.7, cun=0.5},
},
}
newEntity{ base = "BASE_SHOT",
name = "mithril shot",
level_range = {40, 50},
require = { stat = { dex=48 }, },
cost = 35,
combat = {
dam = resolvers.rngavg(50, 57),
apr = 6,
physcrit = 7,
dammod = {dex=0.7, cun=0.5},
},
}
......@@ -8,3 +8,67 @@ newTalent{
return [[Increases damage with slings.]]
end,
}
newTalent{
name = "Eye Shot",
type = {"technique/archery-sling", 2},
no_energy = true,
points = 5,
cooldown = 8,
stamina = 15,
require = techs_dex_req2,
action = function(self, t)
self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 5, function(target, x, y)
if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 10) and target:canBe("blind") then
target:setEffect(target.EFF_BLINDED, 2 + self:getTalentLevelRaw(t), {})
else
game.logSeen(target, "%s resists!", target.name:capitalize())
end
end)
return true
end,
info = function(self, t)
return ([[You fire a shot to your target's eyes, blinding it for %d turns and doing %d%% damage.]]):format(2 + self:getTalentLevelRaw(t), 100 * (1.2 + self:getTalentLevel(t) / 5))
end,
}
newTalent{
name = "Inertial Shot",
type = {"technique/archery-sling", 3},
no_energy = true,
points = 5,
cooldown = 8,
stamina = 15,
require = techs_dex_req3,
action = function(self, t)
self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 5, function(target, x, y)
if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
target:knockBack(self.x, self.y, 4)
game.logSeen(target, "%s is knocked back!", target.name:capitalize())
else
game.logSeen(target, "%s resists the wave!", target.name:capitalize())
end
end)
return true
end,
info = function(self, t)
return ([[You fire a mighty shot at your target doing %d%% damage and knocking it back.]]):format(100 * (1.2 + self:getTalentLevel(t) / 5))
end,
}
newTalent{
name = "Multishots",
type = {"technique/archery-sling", 4},
no_energy = true,
points = 5,
cooldown = 20,
stamina = 35,
require = techs_dex_req4,
action = function(self, t)
self:archeryShoot(nil, 0.7 + self:getTalentLevel(t) / 5, nil, nil, {multishots=2+self:getTalentLevelRaw(t)/2})
return true
end,
info = function(self, t)
return ([[You fire %d shots at your target, doing %d%% damage with each shots.]]):format(2+self:getTalentLevelRaw(t)/2, 100 * (0.7 + self:getTalentLevel(t) / 5))
end,
}
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment