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