#define TIME_TO_DIE     25000//Время сна Сциллы
#define TIME_TO_KLAC      300//Время "ам" - закрыть рот
#define TIME_TO_KLAC2     300//Время "ам" - открыть рот
#define TIME_TO_CHAV     2000//Время "ням-ням"
#define SFX_SCIL           33//Звук нам-ням
#define DEATH_RADIUS       20//Радиус убийства щетками
#define dx                 30
#define dy                 20
#define ddx                22
#define ddy                15


int near_unit;
int left_crashers[]={0,0,0,0};
int right_crashers[]={0,0,0,0};
int active_crashers[]={0,0,0,0};
int cx[]={0,0,0,0};
int cy[]={0,0,0,0};
int cr_x[]={0,0,0,0};
int cr_y[]={0,0,0,0};
int cr_last=0, pc_action=0,time_klac,time_pirates;

moveto(int unit,int x1,int y1,int x2,int y2,int time,int end_time){
  Action(unit,act_changecoor,x1+(x2-x1)*time/end_time,y1+(y2-y1)*time/end_time); 
}

int TIME_KLAC2_ADDON=0;
Pirate_Crasher(int num, int x,int y,int z, int dir, int flag){
  int i,GetDirX,GetDirY,GetDopX,GetDopY,k,l,m,n;
  if (dir==0)      GetDirX= 0;
  else if (dir==1) GetDirX=-1;
  else if (dir==2) GetDirX=-1;
  else if (dir==3) GetDirX=-1;

  if (dir==0)      GetDirY= 1;
  else if (dir==1) GetDirY= 1;
  else if (dir==2) GetDirY= 0;
  else if (dir==3) GetDirY=-1;

  if (dir==0)      GetDopX= 0;
  else if (dir==1) GetDopX= 0;
  else if (dir==2) GetDopX=dx/2;
  else if (dir==3) GetDopX= 0;

  if (dir==0)      GetDopY=dy/2;
  else if (dir==1) GetDopY= 0;
  else if (dir==2) GetDopY= 0;
  else if (dir==3) GetDopY= 0;
  iff(1){
    time_pirates=GetTime();
    pc_action=0;
  }
  if(active_crashers[num]!=1){
    active_crashers[num]=1;
    cr_x[num]=x;
    cr_y[num]=y;
    //создаем 2 подставки
    CreateEx(144,x+(ddx+GetDopX*ddx/dx)*GetDirX,y+(ddy+GetDopY*ddy/dy)*GetDirY,z,256/4*dir);
    CreateEx(144,x-(ddx+GetDopX*ddx/dx)*GetDirX,y-(ddy+GetDopY*ddy/dy)*GetDirY,z,256/4*dir);
    //индикатор
    //Create(216,x,y,z);
    //2 щетки
    cx[num]=(dx+GetDopX)*GetDirX;
    cy[num]=(dy+GetDopY)*GetDirY;
    left_crashers[num] =Create(143,x+cx[num],y+cy[num],z);
    right_crashers[num]=Create(143,x-cx[num],y-cy[num],z);
  }
  if (active_crashers[num]){
    if (pc_action==1){
     if(near_unit){ 
        pc_action=3;
        TIME_KLAC2_ADDON=TIME_TO_KLAC2-(GetTime()-time_klac)*TIME_TO_KLAC2/TIME_TO_KLAC;
        time_klac=GetTime();
     }
     else{
       if((GetTime()-time_klac)>TIME_TO_KLAC){
         time_klac=GetTime();
         pc_action=2;
         //SetEnvironment(ENV_EARTHQUAKE);
         //PlaySFX(SFX_SCIL);
         Action(left_crashers[num],act_changeaction,act_salut,0);
         Action(right_crashers[num],act_changeaction,act_salut,0);
       }
       else{
           for( i=FirstUnit(u_monster); i; i=NextUnit() )
            if( (SizeTo(i,x,y)<DEATH_RADIUS) )
            {
              if(!near_unit)Action(i,act_stop,1,0);
            }
           moveto(left_crashers[num] ,x+cx[num],y+cy[num],x+cx[num]/2,y+cy[num]/2,GetTime()-time_klac,TIME_TO_KLAC);
           moveto(right_crashers[num],x-cx[num],y-cy[num],x-cx[num]/2,y-cy[num]/2,GetTime()-time_klac,TIME_TO_KLAC);
       }
     }
    }
    else if(pc_action==2){
     if((GetTime()-time_klac)>TIME_TO_CHAV || near_unit){
       time_klac=GetTime();
       TIME_KLAC2_ADDON=0;
       pc_action=3;
       //SetEnvironment(ENV_EARTHQUAKE+ENV_STOP);
       Action(left_crashers[num] ,act_changecoor,x+cx[num]/2,y+cy[num]/2);
       Action(right_crashers[num],act_changecoor,x-cx[num]/2,y-cy[num]/2);
       Action(left_crashers[num] ,act_changecoor_z,z,0);
       Action(right_crashers[num],act_changecoor_z,z,0);
     }
     else{
         for(i=FirstUnit(u_monster); i; i=NextUnit())
         if( (SizeTo(i,x,y)<DEATH_RADIUS))
         {
            if(!near_unit)Action(i,act_damage,200,0);
         }
     }
    }
    else
     if (pc_action==3){
      if((GetTime()-time_klac)>TIME_TO_KLAC2-TIME_KLAC2_ADDON){
       time_klac=GetTime();
       pc_action=0;
      }
      else{
         for( i=FirstUnit(u_monster); i; i=NextUnit() )
         if( (SizeTo(i,x,y)<DEATH_RADIUS))
         {
            if(!near_unit) Action(i,act_damage,200,0);
         }
         moveto(left_crashers[num] ,x+cx[num]/2,y+cy[num]/2,x+cx[num],y+cy[num],GetTime()-time_klac,TIME_TO_KLAC2-TIME_KLAC2_ADDON);
         moveto(right_crashers[num],x-cx[num]/2,y-cy[num]/2,x-cx[num],y-cy[num],GetTime()-time_klac,TIME_TO_KLAC2-TIME_KLAC2_ADDON);
      }
    }
    else{//if pc_action==0
     if(!flag && !near_unit){//Глаз убит или демка началась - сциллы не работают
       if((GetTime()-time_pirates)>TIME_TO_DIE){
          time_pirates=GetTime();
          time_klac=GetTime();
          pc_action=1;
       }
     }
   }
  } 
}
PiratesTact(int dont_work)
{
  int i,j;
  near_unit=0;
  for( i=FirstUnit(u_monster); i; i=NextUnit() )
   for(j=0;j<4;j++)
    if(active_crashers[j] && (SizeTo(i,cr_x[j],cr_y[j])<DEATH_RADIUS*3) && Action(i,act_getarmy,0,0)==1){
       near_unit=1;
       break;
    }
  Pirate_Crasher(0, 532,1174,61,3,dont_work);
  Pirate_Crasher(1,1455, 523,61,3,dont_work);
}
//Решетки
#define GRATES_Z1            38
#define GRATES_Z2            72
#define GRATES_NVID         146
#define GRATES_TIME           1  //за сколько секунд наводнение поднимается
#define GRATES_X           1000
#define GRATES_Y            770
#define GRATES_RADIUS       100


