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

#define LEVEL                12  //номер уровня, считая от 0
#define MONEY                 0  //начальное количество денег на данном уровне
#define DEMO                  0  //есть ли проигрывание скриптовой сцены
#define BONUS_TIME_LIMIT     15  //макс время прохождения в минутах
#define NO_START_MUSIC        1  //в деме не играть музыку
//----------------------------- НЕЙТРАЛЫ -------------------------------------
#define MUXI                  3  //количество мух на карте
#define MUXI_NVID           416  //тип мух

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

#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                  1  //дождь, 0-нет 1-время от времени 2-все время
#define RAIN_TYPE             4  //вид осадков, 0-дождь, 1-снег, 2-облака, 3-тучи, 4-метеориты
#define RAIN_ROUND_POWER      10 //интенсивность кругов на воде во время дождя (0-нет)
#define NUKE                  1  //вспышки молнии во время дождя
#define NUKE_TIME            15  //перерыв между молниями (случайный), сек
#define NO_RAIN_TIME        180  //перерыв между дождями (случайный), сек
#define RAIN_TIME            10  //продолжительность дождя (случайная), сек

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

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

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

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

//----------------------------------------------------------------------------
      //ЛИМИТЫ ЮНИТОВ НА КАРТЕ
//#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    747
#define ATA_STAND0_Y   1175

#define ATA_STAND1_X   1562
#define ATA_STAND1_Y    349

#define ATA_STAND2_X   2492
#define ATA_STAND2_Y    522

#define ATA_STAND3_X   2379
#define ATA_STAND3_Y   1175

#define ATA_STAND4_X   1136
#define ATA_STAND4_Y   1476

#define ATA_STAND5_X    672
#define ATA_STAND5_Y   1823

#define ATA_STAND6_X   1568
#define ATA_STAND6_Y   1751

#define ATA_STAND7_X   1984
#define ATA_STAND7_Y    876

#define ATA_STAND8_X   1136
#define ATA_STAND8_Y    876

#define ATA_STAND9_X    224
#define ATA_STAND9_Y    231

//#define DRAW_LOGIC_DEBUG 0

//специфичные декларации
#define AI_FORTES              0
#define AI_NO_MASTER           1
#define NOT_REBUILD            1  //не ездить на доукомплектовку
#define RENEW_TIMEOUT         30  //задержка производства в секундах
#define COVER_BATTLE_RANGE     0  //трусливая дистанция
#define NO_COVER               1  //отключение трусливости

int this_train50[]={5,20,90,0};        //состав с огнеметом и пушкой

//ПЕРЕОПРЕДЕЛЕНИЕ НАШИХ СОСТАВОВ

//int this_train2[] ={10,45,20,20,0};    //наши пушки
int this_train2[] ={45,20,10,20,0};    //наши пушки
int this_train12[]={10,45,25,85,25,0}; //наши мортиры
//int this_train22[]={10,45,80,80,0};    //наши ракетницы
int this_train22[]={45,80,10,80,0};    //наши ракетницы
int this_train52[]={45,90,10,90,0};    //наши огнеметы


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

//--------------------------------- TRAINZ after declares--------------------------------
int start_trains[]=             { ATT_LIGHT_FIRE,ATT_LIGHT_MORTAIR,ATT_LIGHT_ROCKET,ATT_LIGHT_GUN,ATT_LIGHT_FIRE, ATT_LIGHT_MORTAIR,  ATT_DIFF_GUN, ATT_LIGHT_ROCKET,  ATT_DIFF_GUN, ATT_HUYACHILO1,  ATT_DIFF_GUN, -1};
int start_trains_task[]=        {     ATA_STAND0,       ATA_STAND1,      ATA_STAND2,   ATA_STAND3,    ATA_STAND4,        ATA_STAND5,    ATA_STAND6,       ATA_STAND7,    ATA_STAND8,     ATA_STAND9,     ATA_FIGHT,  0};
int start_trains_x[]=           {   ATA_STAND0_X,     ATA_STAND1_X,    ATA_STAND2_X, ATA_STAND3_X,  ATA_STAND4_X,      ATA_STAND5_X,  ATA_STAND6_X,     ATA_STAND7_X,  ATA_STAND8_X,   ATA_STAND9_X,          1833,  0};
int start_trains_y[]=           {   ATA_STAND0_Y,     ATA_STAND1_Y,    ATA_STAND2_Y, ATA_STAND3_Y,  ATA_STAND4_Y,      ATA_STAND5_Y,  ATA_STAND6_Y,     ATA_STAND7_Y,  ATA_STAND8_Y,   ATA_STAND9_Y,          1372,  0};
int start_trains_renew[]=       {              0,                0,               0,            0,             0,                 0,             0,                0,             0,              0,             0,  0};
int start_trains_random_task[]= {              0,                0,               0,            0,             0,                 0,             0,                0,             0,              0,             0,  0};//проставляем время в секундах - периодичность нападения

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


