From c62ae35006c21a5e51a7f2f791bdbc69c01617e7 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 7 Jun 2011 11:01:17 +0000
Subject: [PATCH] New death option: restart a new character

bump to b29


git-svn-id: http://svn.net-core.org/repos/t-engine4@3600 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engines/default/engine/version.lua   |   2 +-
 game/modules/example/init.lua             |   2 +-
 game/modules/example_realtime/init.lua    |   2 +-
 game/modules/tome/dialogs/ArenaFinish.lua |   5 +-
 game/modules/tome/dialogs/Birther.lua     | 117 +++++++++++++++++++---
 game/modules/tome/dialogs/DeathDialog.lua |   9 +-
 game/modules/tome/init.lua                |   4 +-
 7 files changed, 117 insertions(+), 24 deletions(-)

diff --git a/game/engines/default/engine/version.lua b/game/engines/default/engine/version.lua
index a79ee3ab1f..18ff977619 100644
--- a/game/engines/default/engine/version.lua
+++ b/game/engines/default/engine/version.lua
@@ -18,7 +18,7 @@
 -- darkgod@te4.org
 
 -- Engine Version
-engine.version = {0,9,28,"te4",14}
+engine.version = {0,9,29,"te4",14}
 engine.require_c_core = engine.version[5]
 engine.version_id = ("%s-%d_%d.%d.%d"):format(engine.version[4], engine.require_c_core, engine.version[1], engine.version[2], engine.version[3])
 
diff --git a/game/modules/example/init.lua b/game/modules/example/init.lua
index 4d28cc1217..e05737e268 100644
--- a/game/modules/example/init.lua
+++ b/game/modules/example/init.lua
@@ -23,7 +23,7 @@ short_name = "example"
 author = { "DarkGod", "darkgod@te4.org" }
 homepage = "http://te4.org/modules:example"
 version = {1,0,0}
-engine = {0,9,28,"te4"}
+engine = {0,9,29,"te4"}
 description = [[
 This is *NOT* a game, just an example/template to make your own using the T-Engine4.
 ]]
diff --git a/game/modules/example_realtime/init.lua b/game/modules/example_realtime/init.lua
index 360544e890..c63b77eb93 100644
--- a/game/modules/example_realtime/init.lua
+++ b/game/modules/example_realtime/init.lua
@@ -23,7 +23,7 @@ short_name = "example_realtime"
 author = { "DarkGod", "darkgod@te4.org" }
 homepage = "http://te4.org/modules:example"
 version = {1,0,0}
-engine = {0,9,28,"te4"}
+engine = {0,9,29,"te4"}
 description = [[
 This is *NOT* a game, just an example/template to make your own using the T-Engine4.
 ]]
diff --git a/game/modules/tome/dialogs/ArenaFinish.lua b/game/modules/tome/dialogs/ArenaFinish.lua
index 8770c1eb1a..499277b10b 100644
--- a/game/modules/tome/dialogs/ArenaFinish.lua
+++ b/game/modules/tome/dialogs/ArenaFinish.lua
@@ -137,7 +137,9 @@ function _M:use(item)
 		if item.subaction == "none" then
 			util.showMainMenu()
 		elseif item.subaction == "restart" then
-			util.showMainMenu(false, engine.version[4], engine.version[1].."."..engine.version[2].."."..engine.version[3], game.__mod_info.short_name, game.save_name, true, "auto_quickbirth=true")
+			util.showMainMenu(false, engine.version[4], engine.version[1].."."..engine.version[2].."."..engine.version[3], game.__mod_info.short_name, game.save_name, true, ("auto_quickbirth=%q"):format(game:getPlayer(true).name))
+		elseif item.subaction == "restart-new" then
+			util.showMainMenu(false, engine.version[4], engine.version[1].."."..engine.version[2].."."..engine.version[3], game.__mod_info.short_name, game.save_name, true)
 		end
 	elseif act == "cheat" then
 		game.logPlayer(self.actor, "#LIGHT_BLUE#You resurrect! CHEATER !")
