Exemplo n.º 1
0
        private async Task <T?> FetchBaseDataAsync <TDto, T>(
            GameVersion?version,
            Language?language       = null,
            ChampionId?championId   = null,
            CancellationToken token = default)
            where TDto : class
            where T : BaseData
        {
            ThrowIfDisposed();

            try
            {
                await _semaphore.WaitAsync(token).ConfigureAwait(false);

                var latestVersion = await InternalFetchLatestVersionAsync(token).ConfigureAwait(false);

                language ??= DefaultLanguage;
                version ??= latestVersion;

                if (version is null)
                {
                    return(null);
                }

                if (version > latestVersion)
                {
                    throw new ArgumentOutOfRangeException(
                              nameof(version),
                              "The provided version is higher than the latest Data Dragon version.");
                }

                var data = await MakeRequestAsync <TDto, T>(
                    GetEndpoint <T>(version, language.Value.GetCode(), championId.GetValueOrDefault()),
                    Factory <TDto, T> .CreateInstance, token).ConfigureAwait(false);

                if (data is null)
                {
                    return(null);
                }

                if (_options.CacheMode != CacheMode.None)
                {
                    if (_options.CacheMode == CacheMode.MostRecentOnly && latestVersion == version)
                    {
                        Cache <T> .Instance.Clear();
                    }

                    Cache <T> .Instance[version, language.Value] = data;
                }

                return(data);
            }
            finally
            {
                _semaphore.Release();
            }
        }
Exemplo n.º 2
0
        /// <summary>
        ///     Parses a string input into a <see cref="GameVersion"/>.
        /// </summary>
        /// <param name="input">
        ///     The game version, in string form.
        ///     </param>
        /// <param name="gameVersion">
        ///     A parsed game version object.
        /// </param>
        /// <returns>
        ///     <see langword="true"/> if parsing was successful, otherwise <see langword="false"/>.
        /// </returns>
        public static bool TryParse(string input, [NotNullWhen(true)] out GameVersion?gameVersion)
        {
            gameVersion = null;

            if (string.IsNullOrWhiteSpace(input))
            {
                return(false);
            }

            ReadOnlySpan <char> inputSpan =
                input.StartsWith("lolpatch_", StringComparison.Ordinal) ? input.AsSpan(9) : input;

            var major       = -1;
            var minor       = -1;
            var patch       = -1;
            var start       = 0;
            var length      = inputSpan.Length;
            var currentSpan = inputSpan;

            for (var i = 0; i <= length; i++)
            {
                var finished = i == length;

                if (finished || inputSpan[i] == '.')
                {
                    if (!int.TryParse(currentSpan.Slice(0, i - start), out var result) || result < 0)
                    {
                        return(false);
                    }

                    if (major == -1)
                    {
                        major = result;
                    }
                    else if (minor == -1)
                    {
                        minor = result;
                    }
                    else
                    {
                        patch = result;
                        break;
                    }

                    if (finished)
                    {
                        break;
                    }

                    start       = i + 1;
                    currentSpan = inputSpan.Slice(start);
                }
            }

            gameVersion = new GameVersion(major, minor, patch);
            return(true);
        }
Exemplo n.º 3
0
        public void TestVersion(uint header, int version, GameVersion?expected)
        {
            var stream = new MemoryStream(4);
            var writer = new BinaryWriter(stream);

            writer.Write(header);
            writer.Write(version);
            stream.Position = 0;

            Assert.Equal(expected, SaveKh2.GetGameVersion(stream));
        }
Exemplo n.º 4
0
        /// <summary>
        /// Fetches a new release of the provided type, optionally at the specific version.
        /// </summary>
        /// <param name="releaseType">The <see cref="ReleaseType">ReleaseType</see> to fetch.</param>
        /// <param name="releaseVersion">The optional version to fetch.</param>
        /// <returns>The release on success, null on failure. Failure can occur if no versionwas found.</returns>
        public static Release Fetch(ReleaseType releaseType, GameVersion?releaseVersion = null)
        {
            string url;

            if (releaseVersion.HasValue)
            {
                url = String.Format("{0}/api/download/{1}/version/{2}", LauncherClient.Domain, releaseType.ToString().ToLowerInvariant(), releaseVersion.Value.ToVersionString());
            }
            else
            {
                url = String.Format("{0}/api/download/{1}/version", LauncherClient.Domain, releaseType.ToString().ToLowerInvariant());
            }

            using (var client = new WebClient())
            {
                string  value = client.DownloadString(url);
                JObject json  = JObject.Parse(value);

                ReleaseType fetchedReleaseType;
                if (!Enum.TryParse((string)json["type"], true, out fetchedReleaseType) || releaseType != fetchedReleaseType)
                {
                    return(null);
                }

                GameVersion fetchedVersion;
                if (!GameVersion.TryParse((string)json["version"], out fetchedVersion) ||
                    (releaseVersion.HasValue && !releaseVersion.Value.Equals(fetchedVersion)))
                {
                    return(null);
                }

                string patchNotes = (string)json["patchNotes"];

                var release = new Release()
                {
                    mVersion    = fetchedVersion,
                    mPatchNotes = patchNotes,
                    mType       = fetchedReleaseType
                };

                foreach (var download in json["downloads"])
                {
                    ReleasePlatform platform;
                    if (Enum.TryParse((string)download["platform"], true, out platform))
                    {
                        release.mPlatformChecksums.Add(platform, (string)download["checksum"]);
                    }
                }

                return(release);
            }
        }
