Loading

饥荒 死亡后不删存档的办法

饥荒是个自由度很高的游戏,shark工作组确实厉害,不过新手面对无穷尽的死亡还是很头疼。

下面两句mod里的代码注释后可以防止删档,当任务死亡后只需要按esc正常quit,小退下重进就可以了从最近的存档恢复。

目录每个版本都不一样,只要在安装目录下搜索到gamelogic.lua文件就可以了。

在OnPlayerDeath方法中注释所有调用HandleDeathCleanup的方法就可以了。

注释方法就是在句首加上“--”。

最后贴上最新版的完整代码,覆盖前友情提醒先备份原版的代码。

require "mods"
require "playerprofile"
require "saveindex"
require "screens/mainscreen"
require "screens/deathscreen"
require "screens/popupdialog"
require "screens/bigpopupdialog"
require "screens/endgamedialog"

Print (VERBOSITY.DEBUG, "[Loading frontend assets]")

local start_game_time = nil

TheSim:SetRenderPassDefaultEffect( RENDERPASS.BLOOM, "data/shaders/anim_bloom.ksh" )
TheSim:SetErosionTexture( "data/images/erosion.tex" )


--this is suuuuuper placeholdery. We need to think about how to handle all of the different types of updates for this
local function DoAgeWorld()
	for k,v in pairs(Ents) do

		--spoil all of the spoilables
		if v.components.perishable then
			v.components.perishable:Perish()
		end
		
		--send things to their homes
		if v.components.homeseeker and v.components.homeseeker.home then
			
			if v.components.homeseeker.home.components.childspawner then
				v.components.homeseeker.home.components.childspawner:GoHome(v)
			end
			
			if v.components.homeseeker.home.components.spawner then
				v.components.homeseeker.home.components.spawner:GoHome(v)
			end
			
		end
		
		if v.components.fueled then
			v.components.fueled:MakeEmpty()
		end
		
	end
end

local function LoadAssets(fe)

	local be_prefabs = {"hud", "forest", "cave", "ceiling", "maxwell", "fire", "character_fire", "shatter"}
	local fe_prefabs = {"frontend"}

	local recipe_prefabs = {}
	for k,v in pairs(Recipes) do
		table.insert(recipe_prefabs, v.name)
		if v.placer then
			table.insert(recipe_prefabs, v.placer)
		end
	end

	if fe then
		print ("LOAD FE")
		TheSim:LoadPrefabs(fe_prefabs)
		TheSim:UnloadPrefabs(be_prefabs)
		TheSim:UnloadPrefabs(recipe_prefabs)
		print ("LOAD FE: done")
	else
		print ("LOAD BE")
		TheSim:UnloadPrefabs(fe_prefabs)
		TheSim:LoadPrefabs(be_prefabs)
		TheSim:LoadPrefabs(recipe_prefabs)
		print ("LOAD BE: done")
	end
end

function GetTimePlaying()
	if not start_game_time then
		return 0
	end
	return GetTime() - start_game_time 
end

function CalculatePlayerRewards(wilson)
	local Progression = require "progressionconstants"
	
	print("Calculating progression")
	
	--increment the xp counter and give rewards
	local days_survived = GetClock().numcycles
	local start_xp = wilson.profile:GetXP()
	local reward_xp = Progression.GetXPForDays(days_survived)
	local new_xp = math.min(start_xp + reward_xp, Progression.GetXPCap())
        
	local all_rewards = Progression.GetRewardsForTotalXP(new_xp)
	for k,v in pairs(all_rewards) do
		wilson.profile:UnlockCharacter(v)
	end
	wilson.profile:SetXP(new_xp)

	print("Progression: ",days_survived, start_xp, reward_xp, new_xp)
	return days_survived, start_xp, reward_xp, new_xp
end


