コード例 #1
0
        /// <summary>
        ///
        /// </summary>
        private void LoadDemoAnimationFiles()
        {
            // attempt to automatically locate files
            var modelFile = MainForm.Instance.FilePath.Replace(".dat", "Nr.dat");

            var path        = Path.GetDirectoryName(MainForm.Instance.FilePath);
            var fighterKey  = Path.GetFileNameWithoutExtension(MainForm.Instance.FilePath).Replace("Pl", "");
            var fighterName = _node.Parent.Text.Replace("ftData", "");

            ResultFilePath = Path.Combine(path, $"GmRstM{fighterKey}.dat");
            WaitFilePath   = Path.Combine(path, $"Pl{fighterKey}DViWaitAJ.dat");
            IntroFilePath  = Path.Combine(path, $"ftDemoIntroMotionFile{fighterName}.dat");
            EndingFilePath = Path.Combine(path, $"ftDemoEndingMotionFile{fighterName}.dat");

            if (!File.Exists(modelFile))
            {
                modelFile = FileIO.OpenFile("Fighter Model (Pl**Nr.dat)|*.dat", $"Pl{fighterKey}Nr.dat");
            }

            if (string.IsNullOrEmpty(modelFile))
            {
                return;
            }

            if (!File.Exists(ResultFilePath))
            {
                ResultFilePath = FileIO.OpenFile("Fighter Result Anim (GmRstM**.dat)|*.dat", $"GmRstM{fighterKey}.dat");
            }

            if (!File.Exists(WaitFilePath))
            {
                WaitFilePath = FileIO.OpenFile("Fighter Wait Anim (Pl**DViWaitAJ.dat)|*.dat", $"Pl{fighterKey}DViWaitAJ.dat");
            }

            if (!File.Exists(IntroFilePath))
            {
                IntroFilePath = FileIO.OpenFile("Fighter Intro Anim Bank (ftDemoIntroMotionFile**.dat)|*.dat", $"ftDemoIntroMotionFile{fighterName}.dat");
            }

            if (!File.Exists(EndingFilePath))
            {
                EndingFilePath = FileIO.OpenFile("Fighter Ending Anim Bank (ftDemoEndingMotionFile**.dat)|*.dat", $"ftDemoEndingMotionFile{fighterName}.dat");
            }

            // load animation data
            AJManager = new FighterAJManager();

            ResultSymbol = AJManager.ScanAJFile(ResultFilePath);
            WaitSymbol   = AJManager.ScanAJFile(WaitFilePath);
            IntroSymbol  = AJManager.ScanAJFile(IntroFilePath);
            EndingSymbol = AJManager.ScanAJFile(EndingFilePath);

            MessageBox.Show($"Loaded:\nResultBank: {ResultFilePath}\nWaitBank: {WaitFilePath}\nIntroBank: {IntroFilePath}\nEndingBank: {EndingFilePath}");

            // load model
            LoadModel(modelFile);

            // shared rendering init
            InitRendering();
        }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ftdat"></param>
        /// <param name="ajdat"></param>
        /// <param name="editAnim"></param>
        public static void EditFighterAnimations(string ftdat, string ajdat, EditAnimation editAnim)
        {
            FighterAJManager manager = new FighterAJManager(File.ReadAllBytes(ajdat));

            foreach (var symbol in manager.GetAnimationSymbols())
            {
                if (symbol.Contains("Taro"))
                {
                    continue;
                }

                var ftFile = new HSDRawFile(manager.GetAnimationData(symbol));

                if (ftFile[symbol] != null)
                {
                    var ft = ftFile[symbol].Data as HSD_FigaTree;
                    editAnim(ft, symbol);
                    ftFile[symbol].Data = ft;

                    using (MemoryStream stream = new MemoryStream())
                    {
                        ftFile.Save(stream);
                        manager.SetAnimation(symbol, stream.ToArray());
                    }
                }
            }

            var newAJFile = manager.RebuildAJFile(manager.GetAnimationSymbols().ToArray(), true);

            HSDRawFile ftfile = new HSDRawFile(ftdat);

            if (ftfile.Roots[0].Data is SBM_FighterData data)
            {
                var sa = data.FighterActionTable.Commands;

                foreach (var action in sa)
                {
                    if (action.SymbolName != null && !string.IsNullOrEmpty(action.SymbolName.Value))
                    {
                        var sizeOffset = manager.GetOffsetSize(action.SymbolName.Value);
                        action.AnimationOffset = sizeOffset.Item1;
                        action.AnimationSize   = sizeOffset.Item2;
                    }
                }

                data.FighterActionTable.Commands = sa;

                ftfile.TrimData();
                ftfile.Save(ftdat);
                File.WriteAllBytes(ajdat, newAJFile);
            }
        }