Exemplo n.º 5
0
        public static int Execute(List <string> args)
        {
            if (args.Count < 7)
            {
                Console.WriteLine("Usage: [360/PS3] ITEM.DAT STRING_DIC.SO T8BTSK T8BTEMST COOKDAT WRLDDAT");
                return(-1);
            }

            GameVersion?version = null;

            switch (args[0].ToUpperInvariant())
            {
            case "360":
                version = GameVersion.X360_EU;
                break;

            case "PS3":
                version = GameVersion.PS3;
                break;
            }

            if (version == null)
            {
                Console.WriteLine("First parameter must indicate game version!");
                return(-1);
            }

            HyoutaTools.Tales.Vesperia.ItemDat.ItemDat items = new HyoutaTools.Tales.Vesperia.ItemDat.ItemDat(args[1], Util.Endianness.BigEndian);

            TSSFile TSS;

            try {
                TSS = new TSSFile(args[2], Util.GameTextEncoding.ShiftJIS, Util.Endianness.BigEndian);
            } catch (System.IO.FileNotFoundException) {
                Console.WriteLine("Could not open STRING_DIC.SO, exiting.");
                return(-1);
            }

            HyoutaTools.Tales.Vesperia.T8BTSK.T8BTSK     skills    = new HyoutaTools.Tales.Vesperia.T8BTSK.T8BTSK(args[3], Util.Endianness.BigEndian, Util.Bitness.B32);
            HyoutaTools.Tales.Vesperia.T8BTEMST.T8BTEMST enemies   = new HyoutaTools.Tales.Vesperia.T8BTEMST.T8BTEMST(args[4], Util.Endianness.BigEndian, Util.Bitness.B32);
            HyoutaTools.Tales.Vesperia.COOKDAT.COOKDAT   cookdat   = new HyoutaTools.Tales.Vesperia.COOKDAT.COOKDAT(args[5], Util.Endianness.BigEndian);
            HyoutaTools.Tales.Vesperia.WRLDDAT.WRLDDAT   locations = new HyoutaTools.Tales.Vesperia.WRLDDAT.WRLDDAT(args[6], Util.Endianness.BigEndian);

            Console.WriteLine("Initializing GUI...");
            ItemForm itemForm = new ItemForm(version.Value, items, TSS, skills, enemies, cookdat, locations);

            itemForm.Show();
            return(0);
        }
Exemplo n.º 6
0
 public DataDragonClient(DataDragonClientOptions options)
 {
     _options = options ?? throw new ArgumentNullException(nameof(options));
     _client  = new HttpClient
     {
         BaseAddress = new Uri(DataDragonUrl)
     };
     _jsonSerializerOptions = new JsonSerializerOptions
     {
         PropertyNameCaseInsensitive = true
     };
     _lock          = new object();
     _semaphore     = new SemaphoreSlim(1, 1);
     _latestVersion = null;
 }
        internal void SetGameVersion(GameVersion?version)
        {
            string versionText = "";

            switch (version)
            {
            case GameVersion.DOSBox:
                versionText = "DOSBox";
                break;

            case GameVersion.ATI:
                versionText = "TombATI";
                break;
            }
            GameVersionLabel.Text = string.IsNullOrEmpty(versionText) ? "Game Version: Unknown/Undetected" : "Game Version: " + versionText;
        }
Exemplo n.º 8
0
        void Refresh()
        {
            string gameVersionPath = GetLauncherPath("manifest.ini");

            if (File.Exists(gameVersionPath))
            {
                FileIniDataParser parser = new FileIniDataParser();
                var manifest             = parser.ReadFile(gameVersionPath);
                var versionString        = manifest.GetKey("version");

                GameVersion version;
                if (GameVersion.TryParse(versionString, out version))
                {
                    mGameVersion = version;
                }
            }
        }