local function HandleDeathCleanup(wilson, data)
    local game_time = GetClock():ToMetricsString()

    if SaveGameIndex:GetCurrentMode() == "survival" then
	    local playtime = GetTimePlaying()
	    playtime = math.floor(playtime*1000)
	    SetTimingStat("time", "scenario", playtime)
	    SendTrackingStats()
	    local days_survived, start_xp, reward_xp, new_xp = CalculatePlayerRewards(wilson)
	    
	    ProfileStatsSet("xp_gain", reward_xp)
	    ProfileStatsSet("xp_total", new_xp)
	    SubmitCompletedLevel() --close off the instance

	    wilson.components.health.invincible = true

	    wilson.profile:Save(function()
		    SaveGameIndex:EraseCurrent(function() 
				    scheduler:ExecuteInTime(3, function() 
						TheFrontEnd:PushScreen(DeathScreen(days_survived, start_xp))
					end)
		    	end)
		    end)
	elseif SaveGameIndex:GetCurrentMode() == "adventure" then

		SaveGameIndex:OnFailAdventure(function()
		    scheduler:ExecuteInTime(3, function() 
				TheFrontEnd:Fade(false, 3, function()
						local params = json.encode{reset_action="loadslot", save_slot = SaveGameIndex:GetCurrentSaveSlot(), playeranim="failadventure"}
						TheSim:SetInstanceParameters(params)
						TheSim:Reset()
					end)
				end)
			end)	
	elseif SaveGameIndex:GetCurrentMode() == "cave" then
		scheduler:ExecuteInTime(2, function()
				TheFrontEnd:Fade(false, 2, function()
						for k,v in pairs(Ents) do
							if v.prefab == "cave_exit" then
								GetPlayer().Transform:SetPosition(v.Transform:GetWorldPosition())
								break
							end
						end
						
						DoAgeWorld()
						
						SaveGameIndex:SaveCurrent(function()
							SaveGameIndex:OnFailCave(function()
								local params = json.encode{reset_action="loadslot", save_slot = SaveGameIndex:GetCurrentSaveSlot(), playeranim="failcave"}
								TheSim:SetInstanceParameters(params)
								TheSim:Reset()
							end)
						end)
					end)
				end)

	end
end

local function OnPlayerDeath(wilson, data)

	local cause = data.cause or "unknown"
	local will_resurrect = wilson.components.resurrectable and wilson.components.resurrectable:CanResurrect() 

	
    TheMixer:PushMix("death")
    wilson.HUD:Hide()
    
    local game_time = GetClock():ToMetricsString()
    
	RecordDeathStats(cause, GetClock():GetPhase(), wilson.components.sanity.current, wilson.components.hunger.current, will_resurrect)

	ProfileStatsAdd("killed_by_"..cause)
    
    ProfileStatsAdd("deaths")

    --local res = TheSim:FindFirstEntityWithTag("resurrector")
    
	if will_resurrect then
        scheduler:ExecuteInTime(4, function()  
            TheMixer:PopMix("death")
            if wilson.components.resurrectable:DoResurrect() then
				ProfileStatsAdd("resurrections")
			else
				--HandleDeathCleanup(wilson, data)
			end
        end)
    else
		--HandleDeathCleanup(wilson, data)
    end
end


function SetUpPlayerCharacterCallbacks(wilson)
    --set up on ondeath handler
    wilson:ListenForEvent( "death", function(inst, data) OnPlayerDeath(wilson, data) end)
    wilson:ListenForEvent( "quit",
        function()
            Print (VERBOSITY.DEBUG, "I SHOULD QUIT!")
            TheMixer:PushMix("death")
            wilson.HUD:Hide()
            local playtime = GetTimePlaying()
            playtime = math.floor(playtime*1000)
            
            RecordQuitStats()
            SetTimingStat("time", "scenario", playtime)
            ProfileStatsSet("time_played", playtime)
            SendTrackingStats()
            SendAccumulatedProfileStats()
            
			TheSim:SetInstanceParameters()
			TheSim:Reset()
        end)        
    
    wilson:ListenForEvent( "daycomplete", 
        function(it, data) 
            if not wilson.components.health:IsDead() then
                RecordEndOfDayStats()
                ProfileStatsAdd("nights_survived_iar")
				SendAccumulatedProfileStats()
            end
        end, GetWorld()) 
        
    --[[wilson:ListenForEvent( "daytime", 
        function(it, data) 
            if not wilson.components.health:IsDead() and not wilson.is_teleporting then
				--print("Day has arrived...")
				--SaveGameIndex:SaveCurrent()
            end
        end, GetWorld()) 
	--]]
    wilson:ListenForEvent("builditem", function(inst, data) ProfileStatsAdd("build_item_"..data.item.prefab) end)    
    wilson:ListenForEvent("buildstructure", function(inst, data) ProfileStatsAdd("build_structure_"..data.item.prefab) end)
end


local function StartGame(wilson)
	
	TheFrontEnd:GetSound():KillSound("FEMusic") -- just in case...
	
	start_game_time = GetTime()
	SetUpPlayerCharacterCallbacks(wilson)
end


local deprecated = { turf_webbing = true }
local replace = { 
				farmplot = "slow_farmplot", farmplot2 = "fast_farmplot", 
				farmplot3 = "fast_farmplot", sinkhole= "cave_entrance",
				cave_stairs= "cave_entrance"
			}

