Охота на Вампуса


Главная / ЭКВМ / Программы для ЭКВМ / Игры
Hunt the Wumpus

Охота на Вампуса (Hunt the Wumpus) - текстовая компьютерная игра, написанная Gregory Yob в 1972 году. Цель игры в том, чтобы, путешествуя по лабиринту, найти Вампуса и застрелить его. Иногда игру называют просто "Вампусом".

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

Пещера

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

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

Расположение комнат в пещере не изменяется, однако не будем лишать игроков удовольствия, приводя схему лабиринта.

Оружие

Игрок имеет лук с пятью стрелами. Для убийства Вампуса достаточно и одной стрелы. Если стрела попала в Вампуса, то игрок победил и игра окончена.

Стрелы у игрока не простые, а волшебные — они могут делать повороты во время полёта. Каждая стрела может пролететь от 1 до 5 соседних комнат.

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

Игрок проигрывает и в том случае, если он истратит все 5 стрел, но так и не убьёт Вампуса.

Опасности

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

Источником отвратительного запаха является спящий Вампус. Запах чувствуется, если Вампус находится в какой-то из соседних комнат.

Сквозняк и шум всегда доносятся из соседней комнаты, но неизвестно, из какой именно.

В комнатах, откуда идёт сквозняк, находятся бездонные ямы, попав в которые, игрок погибает и, соответственно, проигрывает. Из 20 комнат в пещере две имеют ямы.

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

Вампус

Wumpus 2

Так был изображён Вампус в статье "Wumpus 2", написанной автором игры.

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

Если игрок окажется в одной комнате с проснувшимся Вампусом, то он проиграл - Вампус съедает его. Если же Вампус проснулся от звуков выстрела в пещере, то у игрока ещё есть шансы.

Проснувшись, Вампус может либо заснуть снова (с вероятностью 0,25), либо перейти спать в одну из соседних комнат. Кстати, комнаты с ямами и летучими мышами Вампусу не страшны. У него на ногах есть присоски, с помощью которых он выбирается из любой ямы, а его огромный вес не даёт гигантским летучим мышам его переносить. Если Вампус отправляется спать в комнату, где находится игрок, то игрок проигрывает, а Вампус получает обед.

История игры

"Охота на Вампуса" — первая в истории текстовая, а также первая приключенческая игра. Она была чрезвычайно популярна в 1970—1980-е годы. Программистам эта игра так полюбилась, что, пользуясь её размером (около 200 строк кода, половину из которых занимают вывод на экран и комментарии), они встраивали её в различные программы. Известно, что в корпоративной операционной системе R&D была системная команда "to Wumpus", запускавшая игру.

"Hunt the Wumpus" — это и первая игра, в которой используется строение карты по принципу графов (в отличие от простой прямоугольной сетки как в более старых играх). В этом отношении, а также по размещению ловушек и тем остроумным сообщениям, которые используются в этой игре, она послужила прототипом для ADVENT и Zork (Zork, в частности, унаследовал от неё колонии гигантских летучих мышей).

Позже появились и графические версии этой игры, отличающиеся от оригинальной другими лабиринтами и ловушками. В настоящее время версии "Hunt the Wumpus" доступны в Интернете для большинства операционных систем и устройств.



Реализация на ЭКВМ

В программе для ЭКВМ сохранено большинство особенностей оригинальной игры, текст которой на языке BASIC приведён ниже. Разумеется, игру можно было значительно усовершенствовать, но тогда исходный код нельзя было бы использовать для сравнения подходов.

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

начало игры

После запуска на экран выводится заставка и меню из пунктов "Начать", "Повторить", "Правила" и "Выход".

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

Перезапуск выполняется через "В/О", "С/П". Если есть желание сохранить старый лабиринт, нужно выбрать пункт "Повторить". Для создания нового - пункт "Начать".

начало игры

После начала новой игры программа создаёт расположение объектов в пещере и запоминает его для возможности повторного запуска после выхода или поражения.

Основной экран игры представляет вид одной из комнат пещеры, её номер указан слева вверху. Из каждой комнаты можно перейти в три соседних.

Направление перехода указывается стрелкой на экране и выбирается кнопками "Выбор" ("стрелки" на клавиатуре).

начало игры

Из соседних комнат может доноситься запах, шум или движение воздуха - переходить в таком случае следует осторожно, чтобы ненароком не упасть в яму или не разбудить Вампуса.

начало игры

Летучие мыши тоже могут доставить массу неприятностей.

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

Кнопками "Выбор" в основном экране можно также выбрать действие - выстрел из лука.

Перед самим выстрелом в отдельной форме кнопками "Выбор" потребуется указать расстояние, на которое полетит стрела.

маршрут стрелы

Затем при помощи кнопок "Выбор" и "Ввод" следует указать маршрут её полёта.

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

При этом, разворот стрелы в полёте на 180 градусов при задании маршрута не допускается.

выстрел

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

правила - страница 1

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

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

Текст программы примера приведён ниже и снабжён комментариями.



Файл программы wumpus.mkp на ЯМК - 6615 байт, КС 546075/173

Текст программы wumpus.mkl для кросс-компилятора



.CHARSET 1251
; Файл wumpus
; Текстовая игра "Охота на Вампуса"
; По мотивам "Hunt of Wumpus" [Gregory Yob, 1972]
; Пример использования графического интерфейса
; пользователя ЭКВМ ЭЛЕКТРОНИКА МК
; НПП "СЕМИКО", 2012, GPL 2+

; Версия 1.0 от 05.07.12
; Версия 1.1 от 13.07.12


; Команды языка ГИ:
TAB	.EQU	96
LDX	.EQU	104
LDY	.EQU	105
TYPE	.EQU	101
ATYPE	.EQU	78
LDADR	.EQU	77
SQU	.EQU	89
FRAME	.EQU	91
DRAWP	.EQU	84
DRAWB	.EQU	86
TXTP	.EQU	83
TXTB	.EQU	85
TXTK	.EQU	87
PREXP	.EQU	92
PRFORM	.EQU	93
PRHEX	.EQU	94
MCALL	.EQU	102
RETUM	.EQU	103
LCALL	.EQU	112
RETUL	.EQU	113
JNEZ	.EQU	1
JM	.EQU	56
END	.EQU	255

; Регистры памяти
; R0,R1 - циклы
; R4,R5 - косвенное обращение к регистрам
; RA-RD - временное хранение данных

NK0	.EQU	21	; левая дорога
NK1	.EQU	22	; средняя дорога
NK2	.EQU	23	; правая дорога

NK	.EQU	24	; номер текущей комнаты - HtW L(1)
NW	.EQU	25	; Пещера с Вампусом - HtW L(2)
NP1	.EQU	26	; Первая пещера с пропастью - HtW L(3)
NP2	.EQU	27	; Вторая пещера с пропастью - HtW L(4)
NB1	.EQU	28	; Первая пещера с летучими мышами - HtW L(5)
NB2	.EQU	29	; Вторая пещера с летучими мышами - HtW L(6)
ARR	.EQU	30	; Запас стрел - HtW A

	; резервная копия данных для повтора игры - HtW M()
			; регистры от 34 до 39 включительно	
NKR	.EQU	34	;
NWR	.EQU	35	; 
NP1R	.EQU	36	; 
NP2R	.EQU	37	; 
NB1R	.EQU	38	; 
NB2R	.EQU	39	; 

FSTR1	.EQU	41	; значение 0 - признак наличия текста в STR1
FSTR2	.EQU	42	; -"- STR2
FSTR3	.EQU	43	; -"- STR3
YSTR1	.EQU	44	; вертикальная координата текста в STR1
YSTR2	.EQU	45	; -"- STR2
YSTR3	.EQU	46	; -"- STR3

ARRJ9	.EQU	47	; дальность стрельбы (HtW - J9)
ARRK	.EQU	48	; для цикла по маршруту стрелы (HtW - K)
ARRERR	.EQU	49	; 0- ошибка маршрута

ARRP1	.EQU	50	; маршрут стрелы комната 1 (HtW - P(1)) и т.д.
ARRP2	.EQU	51
ARRP3	.EQU	52
ARRP4	.EQU	53
ARRP5	.EQU	54


STR1	.EQU	1000	; строка 1
STR2	.EQU	1050	; строка 2
STR3	.EQU	1100	; строка 3


; ====================================================== Начало программы
.ORG 0	
A0:	
	CX		; Обнулить RX и сбросить признак ввода числа
	2 PP M 9010	; Инициализировать графический экран

	1 PP M 9200	; 1 - разрешение графического интерфейса
	1 PP M 9202	; текущая форма - 1 
	0 PP M 9203	; активный элемент - 0
	.NUM TFORM
	PP M 9201	; главная таблица форм TFORM


A1:	64		; Код принудительной перерисовки формы
A2:	PP M 9208	; Перерисовать форму
	PP RM 9209	; Результат выполнения формы

	MA		; Сохранить в RA
	P X!=0	A5	; Перейти, если не требуется обработки	

	1 - 
	P X!=0	A4	; Перейти, если требуется обработка
	
	; Далее простейшая обработка ошибки интерфейса 
	; при этом RX содержит число от 2 до 6 
	; или 7 - ввод числа, который в программе не используется 

A3:	.NUM STRER	; Вывести "Ошибка" в строку комментариев
A31:	PP M 9026
	CX ENT ENT ENT	; Очистить стек
	RMA
	R/S		; Останов

A4:	; Обработка результата выполнения формы
	.NUM TOBR	; таблица адресов обработчиков
	PP M 9042	; в R9042
	PP RM 9208	; команда для обработки
	PP M 9213	; считать из ассоциативной таблицы

	P X>=0 A5	; обработчик команды не найден - перейти к опросу
	PP M 9042	; адреса форм для обработчика команд в R9042

	PP RM 9202	; номер текущей формы
	PP M 9211	; считать из упорядоченной таблицы
	P X!=0 A5	; Адрес 0 - обработчик команды для данной формы отсутствует
			; перейти к опросу клавиатуры
	MA		; сохранить адрес в RA
	
	PP RM 9208	; код команды
	33 -
	P X=0 A41	; для всех команд кроме Ввод перейти непосредственно к подпрограмме
			; для команды Ввод - считать и обработать номер активного элемента	
	RMA
	PP M 9042
	PP RM 9203
	PP M 9211	; считать адрес из упорядоченной таблицы

	P X!=0 A5	; если адрес нулевой (обработчик отсутствует)
			; перейти к опросу клавиатуры

	MA		; иначе записать адрес подпрограммы обработчика в RA
A41:	K GSB A		; и перейти к ней

	P X!=0 A5	; если RX==0 перейти к опросу клавиатуры без перерисовки
	P X<0 A42	; если RX>0 перерисовать с учётом номеров формы и элемента
	CX MA		; Очистить RA перед выходом из программы
	.NUM STREX
	P GOTO A31
A42:
	RMB		; новый номер формы (устанавливается в подпрограммах обработки)
	PP M 9202	
	RMC		; новый номер элемента (устанавливается в подпрограммах)
	PP M 9203
	P GOTO A1	; Вернуться к перерисовке формы

A5:	; Опрос клавиатуры

	PP RM 9029	; Считать код клавиши
	MA		; Сохранить в RA
	K NOT		; инверсия (0FFh -> 0)
	P X!=0 A5	; если нет нажатия - продолжать опрос
	RMA
	P GOTO A2	; Передать код нажатой клавиши в форму

STRER:	.TEXT "\nОшибка\0"
STREX:	.TEXT "\nВыход из программы\0"

;======= ассоциативная таблица адресов таблиц обработчиков команд
TOBR:	.DB 33	; ввод
	.DA TOBRVVOD

	.DB 32	; выход
	.DA TOBRVYH

	.DB 34	; выбор вправо
	.DA TOBRVYB

	.DB 35	; выбор влево
	.DA TOBRVYB

	.DB 36	; выбор вверх
	.DA TOBRVYB

	.DB 37	; выбор вниз
	.DA TOBRVYB

	.DB END

; Упорядоченные таблицы адресов подпрограмм и адресов таблиц
TOBRVYB: ; Обработка команды Выбор - адреса подпрограмм
	.DA 0		; Не требуется
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA VYBF7
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	.DA 0
	
TOBRVYH: ; Обработка команды Выход - адреса подпрограмм
	.DA 0		; Не требуется
	.DA VVODF1E3	; Выход - для обработки нужно разрешить в форме
	.DA VVODF2E0	; Аналогично команде Ввод
	.DA VVODF3E0
	.DA VVODF4E0
	.DA VVODF5E0
	.DA VVODF6E0
	.DA VVODF7E0
	.DA VVODF8E0
	.DA VVODF9E1	; Отставить выстрел
	.DA VVODF10E0
	.DA VVODF11E0
	.DA VVODF12E0
	.DA VVODF13E0
	.DA 0
	.DA 0
	.DA 0

TOBRVVOD: ; Обработка команды Ввод - адреса таблиц
	.DA TVVODF0
	.DA TVVODF1
	.DA TVVODF2
	.DA TVVODF3
	.DA TVVODF4
	.DA TVVODF5
	.DA TVVODF6
	.DA TVVODF7
	.DA TVVODF8
	.DA TVVODF9
	.DA TVVODF10
	.DA TVVODF11
	.DA TVVODF12
	.DA TVVODF13
	.DA 0
	.DA 0
	.DA 0

