Приветик! Наверняка многие играли в замечательную игру от компании Nival Interactive - Проклятые Земли.

Такое бывает...
Такое бывает...

Кто-то её помнит по сложным на первый взгляд противникам, кто-то по шикарному и удивительному сюжету, кто-то за удивительные фишки (крафт, стелс, возможность красть вражеские вещи из карманов и брать себе напарников) а кто-то полюбил её так как я и гоняет орков и кабанчиков по всему аллоду и по сей день.

Что касается уникальных фишек - в ПЗ их действительно очень много! Чего только стоит возможность собирать разные типы оружия из разного материала, да ещё и вставлять в него заклинания! Кстати, с бронёй можно сделать точно так же.

Сборка оружия в 1-м предоставляющемся главному герою магазине
Сборка оружия в 1-м предоставляющемся главному герою магазине

Следующая же фишка - вообще удивительный элемент геймдизайна как для 2000 года!

Белые облачка означают область зрения орчихи (вызваны использованием 4-го сверху заклинания "Поле зрения") - она не видит Зака через пенёк
Белые облачка означают область зрения орчихи (вызваны использованием 4-го сверху заклинания "Поле зрения") - она не видит Зака через пенёк

Зак сидит за пеньком прямо перед носом у орков, которые его не видят. Но если встать...

Стоячий Зак попадает в поле зрение орчихи и она начинает вести стрельбу...
Стоячий Зак попадает в поле зрение орчихи и она начинает вести стрельбу...

То орчиха начинает видеть Зака, ведь теперь он уже выше пенька! Но это далеко не всё то, за что можно выразить огромный респект геймдизайнерам и программистам того времени. Каждый, кто хотя бы на 30 минут запускал ПЗ, наверняка прекрасно помнит тот романтичный момент, когда Заку предоставляется возможность обокрасть первого же встреченного им здоровенного людоеда.

Кража монет у людоеда
Кража монет у людоеда

В игре есть 4 способа перемещения: бег, ходьба, на кортанах и лёжа. Последние 2 в оригинальном балансе игры являются абсолютно бесшумными способами передвижения, бег же наоборот своим звуком с большого расстояния собирает подозрительных противников. Потому людоеда я решила обокрасть именно на кортанах чтобы он меня не услышал.
Во время бега запас сил расходуется, а восстанавливается он только если пассивно находиться на одном месте. Атакующие, колдующие и двигающиеся персонажи не могут восстанавливать свой запас сил.

В игре также есть боевая магия. Использование атакующих заклинаний, как и всех других, серьёзно тратит запас сил персонажа. Только посмотрите как красиво Зак кастует молнию в этого лесоруба! Это стоит ему почти всего запаса сил не смотря на неадекватную прокачку.

Очень хорошо прокачанный персонаж
Очень хорошо прокачанный персонаж

Я люблю динамику в играх, но это не самое важное. Самое важное, что довольно глупо смотрится то, как маг стоит на месте и поливает магией своих противников, будто он воин, который надел броню и терпит, а вовсе не маг. Во многих современных играх можно атаковать в движении, что даёт возможность магам держаться от противника на дистанции и не получать в лицо от, допустим, толстого тролля с кучей хп и кучей урона.

В ПЗ же даже анимация такого действа не предусмотрена, потому геймплей магом крайне некрасив. Как, кстати, и стрелком, которому хоть запас сил для стрельбы и не нужен, но убегать от противника он может лишь несколько секунд, а потом сразу выдохнется... Что можно с этим сделать?

Нам понадобятся: Cheat Engine, IDA, HxD ну и сама игра Проклятые Земли.

Запускаем игру и Cheat Engine... Нам нужно узнать что записывает запас сил в память и что читает его у нашего героя из памяти.

Запас сил = 375
Запас сил = 375

Вбиваем число напротив синей шкалы и ищем его в памяти процесса 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.

Переписываем код игры прямо в HxD!
Переписываем код игры прямо в HxD!

Теперь надо всунуть другую константу чтобы персонаж хоть как-то терял запас сил при беге (отнимать 1/150 - уж очень мало)...

9A 99 99 99 99 99 C9 3F = 0.2f
9A 99 99 99 99 99 C9 3F = 0.2f

Окей, теперь персонаж бегает, теряя запаса сил не по 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 месте (в релаксе) или же не находится.

Начало функции
Начало функции

Пробуем поменять, чтобы прыжка через этот кусок кода не стало...

Команды NOP заменили переход
Команды NOP заменили переход

И да! Всё получилось, теперь герой регенирирует свой запас сил даже во время каста заклинания. Ну и во время бега, конечно же, тоже.

