Перейти к содержимому
Zone of Games Forum
Viload

Распаковка файлов .PAC

Рекомендованные сообщения

Нужна помощь в извлечении текста из визуальной новеллы Kara no Shoujo – The Second Episode, сделана она в unity, и все скрипты запакованы в свой формат .pac, нашёл в интернете такой код

 

Spoiler
idstring "MGPK"get DUMMY longget FILES longfor i = 0 < FILES   get NAMESZ byte   getdstring NAME 0x1f   get OFFSET long   get SIZE long   get ZERO long   get ZERO long   log NAME OFFSET SIZEnext i

 

По нему распаковывается, но сами файлы повреждены. Может кто помочь?

файл, который надо распаковать: тык

Изменено пользователем Viload

Поделиться сообщением


Ссылка на сообщение

 

Viload, сами данные пожаты или закриптованы, вообщем к гадалке

Поделиться сообщением


Ссылка на сообщение

Скорее криптованы, ибо размеров несжатой инфы не указано.

Пиши название игры, может кто экзешник посмотрит.

Изменено пользователем Thief1987

Поделиться сообщением


Ссылка на сообщение
Нужна помощь в извлечении текста из визуальной новеллы, сделана она в unity, и все скрипты запакованы в свой формат .pac, нашёл в интернете такой код

 

Spoiler
idstring "MGPK"get DUMMY longget FILES longfor i = 0 < FILES   get NAMESZ byte   getdstring NAME 0x1f   get OFFSET long   get SIZE long   get ZERO long   get ZERO long   log NAME OFFSET SIZEnext i

 

По нему распаковывается, но сами файлы повреждены. Может кто помочь?

файл, который надо распаковать: тык[/post]

 

Не?

Поделиться сообщением


Ссылка на сообщение
Скорее криптованы, ибо размеров несжатой инфы не указано.

Пиши название игры, может кто экзешник посмотрит.

Добавил название, надеюсь, кто поможет.

Поделиться сообщением


Ссылка на сообщение
Spoiler

 

        if (encode)        {            GameAssetManager.KeyEncode(b);        }        if (compress)        {            return CLZF2.Decompress(b);        }        return b;

 



Spoiler

 

        public static void KeyEncode(byte[] b)        {            byte[] buffer = new byte[] { 0xa2, 0x65, 0xba, 0x1a, 0x2d, 0xc6, 0x7f, 0x93, 70, 0x15, 0x84, 0 };            for (int i = 0; i < b.Length; i++)            {                b[i] = (byte) (b[i] ^ buffer[i % AssetConfig.Key.Length]);                buffer[i % buffer.Length] = (byte) (buffer[i % buffer.Length] + 0x1b);            }        }

 



Класс для распаковки, если упаковано, тут

https://github.com/thatfool/SCAN/blob/master/CLZF2.cs

Поделиться сообщением


Ссылка на сообщение
Spoiler

 

        if (encode)        {            GameAssetManager.KeyEncode(b);        }        if (compress)        {            return CLZF2.Decompress(b);        }        return b;

 

 

Spoiler

 

        public static void KeyEncode(byte[] b)        {            byte[] buffer = new byte[] { 0xa2, 0x65, 0xba, 0x1a, 0x2d, 0xc6, 0x7f, 0x93, 70, 0x15, 0x84, 0 };            for (int i = 0; i < b.Length; i++)            {                b[i] = (byte) (b[i] ^ buffer[i % AssetConfig.Key.Length]);                buffer[i % buffer.Length] = (byte) (buffer[i % buffer.Length] + 0x1b);            }        }

 

Класс для распаковки, если упаковано, тут

https://github.com/thatfool/SCAN/blob/master/CLZF2.cs[/post]

Что-то я не понял, что с этим делать...

Поделиться сообщением


Ссылка на сообщение

Здравствуйте! Решил не дублировать тему, поскольку у меня возник схожий вопрос.

Заинтересовала музыка (BGM) из игры, но, к сожалению, файл запакован в уже упомянутый формат .pac

Подскажите, пожалуйста, каким способом можно его открыть? К сожалению, не разбираюсь в теме вскрытия игровых ресурсов, но, немного ознакомившись с форматом, подозреваю, что у каждой отдельной игры способ упаковки файлов в .pac, и, соответственно, распаковки, различается.

Интересующий файл

Поделиться сообщением


Ссылка на сообщение

