Пример #1
0
        public MapEditorScreen(string map)
        {
            TransitionOnTime  = TimeSpan.FromSeconds(1.5);
            TransitionOffTime = TimeSpan.FromSeconds(0.5);

            UnitCreator.Initialize();

            _nullCursor = new Vector2(-1, -1);
            _terrains   = new[]
            {
                new Terrain("Plains", false, 1, 1, 1, 2, 1, 1, 1, -1, -1),
                new Terrain("Road", false, 0, 1, 1, 1, 1, 1, 1, -1, -1),
                new Terrain("Wood", true, 3, 1, 1, 3, 3, 2, 1, -1, -1),
                new Terrain("Mountain", false, 4, 2, 1, -1, -1, -1, 1, -1, -1),
                new Terrain("Wasteland", false, 2, 1, 1, 3, 3, 2, 1, -1, -1),
                new Terrain("Ruins", true, 1, 1, 1, 2, 1, 1, 1, -1, -1),
                new Terrain("Sea", false, 0, -1, -1, -1, -1, -1, 1, 1, 1),
                new Terrain("BridgeSea", false, 0, 1, 1, 1, 1, 1, 1, 1, 1),
                new Terrain("BridgeRiver", false, 0, 1, 1, 1, 1, 1, 1, 1, 1),
                new Terrain("River", false, 0, 2, 1, -1, -1, -1, 1, -1, -1),
                new Terrain("Beach", false, 0, 1, 1, 2, 2, 1, 1, -1, 1),
                new Terrain("Rough Sea", false, 0, -1, -1, -1, -1, -1, 1, 2, 2),
                new Terrain("Mist", true, 0, -1, -1, -1, -1, -1, 1, 1, 1),
                new Terrain("Reef", true, 0, -1, -1, -1, -1, -1, 1, 2, 2)
            };

            // Load map data from TXT file
            var flines = File.ReadLines("Content/Maps/" + map + ".txt")
                         .Where(l => l.Length != 0 && !l.StartsWith("#"))
                         .ToList();

            //_mapName = flines[0].Trim();
            _mapWidth  = Convert.ToInt32(flines[1].Trim());
            _mapHeight = Convert.ToInt32(flines[2].Trim());
            var plyers = flines.GetRange(3, 4).Where(l => !l.StartsWith("0")).ToArray();

            _players = new Player[plyers.Length];
            for (var i = 0; i < _players.Length; ++i)
            {
                _players[i] = new Player(i + 1, Convert.ToInt32(plyers[i].Trim()));
            }
            var terrainLines = new string[_mapHeight];
            var read         = 0;

            for (var i = 7; i < _mapHeight + 7; ++i)
            {
                var line = flines[i].Trim();
                terrainLines[read++] = line;
            }
            var buildings = flines;

            buildings.RemoveRange(0, _mapHeight + 7);

            // Generate terrain according to map data
            _mapTerrains = new Terrain[_mapHeight, _mapWidth];
            for (var y = 0; y < _mapHeight; ++y)
            {
                for (var x = 0; x < _mapWidth; ++x)
                {
                    var type = terrainLines[y][x] >= '0' && terrainLines[y][x] <= '9'
                                                ? terrainLines[y][x] - '0'
                                                : terrainLines[y][x] - 'a' + 10;
                    _mapTerrains[y, x] = _terrains[type];
                }
            }

            var bOrder = new[] { "Headquarter", "City", "Factory", "Port", "Airport" };

            _mapBuildings = new Building[_mapHeight, _mapWidth];
            _units        = new List <Unit>();
            foreach (var data in buildings.Select(b => b.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)))
            {
                var p = Convert.ToInt32(data[2]);
                if (data.Length == 5)
                {
                    var u = UnitCreator.Unit(
                        data[3],
                        _players[p - 1],
                        new Vector2(
                            Convert.ToInt32(data[1]),
                            Convert.ToInt32(data[0])));
                    u.Life = Convert.ToInt32(data[4]) * 10;
                    _units.Add(u);
                }
                else if (data.Length == 4)
                {
                    var x = Convert.ToInt32(data[1]);
                    var y = Convert.ToInt32(data[0]);
                    _mapBuildings[y, x] = new Building(bOrder[Convert.ToInt32(data[3])], p == 0 ? null : _players[p - 1], new Vector2(x, y));
                }
            }

            _camera = new Vector2(-50, -80);
        }