Example #1
0
        private void btnExtractImage_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _blf = new PureBLF(_blfLocation);
                var sfd = new SaveFileDialog
                {
                    Title = "Save the extracted BLF Image",
                    Filter = "JPEG Image (*.jpg)|*.jpg",
                    FileName = lblBLFname.Text.Replace(".blf", "")
                };

                if (!((bool)sfd.ShowDialog()))
                {
                    Close();
                    return;
                }
                var imageToExtract = new List<byte>(_blf.BLFChunks[1].ChunkData);
                imageToExtract.RemoveRange(0, 0x08);

                File.WriteAllBytes(sfd.FileName, imageToExtract.ToArray<byte>());

                MetroMessageBox.Show("Exracted!", "The BLF Image has been extracted.");
                Close();
            }
            catch (Exception ex)
            {
                Close();
                MetroMessageBox.Show("Extraction Failed!", "The BLF Image failed to be extracted: \n " + ex.Message);
            }
        }
Example #2
0
        public void LoadMapInfo()
        {
            try
            {
                // Just a lazy way to validate the BLF file
                _blf = new PureBLF(_blfLocation);
                if (_blf.BLFChunks[1].ChunkMagic != "levl")
                    throw new Exception("The selected Map Info BLF is not a valid Map Info BLF file.");
                _blf.Close();

                _mapInfo = new MapInfo(_blfLocation);

                Dispatcher.Invoke(new Action(delegate
                {
                    // Add BLF Info
                    paneBLFInfo.Children.Insert(0, new Components.MapHeaderEntry("BLF Length:", "0x" + _mapInfo.Stream.Length.ToString("X8")));
                    paneBLFInfo.Children.Insert(1, new Components.MapHeaderEntry("BLF Chunks:", _blf.BLFChunks.Count.ToString(CultureInfo.InvariantCulture)));

                    // Load Languages
                    LoadLanguages(_mapInfo.MapInformation.Game);

                    // Add Map Info
                    switch (_mapInfo.MapInformation.Game)
                    {
                        case MapInfo.GameIdentifier.Halo3:
                            txtGameName.Text = "Halo 3";
                            break;
                        case MapInfo.GameIdentifier.Halo3ODST:
                            txtGameName.Text = "Halo 3: ODST";
                            break;
                        case MapInfo.GameIdentifier.HaloReach:
                            txtGameName.Text = "Halo Reach";
                            break;
                        case MapInfo.GameIdentifier.Halo4:
                            txtGameName.Text = "Halo 4";
                            break;
                    }
                    txtMapID.Text = _mapInfo.MapInformation.MapID.ToString(CultureInfo.InvariantCulture);
                    lblBLFNameFooter.Text = lblBLFname.Text = txtMapInternalName.Text = _mapInfo.MapInformation.InternalName;
                    txtMapPhysicalName.Text = _mapInfo.MapInformation.PhysicalName;

                    // Update UI
                    _startEditing = true;
                    cbLanguages.SelectedIndex = 0;

                    if (Settings.startpageHideOnLaunch)
                        Settings.homeWindow.ExternalTabClose(Windows.Home.TabGenre.StartPage);

                    RecentFiles.AddNewEntry(new FileInfo(_blfLocation).Name, _blfLocation, "Map Info", Settings.RecentFileType.MapInfo);
                }));
            }
            catch (Exception ex)
            {
                Dispatcher.Invoke(new Action(delegate
                {
                    MetroMessageBox.Show("Unable to open MapInfo", ex.Message);
                    Settings.homeWindow.ExternalTabClose((LayoutDocument)Parent);
                }));
            }
        }
Example #3
0
        private void btnExtractImage_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _blf = new PureBLF(_blfLocation);
                var sfd = new SaveFileDialog
                {
                    Title = "Save the extracted BLF Image",
                    FileName = lblBLFname.Text.Replace(".blf", "")
                };

                //Check if the blf image is a not JPG and set the filter accordingly
                switch (blfImageFormat)
                {
                    case "PNG":
                        sfd.Filter = "PNG Image (*.png)|*.png";
                        break;
                    case "BMP":
                        sfd.Filter = "BMP Image (*.bmp)|*.bmp";
                        break;
                    default:
                        sfd.Filter = "JPEG Image (*.jpg)|*.jpg";
                        break;
                }

                if (!((bool)sfd.ShowDialog()))
                {
                    Close();
                    return;
                }
                var imageToExtract = new List<byte>(_blf.BLFChunks[1].ChunkData);
                imageToExtract.RemoveRange(0, 0x08);

                File.WriteAllBytes(sfd.FileName, imageToExtract.ToArray<byte>());

                MetroMessageBox.Show("Exracted!", "The BLF Image has been extracted.");
                Close();
            }
            catch (Exception ex)
            {
                Close();
                MetroMessageBox.Show("Extraction Failed!", "The BLF Image failed to be extracted: \n " + ex.Message);
            }
        }
