




///////index0 = allow in wave
///////index1 = index list squad enemies
///////index2 = spawn location type
///////index3 = count as midboss

array<array<int>>@ list_wave_enemies = {

{1 , 0, 0, 0}


};

array<int>@ max_roll_squad_per_wave = {

4, 8, 12, 16, 20, 25, 30, 30

};

array<int>@ total_enemies_per_wave = {

25,
35,
45,
55,
65,
75,
85,
999

};


array<string>@ location_type = {

"spawnenemy",
"spawnenemybigarea",
"spawnenemyair",
"spawnenemyairchopper"


};



array<string>@ mm_start_wave = {

"mm_wave1",
"mm_wave2",
"mm_wave3",
"mm_wave4",
"mm_wave5",
"mm_wave6",
"mm_wave7",
"mm_wave8"

};








array<array<int>>@ list_squad_enemies = {


{0 , 0, 0, 0 ,0 ,0},  ////1

{1 ,1 ,0 ,0 ,0 ,13},
{2 ,2 ,0 ,0 ,4 ,0},
{4 ,1 ,20 ,20 ,0 ,0},
{20 ,2 ,6 ,1 ,0 ,0},
{13 ,2 ,20 ,20 ,22 ,0},    ////2

{17 ,0 ,3 ,0 ,4 ,1},
{6 ,6 ,0 ,2 ,7 ,0},
{22 ,25 ,25 ,25 ,25 ,25},
{0 ,6 ,17 ,20 ,3 ,10},    ////3
{15 ,0 ,17 ,1 ,20 ,20},

{3 ,4 ,5 ,2 ,4 ,2},
{9 ,25 ,25 ,25 ,25 ,25},
{0 ,14 ,0 ,15 ,15 ,22},     ////4
{12 ,2 ,2 ,12 ,9 ,9},
{20 ,21 ,20 ,1 ,22 ,22},

{2 ,19 ,17 ,4 ,17 ,2},
{16 ,0 ,0 ,20 ,20 ,3},      ////5
{20 ,20 ,5 ,5 ,0 ,22},
{2 ,4 ,1 ,6 ,22 ,23},
{0 ,15 ,20 ,20 ,10 ,8},

{2 ,4 ,3 ,0 ,0 ,18},      ////6
{20 ,6 ,21 ,12 ,0 ,24},
{2 ,16 ,13 ,0 ,21 ,11},
{9 ,9 ,9 ,9 ,5 ,14},
{1 ,15 ,15 ,7 ,8 ,23},

{0 ,0 ,24 ,23 ,23 ,24},     ////7
{6 ,14 ,14 ,14 ,13 ,17},     
{5 ,10 ,19 ,11 ,11 ,11},
{13 ,13 ,8 ,0 ,0 ,18},
{8 ,5 ,19 ,18 ,10 ,7}




};

///////index0 = ent name
///////index1 = display name
///////index2 = model
///////index3 = replace sound
///////index4 = is opposite(if ally)
///////index5 = base hp
///////index6 = blood color
///////index7 = weapon

array<array<string>>@ list_enemies = {


{"monster_zombie" ,"Combine Pawn" ,"models/7hw_kc/combine_trooper.mdl" ,"../killing_combine/combine_pawn.txt" ,"0" ,"100", "1","0"}, //0
{"monster_zombie" ,"Combine Hound" ,"models/7hw_kc/panthereye.mdl" ,"../killing_combine/combine_hound.txt" ,"0" ,"100", "0","0"},   //1
{"monster_human_grunt" ,"Combine Soldier" ,"models/7hw/combine_soldier.mdl" ,"../killing_combine/combine_hgrunt_sentence.txt" ,"0" ,"100", "1","3"},  //2
{"monster_human_grunt" ,"Combine Soldier" ,"models/7hw/combine_soldier.mdl" ,"../killing_combine/combine_hgrunt_sentence.txt" ,"0" ,"100", "1","5"},  //3
{"monster_human_grunt" ,"Combine Shotgunner" ,"models/7hw/combine_shotgunner.mdl" ,"../killing_combine/combine_hgrunt_sentence.txt" ,"0" ,"100", "1","8"},  //4

{"monster_human_grunt_ally" ,"Combine Captain" ,"models/7hw_kc/combine_captain.mdl" ,"../killing_combine/combine_fgrunt_sentence.txt" ,"1" ,"200", "1","5"},   //5
{"monster_barney" ,"Combine Gunslinger" ,"models/7hw/combine_gunslinger_v2.mdl" ,"../killing_combine/combine_gunslinger.txt" ,"1" ,"100", "1","0"},  //6
{"monster_barney" ,"Combine Fort" ,"models/7hw_kc/combine_fort_v2.mdl" ,"../killing_combine/combine_gunslinger.txt" ,"1" ,"300", "1","0"},          //7
{"monster_otis" ,"Combine Elite" ,"models/7hw/combine_elite_v2.mdl" ,"../killing_combine/combine_elite.txt" ,"1" ,"200", "1","0"},               //8
{"monster_human_grunt" ,"Combine Blinker" ,"models/7hw/combine_blinker.mdl" ,"../killing_combine/combine_hgrunt_sentence.txt" ,"0" ,"100", "1","10"},   //9

{"monster_hwgrunt" ,"Combine Heavy Gunner" ,"models/7hw/combine_heavy.mdl" ,"../killing_combine/combine_hgrunt_sentence.txt" ,"0" ,"600", "1","0"},    //10
{"monster_human_grunt" ,"Combine Cannon" ,"models/7hw/combine_rpg.mdl" ,"../killing_combine/combine_hgrunt_sentence.txt" ,"0" ,"100", "1","64"},        //11
{"monster_human_grunt" ,"Combine Sniper" ,"models/7hw/combine_sniper.mdl" ,"../killing_combine/combine_hgrunt_sentence.txt" ,"0" ,"100", "1","128"},     //12
{"monster_robogrunt" ,"Combine Automaton" ,"models/7hw/rgrunt_combine.mdl" ,"" ,"0" ,"100", "0","1"},       //13
{"monster_gonome" ,"Combine Slasher" ,"models/7hw/combine_slasher.mdl" ,"" ,"0" ,"200", "0","0"},        //14

{"monster_shocktrooper" ,"Combine Strider S1" ,"models/7hw/combine_strider.mdl" ,"" ,"0" ,"200", "0","0"},       //15
{"monster_pitdrone" ,"Combine Hunter DX1" ,"models/7hw/combine_hunter.mdl" ,"" ,"0" ,"100", "0","0"},             //16
{"monster_human_medic_ally" ,"Combine Medic" ,"models/7hw_kc/combine_medic.mdl" ,"../killing_combine/combine_fgrunt_sentence.txt" ,"1" ,"100", "1","2"},       //17
{"monster_human_grunt_ally" ,"Combine Suppressor" ,"models/7hw_kc/combine_suppressor.mdl" ,"../killing_combine/combine_fgrunt_sentence.txt" ,"1" ,"200", "1","16"},    //18
{"monster_human_grunt" ,"Combine Charger" ,"models/7hw_kc/combine_charger.mdl" ,"../killing_combine/combine_fgrunt_sentence.txt" ,"1" ,"600", "1","8"},        //19

{"monster_alien_slave" ,"Combine Xen Slave" ,"models/islave.mdl" ,"" ,"0" ,"100", "0","0"},                      //20
{"monster_alien_grunt" ,"Combine Xen Grunt" ,"models/agrunt.mdl" ,"" ,"0" ,"200", "0","0"},                      //21
{"monster_alien_controller" ,"Combine Xen Controller" ,"models/controller.mdl" ,"" ,"0" ,"100", "0","0"},        //22
{"monster_alien_voltigore" ,"Combine Voltigore" ,"models/voltigore.mdl" ,"" ,"0" ,"800", "0","0"},                     //23
{"monster_gargantua" ,"Combine Gargantua" ,"models/garg.mdl" ,"" ,"0" ,"600", "0","0"},                         //24

{"monster_stukabat" ,"Combine Manhack" ,"models/7hw/combine_manhack.mdl" ,"" ,"0" ,"50", "0","0"},              //25
{"monster_sentry" ,"Combine Sentry" ,"models/7hw/combine_sentry.mdl" ,"" ,"0" ,"100", "0","0"}                   //26

};


