Руководство по хакингу

Emulate #02

ЧАСТЬ 6 - РУКОВОДСТВО ПО ВЗЛОМУ

DOOMDARKS REVENGE

Игры Lords of Midnight и её сиквел Doomdark's Revenge были в моём списке лучших игр с тех самых пор, как я впервые сыграл в них на своём старом добром 48к Spectrum с резиновыми клавишами. Даже по сегодняшним меркам они остаются одними из самых захватывающих компьютерных игр из когда-либо созданных — по крайней мере, для людей со стратегическим складом ума.

Сыграв и пройдя обе части несколько раз, я никак не мог понять, как Майку удалось запихнуть столько всего всего лишь в 41 килобайт. Поэтому я погрузился в код DR... У меня до сих пор сохранилось множество оригинальных (написанных от руки) листов, где я расшифровал большую часть Z80-кода этой игры. И что более важно (и, вероятно, полезно) — полный формат файла сохранения DR, а также несколько таблиц, необходимых для его понимания. Некоторое время назад я опубликовал это в comp.sys.sinclair, и множество людей заинтересовалось. По крайней мере, редактор карт (автор — Ян Капала [Jan Kapala], email KAPALA@ichn.ch.pwr.wroc.pl) основан на этой информации, и вы можете найти его на ftp.nvg.unit.no.

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


КАРТА И ТАБЛИЦЫ DOOMDARK'S REVENGE

ПОСЕЛЕНИЯ И ПЕРСОНАЖИ

Пример: G Imgarorn: Крепость/Цитадель Имгарornа Великанского. Исключения указаны ниже.

  • I = Ледяной лорд (Icelord)
  • G = Великан (Giant)
  • D = Гном (Dwarf)
  • B = Варвар (Barbarian)
  • F = Фей (Fey)
  • S = Особый (Special)

Все названия поселений создаются алгоритмически на основе карты. В верхнем левом углу карты зафиксировано зерно (seed), и игра рекурсивно отслеживает вашу позицию до этой точки, создавая уникальные имена (таблицы имён будут показаны позже) для каждой зоны (равнины, лес и т.д.). Цитадель или крепость выступают в качестве зоны, и название получают тем же способом. Существуют 128 таких поселений и 124 владельца. Первые 5 поселений являются особыми; их владелец — не тот персонаж, чьим именем называется поселение (как у всех остальных). Есть 5 персон, к которым применяется особый подход: Луксор Лунный Принц (Luxor the Moonprince), Моркин Свободный (Morkin the Free), Таритель Фейская (Tarithel the Fey), Рортрон Мудрый (Rorthron the Wise) и Шарет Похитительница Сердец (Shareth the Heartstealer). Шарет владеет городом Имириэль (City of Imiriel). Остальные четверо — чужеземцы.