Example #4
0
        private void StartupDetermineType(string path)
        {
            try
            {
                if (File.Exists(path))
                {
                    // Magic Check
                    string magic;
                    using (var stream = new EndianReader(File.OpenRead(path), Endian.BigEndian))
                        magic = stream.ReadAscii(0x04).ToLower();

                    switch (magic)
                    {
                        case "head":
                        case "daeh":
                            // Map File
                            AddCacheTabModule(path);
                            return;

                        case "asmp":
                            // Patch File
                            AddPatchTabModule(path);
                            return;

                        case "_blf":
                            // BLF Container, needs more checking
                            var blf = new PureBLF(path);
                            blf.Close();
                            if (blf.BLFChunks.Count > 2)
                            {
                                switch (blf.BLFChunks[1].ChunkMagic)
                                {
                                    case "levl":
                                        AddInfooTabModule(path);
                                        return;
                                    case "mapi":
                                        AddImageTabModule(path);
                                        return;
                                }
                            }
                            MetroMessageBox.Show("Unsupported BLF Type", "The selected BLF file is not supported in assembly.");
                            return;

                        default:
                            MetroMessageBox.Show("Unsupported file type", "The selected file is not supported in assembly.");
                            return;
                    }
                }

                MetroMessageBox.Show("Unable to find file", "The selected file could no longer be found");
            }
            catch (Exception ex) { MetroException.Show(ex); }
        }
Example #5
0
        private void DoWork(BackgroundWorker worker, IEnumerable<MetaItem> items)
        {
            var rootFolder = Path.GetDirectoryName(Application.StartupPath);
            var metaOutput = new MetaContent()
                                 {
                                     GeneratedTimestamp = ConvertToTimestamp(DateTime.Now),
                                     Type = "cache_meta_content"
                                 };

            foreach(var item in items)
            {
                var gameEntry = new MetaContent.GameEntry { Targets = item.Targets };

                var gameTarget = item.Targets.Split('|')[0];
                var files = Directory.GetFiles(item.MapInfoPath, "*.mapinfo");
                foreach (var file in files)
                {
                    var fi = new FileInfo(file);
                    var continueProcessing = true;
                    foreach (var block in blfBlockList.Where(block => fi.Name.StartsWith(block)))
                        continueProcessing = false;

                    if (!continueProcessing) continue;

                    var mapInfo = new MapInfo(file);
                    var metaEntry = new MetaContent.GameEntry.MetaDataEntry
                                        {
                                            English_Name = mapInfo.MapInformation.MapNames[0],
                                            English_Desc = mapInfo.MapInformation.MapDescriptions[0],
                                            InternalName = mapInfo.MapInformation.InternalName,
                                            PhysicalName = mapInfo.MapInformation.PhysicalName,
                                            MapId = mapInfo.MapInformation.MapID
                                        };

                    var extraSuffix = "";
                    if (gameTarget.StartsWith("Halo4"))
                        extraSuffix = "_card";

                    var blfFile1 = new PureBLF(string.Format("{0}\\{1}{2}.blf", item.BlfPath, mapInfo.MapInformation.PhysicalName, extraSuffix));
                    var blfFile = new List<byte>(blfFile1.BLFChunks[1].ChunkData);
                    blfFile1.Close();
                    blfFile.RemoveRange(0, 0x08);

                    var blfFileSmall1 =
                        new PureBLF(string.Format("{0}\\{1}_sm.blf", item.BlfPath, mapInfo.MapInformation.PhysicalName));
                    var blfFileSmall = new List<byte>(blfFileSmall1.BLFChunks[1].ChunkData);
                    blfFileSmall1.Close();
                    blfFileSmall.RemoveRange(0, 0x08);

                    if (!Directory.Exists(string.Format("{0}\\{1}\\maps\\", rootFolder, gameTarget)))
                        Directory.CreateDirectory(string.Format("{0}\\{1}\\maps\\", rootFolder, gameTarget));

                    File.WriteAllBytes(
                        string.Format("{0}\\{1}\\maps\\{2}.jpg", rootFolder, gameTarget, mapInfo.MapInformation.PhysicalName),
                        blfFile.ToArray<byte>());
                    File.WriteAllBytes(
                        string.Format("{0}\\{1}\\maps\\{2}_small.jpg", rootFolder, gameTarget, mapInfo.MapInformation.PhysicalName),
                        blfFileSmall.ToArray<byte>());
                    metaEntry.ImageMetaData = new MetaContent.GameEntry.MetaDataEntry.ImageMetaDataEntry
                                                  {
                                                      Large =
                                                          string.Format("{0}/maps/{1}.jpg", gameTarget, mapInfo.MapInformation.PhysicalName),
                                                      Small =
                                                          string.Format("{0}/maps/{1}_small.jpg", gameTarget,
                                                                        mapInfo.MapInformation.PhysicalName)
                                                  };
                    gameEntry.MetaData.Add(metaEntry);
                }
                metaOutput.Games.Add(gameEntry);
            }

            File.WriteAllText(string.Format("{0}/content.aidf", rootFolder), JsonConvert.SerializeObject(metaOutput));
        }
