/// <summary> /// 현재 선택된 청크를 저장하고 다음 청크를 선택한다. /// </summary> /// <returns>다음 청크의 유무</returns> public bool SaveNext() { // 저장할 청크가 없으면 바로 종료 if (m_board.ChunkCount <= 0) { return(false); } // 임시 보드에 실제 보드를 얕은 복사 if (m_tempBoard == null) { m_tempBoard = new ChunkBoard <Tile>(m_board.ChunkSize); foreach (var chunkInformation in m_board.GetEnumerable()) { m_tempBoard.SetChunkAt(chunkInformation.X, chunkInformation.Y, chunkInformation.Chunk); } } // 열거자 얻기 if (m_currentSaveChunk == null) { m_currentSaveChunk = m_tempBoard.GetEnumerable().GetEnumerator(); if (m_currentSaveChunk.MoveNext() == false) { m_tempBoard.Clear(); m_tempBoard = null; m_currentSaveChunk = null; return(false); } } // 열거자가 현재 가르키는 청크 저장 var chunkInfo = m_currentSaveChunk.Current; var chunk = chunkInfo.Chunk; string fileName = string.Format("{0}_{1}.dat", chunkInfo.X, chunkInfo.Y); using (BinaryWriter bw = new BinaryWriter(new FileStream(this.BoardPath + fileName, FileMode.Create))) { // 파일 버전 bw.Write(Application.ProductVersion.ToString()); // 청크 위치 bw.Write(chunkInfo.X); bw.Write(chunkInfo.Y); // 청크 크기 bw.Write(this.Board.ChunkSize); // 타일 정보 for (int x = 0; x < chunk.GetLength(0); ++x) { for (int y = 0; y < chunk.GetLength(1); ++y) { var tile = chunk[x, y]; tile.WriteToStream(bw); } } } // 다음 청크로 넘어가고 없으면 종료 if (m_currentSaveChunk.MoveNext()) { return(true); } else { m_tempBoard.Clear(); m_tempBoard = null; m_currentSaveChunk = null; return(false); } }
/// <summary> /// 현재 선택된 청크를 불러오고 다음 청크를 선택한다. /// </summary> /// <returns>다음 청크의 유무</returns> public bool LoadNext() { // 열거자 얻기 if (m_currentLoadChunk == null) { m_board.Clear(); m_currentLoadChunk = Directory.EnumerateFileSystemEntries(this.BoardPath).GetEnumerator(); if (m_currentLoadChunk.MoveNext() == false) { m_currentLoadChunk = null; return(false); } } try { using (BinaryReader br = new BinaryReader(new FileStream(m_currentLoadChunk.Current, FileMode.Open))) { // 파일 버전 Utility.Version fileVersion = new Utility.Version(br.ReadString()); // 청크 위치 int chunkX = br.ReadInt32(); int chunkY = br.ReadInt32(); // 청크 생성 m_board.CreateChunkAt(chunkX, chunkY); var chunk = m_board.GetChunkAt(chunkX, chunkY); // 청크 크기 int chunkSize = br.ReadInt32(); // 타일 정보 for (int x = 0; x < chunkSize; ++x) { for (int y = 0; y < chunkSize; ++y) { // 타일 설정 var tile = chunk[x, y]; tile.ReadFromStream(br); // 설치된 것이 있다면 목록에 위치를 추가 if (tile.IsFactoryTile) { m_factoryList.Add(new Point( chunkX * this.Board.ChunkSize + x, chunkY * this.Board.ChunkSize + y)); } else if (tile.IsCompanyTile) { m_companyList.Add(new Point( chunkX * this.Board.ChunkSize + x, chunkY * this.Board.ChunkSize + y)); } else if (tile.IsChipTile) { m_chipList.Add(new Point( chunkX * this.Board.ChunkSize + x, chunkY * this.Board.ChunkSize + y)); } } } } } catch (FileNotFoundException) { } // 다음 파일로 넘어감 if (m_currentLoadChunk.MoveNext()) { return(true); } else { m_currentLoadChunk = null; return(false); } }