array<array<string>>@ list_bosses = {

{"monster_alien_tor" ,"Combine Xen Commander" ,"models/tor.mdl" ,"" ,"0" ,"6000", "0","0"},
{"monster_male_assassin" ,"Combine Warrior" ,"models/7hw_kc/combine_warrior_v2.mdl" ,"" ,"0" ,"4000", "0","32"},
{"monster_robogrunt" ,"Combine General" ,"models/7hw/combine_general_v2.mdl" ,"" ,"0" ,"4000", "0","3"},
{"monster_kingpin" ,"Combine Advisor" ,"models/7hw/combine_advisior.mdl" ,"" ,"0" ,"3000", "0","0"},
{"monster_apache" ,"Combine Gunship" ,"models/7hw/combine_gunship.mdl" ,"" ,"0" ,"8000", "0","0"}


};






int CURRENT_WAVE = 0;
int MAX_WAVE = 8;
int REMAIN_ENEMY = 0;
////int COUNT_DEAD_ENEMIES = 0;

int MAX_ROLL_SQUAD = 4;
int MIDBOSS_COOLDOWN_COUNT = 0;
int MIDBOSS_COOLDOWN_COUNT_ASSIGN = 5;

float CURRENT_HP_MULTIPIER = 0;
float BASE_HP_MULTIPIER = 0.25;
float HP_MULTIPIER_PER_PLAYERS = 0.05;


int MAX_ENEMIES_ACTIVE = 20;
int MAX_ENEMIES_ACTIVE_PER_PLAYERS = 2;
int CURRENT_MAX_ENEMIES_ACTIVE = 0;
int CURRENT_ENEMIES_ACTIVE = 0;


float TOTAL_ENEMIES_PER_PLAYERS = 0.25;
int CURRENT_TOTAL_ENEMIES = 0;
int CURRENT_ENEMIES_QUOTA = 0;


int MAX_BREAK_TIME = 60;
int CURRENT_BREAK_TIME = 0;

float BASE_DMG_TAKEN = 0.2;
float DMG_TAKEN_INCREASE_PER_PLAYER = 0.05;
float MAX_DMG_TAKEN = 1.0;
float CURRENT_DMG_TAKEN = 1.0;



int CURRENT_PLAYERS = 0;


bool ENABLE_BUYING_ROOM = true;


bool ALLOW_DISPLAY_TEATIME = false;

bool IS_BOSS_WAVE = false;



HUDTextParams FORMAT_TEXT_INTERVAL;

HUDTextParams FORMAT_TEXT_TEATIME_INTERVAL;


void tick_kill_remain()
{



            CBaseEntity@ monster_to_be_killed;
            CBaseEntity@ monster_to_be_killed2;
            
     if(CURRENT_TOTAL_ENEMIES > 0)
        {

           if(CURRENT_TOTAL_ENEMIES < 15)
             {       
             array<string>@ list_killing_remain = {"monster_stukabat","monster_alien_controller"};
             int RANDOM_CHOSEN = Math.RandomLong( 0, 1 );
             string CHOSEN_ENEMY = list_killing_remain[RANDOM_CHOSEN];
             @monster_to_be_killed = g_EntityFuncs.FindEntityByClassname(monster_to_be_killed, CHOSEN_ENEMY);

            g_EntityFuncs.FireTargets("hurt_force_gib", monster_to_be_killed, monster_to_be_killed, USE_SET);

            ////string TEST_MSG = string(1111);
            ////g_PlayerFuncs.ShowMessageAll(TEST_MSG );

             }
             
       }
        
}



