// функции относящиеся к монстрам
#define MONSTERS_H aaa

//------------------------------------------------------------------------------------------
#ifndef UTIL_STATISTICS_H
    #include "maps\util_statistics.lgc"
#endif


//------------------------------------------------------------------------------------------
CreateItemsForBirth0(int unit)
{
#ifndef NEW_SURVIVE
  int n_items,i,sum_p;
  if( Action(unit,ACT_GET_ITEM,0) )// не добавлять новых вещей если уже есть
    return;
  sum_p = 0;
  for( i=0; i<sizeof(BirthItems0)/4; i++ )
    sum_p += BirthItemsP0[i];
  n_items = Random(sum_p);
  for( i=0; i<sizeof(BirthItems0)/4; i++ )
    if( (n_items -= BirthItemsP0[i]) < 0 )
      break;
  if( i<sizeof(BirthItems0)/4 )
    if( BirthItems0[i] )
      Action(unit,ACT_ADD_ITEM,BirthItems0[i],0);
#endif
}


//------------------------------------------------------------------------------------------
CreateItemsForBirth1(int unit)
{
#ifndef NEW_SURVIVE
  int n_items,i,sum_p;
  if( Action(unit,ACT_GET_ITEM,0) )// не добавлять новых вещей если уже есть
    return;
  sum_p = 0;
  for( i=0; i<sizeof(BirthItems1)/4; i++ )
    sum_p += BirthItemsP1[i];
  n_items = Random(sum_p);
  for( i=0; i<sizeof(BirthItems1)/4; i++ )
    if( (n_items -= BirthItemsP1[i]) < 0 )
      break;
  if( i<sizeof(BirthItems0)/4 )
    if( BirthItems1[i] )
      Action(unit,ACT_ADD_ITEM,BirthItems1[i],0);
#endif
}


//------------------------------------------------------------------------------------------
CreateItemsForBirth2(int unit)
{
#ifndef NEW_SURVIVE
  int n_items,i,sum_p;
  if( Action(unit,ACT_GET_ITEM,0) )// не добавлять новых вещей если уже есть
    return;
  sum_p = 0;
  for( i=0; i<sizeof(BirthItems2)/4; i++ )
    sum_p += BirthItemsP2[i];
  n_items = Random(sum_p);
  for( i=0; i<sizeof(BirthItems2)/4; i++ )
    if( (n_items -= BirthItemsP2[i]) < 0 )
      break;
  if( i<sizeof(BirthItems0)/4 )
    if( BirthItems2[i] )
      Action(unit,ACT_ADD_ITEM,BirthItems2[i],0);                        
#endif
}


//------------------------------------------------------------------------------------------
CreateItemsForBirth3(int unit)
{
#ifndef NEW_SURVIVE
  int n_items,i,sum_p;
  if( Action(unit,ACT_GET_ITEM,0) )// не добавлять новых вещей если уже есть
    return;
  sum_p = 0;
  for( i=0; i<sizeof(BirthItems3)/4; i++ )
    sum_p += BirthItemsP3[i];
  n_items = Random(sum_p);
  for( i=0; i<sizeof(BirthItems3)/4; i++ )
    if( (n_items -= BirthItemsP3[i]) < 0 )
      break;
  if( i<sizeof(BirthItems0)/4 )
    if( BirthItems3[i] )
      Action(unit,ACT_ADD_ITEM,BirthItems3[i],0);
#endif
}


//------------------------------------------------------------------------------------------
CreateItemsForBirth4(int unit)
{
#ifndef NEW_SURVIVE
  int n_items,i,sum_p;
  if( Action(unit,ACT_GET_ITEM,0) )// не добавлять новых вещей если уже есть
    return;
  sum_p = 0;
  for( i=0; i<sizeof(BirthItems4)/4; i++ )
    sum_p += BirthItemsP4[i];
  n_items = Random(sum_p);
  for( i=0; i<sizeof(BirthItems4)/4; i++ )
    if( (n_items -= BirthItemsP4[i]) < 0 )
      break;
  if( i<sizeof(BirthItems0)/4 )
    if( BirthItems4[i] )
      Action(unit,ACT_ADD_ITEM,BirthItems4[i],0);
#endif
}