Exemplo n.º 9
0
        internal void SetGameVersion(GameVersion?version)
        {
            string versionText;

            switch (version)
            {
            case GameVersion.Int:
                versionText = "International [INT]";
                break;

            case GameVersion.JpCracked:
                versionText = "Japanese [JP]";
                break;

            default:
                versionText = "Unknown/Undetected";
                break;
            }
            GameVersionLabel.Text = "Game Version: " + versionText;
        }
Exemplo n.º 10
0
        internal void SetGameVersion(GameVersion?version)
        {
            string versionText;

            switch (version)
            {
            case GameVersion.Stella:
                versionText = "Stella";
                break;

            case GameVersion.StellaCracked:
                versionText = "Stella No-CD";
                break;

            default:
                versionText = "Unknown/Undetected";
                break;
            }
            GameVersionLabel.Text = "Game Version: " + versionText;
        }
Exemplo n.º 11
0
        /// <inheritdoc/>
        public int CompareTo(GameVersion?other)
        {
            if (other is null)
            {
                return(1);
            }

            if (Major > other.Major)
            {
                return(1);
            }

            if (Major < other.Major)
            {
                return(-1);
            }

            if (Minor > other.Minor)
            {
                return(1);
            }

            if (Minor < other.Minor)
            {
                return(-1);
            }

            if (Patch > other.Patch)
            {
                return(1);
            }

            if (Patch < other.Patch)
            {
                return(-1);
            }

            return(0);
        }
Exemplo n.º 12
0
        internal void SetGameVersion(GameVersion?version)
        {
            string versionText = "";

            switch (version)
            {
            case GameVersion.MP:
                versionText = "Multipatch";
                break;

            case GameVersion.EPC:
                versionText = "Eidos Premier Collection";
                break;

            case GameVersion.P1:
                versionText = "CORE's Patch 1";
                break;

            case GameVersion.UKB:
                versionText = "Eidos UK Box";
                break;
            }
            GameVersionLabel.Text = string.IsNullOrEmpty(versionText) ? "Game Version: Unknown/Undetected" : "Game Version: " + versionText;
        }
Exemplo n.º 13
0
        void Connect()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;

            var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version;

            mLauncherVersion = new GameVersion()
            {
                Major    = assemblyVersion.Major,
                Minor    = assemblyVersion.Minor,
                Revision = assemblyVersion.Build,
                Tag      = GameVersionTag.Release
            };

            Release launcher = Release.Fetch(ReleaseType.Launcher);

            mServerLauncherVersion = launcher.Version;
            mLauncherRelease       = launcher;

            Release build = Release.Fetch(ReleaseType.Build);

            mServerGameVersion = build.Version;
            mBuildRelease      = build;
        }
Exemplo n.º 14
0
 /// <inheritdoc/>
 public bool Equals(GameVersion?other)
 => other is object &&
 Major == other.Major &&
 Minor == other.Minor &&
 Patch == other.Patch;
