        IF1
INCLUDE COMDEF.INC              ; Include command definition
        ENDIF
VOL     EQU     0               ; Define volume number
LOGIC   SEGMENT BYTE
        ASSUME  CS:LOGIC
        BEGIN                   ; Start up

; logic 15; Развитие лидера молнии, грозозащита
; А.В.Хорев, обучающая программа "ГРОЗА", 1991 год.

         if_
           isset 5   ; f5 -> 1 (впервые входим в логику)?
         else_ NotNr ; нет: переход на NotNr
		     ; да :
;┌───────────────────────────────────────────────────────────────────────────┐
;│   Инициализация log15.                                                    │
;│   Сюда мы попадаем только при первом вхождении в log15 по ком.new_room 15,│
;│ выданной в log13 (см.описание new_room). При этом автоматически f5 -> 1.  │
;│   После возврата из этой части в log0 по оператору return, log0 передаст  │
;│ управление интерпретатору, который в своем следующем цикле установит      │
;│ f5 -> 0 (см.цикл работы интерпретатора). Именно поэтому управление этой   │
;│ части программы передается только один раз.                               │
;│   Поэтому, если из логики будут вызываться другие логики, имеющие части   │
;│ инициализации, то они должны быть загружены и вызваны в инициализационной │
;│ части вызывающей логики.                                                  │
;└───────────────────────────────────────────────────────────────────────────┘

	  set_horizon 1  ; f5 установлен (=1) ?
       ;   load_logic 4
       ;   call_      4

       ; развитие лидера; грозозащита

	  load_pic    0  ; загрузить picture по значению v0 (v0 = 15)  
	  draw_pic    0  ; изобразить декорацию в буфере интерпретатора
	  discard_pic 0  ; уничтожить picture в памяти
	                   
; загрузить logic-, sound- и view-ресурсы по их номеру в томах

          load_sound  31 ; сопровождение молнии
          load_sound  54 ; привлечение внимания перед выводом сообщений
          load_sound  42 ; удар молнии в крышу; якобы гром
          load_sound  112 ; приглашение к экспер. или просмотру
          load_sound  125 ; завершающая мелодия

	  load_view      28 ; облако для эксперимента (управляемое)
			    ; (управляемое, т.к.объект 0)
	  animate_obj    0         ; объект  #0 вкл.в список упр.объектов   
	  ignore_horizon 0         ; объекту #0 не замечать линию горизонта
	  ignore_objs    0         ; объекту #0 не замечать др.объекты     
          observe_blocks 0         ; объекту #0 реагировать на блоки       
	  set_view       0, 28     ; связать объект #0 с view #28          
	  set_priority   0, 11     ; объекту #0 устан.приоритет 11         
	  assignn        60, 92    ; v60 = 92 (коорд.х облака)
	  assignn        61, 29    ; v61 = 29 (коорд.y облака)
	  position_v     0, 60, 61 ; поместить объект 0 в точку, опр.v60 и v61
          set_loop       0, 0      ; объекту #0 устан.цикл 0 во view #28
     	  set_cel        0, 1      ; объекту #0 устан.кадр 1 в цикле 0  
				   ; во view #28
				                           
	  load_view      7         ; загрузить view 7 (молния)
	  animate_obj    2         ; объект  #2 вкл.в список упр.объектов   
	  ignore_horizon 2         ; объекту #2 не замечать линию горизонта
	  ignore_objs    2         ; объекту #2 не замечать др.объекты     
	  ignore_blocks  2         ; объекту #2 не замечать блоки          
	  set_view       2,  7     ; связать объект #2 с view #7          
	  set_priority   2, 10     ; объекту #2 устан.приоритет 10          
	  assignn        62, 16    ; v62 = 16 (смещ.баз.т.молнии отн.б.т.облака)
	  assignv        63, 60    ; v63 = 60
	  addv           63, 62    ; v63 = v63 + v62 (x молнии)
	  assignn        64, 121   ; v64 = 121       (y молнии)
	  position_v     2, 63, 64 ; поместить объект 2 в точку, опр.v63 и v64
          set_loop       2, 2      ; объекту #2 устан.цикл 2 во view #7
     	  set_cel        2, 0      ; объекту #2 устан.кадр 0 в цикле 2  
				   ; во view #7                        
	  load_view      5    ; загрузить view 5 (гнущееся дерево)

	  animate_obj    3         ; объект  #3 (дерево) вкл.в список упр.объектов
	  ignore_horizon 3         ; объекту #3 не замечать линию горизонта
	  ignore_objs    3         ; объекту #3 не замечать др.объекты     
	  ignore_blocks  3         ; объекту #3 не замечать блоки          
	  set_view       3, 5      ; связать объект #3 с view #5           
	  set_priority   3, 9      ; объекту #3 устан.приоритет 9          
	  position       3, 135, 84; объекту #3 устан.нач.х=0, у=68         
          set_loop       3, 0      ; объекту #3 устан.цикл 0 во view #5    
     	  set_cel        3, 4      ; объекту #3 устан.кадр 4 в цикле 0     
				   ; во view #5                            
	  load_view     30    ; загрузить view 30(заряды, наведенные
	                      ;                   облаком на объектах)
	  animate_obj    7          ; объект  #7 вкл.в список упр.объектов  
	  ignore_horizon 7          ; объекту #7 не замечать линию горизонта
	  ignore_objs    7          ; объекту #7 не замечать др.объекты     
          ignore_blocks  7          ; объекту #7 не замечать блоки          
	  set_view       7, 30      ; связать объект #7 с view #30          
	  set_priority   7, 10      ; объекту #7 устан.приоритет 10         
	  position       7, 106, 127; объекту #7 устан.нач.х=106, у=122      
          set_loop       7, 1       ; объекту #7 устан.цикл 1 во view #30   
     	  set_cel        7, 0       ; объекту #7 устан.кадр 0 в цикле 1
				    ; во view #30 (заряды на суше)
				              
	  load_view     16          ; загрузить view 16 (дом)
	  animate_obj    8          ; объект  #8 вкл.в список упр.объектов  
	  ignore_horizon 8          ; объекту #8 не замечать линию горизонта
	  ignore_objs    8          ; объекту #8 не замечать др.объекты     
          ignore_blocks  8          ; объекту #8 не замечать блоки          
	  set_view       8, 16      ; связать объект #8 с view #16          
	  set_priority   8, 13      ; объекту #8 устан.приоритет 13         
	  position       8, 50, 149 ; объекту #8 устан.нач.х=50, у=149       
          set_loop       8, 0       ; объекту #8 устан.цикл 0 во view #16   
     	  set_cel        8, 0       ; объекту #8 устан.кадр 0 в цикле 0
				    ; во view #16 (дом целый)
				              
	  load_view      33         ; загрузить view 33 (пламя)
	  animate_obj    10         ; объект  #10 вкл.в список упр.объектов  
	  ignore_horizon 10         ; объекту #10 не замечать линию горизонта
	  ignore_objs    10         ; объекту #10 не замечать др.объекты     
          ignore_blocks  10         ; объекту #10 не замечать блоки          
	  set_view       10, 33     ; связать объект #10 с view #33          
	  set_priority   10, 12     ; объекту #10 устан.приоритет 12         
	  position       10, 57, 140; объекту #10 устан.нач.х=57, у=140      
          set_loop       10, 0      ; объекту #10 устан.цикл 0 во view #33   
     	  set_cel        10, 0      ; объекту #8 устан.кадр 0 в цикле 0     
				    ; во view #33 (пламя)
