(*~\Глагол\ПриложенияКОС\Игры\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                          ОТДЕЛ Шашки64КОС+;
(*============================================================================*)
(* НАЗНАЧЕНИЕ: создание экранных надписей и кнопочек                          *)
(*             Программа игры в русские шашки на языке Глагол                 *)
(*============================================================================*)

ИСПОЛЬЗУЕТ
  Игра    ИЗ "..\..\Отделы\Игры\Шашки\",                     (* алгоритм игры *)
  Доска   ИЗ "..\..\Отделы\Игры\Шашки\",                     (* рисунок доски *)

  Ввод    ИЗ "..\..\Отделы\Обмен\",
  ОС      ИЗ "..\..\Отделы\Обмен\",
  Окно    ИЗ "..\..\Отделы\Обмен\",

  Поле    ИЗ "..\..\Отделы\Поле\",
  Надел   ИЗ "..\..\Отделы\Поле\",
 Подложка ИЗ "..\..\Отделы\Поле\",
  Черта   ИЗ "..\..\Отделы\Поле\",
  Записка ИЗ "..\..\Отделы\Поле\",
  Кнопка  ИЗ "..\..\Отделы\Поле\";

ПОСТ               (* действия *)
  діяЗаново     =1;
  діяВыход      =2;
  діяПредУровень=3;
  діяСледУровень=4;

ПЕР
  времяНижних,
  времяВерхних,
  времяОбновления :ЦЕЛ;     (* для секундомера *)

  текстЖдитеД,
  текстВремяНД,
  текстВремяВД,
  текстУровеньД:Записка.Доступ; (* надписи *)

(*----------------------------------------------------------------------------*)
ЗАДАЧА ОбновитьСекундомер(номерЧасов:ЦЕЛ);             (* обновить секундомер *)
ПЕР
  прошлоВремени:ЦЕЛ;
            сек:ЦЕЛ;

 (*-------------------------------- подЗадача --------------------------------*)
  ЗАДАЧА ВыводХода(ход-:Игра.нХод);              (* вывод на табло хода машины *)
  ПЕР
    x0,y0,x1,y1:ЦЕЛ;

   (*------------------------------ подподЗадача -----------------------------*)
    ЗАДАЧА NвXY(n,x+,y+:ЦЕЛ);
    УКАЗ
      ЕСЛИ НЕ Доска.нижниеБелые ТО
        n:=100-n
      КОН;
      x:=Игра.NвX[n];
      y:=Игра.NвY[n]
    КОН NвXY;

  УКАЗ
    ЕСЛИ
         ход.откудаN = ход.кудаN
    ТО                                (* пустой ход *)
      Записка.Изменить(текстЖдитеД,"")
    ИНАЧЕ
      NвXY(ход.откудаN,x0,y0);
      NвXY(ход.кудаN,x1,y1);
      ЕСЛИ
           ход.битых > 0
      ТО
        Записка.Из4хЦел(текстЖдитеД,"%c%d:%c%d",x0+ВЦЕЛ("a")-1,y0,x1+ВЦЕЛ("a")-1,y1)
      ИНАЧЕ
        Записка.Из4хЦел(текстЖдитеД,"%c%d-%c%d",x0+ВЦЕЛ("a")-1,y0,x1+ВЦЕЛ("a")-1,y1)
      КОН;
    КОН
  КОН ВыводХода;

УКАЗ
    прошлоВремени:=ОС.Время()-времяОбновления;
  времяОбновления:=ОС.Время();
  ЕСЛИ
       Игра.конец
  ТО
    Записка.Изменить(текстЖдитеД,"--КОНЕЦ--")
  ИНАЧЕ
    ЕСЛИ
         Доска.думаютНижние
    ТО
      УВЕЛИЧИТЬ(времяНижних,прошлоВремени);
      ВыводХода(Игра.ходМашины)
    ИНАЧЕ
      УВЕЛИЧИТЬ(времяВерхних,прошлоВремени);
      Записка.Изменить(текстЖдитеД,"Подождите")
    КОН
  КОН;
  сек:=времяВерхних ДЕЛИТЬ 1000;

  Записка.Из4хЦел(текстВремяВД,"%.2d:%.2d",сек ДЕЛИТЬ 60,сек ОСТАТОК 60,0,0);

  сек:=времяНижних ДЕЛИТЬ 1000;

  Записка.Из4хЦел(текстВремяНД,"%.2d:%.2d",сек ДЕЛИТЬ 60,сек ОСТАТОК 60,0,0);
КОН ОбновитьСекундомер;

(*----------------------------------------------------------------------------*)
ЗАДАЧА ПредУровень;
УКАЗ
  ЕСЛИ
                    Игра.уровень > 2
  ТО 
          УМЕНЬШИТЬ(Игра.уровень);
    Записка.Из4хЦел(текстУровеньД,"%d",Игра.уровень-1,0,0,0)
  КОН
КОН ПредУровень;

(*----------------------------------------------------------------------------*)
ЗАДАЧА СледУровень;
УКАЗ
  ЕСЛИ 
                    Игра.уровень < 10
  ТО 
          УВЕЛИЧИТЬ(Игра.уровень); 
    Записка.Из4хЦел(текстУровеньД,"%d",Игра.уровень-1,0,0,0)
  КОН
КОН СледУровень;

(*----------------------------------------------------------------------------*)
ЗАДАЧА НачатьЗаново(полеД:Поле.Доступ);                  (* начать новую игру *)
УКАЗ
  Записка.Изменить(текстЖдитеД,"");
  Записка.Изменить(текстВремяНД,"");
  Записка.Изменить(текстВремяВД,"");
  времяНижних:=0;
  времяВерхних:=0;
  времяОбновления:=ОС.Время();
   Игра.НачатьЗаново;
  Доска.НачатьЗаново;
  Поле.Рисовать(полеД)
КОН НачатьЗаново;

(*----------------------------------------------------------------------------*)
ЗАДАЧА Приём(   полеД:Поле.Доступ;
             посылка+:Ввод.нПосылка);
(*
 * получить и обработать управляющие послания
 *)
УКАЗ
  ДЛЯ
      посылка
  ВИДА
  | Ввод.нОтКлавиш:
      ЕСЛИ
            посылка.упрАльт И (посылка.код = 58H) (* Alt+'X' *)
         ИЛИ
           (посылка.код = 1BH)                    (* Esc     *)
      ТО               
        полеД.состояние:=діяВыход;
        посылка.код:=0
      КОН
  | Кнопка.нПосылка:
      ВЫБРАТЬ
              посылка.кнопкаД.действие
      ИЗ
      | діяЗаново:      НачатьЗаново(полеД)
      | діяВыход:       полеД.состояние:=діяВыход
      | діяПредУровень: ПредУровень
      | діяСледУровень: СледУровень
      КОН
  | Доска.нПосылка:
      ОбновитьСекундомер(1)
  ИНАЧЕ
  КОН             
КОН Приём;

(*----------------------------------------------------------------------------*)
ЗАДАЧА СоздатьПоле():Поле.Доступ;
                              (* создаёт рабочее поле экрана с кнопочным меню *)
ПЕР
      полеД:    Поле.Доступ;                      (* рабочее поле экрана *)
  подложкаД:Подложка.Доступ;                      (* подложка поля       *)

  чВертикаль,
  чГоризонталь:Черта.Доступ;                      (* черты               *)

  кнопЗаново,
  кнопВыход,
  кнопБольше,
  кнопМеньше:Кнопка.Доступ;                       (* экранные кнопки  *)

 словоУровеньД: Записка.Доступ;                   (* слово "Уровень"     *)
        доскаД:   Доска.Доступ;                   (* игровая доска       *)
УКАЗ
                                                              (* создаём поле *)
  полеД:=Поле.Создать(0,0,10,30,ПУСТО,ОТКЛ,Приём);
                                                            (* создаём наделы *)
<*ЕСЛИ Доска.Оборотень ТО*>
  подложкаД:=Подложка.Создать(0,0,0,0,"Оборотень");
<*ИНАЧЕ*>
  подложкаД:=Подложка.Создать(0,0,0,0,"");
<*КОН*>
        доскаД:=  Доска.Создать(1,1);

  текстВремяВД:=Записка.Создать(1,18,1,5,""); 
  текстВремяНД:=Записка.Создать(8,18,1,5,""); 
  текстЖдитеД:= Записка.Создать(2,18,1,9,""); 
  Игра.уровень:=5;

 текстУровеньД:=Записка.Создать(5,23,1,1,"4"); 
 словоУровеньД:=Записка.Создать(4,20,1,7,"Уровень"); 
                                                             (* создаём черты *)
  чВертикаль  :=Черта.Создать(0,17,0,1); 
  чГоризонталь:=Черта.Создать(3,17,1,0); 
                                                            (* создаём кнопки *)
  кнопМеньше:=Кнопка.Создать(5,18,"[<~М]",діяПредУровень,ВКЛ); 
  кнопБольше:=Кнопка.Создать(5,25,"[~Б>]",діяСледУровень,ВКЛ); 
  кнопЗаново:=Кнопка.Создать(6,19,"[ ~Заново]",діяЗаново,ВКЛ); 
  кнопВыход :=Кнопка.Создать(7,19,"[ ~Выход ]",діяВыход,ВКЛ); 
                    (* добавляем наделы в порядке отрисовки и получения ввода *)
  Поле.ДобавитьНадел(полеД,подложкаД);

  Поле.ДобавитьНадел(полеД,текстВремяВД);
  Поле.ДобавитьНадел(полеД,текстВремяНД);
  Поле.ДобавитьНадел(полеД,текстЖдитеД);
  Поле.ДобавитьНадел(полеД,текстУровеньД);

  Поле.ДобавитьНадел(полеД,словоУровеньД);

  Поле.ДобавитьНадел(полеД,чВертикаль);
  Поле.ДобавитьНадел(полеД,чГоризонталь);
  Поле.ДобавитьНадел(полеД,доскаД);
  Поле.ДобавитьНадел(полеД,кнопМеньше);
  Поле.ДобавитьНадел(полеД,кнопБольше);
  Поле.ДобавитьНадел(полеД,кнопЗаново);
  Поле.ДобавитьНадел(полеД,кнопВыход);
  ВОЗВРАТ полеД
КОН СоздатьПоле;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Поехали;
ПЕР
  полеД:Поле.Доступ;
   часы:ЦЕЛ;
УКАЗ
  Окно.Текстовое(ОбновитьСекундомер);
(*
  Окно.Графическое("Шашки","Lucida Console",30,ОбновитьСекундомер);
*)
                     полеД:=СоздатьПоле();
  Поле.ОкноНаВсёПоле(полеД);
  Поле.Рисовать(полеД);

  НачатьЗаново(полеД);

  часы:=Окно.СоздатьЧасы(1,1000); (* обновляем часы через 1000 мс *)
        Окно.Показать;
                                 (* проверяем и обрабатываем ввод от человека *)
  ПОКА
       полеД.состояние = Поле.состРабота
  ВЫП
    Поле.Проверить(полеД)
  КОН;
  Окно.УдалитьЧасы(часы)
КОН Поехали;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Поехали
КОН Шашки64КОС.