Skip to content
Snippets Groups Projects
Commit 730c28f3 authored by dg's avatar dg
Browse files

disruption shield explodes if low on mana

time shield


git-svn-id: http://svn.net-core.org/repos/t-engine4@272 51575b47-30f0-44d4-a5cc-537603b46e54
parent 93edb6c6
No related branches found
No related tags found
No related merge requests found
......@@ -43,16 +43,21 @@ end
--- Counts down timed effects, call from your actors "act" method
--
function _M:timedEffects()
local todel = {}
for eff, p in pairs(self.tmp) do
p.dur = p.dur - 1
if p.dur <= 0 then
self:removeEffect(eff)
todel[#todel+1] = eff
else
if _M.tempeffect_def[eff].on_timeout then
_M.tempeffect_def[eff].on_timeout(self, p)
end
end
end
while #todel > 0 do
self:removeEffect(table.remove(todel))
end
end
--- Sets a timed effect on the actor
......
......@@ -155,14 +155,45 @@ function _M:onTakeHit(value, src)
return 0
end
if self:attr("mana_shield") then
if self:attr("disruption_shield") then
local mana = self:getMana()
local mana_val = value * self:attr("mana_shield")
local mana_val = value * self:attr("disruption_shield")
-- We have enough to absord the full hit
if mana_val <= mana then
self:incMana(-mana_val)
self.disruption_shield_absorb = self.disruption_shield_absorb + value
return 0
-- Or we dont! and we do nothing
-- Or the shield collapses in a deadly arcane explosion
else
local dam = self.disruption_shield_absorb
-- Deactivate without loosing energy
local old = self.energy.value
self.energy.value = 10000
self:useTalent(self.T_DISRUPTION_SHIELD)
self.energy.value = old
-- Explode!
game.logSeen(self, "%s disruption shield collapses and then explodes in a powerfull manastorm!", self.name:capitalize())
local tg = {type="ball", radius=5}
self:project(tg, self.x, self.y, engine.DamageType.ARCANE, dam, {type="manathrust"})
end
end
if self:attr("time_shield") then
-- Absorb damage into the time shield
if value <= self.time_shield_absorb then
self.time_shield_absorb = self.time_shield_absorb - value
value = 0
else
self.time_shield_absorb = 0
value = value - self.time_shield_absorb
end
-- If we are at the end of the capacity, release the time shield damage
if self.time_shield_absorb <= 0 then
game.logPlayer(self, "Your time shield crumbles under the damage!")
self:removeEffect(self.EFF_TIME_SHIELD)
end
end
return value
......@@ -190,7 +221,7 @@ function _M:die(src)
end
function _M:levelup()
self.unused_stats = self.unused_stats + 2
self.unused_stats = self.unused_stats + 3
self.unused_talents = self.unused_talents + 2
if self.level % 10 == 0 then
self.unused_talents_types = self.unused_talents_types + 1
......@@ -222,10 +253,6 @@ function _M:levelup()
end
end
function _M:updateBonus()
engine.Actor.updateBonus(self)
end
--- Notifies a change of stat value
function _M:onStatChange(stat, v)
if stat == self.STAT_CON then
......
......@@ -14,6 +14,16 @@ Autolevel:registerScheme{ name = "warrior", levelup = function(self)
learnStats(self, { self.STAT_STR, self.STAT_STR, self.STAT_DEX })
end}
Autolevel:registerScheme{ name = "warrior", levelup = function(self)
-- 2 STR for 1 DEX
learnStats(self, { self.STAT_STR, self.STAT_STR, self.STAT_DEX })
end}
Autolevel:registerScheme{ name = "rogue", levelup = function(self)
-- 2 STR for 1 DEX
learnStats(self, { self.STAT_DEX, self.STAT_CUN, self.STAT_CUN })
end}
Autolevel:registerScheme{ name = "caster", levelup = function(self)
-- 2 MAG for 1 WIL
learnStats(self, { self.STAT_MAG, self.STAT_MAG, self.STAT_WIL })
......
......@@ -31,6 +31,7 @@ setDefaultProjector(function(src, x, y, type, dam)
end)
local function tryDestroy(who, inven, destroy_prop, proof_prop, msg)
if not inven then return end
for i = #inven, 1, -1 do
local o = inven[i]
print(who, inven, destroy_prop, proof_prop, msg, "::", i)
......
......@@ -75,16 +75,19 @@ newTalent{
},
activate = function(self, t)
local power = math.max(0.8, 3 - (self:combatSpellpower(1) * self:getTalentLevel(t)) / 280)
self.disruption_shield_absorb = 0
return {
shield = self:addTemporaryValue("mana_shield", power),
shield = self:addTemporaryValue("disruption_shield", power),
}
end,
deactivate = function(self, t, p)
self:removeTemporaryValue("mana_shield", p.shield)
self:removeTemporaryValue("disruption_shield", p.shield)
self.disruption_shield_absorb = nil
return true
end,
info = function(self, t)
return ([[Uses mana instead of life to take damage. Uses %0.2f mana per damage taken.
If your mana is brought too low by the shield it will de-activate and the chain reaction will release a deadly arcane explosion of the amount of damage absorbed.
The damage to mana ratio increases with the Magic stat]]):format(math.max(0.8, 3 - (self:combatSpellpower(1) * self:getTalentLevel(t)) / 280))
end,
}
......@@ -82,7 +82,7 @@ newTalent{
combat = { dam=resolvers.rngavg(12,25), atk=10, apr=10, physspeed=2 },
summoner = self,
summon_time = util.bound(self:getTalentLevel(t) * self:combatSpellpower(25), 5, 90),
summon_time = util.bound(self:getTalentLevel(t) * self:combatSpellpower(0.15), 5, 90),
}
bear:resolve()
......@@ -94,6 +94,6 @@ newTalent{
end,
info = function(self, t)
return ([[Call upon the forces of nature to summon bear ally for %d turns.
The power of the ally will increase with the Magic stat]]):format(util.bound(self:getTalentLevel(t) * self:combatSpellpower(25), 5, 90))
The power of the ally will increase with the Magic stat]]):format(util.bound(self:getTalentLevel(t) * self:combatSpellpower(0.15), 5, 90))
end,
}
......@@ -36,12 +36,12 @@ newTalent{
local tg = {type="hit", range=self:getTalentRange(t)}
local x, y = self:getTarget(tg)
if not x or not y then return nil end
self:project(tg, x, y, DamageType.SLOW, util.bound((self:combatSpellpower(25) * self:getTalentLevel(t)) / 100, 0.1, 0.4), {type="manathrust"})
self:project(tg, x, y, DamageType.SLOW, util.bound((self:combatSpellpower(0.25) * self:getTalentLevel(t)) / 100, 0.1, 0.4), {type="manathrust"})
return true
end,
info = function(self, t)
return ([[Decreases the target global speed by %.2f for 7 turns.
The speed decreases with the Magic stat]]):format(util.bound((self:combatSpellpower(25) * self:getTalentLevel(t)) / 100, 0.1, 0.4))
The speed decreases with the Magic stat]]):format(util.bound((self:combatSpellpower(0.25) * self:getTalentLevel(t)) / 100, 0.1, 0.4))
end,
}
......@@ -57,7 +57,7 @@ newTalent{
BUFF = 10,
},
activate = function(self, t)
local power = util.bound((self:combatSpellpower(50) * self:getTalentLevel(t)) / 100, 0.1, 2)
local power = util.bound((self:combatSpellpower(0.5) * self:getTalentLevel(t)) / 100, 0.1, 2)
return {
speed = self:addTemporaryValue("energy", {mod=power}),
}
......@@ -68,7 +68,7 @@ newTalent{
end,
info = function(self, t)
return ([[Increases the caster global speed by %.2f.
The speed increases with the Magic stat]]):format(util.bound((self:combatSpellpower(50) * self:getTalentLevel(t)) / 100, 0.1, 2))
The speed increases with the Magic stat]]):format(util.bound((self:combatSpellpower(0.5) * self:getTalentLevel(t)) / 100, 0.1, 2))
end,
}
......@@ -84,12 +84,14 @@ newTalent{
},
range = 20,
action = function(self, t)
print("IMPLEMENT ME §!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
local dur = util.bound(5 + math.floor(self:getTalentLevel(t)), 5, 15)
local power = 50 + self:combatSpellpower(0.5) * self:getTalentLevel(t)
self:setEffect(self.EFF_TIME_SHIELD, dur, {power=power})
return true
end,
info = function(self, t)
return ([[This intricate spell erects time shield around the caster, preventing any incomming damage and sending it forward in time.
Once the maximun damage (%d) is absorbed or the time runs out (%d turns) the stored damage will come back as a damage over time.
The duration and max absorption will increase with the Magic stat]]):format(4 + self:combatSpellpower(0.03) * self:getTalentLevel(t), 1)
Once the maximun damage (%d) is absorbed or the time runs out (%d turns) the stored damage will come back as a damage over time (5 turns).
The duration and max absorption will increase with the Magic stat]]):format(50 + self:combatSpellpower(0.5) * self:getTalentLevel(t), util.bound(5 + math.floor(self:getTalentLevel(t)), 5, 15))
end,
}
......@@ -320,3 +320,41 @@ newEffect{
self:removeTemporaryValue("stats", eff.stat)
end,
}
newEffect{
name = "TIME_SHIELD",
desc = "Time Shield",
type = "time",
status = "beneficial",
parameters = { power=10 },
on_gain = function(self, err) return "The very fabric of time alters around #target#.", "+Time Shield" end,
on_lose = function(self, err) return "The fabric of time around #target# stabilizes to normal.", "-Time Shield" end,
activate = function(self, eff)
eff.tmpid = self:addTemporaryValue("time_shield", eff.power)
--- Warning there can be only one time shield active at once for an actor
self.time_shield_absorb = eff.power
end,
deactivate = function(self, eff)
-- Time shield ends, setup a dot if needed
if eff.power - self.time_shield_absorb > 0 then
print("Time shield dot", eff.power - self.time_shield_absorb, (eff.power - self.time_shield_absorb) / 5)
self:setEffect(self.EFF_TIME_DOT, 5, {power=(eff.power - self.time_shield_absorb) / 5})
end
self:removeTemporaryValue("time_shield", eff.tmpid)
self.time_shield_absorb = nil
end,
}
newEffect{
name = "TIME_DOT",
desc = "Time Shield Backfire",
type = "time",
status = "detrimental",
parameters = { power=10 },
on_gain = function(self, err) return "The powerfull time altering energies come crashing down on #target#.", "+Time Shield Backfire" end,
on_lose = function(self, err) return "The fabric of time around #target# returns to normal.", "-Time Shield Backfire" end,
on_timeout = function(self, eff)
DamageType:get(DamageType.ARCANE).projector(self, self.x, self.y, DamageType.ARCANE, eff.power)
end,
}
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