public static byte[] WriteBytes(this ImcFile file) { var parts = file.PartMask == 31 ? 5 : 1; var dataSize = 4 + 6 * parts * (1 + file.Count); using var mem = new MemoryStream(dataSize); using var bw = new BinaryWriter(mem); bw.Write(file.Count); bw.Write(file.PartMask); for (var i = 0; i < parts; ++i) { file.GetDefaultVariant(i).WriteBytes(bw); } for (var i = 0; i < file.Count; ++i) { for (var j = 0; j < parts; ++j) { file.GetVariant(j, i).WriteBytes(bw); } } return(mem.ToArray()); }
public void Open(string fileName) { this.Player.Stop(); this.file = ImcFile.FromFile(fileName); this.RaiseFilePropertyChangedEvents(); this.Blocks.Clear(); foreach (var item in this.file.Map) { if (item is ImcJump) { var jump = (ImcJump)item; this.Blocks.Add(new JumpBlock { Position = jump.Position, Destination = jump.Destination, Id = jump.HookId, Delay = jump.Delay }); } else if (item is ImcText) { var text = (ImcText)item; this.Blocks.Add(new TextBlock { Position = text.Position, Text = text.Text }); } } }
private void PlayButton_Click(object sender, RoutedEventArgs e) { this.Player.Stop(); var selectedItem = this.FilesListView.SelectedItem as string; if (selectedItem == null) { return; } ImcFile imc; try { imc = ImcFile.FromFile(selectedItem); } catch (Exception ex) { MessageBox.Show(this, ex.ToString(), this.Title); return; } this.Player.Play(imc, 0, imc.Length); }
private Tuple <ModelDefinition, ImcVariant> GetMonsterModelDefinition() { const string ImcPathFormat = "chara/monster/m{0:D4}/obj/body/b{1:D4}/b{1:D4}.imc"; const string ModelPathFormat = "chara/monster/m{0:D4}/obj/body/b{1:D4}/model/m{0:D4}b{1:D4}.mdl"; var imcPath = string.Format(ImcPathFormat, ModelKey, BaseKey); var mdlPath = string.Format(ModelPathFormat, ModelKey, BaseKey); var packs = this.Sheet.Collection.PackCollection; if (!packs.TryGetFile(imcPath, out var imcFileBase) || !packs.TryGetFile(mdlPath, out var mdlFileBase) || !(mdlFileBase is ModelFile)) { throw new InvalidOperationException($"Unable to find files for {this}."); } try { var model = ((ModelFile)mdlFileBase).GetModelDefinition(); var imcFile = new ImcFile(imcFileBase); var variant = imcFile.GetVariant(Variant); return(Tuple.Create(model, variant)); } catch (Exception ex) { throw new InvalidOperationException($"Unable to load model for {this}.", ex); } }
public void Clear() { this.Player.Stop(); this.file = new ImcFile(); this.RaiseFilePropertyChangedEvents(); this.Blocks.Clear(); }
public ImcVariant GetVariant(Quad q, EquipSlotKey slotKey) { ImcFile imc = new ImcFile(Realm.Packs.GetFile(GetImcPath(q, slotKey))); int variantPart = SlotOffsetDictionary[slotKey]; int variantKey = IsAWeapon(slotKey) ? q.Value3 : q.Value2; return(imc.Parts.ElementAt(variantPart).Variants[variantKey]); }
public void Play(ImcFile imc, int start, int end) { this.Stop(); this.player.Stream = imc.RetrieveWaveStream(start, end); this.Length = (double)(end - start) / imc.SampleRate; this.StreamName = imc.Name; this.player.Play(); this.timer.Start(); }
private bool TryGetModel(out Skeleton skeleton, out ModelDefinition model, out ImcVariant variant, out int m, out int b) { model = null; skeleton = null; variant = ImcVariant.Default; m = 0; b = 0; var asVariant = SelectedEntry as Models.ModelCharaVariant; if (asVariant == null) { return(false); } int v = asVariant.Value; b = asVariant.Parent.Value; m = asVariant.Parent.Parent.Value; var imcPath = string.Format(ImcPathFormat, m, b); var mdlPath = string.Format(ModelPathFormat, m, b); var sklPath = string.Format(SkeletonPathFormat, m, 1);// b); SaintCoinach.IO.File imcFileBase; SaintCoinach.IO.File mdlFileBase; if (!Parent.Realm.Packs.TryGetFile(imcPath, out imcFileBase) || !Parent.Realm.Packs.TryGetFile(mdlPath, out mdlFileBase) || !(mdlFileBase is ModelFile)) { System.Windows.MessageBox.Show(string.Format("Unable to find files for {0}.", asVariant), "File not found", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return(false); } SaintCoinach.IO.File sklFileBase; if (!Parent.Realm.Packs.TryGetFile(sklPath, out sklFileBase)) { System.Windows.MessageBox.Show(string.Format("Unable to find skeleton for {0}.", asVariant), "File not found", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return(false); } skeleton = new Skeleton(new SklbFile(sklFileBase)); try { var imcFile = new ImcFile(imcFileBase); model = ((ModelFile)mdlFileBase).GetModelDefinition(); variant = imcFile.GetVariant(v); return(true); } catch (Exception e) { System.Windows.MessageBox.Show(string.Format("Unable to load model for {0}:{1}{2}", asVariant, Environment.NewLine, e), "Failure to load", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return(false); } }
public void Write(DirectoryInfo dir) { byte[] data = Data switch { EqdpFile eqdp => eqdp.WriteBytes(), EqpFile eqp => eqp.WriteBytes(), GmpFile gmp => gmp.WriteBytes(), EstFile est => est.WriteBytes(), ImcFile imc => imc.WriteBytes(), _ => throw new NotImplementedException(), }; DisposeFile(CurrentFile); CurrentFile = TempFile.WriteNew(dir, data); Changed = false; }
public static ImcFile Clone(this ImcFile file) { var ret = new ImcFile { Count = file.Count, PartMask = file.PartMask, }; var parts = file.GetParts().Select(p => new ImcFile.ImageChangeParts() { DefaultVariant = p.DefaultVariant, Variants = (ImcFile.ImageChangeData[])p.Variants.Clone(), }).ToArray(); var prop = ret.GetType().GetField("Parts", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); prop !.SetValue(ret, parts); return(ret); }
public void Write(DirectoryInfo dir, GamePath originalPath) { var data = Data switch { EqdpFile eqdp => eqdp.WriteBytes(), EqpFile eqp => eqp.WriteBytes(), GmpFile gmp => gmp.WriteBytes(), EstFile est => est.WriteBytes(), ImcFile imc => imc.WriteBytes(), CmpFile cmp => cmp.WriteBytes(), _ => throw new NotImplementedException(), }; DisposeFile(CurrentFile); CurrentFile = TempFile.WriteNew(dir, data, $"_{originalPath.Filename()}"); Changed = false; }
public static ref ImcFile.ImageChangeData GetValue(this ImcFile file, MetaManipulation manipulation) { var parts = file.GetParts(); var imc = manipulation.ImcIdentifier; var idx = 0; if (imc.ObjectType == ObjectType.Equipment || imc.ObjectType == ObjectType.Accessory) { idx = imc.EquipSlot switch { EquipSlot.Head => 0, EquipSlot.Ears => 0, EquipSlot.Body => 1, EquipSlot.Neck => 1, EquipSlot.Hands => 2, EquipSlot.Wrists => 2, EquipSlot.Legs => 3, EquipSlot.RFinger => 3, EquipSlot.Feet => 4, EquipSlot.LFinger => 4, _ => throw new InvalidEnumArgumentException(), }; } if (imc.Variant == 0) { return(ref parts[idx].DefaultVariant); } if (imc.Variant > parts[idx].Variants.Length) { throw new InvalidImcVariantException(); } return(ref parts[idx].Variants[imc.Variant - 1]); }
public ImcModel() { this.file = new ImcFile(); this.Blocks = new BlockCollection(); this.Player = new Player(); }
private bool TryGetModel(out string title, out Tuple <ModelDefinition, ImcVariant>[] models) { title = null; models = null; var asVariant = SelectedEntry as Models.ModelCharaVariant; if (asVariant == null) { return(false); } title = asVariant.ToString(); int v = asVariant.Value; int e = asVariant.Parent.Value; var d = asVariant.Parent.Parent.Value; var imcPath = string.Format(ImcPathFormat, d, e); SaintCoinach.IO.File imcFileBase; if (!Parent.Realm.Packs.TryGetFile(imcPath, out imcFileBase)) { System.Windows.MessageBox.Show(string.Format("Unable to find files for {0}.", title), "File not found", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return(false); } try { var imcFile = new ImcFile(imcFileBase); var modelsList = new List <Tuple <ModelDefinition, ImcVariant> >(); foreach (var part in imcFile.Parts) { if (!_SelectedParts[part.Bit]) { continue; } var variant = part.Variants[v]; if (variant.Variant == 0) { continue; } var mdlPath = string.Format(ModelPathFormats[part.Bit], d, e); SaintCoinach.IO.File mdlBase; if (!Parent.Realm.Packs.TryGetFile(mdlPath, out mdlBase)) { continue; } var mdl = ((ModelFile)mdlBase).GetModelDefinition(); modelsList.Add(Tuple.Create(mdl, variant)); } if (modelsList.Count == 0) { System.Windows.MessageBox.Show(string.Format("No models found for {0}.", title), "No models", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return(false); } models = modelsList.ToArray(); return(true); } catch (Exception ex) { System.Windows.MessageBox.Show(string.Format("Unable to load model for {0}:{1}{2}", title, Environment.NewLine, ex), "Failure to load", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return(false); } }