void event_spawn_wave_enemies(CBaseEntity@ activator, CBaseEntity@ pcaller, USE_TYPE usetype, float flValue)
{



                   int GET_SPACE_FOR_SPAWN_ENEMIES = CURRENT_ENEMIES_ACTIVE + 6;

                   bool ALLOW_SPAWN1 = true;
                   bool ALLOW_SPAWN2 = true;
                   bool ALLOW_SPAWN3 = true;
                   bool ALLOW_SPAWN4 = true;
                   bool ALLOW_SPAWN5 = true;
                   bool ALLOW_SPAWN6 = true;





                if(GET_SPACE_FOR_SPAWN_ENEMIES <= CURRENT_MAX_ENEMIES_ACTIVE)
                   {

                          if(CURRENT_ENEMIES_QUOTA > 8)
                          {

                                    ALLOW_SPAWN1 = true;
                                    ALLOW_SPAWN2 = true;
                                    ALLOW_SPAWN3 = true;
                                    ALLOW_SPAWN4 = true;
                                    ALLOW_SPAWN5 = true;
                                    ALLOW_SPAWN6 = true;

                          }
                            else
                          {
                                    if(CURRENT_ENEMIES_QUOTA > 0)
                                      {
                                           ALLOW_SPAWN1 = true;
                                           ALLOW_SPAWN2 = false;
                                           ALLOW_SPAWN3 = false;
                                           ALLOW_SPAWN4 = false;
                                           ALLOW_SPAWN5 = false;
                                           ALLOW_SPAWN6 = false;


                                       }
                                      else
                                       {
                                           ALLOW_SPAWN1 = false;
                                           ALLOW_SPAWN2 = false;
                                           ALLOW_SPAWN3 = false;
                                           ALLOW_SPAWN4 = false;
                                           ALLOW_SPAWN5 = false;
                                           ALLOW_SPAWN6 = false;


                                       }


                          }  

                   }
                   else
                   {

                          if(CURRENT_ENEMIES_QUOTA < 8)
                          {
                                     if(CURRENT_ENEMIES_QUOTA <= 0)
                                        {
                                           ALLOW_SPAWN1 = false;
                                           ALLOW_SPAWN2 = false;
                                           ALLOW_SPAWN3 = false;
                                           ALLOW_SPAWN4 = false;
                                           ALLOW_SPAWN5 = false;
                                           ALLOW_SPAWN6 = false;

                                        }
                                        else
                                        {
                                           ALLOW_SPAWN2 = true;
                                           ALLOW_SPAWN2 = false;
                                           ALLOW_SPAWN3 = false;
                                           ALLOW_SPAWN4 = false;
                                           ALLOW_SPAWN5 = false;
                                           ALLOW_SPAWN6 = false;
                                        }

                          }

                          else
                          {
                               ALLOW_SPAWN1 = false;
                               ALLOW_SPAWN2 = false;
                               ALLOW_SPAWN3 = false;
                               ALLOW_SPAWN4 = false;
                               ALLOW_SPAWN5 = false;
                               ALLOW_SPAWN6 = false;
                          }
                   }



                    if(IS_BOSS_WAVE)
                    {
                             int BOSS_GET_SPACE_FOR_SPAWN_ENEMIES = CURRENT_ENEMIES_ACTIVE + 2;
                             

                             if(BOSS_GET_SPACE_FOR_SPAWN_ENEMIES <= CURRENT_MAX_ENEMIES_ACTIVE)
                                {

                               ALLOW_SPAWN1 = true;
                               ALLOW_SPAWN2 = true;
                               ALLOW_SPAWN3 = false;
                               ALLOW_SPAWN4 = false;
                               ALLOW_SPAWN5 = false;
                               ALLOW_SPAWN6 = false;

                                 }
                               else
                                {

                               ALLOW_SPAWN1 = false;
                               ALLOW_SPAWN2 = false;
                               ALLOW_SPAWN3 = false;
                               ALLOW_SPAWN4 = false;
                               ALLOW_SPAWN5 = false;
                               ALLOW_SPAWN6 = false;


                           
                                }

                    }


                   CBaseEntity@ spawn_enemy1;
                   CBaseEntity@ spawn_enemy2;
                   CBaseEntity@ spawn_enemy3;
                   CBaseEntity@ spawn_enemy4;
                   CBaseEntity@ spawn_enemy5;
                   CBaseEntity@ spawn_enemy6;

                   CBaseEntity@ location_enemy1;
                   CBaseEntity@ location_enemy2;
                   CBaseEntity@ location_enemy3;
                   CBaseEntity@ location_enemy4;
                   CBaseEntity@ location_enemy5;
                   CBaseEntity@ location_enemy6;



                   CBaseEntity@ map_command;

                  int squad_enemy_random_location = Math.RandomLong( 1, 12 );
                  string SQUAD_ENEMY_SPAWN_LOCATION = "enemyspawn" + squad_enemy_random_location;



                  ////int RANDOM_ENEMY1 = Math.RandomLong( 0, list_enemy_human.length() - 1 );

                  MAX_ROLL_SQUAD = max_roll_squad_per_wave[CURRENT_WAVE -1];

                  int RANDOM_SQUAD = Math.RandomLong( 0, MAX_ROLL_SQUAD);

                  array<int>@ CHOSEN_SQUAD = list_squad_enemies[RANDOM_SQUAD];

                  int CHOSEN_ENEMY_MEMBER1 = CHOSEN_SQUAD[0];
                  int CHOSEN_ENEMY_MEMBER2 = CHOSEN_SQUAD[1];
                  int CHOSEN_ENEMY_MEMBER3 = CHOSEN_SQUAD[2];
                  int CHOSEN_ENEMY_MEMBER4 = CHOSEN_SQUAD[3];
                  int CHOSEN_ENEMY_MEMBER5 = CHOSEN_SQUAD[4];
                  int CHOSEN_ENEMY_MEMBER6 = CHOSEN_SQUAD[5];




                  array<string>@ CHOSEN_ENEMY1 = list_enemies[CHOSEN_ENEMY_MEMBER1];

                  string ENEMYCLASS1 = CHOSEN_ENEMY1[0];
                  string ENEMYNAME1 = CHOSEN_ENEMY1[1];
                  string ENEMYMODEL1 = CHOSEN_ENEMY1[2];
                  string ENEMYSOUND1 = CHOSEN_ENEMY1[3];
                  string ENEMYIFALLY1 = CHOSEN_ENEMY1[4];
                  string ENEMYHEALTH1 = CHOSEN_ENEMY1[5];
                  float ENEMYHEALTH_TO_INT1 = atoi(ENEMYHEALTH1);
                  int ENEMYHEALTH_CALCULATED1 = (ENEMYHEALTH_TO_INT1 * CURRENT_HP_MULTIPIER);
                  string ENEMYBLOOD1 = CHOSEN_ENEMY1[6];
                  string ENEMYWEAPON1 = CHOSEN_ENEMY1[7];
                  int RANDOM_MONSTER_YAW1 = Math.RandomLong(0, 350);
        
                  @location_enemy1 = g_EntityFuncs.FindEntityByTargetname(location_enemy1, SQUAD_ENEMY_SPAWN_LOCATION + "_1");

                  dictionary keys1;
                  Vector origin1;
                  origin1 = location_enemy1.pev.origin;

                  keys1["origin"] = "" + origin1.x + " " + origin1.y + " " + origin1.z;
                  keys1["angles"] = string("0 " + RANDOM_MONSTER_YAW1 + " 0");
                  keys1["model"] = string(ENEMYMODEL1);
                  keys1["weapons"] = string(ENEMYWEAPON1);
                  keys1["displayname"] = string(ENEMYNAME1);
                  keys1["is_player_ally"] =  string(ENEMYIFALLY1);
                  keys1["classify"]  =  string("4");
                  keys1["bloodcolor"] = string(ENEMYBLOOD1);
                  keys1["health"] = string(ENEMYHEALTH_CALCULATED1);
                  keys1["soundlist"] = string(ENEMYSOUND1);
                  keys1["TriggerCondition"] = string("4");
                  keys1["TriggerTarget"] = string("sc_cut_active_enemy");



                  if(ALLOW_SPAWN1)
                  {
                  @spawn_enemy1 = g_EntityFuncs.CreateEntity(ENEMYCLASS1, keys1, true);

                  CURRENT_ENEMIES_ACTIVE += 1;

                  CURRENT_ENEMIES_QUOTA -= 1;


                  }



                  array<string>@ CHOSEN_ENEMY2 = list_enemies[CHOSEN_ENEMY_MEMBER2];

                  string ENEMYCLASS2 = CHOSEN_ENEMY2[0];
                  string ENEMYNAME2 = CHOSEN_ENEMY2[1];
                  string ENEMYMODEL2 = CHOSEN_ENEMY2[2];
                  string ENEMYSOUND2 = CHOSEN_ENEMY2[3];
                  string ENEMYIFALLY2 = CHOSEN_ENEMY2[4];
                  string ENEMYHEALTH2 = CHOSEN_ENEMY2[5];
                  float ENEMYHEALTH_TO_INT2 = atoi(ENEMYHEALTH2);
                  int ENEMYHEALTH_CALCULATED2 = (ENEMYHEALTH_TO_INT2 * CURRENT_HP_MULTIPIER);
                  string ENEMYBLOOD2 = CHOSEN_ENEMY2[6];
                  string ENEMYWEAPON2 = CHOSEN_ENEMY2[7];
                  int RANDOM_MONSTER_YAW2 = Math.RandomLong(0, 350);
        
                  @location_enemy2 = g_EntityFuncs.FindEntityByTargetname(location_enemy2, SQUAD_ENEMY_SPAWN_LOCATION + "_2");

                  dictionary keys2;
                  Vector origin2;
                  origin2 = location_enemy2.pev.origin;

                  keys2["origin"] = "" + origin2.x + " " + origin2.y + " " + origin2.z;
                  keys2["angles"] = string("0 " + RANDOM_MONSTER_YAW2 + " 0");
                  keys2["model"] = string(ENEMYMODEL2);
                  keys2["weapons"] = string(ENEMYWEAPON2);
                  keys2["displayname"] = string(ENEMYNAME2);
                  keys2["is_player_ally"] =  string(ENEMYIFALLY2);
                  keys2["classify"]  =  string("4");
                  keys2["bloodcolor"] = string(ENEMYBLOOD2);
                  keys2["health"] = string(ENEMYHEALTH_CALCULATED2);
                  keys2["soundlist"] = string(ENEMYSOUND2);
                  keys2["TriggerCondition"] = string("4");
                  keys2["TriggerTarget"] = string("sc_cut_active_enemy");




                  if(ALLOW_SPAWN2)
                  {
                  @spawn_enemy2 = g_EntityFuncs.CreateEntity(ENEMYCLASS2, keys2, true);
                   

                   CURRENT_ENEMIES_ACTIVE += 1;

                   CURRENT_ENEMIES_QUOTA -= 1;
                  }
 

                  array<string>@ CHOSEN_ENEMY3 = list_enemies[CHOSEN_ENEMY_MEMBER3];

                  string ENEMYCLASS3 = CHOSEN_ENEMY3[0];
                  string ENEMYNAME3 = CHOSEN_ENEMY3[1];
                  string ENEMYMODEL3 = CHOSEN_ENEMY3[2];
                  string ENEMYSOUND3 = CHOSEN_ENEMY3[3];
                  string ENEMYIFALLY3 = CHOSEN_ENEMY3[4];
                  string ENEMYHEALTH3 = CHOSEN_ENEMY3[5];
                  float ENEMYHEALTH_TO_INT3 = atoi(ENEMYHEALTH3);
                  int ENEMYHEALTH_CALCULATED3 = (ENEMYHEALTH_TO_INT3 * CURRENT_HP_MULTIPIER);
                  string ENEMYBLOOD3 = CHOSEN_ENEMY3[6];
                  string ENEMYWEAPON3 = CHOSEN_ENEMY3[7];
                  int RANDOM_MONSTER_YAW3 = Math.RandomLong(0, 350);
        
                  @location_enemy3 = g_EntityFuncs.FindEntityByTargetname(location_enemy3, SQUAD_ENEMY_SPAWN_LOCATION + "_3");

                  dictionary keys3;
                  Vector origin3;
                  origin3 = location_enemy3.pev.origin;

                  keys3["origin"] = "" + origin3.x + " " + origin3.y + " " + origin3.z;
                  keys3["angles"] = string("0 " + RANDOM_MONSTER_YAW3 + " 0");
                  keys3["model"] = string(ENEMYMODEL3);
                  keys3["weapons"] = string(ENEMYWEAPON3);
                  keys3["displayname"] = string(ENEMYNAME3);
                  keys3["is_player_ally"] =  string(ENEMYIFALLY3);
                  keys3["classify"]  =  string("4");
                  keys3["bloodcolor"] = string(ENEMYBLOOD3);
                  keys3["health"] = string(ENEMYHEALTH_CALCULATED3);
                  keys3["soundlist"] = string(ENEMYSOUND3);
                  keys3["TriggerCondition"] = string("4");
                  keys3["TriggerTarget"] = string("sc_cut_active_enemy");



                  if(ALLOW_SPAWN3)
                  {

                  @spawn_enemy3 = g_EntityFuncs.CreateEntity(ENEMYCLASS3, keys3, true);

                  CURRENT_ENEMIES_ACTIVE += 1;

                  CURRENT_ENEMIES_QUOTA -= 1;
                  
                  }



                 array<string>@ CHOSEN_ENEMY4 = list_enemies[CHOSEN_ENEMY_MEMBER4];

                  string ENEMYCLASS4 = CHOSEN_ENEMY4[0];
                  string ENEMYNAME4 = CHOSEN_ENEMY4[1];
                  string ENEMYMODEL4 = CHOSEN_ENEMY4[2];
                  string ENEMYSOUND4 = CHOSEN_ENEMY4[3];
                  string ENEMYIFALLY4 = CHOSEN_ENEMY4[4];
                  string ENEMYHEALTH4 = CHOSEN_ENEMY4[5];
                  float ENEMYHEALTH_TO_INT4 = atoi(ENEMYHEALTH4);
                  int ENEMYHEALTH_CALCULATED4 = (ENEMYHEALTH_TO_INT4 * CURRENT_HP_MULTIPIER);
                  string ENEMYBLOOD4 = CHOSEN_ENEMY4[6];
                  string ENEMYWEAPON4 = CHOSEN_ENEMY4[7];
                  int RANDOM_MONSTER_YAW4 = Math.RandomLong(0, 350);
        
                  @location_enemy4 = g_EntityFuncs.FindEntityByTargetname(location_enemy4, SQUAD_ENEMY_SPAWN_LOCATION + "_4");

                  dictionary keys4;
                  Vector origin4;
                  origin4 = location_enemy4.pev.origin;

                  keys4["origin"] = "" + origin4.x + " " + origin4.y + " " + origin4.z;
                  keys4["angles"] = string("0 " + RANDOM_MONSTER_YAW4 + " 0");
                  keys4["model"] = string(ENEMYMODEL4);
                  keys4["weapons"] = string(ENEMYWEAPON4);
                  keys4["displayname"] = string(ENEMYNAME4);
                  keys4["is_player_ally"] =  string(ENEMYIFALLY4);
                  keys4["classify"]  =  string("4");
                  keys4["bloodcolor"] = string(ENEMYBLOOD4);
                  keys4["health"] = string(ENEMYHEALTH_CALCULATED4);
                  keys4["soundlist"] = string(ENEMYSOUND4);
                  keys4["TriggerCondition"] = string("4");
                  keys4["TriggerTarget"] = string("sc_cut_active_enemy");



                   if(ALLOW_SPAWN4)
                  {

                  @spawn_enemy4 = g_EntityFuncs.CreateEntity(ENEMYCLASS4, keys4, true);

                  CURRENT_ENEMIES_ACTIVE += 1;

                  CURRENT_ENEMIES_QUOTA -= 1;

                  }


                  array<string>@ CHOSEN_ENEMY5 = list_enemies[CHOSEN_ENEMY_MEMBER5];

                  string ENEMYCLASS5 = CHOSEN_ENEMY5[0];
                  string ENEMYNAME5 = CHOSEN_ENEMY5[1];
                  string ENEMYMODEL5 = CHOSEN_ENEMY5[2];
                  string ENEMYSOUND5 = CHOSEN_ENEMY5[3];
                  string ENEMYIFALLY5 = CHOSEN_ENEMY5[4];
                  string ENEMYHEALTH5 = CHOSEN_ENEMY5[5];
                  float ENEMYHEALTH_TO_INT5 = atoi(ENEMYHEALTH5);
                  int ENEMYHEALTH_CALCULATED5 = (ENEMYHEALTH_TO_INT5 * CURRENT_HP_MULTIPIER);
                  string ENEMYBLOOD5 = CHOSEN_ENEMY5[6];
                  string ENEMYWEAPON5 = CHOSEN_ENEMY5[7];
                  int RANDOM_MONSTER_YAW5 = Math.RandomLong(0, 350);
        
                  @location_enemy5 = g_EntityFuncs.FindEntityByTargetname(location_enemy5, SQUAD_ENEMY_SPAWN_LOCATION + "_5");

                  dictionary keys5;
                  Vector origin5;
                  origin5 = location_enemy5.pev.origin;

                  keys5["origin"] = "" + origin5.x + " " + origin5.y + " " + origin5.z;
                  keys5["angles"] = string("0 " + RANDOM_MONSTER_YAW5 + " 0");
                  keys5["model"] = string(ENEMYMODEL5);
                  keys5["weapons"] = string(ENEMYWEAPON5);
                  keys5["displayname"] = string(ENEMYNAME5);
                  keys5["is_player_ally"] =  string(ENEMYIFALLY5);
                  keys5["classify"]  =  string("4");
                  keys5["bloodcolor"] = string(ENEMYBLOOD5);
                  keys5["health"] = string(ENEMYHEALTH_CALCULATED5);
                  keys5["soundlist"] = string(ENEMYSOUND5);
                  keys5["TriggerCondition"] = string("4");
                  keys5["TriggerTarget"] = string("sc_cut_active_enemy");



                   if(ALLOW_SPAWN5)
                  {

                  @spawn_enemy5 = g_EntityFuncs.CreateEntity(ENEMYCLASS5, keys5, true);

                  CURRENT_ENEMIES_ACTIVE += 1;

                  CURRENT_ENEMIES_QUOTA -= 1;

                  }

                 array<string>@ CHOSEN_ENEMY6 = list_enemies[CHOSEN_ENEMY_MEMBER6];

                  string ENEMYCLASS6 = CHOSEN_ENEMY6[0];
                  string ENEMYNAME6 = CHOSEN_ENEMY6[1];
                  string ENEMYMODEL6 = CHOSEN_ENEMY6[2];
                  string ENEMYSOUND6 = CHOSEN_ENEMY6[3];
                  string ENEMYIFALLY6 = CHOSEN_ENEMY6[4];
                  string ENEMYHEALTH6 = CHOSEN_ENEMY6[5];
                  float ENEMYHEALTH_TO_INT6 = atoi(ENEMYHEALTH6);
                  int ENEMYHEALTH_CALCULATED6 = (ENEMYHEALTH_TO_INT6 * CURRENT_HP_MULTIPIER);
                  string ENEMYBLOOD6 = CHOSEN_ENEMY6[6];
                  string ENEMYWEAPON6 = CHOSEN_ENEMY6[7];
                  int RANDOM_MONSTER_YAW6 = Math.RandomLong(0, 350);
        
                  @location_enemy6 = g_EntityFuncs.FindEntityByTargetname(location_enemy6, SQUAD_ENEMY_SPAWN_LOCATION + "_6");

                  dictionary keys6;
                  Vector origin6;
                  origin6 = location_enemy6.pev.origin;

                  keys6["origin"] = "" + origin6.x + " " + origin6.y + " " + origin6.z;
                  keys6["angles"] = string("0 " + RANDOM_MONSTER_YAW6 + " 0");
                  keys6["model"] = string(ENEMYMODEL6);
                  keys6["weapons"] = string(ENEMYWEAPON6);
                  keys6["displayname"] = string(ENEMYNAME6);
                  keys6["is_player_ally"] =  string(ENEMYIFALLY6);
                  keys6["classify"]  =  string("4");
                  keys6["bloodcolor"] = string(ENEMYBLOOD6);
                  keys6["health"] = string(ENEMYHEALTH_CALCULATED6);
                  keys6["soundlist"] = string(ENEMYSOUND6);
                  keys6["TriggerCondition"] = string("4");
                  keys6["TriggerTarget"] = string("sc_cut_active_enemy");





                  if(ALLOW_SPAWN6)
                  {

                  @spawn_enemy6 = g_EntityFuncs.CreateEntity(ENEMYCLASS6, keys6, true);

                  CURRENT_ENEMIES_ACTIVE += 1;

                  CURRENT_ENEMIES_QUOTA -= 1;

                  }








                  string TEST_MSG = string(CURRENT_ENEMIES_ACTIVE) + " / " + string(CURRENT_MAX_ENEMIES_ACTIVE) + " qouta " + string(CURRENT_ENEMIES_QUOTA);
                  ////g_PlayerFuncs.ShowMessageAll(TEST_MSG);

}












