PAW Техническое руководство (продолжение) music by DNK (С) 1986 Gilsoft International Ltd. (C) 1996 Alex ASP, перевод _______________________________ XII. Сборник очерков. В этой части руководства идут рассуж- дения на 9 различных тем, которые связаны с целом спектром свойств PAW, поэтому их трудно было поместить в какой-либо из вы- шепредстваленных отделов. 1) Размышления о 128K. Когда загружен PAW, используется лишь страница 0, на которой свободно 25500 байт. Страницы 1 - 7 не используются, но каждая может содержать по 16К. Таблицы Сообщений, Описания локаций, Соединений, Графики и Цветов по умолчанию могут располагаться на страницах 1 - 7, а все остальные - только на странице 0. Все строки таблиц, относящихся к локации, бу- дут храниться на тех же страницах, что и она сама. Когда вводится описание локации, нуль- строки записываются в таблицы Соединений, Графики и Цветов по умолчанию, которые будут относиться к этой строке. Опция I меню Location Text (Описание локации) вставляет строку в высшую из использован- ных страниц. Опция B того же меню исполь- зуется для инициализации новой страницы, т.е. вставляет строку на новую страницу. Вы сами должны решить, когда Вам нужно будет использовать эту опцию, но мы можем посоветовать использовать компрессор, чтобы подностью использовать доступную память, и лишь потом начинать новую стра- ницу, т.к. начав новую страницу, Вы не сможете вставлять строки на старую стра- ницу, а сможете лишь вносить изменения. В начальной базе данных локация 0 рас- положена на странице 0, и Вы должны ре- шить, будет ли локация 1 располагаться на новой странице, думая о том, что многие из таблиц могут быть расположены только на странице 0. Мы можем посоветовать хра- нить сообщения и локации не ниже страницы 1, т.к. страница 0 может быть полностью занята словарем и т.п. То же самое касается и таблицы текстов сообщений: I вставляет строку на высшую доступную страницу, B начинает новую страницу, если она была ининциализирована путем помещения в нее локации. Если Вы хотите, чтобы игра шла на 48К машинах, то, естественно, Вы должны ис- пользовать только страницу 0. 2) Границы цветов. Одной из основных проблем при работе с графикой на Спектруме является проблема цветовых атрибутов. Суть проблемы состоит в том, что в од- ном знакоместе (матрица 8х8 пикселей) не- льзя иметь более двух цветов. Знакоместа хорошо видны при использовании опции GRID в графическом редакторе. Эти два цвета - PAPER и INK - цвета включенных и выклю- ченных пикселей. Как PAPER, так и INK мо- гут принисать одно из восьми значений для каждого знакоместа. Команды FILL и SHADE заполняют область тестурой, состоящей из включенных и вы- ключенных пикселей, поэтому если Вы ис- пользуете различный INK и/или PAPER для двух смежных заполняемых областей, то мо- жете получить цветные квадраты вместо плавного соединения цветов. Это происхо- дит из-за того, что цвета второй текстуры в знакоместе изменяют цвета первоначаль- ной текстуры. Существует несколько способов борьбы с той проблемой: а) Проигнорировать ее. Такой способ ис- пользован в некоторых картинках игры TEWK. Эффект можно свести к минимуму, если не заполнять смежные области тек- стурой. б) Полностью использовать возможности текстуры. Даже используя два цвета и текстуры различной плотности, можно получить отличные картинки. в) Аккуратно позиционировать все облас- ти: проводить границу по соседним зна- коместам. Можно получить картинки в стиле кубизма. г) Смешивать цвета. Это позволяет двум заполненным по команде FILL (но не SHADE!) областям с различными цветами находиться в одном знакоместе. Сначала проводятся границы для областей А и В. Облать А заполняется, используя INK первого требуемого цвета. Область В заполняется, используя INK второго требуемого цвета. Выполняется команда BLOCK для прямоугольника С, где INK 8, а PAPER - второй требуемый цвет. Смо- три Приложение 2. 3) Программа грамматического разбора (парсер). Работа парсера заключается в том, что он сканирует введенную строку (до 125 символов) на наличие слов, хранящихся в словаре, извлекая "фразы", которые он мо- жет конвертировать в логические предложе- ния (LS). После того, как фраза была извлечена, происходит сканирование таблиц Ответов и Соединений на предмет распознавания LS. Если LS не было распознано, то печатается -SM8 ("I can't do that" "Не могу это сде- .лать") или SM7 ("I can't go in that di- -rection" "Не могу туда идти") в зависи- мости от номера глагола (т.е. если он меньше, чем 14, то печатается SM7), а за- тем запрашивается новая строка. Запрос новой строки происходит и в том случае, если действие по какой-либо причине не может произойти, например, объект слишком тяжел, или создатель игры сам вставил действие NEWTEXT. Результаты могут быть в противном случае для игрока весьма като- строфичны. Пример: GET AXE AND ATTACK -TROLL (взять топор и атаковать тролля), если у Вас нет топора, то Вы не хотите наезжать на тролля. Если LS успешно выполнено, то либо вы- деляется новая фраза, либо запрашивается новая строка, если в буфере пусто. Фразы разделяются союзами (обычно "AND" и "THEN" ("И" и "ЗАТЕМ")) и любыми знаками пунктуации. Местоимение (обычно "IT" ("ЭТО", "ТО", "ЭТОТ" и др.)) могут быть использованы для ссылки на существительное/прилага- тельное, использованное в предыдущей фра- зе, даже если она вводилась отдельно в предыдущий раз. Существительные, у кото- рых номером меньше 50, являются именами собственными и не окажут влияния на мес- тоимение. Формат логического предложения таков: (Adverb) Verb (Adjective1 (Noun1)) (pre- position) (Adjective2 (Noun2)) ,(Наречие) Глагол (Прилагательное1 (Сущес- твительное1)) (предлог) (Прилагательное2 (Существительное2)) В скобках указаны необязательные сло- ва, т.о. минимальная фраза: Verb (или Conversion Noun) Глагол (или Конверсионное Существи- тельное - это существительное с номером меньшим 20, которое при отсутствии глаго- ла будет конвертировано в глагол, напри- мер, NORTH СЕВЕР). Если Глагол опущен, то в LS будет подразумеваться предыдущий ис- пользованный глагол, например, GET SWORD AND SHIELD (взять меч и щит) будет обра- ботано корректно. Заметьте, что формат фразы, набираемой игроком, не обязательно должен строго со- ответствовать указанному. Так, фразы GET THE SMALL SWORD QUICKLY (ВЗЯТЬ МАЛЕНЬКИЙ МЕЧ БЫСТРО) QUICKLY GET THE SMALL SWORD (БЫСТРО ВЗЯТЬ МАЛЕНЬКИЙ МЕЧ) QUICKLY THE SMALL SWORD GET (БЫСТРО МАЛЕНЬКИЙ МЕЧ ВЗЯТЬ) являются эквивалентными и порождают одно и то же LS. В действительности же предло- жение, введенное игроком может быть та- ким: GET ALL. OPEN THE DOOR AND GO SOUTH THEN GET THE BUCKET AND LOOK IN IT. ВЗЯТЬ ВСЕ. ОТКРЫТЬ ДВЕРЬ И ИДТИ НА ЮГ ЗА- ТЕМ ВЗЯТЬ ВЕДРО И ПОСМОТРЕТЬ ВНУТРЬ. и породить пять (5) LS: GET ALL (ВЗЯТЬ ВСЕ) OPEN DOOR (ОТКРЫТЬ ДВЕРЬ) SOUTH (ЮГ) GET BUCKET (ВЗЯТЬ ВЕДРО) LOOK BUCKET (ПОСМОТРЕТЬ ВЕДРО) OPEN DOOR : THE опускается, т.к. нет в словаре; SOUTH : GO опускается, т.к. нет в словаре ,LOOK BUCKET: BUCKET получается из-за IT, IN - предлог, опускается. Заметьте, что DOALL не будет генериро- вать объект, описанный существительным (прилагательным)2. Это обеспечивает прос- тоту выполнения команды EXCEPT КРОМЕ, на- пример, GET ALL EXCEPT THE FISH (ВЗЯТЬ ВСЕ КРОМЕ РЫБЫ), что имеет побочный эф- вект, не позволяющий обработку фразы типа PUT ALL EXCEPT THE FISH IN THE BUCKET ЗАСУНУТЬ ВСЕ КРОМЕ РЫБЫ В ВЕДРО, т.к. здесь три существительных. 4) Вывод на экран. Символьные наборы переключаются в тек- сте путем выбора цвета 0-5, нажатия DELE- TE для генерации ESCC (управляющие коды для печати на экране) 0-5, будет работать только в том случае, если символьный на- бор с таким номером был вставлен в базу данных. ESCC 7 отрабатывается как CR (или ВК), но не переустанавливает цвета, т.к. явля- ется частью сообщения. ESCC 6 работает как TAB (табуляция), но использовать нужно остородно, т.к. часто подавляется текстовым форматтером во время печати. Цвета и символьные наборы, включенные в тексте, останутся в силе до выполнения действия NEWLINE. Например, чтобы напеча- тать число монет, что несет игрок (содер- жится, например, в флаге 100), то если учесть то, что сообщение должно содержать контрольный код для красного цвета бума- ги, то строка в таблице ответов будет вы- глядеть так: COINS MES 1 ; "<RED>You are car- rying" _ PRINT 100 MESSAGE 2 ; " coins." DONE Все сообщение будет на фоне красного цве- та. Такие сообщения называют составными, и их можно использовать для кратких опи- саний. 5) Объекты. Подчерки в тексте будут заменены во время игры на описание объекта, на кото- рый была сделана последняя ссылка коман- дами GET, DROP, DESTROY и т.п. Это глав- ным образом используется для того, чтобы GET, DROP и т.п. могли сообщить об удач- ном (или неудачном) исполнении, но можно использовать для исследования объекта (EXAM) и дпугих автоматических выдач со- общений. Флаг 53 используется для контроля вида отображения объекта на экране при исполь- зовании действий LISTOBJ И LISTAT. Если его значение равно 64 (включен 6 бит), то объекты будут выведены без перевода стро- ки между ними, формируя таким образом нормальное предложение - составной спи- сок. Возможные форматы: SM53 ("nothing" "ничего") - может возни- кнуть только с LISTAT объект SM48 (".") объект SM47 ("and ") объект SM48 (".") объект SM46 (",") объект SM47 ("and " " и ") объект SM48 (".") В дополнении, бит 7 флага 53 будет ус- тановлен (значение будет больше 127), ес- ли хотя бы один объект был напечатан. Это позволит определить, требуется или нет NEWLINE для переустановки цветов. Действию LISTAT обычно предшествует сообщение. Описание объекта составляется из пол- ного описания, находящегося в таблице описаний объектов. Предпочтительный фор- мат описания: indefinite article (adjective) noun . ex- tra text неопределенный артикль (прилагательное) существительное . дополнительный текст где неопределенный артикль "A", "An" или "Some" (в руском языке артикли отсутсву- ют). Прилагательные и существительные должны быть строчными (в русском - необя- зательно). Примеры: ,"A small key" "Маленький ключ", "Some /sand" "Немного песка" или "An orange. Ra- ther mouldy" "Апельсин. Изрядно покрыт ,плесенью". PAW извлекает описания следу- ющими путями: а) Для GET, DROP и т.п. (т.е. "_") неоп- ределенный артикль опускается, и описание печатается до первой точки, ее не вклю- чая, например, "I now have the small key." "У меня теперь есть маленький ключ.". б) Для составного списка объектов неоп- ределенный артикль из заглавного переде- лывается в строчный и описание печатается до первой точки, ее не включая, например, ."In the bag is a small key." "В сумке на- ходится маленький ключ.". Очевидно, что если Вы не используете подчерки или составные списки, то Вы мо- жете писать описания объектов так, как Вам будет угодно. Заметьте, что если объект будет яв- ляться контейнером, то должна существо- вать неиспользованная локация с таким же номером, чтобы PAW мог использовать ее как "содержимое", т.е. объекту objno. 1 будет нужна локация locno. 1, не забыв пометить этот объект как контейнер ("С") в таблице весов объектов. 6) Создание многочастевых адвентюр. Для того, чтобы создать в адвентюре большее (ударение на первый слог), а зна- чит более интересное, игровое простран- ство не жертвуя при этом качеством описа- ния локаций, Вы можете разделить игру на несколько более мелких областей. Лучше всего это делать в игре, которая содержит несколько отдельных игровых областей с единственной точкой соединения (эта точка ,носит название "bottleneck" - переводится ,как "узкое место" (дословно "бутылочное горлышко")). Пример - игра, где подняв парус на лодке Вы переплываете из первой части игры во вторую. Для того, чтобы очки, количество ходов и другая информация также попадала в сле- дую часть, Вы должны использовать дейс- твия SAVE и LOAD. Для загрузки состояния одной части игры в другую, Вы должны ис- пользовать в обеих частях одинаковое ко- личество локаций и объектов. Более того, те объекты, что могут быть перенесены из одной части в другую, должны иметь одина- ковые описания в обоих частях игры. Возьмем игру со 120ю локациями, разо- бъем ее на две части, каждая часть будет содержать по 60. Локация 60 будет сущес- твовать в обеих частях как транзитная (откуда игрок стартует и где он заканчи- вает), а также будет использован свобод- ный флаг, например, 26, который будет по- казывать, из какой части игры отгрузка. Когда игрок закончит первую часть, он пе- реносится в локацию 60, и во флаге 26 ус- танавливается 1. Часть 1 будет содержать строки: FLocation 60 Конец первой части - Приготовьтесь к от- грузке состояния игры. (При желании може- те сохранить несколько копий.) После от- грузки загружайте вторую часть и следуй- те дальнейшим инструкциям. Process 1 END _ AT 60; Конец игры? _ LET 25 1 ; Отгрузка из части 1. SAVE Часть 2 будет содержать строки: Location 0 Часть вторая - Приготовьтесь к загрузке остояния игры. FLocation 60 Любое введение ко второй части. Process 1 START _ AT0 ; Только начали игру? LOAD ; Тогда будем в другой ; локации START _ NOTEQ 26 ; Отгрузка не из пер- ; вой части GOTO 0 ; Попросим загрузить ; другую отгрузку DESC START _ AT60 ; Загрузили нужную от- ; грузку ANYKEY ; Ждем, пока прочитают ; введение RESET 1 ; Начнем игру в лока- ; ции 1 Действие RESET автоматически вызывает DESC новой стартовой локации после уста- новки всех объектов, которые не находятся у игрока, не надеты на нем и не находятся в локации 60, на свои стартовые позиции. Заметьте, что между ANYKEY и RESET можно, если нужно, поставить CLEAR, т.к. RESET не оказывает влияния на флаги. 7) Свет и Темнота. В настоящее время присутствие темноты стало чем-то типа клише для адвентюрной игры. В то же время, если разумно исполь- зовать возможность получения темноты, то она (темнота) может добавть реализма в Вашу игру. В PAW темнота создается путем установ- ки в флаг 0 значения, отличного от 0. Та- кая переустановка флага должна происхо- дить каждый раз, когда игрок входит/выхо- дит в/из затемненной зоны. Перемещение должно осуществляться при помощи GOTO в таблице ответов, чтобы можно было произ- вести действия SET и CLEAR. Если игроку можно дать источник света, то проще всего это сделать при помощи объекта 0. При этом источником света не обязательно должны быть факел или свеча. При наличии фантазии им могут оказаться инфра-красные очки или широколучевой ла- зер. Для примера рассмотрим создание цикла день-ночь. В таблице процессов 2 появятся строки: _ CYCLE EQ 5 0 ; Конец цикла LET 5 24 ; Начнем новый цикл _ NIGHT EQ 5 18 ; Наступила ночь SET 0 MESSAGE X _ DAYEQ 5 6 ; Наступил день CLEAR 0 MESSAGE y Если часть игру будет проходить в под- земелье или внутри здания, не забудьте решить, сможет ли игрок увидеть смену дня и ночи, перед тем, как будете печатать соответствующее сообщение. 8) EXTERN и загрузка картинок. Команда EXTERN может быть использована для вызова или Ваших машкодовых программ, или строк BASIC'а. Эту возможность можно использовать только в полностью сделанной игре, т.к. тогда освобождаются 4К ранее занятой памяти (оставшиеся 2К нужны для работы PAW, поэтому и не пытайтесь их ис- пользовать). Важным адресом является EXT- VEC, который печатается при загрузке PAW. Вы должны использовать значение получен- ное после записи готовой игры, в против- ном случае могут возникнуть неприятности. Для тех, кто пишет в машкоде: для то- го, чтобы PAW мог выполнять машкодовые программы, Вы должны занести три байта по адресу EXTVEC вместе с JP на стартовый адрес. Регистр IX должен быть сохранен, остальные могут использоваться без огра- ничений, но SP должен быть сбалансирован. Регистр А содержит параметр из EXTERN. Если Вы сохраните два байта по адресу EXTVEC+1, то они будут указывать на под- программу, которая выполняет BASIC'овскую строку с номером, находящимся в А. Для тех, кто пишет на BASIC'е: команда POKE EXTVEC,195 даст возможность выпол- нить по EXTERN BASIC'овскую строку с но- мером 100+параметр, т.е. EXTERN 10 выпол- нит строку 110 BASIC'а. Для перехода к следующему кондакту строка BASIC'а в кон- це должна содержать команду STOP. Нельзя использовать в BASIC'е (и в машкоде) ко- манду CLS, но по адресу EXTVEC+3 содер- жится процедура, выполняющая аналогичную функцию, т.е. команда RANDOMIZE USR EXTVEC+3 очистит экран. Адрес EXTVEC+12 содержит номер строки, куда будут печа- таться имена файлов базы данных, а адрес EXTVEC+9 является адресом подпрограммы загрузки базы данных и старта игры. В качестве примера приводится содержи- мое BASIC-загрузчика для игры, его можно (без REM'ов) сохранить на ленту (для дис- ковой версии потребуется небольшая пере- делка, и вообще, это только пример, поэ- тому загрузчик может подобным и не быть): 10 REM load game - 15 BORDER 0: PAPER 0: INK 0: REM Так не видно имя файла . 20 CLEAR 29856: REM максимальная величи- на для RAMTOP , 25 LET extvec=?????: REM Вставьте нужное число , 30 LOAD ""SCREEN$: PRINT AT 19,0;: REM Грузим картинку и не поганим ее . 40 LOAD ""CODE: REM грузим интерпретатор - 50 POKE extvec,195: REM включаем EXTERN , 60 POKE extvec+12,20: REM имена файлов базы данных - в строку 20 - 70 RANDOMIZE USR (extvec+9): REM загру- жаем базу данных и начинаем игру 100 REM строка, вызываемая EXTERN 0 110 PRINT "hello from BASIC": STOP 355 REM строка, вызываемая EXTERN 255 Строки 100-355 могут при необходимости содержать команды GOTO. Сразу же за данной программой сохрани- те заставочную картинку. После нее из PAW сохраните игру (опция "А"). Замечание: Для корректной работы PAW необходимо как минимум 2К свободного ра- бочего пространства, в противном случае BASIC начнет постепенно исчезать, осво- бождая место для PAW. RAMTOP можно пони- зить, если будете использовать свои маш- кодовые программы, но 2К должны в любом случае оставаться свободными. 9) Псевдо-интеллектуальность. Главное, что необходимо помнить, это то, что персонаж (PSI) - это словом из словаря (обычно существительным с номером меньшим 50, что означает, что это сущес- твительное - имя собственное), некоторые флаги, несколько сообщений и несколько строк в одной или нескольких таблицах процессов. Один флаг показывает, где PSI находится, сообщения дают информацию об их действиях, а таблица процессов связы- вают это все воедино. Представим себе персонажа по имени Sa- nec, который сам может ходить. В словаре он описывается как SANEC (номер 25, суще- ствительное). Флаг 20 используется для указания его местонахождения. Таблица процессов 3 работает с речью, обращенной к нему, а таблица процессов 4 описывает его действия и передвижения. Нижеприве- денные строки позволят ему ходить, если Вы его об этом попросите. Через некоторое время это ему наскучит, и он растворится в облаке дыма. Message 1 Sanec did not seem to understand what you said. Кажется, Санек не понял, что Вы ему ска- зали. Message 2 No one of that name here. Нет здесь никого с таким именем. Message 3 Sanec replies "hello" in a gruff voice. Грубоватым голосом Санек ответил: "При- вет". Message 4 Sanec wanders that way as he has nothing better to do. Санек побрел в ту сторону, так как более интересного занятия у него на данный мо- мент все равно не было. Message 5 Sanec the wizard is here. Здесь же находится волшебник Санек. Message 6 Sanec 'politely' ignores what you say. ,Санек 'вежливо' пропустил Ваши слова мимо ушей. Message 7 Sanec turns to face you and in his gruff voice announces: "I'm bored with all this, I'm off to a bigger game" and ,promptly vanishes in a puff of green smo- ke! ,Санек повернулся к Вам лицом и своим гру- ,боватым голосом сказал: "Меня все это до- стало, и ты, и вся эта демовуха, поэтому ,я сматываюсь отсюда в нормальную адвентю- ру". Сказал он это и с шумом растворился в клубах отвратительно зеленого дыма. Для начала должно быть объявлено о присутствии Санека. Для этого в таблице процессов 1, которая вызывается каждый раз при описании локации, проверяем, на- ходится ли он в одной с нами локации, т.е. равно ли значение флага 20 (его ме- стоположение) значению флага 38 (наше ме- стоположение). Заметьте, что нужно прове- рить, не находимся ли мы в локации 0, т.к. обычно эта локация содержит вводный текст. SANEC _ SAME20 38 ; Санек здесь? _ NOTAT 0 ; Не в локации 0? MESSAGE 5 ; Печатаем, что ; Санек здесь Для работы с речью, обращенной к Сане- ку, нужны строки в таблице ответов: SAY SANEC PREPTO; "ТО" может быть ; опущено, чтобы ; понимать пред- ; ложениятипа ; Глагол Существ. SAME20 38 ; Cанек здесь? PROCESS 3 ; Обработка речи DONE SAY _ PREPTO MESSAGE 2 ; Нет никого с ; таким именем DONE Cтроки в таблице процессов 3: * * PARSE ; Для конвертации ; введенной стро- ; ки в LS MESSAGE 1 ; Сюда приходит ; PARSE, если не ; сможет сконвер- ; тировать что- ; нибудь коррект- ; ное DONE ; LS испорчено, ; нельзя продол- ; жать дальнейшее ; выполнение HELLO MESSAGE 3 ; Предположим, ; HELLO есть в ; словаре, поэто- DONE ; му SAY TO SANEC ; "HELLO" срабо- ; тает _ _ LT 34 14 ; Cанеку сказали ; слово передви- ; жения? MOVE20; Есть ли проход ; в ту сторону? MESSAGE 4 ; Онпереходит ; туда, о чем иг- ; рок оповещается _ _ MESSAGE 6 ; Он туда не идет Очевидно, можно ввести много строк, чтобы Санек мог нормально понимать чело- веческую речь, но даже несколько хорощо продуманных строчек могут дать большое разнообразие ответов. В конце дадим Санеку шанс исчезнуть. когда ему надоест бродить без дела, для чего в таблице процессов 4 введем следую- щие строки: SANEC _ EQ 20 2 ; В локации 2? CHANCE 10; 10% шанс SET 20; Локация 255 не ; существует AT 2 ; Там ли мы, где ; Санек (в лока- ; ции 2)? MESSAGE 7 ; Он улетел... И еще одна строка в таблице процессов 2 для вызова регулярного вызова таблицы процессов 4: ; disappears SANEC _ PROCESS 4 Вот таким путем можно создать вполне реальный персонаж. Именно они придают иг- ре чувствореальности происходящего, осо- бенно если общение с ними дает подсказки к прохождению игры. XIII. Приложение 1. 1) Команды графического редактора. Иногда во время быстрого прередвижения линии она может исчезнуть, что связано с перерисовкой экрана. Передвижение второго конца линии (при- вязанной точки ПТ) осуществляется клави- шами: Q W E A D Z X C Перемещение происходит на пиксел за нажатие. Можно использовать Interface 2 / Plus 2 joystick port 2 или Kempston(tm) interface (SYMBOL SHIFT и J). Удерживание одновременно с нажатием перемещающих клавиш клавиши CAPS SHIFT ускоряет перемещение в 8 раз (8 пикселей за нажатие). Команды редактирования дроустринга: CAPS SHIFT и 8 - в начало дроустринга CAPS SHIFT и 6 - следующая команда CAPS SHIFT и 7 - предыдущая команда -CAPS SHIFT и 0 - удалить предыдущую ко- манду /CAPS SHIFT и 9 - удалить следующую коман- ду Все следующие команды требуют удержа- ния SYMBOL SHIFT во время нажатия на кла- вишу. Переключатели: I Inverse переключатель инверсии O Over переключатель наложения Y Grid переключатель сетки ,J Kempston(tm) joystick переключатель Команды, которые вносятся в базу дан- ных: A Абсолютный сдвиг (PLOT (точка) с вы- бранными I и O) B Прямоугольный блок заполняется атрибу- тами. Линия определяет диагональ блока. F Заполнение области. Точка старта запол- нения - конец линии (см. замечание). G GOSUB к номеру локации с масштабирова- нием. X Производит запрос цвета чернил (INK). L Рисует линию C Производит запрос цвета бумаги (PAPER). P Строит точку в конце линии, линию не рисуя -R Относительный сдвиг точки в конец линии S Заполнение области текстурой. Точка старта заполнения - конец линии (см. замечание) V Производит запрос мерцания (FLASH). Z Производит запрос яркости (BRIGHT). T Печатает выбранный символ из выбранного символьного набора на экран. Замечание: Fill (F) и Shade (S) не явля- ются полностью входимыми заново - нельзя заполнить уже заполненную область. Fill является Shade, у которой в текстуре все пиксели включены. По ENTER осуществляется выход из ре- дактирования. 2) Системные сообщения. Большинство системных сообщений содер- жат ESCC 7 для корректного размещения на экране. SM0 - используется вместо описания лока- ции, если там темно. SM1 - печатается действием LISTOBJ, если присутствует хотя бы один объект. SM2 .. SM5 - четыре промпта ввода, кото- рые выбираются случайо до тех пор, пока во флаг 42 не занесут корректный номер сообщения. SM6 - печатается парсером, если ни одну фразу ему не удалось понять. SM7 - печатается, если ни одно действие не было выполнено (или было выполнено NOTDONE) в таблице ответов для глагола с номером меньшим 14. SM8 - печатается, если ни одно действие не было выполнено (или было выполнено NOTDONE) в таблице ответов для глагола с номером большим 13. SM9 .. SM11 - печатаются действием END. SM12 - печатается кондактом QUIT SM13, SM14 - печатаются действием END. SM15 - сообщение действия OK. SM16 - сообщение действия ANYKEY. SM17 .. SM20 - сообщения действия TURNS. SM21, SM22 - сообщения действия SCORE. SM23, SM29 - первые из множества сообще- ний, печатаемых действиями манипуляций с объектами. SM30 - положительный ответ, ожидаемый кондактами END и QUIT. SM31 - отрицательный ответ, ожидаемый кондактами END и QUIT. SM32 - печатается при заполнении всего крана текстом. SM33 - маркер ввода. SM34 - курсор. SM35 - печатается при возникновении пус- того действия (тайм-аута). SM36 .. SM45 - еще несколько сообщений, печатаемых действиями манипуляций с объ- ектами. SM46 - связка между объектами при продол- жительном списке. SM47 - заключительная связка между пред- последним и последним объектами при про- должительном списке. SM48 - концовка списка объектов (печата- ется как действием LISTOBJ, так и LISTAT, поэтому будьте внимательны). SM49, SM50 - еще несколько сообщений, пе- чатаемых действиями манипуляций с объек- тами. SM51 - концовка составного предложения в PUTIN / TAKEOUT (AUTOP / AUTOT). SM52 - последнее сообщение, печатаемое действиями манипулаций с объектами. SM53 - сообщение для действия LISTAT, ес- ли не был найден ни один объект. С SM54 и дальше системные сообщения свободны, и Вы можете использовать их. PAW для других машин может использовать большее число сообщений, поэтому примите это во внимание при переносе программы с одной машины на другую. Так, например, PAW для CP/M использует SM54..SM60. 3) Функции флагов PAW. Нормальные флаги можно без ограничений использовать в игре. Автоматически умень- шающиеся флаги можно также свободно ис- пользовать, но проверьте, знаете ли Вы, в каких ситуациях происходит их уменьшение. Остальные флаги главным образом должны устанавливаться лишь специальными дейс- твиями, но необходимые проверки на то, что они содержат, могут проводиться без ограничений. Флаг 0 - когда не равен 0, означает, что в игре темно (см. объект 0). Флаг 1 - содержит количество объектов, находящихся у игрока, но не надетых на него. Следующая группа флагов уменьшается PAW'ом, если их содержимое не равно 0: Флаг 2 - при описании локации Флаг 3 - при описании локации и одновре- менно темно (Флаг 0 не равен 0) Флаг 4 - при описании локации, одновре- менно темно, одновременно отсутствует ис- точник света (объект 0) Флаги 5 .. 8 - каждый временной фрейм (каждая введенная фраза или пустое дейс- твие) Флаг 9 - каждый временной фрейм, одновре- менно темно Флаг 10 - каждый временной фрейм, одно- временно темно, одновременно отсутствует объект 0 Флаги с 11 по 28 можно свободно ис- пользовать в игре. Флаг 29 содержит флаги контроля кар- тинки, устанавливаемые действием GRAPHIC: Бит 7 - Устанавливают для принудительной отрисовки картинки (LOOK) .Бит 6 - Устанавливают для постоянной от- рисовки картинок (PICS ON) .Бит 5 - Устанавливают для постоянной не- отрисовки картинки (PICS OFF) Флаг 30 - флаг подсчета очков Флаги 31 / 32 (LSB/НSB) содержат число ходов, сделанных игроком (обычно - число фраз, извлеченных из введенного игроком) Флаг 33 - содержит глагол текущего LS Флаг 34 - содержит первое существитель- ое текущего LS Флаг 35 - содержит прилагательное первого существительного текущего LS Флаг 36 - содержит наречие текущего LS Флаг 37 - содержит максимальное число пе- реносимых объектов (изначально 4), уста- навливается действием ABILITY Флаг 38 - содержит номер текущей локации Флаг 39 - содержит текущую верхнюю строку экрана Флаг 40 - содержит режим экрана (0..4), устанавливаемый действием MODE. Бит 7 принудительно не изменяет цвет рамки эк- рана, бит 6 по заполнении экрана инициа- лизирует надпись "More.." "Дальше..". Флаг 41 - содержит номер строки для раз- деления (если не в диапазоне от 4 до 24, то 12), устанавливаемый действием PROTECT как текущая строка экрана Флаг 42 - содержит номер промпта для ис- пользования (если равен 0, то случайным образом из SM2..SM5), устанавливается действием PROMPT. Флаг 43 - содержит предлог текущего LS Флаг 44 - содержит второе существительное текущего LS Флаг 45 - содержит прилагательное второго существительного текущего LS Флаг 46 - содержит местоимение существи- тельного (обычно "IT" "ЭТО" и т.п.) Флаг 47 - содержит местоимение прилага- тельного (обычно "IT") Флаг 48 - содержит частоту пустых дейст- вий (тайм-аутов) Флаг 49 - содержит флаги управления пус- тыми действиями, устанавливаемые с помо- щью INPUT и TIME (как и флаг 48), TIMEOUT проверяет 7 бит этого флага: Бит 7 - устанавливается, если пустое действие произошло во время по- следнего фрейма Бит 6 - устанавливается, если доступны данные для обратного вызова (не используется создателем иг- ры) Бит 5 - устанавливается для автомати- ческого обратного вызова вход- ного буфера при пустом действии Бит 4 - устанавливается для печати бу- фера при выходе (используется совместно с битом 3) Бит 3 - устанавливается для ввода из нижней части экрана Бит 2 - устанавливается, чтобы пустое действие могло происходить при ANYKEY Бит 1 - устанавливается, чтобы пустое действие могло происходить при "More..." Бит 0 - устанавливается, чтобы пустое действиемогло происходить только в начале ввода Флаг 50 - содержит locno. для цикла DOALL, т.е. значение, следующее за DOALL Флаг 51 - содержит объект последней ссыл- ки команд GET / DROP / WEAR / WHATO и т.д. Печатается вместо любых подчерков в тексте. Флаг 52 - содержит силу игрока (макси- мальный суммарный вес объектов, находящихся у игрока и надетых на него - изначально 10) Флаг 53 - содержит флаги печати объектов: Бит 7 - устанавливается, если хотя бы один объект печатается как часть LISTOBJ или LISTAT Бит 6 - устанавливается для формирова- ния продолжительного списка объектов, т.е. LET 53 64 заста- вит PAW выводить список объек- тов в виде продолжающейся стро- ки, формирующей предложение. Флаг 54 - содержит местоположение объек- та последней ссылки Флаг 55 - содержит вес объекта последней ссылки Флаг 56 - равен 128, если объект послед- ней ссылки является контейнером Флаг 57 - равен 128, если объект послед- ней ссылки одеваемый Следует избегать использования флагов 58 и 59, т.к. они будут задействованы для расширения. Флаги с 60 по 255 доступны для свобод- ного использования. 4) Кондакты. 4а) Условия: AT locno NOTAT locno ATGTlocno ATLTlocno PRESENT objno ABSENT objno WORNobjno NOTWORN objno CARRIED objno NOTCARR objno ISATobjno locno+ ISNOTAT objno locno+ ZEROflagno NOTZERO flagno EQ flagno 0-255 NOTEQ flagno 0-255 GT flagno 0-255 LT flagno 0-255 SAMEflagno flagno NOTSAME flagno flagno ADJECT1 word ADVERB word GPREPword NOUN2 word ADJECT2 word CHANCE 0-99 TIMEOUT QUIT 4б) Действия (в начале указан тип): GET 4 objno DROP4 objno WEAR4 objno REMOVE 4 objno CREATE 5 objno DESTROY 5 objno SWAP5 objno objno PLACE 5 objno locno+ PUTO5 locno+ PUTIN 4 objno locno. TAKEOUT 4 objno locno. GDROPALL 5 AUTOG 4 AUTOD 4 AUTOW 4 AUTOR 4 AUTOP 4 locno COPYOO 5 objno objno COPYOF 5 objno flagno COPYFO 5 flagno objno WHATO 5 WEIGH 5 flagno objno SET 5 flagno CLEAR 5 flagno PLUS5 flagno 0-255 MINUS 5 flagno 0-255 LET 5 flagno 0-255 ADD 5 flagno1 flagno2 SUB 5 flagno1 flagno2 COPYFF 5 flagno1 flagno2 RANDOM 5 flagno MOVE5 flagno GOTO5 locno WEIGHT 5 flagno ABILITY 5 0-255 0-255 MODE5 0-4 0-3 LINE5 0-20 GRAPHIC 5 0-3 PROMPT 5 sysno INPUT 5 0-7 TIME5 0-255 0-7 PROTECT 5 PRINT 5 flagno TURNS 5 SCORE 5 CLS 5 GNEWLINE 5 MES 5 mesno MESSAGE 5 mesno SYSMESS 5 sysno PICTURE 5 locno PAPER 5 0-9 INK 5 0-9 BORDER 5 0-7 CHARSET 5 0-255 SAVEAT 5 BACKAT 5 PRINTAT 5 0-20 0-31 LISTOBJ 5 LISTAT 5 locno+ INVEN 3 DESC1 END 2 DONE3 GNOTDONE 3 OK 3 SAVE1 LOAD1 GRAMSAVE 5 RAMLOAD 5 flagno ANYKEY 5 PAUSE 5 0-255 GPARSE 5 NEWTEXT 5 BEEP5 0-255 0-255 PROCESS 5 procno DOALL 5 locno+ RESET 1 locno EXTERN 5 0-255 Обозначения: locno. корректный номер локации locno+ то же, что и locno плюс локации 252 (не создан) 253 (надет) 254 (несет игрок) 255 (текущая локация игрока) mesno. корректный номер сообщения sysno. корректный номер системного сооб- щения flagno любой флаг (от 0 до 255) procno корректный номер субпроцесса word слово требуемого типа, присутству- ющее в словаре, или "_" любое сло- во _______________________________