Пример #1
0
        public Mission(string name, Mod game, Map map)
        {
            Mod     = game;
            Map     = map;
            Name    = name;
            ModName = game.Name;
            MapName = map.Name;
            var testAI  = game.AllAis.FirstOrDefault(ai => ai.ShortName.Contains("NullAI"));
            var player1 = new Player {
                Name = "Player 1", Color = Colors.Blue, Alliance = "Alliance 1", IsHuman = true, IsRequired = true
            };
            var player2 = new Player {
                Name = "Player 2", Color = Colors.Red, Alliance = "Alliance 2", IsHuman = false,
            };

            StartingPlayer = player1;
            Players.Add(player1);
            Players.Add(player2);
            Regions.Add(new Region {
                Name = "Region 1"
            });

            var gamePreloadTrigger = new Trigger();

            Triggers.Add(gamePreloadTrigger);
            gamePreloadTrigger.Logic.Add(new GamePreloadCondition());
            gamePreloadTrigger.Name = "Initialization";

            var gameStartTrigger = new Trigger();

            Triggers.Add(gameStartTrigger);
            gameStartTrigger.Logic.Add(new GameStartedCondition());
            gameStartTrigger.Name = "Game Start";
            var unitType   = game.UnitDefs.First();
            var startUnits = new UnitStartInfo[]  {};

            gamePreloadTrigger.Logic.Add(new CreateUnitsAction(startUnits));

            var widgets = new[] { "cmd_unit_mover.lua", "init_startup_info_selector.lua", "gui_center_n_select.lua", "gui_take_remind.lua", "gui_startup_info_selector.lua", "gui_local_colors.lua", "spring_direct_launch.lua" };

            foreach (var widget in widgets)
            {
                DisabledWidgets.Add(widget);
            }
            var gadgets = new string[] { "game_over.lua", "game_end.lua", "awards.lua" };

            foreach (var gadget in gadgets)
            {
                DisabledGadgets.Add(gadget);
            }
            if (game.Name.Contains("Zero-K"))
            {
                RapidTag = "zk:stable";
            }
            Items = new CompositeObservableCollection <Trigger, Region>(Triggers, Regions);
        }
Пример #2
0
		/// <summary>
		/// Returns an SM2 map texuture
		/// </summary>
		public BitmapSource GetTexture(Map map, int detail, UnitSync unitSync)
		{
			UnitSync.NativeMethods.RemoveAllArchives();
			UnitSync.NativeMethods.AddAllArchives(map.ArchiveName);
			ProgressChanged(this, new ProgressChangedEventArgs(0, "Extracting map"));
			var mapName = map.Name + ".smf";
			var smfFileData = unitSync.ReadVfsFile("maps\\" + mapName);
			var reader = new BinaryReader(new MemoryStream(smfFileData));
			var smfHeader = reader.ReadStruct<SMFHeader>();
			smfHeader.SelfCheck();
			var mapWidth = smfHeader.mapx;
			var mapHeight = smfHeader.mapy;

			reader.BaseStream.Position = smfHeader.tilesPtr;
			var mapTileHeader = reader.ReadStruct<MapTileHeader>();

			// get the tile files and the number of tiles they contain
			var tileFiles = new Dictionary<byte[], int>();
			for (var i = 0; i < mapTileHeader.numTileFiles; i++)
			{
				var numTiles = reader.ReadInt32();
				var tileFileData = unitSync.ReadVfsFile("maps\\" + reader.ReadCString());
				tileFiles.Add(tileFileData, numTiles);
			}

			// get the position of the tiles
			var mapUnitInTiles = Tiles.TileMipLevel1Size/smfHeader.texelPerSquare;
			var tilesX = smfHeader.mapx/mapUnitInTiles;
			var tilesY = smfHeader.mapy/mapUnitInTiles;
			var tileIndices = new int[tilesX*tilesY];
			for (var i = 0; i < tileIndices.Length; i++)
			{
				tileIndices[i] = reader.ReadInt32();
			}

			Tiles.ProgressChanged += (s, e) => ProgressChanged(this, e);

			UnitSync.NativeMethods.RemoveAllArchives();
			// load the tiles
			return Tiles.LoadTiles(tileFiles, tileIndices, tilesX, tilesY, detail);
		}