Вот полная таблица персонажей:

  0 S Luxor        32 I Berudrarg    64 D Torormarg    96 B Thorthak
  1 S Morkin       33 I Imgudrur     65 I Ushangrane   97 F Thormand
  2 S Tarithel     34 I Talorthane   66 I Fangrorn     98 B Anvorthun
  3 S Rorthron     35 I Morangrim    67 I Carangresh   99 F Imgormand
  4 S Shareth      36 G Obortharg    68 G Anvildrak   100 F Carorthorn
  5 G Imgarorn     37 G Glortheon    69 I Anvarorn    101 B Imgorad
  6 G Ingormad     38 I Ulfangruk    70 D Hagudril    102 F Tororthane
  7 I Malisane     39 I Malarorn     71 G Ganigrorn   103 F Imorthorn
  8 I Anvireon     40 I Ganormarg    72 D Berangrorn  104 F Berormorn
  9 I Talormane    41 G Berorthim    73 G Fenorn      105 B Firak
 10 I Imildrorn    42 I Firim        74 G Sildrorn    106 F Morildrane
 11 I Carorthad    43 I Glireon      75 D Carorthay   107 F Thigrand
 12 I Ushudrarg    44 I Kahangriel   76 B Glortharg   108 B Kahudrarg
 13 G Glormeon     45 I Kahudruk     77 B Thortheon   109 F Lorangriel
 14 G Thormuk      46 I Lororthane   78 D Glormane    110 F Carorthane
 15 I Imgaril      47 I Malirane     79 D Gloruk      111 F Thorthand
 16 G Obularg      48 I Kahudrun     80 D Gludreon    112 F Berormane
 17 I Thigrim      49 G Ulformane    81 D Thudrun     113 F Ingormiel
 18 I Lorelorn     50 D Hagildrorn   82 D Torelorn    114 B Careneon
 19 I Kagangrorn   51 I Thildresh    83 D Thatruk     115 B Varangrand
 20 I Malirarg     52 I Glormarg     84 B Carormand   116 F Imgorthand
 21 G Imatrorn     53 I Carorand     85 D Lorangrarg  117 F Lorangrim
 22 G Asorthane    54 G Carangrane   86 D Thelak      118 F Tharand
 23 I Imasharg     55 G Thangrorn    87 D Imangruk    119 B Torinarg
 24 I Torangrorn   56 I Malormun     88 D Glidril     120 F Imorthesh
 25 I Sortharg     57 I Varormane    89 B Thangrad    121 B Anvortheon
 26 I Zarashand    58 G Imgenarg     90 D Imulorn     122 F Obireon
 27 I Glororn      59 G Thorarg      91 D Thigrak     123 G Obigrorn
 28 I Malorthand   60 I Thirium      92 B Lorangrorn  124 I Imgasharg
 29 G Varangrim    61 I Fenarg       93 B Varatrarg   125 I Thangrarg
 30 I Sigrorn      62 D Imgorarg     94 D Imelorn     126 B Kahudrak
 31 I Hagudrak     63 H Torelak      95 D Ulfangrak   127 F Carorthand

Поселения расположены в порядке с севера на юг. Это также может служить ключом к распределению рас.


ФОРМАТ СОХРАНЕНИЯ ИГРЫ

Все адреса, указанные далее, даны в десятичной системе. Сохранённые данные начинаются с адреса Spectrum 39933 и имеют длину 9219 байт. Это включает в себя:

  • Индекс персонажа: 1
  • Счётчик дней: 2
  • 24 таблицы (по 128 байт каждая): 3072
  • Карта (64*96): 6144
  • Итого: 9219

Адрес 39933 содержит номер персонажа, которым вы играете. Адреса 39934-5 содержат количество дней «с тех пор, как Лунный Принц отправился в Икмарк».

Карта и несколько таблиц включены сюда. Именно поэтому, когда вас убивают, вы должны загрузить сохранённую игру для перезапуска (не было места для двух копий всех этих данных). Теперь я перечислю всё это. Таблицы имеют длину 128 байт и индексируются по номеру поселения или персонажа, как в таблице выше.


ТАБЛИЦЫ 0/1 (39936/40064): Координаты поселений

Таблица 0 содержит координаты X (на карте) для 128 поселений, а таблица 1 — координаты Y. Я не буду перечислять их, так как у всех вас есть карта или вы можете легко получить её с помощью одного из редакторов PD.

Каждое поселение принадлежит персонажу с таким же именем. Исключения:

  • 0 Крепость Варенанд -> Лorimgrim Фей (117)
  • 1 Город Карудриум -> Карортай Гном (75)
  • 2 Крепость Тейгрorn -> Lorangriel Фей (109)
  • 3 Крепость Финорн -> Карангрань Великан (54)
  • 4 Город Имириэль -> Шарет Похитительница Сердец

ТАБЛИЦЫ 2/3 (40192/40320): Координаты предметов

