Пример #1
0
 public SE3(Stream stream, Util.Endianness endian, Util.GameTextEncoding encoding)
 {
     if (!LoadFile(stream, endian, encoding))
     {
         throw new Exception("Loading SE3 failed!");
     }
 }
Пример #2
0
        public void Write(Stream stream, Util.GameTextEncoding encoding)
        {
            stream.WriteUInt32(Ident);
            stream.WriteUInt32(Unknown2);
            stream.WriteUInt32(Unknown3);
            stream.WriteUInt32((uint)CharacterId);
            stream.WriteUInt32(Unknown5);
            stream.WriteUInt32(Unknown6);
            stream.WriteUInt32(Unknown7);
            stream.WriteUInt32(Unknown8);
            long posTextLength = stream.Position;

            stream.WriteUInt32(0);               // text length, to be filled later

            long posBefore = stream.Position;

            stream.WriteNulltermString(Text, encoding);
            long posAfter = stream.Position;

            // fill skipped text length
            uint textLength = (uint)(posAfter - posBefore);

            stream.Position = posTextLength;
            stream.WriteUInt32(textLength);
            stream.Position = posAfter;
        }
Пример #3
0
 public SE3(string filename, Util.Endianness endian, Util.GameTextEncoding encoding)
 {
     if (!LoadFile(new System.IO.FileStream(filename, FileMode.Open), endian, encoding))
     {
         throw new Exception("Loading SE3 failed!");
     }
 }
Пример #4
0
 public ebm(Stream stream, Util.GameTextEncoding encoding)
 {
     if (!LoadFile(stream, encoding))
     {
         throw new Exception("Loading ebm failed!");
     }
 }
Пример #5
0
 public TSSFile(Stream stream, Util.GameTextEncoding encoding, Util.Endianness endian)
 {
     if (!LoadFile(stream, encoding, endian))
     {
         throw new Exception("Loading TSSFile failed!");
     }
 }
Пример #6
0
 public ScenarioFile(Stream stream, Util.GameTextEncoding encoding, Util.Endianness endian, Util.Bitness bits)
 {
     if (!LoadFile(stream, encoding, endian, bits))
     {
         throw new Exception("Loading ScenarioFile failed!");
     }
 }
Пример #7
0
 public SCFOMBIN(Stream stream, Util.Endianness endian, Util.GameTextEncoding encoding, uint textPointerLocationDiff = 0x1888)
 {
     if (!LoadFile(stream, endian, encoding, textPointerLocationDiff))
     {
         throw new Exception("Loading SCFOMBIN failed!");
     }
 }
Пример #8
0
 public void WriteFile(Stream stream, Util.GameTextEncoding encoding)
 {
     stream.WriteUInt32((uint)EntryList.Count);
     foreach (ebmEntry e in EntryList)
     {
         e.Write(stream, encoding);
     }
 }
Пример #9
0
 public ScenarioFile(String filename, Util.GameTextEncoding encoding, Util.Endianness endian, Util.Bitness bits)
 {
     using (Stream stream = new System.IO.FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) {
         if (!LoadFile(stream, encoding, endian, bits))
         {
             throw new Exception("Loading ScenarioFile failed!");
         }
     }
 }
Пример #10
0
 public TSSFile(string filename, Util.GameTextEncoding encoding, Util.Endianness endian)
 {
     using (Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) {
         if (!LoadFile(stream, encoding, endian))
         {
             throw new Exception("Loading TSSFile failed!");
         }
     }
 }
Пример #11
0
 public ebm(String filename, Util.GameTextEncoding encoding)
 {
     using (Stream stream = new System.IO.FileStream(filename, FileMode.Open)) {
         if (!LoadFile(stream, encoding))
         {
             throw new Exception("Loading ebm failed!");
         }
     }
 }
Пример #12
0
 public SCFOMBIN(String filename, Util.Endianness endian, Util.GameTextEncoding encoding, uint textPointerLocationDiff = 0x1888)
 {
     using (Stream stream = new System.IO.FileStream(filename, FileMode.Open)) {
         if (!LoadFile(stream, endian, encoding, textPointerLocationDiff))
         {
             throw new Exception("Loading SCFOMBIN failed!");
         }
     }
 }
