From 248a5255d4fce302815ed1ce6a2b798919cef3f1 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Mon, 7 Dec 2009 21:27:34 +0000 Subject: [PATCH] objects git-svn-id: http://svn.net-core.org/repos/t-engine4@105 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/engine/Birther.lua | 1 - game/engine/Object.lua | 5 ++ game/engine/Zone.lua | 49 ++++++++++++++----- game/engine/generator/actor/Random.lua | 39 ++++++++------- game/engine/generator/object/Random.lua | 36 ++++++++++++++ game/engine/interface/ActorInventory.lua | 36 ++++++++++++++ game/modules/tome/class/Actor.lua | 3 ++ game/modules/tome/class/Game.lua | 2 +- game/modules/tome/class/Object.lua | 12 +++++ game/modules/tome/class/Player.lua | 19 +++++++ game/modules/tome/data/birth/classes.lua | 3 +- game/modules/tome/data/birth/races.lua | 6 ++- game/modules/tome/data/birth/subraces.lua | 3 +- game/modules/tome/data/general/objects.lua | 3 ++ .../tome/data/zones/ancient_ruins/npcs.lua | 2 +- .../tome/data/zones/ancient_ruins/zone.lua | 5 ++ game/modules/tome/load.lua | 15 ++++++ 17 files changed, 204 insertions(+), 35 deletions(-) create mode 100644 game/engine/generator/object/Random.lua create mode 100644 game/engine/interface/ActorInventory.lua create mode 100644 game/modules/tome/class/Object.lua diff --git a/game/engine/Birther.lua b/game/engine/Birther.lua index 5104130648..fbfb46c408 100644 --- a/game/engine/Birther.lua +++ b/game/engine/Birther.lua @@ -52,7 +52,6 @@ function _M:init(actor, order, at_end) _UP = function() self.sel = util.boundWrap(self.sel - 1, 1, #self.list) end, _DOWN = function() self.sel = util.boundWrap(self.sel + 1, 1, #self.list) end, _RETURN = function() self:next() end, - _ESCAPE = function() game:unregisterDialog(self) end, } self:mouseZones{ { x=2, y=25, w=350, h=self.h, fct=function(button, x, y, xrel, yrel, tx, ty) diff --git a/game/engine/Object.lua b/game/engine/Object.lua index 56eaa2000c..b85631120f 100644 --- a/game/engine/Object.lua +++ b/game/engine/Object.lua @@ -12,3 +12,8 @@ end function _M:getName() return self.name end + +function _M:resolve(t) + Entity.resolve(self, t) + self.egos = nil +end diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua index dbe472eef7..c184e022be 100644 --- a/game/engine/Zone.lua +++ b/game/engine/Zone.lua @@ -35,26 +35,46 @@ end -- ONLY entities with a rarity properties will be considered.<br/> -- This means that to get a never-random entity you simply do not put a rarity property on it. function _M:computeRarities(list, level, ood, filter) - local r = {} + local r = { total=0 } + print("******************", level) for i, e in ipairs(list) do if e.rarity and (not filter or filter(e)) then local lev = level -- Out of Depth chance - if ood and rng.percent(ood.chance) then - lev = level + rng.range(ood.range[1], ood.range[2]) - print("OOD Entity !", e.name, ":=:", level, "to", lev) +-- if ood and rng.percent(ood.chance) then +-- lev = level + rng.range(ood.range[1], ood.range[2]) +-- print("OOD Entity !", e.name, ":=:", level, "to", lev) +-- end + + local max = 100 + if lev < e.level_range[1] then max = 100 / (3 * (e.level_range[1] - lev)) + elseif lev > e.level_range[2] then max = 100 / (lev - e.level_range[2]) end + local genprob = max / e.rarity + print("prob", e.name, math.floor(genprob), "max", math.floor(max), e.level_range[1], e.level_range[2], lev) --- if lev < - local genprob = 100 / e.rarity - - r[#r+1] = { e=e, genprob=genprob, level_diff = lev - level } + r.total = r.total + genprob + r[#r+1] = { e=e, genprob=r.total + genprob, level_diff = lev - level } end end table.sort(r, function(a, b) return a.genprob < b.genprob end) + print("*DONE", r.total) return r end +function _M:pickEntity(list) + if #list == 0 then return nil end + local r = rng.range(1, list.total) + for i = 1, #list do +-- print("test", r, ":=:", list[i].genprob) + if r < list[i].genprob then +-- print(" * select", list[i].e.name) + return list[i].e + end + end + return nil +end + function _M:load() local f, err = loadfile("/data/zones/"..self.short_name.."/zone.lua") if err then error(err) end @@ -137,10 +157,17 @@ function _M:newLevel(level_data, lev, game) -- Generate actors if level_data.generator.actor then local generator = require(level_data.generator.actor.class).new( + self, + map, + level + ) + generator:generate() + end + if level_data.generator.object then + local generator = require(level_data.generator.object.class).new( + self, map, - level, - self.npc_list, - level_data.generator.actor + level ) generator:generate() end diff --git a/game/engine/generator/actor/Random.lua b/game/engine/generator/actor/Random.lua index 0fcaef2fef..17d2961d13 100644 --- a/game/engine/generator/actor/Random.lua +++ b/game/engine/generator/actor/Random.lua @@ -3,10 +3,12 @@ local Map = require "engine.Map" require "engine.Generator" module(..., package.seeall, class.inherit(engine.Generator)) -function _M:init(map, level, npc_list, data) +function _M:init(zone, map, level) engine.Generator.init(self, map) + self.zone = zone self.level = level - self.npc_list = npc_list + local data = level.data + self.npc_list = zone:computeRarities(zone.npc_list, level.level, data.generator and data.generator.actor and data.generator.actor.ood, nil) if data.adjust_level_to_player and game:getPlayer() then self.adjust_level_to_player = {base=game:getPlayer().level, min=data.adjust_level_to_player[1], max=data.adjust_level_to_player[2]} end @@ -16,22 +18,25 @@ end function _M:generate() for i = 1, rng.range(self.nb_npc[1], self.nb_npc[2]) do - local m = self.npc_list[rng.range(1, #self.npc_list)]:clone() - m:resolve() - local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h) - local tries = 0 - while m:canMove(x, y) and tries < 100 do - x, y = rng.range(0, self.map.w), rng.range(0, self.map.h) - tries = tries + 1 - end - if tries < 100 then - m:move(x, y, true) - self.level:addEntity(m) + local m = self.zone:pickEntity(self.npc_list) + if m then + m = m:clone() + m:resolve() + local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h) + local tries = 0 + while not m:canMove(x, y) and tries < 100 do + x, y = rng.range(0, self.map.w), rng.range(0, self.map.h) + tries = tries + 1 + end + if tries < 100 then + m:move(x, y, true) + self.level:addEntity(m) - -- Levelup ? - if self.adjust_level_to_player then - local newlevel = self.adjust_level_to_player.base + rng.avg(self.adjust_level_to_player.min, self.adjust_level_to_player.max) - m:forceLevelup(newlevel) + -- Levelup ? + if self.adjust_level_to_player then + local newlevel = self.adjust_level_to_player.base + rng.avg(self.adjust_level_to_player.min, self.adjust_level_to_player.max) + m:forceLevelup(newlevel) + end end end end diff --git a/game/engine/generator/object/Random.lua b/game/engine/generator/object/Random.lua new file mode 100644 index 0000000000..4087d5b3de --- /dev/null +++ b/game/engine/generator/object/Random.lua @@ -0,0 +1,36 @@ +require "engine.class" +local Map = require "engine.Map" +require "engine.Generator" +module(..., package.seeall, class.inherit(engine.Generator)) + +function _M:init(zone, map, level) + engine.Generator.init(self, map) + self.zone = zone + self.level = level + local data = level.data + self.object_list = zone:computeRarities(zone.object_list, level.level, data.generator and data.generator.actor and data.generator.actor.ood, nil) + if data.adjust_level_to_player and game:getPlayer() then + self.adjust_level_to_player = {base=game:getPlayer().level, min=data.adjust_level_to_player[1], max=data.adjust_level_to_player[2]} + end + self.nb_object = data.nb_object or {10, 20} + self.level_range = data.level_range or {level, level} +end + +function _M:generate() + for i = 1, rng.range(self.nb_object[1], self.nb_object[2]) do + local o = self.zone:pickEntity(self.object_list) + if o then + o = o:clone() + o:resolve() + local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h) + local tries = 0 + while self.map(x, y, Map.OBJECT) and tries < 100 do + x, y = rng.range(0, self.map.w), rng.range(0, self.map.h) + tries = tries + 1 + end + if tries < 100 then + self.map(x, y, Map.OBJECT, o) + end + end + end +end diff --git a/game/engine/interface/ActorInventory.lua b/game/engine/interface/ActorInventory.lua new file mode 100644 index 0000000000..06abfd582c --- /dev/null +++ b/game/engine/interface/ActorInventory.lua @@ -0,0 +1,36 @@ +require "engine.class" + +--- Handles actors stats +module(..., package.seeall, class.make) + +_M.inven_def = {} + +--- Defines stats +-- Static! +function _M:defineInventory(short_name, name, is_worn, desc) + assert(name, "no inventory slot name") + assert(short_name, "no inventory slot short_name") + assert(desc, "no inventory slot desc") + table.insert(self.inven_def, { + name = name, + short_name = short_name, + description = desc, + is_worn = is_worn, + }) + self.inven_def[#self.inven_def].id = #self.inven_def + self.inven_def[short_name] = self.inven_def[#self.inven_def] + self["INVEN_"..short_name:upper()] = #self.inven_def +end + +--- Initialises inventories with default values if needed +function _M:init(t) + self.inven = t.inven or {} + if t.body then + for inven, max in pairs(t.body) do + self.inven[self["INVEN_"..inven]] = {} + end + end +end + +function _M:pickup() +end diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 514ae44deb..add920a0ec 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -1,6 +1,7 @@ require "engine.class" require "engine.Actor" require "engine.Autolevel" +require "engine.interface.ActorInventory" require "engine.interface.ActorTemporaryEffects" require "engine.interface.ActorLife" require "engine.interface.ActorLevel" @@ -13,6 +14,7 @@ require "mod.class.interface.Combat" module(..., package.seeall, class.inherit( -- a ToME actor is a complex beast it uses may inetrfaces engine.Actor, + engine.interface.ActorInventory, engine.interface.ActorTemporaryEffects, engine.interface.ActorLife, engine.interface.ActorLevel, @@ -25,6 +27,7 @@ module(..., package.seeall, class.inherit( function _M:init(t) engine.Actor.init(self, t) + engine.interface.ActorInventory.init(self, t) engine.interface.ActorTemporaryEffects.init(self, t) engine.interface.ActorLife.init(self, t) engine.interface.ActorLevel.init(self, t) diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index a882912a32..2d65dcfb2d 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -88,7 +88,7 @@ function _M:newGame() end function _M:loaded() - Zone:setup{npc_class="mod.class.NPC", grid_class="mod.class.Grid", object_class="engine.Entity"} + Zone:setup{npc_class="mod.class.NPC", grid_class="mod.class.Grid", object_class="mod.class.Object"} Map:setViewPort(self.w * 0.2, 0, self.w * 0.8, math.floor(self.h * 0.80), 16, 16) engine.GameTurnBased.loaded(self) self.key = engine.KeyCommand.new() diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua new file mode 100644 index 0000000000..81e10f5e0e --- /dev/null +++ b/game/modules/tome/class/Object.lua @@ -0,0 +1,12 @@ +require "engine.class" +require "engine.Object" + +module(..., package.seeall, class.inherit(engine.Object)) + +function _M:init(t) + engine.Object.init(self, t) +end + +function _M:tooltip() + return self:getName() +end diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index 6b4e3f79e5..67dd4c27a7 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -1,11 +1,25 @@ require "engine.class" require "mod.class.Actor" +local Map = require "engine.Map" local Dialog = require "engine.Dialog" local ActorTalents = require "engine.interface.ActorTalents" module(..., package.seeall, class.inherit(mod.class.Actor)) function _M:init(t) + t.body = { + INVEN = 1000, + MAIN_HAND = 1, + OFF_HAND = 1, + FINGER = 2, + NECK = 1, + LITE = 1, + BODY = 1, + HEAD = 1, + HANDS = 1, + FEET = 1, + TOOL = 1, + } mod.class.Actor.init(self, t) self.player = true self.faction = "players" @@ -21,6 +35,11 @@ function _M:move(x, y, force) local moved = mod.class.Actor.move(self, x, y, force) if moved then game.level.map:moveViewSurround(self.x, self.y, 4, 4) + + local obj = game.level.map(self.x, self.y, Map.OBJECT) + if obj then + game.logSeen(self, "There is an item here: "..obj:getName()) + end end return moved end diff --git a/game/modules/tome/data/birth/classes.lua b/game/modules/tome/data/birth/classes.lua index 604057ce57..c6178f7731 100644 --- a/game/modules/tome/data/birth/classes.lua +++ b/game/modules/tome/data/birth/classes.lua @@ -1,3 +1,4 @@ +--[[ newBirthDescriptor{ type = "class", name = "Warrior", @@ -29,7 +30,7 @@ newBirthDescriptor{ ["physical/1hweapon"]=true, }, } - +]] newBirthDescriptor{ type = "class", name = "Mage", diff --git a/game/modules/tome/data/birth/races.lua b/game/modules/tome/data/birth/races.lua index fbc579565e..7c271e0460 100644 --- a/game/modules/tome/data/birth/races.lua +++ b/game/modules/tome/data/birth/races.lua @@ -1,3 +1,4 @@ +--[[ newBirthDescriptor{ type = "race", name = "Human", @@ -19,7 +20,7 @@ newBirthDescriptor{ talents = {}, experience = 1.0, } - +]] newBirthDescriptor{ type = "race", name = "Elf", @@ -42,7 +43,7 @@ newBirthDescriptor{ }, experience = 1.05, } - +--[[ newBirthDescriptor{ type = "race", name = "Dwarf", @@ -107,3 +108,4 @@ newBirthDescriptor{ ActorTalents.T_IMPROVED_HEALTH_II, }, } +]] \ No newline at end of file diff --git a/game/modules/tome/data/birth/subraces.lua b/game/modules/tome/data/birth/subraces.lua index 8164db76b3..3b807d2ce0 100644 --- a/game/modules/tome/data/birth/subraces.lua +++ b/game/modules/tome/data/birth/subraces.lua @@ -76,6 +76,7 @@ newBirthDescriptor experience = 1.3, talents = {}, } +--[[ newBirthDescriptor { type = "subrace", @@ -93,7 +94,7 @@ newBirthDescriptor talents = { ActorTalents.DECREASED_HEALTH_I }, experience = 1.1, } - +]] --------------------------------------------------------- -- Hobbits -- --------------------------------------------------------- diff --git a/game/modules/tome/data/general/objects.lua b/game/modules/tome/data/general/objects.lua index 6e11c0c1ef..31354aceb5 100644 --- a/game/modules/tome/data/general/objects.lua +++ b/game/modules/tome/data/general/objects.lua @@ -21,6 +21,7 @@ newEntity{ name = "& tower shield~", display = "[", color_r=255, level_range = {1, 10}, + rarity = 2, encumber = 6, wielder = { combat_def=6, @@ -32,6 +33,7 @@ newEntity{ type = "weapon", display = "/", color_b=255, level_range = {1, 10}, + rarity = 2, encumber = 4, wielder = { combat_dam=3, @@ -44,6 +46,7 @@ newEntity{ type = "weapon", display = "/", color_r=255, color_b=255, level_range = {10,10}, + rarity = 15, encumber = 3, unique = "STAFF_OLORIN", wielder = { diff --git a/game/modules/tome/data/zones/ancient_ruins/npcs.lua b/game/modules/tome/data/zones/ancient_ruins/npcs.lua index 67f8dc7088..a5a8ca5343 100644 --- a/game/modules/tome/data/zones/ancient_ruins/npcs.lua +++ b/game/modules/tome/data/zones/ancient_ruins/npcs.lua @@ -34,7 +34,7 @@ newEntity{ newEntity{ group = "icky things", - name = "white icky thing", + name = "white icky", display = "i", color_r=255, color_g=255, color_b=255, level_range = {3, 7}, exp_worth = 100, rarity = 1, diff --git a/game/modules/tome/data/zones/ancient_ruins/zone.lua b/game/modules/tome/data/zones/ancient_ruins/zone.lua index cb23fbfd72..6635de37d2 100644 --- a/game/modules/tome/data/zones/ancient_ruins/zone.lua +++ b/game/modules/tome/data/zones/ancient_ruins/zone.lua @@ -21,5 +21,10 @@ return { ood = {chance=5, range={1, 10}}, adjust_level_to_player = {-1, 2}, }, + object = { + class = "engine.generator.object.Random", + nb_object = {10, 10}, + ood = {chance=5, range={1, 10}}, + }, } } diff --git a/game/modules/tome/load.lua b/game/modules/tome/load.lua index f44d2eeeaa..d2f29afb07 100644 --- a/game/modules/tome/load.lua +++ b/game/modules/tome/load.lua @@ -5,6 +5,7 @@ local ActorResource = require "engine.interface.ActorResource" local ActorTalents = require "engine.interface.ActorTalents" local ActorTemporaryEffects = require "engine.interface.ActorTemporaryEffects" local ActorAI = require "engine.interface.ActorAI" +local ActorInventory = require "engine.interface.ActorInventory" local Birther = require "engine.Birther" -- Damage types @@ -30,6 +31,20 @@ dofile("/data/autolevel_schemes.lua") -- Actor AIs ActorAI:loadDefinition("/engine/ai/") +-- Body parts +ActorInventory:defineInventory("INVEN", "In inventory", false, "") +ActorInventory:defineInventory("MAIN_HAND", "In main hand", true, "") +ActorInventory:defineInventory("OFF_HAND", "In off hand", true, "") +ActorInventory:defineInventory("FINGER", "On fingers", true, "") +ActorInventory:defineInventory("NECK", "Around neck", true, "") +ActorInventory:defineInventory("LITE", "Light source", true, "") +ActorInventory:defineInventory("BODY", "Main armor", true, "") +ActorInventory:defineInventory("CLOAK", "Cloak", true, "") +ActorInventory:defineInventory("HEAD", "On head", true, "") +ActorInventory:defineInventory("HANDS", "On hands", true, "") +ActorInventory:defineInventory("FEET", "On feet", true, "") +ActorInventory:defineInventory("TOOL", "Tool", true, "") + -- Birther descriptor Birther:loadDefinition("/data/birth/descriptors.lua") -- GitLab