; Адреса подпрограмм обработки команды Ввод для каждого элемента формы
TVVODF0:
	.DA VVODF0E0, VVODF0E1, VVODF0E2, VVODF0E3

TVVODF1:
	.DA VVODF1E0, VVODF1E1, VVODF1E2, VVODF1E3
TVVODF2:
	.DA VVODF2E0
TVVODF3:
	.DA VVODF3E0
TVVODF4:
	.DA VVODF4E0
TVVODF5:
	.DA VVODF5E0
TVVODF6:
	.DA VVODF6E0, VVODF6E0, VVODF6E0, VVODF6E0, VVODF6E0	; все одинаковы
TVVODF7:
	.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0	; все одинаковы
	.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0
	.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0
	.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0

TVVODF8:
	.DA VVODF8E0
TVVODF9:
	.DA VVODF9E0, VVODF9E1
TVVODF10:
	.DA VVODF10E0
TVVODF11:
	.DA VVODF11E0
TVVODF12:
	.DA VVODF12E0
TVVODF13:
	.DA VVODF13E0

; Подпрограммы обработки команды Ввод для каждого элемента формы
VVODF0E0:
	; идти влево
	P RM NK0
VVODF0E0A:
	P M NK
	P RM NW
	-
	P X=0 VVODF0E0B ; перейти если координаты не совпали 
	; угодили к Вампусу
	2 MB	; F2E0
	0 MC	
	1 
	RTN	; Выход с перерисовкой

VVODF0E0B:
	P RM NK
	P RM NP1
	-
	P X!=0 VVODF0E0C ; перейти если яма1
	P RM NK
	P RM NP2
	-
	P X=0 VVODF0E0D ; перейти если не яма2
VVODF0E0C:
	; угодили в яму
	3 MB
	0 MC
	1
	RTN

VVODF0E0D:
	P RM NK
	P RM NB1
	-
	P X!=0 VVODF0E0E ; перейти если мыши1
	P RM NK
	P RM NB2
	-
	P X=0 VVODF0E0F ; перейти если не мыши2
VVODF0E0E:
	; угодили к мышам
	4 MB
	0 MC
	1
	RTN

VVODF0E0F:
	P GSB LOCNK
	P GSB PROVNK
	CX MB	; оставить форму 0
	PP RM 9203
	MC	; сохранить направление движения
	1
	RTN

VVODF0E1: ; идти прямо
	P RM NK1
	P GOTO VVODF0E0A

VVODF0E2: ; идти вправо
	P RM NK2
	P GOTO VVODF0E0A

VVODF0E3: ; стрелять
	6 MB	; перейти к F6E0
	0 MC
	1 RTN


VVODF1E0: ; начать игру
	P GSB INIT
VVODF1E0A:
	0 MB
	1 MC
	1 RTN

VVODF1E1: ; повторить
	; восстановить регистры
	6 M0
	.NUMD NK
	M4
	.NUMD NKR
	M5
VVODF1E1A:
	KRM5
	KM4
	PFL0 VVODF1E1A

	P GSB INIT1
	P GOTO VVODF1E0A

VVODF1E2:	; правила
VVODF1E3:	; выход
	1 +/-	
	RTN


VVODF2E0:	; попали к Вампусу
	P GSB FNC	; случайное число 0-4 
	MA
	4 -
	P X=0 VVODF2E0A
	; 4 - Вампус остался в этой же комнате и съел Вас
	5 MB
	0 MC
	1 RTN
VVODF2E0A:
	P RM NW
	1 -
	3 *
	RMA +		; RA=1...3
	.NUMD CAVE	; -1 для диапазона 0...2 учитывается в NUMD
	+
	K PRGM ; считать байт по адресу в RX
	P M NW	; новая комната Вампуса

	P GOTO VVODF0E0B	; перейти к проверкам на ямы и мышей

VVODF3E0:	; упали в яму
VVODF5E0:	; съедены Вампусом
VVODF10E0:	; попали в Вампуса
VVODF11E0:	; попали в себя
VVODF13E0:	; стрелы кончились
	1 MB	; перейти к заставке
	1 MC	; "повторить"
	1 RTN	

VVODF4E0:
	P GSB FNA	; случайное число 1-20
	P GOTO VVODF0E0A ; записать новое значение текущей комнаты
			; и перепроверить полностью

VVODF6E0: PP RM 9203	; номер выбранного элемента
	1 +
	P M ARRJ9	; дальность стрельбы, HtW - J9

	.NUMD STR1
	M4		; адрес STR1-1
	62 KM4		; '>' в строку
	0 KM4		; '\0' в строку

	CX
	P M ARRK	; начало маршрута

	7 MB
	P RM NK		; установить выбор на текущую комнату
	1 -
	MC
	1 RTN

VVODF7E0: 	; маршрут
	P RM ARRK
	2 -
	P X>=0 VVODF7E0A
	; проверить на возврат стрелы
	.NUM ARRP1	; начало массива
	+
	MA
	KRMA		; номер комнаты на шаге -2
	PP RM 9203
	1 +		; номер выбранной комнаты
	-		; (HtW строка 3100)
	P X=0 VVODF7E0A	; перейти на заполнение строки маршрута
	8 MB
	0 MC
	1	; иначе выйти в F8
	RTN
	
VVODF7E0A:

	PP RM 9203	; номер выбранного элемента
	MA
	10 -
	P X<0 VVODF7E0B
	; пункты 0-9
	RMA 3 *
	.NUM F7T1	; в этой строке есть нужные символы
	+
	P GOTO VVODF7E0C
VVODF7E0B:
	; пункты 10-19
	3 *		; до этого RX=RA-10
	.NUM F7T2	; в этой строке есть нужные символы
	+
VVODF7E0C:
	PP M 9042
	RM4 1 - M4	; убрать '\0'

	P RM ARRK
	P X!=0 VVODF7E0D ; для первой комнаты маршрута пропустить
	45
	KM4
VVODF7E0D:
	32		; пробел
	KM4
	PP RM 9044	; первая цифра
	KM4
	PP RM 9044	; вторая цифра
	KM4
	32		; пробел
	KM4
	CX		; '\0'
	KM4

	P RM ARRK
	.NUM ARRP1
	+
	MA
	PP RM 9203
	1 +
	KMA		; занести номер выбранной комнаты в ARRP1...ARRP5

	P RM ARRK
	1 +
	P M ARRK
	P RM ARRJ9
	-
	P X=0 VVODF7E0E
	; последняя комната маршрута
	9 MB		; перейти к F9
	0 MC
	1 RTN

VVODF7E0E:
	7 MB
	PP RM 9203
	MC	; восстановить номер выбранного элемента
	1 RTN

VVODF8E0:	; неверный маршрут
	7 MB	; вернуться в F7
	CX MC
	1 RTN

VVODF9E0:	; стрелять 
	CX		; начать маршрут
	P M ARRK	
	1 
	P M ARRERR	; флаг ошибки маршрута
	P RM ARR	; уменьшить количество стрел
	1 -
	P M ARR
	P X<0 VVODF9E0A1
	; а стрелы кончились
	13 MB
	0 MC
	1 RTN

VVODF9E0A1:
	P RM ARRP1
	MA
	P RM NK0
	MB
	-
	P X!=0 VVODF9E0B
	RMA
	P RM NK1
	MC
	-
	P X!=0 VVODF9E0B
	RMA
	P RM NK2
	MD
	-
	P X!=0 VVODF9E0B
VVODF9E0A:	; нет прохода на первом шаге
	CX
	P M ARRERR	; флаг ошибки маршрута
	P RM NK		; Текущая комната
	3 *
	1 -
	P GSB FNB	; Случайное число от 1 до 3
	+
	.NUM CAVE
	+		; адрес номера случайной соседней комнаты
	P GOTO VVODF9E0C
			
VVODF9E0B:
	P RM ARRK
	.NUM ARRP1
	+
VVODF9E0C:
	MA		; адрес номера комнаты
	KRMA		; номер комнаты
	MA		; записать его в RA
	
	P RM NW		; комната вампуса
	-		; сравнить
	P X=0 VVODF9E0D
	; попали в Вампуса
	10 MB
	0 MC
	1 RTN

VVODF9E0D:
	RMA		
	P RM NK		; наша комната
	-		
	P X=0 VVODF9E0E
	; попали в себя
	11 MB
	0 MC
	1 RTN

VVODF9E0E:
	RMA
	3 *
	.NUM CAVE
	+
	PP M 9042
	PP RM 9044
	MB		; соседняя комната слева
	PP RM 9044
	MC		; соседняя комната прямо
	PP RM 9044
	MD		; соседняя комната справа
	
	P RM ARRK	; следующий шаг
	1 +
	P M ARRK
	P RM ARRJ9
	-
	P X=0 VVODF9E0F
	; конец маршрута - промах
	12 MB
	0 MC
	1 RTN	

VVODF9E0F:
	; проверить следующую комнату маршрута
	P RM ARRK
	MA RMB -
	P X=0 VVODF9E0B	; допустимое значение - маршрут влево
	RMA RMC -
	P X=0 VVODF9E0B	; допустимое значение - маршрут прямо
	RMA RMD - 
	P X=0 VVODF9E0B	; допустимое значение - маршрут направо
	; неверный маршрут - выбрать одну из соседних комнат
	CX
	P M ARRERR	; флаг ошибки маршрута

	P GSB FNB	; случайное число от 1 до 3
	10 +		; номера соседних комнат лежат в RB...RD
	P GOTO VVODF9E0C	; загрузить
	

VVODF9E1:	; отставить выстрел
	P GSB LOCNK
	P GSB PROVNK

	0 MB	; вернуться в F0
	3 MC	; к пункту стрелять
	1 RTN

VVODF12E0:	; промах
	; Разбудили Вампуса
	P GSB FNC	; случайное число 0-4 
	MA
	4 -
	P X!=0 VVODF9E1	; 4 - Вампус остался в той же комнате
	P RM NW
	1 -
	3 *
	RMA +		; RA=1...3
	.NUMD CAVE	; -1 для диапазона 0...2 учитывается в NUMD
	+
	K PRGM ; считать байт по адресу в RX
	P M NW	; новая комната Вампуса
	P RM NK ; проверить не пришёл ли он к Вам
	-
	P X=0 VVODF9E1 ; если нет - перейти к F0
	; Если да - он Вас съел
	5 MB
	0 MC
	1 RTN

; Подпрограммы обработки для команды Выбор
VYBF7:	; В форме F7 много элементов
	; и перемещение между ними можно сделать более рациональным
	.NUM TVYBF7
	PP M 9042

	PP RM 9208	; код команды
	PP M 9213	; считать адрес из ассоциативной таблицы
	P X>=0 VYB7B	; этой ошибки в отлаженной программе быть не может, но...
	PP RM 9203	; номер активного элемента
	+		; получить смещение в выбранной по коду таблице
	K PRGM		; считать байт из памяти программ по адресу RX
VYB7A:
	MC		; новый номер элемента
	7 MB		; форма 7 - она не изменяется
	1 RTN		; перерисовать
VYB7B:	PP RM 9203	; при ошибке восстановить номер элемента
	P GOTO VYB7A	
	
TVYBF7:
	.DB 34		; вправо
	.DA TVYBF7R
	.DB 35		; влево
	.DA TVYBF7L
	.DB 36		; вверх
	.DA TVYBF7U
	.DB 37		; вниз
	.DA TVYBF7D
	.DB END

TVYBF7L: .DB 19,0	; далее эти таблицы пересекаются
TVYBF7R: .DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0

TVYBF7U: ; поскольку в форме две строки 
TVYBF7D: ; таблицы переходов вверх и вниз одинаковы
 	 .DB 10,11,12,13,14,15,16,17,18,19
	 .DB 0,1,2,3,4,5,6,7,8,9


;========= Таблица переходов по пещере
CAVE:	; HtW - массив S(J,K) - строки 0068-0160
	.DB	2,5,8, 1,3,10, 2,4,12, 3,5,14, 1,4,6
	.DB	5,7,15, 6,8,17, 1,7,9, 8,10,18, 2,9,11
	.DB	10,12,19, 3,11,13, 12,14,20, 4,13,15, 6,14,16
	.DB	15,17,20, 7,16,18, 9,17,19, 11,18,20, 13,16,19

;========= Возврат псевдослучайных значений
FNA:	; от 1 до 20 (HtW строка 0170)
	20 
FNA1:	KRAN
	*
	K INT
	1 +
	RTN

FNB:	; от 1 до 3 (HtW строка 0180)
	3
	P GOTO FNA1 
FNC:	; от 1 до 4 (HtW строка 0190)
	4
	P GOTO FNA1

;========= Начальное заполнение 
LOC:	; HtW 0200-0270
	6 M0
	.NUMD NK	; аналог HtW L()
	M4
LOC1:	P GSB FNA	; случайное число от 1 до 20
	KM4		; записать в переменную
	PFL0 LOC1	; цикл по R0

LOC2:	; проверка пересечений
	; использован алгоритм без избыточных проверок (по сравнению с HtW)
	5 M0
	.NUMT NB2	; номер регистра NB2 (последнего в массиве)
	MA		; в RA
