Приветик! Наверняка многие играли в замечательную игру от компании Nival Interactive — Проклятые Земли.
Кто-то её помнит по сложным на первый взгляд противникам, кто-то по шикарному и удивительному сюжету, кто-то за удивительные фишки (крафт, стелс, возможность красть вражеские вещи из карманов и брать себе напарников) а кто-то полюбил её так как я и гоняет орков и кабанчиков по всему аллоду и по сей день.
Что касается уникальных фишек — в ПЗ их действительно очень много! Чего только стоит возможность собирать разные типы оружия из разного материала, да ещё и вставлять в него заклинания! Кстати, с бронёй можно сделать точно так же.
Следующая же фишка — вообще удивительный элемент геймдизайна как для 2000 года!
Зак сидит за пеньком прямо перед носом у орков, которые его не видят. Но если встать…
То орчиха начинает видеть Зака, ведь теперь он уже выше пенька! Но это далеко не всё то, за что можно выразить огромный респект геймдизайнерам и программистам того времени. Каждый, кто хотя бы на 30 минут запускал ПЗ, наверняка прекрасно помнит тот романтичный момент, когда Заку предоставляется возможность обокрасть первого же встреченного им здоровенного людоеда.
В игре есть 4 способа перемещения: бег, ходьба, на кортанах и лёжа. Последние 2 в оригинальном балансе игры являются абсолютно бесшумными способами передвижения, бег же наоборот своим звуком с большого расстояния собирает подозрительных противников. Потому людоеда я решила обокрасть именно на кортанах чтобы он меня не услышал.
Во время бега запас сил расходуется, а восстанавливается он только если пассивно находиться на одном месте. Атакующие, колдующие и двигающиеся персонажи не могут восстанавливать свой запас сил.
В игре также есть боевая магия. Использование атакующих заклинаний, как и всех других, серьёзно тратит запас сил персонажа. Только посмотрите как красиво Зак кастует молнию в этого лесоруба! Это стоит ему почти всего запаса сил не смотря на неадекватную прокачку.
Я люблю динамику в играх, но это не самое важное. Самое важное, что довольно глупо смотрится то, как маг стоит на месте и поливает магией своих противников, будто он воин, который надел броню и терпит, а вовсе не маг. Во многих современных играх можно атаковать в движении, что даёт возможность магам держаться от противника на дисстанции и не получать в лицо от, допустим, толстого тролля с кучей хп и кучей урона.
В ПЗ же даже анимация такого действа не предусмотрена, потому геймплей магом крайне некрасив. Как, кстати, и стрелком, которому хоть запас сил для стрельбы и не нужен, но убегать от противника он может лишь несколько секунд, а потом сразу выдохнется… Что можно с этим сделать?
Нам понадобятся: Cheat Engine, IDA, HxD ну и сама игра Проклятые Земли.
Запускаем игру и Cheat Engine… Нам нужно узнать что записывает запас сил в память и что читает его у нашего героя из памяти.
Вбиваем число напротив синей шкалы и ищем его в памяти процесса game.exe. Довольно легко проверить, что запас сил персонажа — число типа float, как и большинство чисел в этой игре, касающихся харакреристик объектов, находящихся на картах.
Чтобы найти нужный адрес, достаточно побегать героем по карте чтобы его запас сил изменился и выбрать для отсеивания в Cheat Engine опцию Decreased value.
Уже с 3-й попытки я нашла запас сил в памяти. Теперь пора узнать что его записывает и что его читает. Жмём ПКМ + Find out what writes to this address.
00548323 - D9 57 14 - fst dword ptr [edi+14] 0052382D - D9 5E 14 - fstp dword ptr [esi+14] 0054834B - C7 47 14 00000000 - mov [edi+14],00000000
Получаем такие результаты. 1-е — трата запаса сил, 2-е — восстановление запаса сил, 3-е — полная трата запаса сил. Самое интересное пока — чтобы персонаж не был задохликом и бежал в зависимости от количества сил, а не жалкие 10 секунд.
Переходим чуть выше и смотрим что там по адресу EDI+14 и EDI+18. 1-е и 2-е закономерно оказываются запасом сил героя. 1-е — текущий, 2-е — максимальный.
Команда fst записывает в память из регистра FPU, команда fld же наобророт берёт из памяти и пишет в регистр FPU.
Стоит обратить внимание куда именно найденная нами команда fst dword ptr [EDI+14] пишет. Выше команда наоборот берёт оттуда значение.
Далее уже всё понятно: в регистры FPU берутся сначала текущий, потом максимальный запас сил, затем максимум умножается на константу (в оригинале она = 0.006666666666666666, а у меня она изменена на 0.1), это число отнимается от текущего запаса сил и результат кидается на его место. Мне захотелось сделать так чтобы запас сил расходовался по 0.2, а не по 0.1%. Максимальный запас сил нам не нужен, как и умножение на что-то, нам нужно отнимать само число. Используя сайт https://defuse.ca/online-x86-assembler.htm получаем, что желаемая нами команда имеет такой код:
dc 25 88 f0 73 00 fsub QWORD PTR ds:0x73f088
Вставляем его в движок игры, используя HxD, а остальное можно забить командой NOP.
Теперь надо всунуть другую константу чтобы персонаж хоть как-то терял запас сил при беге (отнимать 1/150 — уж очень мало)…
Окей, теперь персонаж бегает, теряя запаса сил не по 1/150 от его части, а по 0.2 единицы. Но это всего лишь значит, что с запасом сил более 30 наш главный персонаж будет бегать дольше, чем в оригинале, но особенной динамики само по себе это не принесёт. В битвах уж точно.
Сам факт восстановления запаса сил нас прекрасно устраивает, нам надо только изменить его условия. Ну а точнее убрать их подальше. Посмотрим, что из кусков кода читает запас сил и что от него отталкивается. Снова запускаем игру и Cheat Engine. Жмём ПКМ + Find out what accesses this address. Надо снова немного побегать и постоять, восстанавливая запас сил героя.
00548679 - D9 47 14 - fld dword ptr [edi+14] 005482D3 - D9 47 14 - fld dword ptr [edi+14] 00548315 - D9 47 14 - fld dword ptr [edi+14] 00522C82 - 8B 51 14 - mov edx,[ecx+14] 0052377A - D9 46 14 - fld dword ptr [esi+14] 00523805 - D8 46 14 - fadd dword ptr [esi+14]
Получаем вот такой контент. 1-е — включение бега, 2-е бег, 3-е — бег, 4-е — изменение запаса сил, 5-е -релакс, 6-е — восстановление запаса сил.
Естественно и очевидно что нам интересно именно 6-е и в каких случаях эта команда выполняется в коде игры. Внимательно смотрим повыше в ассемблерном листинге и находим там это начало функции. Видим чуть ниже условный переход, который не выкидывает сразу же из функции, но полностью скипает другие проверки, в том числе он скипает и восстановление запаса сил. Скорее всего это и есть проверка, находится ли персонаж на 1 месте (в релаксе) или же не находится.
Пробуем поменять, чтобы прыжка через этот кусок кода не стало…
И да! Всё получилось, теперь герой регенирирует свой запас сил даже во время каста заклинания. Ну и во время бега, конечно же, тоже.
Поменяем значение в game.exe через HxD, чтобы наслаждаться динамичной игрой…
Но это не всё. Игра за мага, ясное дело, получается в принципе из-за магии. И динамичная игра за мага определяется самими заклинаниями. В игре есть куча неиспользованной магии. Некоторые заклинания вполне рабочие и просто не продаются в магазинах, как например «мертвец» и «зрение мертвеца» (а в аддоне к Проклятым Землям — Проклятых Землях: Затерянных В Астрале так наоборот, они продаются, но не продаются «фейерверк» и «телепортация»). Но некоторые заклинания игры суровейшим образом отключены прямо в самом движке.
По адресу 0х0067F870 в памяти игры есть функция, выбирающая 1 из 43 эффектов для используемого заклинания. Наверняка этот скриншот очень многое скажет о сложности этой функции (там всего довольно много)…
Довольно долго и нудно, но при этом легко и просто я пришла к этому адресу, где жёстко и грубо выпиливаются 3 заклинания ещё на подходе по их номеру.
15h — Possession, 18h — Link, 24h — Charm. Теперь это всё надо превратить в NOP чтобы получить доступ к засекреченным заклинаниям! Ухх, как же интригующе!
Итак… Новые заклинания получены! Теперь достаточно ввести в игре в магазине в консоль, нажав на «ё», следующие команды:
thingamabob give 0 money 99999999 give 0 assortment
Теперь чтобы игра не забаговалась стоит выйти из магазина, ну и зайти обратно…
Покупаем заклинания за 200 (с розовым дымком и светлым сиянием, это Possession), за 3200 (с собачкой, это Charm) и за 400 (с пьяным мужиком идущим во тьме, это Link) и идём их тестировать!
Начнём с конца… Link делает ровно ничего, у него даже кода нет, только анимация и её завершение, очень полезное заклинание.
Charm подчиняет противника очень странным образом, заклинание явно не имеет полного кода и игра вылетает при попытке подчинить следующего противника.
Possession же — действительно находка!.. Скриншот будет лучше всяких слов.
Это заклинание позволяет перенести взгляд героя в противника. Сам эффект не очень эффективный, но очень интересный. Если бы оно было на ранних аллодах, а орлиного взора, ночного зрения и ясновидения не было на Гипате и Ингосе (ну или в ПЗ: ЗвА — на Суслангере и Гипате), это заклинание было бы прекрасным и интересным инструментом для шпионажа за патрулями и позициями противников.
Эти изменения я ввела для ПЗ ещё очень давно, а чуть потом мне удалось запихать их и добавить ещё множество новых в специальную библиотеку, которая является одним из самых масштабных дополнений для движка ПЗ, которое я назвала SpellAddon.
Используя внтутреигровые скрипты получилсь сбрасывать агрессию противников, что в оригинале было невозможным без перезахода на игровую локацию, даже телепортировавшись через всю карту, через горы и реки, противник всё равно находил главного героя и стремился его убить, пока 1 из них не окажется повержен.
Стоит заметить, что всё выше написанное актуально для версии игры 1.06 и на остальных версиях операции не проводились.
Полезные ссылки:
https://evilislandsaddon.forumotion.com — форум на котором можно найти SpellAddon.
https://vk.com/evil.islands — группа в ВК
http://gipat.ru — форум «Город джунов».
http://gipatgroup.org/forum — самый масштабный, но не особо функционирующий форум «GipatGroup». Впрочем, прочитать на нём полезную информацию сейчас возможно.
http://honestgroup.net/forum — форум HonestGroup.
Всем удачи!
ссылка на оригинал статьи https://habr.com/ru/post/685106/
Добавить комментарий