public EditorDLCObjectEditor(VMS_DLC meta, PuyoFile pvm) { editorMeta = meta; puyo = pvm; InitializeComponent(); InitializeMetadata(); }
/// <summary> /// Load from a file (VMS or INI) /// </summary> public static VMS_DLC LoadFile(string filename) { switch (Path.GetExtension(filename.ToLowerInvariant())) { case ".vms": return(new VMS_DLC(File.ReadAllBytes(filename))); case ".ini": break; default: System.Windows.Forms.MessageBox.Show("Unknown file format. Use VMS or INI."); return(new VMS_DLC()); } VMS_DLC header = IniSerializer.Deserialize <VMS_DLC>(filename); header.Icon = new Bitmap(Path.ChangeExtension(filename, ".bmp")); header.SoundData = new byte[0]; header.TextureData = File.ReadAllBytes(Path.ChangeExtension(filename, ".pvm")); if (File.Exists(Path.ChangeExtension(filename, ".bin"))) { header.ModelData = FraGag.Compression.Prs.Compress(File.ReadAllBytes(Path.ChangeExtension(filename, ".bin"))); } else { header.ModelData = ConvertModel(Path.ChangeExtension(filename, ".sa1mdl")); } if (header.ContainsSound) { header.SoundData = File.ReadAllBytes(Path.ChangeExtension(filename, ".mlt")); } return(header); }
private void newToolStripMenuItem_Click(object sender, EventArgs e) { meta = new VMS_DLC(); meta.Icon = new Bitmap(32, 32); metaBackup = new VMS_DLC(meta); UpdateGeneralInfo(); UpdateMessage(); UpdateModel(); UpdateTextures(); UpdateSound(); UpdateSize(); }
/// <summary> /// Make a clone /// </summary> public VMS_DLC(VMS_DLC original) { Title = original.Title; Description = original.Description; AppName = original.AppName; Icon = original.Icon; Identifier = original.Identifier; EnableSonic = original.EnableSonic; EnableTails = original.EnableTails; EnableKnuckles = original.EnableKnuckles; EnableGamma = original.EnableGamma; EnableBig = original.EnableBig; EnableAmy = original.EnableAmy; EnableWhatever1 = original.EnableWhatever1; EnableWhatever2 = original.EnableWhatever2; Region = original.Region; JapaneseStrings = new string[16]; EnglishStrings = new string[16]; FrenchStrings = new string[16]; GermanStrings = new string[16]; SpanishStrings = new string[16]; for (int i = 0; i < 16; i++) { JapaneseStrings[i] = original.JapaneseStrings[i]; EnglishStrings[i] = original.EnglishStrings[i]; FrenchStrings[i] = original.FrenchStrings[i]; GermanStrings[i] = original.GermanStrings[i]; SpanishStrings[i] = original.SpanishStrings[i]; } Items = new List <DLCObjectData>(); if (original.Items != null && original.Items.Count > 0) { foreach (DLCObjectData objdata in original.Items) { Items.Add(new DLCObjectData(objdata)); } } if (original.TextureData != null) { TextureData = new byte[original.TextureData.Length]; Array.Copy(original.TextureData, TextureData, TextureData.Length); } if (original.SoundData != null) { SoundData = new byte[original.SoundData.Length]; Array.Copy(original.SoundData, SoundData, SoundData.Length); } if (original.ModelData != null) { ModelData = new byte[original.ModelData.Length]; Array.Copy(original.ModelData, ModelData, ModelData.Length); } }
private void buttonEditObjects_Click(object sender, EventArgs e) { VMS_DLC original = new VMS_DLC(meta); EditorDLCObjectEditor obje = new EditorDLCObjectEditor(meta, puyo); DialogResult result = obje.ShowDialog(this); switch (result) { case DialogResult.Yes: meta = obje.editorMeta; break; default: meta = new VMS_DLC(original); break; } }
private void importToolStripMenuItem_Click(object sender, EventArgs e) { using (OpenFileDialog op = new OpenFileDialog() { FileName = Path.ChangeExtension(Path.GetFileName(currentFilename), "ini"), Title = "Import an INI File", Filter = "INI Files|*.ini|All Files|*.*", DefaultExt = "ini" }) { if (op.ShowDialog() == DialogResult.OK) { meta = VMS_DLC.LoadFile(op.FileName); // Add data for empty strings List <string> StringsJ = new List <string>(16); List <string> StringsE = new List <string>(16); List <string> StringsF = new List <string>(16); List <string> StringsG = new List <string>(16); List <string> StringsS = new List <string>(16); for (int i = 0; i < meta.JapaneseStrings.Length; i++) { StringsJ.Add(meta.JapaneseStrings[i]); StringsE.Add(meta.EnglishStrings[i]); StringsF.Add(meta.FrenchStrings[i]); StringsG.Add(meta.GermanStrings[i]); StringsS.Add(meta.SpanishStrings[i]); } if (StringsJ.Count < 16) { do { StringsJ.Add(""); StringsE.Add(""); StringsF.Add(""); StringsG.Add(""); StringsS.Add(""); }while (StringsJ.Count < 16); } meta.JapaneseStrings = StringsJ.ToArray(); meta.EnglishStrings = StringsE.ToArray(); meta.FrenchStrings = StringsF.ToArray(); meta.GermanStrings = StringsG.ToArray(); meta.SpanishStrings = StringsS.ToArray(); // Add data for empty sections if (meta.TextureData == null) { meta.TextureData = new byte[0]; } if (meta.SoundData == null) { meta.SoundData = new byte[0]; } if (meta.ModelData == null) { meta.ModelData = new byte[0]; } UpdateGeneralInfo(); UpdateMessage(); UpdateModel(); UpdateTextures(); UpdateSound(); UpdateSize(); currentFilename = toolStripStatusFile.Text = Path.ChangeExtension(Path.GetFileName(op.FileName), ".VMS"); currentFullPath = Path.ChangeExtension(op.FileName, ".VMS"); } } }
public void LoadVMS_DLC(string filename) { byte[] file = File.ReadAllBytes(filename); // Get metadata and icon meta = new VMS_DLC(file); metaBackup = new VMS_DLC(meta); meta.Icon = GetIconFromFile(file); // Get PVM pointer uint pvm_pointer = BitConverter.ToUInt32(file, 0x290); int pvm_value = BitConverter.ToInt32(file, 0x294); int pvm_count = BitConverter.ToInt32(file, 0x298); if (pvm_value != 0) { Console.WriteLine("PVM at {0}, number of textures {1}", pvm_pointer.ToString("X"), pvm_count); } checkBoxEnableTextures.Checked = pvm_value != 0; // Get MLT pointer uint mlt_pointer = BitConverter.ToUInt32(file, 0x29C); int mlt_value = BitConverter.ToInt32(file, 0x2A0); if (mlt_value != 0) { Console.WriteLine("MLT at {0}", mlt_pointer.ToString("X")); } // Get PRS pointer uint prs_pointer = BitConverter.ToUInt32(file, 0x2A4); int prs_value = BitConverter.ToInt32(file, 0x2A8); if (prs_value != 0) { Console.WriteLine("PRS at {0}", prs_pointer.ToString("X")); } // Checksum uint crc = VMSFile.CalculateChecksum(ref file, 0x2C0, file.Length); Console.WriteLine("Checksum file / calculated: {0} ({1}) / {2} ({3})", BitConverter.ToInt32(file, 0x2AC).ToString("X"), BitConverter.ToInt32(file, 0x2AC), crc.ToString("X"), (int)crc); // Retrieve sections // Get PVM int pvm_size = (int)mlt_pointer - (int)pvm_pointer; if (pvm_size > 0 && pvm_size + pvm_pointer <= file.Length) { meta.TextureData = new byte[pvm_size]; Array.Copy(file, pvm_pointer, meta.TextureData, 0, pvm_size); UpdateTextures(); } // Get MLT int mlt_size = (int)prs_pointer - (int)mlt_pointer; if (mlt_size > 0 && mlt_pointer + mlt_size <= file.Length) { buttonLoadMLT.Enabled = buttonSaveMLT.Enabled = checkBoxEnableSound.Checked = true; meta.SoundData = new byte[mlt_size]; Array.Copy(file, mlt_pointer, meta.SoundData, 0, mlt_size); //File.WriteAllBytes(Path.Combine(dir, fname + ".mlt"), mltdata); labelSoundSectionSize.Text = "Section size: " + meta.SoundData.Length.ToString() + " bytes"; } uint sectionsize = BitConverter.ToUInt32(file, 0x48); int text_count = BitConverter.ToInt32(file, 0x28C); int item_count = BitConverter.ToInt32(file, 0x284); int item_size = (item_count * 30 + 12); // 12-byte header do { item_size++; }while (item_size % 16 != 0); int prs_size = 0; if (prs_value != 0) { prs_size = file.Length - (int)prs_pointer; } Console.WriteLine("Headerless size {0}, item size {1}, text size {2}, PVM size {3}, MLT size {4}, PRS size {5}", sectionsize, item_size, text_count * 64, pvm_size, mlt_size, prs_size); // Get Model if (prs_size > 0 && prs_pointer + prs_size <= file.Length) { byte[] prsdata = new byte[prs_size]; //Console.WriteLine("Copy from array of size {0} from {1} to array size {2}", file.Length, prs_pointer, prsdata.Length); Array.Copy(file, prs_pointer, prsdata, 0, prs_size); prsdata = FraGag.Compression.Prs.Decompress(prsdata); // Model pointer uint modelpointer = BitConverter.ToUInt32(prsdata, 0) - 0xCCA4000; //Console.WriteLine("Model pointer: {0}", modelpointer.ToString("X")); labelModelSectionSize.Text = "Section size: " + prsdata.Length.ToString() + " bytes"; try { NJS_OBJECT mdl = new NJS_OBJECT(prsdata, (int)modelpointer, 0xCCA4000, ModelFormat.Basic, null); labelModelInfo.Text = GetModelInfo(mdl); } catch (Exception) { labelModelInfo.Text = "Error getting model information."; } checkBoxEnableModel.Checked = true; } UpdateGeneralInfo(); currentFilename = toolStripStatusFile.Text = Path.GetFileName(filename); currentFullPath = filename; saveToolStripMenuItem.Enabled = true; // Add data for empty strings for (int i = 0; i < 16; i++) { if (meta.JapaneseStrings[i] == null) { meta.JapaneseStrings[i] = ""; } if (meta.EnglishStrings[i] == null) { meta.EnglishStrings[i] = ""; } if (meta.FrenchStrings[i] == null) { meta.FrenchStrings[i] = ""; } if (meta.GermanStrings[i] == null) { meta.GermanStrings[i] = ""; } if (meta.SpanishStrings[i] == null) { meta.SpanishStrings[i] = ""; } } UpdateMessage(); UpdateSize(); }