Example #6
0
        private void loadBLF()
        {
            try
            {
                _blf = new PureBLF(_blfLocation);

                var imgChunkData = new List<byte>(_blf.BLFChunks[1].ChunkData);
                imgChunkData.RemoveRange(0, 0x08);

                Dispatcher.Invoke(new Action(delegate
                {
                    var image = new BitmapImage();
                    image.BeginInit();
                    image.StreamSource = new MemoryStream(imgChunkData.ToArray());
                    image.EndInit();

                    imgBLF.Source = image;

                    var stream = new EndianStream(new MemoryStream(imgChunkData.ToArray<byte>()), Endian.BigEndian);
                    stream.SeekTo(0x0);
                    ushort imageMagic = stream.ReadUInt16();

                    switch (imageMagic)
                    {
                        case 0xFFD8:
                            blfImageFormat = "JPEG";
                            break;
                        case 0x8950:
                            blfImageFormat = "PNG";
                            break;
                        case 0x424D:
                            blfImageFormat = "BMP";
                            break;
                        default:
                            blfImageFormat = "Unknown";
                            break;
                    }

                    // Add Image Info
                    paneImageInfo.Children.Insert(0, new MapHeaderEntry("Image Format:", blfImageFormat));
                    paneImageInfo.Children.Insert(1, new MapHeaderEntry("Image Width:", image.PixelWidth + "px"));
                    paneImageInfo.Children.Insert(2, new MapHeaderEntry("Image Height", image.PixelHeight + "px"));

                    // Add BLF Info
                    paneBLFInfo.Children.Insert(0, new MapHeaderEntry("BLF Length:", "0x" + _blf.BLFStream.Length.ToString("X")));
                    paneBLFInfo.Children.Insert(1,
                        new MapHeaderEntry("BLF Chunks:", _blf.BLFChunks.Count.ToString(CultureInfo.InvariantCulture)));

                    if (App.AssemblyStorage.AssemblySettings.StartpageHideOnLaunch)
                        App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(Home.TabGenre.StartPage);

                    RecentFiles.AddNewEntry(new FileInfo(_blfLocation).Name, _blfLocation, "BLF Image", Settings.RecentFileType.Blf);
                    Close();
                }));
            }
            catch (Exception ex)
            {
                Close();
                Dispatcher.Invoke(new Action(delegate
                {
                    MetroMessageBox.Show("Unable to open BLF", ex.Message.ToString(CultureInfo.InvariantCulture));
                    App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose((LayoutDocument)Parent);
                }));
            }
        }
