/// <summary> /// Constructor. /// </summary> public ViewModel(Dispatcher uiDispatcher, string baseContentDir, Isometry iso) { // Reference to the UIDispatcher for thread-safe collection manipulation _uiDispatcher = uiDispatcher; Factions = new ObservableCollection<FactionList> { new FactionList("AI"), new FactionList("Player 1"), new FactionList("Player 2") }; // Map setup Map = new MapDefinition(new ZTile(baseContentDir + "tiles\\Generic Tiles\\Generic Floors\\DirtSand\\Waste_Floor_Gravel_SandDirtCentre_F_1_NE.til"), iso, baseContentDir); MapCanvas = new MapCanvas(Map, uiDispatcher, baseContentDir + "tiles\\", iso, Factions); _useAltEditLayer = false; // Create the available TileSets and collection views TileSets = new Dictionary<string, ObservableCollection<ZTile>>(); TileSetViews = new Dictionary<string, ListCollectionView>(); foreach (var di in new DirectoryInfo(baseContentDir + "tiles\\").GetDirectories()) { TileSets.Add(di.Name, new ObservableCollection<ZTile>()); TileSetViews.Add(di.Name, new ListCollectionView(TileSets[di.Name])); } // Start a new thread to load in the tile images ThreadPool.QueueUserWorkItem(GetWholeTileSet, baseContentDir + "tiles\\"); }
/// <summary> /// Saves a complete module file. /// </summary> /// <param name="fileName"></param> /// <param name="map"></param> /// <param name="roster"></param> public static void Save(string fileName, MapDefinition map, ICollection<Unit> roster) { if (fileName == null) return; using (var stream = new StreamWriter(fileName)) { stream.WriteLine("<Module>"); map.AppendMap(stream); stream.WriteLine("<Roster>"); stream.WriteLine(roster.Count); foreach (Unit u in roster) u.AppendUnit(stream); stream.WriteLine("</Roster>"); stream.WriteLine("</Module>"); } }
/// <summary> /// Returns a copy of this MapDefinition. /// </summary> /// <returns></returns> public MapDefinition Clone() { var cloned = new MapDefinition(DefaultFloorTile, Iso, _baseContentDir) {Cells = new MapCell[Width,Height]}; for (var x = 0; x < Cells.GetLength(0); x++) for (var y = 0; y < Cells.GetLength(1); y++) cloned.Cells[x, y] = Cells[x, y].Clone(); foreach (var p in UndoInfo) { cloned.UndoInfo.Add(p); } return cloned; }
/// <summary> /// Reads a map from the given stream. /// </summary> /// <param name="stream"></param> /// <param name="iso"></param> /// <returns></returns> public static MapDefinition ReadMap(TextReader stream, Isometry iso) { var newMap = new MapDefinition(null, iso, _baseContentDir); if (stream == null) return newMap; stream.ReadLine(); // <Map> newMap.Iso.Style = (IsometricStyle)Enum.Parse(typeof(IsometricStyle), stream.ReadLine()); newMap.ClearAllCells(int.Parse(stream.ReadLine()), int.Parse(stream.ReadLine())); newMap.TileWidth = int.Parse(stream.ReadLine()); newMap.TileHeight = int.Parse(stream.ReadLine()); stream.ReadLine(); // </Map> stream.ReadLine(); // <TileDictionary> var requiredTiles = new List<ZTile>(); var line = stream.ReadLine(); while (!line.Equals("</TileDictionary>")) { requiredTiles.Add(new ZTile("D:\\workspace\\BaseGame\\" + line)); line = stream.ReadLine(); } Console.WriteLine(requiredTiles[0].Bitmaps.Count()); stream.ReadLine(); // <Cells> for (var x = 0; x < newMap.Cells.GetLength(0); x++) for (var y = 0; y < newMap.Cells.GetLength(1); y++) { newMap.Cells[x, y] = MapCell.FromStream(stream, requiredTiles, newMap, new Point(x,y)); } stream.ReadLine(); // </Cells> // Remake Parent links for (var x = 0; x < newMap.Cells.GetLength(0); x++) for (var y = 0; y < newMap.Cells.GetLength(1); y++) { if (newMap.Cells[x, y].TempPoint.X != -1) { newMap.Cells[x, y].ParentCell = newMap.Cells[newMap.Cells[x, y].TempPoint.X, newMap.Cells[x, y].TempPoint.Y]; } } return newMap; }