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); }
/// <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); }
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; }
public Bitmap GetMinimap(Map map) { SetLoadingStatus("Loading Map (Minimap)"); return FixAspectRatio(map, GetSquareMinimap(map.Name, 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); }
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; }
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); }
/// <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; }