private void saveButton_OnClicked() { if (GenerationComplete) { System.IO.DirectoryInfo worldDirectory = System.IO.Directory.CreateDirectory(DwarfGame.GetGameDirectory() + ProgramData.DirChar + "Worlds" + ProgramData.DirChar + Settings.Name); OverworldFile file = new OverworldFile(Overworld.Map, Settings.Name); file.WriteFile(worldDirectory.FullName + ProgramData.DirChar + "world." + OverworldFile.CompressedExtension, true); file.SaveScreenshot(worldDirectory.FullName + ProgramData.DirChar + "screenshot.png"); Dialog.Popup(GUI, "Save", "File saved.", Dialog.ButtonType.OK); } }
void SaveThread(string filename) { DirectoryInfo worldDirectory = Directory.CreateDirectory(DwarfGame.GetGameDirectory() + Path.DirectorySeparatorChar + "Worlds" + Path.DirectorySeparatorChar + Overworld.Name); OverworldFile file = new OverworldFile(Overworld.Map, Overworld.Name); file.WriteFile(worldDirectory.FullName + Path.DirectorySeparatorChar + "world." + OverworldFile.CompressedExtension, true); file.SaveScreenshot(worldDirectory.FullName + Path.DirectorySeparatorChar + "screenshot.png"); gameFile = new GameFile(Overworld.Name, GameID); gameFile.WriteFile(DwarfGame.GetGameDirectory() + Path.DirectorySeparatorChar + "Saves" + Path.DirectorySeparatorChar + filename, true); lock (ScreenshotLock) { Screenshots.Add(new Screenshot() { FileName = DwarfGame.GetGameDirectory() + Path.DirectorySeparatorChar + "Saves" + Path.DirectorySeparatorChar + filename + Path.DirectorySeparatorChar + "screenshot.png", Resolution = new Point(GraphicsDevice.Viewport.Width/4, GraphicsDevice.Viewport.Height/4) }); } }
/// <summary> /// Creates the terrain that is immediately around the player's spawn point. /// If loading from a file, loads the existing terrain from a file. /// </summary> public void GenerateInitialChunks() { gameFile = null; bool fileExists = !string.IsNullOrEmpty(ExistingFile); // If we already have a file, we need to load all the chunks from it. // This is preliminary stuff that just makes sure the file exists and can be loaded. if (fileExists) { LoadingMessage = "Loading " + ExistingFile; gameFile = new GameFile(ExistingFile, true); Sky.TimeOfDay = gameFile.Data.Metadata.TimeOfDay; WorldOrigin = gameFile.Data.Metadata.WorldOrigin; WorldScale = gameFile.Data.Metadata.WorldScale; ChunkWidth = gameFile.Data.Metadata.ChunkWidth; ChunkHeight = gameFile.Data.Metadata.ChunkHeight; if (gameFile.Data.Metadata.OverworldFile != null && gameFile.Data.Metadata.OverworldFile != "flat") { LoadingMessage = "Loading world " + gameFile.Data.Metadata.OverworldFile; Overworld.Name = gameFile.Data.Metadata.OverworldFile; DirectoryInfo worldDirectory = Directory.CreateDirectory(DwarfGame.GetGameDirectory() + ProgramData.DirChar + "Worlds" + ProgramData.DirChar + Overworld.Name); OverworldFile overWorldFile = new OverworldFile( worldDirectory.FullName + ProgramData.DirChar + "world." + OverworldFile.CompressedExtension, true); Overworld.Map = overWorldFile.Data.CreateMap(); Overworld.Name = overWorldFile.Data.Name; WorldWidth = Overworld.Map.GetLength(1); WorldHeight = Overworld.Map.GetLength(0); } else { LoadingMessage = "Generating flat world.."; Overworld.CreateUniformLand(Game.GraphicsDevice); } GameID = gameFile.Data.GameID; } else { GameID = Random.Next(0, 1024); } ChunkGenerator = new ChunkGenerator(VoxelLibrary, Seed, 0.02f, ChunkHeight/2.0f) { SeaLevel = SeaLevel }; Vector3 globalOffset = new Vector3(WorldOrigin.X, 0, WorldOrigin.Y) * WorldScale; if(fileExists) { globalOffset /= WorldScale; } // If the file exists, we get the camera's pose from the file. // Otherwise, we set it to a pose above the center of the world (0, 0, 0) // facing down slightly. Camera = fileExists ? gameFile.Data.Camera : new OrbitCamera(0, 0, 10f, new Vector3(ChunkWidth, ChunkHeight - 1.0f, ChunkWidth) + globalOffset, new Vector3(0, 50, 0) + globalOffset, MathHelper.PiOver4, AspectRatio, 0.1f, GameSettings.Default.VertexCullDistance); Drawer3D.Camera = Camera; // Creates the terrain management system. ChunkManager = new ChunkManager(Content, (uint) ChunkWidth, (uint) ChunkHeight, (uint) ChunkWidth, Camera, GraphicsDevice, Tilesheet, TextureManager.GetTexture(ContentPaths.Terrain.terrain_illumination), TextureManager.GetTexture(ContentPaths.Gradients.sungradient), TextureManager.GetTexture(ContentPaths.Gradients.ambientgradient), TextureManager.GetTexture(ContentPaths.Gradients.torchgradient), ChunkGenerator, WorldSize.X, WorldSize.Y, WorldSize.Z); // Trying to determine the global offset from overworld coordinates (pixels in the overworld) to // voxel coordinates. globalOffset = ChunkManager.ChunkData.RoundToChunkCoords(globalOffset); globalOffset.X *= ChunkWidth; globalOffset.Y *= ChunkHeight; globalOffset.Z *= ChunkWidth; // If there's no file, we have to offset the camera relative to the global offset. if(!fileExists) { WorldOrigin = new Vector2(globalOffset.X, globalOffset.Z); Camera.Position = new Vector3(0, 10, 0) + globalOffset; Camera.Target = new Vector3(0, 10, 1) + globalOffset; Camera.Radius = 0.01f; Camera.Phi = -1.57f; } // If there's no file, we have to initialize the first chunk coordinate if(gameFile == null) { ChunkManager.GenerateInitialChunks(Camera, ChunkManager.ChunkData.GetChunkID(new Vector3(0, 0, 0) + globalOffset), ref LoadingMessage); } // Otherwise, we just load all the chunks from the file. else { LoadingMessage = "Loading Chunks from Game File"; ChunkManager.ChunkData.LoadFromFile(gameFile, ref LoadingMessage); } // If there's no file, for some reason we modify the camera position... // TODO: Figure out why the camera keeps needing to be reset. if(!fileExists) { Camera.Radius = 0.01f; Camera.Phi = -1.57f / 4.0f; Camera.Theta = 0.0f; } // Finally, the chunk manager's threads are started to allow it to // dynamically rebuild terrain ChunkManager.RebuildList = new ConcurrentQueue<VoxelChunk>(); ChunkManager.StartThreads(); }
private void saveButton_OnClicked() { if(GenerationComplete) { System.IO.DirectoryInfo worldDirectory = System.IO.Directory.CreateDirectory(DwarfGame.GetGameDirectory() + ProgramData.DirChar + "Worlds" + ProgramData.DirChar + Settings.Name); OverworldFile file = new OverworldFile(Overworld.Map, Settings.Name); file.WriteFile(worldDirectory.FullName + ProgramData.DirChar + "world." + OverworldFile.CompressedExtension, true); file.SaveScreenshot(worldDirectory.FullName + ProgramData.DirChar + "screenshot.png"); Dialog.Popup(GUI, "Save", "File saved.", Dialog.ButtonType.OK); } }