Перейти к содержимому
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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сейчас популярно

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

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

    • Я чего то против очков здоровья у персонажей, инвентаря и подобного говорил? Разговор про сюжет — какие нах игровые условности в сюжете? Показываю нелогичность, ты про какой то реализм. В Фаллаутах больше бреда, но это он в лор и повествование укладывается. > Про “крутизны” сюжета — вау, круто, какие тут логические цепочки и правильные посылы. Уж послали, так послали...  
    • Вот не надо, ты совсем недавно говорил что Моноко больше всех любишь.) Попытка хорошая, но можешь не утруждаться вторую 5090 я тебе все равно не куплю  
    • Ты не знаешь, что такое игровые условности? Ты живёшь в стране, на которую наложено миллион санкции, ушли куча брендов, но заходя в магазин, ты видишь, что всё на месте и не задаёшься вопросом — “откуда всё это?!”. Но к фантазийной игре где куча условностей, ты пытаешься навязать вещи реальности. Пытаешься найти реализм, там где его быть не должно. Но самое главное твоя претензия убивается простым аргументом — это вымышленный мир, он даже в игре не реальный. Офигеть, да?!  Как же у тебя в голове насрато. Я понимаю, что люди за последние 5-6 лет, начали многое возводить в абсолют уровня какого-то бреда. Когда где-то чего-то мерещиться и надо до этого дое**ться. Это конечно не без причины происходит, мир реально всяким говном засрал в мозги людей, что вот теперь такая херня происходит. Лет 10-15 назад бы, никто на подобное не высказался и претензии не имел. Но нынешний мир диктует такие правила, когда есть два радикальных лагера, одни не видят ничего плохого в повестке, а другие видят везде повестку.  Знаешь, а в нашем мире все мужики как мужики? Всегда сильнее и физически и характером девушек? То есть, в наше время нет, да и не только в наше, и раньше типа не было слюнявых мужиков? Которые распускали сопли? При этом не было твёрдых характером женщин, которые ставили их на место? Словесно. В твоей насратой фантазии, мужик всегда доминатор? Он всегда сильнее и мудрее, а женщины всегда хрупкие и слабые? В жизни не всё так однозначно, часто женщины характером сильнее мужиков. Мужской пол не гарантирует, что у тебя будет сила и мощный характер. Это относится ко всем временам. Есть в мире как сильные мужики и слабые женщины, как и слабые мужики, но сильные женщины. Нравится тебе или нет?! Но это так. И уверен в какой-нибудь из реальной ситуации, критической важной, ты можешь вполне себе потеряться, хотя из себя строишь крутого, а женщина нет. Я не говорю о том, что женщины все сильные, но ситуации бывают разные и люди тоже. Но по твоей логике, женщина это всегда слабое звено, значит как в игре подобная ситуация быть не должна, именно мужик быть всегда сильным, а женщина слабым.  И твоя претензия, что тебе выбор не дают, это такая чушь. Во многих сюжетных играх нет выбора, так как это задумано сюжетом, игра даже не является классической РПГ, это скорее помесь JRPG с элементами соуслайка. В JRPG тоже часто выбора нет, тебя это ведь тоже не волнует? Тем более Густав персонаж был временным и потом он себя проявил вполне смело, от чего поплатится. То есть, вся проблема в игре, что ты просто решил дое**ться до одной ситуации, из-за того, что у тебя в голове насрато и у тебя иное мировоззрение на реальный мир, хотя он не является таким каким ты себе в голове представляешь. Не стал разбираться в механике игры, и в целом сделал выводы об игре по одному сюжетному моменту, это говорит о многом. Если твой мани мирок именно так строится, пожалуйста, это имеет право на существование. Но игра не об этом, как мужики страдают, и как женщины тащят. У игры совсем другой посыл, более взрослый и более правильный, чем твоя фантазия на пропаганду сильных и не зависимых. 
    • Меган Фокс это тёлка из Трансформеров, и в первой части она смотрелась очень даже неплохо. О том и речь, что симпатия к человеку не зависит от красоты, и не зависит от того, противоположенного ли пола человек или нет.
    • “русофобии не существует” — так и есть, умный значит, а дурачка вы утром в зеркале увидели
    • Ес-но, Мирослава тут все знают, а кто такая Фокс я не в курсе.
    • @ZackFair В следующий раз предупреждай, что собираешься покупать, а то мало ли опять не успеют сделать
    • Вот тут не так давно, Мирослав как-то выкладывал свою фотку. Так я тебе скажу, что он в  раз 10 симпатичнее, чем какая-нибудь Меган Фокс ))
    • На этой фразе я завис, нужна перезагрузка, пойду посплю.
  • Изменения статусов

    • Jimmi Hopkins  »  SerGEAnt

      Это не просто перевод, а полноценная авторская сценарная адаптация. Диалоги переписаны так, чтобы персонажи звучали живо, остро и в характере. Добавлен чёрный юмор там, где авторы постеснялись. Убраны лорные противоречия, докручены мотивации. В результате игра стала умнее, злее и смешнее оригинала.
      · 0 ответов
    • ElikaStudio

      Долгожданный релиз полного сезона состоялся!
      https://youtu.be/mwBk2stm2OQ?si=qpJojB_XDABaC0We
      https://vk.com/video-48153754_456239394?sh=4&list=c62797c2b7d0725d6e
      Life is Strange: Before the Storm:
      Эпизод 1: "Прoбуждeниe"
      Эпизод 2: "О дивный новый мир"
      Эпизод 3: "Ад пуст"
      Бонусный эпизод: "Прощание"
      Русская озвучка уже доступна для скачивания!
      ElikaStudio выражает огромную благодарность всем, кто принял участие в создании проекта! 
      Группе Mechanics VoiceOver R.G. MVO , в частности их руководителю Дмитрию за неоценимую помощь в выпуске эпизода.
      Скачать для PC Classic (2018):
      GDrive: - https://drive.google.com/file/d/19CL_L80Mz0sIxcb54Ss64byAkeZmV22r/view?usp=sharing
      Скачать для PC Remastered (2022):
      GDrive: - https://drive.google.com/file/d/13q58Lpvw5_aYPYeZ7OGYZlAKOoS1gEbL/view?usp=sharing
      Скачать для Свитч(2022):
      GDrive: - https://drive.google.com/file/d/15e—T1LQiGQCYIHeNnj_C2qJA16Gvh1i/view?usp=sharing
      Ручная установка PC(оба издания):
      https://drive.google.com/drive/folders/1MJPd8965m4XxxAuOBt8enSHtv8_yy5xh?usp=sharing
      Баг репорт в обсуждении:
      https://vk.com/topic-48153754_55571577
      ___________________________________________
      Финансовый аппарат:
      www.donationalerts.com/r/elikastudio
      Пожертвовать средства на наши проекты:
      Кошелек ЮMoney 4100 1188 6818 3009
      карта Сбер банк 2202 2018 6334 1042
      карта Альфа банк 5559 4937 0209 8584
      Спасибо за вашу поддержку!
      #elikastudio #русскаяозвучка
      · 0 ответов
    • fox222  »  Siberian GRemlin

      Здравствуйте, хочу купить персональный доступ к переводам, сколько стоит?
      · 1 ответ
    • vitkach  »  eaZy

      Извините за беспокойство. Хотел спросить, а русификатор ещё когда-нибудь будет обновляться? Дело в том, что после его выхода выходили ещё обновления, в частности обновление 1.1, вышедшее летом 2023 года, где была добавлена целая сюжетная глава в конце если проходишь на лучшую концовку золотого пути, это где-то ещё полчаса диалогов. Также в игре присутсвуют иногда кракозябры вместо русского языка, это в основном связано с тем, что кое-где текст был изменён, в основном в обучающих сообщениях.
      · 0 ответов
    • TerryBogard  »  Siberian GRemlin

      C&C: RA: Retaliation (ПК) не работает.
      · 0 ответов
  • Лучшие авторы


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

×