Exemplo n.º 15
0
        public static int Execute(List <string> args)
        {
            bool gamedirmode = args.Count == 3 || args.Count == 4;
            bool manualmode  = args.Count == 9;

            if (!gamedirmode && !manualmode)
            {
                System.Windows.Forms.MessageBox.Show(
                    "Requires arguments:\n\n" +
                    "  For automatically fetching files from game directory (point at folder containing item.svo):\n" +
                    "    Version Locale GameDirectory [STRING_DIC.SO]\n" +
                    "  STRING_DIC.SO can be overridden to select a different language file.\n" +
                    "\n" +
                    "  For manually providing files:\n" +
                    "    Version Locale ITEM.DAT STRING_DIC.SO T8BTSK T8BTEMST COOKDAT WRLDDAT ITEMSORT.DAT\n" +
                    "\n" +
                    "'Version' should be one of: 360, 360EU, PS3, PC\n" +
                    "'Locale' should be 1 for the 1st language in the given STRING_DIC, or 2 for the second"
                    );
                return(-1);
            }

            GameVersion?version = null;

            EndianUtils.Endianness     endian   = EndianUtils.Endianness.BigEndian;
            BitUtils.Bitness           bits     = BitUtils.Bitness.B32;
            TextUtils.GameTextEncoding encoding = TextUtils.GameTextEncoding.ShiftJIS;
            switch (args[0].ToUpperInvariant())
            {
            case "360":
                version = GameVersion.X360_US;
                break;

            case "360EU":
                version  = GameVersion.X360_EU;
                encoding = TextUtils.GameTextEncoding.UTF8;
                break;

            case "PS3":
                version = GameVersion.PS3;
                break;

            case "PC":
                version  = GameVersion.PC;
                endian   = EndianUtils.Endianness.LittleEndian;
                bits     = BitUtils.Bitness.B64;
                encoding = TextUtils.GameTextEncoding.UTF8;
                break;
            }
            int locale = 0;

            if (args[1] == "1")
            {
                locale = 1;
            }
            else if (args[1] == "2")
            {
                locale = 2;
            }

            if (version == null || locale == 0)
            {
                Console.WriteLine("First parameter must indicate game version, second parameter must indicate locale!");
                return(-1);
            }

            DuplicatableStream itemDatStream;
            DuplicatableStream itemSortStream;
            DuplicatableStream stringDicStream;
            DuplicatableStream skillsStream;
            DuplicatableStream enemiesStream;
            DuplicatableStream cookdatStream;
            DuplicatableStream locationsStream;

            if (manualmode)
            {
                itemDatStream   = new DuplicatableFileStream(args[2]).CopyToByteArrayStreamAndDispose();
                itemSortStream  = new DuplicatableFileStream(args[8]).CopyToByteArrayStreamAndDispose();
                stringDicStream = new DuplicatableFileStream(args[3]).CopyToByteArrayStreamAndDispose();
                skillsStream    = new DuplicatableFileStream(args[4]).CopyToByteArrayStreamAndDispose();
                enemiesStream   = new DuplicatableFileStream(args[5]).CopyToByteArrayStreamAndDispose();
                cookdatStream   = new DuplicatableFileStream(args[6]).CopyToByteArrayStreamAndDispose();
                locationsStream = new DuplicatableFileStream(args[7]).CopyToByteArrayStreamAndDispose();
            }
            else
            {
                bool hasCooksvo = VesperiaUtil.Is360(version.Value);

                using (var itemsvo = new FPS4(Path.Combine(args[2], "item.svo"))) {
                    itemDatStream  = itemsvo.GetChildByName("ITEM.DAT").AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                    itemSortStream = itemsvo.GetChildByName("ITEMSORT.DAT").AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                }
                using (var menusvo = new FPS4(Path.Combine(args[2], "menu.svo"))) {
                    if (!hasCooksvo)
                    {
                        cookdatStream = menusvo.GetChildByName("COOKDATA.BIN").AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                    }
                    else
                    {
                        using (var cooksvo = new FPS4(Path.Combine(args[2], "cook.svo"))) {
                            cookdatStream = cooksvo.GetChildByName("COOKDATA.BIN").AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                        }
                    }
                    locationsStream = menusvo.GetChildByName("WORLDDATA.BIN").AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                }
                if (args.Count == 3)
                {
                    if (version == GameVersion.X360_EU)
                    {
                        stringDicStream = new DuplicatableFileStream(Path.Combine(args[2], "language", "string_dic_uk.so")).CopyToByteArrayStreamAndDispose();
                    }
                    else if (version == GameVersion.PC)
                    {
                        stringDicStream = new DuplicatableFileStream(Path.Combine(args[2], "language", "string_dic_ENG.so")).CopyToByteArrayStreamAndDispose();
                    }
                    else
                    {
                        using (var stringsvo = new FPS4(Path.Combine(args[2], "string.svo"))) {
                            stringDicStream = stringsvo.GetChildByName("STRING_DIC.SO").AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                        }
                    }
                }
                else
                {
                    stringDicStream = new DuplicatableFileStream(args[3]).CopyToByteArrayStreamAndDispose();
                }
                using (var btlsvo = new FPS4(Path.Combine(args[2], "btl.svo"))) {
                    using (var btlpack = new FPS4(btlsvo.GetChildByName(version == GameVersion.X360_EU ? "BTL_PACK_UK.DAT" : "BTL_PACK.DAT").AsFile.DataStream)) {
                        using (var all = new FPS4(btlpack.GetChildByIndex(10).AsFile.DataStream)) {
                            skillsStream = all.GetChildByIndex(0).AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                        }
                        using (var all = new FPS4(btlpack.GetChildByIndex(5).AsFile.DataStream)) {
                            enemiesStream = all.GetChildByIndex(0).AsFile.DataStream.CopyToByteArrayStreamAndDispose();
                        }
                    }
                }
            }


            HyoutaTools.Tales.Vesperia.ItemDat.ItemDat items = new HyoutaTools.Tales.Vesperia.ItemDat.ItemDat(itemDatStream, itemSortStream, EndianUtils.Endianness.BigEndian);

            TSSFile TSS;

            try {
                TSS = new TSSFile(stringDicStream, encoding, endian);
            } catch (System.IO.FileNotFoundException) {
                Console.WriteLine("Could not open STRING_DIC.SO, exiting.");
                return(-1);
            }

            HyoutaTools.Tales.Vesperia.T8BTSK.T8BTSK     skills    = new HyoutaTools.Tales.Vesperia.T8BTSK.T8BTSK(skillsStream, endian, bits);
            HyoutaTools.Tales.Vesperia.T8BTEMST.T8BTEMST enemies   = new HyoutaTools.Tales.Vesperia.T8BTEMST.T8BTEMST(enemiesStream, endian, bits);
            HyoutaTools.Tales.Vesperia.COOKDAT.COOKDAT   cookdat   = new HyoutaTools.Tales.Vesperia.COOKDAT.COOKDAT(cookdatStream, endian);
            HyoutaTools.Tales.Vesperia.WRLDDAT.WRLDDAT   locations = new HyoutaTools.Tales.Vesperia.WRLDDAT.WRLDDAT(locationsStream, endian);

            Console.WriteLine("Initializing GUI...");
            ItemForm itemForm = new ItemForm(version.Value, locale - 1, items, TSS, skills, enemies, cookdat, locations);

            itemForm.Show();
            return(0);
        }
