        IF1
INCLUDE COMDEF.INC              ; Include command definition
        ENDIF
VOL     EQU     0               ; Define volume number
LOGIC   SEGMENT BYTE
        ASSUME  CS:LOGIC
        BEGIN                   ; Start up

; logic 07, вторая комната: внутри грозового облака
; А.В.Хорев, обучающая программа "ГРОЗА", 1991 год.

        if_
          isset        5  ; f5 установлен (=1) ?
        else_  NotNR
	  
; грозовое облако с капельками и снежинками

;┌───────────────────────────────────────────────────────────────────────────┐
;│   Инициализация log07.                                                    │
;│   Сюда мы попадаем только при первом вхождении в log07 по ком. new_room 7,│
;│ выданной в log05 (см.описание new_room). При этом автоматически f5 -> 1.  │
;│   После возврата из этой части в log0 по оператору return, log0 передаст  │
;│ управление интерпретатору, который в своем следующем цикле установит      │
;│ f5 -> 0 (см.цикл работы интерпретатора). Именно поэтому управление этой   │
;│ части программы передается только один раз.                               │
;│   Поэтому, если из логики будут вызываться другие логики, имеющие части   │
;│ инициализации, то они должны быть загружены и вызваны в инициализационной │
;│ части вызывающей логики.                                                  │
;└───────────────────────────────────────────────────────────────────────────┘

	  load_pic    0     ; загрузить picture по значению v0 (v0 = 7)   
	  draw_pic    0     ; изобразить декорацию в буфере интерпретатора
	  discard_pic 0     ; уничтожить picture в памяти                 

          clear_lines 23, 24, 0   ; очистить строки 23 и 24 цветом 0
          set_text_attribute 6, 0 ; устан.цвет символов и фона для ком.display

          assignn 130, 1    ; упр. переменная вывода сообщений
	  reset 50          ; 
          reset 51          ; установить флаги 50,51,52 в 0
          reset 52          ; 

      ; загрузить view- и sound-ресурсы по их номеру 
       
	  load_view     14 ; процесс образования капли
	  load_view     22 ; потоки холодного воздуха вниз к земле
          load_sound     3 ; сопровождает остановку капель
	  load_sound    12 ; сопровождает образование капель
          load_sound    54 ; привлечение внимания при выводе сообщений

          show_pic         ; вывести на экран содержимое буфера фона
          status_line_on   ; вывести строку состояния               
          display 24, 1, 7 ; вывести сообщение 7 в стр.24 с поз. 1

;   определить переменные для хранения задержек в циклах интерпретации

          assignn        123, 25 ; задержка для cycle_time капли
          assignn        133,  1 ;          для step_size  капли
          assignn        143,  5 ;          для step_time  капли
          assignn        124, 10 ;          для cycle_time потоков

	  return      ; возвратить упр. в log0

NotNr:  if_
          equaln 130, 1  ; управляющая переменная выбора сообщ. v130 = 1 ?
	else_ EQ2        ; нет - переход на EQ2
			 ; да:
	  reset   15     ;  f15->0 - окно удал. автоматически      
	  assignn 21, 7  ;  через (v21=7)/2 сек                         
          print    1     ;  печать сообщения 1          
	  sound   54, 21 ;  исполнить звук 54, по оконч.f21 -> 0
			                                   
	  jump ENDLOG    ; безусловный переход на ENDLOG

EQ2:    if_
          equaln 130, 2  ; управляющая переменная выбора сообщ. v130 = 2 ?
	else_ EQ3

	  assignn 21, 25 ; окно удал. автоматически через (v21=25)/2 сек
          sound 54, 21   ; привлечь внимание звуком 54, по оконч.f21 -> 0
	  print 2        ; печать сообщения 2
	  jump ENDLOG    ; безусловный переход на ENDLOG

EQ3:    if_
          equaln 130, 3  ; управляющая переменная выбора сообщ. v130 = 3 ?
	else_ EQ4

	  assignn 21, 25 ; окно удал. автоматически через (v21=25)/2 сек       
          sound 54, 21   ; привлечь внимание звуком 54, по оконч.f21 -> 0
	  print 3        ; печать сообщения 3                            
	  jump ENDLOG    ; безусловный переход на ENDLOG                 

