//  SURVIVAL MODE   //

//------------------//

loadSurvivalMode()
{
	level.playerspawns = "";
	level.survSpawns = [];
	level.survSpawnsPriority = [];
	level.survSpawnsTotalPriority = 0;
	
}

beginSurvivalMode()
{
	level.survivalMode = spawnstruct();
	level.survivalMode.waveSystem = getSetting("surv_wave_system");
	level.survivalMode.waveZombiesPP = getSetting("surv_wave_zombiespp");
	level.survivalMode.waveZombiesPP_inc = getSetting("surv_wave_zombiespp_inc");
	level.survivalMode.waveZombiesPW = getSetting("surv_wave_zombiespw");
	level.survivalMode.waveZombiesPW_inc = getSetting("surv_wave_zombiespw_inc");
	level.survivalMode.waveZombiesHealth = getSetting("surv_wave_zombiehealth");
	level.survivalMode.waveZombiesHealth_inc = getSetting("surv_wave_zombiehealth_inc");
	level.survivalMode.waveZombiesHealthPP_inc = getSetting("surv_wave_zombiehealthpp_inc");
	level.survivalMode.wavePrepareTime = getSetting("surv_preparetime");
	level.survivalMode.waveSpawnTime = getSetting("surv_wave_spawnspeed"); 
	level.survivalMode.waveSpawnTimePW_dec = getSetting("surv_wave_spawnspeedpw_dec");
	level.survivalMode.waveSpawnTimePP_prc = getSetting("surv_wave_spawnspeedpp_prc");
	level.survivalMode.waveSpecialChance["dog"] = getSetting("surv_wave_dog_prc");
	level.survivalMode.waveSpecialChance["burning"] = getSetting("surv_wave_burning_prc");
	level.survivalMode.waveSpecialChance["toxic"] = getSetting("surv_wave_toxic_prc");
	level.survivalMode.waveNumber = 1;
	level.survivalMode.waveSize = 0;
	switch(level.gameMode)
	{
		case "waves_special":
			thread survSpecialWaves();
		break;
	}
}

survSpecialWaves()
{
	normalWaves = getSetting("surv_spc_waveinterval");
	specialWaves = getSetting("surv_spc_specialwaves");
	
	for (i=0; i<specialWaves; i++)
	{
		for (ii=0; ii<normalWaves; ii++)
		survRegularWave();
		
		survSpecialWave(getSpecial(i));
	}
}

getSpecial(index)
{
	i = index + 1;
	return getSetting("surv_spc_specialwave" + i);
}

loadWaveStats()
{
	switch (level.survivalMode.waveSystem)
	{
		case "pp":
			level.survivalMode.waveSize  = (level.survivalMode.waveZombiesPP + (level.survivalMode.waveNumber - 1) * level.survivalMode.waveZombiesPP_inc) * getPlayerCount();
		break;
		case "pppw":
			level.survivalMode.waveSize  = level.survivalMode.waveZombiesPW + (level.survivalMode.waveZombiesPP + (level.survivalMode.waveNumber - 1) * level.survivalMode.waveZombiesPP_inc) * getPlayerCount() + level.survivalMode.waveZombiesPW_inc * (level.survivalMode.waveNumber - 1);
		break;
		case "pw":
		default:
			level.survivalMode.waveSize  = level.survivalMode.waveZombiesPW + level.survivalMode.waveZombiesPW_inc * (level.survivalMode.waveNumber - 1);
		break;
	}
	
	level.survivalMode.spawnTime = (level.survivalMode.waveSpawnTime + level.survivalMode.waveSpawnTimePW_dec * (level.survivalMode.waveNumber - 1)) * power(level.survivalMode.waveSpawnTimePP_prc, getPlayerCount() - 1); 
	level.zombieHealth = level.survivalMode.waveZombiesHealth + level.survivalMode.waveZombiesHealth_inc * (level.survivalMode.waveNumber - 1) + level.survivalMode.waveZombiesHealthPP_inc * (getPlayerCount() - 1);
}