Как таблицы 0/1, для предметов. В отличие от таблиц 0/1, они не фиксированы и устанавливаются случайным образом в начале игры. Каждый предмет имеет владельца, который может использовать его один раз. Любой, у кого есть предмет, но кто не является его владельцем, не сможет использовать его, но получит некоторые незначительные преимущества. Их также можно использовать для сближения с новыми людьми (отдав какой-то предмет его истинному владельцу, вы можете склонить его присоединиться к вашей стороне).

Предметы 5-128 — это оружие, их сила проявляется в битве, и они принадлежат персонажу с тем же номером. Это Копья (для варваров), Луки (для феев), Топоры (для гномов), Молотá (для великанóв) и Мечи (для ледяных лордов). Все они дают преимущества в бою.

Предметы 0-4 являются особыми. Вот их основные свойства:

  • 0 Корона Варенанда: Использование Луксором приводит с ним всех его людей.
  • 1 Корона Карудриума: Использование Моркином приводит Луксора и его людей.
  • 2 Заклинание Тейгрornа: Использование Таритель переносит всех в город Имириэль.
  • 3 Руны Финорнá: Использование Рортроном... я не помню!!!
  • 4 Корона Имириэля: Использование Шарет приводит Луксора и его людей.

Короны обладают второстепенной силой Убеждения. С ними проще сближаться с другими миром.

Заклинания обладают второстепенной силой Резвости (больше ходов за дневное время).

Руны обладают второстепенной силой Защиты в бою. Вас реже убьют.

Когда предмет переносится персонажем, его номер записывается в таблицу 3, а таблица 2 содержит 255.


  • ТАБЛИЦА 4 (40448): Врагов убито в последней битве.
  • ТАБЛИЦА 5 (40576): Людей потеряно в последней битве.
  • ТАБЛИЦА 6 (40704): Размер армии в походе.
  • ТАБЛИЦА 7 (40832): Размер домашней армии (в городе или крепости).

Во всех этих таблицах количество хранится разделённым на 5. Таким образом, 15 означает 75 человек, а 255 (максимум) означает 1275 человек.


ТАБЛИЦА 8 (40960): Тип воина (на основе таблицы 13)
  • 0-5: Лунная гвардия (Moonguard)
  • 6-7: Фей (Fey)
  • 8-9: Варвар (Barbarian)
  • 10, 11, 14: Ледяная гвардия (Iceguard)
  • 13: Великан (Giant)
  • 15: Гном (Dwarf)

Остальные значения не используются.


ТАБЛИЦА 9 (41088): Владелец каждого поселения

Первоначальные владельцы описаны где-то выше. Эта таблица содержит актуальных владельцев на каждый момент времени.

ТАБЛИЦЫ 10/11 (41216/41344): Координаты персонажей

X и Y соответственно. Первоначально каждый находится в своём родном поселении. Исключения:

  • Луксор: Ворота Варенornа (Gate of Varenorn).
  • Моркин: Город Имириэль.
  • Таритель: Лес Фангрим (Forest of Fangrim).
  • Рортрон: Ворота Варенornа.
  • Шарет: Город Имгарil.

ТАБЛИЦА 12 (41472): Разное I

a) 5 старших бит содержат оставшееся дневное время:

  • 0: Ночь
  • 1: Один час
  • 2-9: Два часа
  • 10-12: Три часа
  • 13-16: Четыре часа
  • 17-20: Пять часов
  • 21-24: Шесть часов
  • 25-27: Семь часов
  • 28-30: Восемь часов
  • 31: Рассвет

(эти дни коротки!)

b) 3 младших бита содержат направление взгляда:

  • 0: Север
  • 1: Северо-Восток
  • 2: Восток
  • 3: Юго-Восток
  • 4: Юг
  • 5: Юго-Запад
  • 6: Запад
  • 7: Северо-Запад

ТАБЛИЦА 13 (41600): Типы персонажей