LOC3:
	RM0 M1
	.NUMD NK	; номер регистра NK-1
	M4		; в R4
	
LOC4:	KRMA
	KRM4
	-
	P X!=0 LOC	; если значения равны - повторить заполнение	
			; (см. HtW строка 0320)
	PFL1 LOC4	; цикл по R1

	RMA 1 - MA	; декремент RA
	PFL0 LOC3	; цикл по R0

	; перенести данные в энергонезависимую память для повтора игры
	6 M0
	.NUMD NK	; аналог HtW L()
	M4
	.NUMD NKR	; аналог HtW M()
	M5
LOC5:	1 PP M 9047	; 1- запись в энергонезависимую память
	KRM4
	KM5		; эти данные записаны в энергонезависимую память
	PFL0 LOC5	; цикл по R0

	RTN

;======= 
LOCNK:
	
	P RM NK		; номер текущей комнаты 1-20
	1 -
	3 *
	.NUM CAVE
	+
	PP M 9042

	PP RM 9044
	P M NK0		; номер комнаты влево
	PP RM 9044
	P M NK1		; номер комнаты прямо
	PP RM 9044
	P M NK2		; номер комнаты направо
	RTN	


;======== Перенос строки из памяти программ R9042 в [R4+1]
STRCPY:	PP RM 9044
	KM4
	P X=0 STRCPY	; если не 0 - продолжить копирование
	RTN

;======== Перенос из памяти программ в строки STR1...STR3 
;	последовательно, с заполнением флагов FSTR1...FSTR3
STRXCPY:	
	P RM FSTR1	; проверка строки 1
	P X!=0 STRXCPY1 ; есть строка - перейти
	CX		
	P M FSTR1	; обнулить флаг FSTR1
	.NUMD STR1
	M4		; адрес в R4
	P GOTO STRCPY
STRXCPY1:
	P RM FSTR2	; проверка строки 2
	P X!=0 STRXCPY2 ; есть строка - перейти
	CX		
	P M FSTR2	; обнулить флаг FSTR2
	.NUMD STR2
	M4		; адрес в R4
	P GOTO STRCPY
STRXCPY2:
	P RM FSTR3	; проверка строки 1
	P X!=0 STRXCPY3 ; есть строка - перейти
	CX		
	P M FSTR3	; обнулить флаг FSTR3
	.NUMD STR3
	M4		; адрес в R4
	P GOTO STRCPY
STRXCPY3:
	; превышено количество строк - выйти из п/п
	RTN

;========= Проверка условий и заполнение строк сообщений
; временные переменные 
; RA=NK0
; RB=NK1
; RC=NK2
; RD - сравниваемое значение: NW,NP1,NP2,NB1,NB2

PROVNK:
	1
	P M FSTR1	; нет строки STR1
	P M FSTR2	; нет строки STR2
	P M FSTR3	; нет строки STR3

	; проверка в цикле с оператором выбора (HtW строки 2000-2120)
	; заменена прямыми сравнениями - для ЯМК это оптимальнее
	; Для экономии памяти перепишем данные в регистры RA-RC
	P RM NK2
	MC
	P RM NK1
	MB
	P RM NK0
	MA
	; проверка соседства с Вампусом
	P RM NW
	MD -
	P X!=0 PROVNK3
	RMB RMD -
	P X!=0 PROVNK3
	RMC RMD -
	P X!=0 PROVNK3

	; проверка соседства с ямой
PROVNK1:
	RMA
	P RM NP1	; яма1
	MD -
	P X!=0 PROVNK4
	RMB RMD -
	P X!=0 PROVNK4
	RMC RMD -
	P X!=0 PROVNK4
	
	RMA
	P RM NP2	; яма2
	MD -
	P X!=0 PROVNK4
	RMB RMD -
	P X!=0 PROVNK4
	RMC RMD -
	P X!=0 PROVNK4
	
PROVNK2:	; проверка соседства с мышами
	RMA
	P RM NB1	; мыши1
	MD -
	P X!=0 PROVNK5
	RMB RMD -
	P X!=0 PROVNK5
	RMC RMD -
	P X!=0 PROVNK5
	
	RMA
	P RM NB2	; мыши2
	MD -
	P X!=0 PROVNK5
	RMB RMD -
	P X!=0 PROVNK5
	RMC RMD -
	P X!=0 PROVNK5
	RTN	

PROVNK3:	; Записать строку про Вампуса
	.NUM TXT1	
	PP M 9042	 
	P GSB STRXCPY	; записать первую строку
	P GOTO PROVNK1	; продолжить проверки других условий

PROVNK4:	; Записать строку про сквозняк
	.NUM TXT2	
	PP M 9042	 
	P GSB STRXCPY	; записать очередную (1 или 2) строку
	P GOTO PROVNK2	; продолжить проверки других условий

PROVNK5:	; Записать строку про мышей
	.NUM TXT3	
	PP M 9042	 
	P GSB STRXCPY	; записать последнюю (1, 2 или 3) строку
	; оператор перехода не требуется
	RTN


;========= Инициализация
INIT:	P GSB LOC	; начальная инициализация лабиринта
INIT1:	
	5
	P M ARR		; количество стрел (HtW строка 0360)
	P GSB LOCNK	; заполнить номера смежных комнат
	P GSB PROVNK	; заполнить строки STR1...STR2

	RTN


;========= Сообщения
TXT1:	.TEXT	"Ощущается запах Вампуса\0"
TXT2:	.TEXT	"Чувствуется сквозняк\0"
TXT3:	.TEXT	"Летучие мыши поблизости\0"


;===== Главная таблица форм
TFORM:
	.DB 0	; текущая комната пещеры
	.DA F0	; адрес начала формы 0

	.DB 1	; заставка
	.DA F1	; адрес начала формы 1

	.DB 2	; у Вампуса
	.DA F2	; адрес начала формы 1

	.DB 3	; в яме
	.DA F3	; 

	.DB 4	; у мышей
	.DA F4	; 

	.DB 5	; съеден Вампусом
	.DA F5	; 

	.DB 6	; дальность стрельбы
	.DA F6	; 

	.DB 7	; маршрут стрелы
	.DA F7	; 

	.DB 8	; возврат стрелы
	.DA F8	; 

	.DB 9	; выстрел
	.DA F9	; 

	.DB 10	; попали в Вампуса
	.DA F10	; 

	.DB 11	; попали в себя
	.DA F11	; 

	.DB 12	; промах
	.DA F12	; 

	.DB 13	; стрелы закончились
	.DA F13	; 

	.DB 14	; правила 1
	.DA F14	; 

	.DB 15	; правила 2
	.DA F15	; 

	.DB 16	; правила 3
	.DA F16	; 

	.DB END	; конец таблицы

;===== Форма 0 - Текущая комната пещеры
	; (вывод местонахождения в HtW - строки 2130-2160)

	.BASE		; смещения в таблицах и переходах указываются относительно начала формы
F0:	; Заголовок формы
	.DB 3		; максимальный номер элемента 3 (всего их 4, считая нулевой)
	.DBB F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM ; таблица смещений
	; Примечание: расположение остальных полей структуры в пределах формы 
	; может быть произвольным

F0DE:	;таблица флагов действий
	.DB 29,29,29,29
	; В двоичном виде  это 00 01 11 01 - установлены флаги "выход, ввод с обработкой, выбор" 
				 
F0PI:	.DB 0,0,0,1,0,2,0,3

F0PO:	.DB 1,1,1,1,1,1,1,1

F0PL:	; Таблица переходов по команде "Выбор влево"
	.DB 3,0,1,2

F0PR:	; Таблица переходов по команде "Выбор вправо" 
	.DB 1,2,3,0

F0RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB TAB, 2, 12
	.DB DRAWP, 0
	.DA IFON

	.DB TAB, 2, 0
	.DB TXTP, 16
	.DA F0T1

	.DB TAB, 38, 0
	.DB PREXP, 16
	.DA NK

	.DB TAB, 22, 8
	.DB PREXP, 16
	.DA NK0

	.DB TAB, 63, 7
	.DB PREXP, 16
	.DA NK1

	.DB TAB, 103, 6
	.DB PREXP, 16
	.DA NK2

	.DB JNEZ
	.DA FSTR1	; если FSTR1==0 вывести строку STR1
	.DBB F0RI1
	.DB TAB, 0, 42
	.DB TXTB, 16
	.DA STR1
	
F0RI1:	.DB JNEZ
	.DA FSTR2	; если FSTR2==0 вывести строку STR2
	.DBB F0RI2
	.DB TAB, 0, 49
	.DB TXTB, 16
	.DA STR2

F0RI2:	.DB JNEZ
	.DA FSTR3	; если FSTR3==0 вывести строку STR3
	.DBB F0RI3
	.DB TAB, 0, 56
	.DB TXTB, 16
	.DA STR3

F0RI3:	.DB END			; конец основной программы

F0KM:	; Таблица смещений программ элементов команды
	; Эти программы выполняются после основной программы формы
	; и указывают на точку входа для активного элемента
	.DBB F0KM0, F0KM1, F0KM2, F0KM3

F0KM0:	; идти влево
	.DB TAB, 22, 24
	.DB DRAWP, 0
	.DA IS0
	.DB END

F0KM1:	; идти прямо
	.DB TAB, 63, 22
	.DB DRAWP, 0
	.DA IS1
	.DB END

F0KM2:	; идти вправо
	.DB TAB, 102, 24
	.DB DRAWP, 0
	.DA IS2
	.DB END

F0KM3:	; стрелять
	.DB TAB, 0, 35
	.DB TXTP, 16
	.DA F0T2

	.DB TAB, 96, 35
	.DB PREXP, 16
	.DA ARR		; вывести количество стрел

	.DB END


F0T1:	.TEXT "Комната\0"
F0T2:	.TEXT "Стрелять, запас стрел -\0"


;===== Форма 1 - Заставка
	.BASE		
F1:	; Заголовок формы
	.DB 3		; максимальный номер элемента
	.DBB F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM ; таблица смещений

F1DE:	;таблица флагов действий
	.DB 13,13,5,13	; 13=001101, 5=000101
			; Для элемента 2 - обычный ввод, без обработки
			; Выход запрещён
F1PI:	
F1PO:	.DB 0,1,0,1,14,0,0,1 

F1PL:	; Таблица переходов по команде "Выбор влево"
	.DB 3,0,1,2
F1PR:	; Таблица переходов по команде "Выбор вправо"
	.DB 1,2,3,0

F1RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB TAB, 0, 0
	.DB DRAWP, 0
	.DA IWUMPUS

	.DB TAB, 40, 0
	.DB TXTP, 16
	.DA F1T0

	.DB TAB, 54, 10
	.DB TXTP, 16
	.DA F1T1

	.DB TAB, 54, 16
	.DB TXTP, 16
	.DA F1T2

	.DB TAB, 54, 22
	.DB TXTP, 16
	.DA F1T3

	.DB TAB, 54, 28
	.DB TXTP, 16
	.DA F1T4

	.DB TAB, 79, 35
	.DB TXTP, 16
	.DA F1T5

	.DB TAB, 72, 42
	.DB TXTP, 16
	.DA F1T6

	.DB TAB, 76, 49
	.DB TXTP, 16
	.DA F1T7

	.DB TAB, 78, 56
	.DB TXTP, 16
	.DA F1T8

	.DB END			; конец основной программы

F1KM:	; Таблица смещений программ элементов команды
	; Эти программы выполняются после основной программы формы
	; и указывают на точку входа для активного элемента
	.DBB F1KM0, F1KM1, F1KM2, F1KM3

F1KM0:	.DB TAB, 56,34
	.DB JM
	.DBB F1KME

F1KM1:	.DB TAB, 56,41
	.DB JM
	.DBB F1KME

F1KM2:	.DB TAB, 56,48
	.DB JM
	.DBB F1KME

F1KM3:	.DB TAB, 56,55


F1KME:	.DB SQU, 3, 70, 7
	.DB END

F1T0:	.TEXT "Охота на Вампуса v1.1\0"
F1T1:	.TEXT "по мотивам игры\0"
F1T2:	.DB 34		; кавычки
	.TEXT "Hunt the Wumpus"
	.DB 34,0	; кавычки и конец строки
F1T3:	.TEXT "(1972 г.), автор -\0"
F1T4:	.TEXT "Gregory Yob\0"
F1T5:	.TEXT "Начать\0"
F1T6:	.TEXT "Повторить\0"
F1T7:	.TEXT "Правила\0"
F1T8:	.TEXT "Выход\0"

;===== Форма 2 - В гостях у Вампуса (HtW строка 4160)
	.BASE		
F2:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM ; таблица смещений

F2DE:	;таблица флагов действий
	.DB 60	; 00111100 ввод и выход с обработкой
				 
F2PI:	
F2PO:	.DB 1,0

F2PL:		
F2PR:	.DB 0

F2RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB LCALL
	.DA FSIWUM1

	.DB TAB, 70, 20
	.DB TXTP, 16
	.DA F2T0

	.DB TAB, 10, 40
	.DB TXTP, 16
	.DA F2T1

	.DB END			; конец основной программы

F2KM:	.DBB F2KM0

F2KM0:	.DB END