void test_calculate()
{


         ////////monster hp per players

         int GET_NUMBER_OF_PLAYER = g_PlayerFuncs.GetNumPlayers();
         float CALCULATED_PLAYER_FOR_HP_MULT = (GET_NUMBER_OF_PLAYER * HP_MULTIPIER_PER_PLAYERS);
         CURRENT_HP_MULTIPIER = BASE_HP_MULTIPIER + CALCULATED_PLAYER_FOR_HP_MULT;

        array<string>@ CHOSEN_ENEMY = list_enemies[0];
        string ENEMY_HP = CHOSEN_ENEMY[5];
        float ENEMY_HP_CONVERT = atof(ENEMY_HP);
        float ENEMY_HP_CALCULATED_PER_PLAYER = (ENEMY_HP_CONVERT * CURRENT_HP_MULTIPIER);



        /////////total monsters in wave per player


        int CHOSEN_WAVE_TOTAL_MONSTER = total_enemies_per_wave[CURRENT_WAVE -1];
        int CALCULATED_PLAYER_AFFECT_TOTAL_ENEMY = (GET_NUMBER_OF_PLAYER * TOTAL_ENEMIES_PER_PLAYERS);
        int CALCULATED_TOTAL_MONSTER_IN_WAVE = (CHOSEN_WAVE_TOTAL_MONSTER + CALCULATED_PLAYER_AFFECT_TOTAL_ENEMY);



        ////////total max enemy active per player

        int CALCULATED_PLAYER_AFFECT_MAX_ACTIVE = (GET_NUMBER_OF_PLAYER * MAX_ENEMIES_ACTIVE_PER_PLAYERS);
        int NEW_MAX_ENEMY_ACTIVE = (MAX_ENEMIES_ACTIVE + CALCULATED_PLAYER_AFFECT_MAX_ACTIVE);


        ////g_PlayerFuncs.ShowMessageAll(NEW_MAX_ENEMY_ACTIVE);

}