Пример #13
0
        private bool LoadFile(Stream stream, Util.GameTextEncoding encoding)
        {
            uint entryCount = stream.ReadUInt32();

            EntryList = new List <ebmEntry>((int)entryCount);
            for (uint i = 0; i < entryCount; ++i)
            {
                ebmEntry e = new ebmEntry(stream, encoding);
                EntryList.Add(e);
            }

            return(true);
        }
Пример #14
0
        public ebmEntry(Stream stream, Util.GameTextEncoding encoding)
        {
            Ident       = stream.ReadUInt32();
            Unknown2    = stream.ReadUInt32();
            Unknown3    = stream.ReadUInt32();
            CharacterId = (int)stream.ReadUInt32();
            Unknown5    = stream.ReadUInt32();
            Unknown6    = stream.ReadUInt32();
            Unknown7    = stream.ReadUInt32();
            Unknown8    = stream.ReadUInt32();
            TextLength  = stream.ReadUInt32();

            long pos = stream.Position;

            Text            = stream.ReadNulltermString(encoding);
            stream.Position = pos + TextLength;
        }
Пример #15
0
        private bool LoadFile(Stream stream, Util.GameTextEncoding encoding, Util.Endianness endian, Util.Bitness bits)
        {
            uint magic      = stream.ReadUInt32().SwapEndian();
            uint headerSize = stream.ReadUInt32().FromEndian(endian);

            stream.ReadUInt32().FromEndian(endian);
            uint textStart = stream.ReadUInt32().FromEndian(endian);

            stream.ReadUInt32().FromEndian(endian);
            stream.ReadUInt32().FromEndian(endian);
            uint textLength = stream.ReadUInt32().FromEndian(endian);

            stream.ReadUInt32().FromEndian(endian);

            EntryList = FindText(stream, textStart, encoding, endian, bits);

            return(true);
        }
Пример #16
0
        private bool LoadFile(Stream stream, Util.Endianness endian, Util.GameTextEncoding encoding)
        {
            string magic = stream.ReadAscii(4);

            if (magic != "SE3 ")
            {
                return(false);
            }

            stream.DiscardBytes(8);               // unknown
            DataBegin = stream.ReadUInt32().FromEndian(endian);
            stream.DiscardBytes(4);               // unknown
            FileCount = stream.ReadUInt32().FromEndian(endian);
            Filenames = new List <string>((int)FileCount);
            for (uint i = 0; i < FileCount; ++i)
            {
                Filenames.Add(stream.ReadSizedString(48, encoding).TrimNull());
            }

            Data = stream;

            return(true);
        }
Пример #17
0
        private void LoadFile(Stream TO8CHTX, Util.Endianness endian, Util.GameTextEncoding encoding, Util.Bitness bits, int languageCount)
        {
            Header = new ChatFileHeader();

            ulong pos = (ulong)TO8CHTX.Position;

            Header.Identify  = TO8CHTX.ReadUInt64().FromEndian(endian);
            Header.Filesize  = TO8CHTX.ReadUInt32().FromEndian(endian);
            Header.Lines     = TO8CHTX.ReadUInt32().FromEndian(endian);
            Header.Unknown   = TO8CHTX.ReadUInt32().FromEndian(endian);
            Header.TextStart = TO8CHTX.ReadUInt32().FromEndian(endian);
            Header.Empty     = TO8CHTX.ReadUInt64().FromEndian(endian);

            Lines = new ChatFileLine[Header.Lines];

            int entrySize = (int)(4 + (languageCount + 1) * bits.NumberOfBytes());

            for (int i = 0; i < Header.Lines; i++)
            {
                Lines[i]              = new ChatFileLine();
                Lines[i].Location     = 0x20 + i * entrySize;
                Lines[i].NamePointer  = TO8CHTX.ReadUInt(bits, endian);
                Lines[i].TextPointers = new ulong[languageCount];
                for (int j = 0; j < languageCount; ++j)
                {
                    Lines[i].TextPointers[j] = TO8CHTX.ReadUInt(bits, endian);
                }
                Lines[i].Unknown = TO8CHTX.ReadUInt32().FromEndian(endian);

                Lines[i].SName  = TO8CHTX.ReadNulltermStringFromLocationAndReset((long)(pos + Lines[i].NamePointer + Header.TextStart), encoding);
                Lines[i].STexts = new string[languageCount];
                for (int j = 0; j < languageCount; ++j)
                {
                    Lines[i].STexts[j] = TO8CHTX.ReadNulltermStringFromLocationAndReset((long)(pos + Lines[i].TextPointers[j] + Header.TextStart), encoding).Replace('@', ' ');
                }
            }
        }