F2T0:	.TEXT "...ОПА!\0"
F2T1:	.TEXT "Вы наткнулись на Вампуса!\0"

;======= Форма 3 - Яма (HtW строка 4230)
	.BASE		
F3:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM ; таблица смещений

F3DE:	;таблица флагов действий
	.DB 188	; 10111100 ввод и выход с обработкой, без очистки
				 
F3PI:	
F3PO:	.DB 1,0

F3PL:		
F3PR:	.DB 0

F3RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB TAB, 36, 0
	.DB SQU, 4,20,7		; очистить номер комнаты

	.DB TAB, 38, 0
	.DB PREXP, 16		; перерисовать номер комнаты
	.DA NK

	.DB LCALL
	.DA FSFRAME

	.DB TAB, 6, 9
	.DB DRAWP, 0
	.DA IPIT

	.DB TAB, 64, 20
	.DB TXTP, 16
	.DA F3T0

	.DB TAB, 52, 40
	.DB TXTP, 16
	.DA F3T1

	.DB END			; конец основной программы

F3KM:	.DBB F3KM0

F3KM0:	.DB END

F3T0:	.TEXT "А-А-А-А....\0"
F3T1:	.TEXT "Вы упали в яму\0"

;======= Форма 4 - Мыши (HtW строка 4280)
	.BASE		
F4:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F4DE, F4PI, F4PO, F4PL, F4PR, F4RI, F4KM ; таблица смещений

F4DE:	;таблица флагов действий
	.DB 188	; 188=10111100 ввод и выход с обработкой, без очистки
				 
F4PI:	
F4PO:	.DB 1,0

F4PL:		
F4PR:	.DB 0

F4RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB TAB, 36, 0
	.DB SQU, 4,20,7		; очистить номер комнаты

	.DB TAB, 38, 0
	.DB PREXP, 16		; перерисовать номер комнаты
	.DA NK

	.DB LCALL
	.DA FSFRAME

	.DB TAB, 6, 9
	.DB DRAWP, 0
	.DA IBAT

	.DB TAB, 64, 12
	.DB TXTP, 16
	.DA F4T0

	.DB TAB, 64, 20
	.DB TXTP, 16
	.DA F4T1

	.DB TAB, 18, 32
	.DB TXTP, 16
	.DA F4T2

	.DB TAB, 18, 40
	.DB TXTP, 16
	.DA F4T3

	.DB TAB, 32, 48
	.DB TXTP, 16
	.DA F4T4

	.DB END			; конец основной программы

F4KM:	.DBB F4KM0

F4KM0:	.DB END

F4T0:	.TEXT "ЦАП!\0"
F4T1:   .TEXT "Вас схватили\0"
F4T2:	.TEXT "гигантские летучие мыши\0"
F4T3:	.TEXT "и затащили\0"
F4T4:	.TEXT "непонятно куда\0"

;======= Форма 5 - Схватил Вампус (HtW строка 3420)
	.BASE		
F5:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F5DE, F5PI, F5PO, F5PL, F5PR, F5RI, F5KM ; таблица смещений

F5DE:	;таблица флагов действий
	.DB 60	; 00111100 ввод и выход с обработкой
				 
F5PI:	
F5PO:	.DB 1,0

F5PL:		
F5PR:	.DB 0

F5RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB LCALL
	.DA FSIMM

	.DB TAB, 40, 20
	.DB TXTP, 16
	.DA F5T0

	.DB TAB, 30, 30
	.DB TXTP, 16
	.DA F5T1

	.DB TAB, 20, 40
	.DB TXTP, 16
	.DA F5T2

	.DB END			; конец основной программы

F5KM:	.DBB F5KM0

F5KM0:	.DB END

F5T0:	.TEXT "ШМЯК-ШМЯК...\0"
F5T1:	.TEXT "НЯМ-НЯМ-НЯМ...\0"
F5T2:	.TEXT "Вампус Вас поймал!\0"

;======= Форма 6 - дальность полёта стрелы (HtW строки 3040-3060)
	.BASE		
F6:	; Заголовок формы
	.DB 4		; максимальный номер элемента
	.DBB F6DE, F6PI, F6PO, F6PL, F6PR, F6RI, F6KM ; таблица смещений

F6DE:	;таблица флагов действий
	.DB 189,189,189,189,189	; 10111101 выбор, ввод и выход с обработкой, без очистки
				 
F6PI:	
F6PO:	.DB 1,0,1,0,1,0,1,0,1,0

F6PL:	.DB 0,0,1,2,3	; нет цикла: из 0 в 0
F6PR:	.DB 1,2,3,4,4	; нет цикла: из 4 в 4

F6RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB TAB, 12, 10
	.DB TXTP, 16
	.DA F6T0

	.DB END			; конец основной программы

F6KM:	.DBB F6KM0, F6KM1, F6KM2, F6KM3, F6KM4


F6KM0:	.DB MCALL
	.DBB F6S0
	.DB TAB, 40, 44
	.DB TXTP, 16
	.DA F6T1	
	.DB END

F6KM1:	.DB MCALL
	.DBB F6S1
	.DB TAB, 40, 44
	.DB TXTP, 16
	.DA F6T2	
	.DB END

F6KM2:	.DB MCALL
	.DBB F6S2
	.DB TAB, 40, 44
	.DB TXTP, 16
	.DA F6T3	
	.DB END

F6KM3:	.DB MCALL
	.DBB F6S3
	.DB TAB, 40, 44
	.DB TXTP, 16
	.DA F6T4	
	.DB END

F6KM4:	.DB MCALL
	.DBB F6S4
	.DB TAB, 40, 44
	.DB TXTP, 16
	.DA F6T5	
	.DB END

F6S4:	.DB TAB, 80,20
	.DB SQU, 0,8,20 
F6S3:	.DB TAB, 70,20
	.DB SQU, 0,8,20 
F6S2:	.DB TAB, 60,20
	.DB SQU, 0,8,20 
F6S1:	.DB TAB, 50,20
	.DB SQU, 0,8,20 
F6S0:	.DB TAB, 40,20
	.DB SQU, 0,8,20 
	.DB RETUM


F6T0:	.TEXT "Дальность полёта стрелы\0"
F6T1:	.TEXT "Одна комната\0"
F6T2:	.TEXT "Две комнаты\0"
F6T3:	.TEXT "Три комнаты\0"
F6T4:	.TEXT "Четыре комнаты\0"
F6T5:	.TEXT "Пять комнат\0"

;======= Форма 7 - маршрут стрелы (HtW строки 3027-3115)
	.BASE		
F7:	; Заголовок формы
	.DB 19		; максимальный номер элемента
	.DBB F7DE, F7PI, F7PO, F7PL, F7PR, F7RI, F7KM ; таблица смещений

F7DE:	;таблица флагов действий - обязательна
	.DB 191,191,191,191,191	; 10111111 выбор, ввод и выход с обработкой, без очистки
	.DB 191,191,191,191,191
	.DB 191,191,191,191,191
	.DB 191,191,191,191,191
				 
F7PI:	; Таблицы отсутствуют для уменьшения размеров формы
F7PO:	; Поскольку обработка всех команд  
F7PL:	; выполняется отдельно (см. флаги действий)
F7PR:	; С тем же успехом можно было указать смещение 0 в заголовке

F7RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB TAB, 36, 10
	.DB TXTP, 16
	.DA F7T0

	.DB TAB, 10, 20
	.DB TXTB, 16
	.DA STR1

	.DB TAB, 10, 34
	.DB TXTP, 16
	.DA F7T1

	.DB TAB, 10, 44
	.DB TXTP, 16
	.DA F7T2
	
	.DB END			; конец основной программы

F7KM:	.DBB F7KM0, F7KM1, F7KM2, F7KM3, F7KM4
	.DBB F7KM5, F7KM6, F7KM7, F7KM8, F7KM9
	.DBB F7KM10, F7KM11, F7KM12, F7KM13, F7KM14
	.DBB F7KM15, F7KM16, F7KM17, F7KM18, F7KM19


F7KM0:	.DB TAB, 9, 33
	.DB JM
	.DBB F7KME

F7KM1:	.DB TAB, 20, 33
	.DB JM
	.DBB F7KME

F7KM2:	.DB TAB, 31, 33
	.DB JM
	.DBB F7KME

F7KM3:	.DB TAB, 42, 33
	.DB JM
	.DBB F7KME

F7KM4:	.DB TAB, 53, 33
	.DB JM
	.DBB F7KME

F7KM5:	.DB TAB, 64, 33
	.DB JM
	.DBB F7KME

F7KM6:	.DB TAB, 75, 33
	.DB JM
	.DBB F7KME

F7KM7:	.DB TAB, 86, 33
	.DB JM
	.DBB F7KME

F7KM8:	.DB TAB, 97, 33
	.DB JM
	.DBB F7KME

F7KM9:	.DB TAB, 108, 33
	.DB JM
	.DBB F7KME

F7KM10:.DB TAB, 9, 43
	.DB JM
	.DBB F7KME

F7KM11:	.DB TAB, 20, 43
	.DB JM
	.DBB F7KME

F7KM12:	.DB TAB, 31, 43
	.DB JM
	.DBB F7KME

F7KM13:	.DB TAB, 42, 43
	.DB JM
	.DBB F7KME

F7KM14:	.DB TAB, 53, 43
	.DB JM
	.DBB F7KME

F7KM15:	.DB TAB, 64, 43
	.DB JM
	.DBB F7KME

F7KM16:	.DB TAB, 75, 43
	.DB JM
	.DBB F7KME

F7KM17:	.DB TAB, 86, 43
	.DB JM
	.DBB F7KME

F7KM18:	.DB TAB, 97, 43
	.DB JM
	.DBB F7KME

F7KM19:	.DB TAB, 108, 43

F7KME:	.DB SQU, 3,9,7
	.DB END

F7T0:	.TEXT "Маршрут стрелы\0"
F7T1:	; строка от 1 до 10 с пробелами шириной в цифру
	.DB 31,49,32,31,50,32,31,51,32,31,52,32,31,53,32	
	.DB 31,54,32,31,55,32,31,56,32,31,57,32,49,48,0
F7T2:	.TEXT "11 12 13 14 15 16 17 18 19 20\0"


;======= Форма 8 - Возврат стрелы недопустим (HtW строка 3105)
	.BASE		
F8:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F8DE, F8PI, F8PO, F8PL, F8PR, F8RI, F8KM ; таблица смещений

F8DE:	;таблица флагов действий
	.DB 188	; 10111100 ввод и выход с обработкой, без очистки
				 
F8PI:	
F8PO:	.DB 1,0

F8PL:		
F8PR:	.DB 0

F8RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB TAB, 5,26		; рамка меньшего размера
	.DB SQU, 4,118,30	; атрибут 4 = NOT (белый прямоугольник)
	.DB TAB, 6,27
	.DB FRAME, 0,116,28	; атрибут 0 - замена (рамка)

	.DB TAB, 8, 30
	.DB TXTP, 16
	.DA F8T0

	.DB TAB, 8, 38
	.DB TXTP, 16
	.DA F8T1

	.DB END			; конец основной программы

F8KM:	.DBB F8KM0

F8KM0:	.DB END

F8T0:	.TEXT "Так стрелы не летают\0"
F8T1:	.TEXT "Измените маршрут\0"

;======= Форма 9 - Выстрел
	.BASE		
F9:	; Заголовок формы
	.DB 1		; максимальный номер элемента
	.DBB F9DE, F9PI, F9PO, F9PL, F9PR, F9RI, F9KM ; таблица смещений

F9DE:	;таблица флагов действий
	.DB 189,189	; 10111101 выбор,ввод и выход с обработкой, без очистки
				 
F9PI:	
F9PO:	.DB 1,0,1,0

F9PL:		
F9PR:	.DB 1,0

F9RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB TAB, 6, 10
	.DB TXTP, 16
	.DA F9T0

	.DB TAB, 6, 20
	.DB TXTB, 16
	.DA STR1		; маршрут

	.DB TAB, 6, 30
	.DB TXTP, 16
	.DA F9T1

	.DB TAB, 56, 30
	.DB PREXP, 16
	.DA ARR

	.DB TAB, 47, 40
	.DB TXTP, 16
	.DA F9T2

	.DB TAB, 44, 48
	.DB TXTP, 16
	.DA F9T3

	.DB END			; конец основной программы

F9KM:	.DBB F9KM0,F9KM1

F9KM0:	.DB TAB, 26, 39
	.DB JM
	.DBB F9KME
F9KM1:	.DB TAB, 26, 47
F9KME:	.DB SQU, 3, 76, 7	
	.DB END

F9T0:	.TEXT "Маршрут:\0"
F9T1:	.TEXT "Запас стрел:\0"
F9T2:	.TEXT "Стрелять\0"
F9T3:	.TEXT "Отставить\0"

;======= Форма 10 - Попали в Вампуса (HtW строка 3310)
	.BASE		
F10:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F10DE, F10PI, F10PO, F10PL, F10PR, F10RI, F10KM ; таблица смещений

F10DE:	;таблица флагов действий
	.DB 60	; 00111100 ввод и выход с обработкой
				 
F10PI:	
F10PO:	.DB 1,0

F10PL:		
F10PR:	.DB 0

