330 lines
No EOL
9.2 KiB
Text
330 lines
No EOL
9.2 KiB
Text
Свободное место:
|
||
007600-008000 (2560)
|
||
01761E-018000 (2530)
|
||
04fc20-050000 (992)
|
||
057480-058000 (2944)
|
||
05a0c0-05b300 (4672)
|
||
0f3420-0f4000 (3040)
|
||
|
||
5744C
|
||
|
||
$50000 - там поинтер на главные поинтеры текста
|
||
$5744C - там поинтеры на главные блоки текста
|
||
|
||
Указания к скрипту
|
||
|
||
Особых ограничений на длину строки нет, т.к. длина символов не фиксированная. Ширина символа определяется по крайней правой его точке. +1 разделительный столбец между символами. Ширина одной строки = 200 пикселей. В среднем на строке помещается 25 символов по 7 пикселей (+1), но может поместиться и все 100.
|
||
|
||
|
||
Управляющие и прочие символы:
|
||
<44> - точка на среднем уровне высоты (не используется)
|
||
<4B> - конец фразы
|
||
<4D> - перенос строки (не пишется) - исправлено
|
||
<4E> - ? (управляющий символ)
|
||
<4F> - ? (управляющий символ)
|
||
<50> - число (уровень, урон, бонус атаки и т.д.)
|
||
<51> - персонаж
|
||
<52> - направление (Север, Юг, Запад, Восток)
|
||
<53> - герой
|
||
<54> - враг
|
||
<55> - предмет
|
||
<56> - заклинание
|
||
<58> - управляющий символ
|
||
|
||
Управляющие символы <4B>, <4E>, <4F>, <58> НЕ удалять и НЕ перемещать. Остальные можно перемещать при необходимости (например, имя врага стояло ДО какой-то фразы, а можно поставить ПОСЛЕ неё).
|
||
Символы на персонажа, врага и т.д. просто вставляют имя персонажа, врага и т.д. без всяких изменений и дополнений (например, пробелов слева или справа от имени).
|
||
В шаблонных фразах типа
|
||
<51> attacks!<4B>
|
||
могут использоваться разные падежи (в английском-то один падеж).
|
||
Поэтому, если использовать другой падеж (например, винительный), надо "придумать" новый управляющий символ (любой, больше $60) и вписать его, например, <62> - предмет в винительном падеже.
|
||
Тогда фраза
|
||
<51> uses the (кто-то использует такой-то предмет)
|
||
<55>!<4B>
|
||
будет переведена так:
|
||
<51> использует
|
||
<62>!<4B> (предмет в винительном падеже)
|
||
|
||
Соответственно, для остальных падежей и для остальных типов символов (на врагов, персонажей) или для множественного числа (врагов, т.к. в некоторых фразах есть коолективные действия врагов) будут другие символы.
|
||
Будут составлены таблицы в разных падежах и мн. числе, к которым и будет идти обращение при соответствующих символах.
|
||
|
||
Возможно использование английского текста. В шрифт поместятся оба алфавита.
|
||
|
||
|
||
|
||
|
||
Шрифты:
|
||
основной (текст и надписи на спрайтах) начинается с адреса F10CC
|
||
все символы 14 пикселей в выосту, ширина - любая до 16, следующий символ выводится сразу после самой правой точки предыдущей, причём, в надписях две нижние строки предыдущего символа оказываются над последующим. На каждый символ отводится $1C байт.
|
||
Декодирование:
|
||
|
||
MOVE.B (A0)+,D0 ; записываем байт текста
|
||
|
||
1B70C LEA $06DC(PC),A1 ; A1=1BDEA
|
||
1B710 MOVE.W $00(A1,D0),D0
|
||
|
||
По адресу 1BDEA идёт таблица соответствия символов шрифта (или управления) байтам текста.
|
||
Надо:
|
||
01B70C: 4EF9XXXXXXXX4E71 (JMP, NOP)
|
||
XXXXXX: 43F9YYYYYYYY303100004EF90001B70C (LEA, MOVE.W, JMP)
|
||
$1BED0 move.w #$0011,D0 - ширина символа по умолчанию, затем идут сдвиги вправо, и ширина уменьшается до тех пор, пока не будет найдена самая правая точка
|
||
|
||
|
||
|
||
Другой шрифт:
|
||
00CBA8 JSR ($0009C00C) - загрузка 1-х 8 кб видео с шрифтом и "EXP" в городе
|
||
00CBA8:6004
|
||
|
||
|
||
09C554 BSR $02 - загрузка 1-х 8 кб видео с шрифтом и "EXP" в начале
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Слова в меню начинаются с адреса 145609
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
слова EXP в видео (адрес "карты"):
|
||
C094, C095 - два тайла
|
||
1) E190
|
||
2) E350
|
||
3) E510
|
||
|
||
|
||
23910:94
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Враги начинаются с адреса $6FF1, поинтер 000348
|
||
Первые слова предметов начинаются с адреса $69E4, поинтер 000340
|
||
Вторые слова предметов начинаются с адреса $6DDB, поинтер 000344
|
||
Слова в городе начинаются с адреса $7527, поинтер 00034C
|
||
Имена начинаются с адреса $755B (1-е имя пустое), поинтер 000350
|
||
Магии начинаются с адреса $74B2, поинтер 00033C
|
||
|
||
Менюшные слова (HP, REMOVE, ARMOR и т.д.): 238C9 - 23D3C, формат необычный.
|
||
|
||
Названия предметов состоят из двух частей. Каждая часть не больше 9 символов. Если в конце первой части нет разделительного пробела, а вторая часть есть (т.е. непустая), при выводе названия предмета в окошке меню после первой части приписывается "-".
|
||
Пример:
|
||
слово SHORT SWORD (см. файл Shorts1.bmp)
|
||
1-я часть SHORT_ ("_" - пробел)
|
||
2-я часть SWORD
|
||
первая часть с пробелом, поэтому слово выводится в окошке меню как обычно (см. файл Bronzek.bmp)
|
||
|
||
слово BROADSWORD (см. файл Broads1.bmp)
|
||
1-я часть BROAD
|
||
2-я часть SWORD
|
||
первая часть без пробела, а вторая часть непустая (слово SWORD), поэтому приписывается "-" после 1-й части (см. файл Broads.bmp)
|
||
|
||
Поэтому надо учитывать пробелы в концах первых частей.
|
||
|
||
|
||
По адресу 1A9BE идёт проверка с номером предмета, и по ней пишется или не пишется тире после первой части.
|
||
|
||
4 17 1B 3D 49 46
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Направления движения по адресу $CAA3
|
||
|
||
|
||
|
||
Код разжатия старикашки, облаков и земли: 9C716
|
||
|
||
|
||
Шрифт - 58000, 5801C - 58818 - 2044 байта -> 6384
|
||
Старикашка - C00A0, D8684 - D981C - 4504 байт -> 6304
|
||
Облака - C00C4, D981C - D9E68 - 1612 байт -> 3872
|
||
Пол - C00CC, D9E68 - DA69A - 2098 байт -> 3680
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Основной текст:
|
||
Процедура разжатия текста $18018 (обычно JSR), далее прыжок на $1B5AC, d0.w содержит номер фразы.
|
||
1B5C8: BSR $1B694 - извлечение адреса фразы по номеру
|
||
1B69E: move.l $50000,a0 - главный поинтер на поинтеры блоков
|
||
1B5D8: BSR $1B52A - инициализация начального символа [$4B]
|
||
1B6F6: BSR $1B53A - распаковка очередного символа
|
||
1B552: lea $1aec0(pc),a1 - таблица поинтеров на деревья
|
||
1B55A: lea $1af7a(pc),a1 - базовый адрес деревьев, указывает на кодовую часть первого дерева, левее - символьная часть
|
||
|
||
1B598: move.b - распакованный символ
|
||
$FF3222 (reg a3) - номер текущего бита считанного байта сжатого текста, $FF3224 (2+a3)- текущее значение сдвинутого байта
|
||
1B5A2: move.b d0,$00B5(a3) - символ
|
||
$FF3A58 - адрес считываемого байта сжатого текста
|
||
1B700: Если d0.b не равен символу конца, то он увеличивается в два раза и смотрим следующую таблицу:
|
||
1B70C: LEA $1BDEA(PC),A1 - таблица соответствий символам их действий (вывод тайла или управляющий символ)
|
||
1B77E: CPMI.W $8000,D0 - проверка, является ли символ управляющим
|
||
1BEA4: вывод символа
|
||
1BEB6: move.l $e4004,a1 - базовый адрес основного шрифта
|
||
1BED0: move.w #$0011,d0 - максимальная ширина символа
|
||
1BEEC: MOVE.W #$0008,D0 - ширина пробела
|
||
$FF301A - текущий столбец вывода символов
|
||
1BEF6: cmp.w #$C4 - максимальная ширина строки в пикселях
|
||
|
||
$FF3A50 - адрес слова, которое будет подставлено вместо управляющего символа
|
||
|
||
В VBL:
|
||
1B636: cmpi.w #$0024,d1 - сравнение d1 с диапазоном символов, при появлении которых выдаётся звук. Если d1>24, звука нет.
|
||
|
||
|
||
|
||
Направления (румбы):
|
||
Просмотр карты: $C9FE
|
||
CA04 - CA34 - код проверки, мы НАД землёй или ПОД ней и вывод сообщения
|
||
$FF000F - номер румба, 0-3 (север, восток, юг, запад)
|
||
$FF0010 - координаты на восток
|
||
$FF0011 - координаты на юг
|
||
CA6C: move.b - вывод румба
|
||
CA74: move.w - сохранение длины-1 вставляемого слова (румба) по адресу $FF3066
|
||
$CAC0 - длины румбов
|
||
$CAA3 - румбы, на каждый по 8 байт, разделены байтами 00
|
||
|
||
|
||
|
||
Разжатие второго шрифта:
|
||
2 обращения:
|
||
CBA8: JSR $9C00C - в городе
|
||
9C554: bsr $02 - перед старикашкой
|
||
|
||
9C558: move.l $58000,a0 - поинтер на запакованный шрифт
|
||
9c55e: move.w #0,a1 - начальный адрес куска в VRAM
|
||
9c562: move.w #$1000,d0 - DMA length
|
||
Затем прыжок на одну из стандартных процедур распаковки 0FCC.
|
||
$FFAE84 - начало распакованной графики, конец определяется самой data и не зависит от DAM length
|
||
27E84: конец распаковки
|
||
0DC8: начало пересылки по DMA (должно быть D1.w = 0002)
|
||
0E58: конец пересылки по DMA
|
||
0E82: выход
|
||
|
||
Второй шрифт имеет размер #$1900, но пересылается #$2000.
|
||
|
||
|
||
|
||
Основное оконное меню (ENTER, ITEM, STATUS, SPELL, USE, EQUIP, DROP, GIVE) основано на спрайтах.
|
||
1D5F6: move.l $58014,a0
|
||
1d5fc: lea $0f680,a1
|
||
1d602: move.w #$0360,d0
|
||
1d606: jsr $284
|
||
|
||
|
||
|
||
|
||
1AB08: карта надписи EQUIPPED отдельными командами
|
||
|
||
$2374E - поинтеры на менюшные/оконные карты тайлов.
|
||
1A306: обращение к этим поинтерам.
|
||
|
||
Номера карт:
|
||
0 - шаблон окошка наверху экрана со статусом перса
|
||
1 - окно с отображением золота
|
||
2 - экипировка
|
||
3 - характеристики перса
|
||
4 - WHOSE STATUS
|
||
5 - WHOSE SPELL
|
||
6 - рисунок ENTER
|
||
7 - рисунок ITEM
|
||
8 - рисунок STATUS
|
||
9 - рисунок SPELL
|
||
A -
|
||
B -
|
||
C -
|
||
D -
|
||
E - левое окно при экпировке
|
||
F - то же?
|
||
10
|
||
11
|
||
12
|
||
13 - SEARCH
|
||
14 - ITEM
|
||
15 - STATUS
|
||
16 - SPELL
|
||
17 - USE
|
||
18 - EQUIP
|
||
19 - DROP
|
||
1A - GIVE
|
||
1B, 1C - OTHERS
|
||
1D, 1E - EQUIP WHO?
|
||
1F - 22 - EQUIP WHICH?
|
||
23 - 29 - 4 надетых предмета
|
||
2A - WPN FACTOR и AMR FACTOR
|
||
2B - UNARM
|
||
2C - REMOVE 1
|
||
2D - REMOVE 2
|
||
2E - REMOVE 3
|
||
2F - CAN'T REMOVE CURSED ITEM
|
||
30 - .... IS CURSED!
|
||
31 -
|
||
32 -
|
||
33 - предметы выбранного перса
|
||
34 - выбранный предмет или заклинание (?)
|
||
35, 36 - ATTACK
|
||
37 - ITEM
|
||
38 - RUN
|
||
39 - SPELL
|
||
3A - ATTACK
|
||
3B - ITEM
|
||
3C - DEFEND
|
||
3D - SPELL
|
||
3E -
|
||
3F -
|
||
40 - BUY
|
||
41 - SELL
|
||
42 - EXIT
|
||
43 - DEALS
|
||
44 - BUY
|
||
45 - SELL
|
||
46 - EXIT
|
||
47 - CRAFT
|
||
48, 49 - REPAIR
|
||
4A, 4B - ORDER
|
||
4C - маленькое окошко с именем перса и жизнями
|
||
4D - = 33
|
||
4E - ARMOR
|
||
4F - SHIELD
|
||
50 - WEAPON
|
||
51 - HELM
|
||
52 - 56 - окно с отображением золота
|
||
57 - 5D - ?
|
||
|
||
|
||
|
||
|
||
$1aec0 - $1b52a - деревья с поинтерами, надо стереть
|
||
Поинтеры поместим на $1aec0, деревья - на $17800, поинтеры к тексту - $5000c, текст на $5003c.
|
||
Надо заменить указатели на поинтеры для деревьев и на деревья. Заменить указатель $50000. $50004, $50008 не используются, но лучше поменять.
|
||
|
||
|
||
|
||
|
||
|
||
Разжатие 2-го шрифта - $9C558
|
||
|
||
|
||
|
||
В скрипте последний символ - 5A, но в роме есть таблица и для 5C. Новые символы: 5D - куча врагов, 5E - предмет в винительном падеже. [$61] исправлено на 5D.
|
||
|
||
|
||
Имена героев по адресу $2DC6. |