void event_wave_apply(CBaseEntity@ activator, CBaseEntity@ pcaller, USE_TYPE usetype, float flValue)
{

         CURRENT_WAVE += 1;

         MAX_ROLL_SQUAD = max_roll_squad_per_wave[CURRENT_WAVE -1];

          int GET_NUMBER_OF_PLAYER = g_PlayerFuncs.GetNumPlayers();

          float CALCULATED_PLAYER_FOR_HP_MULT = (GET_NUMBER_OF_PLAYER * HP_MULTIPIER_PER_PLAYERS);
          CURRENT_HP_MULTIPIER = BASE_HP_MULTIPIER + CALCULATED_PLAYER_FOR_HP_MULT;
        
          int CHOSEN_WAVE_TOTAL_MONSTER = total_enemies_per_wave[CURRENT_WAVE -1];
          float CALCULATED_PLAYER_AFFECT_TOTAL_ENEMY = ((GET_NUMBER_OF_PLAYER * TOTAL_ENEMIES_PER_PLAYERS) + 1.0);
          CURRENT_TOTAL_ENEMIES = (CHOSEN_WAVE_TOTAL_MONSTER * CALCULATED_PLAYER_AFFECT_TOTAL_ENEMY);
          CURRENT_ENEMIES_QUOTA = CURRENT_TOTAL_ENEMIES;



          int CALCULATED_PLAYER_AFFECT_MAX_ACTIVE = (GET_NUMBER_OF_PLAYER * MAX_ENEMIES_ACTIVE_PER_PLAYERS);
          CURRENT_MAX_ENEMIES_ACTIVE = (MAX_ENEMIES_ACTIVE + CALCULATED_PLAYER_AFFECT_MAX_ACTIVE); 


          float CALCULATED_DMG_TAKEN = ((GET_NUMBER_OF_PLAYER * DMG_TAKEN_INCREASE_PER_PLAYER) + BASE_DMG_TAKEN);
          if(CALCULATED_DMG_TAKEN > MAX_DMG_TAKEN)
            {
              CALCULATED_DMG_TAKEN = MAX_DMG_TAKEN;
            }
          CURRENT_DMG_TAKEN = CALCULATED_DMG_TAKEN;


          g_EngineFuncs.CVarSetFloat("sk_player_head", CURRENT_DMG_TAKEN);
          g_EngineFuncs.CVarSetFloat("sk_player_chest", CURRENT_DMG_TAKEN);
          g_EngineFuncs.CVarSetFloat("sk_player_stomach", CURRENT_DMG_TAKEN);
          g_EngineFuncs.CVarSetFloat("sk_player_arm", CURRENT_DMG_TAKEN);
          g_EngineFuncs.CVarSetFloat("sk_player_leg", CURRENT_DMG_TAKEN);


          if(CURRENT_WAVE == 8)
            {

               IS_BOSS_WAVE = true;

               CURRENT_MAX_ENEMIES_ACTIVE = (CURRENT_MAX_ENEMIES_ACTIVE / 2);
 
            }

         






          /////g_PlayerFuncs.ShowMessageAll(CURRENT_DMG_TAKEN);


}