F10RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB LCALL
	.DA FSIWUM1

	.DB JNEZ
	.DA ARRERR
	.DBB F10RI1

	.DB TAB, 40, 20
	.DB TXTP, 16
	.DA F10T2
F10RI1:
	.DB TAB, 60, 30
	.DB TXTP, 16
	.DA F10T0

	.DB TAB, 10, 40
	.DB TXTP, 16
	.DA F10T1

	.DB END			; конец основной программы

F10KM:	.DBB F10KM0

F10KM0:	.DB END

F10T0:	.TEXT "ТАК ТОЧНО!\0"
F10T1:	.TEXT "Вы пристрелили Вампуса!\0"
F10T2:	.TEXT "Ошибка маршрута\0"

;======= Форма 11 - Попали в себя (HtW строка 3350)
	.BASE		
F11:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F11DE, F11PI, F11PO, F11PL, F11PR, F11RI, F11KM ; таблица смещений

F11DE:	;таблица флагов действий
	.DB 60	; 00111100 ввод и выход с обработкой
				 
F11PI:	
F11PO:	.DB 1,0

F11PL:		
F11PR:	.DB 0

F11RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB LCALL
	.DA FSIMM

	.DB JNEZ
	.DA ARRERR
	.DBB F11RI1

	.DB TAB, 40, 20
	.DB TXTP, 16
	.DA F10T2
F11RI1:

	.DB TAB, 60, 30
	.DB TXTP, 16
	.DA F11T0

	.DB TAB, 10, 40
	.DB TXTP, 16
	.DA F11T1

	.DB END			; конец основной программы

F11KM:	.DBB F11KM0

F11KM0:	.DB END

F11T0:	.TEXT "ОХ!\0"
F11T1:	.TEXT "Стрела попала в Вас\0"

;======= Форма 12 - Промах (HtW строка 3220)
	.BASE		
F12:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F12DE, F12PI, F12PO, F12PL, F12PR, F12RI, F12KM ; таблица смещений

F12DE:	;таблица флагов действий
	.DB 60	; 00111100 ввод и выход с обработкой
				 
F12PI:	
F12PO:	.DB 1,0

F12PL:		
F12PR:	.DB 0

F12RI:	; основная программа экранной формы 
	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB LCALL
	.DA FSIWUM1

	.DB JNEZ
	.DA ARRERR
	.DBB F12RI1

	.DB TAB, 40, 20
	.DB TXTP, 16
	.DA F10T2
F12RI1:
	.DB TAB, 60, 30
	.DB TXTP, 16
	.DA F12T0

	.DB TAB, 10, 40
	.DB TXTP, 16
	.DA F12T1

	.DB END			; конец основной программы

F12KM:	.DBB F12KM0

F12KM0:	.DB END

F12T0:	.TEXT "Промах...\0"
F12T1:	.TEXT "Вампус проснулся\0"

;======= Форма 13 - Нет стрел 
	.BASE		
F13:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F13DE, F13PI, F13PO, F13PL, F13PR, F13RI, F13KM ; таблица смещений

F13DE:	;таблица флагов действий
	.DB 60	; 00111100 ввод и выход с обработкой
				 
F13PI:	
F13PO:	.DB 1,0

F13PL:		
F13PR:	.DB 0

F13RI:	; основная программа экранной формы 

	.DB LCALL
	.DA FSFONT

	.DB LCALL
	.DA FSFRAME

	.DB LCALL
	.DA FSIMM

	.DB TAB, 6, 30
	.DB TXTP, 16
	.DA F13T0

	.DB TAB, 6, 40
	.DB TXTP, 16
	.DA F13T1

	.DB END			; конец основной программы

F13KM:	.DBB F13KM0

F13KM0:	.DB END

F13T0:	.TEXT "А нечем стрелять\0"
F13T1:	.TEXT "Стрелы закончились\0"

;======= Форма 14 - Правила 1
	.BASE		
F14:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F14DE, F14PI, F14PO, F14PL, F14PR, F14RI, F14KM ; таблица смещений

F14DE:	;таблица флагов действий
	.DB 20	; 00010100 разрешён ввод и выход
				 
F14PI:	.DB 15,0 ; Ввод - F15E0
F14PO:	.DB 1,2	; Выход - перейти в F1E2 обычным образом

F14PL:		
F14PR:	.DB 0

F14RI:	; основная программа экранной формы 
	.DB TAB, 0,2
	.DB TXTP, 16
	.DA F14T0

	.DB TAB, 0,8
	.DB TXTP, 16
	.DA F14T1

	.DB TAB, 0,14
	.DB TXTP, 16
	.DA F14T2

	.DB TAB, 0,20
	.DB TXTP, 16
	.DA F14T3

	.DB TAB, 0,26
	.DB TXTP, 16
	.DA F14T4

	.DB TAB, 0,32
	.DB TXTP, 16
	.DA F14T5

	.DB TAB, 0,38
	.DB TXTP, 16
	.DA F14T6

	.DB TAB, 0,44
	.DB TXTP, 16
	.DA F14T7

	.DB TAB, 0,50
	.DB TXTP, 16
	.DA F14T8

	.DB TAB, 0,56
	.DB TXTP, 16
	.DA F14T9

	.DB END			; конец основной программы

F14KM:	.DBB F14KM0

F14KM0:	.DB END

F14T0:	.TEXT "Вампус - монстр, обитающий в\0"
F14T1:	.TEXT "пещерах. Питается людьми.\0"
F14T2:	.TEXT "Изрядно воняет, большую часть\0"
F14T3:	.TEXT "времени проводит в спячке.\0"

F14T4:	.TEXT "Цель игры - пристрелить его.\0"
F14T5:	.TEXT "Но в запасе всего пять стрел.\0"

F14T6:	.TEXT "В пещере есть опасные ямы.\0"
F14T7:	.TEXT "Из которых дует сквозняк.\0"

F14T8:	.TEXT "Есть и летучие мыши,\0"
F14T9:	.TEXT "которые могут утащить Вас.\0" 

;======= Форма 15 - Правила 2
	.BASE		
F15:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F15DE, F15PI, F15PO, F15PL, F15PR, F15RI, F15KM ; таблица смещений

F15DE:	;таблица флагов действий
	.DB 20	; 00010100 разрешён ввод и выход
				 
F15PI:	.DB 16,0 ; Ввод - F16E0
F15PO:	.DB 1,2	; Выход - перейти в F1E2 обычным образом

F15PL:		
F15PR:	.DB 0

F15RI:	; основная программа экранной формы 
	.DB TAB, 0,2
	.DB TXTP, 16
	.DA F15T0

	.DB TAB, 0,8
	.DB TXTP, 16
	.DA F15T1

	.DB TAB, 0,14
	.DB TXTP, 16
	.DA F15T2

	.DB TAB, 0,20
	.DB TXTP, 16
	.DA F15T3

	.DB TAB, 0,26
	.DB TXTP, 16
	.DA F15T4

	.DB TAB, 0,32
	.DB TXTP, 16
	.DA F15T5

	.DB TAB, 0,38
	.DB TXTP, 16
	.DA F15T6

	.DB TAB, 0,44
	.DB TXTP, 16
	.DA F15T7

	.DB TAB, 0,50
	.DB TXTP, 16
	.DA F15T8

	.DB TAB, 0,56
	.DB TXTP, 16
	.DA F15T9

	.DB END			; конец основной программы

F15KM:	.DBB F15KM0

F15KM0:	.DB END

F15T0:	.TEXT "Запах, сквозняк и шум\0"
F15T1:	.TEXT "исходят из соседних комнат.\0"
F15T2:	.TEXT "Из какой точно - неизвестно.\0"

F15T3:	.TEXT "Выбор идти или стрелять - \0"
F15T4:	.TEXT "кнопками Выбора.\0"

F15T5:	.TEXT "Стрела пролетает от 1 до 5\0"
F15T6:	.TEXT "комнат. Маршрут указывается\0"
F15T7:	.TEXT "перед выстрелом. При ошибке\0"
F15T8:	.TEXT "стрела улетает в сторону\0"
F15T9:	.TEXT "и может попасть в Вас.\0"

;======= Форма 16 - Правила 3
	.BASE		
F16:	; Заголовок формы
	.DB 0		; максимальный номер элемента
	.DBB F16DE, F16PI, F16PO, F16PL, F16PR, F16RI, F16KM ; таблица смещений

F16DE:	;таблица флагов действий
	.DB 20	; 00010100 разрешён ввод и выход
				 
F16PI:	
F16PO:	.DB 1,2	; Выход - перейти в F1E2 обычным образом

F16PL:		
F16PR:	.DB 0

F16RI:	; основная программа экранной формы 
	.DB TAB, 0,2
	.DB TXTP, 16
	.DA F16T0

	.DB TAB, 0,8
	.DB TXTP, 16
	.DA F16T1

	.DB TAB, 0,14
	.DB TXTP, 16
	.DA F16T2

	.DB TAB, 0,20
	.DB TXTP, 16
	.DA F16T3

	.DB TAB, 0,26
	.DB TXTP, 16
	.DA F16T4

	.DB TAB, 0,32
	.DB TXTP, 16
	.DA F16T5

	.DB TAB, 0,44
	.DB TXTP, 16
	.DA F16T6

	.DB TAB, 0,50
	.DB TXTP, 16
	.DA F16T7

	.DB TAB, 0,56
	.DB TXTP, 16
	.DA F16T8

	.DB END			; конец основной программы

F16KM:	.DBB F16KM0

F16KM0:	.DB END

F16T0:	.TEXT "После каждого выстрела Вампус\0"
F16T1:	.TEXT "пробуждается и способен\0"
F16T2:	.TEXT "переползти в другую комнату,\0" 
F16T3:	.TEXT "включая Вашу. На него можно\0"
F16T4:	.TEXT "и наткнуться, тогда он Вас\0"
F16T5:	.TEXT "съест с вероятностью 25%.\0"

F16T6:	.TEXT "В остальном интерфейс игры\0"
F16T7:	.TEXT "интуитивно понятен.\0"
F16T8:	.TEXT "Ни пуха, ни пера!\0"

;========== Подпрограммы экранных форм
FSFONT: ; установка шрифта 5
	.DB TYPE, 254		; шрифт пользователя
	.DB ATYPE
	.DA FONT5
	.DB RETUL

FSFRAME: ; вывод рамки
	.DB TAB, 3,6
	.DB SQU, 4,122,52	; атрибут 4 = NOT (белый прямоугольник)
	.DB TAB, 4,7
	.DB FRAME, 0,120,50	; атрибут 0 - замена (рамка)
	.DB RETUL

FSIMM:	; вывод рисунка IMM
	.DB TAB, 8, 10
	.DB DRAWP,0
	.DA IMM
	.DB RETUL

FSIWUM1: ; вывод рисунка IWUM1
	.DB TAB, 8, 10
	.DB DRAWP, 0
	.DA IWUM1
	.DB RETUL

;===================================================================