Example #7
0
        private void btnInjectImage_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _blf = new PureBLF(_blfLocation);
                var ofd = new OpenFileDialog
                {
                    Title = "Open an image to be injected",
                    Filter = "JPEG Image (*.jpg,*.jpeg,)|*.jpg;*.jpeg|PNG Image [H3/ODST]|*.png|BMP Image [H3/ODST]|*.bmp"
                };

                if (!((bool)ofd.ShowDialog()))
                {
                    Close();
                    return;
                }
                byte[] newImage = File.ReadAllBytes(ofd.FileName);
                var stream = new EndianStream(new MemoryStream(newImage), Endian.BigEndian);

                // Check if it's a supported image
                stream.SeekTo(0x0);
                ushort imageMagic = stream.ReadUInt16();
                if (imageMagic != 0xFFD8 && imageMagic != 0x8950 && imageMagic != 0x424D)
                    throw new Exception("Invalid image type. Only JPEG, PNG, and BMP are supported.");

                // Check for size and dimension differences
                var imageSize = new FileInfo(ofd.FileName).Length;
                var image = new BitmapImage();
                image.BeginInit();
                image.StreamSource = new MemoryStream(newImage);
                image.EndInit();
                string sizeMessage = "";
                string dimensionMessage = "";

                if (new FileInfo(ofd.FileName).Length >= 0x1C000)
                    sizeMessage = String.Format("- The size of the new image (0x{0}) exceeds Halo 3/ODST's modified limit of 0x1C000. This image will not display in those games as a result. Can be ignored otherwise.\n",
                        imageSize.ToString("X"));

                if (image.PixelWidth != ((BitmapImage)imgBLF.Source).PixelWidth ||
                    image.PixelHeight != ((BitmapImage)imgBLF.Source).PixelHeight)
                    dimensionMessage = String.Format("- The dimensions of the new image ({0}x{1}) are not the same as the dimensions of the original image ({2}x{3}). This blf may appear stretched or not appear at all as a result.\n",
                        image.PixelWidth, image.PixelHeight, ((BitmapImage)imgBLF.Source).PixelWidth, ((BitmapImage)imgBLF.Source).PixelHeight);

                if (dimensionMessage != "" || sizeMessage != "")
                    if (MetroMessageBox.Show("Warning",
                        "There were some potential issue(s) found with your new image;\n\n" + String.Format("{0}{1}",
                        sizeMessage, dimensionMessage) + "\nInject anyway?",
                        MetroMessageBox.MessageBoxButtons.OkCancel) != MetroMessageBox.MessageBoxResult.OK)
                        {
                            Close();
                            return;
                        }

                // It's the right everything! Let's inject

                var newImageChunkData = new List<byte>();
                newImageChunkData.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00 });
                byte[] imageLength = BitConverter.GetBytes(newImage.Length);
                Array.Reverse(imageLength);
                newImageChunkData.AddRange(imageLength);
                newImageChunkData.AddRange(newImage);

                // Write data to chunk file
                _blf.BLFChunks[1].ChunkData = newImageChunkData.ToArray<byte>();

                _blf.RefreshRelativeChunkData();
                _blf.UpdateChunkTable();

                // Update eof offset value
                var eofstream = new EndianStream(new MemoryStream(_blf.BLFChunks[2].ChunkData), Endian.BigEndian);

                uint eofFixup = (uint)_blf.BLFStream.Length - 0x111; //real cheap but hey it works and is always the same in all games

                eofstream.SeekTo(0);
                eofstream.WriteUInt32(eofFixup);

                _blf.RefreshRelativeChunkData();
                _blf.UpdateChunkTable();

                Close();
                MetroMessageBox.Show("Injected!", "The BLF Image has been injected. This image tab will now close.");
                App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(_tab);
            }
            catch (Exception ex)
            {
                Close();
                MetroMessageBox.Show("Inject Failed!", "The BLF Image failed to be injected: \n " + ex.Message);
            }
        }
Example #8
0
		public void LoadCampaign()
		{
			try
			{
				// Just a lazy way to validate the BLF file
				_blf = new PureBLF(_blfLocation);
				if (_blf.BLFChunks[1].ChunkMagic != "cmpn")
					throw new Exception("The selected Campaign BLF is not a valid Campaign BLF file.");
				_blf.Close();

				_campaign = new Campaign(_blfLocation);

				Dispatcher.Invoke(new Action(delegate
				{
					// Add BLF Info
					paneBLFInfo.Children.Insert(0, new MapHeaderEntry("BLF Length:", "0x" + _campaign.Stream.Length.ToString("X")));
					paneBLFInfo.Children.Insert(1,
						new MapHeaderEntry("BLF Chunks:", _blf.BLFChunks.Count.ToString(CultureInfo.InvariantCulture)));

					// Load Languages
					LoadLanguages();

					// Load Map IDs
					LoadMapIDs();

					// Load Unlock Bytes
					LoadUnlockBytes();

					// Update UI
					_startEditing = true;
					cbLanguages.SelectedIndex = 0;

					if (App.AssemblyStorage.AssemblySettings.StartpageHideOnLaunch)
						App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(Home.TabGenre.StartPage);

					RecentFiles.AddNewEntry(new FileInfo(_blfLocation).Name, _blfLocation, "Campaign", Settings.RecentFileType.Campaign);
					Close();
				}));
			}
			catch (Exception ex)
			{
				Dispatcher.Invoke(new Action(delegate
				{
					MetroMessageBox.Show("Unable to open Campaign", ex.Message);
					App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(_tab);
					Close();
				}));
			}
		}