EQ4:    if_
          equaln 130, 4  ; управляющая переменная выбора сообщ. v130 = 4 ?
        else_ EQ5

     ; подгот. к показу образования первой капли
      
	  animate_obj    1         ; вкл.объект #1 в список увравл.объектов
	  ignore_horizon 1         ; объекту #1 не замечать линию горизонта
	  ignore_objs    1         ; объекту #1 не замечать др.объекты     
	  ignore_blocks  1         ; объекту #1 не замечать блоки          
	  set_view       1, 14     ; связать объект #1 с view #14           
	  set_priority   1, 6      ; объекту #1 устан.приоритет 6          
	  position       1, 71, 33 ; объекту #1 устан.нач.х=71, у=33      
          set_loop       1, 0      ; объекту #1 устан.цикл 0 во view #14   
     	  set_cel        1, 0      ; объекту #1 устан.кадр 0 в цикле 0 
	                           ; во view #14
          cycle_time     1, 123    ; объекту 1 установить время в циклах
	                           ; интепр.между сменой кадров по значению v123
	  start_cycling  1         ; разрешить авт.смену кадров для объекта 1
          normal_cycle   1         ; кадрам следовать в нормальном порядке
	  draw           1         ; изобразить объект 1 на экране
          step_size      1, 133    ; установить число элементов отображения на
				   ; которое перемещ.объект 1 за 1 шаг по v133
          step_time      1, 143    ; уст.задержку в циклах интерпр.между сосед-
	                           ; ними шагами при движении объекта 1 по v143

          end_of_loop    1, 123    ; 1 раз прокрутить мультфильм, связанный с
	                           ; объектом 1, по окончании f123 -> 1
	  sound         12, 21     ; исполнить звук 12, по оконч. f21 -> 1
	  jump ENDLOG              ; безусловный переход на ENDLOG

EQ5:    if_
          equaln 130, 5  ; управляющая переменная выбора сообщ. v130 = 5 ?
	else_ EQ6
	  
          if_
	    not_
	    isset 50  ; f50 не установлен (не = 1) ?
	  else_ EQ5a  ; установлен, т.е. движение 1-й капли закончено => EQ5a
	              ; да:
	    move_obj 1, 71, 153, 1, 50 ; переместить 1-ю каплю (объект 1) в 
                                       ; процессе образования вниз (х=71,у=153)
				       ; с шагом 1, по оконч. f50 -> 1
            if_
              isset 21     ; f21 установлен в 1 (звук окончен) ?
            else_ EQ5$     ; нет: => EQ5$
              sound 12, 21 ; да : повторить звук

EQ5$:       return ; вернуть управл. log0

EQ5a:   stop_sound      ; прекратить звук
	jump ENDLOG     ; безусловный переход на ENDLOG

EQ6:    if_
          equaln 130, 6   ; управляющая переменная выбора сообщ. v130 = 6 ?
	else_ EQ7         ; нет: переход на EQ7
			  ; да:
	  assignn 21, 10  ; окно удал. автоматически через (v21=10)/2 сек       
          sound   54, 21  ; привлечь внимание звуком 54, по оконч.f21 -> 0
	  print    4      ; печать сообщения 4                           

;       подгот. к показу образования второй капли

	    animate_obj    2        ; вкл.объект #2 в список увравл.объектов     
	    ignore_horizon 2        ; объекту #2 не замечать линию горизонта     
	    ignore_objs    2        ; объекту #2 не замечать др.объекты          
	    ignore_blocks  2        ; объекту #2 не замечать блоки               
	    set_view       2, 14    ; связать объект #2 с view #14               
	    set_priority   2, 6     ; объекту #2 устан.приоритет 6               
	    position       2, 83, 33; объекту #2 устан.нач.х=83, у=33            
            set_loop       2, 0     ; объекту #2 устан.цикл 0 во view #14        
     	    set_cel        2, 0     ; объекту #2 устан.кадр 0 в цикле 0          
				    ; во view #14                                
            cycle_time     2, 123   ; объекту 2 установить время в циклах        
				    ; интепр.между сменой кадров по значению v123
	    start_cycling  2        ; разрешить авт.смену кадров для объекта 2    
            normal_cycle   2        ; кадрам следовать в нормальном порядке      
	    draw           2        ; изобразить объект 2 на экране              
            step_size      2, 133   ; установить число элементов отображения на  
				    ; которое перемещ.объект 2 за 1 шаг по v133  
            step_time      2, 143   ; уст.задержку в циклах интерпр.между сосед- 
				    ; ними шагами при движении объекта 2 по v143
				                                                 
            end_of_loop    2, 124   ; 1 раз прокрутить мультфильм, связанный с   
				    ; объектом 2, по окончании f124 -> 1         