Эта таблица используется главным образом для выбора графического представления:

  • 0: Луксор (верхом)
  • 1: Луксор (пешком)
  • 2: Моркин (на коне)
  • 3: Моркин (пешком)
  • 4: Рортрон (на коне)
  • 5: Рортрон (пешком)
  • 6: Фей (на коне)
  • 7: Фей (пешком)
  • 8: Варвар (на коне)
  • 9: Варвар (пешком)
  • 10: Ледяной в. (на коне)
  • 11: Ледяной в. (пешком)
  • 12: Таритель (всегда на коне)
  • 13: Гигант (всегда пешком)
  • 14: Шарет (всегда на коне)
  • 15: Гном (всегда пешком)

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

  • 16: Дракон
  • 17: Волк
  • 18: Тролль
  • 19: Скулкрин
  • 20: Конь

ТАБЛИЦА 14 (41728): Разное II

  • Биты 0-2: Принадлежность
    • 0 = Люксор
    • 1 = Шарет
    • 2 = Фей
    • 3 = Варвары
    • 4 = Гиганты
    • 5 = Гномы
    • (6, 7 не сущ.)
  • Бит 3: Убил врага в последней битве.
  • Бит 4: Участвовал в битве (биты 3 и 5 не имеют смысла, если бит 4 не установлен).
  • Бит 5: Одержал победу в последней битве.
  • Бит 6: В туннеле.
  • Бит 7: Использовал свой предмет (разрешено только один раз).

ТАБЛИЦА 15 (41856): Степень усталости

  • Совсем выбился из сил: 000-031
  • Крайне устал: 032-062
  • Очень устал: 064-095
  • Довольно устал: 096-127
  • Слегка устал: 128-159
  • Чуть-чуть: 160-191
  • Бодр: 192-223
  • Совсем не устал: 224-255

ТАБЛИЦА 16 (41984): Последняя битва

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


ТАБЛИЦА 17 (42112): Враг

Враг этого персонажа. Если бит 7 установлен, врагов нет.


ТАБЛИЦА 18 (42240): Сюзерен

Сюзерен этого персонажа. Если бит 7 установлен, сюзерена нет.


ТАБЛИЦА 19 (42368): Безрассудство

См. таблицу 15. 0 означает МЕРТВ.


ТАБЛИЦА 20 (42496): Предмет / Убийца

Эта таблица имеет два значения:

  • а) Если персонаж жив, она содержит номер переносимого предмета или 255, если предмета нет.
  • б) Если персонаж мертв, она содержит номер персонажа, убившего его. Если убийцы нет (например, драконы, тролли...), то бит 7 установлен, а младшие биты содержат код события. Коды событий см. ниже.

ТАБЛИЦА 21 (42624): Положительные черты

Бит Значение
7 Верный
6 Быстрый
5 Храбрый
4 Упрямый
3 Щедрый
2 Властный
1 Сильный
0 Добрый

ТАБЛИЦА 22 (42752): Отрицательные черты

Бит Значение
7 Вероломный
6 Медлительный
5 Трусливый
4 Угодливый
3 Жадный
2 Немногословный
1 Слабый
0 Злой

(...заметьте, что можно быть добрым и злым одновременно!)


ТАБЛИЦА 23 (42880): Уныние

См. таблицу 15.


ТАБЛИЦА 24 (43008): КАРТА (её длина — не 128 байт!)

Карта имеет размер 64 квадрата в ширину и 96 в высоту. Позиция (X,Y) находится по адресу 43008 + 64 * Y + X. Каждый байт имеет следующее значение:

Биты 0-3: Атрибуты поверхности

  • 0: Равнины
  • 1: Горы
  • 2: Лес
  • 3: Холмы
  • 4: Ворота
  • 5: Храм
  • 6: Яма
  • 7: Дворец
  • 8: Форпост
  • 9: Зал
  • 10: Хижина
  • 11: Башня
  • 12: Город
  • 13: Фонтан
  • 14: Камни
  • 15: Ледяные пустоши