IFON: 
        .DB 80h, 14h
        .DB 0, 0, 0
        .DB 0, 0, 8
        .DB 0, 80h, 8
        .DB 0, 10h, 8
        .DB 40h, 2, 9
        .DB 40h, 26h, 9
        .DB 40h, 0C4h, 0Fh
        .DB 0C8h, 70h, 0Ah
        .DB 30h, 0DCh, 0Fh
        .DB 0, 77h, 0
        .DB 0A0h, 1Dh, 4
        .DB 90h, 66h, 3
        .DB 0ECh, 0B7h, 1
        .DB 20h, 73h, 0
        .DB 0F0h, 1Fh, 0
        .DB 0D0h, 3, 0
        .DB 0F8h, 5, 0
        .DB 0E8h, 2, 0
        .DB 0FCh, 0, 0
        .DB 0F4h, 1, 0
        .DB 7Ch, 1, 0
        .DB 0D4h, 0, 0
        .DB 09Ch, 0, 0
        .DB 94h, 0, 0
        .DB 74h, 1, 0
        .DB 5Ch, 1, 0
        .DB 0D4h, 2, 0
        .DB 0D4h, 2, 0
        .DB 0BCh, 6, 0
        .DB 0A8h, 0Dh, 0
        .DB 68h, 9, 0
        .DB 78h, 12h, 0
        .DB 0D0h, 6Eh, 0
        .DB 0B0h, 4Ch, 0
        .DB 0ACh, 0DBh, 1
        .DB 64h, 23h, 1
        .DB 0C0h, 16h, 3
        .DB 88h, 3Fh, 6
        .DB 90h, 66h, 0
        .DB 0A0h, 0DCh, 0Fh
        .DB 10h, 70h, 0Ah
        .DB 50h, 0C0h, 0Fh
        .DB 50h, 1Eh, 8
        .DB 0D0h, 0D5h, 0Dh
        .DB 50h, 24h, 0Bh
        .DB 50h, 34h, 8
        .DB 80h, 0D5h, 0Fh
        .DB 80h, 78h, 9
        .DB 20h, 0A8h, 0Fh
        .DB 10h, 0EFh, 0
        .DB 18h, 39h, 5
        .DB 88h, 4Fh, 2
        .DB 0E0h, 62h, 1
        .DB 0A0h, 09Bh, 0
        .DB 0F0h, 0CCh, 0
        .DB 50h, 26h, 0
        .DB 58h, 1Bh, 0
        .DB 68h, 0Ch, 0
        .DB 0BCh, 6, 0
        .DB 14h, 1, 0
        .DB 0F4h, 1, 0
        .DB 0FCh, 0, 0
        .DB 74h, 0, 0
        .DB 0F4h, 0, 0
        .DB 74h, 0, 0
        .DB 0FCh, 0, 0
        .DB 74h, 1, 0
        .DB 0F4h, 0, 0
        .DB 34h, 3, 0
        .DB 0BCh, 6, 0
        .DB 28h, 1Dh, 0
        .DB 78h, 35h, 0
        .DB 0D2h, 0EEh, 0
        .DB 90h, 98h, 0
        .DB 0F0h, 0B5h, 1
        .DB 44h, 63h, 3
        .DB 0C0h, 0AEh, 4
        .DB 88h, 8Bh, 0Dh
        .DB 70h, 7Ah, 0
        .DB 40h, 0CEh, 0Fh
        .DB 0D8h, 38h, 9
        .DB 8Ch, 0E0h, 0Fh
        .DB 4, 9, 8
        .DB 0Ch, 39h, 0Bh
        .DB 18h, 0A0h, 9
        .DB 40h, 2Ch, 8
        .DB 38h, 86h, 0Fh
        .DB 0, 0F3h, 0Ah
        .DB 44h, 09Ch, 0Fh
        .DB 26h, 0F7h, 0
        .DB 32h, 1Dh, 4
        .DB 0D2h, 85h, 2
        .DB 42h, 77h, 1
        .DB 0E0h, 0A1h, 0
        .DB 0B0h, 0F4h, 0
        .DB 0DAh, 34h, 0
        .DB 68h, 2Dh, 0
        .DB 39h, 15h, 0
        .DB 0ABh, 1Ah, 0
        .DB 0BDh, 9, 0
        .DB 95h, 5, 0
        .DB 0DFh, 5, 0
        .DB 0D4h, 6, 0
        .DB 54h, 2, 0
        .DB 54h, 1, 0
        .DB 0DCh, 1, 0
        .DB 94h, 2, 0
        .DB 0FEh, 2, 0
        .DB 0F6h, 1, 0
        .DB 0FEh, 3, 0
        .DB 0E8h, 1, 0
        .DB 0E9h, 7, 0
        .DB 0FEh, 0Bh, 0
        .DB 92h, 0Fh, 0
        .DB 0F6h, 17h, 0
        .DB 44h, 0FFh, 0
        .DB 0C4h, 46h, 3
        .DB 90h, 1Dh, 0Eh
        .DB 30h, 77h, 0
        .DB 24h, 0DCh, 0Fh
        .DB 84h, 71h, 9
        .DB 16h, 0C3h, 0Fh
        .DB 2, 0DEh, 9
        .DB 0, 8, 0Bh
        .DB 20h, 6Bh, 9
        .DB 0, 4Ah, 0Bh
        .DB 40h, 50h, 0Ah
        .DB 0, 0, 8

IS0: 
        .DB 0Ah, 10h
        .DB 1Fh, 0
        .DB 0FEh, 7
        .DB 0FCh, 3
        .DB 0F8h, 1
        .DB 0F8h, 3
        .DB 0F0h, 7
        .DB 60h, 1Eh
        .DB 40h, 0FCh
        .DB 40h, 0F0h
        .DB 0, 0E0h

IS1: 
        .DB 6, 10h
        .DB 0C0h, 1
        .DB 0F8h, 0
        .DB 0FFh, 0FFh
        .DB 0FBh, 0FFh
        .DB 0F8h, 0
        .DB 0C0h, 1

IS2: 
        .DB 0Ah, 10h
        .DB 0, 0E0h
        .DB 0, 0F0h
        .DB 40h, 78h
        .DB 60h, 1Eh
        .DB 0F0h, 0Fh
        .DB 0F0h, 3
        .DB 0F8h, 1
        .DB 0FCh, 7
        .DB 0FEh, 3
        .DB 1Fh, 0

IWUMPUS: 
        .DB 32h, 40h
        .DB 0, 0, 0, 0, 0, 0, 0, 0
        .DB 0, 0, 1, 0, 0, 0, 0, 0
        .DB 0, 80h, 2, 40h, 0, 0, 20h, 0
        .DB 0, 40h, 2, 0, 0, 0, 0, 0
        .DB 0, 7Eh, 4, 20h, 0, 0, 10h, 10h
        .DB 0, 1, 2, 10h, 0, 0, 0, 8
        .DB 0, 0DDh, 2, 0, 0, 0, 8, 0
        .DB 0C0h, 2, 1, 8, 0, 0, 4, 2
        .DB 40h, 1, 0, 0, 0, 0, 0, 0
        .DB 0A0h, 0, 0, 0, 0, 0, 1, 0
        .DB 50h, 0, 0, 5Ch, 2, 0, 80h, 0
        .DB 50h, 0, 0, 0AAh, 0BFh, 27h, 0, 0
        .DB 48h, 0, 0A0h, 5Fh, 0F3h, 1Dh, 0, 0
        .DB 48h, 0E0h, 0F2h, 0B6h, 19h, 50h, 80h, 0Fh
        .DB 48h, 0B0h, 0D7h, 1Bh, 8, 78h, 40h, 19h
        .DB 48h, 09Fh, 5Ah, 0Ch, 0, 70h, 40h, 16h
        .DB 0C8h, 4, 68h, 3, 0, 0C0h, 81h, 28h
        .DB 0C8h, 0CCh, 50h, 0, 0C0h, 67h, 80h, 29h
        .DB 8, 94h, 71h, 44h, 0, 88h, 55h, 29h
        .DB 8, 09Ch, 4, 84h, 1, 0C0h, 34h, 20h
        .DB 8, 0D8h, 68h, 88h, 0, 0C5h, 0Fh, 2Bh
        .DB 8, 6Ah, 0E8h, 0Bh, 1, 0Fh, 80h, 26h
        .DB 10h, 8Ah, 9, 1Bh, 1, 0Bh, 70h, 18h
        .DB 20h, 64h, 0CAh, 11h, 1, 16h, 0Eh, 0
        .DB 0C0h, 0C6h, 80h, 3Fh, 7Eh, 0F6h, 1, 80h
        .DB 80h, 0C5h, 0F0h, 2Ch, 21h, 46h, 0, 0C0h
        .DB 0, 64h, 17h, 22h, 0C1h, 8, 2, 40h
        .DB 0, 0Ch, 5, 3, 81h, 88h, 18h, 40h
        .DB 0, 0F0h, 4, 33h, 0C1h, 0Ch, 0C0h, 20h
        .DB 0, 0, 88h, 91h, 80h, 8, 41h, 21h
        .DB 0, 0, 88h, 90h, 0C0h, 88h, 40h, 22h
        .DB 0, 0, 88h, 48h, 80h, 78h, 0F4h, 12h
        .DB 0, 0, 88h, 48h, 80h, 68h, 0A3h, 12h
        .DB 0, 0, 4Ch, 44h, 80h, 82h, 09Dh, 0Ah
        .DB 0, 0, 44h, 44h, 10h, 17h, 0, 0Ah
        .DB 0, 0, 22h, 2Fh, 10h, 0E8h, 8Eh, 0Ah
        .DB 0, 0, 63h, 21h, 10h, 0, 89h, 6
        .DB 0, 80h, 0B3h, 3Eh, 24h, 40h, 0D0h, 2
        .DB 0, 80h, 19h, 23h, 24h, 20h, 0A0h, 2
        .DB 0, 40h, 0Ch, 35h, 28h, 10h, 78h, 3Dh
        .DB 0, 40h, 2, 2Bh, 68h, 34h, 48h, 1
        .DB 0, 20h, 1, 1Ch, 48h, 36h, 8, 80h
        .DB 0, 0B8h, 1, 0, 48h, 4Ah, 0F8h, 8Fh
        .DB 0, 0ACh, 1, 0, 88h, 4Ah, 4, 40h
        .DB 0, 0DCh, 0, 0, 90h, 61h, 4, 40h
        .DB 0, 8Ah, 0, 0, 10h, 0DFh, 4, 40h
        .DB 0, 8Ah, 1, 0, 10h, 80h, 4, 80h
        .DB 0, 0D2h, 0, 0, 30h, 80h, 2, 20h
        .DB 0, 7Ch, 0, 0, 0F0h, 0FFh, 2, 20h
        .DB 0, 0, 0, 0, 90h, 0, 3, 0



IPIT: 
        .DB 2Ch, 20h
        .DB 0, 0, 1Eh, 0
        .DB 0, 0C0h, 0Bh, 0
        .DB 0, 0F8h, 27h, 0
        .DB 0F8h, 0BFh, 24h, 0
        .DB 0F8h, 5Fh, 43h, 0
        .DB 0D0h, 0A9h, 0F1h, 0
        .DB 38h, 0B7h, 0F8h, 7
        .DB 3Ch, 0, 0F8h, 7
        .DB 47h, 78h, 0ECh, 7
        .DB 0BCh, 48h, 0D2h, 0Fh
        .DB 40h, 49h, 0AEh, 0Fh
        .DB 80h, 4Ah, 7Eh, 0Fh
        .DB 0, 0C8h, 0F3h, 0Fh
        .DB 0C0h, 48h, 0AAh, 1Fh
        .DB 0, 48h, 52h, 1Fh
        .DB 80h, 48h, 92h, 1Eh
        .DB 0, 49h, 42h, 3Fh
        .DB 0, 78h, 8Ch, 3Fh
        .DB 0, 1, 0E4h, 3Fh
        .DB 0, 0, 0C4h, 7Fh
        .DB 0, 0, 0F4h, 0FFh
        .DB 0, 4, 0E6h, 0FFh
        .DB 0, 1, 0E2h, 7Fh
        .DB 0, 0, 0BAh, 7Fh
        .DB 0, 81h, 0C2h, 7Fh
        .DB 0, 80h, 0F2h, 1Fh
        .DB 0, 40h, 0C6h, 1Fh
        .DB 80h, 0C0h, 84h, 0
        .DB 0, 40h, 0FDh, 0
        .DB 80h, 0E0h, 7Ch, 0
        .DB 0, 0B8h, 78h, 20h
        .DB 80h, 0Fh, 30h, 10h
        .DB 0E0h, 67h, 0, 28h
        .DB 0FCh, 95h, 3, 1Ch
        .DB 28h, 0, 0, 7
        .DB 0A0h, 0, 82h, 1
        .DB 40h, 1, 80h, 0
        .DB 0, 7Eh, 82h, 3
        .DB 0, 40h, 0, 6
        .DB 0, 80h, 0Ch, 4
        .DB 0, 80h, 0C4h, 7
        .DB 0, 0, 41h, 0
        .DB 0, 0, 73h, 0
        .DB 0, 0, 30h, 0

IBAT: 
        .DB 32h, 17h
        .DB 0, 0, 40h
        .DB 0, 0, 60h
        .DB 0, 0, 30h
        .DB 0, 0, 3Ch
        .DB 0, 20h, 1Fh
        .DB 0, 3Ch, 0Dh
        .DB 0, 0B4h, 0Fh
        .DB 0, 09Ch, 6
        .DB 0, 0F4h, 7
        .DB 0, 6Ah, 0Eh
        .DB 0, 0F7h, 3
        .DB 0, 55h, 1
        .DB 80h, 0B3h, 1
        .DB 80h, 0FAh, 1
        .DB 80h, 0E9h, 0
        .DB 80h, 0ACh, 0
        .DB 80h, 2Dh, 0
        .DB 0C0h, 34h, 0
        .DB 7Ch, 1Ch, 0
        .DB 94h, 1Dh, 0
        .DB 58h, 0Ah, 0
        .DB 0D0h, 0Bh, 0
        .DB 90h, 5, 0
        .DB 8, 0Eh, 0
        .DB 67h, 0Bh, 0
        .DB 0DFh, 0Fh, 0
        .DB 0F0h, 8, 0
        .DB 0, 5, 0
        .DB 80h, 5, 0
        .DB 0, 5, 0
        .DB 0, 3, 0
        .DB 0, 0Dh, 0
        .DB 0, 5, 0
        .DB 0, 5, 0
        .DB 0, 7, 0
        .DB 80h, 2, 0
        .DB 80h, 0Dh, 0
        .DB 80h, 1Ah, 0
        .DB 80h, 7, 0
        .DB 80h, 2, 0
        .DB 80h, 7, 0
        .DB 80h, 4, 0
        .DB 80h, 0Ah, 0
        .DB 0C0h, 1Ch, 0
        .DB 40h, 5, 0
        .DB 40h, 6, 0
        .DB 40h, 4, 0
        .DB 40h, 2, 0
        .DB 0C0h, 7, 0
        .DB 40h, 0, 0

IMM: 
        .DB 0Dh, 0Fh
        .DB 80h, 21h
        .DB 80h, 61h
        .DB 2Eh, 33h
        .DB 6Dh, 1Bh
        .DB 59h, 0Ch
        .DB 4Dh, 6
        .DB 2Dh, 3
        .DB 09Ah, 5
        .DB 0C0h, 5
        .DB 0E0h, 8
        .DB 70h, 18h
        .DB 70h, 38h
        .DB 30h, 18h