void event_cut_active_enemy(CBaseEntity@ activator, CBaseEntity@ pcaller, USE_TYPE usetype, float flValue)
{

           CURRENT_ENEMIES_ACTIVE -= 1;
           CURRENT_TOTAL_ENEMIES  -= 1;


           if(CURRENT_TOTAL_ENEMIES <= 0)
             {

                    event_break_time();

             }

}


void event_break_time()
{

           ALLOW_DISPLAY_TEATIME = true;

           CURRENT_BREAK_TIME = MAX_BREAK_TIME;

           CBaseEntity@ mapcommand = null;
           @mapcommand = g_EntityFuncs.FindEntityByTargetname(mapcommand, "targ_map_command");

           g_EntityFuncs.FireTargets("sound_breaktime", mapcommand, mapcommand, USE_SET);
           g_EntityFuncs.FireTargets("for_res", mapcommand, mapcommand, USE_SET, 0.0,1.0);
           g_EntityFuncs.FireTargets("timer_spawn_squad", mapcommand, mapcommand, USE_OFF);
           g_EntityFuncs.FireTargets("mm_stop_all_musics", mapcommand, mapcommand, USE_SET);

           if(ENABLE_BUYING_ROOM)
           {
           g_EntityFuncs.FireTargets("door_shop", mapcommand, mapcommand, USE_SET);
           }

           g_EntityFuncs.FireTargets("music_teatime", mapcommand, mapcommand, USE_ON);
           g_EntityFuncs.FireTargets("trig_tele_shop", mapcommand, mapcommand, USE_OFF);

}