@@ -156,6 +158,7 @@ function _M:generateList()
 	if config.settings.cheat then list[#list+1] = {name="Resurrect by cheating", action="cheat"} end
 	list[#list+1] = {name="Character dump", action="dump"}
 	list[#list+1] = {name="Restart the same character", action="exit", subaction="restart"}
+	list[#list+1] = {name="Restart with a new character", action="exit", subaction="restart-new"}
 	list[#list+1] = {name="Exit to main menu", action="exit", subaction="none"}
 
 	self.list = list
diff --git a/game/modules/tome/dialogs/Birther.lua b/game/modules/tome/dialogs/Birther.lua
index 67dca4e888..77bc8b37f4 100644
--- a/game/modules/tome/dialogs/Birther.lua
+++ b/game/modules/tome/dialogs/Birther.lua
@@ -31,6 +31,7 @@ local TextzoneList = require "engine.ui.TextzoneList"
 local Separator = require "engine.ui.Separator"
 local NameGenerator = require "engine.NameGenerator"
 local Module = require "engine.Module"
+local CharacterVaultSave = require "engine.CharacterVaultSave"
 
 module(..., package.seeall, class.inherit(Birther))
 
@@ -46,7 +47,7 @@ function _M:init(title, actor, order, at_end, quickbirth, w, h)
 	self.descriptors = {}
 	self.descriptors_by_type = {}
 
-	self.c_ok = Button.new{text="  Play!  ", fct=function() self:atEnd("created") end}
+	self.c_ok = Button.new{text="     Play!     ", fct=function() self:atEnd("created") end}
 	self.c_random = Button.new{text="Random!", fct=function() self:randomBirth() end}
 	self.c_premade = Button.new{text="Load premade", fct=function() self:loadPremadeUI() end}
 	self.c_cancel = Button.new{text="Cancel", fct=function() self:atEnd("quit") end}
@@ -137,16 +138,32 @@ function _M:init(title, actor, order, at_end, quickbirth, w, h)
 	self:setFocus(self.c_name)
 end
 
+function _M:checkNew(fct)
+	local savename = self.c_name.text:gsub("[^a-zA-Z0-9_-.]", "_")
+	if fs.exists(("/save/%s/game.teag"):format(savename)) then
+		Dialog:yesnoPopup("Overwrite character?", "There is already a character with this name, do you want to overwrite it?", function(ret)
+			if not ret then fct() end
+		end, "No", "Yes")
+	else
+		fct()
+	end
+end
+
 function _M:atEnd(v)
-	if v == "created" then
-		game:unregisterDialog(self)
-		self:apply()
-		game:setPlayerName(self.c_name.text)
-		self.at_end(false)
+	if v == "created" and not self.ui_by_ui[self.c_ok].hidden then
+		self:checkNew(function()
+			game:unregisterDialog(self)
+			self:apply()
+			game:setPlayerName(self.c_name.text)
+			self.at_end(false)
+		end)
 	elseif v == "loaded" then
-		game:unregisterDialog(self)
-		self.at_end(true)
-	else
+		self:checkNew(function()
+			game:unregisterDialog(self)
+			game:setPlayerName(self.c_name.text)
+			self.at_end(true)
+		end)
+	elseif v == "quit" then
 		util.showMainMenu()
 	end
 end
@@ -525,10 +542,10 @@ function _M:generateClasses()
 end
 
 function _M:loadPremade(pm)
-	local fallback = false
+	local fallback = pm.force_fallback
 
 	-- Load the entities directly
-	if pm.module_version and pm.module_version[1] == game.__mod_info.version[1] and pm.module_version[2] == game.__mod_info.version[2] and pm.module_version[3] == game.__mod_info.version[3] then
+	if not fallback and pm.module_version and pm.module_version[1] == game.__mod_info.version[1] and pm.module_version[2] == game.__mod_info.version[2] and pm.module_version[3] == game.__mod_info.version[3] then
 		savefile_pipe:ignoreSaveToken(true)
 		local qb = savefile_pipe:doLoad(pm.short_name, "entity", "engine.CharacterVaultSave", "character")
 		savefile_pipe:ignoreSaveToken(false)
@@ -538,6 +555,7 @@ function _M:loadPremade(pm)
 			game.party = qb
 			game.player = nil
 			game.party:setPlayer(1, true)
+			self.c_name:setText(game.player.name)
 			self:atEnd("loaded")
 		else
 			fallback = true
@@ -548,8 +566,57 @@ function _M:loadPremade(pm)
 
 	-- Fill in the descriptors and validate
 	if fallback then
+		local ok = 0
+
+		-- Name
 		self.c_name:setText(pm.short_name)
---		self.
+
+		-- Sex
+		self.c_male.checked = pm.descriptors.sex == "Male"
+		self.c_female.checked = pm.descriptors.sex == "Female"
+		self:setDescriptor("sex", pm.descriptors.sex and "Male" or "Female")
+
+		-- Campaign
+		for i, item in ipairs(self.all_campaigns) do if not item.locked and item.id == pm.descriptors.world then
+			self:campaignUse(item)
+			self.c_campaign.c_list.sel = i
+			ok = ok + 1
+			break
+		end end
+
+		-- Difficulty
+		for i, item in ipairs(self.all_difficulties) do if not item.locked and item.id == pm.descriptors.difficulty then
+			self:difficultyUse(item)
+			self.c_difficulty.c_list.sel = i
+			ok = ok + 1
+			break
+		end end
+
+		-- Race
+		for i, pitem in ipairs(self.all_races) do
+			for j, item in ipairs(pitem.nodes) do
+				if not item.locked and item.id == pm.descriptors.subrace and pitem.id == pm.descriptors.race then
+					self:raceUse(pitem)
+					self:raceUse(item)
+					ok = ok + 1
+					break
+				end
+			end
+		end
+
+		-- Class
+		for i, pitem in ipairs(self.all_classes) do
+			for j, item in ipairs(pitem.nodes) do
+				if not item.locked and item.id == pm.descriptors.subclass and pitem.id == pm.descriptors.class then
+					self:classUse(pitem)
+					self:classUse(item)
+					ok = ok + 1
+					break
+				end
+			end
+		end
+
+		if ok == 4 then self:atEnd("created") end
 	end
 end
 
@@ -558,8 +625,6 @@ function _M:loadPremadeUI()
 	local d = Dialog.new("Characters Vault", 600, 550)
 
 	local sel = nil
-	local load = Button.new{text=" Load ", fct=function() if sel then self:loadPremade(sel) game:unregisterDialog(d) end end}
-	local del = Button.new{text="Delete", fct=function() end}
 	local desc = TextzoneList.new{width=220, height=400}
 	local list list = List.new{width=350, list=lss, height=400,
 		fct=function(item)
@@ -575,6 +640,17 @@ function _M:loadPremadeUI()
 	}
 	local sep = Separator.new{dir="horizontal", size=400}
 
+	local load = Button.new{text=" Load ", fct=function() if sel then self:loadPremade(sel) game:unregisterDialog(d) end end}
+	local del = Button.new{text="Delete", fct=function() if sel then
+		local vault = CharacterVaultSave.new(sel.short_name)
+		vault:delete()
+		vault:close()
+		lss = Module:listVaultSavesForCurrent()
+		list.list = lss
+		list:generate()
+		sel = nil
+	end end}
+
 	d:loadUI{
 		{left=0, top=0, ui=list},
 		{left=list.w, top=0, ui=sep},
@@ -591,4 +667,15 @@ end
 -- Disable stuff from the base Birther
 function _M:updateList() end
 function _M:selectType(type) end
-function _M:on_register() end
+
+function _M:on_register()
+	if __module_extra_info.auto_quickbirth then
+		local lss = Module:listVaultSavesForCurrent()
+		for i, pm in ipairs(lss) do
+			if pm.short_name == __module_extra_info.auto_quickbirth then
+				self:loadPremade(pm)
+				break
+			end
+		end
+	end
+end
diff --git a/game/modules/tome/dialogs/DeathDialog.lua b/game/modules/tome/dialogs/DeathDialog.lua
index aa9a938f99..c5fbe0d846 100644
--- a/game/modules/tome/dialogs/DeathDialog.lua
+++ b/game/modules/tome/dialogs/DeathDialog.lua
@@ -54,10 +54,10 @@ end
 --- Clean the actor from debuffs/buffs
 function _M:cleanActor(actor)
 	local effs = {}
-	
+
 	-- Remove chronoworlds
 	if game._chronoworlds then game._chronoworlds = nil end
-	
+
 	-- Go through all spell effects
 	for eff_id, p in pairs(actor.tmp) do
 		local e = actor.tempeffect_def[eff_id]
@@ -174,7 +174,9 @@ function _M:use(item)
 		if item.subaction == "none" then
 			util.showMainMenu()
 		elseif item.subaction == "restart" then
-			util.showMainMenu(false, engine.version[4], engine.version[1].."."..engine.version[2].."."..engine.version[3], game.__mod_info.short_name, game.save_name, true, "auto_quickbirth=true")
+			util.showMainMenu(false, engine.version[4], engine.version[1].."."..engine.version[2].."."..engine.version[3], game.__mod_info.short_name, game.save_name, true, ("auto_quickbirth=%q"):format(game:getPlayer(true).name))
+		elseif item.subaction == "restart-new" then
+			util.showMainMenu(false, engine.version[4], engine.version[1].."."..engine.version[2].."."..engine.version[3], game.__mod_info.short_name, game.save_name, true)
 		end
 	elseif act == "dump" then
 		game:registerDialog(require("mod.dialogs.CharacterSheet").new(self.actor))
@@ -251,6 +253,7 @@ function _M:generateList()
 
 	list[#list+1] = {name="Character dump", action="dump"}
 	list[#list+1] = {name="Restart the same character", action="exit", subaction="restart"}
+	list[#list+1] = {name="Restart with a new character", action="exit", subaction="restart-new"}
 	list[#list+1] = {name="Exit to main menu", action="exit", subaction="none"}
 
 	self.list = list
diff --git a/game/modules/tome/init.lua b/game/modules/tome/init.lua
index c956d4a48b..5b649c668b 100644
--- a/game/modules/tome/init.lua
+++ b/game/modules/tome/init.lua
@@ -22,8 +22,8 @@ long_name = "Tales of Maj'Eyal: Age of Ascendancy"
 short_name = "tome"
 author = { "DarkGod", "darkgod@te4.org" }
 homepage = "http://tome.te4.org/"
-version = {3,9,28}
-engine = {0,9,28,"te4"}
+version = {3,9,29}
+engine = {0,9,29,"te4"}
 description = [[
 Welcome to Maj'Eyal.
 
-- 
GitLab