//----------------------------- Общее ----------------------------------------
#define music0 "music\\mus06.ogg" //проигрываемая на уровне музыка
#define music1 "music\\mus09.ogg" //проигрываемая на уровне музыка

#define LEVEL                14  //номер уровня, считая от 0
#define MONEY               400  //начальное количество денег на данном уровне
#define DEMO                  0  //есть ли проигрывание скриптовой сцены
#define BONUS_TIME_LIMIT     30  //макс время прохождения в минутах

//----------------------------- НЕЙТРАЛЫ -------------------------------------
#define MUXI                  0  //количество мух на карте
#define MUXI_NVID           422  //тип мух 


#define CIVIL                 0  //нейтралы на карте
#define CIVIL_TRAIN_RANDOM    1  //обход нейтралами своих целей по рэндому
#define CIVIL_TRAIN_REBIRTH   1  //1 - нейтралы будут перерождаться

      //тип паровоза нейтралов
int     civil_train_type[]= {0};
      //между какими станциями может ездить цивильный паровоз
      //первая колонка здесь - это точка рождения
int     civil_train_x[]   = {0};
int     civil_train_y[]   = {0};

//----------------------------- Погода ---------------------------------------
#define RAIN                  0  //дождь, 0-нет 1-время от времени 2-все время
#define RAIN_TYPE             0  //вид осадков, 0-дождь, 1-снег, 2-облака, 3-тучи, 4-метеориты
#define RAIN_ROUND_POWER      10 //интенсивность кругов на воде во время дождя (0-нет)
#define NUKE                  1  //вспышки молнии во время дождя
#define NUKE_TIME            30  //перерыв между молниями (случайный), сек
#define NO_RAIN_TIME         30  //перерыв между дождями (случайный), сек
#define RAIN_TIME            30  //продолжительность дождя (случайная), сек

#define SQUALL                1  //порывы ветра
                               
#define TORNADO               0  //торнадо

#define QUAKE_DELAY           0  //примерное время, через которое случается землетрясение, если 0, то их нет
                                 //в секундах

//НАВОДНЕНИЕ
#define FLOOD                 1  //наводнение
#define FLOOD_Z1             21  //низшая z-координата наводнения
#define FLOOD_Z2             94  //высшая z-координата наводнения
#define FLOOD_TIME           80  //за сколько секунд наводнение поднимается
#define FLOOD_NVID          204  //номер воды
#define FLOOD_REGION_NVID   752  //номер региона
#define FLOOD_REGION_Z        1  //высота над уровнем воды региона
#define FLOOD_WARNING        30  //граница между безопасным и опасным уровнем подьема воды
int flood_now_z=0;               //на какой высоте находится сейчас наводнение
#define FLOOD_SAVE_X       1500  //Безопасное место от наводнения, X-координата
#define FLOOD_SAVE_Y        400  //Безопасное место от наводнения, Y-координата

      
//ГАММЫ УРОВНЯ
#define START_DAYNIGHT        1  //начальное время суток, 0-нет, 1-день, 2-вечер, 3-ночь, 4-утро
#define GAMMA1       0x00000000  //гамма дня
#define GAMMA2       0x00272727  //гамма вечера
#define GAMMA3       0x00505050  //гамма ночи
#define GAMMA4       0x00272727  //гамма утра
#define RAIN_GAMMA1  0x00101010  //гамма дождливого дня
#define RAIN_GAMMA2  0x00373737  //гамма дождливого вечера
#define RAIN_GAMMA3  0x00404040  //гамма дождливого ночи  
#define RAIN_GAMMA4  0x00373737  //гамма дождливого утра  

#define ENV_SOUND_DAY       138  //PlaySFX(138) звуковое окружение днем (номер звука)
#define ENV_SOUND_NIGHT     137  //PlaySFX(137) звуковое окружение ночью (номер звука)
#define ENV_SOUND_FREQ       30   //частота появления звуков окружения (чем больше число тем реже звуки)

//--------------------------- Подкрепления -----------------------------------
#define PLAYER_REINFORCEMENT  0 //количество составов подкреплений для игрока
#define AI_REINFORCEMENT      1 //количество составов подкреплений для AI
int     player_reinforcement_train[]={5,0};

//----------------------------специфичные декларации--------------------------
#define AI_FORTES             1
#define AI_FORTES_DIFFICULTY  1
#define AI_NO_MASTER          0
#define NOT_REBUILD           1  //не ездить на доукомплектовку
#define RENEW_TIMEOUT        40  //пауза перед воспроизводством состава (в секундах, с рэндомом)

//----------------------------ЛИМИТЫ ЮНИТОВ НА КАРТЕ--------------------------
//#define LIMIT05               5
//#define LIMIT10               5
//#define LIMIT20              10
//#define LIMIT25              10
//#define LIMIT30              10
//#define LIMIT35              10
//#define LIMIT40              10
//#define LIMIT45               5
//#define LIMIT62               1
//#define LIMIT75               1
//#define LIMIT80              10
//#define LIMIT82               5
//#define LIMIT85               5
//#define LIMIT90               5
//#define LIMIT97               5
//#define LIMITALL             20