//------------------------------------------------------------------------------------------
CreateItemsForBirth5(int unit)
{
#ifndef NEW_SURVIVE
  int n_items,i,sum_p;
  if( Action(unit,ACT_GET_ITEM,0) )// не добавлять новых вещей если уже есть
    return;
  sum_p = 0;
  for( i=0; i<sizeof(BirthItems5)/4; i++ )
    sum_p += BirthItemsP5[i];
  n_items = Random(sum_p);
  for( i=0; i<sizeof(BirthItems5)/4; i++ )
    if( (n_items -= BirthItemsP5[i]) < 0 )
      break;
  if( i<sizeof(BirthItems5)/4 )
    if( BirthItems5[i] )
      Action(unit,ACT_ADD_ITEM,BirthItems5[i],0);
#endif
}


//------------------------------------------------------------------------------------------
// добавление очков за убитый юнит
AddScores(int unit)
{
  //zmNEW 20050713
  CurStatData[ VSTAT_MMONSTERSKILLED ]++;
  //
  int weapon;
  weapon = GetVidData(9,VID_LINK)-10;
  if( !weapon)
    weapon = 10;
  if( PlayerScoresTact < 15000 )//чтобы за раз не дать слишком много очков
    PlayerScoresTact = (PlayerScoresTact*11)/10;
  PlayerScoresTact += GetVidData(GetUnitVid(unit),VID_MAXHP) + (GetVidData(GetUnitVid(unit),VID_MAXHP) * 10) / (weapon*3);
  //
  IncreaseExpa(GetVidData(GetUnitVid(unit),VID_MAXHP), true);
}


//------------------------------------------------------------------------------------------
// При смерти юнита рождение его содержимого
CreateItems(int unit)
{
  //добавление очков за убитый юнит
  if( Action(unit,ACT_GET_ARMY)==1 )
    AddScores(unit);

  int item,no_items;
  for( no_items=0; no_items < 20; no_items++ )
    if( !Action(unit,ACT_GET_ITEM,no_items,0) )
      break;
  if( no_items )
  {
    int n_items = Random(no_items-1);
    //
    int dZ = 0;
    int iVid = Action(unit,ACT_GET_ITEM,n_items,0);
    if(iVid >= 1845 && iVid <= 1847)
    	dZ = 20;
    //
    if ( LevelNumber < 0 && iVid >= 302 && iVid <= 309 && GetUnitVid(Action(Flagman(0), ACT_GET_LINK)) >= 12 )//для патронов в сурвайве
        if ( Random(100) < 70 )// в 70% случаев
            iVid = 300 + GetUnitVid(Action(Flagman(0), ACT_GET_LINK)) - 10;
    if ( GetUnitVid(unit) == 880 )	//летучие
      item = CreateSprite( iVid, GetX(unit), GetY(unit), GetZ(unit) - 30, Random(255) );
    else
      item = CreateSprite( iVid, GetX(unit), GetY(unit)+dZ, GetZ(unit)+10+dZ, Random(255) );
	//
//    Action(item,ACT_SET_ZSPEED,20);
//    Action(item,ACT_SET_SPEED,5);
    if(!IsBox(unit))
    {
        AddCommand(item,ACT_PAUSE,17000,5000);
        AddCommand(item,ANI_DEATH);
    }
    if ( GetUnitVid(unit) < 880 && GetUnitVid(unit) > 850 && Action(unit,ACT_GET_ITEM,0,0) == Action(unit,ACT_GET_ITEM,1,0) )
    {
      item = CreateSprite( Action(unit,ACT_GET_ITEM,n_items,0), GetX(unit) + 10, GetY(unit) - 10, GetZ(unit)+10, Random(255) );
      AddCommand(item,ACT_PAUSE,17000,5000);
      AddCommand(item,ANI_DEATH);
    }
  }
}
/*DamageMonster(int unit,int cannon)
{
  int score,weapon;
  weapon = GetVidData(9,VID_LINK)-10;
  if( !weapon)
    weapon = 10;

  if( GetAnimation(unit)==ANI_DEATH2 )
    score = GetVidData(GetUnitVid(unit),VID_MAXHP);
  else if( GetAnimation(unit)==ANI_DEATH )
    score = GetVidData(GetUnitVid(cannon),VID_DAMAGE);
  else
    score = 2*GetVidData(GetUnitVid(cannon),VID_DAMAGE);
  score += (score * 10) / (weapon*3);
  PlayerScores += score;
}

F040_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F043_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F046_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F050_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F053_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F056_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F060_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F063_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F066_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F070_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F073_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F076_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F080_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F083_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F086_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F090_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F093_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F096_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F850_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F853_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F856_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F860_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F863_7(int unit,int cannon) { DamageMonster(unit,cannon); }
F866_7(int unit,int cannon) { DamageMonster(unit,cannon); }
*/