Пример #3
0
        static Bitmap FixAspectRatio(Map map, Image squareMinimap)
        {
            var newSize = map.Size.Width > map.Size.Height
                              ? new Size(squareMinimap.Width, (int)(squareMinimap.Height/((float)map.Size.Width/map.Size.Height)))
                              : new Size((int)(squareMinimap.Width*((float)map.Size.Width/map.Size.Height)), squareMinimap.Height);

            var correctMinimap = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb);
            try
            {
                using (var graphics = Graphics.FromImage(correctMinimap))
                {
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.DrawImage(squareMinimap, new Rectangle(Point.Empty, newSize));
                }
                squareMinimap.Dispose();
            }
            catch
            {
                correctMinimap.Dispose();
                throw;
            }
            return correctMinimap;
        }
Пример #4
0
 public Bitmap GetMinimap(Map map)
 {
     SetLoadingStatus("Loading Map (Minimap)");
     return FixAspectRatio(map, GetSquareMinimap(map.Name, 0));
 }
Пример #5
0
 public BitmapSource GetMapTexture(Map map, int detail)
 {
     if (disposed) throw new ObjectDisposedException("Unitsync has already been released.");
     SetLoadingStatus("Loading Map (Map Texture)");
     var sm2 = new SM2();
     return sm2.GetTexture(map, detail, this);
 }
Пример #6
0
 public Map GetMapNoBitmaps(string mapName, string archiveName)
 {
     if (mapName == null || archiveName == null) return null;
     if (maps == null) GetMapNames();
     NativeMethods.RemoveAllArchives();
     SetLoadingStatus("Loading Map (Map Information)");
     var checksum = maps.First(kvp => kvp.Value == mapName).Key;
     var mapInfo = GetMapInfo(checksum);
     var map = new Map(mapName)
               {
                   ArchiveName = Path.GetFileName(archiveName),
                   Checksum = (int)checksum,
                   Name = mapName,
                   Description = mapInfo.description,
                   TidalStrength = mapInfo.tidalStrength,
                   Gravity = mapInfo.gravity,
                   MaxMetal = mapInfo.maxMetal,
                   ExtractorRadius = mapInfo.extractorRadius,
                   MinWind = mapInfo.minWind,
                   MaxWind = mapInfo.maxWind,
                   Author = mapInfo.author,
                   Size = new Size(mapInfo.width, mapInfo.height),
                   Positions = mapInfo.positions,
               };
     map.Options = GetMapOptions(map.Name, map.ArchiveName).ToArray();
     NativeMethods.RemoveAllArchives();
     TraceErrors();
     return map;
 }
Пример #7
0
		public Mission(string name, Mod game, Map map)
		{
			Mod = game;
			Map = map;
			Name = name;
			ModName = game.Name;
			MapName = map.Name;
			var testAI = game.AllAis.FirstOrDefault(ai => ai.ShortName.Contains("NullAI"));
			var player1 = new Player { Name = "Player 1", Color = Colors.Blue, Alliance = "Alliance 1", IsHuman = true, IsRequired = true };
			var player2 = new Player { Name = "Player 2", Color = Colors.Red, Alliance = "Alliance 2", IsHuman = false, };
			StartingPlayer = player1;
			Players.Add(player1);
			Players.Add(player2);
			Regions.Add(new Region { Name = "Region 1" });

            var gamePreloadTrigger = new Trigger();
			Triggers.Add(gamePreloadTrigger);
			gamePreloadTrigger.Logic.Add(new GamePreloadCondition());
            gamePreloadTrigger.Name = "Initialization";

            var gameStartTrigger = new Trigger();
            Triggers.Add(gameStartTrigger);
            gameStartTrigger.Logic.Add(new GameStartedCondition());
            gameStartTrigger.Name = "Game Start";
			var unitType = game.UnitDefs.First();
			var startUnits = new UnitStartInfo[]  {};
			gamePreloadTrigger.Logic.Add(new CreateUnitsAction(startUnits));

            var widgets = new[] { "gui_pauseScreen.lua", "cmd_unit_mover.lua", "init_startup_info_selector.lua", "gui_center_n_select.lua", "gui_take_remind.lua", "gui_startup_info_selector.lua", "gui_local_colors.lua", "spring_direct_launch.lua" };
			foreach (var widget in widgets) DisabledWidgets.Add(widget);
			var gadgets = new string[] { "game_over.lua", "game_end.lua", "awards.lua" };
			foreach (var gadget in gadgets) DisabledGadgets.Add(gadget);
			if (game.Name.Contains("Zero-K")) RapidTag = "zk:stable";
			Items = new CompositeObservableCollection<Trigger, Region>(Triggers, Regions);
		}
