diff --git a/game/engine/Birther.lua b/game/engine/Birther.lua index 510413064899c7bc02e129a23c393f52126b807f..fbfb46c408b15b1aa9ab9de74c8eec57e95cf1d2 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 56eaa2000c8737a698cb3cafa2a3c13a7702a1a6..b85631120f9d558181b25b10aa8d81370eff89e2 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 dbe472eef7c6d684925012fcfa9e54a8dad0cb16..c184e022be601f07cb0d9b9da7b67197ff6b0df8 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 0fcaef2fef550473f286c3c6d969af547fb25ffe..17d2961d13fcebc6cd1951eddaf6e0e0881b3e02 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 0000000000000000000000000000000000000000..4087d5b3de804ee35473aedd363e25c1897401ab --- /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 0000000000000000000000000000000000000000..06abfd582c33c7e1b316bec85a6f9578354e8a5a --- /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 514ae44deb92e91d1c38afbd1a91bf065693466d..add920a0ecf9c963eac5f8f5279150a0946d3de5 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 a882912a3240a4c1e7781d64d5f44b19adf0ae03..2d65dcfb2d978307b85bd43cf9055a84fed4f76a 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 0000000000000000000000000000000000000000..81e10f5e0e7b0d4bcd9a90008960747e70b6a13b --- /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 6b4e3f79e505714bffb929e27c7e61453e304228..67dd4c27a74e4976345b6c92ebf184318fc7db08 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 604057ce5715c5f8e8ec98d55e3698a0bb9ae555..c6178f773141de148c49ad46a8fb41bc7133119b 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 fbc579565e611b495896d1f221eee24aed345d56..7c271e046002c175896d2228b04411c58325e366 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 8164db76b318457543586cf41c43b3098b4098bf..3b807d2ce02f7ecefee86ba324a86e22d1ef445b 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 6e11c0c1ef04fd0c3aa0d7f7c8a8ea96ec4fb5ac..31354aceb5163e44a1c40c9fc8701341c2c5da1f 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 67f8dc7088ef42f937c6cab1e88f3d28fb2affb3..a5a8ca534310806abe20543d75b31871c5c0f1c2 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 cb23fbfd72d8012ab5f8ac03e2dabab594e329f7..6635de37d206c009e55ed576125a22f46c478bf6 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 f44d2eeeaa9396d9644d8bf475df8a62a8f0f27e..d2f29afb07ece5e445e1bb5fc24a7f43e9c968c4 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")