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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

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

    • Да, он самый ) Нет, “повестка” ничему не учит, она продвигает и навязывает, что быть к примеру пидором это норма. Но это не норма, это отклонение, и человечество таким путём вообще вымрет.  А сколько развлекательного контента испоганили этой самой повесточкой…  Только неадекватный человек может считать, что “повестка” это хорошо.
    • Спасибо за перевод! Вот бы ещё четверку...
    • Если кто может создать гайд на Ютубе, я просто чайник полный 
    • Нет, это как раз правильное правило чтобы  не разводили ненависти и негатива из-за личной неприязни. Повестка вобще хороша она учит людей  уважению к другим в независимости от цвета кожи или ориентации человека. Личность блогера вобще неважна в  контексте доступа к русификатору.
    • нет, только тех людей, которые тебе симпатичны, поэтому ты тут так пытаешься вылизать его… репутацию. Райкер Хакери, это личина этого блогера, которую он скрывал от других, т.е. человек выдавал себя за другого, лгал и скрывал это, а когда всплыло включил режим дурачка, так и не признав свой проступок.
      По твоей ущербной “логике”, мавроди, кашпировский и остальные из этого списка “любые люди”, о которых все негативные мнения это “просто субъективная негативная интерпретация деятельности человека”. Видать это же касается мошенников, которые звонят людям под видом “службы безопасности банков”, ну а что, не твою же бабушку развели на деньги. Да и звонят с/на Украины, т.е. нормальные ребята. 

      Вот тут есть правило про разжигание розни, типа комментируйте мнение, а не “форумную личность”, написавшего комментарий. Не только тут. Так вот, это худшее что можно было придумать, ничем не лучше повесточки, ибо личность человека, пусть и сформированную на основе его комментариев за долгий промежуток времени, лишь подчеркивает, что ждать от неё. И вот вам наглядный пример. Пользователь даже готов в один список поставить блогера-релоканта и гитлера, лишь бы доказать, что блогер то ни так и плох. Низко, тупо и… ожидаемо. Ах, да, ну он же просто отвечал… отвечал и сравнил, в пользу блогера. Удивительно (нет), но на фоне такого любой будет казаться “любым человеком”. 
    • Тот самый человек с двумя отцами, один Константин, другой Григорий.
    • После “р” добавь мягкий знак и получится русское отчество  Сергей Константинович — Григорьевич ))
    • Напрмиер  сказано было, что он позитивен к Григоревичу как будто это что плохое ну и что он смеет критиковать хбт канал опять же  или что он уехал за границу вобщем куча необъективной критики. То есть берется обычная деятельность человека и ей пытаются придать негативный окрас искажая действительность.
    • а с чего ты решил, что субъективная, а не фактическая ? ты можешь опровергнуть указанные ранее данные? если не можешь — то получается субъективное тут твое (возможно и автора тоже) , но твое в первую очередь, т.к. ты на пустом месте стал строить догадки исключительно так, как хочется тебе — исключительно на субъективных хотелках. — p.s. про Гитлера в последнее время приходится много и часто вспоминать, чтобы некоторые ползающие мимо мрази вдруг случайно не забыли кто это и какие грехи на нем висят. 
    • Сомнительно. Один случай — исключение из правила. Если вдруг все начнут ждать своего прынца, тогда переводов вообще невидно будет. Разве что только вариант ждать когда указанная сумма накопится. Но проблема в том, что со временем об этом переводе могут просто забыть.
  • Изменения статусов

    • Дмитрий Соснов  »  Tirniel

      Привет! ты разбираешься в компьютерном железе, сможешь помочь с советом по апгрейду старого компа?
      · 1 ответ
    • SHAMAH

      Куда вход на сайт убрали и ЗАЧЕМ? Хотел файл скачать, там только медленная загрузка и “зарегистрируйтесь”. Все. Пришлось вручную страницу входа прописывать.
      · 0 ответов
    • Nosferatu  »  behar

      Добрый вечер.
      Подскажите пожалуйста, у вас не осталось случайно исходников для фикса на широкоформатные мониторы для игры Vampire The Masquerade Redemption?
      Если да, то не могли бы вы ими поделиться, а если нет, то прошу прощенья что побеспокоил.
      Заранее спасибо.
      · 0 ответов
    • AlcoKolyic  »  makc_ar

      Здраствуйте! Извините, а можно попросить ссылку на место где можно взять перевод (патч или образ игры с переводом) El Shaddai: Ascension of the Metatron для ps3, пожалуйста? А то в теме к этой игре у меня не получилось найти работающие ссылки… Первая ведет в группу в которой удалены большинство постов, а пост с этой игрой ведет на сайт https://psnext.ru который сейчас не имеет отношения к видеоиграм. 
      · 0 ответов
    • oleg72  »  Boor

      https://www.skidrowcodex.net/fate-reawakened-goldberg/
      · 0 ответов
  • Лучшие авторы


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

×