Вообщем решил недавно взяться за распаковку этой игры...

Задекомпилил Assembly-CSharp.dll и нашел следующий код:

 

Spoiler

 

private string name;        private string path;        private readonly Dictionary<string, PacEntity> EntityList = new Dictionary<string, PacEntity>();        private List<string> fileList = new List<string>();        private FileStream stream;        private BinaryReader reader;        public void Create(string pack)        {            this.name = pack;            this.path = Path.Combine("GameData", pack + ".pac");            try            {                this.stream = new FileStream(this.path, FileMode.Open, FileAccess.Read, FileShare.Read);                this.reader = new BinaryReader(this.stream);                string a = new string(this.reader.ReadChars(4));                if (a != "MGPK")                {                    throw new FileLoadException("File is not a valid pac file.");                }                int num = this.reader.ReadInt32();                if (num != 1)                {                    throw new FileLoadException("Cannot read from pac archive! Incorrect archive version.");                }                int num2 = this.reader.ReadInt32();                for (int i = 0; i < num2; i++)                {                    this.stream.Seek((long)(12 + 48 * i), SeekOrigin.Begin);                    string text = this.reader.ReadString();                    this.stream.Seek((long)(12 + 48 * i + 32), SeekOrigin.Begin);                    int offset = this.reader.ReadInt32();                    int size = this.reader.ReadInt32();                    PacEntity value = new PacEntity(text.ToLower(), offset, size);                    this.EntityList.Add(text.ToLower(), value);                    this.fileList.Add(text.ToLower());                }            }            catch (Exception arg)            {                Debug.LogError(string.Format("Failed to open PacArchive {0}!\nException: {1}", this.path, arg));            }        }        public byte[] GetPacFile(string filename, bool encode, bool compress)        {            PacEntity pacEntity;            this.EntityList.TryGetValue(filename.ToLower(), out pacEntity);            if (pacEntity == null)            {                Debug.LogError("Could not find archive " + filename + " in pac file " + this.name);                return new byte[0];            }            this.stream.Seek((long)pacEntity.Offset, SeekOrigin.Begin);            byte[] array = this.reader.ReadBytes(pacEntity.Size);            if (encode)            {                GameAssetManager.KeyEncode(array);            }            if (compress)            {                return CLZF2.Decompress(array);            }            return array;        }

 

 

Долго мучаясь и пытаясь понять что тут к чему, я все же понял, эти .pac в начале содержат информацию о файлах (название файла, его оффсет и размер), и только потом сами данные.

Функция Create создает как раз список файлов (с оффсетом и размером), а дальше через функцию GetPacFile можно из архива вытащить нужный файл.

Либо вот этим кодом можно легко вытащить все до единого файла:

 

Spoiler

 

            Create("script"); //Название нужного архива без .pac            foreach (string s in fileList)            {                try                {                    File.WriteAllBytes(Path.Combine("decompressed", s), GetPacFile(s, false, false)); //Вытаскивает все файлы в папку "decompressed" (папку нужно предварительно создать)                }                catch// (Exception ex)                {                    //Debug.Write(ex.ToString());                }            }

 

 

Все, конечно, без проблем достается, но есть одна большая проблема...

