Skip to content
Snippets Groups Projects
Commit 24f1fa0b authored by dg's avatar dg
Browse files

* helms&caps

* 2haxes
* Minotaur & the Helm of Hammerhand
* fix techniques for rogues&warrior


git-svn-id: http://svn.net-core.org/repos/t-engine4@314 51575b47-30f0-44d4-a5cc-537603b46e54
parent f707d7ea
No related branches found
No related tags found
No related merge requests found
Showing
with 418 additions and 104 deletions
...@@ -261,7 +261,7 @@ function _M:levelup() ...@@ -261,7 +261,7 @@ function _M:levelup()
if not self.fixed_rating then if not self.fixed_rating then
rating = rng.range(math.floor(self.life_rating * 0.5), math.floor(self.life_rating * 1.5)) rating = rng.range(math.floor(self.life_rating * 0.5), math.floor(self.life_rating * 1.5))
end end
self.max_life = self.max_life + rating self.max_life = self.max_life + rating + 5
+ (self:knowTalent(self.T_IMPROVED_HEALTH_I) and 1 or 0) + (self:knowTalent(self.T_IMPROVED_HEALTH_I) and 1 or 0)
+ (self:knowTalent(self.T_IMPROVED_HEALTH_II) and 1 or 0) + (self:knowTalent(self.T_IMPROVED_HEALTH_II) and 1 or 0)
+ (self:knowTalent(self.T_IMPROVED_HEALTH_III) and 1 or 0) + (self:knowTalent(self.T_IMPROVED_HEALTH_III) and 1 or 0)
......
...@@ -7,9 +7,9 @@ function _M:init(t, no_default) ...@@ -7,9 +7,9 @@ function _M:init(t, no_default)
engine.Grid.init(self, t, no_default) engine.Grid.init(self, t, no_default)
end end
function _M:block_move(x, y, e) function _M:block_move(x, y, e, act)
-- Open doors -- Open doors
if self.door_opened then if self.door_opened and act then
game.level.map(x, y, engine.Map.TERRAIN, game.zone.grid_list.DOOR_OPEN) game.level.map(x, y, engine.Map.TERRAIN, game.zone.grid_list.DOOR_OPEN)
return true return true
end end
...@@ -17,7 +17,7 @@ function _M:block_move(x, y, e) ...@@ -17,7 +17,7 @@ function _M:block_move(x, y, e)
end end
function _M:tooltip() function _M:tooltip()
local mx, my = core.mouse.get() -- local mx, my = core.mouse.get()
local tmx, tmy = game.level.map:getMouseTile(mx, my) -- local tmx, tmy = game.level.map:getMouseTile(mx, my)
return tmx.."x"..tmy -- return tmx.."x"..tmy
end end
...@@ -120,19 +120,21 @@ function _M:attackTargetWith(target, weapon, damtype, mult) ...@@ -120,19 +120,21 @@ function _M:attackTargetWith(target, weapon, damtype, mult)
-- Does the blow connect? yes .. complex :/ -- Does the blow connect? yes .. complex :/
local atk, def = self:combatAttack(weapon), target:combatDefense() local atk, def = self:combatAttack(weapon), target:combatDefense()
local dam, apr, armor = self:combatDamage(weapon), self:combatAPR(weapon), target:combatArmor() local dam, apr, armor = self:combatDamage(weapon), self:combatAPR(weapon), target:combatArmor()
print("[ATTACK] with", weapon.name, " to ", target.name, " :: ", dam, apr, armor, "::", mult) 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 -- If hit is over 0 it connects, if it is 0 we still have 50% chance
local hitted = false local hitted = false
if self:checkHit(atk, def) then 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 dam = math.max(0, dam - math.max(0, armor - apr))
local damrange = self:combatDamageRange(weapon) local damrange = self:combatDamageRange(weapon)
dam = rng.range(dam, dam * damrange) dam = rng.range(dam, dam * damrange)
print("[ATTACK] after range", dam) print("[ATTACK] after range", dam)
local crit local crit
dam = dam * mult
dam, crit = self:physicalCrit(dam, weapon) dam, crit = self:physicalCrit(dam, weapon)
print("[ATTACK] after crit", dam) 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 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)) DamageType:get(damtype).projector(self, target.x, target.y, damtype, math.max(0, dam))
hitted = true hitted = true
...@@ -246,7 +248,7 @@ function _M:combatDamage(weapon) ...@@ -246,7 +248,7 @@ function _M:combatDamage(weapon)
if weapon.dammod then if weapon.dammod then
for stat, mod in pairs(weapon.dammod) do for stat, mod in pairs(weapon.dammod) do
if sub_con_to_str and stat == "str" then stat = "cun" end if sub_con_to_str and stat == "str" then stat = "cun" end
add = add + (self:getStat(stat) - 10) * mod add = add + (self:getStat(stat) - 10) * 0.7 * mod
end end
end end
local talented_mod = self:combatCheckTraining(weapon) local talented_mod = self:combatCheckTraining(weapon)
...@@ -256,7 +258,7 @@ end ...@@ -256,7 +258,7 @@ end
--- Gets spellpower --- Gets spellpower
function _M:combatSpellpower(mod) function _M:combatSpellpower(mod)
mod = mod or 1 mod = mod or 1
return (self.combat_spellpower + self:getMag()) * mod return (self.combat_spellpower + self:getMag() * 0.7) * mod
end end
--- Gets spellcrit --- Gets spellcrit
......
...@@ -37,8 +37,8 @@ newBirthDescriptor{ ...@@ -37,8 +37,8 @@ newBirthDescriptor{
talents_types = { talents_types = {
["technique/dualweapon-attack"]={true, 0.3}, ["technique/dualweapon-attack"]={true, 0.3},
["technique/dualweapon-training"]={true, 0.3}, ["technique/dualweapon-training"]={true, 0.3},
["technique/combat-training-active"]={false, 0.3}, ["technique/combat-techniques-active"]={true, 0.3},
["technique/combat-training-passive"]={false, 0.3}, ["technique/combat-techniques-passive"]={true, 0.3},
["technique/weapon-training"]={true, 0.3}, ["technique/weapon-training"]={true, 0.3},
["cunning/stealth"]={true, 0.3}, ["cunning/stealth"]={true, 0.3},
["cunning/traps"]={false, 0.3}, ["cunning/traps"]={false, 0.3},
...@@ -69,8 +69,8 @@ newBirthDescriptor{ ...@@ -69,8 +69,8 @@ newBirthDescriptor{
["spell/conveyance"]={true, 0}, ["spell/conveyance"]={true, 0},
["technique/dualweapon-attack"]={true, 0.2}, ["technique/dualweapon-attack"]={true, 0.2},
["technique/dualweapon-training"]={true, 0.2}, ["technique/dualweapon-training"]={true, 0.2},
["technique/combat-training-active"]={true, 0.2}, ["technique/combat-techniques-active"]={true, 0.3},
["technique/combat-training-passive"]={false, 0.2}, ["technique/combat-techniques-passive"]={true, 0.3},
["technique/weapon-training"]={true, 0.2}, ["technique/weapon-training"]={true, 0.2},
["cunning/stealth"]={false, 0.3}, ["cunning/stealth"]={false, 0.3},
["cunning/survival"]={true, 0.1}, ["cunning/survival"]={true, 0.1},
......
...@@ -35,8 +35,8 @@ newBirthDescriptor{ ...@@ -35,8 +35,8 @@ newBirthDescriptor{
["technique/2hweapon-cripple"]={false, -0.1}, ["technique/2hweapon-cripple"]={false, -0.1},
["technique/dualweapon-attack"]={false, -0.1}, ["technique/dualweapon-attack"]={false, -0.1},
["technique/dualweapon-training"]={false, -0.1}, ["technique/dualweapon-training"]={false, -0.1},
["technique/combat-training-active"]={true, 0.3}, ["technique/combat-techniques-active"]={true, 0.3},
["technique/combat-training-passive"]={true, 0.3}, ["technique/combat-techniques-passive"]={true, 0.3},
["technique/weapon-training"]={true, 0.3}, ["technique/weapon-training"]={true, 0.3},
["cunning/survival"]={true, 0}, ["cunning/survival"]={true, 0},
["cunning/dirty"]={false, 0}, ["cunning/dirty"]={false, 0},
...@@ -72,8 +72,8 @@ newBirthDescriptor{ ...@@ -72,8 +72,8 @@ newBirthDescriptor{
["technique/2hweapon-cripple"]={false, 0.3}, ["technique/2hweapon-cripple"]={false, 0.3},
["technique/dualweapon-attack"]={false, -0.1}, ["technique/dualweapon-attack"]={false, -0.1},
["technique/dualweapon-training"]={false, -0.1}, ["technique/dualweapon-training"]={false, -0.1},
["technique/combat-training-active"]={true, 0.3}, ["technique/combat-techniques-active"]={true, 0.3},
["technique/combat-training-passive"]={true, 0.3}, ["technique/combat-techniques-passive"]={true, 0.3},
["technique/weapon-training"]={true, 0.3}, ["technique/weapon-training"]={true, 0.3},
["cunning/survival"]={true, 0}, ["cunning/survival"]={true, 0},
["cunning/dirty"]={false, 0}, ["cunning/dirty"]={false, 0},
......
newEntity{
define_as = "BASE_BATTLEAXE",
slot = "MAINHAND",
slot_forbid = "OFFHAND",
type = "weapon", subtype="battleaxe",
add_name = " (#COMBAT#)",
display = "/", color=colors.SLATE,
encumber = 3,
rarity = 3,
combat = { talented = "axe", damrange = 1.5 },
desc = [[Massive two-handed battleaxes.]],
twohanded = true,
}
newEntity{ base = "BASE_BATTLEAXE",
name = "iron battleaxe",
level_range = {1, 10},
require = { stat = { str=11 }, },
cost = 5,
combat = {
dam = resolvers.rngavg(6,12),
apr = 1,
physcrit = 4.5,
dammod = {str=1.2},
},
}
newEntity{ base = "BASE_BATTLEAXE",
name = "steel battleaxe",
level_range = {10, 20},
require = { stat = { str=16 }, },
cost = 10,
combat = {
dam = resolvers.rngavg(15,23),
apr = 2,
physcrit = 5,
dammod = {str=1.2},
},
}
newEntity{ base = "BASE_BATTLEAXE",
name = "dwarven-steel battleaxe",
level_range = {20, 30},
require = { stat = { str=24 }, },
cost = 15,
combat = {
dam = resolvers.rngavg(28,35),
apr = 2,
physcrit = 6.5,
dammod = {str=1.2},
},
}
newEntity{ base = "BASE_BATTLEAXE",
name = "galvorn battleaxe",
level_range = {30, 40},
require = { stat = { str=35 }, },
cost = 25,
combat = {
dam = resolvers.rngavg(40,48),
apr = 3,
physcrit = 7.5,
dammod = {str=1.2},
},
}
newEntity{ base = "BASE_BATTLEAXE",
name = "mithril battleaxe",
level_range = {40, 50},
require = { stat = { str=48 }, },
cost = 35,
combat = {
dam = resolvers.rngavg(54, 60),
apr = 4,
physcrit = 8,
dammod = {str=1.2},
},
}
...@@ -27,28 +27,32 @@ newEntity{ ...@@ -27,28 +27,32 @@ newEntity{
wielder = {}, wielder = {},
resolvers.generic(function(e) resolvers.generic(function(e)
local tts = { local tts = {
"physical/2hweapon",
"physical/dualweapon",
"physical/shield",
"physical/weapon-training",
"physical/combat-training",
"cunning/stealth",
"cunning/traps",
"cunning/dirty", "cunning/dirty",
"cunning/stealth",
"cunning/survival",
"spell/arcane",
"spell/fire",
"spell/earth",
"spell/water",
"spell/air", "spell/air",
"spell/arcane",
"spell/conveyance", "spell/conveyance",
"spell/nature",
"spell/meta",
"spell/divination", "spell/divination",
"spell/temporal", "spell/earth",
"spell/phantasm", "spell/fire",
"spell/meta",
"spell/nature",
"spell/necromancy", "spell/necromancy",
"spell/phantasm",
"spell/temporal",
"spell/water",
"technique/2hweapon-cripple",
"technique/2hweapon-offense",
"technique/combat-techniques-active",
"technique/combat-techniques-passive",
"technique/combat-training",
"technique/dualweapon-attack",
"technique/dualweapon-training",
"technique/shield-defense",
"technique/shield-offense",
} }
local tt = tts[rng.range(1, #tts)] local tt = tts[rng.range(1, #tts)]
......
local Talents = require "engine.interface.ActorTalents"
newEntity{
define_as = "BASE_HEAVY_BOOTS",
slot = "HEAD",
type = "armor", subtype="feet",
display = "]", color=colors.SLATE,
require = { talent = { Talents.T_HEAVY_ARMOUR_TRAINING }, },
encumber = 3,
rarity = 7,
desc = [[Heavy boots, with metal strips at the toes, heels and other vulnerable parts, to better protect the wearer's feet from harm.]],
}
newEntity{ base = "BASE_HEAVY_BOOTS",
name = "pair of iron boots",
level_range = {1, 20},
cost = 5,
wielder = {
combat_armor = 3,
fatigue = 2,
},
}
newEntity{ base = "BASE_HEAVY_BOOTS",
name = "pair of dwarven-steel boots",
level_range = {20, 40},
cost = 7,
wielder = {
combat_armor = 4,
fatigue = 3,
},
}
newEntity{ base = "BASE_HEAVY_BOOTS",
name = "pair of mithril boots",
level_range = {40, 50},
cost = 10,
wielder = {
combat_armor = 5,
fatigue = 4,
},
}
local Talents = require "engine.interface.ActorTalents"
newEntity{
define_as = "BASE_HELM",
slot = "HEAD",
type = "armor", subtype="head",
display = "]", color=colors.SLATE,
require = { talent = { Talents.T_HEAVY_ARMOUR_TRAINING }, },
encumber = 3,
rarity = 7,
desc = [[A large helmet that can protect the entire head. Ventilation and bad vision can be a problem, however.]],
}
newEntity{ base = "BASE_HELM",
name = "iron helm",
level_range = {1, 20},
cost = 5,
wielder = {
combat_armor = 3,
fatigue = 5,
},
}
newEntity{ base = "BASE_HELM",
name = "dwarven-steel helm",
level_range = {20, 40},
cost = 7,
wielder = {
combat_armor = 4,
fatigue = 4,
},
}
newEntity{ base = "BASE_HELM",
name = "mithril helm",
level_range = {40, 50},
cost = 10,
wielder = {
combat_armor = 5,
fatigue = 5,
},
}
newEntity{
define_as = "BASE_LEATHER_BOOT",
slot = "BODY",
type = "armor", subtype="feet",
display = "]", color=colors.UMBER,
encumber = 2,
rarity = 6,
desc = [[A pair of boots made of leather.]],
}
newEntity{ base = "BASE_LEATHER_BOOT",
name = "pair of rough leather boots",
level_range = {1, 20},
cost = 2,
wielder = {
combat_armor = 1,
fatigue = 1,
},
}
newEntity{ base = "BASE_LEATHER_BOOT",
name = "pair of hardened leather boots",
level_range = {20, 40},
cost = 4,
wielder = {
combat_armor = 3,
fatigue = 3,
},
}
newEntity{ base = "BASE_LEATHER_BOOT",
name = "pair of drakeskin leather boots",
level_range = {40, 50},
cost = 7,
wielder = {
combat_armor = 5,
fatigue = 5,
},
}
newEntity{
define_as = "BASE_LEATHER_CAP",
slot = "BODY",
type = "armor", subtype="head",
display = "]", color=colors.UMBER,
encumber = 2,
rarity = 6,
desc = [[A cap made of leather.]],
}
newEntity{ base = "BASE_LEATHER_CAP",
name = "rough leather cap",
level_range = {1, 20},
cost = 2,
wielder = {
combat_armor = 1,
fatigue = 1,
},
}
newEntity{ base = "BASE_LEATHER_CAP",
name = "hardened leather cap",
level_range = {20, 40},
cost = 4,
wielder = {
combat_armor = 3,
fatigue = 3,
},
}
newEntity{ base = "BASE_LEATHER_CAP",
name = "drakeskin leather cap",
level_range = {40, 50},
cost = 7,
wielder = {
combat_armor = 5,
fatigue = 5,
},
}
...@@ -10,12 +10,16 @@ load("/data/general/objects/jewelry.lua") ...@@ -10,12 +10,16 @@ load("/data/general/objects/jewelry.lua")
-- Weapons -- Weapons
load("/data/general/objects/staves.lua") load("/data/general/objects/staves.lua")
load("/data/general/objects/knifes.lua")
load("/data/general/objects/swords.lua") load("/data/general/objects/swords.lua")
load("/data/general/objects/2hswords.lua") load("/data/general/objects/2hswords.lua")
load("/data/general/objects/knifes.lua")
--load("/data/general/objects/maces.lua") --load("/data/general/objects/maces.lua")
load("/data/general/objects/2hmaces.lua") load("/data/general/objects/2hmaces.lua")
--load("/data/general/objects/axes.lua") --load("/data/general/objects/axes.lua")
load("/data/general/objects/2haxes.lua")
-- Armours -- Armours
load("/data/general/objects/shields.lua") load("/data/general/objects/shields.lua")
...@@ -24,5 +28,12 @@ load("/data/general/objects/light-armors.lua") ...@@ -24,5 +28,12 @@ load("/data/general/objects/light-armors.lua")
load("/data/general/objects/heavy-armors.lua") load("/data/general/objects/heavy-armors.lua")
load("/data/general/objects/massive-armors.lua") load("/data/general/objects/massive-armors.lua")
-- Head, feet, hands, ...
load("/data/general/objects/leather-caps.lua")
load("/data/general/objects/helms.lua")
load("/data/general/objects/leather-boots.lua")
load("/data/general/objects/heavy-boots.lua")
--load("/data/general/objects/gloves.lua")
-- Artifacts -- Artifacts
load("/data/general/objects/world-artifacts.lua") load("/data/general/objects/world-artifacts.lua")
...@@ -17,7 +17,7 @@ newEntity{ base = "BASE_SCROLL", ...@@ -17,7 +17,7 @@ newEntity{ base = "BASE_SCROLL",
cost = 1, cost = 1,
use_simple = { name="light up the surrounding area", use = function(self, who) use_simple = { name="light up the surrounding area", use = function(self, who)
who:project({type="ball", range=0, friendlyfire=false, radius=15}, self.x, self.y, DamageType.LIGHT, 1) who:project({type="ball", range=0, friendlyfire=false, radius=15}, who.x, who.y, DamageType.LIGHT, 1)
game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName()) game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
return "destroy", true return "destroy", true
end} end}
...@@ -109,8 +109,8 @@ newEntity{ base = "BASE_SCROLL", ...@@ -109,8 +109,8 @@ newEntity{ base = "BASE_SCROLL",
cost = 5, cost = 5,
use_simple = { name="detect enemies within a certain range", use = function(self, who) use_simple = { name="detect enemies within a certain range", use = function(self, who)
local rad = 15 + self:getMag(20) local rad = 15 + who:getMag(20)
self:setEffect(self.EFF_SENSE, 2, { who:setEffect(who.EFF_SENSE, 2, {
range = rad, range = rad,
actor = 1, actor = 1,
}) })
......
local Stats = require "engine.interface.ActorStats"
-- This file describes artifact not bound to a special location, they can be found anywhere -- This file describes artifact not bound to a special location, they can be found anywhere
newEntity{ newEntity{ base = "BASE_STAFF",
unique = true, unique = true,
slot = "MAINHAND",
type = "weapon", subtype="staff",
name = "Staff of Destruction", name = "Staff of Destruction",
unided_name = "ash staff", unided_name = "ash staff",
level_range = {20, 25}, level_range = {20, 25},
display = "\\", color=colors.VIOLET, color=colors.VIOLET,
encumber = 6,
rarity = 100, rarity = 100,
desc = [[This unique looking staff is carved with runes of destruction.]], desc = [[This unique looking staff is carved with runes of destruction.]],
cost = 5000, cost = 5000,
...@@ -24,37 +23,88 @@ newEntity{ ...@@ -24,37 +23,88 @@ newEntity{
}, },
} }
newEntity{ newEntity{ base = "BASE_RING",
unique = true,
name = "Ring of Ulmo", color = colors.LIGHT_BLUE,
unided_name = "sea-blue ring",
desc = [[This azure ring seems to be always moist to the touch.]],
level_range = {10, 20},
rarity = 150,
cost = 5000,
max_power = 60, power_regen = 1,
use_power = { name = "summon a tidal wave", power = 60,
use = function(self, who)
local duration = 7
local radius = 1
local dam = 20
-- Add a lasting map effect
game.level.map:addEffect(who,
who.x, who.y, duration,
DamageType.WAVE, dam,
radius,
5, nil,
engine.Entity.new{alpha=100, display='', color_br=30, color_bg=60, color_bb=200},
function(e)
e.radius = e.radius + 1
end,
false
)
game.logSeen(who, "%s brandishes the %s, calling forth the might of the oceans!", who.name:capitalize(), self:getName())
end
},
wielder = {
inc_stats = { [Stats.STAT_WIL] = 4, [Stats.STAT_CON] = 3 },
max_mana = 20,
max_stamina = 20,
resists = {
[DamageType.COLD] = 25,
[DamageType.NATURE] = 10,
},
},
}
newEntity{ base = "BASE_LITE",
unique = true, unique = true,
slot = "LITE",
type = "jewelry", subtype="lite",
name = "Phial of Galadriel", name = "Phial of Galadriel",
unided_name = "glowing phial", unided_name = "glowing phial",
level_range = {1, 10}, level_range = {1, 10},
display = "~", color=colors.YELLOW, color=colors.YELLOW,
encumber = 1, encumber = 1,
rarity = 100, rarity = 100,
desc = [[A small crystal phial, with the light of Earendil's Star contained inside. Its light is imperishable, and near it darkness cannot endure.]], desc = [[A small crystal phial, with the light of Earendil's Star contained inside. Its light is imperishable, and near it darkness cannot endure.]],
cost = 2000, cost = 2000,
max_power = 15, power_regen = 1,
use_power = { name = "call light", power = 10,
use = function(self, who)
who:project({type="ball", range=0, friendlyfire=false, radius=20}, who.x, who.y, DamageType.LIGHT, 1)
game.logSeen(who, "%s brandishes the %s and banishes all shadows!", who.name:capitalize(), self:getName())
end
},
wielder = { wielder = {
lite = 4, lite = 4,
}, },
} }
newEntity{ newEntity{ base = "BASE_LITE",
unique = true, unique = true,
slot = "LITE",
type = "jewlery", subtype="lite",
name = "Arkenstone of Thrain", name = "Arkenstone of Thrain",
unided_name = "great jewel", unided_name = "great jewel",
level_range = {20, 30}, level_range = {20, 30},
display = "~", color=colors.YELLOW, color=colors.YELLOW,
encumber = 1, encumber = 1,
rarity = 250, rarity = 250,
desc = [[A great globe seemingly filled with moonlight, the famed Heart of the Mountain, which splinters the light that falls upon it into a thousand glowing shards.]], desc = [[A great globe seemingly filled with moonlight, the famed Heart of the Mountain, which splinters the light that falls upon it into a thousand glowing shards.]],
cost = 4000, cost = 4000,
max_power = 150, power_regen = 1,
use_power = { name = "map surroundings", power = 100,
use = function(self, who)
who:magicMap(20)
game.logSeen(who, "%s brandishes the %s which glitters in all directions!", who.name:capitalize(), self:getName())
end
},
wielder = { wielder = {
lite = 5, lite = 5,
}, },
......
...@@ -123,7 +123,7 @@ newTalent{ ...@@ -123,7 +123,7 @@ newTalent{
end end
self.combat_physcrit = self.combat_physcrit + 100 self.combat_physcrit = self.combat_physcrit + 100
local speed, hit = self:attackTargetWith(target, weapon.combat, nil, 2 + self:getTalentLevel(t) / 5) local speed, hit = self:attackTargetWith(target, weapon.combat, nil, 1.4 + self:getTalentLevel(t) / 6)
if self:getTalentLevel(t) >= 4 then if self:getTalentLevel(t) >= 4 then
self.combat_dam = self.combat_dam - inc self.combat_dam = self.combat_dam - inc
...@@ -145,7 +145,7 @@ newTalent{ ...@@ -145,7 +145,7 @@ newTalent{
end, end,
info = function(self, t) info = function(self, t)
return ([[Tries to perform a killing blow doing %d%% weapon damage, granting automatic critical hit. If the target ends up with low enough life it might be instantly killed. return ([[Tries to perform a killing blow doing %d%% weapon damage, granting automatic critical hit. If the target ends up with low enough life it might be instantly killed.
At level 4 it drains all remaining stamina and uses it to increase the blow damage.]]):format(100 * (2 + self:getTalentLevel(t) / 5)) At level 4 it drains all remaining stamina and uses it to increase the blow damage.]]):format(100 * (1.4 + self:getTalentLevel(t) / 6))
end, end,
} }
...@@ -170,7 +170,7 @@ newTalent{ ...@@ -170,7 +170,7 @@ newTalent{
local x, y, target = self:getTarget(tg) local x, y, target = self:getTarget(tg)
if not x or not y or not target then return nil end if not x or not y or not target then return nil end
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
local speed, hit = self:attackTargetWith(target, weapon.combat, nil, 1.5 + self:getTalentLevel(t) / 10) local speed, hit = self:attackTargetWith(target, weapon.combat, nil, 1.2 + self:getTalentLevel(t) / 10)
-- Try to stun ! -- Try to stun !
if hit then if hit then
...@@ -184,7 +184,7 @@ newTalent{ ...@@ -184,7 +184,7 @@ newTalent{
return true return true
end, end,
info = function(self, t) info = function(self, t)
return ([[Hits the target with your weapon doing %d%% damage, if the atatck hits, the target is stunned.]]):format(100 * (1.5 + self:getTalentLevel(t) / 10)) return ([[Hits the target with your weapon doing %d%% damage, if the atatck hits, the target is stunned.]]):format(100 * (1.2 + self:getTalentLevel(t) / 10))
end, end,
} }
...@@ -278,7 +278,7 @@ newTalent{ ...@@ -278,7 +278,7 @@ newTalent{
local x, y, target = self:getTarget(tg) local x, y, target = self:getTarget(tg)
if not x or not y or not target then return nil end if not x or not y or not target then return nil end
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
local speed, hit = self:attackTargetWith(target, weapon.combat, nil, 2 + self:getTalentLevel(t) / 10) local speed, hit = self:attackTargetWith(target, weapon.combat, nil, 1.4 + self:getTalentLevel(t) / 10)
-- Try to stun ! -- Try to stun !
if hit then if hit then
...@@ -292,6 +292,6 @@ newTalent{ ...@@ -292,6 +292,6 @@ newTalent{
return true return true
end, end,
info = function(self, t) info = function(self, t)
return ([[Hits the target with a mighty blow to the legs doing %d%% weapon damage, if the attack hits, the target is unable to move for %d turns.]]):format(100 * (2 + self:getTalentLevel(t) / 10), 2+self:getTalentLevel(t)) return ([[Hits the target with a mighty blow to the legs doing %d%% weapon damage, if the attack hits, the target is unable to move for %d turns.]]):format(100 * (1.4 + self:getTalentLevel(t) / 10), 2+self:getTalentLevel(t))
end, end,
} }
...@@ -101,7 +101,7 @@ newTalent{ ...@@ -101,7 +101,7 @@ newTalent{
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
-- First attack with offhand -- First attack with offhand
local speed, hit = self:attackTargetWith(target, offweapon.combat, nil, 1.8 + self:getTalentLevel(t) / 10) local speed, hit = self:attackTargetWith(target, offweapon.combat, nil, 1.2 + self:getTalentLevel(t) / 10)
-- Second attack with mainhand -- Second attack with mainhand
if hit then if hit then
...@@ -112,13 +112,13 @@ newTalent{ ...@@ -112,13 +112,13 @@ newTalent{
end end
-- Attack after the stun, to benefit from backstabs -- Attack after the stun, to benefit from backstabs
self:attackTargetWith(target, weapon.combat, nil, 1.8 + self:getTalentLevel(t) / 10) self:attackTargetWith(target, weapon.combat, nil, 1.2 + self:getTalentLevel(t) / 10)
end end
return true return true
end, end,
info = function(self, t) info = function(self, t)
return ([[Hit wit your offhand weapon for %d%% damage, if the attack hits the target is stunned and you hit it with your mainhand weapon.]]):format(100 * (1.8 + self:getTalentLevel(t) / 10)) return ([[Hit wit your offhand weapon for %d%% damage, if the attack hits the target is stunned and you hit it with your mainhand weapon.]]):format(100 * (1.2 + self:getTalentLevel(t) / 10))
end, end,
} }
...@@ -140,14 +140,14 @@ newTalent{ ...@@ -140,14 +140,14 @@ newTalent{
local x, y, target = self:getTarget(tg) local x, y, target = self:getTarget(tg)
if not x or not y or not target then return nil end if not x or not y or not target then return nil end
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
self:attackTarget(target, nil, 1.8 + self:getTalentLevel(t) / 10, true) self:attackTarget(target, nil, 0.8 + self:getTalentLevel(t) / 10, true)
self:attackTarget(target, nil, 1.8 + self:getTalentLevel(t) / 10, true) self:attackTarget(target, nil, 0.8 + self:getTalentLevel(t) / 10, true)
self:attackTarget(target, nil, 1.8 + self:getTalentLevel(t) / 10, true) self:attackTarget(target, nil, 0.8 + self:getTalentLevel(t) / 10, true)
return true return true
end, end,
info = function(self, t) info = function(self, t)
return ([[Lashes out a flurry of blows, hitting your target three times with each weapons for %d%% damage.]]):format(100 * (1.8 + self:getTalentLevel(t) / 10)) return ([[Lashes out a flurry of blows, hitting your target three times with each weapons for %d%% damage.]]):format(100 * (0.8 + self:getTalentLevel(t) / 10))
end, end,
} }
...@@ -196,7 +196,7 @@ newTalent{ ...@@ -196,7 +196,7 @@ newTalent{
end, end,
info = function(self, t) info = function(self, t)
return ([[Attack your foes in a frontal arc doing %d%% weapon damage and making your targets bleed for %d each turn for %d turns.]]): return ([[Attack your foes in a frontal arc doing %d%% weapon damage and making your targets bleed for %d each turn for %d turns.]]):
format(100 * (1.4 + self:getTalentLevel(t) / 10), self:getDex() * 0.5, 3 + self:getTalentLevel(t)) format(100 * (1.2 + self:getTalentLevel(t) / 10), self:getDex() * 0.5, 3 + self:getTalentLevel(t))
end, end,
} }
......
...@@ -12,7 +12,7 @@ newTalent{ ...@@ -12,7 +12,7 @@ newTalent{
action = function(self, t) action = function(self, t)
local shield = self:hasShield() local shield = self:hasShield()
if not shield then if not shield then
game.logPlayer(self, "You cannot use Shield Bash without a shield!") game.logPlayer(self, "You cannot use Shield Pummel without a shield!")
return nil return nil
end end
...@@ -71,11 +71,11 @@ newTalent{ ...@@ -71,11 +71,11 @@ newTalent{
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
-- First attack with weapon -- First attack with weapon
self:attackTarget(target, nil, 1.5 + self:getTalentLevel(t) / 10, true) self:attackTarget(target, nil, 0.8 + self:getTalentLevel(t) / 10, true)
-- Second attack with shield -- Second attack with shield
self:attackTargetWith(target, shield.special_combat, nil, 1.5 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10) self:attackTargetWith(target, shield.special_combat, nil, 0.8 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10)
-- Third attack with shield -- Third attack with shield
local speed, hit = self:attackTargetWith(target, shield.special_combat, nil, 1.5 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE)) / 10) local speed, hit = self:attackTargetWith(target, shield.special_combat, nil, 0.8 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE)) / 10)
-- Try to stun ! -- Try to stun !
if hit then if hit then
...@@ -90,7 +90,7 @@ newTalent{ ...@@ -90,7 +90,7 @@ newTalent{
end, end,
info = function(self, t) info = function(self, t)
return ([[Hits the target with your weapon and two shield strikes doing %d%% damage, trying to overpower your target. return ([[Hits the target with your weapon and two shield strikes doing %d%% damage, trying to overpower your target.
If the last attack hits, the target is knocked back.]]):format(100 * (1.5 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10)) If the last attack hits, the target is knocked back.]]):format(100 * (0.8 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10))
end, end,
} }
...@@ -114,13 +114,13 @@ newTalent{ ...@@ -114,13 +114,13 @@ newTalent{
if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end
-- First attack with shield -- First attack with shield
local speed, hit = self:attackTargetWith(target, shield.special_combat, nil, 1.8 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10) local speed, hit = self:attackTargetWith(target, shield.special_combat, nil, 1 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10)
-- Second & third attack with weapon -- Second & third attack with weapon
if hit then if hit then
self.combat_physcrit = self.combat_physcrit + 1000 self.combat_physcrit = self.combat_physcrit + 1000
self:attackTarget(target, nil, 1.8 + self:getTalentLevel(t) / 10, true) self:attackTarget(target, nil, 1 + self:getTalentLevel(t) / 10, true)
self:attackTarget(target, nil, 1.8 + self:getTalentLevel(t) / 10, true) self:attackTarget(target, nil, 1 + self:getTalentLevel(t) / 10, true)
self.combat_physcrit = self.combat_physcrit - 1000 self.combat_physcrit = self.combat_physcrit - 1000
end end
...@@ -128,7 +128,7 @@ newTalent{ ...@@ -128,7 +128,7 @@ newTalent{
end, end,
info = function(self, t) info = function(self, t)
return ([[Hits the target with shield doing %d%% damage. If it hits you follow up with 2 weapon strikes which are automatic crits.]]): return ([[Hits the target with shield doing %d%% damage. If it hits you follow up with 2 weapon strikes which are automatic crits.]]):
format(100 * (1.8 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10)) format(100 * (1 + (self:getTalentLevel(t) + self:getTalentLevel(self.T_SHIELD_EXPERTISE) / 2) / 10))
end, end,
} }
......
load("/data/general/npcs/vermin.lua") load("/data/general/npcs/vermin.lua")
load("/data/general/npcs/rodent.lua")
load("/data/general/npcs/canine.lua") load("/data/general/npcs/canine.lua")
load("/data/general/npcs/troll.lua")
load("/data/general/npcs/snake.lua") load("/data/general/npcs/snake.lua")
load("/data/general/npcs/ooze.lua") load("/data/general/npcs/ooze.lua")
load("/data/general/npcs/jelly.lua") load("/data/general/npcs/jelly.lua")
local Talents = require("engine.interface.ActorTalents") local Talents = require("engine.interface.ActorTalents")
-- The boss of trollshaws, no "rarity" field means it will not be randomly generated -- The boss of the maze, no "rarity" field means it will not be randomly generated
newEntity{ define_as = "TROLL_BILL", newEntity{ define_as = "MINOTAUR_MAZE",
type = "giant", subtype = "troll", unique = true, type = "giant", subtype = "minotaur", unique = true,
name = "Bill the Stone Troll", name = "Minotaur of the Labyrinth",
display = "T", color=colors.VIOLET, display = "H", color=colors.VIOLET,
desc = [[Big, brawny, powerful and with a taste for hobbit. He has friends called Bert and Tom. desc = [[A fearsome bull-headed monster, he swings a mighty axe as he curses all that defy him.]],
He is wielding a small tree trunk and towering toward you. level_range = {12, 18}, exp_worth = 2,
He should have turned to stone long ago, how could he still walk?!]],
level_range = {7, 10}, exp_worth = 2,
max_life = 250, life_rating = 17, fixed_rating = true, max_life = 250, life_rating = 17, fixed_rating = true,
max_stamina = 85, max_stamina = 200,
stats = { str=25, dex=10, cun=8, mag=10, con=20 }, stats = { str=25, dex=10, cun=8, mag=20, wil=20, con=20 },
body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 }, body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
equipment = resolvers.equip{ {type="weapon", subtype="greatmaul", defined="GREATMAUL_BILL_TRUNK"}, }, equipment = resolvers.equip{
drops = resolvers.drops{chance=100, nb=3, {ego_chance=100} }, {type="weapon", subtype="battleaxe"},
{type="armor", subtype="head", defined="HELM_OF_HAMMERHAND"},
},
drops = resolvers.drops{chance=100, nb=5, {ego_chance=100} },
talents = resolvers.talents{ talents = resolvers.talents{
[Talents.T_STAMINA_POOL]=1, [Talents.T_STUN]=2, [Talents.T_KNOCKBACK]=1, [Talents.T_STAMINA_POOL]=1,
[Talents.T_WARSHOUT]=1,
[Talents.T_STUNNING_BLOW]=1,
[Talents.T_SUNDER_ARMOUR]=1,
[Talents.T_SUNDER_ARMS]=1,
[Talents.T_CRUSH]=1,
}, },
autolevel = "warrior", autolevel = "warrior",
ai = "dumb_talented_simple", ai_state = { talent_in=4, }, ai = "dumb_talented_simple", ai_state = { talent_in=1, },
} }
load("/data/general/objects/objects.lua") load("/data/general/objects/objects.lua")
-- Artifact, droped (and used!) by Bill the Stone Troll local Stats = require"engine.interface.ActorStats"
newEntity{ base = "BASE_GREATMAUL", -- Artifact, droped (and used!) by the Minautaur
define_as = "GREATMAUL_BILL_TRUNK", newEntity{ base = "BASE_HELM",
name = "Bill's Tree Trunk", unique=true, define_as = "HELM_OF_HAMMERHAND",
require = { stat = { str=25 }, }, name = "Steel Helm of Hammerhand", unique=true,
cost = 5, desc = [[A great helm as steady as the heroes of the Westdike. Mighty were the blows of Helm, the Hammerhand!]],
combat = { require = { level=11, },
dam = 30, cost = 20,
apr = 7,
physcrit = 1.5,
dammod = {str=1.3},
damrange = 1.7,
},
wielder = { wielder = {
combat_armor = 3,
fatigue = 8,
inc_stats = { [Stats.STAT_STR] = 3, [Stats.STAT_CON] = 3, [Stats.STAT_WIL] = 4 },
combat_physresist = 7,
combat_mentalresist = 7,
combat_spellresist = 7,
}, },
} }
...@@ -19,7 +19,7 @@ return { ...@@ -19,7 +19,7 @@ return {
class = "engine.generator.actor.Random", class = "engine.generator.actor.Random",
nb_npc = {20, 30}, nb_npc = {20, 30},
adjust_level = {-1, 2}, adjust_level = {-1, 2},
guardian = "TROLL_BILL", guardian = "MINOTAUR_MAZE",
}, },
object = { object = {
class = "engine.generator.object.Random", class = "engine.generator.object.Random",
......
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