ZX-Ревю 1996 №1-2 1996 г.

Советы экспертов - Rebel star - старая игра, новые возможности.


СОВЕТЫ ЭКСПЕРТОВ

REBEL STAR - СТАРАЯ ИГРА, НОВЫЕ ВОЗМОЖНОСТИ.

© А. Нероев, г. Челябинск.

Пожалуй, самое трудное для начинающих программистов - это разработка новой игры. Для того, чтобы сделать первый шаг к разработке собственной программы, необходимо, как мне кажется, поработать с уже готовой фирменной программой. Причём основное внимание уделить не машинному коду, а поработать с данными, которые она использует. Для этой цели идеально подходит игра REBEL STAR фирмы Firebird. Её преимущества: она широко распространена, достаточно простая структура данных, несколько неиспользуемых Кб плюс полное отсутствие защиты.

Что можно с ней сделать? Провести полную русификацию, затем создать новую местность, новых солдат, новые спрайты, новых солдат и так далее, насколько хватит фантазии.

Этап первый: русификация.

Символьный набор расположен с адреса 49200 (здесь и далее все числа в десятичной системе). Все сообщения программы разбиты на 4 блока. Их начальные адреса Вы найдете в таблице в конце этой статьи. Кроме этого программа, использует 2 керналя: первый для первых, трёх текстовых блоков, второй для четвертого (честное слово, не знаю почему так). Таблица 1

Структура керналя

Байт

Значение

0, 1

адрес первого байта сообщения

2, 3

длина сообщения в байтах, причём 3 байт всегда ноль, так как нет сообщений, длиннее 255 байт.

Для просмотра сообщении Вы можете воспользоваться листингом 1. Для их замены -

листингом 2.

Листинг 1.

10 LET KR=40667: FOR Q=0 TO 46: GO SUB 50: NEXT Q 20 LET KR=42923: FOR Q=0 TO 111: GO SUB 50: NEXT Q 30 STOP

50 LET A=KR+Q*4: LET AD=PEEK (A+1)*256: LET LN=PEEK (A+2) 60 PRINT Q,LN: FOR W=AD TO AD+LN-1: PRINT CHR$ PEEK W: NEXT W 70 PRINT: RETURN

Листинг 2.

10 LET B=34930

20 FOR Q=0 TO 46: LET A=40667+Q: LET AD=PEEK A+PEEK (A+1)*256: PRINT Q,AD-B;AT 20,0;" " " ";: FOR W=AD TO AD+PEEK (A+2)-1: PRINT CHR$ PEEK W;:NEXT W

30 PRINT " " " ": POKE 23606,48: POKE 23607,191: INPUT A$: POKE

23606,0: POKE 23607,60 33 IF A$="" THEN STOP

35 LET LN=LEN A$: IF A$=" " THEN LN=PEEK(A+2)

40 LET W=INT (B/256): POKE A,B-W*256: POKE A+1,W: POKE A+2,LN: IF

A$=" " THEN FOR W=1 TO LN: POKE B,PEEK (AD+W-1): LET B=B+1: NEXT W: GO TO 56

СОВЕТЫ ЭКСПЕРТОВ

50 FOR W=1 TO LN: POKE B,CODE A$(W): LET B=B+1: NEXT W 56 IF Q=30 THEN LET Q=33: LET B=38183 58 IF Q=41 THEN LET B=40855 60 CLS: NEXT Q

Комментарии к листингу 2:

В строке 33 между кавычками пробела нет, а в строках 35 и 40 есть.

Набирая этот листинг, Вам придётся для экономии памяти заменять строки типа Q=33: LET B=3818 3 на тождественные Q=CODE "!": LET B=VAL "38183", а иначе "out of memory".

После запуска Вы увидите сверху номер сообщения и количество байтов "в запасе". Если это число положительное, значит Ваши сообщения короче исходных; если отрицательное, исходный текст будет испорчен. Возможно, что Вы со своим текстом вылезете на какой-либо кодовый блок, и программа перестанет работать. Поэтому тщательно выбирайте слова и следите за этим числом.

Внизу, в кавычках, исходный текст (таблица символов из ПЗУ, т.е. английская). Если у Вас нет желания его изменять, нажмите один раз пробел, а затем ENTER; При вводе нового сообщения используется таблица символов самой игры. Поэтому не забудьте её вставить.

Эта программа для перевода трёх первых блоков, т.к. использует первый карналь. Для перевода четвёртого блока надо ввести следующие изменения:

изменить строку 10: 10 LET B=43371

изменить фрагменты в 20 строке FOR Q=0 TO 4 6 на FOR Q=0 ТО 111 и LET A=40667 + Q*4на LET A=42923 + Q*4

и удалить строки 56 и 58.

