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