function PopulateWorld(savedata, profile, playercharacter, playersavedataoverride)
    
    playercharacter = playercharacter or "wilson"
	Print(VERBOSITY.DEBUG, "PopulateWorld")
 	Print(VERBOSITY.DEBUG,  "[Instantiating objects...]" )
 	local wilson = nil
    if savedata then

        --figure out our start info
        local spawnpoint = Vector3(0,0,0)
        local playerdata = {}
        if savedata.playerinfo then
        
            if savedata.playerinfo.x and savedata.playerinfo.z then
				local y = savedata.playerinfo.y or 0
                spawnpoint = Vector3(savedata.playerinfo.x, y, savedata.playerinfo.z)
            end
            
            if savedata.playerinfo.data then
                playerdata = savedata.playerinfo.data
            end
        end
        
		if playersavedataoverride then
			playerdata = playersavedataoverride
		end
		
		local newents = {}
		

		--local world = SpawnPrefab("forest")
		local world = nil
		local ceiling = nil
		if savedata.map.prefab == "cave" then
			world = SpawnPrefab("cave")
			ceiling = SpawnPrefab("ceiling")
		else
			world = SpawnPrefab("forest")
		end
		
		
        --spawn the player character and set him up
        TheSim:LoadPrefabs{playercharacter}
        wilson = SpawnPrefab(playercharacter)
        assert(wilson, "could not spawn player character")
        wilson:SetProfile(Profile)
        wilson.Transform:SetPosition(spawnpoint:Get())

        --this was spawned by the level file. kinda lame - we should just do everything from in here.
        local ground = GetWorld()
        if ground then


            if GetCeiling() then
	        	GetCeiling().MapCeiling:SetSize(savedata.map.width, savedata.map.height)
	        	GetCeiling().MapCeiling:SetFromString(savedata.map.tiles)
	        	GetCeiling().MapCeiling:Finalize(TheSim:GetSetting("graphics", "static_walls") == "true")
	        end

            ground.Map:SetSize(savedata.map.width, savedata.map.height)
	        if savedata.map.prefab == "cave" then
	        	ground.Map:SetPhysicsWallDistance(0.75)--0) -- TEMP for STREAM
	        else
	        	ground.Map:SetPhysicsWallDistance(0)--0.75)
	        end

            ground.Map:SetFromString(savedata.map.tiles)
            ground.Map:Finalize()
	        



            if savedata.map.nav then
             	print("Loading Nav Grid")
             	ground.Map:SetNavSize(savedata.map.width, savedata.map.height)
             	ground.Map:SetNavFromString(savedata.map.nav)
             else
             	print("No Nav Grid")
            end
			
            ground.hideminimap = savedata.map.hideminimap
			ground.topology = savedata.map.topology
			ground.meta = savedata.meta
			assert(savedata.map.topology.ids, "[MALFORMED SAVE DATA] Map missing topology information. This save file is too old, and is missing neccessary information.")
			
			for i=#savedata.map.topology.ids,1, -1 do
				local name = savedata.map.topology.ids[i]
				if string.find(name, "LOOP_BLANK_SUB") ~= nil then
					table.remove(savedata.map.topology.ids, i)
					table.remove(savedata.map.topology.nodes, i)
					for eid=#savedata.map.topology.edges,1,-1 do
						if savedata.map.topology.edges[eid].n1 == i or savedata.map.topology.edges[eid].n2 == i then
							table.remove(savedata.map.topology.edges, eid)
						end
					end
				end
			end		
			
			if ground.topology.level_number ~= nil then
				require("map/levels")
				if levels.story_levels[ground.topology.level_number] ~= nil then
					profile:UnlockWorldGen("preset", levels.story_levels[ground.topology.level_number].name)
				end
			end
			
			wilson:AddComponent("area_aware")
			--wilson:AddComponent("area_unlock")
			
			if ground.topology.override_triggers then
				wilson:AddComponent("area_trigger")
				
				wilson.components.area_trigger:RegisterTriggers(ground.topology.override_triggers)
			end
				
			
			for i,node in ipairs(ground.topology.nodes) do
				local story = ground.topology.ids[i]
				-- guard for old saves
				local story_depth = nil
				if ground.topology.story_depths then
					story_depth = ground.topology.story_depths[i]
				end
				if story ~= "START" then
					story = string.sub(story, 1, string.find(story,":")-1)