После того, как Вы закончите с переводом сообщений, останется последнее - перевести картинки RAIDERS WIN и RAIDERS LOSE. Картинка представляет собой матрицу 15x11, составленную из спрайтов игры (УЧИТЕСЬ - всего 165 байт на весь экран). Трудность перевода заключается в том, что нам НИКАК не уместить слово РЕЙНДЖЕРЫ в строку из 15 "условных" пикселей. На мой взгляд, приемлемым вариантом является замена "THE/RAIDERS", например, на "СПЕЦ/ОТРЯД/АКУЛА", а "THE/OPERA-/TIVES" на "ПЕРСОНАЛ/ДЕЛЬТА". Соответственно изменяем сообщения на "ПОБЕДА ОТРЯДА" (победа акулы) и "ПОБЕДА ДЕЛЬТЫ". Это не самые хорошие варианты - вполне можно придумать что-нибудь получше.

Этап второй: новая база.

План базы занимает область памяти с 50000 по 53999. Это прямоугольник 80x50. Каждый байт может содержать число от 0 до 255. Чтобы узнать значения кодов, загрузите кодовый блок, введите строчку:

FOR Q=0 TO 255:POKE 50000+Q*2,Q: POKE 50001-Q*2,0: NEXT Q и запустите программу: RANDOMIZE USR 24900.

В верхней части карты появятся все используемые спрайты.

Рекомендую перерисовать их для себя. Коды 0.141 - спрайты обстановки, 146.154 и 161.173 - используемые предметы (см. ниже), коды 200.255 - солдаты.

Но вернемся к составлению карты. Я рекомендую следующую последовательность: на миллиметровке 80x50 начертите общие контуры базы, подумайте, где и что у Вас будет а после этого на миллиметровке 400x250 рисуйте всю базу до мельчайших подробностей (говоря "база", я не подразумеваю конкретно базу, может быть это будет космический корабль или какой-то ужасный лабиринт). И только после этого можно загонять её в память.

Далее, Вы должны изменить координаты главной цели (конечно, если она находится в координатах 38x13, ничего изменять не нужно). Для этого: LET A=50000+Y*80+X POKE 30072,A-INT(A/256)*256 POKE 30073,INT(A/256)

СОВЕТЫ ЭКСПЕРТОВ

