From df5318882516143584de2cb3a5c13a60f09e8b7b Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 22 Dec 2009 23:39:10 +0000
Subject: [PATCH] better egos

git-svn-id: http://svn.net-core.org/repos/t-engine4@140 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engine/Entity.lua                  |  4 ++--
 game/engine/Zone.lua                    | 23 ++++++++++++++++-------
 game/engine/generator/actor/Random.lua  |  2 +-
 game/engine/generator/object/Random.lua |  2 +-
 4 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/game/engine/Entity.lua b/game/engine/Entity.lua
index 1d210d9167..a45ff5672f 100644
--- a/game/engine/Entity.lua
+++ b/game/engine/Entity.lua
@@ -157,11 +157,11 @@ function _M:loadList(file, no_default)
 			if t.define_as then res[t.define_as] = e end
 		end,
 		load = function(f)
-			local ret = self:loadList(f)
+			local ret = self:loadList(f, no_default)
 			for i, e in ipairs(ret) do res[#res+1] = e end
 		end,
 		loadList = function(f)
-			return self:loadList(f)
+			return self:loadList(f, no_default)
 		end,
 	}, {__index=_G}))
 	f()
diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua
index d2d234992b..575f2971fd 100644
--- a/game/engine/Zone.lua
+++ b/game/engine/Zone.lua
@@ -34,17 +34,17 @@ end
 --- Parses the npc/objects list and compute rarities for random generation
 -- 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)
+function _M:computeRarities(type, list, level, ood, filter)
 	local r = { total=0 }
-	print("******************", level)
+	print("******************", level.level)
 	for i, e in ipairs(list) do
 		if e.rarity and e.level_range and (not filter or filter(e)) then
 --			print("computing rarity of", e.name)
-			local lev = level
+			local lev = level.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)
+--				lev = level.level + rng.range(ood.range[1], ood.range[2])
+--				print("OOD Entity !", e.name, ":=:", level.level, "to", lev)
 --			end
 
 			local max = 100
@@ -54,8 +54,17 @@ function _M:computeRarities(list, level, ood, filter)
 			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, "egoable", e.egos and #e.egos)
 
+			-- Generate and store egos list if needed
+			if e.egos and not level:getEntitiesList(type.."/"..e.egos) then
+				local egos = self:getEgosList(level, type, e.egos, e.__CLASSNAME)
+				if egos then
+					egos = self:computeRarities(type, egos, level, ood, filter)
+					level:setEntitiesList(type.."/"..e.egos, egos)
+				end
+			end
+
 			r.total = r.total + genprob
-			r[#r+1] = { e=e, genprob=r.total + genprob, level_diff = lev - level }
+			r[#r+1] = { e=e, genprob=r.total + genprob, level_diff = lev - level.level }
 		end
 	end
 	table.sort(r, function(a, b) return a.genprob < b.genprob end)
@@ -97,7 +106,7 @@ function _M:makeEntity(level, type)
 	-- Add "ego" properties
 	if e.egos then
 		local egos = self:getEgosList(level, type, e.egos, e.__CLASSNAME)
-		local ego = egos[rng.range(1, #egos)]
+		local ego = self:pickEntity(egos)
 		if ego then
 			print("ego", ego.__CLASSNAME, ego.name, getmetatable(ego))
 			ego = ego:clone()
diff --git a/game/engine/generator/actor/Random.lua b/game/engine/generator/actor/Random.lua
index 11f48b780b..d23e0f0e91 100644
--- a/game/engine/generator/actor/Random.lua
+++ b/game/engine/generator/actor/Random.lua
@@ -9,7 +9,7 @@ function _M:init(zone, map, level)
 	local data = level.data.generator.actor
 
 	-- Setup the entities list
-	level:setEntitiesList("actor", zone:computeRarities(zone.npc_list, level.level, data.ood, nil))
+	level:setEntitiesList("actor", zone:computeRarities("actor", zone.npc_list, level, data.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]}
diff --git a/game/engine/generator/object/Random.lua b/game/engine/generator/object/Random.lua
index 4dc974907f..d27c99e3f6 100644
--- a/game/engine/generator/object/Random.lua
+++ b/game/engine/generator/object/Random.lua
@@ -9,7 +9,7 @@ function _M:init(zone, map, level)
 	local data = level.data.generator.object
 
 	-- Setup the entities list
-	level:setEntitiesList("object", zone:computeRarities(zone.object_list, level.level, data.ood, nil))
+	level:setEntitiesList("object", zone:computeRarities("object", zone.object_list, level, data.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]}
-- 
GitLab