Skip to content
Snippets Groups Projects
Commit 7dff2e9f authored by dg's avatar dg
Browse files

gollllemmmmm

git-svn-id: http://svn.net-core.org/repos/t-engine4@901 51575b47-30f0-44d4-a5cc-537603b46e54
parent 45853a5a
No related branches found
No related tags found
No related merge requests found
......@@ -650,12 +650,6 @@ function _M:levelup()
rating = rng.range(math.floor(self.life_rating * 0.5), math.floor(self.life_rating * 1.5))
end
self.max_life = self.max_life + math.max(rating + self:getRankLifeAdjust(), 1)
+ (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_III) and 1 or 0)
- (self:knowTalent(self.T_DECREASED_HEALTH_I) and 1 or 0)
- (self:knowTalent(self.T_DECREASED_HEALTH_II) and 1 or 0)
- (self:knowTalent(self.T_DECREASED_HEALTH_III) and 1 or 0)
self:incMaxMana(self.mana_rating)
self:incMaxStamina(self.stamina_rating)
......
-- ToME - Tales of Middle-Earth
-- Copyright (C) 2009, 2010 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 <http://www.gnu.org/licenses/>.
--
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org
local change_weapon = function(npc, player)
player:showEquipInven("Select a two handed weapon for your golem.", function(o) return o.type == "weapon" and o.twohanded end, function(o, inven, item)
player:removeObject(inven, item, true)
local ro = npc:wearObject(o, true, true)
if ro then
if type(ro) == "table" then player:addObject(inven, ro) end
elseif not ro then
player:addObject(inven, o)
else
game.logPlayer(player, "Your golem equips: %s.", o:getName{do_color=true, no_count=true})
end
player:sortInven()
player:useEnergy()
return true
end)
end
local change_armour = function(npc, player)
player:showEquipInven("Select a two handed armour for your golem.", function(o) return o.type == "armor" and o.slot == "BODY" end, function(o, inven, item)
player:removeObject(inven, item, true)
local ro = npc:wearObject(o, true, true)
if ro then
if type(ro) == "table" then player:addObject(inven, ro) end
elseif not ro then
player:addObject(inven, o)
else
game.logPlayer(player, "Your golem equips: %s.", o:getName{do_color=true, no_count=true})
end
player:sortInven()
player:useEnergy()
return true
end)
end
newChat{ id="welcome",
text = [[#LIGHT_GREEN#*The golem talks in a monotonous voice*#WHITE#
Yes master.]],
answers = {
{"I want to change your weapon.", action=change_weapon},
{"I want to change your armour.", action=change_armour},
{"Nothing, let's go."},
}
}
return "welcome"
......@@ -74,36 +74,37 @@ newTalent{
range = 10,
mana = 5,
action = function(self, t)
if not game.level:hasEntity(self.alchemy_golem) then
local mover, golem = getGolem(self)
if not golem then
game.logPlayer(self, "Your golem is currently inactive.")
return
end
local tg = {type="ball", radius=2, range=self:getTalentRange(t)}
game.target.source_actor = self.alchemy_golem
game.target.source_actor = mover
local x, y, target = self:getTarget(tg)
game.target.source_actor = self
if not x or not y or not target then return nil end
if math.floor(core.fov.distance(self.alchemy_golem.x, self.alchemy_golem.y, x, y)) > self:getTalentRange(t) then return nil end
if math.floor(core.fov.distance(mover.x, mover.y, x, y)) > self:getTalentRange(t) then return nil end
local l = line.new(self.alchemy_golem.x, self.alchemy_golem.y, x, y)
local l = line.new(mover.x, mover.y, x, y)
local lx, ly = l()
local tx, ty = self.alchemy_golem.x, self.alchemy_golem.y
local tx, ty = mover.x, mover.y
lx, ly = l()
while lx and ly do
if game.level.map:checkAllEntities(lx, ly, "block_move", self.alchemy_golem) then break end
if game.level.map:checkAllEntities(lx, ly, "block_move", mover) then break end
tx, ty = lx, ly
lx, ly = l()
end
self.alchemy_golem:move(tx, ty, true)
mover:move(tx, ty, true)
-- Attack & daze
self.alchemy_golem:project({type="ball", radius=2, friendlyfire=false}, tx, ty, function(xx, yy)
golem:project({type="ball", radius=2, friendlyfire=false}, tx, ty, function(xx, yy)
local target = game.level.map(xx, yy, Map.ACTOR)
if target and self.alchemy_golem:attackTarget(target, nil, self.alchemy_golem:combatTalentWeaponDamage(t, 0.4, 1.1), true) then
if target:checkHit(self.alchemy_golem:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 10 - self.alchemy_golem:getTalentLevel(t) / 2) and target:canBe("stun") then
target:setEffect(target.EFF_DAZED, 2 + self.alchemy_golem:getTalentLevel(t), {})
if target and golem:attackTarget(target, nil, golem:combatTalentWeaponDamage(t, 0.4, 1.1), true) then
if target:checkHit(golem:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 10 - self:getTalentLevel(t) / 2) and target:canBe("stun") then
target:setEffect(target.EFF_DAZED, 2 + self:getTalentLevel(t), {})
else
game.logSeen(target, "%s resists the dazing blow!", target.name:capitalize())
end
......@@ -114,7 +115,7 @@ newTalent{
end,
info = function(self, t)
return ([[Your golem rushes to the target, pounding the area, dazing all for %d turns and doing %d%% damage.]]):
format(2 + self.alchemy_golem:getTalentLevel(t), 100 * self:combatTalentWeaponDamage(t, 0.4, 1.1))
format(2 + self:getTalentLevel(t), 100 * self:combatTalentWeaponDamage(t, 0.4, 1.1))
end,
}
......@@ -124,13 +125,14 @@ newTalent{
require = spells_req4,
points = 5,
mana = 40,
cooldown = 30,
cooldown = 60,
action = function(self, t)
if not game.level:hasEntity(self.alchemy_golem) then
local mover, golem = getGolem(self)
if not golem then
game.logPlayer(self, "Your golem is currently inactive.")
return
end
if math.floor(core.fov.distance(self.x, self.y, self.alchemy_golem.x, self.alchemy_golem.y)) > 1 then
if math.floor(core.fov.distance(self.x, self.y, golem.x, golem.y)) > 1 then
game.logPlayer(self, "You are too far away from your golem.")
return
end
......@@ -138,7 +140,7 @@ newTalent{
-- Create the mount item
local mount = game.zone:makeEntityByName(game.level, "object", "ALCHEMIST_GOLEM_MOUNT")
if not mount then return end
mount.mount.actor = self.alchemy_golem
mount.mount.actor = golem
self:setEffect(self.EFF_GOLEM_MOUNT, 5 + math.ceil(self:getTalentLevel(t) * 4), {mount=mount})
return true
......
......@@ -18,6 +18,14 @@
-- darkgod@te4.org
local Chat = require "engine.Chat"
function getGolem(self)
if game.level:hasEntity(self.alchemy_golem) then
return self.alchemy_golem, self.alchemy_golem
elseif self:hasEffect(self.EFF_GOLEM_MOUNT) then
return self, self.alchemy_golem
end
end
local function makeGolem()
return require("mod.class.NPC").new{
type = "construct", subtype = "golem",
......@@ -106,7 +114,7 @@ newTalent{
return
end
for i = 1, 2 do self:removeObject(self:getInven("QUIVER"), 1) end
self.alchemy_golem:heal(self:combatTalentSpellDamage(t, 15, 150, (ammo.alchemist_power + self:combatSpellpower()) / 2))
self.alchemy_golem:heal(self:combatTalentSpellDamage(t, 15, 350, (ammo.alchemist_power + self:combatSpellpower()) / 2))
-- resurrect the golem
else
......@@ -154,20 +162,21 @@ newTalent{
range = 10,
mana = 5,
action = function(self, t)
if not game.level:hasEntity(self.alchemy_golem) then
local mover, golem = getGolem(self)
if not golem then
game.logPlayer(self, "Your golem is currently inactive.")
return
end
local tg = {type="hit", range=self:getTalentRange(t)}
game.target.source_actor = self.alchemy_golem
game.target.source_actor = mover
local x, y, target = self:getTarget(tg)
game.target.source_actor = self
if not x or not y or not target then print(1) return nil end
if math.floor(core.fov.distance(self.alchemy_golem.x, self.alchemy_golem.y, x, y)) > self:getTalentRange(t) then return nil end
if not x or not y or not target then return nil end
if math.floor(core.fov.distance(mover.x, mover.y, x, y)) > self:getTalentRange(t) then return nil end
self.alchemy_golem:setTarget(target)
target:setTarget(self.alchemy_golem)
mover:setTarget(target)
target:setTarget(mover)
game.logPlayer(self, "Your golem provokes %s to attack it.", target.name:capitalize())
return true
......@@ -186,40 +195,41 @@ newTalent{
range = 10,
mana = 5,
action = function(self, t)
if not game.level:hasEntity(self.alchemy_golem) then
local mover, golem = getGolem(self)
if not golem then
game.logPlayer(self, "Your golem is currently inactive.")
return
end
local tg = {type="hit", range=self:getTalentRange(t)}
game.target.source_actor = self.alchemy_golem
game.target.source_actor = mover
local x, y, target = self:getTarget(tg)
game.target.source_actor = self
if not x or not y or not target then return nil end
if math.floor(core.fov.distance(self.alchemy_golem.x, self.alchemy_golem.y, x, y)) > self:getTalentRange(t) then return nil end
if math.floor(core.fov.distance(mover.x, mover.y, x, y)) > self:getTalentRange(t) then return nil end
self.alchemy_golem:setTarget(target)
mover:setTarget(target)
local l = line.new(self.alchemy_golem.x, self.alchemy_golem.y, x, y)
local l = line.new(mover.x, mover.y, x, y)
local lx, ly = l()
local tx, ty = self.alchemy_golem.x, self.alchemy_golem.y
local tx, ty = mover.x, mover.y
lx, ly = l()
while lx and ly do
if game.level.map:checkAllEntities(lx, ly, "block_move", self.alchemy_golem) then break end
if game.level.map:checkAllEntities(lx, ly, "block_move", mover) then break end
tx, ty = lx, ly
lx, ly = l()
end
self.alchemy_golem:move(tx, ty, true)
mover:move(tx, ty, true)
-- Attack ?
if math.floor(core.fov.distance(self.alchemy_golem.x, self.alchemy_golem.y, x, y)) > 1 then return true end
local hit = self.alchemy_golem:attackTarget(target, nil, self.alchemy_golem:combatTalentWeaponDamage(t, 0.8, 1.6), true)
if math.floor(core.fov.distance(mover.x, mover.y, x, y)) > 1 then return true end
local hit = golem:attackTarget(target, nil, self:combatTalentWeaponDamage(t, 0.8, 1.6), true)
-- Try to knockback !
if hit then
if target:checkHit(self.alchemy_golem:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 5 - self.alchemy_golem:getTalentLevel(t) / 2) and target:canBe("knockback") then
target:knockback(self.alchemy_golem.x, self.alchemy_golem.y, 3)
if target:checkHit(golem:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) and target:canBe("knockback") then
target:knockback(mover.x, mover.y, 3)
else
game.logSeen(target, "%s resists the knockback!", target.name:capitalize())
end
......@@ -241,40 +251,41 @@ newTalent{
range = 10,
mana = 5,
action = function(self, t)
if not game.level:hasEntity(self.alchemy_golem) then
local mover, golem = getGolem(self)
if not golem then
game.logPlayer(self, "Your golem is currently inactive.")
return
end
local tg = {type="hit", range=self:getTalentRange(t)}
game.target.source_actor = self.alchemy_golem
game.target.source_actor = mover
local x, y, target = self:getTarget(tg)
game.target.source_actor = self
if not x or not y or not target then return nil end
if math.floor(core.fov.distance(self.alchemy_golem.x, self.alchemy_golem.y, x, y)) > self:getTalentRange(t) then return nil end
if math.floor(core.fov.distance(mover.x, mover.y, x, y)) > self:getTalentRange(t) then return nil end
self.alchemy_golem:setTarget(target)
mover:setTarget(target)
local l = line.new(self.alchemy_golem.x, self.alchemy_golem.y, x, y)
local l = line.new(mover.x, mover.y, x, y)
local lx, ly = l()
local tx, ty = self.alchemy_golem.x, self.alchemy_golem.y
local tx, ty = mover.x, mover.y
lx, ly = l()
while lx and ly do
if game.level.map:checkAllEntities(lx, ly, "block_move", self.alchemy_golem) then break end
if game.level.map:checkAllEntities(lx, ly, "block_move", mover) then break end
tx, ty = lx, ly
lx, ly = l()
end
self.alchemy_golem:move(tx, ty, true)
mover:move(tx, ty, true)
-- Attack ?
if math.floor(core.fov.distance(self.alchemy_golem.x, self.alchemy_golem.y, x, y)) > 1 then return true end
local hit = self.alchemy_golem:attackTarget(target, nil, self.alchemy_golem:combatTalentWeaponDamage(t, 0.8, 1.6), true)
if math.floor(core.fov.distance(mover.x, mover.y, x, y)) > 1 then return true end
local hit = golem:attackTarget(target, nil, self:combatTalentWeaponDamage(t, 0.8, 1.6), true)
-- Try to knockback !
if hit then
if target:checkHit(self.alchemy_golem:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 10 - self.alchemy_golem:getTalentLevel(t) / 2) and target:canBe("stun") then
target:setEffect(target.EFF_PINNED, 2 + self.alchemy_golem:getTalentLevel(t), {})
if target:checkHit(golem:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 10 - self:getTalentLevel(t) / 2) and target:canBe("stun") then
target:setEffect(target.EFF_PINNED, 2 + self:getTalentLevel(t), {})
else
game.logSeen(target, "%s resists the crushing!", target.name:capitalize())
end
......@@ -295,7 +306,8 @@ newTalent{
mana = 10,
cooldown = 20,
action = function(self, t)
if not game.level:hasEntity(self.alchemy_golem) then
local mover, golem = getGolem(self)
if not golem then
game.logPlayer(self, "Your golem is currently inactive.")
return
end
......@@ -307,8 +319,10 @@ newTalent{
return
end
self.alchemy_golem:setEffect(self.alchemy_golem.EFF_MIGHTY_BLOWS, 5, {power=self:combatTalentSpellDamage(t, 15, 50)})
self.alchemy_golem:move(x, y, true)
golem:setEffect(golem.EFF_MIGHTY_BLOWS, 5, {power=self:combatTalentSpellDamage(t, 15, 50)})
if golem == mover then
golem:move(x, y, true)
end
game:playSoundNear(self, "talents/arcane")
return true
end,
......
......@@ -794,11 +794,14 @@ newEffect{
end,
deactivate = function(self, eff)
if self:removeObject(self.INVEN_MOUNT, 1, true) then
-- Find space
local x, y = util.findFreeGrid(self.x, self.y, 10, true, {[engine.Map.ACTOR]=true})
if x then
eff.mount.mount.actor:move(x, y, true)
game.level:addEntity(eff.mount.mount.actor)
-- Only unmount if dead
if not eff.mount.mount.actor.dead then
-- Find space
local x, y = util.findFreeGrid(self.x, self.y, 10, true, {[engine.Map.ACTOR]=true})
if x then
eff.mount.mount.actor:move(x, y, true)
game.level:addEntity(eff.mount.mount.actor)
end
end
end
end,
......
......@@ -41,6 +41,7 @@ newEntity{ define_as = "SANDWORM_TUNNELER",
invulnerable = 1,
move_body = 1,
size_category = 5,
no_breath = 1,
autolevel = "warrior",
ai = "sandworm_tunneler", ai_state = {},
......
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