IWUM1: 
        .DB 17h, 1Ch
        .DB 0, 0, 0, 0
        .DB 0, 0, 0Eh, 0
        .DB 0, 24h, 1Fh, 0
        .DB 80h, 24h, 0Eh, 0
        .DB 20h, 0D9h, 8Fh, 7
        .DB 50h, 0DEh, 0C3h, 1
        .DB 0E8h, 7Ah, 0E1h, 0Fh
        .DB 4Ch, 0E3h, 0F1h, 0
        .DB 18h, 0AAh, 0F3h, 7
        .DB 4Ch, 0B0h, 0F7h, 0
        .DB 0CEh, 23h, 0BFh, 3
        .DB 1Eh, 0E6h, 1Eh, 0
        .DB 8, 51h, 0Eh, 0
        .DB 1Fh, 0D6h, 1Eh, 0
        .DB 0C8h, 91h, 3, 0
        .DB 5Eh, 0A0h, 0, 0
        .DB 0Ch, 0F8h, 3Bh, 0
        .DB 64h, 0EDh, 3Fh, 0
        .DB 3Ah, 53h, 1Fh, 0
        .DB 64h, 57h, 1Ch, 0
        .DB 0A0h, 12h, 0Ch, 0
        .DB 50h, 3, 0, 0
        .DB 0, 0, 0, 0
;============================= Шрифт 5






	; Шрифт 5 - дополненный char31
	.BASE
FONT5:	.DB 5	; высота шрифта

	.DB 31,3
	.DWB CHAR31

	.DB 32,2
	.DWB CHAR32

	; 48-57 цифры 

	.DB 48,3
	.DWB CHAR48

	.DB 49,3
	.DWB CHAR49

	.DB 50,3
	.DWB CHAR50

	.DB 51,3
	.DWB CHAR51

	.DB 52,3
	.DWB CHAR52

	.DB 53,3
	.DWB CHAR53

	.DB 54,3
	.DWB CHAR54

	.DB 55,3
	.DWB CHAR55

	.DB 56,3
	.DWB CHAR56

	.DB 57,3
	.DWB CHAR57

	; русские буквы

	.DB 128,3
	.DWB CHAR128

	.DB 160,3
	.DWB CHAR128

	.DB 129,3
	.DWB CHAR129

	.DB 161,3
	.DWB CHAR129

	.DB 130,4
	.DWB CHAR130

	.DB 162,4
	.DWB CHAR130

	.DB 131,3
	.DWB CHAR131

	.DB 163,3
	.DWB CHAR131

	.DB 132,5
	.DWB CHAR132

	.DB 164,5
	.DWB CHAR132

	.DB 133,3
	.DWB CHAR133

	.DB 165,3
	.DWB CHAR133

	.DB 134,5
	.DWB CHAR134

	.DB 166,5
	.DWB CHAR134

	.DB 135,3
	.DWB CHAR135

	.DB 167,3
	.DWB CHAR135

	.DB 136,4
	.DWB CHAR136

	.DB 168,4
	.DWB CHAR136

	.DB 137,5
	.DWB CHAR137

	.DB 169,5
	.DWB CHAR137

	.DB 138,4
	.DWB CHAR138

	.DB 170,4
	.DWB CHAR138

	.DB 139,4
	.DWB CHAR139

	.DB 171,4
	.DWB CHAR139

	.DB 140,5
	.DWB CHAR140

	.DB 172,5
	.DWB CHAR140

	.DB 141,3
	.DWB CHAR141

	.DB 173,3
	.DWB CHAR141

	.DB 142,4
	.DWB CHAR142

	.DB 174,4
	.DWB CHAR142

	.DB 143,3
	.DWB CHAR143

	.DB 175,3
	.DWB CHAR143

	.DB 144,3
	.DWB CHAR144

	.DB 224,3
	.DWB CHAR144

	.DB 145,3
	.DWB CHAR145

	.DB 225,3
	.DWB CHAR145

	.DB 146,3
	.DWB CHAR146

	.DB 226,3
	.DWB CHAR146

	.DB 147,3
	.DWB CHAR147

	.DB 227,3
	.DWB CHAR147

	.DB 148,5
	.DWB CHAR148

	.DB 228,5
	.DWB CHAR148

	.DB 149,3
	.DWB CHAR149

	.DB 229,3
	.DWB CHAR149

	.DB 150,4
	.DWB CHAR150

	.DB 230,4
	.DWB CHAR150

	.DB 151,4
	.DWB CHAR151

	.DB 231,4
	.DWB CHAR151

	.DB 152,5
	.DWB CHAR152

	.DB 232,5
	.DWB CHAR152

	.DB 153,6
	.DWB CHAR153

	.DB 233,6
	.DWB CHAR153

	.DB 154,4
	.DWB CHAR154

	.DB 234,4
	.DWB CHAR154

	.DB 155,5
	.DWB CHAR155

	.DB 235,5
	.DWB CHAR155

	.DB 156,3
	.DWB CHAR156

	.DB 236,3
	.DWB CHAR156

	.DB 157,3
	.DWB CHAR157

	.DB 237,3
	.DWB CHAR157

	.DB 158,5
	.DWB CHAR158

	.DB 238,5
	.DWB CHAR158

	.DB 159,4
	.DWB CHAR159

	.DB 239,4
	.DWB CHAR159

	.DB 240,5
	.DWB CHAR240

	.DB 241,5
	.DWB CHAR240

	; латинские буквы

	.DB 65,3
	.DWB CHAR128

	.DB 97,3
	.DWB CHAR128

	.DB 66,4
	.DWB CHAR130

	.DB 98,4
	.DWB CHAR130

	.DB 67,3
	.DWB CHAR145

	.DB 99,3
	.DWB CHAR145

	.DB 68,4
	.DWB CHAR68
	
	.DB 100,4
	.DWB CHAR68

	.DB 69,3
	.DWB CHAR133

	.DB 101,3
	.DWB CHAR133

	.DB 70,3
	.DWB CHAR70

	.DB 102,3
	.DWB CHAR70

	.DB 71,3
	.DWB CHAR71

	.DB 103,3
	.DWB CHAR71

	.DB 72,3
	.DWB CHAR141

	.DB 104,3
	.DWB CHAR141

	.DB 73,3
	.DWB CHAR73

	.DB 105,3
	.DWB CHAR73

	.DB 74,4
	.DWB CHAR74

	.DB 106,4
	.DWB CHAR74

	.DB 75,4
	.DWB CHAR138

	.DB 107,4
	.DWB CHAR138

	.DB 76,3
	.DWB CHAR76

	.DB 108,3
	.DWB CHAR76

	.DB 77,5
	.DWB CHAR140

	.DB 109,5
	.DWB CHAR140

	.DB 78,4
	.DWB CHAR78

	.DB 110,4
	.DWB CHAR78

	.DB 79,4
	.DWB CHAR142

	.DB 111,4
	.DWB CHAR142

	.DB 80,3
	.DWB CHAR144

	.DB 112,3
	.DWB CHAR144

	.DB 81,5
	.DWB CHAR81

	.DB 113,5
	.DWB CHAR81

	.DB 82,4
	.DWB CHAR82

	.DB 114,4
	.DWB CHAR82

	.DB 83,4
	.DWB CHAR83

	.DB 115,4
	.DWB CHAR83

	.DB 84,3
	.DWB CHAR146

	.DB 116,3
	.DWB CHAR146

	.DB 85,4
	.DWB CHAR85

	.DB 117,4
	.DWB CHAR85

	.DB 86,5
	.DWB CHAR86

	.DB 118,5
	.DWB CHAR86

	.DB 87,5
	.DWB CHAR87

	.DB 119,5
	.DWB CHAR87

	.DB 88,3
	.DWB CHAR149

	.DB 120,3
	.DWB CHAR149

	.DB 89,3
	.DWB CHAR147

	.DB 121,3
	.DWB CHAR147

	.DB 90,4
	.DWB CHAR90

	.DB 122,4
	.DWB CHAR90

	; 33-47

	.DB 33,1
	.DWB CHAR33

	.DB 34,3
	.DWB CHAR34

	.DB 35,5
	.DWB CHAR35

	.DB 36,5
	.DWB CHAR36

	.DB 37,5
	.DWB CHAR37

	.DB 38,5
	.DWB CHAR38

	.DB 39,1
	.DWB CHAR39

	.DB 40,2
	.DWB CHAR40

	.DB 41,2
	.DWB CHAR41

	.DB 42,3
	.DWB CHAR42

	.DB 43,3
	.DWB CHAR43

	.DB 44,2
	.DWB CHAR44

	.DB 45,3
	.DWB CHAR45

	.DB 46,1
	.DWB CHAR46

	.DB 47,5
	.DWB CHAR47

	; 58-64, 91-96

	.DB 58,1
	.DWB CHAR58

	.DB 59,2
	.DWB CHAR59

	.DB 60,3
	.DWB CHAR60

	.DB 61,3
	.DWB CHAR61

	.DB 62,3
	.DWB CHAR62

	.DB 63,3
	.DWB CHAR63

	.DB 64,4
	.DWB CHAR64

	; 91-96

	.DB 91,2
	.DWB CHAR91

	.DB 92,5
	.DWB CHAR92

	.DB 93,2
	.DWB CHAR93

	.DB 94,3
	.DWB CHAR94

	.DB 95,3
	.DWB CHAR95

	.DB 96,2
	.DWB CHAR96

	; 123-127
	.DB 123,3
	.DWB CHAR123

	.DB 124,1
	.DWB CHAR124

	.DB 125,3
	.DWB CHAR125

	.DB 126,4
	.DWB CHAR126

	.DB 127,5
	.DWB CHAR127

	.DB 255

CHAR31:	.DB 0
CHAR32:	.DB 0,0
CHAR33:	.DB 17h
CHAR34:	.DB 3,0,3
CHAR35:	.DB 0Ah,1Fh,0Ah,1Fh,0Ah
CHAR36:	.DB 17h,15h,1Fh,15h,1Dh
CHAR37:	.DB 13h,0Bh,4,1Ah,19h
CHAR38:	.DB 1Ch,13h,17h,8,14h
CHAR39:	.DB 3
CHAR40:	.DB 0Eh,11h
CHAR41:	.DB 11h,0Eh
CHAR42:	.DB 0Ah,4,0Ah
CHAR43:	.DB 4,0Eh,4
CHAR44:	.DB 10h,8
CHAR45:	.DB 4,4,4
CHAR46:	.DB 10h
CHAR47:	.DB 10h,8,4,2,1
CHAR48:	.DB 1Fh,11h,1Fh
CHAR49:	.DB 12h,1Fh,10h
CHAR50:	.DB 19h,15h,13h
CHAR51:	.DB 11h,15h,1Fh
CHAR52:	.DB 7,4,1Fh
CHAR53:	.DB 17h,15h,1Dh
CHAR54:	.DB 1Eh,15h,1Dh
CHAR55:	.DB 1,1Dh,3
CHAR56:	.DB 1Bh,15h,1Bh
CHAR57:	.DB 17h,15h,0Fh
CHAR58:	.DB 0Ah
CHAR59:	.DB 10h,0Ah
CHAR60:	.DB 4,0Ah,11h
CHAR61:	.DB 0Ah,0Ah,0Ah
CHAR62:	.DB 11h,0Ah,4
CHAR63:	.DB 1,15h,3
CHAR64:	.DB 0Eh,11h,17h,17h

CHAR91:	.DB 1Fh,11h
CHAR92:	.DB 1,2,4,8,10h
CHAR93:	.DB 11h,1Fh
CHAR94:	.DB 2,1,2
CHAR95:	.DB 10h,10h,10h
CHAR96:	.DB 1,2

CHAR123:	.DB 4,1Bh,11h
CHAR124:	.DB 1Fh
CHAR125:	.DB 11h,1Bh,4
CHAR126:	.DB 2,1,2,1
CHAR127:	.DB 1Ch,12h,11h,12h,1Ch

CHAR128:	.DB 1Eh,9,1Eh
CHAR129:	.DB 1Fh,15h,1Dh
CHAR130:	.DB 1Fh,15h,15h,0Ah
CHAR131:	.DB 1Fh,1,1
CHAR132:	.DB 10h,1Eh,11h,1Fh,10h
CHAR133:	.DB 1Fh,15h,11h
CHAR134:	.DB 1Bh,4,1Fh,4,1Bh
CHAR135:	.DB 11h,15h,1Bh
CHAR136:	.DB 1Fh,8,4,1Fh
CHAR137:	.DB 1Fh,10h,9,4,1Fh
CHAR138:	.DB 1Fh,4,0Ah,11h
CHAR139:	.DB 10h,1Eh,1,1Fh
CHAR140:	.DB 1Fh,2,4,2,1Fh
CHAR141:	.DB 1Fh,4,1Fh
CHAR142:	.DB 0Eh,11h,11h,0Eh
CHAR143:	.DB 1Fh,1,1Fh
CHAR144:	.DB 1Fh,5,7
CHAR145:	.DB 1Fh,11h,11h
CHAR146:	.DB 1,1Fh,1
CHAR147:	.DB 17h,14h,1Fh
CHAR148:	.DB 7,5,1Fh,5,7
CHAR149:	.DB 1Bh,4,1Bh
CHAR150:	.DB 1Fh,10h,1Fh,10h
CHAR151:	.DB 3,4,4,1Fh
CHAR152:	.DB 1Fh,10h,1Fh,10h,1Fh
CHAR153:	.DB 1Fh,10h,1Fh,10h,1Fh,10h
CHAR154:	.DB 1,1Fh,14h,1Ch
CHAR155:	.DB 1Fh,14h,1Ch,0,1Fh
CHAR156:	.DB 1Fh,14h,1Ch
CHAR157:	.DB 11h,15h,0Eh
CHAR158:	.DB 1Fh,4,0Eh,11h,0Eh
CHAR159:	.DB 16h,0Dh,5,1Fh
CHAR240:	.DB 1Eh,17h,16h,17h,12h

