#define AI_L03_LGC 1
#define AI_DEFINE 1
#include "maps\script\ai_default_event_inherit.lgc"
int depo_time_create=0;
DepoFree(int depo)//депо ничего не делает
{
   int i=0,j=0,k=0,l=0,m=0,n=0;
   int addon=0;
   string depo_free;
   //dDepoFree(depo);
   if(GetUnitVid(depo)!=102) {
     Log("LOGIC: NONDEPO DepoFree, unitvid="+itoa(GetUnitVid(depo)));
     return;
   }
   depo_free="Depo Free.. ";
   if(Action(depo,act_getarmy,0,0)==1 && !ai_nd)
   //если депо - вражье 
   //и прошло больше полусекунды после того, как как убили вражеский юнит (ai_nd), то...
   {
      depo_free=depo_free+" Army..";
      iff(1) SetMoney(1,999999);
      if(depo_task>-1)
      //если задание на строительство не равно -1 (см ATT_XXXXX)
      {
             arr_cpp(temp_array,depo_array);
             BuildTrain(depo,temp_array);
             depofree_time=0;
             depo_free=depo_free+" comtinue";
             PrintDebug(depo_free);
      }
      else
      //наче думаем, что мы будем строить
      {
          depo_free=depo_free+" depotask..";
          //Уровень производства комьютера
          /*int eng,gun,oth;
          eng = GetVid( 5,VID_COUNT0)+GetVid(10,VID_COUNT0);
          gun = GetVid(20,VID_COUNT0)*2+GetVid(25,VID_COUNT0)*3+GetVid(30,VID_COUNT0)*3+GetVid(35,VID_COUNT0)*3+GetVid(80,VID_COUNT0)*4;
          oth = GetVid(45,VID_COUNT0)+GetVid(85,VID_COUNT0);
          if(gun<20 && oth<2) 
               addon=0; 
          else 
               addon=1;*/
          addon=0; //DEBUG
          //необходимо для нормального производства составов
          //депо не может произвести новый состав, 
          //пока не обработан только что произведенный, а эта обработка будет
          //вызвана в TrainCreated намного позже
          //поиск свободного слота в логике для состава
          k=find_num();
          for(i=0;i<ARR_LENGTH;i++)
             if(ai_trains[i] && ai_trains_type[i]>=ATT_DEPO_CREATED)
             {
               if(depo_time_create && GetTime()-depo_time_create>10000)
               {
                 ai_trains[i]=0;
                 ai_trains_type[i]=0;
                 depo_time_create=0;
                 depo_free=depo_free+" error 900..";

               }
               else
               {
                 PrintDebug(depo_free);
                 return;
               }
             }
          depo_time_create=0;
          depo_free=depo_free+" none 900..";
          //проверка на количество юнитов. если их больше, чем в start_trains_create, то не производим возобновления
          int start_enemy_count; start_enemy_count=0;

          for(i=0;i<sizeof(start_trains)/sizeof(int);i++)
            if(start_trains[i]>-1)
              //предполагаем, что в сооставе в ср. по 4 юнита
              start_enemy_count+=4;
          //номер состава на производство в start_trains_create
          start_enemy_count+=REBUILD_ADDON;
          start_enemy_count+=6+GetVid(102,VID_COUNT1)+GetVid(104,VID_COUNT1)+GetVid(110,VID_COUNT1)+GetVid(115,VID_COUNT1); //Депо и мастерская, плюс еще 1 состав (атакер, например)...

          static int renew_timeout_time=0;
          static int renew_i=-1;
          static int renew_random=0;
          if(renew_i < 0)
          {
            if(start_enemy_count>NoArmyUnits(1))
            {
              for(i=0;i<sizeof(start_trains_renew)/sizeof(int);i++)
                //Делаем поиск составов и сравниваем их с теми, что должны обновляться
                if(start_trains_renew[i])
                {
                   int found;
                   found=1;
                   for(j=0;j<ARR_LENGTH;j++)
                     if(ai_trains[j] &&
                        (ai_trains_task[j] ==start_trains_task[i] || 
                           ai_trains_task2[j]==start_trains_task[i]))
                        {
                           found=0;
                           break;
                        }
                   if(found)
                   //нашли, кого производить.
                   {
                   //строим восполняемые составы
                     renew_timeout_time=GetTime();
                     renew_random=Random(RENEW_TIMEOUT)-RENEW_TIMEOUT/2;
                     renew_i=i;
                   }
                }
            }
            else
            {
              depo_free=depo_free+" too many units...";
            }
          }
          else
          {
            depo_free=depo_free+" no_renew..."+itoa(GetTime()-renew_timeout_time);
          }
          if(renew_i > -1 && (GetTime()-renew_timeout_time>=(RENEW_TIMEOUT+renew_random)*1000))
          {
                  ai_trains[k]=depo;
                  ai_trains_type[k]=start_trains[renew_i]+addon+ATT_DEPO_CREATED;
                  ai_trains_task[k]=start_trains_task[renew_i];
                  ai_trains_task2[k]=ATA_NONE;
                  BuildThisTrain(depo,ai_trains_type[k]-ATT_DEPO_CREATED);
                  PrintDebug(depo_free);
                  renew_i=-1;
                  renew_timeout_time=0;
                  return;
          }
          depo_free=depo_free+" none start rebuild..";
          if(level_queue_times[0]>0 && GetTime()-time_game_total>level_queue_times[0]*1000)
          {
#ifdef LIMIT_ATACKERS
             int atackers_count;atackers_count=0;

             for(i=0;i<ARR_LENGTH;i++)
               if(ai_trains[i] && ai_trains_task[i]/10*10==ATA_FIGHT) atackers_count++;
             if(LIMIT_ATACKERS>atackers_count){
#endif
                ai_trains[k]=depo;
                ai_trains_type[k]=level_queue_trains[0]+addon+ATT_DEPO_CREATED;
                ai_trains_task[k]=level_queue_task[0];
                ai_trains_task2[k]=ATA_NONE;
                for(i=0;i<sizeof(level_queue_times)/4-1;i++)
                {
                  level_queue_times[i]=level_queue_times[i+1];
                  level_queue_trains[i]=level_queue_trains[i+1];
                  level_queue_task[i]=level_queue_task[i+1];
                }  
                BuildThisTrain(depo,ai_trains_type[k]-ATT_DEPO_CREATED);
                PrintDebug(depo_free);
                return;
#ifdef LIMIT_ATACKERS
             }
#endif
          }
          /*
          else 
          //строим всякую всячину
          {
             int q=0;
             int linker_found=0;
             linker_found=0;
             for(j=0;j<ARR_LENGTH;j++)
               if(ai_trains_type[j]/10==ATT_LINK) 
               {
                  linker_found=1;
               }

             //модуль с паровозом
             if(!q && !linker_found)
             for(i=0;i<ARR_LENGTH;i++){
               int radius_c;
               radius_c=IsTrainAtWeaponRadiusEx(ai_trains[i]);
               if(  !TrainHasUnitVid(ai_trains[i],10)
                    && !TrainHasUnitVid(ai_trains[i],5)
                    && ai_trains_type[i]%10!=9
                    && radius_c==TRADIUS_NOTINRADIUS

                )
                {
                    if(ai_trains_type[i] % 10 == 0)
                       ai_trains_type[k]=ATT_LINK_ENGINE+ATT_DEPO_CREATED;
                    else
                       ai_trains_type[k]=ATT_LINK_ENGINE2+ATT_DEPO_CREATED;
                    if (BuildLinker(depo,i,k,ai_trains_type[k]-ATT_DEPO_CREATED))
                    {
                      q=1;
                      PrintDebug(depo_free);
                      return;
                    }

                }
             } 
             depo_free=depo_free+" none other build..";
          }//else - строим всякую всячину
          */
          //номер состава, который нуждается в доукомплектовке
          for(i=0;i<ARR_LENGTH;i++)
            if(ai_trains[i] && ai_trains_task[i]==ATA_REBUILD)
            {
                BuildLinker(depo,i,k,ATT_REBUILD_PART);
                PrintDebug(depo_free);
                return;
            }
          //если нет состава, который уже доукомплектовывается
          for(i=0;i<ARR_LENGTH;i++)
          {
             if(ai_trains[i] && ai_trains_task2[i]==ATA_REBUILD)
             //если у состава во вторичной задаче давно маячит то, что он должен переукомплектоваться...
             {
                int radius_c;
                radius_c=IsTrainAtWeaponRadiusEx(ai_trains[i]);
                if(radius_c==TRADIUS_NOTINRADIUS)
                //если рядом с составом никого нет, кто бы мог помешать...
                {
                   ai_change_task(i,ATA_REBUILD,O_TO_TASK2);
                   BuildLinker(depo,i,k,ATT_REBUILD_PART);
                   PrintDebug(depo_free);
                   return;
                }
             }
          }
          depo_free=depo_free+" none rebuild..";
      }//else - наче думаем, что мы будем строить
      PrintDebug(depo_free);
   }//if(Action(depo,act_getarmy,0,0)==1 && !ai_nd)
}//DepoFree

