/**
*  Модуль, осуществляющий вывод справочной информации.
*  	Использованы средства мини-help'а из Tools.
*
* Версия	1.5	(C)Copyright InfoScope Inc. 1992
*
**/


#include <stdio.h>

#include <utldef.h>
#include <kbd.h>
#include <kbdcodes.h>
#include <display.h>

#include <hlp_mini.h>		/* Система вывода сообщений		*/
#include <wnfrdef.h>		/* Рамки окон				*/

#include "lifescr.h"

#define SIZE_OF_ARRAY(p)	(sizeof(p)/sizeof(*p))

LOC loc = {10, 5};       	/* Расположение окна на экране		*/

WIN_DEF lifehlp_wnd = { 	/* Описание этого окна			*/
    {60, 14},       		/* Размеры окна				*/
    dsp_doAttr(DSP_BLUE,DSP_LIGHTGRAY),	/* цвет символов и фона в окне	*/
            0,					/* в окне нет курсора	*/
            1,					/* у окна есть рамка	*/
	    {     		/* ***** информация о рамке *****	*/
              /* Рамка: двойная, с заголовками  вверху и внизу;		*/
              /* верхний - центрированный, нижний смещен вправо		*/
              	WN_DOUBLE | WN_UPHC | WN_DWNHR,
					/* цвета символов и фона	*/
    		dsp_doAttr(DSP_LIGHTGRAY,DSP_DARKGRAY),
              	' ',			/* "рисующий" символ		*/
			    /* *** заголовки *****			*/
               NULL, dsp_doAttr(DSP_WHITE,DSP_DARKGRAY),/* верхний    	*/
               NULL, dsp_doAttr(DSP_WHITE,DSP_DARKGRAY),/* нижний     	*/
 	 /* (сами заголовки берутся из массива texts, см. ниже)         */
               NULL,0,
               NULL,0			/* а этого все равно не будет   */
              }
};

LOCAL char Page1[] =      /* Массивы строк, соответствующие страницам  */
                           /* (LOCAL, т.е. static - чтобы можно было    */
                           /* адресами массивов инициализировать        */
                           /* структуру texts, ниже)                    */
          " Игру \"Жизнь\" изобрел американский математик Дж.Х.Конвей,\n\r"
          " известный не только чисто математическими работами, но и\n\r"
          " работами в области занимательной математики.\n\r"
	  " \"Жизнь\" можно отнести к категории игр, имитирующих\n\r"
          " процессы живой природы.\n\r"
	  " Русскоязычные читатели узнали о \"Жизни\" из книг \n\r"
          " М.Гарднера.\n\r"
	  " Мы рады представить Вам программу, помогающую играть\n\r"
          " в \"Жизнь\". Чтобы получить справку о режимах и клавишах,\n\r"
          " выйдите из данного режима и нажмите Alt-K.\n\r\n"
          "         Выход из режима справки - нажатие ESC."
,
     Page2[] =
          "\n\r Правила игры (генетические законы):\n\r\n\r"
          " 1. ВЫЖИВАНИЕ. Каждая клетка с двумя или тремя соседями\n\r"
          "    выживает и переходит в следующее поколение.\n\r"
          " 2. ГИБЕЛЬ. Каждая клетка, у которой БОЛЕЕ ТРЕХ соседей\n\r"
          "    погибает от перенаселенности. Каждая клетка, у ко-\n\r"
          "    торой МЕНЕЕ ДВУХ соседей, погибает от одиночества.\n\r"
          " 3. РОЖДЕНИЕ. Если у пустой позиции РОВНО ТРИ соседних\n\r"
          "    позиции заняты клетками, то в в следующем поколении\n\r"
          "    в ней появится клетка.",
     Page3[] =
          " Alt-G - Краткая история игры и описание законов\n\r"
          " Alt-W - Записать конфигурацию в файл на диске\n\r"
          " Alt-R - Прочитать конфигурацию из файла на диске\n\r"
          " Alt-A - \"Animation\" при включении этого режима\n\r"
          "         происходит автоматический переход к вычислению\n\r"
          "         следующего положения без ожидания нажатия\n\r"
          " Alt-T - задать время ожидания между переходами от\n\r"
          "         позиции к позиции в \"оживляже\"\n\r"
          " Alt-L - Показать/убрать окно с рекламой\n\r"
          " <стрелки> - Подвигать область видимости\n\r"
          " Shift-<стрелки> - Подвигать окно с рекламой\n\r"
          " Alt-X - Выйти вон - в ДОС",
     Page4[] =
          " Alt-E - Отредактировать текущую конфигурацию\n\r"
          "         В редакторе действуют следующие клавиши\n\r"
          "           <стрелки> - Двигать курсор по полю\n\r"
          "           Home, End, PgUp, PgDn - то же\n\r"
          "           Alt-C - Очистить экран от точек\n\r"
          "           <пробел> - Поставить или убрать точку\n\r"
          "           любая другая клавиша выход из редактора с\n\r"
          "           выполнением ее по правилам основной программы"
;

HLP_TEXT lifedef[] = { /* Массив структур, описывающих страницы help'а	*/
      { Page1,           	/*      Строка 1                        */
        " Что наша \"Жизнь\"? ",/* Верхний заголовок			*/
        NULL,           	/*            левый                     */
        NULL,           	/*            правый                    */
        			/* Нижний НЕ разрешен!!!		*/
      },
      {
	 Page2,           	/*      Строка 2                        */
      " Да здравствует Конвей! ",/* Заголовки: верхний			*/
/*        " Правила \"Жизни\" ",*/  /* Верхний заголовок            */
        			/* Из-за отсутствия здесь значений	*/
                                /* соответствующие поля устанавливаются	*/
                                /* в нуль.				*/
      }};
HLP_TEXT lifekey[] = { /* Массив структур, описывающих страницы help'а	*/
      {
	 Page3,           	/*      Строка 3                        */
      " Клавиши ",		/* Верхний заголовок			*/
        			/* Из-за отсутствия здесь значений	*/
                                /* соответствующие поля устанавливаются	*/
                                /* в нуль.				*/
      },
      {
	 Page4,           	/*      Строка 4                        */
      " Редактор ",		/* Верхний заголовок			*/
        			/* Из-за отсутствия здесь значений	*/
                                /* соответствующие поля устанавливаются	*/
                                /* в нуль.				*/
      }
};

void OnK(void)
{
   KBD_HOTKEY *old;

   OutStatistics("key helping");

   kbd_getHots(old);	/* Запомним старое значение и...		*/
   kbd_clearHots();	/* ...очистим его , чтобы во время показа не	*/
   			/* не реагировать на старые hotKeys		*/

                        /* Вначале нам покажется нулевая страница;      */
                        /* навигатор будет стандартный.                 */
   hlp_ShowText(&lifehlp_wnd, &loc, SIZE_OF_ARRAY(lifekey), lifekey, 0);

   kbd_setHots(old);    /* А теперь восстановим старые hotKeys		*/
   OutStatistics("");

}/*OnK*/

void OnG(void)
{
   KBD_HOTKEY *old;

   OutStatistics("game helping");

   kbd_getHots(old);	/* Запомним старое значение и...		*/
   kbd_clearHots();	/* ...очистим его , чтобы во время показа не	*/
   			/* не реагировать на старые hotKeys		*/

                        /* Вначале нам покажется нулевая страница;      */
                        /* навигатор будет стандартный.                 */
   hlp_ShowText(&lifehlp_wnd, &loc, SIZE_OF_ARRAY(lifedef), lifedef, 0);

   kbd_setHots(old);    /* А теперь восстановим старые hotKeys		*/
   OutStatistics("");

}/*OnG*/

KBD_HOTKEY p[] = {   KBD_ALT(K),OnK,
                     KBD_ALT(G),OnG,
                     KBD_NORMAL(F1),OnG,
                     0
                 };

void StartHelp(void)
{

   kbd_setHots(p);
}/*StartHelp*/

void CloseHelp(void)
{
   kbd_clearHots();
}/*CloseHelp*/