survRegularWave()
{
	if (level.survivalMode.wavePrepareTime > 0)
		survPrepare(level.survivalMode.wavePrepareTime);
	loadWaveStats();
	notifyMessage("Wave" + level.survivalMode.waveNumber + ":", level.survivalMode.waveSize + " zombies incomming!", (1,0,0));
	
	for (i=0; i<level.survivalMode.waveSize; i++)
	{
		survSpawnZombie();
		wait level.survivalMode.spawnTime;
	}
	
	while (level.botsAlive > 0)
	{
		level waittill("bot_killed");
	}
	
	level.survivalMode.waveNumber ++;
}

survSpecialWave(special)
{
}

survSpawnZombie()
{
	type = survRandomType();
	spawn = survRandomSpawn();
	while(!isdefined(maps\mp\gametypes\_bots::spawnZombie(type, spawn)))
	{ // We want to make sure it has spawned
		wait .5; 
	}
}

survRandomSpawn()
{
	random = randomint(level.survSpawnsTotalPriority);
	for (i=0; i<level.survSpawns.size; i++)
	{
		random = random - level.survSpawnsPriority[i];
		if (random < 0)
		{
			spawns = getentarray(level.survSpawns[i], "targetname");
			if (spawns.size > 0)
			return spawns[randomint(spawns.size)];
			else
			return undefined;
		}	
	}
}

survRandomType()
{
	type[0] = "dog";
	//type[1] = "burning";
	//type[2] = "toxic";
	
	total = 0;
	for (i=0; i<type.size; i++)
	total += level.survivalMode.waveSpecialChance[type[i]];
	
	random = randomfloat(1);
	
	if (random > total)
	return "zombie";
	else
	{
		for (i=0; i<type.size; i++)
		{
			random -= level.survivalMode.waveSpecialChance[type[i]];
			if (random <= 0)
			return type[i];
		}
	}
	return "error";
	
}

survPrepare( time )
{
	level endon ( "game_ended" );
	
	level.prepare_text = NewHudElem();
	level.prepare_text.font = "objective";
	level.prepare_text.fontScale = 1.6;
	level.prepare_text SetText("^4New wave in:");
	level.prepare_text.alignX = "center";
	level.prepare_text.alignY = "top";
	level.prepare_text.horzAlign = "center";
	level.prepare_text.vertAlign = "top";
	level.prepare_text.x = 0;
	level.prepare_text.y = 64;
	level.prepare_text.sort = -3; //-3
	level.prepare_text.alpha = 1;
	level.prepare_text setPulseFX( 100, int(2000 + time * 1000), 1000 );
	
	wait 2;
	
	level.prepare_count = NewHudElem(); //newClientHudElem();
	//level.start_countdown.elemType = "timer";
	level.prepare_count.font = "objective";
	level.prepare_count.fontScale = 1.6;
	level.prepare_count SetTimer(time);
	level.prepare_count.alignX = "center";
	level.prepare_count.alignY = "top";
	level.prepare_count.horzAlign = "center";
	level.prepare_count.vertAlign = "top";
	level.prepare_count.x = 0;
	level.prepare_count.y = 88;
	level.prepare_count.sort = -3; //-3
	level.prepare_count.alpha = 1;
	
	wait time;
	
	level.prepare_text destroy();
	level.prepare_count destroy();
}


monitorDifficulty()
{
	level.zom_deaths = 0;
	level.ratio = 1;
	
	
	if (level.dvar["zombie_dynamicdifficulty"])
	{
		while (1)
		{
			level.zom_deaths = 0;
			wait 5;
			if (level.zom_deaths == 0)
			continue;
			if (level.activePlayers == 0)
			continue;
			
			ratio = (level.zom_deaths/level.activePlayers)/level.pref_zom_deaths_pp;
			level.zomHPMod = level.zomHPMod * (1 + (ratio-1)/10);
			
			if (level.zomHPMod < 1/level.health_deviation)
			level.zomHPMod = 1/level.health_deviation;
			
			if (level.zomHPMod > level.health_deviation)
			level.zomHPMod = level.health_deviation;
			
			ratio = (level.botsAlive/level.activePlayers)/level.pref_zom_alive_pp;
			
			//level.spawn_rate = level.spawn_rate * (ratio);
			
			if (level.spawn_rate < .1)
			level.spawn_rate = .1;
			
			//iprintlnbold(level.zomHPMod);
			
		}
	}
}