void tick_display_wave()
{

                  FORMAT_TEXT_INTERVAL.x = 0.025;
	          FORMAT_TEXT_INTERVAL.y = 0.05;
	          FORMAT_TEXT_INTERVAL.channel = 2;
	          FORMAT_TEXT_INTERVAL.fadeinTime = 0;
	          FORMAT_TEXT_INTERVAL.r1 = 255;
	          FORMAT_TEXT_INTERVAL.g1 = 255;
	          FORMAT_TEXT_INTERVAL.b1 = 255;
	          FORMAT_TEXT_INTERVAL.a1 = 200;
	          FORMAT_TEXT_INTERVAL.holdTime = 2;



                  FORMAT_TEXT_TEATIME_INTERVAL.x = -1;
	          FORMAT_TEXT_TEATIME_INTERVAL.y = 0.25;
	          FORMAT_TEXT_TEATIME_INTERVAL.channel = 3;
	         FORMAT_TEXT_TEATIME_INTERVAL.fadeinTime = 0;
	         FORMAT_TEXT_TEATIME_INTERVAL.r1 = 255;
	          FORMAT_TEXT_TEATIME_INTERVAL.g1 = 255;
	          FORMAT_TEXT_TEATIME_INTERVAL.b1 = 255;
	          FORMAT_TEXT_TEATIME_INTERVAL.a1 = 200;
	          FORMAT_TEXT_TEATIME_INTERVAL.holdTime = 2;





                  if(IS_BOSS_WAVE)
                  {
               
                  g_PlayerFuncs.HudMessageAll(FORMAT_TEXT_INTERVAL, "Wave: " + CURRENT_WAVE + "/" + MAX_WAVE + "\n" + "Enemy Remain :" + "Boss");

                  }
                  else
                  {

                  g_PlayerFuncs.HudMessageAll(FORMAT_TEXT_INTERVAL, "Wave: " + CURRENT_WAVE + "/" + MAX_WAVE + "\n" + "Enemy Remain :" + CURRENT_TOTAL_ENEMIES);

                  }


                if(ALLOW_DISPLAY_TEATIME)
                  {

                        CURRENT_BREAK_TIME -= 1;

                        g_PlayerFuncs.HudMessageAll(FORMAT_TEXT_TEATIME_INTERVAL, "Next Wave Start In:" + "\n" + CURRENT_BREAK_TIME + "s");


                        if(CURRENT_BREAK_TIME <= 0)
                          {
                                 ALLOW_DISPLAY_TEATIME = false;
                                 CBaseEntity@ mapcommand = null;
                                 @mapcommand = g_EntityFuncs.FindEntityByTargetname(mapcommand, "targ_map_command");

                                 string GET_NEXT_WAVE = mm_start_wave[CURRENT_WAVE];

                                  g_EntityFuncs.FireTargets(GET_NEXT_WAVE, mapcommand, mapcommand, USE_SET);
                                  g_EntityFuncs.FireTargets("for_res_no_tele", mapcommand, mapcommand, USE_SET, 0.0,1.0);

                                  if(ENABLE_BUYING_ROOM)
                                  {
                                  g_EntityFuncs.FireTargets("door_shop", mapcommand, mapcommand, USE_SET);
                                  }

                                  g_EntityFuncs.FireTargets("music_teatime", mapcommand, mapcommand, USE_OFF);
                                  g_EntityFuncs.FireTargets("trig_tele_shop", mapcommand, mapcommand, USE_ON);

                          }

                  }



}