Все скрипты (текст) криптуется и вдобавку сжимается CLZF2 (порт LZF на C#), картинки просто криптуются, без обжима, ну а аудио вообще и не криптуется и не сжимается.

И на первый взгляд эта проблема легко решается, но нет:

1. Разкриптованные картинки битые

2. CLZF2 не хочет разжимать скрипты (пишет что-то про BufferOverflow)

Вывод таков: нормально достать у меня получилось только аудио.

Может быть написанное выше кому нибудь поможет, так как я уже, если честно, задолбался пытаться распаковать эти грёбанные .pac'и))

P.S.: Можно попробовать поразжимать скрипты другими портами, вдруг что-нибудь да и получится.

Изменено пользователем exys

Поделиться сообщением


Ссылка на сообщение
1. Разкриптованные картинки битые

2. CLZF2 не хочет разжимать скрипты (пишет что-то про BufferOverflow)

Скорее всего, просто указан неверный ключ криптования для метода KeyEncode, рабочий можно найти там же (в Assembly-CSharp.dll):

 

Spoiler

 

    public class AssetConfig    {        public static string PubKey = "+lnoSXyNGucQdOV15esJFY7+zA1F1yXqwQgpmsyGRX7OKdp6RL5PkdzbVJMa5Ef25EGNaOCqgi/HbsuQG1Fqj/ldmHMI5bs/EA2J+2PVdkWPwuFIKVqkHsxK5bd7rS0aWtwgxxPlVUjoR8BIcBGiEqpOJKf7xRkV+0bYsQ0thsSCIXz/Nv3OFM44kJbrMPoT8mMAqmq0jJYBnTyoTPr1dsFAo8xAZYIux51qcgeS02bAZAGlwi5BHrOWXfZ766ZP6SUZZ6p/1AXoWHbiMuAHmiy0UpRrVIPq+HUm+Wa3hXc61uvdK1PwA/jANV/N450tFfNc8E4hwkGzpPELjTyHSdDHSrkgwMeGcpwpzYEGV0y0+Eb6Z2TRk11sJL36HNBnTpG/6AkMbZctoQ73llvnMg173CSxL81Ye/g2pBVYOcUljh55udnuBVXtEMqyNlWD340iZdZF+aVu90OU1dkC/zWqdhf1QbKakBiHcIFtzJMYti+n+1YRjG2N73NYlb26I9NuG6SAEl47yYdr8HO6yUzq62QT3XotTTAAQZM=";        public static readonly byte[] Key = new byte[]        {            229,            101,            186,            26,            61,            198,            127,            158,            70,            21,            137        };        public static string[] Folders = new string[]        {            "bgm",            "cg_bmp",            "chara",            "script",            "se",            "voice",            "patch"        };        public static string AssetUrl = "http://mangagamer_public.s3.amazonaws.com/kns2webdemofiles/";        public static int BundleVersion = 1;    }

 

Метод KeyEncode тоже из Assembly-CSharp.dll (в классе GameAssetManager, естественно):

 

Spoiler

 

        public static void KeyEncode(byte[] b)        {            byte[] array = (byte[])AssetConfig.Key.Clone();            for (int i = 0; i < b.Length; i++)            {                b[i] ^= array[i % AssetConfig.Key.Length];                byte[] expr_35_cp_0 = array;                int expr_35_cp_1 = i % array.Length;                expr_35_cp_0[expr_35_cp_1] += 27;            }        }

 

И CLZF2 там есть:

 

Spoiler

 

public static class CLZF2{    private static readonly uint HLOG = 14u;    private static readonly uint HSIZE = 16384u;    private static readonly uint MAX_LIT = 32u;    private static readonly uint MAX_OFF = 8192u;    private static readonly uint MAX_REF = 264u;    private static readonly long[] HashTable = new long[CLZF2.HSIZE];    public static byte[] Compress(byte[] inputBytes)    {        int num = inputBytes.Length * 2;        byte[] src = new byte[num];        int num2;        for (num2 = CLZF2.lzf_compress(inputBytes, ref src); num2 == 0; num2 = CLZF2.lzf_compress(inputBytes, ref src))        {            num *= 2;            src = new byte[num];        }        byte[] array = new byte[num2];        Buffer.BlockCopy(src, 0, array, 0, num2);        return array;    }    public static byte[] Decompress(byte[] inputBytes)    {        int num = inputBytes.Length * 2;        byte[] src = new byte[num];        int num2;        for (num2 = CLZF2.lzf_decompress(inputBytes, ref src); num2 == 0; num2 = CLZF2.lzf_decompress(inputBytes, ref src))        {            num *= 2;            src = new byte[num];        }        byte[] array = new byte[num2];        Buffer.BlockCopy(src, 0, array, 0, num2);        return array;    }    public static int lzf_compress(byte[] input, ref byte[] output)    {        int num = input.Length;        int num2 = output.Length;        Array.Clear(CLZF2.HashTable, 0, (int)CLZF2.HSIZE);        uint num3 = 0u;        uint num4 = 0u;        uint num5 = (uint)((int)input[(int)((UIntPtr)num3)] << 8 | (int)input[(int)((UIntPtr)(num3 + 1u))]);        int num6 = 0;        while (true)        {            if ((ulong)num3 < (ulong)((long)(num - 2)))            {                num5 = (num5 << 8 | (uint)input[(int)((UIntPtr)(num3 + 2u))]);                long num7 = (long)((ulong)((num5 ^ num5 << 5) >> (int)(24u - CLZF2.HLOG - num5 * 5u) & CLZF2.HSIZE - 1u));                long num8 = CLZF2.HashTable[(int)(checked((IntPtr)num7))];                CLZF2.HashTable[(int)(checked((IntPtr)num7))] = (long)((ulong)num3);                long num9;                if ((num9 = (long)((ulong)num3 - (ulong)num8 - 1uL)) < (long)((ulong)CLZF2.MAX_OFF) && (ulong)(num3 + 4u) < (ulong)((long)num) && num8 > 0L && input[(int)(checked((IntPtr)num8))] == input[(int)((UIntPtr)num3)] && input[(int)(checked((IntPtr)(unchecked(num8 + 1L))))] == input[(int)((UIntPtr)(num3 + 1u))] && input[(int)(checked((IntPtr)(unchecked(num8 + 2L))))] == input[(int)((UIntPtr)(num3 + 2u))])                {                    uint num10 = 2u;                    uint num11 = (uint)(num - (int)num3 - (int)num10);                    num11 = ((num11 <= CLZF2.MAX_REF) ? num11 : CLZF2.MAX_REF);                    if ((ulong)num4 + (ulong)((long)num6) + 1uL + 3uL >= (ulong)((long)num2))                    {                        break;                    }                    do                    {                        num10 += 1u;                    }                    while (num10 < num11 && input[(int)(checked((IntPtr)(unchecked(num8 + (long)((ulong)num10)))))] == input[(int)((UIntPtr)(num3 + num10))]);                    if (num6 != 0)                    {                        output[(int)((UIntPtr)(num4++))] = (byte)(num6 - 1);                        num6 = -num6;                        do                        {                            output[(int)((UIntPtr)(num4++))] = input[(int)(checked((IntPtr)(unchecked((ulong)num3 + (ulong)((long)num6)))))];                        }                        while (++num6 != 0);                    }                    num10 -= 2u;                    num3 += 1u;                    if (num10 < 7u)                    {                        output[(int)((UIntPtr)(num4++))] = (byte)((num9 >> 8) + (long)((ulong)((ulong)num10 << 5)));                    }                    else                    {                        output[(int)((UIntPtr)(num4++))] = (byte)((num9 >> 8) + 224L);                        output[(int)((UIntPtr)(num4++))] = (byte)(num10 - 7u);                    }                    output[(int)((UIntPtr)(num4++))] = (byte)num9;                    num3 += num10 - 1u;                    num5 = (uint)((int)input[(int)((UIntPtr)num3)] << 8 | (int)input[(int)((UIntPtr)(num3 + 1u))]);                    num5 = (num5 << 8 | (uint)input[(int)((UIntPtr)(num3 + 2u))]);                    CLZF2.HashTable[(int)((UIntPtr)((num5 ^ num5 << 5) >> (int)(24u - CLZF2.HLOG - num5 * 5u) & CLZF2.HSIZE - 1u))] = (long)((ulong)num3);                    num3 += 1u;                    num5 = (num5 << 8 | (uint)input[(int)((UIntPtr)(num3 + 2u))]);                    CLZF2.HashTable[(int)((UIntPtr)((num5 ^ num5 << 5) >> (int)(24u - CLZF2.HLOG - num5 * 5u) & CLZF2.HSIZE - 1u))] = (long)((ulong)num3);                    num3 += 1u;                    continue;                }            }            else if ((ulong)num3 == (ulong)((long)num))            {                goto Block_13;            }            num6++;            num3 += 1u;            if ((long)num6 == (long)((ulong)CLZF2.MAX_LIT))            {                if ((ulong)(num4 + 1u + CLZF2.MAX_LIT) >= (ulong)((long)num2))                {                    return 0;                }                output[(int)((UIntPtr)(num4++))] = (byte)(CLZF2.MAX_LIT - 1u);                num6 = -num6;                do                {                    output[(int)((UIntPtr)(num4++))] = input[(int)(checked((IntPtr)(unchecked((ulong)num3 + (ulong)((long)num6)))))];                }                while (++num6 != 0);            }        }        return 0;        Block_13:        if (num6 != 0)        {            if ((ulong)num4 + (ulong)((long)num6) + 1uL >= (ulong)((long)num2))            {                return 0;            }            output[(int)((UIntPtr)(num4++))] = (byte)(num6 - 1);            num6 = -num6;            do            {                output[(int)((UIntPtr)(num4++))] = input[(int)(checked((IntPtr)(unchecked((ulong)num3 + (ulong)((long)num6)))))];            }            while (++num6 != 0);        }        return (int)num4;    }    public static int lzf_decompress(byte[] input, ref byte[] output)    {        int num = input.Length;        int num2 = output.Length;        uint num3 = 0u;        uint num4 = 0u;        while (true)        {            uint num5 = (uint)input[(int)((UIntPtr)(num3++))];            if (num5 < 32u)            {                num5 += 1u;                if ((ulong)(num4 + num5) > (ulong)((long)num2))                {                    break;                }                do                {                    output[(int)((UIntPtr)(num4++))] = input[(int)((UIntPtr)(num3++))];                }                while ((num5 -= 1u) != 0u);            }            else            {                uint num6 = num5 >> 5;                int num7 = (int)(num4 - ((num5 & 31u) << 8) - 1u);                if (num6 == 7u)                {                    num6 += (uint)input[(int)((UIntPtr)(num3++))];                }                num7 -= (int)input[(int)((UIntPtr)(num3++))];                if ((ulong)(num4 + num6 + 2u) > (ulong)((long)num2))                {                    return 0;                }                if (num7 < 0)                {                    return 0;                }                output[(int)((UIntPtr)(num4++))] = output[num7++];                output[(int)((UIntPtr)(num4++))] = output[num7++];                do                {                    output[(int)((UIntPtr)(num4++))] = output[num7++];                }                while ((num6 -= 1u) != 0u);            }            if ((ulong)num3 >= (ulong)((long)num))            {                return (int)num4;            }        }        return 0;    }}

 

Эти примеры взяты из демо-версии Kara no Shoujo – The Second Episode с официального сайта. Вполне возможно, что ключи и методы для распаковки от версии к версии меняются, поэтому нужно смотреть код этих методов и классов в своих файлах.

Изменено пользователем VD42

Поделиться сообщением


Ссылка на сообщение

Именно с Вашим кодом KeyEncode у меня все получилось... Спасибо огромное! Пока что удачно распаковал только картинки, но щас разберусь с LZF и пойду вытаскивать скрипты. Отпишусь если все получится :)