Exemplo n.º 16
0
        public static int Parse(List <string> args)
        {
            if (args.Count < 2)
            {
                Console.WriteLine("Usage: SaveDataParser savefile gamedatapath");
                Console.WriteLine("Save must be decrypted.");
                Console.WriteLine("Game data path should point to a directory or other container with the game files, which is needed to parse things like item, title, and enemy data correctly.");
                return(-1);
            }

            IContainer gameContainer = Website.GenerateWebsite.ContainerFromPath(args[1]);

            if (gameContainer == null)
            {
                Console.WriteLine("Invalid game data path given.");
                return(-1);
            }

            GameVersion?maybeVersion = Website.GenerateWebsite.GuessGameVersionFromContainer(gameContainer);

            if (!maybeVersion.HasValue)
            {
                Console.WriteLine("Failed to determine game version from given data path.");
                return(-1);
            }

            GameVersion version = maybeVersion.Value;
            IContainer  gameDir = Website.GenerateWebsite.FindGameDataDirectory(gameContainer, version);

            if (gameDir == null)
            {
                Console.WriteLine("Failed to find correct file container -- is your game dump incomplete?");
                return(-1);
            }

            GameLocale locale = VesperiaUtil.GetValidLocales(version).First();

            EndianUtils.Endianness     endian   = VesperiaUtil.GetEndian(version);
            TextUtils.GameTextEncoding encoding = VesperiaUtil.GetEncoding(version);
            BitUtils.Bitness           bits     = VesperiaUtil.GetBitness(version);

            TSS.TSSFile stringDic = new TSS.TSSFile(Website.GenerateWebsite.TryGetStringDic(gameDir, locale, version), encoding, endian);
            Dictionary <uint, TSS.TSSEntry> inGameDic = stringDic.GenerateInGameIdDictionary();

            ItemDat.ItemDat itemData = new ItemDat.ItemDat(Website.GenerateWebsite.TryGetItemDat(gameDir, locale, version), Website.GenerateWebsite.TryGetItemSortDat(gameDir, locale, version), EndianUtils.Endianness.BigEndian);
            List <ItemDat.ItemDatSingle> itemDataSorted = itemData.GetSortedByInGameSorting();

            FAMEDAT.FAMEDAT   titles  = new FAMEDAT.FAMEDAT(Website.GenerateWebsite.TryGetTitles(gameDir, locale, version), endian);
            T8BTEMST.T8BTEMST enemies = new T8BTEMST.T8BTEMST(Website.GenerateWebsite.TryGetEnemies(gameDir, locale, version), endian, bits);

            using (DuplicatableFileStream file = new DuplicatableFileStream(args[0])) {
                var savedata = new SaveData(file, endian);
                savedata.SavePoint.PrintData();
                savedata.PartyData.PrintData(endian, inGameDic, itemDataSorted, enemies);
                foreach (var characterBlock in savedata.CharacterData)
                {
                    characterBlock.PrintData(endian, version, inGameDic, titles);
                    Console.WriteLine("=====");
                }

                //savedata.ExportTo( args[0] + ".ext" );
            }

            return(0);
        }