;         подгот. к показу образования третьей капли

	    animate_obj    3        ; вкл.объект #3 в список увравл.объектов     
	    ignore_horizon 3        ; объекту #3 не замечать линию горизонта     
	    ignore_objs    3        ; объекту #3 не замечать др.объекты          
	    ignore_blocks  3        ; объекту #3 не замечать блоки               
	    set_view       3, 14    ; связать объект #3 с view #14               
	    set_priority   3,  6    ; объекту #3 устан.приоритет 6               
	    position       3, 55, 34; объекту #3 устан.нач.х=83, у=33            
            set_loop       3,  0    ; объекту #3 устан.цикл 0 во view #14        
     	    set_cel        3,  0    ; объекту #3 устан.кадр 0 в цикле 0          
				    ; во view #14                                
            cycle_time     3, 123   ; объекту 3 установить время в циклах        
				    ; интепр.между сменой кадров по значению v123
            normal_cycle   3        ; кадрам следовать в нормальном порядке
            step_size      3, 133   ; установить число элементов отображения на  
				    ; которое перемещ.объект 3 за 1 шаг по v133  
            step_time      3, 143   ; уст.задержку в циклах интерпр.между сосед- 
				    ; ними шагами при движении объекта 3 по v143 
	    reset        152        ; f152->0 (->1 при изобр.3-ей капли на экр.)
	    reset         21        ; f21 -> 0
            sound         12, 21    ; исполнить звук 12, по оконч. f21 -> 1

	    animate_obj    4  ; поток холодного воздуха (стрелка вправо)
	    ignore_horizon 4  
	    ignore_objs    4
	    ignore_blocks  4
	    set_view       4,  22 ; связать объект #4 с view #22 (ост.см.выше)
	    set_priority   4,   5
	    position       4, 105, 123
            set_loop       4,   0 ; цикл 0 во view 22 - большая стрелка вправо
     	    set_cel        4,   0
            cycle_time     4, 124
	    start_cycling  4
            normal_cycle   4

	    animate_obj    5  ; поток холодного воздуха (стрелка влево)
	    ignore_horizon 5  
	    ignore_objs    5
	    ignore_blocks  5
	    set_view       5,  22 ; связать объект #5 с view #22 (ост.см.выше)
	    set_priority   5,   5
	    position       5,  55, 123
            set_loop       5,   1 ; цикл 1 во view 22 - большая стрелка влево
     	    set_cel        5,   0
            cycle_time     5, 124
	    start_cycling  5
            normal_cycle   5

	    draw           4  ; изобр.объекты 4 и 5 на экр. и т.к. для них
	    draw           5  ; выданы start_cycling - бесконечно повторять
			      ; мультфильм с ними связанный
	    jump ENDLOG       ; безусловный переход на ENDLOG

EQ7:    if_
          equaln 130, 7  ; управляющая переменная выбора сообщ. v130 = 7 ?
	else_ EQ8        ; нет: переход на EQ8
			 ; да:                
          if_
            isset 21     ; f21 установлен в 1 (звук окончен) ?
          else_ EQ7$     ; нет: => EQ7$                       
            sound 12, 21 ; да : повторить звук               

EQ7$:	  if_
	    not_         ; f51 -> 0 ? (2-я капля перемещена вниз?)
	    isset 51
	  else_ EQ7a     ; да: переход на EQ7a
			 ; нет, еще не перемещена:
	    move_obj    2, 93, 152, 1, 51; переместить 2 каплю в процессе
                                         ; образования вниз (см. для 1-й капли)
	    return       ; вернуть управл. log0

EQ7a:     if_
            not_
	    isset 152 ; f152=0 (3-я капля изображена)?
	  else_ EQ7b  ; да: переход на EQ7b
		      ; нет:
	    draw 3             ; изобразить об.3 (3-я капля) на экр.
	    set 152            ; и отметить это установкой f152->1
	    end_of_loop 3, 123 ; прокрутить 1 раз мультфильм образования капли,
			       ; по оконч. f123 -> 1
EQ7b:     if_
            not_        ; f52->0? (3-я капля перемещена вниз?)
	    isset 52                                          
	  else_ EQ7c    ; да: переход на EQ7с                 
			; нет, еще не перемещена:             
	    move_obj    3, 55, 154, 1, 52  ; переместить 3 каплю в процессе
                                           ; образования вниз
            return   ; вернуть управл. log0

