public static string LastLoadedFile = null; // null == 未読み込み public static Map Load(string file) { LastLoadedFile = file; string[] lines = FileTools.TextToLines(Encoding.UTF8.GetString(DDResource.Load(file))); int c = 0; int w = int.Parse(lines[c++]); int h = int.Parse(lines[c++]); Map map = new Map(w, h); for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) { if (lines.Length <= c) { goto endLoad; } MapCell cell = map.GetCell(x, y); var tokens = new BluffList <string>(lines[c++].Split('\t')).FreeRange(""); // 項目が増えても良いように -> FreeRange("") int d = 0; cell.Kind = (MapCell.Kind_e) int.Parse(tokens[d++]); cell.SurfacePicture = MapTileManager.GetTile(tokens[d++]); cell.TilePicture = MapTileManager.GetTile(tokens[d++]); // 新しい項目をここへ追加... } } while (c < lines.Length) { // memo: Save()時にプロパティ部分も上書きされるので注意してね。 var tokens = lines[c++].Split("=".ToArray(), 2); string name = tokens[0]; string value = tokens[1]; map.AddProperty(name, value); } endLoad: return(map); }
public static void EachFrame() { I2Point pt = Map.ToTablePoint(DDMouse.X + DDGround.ICamera.X, DDMouse.Y + DDGround.ICamera.Y); MapCell cell = Game.I.Map.GetCell(pt, null); if (cell == null) { return; } if (DDUtils.IsOutOfScreen(new D2Point(DDMouse.X, DDMouse.Y))) { return; } HideMenu = 1 <= DDKey.GetInput(DX.KEY_INPUT_LCONTROL) || 1 <= DDKey.GetInput(DX.KEY_INPUT_RCONTROL); if (HideMenu || DDUtils.IsOut(new D2Point(DDMouse.X, DDMouse.Y), MenuRect)) { if (1 <= DDMouse.L.GetInput()) { if (InputWallFlag) { cell.Wall = Wall; } if (InputTileFlag) { cell.Tile = MapTileManager.GetTile(MapTileManager.GetNames()[TileIndex]); } if (InputEnemyFlag) { cell.EnemyLoader = EnemyManager.GetEnemyLoader(EnemyManager.GetNames()[EnemyIndex]); } } if (1 <= DDMouse.R.GetInput()) { cell.Wall = false; cell.Tile = null; cell.EnemyLoader = null; } } else { int cursorMenuItemIndex = DDMouse.Y / 16; bool l = 1 <= DDMouse.L.GetInput(); bool r = 1 <= DDMouse.R.GetInput(); if (l || r) { bool flag = l; switch (cursorMenuItemIndex) { case 0: InputWallFlag = flag; break; case 1: InputTileFlag = flag; break; case 2: InputEnemyFlag = flag; break; case 3: DisplayWallFlag = flag; break; case 4: DisplayTileFlag = flag; break; case 5: DisplayEnemyFlag = flag; break; case 6: Wall = flag; break; case 7: case 8: IntoInputTileMode(); break; case 9: case 10: IntoInputEnemyMode(); break; } } Rot += DDMouse.Rot; if (DDMouse.Rot == 0) { NoRotFrame++; } else { NoRotFrame = 0; } if (90 < NoRotFrame) { Rot = 0; } switch (cursorMenuItemIndex) { case 7: case 8: if (MenuItemRot(ref TileIndex, MapTileManager.GetCount())) { IntoInputTileMode(); } break; case 9: case 10: if (MenuItemRot(ref EnemyIndex, EnemyManager.GetCount())) { IntoInputEnemyMode(); } break; } } if (DDKey.GetInput(DX.KEY_INPUT_C) == 1) { if (InputWallFlag) { Wall = cell.Wall; } if (InputTileFlag) { TileIndex = cell.Tile == null ? 0 : MapTileManager.GetNames().IndexOf(cell.Tile.Name); } if (InputEnemyFlag) { EnemyIndex = cell.EnemyLoader == null ? 0 : EnemyManager.GetNames().IndexOf(cell.EnemyLoader.Name); } if (TileIndex == -1) // 2bs { TileIndex = 0; } if (EnemyIndex == -1) // 2bs { EnemyIndex = 0; } } if (DDKey.GetInput(DX.KEY_INPUT_S) == 1) { MapLoader.SaveToLastLoadedFile(Game.I.Map); } }