Пример #18
0
        private static List <ScenarioFileEntry> FindText(Stream stream, uint textStart, Util.GameTextEncoding encoding, Util.Endianness endian, Util.Bitness bits)
        {
            var list = new List <ScenarioFileEntry>();

            uint toMatch = (0x040C0000 + 2 * 4 + 4 * bits.NumberOfBytes());

            while (stream.Position < textStart)
            {
                uint identifyingBytes = stream.ReadUInt32().FromEndian(endian);
                if (identifyingBytes == toMatch)
                {
                    uint pos = (uint)stream.Position;

                    uint pointerToText = stream.ReadUInt32().FromEndian(endian) + textStart;

                    stream.Position = pointerToText;
                    stream.ReadUInt32().FromEndian(endian);
                    stream.ReadUInt32().FromEndian(endian);
                    ulong jpNamePtr = stream.ReadUInt(bits, endian);
                    ulong jpTextPtr = stream.ReadUInt(bits, endian);
                    ulong enNamePtr = stream.ReadUInt(bits, endian);
                    ulong enTextPtr = stream.ReadUInt(bits, endian);
                    stream.Position = (long)(jpNamePtr + textStart); string jpName = stream.ReadNulltermString(encoding);
                    stream.Position = (long)(jpTextPtr + textStart); string jpText = stream.ReadNulltermString(encoding);
                    stream.Position = (long)(enNamePtr + textStart); string enName = stream.ReadNulltermString(encoding);
                    stream.Position = (long)(enTextPtr + textStart); string enText = stream.ReadNulltermString(encoding);

                    var entry = new ScenarioFileEntry()
                    {
                        Pointer = pos, JpName = jpName, EnName = enName, JpText = jpText, EnText = enText
                    };
                    list.Add(entry);

                    stream.Position = pos + 4;
                }
            }

            return(list);
        }
Пример #19
0
        public static int Execute(List <string> args)
        {
            if (args.Count < 2)
            {
                Console.WriteLine("Usage: game infile.ebm [outfile.txt]");
                Console.WriteLine("  game can be any of:");
                Console.WriteLine("  - [AT3] for Ar tonelico 3");
                Console.WriteLine("  - [AnS] for Ar nosurge");
                Console.WriteLine("  All names will be printed as 'Unknown' if none of those are provided.");
                return(-1);
            }

            string game    = args[0];
            string infile  = args[1];
            string outfile = args.Count >= 3 ? args[2] : args[1] + ".txt";

            bool debug   = args.Contains("--debug");
            bool oneLine = args.Contains("--oneLine");

            Util.GameTextEncoding encoding = Util.GameTextEncoding.ShiftJIS;

            Dictionary <int, string> names;

            switch (game.ToLowerInvariant())
            {
            case "at3": names = GenerateAt3Dict(); encoding = Util.GameTextEncoding.ShiftJIS; break;

            case "ans": names = GenerateAnSDict(); encoding = Util.GameTextEncoding.UTF8; break;

            default: names = new Dictionary <int, string>(); break;
            }

            var ebm = new ebm(infile, encoding);

            List <string> text = new List <string>();

            foreach (var e in ebm.EntryList)
            {
                if (debug)
                {
                    text.Add("[Id  ] " + e.Ident);
                    text.Add("[Unk2] " + e.Unknown2);
                    text.Add("[Unk3] " + e.Unknown3);
                    text.Add("[Unk5] " + e.Unknown5);
                    text.Add("[Unk6] " + e.Unknown6);
                    text.Add("[Unk7] " + e.Unknown7);
                    text.Add("[Unk8] " + e.Unknown8);
                }

                string name;
                if (names.ContainsKey(e.CharacterId))
                {
                    name = names[e.CharacterId];
                }
                else
                {
                    name = "Unknown_" + e.CharacterId;
                }

                if (oneLine)
                {
                    text.Add((name != "" ? "[" + name + "] " : "") + e.Text.Replace(" <CR>", " ").Replace("<CR>", " "));
                }
                else
                {
                    text.Add("[" + name + "]");
                    text.Add(e.Text.Replace("<CR>", "\r\n"));
                    text.Add("");
                }
            }

            System.IO.File.WriteAllLines(outfile, text.ToArray());
            return(0);
        }