Кроме этого, Вы можете изменить код главной цели (например, цель уничтожить не ISSAC, а реактор. Для этого в ячейку по адресу 30076 надо занести код цели.

Следующее, на что необходимо обратить внимание - предметы, лежащие на полу или на чем-то еще. Вы должны, во первых, отметить их на карте и, во вторых, внести их в список. Он находится с адреса 63900 и занимает по 5 байт на каждый предмет. Одновременно на полу может лежать 327 предметов. Таблица 2.

Расшифровка байтов:

Байт

Назначение

0

код предмета

1

координата Y

2

координата X

3

код предмета, на котором лежит

4

число патронов, если оружие или 0

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

Всего в игре участвуют 5 солдат. Информация о них хранится, начиная с адреса 46600, и на каждого солдата отводится 40 байт. Ниже приведена их расшифровка. Таблица 3.

Расшифровка байтов

Байт

Значение

0

номер рисунка (0 - человек, 1 - сторож-дроид и т.д.)

1

патронов в используемом оружии

2

не определено

3

не определено; есть предположение, что это масса или размер

4

код того, что остается после смерти

5

указатель на таблицу затрачиваемых ходов (см. ниже)

6

максимальное число ходов (ACTION POINTS)

7

осталось ходов

8

максимальное здоровье (CONSTITUTION)

9

здоровья осталось

10

если значение этого байта больше, чем в 9 байте, появляется надпись "РАНЕН" со всеми последствиями

11

максимум морали

12

мораль сейчас

13

броня (ARMOUR)

14

не определено; у людей=0, у остальных=1

15

если можно выключить =0, нельзя =11, выключен=13

16

Обращение с оружием, меткость (WEAPON SKILL)

17

максимальная масса, которую может поднять

18

RAIDER=0; OPERATIVES=1

19

предмет в руках (код)

20

на чем стоит (код)

21

первый предмет

22

патронов в нём

23

второй предмет

24

патронов в нём

140

Байт

Значение

25

третий предмет

26

патронов в нём

27

четвёртый предмет

28

патронов в нём

29

ход, с которого вступают в игру

30

координата Y верхнего угла прямоугольника, где появится солдат

31

то же, координата X

32

максимальный запас выносливости (STAMINA) ,

33

выносливость сейчас

34

истрачено ходов

35

не определено; у людей=2, у остальных=4

36

не определено; у людей=1, у остальных=255

37

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

38

длина этого прямоугольника

39

возможность поднимать и использовать предметы. Можно все=0, только использовать=15. До конца не разобрался.

Ещё один керналь, связанный с солдатами - область памяти 44875-45131. Здесь находится информация о том, на какой объект какое сообщение выводить (сообщения берутся из 4-го блока). Значит, если Вы захотите превратить один тип дроида (или человека) в другой, не забудьте изменить значение соответствующего байта.

Последнее, что Вам, возможно, придется изменить - это керналь графики. Он расположен с адреса 54000 и занимает 1536 байт. Его структура такова: байты 0 и 1 -адрес начала спрайта, байт 2 -атрибут спрайта. О спрайтах см. ниже.

Этап четвертый: новые предметы. За предметы отвечают два блока, располагающиеся с адресов 45388 и 61950. При этом первый блок - это характеристики оружия, а второй используется для всех предметов. Таблица 4.

Расшифровка байтов (45388)

Байт

Значение

0

максимальные повреждения, наносимые человеку

1

максимальные повреждения, наносимые дроиду

2

максимальные повреждения, наносимые предметам обстановки

3-7

не используются (?)

Надо сказать, что здесь я до конца не разобрался. Таблица 5.

Расшифровка байтов (61950)

Байт

Значение

0

1 бит - возможность стрельбы, 2 бит - возможность удара

1

сколько патронов, если обойма; для оружия=255

2

ограничитель дальности стрельбы

3

вероятность попадания при меткости=0

4

увеличение вероятности попадания на каждый пункт МЕТКОСТИ

5

чем заряжается, если это оружие (код)

6

"цена" прицельного выстрела

7

"цена" выстрела на вскидку

8

масса объекта

Байт

Значение

9

размер объекта

10

не определено

11

не определено

12

тип оружия (?)

13

"цена" за удар предметом

14

не используется (?)

15

не используется (?)

Таблица 6.

содержимое ячейки

8

16

32

64

128

в % ходов

100

50

25

12

6

в ходах (на 20 АР)

20

10

5

2

1

Этап пятый: новая обстановка.

Сами спрайты расположены сразу после керналя. Чтобы их просмотреть, наберите листинг

3.

Листинг 3.

1 BORDER 0: PAPER 0: INC 7: CLS 10 FOR Q=0 TO 511: LET A=Q*3+54000

20 POKE 23606,PEEK A: POKE 23607,PEEK (A+1)-2: PRINT "©А" "ВС" 30 PAUSE 0: CLS: NEXT Q: POKE 23606,0: POKE 23607,60

Первые 256 символов изображены на обычной карте, следующие 256 - в режиме стрельбы. Теперь осталось последнее: описание объектов и предметов с кодами от 0 до 146. Оно находится с адреса 62440. Таблица 7.

Расшифровка байтов

Байт

Значение

0-3

цена в ходах при перемещении на объект при движении вверх, вниз, влево и вправо. Из четырех байт используется тот, значение которого находится в 5-м байте характеристики солдата

4

твердость - необходимая сила удара, чтобы уничтожить этот объект

5

премия за уничтожение - прибавляется к морали

6

добавочная цена при движении по диагонали

7

защита местности (PROTEC)

8,9

эти два байта выполняют следующее: если у солдата в руке предмет, код которого находится в 8-м байте, то объект преобразуется в другой, код которого в 9-м байте. В частности, это используется при открывании/закрывании дверей.

ЗАКЛЮЧЕНИЕ

Не буду ни с кем спорить - здесь изложено далеко не всё, но .вполне достаточно для того, чтобы изменить REBEL STAR до неузнаваемости - это зависит исключительно от Вашей фантазии и желания. Что можно придумать: перевести уровни с LASER SQUARD или создать нечто вроде ALIEN ENCOUNTER, или ДАЖЕ СДЕЛАТЬ ЧТО-ТО НАПОДОБИЕ RPG. Вот готовый сценарий: N-ое количество героев попадают в лабиринт с целью взойти на пьедестал судьбы. Во время путешествия они ищут предметы, которые необходимо использовать и где-то положить, чтобы что-то произошло (достаточно немного знать ассемблер, чтобы сделать такую подпрограмму), оживляют различных демонов, которые после этого выступают на их стороне, бродят по иррациональным лабиринтам (опять таки не надо иметь 10-летний стаж, чтобы написать эту подпрограмму) и наконец попадают в комнату с пьедесталом, где их ждёт какая-нибудь пакость. Это один из бесконечного числа сценариев, так что - ТВОРИТЕ!

Таблица 8.

Адреса и значения в REBEL STAR 1 и 2

Адрес

Описание

в RS 1

в RS2

24700

запрос уровня, сложность

24900

25000

старт программы

30072

25129

2 байта - адрес ячейки, где главная цель

30076

25132

код главной цели

30211

?

надпись RAIDERS WIN (15X11)

30376

?

надпись RAIDERS LOSE (15X11)

34930

30250

блок сообщений (1)

38183

33505

блок сообщений (2)

40667

35977

керналь первых трех блоков (47X4)

40855

36165

блок сообщений (3)

42923

38237

керналь четвертого блока (112X4)

43370

38724

блок сообщений (4)

44875

40237

керналь на какой предмет - какое сообщение

45388

40748

описание оружия

46600

46600

описание солдат (55X40)

49200

49200

символьный набор

50000

50000

карта

54000

54000

керналь спрайтов (512X3)

55536

55536

спрайты

61950

61950

описание объектов (30X16)

62440

62440

описание предметов (144X10)

63900

63900

описание объектов "на полу"




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Письма - О положении дел со Speccy в Ставрополе.
Система - "Быстрая графика" для начинающих программистов.
CHA0TIC - CC'99 - воспоминания о Питерском демопати.
Fractal - Fractal Expression объединяет векторную графику с растровой.
X-Files - Типы НЛО.

В этот день...   23 ноября