From 2e7de77b14b80c503ccc77c9937a6a0a5df20079 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 5 Jul 2011 16:51:57 +0000
Subject: [PATCH] moddable tiles show up in the new birther

git-svn-id: http://svn.net-core.org/repos/t-engine4@3804 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/Game.lua              |  1 +
 .../tome/data/zones/town-angolwen/zone.lua    |  2 +-
 game/modules/tome/dialogs/Birther.lua         | 58 +++++++++++++++++--
 3 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index ed059d3398..88358fd17b 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -256,6 +256,7 @@ function _M:newGame()
 			self.player:resolve(nil, true)
 			self.player.energy.value = self.energy_to_act
 			Map:setViewerFaction(self.player.faction)
+			self.player:updateModdableTile()
 
 			self.paused = true
 			print("[PLAYER BIRTH] resolved!")
diff --git a/game/modules/tome/data/zones/town-angolwen/zone.lua b/game/modules/tome/data/zones/town-angolwen/zone.lua
index c8c60fd30b..f372857a67 100644
--- a/game/modules/tome/data/zones/town-angolwen/zone.lua
+++ b/game/modules/tome/data/zones/town-angolwen/zone.lua
@@ -33,7 +33,7 @@ return {
 	persistent = "zone",
 	ambient_music = "Dreaming of Flying.ogg",
 
-	min_material_level = function() return game.state:isAdvanced() and 3 or 2 end,
+	min_material_level = function() return game.state:isAdvanced() and 3 or 1 end,
 	max_material_level = function() return game.state:isAdvanced() and 4 or 3 end,
 
 	generator =  {
diff --git a/game/modules/tome/dialogs/Birther.lua b/game/modules/tome/dialogs/Birther.lua
index 30e1828de8..9a0a543def 100644
--- a/game/modules/tome/dialogs/Birther.lua
+++ b/game/modules/tome/dialogs/Birther.lua
@@ -35,6 +35,7 @@ local Module = require "engine.Module"
 local Tiles = require "engine.Tiles"
 local Particles = require "engine.Particles"
 local CharacterVaultSave = require "engine.CharacterVaultSave"
+local Object = require "mod.class.Object"
 
 module(..., package.seeall, class.inherit(Birther))
 
@@ -48,6 +49,10 @@ function _M:init(title, actor, order, at_end, quickbirth, w, h)
 
 	Dialog.init(self, title and title or "Character Creation", w or 600, h or 400)
 
+	self.obj_list = Object:loadList("/data/general/objects/objects.lua")
+	self.obj_list_by_name = {}
+	for i, e in ipairs(self.obj_list) do if e.name and e.rarity then self.obj_list_by_name[e.name] = e end end
+
 	self.descriptors = {}
 	self.descriptors_by_type = {}
 
@@ -166,12 +171,14 @@ function _M:atEnd(v)
 			local ps = self.actor:getParticlesList()
 			for i, p in ipairs(ps) do self.actor:removeParticles(p) end
 			self.actor:defineDisplayCallback()
-			if self.actor._mo then self.actor._mo:invalidate() end
-			self.actor._mo = nil
+			self.actor:removeAllMOs()
 
 			game:unregisterDialog(self)
 			self:apply()
-			if self.actor.has_custom_tile then self.actor.make_tile = nil self.actor.moddable_tile = nil end
+			if self.actor.has_custom_tile then
+				self.actor.make_tile = nil
+				self.actor.moddable_tile = nil
+			end
 			game:setPlayerName(self.c_name.text)
 			self.at_end(false)
 		end)
@@ -724,11 +731,51 @@ function _M:innerDisplay(x, y, nb_keyframes)
 	end
 end
 
+--- Fake a body & starting equipment
+function _M:fakeEquip(v)
+	if not v then
+		self.actor.body = nil
+		self.actor.inven = {}
+	else
+		self.actor.inven = {}
+		local fake_body = { INVEN = 1000, QS_MAINHAND = 1, QS_OFFHAND = 1, MAINHAND = 1, OFFHAND = 1, FINGER = 2, NECK = 1, LITE = 1, BODY = 1, HEAD = 1, CLOAK = 1, HANDS = 1, BELT = 1, FEET = 1, TOOL = 1, QUIVER = 1, MOUNT = 1 }
+		self.actor.body = fake_body
+		self.actor:initBody()
+
+		local c = self.birth_descriptor_def.class[self.descriptors_by_type.class or "Warrior"]
+		local sc = self.birth_descriptor_def.subclass[self.descriptors_by_type.subclass or "Fighter"]
+		local function apply_equip(r)
+			for i, f in ipairs(r[1]) do
+				local o = self.obj_list_by_name[f.name]
+				if o and o.slot then
+					o = o:clone()
+					o:resolve()
+					o:resolve(nil, true)
+					local inven = self.actor:getInven(o.slot)
+					if inven[1] and o.offslot then inven = self.actor:getInven(o.offslot) end
+					if not inven[1] then inven[1] = o end
+				end
+			end
+		end
+
+		for _, r in pairs(c.copy or {}) do if type(r) == "table" and r.__resolver == "equip" then apply_equip(r) end end
+		for _, r in pairs(sc.copy or {}) do if type(r) == "table" and r.__resolver == "equip" then apply_equip(r) end end
+	end
+end
+
 function _M:setTile(f, w, h)
+	self.actor:removeAllMOs()
 	if not f then
 		if not self.actor.has_custom_tile and self.descriptors_by_type.subrace and self.descriptors_by_type.sex then
+			local dr = self.birth_descriptor_def.subrace[self.descriptors_by_type.subrace]
+			local ds = self.birth_descriptor_def.sex[self.descriptors_by_type.sex]
 			self.actor.image = "player/"..self.descriptors_by_type.subrace:lower():gsub("[^a-z0-9_]", "_").."_"..self.descriptors_by_type.sex:lower():gsub("[^a-z0-9_]", "_")..".png"
 			self.actor.add_mos = nil
+			self.actor.female = ds.copy.female
+			self.actor.male = ds.copy.male
+			self.actor.moddable_tile = dr.copy.moddable_tile
+			self.actor.moddable_tile_base = dr.copy.moddable_tile_base
+			self.actor.moddable_tile_ornament = dr.copy.moddable_tile_ornament
 		end
 	else
 		self.actor.make_tile = nil
@@ -741,8 +788,9 @@ function _M:setTile(f, w, h)
 		end
 		self.actor.has_custom_tile = f
 	end
-	if self.actor._mo then self.actor._mo:invalidate() end
-	self.actor._mo = nil
+	self:fakeEquip(true)
+	self.actor:updateModdableTile()
+	self:fakeEquip(false)
 
 	-- Add an example particles if any
 	local ps = self.actor:getParticlesList()
-- 
GitLab