diff --git a/game/modules/example/class/Actor.lua b/game/modules/example/class/Actor.lua index 7aabe4cbc8cfcae275b37bef61f4a6748dc86b46..7e54dd2dd92fe3cbca41913329cb457b56ef4a10 100644 --- a/game/modules/example/class/Actor.lua +++ b/game/modules/example/class/Actor.lua @@ -20,6 +20,7 @@ require "engine.class" require "engine.Actor" require "engine.Autolevel" +require "engine.interface.ActorTemporaryEffects" require "engine.interface.ActorLife" require "engine.interface.ActorProject" require "engine.interface.ActorLevel" @@ -32,6 +33,7 @@ local Map = require "engine.Map" module(..., package.seeall, class.inherit( engine.Actor, + engine.interface.ActorTemporaryEffects, engine.interface.ActorLife, engine.interface.ActorProject, engine.interface.ActorLevel, @@ -51,9 +53,10 @@ function _M:init(t, no_default) t.life_regen = t.life_regen or 0.25 -- Life regen real slow -- Default melee barehanded damage - self.combat = { dam=1, dammod={str=1} } + self.combat = { dam=1 } engine.Actor.init(self, t, no_default) + engine.interface.ActorTemporaryEffects.init(self, t) engine.interface.ActorLife.init(self, t) engine.interface.ActorProject.init(self, t) engine.interface.ActorTalents.init(self, t) @@ -73,6 +76,8 @@ function _M:act() -- Regen resources self:regenLife() self:regenResources() + -- Compute timed effects + self:timedEffects() -- Still enough energy to act ? if self.energy.value < game.energy_to_act then return false end @@ -101,10 +106,15 @@ Stats: %d / %d / %d self.life, self.life * 100 / self.max_life, self:getStr(), self:getDex(), - self:getCon() + self:getCon(), + self.desc or "" ) end +function _M:onTakeHit(value, src) + return value +end + function _M:die(src) engine.interface.ActorLife.die(self, src) @@ -117,9 +127,9 @@ function _M:die(src) end function _M:levelup() - self.max_life = self.max_life + 5 + self.max_life = self.max_life + 2 - self:incMaxEnergy(3) + self:incMaxPower(3) -- Healp up on new level self.life = self.max_life diff --git a/game/modules/example/class/Game.lua b/game/modules/example/class/Game.lua index 9c018835e8aefa67d21ba4f7abca7cfedb8bc6f4..bc3a05b2a121b5754c3f40158a4e7e1d0877f108 100644 --- a/game/modules/example/class/Game.lua +++ b/game/modules/example/class/Game.lua @@ -106,7 +106,7 @@ function _M:loaded() engine.GameTurnBased.loaded(self) Zone:setup{npc_class="mod.class.NPC", grid_class="mod.class.Grid", } Map:setViewerActor(self.player) - Map:setViewPort(200, 20, self.w - 200, math.floor(self.h * 0.80) - 20, 32, 32, nil, 20, true) + self:setupDisplayMode() self.key = engine.KeyBind.new() end @@ -123,11 +123,6 @@ function _M:setupDisplayMode() Map:setViewPort(200, 20, self.w - 200, math.floor(self.h * 0.80) - 20, 32, 32, nil, 22, true, true) Map:resetTiles() Map.tiles.use_images = false - self:setupMiniMap() -end - -function _M:setupMiniMap() - if self.level and self.level.map then self.level.map._map:setupMiniMapGridSize(4) end end function _M:save() @@ -175,8 +170,6 @@ function _M:changeLevel(lev, zone) self.player:move(self.level.downs[1].x, self.level.downs[1].y, true) end self.level:addEntity(self.player) - - self:setupMiniMap() end function _M:getPlayer() diff --git a/game/modules/example/class/NPC.lua b/game/modules/example/class/NPC.lua index a5b78b82a5c81cf1ebb6add99f8966c30584169c..0d4038fe18b51be1b951714bfd19d55a7f64528a 100644 --- a/game/modules/example/class/NPC.lua +++ b/game/modules/example/class/NPC.lua @@ -53,18 +53,11 @@ function _M:onTakeHit(value, src) end function _M:tooltip() - local factcolor, factstate = "#ANTIQUE_WHITE#", "neutral" - if self:reactionToward(game.player) < 0 then factcolor, factstate = "#LIGHT_RED#", "hostile" - elseif self:reactionToward(game.player) > 0 then factcolor, factstate = "#LIGHT_GREEN#", "friendly" - end - local str = mod.class.Actor.tooltip(self) return str..([[ -Faction: %s%s (%s) Target: %s UID: %d]]):format( - factcolor, Faction.factions[self.faction].name, factstate, self.ai_target.actor and self.ai_target.actor.name or "none", self.uid) end diff --git a/game/modules/example/class/interface/Combat.lua b/game/modules/example/class/interface/Combat.lua index 947bb6444e18a282d2ae100d417008d5a1b77525..3ea59a44396511f9b903f104b1cbd7ec0172674b 100644 --- a/game/modules/example/class/interface/Combat.lua +++ b/game/modules/example/class/interface/Combat.lua @@ -20,7 +20,6 @@ require "engine.class" local DamageType = require "engine.DamageType" local Map = require "engine.Map" -local Chat = require "engine.Chat" local Target = require "engine.Target" local Talents = require "engine.interface.ActorTalents" @@ -46,20 +45,12 @@ function _M:bumpInto(target) end --- Makes the death happen! -function _M:attackTarget(target, damtype, mult, noenergy) - local speed, hit = nil, false - +function _M:attackTarget(target, mult) if self.combat then - local s, h = self:attackTargetWith(target, self.combat, damtype, mult) - speed = math.max(speed or 0, s) - hit = hit or h + local dam = self.combat.dam + self:getStr() - target.combat_armor + DamageType:get(DamageType.PHYSICAL).projector(self, target.x, target.y, DamageType.PHYSICAL, math.max(0, dam)) end -- We use up our own energy - if speed and not noenergy then - self:useEnergy(game.energy_to_act * speed) - self.did_energy = true - end - - return hit + self:useEnergy(game.energy_to_act) end diff --git a/game/modules/example/data/birth/descriptors.lua b/game/modules/example/data/birth/descriptors.lua index 8bbfc8f38f2fbb5e09e98f381d6ecf4d7be7723d..e3c71b1907915f235ef837e458d2e917a5c37be5 100644 --- a/game/modules/example/data/birth/descriptors.lua +++ b/game/modules/example/data/birth/descriptors.lua @@ -27,6 +27,7 @@ newBirthDescriptor{ copy = { max_level = 10, lite = 4, + max_life = 25, }, } diff --git a/game/modules/example/data/general/grids/basic.lua b/game/modules/example/data/general/grids/basic.lua index 6d14ec4987bcf837299356f63b8c6a22595e75eb..171745a3c4c513631642de8e66f8c3a011b0d809 100644 --- a/game/modules/example/data/general/grids/basic.lua +++ b/game/modules/example/data/general/grids/basic.lua @@ -20,7 +20,7 @@ newEntity{ define_as = "UP_WILDERNESS", name = "exit to the wilds", - display = '<', color_r=255, color_g=0, color_b=255, + display = '<', color_r=255, color_g=0, color_b=255, back_color=colors.DARK_GREY, always_remember = true, notice = true, change_level = 1, @@ -30,7 +30,7 @@ newEntity{ newEntity{ define_as = "UP", name = "previous level", - display = '<', color_r=255, color_g=255, color_b=0, + display = '<', color_r=255, color_g=255, color_b=0, back_color=colors.DARK_GREY, notice = true, always_remember = true, change_level = -1, @@ -39,7 +39,7 @@ newEntity{ newEntity{ define_as = "DOWN", name = "next level", - display = '>', color_r=255, color_g=255, color_b=0, + display = '>', color_r=255, color_g=255, color_b=0, back_color=colors.DARK_GREY, notice = true, always_remember = true, change_level = 1, @@ -48,7 +48,7 @@ newEntity{ newEntity{ define_as = "FLOOR", name = "floor", image = "terrain/marble_floor.png", - display = '.', color_r=255, color_g=255, color_b=255, back_color=colors.DARK_GREY, + display = ' ', color_r=255, color_g=255, color_b=255, back_color=colors.DARK_GREY, } newEntity{ @@ -81,19 +81,3 @@ newEntity{ always_remember = true, door_closed = "DOOR", } - -newEntity{ - define_as = "OLD_FLOOR", - name = "floor", image = "terrain/maze_floor.png", - display = '.', color_r=255, color_g=255, color_b=255, back_color=colors.DARK_GREY, -} - -newEntity{ - define_as = "OLD_WALL", - name = "wall", image = "terrain/granite_wall_lichen.png", back_color=colors.GREY, - display = '#', color_r=255, color_g=255, color_b=255, - always_remember = true, - does_block_move = true, - block_sight = true, - air_level = -20, -} diff --git a/game/modules/example/data/general/npcs/kobold.lua b/game/modules/example/data/general/npcs/kobold.lua index e890bb8fdd6a5dda82192fd77ad36c3b0f946bd4..49ba5f2bfd5176c249130b94a134c7ee97e7517f 100644 --- a/game/modules/example/data/general/npcs/kobold.lua +++ b/game/modules/example/data/general/npcs/kobold.lua @@ -19,97 +19,30 @@ local Talents = require("engine.interface.ActorTalents") -newEntity{ --rodent base - define_as = "BASE_NPC_RODENT", - type = "vermin", subtype = "rodent", - display = "r", color=colors.WHITE, - can_multiply = 2, - body = { INVEN = 10 }, +newEntity{ + define_as = "BASE_NPC_KOBOLD", + type = "humanoid", subtype = "kobold", + display = "k", color=colors.WHITE, + desc = [[Ugly and green!]], - autolevel = "warrior", ai = "dumb_talented_simple", ai_state = { talent_in=3, }, - energy = { mod=1 }, - stats = { str=8, dex=15, mag=3, con=5 }, - combat_armor = 1, combat_def = 1, - rank = 1, - size_category = 1, + stats = { str=5, dex=5, con=5 }, + combat_armor = 0, } -newEntity{ base = "BASE_NPC_RODENT", - name = "giant white mouse", color=colors.WHITE, - level_range = {1, 3}, exp_worth = 1, +newEntity{ base = "BASE_NPC_KOBOLD", + name = "kobold warrior", color=colors.GREEN, + level_range = {1, 4}, exp_worth = 1, rarity = 4, max_life = resolvers.rngavg(5,9), - combat = { dam=5, atk=15, apr=10 }, + combat = { dam=2 }, } -newEntity{ base = "BASE_NPC_RODENT", - name = "giant brown mouse", color=colors.UMBER, - level_range = {1, 3}, exp_worth = 1, +newEntity{ base = "BASE_NPC_KOBOLD", + name = "armoured kobold warrior", color=colors.AQUAMARINE, + level_range = {6, 10}, exp_worth = 1, rarity = 4, - max_life = resolvers.rngavg(5,9), - combat = { dam=5, atk=15, apr=10 }, -} - -newEntity{ base = "BASE_NPC_RODENT", - name = "giant white rat", color=colors.WHITE, - level_range = {1, 4}, exp_worth = 1, - rarity = 5, - max_life = resolvers.rngavg(15,20), - combat = { dam=7, atk=15, apr=10 }, -} - -newEntity{ base = "BASE_NPC_RODENT", - name = "giant brown rat", color=colors.UMBER, - level_range = {1, 4}, exp_worth = 1, - rarity = 5, - max_life = resolvers.rngavg(15,20), - combat = { dam=7, atk=15, apr=10 }, -} - -newEntity{ base = "BASE_NPC_RODENT", - name = "giant rabbit", color=colors.UMBER, - desc = [[Kill the wabbit, kill the wabbit, kill the wabbbbbiiiiiit.]], - level_range = {1, 4}, exp_worth = 1, - rarity = 6, - max_life = resolvers.rngavg(20,30), - combat = { dam=8, atk=16, apr=10 }, -} - -newEntity{ base = "BASE_NPC_RODENT", - name = "giant crystal rat", color=colors.PINK, - desc = [[Instead of fur this rat has crystals growing on its back which provide extra protection.]], - level_range = {1, 5}, exp_worth = 1, - rarity = 6, - max_life = resolvers.rngavg(35,50), - combat = { dam=7, atk=15, apr=10 }, - combat_armor = 4, combat_def = 2, -} - -newEntity{ base = "BASE_NPC_RODENT", - name = "cute little bunny", color=colors.SALMON, - desc = [[It looks at you with cute little eyes before jumping at you with razor sharp teeth.]], - level_range = {1, 15}, exp_worth = 3, - rarity = 200, - max_life = resolvers.rngavg(15,20), - combat = { dam=50, atk=15, apr=10 }, - combat_armor = 1, combat_def = 20, -} - -newEntity{ base = "BASE_NPC_RODENT", - name = "giant grey mouse", color=colors.SLATE, - level_range = {1, 3}, exp_worth = 1, - rarity = 6, - max_life = resolvers.rngavg(5,9), - combat = { dam=5, atk=15, apr=10 }, - resolvers.talents{ [Talents.T_CRAWL_POISON]=1 }, -} - -newEntity{ base = "BASE_NPC_RODENT", - name = "giant grey rat", color=colors.SLATE, - level_range = {1, 4}, exp_worth = 1, - rarity = 7, - max_life = resolvers.rngavg(15,20), - combat = { dam=7, atk=15, apr=10 }, - resolvers.talents{ [Talents.T_CRAWL_POISON]=1 }, + max_life = resolvers.rngavg(10,12), + combat_armor = 3, + combat = { dam=5 }, } diff --git a/game/modules/example/data/timed_effects.lua b/game/modules/example/data/timed_effects.lua new file mode 100644 index 0000000000000000000000000000000000000000..214e569755d00829aa0b1625ce3badf91f13fd11 --- /dev/null +++ b/game/modules/example/data/timed_effects.lua @@ -0,0 +1,33 @@ +-- 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 Stats = require "engine.interface.ActorStats" + +newEffect{ + name = "ACIDBURN", + desc = "Burning from acid", + type = "physical", + status = "detrimental", + parameters = { power=1 }, + on_gain = function(self, err) return "#Target# is covered in acid!", "+Acid" end, + on_lose = function(self, err) return "#Target# is free from the acid.", "-Acid" end, + on_timeout = function(self, eff) + DamageType:get(DamageType.ACID).projector(eff.src or self, self.x, self.y, DamageType.ACID, eff.power) + end, +} diff --git a/game/modules/example/data/zones/dungeon/npcs.lua b/game/modules/example/data/zones/dungeon/npcs.lua index 5e16d33fe1228c493e5dced7fa841113439e3137..ac3abd8a2a61fe13fcf66997acd17880ad26f1ff 100644 --- a/game/modules/example/data/zones/dungeon/npcs.lua +++ b/game/modules/example/data/zones/dungeon/npcs.lua @@ -17,4 +17,4 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org ---load("/data/general/npcs/rodent.lua") +load("/data/general/npcs/kobold.lua") diff --git a/game/modules/example/dialogs/CharacterSheet.lua b/game/modules/example/dialogs/CharacterSheet.lua deleted file mode 100644 index 7ac799ccb31ec4d92f2a8194040c7182641f84b7..0000000000000000000000000000000000000000 --- a/game/modules/example/dialogs/CharacterSheet.lua +++ /dev/null @@ -1,279 +0,0 @@ --- 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 - -require "engine.class" -local Dialog = require "engine.Dialog" -local DamageType = require "engine.DamageType" -local Talents = require "engine.interface.ActorTalents" - -module(..., package.seeall, class.inherit(engine.Dialog)) - -function _M:init(actor) - self.actor = actor - engine.Dialog.init(self, "Character Sheet: "..self.actor.name.." (Press 'd' to save)", 800, 400, nil, nil, nil, core.display.newFont("/data/font/VeraMono.ttf", 12)) - - self:keyCommands({ - __TEXTINPUT = function(c) - if c == 'd' or c == 'D' then - self:dump() - end - end, - }, { - ACCEPT = "EXIT", - EXIT = function() - game:unregisterDialog(self) - end, - }) -end - -function _M:drawDialog(s) - local cur_exp, max_exp = game.player.exp, game.player:getExpChart(game.player.level+1) - - local h = 0 - local w = 0 - s:drawString(self.font, "Sex: "..game.player.descriptor.sex, w, h, 0, 200, 255) h = h + self.font_h - s:drawString(self.font, "Race: "..game.player.descriptor.subrace, w, h, 0, 200, 255) h = h + self.font_h - s:drawString(self.font, "Class: "..game.player.descriptor.subclass, w, h, 0, 200, 255) h = h + self.font_h - h = h + self.font_h - s:drawColorString(self.font, "Level: #00ff00#"..game.player.level, w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Exp: #00ff00#%2d%%"):format(100 * cur_exp / max_exp), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Gold: #00ff00#%0.2f"):format(game.player.money), w, h, 255, 255, 255) h = h + self.font_h - - h = h + self.font_h - - s:drawColorString(self.font, ("#c00000#Life: #00ff00#%d/%d"):format(game.player.life, game.player.max_life), w, h, 255, 255, 255) h = h + self.font_h - if game.player:knowTalent(game.player.T_STAMINA_POOL) then - s:drawColorString(self.font, ("#ffcc80#Stamina: #00ff00#%d/%d"):format(game.player:getStamina(), game.player.max_stamina), w, h, 255, 255, 255) h = h + self.font_h - end - if game.player:knowTalent(game.player.T_MANA_POOL) then - s:drawColorString(self.font, ("#7fffd4#Mana: #00ff00#%d/%d"):format(game.player:getMana(), game.player.max_mana), w, h, 255, 255, 255) h = h + self.font_h - end - if game.player:knowTalent(game.player.T_SOUL_POOL) then - s:drawColorString(self.font, ("#777777#Soul: #00ff00#%d/%d"):format(game.player:getSoul(), game.player.max_soul), w, h, 255, 255, 255) h = h + self.font_h - end - if game.player:knowTalent(game.player.T_EQUILIBRIUM_POOL) then - s:drawColorString(self.font, ("#00ff74#Equi: #00ff00#%d"):format(game.player:getEquilibrium()), w, h, 255, 255, 255) h = h + self.font_h - end - - h = h + self.font_h - s:drawColorString(self.font, ("STR: #00ff00#%3d"):format(game.player:getStr()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("DEX: #00ff00#%3d"):format(game.player:getDex()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("MAG: #00ff00#%3d"):format(game.player:getMag()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("WIL: #00ff00#%3d"):format(game.player:getWil()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("CUN: #00ff00#%3d"):format(game.player:getCun()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("CON: #00ff00#%3d"):format(game.player:getCon()), w, h, 255, 255, 255) h = h + self.font_h - - h = 0 - w = 200 - -- All weapons in main hands - if self.actor:getInven(self.actor.INVEN_MAINHAND) then - for i, o in ipairs(self.actor:getInven(self.actor.INVEN_MAINHAND)) do - if o.combat then - s:drawColorString(self.font, ("Attack(Main Hand): #00ff00#%3d"):format(game.player:combatAttack(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Damage(Main Hand): #00ff00#%3d"):format(game.player:combatDamage(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("APR (Main Hand): #00ff00#%3d"):format(game.player:combatAPR(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Crit (Main Hand): #00ff00#%3d%%"):format(game.player:combatCrit(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Speed (Main Hand): #00ff00#%0.2f"):format(game.player:combatSpeed(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - end - end - end - h = h + self.font_h - -- All wpeaons in off hands - -- Offhand atatcks are with a damage penality, taht can be reduced by talents - if self.actor:getInven(self.actor.INVEN_OFFHAND) then - local offmult = (mult or 1) / 2 - if self.actor:knowTalent(Talents.T_DUAL_WEAPON_TRAINING) then - offmult = (mult or 1) / (2 - (self.actor:getTalentLevel(Talents.T_DUAL_WEAPON_TRAINING) / 6)) - end - for i, o in ipairs(self.actor:getInven(self.actor.INVEN_OFFHAND)) do - if o.combat then - s:drawColorString(self.font, ("Attack (Off Hand): #00ff00#%3d"):format(game.player:combatAttack(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Damage (Off Hand): #00ff00#%3d"):format(game.player:combatDamage(o.combat) * offmult), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("APR (Off Hand): #00ff00#%3d"):format(game.player:combatAPR(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Crit (Off Hand): #00ff00#%3d%%"):format(game.player:combatCrit(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Speed (Off Hand): #00ff00#%0.2f"):format(game.player:combatSpeed(o.combat)), w, h, 255, 255, 255) h = h + self.font_h - end - end - end - h = h + self.font_h - s:drawColorString(self.font, ("Spellpower: #00ff00#%3d"):format(game.player:combatSpellpower()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Spell Crit: #00ff00#%3d%%"):format(game.player:combatSpellCrit()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Spell Speed: #00ff00#%3d"):format(game.player:combatSpellSpeed()), w, h, 255, 255, 255) h = h + self.font_h - - h = h + self.font_h - for i, t in ipairs(DamageType.dam_def) do - if self.actor.inc_damage[DamageType[t.type]] and self.actor.inc_damage[DamageType[t.type]] ~= 0 then - s:drawColorString(self.font, ("%s damage: #00ff00#%3d%%"):format(t.name:capitalize(), self.actor.inc_damage[DamageType[t.type]]), w, h, 255, 255, 255) h = h + self.font_h - end - end - - h = 0 - w = 400 - s:drawColorString(self.font, ("Fatigue: #00ff00#%3d%%"):format(game.player.fatigue), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Armor: #00ff00#%3d"):format(game.player:combatArmor()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Defence: #00ff00#%3d"):format(game.player:combatDefense()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Ranged Defence: #00ff00#%3d"):format(game.player:combatDefenseRanged()), w, h, 255, 255, 255) h = h + self.font_h - - h = h + self.font_h - s:drawColorString(self.font, ("Physical Resist: #00ff00#%3d"):format(game.player:combatPhysicalResist()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Spell Resist: #00ff00#%3d"):format(game.player:combatSpellResist()), w, h, 255, 255, 255) h = h + self.font_h - s:drawColorString(self.font, ("Mental Resist: #00ff00#%3d"):format(game.player:combatMentalResist()), w, h, 255, 255, 255) h = h + self.font_h - - h = h + self.font_h - for i, t in ipairs(DamageType.dam_def) do - if self.actor.resists[DamageType[t.type]] and self.actor.resists[DamageType[t.type]] ~= 0 then - s:drawColorString(self.font, ("%s Resist: #00ff00#%3d%%"):format(t.name:capitalize(), self.actor.resists[DamageType[t.type]]), w, h, 255, 255, 255) h = h + self.font_h - end - end - - h = 0 - w = 600 - s:drawColorString(self.font, "#LIGHT_BLUE#Current effects:", w, h, 255, 255, 255) h = h + self.font_h - for tid, act in pairs(game.player.sustain_talents) do - if act then s:drawColorString(self.font, ("#LIGHT_GREEN#%s"):format(game.player:getTalentFromId(tid).name), w, h, 255, 255, 255) h = h + self.font_h end - end - for eff_id, p in pairs(game.player.tmp) do - local e = game.player.tempeffect_def[eff_id] - if e.status == "detrimental" then - s:drawColorString(self.font, ("#LIGHT_RED#%s"):format(e.desc), w, h, 255, 255, 255) h = h + self.font_h - else - s:drawColorString(self.font, ("#LIGHT_GREEN#%s"):format(e.desc), w, h, 255, 255, 255) h = h + self.font_h - end - end - - self.changed = false -end - -function _M:dump() - fs.mkdir("/character-dumps") - local file = "/character-dumps/"..(game.player.name:gsub("[^a-zA-Z0-9_-.]", "_")).."-"..os.date("%Y%m%d-%H%M%S")..".txt" - local fff = fs.open(file, "w") - local nl = function(s) fff:write(s or "") fff:write("\n") end - local nnl = function(s) fff:write(s or "") end - - nl("Sex: "..game.player.descriptor.sex) - nl("Race: "..game.player.descriptor.subrace) - nl("Class: "..game.player.descriptor.subclass) - nl("Level: "..game.player.level) - - nl() - local cur_exp, max_exp = game.player.exp, game.player:getExpChart(game.player.level+1) - nl(("Exp: %2d%%"):format(100 * cur_exp / max_exp)) - nl(("Gold: %0.2f"):format(game.player.money)) - - nl() - nl(("Life: %d/%d"):format(game.player.life, game.player.max_life)) - if game.player:knowTalent(game.player.T_STAMINA_POOL) then - nl(("Stamina: %d/%d"):format(game.player:getStamina(), game.player.max_stamina)) - end - if game.player:knowTalent(game.player.T_MANA_POOL) then - nl(("Mana: %d/%d"):format(game.player:getMana(), game.player.max_mana)) - end - if game.player:knowTalent(game.player.T_SOUL_POOL) then - nl(("Soul: %d/%d"):format(game.player:getSoul(), game.player.max_soul)) - end - if game.player:knowTalent(game.player.T_EQUILIBRIUM_POOL) then - nl(("Equi: %d"):format(game.player:getEquilibrium())) - end - - nl() - nl(("STR: %3d"):format(game.player:getStr())) - nl(("DEX: %3d"):format(game.player:getDex())) - nl(("MAG: %3d"):format(game.player:getMag())) - nl(("WIL: %3d"):format(game.player:getWil())) - nl(("CUN: %3d"):format(game.player:getCun())) - nl(("CON: %3d"):format(game.player:getCon())) - - -- All weapons in main hands - if self.actor:getInven(self.actor.INVEN_MAINHAND) then - for i, o in ipairs(self.actor:getInven(self.actor.INVEN_MAINHAND)) do - if o.combat then - nl() - nl(("Attack(Main Hand): %3d"):format(game.player:combatAttack(o.combat))) - nl(("Damage(Main Hand): %3d"):format(game.player:combatDamage(o.combat))) - nl(("APR (Main Hand): %3d"):format(game.player:combatAPR(o.combat))) - nl(("Crit (Main Hand): %3d%%"):format(game.player:combatCrit(o.combat))) - nl(("Speed (Main Hand): %0.2f"):format(game.player:combatSpeed(o.combat))) - end - end - end - - -- All wpeaons in off hands - -- Offhand atatcks are with a damage penality, taht can be reduced by talents - if self.actor:getInven(self.actor.INVEN_OFFHAND) then - local offmult = (mult or 1) / 2 - if self.actor:knowTalent(Talents.T_DUAL_WEAPON_TRAINING) then - offmult = (mult or 1) / (2 - (self.actor:getTalentLevel(Talents.T_DUAL_WEAPON_TRAINING) / 6)) - end - for i, o in ipairs(self.actor:getInven(self.actor.INVEN_OFFHAND)) do - if o.combat then - nl() - nl(("Attack (Off Hand): %3d"):format(game.player:combatAttack(o.combat))) - nl(("Damage (Off Hand): %3d"):format(game.player:combatDamage(o.combat) * offmult)) - nl(("APR (Off Hand): %3d"):format(game.player:combatAPR(o.combat))) - nl(("Crit (Off Hand): %3d%%"):format(game.player:combatCrit(o.combat))) - nl(("Speed (Off Hand): %0.2f"):format(game.player:combatSpeed(o.combat))) - end - end - end - - nl() - nl(("Spellpower: %3d"):format(game.player:combatSpellpower())) - nl(("Spell Crit: %3d%%"):format(game.player:combatSpellCrit())) - nl(("Spell Speed: %3d"):format(game.player:combatSpellSpeed())) - - nl() - for i, t in ipairs(DamageType.dam_def) do - if self.actor.inc_damage[DamageType[t.type]] and self.actor.inc_damage[DamageType[t.type]] ~= 0 then - nl(("%s damage: %3d%%"):format(t.name:capitalize(), self.actor.inc_damage[DamageType[t.type]])) - end - end - - nl() - nl(("Fatigue: %3d%%"):format(game.player.fatigue)) - nl(("Armor: %3d"):format(game.player:combatArmor())) - nl(("Defence: %3d"):format(game.player:combatDefense())) - nl(("Ranged Defence: %3d"):format(game.player:combatDefenseRanged())) - - nl() - nl(("Physical Resist: %3d"):format(game.player:combatPhysicalResist())) - nl(("Spell Resist: %3d"):format(game.player:combatSpellResist())) - nl(("Mental Resist: %3d"):format(game.player:combatMentalResist())) - - nl() - for i, t in ipairs(DamageType.dam_def) do - if self.actor.resists[DamageType[t.type]] and self.actor.resists[DamageType[t.type]] ~= 0 then - nl(("%s Resist: %3d%%"):format(t.name:capitalize(), self.actor.resists[DamageType[t.type]])) - end - end - - nl() - local most_kill, most_kill_max = "none", 0 - local total_kill = 0 - for name, nb in pairs(game.player.all_kills or {}) do - if nb > most_kill_max then most_kill_max = nb most_kill = name end - total_kill = total_kill + nb - end - nl(("Number of NPC killed: %s"):format(total_kill)) - nl(("Most killed NPC: %s (%d)"):format(most_kill, most_kill_max)) - - fff:close() - - Dialog:simplePopup("Character dump complete", "File: "..fs.getRealPath(file)) -end diff --git a/game/modules/example/dialogs/DeathDialog.lua b/game/modules/example/dialogs/DeathDialog.lua index 6d1a7030b734e4701307ba7df4126737e892ed7f..5971217b2a6648ffad87b131eb7000ff958bbd5b 100644 --- a/game/modules/example/dialogs/DeathDialog.lua +++ b/game/modules/example/dialogs/DeathDialog.lua @@ -85,10 +85,7 @@ end --- Restore ressources function _M:restoreRessources() self.actor.life = self.actor.max_life - self.actor.mana = self.actor.max_mana - self.actor.stamina = self.actor.max_stamina - self.actor.equilibrium = 0 - self.actor.air = self.actor.max_air + self.actor.power = self.actor.max_power self.actor.energy.value = game.energy_to_act end @@ -106,8 +103,6 @@ function _M:resurrectBasic() game.level:addEntity(self.actor) game:unregisterDialog(self) game.level.map:redisplay() - - world:gainAchievement("UNSTOPPABLE", self.actor) end function _M:use() @@ -119,25 +114,9 @@ function _M:use() save:delete() save:close() util.showMainMenu() - elseif act == "dump" then - game:registerDialog(require("mod.dialogs.CharacterSheet").new(self.actor)) elseif act == "cheat" then game.logPlayer(self.actor, "#LIGHT_BLUE#You resurrect! CHEATER !") - self:cleanActor() - self:restoreRessources() - self:resurrectBasic() - elseif act == "blood_life" then - self.actor.blood_life = false - game.logPlayer(self.actor, "#LIGHT_RED#The Blood of Life rushes through your dead body. You come back to life!") - - self:cleanActor() - self:restoreRessources() - self:resurrectBasic() - elseif act == "skeleton" then - self.actor:attr("re-assembled", 1) - game.logPlayer(self.actor, "#YELLOW#Your bones magically come back together. You are once more able to dish pain to your foes!") - self:cleanActor() self:restoreRessources() self:resurrectBasic() @@ -148,8 +127,6 @@ function _M:generateList() local list = {} if config.settings.tome.cheat then list[#list+1] = {name="Resurrect by cheating", action="cheat"} end - if self.actor:attr("blood_life") and not self.actor:attr("undead") then list[#list+1] = {name="Resurrect with the Blood of Life", action="blood_life"} end - if self.actor:getTalentLevelRaw(self.actor.T_SKELETON_REASSEMBLE) >= 5 and not self.actor:attr("re-assembled") then list[#list+1] = {name="Re-assemble your bones ad resurrect (Skeleton ability)", action="skeleton"} end list[#list+1] = {name="Character dump", action="dump"} list[#list+1] = {name="Exit to main menu", action="exit"} @@ -159,7 +136,7 @@ end function _M:drawDialog(s) local help = ([[You have #LIGHT_RED#died#LAST#! -Death in T.o.M.E. is usually permanent, but if you have a means of resurrection it will be proposed in the menu below. +Death in Example is usually permanent, but if you have a means of resurrection it will be proposed in the menu below. You can dump your character data to a file to remember her/him forever, or you can exit and try again to survive in the wilds! ]]):splitLines(self.iw - 10, self.font) diff --git a/game/modules/example/dialogs/Quit.lua b/game/modules/example/dialogs/Quit.lua index 84b0303f1cf3c372deeec5058afa944a4f98943f..934d453821cb978089dba199721c1663944db247 100644 --- a/game/modules/example/dialogs/Quit.lua +++ b/game/modules/example/dialogs/Quit.lua @@ -24,7 +24,7 @@ local Savefile = require "engine.Savefile" module(..., package.seeall, class.inherit(engine.Dialog)) function _M:init() - engine.Dialog.init(self, "Realy exit ToME?", 300, 100) + engine.Dialog.init(self, "Realy exit Example Module?", 300, 100) self:keyCommands({ __DEFAULT = function() game:unregisterDialog(self) diff --git a/game/modules/example/load.lua b/game/modules/example/load.lua index 8d85cb226c71438c3dca6962d912887991d04575..ceb8adfe7255332fee90cef379a4c5957edab350 100644 --- a/game/modules/example/load.lua +++ b/game/modules/example/load.lua @@ -25,6 +25,7 @@ local ActorResource = require "engine.interface.ActorResource" local ActorTalents = require "engine.interface.ActorTalents" local ActorAI = require "engine.interface.ActorAI" local ActorLevel = require "engine.interface.ActorLevel" +local ActorTemporaryEffects = require "engine.interface.ActorTemporaryEffects" local Birther = require "engine.Birther" -- Usefull keybinds @@ -36,6 +37,9 @@ DamageType:loadDefinition("/data/damage_types.lua") -- Talents ActorTalents:loadDefinition("/data/talents.lua") +-- Timed Effects +ActorTemporaryEffects:loadDefinition("/data/timed_effects.lua") + -- Actor resources ActorResource:defineResource("Power", "power", nil, "power_regen", "Power represent your ability to use special talents.")