//--------------------------------- TRAINZ before declares---------------------
#define ATA_STAND0_X  2751
#define ATA_STAND0_Y   170

#define ATA_STAND1_X  2863
#define ATA_STAND1_Y   464

#define ATA_STAND2_X   230 
#define ATA_STAND2_Y  2071 

#define ATA_STAND3_X 1863 
#define ATA_STAND3_Y 1610

#define ATA_PATROL0_X1  759 // 738//
#define ATA_PATROL0_Y1  310 // 120//
#define ATA_PATROL0_X2 1530 //1769//
#define ATA_PATROL0_Y2  222 // 120// 

#define ATA_PATROL1_X1  501 // 467
#define ATA_PATROL1_Y1  350 // 327
#define ATA_PATROL1_X2 1650 //1769
#define ATA_PATROL1_Y2  391 // 299

#define ATA_PATROL2_X1 2155
#define ATA_PATROL2_Y1  575
#define ATA_PATROL2_X2  604
#define ATA_PATROL2_Y2  843

#define ATA_PATROL3_X1 1519
#define ATA_PATROL3_Y1 1447
#define ATA_PATROL3_X2  371
#define ATA_PATROL3_Y2 1071 

#define ATA_PATROL4_X1 2800
#define ATA_PATROL4_Y1  744
#define ATA_PATROL4_X2  872
#define ATA_PATROL4_Y2  800 


//#define DRAW_LOGIC_DEBUG 0

int this_train79[]={75,45,0};
int this_train60[]={82,10,82,0};
int this_train50[]={5,90,0};
int this_train46[]={5,30,0};

#include "maps\script\TrainsTactDeclares.lgc" //Декларации тактики по составам

//--------------------------------- TRAINZ after declares--------------------------------
int start_trains[]=             {ATT_LIGHT_AIR,ATT_LIGHT_ROCKET,ATT_MEDIUM_MORTAIR,ATT_LIGHT_DESANT,ATT_LIGHT_FIRE,ATT_LIGHT_FIRE,ATT_LIGHT_MORTAIR, /*ATT_DEFFENCE_H,           46,*/ -1};//                                                       
int start_trains_task[]=        {   ATA_STAND0,      ATA_STAND2,       ATA_PATROL0,     ATA_PATROL1,   ATA_PATROL2,   ATA_PATROL3,      ATA_PATROL4, /*    ATA_STAND1,   ATA_STAND3,*/  0};//                                                       
int start_trains_x[]=           { ATA_STAND0_X,    ATA_STAND2_X,    ATA_PATROL0_X1,  ATA_PATROL1_X1,ATA_PATROL2_X1,ATA_PATROL3_X1,   ATA_PATROL4_X1, /*  ATA_STAND1_X, ATA_STAND3_X,*/  0};//                                                       
int start_trains_y[]=           { ATA_STAND0_Y,    ATA_STAND2_Y,    ATA_PATROL0_Y1,  ATA_PATROL1_Y1,ATA_PATROL2_Y1,ATA_PATROL3_Y1,   ATA_PATROL4_Y1, /*  ATA_STAND1_Y, ATA_STAND3_Y,*/  0};//                                                       
int start_trains_renew[]=       {            0,               0,                 1,               0,             1,             1,                1, /*             0,            0,*/  0};//                                                       
int start_trains_random_task[]= {            0,             180,                 0,               0,           120,            60,                0, /*             0,            0,*/  0};//проставляем время в секундах - периодичность нападения 

int level_queue_times[]   ={ 0 };
int level_queue_trains[]  ={-1 }; 
int level_queue_task[]    ={ 0 };

#define FIRSTCONTACTTIME      5   //(сек) время, за которое мочим игрока при встрече в секундах (по рэндому, может начаться чуть позже)
#define FIRSTATTACKTIME      60   //(сек) время первой атаки в секундах (по рэндому, может начаться чуть позже)
#define STG_DESTROY_TIME     20   //(мин) время, по прошествии которого мы точно забеспокоимся о выносе игрока (по рэндому, может начаться чуть позже)
#define REBUILD_ADDON         4