Биты 4-7: Флаги

  • Бит 4: Инцидент (событие)
  • Бит 5: Армия (только графическая информация: вы можете увидеть армию, которой на самом деле нет, или наоборот, изменив этот бит!).
  • Бит 6: Туман.
  • Бит 7: Внизу находится туннель. Если тип поверхности 4-7, там есть вход в туннель.

На этом сохраненная информация заканчивается. Другие таблицы:

Таблица 29508: как местность (таблица 24) влияет на время (таблица 12a)

  • Равнины: 1
  • Горы: 8
  • Лес: 4
  • Холмы: 3
  • (Все остальные): 2

Таблица 29540: как тип персонажа (таблица 13) влияет на время (таблица 12a)

(на коне / пешком)

  • Люксор: 3/6
  • Моркин: 3/6
  • Рортрон: 2/4
  • Фей: 3/6
  • Варвары: 5/8
  • Ледяные в.: 3/5
  • Таритель: 2/-
  • Гиганты: -/5
  • Шарет: 2/-
  • Гномы: -/5

Таблица 29317: как тип персонажа (таблица 13) влияет на усталость (таблица 15)

(на коне / пешком)

  • Люксор: 1/2
  • Моркин: 2/4
  • Рортрон: 0/1
  • Фей: 2/3
  • Варвары: 2/4
  • Ледяные в.: 1/2
  • Таритель: 1/0
  • Гиганты: -/2
  • Шарет: 0/-
  • Гномы: -/3

Таблица 29009: Четыре типа событий для каждого возможного типа местности

(только на пустых клетках; повторы значений увеличивают вероятность)

Равнины:   0,3,1,4    Форпост:   0,1,6,6
Горы:      0,0,2,1    Зал:       2,6,6,10
Лес:       0,3,1,1    Хижина:    3,1,6,6
Холмы:     0,2,1,1    Башня:     5,5,5,5
Ворота:    0,7,8,10   Город:     0,6,6,12
Храм:      8,9,10,11  Фонтан:    3,12,12,12
Яма:       2,1,9,12   Камни:     0,8,8,11
Дворец:    0,4,7,10   Лед. пуст: 0,3,3,2

Типы событий:

  • 0: Драконы
  • 1: Волки
  • 2: Тролли
  • 3: Скулкрины
  • 4: Кони
  • 5: Руководство
  • 6: Убежище
  • 7: Когти Ночи (осталось времени = 0)
  • 8: Пламя Рассвета (осталось времени = 31)
  • 9: Шипы Отчаяния (уныние = 0)
  • 10: Кровь Мужества (уныние = 255)
  • 11: Тоска Смерти (усталость = 0)
  • 12: Источники Жизни (усталость = 255)

ТАБЛИЦЫ ИМЕН (24839)

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

Приставки (25):
Img Dol Lor Ush Mor Tal Car Ulf As Tor Ob F Gl S Th Gan Mal Im Var Hag Zar Anv Ber Kah Ash

Средние части (16):
ar or ir en orth angr igr ash el in ul atr orm udr is ildr

Окончания (16):
orn il im uk ium ia eon ay ak arg and ane esh ad un

Генератор имен имеет фиксированное начальное значение (зерно) в позиции (0,0) карты. В этой позиции находится крепость Имгаррона Гиганта (Imgarorn the Giant). Как видите, Img-ar-orn — это (0,0,0) в таблицах выше. Любая другая позиция рекурсивно прослеживается до (0,0), генерируя псевдослучайное зерно для трех таблиц. Алгоритм заботится о том, чтобы любые соседние квадраты одного типа местности имели одинаковое имя.

Заметьте, что на карте 6144 позиций. 6144 = 24 * 16 * 16, поэтому возможных имен больше, чем квадратов на карте. Таким образом, алгоритм также гарантирует, что не будет разных мест с одинаковым именем.

На этом пока всё! Приятной игры!

Рубен Мартинес (Ruben Martinez)
Email: Ruben.Martinez@rediris.es

Поделитесь вашим мнением о статье