        IF1
INCLUDE COMDEF.INC              ; Include command definition
        ENDIF
VOL     EQU     0               ; Define volume number
LOGIC   SEGMENT BYTE
        ASSUME  CS:LOGIC
        BEGIN                   ; Start up

; Главная программа ГРОЗА; log0.asm
; А.В.Хорев, обучающая программа "ГРОЗА", 1991 год.

        if_
          greatern 17, 0  ; Ошибка интерпретатора ?
        else_ NoErr       ; нет
          call_ 97        ; обработка ошибок

NoErr:  if_
          equaln 0, 0     ; текущая комната 0 (начало программы) ?
        else_ Rne0

          if_
	    not_
	    isset 6     ; выдана restart_game ( f6 -> 1 ) ?
	  else_ Init    ; нет

	    script_size 64 ; назначить размер script-таблицы в байтах

Init:     call_ 01 ; логика инициализации


A0:       if_
            isset 6 ; была выдана команда restart_game ?
	  else_ GROZA

	    new_room  5 ; да, войти в первую комнату после заставки ГРОЗА

GROZA:    reset 15      
          assignn 21, 40
          print 5       
          new_room 2 ; первый вход в программу. Дать заставку ГРОЗА

Rne0:  ;  display 23, 2, 7
       ;  if_
       ;    lessn 8, 31
       ;  else_ A1
       ;    show_mem

; начиная с метки A1 - проверки на нажатие клавиш, вызывающих особую
;                      реакцию интерпретатора. Назначение клавиш см. в
;                      log01.asm .

A1:      if_
           controller 1 ; нажата F1? - краткий help
	 else_ A2       ; F1 не нажата - перейти на A2


	   reset   15     ; f15 -> 0 - окно удаляется нажатием Enter или Esc
	   assignn 21, 60 ; v21 <- =60 - окно удал.через 1/2*v21=30 сек
	   print 6        ; печать сообщения 6
	   
A2:      if_
	   controller 2 ; нажата F2? - вкл./выкл. звук
	 else_ A3       ; F2 не нажата - перейти на A3

	   toggle 9 ; перекинуть f9
           set 21   ; f21 -> 1

A3:     if_
          controller 10 ; нажата F10? - изменение скорости
	                ;       (задержки между циклами интерпретации)
	else_ A4        ; F10 не нажата - перейти на A4

	  increment 10  ; увеличить значение v10 на 1

	  if_
	    greatern 10, 3 ; v10 > 3?
	  else_ A4         ; нет, перейти на A4

	    assignn 10, 0  ; да, присвоить v10 значение 0

A4:      if_
           controller 9 ; нажата F9? - restart game
	 else_ A5       ; F9 не нажата - перейти на A5

	   restart_game ; стартовать программу с начала

A5:      if_
	   controller 22 ; нажаты Alt+Z ? - выход
	 else_ A6

	   stop_sound
	   quit 0 ;   выход с запросом

;A6:      if_
;            controller 15 ; нажаты Alt+D ? - запуск отладчика
;          else_ A6a
;            load_logic 100 ; загрузить табл.отладчика
;            set 10
;            trace_info 100, 5, 9
;            version

A6:      if_
           controller 19 ;  нажаты Alt+i- дать инф.о фирме
         else_ A6a

	   reset 15       ; f15 -> 0 - окно удаляется нажатием Enter или Esc
	   assignn 21, 30 ; автоматическое удаление окна через 30/2 = 15с
	   print 5        ; печать сообщения 5

A6a:    if_
          equaln 0, 2 ; v0 = 2 ? находимся в комнате 2 (заставка ГРОЗА)
	else_ A7      ; нет, перейти на метку A7

		      ; да
          if_
            isset 54  ; f54 = 1? - приглашение в ГРОЗУ было?
          else_ A6b   ; нет
            jump C0   ; да  - безусловный переход на C0