//----------------------------------------------------------------------------
#include "maps\script\header.lgc"
main()
{
  iff(1)
  {
    InitDefault();
    SetPushLine(3159,1821,2997,2076,1);//enter
    SetPushLine(3000, 123,2962, 123,0);//exit 1
    SetPushLine(3035, 172,2999, 172,0);//exit 2

    SetPushLine( 302,1834, 336,1810,0);//forts enter
    SetPushLine(  90,1810, 123,1834,0);//forts exit 1
    SetPushLine( 336,1934, 302,1960,0);//forts exit 2
    
    SetPushLine(2964,1910,2893,1960,1);//our depo
    SetPushLine(2433,1885,2573,1786,1);//our master
    SetPushLine(2962, 273,2858, 273,1);//enemy depo
    SetPushLine(2006, 272,2182, 272,1);//enemy master

    SetCleverEnemyAttack(1);
    SetPosition(3072,2048);
  }
  if( !MenuEnd() )
    if( !MenuTact() )
    {
      GameTact();
      TrainsTact();
      if( OneTimeIn5Second() )
      {
        //если у игрока не осталось паровозов  и нет депо - рождаем паровоз, чтобы легче дышалось
        if((GetVid(5,VID_COUNT0)+GetVid(10,VID_COUNT0))==0 && GetVid(102,VID_COUNT2))
            AddReinforcement();
        if( !NoArmyUnits(1) )//количество юнитов в армии 1
          Win();//победил
        if( !NoArmyUnits(0) )//количество юнитов в армии 0
          if( IsNoDepo() )   //депо нет, либо нет денег на производство юнитов и депо не работает
            Loose();         //проиграл
      }
      if( Time1In100() )
      //if(1)
      {
        int flood=0,flood_time=0; 
        
        iff(1){flood_time=GetTime();flood=0;}
        if(flood==0)//Наводнения нет
        {
          if(GetTime()-flood_time>FLOOD_TIME*1000)
          {
            flood=1;
            flood_time=GetTime();
            /*SetSemaphore(2075, 557,5,0);
            SetSemaphore(2491, 779,5,0);
            SetSemaphore(1331,1459,5,0);
            SetSemaphore(1635,2083,5,0);
            SetSemaphore( 406,2084,5,0);*/
          }

          if(GetTime()-flood_time>(FLOOD_TIME-10)*1000)
          {
              //SetEnvironment(ENV_BORN_RAIN);
              StartRain();
              PlaySFX(18);
          }
        }
        else if(flood==1)//Наводнение поднимается
        {
          if(GetTime()-flood_time>FLOOD_TIME*1000)
          {
            flood=2;
            flood_time=GetTime();
          }
          else
          {
            flood_now_z=FLOOD_Z1+(FLOOD_Z2-FLOOD_Z1)*(GetTime()-flood_time)/(FLOOD_TIME*1000);
            ChangeZUnit(FLOOD_NVID,flood_now_z);
            ChangeZUnit(FLOOD_REGION_NVID,flood_now_z+FLOOD_REGION_Z);
          }
          PlaySFX(18);
        }
        else if(flood==2)//Наводнение в верхней точке
        {
         // if(GetTime()-flood_time>FLOOD_TIME*1000)
         if(1)
          {
            flood=3;
            flood_time=GetTime();
            //SetEnvironment(ENV_STOP_RAIN);
            StopRain();
          }
        }
        else if(flood==3)//Наводнение опускается
        {
          if(GetTime()-flood_time>FLOOD_TIME*1000)
          {
            flood=0;
            flood_time=GetTime();
            /*SetSemaphore(2075, 557,0,0);
            SetSemaphore(2491, 779,0,0);
            SetSemaphore(1331,1459,0,0);
            SetSemaphore(1635,2083,0,0);
            SetSemaphore( 406,2084,0,0);*/
          }
          else{
            flood_now_z=FLOOD_Z2-(FLOOD_Z2-FLOOD_Z1)*(GetTime()-flood_time)/(FLOOD_TIME*1000);
            ChangeZUnit(FLOOD_NVID,flood_now_z);
            ChangeZUnit(FLOOD_REGION_NVID,flood_now_z+FLOOD_REGION_Z);
          }
        }
      }
      if(OneTimeInSecond())
      {
        int i1;
        for(i1=FirstUnit(U_UNIT);i1;i1=NextUnit())
          if( GetVidData(GetUnitVid(i1),VID_MAXHP)>0 && GetUnitVid(i1)!=86 && GetUnitVid(i1)!=250 && GetUnitVid(i1)!=418 )
          {
             int diff_z=0;
             diff_z=flood_now_z-GetZ(i1);
             if(diff_z>0)
             {
               Create(207,GetX(i1)-20+Random(40),GetY(i1)-15+Random(30),flood_now_z);
               Create(207,GetX(i1)-20+Random(40),GetY(i1)-15+Random(30),flood_now_z);
               Create(207,GetX(i1)-20+Random(40),GetY(i1)-15+Random(30),flood_now_z);
               Create(207,GetX(i1)-20+Random(40),GetY(i1)-15+Random(30),flood_now_z);
               Create(207,GetX(i1)-20+Random(40),GetY(i1)-15+Random(30),flood_now_z);
               PlaySFXFromCoor(30,GetX(i1),GetY(i1));
               Action(i1,ACT_DAMAGE,1+diff_z/3);
             }
             if(diff_z>25)
             {
               Create(207,GetX(i1),GetY(i1),flood_now_z);
               Create(207,GetX(i1),GetY(i1),flood_now_z);
               Create(207,GetX(i1),GetY(i1),flood_now_z);
               Create(509,GetX(i1),GetY(i1),flood_now_z);
               Action(i1,ACT_DAMAGE,300);
             }
          }
      }
    }
}