Пример #8
0
		/// <summary>
		/// Returns an SM2 map texuture
		/// </summary>
		public BitmapSource GetTexture(Map map, int detail, UnitSync unitSync)
		{
			UnitSync.NativeMethods.RemoveAllArchives();
			UnitSync.NativeMethods.AddAllArchives(map.ArchiveName);
			ProgressChanged(this, new ProgressChangedEventArgs(0, "Extracting map"));

			var mapDir = UnitSync.NativeMethods.GetMapFileName(UnitSync.NativeMethods.GetMapIndex(map.Name));
			var smfFileData = unitSync.ReadVfsFile(mapDir);
			BinaryReader reader;
			try {
				reader = new BinaryReader(new MemoryStream(smfFileData));
			} catch (System.ArgumentNullException nullEx)
			{
				throw new System.ArgumentNullException("smfFileData", "Unable to read SMF: " + mapDir);
			}
			var smfHeader = reader.ReadStruct<SMFHeader>();
			smfHeader.SelfCheck();
			var mapWidth = smfHeader.mapx;
			var mapHeight = smfHeader.mapy;

			reader.BaseStream.Position = smfHeader.tilesPtr;
			var mapTileHeader = reader.ReadStruct<MapTileHeader>();

			// get the tile files and the number of tiles they contain
			var tileFiles = new Dictionary<byte[], int>();
			for (var i = 0; i < mapTileHeader.numTileFiles; i++)
			{
				var numTiles = reader.ReadInt32();
				var tileFileData = unitSync.ReadVfsFile("maps\\" + reader.ReadCString());
				tileFiles.Add(tileFileData, numTiles);
			}

			// get the position of the tiles
			var mapUnitInTiles = Tiles.TileMipLevel1Size/smfHeader.texelPerSquare;
			var tilesX = smfHeader.mapx/mapUnitInTiles;
			var tilesY = smfHeader.mapy/mapUnitInTiles;
			var tileIndices = new int[tilesX*tilesY];
			for (var i = 0; i < tileIndices.Length; i++)
			{
				tileIndices[i] = reader.ReadInt32();
			}

			Tiles.ProgressChanged += (s, e) => ProgressChanged(this, e);

			UnitSync.NativeMethods.RemoveAllArchives();
			// load the tiles

			WriteableBitmap ret;
			try {
				ret = (WriteableBitmap)Tiles.LoadTiles(tileFiles, tileIndices, tilesX, tilesY, detail);
			} catch (System.Exception ex)
			{
				// some maps (e.g. Glacies) fail to load the tiles properly; use minimap as a fallback 

				//if (map.Texture == null) throw new System.Exception("Unable to load map texture");
				//var newBitmap = new Bitmap(GetBitmap(map.Texture), new Size(map.Texture.PixelWidth / 8, map.Texture.PixelHeight / 8));

				map.Minimap = unitSync.GetMinimap(map);
				ret = new WriteableBitmap(ConvertBitmap(map.Minimap));
				ret.Freeze();
				//ret.Unlock();
			}

			return ret;
		}