Пример #20
0
 public ChatFile(string filename, Util.Endianness endian, Util.GameTextEncoding encoding, Util.Bitness bits, int languageCount)
 {
     using (Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) {
         LoadFile(stream, endian, encoding, bits, languageCount);
     }
 }
Пример #21
0
        public static Dictionary <string, SCFOMBIN.SCFOMBIN> LoadBattleText(string gameDataPath, GameLocale locale, GameVersion version, Util.Endianness endian, Util.GameTextEncoding encoding, Util.Bitness bits)
        {
            var BattleTextFiles = new Dictionary <string, SCFOMBIN.SCFOMBIN>();

            foreach (var filename in GenerateWebsite.GetBattleScenarioFileNames(gameDataPath, locale, version))
            {
                if (filename.StartsWith("BTL_"))
                {
                    var bin = LoadBattleTextFile(gameDataPath, filename, locale, version, endian, encoding, bits);
                    BattleTextFiles.Add(filename, bin);
                }
            }

            return(BattleTextFiles);
        }
Пример #22
0
 public ChatFile(Stream file, Util.Endianness endian, Util.GameTextEncoding encoding, Util.Bitness bits, int languageCount)
 {
     LoadFile(file, endian, encoding, bits, languageCount);
 }
Пример #23
0
        private bool LoadFile(Stream stream, Util.Endianness endian, Util.GameTextEncoding encoding, uint textPointerLocationDiff)
        {
            string magic      = stream.ReadAscii(8);
            uint   alwaysSame = stream.ReadUInt32().FromEndian(endian);
            uint   filesize   = stream.ReadUInt32().FromEndian(endian);

            uint lengthSection1 = stream.ReadUInt32().FromEndian(endian);

            stream.Position = 0x50;
            int textPointerDiffDiff = (int)stream.ReadUInt32().FromEndian(endian);

            stream.Position = 0x20;
            uint textStart       = stream.ReadUInt32().FromEndian(endian);
            int  textPointerDiff = (int)stream.ReadUInt32().FromEndian(endian) - textPointerDiffDiff;

            EntryList = new List <ScenarioFileEntry>();

            // i wonder what the actual logic behind this is...
            uint textPointersLocation = (lengthSection1 + 0x80).Align(0x10) + textPointerLocationDiff;

            // + 0x1888; // + 0x1B4C // diff of 2C4 // Actually this isn't constant, dammit.

            if (textStart != textPointersLocation)
            {
                stream.Position = textPointersLocation;

                while (true)
                {
                    long loc = stream.Position;
                    stream.DiscardBytes(8);
                    uint[] ptrs = new uint[4];
                    ptrs[0] = stream.ReadUInt32().FromEndian(endian);
                    ptrs[1] = stream.ReadUInt32().FromEndian(endian);
                    ptrs[2] = stream.ReadUInt32().FromEndian(endian);
                    ptrs[3] = stream.ReadUInt32().FromEndian(endian);

                    if (stream.Position > textStart)
                    {
                        break;
                    }
                    if (ptrs.Any(x => x == 0))
                    {
                        break;
                    }
                    if (ptrs.Any(x => x + textPointerDiff < textStart))
                    {
                        break;
                    }
                    if (ptrs.Any(x => x + textPointerDiff >= filesize))
                    {
                        break;
                    }

                    var s = new ScenarioFileEntry();
                    s.Pointer = (uint)loc;
                    s.JpName  = stream.ReadNulltermStringFromLocationAndReset(ptrs[0] + textPointerDiff, encoding);
                    s.JpText  = stream.ReadNulltermStringFromLocationAndReset(ptrs[1] + textPointerDiff, encoding);
                    s.EnName  = stream.ReadNulltermStringFromLocationAndReset(ptrs[2] + textPointerDiff, encoding);
                    s.EnText  = stream.ReadNulltermStringFromLocationAndReset(ptrs[3] + textPointerDiff, encoding);
                    EntryList.Add(s);

                    stream.Position = loc + 0x18;
                }
            }

            return(true);
        }