A6b:      if_
            have_key  ; нажата любая клавиша?
          else_ A7
		      ; да
            stop_sound           ; перкратить исполнение мелодии
            clear_lines 23, 24, 0; очистить строки с 23 по 24 цветом 0
            stop_motion 1        ; запретить перемещ. объекта 1 (радуги)

            erase 1  ; стереть радугу
            erase 12 ;         
            erase 13 ; стереть мигающие звезды (объекты 12,13,14,15)
            erase 14 ;
            erase 15 ;

            assignn     30, 0 ; присвоить v30 = 0

            load_pic    30    ; загрузить picture-ресурс по v30, т.е. 0
	                      ; picture 0 - это черный пустой экран
            draw_pic    30    ; создать граф.изображение фона в буфере интерпр.
            discard_pic 30    ; уничтожить в памяти picture 0

; приглашение в грозу

	    set_text_attribute 13, 0 ; установить цвет букв и фона для 
	                             ; команды display  
	    text_screen              ; перевести экран в алф.-цифр.режим
	    display 2, 12, 1         ; вывести сообщ.1 в стр.2 с поз.12
	    set_text_attribute 14, 0 ; см.выше
	    display 5, 1, 2          ; вывести сообщ.2 в стр.5 с поз.1
	    set_text_attribute 10, 0
	    display 18, 1, 3         ; вывести сообщ.3 в стр.18 с поз.1
            set_text_attribute 6,0
            display 24, 1, 4         ; вывести сообщ.4 в стр.24 с поз.1
            set 54            ; f54 -> 1 - означ., что приглашение было
            return

C0:       if_         ; если                         ;
	    not_      ;   не                         ; цикл ожидания        
	    have_key  ;   нажата клавиша ?           ; нажатия любой                       
	  else_ A6c   ; нет, нажата - переход на A6c ; клавиши                       
	    jump C0   ; да, не нажата                ;

A6c:      set_text_attribute 15, 0
          graphics                 ; перевести экран в графический режим

          reset 25        ; очистить используемые флаги и перем.
          reset 50
          reset 54
          assignn 201, 0

          new_room  5     ; перейти в комнату 5 (ей соответствует логика log05)

A7:	 call_v 0  ; вызов логики по значению переменной v0

A8:      return  ; возврат управления интерпретатору
	     
        messages 7 ; сообщения

m1    db    " Г Р О З А ", 0

m2    db    "  Вам, наверное, не раз приходилось наблюдать "
      db    "грозу, слышать грохот небесной канонады и видеть "
      db    "небо, перечеркнутое зигзагами молний.", 13, 10
      db    "   Но задумывались ли Вы над тем, как возникает "
      db    "молния и почему гремит ", 10, "гром ?", 13, 10
      db    "   Мы приглашаем Вас в мир ГРОЗЫ. ", 0

m3    db    "  A все начинается с образования грозового облака.", 0

m4    db    "Для продолжения нажмите любую клавишу", 0

m5    db    ' Обучающая программа "ГРОЗA"',10,10  ; текст не изменять !!!
      db    "  ТО Интеп (C), г.Чебоксары" , 10,10 ; текст не изменять !!!
      db    " Подготовлено для фирмы ", 10       ; текст не изменять !!!
      db    " Элиас (С), г.Москва в ка-", 10      ; текст не изменять !!!
      db    " честве примера применения", 10      ; текст не изменять !!!
      db    " пакета AGDS.", 10, 10               ; текст не изменять !!!
      db    "Сценарий     Калихман Л.Е.", 10      ; текст не изменять !!!
      db    "Графика      Спасибенко Д.В.", 10    ; текст не изменять !!!
      db    "Постановка и", 10                    ; текст не изменять !!!
      db    "программирование Хорев A.В.", 10,10  ; текст не изменять !!!
      db    "Intep(C). All rights reserved", 0

m6    db    "    Назначение клавиш", 10
      db    "    =================", 10, 10
      db    " F1    - краткая справка;", 10
      db    " F2    - звук вкл./выкл.;", 10
      db    " F9    - запуск программы", 10
      db    "         с начала;", 10
      db    " F10   - изменить скорость;", 10
      db    " Alt+I - info;             ", 10
      db    " Alt+Z - окончание с запро-", 10
      db    "         сом:", 10
      db    "        Enter - выход,", 10
      db    "        Esc   - продолжение.", 0

m7    db    " Free pages %v8 .", 0

VERYEND EQU $
LOGIC   ENDS
        END