Зак скастовал заклинание и отрегенил запас сил уже 2-мя тиками
Зак скастовал заклинание и отрегенил запас сил уже 2-мя тиками

Поменяем значение в game.exe через HxD, чтобы наслаждаться динамичной игрой...

Убираем условие
Убираем условие

Но это не всё. Игра за мага, ясное дело, получается в принципе из-за магии. И динамичная игра за мага определяется самими заклинаниями. В игре есть куча неиспользованной магии. Некоторые заклинания вполне рабочие и просто не продаются в магазинах, как например "мертвец" и "зрение мертвеца" (а в аддоне к Проклятым Землям - Проклятых Землях: Затерянных В Астрале так наоборот, они продаются, но не продаются "фейерверк" и "телепортация"). Но некоторые заклинания игры суровейшим образом отключены прямо в самом движке.

По адресу 0х0067F870 в памяти игры есть функция, выбирающая 1 из 43 эффектов для используемого заклинания. Наверняка этот скриншот очень многое скажет о сложности этой функции (там всего довольно много)...

Страшная функция заклинаний в ПЗ, видная через IDA
Страшная функция заклинаний в ПЗ, видная через IDA

Довольно долго и нудно, но при этом легко и просто я пришла к этому адресу, где жёстко и грубо выпиливаются 3 заклинания ещё на подходе по их номеру.

3 условных перехода внизу - проверка для заклинаний Link, Possession и Charm
3 условных перехода внизу - проверка для заклинаний Link, Possession и Charm

15h - Possession, 18h - Link, 24h - Charm. Теперь это всё надо превратить в NOP чтобы получить доступ к засекреченным заклинаниям! Ухх, как же интригующе!

Запреты (условные переходы) превращаем в NOP
Запреты (условные переходы) превращаем в NOP

Итак... Новые заклинания получены! Теперь достаточно ввести в игре в магазине в консоль, нажав на "ё", следующие команды:

thingamabob
give 0 money 99999999
give 0 assortment

Теперь чтобы игра не забаговалась стоит выйти из магазина, ну и зайти обратно...

Покупаем заклинания за 200 (с розовым дымком и светлым сиянием, это Possession), за 3200 (с собачкой, это Charm) и за 400 (с пьяным мужиком идущим во тьме, это Link) и идём их тестировать!

Начнём с конца... Link делает ровно ничего, у него даже кода нет, только анимация и её завершение, очень полезное заклинание.

Скорее всего просто не успели написать код заклинания
Скорее всего просто не успели написать код заклинания

Charm подчиняет противника очень странным образом, заклинание явно не имеет полного кода и игра вылетает при попытке подчинить следующего противника.

Possession же - действительно находка!.. Скриншот будет лучше всяких слов.

Действие Possession
Действие 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.

Избранный явился!
Избранный явился!

Всем удачи!

