Перейти к содержанию

partoftheworlD

Помогаторы
  • Публикаций

    2 175
  • Зарегистрирован

  • Посещение

  • Победитель дней

    115

partoftheworlD стал победителем дня 17 октября

partoftheworlD имел наиболее популярный контент!

Репутация

654 True Gamehacker

Информация о partoftheworlD

  • Звание
    инженер проектирующий свалки
  • День рождения 24.01.1996

Посетители профиля

9 340 просмотров профиля
  1. partoftheworlD

    Поиск уникального массива байт

    Пока никак, плюсы доступны пользователям которые давно на форуме, во избежании накруток и прочего.
  2. partoftheworlD

    Поиск уникального массива байт

    В нормальных играх никак, в играх написанных на Unity, Microsoft XNA использовать модуль Mono в CE, либо dnSpy, а после искать название интересующего класса. Хотя это ведь тоже считается изучением кода, так что никак. Ещё можно попробовать с помощью поиска неизвестных значений, но это долго и нудно, мало кто использует этот "дедовский" метод.
  3. partoftheworlD

    Поиск уникального массива байт

    Находишь ручным способом указатель Делаешь сигнатуру на статический адрес. Profit. Видео по ручному поиску указателей, есть на канале gamehacklab[Ru] или на канале кенга.
  4. В игру я не играл, поэтому начнем с того что известно, используется движок в игре Unreal Engine 3. Это на самом деле круто, у движков UE достаточно упорядоченная структура данных, что во многом облегчит исследование и модификацию игры. Покопался в папках игры и нашел файлы с субтитрами, которые привязаны к звуковому диалогу, о чем и была речь в прошлой статье. Субтитры выглядят вот так: [E08_D_LELAND_01_003 SoundNodeWave] // идентефикатор воспроизведенного звукового диалога, указывающий миссию, имя персонажа и номер диалога SpokenText="If by home, you mean prison. Mr. Westridge first spoke to you in this room, didn't he?" // Озвученный текст Subtitles[0]=(Text="If by home, you mean prison. ") // Subtitles[1]=(Text="Mr. Westridge first spoke to you in this room, didn't he?") // Субтитры bManualWordWrap=True // Возможно, пропуск диалогов по нажатию кнопки Comment="NOTES[], TRIGGER[], GLOSSARY[]" // ??? (Возможно, добавление в записи, типа логирование диалогов) bMature=False // Цензура Хех, за 10 минут мы добыли всю нужную информацию для реверса. Пока порядок действий таков: Найти название идентификатора диалога, поставить на него бряк. Найти функцию, которая читает из файла с диалогами идентификатор, чтобы получить доступ к функции, которая будет считывать диалоги, а после рисует их. А также, найти прямую связь между запуском озвучки с субтитрами. Продолжение следует...
  5. Пока выбрал эти 2 игры, сегодня/завтра будут уже наброски статьи, постараюсь описать общие принципы работы и поиска. C визуальными новелами будет по проще, если они используют Unity.или RenPy upd Katawa Shoujo написана на RenPy и весь исходный код открыт.
  6. Если есть предложения по работе форума, то стоит написать сюда Если есть желание пообщаться, то можно зайти в дискорд. А офтопить в чужой теме, на стороннюю тему плохо. Тему закрываю.
  7. Итак, это будет предисловие к основной статье, здесь мы рассмотрим структуру диалогов и как они создаются. Во вторник я освобожусь и уже займусь написанием основной статьи. Существует всего несколько типов привязки диалогов для показа игроку: К какой-либо ситуации(триггеру) К нажатию клавиш К среднему времени чтения диалога. К озвучке Чаще всего используется 4 вариант, но есть извращенцы, которые любят смешивать 1-2, 1-3. Первая привязка это привязка к триггеру, когда игрок подходит к определенному нпц с каким-либо квестовым предметом, то срабатывает триггер и запускается диалог. Вторая привязка это привязка к нажатию клавиш, т.е подойдя к нпц диалог не будет запущен, пока не будет нажата клавиша. Третья привязка по времени, обычно в таком варианте используется константа для показа диалогов, значение константы рассчитывается командой специалистов по *заумное название исследований поведения и информации тестировщиков* Четвертая привязка, субтитры привязываются к озвучке т.е если началась озвучка, то после начинаются рисоваться субтитры, а как только заканчивается воспроизведение файла с диалогом, то и субтитры пропадают. В играх на UE, Unity диалоги делаются с помощью чертежей, либо написанием кода. В других играх через скрипты. Но что объединяет эти способы? Инициализация пользовательского интерфеса. Парсинг игровых файлов, для загрузки диалогов в память. Отлично, теперь мы знаем, что нам необходимо искать, либо находить функцию рисования субтитров, через поиск текста в памяти, либо будем искать обработчик/проверку, которая будет проверять запущена ли озвучка, и когда она заканчивается. Скорее всего, используется QueryPerformanceCounter для вычисления момента когда остановится озвучка и выглядит как-то так. rax, rbx, rcx = 0 rax = QueryPerformanceCounter() rbx = GetDialogTime("dialog_+" i "+.wav") rcx = rbx + rax while(bDialogEnabled): if rax > rcx: clear_text(); Dialogs[i]++; else: draw_text(Dialogs[i]) Вдруг это предисловие сможет указать верный путь для тех, кто не хочет ждать когда за него все сделают. Если такие найдутся, то пишите о результатах в комментариях к этой теме(пока что, позже все комментарии будут перенесены в основную статью)
  8. partoftheworlD

    Серия видео уроков.

    Через жалобу админам пиши что надо сделать.
  9. http://bfy.tw/KLvX Не уже ли это так сложно? Хочешь массив, используй контейнер (std:vector), чтобы загрузить используй функцию push_back http://www.cplusplus.com/reference/vector/vector/push_back/ Полностью? Для твоей задачи достаточно знать синтаксис и уметь искать информацию в мсдн. 30 минут достаточно, работа с файлами это самые основы, которые идут после изучения синтаксиса.
  10. Я не про обычный таймер, а про QueryPerformanceCounter, в любом случае, у каждого разработчика разная реализация и разные способы работы диалогов. Где-то можно отменить очистку рисующего текст буфера, либо найти цикл воспроизведения диалогов, где-то проверку (сработал ли, диалог), а где-то текст в памяти и выводить его в отдельную консоль/на экран, что-то типа логирования диалогов, которые игра уже отработала. Или поверить в удачу и останавливать потоки во время диалогов и катсцен.😄 Если не знаешь как это работает и что надо искать, то советую посмотреть пару игр с открытым исходным кодом, где существует реализация диалогов, так можно найти что-то общее между способами(например, выделение памяти на диалог). Если кому-то будет интересно, то могу написать статью, но предлагайте игры, чтобы статья не получилась на 2 параграфа и можно было бы рассмотреть разные варианты реализации.
  11. Найти таймер обрабатывающий диалоги
  12. partoftheworlD

    Серия видео уроков.

    Для шаблона Read/Write советую использовать передачу смещений через неопределенное количество аргументов, это в разы уменьшит потраченное время в будущем. и в коде после объявления указателя класса mem не хватает delete mem.
  13. Бряк на доступ же стоит, т.е одинаковые инструкции могут проскакивать например для перевода реального значения в визуальное. Да Возможно. Если игра на юнити, то может помочь модуль Mono, включив его получишь подписанные функции.
  14. Он главный и должен умереть, если не хочешь делать мемстримные скрипты в CE, то ковыряй игровые скрипты, декомплируй их, переписывай под себя. Как пользоваться инструментами для создания модов можешь нагуглить.
×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.