TrainDestroy(int train)
{
  dTrainDestroy(train);
  if(Action(train,act_getarmy,0,0)==1)
  {
     //убит состав... а что делать!!!
  }
}

TrainCreated(int train)
//создан в депо
{
   int i=0,j=0,k=0;
   dTrainCreated(train);
   if(Action(train,act_getarmy,0,0)==1)
   {
      k=0;
      for(i=0;i<ARR_LENGTH;i++)
       if(ai_trains[i]==0)
       {
          k=i;
          break;
      }
      for(j=0;j<ARR_LENGTH;j++)
        if(ai_trains_type[j]>=ATT_DEPO_CREATED)
        {
           if(depo_task==-1)
           {
              ai_trains[j]=train;
              ai_trains_type[j]=ai_trains_type[j]-ATT_DEPO_CREATED;
              ai_trains_behave[j]=0;
              Action(ai_trains[j],ACT_STOP);
              MoveAway(ai_trains[j],enemy_depo,1000);
           }
           break;
        }
     PrintDebug("EnemyMoney: "+itoa(GetMoney(1)));
   }
}
UnitCreated(int unit)
{
   int i=0,j=0,k=0,m=0;
   if(Action(unit,act_getarmy,0,0)==1)
   {
      Action(unit,ACT_SET_BEHAVE,Action(unit,ACT_GET_BEHAVE)|1);
      for(j=0;j<ARR_LENGTH;j++)
         if(ai_trains_type[j]>=ATT_DEPO_CREATED)
         {
            if(ai_trains[j]==enemy_depo)
               ai_trains[j]=unit;
         }
       //сдвиг всех юнитов
      for(k=0;k<29;k++) 
          depo_array[k]=depo_array[k+1];
      //depo_array[k]=0;
      m=0;
      for(i=0;i<30;i++) if(depo_array[i]) m=1;
      if(!m)
      {
         depo_task=-1;
         //Action(enemy_depo,ACT_PAUSE,7000);
      }
      //else Action(enemy_depo,ACT_PAUSE,2000);

      depofree_time=0;
      PrintDebug("Enemy Unit Created");
      depo_time_create=GetTime();
   }
   if(Action(unit, ACT_GET_ARMY)==0)
      Message("UnitCreated"+itoa(GetUnitVid(unit)),GetX(unit),GetY(unit));
}                                                                       
DepoBirth(int depo)
//депо создалось, либо восстановлено
{
  dDepoBirth(depo);
}
DepoDestroy(int depo)
{
   int i,j;
   dDepoDestroy(depo);
   if(Action(depo,act_getarmy,0,0)==1){
      PrintDebug("Enemy Depo Destroyed");
      for(i=0;i<ARR_LENGTH;i++)
      {
        if(ai_trains_type[i]>=ATT_DEPO_CREATED)
        {
          ai_trains_type[i]=ai_trains_type[i]-ATT_DEPO_CREATED;
          depo_task=-1;
          for(j=0;j<30;j++) depo_array[j]=0;
        }
        if(ai_trains_task[i]==ATA_REBUILD)
        {
          ai_change_task(i,O_NONE,O_FROM_TASK2);
          ai_trains_task2[i]=ATA_REBUILD;
        }
      }

   }
}