Example #9
0
        private void loadBLF()
        {
            try
            {
                _blf = new PureBLF(_blfLocation);

                var imgChunkData = new List<byte>(_blf.BLFChunks[1].ChunkData);
                imgChunkData.RemoveRange(0, 0x08);

                Dispatcher.Invoke(new Action(delegate
                {
                    var image = new BitmapImage();
                    image.BeginInit();
                    image.StreamSource = new MemoryStream(imgChunkData.ToArray());
                    image.EndInit();

                    imgBLF.Source = image;

                    // Add Image Info
                    paneImageInfo.Children.Insert(0, new Components.MapHeaderEntry("Image Width:", image.PixelWidth + "px"));
                    paneImageInfo.Children.Insert(1, new Components.MapHeaderEntry("Image Height", image.PixelHeight + "px"));

                    // Add BLF Info
                    paneBLFInfo.Children.Insert(0, new Components.MapHeaderEntry("BLF Length:", "0x" + _blf.BLFStream.Length.ToString("X")));
                    paneBLFInfo.Children.Insert(1, new Components.MapHeaderEntry("BLF Chunks:", _blf.BLFChunks.Count.ToString()));

                    if (Settings.startpageHideOnLaunch)
                        Settings.homeWindow.ExternalTabClose(Windows.Home.TabGenre.StartPage);

                    RecentFiles.AddNewEntry(new FileInfo(_blfLocation).Name, _blfLocation, "BLF Image", Settings.RecentFileType.BLF);
                }));
            }
            catch (Exception ex)
            {
                Dispatcher.Invoke(new Action(delegate
                {
                    MetroMessageBox.Show("Unable to open BLF", ex.Message.ToString(CultureInfo.InvariantCulture));
                    Settings.homeWindow.ExternalTabClose((TabItem)Parent);
                }));
            }
        }
Example #10
0
        private void loadBLF()
        {
            try
            {
                _blf = new PureBLF(_blfLocation);

                var imgChunkData = new List<byte>(_blf.BLFChunks[1].ChunkData);

                // determine png vs jpg and then locate the header of the image
                // strip out all content prior to that for viewing
                int location = -1;
                if (_blf.BLFChunks[1].ImageType == "jpg")
                {
                    location = ByteListArray.Locate(_blf.BLFChunks[1].ChunkData, _blf.JpgHeader, 100);
                }
                else if (_blf.BLFChunks[1].ImageType == "png")
                {
                    location = ByteListArray.Locate(_blf.BLFChunks[1].ChunkData, _blf.PngHeader, 100);
                }

                if (location != -1)
                    imgChunkData.RemoveRange(0, location);

                Dispatcher.Invoke(new Action(delegate
                {
                    var image = new BitmapImage();
                    image.BeginInit();
                    image.StreamSource = new MemoryStream(imgChunkData.ToArray());
                    image.EndInit();

                    imgBLF.Source = image;

                    // Add Image Info
                    paneImageInfo.Children.Insert(0, new Components.MapHeaderEntry("Image Width:", image.PixelWidth + "px"));
                    paneImageInfo.Children.Insert(1, new Components.MapHeaderEntry("Image Height", image.PixelHeight + "px"));

                    // Add BLF Info
                    paneBLFInfo.Children.Insert(0, new Components.MapHeaderEntry("BLF Length:", "0x" + _blf.BLFStream.Length.ToString("X")));
                    paneBLFInfo.Children.Insert(1, new Components.MapHeaderEntry("BLF Chunks:", _blf.BLFChunks.Count.ToString(CultureInfo.InvariantCulture)));

                    if (Settings.startpageHideOnLaunch)
                        Settings.homeWindow.ExternalTabClose(Windows.Home.TabGenre.StartPage);

                    RecentFiles.AddNewEntry(new FileInfo(_blfLocation).Name, _blfLocation, "BLF Image", Settings.RecentFileType.BLF);
                }));
            }
            catch (Exception ex)
            {
                Dispatcher.Invoke(new Action(delegate
                {
                    MetroMessageBox.Show("Unable to open BLF", ex.Message.ToString(CultureInfo.InvariantCulture));
                    Settings.homeWindow.ExternalTabClose((LayoutDocument)Parent);
                }));
            }
        }