Пример #24
0
        public static WebsiteGenerator LoadWebsiteGenerator(string gameDataPath, GameVersion version, string versionPostfix, GameLocale locale, WebsiteLanguage websiteLanguage, Util.Endianness endian, Util.GameTextEncoding encoding, Util.Bitness bits)
        {
            WebsiteGenerator site = new WebsiteGenerator();

            site.Locale         = locale;
            site.Version        = version;
            site.VersionPostfix = versionPostfix;
            site.Language       = websiteLanguage;

            site.Items           = new ItemDat.ItemDat(TryGetItemDat(gameDataPath, site.Locale, site.Version), Util.Endianness.BigEndian);
            site.StringDic       = new TSS.TSSFile(TryGetStringDic(gameDataPath, site.Locale, site.Version), encoding, endian);
            site.Artes           = new T8BTMA.T8BTMA(TryGetArtes(gameDataPath, site.Locale, site.Version), endian, bits);
            site.Skills          = new T8BTSK.T8BTSK(TryGetSkills(gameDataPath, site.Locale, site.Version), endian, bits);
            site.Enemies         = new T8BTEMST.T8BTEMST(TryGetEnemies(gameDataPath, site.Locale, site.Version), endian, bits);
            site.EnemyGroups     = new T8BTEMGP.T8BTEMGP(TryGetEnemyGroups(gameDataPath, site.Locale, site.Version), endian, bits);
            site.EncounterGroups = new T8BTEMEG.T8BTEMEG(TryGetEncounterGroups(gameDataPath, site.Locale, site.Version), endian, bits);
            site.Recipes         = new COOKDAT.COOKDAT(TryGetRecipes(gameDataPath, site.Locale, site.Version), endian);
            site.Locations       = new WRLDDAT.WRLDDAT(TryGetLocations(gameDataPath, site.Locale, site.Version), endian);
            site.Synopsis        = new SYNPDAT.SYNPDAT(TryGetSynopsis(gameDataPath, site.Locale, site.Version), endian);
            site.Titles          = new FAMEDAT.FAMEDAT(TryGetTitles(gameDataPath, site.Locale, site.Version), endian);
            site.GradeShop       = new T8BTGR.T8BTGR(TryGetGradeShop(gameDataPath, site.Locale, site.Version), endian, bits);
            site.BattleBook      = new BTLBDAT.BTLBDAT(TryGetBattleBook(gameDataPath, site.Locale, site.Version), endian);
            site.Strategy        = new T8BTTA.T8BTTA(TryGetStrategy(gameDataPath, site.Locale, site.Version), endian, bits);
            if (site.Version != GameVersion.PC)                 // TODO
            {
                site.BattleVoicesEnd = new T8BTVA.T8BTVA(TryGetBattleVoicesEnd(gameDataPath, site.Locale, site.Version), endian);
            }
            if (!site.Version.Is360())                 // 360 version stores search points differently, haven't decoded that
            //var txm = new Texture.TXM( gameDataPath + "UI.svo.ext/WORLDNAVI.TXM" );
            //var txv = new Texture.TXV( txm, gameDataPath + "UI.svo.ext/WORLDNAVI.TXV" );
            //var tex = txv.textures.Where( x => x.TXM.Name == "U_WORLDNAVI00" ).First();
            //site.WorldMapImage = tex.GetBitmaps().First();
            {
                site.WorldMapImage = IntegerScaled(new Bitmap(gameDataPath + "UI.svo.ext/WORLDNAVI.TXM.ext/U_WORLDNAVI00.png"), 5, 4);
                site.SearchPoints  = new TOVSEAF.TOVSEAF(TryGetSearchPoints(gameDataPath, site.Locale, site.Version), endian);
            }
            site.Skits    = new TO8CHLI.TO8CHLI(TryGetSkitMetadata(gameDataPath, site.Locale, site.Version), endian, bits);
            site.SkitText = new Dictionary <string, TO8CHTX.ChatFile>();
            ISet <string> forceShiftJisSkits = version == GameVersion.X360_EU && (locale == GameLocale.UK || locale == GameLocale.US) ?
                                               new HashSet <string> {
                "VC051", "VC052", "VC053", "VC054", "VC055", "VC056", "VC057", "VC084", "VC719", "VC954"
            } : new HashSet <string>();

            for (int i = 0; i < site.Skits.SkitInfoList.Count; ++i)
            {
                string name   = site.Skits.SkitInfoList[i].RefString;
                Stream stream = TryGetSkitText(gameDataPath, name, site.Locale, site.Version);
                if (stream != null)
                {
                    bool             forceShiftJis = forceShiftJisSkits.Contains(name);
                    TO8CHTX.ChatFile chatFile      = new TO8CHTX.ChatFile(stream, endian, forceShiftJis ? Util.GameTextEncoding.ShiftJIS : encoding, bits, version == GameVersion.PC ? 11 : 2);
                    site.SkitText.Add(name, chatFile);
                }
                else
                {
                    Console.WriteLine("Couldn't find chat file " + name + "! (" + version + ", " + locale + ")");
                }
            }

            site.Records  = WebsiteGenerator.GenerateRecordsStringDicList(site.Version);
            site.Settings = WebsiteGenerator.GenerateSettingsStringDicList(site.Version);

            site.ScenarioFiles = new Dictionary <string, ScenarioFile.ScenarioFile>();

            switch (version)
            {
            case GameVersion.X360_US:
                site.Shops = new ShopData.ShopData(TryGetScenarioFile(gameDataPath, 0, site.Locale, site.Version), 0x1A718, 0x420 / 32, 0x8F8, 0x13780 / 56, endian, bits);
                break;

            case GameVersion.X360_EU:
                site.Shops = new ShopData.ShopData(TryGetScenarioFile(gameDataPath, 0, site.Locale, site.Version), 0x1A780, 0x420 / 32, 0x8F8, 0x13780 / 56, endian, bits);
                break;

            case GameVersion.PS3:
            case GameVersion.PC:
                site.Shops = new ShopData.ShopData(TryGetScenarioFile(gameDataPath, 0, site.Locale, site.Version), 0x1C9BC, 0x460 / 32, 0x980, 0x14CB8 / 56, endian, bits);
                break;

            default:
                throw new Exception("Don't know shop data location for version " + version);
            }

            if (version.HasPS3Content())
            {
                site.IconsWithItems = new uint[] { 35, 36, 37, 60, 38, 1, 4, 12, 6, 5, 13, 14, 15, 7, 52, 51, 53, 9, 16, 18, 2, 17, 19, 10, 54, 20, 21, 22, 23, 24, 25, 26, 27, 56, 30, 28, 32, 31, 33, 29, 34, 41, 42, 43, 44, 45, 57, 61, 63, 39, 3, 40 };
            }
            else
            {
                site.IconsWithItems = new uint[] { 35, 36, 37, 60, 38, 1, 4, 12, 6, 5, 13, 14, 15, 7, 52, 51, 9, 16, 18, 2, 17, 19, 10, 20, 21, 22, 23, 24, 25, 26, 27, 56, 30, 28, 32, 31, 33, 29, 34, 41, 42, 43, 44, 45, 57, 61, 63, 39, 3, 40 };
            }

            site.BattleTextFiles = WebsiteGenerator.LoadBattleText(gameDataPath, site.Locale, site.Version, endian, encoding, bits);

            if (version.HasPS3Content())
            {
                site.NecropolisFloors    = new T8BTXTM.T8BTXTMA(TryGetNecropolisFloors(gameDataPath, site.Locale, site.Version), endian, bits);
                site.NecropolisTreasures = new T8BTXTM.T8BTXTMT(TryGetNecropolisTreasures(gameDataPath, site.Locale, site.Version), endian, bits);
                site.NecropolisMaps      = new SortedDictionary <string, T8BTXTM.T8BTXTMM>();
                foreach (T8BTXTM.FloorInfo floor in site.NecropolisFloors.FloorList)
                {
                    if (!site.NecropolisMaps.ContainsKey(floor.RefString2))
                    {
                        site.NecropolisMaps.Add(floor.RefString2, new T8BTXTM.T8BTXTMM(TryGetNecropolisMap(gameDataPath, floor.RefString2, site.Locale, site.Version), endian));
                    }
                }
            }

            if (version == GameVersion.PS3)
            {
                site.TrophyJp = HyoutaTools.Trophy.TrophyConfNode.ReadTropSfmWithTropConf(gameDataPath + @"TROPHY.TRP.ext\TROP.SFM", gameDataPath + @"TROPHY.TRP.ext\TROPCONF.SFM");
            }

            if (version.HasPS3Content())
            {
                site.NpcList = new TOVNPC.TOVNPCL(gameDataPath + @"npc.svo.ext\NPC.DAT.dec.ext\0000.dec", endian, bits);
                site.NpcDefs = new Dictionary <string, TOVNPC.TOVNPCT>();
                foreach (var f in site.NpcList.NpcFileList)
                {
                    string filename = gameDataPath + @"npc.svo.ext\" + f.Filename + @".dec.ext\0001.dec";
                    if (File.Exists(filename))
                    {
                        var d = new TOVNPC.TOVNPCT(filename, endian, bits);
                        site.NpcDefs.Add(f.Map, d);
                    }
                }
            }

            var maplist = new MapList.MapList(TryGetMaplist(gameDataPath, site.Locale, site.Version), endian, bits);

            site.ScenarioGroupsStory      = site.CreateScenarioIndexGroups(ScenarioType.Story, maplist, gameDataPath, encoding, endian, bits);
            site.ScenarioGroupsSidequests = site.CreateScenarioIndexGroups(ScenarioType.Sidequests, maplist, gameDataPath, encoding, endian, bits);
            site.ScenarioGroupsMaps       = site.CreateScenarioIndexGroups(ScenarioType.Maps, maplist, gameDataPath, encoding, endian, bits);
            site.ScenarioAddSkits(site.ScenarioGroupsStory);

            return(site);
        }