; переменным присвоить значения задержек:				                   
          assignn 122,  3 ; v122 = 3  (для молнии)
          assignn 123, 11 ; v123 = 11 (для дерева)
	  assignn 124, 10 ; v124 = 10
          assignn 125,  9 ; v125 =  9
          assignn 128, 10 ; v128 = 10 (для дома)

          cycle_time  2, 122  ; объектам ## 2,3,7,8,10 установить время
          cycle_time  3, 123  ; в циклах интепр.между сменой кадров 
          cycle_time  7, 122  ; по значению v122,v123,v122,v128,v122                    
          cycle_time  8, 128  ; соответственно
          cycle_time 10, 122

          show_pic              ; изобразить декорацию на экране        
          status_line_on        ; дать строку состояния                 
          draw           0      ; изобразить объект 0 (облако)          
          stop_cycling   0      ; объекту 0 запретить авт.перебор кадров       
          stop_motion    0      ; и перемещения                         
	  draw           2      ; изобразить объект 2 (молния)          
	  draw           3      ; изобразить объект 3 (дерево)          
	  draw           7      ; изобразить объект 7 (заряды на земле)       
	  draw           8      ; изобразить объект 8 (дом)             
	  stop_cycling   8      ; объекту 8 запретить авт.перебор кадров
	  end_of_loop    2, 122 ; однократно прокрутить мультфильм для объекта 2
	                        ; (развитие молнии), по оконч. f122 -> 1
	  sound         31,  52 ; издать звук 31, по оконч. f52 -> 1

          clear_lines 23, 24, 0   ; строки 23 и 24 очистить цветом 0    
          set_text_attribute 6, 0 ; установить цвет букв 6 и фона 0     
          display 24, 1, 1        ; в строку 24 с поз.1 вывести сообщ. 1

	  assignn 130, 1; v130 = 1 -  управление выводом сообщений
	  reset   230   ; f230 -> 0 (служит для искл.части проверок; см.далее)
	  reset    15   ; f 15 -> 0 ; окно с экр.будет удал.авт.или Enter     
	  reset   235   ; f235 -> 0 (будет установлен в 1, когда молния
	                ;            попадет в крышу)

	  return        ; возврат управления в log0

NotNr:  ;display 23, 10, 18 ; не первый вход в log 0 

	if_
	  isset 230     ; f230 -> 1 ?                              
	else_ EQ1       ; нет : переход на EQ1                     
	  jump EQ9      ; да: для исключения проверок от EQ1 до EQ8
			;     сразу перейти на EQ9                 
EQ1:    if_
          equaln 130, 1 ; v130 = 1 ?          
	else_ EQ2       ; нет : переход на EQ2
			; да:                 
	  if_
	    not_        ; не
	    isset 122   ; установлен f122->1 (мультфильм молнии не закончен) ?
	  else_ EQ1a    ; нет, установлен (разрешается прод.прогр.по EQ1a)
			; да, не установлен:
	    return      ; возврат управления в log0 (до оконч.мультфильма)

EQ1a:     assignn 21, 60 ; окно удал. автоматически через (v21=60)/2 сек  
          sound   54, 52 ; исполнить звук 54 (внимание), по оконч.f52 -> 1
          print    2     ; печать сообщения 2                             
	  jump ENDLOG    ; безусловный переход на ENDLOG                  