Example #11
0
        public void LoadMapInfo()
        {
            try
            {
                // Just a lazy way to validate the BLF file
                _blf = new PureBLF(_blfLocation);
                if (_blf.BLFChunks[1].ChunkMagic != "levl")
                    throw new Exception("The selected Map Info BLF is not a valid Map Info BLF file.");
                _blf.Close();

                _mapInfo = new MapInfo(_blfLocation, App.AssemblyStorage.AssemblySettings.DefaultMapInfoDatabase);

                Dispatcher.Invoke(new Action(delegate
                {

                    // Add BLF Info
                    paneBLFInfo.Children.Insert(0, new MapHeaderEntry("MapInfo Version:", _mapInfo.Engine.Version.ToString(CultureInfo.InvariantCulture)));
                    paneBLFInfo.Children.Insert(1, new MapHeaderEntry("BLF Length:", "0x" + _mapInfo.Stream.Length.ToString("X")));
                    paneBLFInfo.Children.Insert(2, new MapHeaderEntry("BLF Chunks:", _blf.BLFChunks.Count.ToString(CultureInfo.InvariantCulture)));

                    // Hide unused elements
                    if (_mapInfo.Engine.MaxTeamCollection == null)
                        tiMaxTeams.Visibility = Visibility.Collapsed;
                    if (_mapInfo.Engine.MultiplayerObjectCollection == null)
                        tiMPObjects.Visibility = Visibility.Collapsed;
                    if (!_mapInfo.Engine.UsesDefaultAuthor)
                    {
                        lblDefaultAuthor.Visibility = Visibility.Collapsed;
                        txtDefaultAuthor.Visibility = Visibility.Collapsed;
                    }

                    // Load Languages
                    LoadLanguages();

                    // Load Map Info
                    txtGameName.Text = _mapInfo.Engine.Name;
                    txtMapID.Text = _mapInfo.MapInformation.MapID.ToString(CultureInfo.InvariantCulture);
                    txtMapInternalName.Text = _mapInfo.MapInformation.InternalName;
                    txtMapPhysicalName.Text = _mapInfo.MapInformation.PhysicalName;

                    // Load Default Author & change margin if necessary
                    txtDefaultAuthor.Text = _mapInfo.MapInformation.DefaultAuthor;
                    if (_mapInfo.Engine.UsesDefaultAuthor && _mapInfo.Engine.Version <= 8)
                            lblDefaultAuthor.Margin = new Thickness(0, 37, 0, 3);

                    // Set up the Type combo box
                    // TODO: Add flags to formats?
                    cbType_Cine.Visibility = cbType_FF.Visibility = _mapInfo.Engine.Version < 5 ? Visibility.Collapsed : Visibility.Visible;
                    cbType_Cine.IsEnabled = cbType_FF.IsEnabled = _mapInfo.Engine.Version >= 5;
                    cbType_FF.Content = _mapInfo.Engine.Version < 8 ? "Firefight" : "Spartan Ops";
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsMainMenu))
                        cbType.SelectedIndex = 0;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsMultiplayer))
                        cbType.SelectedIndex = 1;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsCampaign))
                        cbType.SelectedIndex = 2;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsCinematic))
                        cbType.SelectedIndex = 3;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsFirefight))
                        cbType.SelectedIndex = 4;

                    // Set up the Checkboxes
                    cbForgeOnly.Visibility  = _mapInfo.Engine.Version < 9 ? Visibility.Collapsed : Visibility.Visible;
                    cbVisible.IsChecked = _mapInfo.MapInformation.Flags.HasFlag(LevelFlags.Visible);
                    cbGeneratesFilm.IsChecked = _mapInfo.MapInformation.Flags.HasFlag(LevelFlags.GeneratesFilm);
                    cbDLC.IsChecked = _mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsDLC);
                    cbForgeOnly.IsChecked = _mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsForgeOnly);

                    // Load Max Teams
                    if (_mapInfo.Engine.MaxTeamCollection != null)
                        LoadMaxTeams();

                    // Load MP Objects
                    if (_mapInfo.Engine.MultiplayerObjectCollection != null)
                        LoadMultiplayerObjects();

                    // Load Insertion Points
                    LoadInsertionPoints();

                    // Update UI
                    _startEditing = true;
                    cbLanguages.SelectedIndex = 0;
                    cbInsertIndex.SelectedIndex = 0;
                    cbInsertLanguages.SelectedIndex = 0;

                    if (App.AssemblyStorage.AssemblySettings.StartpageHideOnLaunch)
                        App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(Home.TabGenre.StartPage);

                    RecentFiles.AddNewEntry(new FileInfo(_blfLocation).Name, _blfLocation, "Map Info", Settings.RecentFileType.MapInfo);
                    Close();
                }));
            }
            catch (Exception ex)
            {
                Dispatcher.Invoke(new Action(delegate
                {
                    MetroMessageBox.Show("Unable to open MapInfo", ex.Message);
                    App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(_tab);
                    Close();
                }));
            }
        }
