PK
A data/UT #P#Pux d PK
A data/birth/UT #P#Pux d PK
A+w
data/birth/wilder.luaUT #P#Pux d -- ToME - Tales of Maj'Eyal:
-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see .
--
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org
getBirthDescriptor("class", "Wilder").descriptor_choices.subclass["Stone Warden"] = "allow"
newBirthDescriptor{
type = "subclass",
name = "Stone Warden",
desc = {
"Stone Wardens are dwarves trained in both the eldritch arts and the worship of nature.",
"While other races are stuck in their belief that arcane forces and natural forces are meant to oppose, dwarves have found a way to combine them in harmony.",
"Stone Wardens are armoured fighters, dual wielding shields to channel many of their powers.",
"#GOLD#Stat modifiers:",
"#LIGHT_BLUE# * +2 Strength, +0 Dexterity, +0 Constitution",
"#LIGHT_BLUE# * +4 Magic, +3 Willpower, +0 Cunning",
},
special_check = function(birth)
if birth.descriptors_by_type.race ~= "Dwarf" then return false end
return true
end,
power_source = {nature=true, arcane=true},
not_on_random_boss = true,
stats = { str=2, wil=3, mag=4, },
talents_types = {
["wild-gift/call"]={true, 0.2},
["wild-gift/earthen-power"]={true, 0.3},
["wild-gift/earthen-vines"]={true, 0.3},
["wild-gift/dwarven-nature"]={true, 0.3},
["spell/stone-alchemy"]={false, 0.3},
["spell/eldritch-stone"]={false, 0.3},
["spell/eldritch-shield"]={true, 0.3},
["spell/deeprock"]={false, 0.3},
["spell/earth"]={true, 0.2},
["spell/stone"]={false, 0.2},
["cunning/survival"]={true, 0},
["technique/combat-training"]={true, 0},
},
talents = {
[ActorTalents.T_STONE_VINES] = 1,
[ActorTalents.T_STONESHIELD] = 1,
[ActorTalents.T_ELDRITCH_BLOW] = 1,
[ActorTalents.T_ARMOUR_TRAINING] = 3,
[ActorTalents.T_WEAPON_COMBAT] = 1,
},
copy = {
max_life = 110,
resolvers.equip{ id=true,
{type="armor", subtype="shield", name="iron shield", autoreq=true, ego_chance=-1000, ego_chance=-1000},
{type="armor", subtype="shield", name="iron shield", autoreq=true, ego_chance=-1000, ego_chance=-1000},
{type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000}
},
},
copy_add = {
life_rating = 2,
},
}
PK
A
data/talents/UT #P#Pux d PK
A data/talents/spells/UT #P#Pux d PK
A_ data/talents/spells/spells.luaUT #P#Pux d -- ToME - Tales of Maj'Eyal
-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see .
--
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/eldritch-shield", name = "eldritch shield", description = "Infuse arcane forces in your shield." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/eldritch-stone", name = "eldritch stone", description = "Summon stony spikes inbued with various powers." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/deeprock", name = "deeprock", description = "Harness the power of the world to turn into a Deeprock Form." }
damDesc = Talents.main_env.damDesc
spells_req1 = Talents.main_env.spells_req1
spells_req2 = Talents.main_env.spells_req2
spells_req3 = Talents.main_env.spells_req3
spells_req4 = Talents.main_env.spells_req4
spells_req5 = Talents.main_env.spells_req5
spells_req_high1 = Talents.main_env.spells_req_high1
spells_req_high2 = Talents.main_env.spells_req_high2
spells_req_high3 = Talents.main_env.spells_req_high3
spells_req_high4 = Talents.main_env.spells_req_high4
spells_req_high5 = Talents.main_env.spells_req_high5
load("/data-stone-wardens/talents/spells/eldritch-shield.lua")
load("/data-stone-wardens/talents/spells/eldritch-stone.lua")
load("/data-stone-wardens/talents/spells/deeprock.lua")
PK
A data/talents/spells/deeprock.luaUT #P#Pux d -- ToME - Tales of Maj'Eyal
-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see .
--
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org
newTalent{
name = "Deeprock Form",
type = {"spell/deeprock", 1},
require = spells_req_high1,
points = 5,
equilibrium = 15,
mana = 60,
cooldown = 30,
tactical = { ATTACK = 5 },
range = 10,
radius = function(self, t) return 5 end,
requires_target = true,
getTime = function(self, t) return math.ceil(5 + self:combatTalentSpellDamage(t, 10, 150) / 10) end,
getDam = function(self, t) return 5 + (self:combatTalentSpellDamage(t, 10, 250) / 10) end,
getPen = function(self, t) return 5 + self:getTalentLevel(t) * 1.6 end,
getArmor = function(self, t) return 5 + self:getTalentLevel(t) * 2.3 end,
action = function(self, t)
self:setEffect(self.EFF_DEEPROCK_FORM, t.getTime(self, t), {dam=t.getDam(self, t), pen=t.getPen(self, t), armor=t.getArmor(self, t)})
game:playSoundNear(self, "talents/earth")
return true
end,
info = function(self, t)
return ([[You call upon the very core of the world, harnessing its power to transform your body.
For %d turns you become a Deeprock Elemental, increasing physical damage by %d%%, physical damage penetration by %d%%, armour by %d and gaining two size categories.
Effects increases with spellpower.]])
:format(t.getTime(self, t),t.getDam(self, t),t.getPen(self, t),t.getArmor(self, t))
end,
}
newTalent{
name = "Volcanic Rock",
type = {"spell/deeprock", 2},
require = spells_req_high2,
points = 5,
mode = "passive",
info = function(self, t)
local tv = self:getTalentFromId(self.T_VOLCANO)
return ([[When you turn into a Deeprock elemental you also gain the power to invoke volcanos:
%s]]):
format(self:getTalentFullDescription(tv, self:getTalentLevelRaw(t) * 2):toString())
end,
}
newTalent{
name = "Boulder Rock",
type = {"spell/deeprock", 3},
require = spells_req_high3,
points = 5,
mode = "passive",
info = function(self, t)
local tv = self:getTalentFromId(self.T_THROW_BOULDER)
return ([[When you turn into a Deeprock elemental you also gain the power to throw boulders.
%s]]):
format(self:getTalentFullDescription(tv, self:getTalentLevelRaw(t) * 2):toString())
end,
}
newTalent{
name = "Mountainhewn",
type = {"spell/deeprock", 4},
require = spells_req_high4,
points = 5,
mode = "passive",
info = function(self, t)
return ([[Your deeprock form become indomitable, granting you %d%% resistace to cuts, poisons, diseases and stuns.
At level 5 while Deeprock Form is active all damage check physical resistance instead of the incomming damage resistance.]]):
format(20 + self:getTalentLevel(t) * 7)
end,
}
PK
AK5 ' data/talents/spells/eldritch-shield.luaUT #P#Pux d -- ToME - Tales of Maj'Eyal
-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see .
--
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org
newTalent{
name = "Eldritch Blow",
type = {"spell/eldritch-shield", 1},
require = spells_req1,
points = 5,
equilibrium = 3,
mana = 10,
cooldown = 10,
range = 1,
tactical = { ATTACK = { ARCANE = 2 }, DISABLE = { stun = 2 } },
requires_target = true,
on_pre_use = function(self, t, silent) local shield = self:hasShield() if not shield then if not silent then game.logPlayer(self, "You cannot use Eldricth Blow without a shield!") end return false end return true end,
action = function(self, t)
local shield = self:hasShield()
local tg = {type="hit", range=self:getTalentRange(t)}
local x, y, target = self:getTarget(tg)
if not x or not y or not target then return nil end
if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end
-- First attack with both weapon & shield (since we have the Stoneshield talent)
local hit = self:attackTarget(target, DamageType.ARCANE, self:combatTalentWeaponDamage(t, 0.6, (100 + self:combatTalentSpellDamage(t, 50, 300)) / 100), true)
-- Try to stun !
if hit then
if target:canBe("stun") then
target:setEffect(target.EFF_STUNNED, 2 + math.floor(self:getTalentLevel(t) / 2), {apply_power=self:combatPhysicalpower(), apply_save="combatSpellResist"})
else
game.logSeen(target, "%s resists the stun!", target.name:capitalize())
end
end
return true
end,
info = function(self, t)
return ([[Channel eldritch forces in your attack, hitting the target with your weapon and shield doing %d%% arcane damage.
If the any of the attacks hit, the target is stunned for %d turns.
The stun is considered a magical attack and thus is resisted with spell save, not physical save.
Damage increases with spellpower.]])
:format(100 * self:combatTalentWeaponDamage(t, 0.6, (100 + self:combatTalentSpellDamage(t, 50, 300)) / 100), 2 + math.floor(self:getTalentLevel(t) / 2))
end,
}
newTalent{
name = "Eldritch Infusion",
type = {"spell/eldritch-shield", 2},
require = spells_req2,
points = 5,
mode = "sustained",
sustain_equilibrium = 15,
sustain_mana = 50,
cooldown = 30,
tactical = { ATTACK = 3, BUFF = 2 },
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 40) end,
activate = function(self, t)
local dam = t.getDamage(self, t)
return {
proj = self:addTemporaryValue("melee_project", {[DamageType.ARCANE]=dam}),
onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.ARCANE]=dam * 0.7}),
}
end,
deactivate = function(self, t, p)
self:removeTemporaryValue("melee_project", p.proj)
self:removeTemporaryValue("on_melee_hit", p.onhit)
return true
end,
info = function(self, t)
local dam = t.getDamage(self, t)
return ([[Imbues your shields with arcane power, dealing %0.2f arcane damage with each attacks and %0.2f arcane damage when hit.
The damage will increase with Spellpower.]]):
format(damDesc(self, DamageType.ARCANE, dam), damDesc(self, DamageType.ARCANE, dam * 0.7))
end,
}
newTalent{
name = "Eldritch Fury",
type = {"spell/eldritch-shield", 3},
require = spells_req3,
points = 5,
equilibrium = 20,
mana = 30,
cooldown = 12,
requires_target = true,
tactical = { ATTACK = { NATURE = 3 }, DISABLE = { stun = 1 } },
range = 1,
on_pre_use = function(self, t, silent) local shield = self:hasShield() if not shield then if not silent then game.logPlayer(self, "You cannot use Eldricth Fury without a shield!") end return false end return true end,
action = function(self, t)
local tg = {type="hit", range=self:getTalentRange(t)}
local x, y, target = self:getTarget(tg)
if not x or not y or not target then return nil end
if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end
-- First attack with both weapon & shield (since we have the Stoneshield talent)
local hit1 = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 0.6, 1.6), true)
local hit2 = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 0.6, 1.6), true)
local hit3 = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 0.6, 1.6), true)
-- Try to stun !
if hit1 or hit2 or hit3 then
if target:canBe("stun") then
target:setEffect(target.EFF_DAZED, 3 + math.floor(self:getTalentLevel(t)), {apply_power=self:combatPhysicalpower(), apply_save="combatSpellResist"})
else
game.logSeen(target, "%s resists the dazing blows!", target.name:capitalize())
end
end
return true
end,
info = function(self, t)
return ([[Channel eldritch forces to speed up your attacks, hitting the target three times with your shields doing %d%% nature damage.
If any of the attacks hit, the target is dazed for %d turns.
The daze is considered a magical attack and thus is resisted with spell save, not physical save.]])
:format(100 * self:combatTalentWeaponDamage(t, 0.6, 1.6), 3 + math.floor(self:getTalentLevel(t)))
end,
}
newTalent{
name = "Eldritch Slam",
type = {"spell/eldritch-shield", 4},
require = spells_req4,
points = 5,
equilibrium = 10,
mana = 30,
cooldown = 20,
tactical = { ATTACKAREA = { PHYSICAL = 3 } },
requires_target = true,
range = 1,
radius = function(self, t) return 1 + self:getTalentLevelRaw(t) end,
on_pre_use = function(self, t, silent) local shield = self:hasShield() if not shield then if not silent then game.logPlayer(self, "You cannot use Eldritch Slam without a shield!") end return false end return true end,
action = function(self, t)
local tg = {type="ball", radius=self:getTalentRadius(t)}
self:project(tg, self.x, self.y, function(px, py)
local target = game.level.map(px, py, Map.ACTOR)
if not target or target == self then return end
self:attackTarget(target, DamageType.ARCANE, self:combatTalentWeaponDamage(t, 1.3, 2.6), true)
end)
game.level.map:particleEmitter(self.x, self.y, tg.radius, "shieldstorm", {radius=tg.radius})
game:playSoundNear(self, "talents/icestorm")
return true
end,
info = function(self, t)
return ([[Slam your shield on the ground, doing %d%% arcane damage in a radius of %d.]])
:format(100 * self:combatTalentWeaponDamage(t, 1.3, 2.6), self:getTalentRadius(t))
end,
}
PK
AH H &