EQ2:    if_
          equaln 130, 2  ; v130 = 2 ?          
	else_ EQ3        ; нет : переход на EQ3
			 ; да:                 
	  assignn 21, 50 ; окно удал. автоматически через (v21=50)/2 сек  
          sound   54, 52 ; исполнить звук 54 (внимание), по оконч.f52 -> 1
	  print    3     ; печать сообщения 3                             
	  jump ENDLOG    ; безусловный переход на ENDLOG                  

EQ3:    if_
          equaln 130, 3  ; v130 = 3 ?          
	else_ EQ4        ; нет : переход на EQ4
			 ; да:                 
	  assignn 21, 45 ; окно удал. автоматически через (v21=45)/2 сек  
          sound   54, 52 ; исполнить звук 54 (внимание), по оконч.f52 -> 1
	  print    4     ; печать сообщения 4                             
	  jump ENDLOG    ; безусловный переход на ENDLOG                  

EQ4:    if_
          equaln 130, 4  ; v130 = 4 ?          
	else_ EQ5        ; нет : переход на EQ5
			 ; да:                 
          set_text_attribute 14, 0     ; устан.цвет символов 14 на фоне 0
          display            23, 2, 12 ; в стр.23 с поз.2 вывести сообщ 12
				       ; ("Примерное развитие лидера молнии")
          sound             112,  52   ; издать звук 112, по оконч. f52->1
	  end_of_loop         2, 122   ; однократно прокрутить мультфильм для
				       ; объекта 2 (молния), по оконч. f122->1
	  jump ENDLOG                  ; безусловный переход на ENDLOG

EQ5:    if_
          equaln 130, 5   ; v130 = 5 ?          
        else_ EQ6         ; нет : переход на EQ6
			  ; да:                 
; бесконечный показ развития лидера (прекращается нажатием любой клавиши)
          if_
            have_key      ; клавиша нажата ?
	  else_ EQ5a      ; нет: переход на EQ5a
			  ; да: прекратить показ развития молнии
	    erase 2       ; убрать объект 2 (молнию) с экрана
	    stop_sound    ; прекратить звук
	    jump ENDLOG   ; безусловный переход на ENDLOG

EQ5a:     if_
            isset 122     ; f122 -> 1 (мультфильм молнии закончен) ?
	  else_ EQ5b      ; нет: переход на EQ5b
			  ; да:
            set_cel     2,   0 ; объекту 2 установить кадр 0
	    end_of_loop 2, 122 ; однократно прокрутить мультфильм для 
	                       ; объекта 2 (молния), по оконч. f122->1
            sound      31,  52 ; издать звук 31, по оконч. f52 -> 1

EQ5b:       return             ; возврат управления в log0

EQ6:    if_
          equaln 130, 6   ; v130 = 6 ?          
	else_ EQ7         ; нет : переход на EQ7
			  ; да:                 
          clear_lines 23, 23, 0 ; строку 23 очистить цветом 0
	  assignn     21, 55    ; окно удал. автоматически через (v21=55)/2 сек  
          sound       54, 52    ; исполнить звук 54 (внимание), по оконч.f52 -> 1
	  print        5        ; печать сообщения 5                             
	  jump ENDLOG           ; безусловный переход на ENDLOG                  

EQ7:    if_
          equaln 130, 7   ; v130 = 7 ?          
	else_ EQ8         ; нет : переход на EQ8
			  ; да: вывести вопросы                
             set 15                  ; f15->1 (текстовое окно не убирается)
             load_sound   7          ; загр.звук 7 (исп.при выводе вопросов)
	     sound 7, 21             ; исполнить звук 7, по оконч. f21->1
             print 6                 ; вывести сообщ.6 (вопросы)
             clear_lines 23, 23, 0   ; строку 23 очистить цветом 0
             set_text_attribute 13, 0; устан.цвет символов 13 на фоне 0 для    
				     ; приглашения, кот.будет выведено в стр.  
				     ; 23 (см.команду configure_screen в log01)
             accept_input            ; разрешить ввод с клавиатуры             
             get_num 7, 40           ; ввести число в v40 по приглашению,      
				     ; которым служит сообщение 7             
             prevent_input           ; запретить ввод с клавиатуры             
             close_window            ; закрыть текстовое окно (с вопросами)    
             set_text_attribute 6, 0 ; восстановить цвет символов и фона       
	     reset 21                ; f21 -> 0                                

             if_
               equaln 40, 1   ; v40 = 1 (выбран ответ 1) ?                                                                     
             else_ REPEAT     ; нет: переход на метку REPEAT (неправ.ответ)                                                    
			      ; да: ответ правильный !                    
	       load_sound  90 ; загр.звук 90, сопровожд.правильный ответ
               sound    90, 21; исполн. звук 90, по оконч. f21 -> 1          
               reset    15    ; f15 -> 0 - окно убирать автоматически        
               assignn  21, 8 ; через (v21 = 8)/2 сек                        
               print     8    ; вывести сообщение 8                          
               reset    21    ; f21 -> 0                                     
	       addn      3, 2 ; v3=v3+2 - добавить два очка за правильн.ответ
	       jump ENDLOG    ; безусловный переход на ENDLOG                

REPEAT: ; неправильный ответ
  
          load_sound   8     ; загр.звук 8 (сопровождает неправ.ответ)     
          sound        8, 21 ; и исполнить его, по оконч. f21 -> 1            
          assignn     21, 8  ; f15 -> 0 - окно убирать автоматически       
          reset       15     ; через (v21 = 15)/2 сек                       
          print        9     ; вывести сообщение 9                        
          reset       21     ; f21 -> 0                                    
          decrement    3     ; v3=v3-1 - вычесть очко за неправильный ответ
          new_room    13     ; повторить обучение в комн. 13 (ионизация) заново        