EQ7c:     stop_sound     ; прекратить звук
          force_update 3 ; перерис.объект 3 не дожидаясь оконч.цикла интерпр.
          jump ENDLOG    ; безусловный переход на ENDLOG

EQ8:    if_
          equaln 130, 8  ; управляющая переменная выбора сообщ. v130 = 8 ?
	else_ EQ9        ; нет: переход на EQ9
			 ; да:                
	  assignn 21, 35      ; окно удал. автоматически через (v21=35)/2 сек       
          sound   54, 21      ; привлечь внимание звуком 54, по оконч.f21 -> 0
	  print    5          ; печать сообщения 5                            

	;  разместить стрелки под облаком

	   animate_obj    6         ; вкл.объект 6 в список управляемых объектов
	   set_view       6, 22     ; связать объект 6 с view 22
	   set_priority   6, 5      ; установить объекту 6 приоритет 5
	   position       6, 48, 165; поместить его в точку х=48, у=165
           set_loop       6, 2      ; во view 22 для него выбрать цикл 2
     	   set_cel        6, 0      ; и кадр 0 (левую малую стрелку)

	   animate_obj    7         ; вкл.объект 7 в список управляемых объектов
	   set_view       7, 22     ; связать объект 7 с view 22                
	   set_priority   7, 5      ; установить объекту 7 приоритет 5          
	   position       7, 84, 165; поместить его в точку х=84, у=165         
           set_loop       7, 2      ; во view 22 для него выбрать цикл 2       
     	   set_cel        7, 1      ; и кадр 1 (центральную малую стрелку)

	   animate_obj    8          ; вкл.объект 8 в список управляемых объектов
	   set_view       8, 22      ; связать объект 8 с view 22                
	   set_priority   8, 5       ; установить объекту 8 приоритет 5          
	   position       8, 116, 165; поместить его в точку х=116, у=165         
           set_loop       8, 2       ; во view 22 для него выбрать цикл 2        
     	   set_cel        8, 2       ; кадр 2 (правую малую стрелку)

	   draw           6  ;
	   stop_cycling   6  ;
	   draw           7  ; изобразить объекты 6, 7, 8 (стрелки под облаком),
	   stop_cycling   7  ; запретив авт.смену кадров в мультфильме с ними
	   draw           8  ; связанном
	   stop_cycling   8  ;