Пример #25
0
 public static SCFOMBIN.SCFOMBIN LoadBattleTextFile(string gameDataPath, string filename, GameLocale locale, GameVersion version, Util.Endianness endian, Util.GameTextEncoding encoding, Util.Bitness bits)
 {
     if (!version.Is360())
     {
         uint ptrDiff = 0x1888;
         if (filename.StartsWith("BTL_XTM"))
         {
             ptrDiff = 0x1B4C;
         }
         var bin = new SCFOMBIN.SCFOMBIN(GenerateWebsite.TryGetBattleScenarioFile(gameDataPath, filename, locale, version), endian, encoding, ptrDiff);
         return(bin);
     }
     else
     {
         var bin = new ScenarioFile.ScenarioFile(GenerateWebsite.TryGetBattleScenarioFile(gameDataPath, filename, locale, version), encoding, endian, bits);
         var btl = new SCFOMBIN.SCFOMBIN();
         btl.EntryList = bin.EntryList;
         return(btl);
     }
 }
Пример #26
0
        private bool LoadFile(Stream File, Util.GameTextEncoding encoding, Util.Endianness endian)
        {
            long pos = File.Position;

            // set header
            Header = new TSSHeader(File, endian);

            if (Header.Magic != 0x54535300)
            {
                Console.WriteLine("File is not a TSS file!");
                return(false);
            }

            // convert all instructions into a List of uint
            File.Position = pos + 0x20;
            int         CurrentLocation = 0x20;
            UInt32      EntriesEnd      = Header.TextStart;
            List <uint> EntryUIntList   = new List <uint>();

            while (CurrentLocation < EntriesEnd)
            {
                uint Instruction = File.ReadUInt32().FromEndian(endian);
                EntryUIntList.Add(Instruction);
                CurrentLocation += 4;
            }

            // split the full instruction list into blocks seperated by 0xFFFFFFFF ( == TSSEntry )
            // and put them into the Entry list
            // complete with text it's pointing at
            CurrentLocation = 0;
            uint[]          EntryUIntArray = EntryUIntList.ToArray();
            int             ListSize       = EntryUIntArray.Length;
            List <TSSEntry> EntryList      = new List <TSSEntry>(ListSize / 10);
            int             i = 0;

            List <uint> OneEntryList = new List <uint>();

            while (CurrentLocation < ListSize)
            {
                //uint[] OneEntry = EntryUIntArray.Skip(CurrentLocation).TakeWhile(subject => subject != 0xFFFFFFFF).ToArray();
                OneEntryList.Clear();

                while (CurrentLocation < EntryUIntArray.Length && EntryUIntArray[CurrentLocation] != 0xFFFFFFFF)
                {
                    OneEntryList.Add(EntryUIntArray[CurrentLocation]);
                    CurrentLocation++;
                }

                uint[] OneEntry = OneEntryList.ToArray();

                int JPNPointer     = -1;
                int ENGPointer     = -1;
                int JPNIndex       = -1;
                int ENGIndex       = -1;
                int inGameStringId = -1;

                // get in-game string id
                for (i = 0; i < OneEntry.Length; i++)
                {
                    if (OneEntry[i] == 0x0E000007)
                    {
                        inGameStringId = (int)OneEntry[i - 2];
                        break;
                    }
                }

                // get JPN pointer
                for (i = 0; i < OneEntry.Length; i++)
                {
                    if (OneEntry[i] == 0x02820000)
                    {
                        break;
                    }
                }

                if (i == OneEntry.Length)
                {
                    JPNPointer = -1;
                    ENGPointer = -1;
                }
                else
                {
                    JPNIndex   = ++i;
                    JPNPointer = (int)(OneEntry[JPNIndex] + Header.TextStart);

                    // get English pointer
                    for ( ; i < OneEntry.Length; i++)
                    {
                        if (OneEntry[i] == 0x02820000)
                        {
                            break;
                        }
                    }

                    if (i == OneEntry.Length)
                    {
                        ENGPointer = -1;
                    }
                    else
                    {
                        ENGIndex   = i + 1;
                        ENGPointer = (int)(OneEntry[ENGIndex] + Header.TextStart);
                    }
                }

                string jpn = JPNPointer == -1 ? null : File.ReadNulltermStringFromLocationAndReset(pos + JPNPointer, encoding);
                string eng = ENGPointer == -1 ? null : File.ReadNulltermStringFromLocationAndReset(pos + ENGPointer, encoding);
                EntryList.Add(new TSSEntry(OneEntry, jpn, eng, JPNIndex, ENGIndex, inGameStringId));
                //CurrentLocation += OneEntry.Length;
                CurrentLocation++;
            }
            Entries = EntryList.ToArray();

            return(true);
        }
