Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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
                    });
                }
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        public void Clear()
        {
            this.Player.Stop();

            this.file = new ImcFile();
            this.RaiseFilePropertyChangedEvents();
            this.Blocks.Clear();
        }
Esempio n. 6
0
        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]);
        }
Esempio n. 7
0
        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();
        }
Esempio n. 8
0
        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);
            }
        }
Esempio n. 9
0
 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;
 }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
            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;
            }
Esempio n. 12
0
        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]);
        }
Esempio n. 13
0
 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);
            }
        }