UnitDestroy(int unit)
{
  int i=0,j=0;
  if(Action(unit,ACT_GET_ARMY,0,0)==1)
  {
        i=FindTrain2(unit);
        if(i>-1)
        {
           for(j=Action(unit,ACT_FIRST_ENGINE);j;j=Action(j,ACT_NEXT_ENGINE))
              if(j!=unit) 
              { 
                 ai_trains[i]=j;
                 ai_nd=1;
                 ai_i_nd=i;
                 ai_num_nd=j;
                 ai_time_nd=GetTime();
                 break;
              }
        }
        unit_destr=1;
   }
}
EnemyLinked(int train)
//состав врага прилинковал игрок, допустим, для перекрашивания. Мы теперь
//должны бахнуть из логики наши про него думы
{
  int i=0;
  if(Action(train,act_getarmy,0,0)==1)
  {
     string s;
     s="Enemy Link...";
     for(i=0;i<ARR_LENGTH;i++)
       if(UnitInTrain(train,ai_trains[i]))
       {
          ai_trains[i]=0;
          ai_trains_type[i]=0;
          ai_trains_target[i]=0; 
          ai_trains_task[i]=ATA_NONE;
          ai_trains_task2[i]=ATA_NONE;
          ai_trains_behave[i]=ABT_NONE;
          ai_trains_time[i]=0;
          ai_trains_random_task[i]=0;
          ai_trains_task_backup[i]=ATA_NONE;
          s=s+"processed";
       }
     unit_destr=1;
     PrintDebug(s);
  }
}
TrainClash(int train1,int train2)//два поезда столкнулись
{
   if(Action(train1,ACT_GET_ARMY)==1 && Action(train2,ACT_GET_ARMY)==1)
   {
      //производим проверку...
      int need_to_link=0;need_to_link=0;
      int tr[2];tr[0]=train1;tr[1]=train2;
      int i=0,j=0;
      for(i=0;i<2;i++)
      {
         int found=0;found=0;
         //если состава нет в логике, если у состава нет паровоза...
         if(!TrainHasUnitVid(tr[i],5) && !TrainHasUnitVid(tr[i],10) && !TrainHasUnitVid(tr[i],97))
            need_to_link=1;
         for(j=0;j<ARR_LENGTH;j++)
           if(UnitInTrain(ai_trains[j],tr[i])) found=1;
         if(!found) need_to_link=1;
      }
      if (need_to_link)
      {
          Action(train1,act_forcelinkengine,train2,0);
          Action(train2,act_forcelinkengine,train1,0);
      }
      PrintDebug("Enemy Linked!");
   }
}
#include "maps\script\ai_default_event.lgc"