--					
--					if Profile:IsWorldGenUnlocked("tasks", story) == false then
--						wilson.components.area_unlock:RegisterStory(story)
--					end
				end
				wilson.components.area_aware:RegisterArea({idx=i, type=node.type, poly=node.poly, story=story, story_depth=story_depth})
								
				if node.type == "Graveyard" or node.type == "MistyCavern" then
					if node.area_emitter == nil then

						local mist = SpawnPrefab( "mist" )
						mist.Transform:SetPosition( node.cent[1], 0, node.cent[2] )
						mist.components.emitter.area_emitter = CreateAreaEmitter( node.poly, node.cent )
						
						if node.area == nil then
							node.area = 1
						end
						
						mist.components.emitter.density_factor = math.ceil(node.area / 4)/31
						mist.components.emitter:Emit()
					end
				end

			end

			if savedata.map.persistdata ~= nil then
				ground:SetPersistData(savedata.map.persistdata)
			end

			
			wilson.components.area_aware:StartCheckingPosition()
        end
        
        
        wilson:SetPersistData(playerdata, newents)
        if wilson.components.health.currenthealth == 0 then
			wilson.components.health.currenthealth = 1
        end
        if savedata.playerinfo and savedata.playerinfo.id then
            newents[savedata.playerinfo.id] = {entity=wilson, data=playerdata} 
        end
        
        
        --set the clock (LEGACY! this is now handled via the world object's normal serialization)
        if savedata.playerinfo.day and savedata.playerinfo.dayphase and savedata.playerinfo.timeleftinera then
	        
			GetClock().numcycles = savedata.playerinfo and savedata.playerinfo.day or 0
			if savedata.playerinfo and savedata.playerinfo.dayphase == "night" then
        		GetClock():StartNight(true)
			elseif savedata.playerinfo and savedata.playerinfo.dayphase == "dusk" then
        		GetClock():StartDusk(true)
      		else 
        		GetClock():StartDay(true)
			end
	        
			if savedata.playerinfo.timeleftinera then
				GetClock().timeLeftInEra = savedata.playerinfo.timeleftinera
			end
		end

        -- Force overrides for ambient
		local retune = require("tuning_override")
		retune.OVERRIDES["areaambientdefault"].doit(savedata.map.prefab)

		-- Check for map overrides
		if ground.topology.overrides ~= nil and ground.topology.overrides ~= nil and GetTableSize(ground.topology.overrides) > 0 then			
			for area, overrides in pairs(ground.topology.overrides) do	
				for i,override in ipairs(overrides) do	
					if retune.OVERRIDES[override[1]] ~= nil then
						retune.OVERRIDES[override[1]].doit(override[2])
					end
				end
			end
		end
        
        --instantiate all the dudes
        for prefab, ents in pairs(savedata.ents) do
			local prefab = replace[prefab] or prefab
       		if not deprecated[prefab] then
                for k,v in ipairs(ents) do
                    v.prefab = v.prefab or prefab -- prefab field is stripped out when entities are saved in global entity collections, so put it back
					SpawnSaveRecord(v, newents)
				end
			end
        end    
    
        --post pass in neccessary to hook up references
        for k,v in pairs(newents) do
            v.entity:LoadPostPass(newents, v.data)
        end
        GetWorld():LoadPostPass(newents, savedata.map.persistdata)
        

		--Run scenario scripts
        for guid, ent in pairs(Ents) do
			if ent.components.scenariorunner then
				ent.components.scenariorunner:Run()
			end
		end

		--Record mod information
		ModManager:SetModRecords(savedata.mods or {})
        
        if SaveGameIndex:GetCurrentMode() ~= "adventure" and GetWorld().components.age and GetPlayer().components.age then
			local player_age = GetPlayer().components.age:GetAge()
			local world_age = GetWorld().components.age:GetAge()
			
			if world_age <= 0 then
				GetWorld().components.age.saved_age = player_age
			elseif player_age > world_age then
				local catch_up = player_age - world_age 
				print ("Catching up world", catch_up)
				LongUpdate(catch_up, true)
				
				--this is a cheesy workaround for coming out of a cave at night, so you don't get immediately eaten
				if SaveGameIndex:GetCurrentMode() == "survival" and not GetWorld().components.clock:IsDay() then
					local light = SpawnPrefab("exitcavelight")
					light.Transform:SetPosition(GetPlayer().Transform:GetWorldPosition())
				end
				
			end
        end
    
    else
        Print(VERBOSITY.ERROR, "[MALFORMED SAVE DATA] PopulateWorld complete" )
        return
    end

	Print(VERBOSITY.DEBUG, "[FINISHED LOADING SAVED GAME] PopulateWorld complete" )
	return wilson
end


local function DrawDebugGraph(graph)
	-- debug draw of new map gen
	local debugdrawmap = CreateEntity()
	local draw = debugdrawmap.entity:AddDebugRender()
	draw:SetZ(0.1)
	
	
	for idx,node in ipairs(graph.nodes) do
		local colour = graph.colours[node.c]
		
		for i =1, #node.poly-1 do
			draw:Line(node.poly[i][1], node.poly[i][2], node.poly[i+1][1], node.poly[i+1][2], colour.r, colour.g, colour.b, 255)
		end
		draw:Line(node.poly[1][1], node.poly[1][2], node.poly[#node.poly][1], node.poly[#node.poly][2], colour.r, colour.g, colour.b, 255)
		
		draw:Poly(node.cent[1], node.cent[2], colour.r, colour.g, colour.b, colour.a, node.poly)
			
		draw:String(graph.ids[idx].."("..node.cent[1]..","..node.cent[2]..")", 	node.cent[1], node.cent[2], node.ts)
	end 
	
	draw:SetZ(0.15)

	for idx,edge in ipairs(graph.edges) do
		if edge.n1 ~= nil and edge.n2 ~= nil then
			local colour = graph.colours[edge.c]
			
			local n1 = graph.nodes[edge.n1]
			local n2 = graph.nodes[edge.n2]
			if n1 ~= nil and n2 ~= nil then
				draw:Line(n1.cent[1], n1.cent[2], n2.cent[1], n2.cent[2], colour.r, colour.g, colour.b, colour.a)
			end
		end
	end 
end

--OK, we have our savedata and a profile. Instatiate everything and start the game!
function DoInitGame(playercharacter, savedata, profile, next_world_playerdata, fast)	
	--print("DoInitGame",playercharacter, savedata, profile, next_world_playerdata, fast)
	TheFrontEnd:ClearScreens()	
	LoadAssets(false)
	
	assert(savedata.map, "Map missing from savedata on load")
	assert(savedata.map.prefab, "Map prefab missing from savedata on load")
	assert(savedata.map.tiles, "Map tiles missing from savedata on load")
	assert(savedata.map.width, "Map width missing from savedata on load")
	assert(savedata.map.height, "Map height missing from savedata on load")
	
	assert(savedata.map.topology, "Map topology missing from savedata on load")
	assert(savedata.map.topology.ids, "Topology entity ids are missing from savedata on load")
	--assert(savedata.map.topology.story_depths, "Topology story_depths are missing from savedata on load")
	assert(savedata.map.topology.colours, "Topology colours are missing from savedata on load")
	assert(savedata.map.topology.edges, "Topology edges are missing from savedata on load")
	assert(savedata.map.topology.nodes, "Topology nodes are missing from savedata on load")
	assert(savedata.map.topology.level_type, "Topology level type is missing from savedata on load")
	assert(savedata.map.topology.overrides, "Topology overrides is missing from savedata on load")
        
	assert(savedata.playerinfo, "Playerinfo missing from savedata on load")
	assert(savedata.playerinfo.x, "Playerinfo.x missing from savedata on load")
	--assert(savedata.playerinfo.y, "Playerinfo.y missing from savedata on load")   --y is often omitted for space, don't check for it
	assert(savedata.playerinfo.z, "Playerinfo.z missing from savedata on load")
	--assert(savedata.playerinfo.day, "Playerinfo day missing from savedata on load")

	assert(savedata.ents, "Entites missing from savedata on load")
	
	if savedata.map.roads then
		Roads = savedata.map.roads
		for k, road_data in pairs( savedata.map.roads ) do
			RoadManager:BeginRoad()
			local weight = road_data[1]
			
			if weight == 3 then
				for i = 2, #road_data do
					local ctrl_pt = road_data[i]
					RoadManager:AddControlPoint( ctrl_pt[1], ctrl_pt[2] )
				end

				for k, v in pairs( ROAD_STRIPS ) do
					RoadManager:SetStripEffect( v, "data/shaders/road.ksh" )
				end
				
				RoadManager:SetStripTextures( ROAD_STRIPS.EDGES,	"data/images/roadedge.tex",		"data/images/roadnoise.tex" )
				RoadManager:SetStripTextures( ROAD_STRIPS.CENTER,	"data/images/square.tex",		"data/images/roadnoise.tex" )
				RoadManager:SetStripTextures( ROAD_STRIPS.CORNERS,	"data/images/roadcorner.tex",	"data/images/roadnoise.tex" )
				RoadManager:SetStripTextures( ROAD_STRIPS.ENDS,		"data/images/roadendcap.tex",	"data/images/roadnoise.tex" )
			
				RoadManager:GenerateVB(
						ROAD_PARAMETERS.NUM_SUBDIVISIONS_PER_SEGMENT,
						ROAD_PARAMETERS.MIN_WIDTH, ROAD_PARAMETERS.MAX_WIDTH,
						ROAD_PARAMETERS.MIN_EDGE_WIDTH, ROAD_PARAMETERS.MAX_EDGE_WIDTH,
						ROAD_PARAMETERS.WIDTH_JITTER_SCALE, true )
			else
				for i = 2, #road_data do
					local ctrl_pt = road_data[i]
					RoadManager:AddControlPoint( ctrl_pt[1], ctrl_pt[2] )
				end
				
				for k, v in pairs( ROAD_STRIPS ) do
					RoadManager:SetStripEffect( v, "data/shaders/road.ksh" )
				end
				RoadManager:SetStripTextures( ROAD_STRIPS.EDGES,	"data/images/roadedge.tex",		"data/images/pathnoise.tex" )
				RoadManager:SetStripTextures( ROAD_STRIPS.CENTER,	"data/images/square.tex",		"data/images/pathnoise.tex" )
				RoadManager:SetStripTextures( ROAD_STRIPS.CORNERS,	"data/images/roadcorner.tex",	"data/images/pathnoise.tex" )
				RoadManager:SetStripTextures( ROAD_STRIPS.ENDS,		"data/images/roadendcap.tex",	"data/images/pathnoise.tex" )
				
				RoadManager:GenerateVB(
						ROAD_PARAMETERS.NUM_SUBDIVISIONS_PER_SEGMENT,
						0, 0,
						ROAD_PARAMETERS.MIN_EDGE_WIDTH*4, ROAD_PARAMETERS.MAX_EDGE_WIDTH*4,
						0, false )						
				--[[
			else
				for i = 2, #road_data do
					local ctrl_pt = road_data[i]
					RoadManager:AddSmoothedControlPoint( ctrl_pt[1], ctrl_pt[2] )
				end
				
				for k, v in pairs( ROAD_STRIPS ) do
					RoadManager:SetStripEffect( v, "data/shaders/river.ksh" )
				end
				RoadManager:SetStripTextures( ROAD_STRIPS.EDGES,	"data/images/square.tex",		"data/images/river_bed.tex" )
				RoadManager:SetStripTextures( ROAD_STRIPS.CENTER,	"data/images/square.tex",		"data/images/water_river.tex" )
				RoadManager:SetStripUVAnimStep( ROAD_STRIPS.CENTER, 0, 0.25 )
				RoadManager:SetStripWrapMode( ROAD_STRIPS.EDGES, WRAP_MODE.CLAMP_TO_EDGE, WRAP_MODE.WRAP )
				--RoadManager:SetStripTextures( ROAD_STRIPS.CORNERS,	"data/images/roadcorner.tex",	"data/images/pathnoise.tex" )
				--RoadManager:SetStripTextures( ROAD_STRIPS.ENDS,		"data/images/roadendcap.tex",	"data/images/pathnoise.tex" )
				
				RoadManager:GenerateVB(
						ROAD_PARAMETERS.NUM_SUBDIVISIONS_PER_SEGMENT,
						5, 5,
						2, 2,
						0, false )
				--]]
			end
		end
		RoadManager:GenerateQuadTree()
	end
	
	SubmitStartStats(playercharacter)
	
    --some lame explicit loads
	Print(VERBOSITY.DEBUG, "DoInitGame Loading prefabs...")
    
	Print(VERBOSITY.DEBUG, "DoInitGame Adjusting audio...")
    TheMixer:SetLevel("master", 0)
    
	--apply the volumes
	
	Print(VERBOSITY.DEBUG, "DoInitGame Populating world...")
	
    local wilson = PopulateWorld(savedata, profile, playercharacter, next_world_playerdata)
    if wilson then
		TheCamera:SetTarget(wilson)
		StartGame(wilson)
		TheCamera:SetDefault()
		TheCamera:Snap()
	else
		Print(VERBOSITY.WARNING, "DoInitGame NO WILSON?")
    end
    
    if Profile.persistdata.debug_world  == 1 then
    	if savedata.map.topology == nil then
    		Print(VERBOSITY.ERROR, "OI! Where is my topology info!")
    	else
    		DrawDebugGraph(savedata.map.topology)
     	end
    end
    
    local function OnStart()
    	Print(VERBOSITY.DEBUG, "DoInitGame OnStart Callback... turning volume up")
		SetHUDPause(false)
    end
	
	if not TheFrontEnd:IsDisplayingError() then
		local hud = PlayerHud()
		TheFrontEnd:PushScreen(hud)
		hud:SetMainCharacter(wilson)
		
	    --clear the player stats, so that it doesn't count items "acquired" from the save file
	    GetProfileStats(true)

		RecordSessionStartStats()
		
	    --after starting everything up, give the mods additional environment variables
	    ModManager:SimPostInit(wilson)
		
		GetPlayer().components.health:RecalculatePenalty()

		if ( SaveGameIndex:GetCurrentMode() ~= "cave" and (SaveGameIndex:GetCurrentMode() == "survival" or SaveGameIndex:GetSlotWorld() == 1) and SaveGameIndex:GetSlotDay() == 1 and GetClock():GetNormTime() == 0) then
			if GetPlayer().components.inventory.starting_inventory then
				for k,v in pairs(GetPlayer().components.inventory.starting_inventory) do
					local item = SpawnPrefab(v)
					if item then
						GetPlayer().components.inventory:GiveItem(item)
					end
				end
			end
		end

	    if fast then
	    	OnStart()
	    else
			SetHUDPause(true,"InitGame")
			if Settings.playeranim == "failcave" then
				GetPlayer().sg:GoToState("wakeup")
				GetClock():MakeNextDay()
			elseif Settings.playeranim == "failadventure" then
				GetPlayer().sg:GoToState("failadventure")
				GetPlayer().HUD:Show()
			elseif GetWorld():IsCave() then
				GetPlayer().sg:GoToState("caveenter")
				GetPlayer().HUD:Show()
			elseif Settings.playeranim == "wakeup" or playercharacter == "waxwell" or savedata.map.nomaxwell then
				
				GetPlayer().sg:GoToState("wakeup")
				GetPlayer().HUD:Show()
				--announce your freedom if you are starting as waxwell
				if playercharacter == "waxwell" and SaveGameIndex:GetCurrentMode() == "survival" and (GetClock().numcycles == 0 and GetClock():GetNormTime() == 0) then
					GetPlayer():DoTaskInTime( 3.5, function()
						GetPlayer().components.talker:Say(GetString("waxwell", "ANNOUNCE_FREEDOM"))
					end)
				end

			elseif (GetClock().numcycles == 0 and GetClock():GetNormTime() == 0) or Settings.maxwell ~= nil then

				local max = SpawnPrefab("maxwellintro")
				local speechName = "NULL_SPEECH"
				if Settings.maxwell then
					speechName = Settings.maxwell
				elseif SaveGameIndex:GetCurrentMode() == "adventure" then
					if savedata.map.override_level_string == true then
						local level_id = 1
						if GetWorld().meta then
							level_id = GetWorld().meta.level_id or level_id 
						end

						speechName = "ADVENTURE_"..level_id
					else
						speechName = "ADVENTURE_"..SaveGameIndex:GetSlotWorld()
					end
				else
					speechName = "SANDBOX_1"
				end
				max.components.maxwelltalker:SetSpeech(speechName)
				max.components.maxwelltalker:Initialize()
				max.task = max:StartThread(function()	max.components.maxwelltalker:DoTalk() end) 
				--PlayNIS("maxwellintro", savedata.map.maxwell)
			end
			
			
			local title = STRINGS.UI.SANDBOXMENU.ADVENTURELEVELS[SaveGameIndex:GetSlotLevelIndexFromPlaylist()]
			local subtitle = STRINGS.UI.SANDBOXMENU.CHAPTERS[SaveGameIndex:GetSlotWorld()]
			local showtitle = SaveGameIndex:GetCurrentMode() == "adventure" and title
			if showtitle then
				TheFrontEnd:ShowTitle(title,subtitle)
			end
			
			TheFrontEnd:Fade(true, 1, function() 
				SetHUDPause(false)
				TheMixer:SetLevel("master", 1) 
				TheMixer:PushMix("normal") 
				TheFrontEnd:HideTitle()
				--TheFrontEnd:PushScreen(PopupDialogScreen(STRINGS.UI.HUD.READYTITLE, STRINGS.UI.HUD.READY, {{text=STRINGS.UI.HUD.START, cb = function() OnStart() end}}))
			end, showtitle and 3, showtitle and function() SetHUDPause(false) end )
	    end
	    
	    if savedata.map.hideminimap ~= nil then
	        hud.minimap:DoTaskInTime(0, function(inst) inst.MiniMap:ClearRevealedAreas(savedata.map.hideminimap) end)
	    end
	    if savedata.map.teleportaction ~= nil then
	        local teleportato = TheSim:FindFirstEntityWithTag("teleportato")
	        if teleportato then
	        	local pickPosition = function() 
	        		local portpositions = GetRandomInstWithTag("teleportlocation", teleportato, 1000)
	        		if portpositions then
	        			return Vector3(portpositions.Transform:GetWorldPosition())
	        		else
	        			return Vector3(savedata.playerinfo.x, savedata.playerinfo.y or 0, savedata.playerinfo.z)
	        		end
	        	end
	            teleportato.action = savedata.map.teleportaction
	            teleportato.maxwell = savedata.map.teleportmaxwell
	            teleportato.teleportpos = pickPosition()
	        end
	    end
	end
	
    --DoStartPause("Ready!")
    Print(VERBOSITY.DEBUG, "DoInitGame complete")
    
    if PRINT_TEXTURE_INFO then
		c_printtextureinfo( "texinfo.csv" )
		TheSim:Quit()
	end    
end

------------------------THESE FUNCTIONS HANDLE STARTUP FLOW


local function DoLoadWorld(saveslot, playerdataoverride)
	local function onload(savedata)
		DoInitGame(SaveGameIndex:GetSlotCharacter(saveslot), savedata, Profile, playerdataoverride)
	end
	SaveGameIndex:GetSaveData(saveslot, SaveGameIndex:GetCurrentMode(saveslot), onload)
end

local function DoGenerateWorld(saveslot, type_override)

	local function onComplete(savedata )
		local function onsaved()
			local success, world_table = RunInSandbox(savedata)
			if success then

				DoInitGame(SaveGameIndex:GetSlotCharacter(saveslot), world_table, Profile, SaveGameIndex:GetPlayerData(saveslot))
			end
		end

		SaveGameIndex:OnGenerateNewWorld(saveslot, savedata, onsaved)
	end

	local world_gen_options =
	{
		level_type = type_override or SaveGameIndex:GetCurrentMode(saveslot),
		custom_options = SaveGameIndex:GetSlotGenOptions(saveslot,SaveGameIndex:GetCurrentMode()),
		level_world = SaveGameIndex:GetSlotLevelIndexFromPlaylist(saveslot),
		profiledata = Profile.persistdata,
	}
	
	if world_gen_options.level_type == "adventure" then
		world_gen_options["adventure_progress"] = SaveGameIndex:GetSlotWorld()
	elseif world_gen_options.level_type == "cave" then
		world_gen_options["cave_progress"] = SaveGameIndex:GetCurrentCaveLevel()
	end

	TheFrontEnd:PushScreen(WorldGenScreen(Profile, onComplete, world_gen_options))
end

local function LoadSlot(slot)
	TheFrontEnd:ClearScreens()
	if SaveGameIndex:HasWorld(slot, SaveGameIndex:GetCurrentMode(slot)) then
   		DoLoadWorld(slot, SaveGameIndex:GetModeData(slot, SaveGameIndex:GetCurrentMode(slot)).playerdata)
	else
		LoadAssets(true)
		if SaveGameIndex:GetCurrentMode(slot) == "survival" and SaveGameIndex:IsContinuePending(slot) then
			
			local function onsave()
				DoGenerateWorld(slot)
			end

			local function onSet(character)
				SaveGameIndex:SetSlotCharacter(slot, character, onsave)
			end
			TheFrontEnd:PushScreen(CharacterSelectScreen(Profile, onSet, true, SaveGameIndex:GetSlotCharacter(slot)))
		else			
			DoGenerateWorld(slot)
		end
	end
end



----------------LOAD THE PROFILE AND THE SAVE INDEX, AND START THE FRONTEND

local function OnFilesLoaded()
	UpdateGamePurchasedState( function()
		--print( "[Settings]",Settings.character, Settings.savefile)
		if Settings.reset_action then
			if Settings.reset_action == "loadslot" then
				if not SaveGameIndex:GetCurrentMode(Settings.save_slot) then
					LoadAssets(true)
					TheFrontEnd:ShowScreen(MainScreen(Profile))
				else
					LoadSlot(Settings.save_slot)
				end
			elseif Settings.reset_action == "printtextureinfo" then
				LoadAssets(true)
				DoGenerateWorld(1)
			else
				LoadAssets(true)
				TheFrontEnd:ShowScreen(MainScreen(Profile))
			end
		else
			if PRINT_TEXTURE_INFO then
				SaveGameIndex:DeleteSlot(1,
					function()
						local function onsaved()
							local params = json.encode{reset_action="printtextureinfo", save_slot = 1}
							TheSim:SetInstanceParameters(params)
							TheSim:Reset()
						end
						SaveGameIndex:StartSurvivalMode(1, "wilson", {}, onsaved)
					end)
			else
				LoadAssets(true)
				TheFrontEnd:ShowScreen(MainScreen(Profile))
			end
		end
	end)
end


Profile = PlayerProfile()
SaveGameIndex = SaveIndex()

Print(VERBOSITY.DEBUG, "[Loading profile and save index]")
Profile:Load( function() 
	SaveGameIndex:Load( OnFilesLoaded )
end )

--dont_load_save in profile

  

posted @ 2013-08-06 21:03  today4king  阅读(23534)  评论(0编辑  收藏  举报