Комментарии (39)


  1. vectorplus
    29.08.2022 03:21
    +23

    Рычаг я дам

    Камень я не дам


    1. PippiLongstocking
      29.08.2022 15:30
      +2

      "Эх, не получилось"


  1. northzen
    29.08.2022 05:02
    +11

    Отличный пост. В нем и ностальгия, и достаточно понятный и хорошо описанный процесс, и так же ссылки для тех, кто хочет обратно прикоснуться.
    Nival -- гении своего времени.До сих пор удивляюсь тому, насколько сильная на то время графика шла на доступных картах.
    Игре не помешал бы официальный ремастер, где подтянули бы текстуры, модельки, тени, освещение. При этом особо не трогая игровой процесс.


    1. OSerge
      29.08.2022 14:44
      +2

      Дико плюсую. Мечтаю, чтобы сделали ремастер. Услышь нас Nival!


      1. Schwert
        29.08.2022 23:11
        +1

        Поддерживаю


        1. staticmain
          29.08.2022 23:17
          +3

          Nival мертв, последние подвижки были в 2017м (5 лет назад), когда выпустили Blitzkrieg 3, после чего сайт заморозили, вакансий нет.


      1. Offensive Автор
        30.08.2022 08:16
        +1

        Я занимаюсь созданием сюжетного дополнения)). Если это интересно, можно следить за форумом)).


      1. northzen
        30.08.2022 21:36

        Буду думать, что OSerge -- это Орловский Сергей


    1. michael_v89
      30.08.2022 01:39
      +1

      А я думаю, фильм бы кто-нибудь сделал. Вот прям по сюжету, только с настоящими актерами.


    1. Cataclismo
      30.08.2022 05:28
      +2

      Помимо графики можно было бы и реиграбельности добавить, например, процедурно генерируемые леса с деревеньками орков, людоедов(на Гипате) и базами людей на других островах. Добавить после алмаза ещё кристаллы, чтобы у оружия и брони был потенциал для улучшения.

      Эх...был бы миллионером, думаю, первым делом нашёл бы армию фанатов игры и программистов по совместительству и делал бы с ними продолжение игры, не жалея денег


      1. Offensive Автор
        30.08.2022 08:23

        Можно респаунить орков и людей, у меня путём кошмарных извращений вышло даже остальных противников респаунить)). Ну и подогнать это дело скриптами можно под ситуацию. А кристаллы уже давно добавлены в разных модах, скачать их можно, например, на сайте вселенной аллодов.


      1. LoadRunner
        30.08.2022 22:03

        Эх...был бы миллионером, думаю, первым делом нашёл бы армию фанатов игры и программистов по совместительству и делал бы с ними продолжение игры, не жалея денег

        Кикстартер же.


    1. Offensive Автор
      30.08.2022 08:15

      О да, движок, сюжет, озвучка, крафт и даже баланс в ПЗ сделаны прекрасно! Только на ремастер расчитывать не стоит, всё равно графика не вырвиглазная))... А улучшенные текстурки сделали в своих HD-Pack'ах уже давно Atom и Durane!


  1. Mephi1984
    29.08.2022 05:52
    +8

    Вот жизнь! Ни минуты отдыха


  1. 7313
    29.08.2022 08:05
    +7

    кто проходил проклятые земли по геноциду gipatgroup.org/genocide.html смотрит на все остальные грушки с усмешкой :)


    1. staticmain
      29.08.2022 12:40
      +2

      Так вот куда он переехал! Раньше был на другом адресе, который сейчас недоступен. Буквально несколько недель назад выуживал из wayback machine и перепроходил уничтожая всё живое.

      P.S. А по теме статьи - почти все "хаки" что перечислены упрощают эту игру. Этой игре это не нужно.


      1. Offensive Автор
        30.08.2022 08:25

        Это не для упрощения игры, а для взаимодействия с модификациями к ПЗ). Я как раз занимаюсь такими, а ещё в моде Жамевю они используются.


    1. Offensive Автор
      30.08.2022 08:21

      Хм))... Стоит ли написать статью про ещё более жёсткий страшный геноцид)?


      1. staticmain
        30.08.2022 12:54

        А кто остается-то? Драконы убиваются, матка панцирников убивается два раза. Неубиенным остается только самая первая жаба на пригорке и циклоп.


        1. Offensive Автор
          30.08.2022 15:21

          Циклопа вынести можно, я жабой тоже можно подумать + всё без фейерверка)))...


  1. OmManiPadmeHum
    29.08.2022 14:16
    +2

    Гипатский легкий шлем из крепкой кожи. От упавшей на голову шишки спасет. А вот от камня - вряд ли.)


  1. Tufed
    29.08.2022 14:34
    +1

    Опять проходить…
    А так то в то время было обидно не столько от не умения персонажа восстанавливать запас сил во время действий, сколько от бесконечного запаса сил противников. НПС могут столько угодно долго бегать и кидаться магией магией нон стопом. И верно подмечено, геймплей мага это умение танковать лицом противника пока стоишь и восстанавливаешь запас сил. Выглядит странновато.
    Полноценное 3D, с дымами, частицами и мип-маппингом(в котором разбираться я стал только через 15 лет). В целом для 2000 года очень даже круто. Популярности у игры на мой взгляд было крайне мало. Среди моих знакомых того времени никто её не знал, абсолютно.
    Аддон же затерянных в астрале ждал с нетерпением, но получив проходил со смешанными чувствами, что делался он наспех 2,5 человеками за еду.


    1. staticmain
      29.08.2022 17:00
      +1

      геймплей мага это умение танковать лицом противника пока стоишь и восстанавливаешь запас сил. Выглядит странновато.

      Чаще всего геймплей мага - это заклинаниями загнать противника в щель "часовым замком", а потом жарить стеной огня до хрустящей корочки.
      Или собрать молнию У++ + У++ и шотать всё живое уходя маной в 0 с первого прокаста.


      1. Offensive Автор
        30.08.2022 08:20

        Ну это смотря какая сила у противника, мало где можно просто так загнать противника в узкое место, усилив и ослабив его, впрочем это нужно только с маткой панцирников за всю игру)...


        1. staticmain
          30.08.2022 12:55

          Не-не, еще все големы так "водятся" по тоннелю чтобы алмазный их покрошил, а мы добили и получили опыт


          1. Offensive Автор
            30.08.2022 15:20

            Алмазный голем был приведён мною через ущёлья и зажарен после остальных, это да, но это немного другое уже %). Матка-то специально поджимается мобом чтобы быть зажарена в продуманном узком месте.


  1. Aspecter
    29.08.2022 17:56
    +3

    Воспоминания нахлынули. Помнится проходил Затерянных в астрале ещё до того как у меня интернет появился, и завис на одном моменте на аллоде Джигран.

    По квесту дают ключ от темницы сырой в тюрьме-инстансе, и надо ее проползти не попавшись на глаза ни одному охраннику, вызволить пленника и смыться. Все было хорошо, весь аллод на брюхе прополз и стелс проблем не вызывал, но стражник около тюремной камеры постоянно поднимал тревогу из-за открытой клетки. Как ее закрыть я не вкурил и квест дальше не двигался. Покурив механику игры я нашел альтернативный путь! Стражника можно было убить из лучшего доступного оружия ударом из стелса со срины в голову. Надо всего-то вкачать мастерство на одном оружии и купить недешевое копьё. Очень недешевое.

    Было украдено и продано всё на карте до чего дотянулись загребущие руки, нещадно перебиты все пауки и прочая живность с которой можно было поиметь хоть копейку. На зачистку карты и сбор 5000 денег ушла неделя реального времени.

    Момент истины. Стражник лёг только с 15 попытки, никакого лута нн оставил и опыта тоже не дали. Зато путь был свободен и больше некому было поднимать тревогу. Возволяю пленника, взгляд падает на ключ... А что если?

    Ларчик просто открывался. И закрывался. Тем же ключом можно было закрыть темницу, квестовый предмет не был одноразовым.

    Проверяйте самые очевидные пути в первую очередь.


    1. Offensive Автор
      30.08.2022 17:16
      +1

      Прикольная история))! Интересно, когда именно это было))? Кстати, то был Суслангер - одна из начальных миссий). И да, наверное самая сложная во всей игре...


      1. Aspecter
        30.08.2022 18:02

        Когда? Лет пятнадцать назад) Да, верно, это был Суслангер, Джигран - последний четвертый аллод.

        Это задание с невестой Фейруза, спасение Алии.


  1. Amomum
    29.08.2022 22:34
    +1

    Перепроходил ПЗ несколько раз и всегда с читами (посколькуо у меня не было времени на проблемы, а сюжет интересный) - собственно, за мага играть было очень удобно - набиваешь себе запредельную ману, сверхбыструю регенерацию маны и во все заклинания вставляешь читерские руны (огорчало, что у них вместо текстуры был просто белый квадратик) - и вуаля, получаются очень удобные заклинания "умри с одного нажатия" (кислотный плевок или молния) и "убей толпу с одного нажатия" (кислотный туман).


  1. FLii
    29.08.2022 23:12
    +1

    Ностальгия!!!

    Помню, что психанул и полез искать чит-коды когда на надцатой неудачной попытке ползя на пузе перепутал кнопки нажал Ф6 вместо Ф5 (или наоборот), тем самым сохранившись за секунду до фейла. А возвращаться на несколько часов раньше уже не было сил.

    Помню как 5-ти летний сын бегал за спиной и возмущался: «Папа, нас сейчас убьют!!! Папа!»


    1. FlashHaos
      30.08.2022 00:19
      +1

      Была абсолютно аналогичная (разве что без сына, мне самому леи десять было) история. Ох уж эти кнопки сохранения!


    1. KReal
      30.08.2022 00:45
      +1

      Когда я первый раз проходил ПЗ (было лет 14 вроде), на мои крики прибежала мама… и втянулась) В итоге после меня прошла самостоятельно и, кажется, даже быстрее)


    1. dopusteam
      30.08.2022 09:09

      В одной игре, не помню где, видел, имхо, гениальное решение проблемы. Там под быстрые сохранения выделено несколько слотов, так что запоров одно, можно запросто достать чуть более раннее быстрое сохранение. Почему интересно так все не делают


      1. Offensive Автор
        30.08.2022 17:17

        Это как))? Когда прожимается быстрое сохранение, то предыдущее просто остаётся?


        1. dopusteam
          31.08.2022 07:19

          При нажатии на 'быстрое сохранение', сохранение падает в один слот. При следующем сохранении - во второй слот. Всего слота, допустим три, так что четвёртое быстрое сохранение перетрёт первое. Короче, всегда есть три последних быстрых сохранения. Если нечаянно сохранился прямо перед смертью, то есть ещё два старых быстрых сохранения, к которым можно вернуться


  1. michael_v89
    30.08.2022 01:43
    +1

    Тоже делал улучшения, такое же для бега, и для опыта напарников.


    1. Offensive Автор
      30.08.2022 08:17

      Я видела эту статью! Она замечательная).


  1. ne555
    31.08.2022 08:55

    rm