EQ8:    if_
          equaln 130, 8      ; v130 = 8 ?          
	else_ EQ9            ; нет : переход на EQ9
			     ; да:                 
          clear_lines 23, 23, 0 ; строку 23 очистить цветом 0
	  assignn     21, 35 ; окно удал. автоматически через (v21=35)/2 сек  
          sound       54, 52 ; исполнить звук 54 (внимание), по оконч.f52 -> 1
	  print       10     ; печать сообщения 10                            
	  set 230            ; f230 -> 1 (чтобы искл.проверки с EQ1 до EQ8
          set_cel 0, 0       ; объекту 0 устан.кадр 0 (облако без зарядов)
	  block  20, 0, 95, 30 ; устан.блок с коорд.углов (20,0) и (95,30)
          draw    0            ; изобр.на экр.объект 0 (облако без зарядов)
          erase   7            ; стереть объект 7 (убрать заряды с земли)
	  jump ENDLOG          ; безусловный переход на ENDLOG

EQ9:    if_
          equaln 130, 9      ; v130 = 9 ?          
	else_ EQ10           ; нет : переход на EQ10
			     ; да:                 
	  assignn     21, 45    ; окно удал. автоматически через (v21=45)/2 сек  
          sound       54, 52    ; исполнить звук 54 (внимание), по оконч.f52 -> 1
	  print       11        ; печать сообщения 11
	                               
	  clear_lines 23, 23, 0    ; строку 23 очистить цветом 0
	  set_text_attribute 14, 0 ; устан.цвет символов 14 на фоне 0
	  display     23, 9, 20    ; в стр.23 с поз.9 вывести сообщ.20
	                           ; ("управляйте облаком")
          sound      112, 52       ; исполнить звук 112, по оконч.f52 -> 1
	  start_motion 0           ; разрешить перемещ. объекта 0 (облако)
	  jump ENDLOG              ; безусловный переход на ENDLOG

EQ10:    if_
           equaln 130, 10    ; v130 = 10?          
	 else_ EQ11          ; нет : переход на EQ11
			     ; да: обязательно показать удар молнии в крышу                
	   if_
	     isset 235       ; f235 -> 1 (удар в крышу показан?) и
	     not_            ; не
	     have_key        ; нажата любая клавиша ?
	   else_ EQ10$       ; нет: переход на EQ10$
			     ; да: удар показан и нажата клавиша
	     jump ENDLOG     ; безусловный переход на ENDLOG

EQ10$:	     if_
	       center_position 0, 72, 0, 72, 99 ; центр базы объекта 0 в прямо-
	                                        ; угольнике (72,0) и (72,99) ? 
	     else_ EQ10a  ; нет (облако не над домом): переход на EQ10a
	                             
; подготовиться к показу удара молнии в крышу, когда облако над домом

	       get_posn  0, 60, 61 ; коорд.баз.точки объекта 0 (облако):
	                           ; x -> v60, y -> v61
	       assignv   63, 60    ; v63 = v60
	       addv      63, 62    ; v63 = v63+v62 (x молнии = х облака + смещ.)
	       reposition_to_v 2, 63, 64 ; переместить объект 2 (молния) в точ-
	                                 ; ку с коорд. х=v63 и у=v64
	       set_loop    2, 0      ; устан.объекту 2 кадр 0
	       set_cel     2, 0      ; в цикле 0 в связанном с ним view-ресурсе
	       assignn   122, 1      ; v122 = 1 (ускорить движение молнии)
               cycle_time  2, 122    ; уст.задержку в смене кадров для об.2 по
				     ; v122
	       stop_motion 0         ; запретить перемещение об.0 (облако)
	       draw        2         ; изобр.об.2 (молния) на экр.
	       end_of_loop 2, 122    ; однократно прокрутить мультфильм для 
				     ; объекта 2 (молния), по оконч. f122->1
	       sound 31, 52          ; издать звук 31, по оконч. f52 -> 1
               clear_lines 23, 23, 0 ; строку 23 очистить цветом 0
	       set   235             ; f235 -> 1 (облако над крышей было)
	       jump ENDLOG           ; безусловный переход на ENDLOG
	   
EQ10a:	     return                  ; возврат управления в log0

EQ11:   if_
          equaln 130, 11     ; v130 = 11?          
	else_ EQ12           ; нет : переход на EQ12
			     ; да: показать попадание молнии в крышу и пожар                 
          current_cel 2, 222 ; номер текущего кадра -> v222
     ; восьмой кадр совпадает с касанием молнии крыши
	  if_
	    not_           ; не
            equaln 222, 8  ; v222 = 8 (не восьмой кадр) ?
	  else_ EQ11a      ; нет: переход на EQ11a
	    return         ; возврат управления в log0 (до 8-го кадра)

EQ11a: ; молния визуально коснулась крыши => показать разрушение дома.
       ; Наложением мультфильма разрушающегося дома на мультфильм пламени
       ; иммитируем пожар.
       ; Подготовка к показу пожара:
	  set_loop    8, 0  ; объекту 8 установить цикл 0
          set_cel     8, 1  ; объекту 8 установить кадр 1
	  draw        8     ; изобр.объект 8 (дом) на экр.в виде кадра 1
	  end_of_loop 8, 128; прокрутить 1 раз мультфильм для об.8 (разрушение),
			    ; по оконч. f128 -> 1
          sound 42, 52      ; сопроводить касание звуком 42, по оконч. f52 -> 1

          draw 10           ; изобр.об.10 (пламя) за объектом 8 (см.приоритеты)
	  start_cycling 10  ; объекту 10 разрешить авт.смену кадров

	  jump ENDLOG       ; безусловный переход на ENDLOG

EQ12:   if_
          equaln 130, 12     ; v130 = 12?          
	else_ EQ13           ; нет : переход на EQ13
			     ; да: показать пожар                
          if_
            not_             ; не
            isset 128        ; установлен f128 (не закончился мультфильм
			     ; разрушения дома) ?
          else_ EQ12a        ; нет (закончился): переход на EQ12a
			     ; да (не закончился):
            return           ; возврат управления в log0 (до окончания)

EQ12a: ; обязательно показать полностью разрушение дома
        if_
          isset 128          ; установлен f128 и
	  not_               ; не
	  have_key           ; нажата клавиша ?
	else_ EQ12b
			     ; да (показывать горение остатков дома)
	  return             ; возврат управления в log0 (до нажатия люб.клав.)

EQ12b: ; после нажатия любой клавиши: 
        clear_lines 23, 23, 0 ; строку 23 очистить цветом 0
        assignn     21, 50    ; окно удал. автоматически через (v21=50/2) сек  
        sound       54, 52    ; исполнить звук 54 (внимание), по оконч.f52 -> 1
        print       13        ; печать сообщения 13                            
        jump ENDLOG           ; безусловный переход на ENDLOG                  

EQ13:  ; после пожара: 
        if_
          equaln 130, 13     ; v130 = 13?          
	else_ EQ14           ; нет : переход на EQ14
			     ; да:                 
	  assignn     21, 60 ; окно удал. автоматически через (v21=60/2) сек   
          sound       54, 52 ; исполнить звук 54 (внимание), по оконч.f52 -> 1
	  print       14     ; печать сообщения 14                            

          erase 10           ; убрать объект 10 (пламя)
	  set_loop     8, 0  ; объекту 8 установить цикл 0
	  set_cel      8, 0  ; объекту 8 установить кадр 0 в цикле 0
	  draw         8     ; нарисовать объект 8 (целый дом)
	  stop_cycling 8     ; запретить авт.смену кадров для об.0
	  jump ENDLOG        ; безусловный переход на ENDLOG

EQ14: ; начало объяснения принципов грозозащиты
 
        if_
          equaln 130, 14     ; v130 = 14?          
	else_ EQ15           ; нет : переход на EQ15
			     ; да:                 
	  assignn     21, 60 ; окно удал. автоматически через (v21=60/2) сек  
          sound       54, 52 ; исполнить звук 54 (внимание), по оконч.f52 -> 1
	  print       15     ; печать сообщения 15
	                              
     ; подготовиться к показу действия молниеотвода:

	  load_view     17   ; загрузить view 17 (молниеотвод)
	  animate_obj    9          ; объект  #9 вкл.в список упр.объектов  
	  ignore_horizon 9          ; объекту #9 не замечать линию горизонта
	  ignore_objs    9          ; объекту #9 не замечать др.объекты     
          ignore_blocks  9          ; объекту #9 не замечать блоки          
	  set_view       9, 17      ; связать объект #9 с view #17          
	  set_priority   9, 11      ; объекту #9 устан.приоритет 11         
	  position       9, 98, 119 ; объекту #9 устан.нач.х=98, у=119      
          set_loop       9, 0       ; объекту #9 устан.цикл 0 во view #17   
     	  set_cel        9, 0       ; объекту #9 устан.кадр 0 в цикле 0     
				    ; во view #17 (молниеотвод)
	  erase          2          ; стереть объект 2 с экрана
	  load_view     34          ; загрузить view 34 (молнии при ударе
	                            ; в молниеотвод)
          load_sound    94          ; загр.звук 94 (сопров.стекание заряда
	                            ; по молниеотводу)
	  animate_obj    2       ; объект  #2 вкл.в список упр.объектов  
	  ignore_horizon 2       ; объекту #2 не замечать линию горизонта
	  ignore_objs    2       ; объекту #2 не замечать др.объекты     
          ignore_blocks  2       ; объекту #2 не замечать блоки          
	  set_view       2, 34   ; связать объект #2 с view #34           
	  set_priority   2, 10   ; объекту #2 устан.приоритет 10         
          set_loop       2, 2    ; объекту #2 устан.цикл 2 во view #34
     	  set_cel        2, 0    ; объекту #2 устан.кадр 0 в цикле 2 
				 ; во view #34                        
	  assignn       62, 2  ; v62=2 (смещение базовых точек молнии и облака)
	  assignn       64, 47 ; v64 =47 (коорд. y баз.точки молнии)

	  set_text_attribute 14, 0 ; устан.цвет символов 14 на фоне 0     
	  display 23, 9, 20        ; в стр.23 с поз.9 вывести сообщ.20
				   ; ("управляйте облаком")               
          sound 112, 52            ; исполнить звук 112, по оконч.f52 -> 1
	  start_motion 0           ; разрешить перемещ. объекта 0 (облако)
	  draw         9           ; изобр. объект 9 (молниеотвод)
          stop_cycling 9           ; запретить авт.перебор кадров для об.9
	  reset 222                ; f222 -> 0

	  jump ENDLOG              ; безусловный переход на ENDLOG

EQ15:   if_
          equaln 130, 15     ; v130 = 15?          
	else_ EQ16           ; нет : переход на EQ16
			     ; да:                 
	   if_
             isset 231       ; f231 -> 1 (был показан хотя бы 1 удар) и
	     have_key        ; нажата любая клавиша ?
	   else_ EQ15$       ; нет: перход на EQ15$
			     ; да: завершить показ действия молниеотвода
             jump ENDLOG     ; безусловный переход на ENDLOG

EQ15$:     if_
	       not_          ; не
	       isset 222     ; установлен f222 ?
	     else_ EQ15a     ; нет (установлен): переход на EQ15a

	     if_
	       center_position 0, 99, 0, 99, 99 ; центр базы об.0 (облако)
						; в прямоугольнике заданном
						; углами (0,99) и (0,99) ?
	     else_ EQ15c     ; нет: переход на EQ15c (прод.движение облака)
	                     ; да:        
      ; подгот. к показу удара молнии, когда облако над молниеотводом

	       get_dir 0, 100      ; в v100 занести код направл.движ. об.0
	       stop_motion 0       ; запретить перемещение объекта 0 (облако)
	       get_posn  0, 60, 61 ; занести коорд.баз.т. об.0 в v60(x) и v61(y)
	       assignv   63, 60    ; v63 = v60
	       addv      63, 62    ; v63 = v63 + v62 (пересчит. x молнии)
	       reposition_to_v 2, 63, 64 ; переместить об.2 (молнию) в x = v63
	                                 ; и y = v64
	       set_loop 2, 2       ; объекту 2 устан. цикл 2
	       set_cel  2, 0       ; объекту 2 устан. кадр 0
               draw     2          ; изобр.объект 2 (молния уд. в молниеотвод)
	       end_of_loop 2, 122  ; показать 1 раз мультфильм для об.2, f122->1
	       sound 31, 52        ; издать звук 31, по оконч. f52->1
	       set   222           ; f222 -> 1
	       reset 229           ; f229 -> 0
	       return              ; возврат управления в log0

EQ15a:  if_
          not_       ; не
	  isset 122  ; установлен флаг 122 ?
	else_ EQ15b  ; нет: переход на EQ15b
	  return     ; возврат управления в log0

EQ15b:  if_
          not_       ; не                   
	  isset 229  ; установлен флаг 229 ?
	else_ EQ15ba ; нет: переход на EQ15ba

          set_cel      9, 1   ; объекту 9 установить кадр 1
          end_of_loop  9, 129 ; показать стекание заряда по молниеотводу,f129->1
          sound       94, 52  ; сопроводив показ звуком 94, по оконч. f52->1
	  set        229      ; f229 -> 1
	  return              ; возврат управления в log0

EQ15ba: if_
          not_                ; не
          isset 129           ; установлен флаг 129 ?
        else_ EQ15b0          ; нет: переход на EQ15b0
	  return              ; возврат управления в log0 (пок.стекание заряда)
        
EQ15b0: stop_sound            ; прекр.звук (заряд стек)
        if_
          equaln 100, 3 ; v100 = 3 (облако двигалось вправо) ?
	else_ EQ15b1    ; нет (влево): переход на EQ15b1
			; да:
        addn 60, 1      ; v60 = v60 + 1
	jump EQ15b2     ; безусловный переход на EQ15b2

EQ15b1: subn 60, 1      ; v60 = v60 - 1

EQ15b2: reposition_to_v 0, 60, 61 ; переместить об.0 (облако) в точку x(v60) и
				  ; y(v61)
        start_motion 0            ; разрешить перемещения облака
        reset 222                 ; f222 -> 0
	reset 229                 ; f229 -> 0
        set   231     ; f231->1 (удар в молниеотвод был показан хотя бы 1 раз)
EQ15c:  set_cel 9, 0  ; объекту 9 устан.кадр 0
        draw    9     ; изобразить об.9 (молниеотвод без заряда)
        return        ; возврат управления в log0 (прод.показ действия защиты)
	    

EQ16:   if_
          equaln 130, 16     ; v130 = 16?          
	else_ EQ17           ; нет : переход на EQ17
			     ; да: вывести вопросы
			                      
             set 15                  ; f15->1 (текстовое окно не убирается)    
	     assignn 40, 0           ; загр.звук 7 (исп.при выводе вопросов)   
	     sound 7, 21             ; исполнить звук 7, по оконч. f21->1      
             print 16                ; вывести сообщ.16 (вопросы)               
             clear_lines 23, 23, 0   ; строку 23 очистить цветом 0             
             set_text_attribute 13, 0; устан.цвет символов 13 на фоне 0 для    
				     ; приглашения, кот.будет выведено в стр.  
				     ; 23 (см.команду configure_screen в log01)
             accept_input            ; разрешить ввод с клавиатуры             
             get_num 7, 40           ; ввести число в v40 по приглашению,      
				     ; которым служит сообщение 7              
             prevent_input           ; запретить ввод с клавиатуры             
             close_window            ; закрыть текстовое окно (с вопросами)    
             set_text_attribute 6, 0 ; восстановить цвет символов и фона       
	     reset 21                ; f21 -> 0                                

             if_
               equaln 40, 3    ; v40 = 3 (выбран ответ 3) ?                 
             else_ REPEAT1     ; нет: переход на метку REPEAT (неправ.ответ)
			       ; да: ответ правильный !                     
               sound    90, 21 ; исполн. звук 90, по оконч. f21 -> 1          
               reset    15     ; f15 -> 0 - окно убирать автоматически        
               assignn  21, 8  ; через (v21 = 8)/2 сек                        
               print     8     ; вывести сообщение 8                          
               reset    21     ; f21 -> 0                                     
	       addn      3, 2  ; v3=v3+2 - добавить два очка за правильн.ответ
	       jump ENDLOG     ; безусловный переход на ENDLOG                

REPEAT1: ; неправильный ответ

          load_sound   8   ; загр.звук 8 (сопровождает неправ.ответ)     
          sound     8, 21  ; и исполнить его, по оконч. f21 -> 1         
          assignn  21, 8   ; f15 -> 0 - окно убирать автоматически       
          reset    15      ; через (v21 = 15)/2 сек                      
          print     9      ; вывести сообщение 9                         
          reset    21      ; f21 -> 0                                    
          decrement 3      ; v3=v3-1 - вычесть очко за неправильный ответ

	  assignn 130, 8   ; v130 = 8 (чтобы повторить непонятый кусок)
          reset 230        ; f230 -> 0
          reset 231        ; f231 -> 0
          reset 235        ; f235 -> 0
          erase   9        ; убрать об.9 (молниеотвод)
          erase   2        ; убрать об.2 (молнию)

	  load_view      7 ; загр. view 7 (молния, ударяющая в дом)
	  animate_obj    2        ; объект  #2 вкл.в список упр.объектов       
	  ignore_horizon 2        ; объекту #2 не замечать линию горизонта     
	  ignore_objs    2        ; объекту #2 не замечать др.объекты          
	  ignore_blocks  2        ; объекту #2 не замечать блоки               
	  set_view       2,  7    ; связать объект #2 с view #7                
	  set_priority   2, 10    ; объекту #2 устан.приоритет 10              
	  assignn        62, 16   ; v62 = 16 (смещ.баз.т.молнии отн.б.т.облака)
	  assignv        63, 60   ; v63 = 60                                   
	  addv           63, 62   ; v63 = v63 + v62 (x молнии)
	  assignn        64, 121  ; v64 = 121       (y молнии)
	  position_v     2, 63, 64; поместить объект 2 в точку, опр.v63 и v64  
          set_loop       2, 2     ; объекту #2 устан.цикл 2 во view #7         
     	  set_cel        2, 0     ; объекту #2 устан.кадр 0 в цикле 2          
				  ; во view #7                                 
	  return                  ; возврат управления в log0

EQ17:   if_
          equaln 130, 17       ; v130 = 17?          
	else_ EQ18             ; нет : переход на EQ18
			       ; да:                 
	  assignn      21, 25  ; v21 = 25
          sound       125, 52  ; исп.мелодию 125, по оконч. f52 -> 1

	  if_
	    equalv 3, 7        ; v3 = v7 (текущий счет равен максимальному) ?
	  else_ EQ17a          ; нет: переход на EQ17a
			       ; да (набрано макс. кол-во очков):
	    print       17     ;    вывести сообщ.17
            jump ENDLOG        ; безусловный переход на ENDLOG

EQ17a:    print 18             ; вывести сообщ.18 (кол-во очков не макс.)
          jump ENDLOG          ; безусловный переход на ENDLOG


EQ18:   if_
          equaln 130, 18     ; v130 = 18?          
	else_ EQ19           ; нет : переход на EQ19
			     ; да:                 
          assignn     21, 10 ; окно удал. автоматически через (v21=10)/2 сек
	  print       19     ; вывести сообщ.19 
          unanimate_all      ; исключить все объекты из списка управления
          jump ENDLOG        ; безусловный переход на ENDLOG

EQ19:   if_
          equaln 130, 19     ; v130 = 19?           
        else_ EQ19a          ; нет : переход на EQ19a
			     ; да:                  
EQ19a:    if_
            have_key         ; нажата любая клавиша?
          else_ EQ19b        ; нет: переход на EQ19b
	    quit        1    ; да: окончание без запроса

EQ19b:    if_
            isset 52         ; f52 -> 1
          else_ EQ19c        ; нет: переход на EQ19c
            sound 125, 52    ; исполнить звук 125, по оконч. f52 -> 1
EQ19c:    return             ; возврат управления в log0

ENDLOG: increment 130        ; v130 = v130 + 1
        return               ; возврат управления в log0

         MESSAGES      20    ; сообщения

m1     db   "Для продолжения нажмите Enter/Return", 0

m2     db   " Лидер молнии движется скачкообразно. За каждый скачок, "
       db   "длящийся несколько тысячных долей секунды, лидер успевает "
       db   "продвинуться на 50 - 100 м.", 10
       db   " Как только лидер приблизится к земле, навстречу ему "
       db   "устремляются положительные заряды.", 10
       db   " Образуется главный разряд молнии, который сопровождается "
       db   "ярким свечением и раскатами грома.", 0

m3     db   " В канале возникает электрический ток большой силы и мощности."
       db   " Это и есть молния!", 10, " При соединении разноименных "
       db   "зарядов происходит их нейтрализация, ток ослабевает.", 10
       db   " Но уже новый лидер прокладывает путь молнии. Небо опять "
       db   "освещается вспышкой. Процесс может повторяться многократно.", 0

m4     db   " Молния имеет вид длинной изломанной искры (до 10 км и более).",10
       db   " Когда мы видим сильно разветвленную молнию - это означает, "
       db   "что в прокладке для нее путей участвовал не один, а несколько "
       db   "лидеров.",10, 10
       db   " Просмотрите этот процесс необходимое число раз.", 0

m5     db   " Там, где проскакивает молния, воздух мгновенно нагревается "
       db   "до нескольких тысяч градусов. При этом он так резко и быстро "
       db   "расширяется, что возникает ударная волна, которая воспринимается "
       db   "нами как гром, который обычно слышен за 10 км.", 10
       db   " По времени, прошедшему между вспышкой молнии и ударом грома, "
       db   "можно определить расстояние до молнии, т.к. за 3 секунды "
       db   "звук проходит 1100 метров.", 0

m6     db   " A теперь постарайтесь выбрать правильный ответ на следующий "
       db   "вопрос :", 10
       db   " Как определить расстояние от молнии до места, где Вы "
       db   "находитесь?", 10, 10
       db   " 1. В момент вспышки посмотреть на часы и засечь время до "
       db   "удара грома.", 10
       db   " 2. В момент вспышки посмотреть на часы и засечь время до "
       db   "следующей вспышки.", 10
       db   " 3. В момент удара грома посмотреть на часы и засечь время "
       db   "вспышки молнии.", 0

m7     db   " Я считаю правильным ответ номер : ", 0
m8     db   " Вы совершенно правы !", 10,"      Отлично !", 0
m9     db   "  Увы. Ответ неверен.", 10,"  Придется повторить !", 0

m10    db   " Гроза - явление довольно опасное. Опасен, конечно, не гром - "
       db   "это просто звук, возникающий при ударе молнии. ", 10
       db   " A вот молния действительно опасна!", 10, 10
       db   " Например, попав в крышу дома, она может вызвать пожар."
       db   " Ударив в дерево или столб, может рассечь их, а иногда разбить "
       db   "в щепки."
       db   " Попав же в человека, молния может убить его или, в лучшем "
       db   "случае, оглушить!", 0

m11    db   " Почти каждая гроза оставляет после себя какие-либо жертвы и "
       db   "разрушения.", 10
       db   " Молния всегда стремится угодить в верхние части высоких "
       db   "строений, в верхушки деревьев, в вершину горы, а в пустынном "
       db   "и ровном поле - в стог сена или идущего человека.",10, 10
       db   " Управляя облаком, посмотрите, что может произойти!", 0

m12    db   " Примерное развитие лидера молнии ", 0

m13    db   " Если гроза застигла Вас на открытой местности, то ни в коем "
       db   "случае не укрывайтесь под одинокими деревьями, в стогах сена "
       db   "или под чем нибудь подобным!", 10
       db   " Постарайтесь спрятаться в складках местности: овраге или "
       db   "ложбине! Здесь вероятность поражения молнией значительно ниже!", 0

m14    db   " Человек давно обратил внимание на то, что заостренные стержни "
       db   '"притягивают" к себе молнию. Если такой стержень укрепить на '
       db   "высоком здании и проводом соединить его с землей, то заряд "
       db   "молнии будет стекать в землю.", 10
       db   ' Такое устройство получило название "молниеотвод".', 10
       db   " Молниеотвод, если он сделан правильно,- надежная защита от "
       db   "грозовых разрядов!", 0

m15    db   " Заостренный металлический стержень можно устанавливать не "
       db   "только на высоких зданиях, но и на специальной высокой "
       db   "деревянной мачте.", 10
       db   " Дом будет защищен от удара молнии, если находится в зоне "
       db   "защиты молниеотвода.", 10
       db   " Зоной защиты принято называть пространство вокруг молниеотвода, "
       db   "куда попадание молнии маловероятно.", 10, 10
       db   " Управляя облаком, убедитесь, что молния в дом не попадает!", 0

m16    db   " A теперь постарайтесь выбрать правильный ответ на следующий "
       db   "вопрос :", 10
       db   " Как Вы поступите, если гроза застала Вас на открытой "
       db   "местности?", 10, 10
       db   " 1. Заберусь на высокое дерево.", 10
       db   " 2. Укроюсь в ближайшем стоге сена.", 10
       db   " 3. Добегу до ближайшей низины и выберу самое сухое место.", 0

m17    db   " На этом мы заканчиваем наше краткое знакомство с грозой.", 10, 10
       db   " Вы получили максимальное количество баллов: %v3 .", 10
       db   "      Поздравляем!", 10,10 
       db   ' Если рядом с Вами есть демонстрационный стенд "ГРОЗA" '
       db   " ТО Интеп (С), то Вы можете провести на нем любопытные опыты! ",10
       db   10, "  Надеемся, что Вам было интересно !", 0

m18    db   " На этом мы заканчиваем наше краткое знакомство с грозой.", 10, 10
       db   " Вы получили %v3 из %v7 баллов. ", 10
       db   " Вероятно, Вы не всегда были внимательны.", 10, 10
       db   " Вы можете повторить програм-", 10, "му.", 10 
       db   " Надеемся, что Вы ответите на все вопросы правильно!", 0

m19    db   " В программе использованы музыкальные фрагменты игр фирмы "
       db   "(C) Sierra On-Line, Inc.", 10, 10
       db   " Space Quest I (C) 1986.", 10
       db   " King Quest ]I[ (C) 1986.", 10
       db   " Space Quest II (C) 1987.", 10
       db   " Larry (C) 1987.", 0

m20    db  ' Управляйте облаком !', 0

VERYEND EQU $
LOGIC   ENDS
        END