Example #12
0
        private void btnInjectImage_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _blf = new PureBLF(_blfLocation);
                var ofd = new OpenFileDialog
                {
                    Title = "Opem an image to be injected",
                    Filter = "JPEG Image (*.jpg)|*.jpg|JPEG Image (*.jpeg)|*.jpeg"
                };

                if (!((bool)ofd.ShowDialog()))
                {
                    Close();
                    return;
                }
                byte[] newImage = File.ReadAllBytes(ofd.FileName);
                var stream = new EndianStream(new MemoryStream(newImage), Endian.BigEndian);

                // To-do: Allow PNGs

                // Check if it's a JIFI
                stream.SeekTo(0x0);
                ushort imageMagic = stream.ReadUInt16();
                if (imageMagic != 0xFFD8)
                    throw new Exception("Invalid image type, it has to be a JPEG (JFIF in the header).");

                // Check if it's the right size
                var image = new BitmapImage();
                image.BeginInit();
                image.StreamSource = new MemoryStream(newImage);
                image.EndInit();

                if (image.PixelWidth != ((BitmapImage)imgBLF.Source).PixelWidth ||
                    image.PixelHeight != ((BitmapImage)imgBLF.Source).PixelHeight)
                    throw new Exception(string.Format("Image isn't the right size. It must be {0}x{1}",
                        ((BitmapImage)imgBLF.Source).PixelWidth, ((BitmapImage)imgBLF.Source).PixelHeight));

                // It's the right everything! Let's inject

                var newImageChunkData = new List<byte>();
                newImageChunkData.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00 });
                byte[] imageLength = BitConverter.GetBytes(newImage.Length);
                Array.Reverse(imageLength);
                newImageChunkData.AddRange(imageLength);
                newImageChunkData.AddRange(newImage);

                // Write data to chunk file
                _blf.BLFChunks[1].ChunkData = newImageChunkData.ToArray<byte>();

                _blf.RefreshRelativeChunkData();
                _blf.UpdateChunkTable();

                imgBLF.Source = image;

                MetroMessageBox.Show("Injected!", "The BLF Image has been injected.");
                Close();
            }
            catch (Exception ex)
            {
                Close();
                MetroMessageBox.Show("Inject Failed!", "The BLF Image failed to be injected: \n " + ex.Message);
            }
        }