UPD: О да, боже, у меня наконец-то получилось) Благодарю за нормальный KeyEncode)) Осталось научиться обратно запаковывать, и можно начинать переводить)))

UPD2: Только что заметил, что ILSpy'ем достается тот же KeyEncode, что и у Вас... Чорт, ну а раньше-то почему не получалось? Всё же тоже самое было...

UPD3: Привел KeyEncode в более читабельный вид:

 

Spoiler

 

        public static void KeyEncode(ref byte[] b)        {            byte[] key = new byte[]            {                162,                101,                186,                26,                45,                198,                127,                147,                70,                21,                132            };            byte[] array = (byte[])key.Clone();            for (int i = 0; i < b.Length; i++)            {                int integer = i % array.Length;                b[i] ^= array[integer];                array[integer] += 27;            }        }

 

 

Начал пытаться хоть кое-как понять код :)

UPD4: Не долго думая решил прокрутить KeyEncode'ом обычный текстовый файл, и выходной файл так же раздекодить. Вывод: KeyEncode работает как на Encode, так и на Decode.

Пример:

 

Spoiler

 

            byte[] b = File.ReadAllBytes("test.txt");            KeyEncode(ref b);            File.WriteAllBytes("test_1.txt", b);            byte[] bb = File.ReadAllBytes("test_1.txt");            KeyEncode(ref b);            File.WriteAllBytes("test_2.txt", b);            //Итоги запуска кода:            //Содержимое test.txt - test            //Содержимое test_1.txt - D600C96E в хексе (не стал писать обычным текстом, т.к. понятно что файл содержит не читаемое содержимое)            //Содержимое test_2.txt - test                        Environment.Exit(0);

 

 