Пример #27
0
        public List <List <ScenarioData> > CreateScenarioIndexGroups(ScenarioType type, MapList.MapList maplist, string gameDataPath, Util.GameTextEncoding encoding, Util.Endianness endian, Util.Bitness bits)
        {
            SortedDictionary <int, ScenarioWebsiteName> websiteNames = ScenarioWebsiteName.GenerateWebsiteNames(this.Version);

            Util.Assert(maplist.MapNames.Count == websiteNames.Count);

            List <ScenarioData> scenes = new List <ScenarioData>();
            List <ScenarioFile.ScenarioFile> scenarioFiles = new List <ScenarioFile.ScenarioFile>();
            bool haveSeenEP_030_010 = false;

            foreach (var d in websiteNames)
            {
                var names = maplist.MapNames[d.Key];
                if (d.Value.Type != type)
                {
                    continue;
                }

                string episodeID = names.Name3 == "dummy" ? names.Name1 : names.Name3;

                // the game has this file twice in scenario.dat, so ignore the first instance we encounter, as presumably the game would overwrite the first instance with the second?
                if (!haveSeenEP_030_010 && episodeID == "EP_030_010")
                {
                    haveSeenEP_030_010 = true;
                    continue;
                }

                int num      = d.Key;
                var metadata = new ScenarioData()
                {
                    ScenarioDatIndex = num, EpisodeId = episodeID, HumanReadableName = d.Value.Description != null ? d.Value.Description : episodeID
                };
                System.IO.Stream stream = GenerateWebsite.TryGetScenarioFile(gameDataPath, num, Locale, Version);
                if (stream != null)
                {
                    var orig = new ScenarioFile.ScenarioFile(stream, encoding, endian, bits);
                    orig.Metadata = metadata;
                    scenarioFiles.Add(orig);
                    scenes.Add(metadata);
                }
            }

            foreach (var s in scenarioFiles.OrderBy(x => x.Metadata.EpisodeId))
            {
                this.ScenarioFiles.Add(s.Metadata.EpisodeId, s);
            }
            return(ScenarioData.ProcessScenesToGroups(scenes));
        }