IF1 INCLUDE COMDEF.INC ; Include command definition ENDIF VOL EQU 0 ; Define volume number LOGIC SEGMENT BYTE ASSUME CS:LOGIC BEGIN ; Start up ; logic 05, начало обучения, первая картина: крутой берег, море, солнце. ; А.В.Хорев, обучающая программа "ГРОЗА", 1991 год. if_ isset 5 ; f5 установлен (=1) ? else_ NotNR ;┌───────────────────────────────────────────────────────────────────────────┐ ;│ Инициализация log05. │ ;│ Сюда мы попадаем только при первом вхождении в log05 по ком. new_room 5,│ ;│ выданной в log0 (см.описание new_room). При этом автоматически f5 -> 1. │ ;│ После возврата из этой части в log0 по оператору return, log0 передаст │ ;│ управление интерпретатору, который в своем следующем цикле установит │ ;│ f5 -> 0 (см.цикл работы интерпретатора). Именно поэтому управление этой │ ;│ части программы передается только один раз. │ ;│ Поэтому, если из логики будут вызываться другие логики, имеющие части │ ;│ инициализации, то они должны быть загружены и вызваны в инициализационной │ ;│ части вызывающей логики. Смотрите, например, log112.asm . │ ;└───────────────────────────────────────────────────────────────────────────┘ set_horizon 1 ; установить линию горизонта у=1 ; load_logic 4 ; call_ 4 load_logic 112 ; загрузить в память интерпретатора log112(чайки) load_pic 0 ; загрузить picture по значению v0 (v0 = 5) draw_pic 0 ; изобразить декорацию в буфере интерпретатора discard_pic 0 ; уничтожить picture в памяти load_sound 54 ; загрузить sound для привлечения внимания при ; выводе ссобщений load_sound 74 ; загрузить sound для начала картины reset 21 load_view 1 ; загрузить view-ресурс #1 (солнце) animate_obj 1 ; вкл.объект #1 в список увравл.объектов ignore_horizon 1 ; объекту #1 не замечать линию горизонта ignore_objs 1 ; объекту #1 не замечать др.объекты ignore_blocks 1 ; объекту #1 не замечать блоки set_view 1, 1 ; связать объект #1 с view #1 set_priority 1, 4 ; объекту #1 устан.приоритет 4 position 1, 110, 82 ; объекту #1 устан.нач.х=110, у=82 set_loop 1, 0 ; объекту #1 устан.цикл 0 во view #1 set_cel 1, 0 ; объекту #1 устан.кадр 0 в цикле 0 ; во view #1 load_view 232 ; дым над трубой animate_obj 2 ignore_horizon 2 ignore_objs 2 ignore_blocks 2 set_view 2, 232 ; связать объект #2 с view #232 set_priority 2, 10 ; остальное см. для объекта 1 position 2, 8, 64 set_loop 2, 3 set_cel 2, 0 load_view 32 ; полоска на воде от солнца animate_obj 5 ignore_horizon 5 ignore_objs 5 ignore_blocks 5 set_view 5, 32 ; связать объект #5 с view #32 set_priority 5, 5 ; остальное см. для объекта 1 position 5, 74, 145 set_loop 5, 0 set_cel 5, 0 show_pic ; вывести на экран содержимое буфера фона status_line_on ; вывести строку состояния start_cycling 1 ; разрешить автоматич.смену кадров для объекта #1 ; в соотв. с установками по ком. set_loop и set_cel normal_cycle 1 ; кадры следуют в обычном порядке start_cycling 2 normal_cycle 2 start_cycling 5 normal_cycle 5 ; определить переменные для хранения задержек assignn 123, 5 ; задержка в циклах интерпр. для солнца assignn 124, 6 ; дыма assignn 125, 2 ; потоков assignn 126, 3 ; паров assignn 128, 6 ; облака cycle_time 1, 123 ; для объектов 1,2,5 установить задержки cycle_time 2, 124 ; в циклах интерпретации между сменой кадров cycle_time 5, 126 ; по значениям v123, v124, v126 соответственно draw 1 ; изобразить объекты 1, 2, 5 на экране, причем draw 2 ; выданная для них ранее ком. start_cycling draw 5 ; обеспечивает бесконечное прокручивание мультфиль- ; ма (цикла во view, связанного с объектом) assignn 36, 1 ; в log112 будет выбран цикл с уменьшенными чайками assignn 130, 1 ; переменная выбора сообщений call_ 112 ; вызыв. log112 (полет чаек) set_text_attribute 6, 0 ; устан.цвет символов и фона для ком.display display 24, 1, 1 ; сообщ. 1 вывести в стр.24 с позиции 1 reset 15 ; f15->0 - окно удал. автоматически assignn 21, 28 ; через 28/2 сек print 11 ; печать приглашения (сообщ. 1) sound 74, 52 ; начать исполнение мелодии 74, по оконч. ; f52 -> 0 return ; возвратить упр. в log0 NotNR: call_ 112 ; вызов log112, управляющей полетом чаек EVPR: if_ greatern 130, 2 ; v130 > 2 и isset 126 ; f126 -> 1 (мультфильм для объекта #4 закончен)? else_ KeyOn ; анимация водяных паров set_loop 4, 0 ; устан.цикл 0 во view, связанном с об.#4 set_cel 4, 5 ; устан.кадр 5 цикла 0 во view, связанном с об.#4 end_of_loop 4, 126 ; (однократно прокрутить мультфильм для объек- ; та #4, по окончании f126 -> 1) ; KeyOn: ; ожидание нажатия любой клавиши if_ not_ ; не have_key ; нажата ? else_ MSG ; нет (нажата): переход на MSG return ; да ( клавиша не нажата): возвр. в log0 MSG: increment 130 ; переменная вывода сообщений v130 = v130 + 1 if_ ; если not_ greatern 130, 6 ; v130 не больше 6 ? else_ MENU ; иначе выдать вопросы (переход на MENU) ; тогда : stop_sound ; прекратить исполнение мелодии sound 54, 52 ; привлечь внимание исполнением sound 54 print_v 130 ; вывести очередное сообщение if_ equaln 130, 2 ; v130 = 2 ? else_ EQ3 ; нет, переход на EQ3 load_view 3 ; стрелки циркуляционных потоков animate_obj 3 ignore_horizon 3 ignore_objs 3 ignore_blocks 3 set_view 3, 3 ; связать объект #3 с view #3 set_priority 3, 8 ; остальное см. для объекта 1 position 3, 55, 140 set_loop 3, 0 set_cel 3, 0 cycle_time 3, 125 start_cycling 3 normal_cycle 3 draw 3 ; нарисовать цирк.потоки return ; вернуться в log0 EQ3: if_ equaln 130, 3 ; v130 = 3 ? else_ EQ4 ; нет, переход на EQ4 load_view 31 ; пары, поднимающиеся с поверхности animate_obj 4 ignore_horizon 4 ignore_objs 4 ignore_blocks 4 set_view 4, 31 ; связать объект #4 с view #31 set_priority 4, 8 ; остальное см. для объекта 1 position 4, 55, 140 set_loop 4, 0 set_cel 4, 0 cycle_time 4, 126 start_cycling 4 normal_cycle 4 end_of_loop 4, 126 start_update 4 draw 4 ; нарисовать пары stop_update 5 ; не перерисовывать объект #5 (полоску от солнца) return ; вернуться в log0 EQ4: if_ equaln 130, 4 ; v130 = 4 ? else_ EQ5 ; нет, переход на EQ5 load_view 2 ; формирование грозового облака animate_obj 6 ignore_horizon 6 ignore_objs 6 ignore_blocks 6 set_view 6, 2 ; связать объект #6 с view #2 set_priority 6, 8 ; остальное см. для объекта 1 position 6, 45, 63 set_loop 6, 0 set_cel 6, 0 cycle_time 6, 128 draw 6 ; нарисовать облако end_of_loop 6, 128 ; прокрутить 1 раз мультфильм образования ; облака, по оконч. f128 -> 1 if_ isset 128 ; f128 -> 1 (мультфильм для объекта #6 окончен)? else_ EQ4a ; нет, переход на EQ4a ; да erase 5 ; убрать солнечную полоску на воде EQ4a: return ; вернуться в log0 EQ5: if_ equaln 130, 5 ; v130 = 5 ? else_ ENDLOG ; нет, переход на ENDLOG erase 6 ; стереть объект #6 (облако) с экрана set_loop 6, 1 ; показать облако в осях (для об.#6 установить set_cel 6, 0 ; кадр 0 цикла 1 во view 2, связанном с этим draw 6 ; объектом и нарисовать его на экране, stop_update 6 ; запретив смену кадров jump ENDLOG ; переход на ENDLOG MENU: ; вывод вопросов set 15 ; f15->1 (не убирать окно с вопросами) load_sound 7 ; загрузить звук #7, сопровождающий вывод вопросов, sound 7, 21 ; и исполнить его, по окончании мелодии f21 -> 1 print 7 ; вывести вопросы (сообщение 7) clear_lines 23, 23, 0 ; очистить строку 23 цветом 0 set_text_attribute 13, 0 ; символы цвета 13 на фоне цвета 0 для ; приглашения, кот.будет выведено в стр.23 ; (см.команду configure_screen в log01.asm) accept_input ; разрешить ввод с клавиатуры get_num 8, 40 ; по приглашению (сообщение 8) в v40 ; с клавиатуры ввести число prevent_input ; запретить ввод с клавиатуры close_window ; убрать текстовое окно с вопросами с экр. set_text_attribute 6, 0 ; восстановить цвет символов (6) и фона (0) reset 21 ; f21 -> 0 if_ equaln 40, 2 ; равно знач.v40 номеру правильного ответа (2)? else_ REPEAT ; ответ неверен, переход на метку REPEAT load_sound 90 ; загрузить звук 90, сопровожд.правильный ответ sound 90, 21 ; и исполнить его; по оконч. f21 -> 1 reset 15 ; текстовое окно с сообщ. 9 убирается assignn 21, 8 ; автоматически через 8/2 сек print 9 ; вывести сообщ. 9 reset 21 ; f21 -> 0 addn 3, 2 ; увеличить значение v3 на 2; (в v3 хранится ; текущий счет, отображаемый в строке состояния ; в верхней части экрана) assignn 30, 0 ; очистить используемые vars & flags assignn 123, 0 assignn 124, 0 assignn 125, 0 assignn 126, 0 assignn 128, 0 reset 123 reset 124 reset 125 reset 126 reset 127 reset 128 new_room 7 ; перейти в комнату #7 (внутри грозового облака) REPEAT: ; для неправильного ответа load_sound 8 ; загр.звук #8 sound 8, 21 ; и исполнить его, по оконч. f21 -> 1 assignn 21, 8 ; окно с сообщ.убрать через (v21=8)/2 сек reset 15 ; f15 -> 0 (восст.авт.стирание окна) print 10 ; вывести сообщ.10 reset 21 ; f21 -> 0 decrement 3 ; за неправ. ответ уменьшить счет на 1 (v3=v3-1) new_room 5 ; вернуться в комнату #5 ENDLOG: return ; вернуть управление в log0 MESSAGES 11 m1 db " Для продолжения нажмите Enter/Return", 0 m2 db " В жаркие летние дни с восходом солнца " db "поверхность почвы, трава и вода начинают " db "нагреваться.",10," От соприкосновения с ними нагреваются " db "и прилегающие слои воздуха. Нагретый воздух " db "становится менее плотным и более легким.",10," Вверх " db "начинают подниматься теплые воздушные потоки.", 0 m3 db " Поднимающиеся воздушные потоки выносят в атмосферу " db "водяные пары.", 10," Образуется мощный восходящий поток " db "влажного теплого воз- ", 10, "духа.", 0 m4 db " Поднимаясь вверх влажный теплый воздух охлаждается. " db "Водяные пары, содержащиеся", 10,"в нем, конденсируются, " db "превращаясь в крохотные капельки.", 10, " С этого " db "момента начинает формироваться грозовое", 10,"облако !",10 db " Проследите как это происходит.", 0 m5 db " Вершина сформировавшегося грозового облака нередко " db "достигает высоты " db "7 - 10 км, а в отдельных случаях и ", 10, "больше !", 10 db " Далее обратите внимание, как изменяется температура " db "внутри облака по мере удаления от поверхности земли.",0 m6 db " Нижняя часть грозового облака, где температура больше " db "нуля состоит из чрезвычайно мелких капелек воды;", 10 db " - средняя часть, где температура ниже нуля - из " db "переохлажденных капелек и мелких ледяных кристалликов;", 10 db " - верхняя часть, где всегда царит крепкий мороз - только " db "из кристалликов льда.", 0 m7 db " A теперь постарайтесь выбрать правильный ответ на следующий " db "вопрос :", 10 db " Какие условия необходимы для возникновения грозовых облаков?",10 db " 1. Возникновение восходящего потока воздуха.", 10 db " 2. Возникновение восходящего потока теплого, влажного " db "воздуха.", 10 db " 3. Отсутствие восходящего потока.", 0 m8 db " Я считаю правильным ответ номер : ", 0 m9 db " Вы совершенно правы !", 10," Отлично !", 0 m10 db " Увы. Ответ неверен.", 10," Придется повторить !", 0 m11 db " Летнее утро. На небе ни облачка, ярко светит солнце.", 10 db " Но ведь погода может испортиться !", 10, 10 db " A как и почему это может произойти Вы увидите дальше, " db "если не будете забывать нажимать клавишу Enter / (Return), " db "когда это разрешается.", 10, 10 db " Желаем успеха !", 0 VERYEND EQU $ LOGIC ENDS END