//ОЧЕРЕДЬ ПОДКРЕПЛЕНИЯ ИГРОКУ
int our_queue[]=   { ATT_HARD_MORTAIR, ATT_HARD_FIRE, ATT_HARD_FIRE, ATT_KAMIKAZE_UNIT, ATT_HARD_FIRE, -1, -1};//

int our_coords[] = { 3132, 2373, 0 };

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

//----------------------------------------------------------------------------
#include "maps\script\header.lgc"
main()
{
  int time_demo=0;
  int not_demo=1;
  iff(1)
  {
    InitDefault();
    SetPushLine(2934,2399,3001,2188,1);//enter
    SetPushLine(  52, 110,  89, 138,0);//exit

    SetCleverEnemyAttack(1);
    //SetEnemyCanAttackNeutralTrains(1);
    SetCleverEnemyAttack(1);//вкл. поиск пути с учетом weaponrange
    //ставим мины
    //Action(Create(186,1695,607,73),act_setarmy,1,0);
    //Action(Create(186,1030,875,73),act_setarmy,1,0);
  }
  if( !MenuEnd() && not_demo )
    if( !MenuTact() )
    {
      GameTact();
      TrainsTact();
      if( OneTimeInSecond() )
      {
         //если у игрока не осталось паровозов  и нет депо - рождаем паровоз, чтобы легче дышалось
         int need_reinforcement;
         int i1;
         if(our_queue[0]>-1)
         {
            //if(GetTime()-time_game_total>our_times[0]*1000)
            //   our_create=1;//Создать по шаблону состав...
            //if((GetVid(5,VID_COUNT0)+GetVid(10,VID_COUNT0))<1)
            int cant_create=0;
            cant_create=FindNearestSprite(GETSPRITE_CLASS+B_ENGINE,our_coords[0], our_coords[1],180);
            //ВОТ ЗДЕСЬ УСЛОВИЕ, ПО КОТОРОМУ ВЫДАЕТСЯ ПОДКРЕПЛЕНИЕ
            if(!cant_create && 
              (GetVid(5,VID_COUNT0)+GetVid(10,VID_COUNT0)+GetVid(97,VID_COUNT0)<1 
                || NoArmyUnits(0)<3))
            {
               int k=0;
               arr_gettype(temp_array,our_queue[0]);
               StartCreateTrain(temp_array, our_coords[0], our_coords[1], 0);
               int i;
               for(i=0;i<sizeof(our_queue)/4-1;i++)
               {
                 our_queue[i]=our_queue[i+1];
                 //our_times[i]=our_times[i+1];
               }  
            }
         }
         if( !NoArmyUnits(1) )//количество юнитов в армии 1
           Win();//победил

         if( !NoArmyUnits(0) )//количество юнитов в армии 0
           if(our_queue[0]==-1) 
            Loose();//проиграл

         int attack_found;
         static int count_attack=0;
         attack_found=0;
         for(i1=0;i1<ARR_LENGTH;i1++)
            if(ai_trains[i1] && ai_trains_task[i1]==ATA_FIGHT)
            {   
               attack_found=1;
               break;
            }
         if(!attack_found)
         {
           int now_sent_attack;
           now_sent_attack=count_attack/2+1;
           for(i1=0;i1<ARR_LENGTH;i1++)
             if(ai_trains[i1] )
             {   
                ai_trains_task[i1]=ATA_FIGHT;
                now_sent_attack--;
                if(!now_sent_attack) break;
             }
           count_attack++;
         }
      }
      if( OneTimeInSecond() )
      {
        LDepoCapture(1360,1948,150,0);
        LMasterCapture(1389,2199,150,0);
      }
    }
    int demo_statebar=0;
    int stop_demo=0;
    int stop_demo_time=0;

    iff(1)
    {
        int bird=0;
        bird=FindNearestSprite(GETSPRITE_VID+416,1560,607,10000);
        SetFlagman(0,bird);
        SetScrollType(SCROLL_FLAGMAN_IN_CENTER);
        SetCursor(CURSOR_OFF);
        demo_statebar=GetRegStateBar();
        if(demo_statebar)
           SetStateBar(0);
        time_demo=GetTime();
        not_demo=0;
        stop_demo=0;
    }
    iff(!not_demo && (GetTime()-time_demo>20000 || GetKey() || GetInputState() )) stop_demo=1;
    iff(stop_demo) 
    {
      Effect(eff_fade,0);
      stop_demo_time=GetTime();
      SetFlagman(0,0);
    }
    iff(stop_demo && GetEffectState(eff_fade)>50)
    {
        SetScrollType(SCROLL_FROM_BORDER+SCROLL_WITH_ARROWS);
        SetCursor(CURSOR_NORMAL);
        not_demo=1;
        SetPosition(3072,2304);
        if(demo_statebar)
           SetStateBar(1);
        PlayMusicFile(music0,0);
    }
}