; показать выпадение сформировавшихся дождевых капель из облака

	  reset       50     ; флаги 50, 51, 52 -> 0
	  reset       51
	  reset       52

	  set_cel      1, 22 ; выбрать кадр 22 в текущем цикле объекта 1, чтобы
	                     ; восстановить шейку у капли
	  draw         1     ; изобр.объект 1 этим кадром и
	  stop_cycling 1     ; запретить смену кадров (зафиксировать изобр.об.1

          sound 12, 21       ; исполнить звук 12, по оконч. f21 -> 1
	  jump ENDLOG        ; безусловный переход на ENDLOG

EQ9:    if_
          equaln 130, 9  ; управляющая переменная выбора сообщ. v130 = 9 ?
	else_ EQ10       ; нет: переход на EQ10
			 ; да:                
          if_
            isset 21     ; f21 установлен в 1 (звук окончен) ?
          else_ EQ9$     ; нет: => EQ9$                       
            sound 12, 21 ; да : повторить звук 12, по оконч. f21 -> 1              

EQ9$:	  if_
	    not_
	    isset 50     ; f50 не установлен (не = 1) ?                         
	  else_ EQ9a     ; установлен, т.е. движение 1-й капли закончено =>EQ9a
			 ; да: показать выпадение 1-й капли
			                                                  
	    move_obj 1, 71, 168, 1, 50 ; переместить 1-ю каплю (объект 1) в    
	                               ; процессе образования вниз (х=71,у=168)
	                               ; с шагом 1, по оконч. f50 -> 1         
	    return  ; вернуть управл. log0
	    
EQ9a:     erase        1     ; стереть с экрана объект 1 (1-ю каплю)
	  set_cel      2, 22 ; выбрать кадр 22 в текущем цикле объекта 2, чтобы 
			     ; восстановить шейку у капли                       
          draw         2     ; изобр.объект 2 (2-ю каплю) этим кадром и                     
	  stop_cycling 2     ; запретить смену кадров (зафиксировать изобр.об.2)
	  jump ENDLOG        ; безусловный переход на ENDLOG

EQ10:   if_
          equaln 130, 10  ; управляющая переменная выбора сообщ. v130 = 10 ?                      
	else_ EQ11        ; нет: переход на EQ11                      
			  ; да:                 
          if_
            isset 21      ; f21 установлен в 1 (звук окончен) ?
          else_ EQ10$     ; нет: => EQ10$                       
            sound 12, 21  ; да : повторить звук 12, по оконч. f21 -> 1                

EQ10$:	  if_
	    not_
	    isset 51      ; f51 не установлен (не = 1) ?                        
	  else_ EQ10a     ; установлен, т.е. движ. 2-й капли закончено => EQ10a
			  ; да: показать выпадение 2-й капли
			                      
	    move_obj 2, 93, 168, 1, 51 ; выпадение 2-й капли (см.для капли 1)

	    return        ; вернуть управл. log0

EQ10a:    erase        2    ; стереть с экрана объект 2 (2-ю каплю)             
	  set_cel      3, 22; выбрать кадр 22 в текущем цикле объекта 3, чтобы  
			    ; восстановить шейку у капли                        
          draw         3    ; изобр.объект 3 (3-ю каплю) этим кадром и          
	  stop_cycling 3    ; запретить смену кадров (зафиксировать изобр.об.3) 
	  jump ENDLOG       ; безусловный переход на ENDLOG

EQ11:   if_
          equaln 130, 11 ; управляющая переменная выбора сообщ. v130 = 11 ?                      
	else_ EQ11a      ; нет: переход на EQ11a                      
			 ; да:                 
          if_
            isset 21     ; f21 установлен в 1 (звук окончен) ? 
          else_ EQ11$    ; нет: => EQ10$                       
           sound 12, 21  ; да : повторить звук 12, по оконч. f12 -> 1                

EQ11$:	  if_
	    not_                                                              
	    isset 52     ; f52 не установлен (не = 1) ?                                                                             
	  else_ EQ11a    ; установлен, т.е. движ. 3-й капли закончено => EQ11a                                                      
			 ; да: показать выпадение 3-й капли
			                     
	    move_obj 3, 55, 168, 1, 52 ; выпадение 3-й капли (см.для капли 1)

	    return       ; вернуть управл. log0
	    
EQ11a:    erase 3        ; стереть с экрана объект 3 (3-ю каплю)
          stop_sound     ; прекратить звук
          sound 3, 21    ; исполнить звук 3, по оконч. f21 -> 1

;      чистка используемых флагов и переменных

          reset    21
          reset    50
          reset    51
          reset    52
          reset   123
          reset   124
          reset   152
	  assignn 123, 0
	  assignn 124, 0
	  assignn 130, 0
	  assignn 133, 0
	  assignn 143, 0

          assignn 21, 10 ; окно удал. автоматически через (v21=10)/2 сек
	  print    6     ; печать в окне сообщения 6
	  new_room 9     ; перейти в комнату 9 (развитие грозы)

ENDLOG: increment 130 ; увел.знач.управл.перем.выбора сообщ. v130 на 1
        return        ; вернуть управл. log0

        messages 7  ; сообщения

m1      db  " A сейчас мы находимся внутри уже сформировавшегося "
        db  "грозового облака.", 0

m2      db   " Нижняя часть грозового облака, где температура больше "
        db   "нуля состоит из очень мелких капелек воды;", 10
	db   " - средняя часть, где температура ниже нуля - из "
	db   "переохлажденных капелек и мелких ледяных кристалликов;", 10
	db   " - верхняя часть, где всегда очень холодно - только "
	db   "из кристалликов льда.", 0

m3      db   " Капельки воды и кристаллики льда медленно перемещаются "
        db   "вниз. Сталкиваясь с еще более мелкими капельками и "
	db   "кристалликами, сливаются с ними и, наконец, "
	db   "вырастают до размеров дождевых капель.", 10
        db   " Посмотрите как это происходит.", 0

m4      db   " Двигаясь вниз, капельки увлекают за собой немного "
        db   "холодного воздуха.", 0

m5      db   " Образуется поток холодного воздуха, создающий "
        db   "противоток восходящему теплому воздуху.", 10
        db   " Этот поток, достигнув земли, вызывает холодный ветер, "
        db   "предупреждающий нас о начале грозы.", 10, " Вслед за ветром "
        db   "начинается дождь.", 0

m6      db   " A теперь вернемся на землю и понаблюдаем за развитием "
        db   "грозы из безопасного места.", 0

m7      db   " Для продолжения нажмите Enter/Return", 0
	
VERYEND EQU $
LOGIC   ENDS
        END