コード例 #3
0
        /// <summary>
        ///
        /// </summary>
        private void LoadFighterAnimationFiles()
        {
            var aFile = MainForm.Instance.FilePath.Replace(".dat", "AJ.dat");
            var cFile = MainForm.Instance.FilePath.Replace(".dat", "Nr.dat");

            // try to automatically locate files
            bool openFiles = true;

            if (File.Exists(aFile) && File.Exists(cFile))
            {
                var r = MessageBox.Show($"Load {System.IO.Path.GetFileName(aFile)} and {System.IO.Path.GetFileName(cFile)}", "Open Files", MessageBoxButtons.YesNoCancel);

                if (r == DialogResult.Cancel)
                {
                    return;
                }

                if (r == DialogResult.Yes)
                {
                    openFiles = false;
                }
            }

            // find files to open
            if (openFiles)
            {
                cFile = FileIO.OpenFile("Fighter Costume (Pl**Nr.dat)|*.dat");
                if (cFile == null)
                {
                    return;
                }
                aFile = FileIO.OpenFile("Fighter Animation (Pl**AJ.dat)|*.dat");
                if (aFile == null)
                {
                    return;
                }
            }

            // load animation data
            AJFilePath = aFile;
            AJManager  = new FighterAJManager(File.ReadAllBytes(aFile));

            // load model
            LoadModel(cFile);

            // shared rendering init
            InitRendering();
        }
コード例 #4
0
        public bool DoIt(string[] args)
        {
            if (args.Length >= 3)
            {
                // parse args
                var plxxfile   = Path.GetFullPath(args[1]);
                var plxxajfile = Path.GetFullPath(args[2]);
                var plxxnrfile = Path.GetFullPath(args[3]);

                var anim_pathfile = Path.GetFullPath(args[4]);
                var symbol        = args[5];

                HSD_FigaTree anim_to_inject = null;

                // rendering files not loaded
                if (string.IsNullOrEmpty(plxxfile) || string.IsNullOrEmpty(plxxajfile) || string.IsNullOrEmpty(anim_pathfile))
                {
                    return(false);
                }


                // check if anim is maya anim
                if (Path.GetExtension(anim_pathfile).ToLower().Contains("anim"))
                {
                    // todo: joint map
                    anim_to_inject = Tools.ConvMayaAnim.ImportFromMayaAnim(anim_pathfile, null);

                    // optimize
                    var nodes = anim_to_inject.Nodes;

                    var joints    = (new HSDRawFile(plxxnrfile).Roots[0].Data as HSD_JOBJ).BreathFirstList;
                    int nodeIndex = 0;
                    foreach (var n in nodes)
                    {
                        var joint = joints[nodeIndex];

                        var tracks = n.Tracks.Select(e => new FOBJ_Player(e.ToFOBJ())).ToList();

                        AnimationKeyCompressor.OptimizeJointTracks(joint, ref tracks);

                        n.Tracks = tracks.Select(e => {
                            var tr = new HSD_Track();
                            tr.FromFOBJ(e.ToFobj());
                            return(tr);
                        }).ToList();

                        nodeIndex++;
                    }

                    anim_to_inject.Nodes = nodes;
                }
                else
                {
                    // check if anim if figatree
                    try
                    {
                        HSDRawFile f = new HSDRawFile(anim_pathfile);
                        if (f.Roots.Count < 1)
                        {
                            return(false);
                        }

                        if (f.Roots[0].Data is HSD_FigaTree ani)
                        {
                            anim_to_inject = ani;
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    catch
                    {
                        return(false);
                    }
                }

                // make sure anim isn't null
                if (anim_to_inject == null)
                {
                    return(false);
                }

                try
                {
                    var plxx = new HSDRawFile(plxxfile);

                    FighterAJManager animManager = new FighterAJManager();
                    animManager.ScanAJFile(plxxajfile);

                    var newAnim = new HSDRawFile();
                    newAnim.Roots.Add(new HSDRootNode()
                    {
                        Name = symbol, Data = anim_to_inject
                    });

                    using (MemoryStream stream = new MemoryStream())
                    {
                        // set new animation
                        newAnim.Save(stream);
                        animManager.SetAnimation(symbol, stream.ToArray());

                        var ftdata   = plxx.Roots[0].Data as SBM_FighterData;
                        var commands = ftdata.FighterActionTable.Commands;

                        var symbols = commands.Select(e => e.SymbolName.Value).ToArray();

                        var rebuild = animManager.RebuildAJFile(symbols, true);

                        foreach (var c in commands)
                        {
                            if (c.SymbolName != null && !string.IsNullOrEmpty(c.SymbolName.Value))
                            {
                                var sizeoffset = animManager.GetOffsetSize(c.SymbolName.Value);
                                c.AnimationOffset = sizeoffset.Item1;
                                c.AnimationSize   = sizeoffset.Item2;
                            }
                        }

                        // save files
                        plxx.Save(plxxfile);
                        File.WriteAllBytes(plxxajfile, rebuild);
                    }
                } catch
                {
                    return(false);
                }

                return(true);
            }

            return(false);
        }