CHAR68:	.DB 11h,1Fh,11h,0Eh
CHAR70:	.DB 1Fh,5,1
CHAR71:	.DB 0Eh,11h,19h
CHAR73:	.DB 11h,1Fh,11h
CHAR74:	.DB 8,11h,1Fh,1
CHAR76:	.DB 1Fh,10h,10h
CHAR78:	.DB 1Fh,2,4,1Fh
CHAR81:	.DB 0Eh,11h,19h,0Eh,10h
CHAR82:	.DB 1Fh,5,0Dh,16h
CHAR83:	.DB 12h,15h,15h,9
CHAR85:	.DB 0Fh,10h,10h,0Fh
CHAR86:	.DB 7,8,10h,8,7
CHAR87:	.DB 0Fh,10h,8,10h,0Fh
CHAR90:	.DB 19h,15h,15h,13h

.END


Текст игры на языке BASIC

В ряде мест вышеприведённой программы ЭКВМ даются ссылки на этот листинг.

При сравнении размеров программ не следует забывать, что игра для ЭКВМ включает графические изображения, встроенный шрифт и систему меню. А приведённая ниже оригинальная программа имеет текстовый диалоговый интерфейс.

PROGRAM LISTING

0010  REM- HUNT THE WUMPUS
0015  REM:  BY GREGORY YOB
0020  PRINT "INSTRUCTIONS (Y-N)";
0030  INPUT I$
0040  IF I$="N" THEN 52
0050  GOSUB 1000
0052  REM- ANNOUNCE WUMPUSII FOR ALL AFICIONADOS ... ADDED BY DAVE
0054  PRINT
0056  PRINT "     ATTENTION ALL WUMPUS LOVERS!!!"
0058  PRINT "     THERE ARE NOW TWO ADDITIONS TO THE WUMPUS FAMILY";
0060  PRINT " OF PROGRAMS."
0062  PRINT
0064  PRINT "     WUMP2:  SOME DIFFERENT CAVE ARRANGEMENTS"
0066  PRINT "     WUMP3:  DIFFERENT HAZARDS"
0067  PRINT
0068  REM- SET UP CAVE (DODECAHEDRAL NODE LIST)
0070  DIM S(20,3)
0080   FOR J=1 TO 20
0090    FOR K=1 TO 3
0100    READ S(J,K)
0110    NEXT K
0120   NEXT J
0130  DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6
0140  DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11
0150  DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16
0160  DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19
0170  DEF FNA(X)=INT(20*RND(0))+1
0180  DEF FNB(X)=INT(3*RND(0))+1
0190  DEF FNC(X)=INT(4*RND(0))+1
0200  REM-LOCATE L ARRAY ITEMS
0210  REM-1-YOU,2-WUMPUS,3&4-PITS,5&6-BATS
0220  DIM L(6)
0230  DIM M(6)
0240   FOR J=1 TO 6
0250   L(J)=FNA(0)
0260   M(J)=L(J)
0270   NEXT J
0280  REM-CHECK FOR CROSSOVERS (IE L(1)=L(2),ETC)
0290   FOR J=1 TO 6
0300    FOR K=J TO 6
0310    IF J=K THEN 330
0320    IF L(J)=L(K) THEN 240
0330    NEXT K
0340   NEXT J
0350  REM-SET# ARROWS
0360  A=5
0365  L=L(1)
0370  REM-RUN THE GAME
0375  PRINT "HUNT THE WUMPUS"
0380  REM-HAZARD WARNINGS & LOCATION
0390  GOSUB 2000
0400  REM-MOVE OR SHOOT
0410  GOSUB 2500
0420  GOTO O OF 440,480
0430  REM-SHOOT
0440  GOSUB 3000
0450  IF F=0 THEN 390
0460  GOTO 500
0470  REM-MOVE
0480  GOSUB 4000
0490  IF F=0 THEN 390
0500  IF F>0 THEN 550
0510  REM-LOSE
0520  PRINT "HA HA HA - YOU LOSE!"
0530  GOTO 560
0540  REM-WIN
0550  PRINT "HEE HEE HEE - THE WUMPUS'LL GETCHA NEXT TIME!!"
0560   FOR J=1 TO 6
0570   L(J)=M(J)
0580   NEXT J
0590  PRINT "SAME SET-UP (Y-N)";
0600  INPUT I$
0610  IF I$#"Y" THEN 240
0620  GOTO 360
1000  REM-INSTRUCTIONS
1010  PRINT "WELCOME TO 'HUNT THE WUMPUS'"
1020  PRINT "  THE WUMPUS LIVES IN A CAVE OF 20 ROOMS. EACH ROOM"
1030  PRINT "HAS 3 TUNNELS LEADING TO OTHER ROOMS. (LOOK AT A"
1040  PRINT "DODECAHEDRON TO SEE HOW THIS WORKS-IF YOU DON'T KNOW"
1050  PRINT "WHAT A DODECAHEDRON IS, ASK SOMEONE)"
1060  PRINT
1070  PRINT "     HAZARDS:"
1080  PRINT " BOTTOMLESS PITS - TWO ROOMS HAVE BOTTOMLESS PITS IN THEM"
1090  PRINT "     IF YOU GO THERE, YOU FALL INTO THE PIT (& LOSE!)"
1100  PRINT " SUPER BATS - TWO OTHER ROOMS HAVE SUPER BATS. IF YOU"
1110  PRINT "     GO THERE, A BAT GRABS YOU AND TAKES YOU TO SOME OTHER"
1120  PRINT "     ROOM AT RANDOM. (WHICH MIGHT BE TROUBLESOME)"
1130  PRINT
1140  PRINT "     WUMPUS:"
1150  PRINT " THE WUMPUS IS NOT BOTHERED BY THE HAZARDS (HE HAS SUCKER"
1160  PRINT " FEET AND IS TOO BIG FOR A BAT TO LIFT).  USUALLY"
1170  PRINT " HE IS ASLEEP. TWO THINGS WAKE HIM UP: YOUR ENTERING"
1180  PRINT " HIS ROOM OR YOUR SHOOTING AN ARROW."
1190  PRINT "     IF THE WUMPUS WAKES, HE MOVES (P=.75) ONE ROOM"
1200  PRINT " OR STAYS STILL (P=.25). AFTER THAT, IF HE IS WHERE YOU"
1210  PRINT " ARE, HE EATS YOU UP (& YOU LOSE!)"
1220  PRINT
1230  PRINT "     YOU:"
1240  PRINT " EACH TURN YOU MAY MOVE OR SHOOT A CROOKED ARROW"
1250  PRINT "   MOVING: YOU CAN GO ONE ROOM (THRU ONE TUNNEL)"
1260  PRINT "   ARROWS: YOU HAVE 5 ARROWS. YOU LOSE WHEN YOU RUN OUT."
1270  PRINT "   EACH ARROW CAN GO FROM 1 TO 5 ROOMS. YOU AIM BY TELLING"
1280  PRINT "   THE COMPUTER THE ROOM#S YOU WANT THE ARROW TO GO TO."
1290  PRINT "   IF THE ARROW CAN'T GO THAT WAY (IE NO TUNNEL) IT MOVES"
1300  PRINT "   AT RAMDOM TO THE NEXT ROOM."
1310  PRINT "     IF THE ARROW HITS THE WUMPUS, YOU WIN."
1320  PRINT "     IF THE ARROW HITS YOU, YOU LOSE."
1330  PRINT
1340  PRINT "    WARNINGS:"
1350  PRINT "     WHEN YOU ARE ONE ROOM AWAY FROM WUMPUS OR HAZARD,"
1360  PRINT "    THE COMPUTER SAYS:"
1370  PRINT " WUMPUS-  'I SMELL A WUMPUS'"
1380  PRINT " BAT   -  'BATS NEARBY'"
1390  PRINT " PIT   -  'I FEEL A DRAFT'"
1400  PRINT ""
1410  RETURN
2000  REM-PRINT LOCATION & HAZARD WARNINGS
2010  PRINT
2020   FOR J=2 TO 6
2030    FOR K=1 TO 3
2040    IF S(L(1),K)#L(J) THEN 2110
2050    GOTO J-1 OF 2060,2080,2080,2100,2100
2060    PRINT "I SMELL A WUMPUS!"
2070    GOTO 2110
2080    PRINT "I FEEL A DRAFT"
2090    GOTO 2110
2100    PRINT "BATS NEARBY!"
2110    NEXT K
2120   NEXT J
2130  PRINT "YOU ARE IN ROOM "L(1)
2140  PRINT "TUNNELS LEAD TO "S(L,1);S(L,2);S(L,3)
2150  PRINT
2160  RETURN
2500  REM-CHOOSE OPTION
2510  PRINT "SHOOT OR MOVE (S-M)";
2520  INPUT I$
2530  IF I$#"S" THEN 2560
2540  O=1
2550  RETURN
2560  IF I$#"M" THEN 2510
2570  O=2
2580  RETURN
3000  REM-ARROW ROUTINE
3010  F=0
3020  REM-PATH OF ARROW
3030  DIM P(5)
3040  PRINT "NO. OF ROOMS(1-5)";
3050  INPUT J9
3060  IF J9<1 OR J9>5 THEN 3040
3070   FOR K=1 TO J9
3080   PRINT "ROOM #";
3090   INPUT P(K)
3095   IF K <= 2 THEN 3115
3100   IF P(K) <> P(K-2) THEN 3115
3105   PRINT "ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM"
3110   GOTO 3080
3115   NEXT K
3120  REM-SHOOT ARROW
3130  L=L(1)
3140   FOR K=1 TO J9
3150    FOR K1=1 TO 3
3160    IF S(L,K1)=P(K) THEN 3295
3170    NEXT K1
3180   REM-NO TUNNEL FOR ARROW
3190   L=S(L,FNB(1))
3200   GOTO 3300
3210   NEXT K
3220  PRINT "MISSED"
3225  L=L(1)
3230  REM-MOVE WUMPUS
3240  GOSUB 3370
3250  REM-AMMO CHECK
3255  A=A-1
3260  IF A>0 THEN 3280
3270  F=-1
3280  RETURN
3290  REM-SEE IF ARROW IS AT L(1) OR L(2)
3295  L=P(K)
3300  IF L#L(2) THEN 3340
3310  PRINT "AHA! YOU GOT THE WUMPUS!"
3320  F=1
3330  RETURN! 
3340  IF L#L(1) THEN 3210
3350  PRINT "OUCH! ARROW GOT YOU!"
3360  GOTO 3270
3370  REM-MOVE WUMPUS ROUTINE
3380  K=FNC(0)
3390  IF K=4 THEN 3410
3400  L(2)=S(L(2),K)
3410  IF L(2)#L THEN 3440
3420  PRINT "TSK TSK TSK- WUMPUS GOT YOU!"
3430  F=-1
3440  RETURN
4000  REM- MOVE ROUTINE
4010  F=0
4020  PRINT "WHERE TO";
4030  INPUT L
4040  IF L<1 OR L>20 THEN 4020
4050   FOR K=1 TO 3
4060   REM- CHECK IF LEGAL MOVE
4070   IF S(L(1),K)=L THEN 4130
4080   NEXT K
4090  IF L=L(1) THEN 4130
4100  PRINT "NOT POSSIBLE -";
4110  GOTO 4020
4120  REM-CHECK FOR HAZARDS
4130  L(1)=L
4140  REM-WUMPUS
4150  IF L#L(2) THEN 4220
4160  PRINT "...OOPS! BUMPED A WUMPUS!"
4170  REM-MOVE WUMPUS
4180  GOSUB 3380
4190  IF F=0 THEN 4220
4200  RETURN
4210  REM-PIT
4220  IF L#L(3) AND L#L(4) THEN 4270
4230  PRINT "YYYIIIIEEEE . . . FELL IN PIT"
4240  F=-1
4250  RETURN
4260  REM-BATS
4270  IF L#L(5) AND L#L(6) THEN 4310
4280  PRINT "ZAP--SUPER BAT SNATCH! ELSEWHEREVILLE FOR YOU!"
4290  L=FNA(1)
4300  GOTO 4130
4310  RETURN
5000  END


Использованы материалы "Википедии" и страницы "Hunt The Wumpus" (BASIC computer game, genesis of Wumpus, history), The Best of Creative Computing Vol. 1 (1976).


НПП "СЕМИКО" (383) 271-01-25 (многоканальный)