Осталось научиться собирать архивы :)

UPD5: Короче вот:

 

Spoiler

ed888cee04.jpg

Только вот с русским реально беда... Как это исправить я, к сожалению, не знаю. Вместо русского языка тупо красные иксы.

Позже выложу исходники распаковщика и запаковщика, надо только в порядок привести всё это дело.

UPD6: В общем после долгого перерыва (мне было тупо лень) сегодня я все же решился доделать распаковщик и дать ему хоть какой то интерфейс.

Вот что у меня получилось:

Скачать

VT

Изменено пользователем exys

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Продвигаемые темы

  • Последние сообщения

    • Фикс вылетов из-за осколков от выстрелов | Weapon Debris Crash Fix https://gamer-mods.ru/load/fallout_4/fiksy/fiks_vyletov_iz_za_oskolkov_ot_vystrelov_124_weapon_debris_crash_fix/138-1-0-11701 https://www.nexusmods.com/fallout4/mods/48078 Исправляет вылеты при включенной настройке "Осколки от выстрелов" на видеокартах Nvidia RTX/GTX путем отключения столкновения осколков с поверхностью. Протестировано на видеокарте RTX 2080SUPER. Требует Fallout 4 Script Extender (F4SE) Обновление размером в 14,4 ГБ для ПК игроков не приносит особой пользы. Напротив, патч практически сломал игру. Ожидалось, что вышедшее обновление затруднит использование модификаций, но проблемы оказались значительно масштабнее. Кроме нерабочих модов, игроки жалуются на появление сбоев и даже потерю сохранений. По словам пользователей, обновление для Fallout 4 на ПК не приносит "ощутимой пользы", игра не получила визуальных улучшений и теперь имеет дополнительные проблемы с производительностью. Заявленная поддержка широких экранов "плохо растягивает" пользовательский интерфейс, сообщают игроки. По их мнению, Bethesda не стала обновлять интерфейс, а вместо этого просто включила в игре автоматическое подстраивание под диагональ. Из-за этого интерфейс может обрезаться или выглядеть неправильно. Также игроки обратили внимание, что итерация движка Creation в Fallout 4 по-прежнему не поддерживает частоту кадров выше 60 кадров в секунду на ПК.  И "это" делала Беседка аж два года, так как анонс некст-ген патча был ещё в октябре 2022 года!
    • С одной стороны хорошо — с другой конечно она бы хорошо на смартфоне пошла бы. Я бы даже сказал идеально и всяко лучше в свободный перекур её погонять чем какой-то мобильный шлак. А для серьёзных платформ она уже простовата да и технически её на мобиле запустить элементарно .
    • ЗА МОНОЛИИИТ! О ДА! ЭТО МОЙ МОНОЛИИИТ!
    • @Tericonio 
      Каюсь, игра не лицензионная, последней версии. Лучше сделать резервное копирование.
      Установка: заменить файл app.asar с заменой в папке игры/resources/
      Яндекс диск: https://disk.yandex.ru/d/ZsODaxShVEHJeQ
      Переведены все картинки с надписями, меню, описания кланов, персонажей, статистика и прочее. Главы ещё не затронул.
      Чтобы были видны все изменения, нужно начинать игру заново Большая просьба затестить это и отписаться мне. Я не знаю как эта игра себя поведет в лицензионной версии
    • Когда-то давно, я писал, что планируется сюжет некоторых предыдущих частей в видео формате. Так что, кому ещё интересно — обрадую новостью.  Работы над историями Sign и Revelator вполне успешно идут. Кроме того, часть сюжета GG содержится в их аркадах, так что и они будут. В данный момент всё это переведено, проведена некоторая вычитка и сверка, однако редактура ещё не начата. Хотелось бы выпустить в этом году. Правда, чтобы лучше понимать сюжет, не говоря уже о сюжете последний части, ArcSystemWorks выпустили видео дайджест мангу, описывающую в кратком виде события до -Sign-. Мы её перевели и смонтировали. С ней можно будет ознакомиться в течение следующих 7 дней (по главе в день) тут:     
    • Версия 0.25 от 22.04.24 •    Продолжается перевод диалогов #3.
      •    Небольшие правки по уже переведенному тексту. СКАЧАТЬ РУСИФИКАТОР
    • А много Bethesda исправила в Fallout 4 издания Game of the Year Edition, даже самых критичных и неприятных, давно выявленных и исправленных фанатским неофициальным патчем багов, да и в  Скайриме в Special Edition и Anniversary Edition тоже мало что исправили?  Bethesda Game Studios-никогда не меняется!
    • https://store.steampowered.com/news/app/730/view/4202497395512481609
    • ага, держи карман шире. Это давно работает НЕ в пользу игроков.
      Больше пустых DLC, мусорного мерча, никому ненужных ответвлений или приквелов, а если и будет продолжение, то в нём ещё больше транзакций, пустого открытого мира с тупыми активностями.
      Ты что Лунтик, только вчера родился? LOL
  • Изменения статусов

  • Лучшие авторы


Zone of Games © 2003–2024 | Реклама на сайте.

×