GratesTact(int dont_work)
{
  iff(dont_work) ChangeZUnit(GRATES_NVID, GRATES_Z1);
  if(!dont_work)
  {
     int i;
     int grates_mode=0; //0-открыты, 1-закрываются, 2-закрыты, 3-открываются
     int grates_time=0;
     if(grates_mode==0)
     {
        if(OneTimeInHalfSecond() )
          for( i=FirstUnit(u_monster); i; i=NextUnit() )
             if(SizeToZ(i,GRATES_X,GRATES_Y)<GRATES_RADIUS
               && Action(i,act_getarmy,0,0)==0 )
             {
                Action(i,act_stop,0,0);
                Action(i,act_damage,300,0);
                grates_mode=1;
                grates_time=GetTime();
                PlaySFX(SFX_SCIL);
                PrintDebug("GRATES CLOSING!!!");
                break;
             }
     }
     else if(grates_mode==1)
     {
       if(GetTime()-grates_time>GRATES_TIME*1000)
       {
         grates_mode=2;
         grates_time=GetTime();
       }
       else
         ChangeZUnit(GRATES_NVID,GRATES_Z1+(GRATES_Z2-GRATES_Z1)*(GetTime()-grates_time)/(GRATES_TIME*1000));
     }
     else if(grates_mode==2)
     {
       if(GetTime()-grates_time>GRATES_TIME*1000)
       {
         grates_mode=3;
         grates_time=GetTime();
       }
     }
     else if(grates_mode==3)
     {
       if(GetTime()-grates_time>GRATES_TIME*1000)
       {
         grates_mode=0;
         grates_time=GetTime();
       }
       else
         ChangeZUnit(GRATES_NVID,GRATES_Z2-(GRATES_Z2-GRATES_Z1)*(GetTime()-grates_time)/(GRATES_TIME*1000));
     }
  }
}
