Лунолёт XXI, версия 2.5 |
Главная / ЭКВМ / Программы для ЭКВМ / Игры |
Автор программы: paul-161, опубликовано: http://community.livejournal.com/mk_152/46577.html Доброго времени! Выкладываю обновлённый Лунолёт-XXI. Максимально приблизил его к интерфейсу "Гравилёта", теперь обе программы дополняют друг друга. Можно летать от лунных кратеров до газовых гигантов у далеких звёзд. Летать на керосинно-кислородном движке или на гравитационном приводе Пятой культуры. Перевозить грузы по Ганимеду и пролетать над серными вулканами Ио. Ну и разбиваться о ледяные скалы Плутона или сгорать в короне красного гиганта, конечно, тоже можно. Итак - взлёт! Изменения от версии 1.1I. ИнтерфейсПеределан в стиле "Гравилёта". Экран картины рельефа убран из программы. Список выводимых параметров: ALTD - высота над рельефом (в режиме 1) и над нулевым уровнем (в режиме 2) VERT - вертикальная скорость VHOR - горизонтальная скорость VORB - орбитальная скорость на текущей высоте (перед стартом выводится 0) OVER - текущая перегрузка (кратность g) FUEL - остаток топлива RNGn (в режиме 1) или ANGn (в режиме 2) - расстояние (линейное или угловое) до выбранной базы n Время полета в формате ЧЧ:ММ:СС Переключение режимов 1 и 2 делается клавишей "ВП". Выбор текущей базы - клавишами 1, 2, 3 и 0 (ноль соответствует главной базе - месту старта). Нажатием клавиши "," можно вызвать информацию о планете/луне - её название, радиус, ускорение силы тяжести, максимальную высоту гор (или ледяных торосов), а также общий счет пилота. Вернуться в основной режим можно клавишей "," или "СХ". В основном режиме перейти к вводу маневра можно клавишей "В1". Повторить предыдущий маневр - клавишей "СХ". Записать состояние полёта в файл - клавишей "Ввод". Закончить полёт (только если лунолет находится на поверхности, т.е. высота равна 0) - клавиша "Выход". После нажатия "В↑" в стеке показаны сверху вниз запас топлива, предыдущие угол, расход и время маневра. Ввод маневра делается, как и раньше: угол В↑ расход В↑ время С/П Перегрузка выше 3g работает так же, как и раньше, с потерей сознания (выводится сообщение, нужно нажать любую клавишу). Проверяется расход топлива, если он выше 5% от полной массы - делается равным этим 5% (время маневра пересчитывается автоматически). Маневр не принимается, если время задано больше 100 с. II. Перевозка грузовВместо времени можно ввести вес принимаемого на борт груза (в т.ч. 0) со знаком "-". Прием груза делается только на базах, сброс (обнуление) - в любой момент. Аварийным сбросом можно воспользоваться для спасения корабля при нехватке топлива для посадки. Максимальный вес груза - 100 кг. Вес лунолёта без топлива и груза - 2100 кг (один пилот). III. ПланетаПри запуске программы (В/О С/П), если нет сохраненного файла или начинается новый полет, выводится меню выбора места действия (выбор - цифровыми клавишами). 0 - полет на Луне 1 - "задание": случайный выбор из списка: Луна, Меркурий, Плутон, Ио, Европа, Ганимед, Каллисто, Новая Селена 2 - Новая Селена. Новая Селена - это случайно создаваемая (алгоритмом из "Планетного конструктора", см. ТМ №7/85) луна планеты Новый Эдем, открытой экспедицией "Гравилёта-XXI" (см. описание его версии 2.0). Радиус луны - от 1 до 3 тыс. км, максимальная высота гор от 0 д 10 км. Пункты 1 и 2 считаются режимом повышенной сложности. В этом случае все полученные при посадке на базы очки удваиваются. Высота гор принята 5,8 км для Луны, 3, 7 км для Меркурия, 9 км для Ио, 100 м для Европы, 1 км для Ганимеда и Каллисто, 3 км для Плутона (последняя цифра научными данными не будет обоснована аж до 2015 года, когда до Плутона долетит станция New Horizons - пожелаем же ей удачи!). IV. БазыНа любой луне/планете есть 4 базы - главная и три форпоста, случайно размещаемых на поверхности. Задача пилота - посетить как можно больше форпостов и вернуться на главную базу. Посадка на базу считается успешной, если произошла не далее 1 км от её центра. Очки начисляются в момент посадки в зависимости от удаленности центра базы и точки посадки (от 0 до 100 очков). За привезенный на форпост груз дополнительно дается число очков, равное весу груза в момент посадки. При мягкой посадке на форпосте лунолет полностью заправляется топливом. После этого данный форпост исчезает из списка баз (точнее, "переносится" на главную). Посадка считается мягкой при полной скорости до 5 м/с. При скорости от 5 до 10 м/с результат случаен - чем больше скорости, тем больше вероятность гибели. При скорости выше 10 м/с пилот погибает. При мягкой посадке на главной базе полёт заканчивается (с выводом финального экрана). При аварии счет пилота обнуляется, и также выводится финальный экран (с общим временем полета, счетом и удалением точки посадки/гибели от главной базы). V. РельефСправа на экране в режиме индикации выводится вертикальная шкала рельефа под лунолетом. Высота всего экрана равна в масштабе максимальной высоте гор луны или планеты. Над шкалой рельефа выводится горизонтальная черта - символ лунолета (если высота полета меньше максимальной высоты гор). Рельеф меняется случайно и в целом произвольно (но горы малой высоты встречаются чаще). Стартовый кратер (с нулевой высотой рельефа) простирается на 0,5 углового градуса (15 км для Луны) в обе стороны от главной базы. VI. МасконыПредполагается наличие масконов на всех лунах/планетах программы. Маскон (встречающийся случайно) действует так: при пролете над ним ускорение силы тяжести возрастает на случайную величину от 0 до 100%, моделируя таким образом "синдром Перепёлкина" - пилот в орбитальном полёте не сразу замечает падение высоты. При следующем маневре сила тяжести уже будет нормальной для данной луны/планеты. Версии2.1
Значение "Курс" на финальном экране - это просто случайное направление полёта, чтобы на карте прикинуть, где именно побывал лунолёт (первый удачный рейс был, например, в Залив Зноя к "северо-западу" от центра имени Королёва, который, как известно, имеет лунные координаты 0:0 градусов). При выходе клавишей "Выход" в режиме задания оно считается невыполненным, если не посещены все три форпоста, и в этом случае счет обнуляется. Очки сохраняются, если посещены три форпоста без возвращения на главную базу. 2.2
После удачной посадки вне базы (ALTD=0) можно клавишей "Выход" по радио вызвать луноход-заправщик с базы, предварительно выбранной клавишами 0-3. Заправщик с немалым трудом забирается на ледяной торос или стенку кратера и полностью заправляет лунолёт. За это с пилота снимается сумма очков, равная двадцатикратному расстоянию до выбранной базы в километрах. После этого можно лететь дальше (в том числе к базе, посылавшей заправщик). Груз можно принимать только на главной базе (перед стартом в самом начале миссии). 2.3 Полностью переделана система заправки и перевозки грузов. 1. Топливо Находясь на поверхности (на любой базе или вне баз) пилот перед взлётом загружает топливо, введя его в режиме задания манёвра со знаком "-". Остальные регистры стека роли не играют. Введенная масса (без минуса) добавляется к текущему запасу топлива. Это можно делать любое число раз, пока лунолёт стоит на поверхности. 2. Цена топлива За заправку пилот платит очками со счета по курсу 1 очко за 10 кг топлива. Отрицательным счет не становится. Если заправка делается вне баз (независимо от расстояния), курс повышается вдвое. Это цена доставки. 3. Баки и масса лунолёта Топливо загружается в виде легкосплавных универсальных кассет ЛУК-100, каждая из которых вмещает 100 кг горючего и окислителя, имея собственный вес 10 кг. Поэтому запас топлива имеет смысл брать кратным 100 кг, чтобы место в кассете не пустовало. Сухая масса вычисляется при загрузке топлива как масса нужного числа кассет + масса двигателя (1000 кг) + масса системы жизнеобеспечения, кресел, пульта управления, купола и стабилизаторов (600 кг) + масса пилота в скафандре (150 кг). Масса выводится на экране данных о планете/луне в виде "сухая масса + масса груза". 4. Груз Груз принимается на лунолёт автоматически при посадке на любую базу, а также перед вылетом с главной базы. Вес груза задаётся случайно от 0 до 140 кг. Также возможен вариант перевозки пассажира - тогда вес груза равен 150 кг. Вес груза или пассажира прибавляется к счету пилота при разгрузке - т.е. удачной посадке на главной базе или форпосте. Сбросить груз теперь нельзя. 5. Время заправки/погрузки При заправке на базе составляет 10 минут. Вне базы - 1 час 40 минут (учитывая путь заправщика к лунолёту). Добавляется к общему времени полёта. 6. Двигатель Теперь один и тот же на всех планетах/лунах. Работает на неорганической нефти, имеет скорость истечения газов 3660 м/с. Классика. 7. Масконы Сила нелунных масконов снижена вдвое (их аномалия теперь от 1 до 5%). 8. Режимы полёта При выборе пункта "1" в меню выбора задания (тренировочный режим) пилот получает только половину возможных очков, но для успеха миссии нужно посетить только один (любой) форпост и вернуться на главную базу. В режиме задания (пункты "2" и "3") надо посетить все три форпоста и вернуться на главную базу. Новая Селена теперь не даётся заданием при выборе пункта "2". 2.4 1. Все величины при выводе на экране округляются до сотых долей. 2. Исправлено некорректное вычисление расстояний и углов до баз, если лунолёт находился "в другом полушарии", а также ошибка задания манёвра при превышении запаса топлива. 3. На шкале высоты выводится три полосы. Средняя - текущая высота рельефа под лунолётом в масштабе "высота экрана = максимальная высота гор на планете". Полосы слева и справа - соседние горы ("вид из кабины"). Ширина полос - не в масштабе, расстояние до соседних гор неизвестно (нет атмосферы - другие оптические эффекты). Лунолёт рисуется горизонтальной чертой над средней полосой шкалы. По мере полёта шкала смещается влево или вправо. 4. Заправка теперь может осуществляться на расстоянии не более 50 км от базы или форпоста. 5. В стартовом меню после выбора задания программа задаёт вопрос о ранцевых двигателях (РД). Ответ - 0 или 1. Если пилот берёт скафандр с РД, его вес увеличивается до 200 кг (вес пассажира - аналогично). Если лунолёт терпит катастрофу (падает с пустыми баками), можно в режиме индикации нажать клавишу "Выход" - произвести катапультирование. Лунолёт падает, сухая масса становится равной 180 кг, вес груза - 0, вес топлива в РД - 20 кг. Если пилот успешно садится на РД (в любом месте планеты/луны), очков он не получает, но и не теряет ранее набранные. Пассажир садится автоматически на собственном РД. 6. Вес груза, автоматически получаемого на базе/форпосте, составляет от 0 до веса пассажира (150 или 200 кг). Если в лунолёт садится пассажир (вероятность 50%), то на экране данных о планете (клавиша "ВП") около веса груза ставится символ "п". 7. Уже посещённые форпосты не выбираются на экране индикации. 8. Перегрузки после 3g приводят к потере сознания с возрастающей вероятностью вплоть до 6g. После 6g потеря сознания гарантирована. 9. Новая Селена снова может даваться в качестве места действия при заданиях. 10. Стартовый кратер с нулевой высотой рельефа расширен до 1 градуса в обе стороны от главной базы. 11. Введён режим тренировки. Нужен для оценки планеты перед получением задания (компьютерный тренажёр на базе). Включается командой "0" в режиме ввода манёвра (только на главной базе перед вылетом). Форпостов нет. Спасательной миссии (см. ниже) нет. Очки, соответственно, получить нельзя. Заправка бесплатна. Если пилот погибает, его счёт не обнуляется. 12. Режим "Спасатели" Выбирается в главном меню клавишей "3". На поверхности планеты/луны в неизвестном месте находится потерпевший аварию одноместный лунолёт. Его радио передаёт сигналы бедствия, которые, однако, сильно экранируются горами. Запас кислорода на лунолёте составляет от 4 до 8 часов (более точных данных нет). Задача пилота - найти лунолёт и сесть в пределах 1 км от него. Если при очередном манёвре удалось принять сигнал SOS (вероятность приёма зависит от расстояния до аварийного лунолёта) - выводится сообщение с указанием направления пеленга (стрелка "влево" или "вправо"). Положение лунолёта надо вычислить, ориентируясь на это направление и частоту принятых сигналов. Можно совершать промежуточные посадки на форпостах для заправки (помня о времени, которое нужно на неё). При успехе миссии пилоту даётся 1000 очков. Если после посадки выясняется, что кислород у аварийного лунолёта закончился раньше - выводится сообщение о гибели экипажа, и очки не даются. В обоих случаях на этом миссия заканчивается. 2.5 Исправлено:
Программа "Лунолёт XXI"Версия 2.5 от 04.04.12 (2664 байта, КС 216769/207)
Текст программы для кросс-компилятора ; Лунолет-XXI ; Версия 2.5, 04.04.12 ; Регистры: ; 0,A,B - как в Лунолете-3 ; 1 - угол от главной базы ; 2,5,6 - рабочие ; 3 - угол импульса ; 4 - расход ; 7 - радиус планеты (км) ; 8 - ускорение ; 9 - время маневра ; C - константа 9023 ; D - константа 9021 ; E - константа 9000 ; 15 - выбранная база/режим индикации ; 16 - расстояние от старта ; 17 - время полета ; 18 - ускорение силы тяжести/круговая скорость ; 19 - сухая масса/признак задания ; 20 - топливо ; 21-23 - координаты баз (км) ; 24 - вес груза ; 25 - текущая высота рельефа ; 26 - максимальная высота гор/признак тренировки ; 27 - начальное ускорение силы тяжести ; 28 - счет пилота ; 29 - указатель на название планеты ; 30 - высота на участке слева ; 31 - высота на участке справа ; 32 - масса человека в скафандре ; 33 - координата сигнала SOS (км) ; 34 - оставшееся аварийному лунолету время ; 35 - признак получения SOS/перегрузок CX P M 28 PP M 9045 P GSB FIND_FILE 1 - P X!=0 START 1 + PP M 9128 PP M 9123 PP M 9128 PP M 9124 RM A P RM 25 - P X<0 PRINT ; Начинаем заново START: CX M 0 M 1 M 3 M 4 M 8 M A M B P M 16 P M 17 P M 18 P M 20 P M 25 P M 33 9 EE 3 M E 21 + M D 2 + M C 150 P M 32 +/- P M 19 P M 35 ; Выбираем место действия 2 PP M 9010 .NUM TITLE0 K M D 16 ENT 0 K M E .NUM TITLE1 K M D 24 ENT 0 K M E .NUM TITLE2 K M D 32 ENT 0 K M E .NUM TITLE3 K M D 40 ENT 0 K M E .NUM TITLE4 K M D .NUM INIT M 9 WAIT_SELECT: P GSB GET_KEY 4 - P X<0 WAIT_SELECT 4 + P X!=0 MOON 3 - P X=0 NO_RESCUE ; Аварийный лунолет 1 P M 33 K RAN 4 * 4 + 3600 * K INT P M 34 P GOTO MAKE_TASK NO_RESCUE: 1 + P X=0 NEW_SELENA MAKE_TASK: K RAN 8 * K INT P X=0 LUN1 MOON: ; Луна 150 P M 19 .NUM TITLE1 ENT 4 + P M 29 1738 M 7 3,5 ENT 1,62 K GOTO 9 LUN1: 1 - P X=0 LUN2 ; Меркурий .NUM TITLE3B P M 29 2440 M 7 4 ENT 3,7 K GOTO 9 LUN2: 1 - P X=0 LUN3 ; Ио .NUM TITLE3C P M 29 1815 M 7 9 ENT 1,8 K GOTO 9 LUN3: 1 - P X=0 LUN4 ; Европа .NUM TITLE3D P M 29 1569 M 7 0,1 ENT 1,32 K GOTO 9 LUN4: 1 - P X=0 LUN5 ; Ганимед .NUM TITLE3E P M 29 2631 M 7 1 ENT 1,43 K GOTO 9 LUN5: 1 - P X=0 LUN6 ; Каллисто .NUM TITLE3F P M 29 2400 M 7 1 ENT 1,23 K GOTO 9 LUN6: ; Плутон .NUM TITLE3G P M 29 1195 M 7 3 ENT 0,58 K GOTO 9 NEW_SELENA: ; Случайная планета/луна .NUM TITLE2 ENT 4 + P M 29 K RAN EE 1 K RAN 2 * 1 + EE 3 K INT M 7 6371 / ENT ENT 1 - 0,6904 * F EXP * 9,81 * INIT: P M 27 <-> 1 M 9 P M 15 EE 3 * K INT P M 26 P GSB RAND_HEIGHT P M 30 P GSB RAND_HEIGHT P M 31 ; Спрашиваем про ранцевые двигатели 56 ENT 0 K M E .NUM TITLE5 K M D WAIT_JETS: P GSB GET_KEY P X!=0 NO_JETS 1 - P X=0 WAIT_JETS 200 P M 32 P RM 19 K SGN * P M 19 NO_JETS: ; Генерация форпостов 4 M 2 20 M 6 RM 7 F PI * M 5 CYC_BASES: RM 5 2 * K RAN * RM 5 - K M 6 PF L2 CYC_BASES ; Генерация места сигнала SOS P RM 33 * P M 33 0 P M 24 <-> P X=0 NO_LOADING P GSB NEW_CARGO NO_LOADING: P GSB SHOW_PLANET ; Основной цикл BEGIN: CX P M 35 ; Проверка сигнала SOS P RM 34 P X>=0 PRINT P RM 33 P X!=0 PRINT P GSB CALC_RANGE ENT K ABS F SQRT F SQRT F 1/X K RAN - P X>=0 PRINT <-> K SGN P M 35 RM 8 ; Предельная перегрузка (от 3 до 6 g) 30 - F ANS / K RAN - P X>=0 PRINT 2 P M 35 PRINT: ; Вывод параметров полета 2 PP M 9010 .NUM MESS1 K M D RM A P RM 15 P X>=0 NO_SCAPE RM A P RM 25 - ENT NO_SCAPE: <-> P GSB ROUND .NUM MESS20 K M D 8 ENT 0 K M E .NUM MESS4 K M D RM B P GSB ROUND .NUM MESS22 K M D 16 ENT 0 K M E .NUM MESS2 K M D RM 0 P GSB ROUND .NUM MESS22 K M D 24 ENT 0 K M E .NUM MESS3 K M D P RM 18 P GSB ROUND .NUM MESS22 K M D 32 ENT 0 K M E .NUM MESS5 K M D RM 8 10 / P GSB ROUND 40 ENT 0 K M E .NUM MESS7 K M D P RM 20 P GSB ROUND .NUM MESS23 K M D 48 ENT 0 K M E M 2 P RM 15 K ABS 1 - P X!=0 NO_BASE 20 + M 6 PK RM 6 NO_BASE: M 6 P RM 15 P X<0 SHOW_DIST RM 6 180 * F PI / RM 7 / P GSB CALC_ANGLE M 6 .NUM MESS6 K M D P GOTO SHOW_ANGL SHOW_DIST: RM 6 P GSB CALC_RANGE M 6 .NUM MESS8 K M D SHOW_ANGL: P RM 15 K ABS 47 + PP M 9020 58 PP M 9020 32 PP M 9020 RM 6 P GSB ROUND .NUM MESS24 P RM 15 P X<0 SHOWTM .NUM MESS21 ENT SHOWTM: <-> K M D 56 ENT 0 K M E P RM 35 2 - P X!=0 OVER ; Сообщение о сигнале SOS P RM 35 P X!=0 NOT_SOS 2 / 26,5 + PP M 9020 .NUM SOS K M D P GOTO SCALES NOT_SOS: P GSB SHOW_TIME P GOTO SCALES OVER: .NUM MESS30 K M D ; Время без сознания RM 8 29 - K INT M 9 K M C .NUM MESS25 K M D 0 M 4 P GSB GET_KEY P GOTO CALC ; Рисуем шкалу высоты SCALES: P RM 30 P GSB SET_SCALE 110 P GSB DRAW_SCALE P RM 25 P GSB SET_SCALE 116 P GSB DRAW_SCALE P RM 31 P GSB SET_SCALE 122 P GSB DRAW_SCALE ; Рисуем лунолет RM A P GSB SET_SCALE 117 K M E <-> 120 PP M 9012 ; Ждем команду WAIT_COMM: P GSB GET_KEY P X!=0 SELECT_BASE 4 - P X<0 CHANGE_MODE 24 + M 6 PK RM 6 ; Проверяем посещенные базы P X!=0 WAIT_COMM RM 6 20 - SELECT_BASE: 1 + P RM 15 K SGN * P M 15 P GOTO PRINT CHANGE_MODE: 6 - P X=0 NO_PLANET P GSB SHOW_PLANET P GOTO PRINT NO_PLANET: 23 - P X=0 SAVE_FILE P GSB WRITE_FILE 2 PP M 9010 .NUM MESS31 K M D P GSB GET_KEY P GOTO PRINT SAVE_FILE: 1 + P X=0 EJECT P RM 32 200 - P X>=0 WAIT_COMM F ANS 20 - P M 19 F ANS P M 20 0 P M 24 P GOTO PRINT EJECT: 20 + P X=0 DISP_MODE P RM 15 +/- P M 15 P GOTO PRINT DISP_MODE: 1 - P X!=0 CALC ; Ввод маневра ENTER: .NUM MESS0 PP M 9026 0 RM 3 RM 4 RM 9 R/S ; Проверка получения груза/топлива P X=0 TRAINING P RM 16 P X=0 ENTER ; Переход в тренировочный режим P M 21 P M 22 P M 23 P M 33 P RM 26 +/- P M 26 P GOTO PRINT TRAINING: P X<0 FUELING M 5 RM A P RM 25 - P X=0 ENTER ; Проверяем расстояние до баз RM 9 1 - P X!=0 VALID_RANGE P RM 16 K ABS 50 - P X>=0 VALID_RANGE P RM 21 P GSB CALC_RANGE K ABS 50 - P X>=0 VALID_RANGE P RM 22 P GSB CALC_RANGE K ABS 50 - P X>=0 VALID_RANGE P RM 23 P GSB CALC_RANGE K ABS 50 - P X<0 ENTER VALID_RANGE: P RM 26 P X>=0 LOAD_FUEL RM 5 10 / ; Штраф за заправку вне базы? RM 9 * P RM 28 + K INT P X<0 NEG_SCORE CX NEG_SCORE: P M 28 LOAD_FUEL: ; Сама заправка RM 5 K ABS P RM 20 + P M 20 ; Вычисляем массу баков и полную сухую массу 2 F 10^X / K INT 10 * 1600 + P RM 32 + P RM 19 K SGN * P M 19 ; Время заправки (10 или 100 минут) P RM 34 RM 9 F 10^X 60 * - P M 34 F ANS P RM 17 + P M 17 P GOTO PRINT FUELING: ; Не забыли ли заправиться? RM B P X=0 IS_FUEL F R P RM 20 P X!=0 ENTER IS_FUEL: F R M 9 F R M 4 F R M 3 ; Проверка ограничения по расходу 5% от массы CALC: RM 4 ENT P RM 19 K ABS P RM 24 + P RM 20 + 20 / / 1 - P X>=0 CALC1 1 + / M 4 RM 9 F ANS / M 9 ; Основной расчет CALC1: P RM 17 RM 9 + K INT P M 17 P RM 34 RM 9 - P M 34 CALC2: RM 4 RM 9 / P RM 20 RM 4 - P X<0 FUEL_OK RM 4 + M 4 P GOTO CALC2 FUEL_OK: P M 20 ; Расчет ускорения P RM 19 K ABS + P RM 24 + / ; Удельный импульс 3660 * M 8 LBL2: ; Расчет скоростей RM A RM 7 EE 3 + M A RM 0 RM 8 RM 3 F SIN * RM B +/- P GSB SUB1 + M 0 P GSB SUB2 90 * F PI / RM A / ; Расчет угла RM 1 M 5 + ENT F SIN K SGN <-> F COS F ARCCOS * M 1 RM 7 F PI * * 180 / ; Расстояние от точки старта P M 16 ; Проверяем маскон P RM 27 P M 18 ; Расчет вероятности (2% за каждую минуту) RM 9 60 / 0,98 F X^Y K RAN - P X<0 NO_MASCON ; Для Луны маскон дает 1%, для других - от 1 до 5% P RM 27 1,62 - P X=0 NO_MOON 1,01 P GOTO MASC_MOON NO_MOON: K RAN 20 / 1 + MASC_MOON: P RM 18 * P M 18 NO_MASCON: RM B RM 8 RM 3 F COS * RM 7 EE 3 RM A / F X^2 P RM 18 * - RM 0 P GSB SUB1 + M B P GSB SUB2 2 / RM A + M A P RM 27 <-> / F SQRT RM 7 EE 3 * P M 18 ; Ищем высоту рельефа под лунолетом RM 1 K INT ; Стартовый кратер P X=0 START_LOC CX P M 25 P GOTO CALC_ALT START_LOC: RM 5 P GSB CALC_ANGLE ; Высота меняется с вероятностью 50% на 1 градус K ABS 0,5 F X^Y K RAN - P X<0 CALC_ALT ; Определяем, куда летим RM 0 P X>=0 TO_RIGHT P RM 25 P M 30 P RM 31 P M 25 P GSB RAND_HEIGHT P M 31 P GOTO CALC_ALT TO_RIGHT: P RM 25 P M 31 P RM 30 P M 25 P GSB RAND_HEIGHT P M 30 CALC_ALT: RM A RM 7 EE 3 - M A P RM 25 - P X<0 BEGIN ; Посадка или авария? RM 0 F X^2 RM B F X^2 + F SQRT 5 - P X>=0 SURFACE 5 / K RAN - P X<0 DEATH1 SURFACE: ; Проверка, не спасли ли аварийный лунолет P RM 33 P X!=0 IS_EJECT P GSB CALC_RANGE K INT P X=0 IS_EJECT .NUM MESS1C P RM 34 P X>=0 OTHER_END P RM 28 1 EE 3 + P M 28 P GOTO HAPPY_END ; Проверка, не катапультировались ли IS_EJECT: P RM 19 K ABS 3 F 10^X - P X<0 NO_EJECT HAPPY_END: .NUM SOSWIN ENT OTHER_END: CX P M 21 P M 22 P M 23 <-> P GOTO FINISH NO_EJECT: ; Проверка, на какой базе сели 0 M 2 20 M 6 P RM 16 K ABS K INT P X!=0 REFUEL1 3 M 2 CYC_TEST: K RM 6 P GSB CALC_RANGE K INT P X!=0 REFUEL PF L2 CYC_TEST ; Штрафной коэффициент заправки 2 M 9 P GOTO STOP_SHIP REFUEL: ; Удаляем форпост 0 PK M 6 REFUEL1: ; Заправка на базе и получение очков 1 M 9 F ANS - EE 2 ; Учитываем груз P RM 24 + K INT ; При задании удваиваем очки P RM 19 P X<0 NO_DOUBLE <-> 2 * <-> NO_DOUBLE: <-> P RM 28 + P M 28 P RM 15 K SGN P M 15 P GSB NEW_CARGO STOP_SHIP: 0 M 0 M 8 M B P RM 25 M A ; Вернулись ли на главную базу? RM 2 P X!=0 WIN P GOTO BEGIN SUB1: RM 0 * RM A / SUB2: + RM 9 * RTN ; Вывод времени в формате ЧЧ : ММ : СС SHOW_TIME: .NUM MESS9 K M D P RM 17 3600 / K D->MS M 5 K INT P GSB SHOW_DIVIDER RM 5 K FRAC 2 F 10^X * M 5 K INT P GSB SHOW_DIVIDER RM 5 K FRAC 2 F 10^X * K M C RTN ; Вывод двоеточия с пробелами SHOW_DIVIDER: K M C 32 PP M 9020 <-> 58 PP M 9020 <-> 32 PP M 9020 <-> RTN ; Нажатие клавиши GET_KEY: K GRPH GET_KEY1: PP RM 9029 K NOT P X!=0 GET_KEY1 F ANS ENT ENT 4 - P X>=0 KEY_OK 6 - P X!=0 KEY_OK 2 - P X!=0 KEY_OK 1 - P X!=0 KEY_OK 1 - P X!=0 KEY_OK 18 - P X!=0 KEY_OK 1 - P X=0 GET_KEY1 KEY_OK: <-> RTN ; Новый груз или пассажир NEW_CARGO: K RAN 2 * K INT P X!=0 NO_CARGO K RAN P RM 32 * 10 / K INT 10 * P M 24 RTN NO_CARGO: P RM 32 P M 24 RTN ; Запись в файл Luna WRITE_FILE: 0 M 5 36 M 2 ; число использованных регистров ; В цикле переписываем все регистры в ЭОЗУ REWRITE: 1 PP M 9047 PK RM 5 PK M 5 K RM 5 PF L2 REWRITE P GSB FIND_FILE M 5 1 - P X=0 SAVE_READY P GSB CREATE_FILE P GSB FIND_FILE M 5 SAVE_READY: RM 5 PP M 9128 PP M 9126 RTN ; Поиск файла Luna FIND_FILE: 0 PP M 9030 1 PP M 9120 63 M 2 READ_DIR: 3 PP M 9031 RM 2 PP M 9122 PP RM 9034 76 - P X=0 NEXT_ROW PP RM 9034 117 - P X=0 NEXT_ROW PP RM 9034 110 - P X=0 NEXT_ROW PP RM 9034 97 - P X=0 NEXT_ROW PP M 9031 PP RM 9033 4 - P X!=0 FILE_FOUND NEXT_ROW: PF L2 READ_DIR FILE_FOUND: RM 2 RTN ; Создание файла Luna CREATE_FILE: 3 PP M 9031 76 PP M 9034 117 PP M 9034 110 PP M 9034 97 PP M 9034 16 M 2 FILL_NAME: 32 PP M 9034 PF L2 FILL_NAME 4 PP M 9128 PP M 9125 RTN ; Расчет дистанции между точками CALC_RANGE: P RM 16 <-> - ENT K ABS RM 7 F PI * P GSB CORRECT_SIGN RTN ; Расчет угла между точками CALC_ANGLE: RM 1 <-> - ENT K ABS 180 P GSB CORRECT_SIGN RTN ; Коррекция знака в расчетах CORRECT_SIGN: - P X>=0 NO_CORR_DIST F ANS - <-> K SGN * ENT NO_CORR_DIST: F R RTN ; Расчет шкалы высот SET_SCALE: 64 <-> P RM 26 K ABS / 64 * - RTN ; Рисование шкалы высот DRAW_SCALE: K M E F ANS P X!=0 NO_BOX 1 + 6 PP M 9013 K RM E 63 <-> K M E 5 + PP M 9012 NO_BOX: RTN ; Округление до сотых ROUND: 100 * K INT 100 / K M C RTN ; Случайная высота рельефа RAND_HEIGHT: K RAN F X^2 F X^2 P RM 26 K ABS * RTN ; Вывод данных о планете SHOW_PLANET: 2 PP M 9010 .NUM LUNA0 K M D P RM 29 K M D 16 ENT 0 K M E .NUM LUNA1 K M D RM 7 K M C .NUM MESS24 K M D 24 ENT 0 K M E .NUM LUNA2 K M D P RM 26 K ABS K M C .NUM MESS20 K M D 32 ENT 0 K M E .NUM LUNA3 K M D P RM 27 P GSB ROUND 48 ENT 0 K M E .NUM MASS K M D P RM 19 K ABS K M C 43 PP M 9020 P RM 24 K M C P RM 32 - P X=0 NO_MAN 175 PP M 9020 NO_MAN: 56 ENT 0 K M E .NUM SCORE K M D P RM 28 K M C P GSB GET_KEY RTN ; Конец игры DEATH1: P RM 26 P X>=0 NO_CLEAR CX P M 28 NO_CLEAR: .NUM MESS1B P GOTO FINISH DEATH2: .NUM MESS1C P GOTO FINISH WIN: .NUM MESS1A FINISH: ENT 2 PP M 9010 +/- M A <-> K M D ; Проверяем выполнение задания P RM 21 P RM 22 P RM 23 + + P X!=0 NO_TASK ; На Луне надо посетить хотя бы одну базу (0 в регистре) P RM 19 P X>=0 CLEAR_SCORE P RM 21 P RM 22 P RM 23 * * P X!=0 NO_TASK CLEAR_SCORE: CX P M 28 NO_TASK: ; Счет .NUM SCORE K M D P RM 28 K M C ; Расстояние от старта/курс 16 ENT 0 K M E .NUM MESS10 K M D P RM 16 P GSB ROUND .NUM MESS24 K M D 32 ENT 0 K M E .NUM MESS11 K M D K RAN 360 * 180 - K INT K M C .NUM MESS21 K M D ; Время полета 48 ENT 0 K M E P GSB SHOW_TIME P RM 28 P X=0 LANDING P GSB FIND_FILE 1 - P X!=0 GAME_OVER 1 + PP M 9128 PP M 9124 R/S LANDING: P GSB WRITE_FILE GAME_OVER: P GSB GET_KEY R/S MESS0: .TEXT "Ввод маневра\0" MESS1A: .TEXT "Полёт окончен. \0" MESS1B: .TEXT "Взрыв и гибель! \0" MESS1C: .TEXT "Спасённых нет. \0" MESS1: .TEXT "ALTD: \0" MESS2: .TEXT "VHOR: \0" MESS3: .TEXT "VORB: \0" MESS4: .TEXT "VERT: \0" MESS5: .TEXT "OVER: \0" MESS6: .TEXT "ANG\0" MESS7: .TEXT "FUEL: \0" MESS8: .TEXT "RNG\0" MESS9: .TEXT "Время \0" MESS10: .TEXT "От старта \0" MESS11: .TEXT "Курс \0" MESS20: .TEXT " м\0" MESS21: .TEXT " гр\0" MESS22: .TEXT " м/c\0" MESS23: .TEXT " кг\0" MESS24: .TEXT " км\0" MESS25: .TEXT " с!\0" MESS30: .TEXT "Без сознания \0" MESS31: .TEXT "Файл сохранён.\0" TITLE3B: .TEXT "Меркурий\0" TITLE3C: .TEXT "Ио\0" TITLE3D: .TEXT "Европа\0" TITLE3E: .TEXT "Ганимед\0" TITLE3F: .TEXT "Каллисто\0" TITLE3G: .TEXT "Плутон\0" LUNA0: .TEXT "Название: \0" LUNA1: .TEXT "Радиус: \0" LUNA2: .TEXT "Высота гор: \0" LUNA3: .TEXT "Ускорение: \0" MASS: .TEXT "Масса: \0" SCORE: .TEXT "Счет: \0" TITLE0: .TEXT "ЛУНОЛЁТ-XXI. Версия 2.5\0" TITLE1: .TEXT "0 - Луна\0" TITLE2: .TEXT "1 - Новая Селена\0" TITLE3: .TEXT "2 - Форпосты\0" TITLE4: .TEXT "3 - Спасатели\0" TITLE5: .TEXT "Скафандры с РД?\0" SOS: .TEXT "Принят сигнал SOS!\0" SOSWIN: .TEXT "Экипаж спасён! \0" .END Файлы программ доступны на странице "Игры" |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |