//#warning FALSE
#resize TRUE

#include "pcx.h--"

#define DinMessage "\"Морской бой\" (c) 2001, Volgograd
Din  FidoNet: 2:5055/141.11
     E-Mail:  _Din_@Mail.ru"

#define WithCpy    0     //Игра с компьютером
#define Network    1     //Игра по сети

#define TextColor 0

#define PackFileName "$$Pack$$.$$$"
#define KeyFileName  "$$Key$$.$$$"

#define Time 18/3

byte GameType;  //Тип игры

word FontSeg;   //Сегмент шрифта
word FontOffs;  //Смещение

word OutPackFileHandle;  //Указатель на отправляемый файл
word InPackFileHandle;   //Указатель на получаемый файл
word CfgFileHandle;      //Указатель на конфигурационный файл

word VideoBuf; //Видеобуфер
word WorkBuf;  //Буфер с игровым полем
word ToolsBuf; //Буфер с разными мелкими спрайтами

byte OutPackFile[128];
byte InPackFile[128];
byte KeyFile[128];  //Если он существует то можно читать
byte CfgFile="mb.cfg";       //Конфигурационный файл

byte palette[768];    //Палитра

byte StatusLine[40]="";  //Строка состояния
byte StatusLineColor;    //Цвет строки состояния

byte MyPole[144];        //Поле игрока
byte CpyPole[144];       //Поле компа
byte HidePole[144];      //Поле противника
byte CpyHidePole[144];   //Поле противника для Cpy

byte MainPlayer;     //Главный игрок

byte NumPack; //Номер пакета

//Определение структур передачи данных
/***************** 0 **********************/
struct _NewGame_
{
  byte UserName[30];    //Имя соперника
  byte NumWins;         //Количество побед
}Out0,In0;

/***************** 1 **********************/
struct _NewShot_
{
  byte x; //Координаты выстрела (1..10)
  byte y;
}Out1,In1;

/***************** 2 **********************/
struct _ContinueShot_
{
  byte NumPalubs; //В сколькипалубный корабль попал
}Out2,In2;

/***************** 3 **********************/
struct _Message_
{
 byte Status;      //TRUE = чат начат или идет
 byte Message[40];
}Out3,In3;

/***************** 4 **********************/
struct _Win_
{
 byte Terminator; //Типа терминатор или заглушка
}Out4,In4;

/***************** 5 **********************/
struct _Pole_
{
 byte Pole[144];  //Поле с подбитыми кораблями
}Out5,In5;


/********************** Переменные для одиночной игры ***********************/
struct _PLAYER_
{
  byte Name[30];                 //Имя игрока
  byte NumWins;                  //Количество побед
  struct _NewShot_ Shot;         //Координаты выстрела
}User,Cpy;

struct _LastShot_
{
  byte x;
  byte y;
  byte way;                     //Направление
  int  delta;                   //Приращение
  byte flag;                    //Флаг о удачном попадании
}LastShot;                      //Последний выстрел компа

#include "mb.h--"  //Подключение библиотеки со всеми процедурами

main()
 word i,i1;
 word FileHandle;
{
 //Устанавливаем знакогенератор случайных чисел
 Randomize();

 SoundBlasterStatus=FALSE;
 FOR (i=220h; i<280h; i+=20h) IF (byte ResetDsp(i)) SoundBlasterStatus=TRUE;

 IF (!SoundBlasterStatus){
    WRITESTR("\nSound Blaster не найден! $(");
 }ELSE{
    WRITESTR("\nSound Blaster найден! 8-)");

    // Выделение памяти под музон
    AMDMusicBufSeg=GETMEM(4000);

    // Выделение памяти под FileList AMD-файлов
    AMDFileList=GETMEM(4000);

    // Считываем Track-и в FileList
    GetFileList();

    // Если нет ни одного трека
    IF (NumTracks==0){
       SoundBlasterStatus=FALSE;
       StopAdlib();
    }ELSE{
      // Выбранный файл
      AMDFileListNumFile=RAND()%NumTracks;
      // Проигрываем Track
      IF (NumTracks!=0) NewTrack(AMDFileListNumFile);
    }
 }

  //Выделение досовской памяти
  VideoBuf=GETMEM(4096);
  WorkBuf=GETMEM(4000);
  ToolsBuf=GETMEM(4000);

  //Установка видеорежима 320x200x256
  AX=13h; $int 10h

  //Узнаем сегмент и адрес шрифта
  GetFont();

  //Чтение интерфейса с pcx файла
  readPCX("mb.pcx",WorkBuf,0,64000,0,pcx_raw);
  readPCX("tools.pcx",ToolsBuf,0,64000,0,pcx_raw);
  //Чтение палитры из основного файла
  readPCXpalette("mb.pcx",DS,#palette);
  SETVGAPALETTE(,0,256,#palette);

  //Читаем конфигурационный файл
   //Компановка пути выходного пакета
   DI=ReadCfgLine(#OutPackFile,0); CopyString(PackFileName,DI+#OutPackFile);
   //Компановка пути получаемого пакета
   DI=ReadCfgLine(#InPackFile,1); CopyString(PackFileName,DI+#InPackFile);
   //Компановка пути ключевого файла
   DI=ReadCfgLine(#KeyFile,2); CopyString(KeyFileName,DI+#KeyFile);

  loop(){
      AL=GetMenuItem();
      IF (AL==CpyGameItem){GameType=0; BREAK;}
      ELSE IF (AL==NetworkGameItem){GameType=1; BREAK;}
      ELSE IF (AL==AutorsItem) Autors();
      ELSE IF (AL==ExitItem){
        // Вырубаем музон
        IF (SoundBlasterStatus) StopAdlib();
        // Устанавливаем текстовый видеорежим
        AX=3; $int 10h
        //Выводим мессагу
        WRITESTR(DinMessage);
        // Возвращаемся в материнский процесс
        $int 20h;
      }ELSE IF (AL==ChangeMusonItem) ChangeMuson();
  }

Start_New_Game:

  PutWorkBufToVideoBuf();

  // Сбрасываем все настройки
  ResetAllSettings();

  IF (GameType==Network) MakeConnect();
  ELSE GetUserName();

  loop() InitGame();
}