void event_manual_wave(CBaseEntity@ activator, CBaseEntity@ pcaller, USE_TYPE usetype, float flValue)
{

            CBaseEntity@ mapcommand = null;
            @mapcommand = g_EntityFuncs.FindEntityByTargetname(mapcommand, "targ_map_command");

            string GET_NEXT_WAVE = mm_start_wave[CURRENT_WAVE];

            g_EntityFuncs.FireTargets(GET_NEXT_WAVE, mapcommand, mapcommand, USE_SET);





}




void event_spawn_boss(CBaseEntity@ activator, CBaseEntity@ pcaller, USE_TYPE usetype, float flValue)
{



                   CBaseEntity@ spawn_boss;

                   CBaseEntity@ location_boss;


                  int boss_random_location = Math.RandomLong( 1, 12 );
                  string BOSS_SPAWN_LOCATION = "enemyspawn" + boss_random_location;

                  int RANDOM_BOSS = Math.RandomLong( 0, 4);


                  array<string>@ CHOSEN_ENEMY1 = list_bosses[RANDOM_BOSS];

                  string ENEMYCLASS1 = CHOSEN_ENEMY1[0];
                  string ENEMYNAME1 = CHOSEN_ENEMY1[1];
                  string ENEMYMODEL1 = CHOSEN_ENEMY1[2];
                  string ENEMYSOUND1 = CHOSEN_ENEMY1[3];
                  string ENEMYIFALLY1 = CHOSEN_ENEMY1[4];
                  string ENEMYHEALTH1 = CHOSEN_ENEMY1[5];
                  float ENEMYHEALTH_TO_INT1 = atoi(ENEMYHEALTH1);
                  int ENEMYHEALTH_CALCULATED1 = (ENEMYHEALTH_TO_INT1 * CURRENT_HP_MULTIPIER);
                  string ENEMYBLOOD1 = CHOSEN_ENEMY1[6];
                  string ENEMYWEAPON1 = CHOSEN_ENEMY1[7];
                  int RANDOM_MONSTER_YAW1 = Math.RandomLong(0, 350);


                  

                  @location_boss = g_EntityFuncs.FindEntityByTargetname(location_boss, BOSS_SPAWN_LOCATION + "_1");


                  if(ENEMYCLASS1 == "monster_apache")
                   {
                       BOSS_SPAWN_LOCATION = "helicopter_spawn";
                       @location_boss = g_EntityFuncs.FindEntityByTargetname(location_boss, BOSS_SPAWN_LOCATION);

                   }



                  dictionary keys1;
                  Vector origin1;
                  origin1 = location_boss.pev.origin;

                  keys1["origin"] = "" + origin1.x + " " + origin1.y + " " + origin1.z;
                  keys1["angles"] = string("0 " + RANDOM_MONSTER_YAW1 + " 0");
                  keys1["model"] = string(ENEMYMODEL1);
                  keys1["weapons"] = string(ENEMYWEAPON1);
                  keys1["displayname"] = string(ENEMYNAME1);
                  keys1["is_player_ally"] =  string(ENEMYIFALLY1);
                  keys1["classify"]  =  string("4");
                  keys1["bloodcolor"] = string(ENEMYBLOOD1);
                  keys1["health"] = string(ENEMYHEALTH_CALCULATED1);
                  keys1["soundlist"] = string(ENEMYSOUND1);
                  keys1["TriggerCondition"] = string("4");
                  keys1["TriggerTarget"] = string("mm_ending");
               
                  if(ENEMYCLASS1 == "monster_apache")
                   {
                      keys1["target"] = string("path_gunship1");
                   }

                  @spawn_boss = g_EntityFuncs.CreateEntity(ENEMYCLASS1, keys1, true);




                 CBaseEntity@ mapcommand = null;
                 @mapcommand = g_EntityFuncs.FindEntityByTargetname(mapcommand, "targ_map_command");




                 string BOSS_CAM_NAME = "cam_boss_" + string(boss_random_location);

                  if(ENEMYCLASS1 == "monster_apache")
                   {
                        BOSS_CAM_NAME = "cam_boss_heli";
                   }

                 g_EntityFuncs.FireTargets(BOSS_CAM_NAME, mapcommand, mapcommand, USE_SET);



               ////g_PlayerFuncs.ShowMessageAll(CURRENT_HP_MULTIPIER);



}