Example #13
0
        public void LoadMapInfo()
        {
            try
            {
                // Just a lazy way to validate the BLF file
                _blf = new PureBLF(_blfLocation);
                if (_blf.BLFChunks[1].ChunkMagic != "levl")
                    throw new Exception("The selected Map Info BLF is not a valid Map Info BLF file.");
                _blf.Close();

                _mapInfo = new MapInfo(_blfLocation);

                Dispatcher.Invoke(new Action(delegate
                {
                    // Add BLF Info
                    paneBLFInfo.Children.Insert(0, new MapHeaderEntry("BLF Length:", "0x" + _mapInfo.Stream.Length.ToString("X8")));
                    paneBLFInfo.Children.Insert(1,
                        new MapHeaderEntry("BLF Chunks:", _blf.BLFChunks.Count.ToString(CultureInfo.InvariantCulture)));

                    // Load Languages
                    LoadLanguages();

                    // Add Map Info
                    switch (_mapInfo.MapInformation.Game)
                    {
                        case MapInfo.GameIdentifier.Halo3:
                            txtGameName.Text = "Halo 3";
                            break;
                        case MapInfo.GameIdentifier.Halo3ODST:
                            txtGameName.Text = "Halo 3: ODST";
                            break;
                        case MapInfo.GameIdentifier.HaloReach:
                            txtGameName.Text = "Halo Reach";
                            break;
                        case MapInfo.GameIdentifier.HaloReachBetas:
                            txtGameName.Text = "Halo Reach Pre/Beta";
                            break;
                        case MapInfo.GameIdentifier.Halo4:
                            txtGameName.Text = "Halo 4";
                            break;
                    }
                    txtMapID.Text = _mapInfo.MapInformation.MapID.ToString(CultureInfo.InvariantCulture);
                    lblBLFNameFooter.Text = lblBLFname.Text = txtMapInternalName.Text = _mapInfo.MapInformation.InternalName;
                    txtMapPhysicalName.Text = _mapInfo.MapInformation.PhysicalName;

                    // Set up the Type combo box
                    switch (_mapInfo.MapInformation.Game)
                    {
                        case MapInfo.GameIdentifier.Halo3:
                        case MapInfo.GameIdentifier.Halo3ODST:
                            cbType_Cine.Visibility = System.Windows.Visibility.Collapsed;
                            cbType_Cine.IsEnabled = false;
                            cbType_FF.Visibility = System.Windows.Visibility.Collapsed;
                            cbType_FF.IsEnabled = false;
                            break;
                        case MapInfo.GameIdentifier.HaloReach:
                        case MapInfo.GameIdentifier.HaloReachBetas:
                            cbType_Cine.Visibility = System.Windows.Visibility.Visible;
                            cbType_Cine.IsEnabled = true;
                            cbType_FF.Visibility = System.Windows.Visibility.Visible;
                            cbType_FF.IsEnabled = true;
                            cbType_FF.Content = "Firefight";
                            break;
                        case MapInfo.GameIdentifier.Halo4:
                            cbType_Cine.Visibility = System.Windows.Visibility.Visible;
                            cbType_Cine.IsEnabled = true;
                            cbType_FF.Visibility = System.Windows.Visibility.Visible;
                            cbType_FF.IsEnabled = true;
                            cbType_FF.Content = "Spartan Ops";
                            break;
                    }
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsMainMenu))
                        cbType.SelectedIndex = 0;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsMultiplayer))
                        cbType.SelectedIndex = 1;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsCampaign))
                        cbType.SelectedIndex = 2;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsCinematic))
                        cbType.SelectedIndex = 3;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsFirefight))
                        cbType.SelectedIndex = 4;

                    // Set up the Checkboxes
                    switch (_mapInfo.MapInformation.Game)
                    {
                        case MapInfo.GameIdentifier.Halo4:
                            cbDLC.Margin = new Thickness(112, 0, 0, 0);
                            cbForgeOnly.Visibility = System.Windows.Visibility.Visible;
                            break;
                        default:
                            cbDLC.Margin = new Thickness(150, 0, 0, 0);
                            cbForgeOnly.Visibility = System.Windows.Visibility.Collapsed;
                            break;
                    }
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.Visible))
                        cbVisible.IsChecked = true;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.GeneratesFilm))
                        cbGeneratesFilm.IsChecked = true;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsDLC))
                        cbDLC.IsChecked = true;
                    if (_mapInfo.MapInformation.Flags.HasFlag(LevelFlags.IsForgeOnly))
                        cbForgeOnly.IsChecked = true;

                    // Update UI
                    _startEditing = true;
                    cbLanguages.SelectedIndex = 0;

                    if (App.AssemblyStorage.AssemblySettings.StartpageHideOnLaunch)
                        App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(Home.TabGenre.StartPage);

                    RecentFiles.AddNewEntry(new FileInfo(_blfLocation).Name, _blfLocation, "Map Info", Settings.RecentFileType.MapInfo);
                    Close();
                }));
            }
            catch (Exception ex)
            {
                Dispatcher.Invoke(new Action(delegate
                {
                    MetroMessageBox.Show("Unable to open MapInfo", ex.Message);
                    App.AssemblyStorage.AssemblySettings.HomeWindow.ExternalTabClose(_tab);
                    Close();
                }));
            }
        }