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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

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

    • Сериалы не смотрю — тут мне комментить нечего. Но книги придется глянуть — конкретно эту серию не читал. Трилогия Mass Effect — до сих пор одна из любимых серий игр, и с тех пор ничего похожего не было, а тут такой подгон, да еще и от Owlcats. Rogue Trader прошел с кайфом, жду Lex Imperialis. Как и Dark Heresy. Можно как угодно их хейтить, но эта студия делает вещи и их ролевые проекты комплексные и интересные. 
    • Скиньте мне ссылку в личку тут на сайте.
    • Первой сезон очень понравился, второй оказался гораздо менее интересным, даже не досмотрел вроде бы.
    • Сериал хороший, да в конце его скомкали и завершили абы как, проблема закончившегося бюджета. Книг не читал, предпочитаю другой жанр. Не очень нравится, что owlcat пошли делать игры по лицензиям, знали мы одну такую студию. И хоть мне rogue trader не понравился, скорее всего из-за вселенной, уж больно она мерзкая для меня, но тем не менее все их игры качественные в плане сценария, как минимум.
    • Подскажите, а куда можно отправить ссылку на человека, который распространяет Ваши материалы через платную подписку на бусти?
    • Ну если озвучку от года до двух будут делать то так долго, ждать не стоит. Уж лучше скинуться на оплату работы хорошей нейросети и людей подчищающих за ней огрехов. Много видео с песней говновоз которые качественно исполнили нейросети голосами разных певцов. Так что удовлетворительно возможно озвучить, все ж быстрей выйдет. Для GTA озвучка нужна, а то косоглазие заработаешь следя за дорогой и пытаясь на скорости прочитать что там глав герои говорят.
    • https://steamcommunity.com/sharedfiles/filedetails/?id=1128886793 попробуй.
    • @Dusker Какая куча минусов то, мы про какую-то конкретную говорим или так вилами по воде? Можно начать с того, что в ММО давненько уже используется фазирование, чтобы у игроков ничего не взрывалось, а человек двадцать или больше в одном месте, если игра не может себе позволить, то и Киберпанк должен что-то там взрывать походу. Графика в ММО часто хуже не потому, что в принципе хорошую нельзя сделать из-за надуманных вами предлогов, а потому что она банально устаревает, так как подтягивать графику на нужный уровень — очень сложная задача, хотя и этим тоже занимаются некоторые, но я так понимаю, вы об этом не в курсе. Опять же когда мы говорим, что что-то ВСЕГДА хуже чем, это мы что с чем сравниваем? Однопользовательских игр тоже большая такая куча, ну например не все они про сюжет в принципе, но я так понимаю этих игр для вас тоже не существует? В странном мире вы живете. При это многие из этих игр максимально популярны, тут и карточные и рогалики, многие из которых вообще без сюжета или с его зачатками и еще масса других, но я так понял для вас существует только маленький процент триплэй, в которых все всегда лучше, хотя на самом деле... И да в некоторых играх сюжет такой, что однопользовательские позавидуют, тут и старая республика и ТЕС Онлайн вам машут ручкой, ну а так я согласен, что во многих для галочки, ну потому что ММО вообще не про сюжет. Но это видимо одна из причин, почему они не должны существовать. Касательно доната претензия максимально странная, я уже написал, почему обновление необходимы и почему необходима постоянная прибыль, без нее все загнется, в том числе и обновление, каждый хочет зарабатывать на своем труде и чем больше он зарабатывает, тем круче обновления. (не всегда)  Тот же WoW обновляется уже десятилетиями и он такой не один, там улучшается все, графика всех локаций, игровые механики, качество сюжета и его подачи, кинематографичности, качество сценария и квестов, в последнее время немного стагнирует, так как сама компания уже не та, но это ладно.  Но при этом далеко не везде надо донатить, чтобы играть или “выигрывать”, потому что во многих таких играх нет ни подписки, которую надо платить, ни предметов, которые можно купить за реал, которые влияют на игровой процесс, но даже если взять подписочную систему WoW или систему оплаты дополнений TESO, то всегда есть возможность официально разрешенная покупать реальную валюту за внутриигровую тем самым завершая цикл и не вкладывая ни копейки реальных денег. Но да разработчики определенно чего-то боятся все время Какие-то абстрактные разработчики. Ах да, ни в одной игре с микротранзакциями игровая валюта аля золото почти не служит для усиления персонажа, кстати в таких играх именно для этого и нельзя передавать предметы, чтобы ваше усиление носило личный характер. Например пройти сложный рейд. Если вы спросите зачем оно тогда нужно — это как с любой другой валютой, это отличный инструмент любого обмена, да можно купить проходку в тот самый рейд или человека который протащит на пвп и тогда вы получите шмот не подходящий вам по уровню навыков, но во первых на релизе рейдов-пвп почти всегда никто не достаточно мощный чтобы так делать, во вторых в отсутствии нужный навыков шмот не помогает.  Кстати, не знаю, где что рушится, но я еще не видел ни одной нормальной ММО без довольно активного аукциона, даже с предметами экипировки. Где что режут под страхом перед ботами — вообще загадка.  Дисбаланс я даже комментировать не буду. А теперь поговорим про качественные продукты не синглового характера, я возьму пару примеров, которые не являются ни ММО ни синглом, хотя один может называться ММО так как имеет некоторые локации с подобным игровым процессом. Я бы мог рассказать и про ММО, но как я уже говорил жду хорошую ММО давно, а рассказывать про старые добрые времена, как-то странно. Итак первый — Варфрейм, там постоянно улучшается не только графика и не только появляется новый контент, там постоянно добавляются сюжетные главы с полной озвучкой (не локализованной, к сожалению), своими механиками, разнообразию которых позавидует любая однопользовательская игра, интересным и все более кинематографическим сюжетом и все более хорошей графикой, полный набор которых можно пройти абсолютно бесплатно, наверняка это все добавляется чтобы выжать из людей побольше денег, а что пройти можно бесплатно, так это все их злые козни по заманиваю ни в чем не подозревающих игроков! Все эти сюжетные кампании, которых уже несколько десятков, поделены на миссии, первые из которых немного устарели во всех  планах, но чем дальше, тем лучше. Последние могут потягаться с триплэй однопользовательскими играми в похожем жанре, чего уж там. В целом она из тех игр в которые можно играть бесплатно, а заплатив ты получаешь не такое большое преимущество, да и игра в основном кооперативная, так что и наплевать. Вторая это Path of Exile — в которую, а я это лично проверил, можно играть либо вообще бесплатно без вкладок сундука, менеджмент хранения предметов будет напрягать, но тем не менее, а можно заплатив минимум за вкладку валюты и премиум (по моему около 250р, столько игры не стоят) и вообще не чувствовать что в игре есть какой-то донат. И да это на данный момент лучший диаблоид из всех существующих, который постоянно обновляется. Более того, сюжет там вообще не для галочки и половина обновлений обновляет, дополняет сюжет или даже развивает, так например изменения в игровом процессе эндгейма ведут прямую сюжетную линию от самого первого варианта до текущего момента, да пройти все нельзя, это можно сравнить с миром который не стоит на месте и вас не ждет, пусть и развивается сюжет от обновления к обновлению, хотя игра вообще не про сюжет, добавляется масса диалогов, чтобы его раскрыть. И хоть обе эти игры не ММО, подход к ним ближе к ММО нежели к однопользовательским играм. И таких примеров качественных обновлений хватает, просто я не играю во все. Все эти абстрактные минусы ММО играм хоть и не полностью надуманы, но подходят всем ММО, ровно так же, как всем однопользовательским играм подходят то, что в них отличный сюжет, хорошая графика и прочий бред PS Качественная игра может быть сделана в любом жанре и на любое количество игроков, как и некачественная, все в руках разработчиков.
    • Как вариант, странно, что они смотрят не из первоисточника. Я же сравнивал не на российском канале/портале, а на оф. канале Атомика — он един для всех, скорее даже для них, т.к. зареган канал в штатах. В любом случае крайне слабо, у русской версии уже перевалило за 300К, то бишь весь мир против одних наших, даже двукратно не на смотрели  . Да и я не искал на других каналах российскую версию, может где найдётся с большими просмотрами.   Больше всего у Резика, он с большим отрывом от всех.   Да на любой площадке в топе Резик, Престолы, Кодзима, Атомик, Ил и может ещё кто проскочит.
    • А почему нет? Выглядело даже покруче, хотя бы потому, что там игровой процесс был показан, и смотрелось очень даже здорово, в отличие от резика, где показали хрен пойми что, и даже непонятно, что игра будет из себя представлять. Если бы в резике ещё и не показали дату выхода, то это был бы вообще анонс со знаком минус. А если ты про сравнение серии RE и показанного в ILL, то это уже дело вкуса как говорится. А если например сравнивать ILL c трейлером AH2, то я определённо выбираю первое.
  • Изменения статусов

    • Дмитрий Соснов  »  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 | Реклама на сайте.

×