F1550_15(int unit)
{
  //если это камикадзе умирает после выстрела то делать это без анимации
  if( !Action(unit,ACT_GET_AMMO) )
  {
//    CreateSprite(1084,GetX(unit),GetY(unit),GetZ(unit)+10,GetDirection(unit)); //Повреждение игрока
//    CreateSprite(1335,GetX(unit),GetY(unit),GetZ(unit)+70,GetDirection(unit)); //рождение взрыва кислотного
    Destroy(unit);
  }
  else
    CreateItems(unit);
}
//смерть камикадзе после атаки
F1550_8(int unit)
{
//  Action(unit,ACT_SET_SPEED,30);
  AddCommand(unit,ANI_DEATH);
}
// сделать чтобы комикадзе при ходьбе иногда останавливался
/*F1550_2(int unit)
{
    if ( !Random(7) )
    {
        Action(unit, ANI_STAND);
        Action(unit, ACT_STOP, 0);
//        Action(unit, ACT_SET_PAUSE, 500);
        Action(unit, ACT_SET_COMMAND, 0);
    }
}*/

F1765_14(int unit)
{
    AddCommand(unit, ANI_DEATH, -1);
}
F1765_DAMAGE(int unit,int beating_unit, int damage)
{
    if ( damage >= Action(unit, ACT_GET_HP) )
        return -10000;// чтобы гарантированно вызвалась ACT_DEATH2 увеличиваем дамэдж до 10000
    return 0;
}
F1766_14(int unit)
{
    AddCommand(unit, ANI_DEATH, -1);
}
F1766_DAMAGE(int unit,int beating_unit, int damage)
{
    if ( damage >= Action(unit, ACT_GET_HP) )
        return -10000;// чтобы гарантированно вызвалась ACT_DEATH2 увеличиваем дамэдж до 10000
    return 0;
}
F1767_14(int unit)
{
    AddCommand(unit, ANI_DEATH, -1);
}
F1767_DAMAGE(int unit,int beating_unit, int damage)
{
    if ( damage >= Action(unit, ACT_GET_HP) )
        return -10000;// чтобы гарантированно вызвалась ACT_DEATH2 увеличиваем дамэдж до 10000
    return 0;
}
F1785_14(int unit)
{
    AddCommand(unit, ANI_DEATH, -1);
}
F1785_DAMAGE(int unit,int beating_unit, int damage)
{
    if ( damage >= Action(unit, ACT_GET_HP) )
    {
        Action(unit, ACT_CLEAR_STACK);
        return -10000;// чтобы гарантированно вызвалась ACT_DEATH2 увеличиваем дамэдж до 10000
    }
    return 0;
}
F2104_14(int unit)
{
    AddCommand(unit, ANI_DEATH, -1);
}
F2104_DAMAGE(int unit,int beating_unit, int damage)
{
    if ( damage >= Action(unit, ACT_GET_HP) )
        return -10000;// чтобы гарантированно вызвалась ACT_DEATH2 увеличиваем дамэдж до 10000
    return 0;
}
F2150_DAMAGE(int unit,int beating_unit, int damage)
{
    if ( beating_unit && GetUnitVid(beating_unit) == 2205 )
    {// если монстра бьет разрушительный луч
        Action(unit, ACT_STOP, 1);
        Action(unit, ACT_SET_COMMAND, COM_NONE, 0);
        if ( GetAnimation(unit) != ANI_OPEN )
            Action(unit, ANI_OPEN);
    }
}

//------------------------------------------------------------------------------------------
#ifndef MONSTERS_LIST_H
    #include "maps\monsters_list.lgc"
#endif

