#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;

init() //checked matches cerberus output
{
	game[ "zmbdialog" ] = [];
	game[ "zmbdialog" ][ "prefix" ] = "vox_zmba";
	createvox( "carpenter", "powerup_carpenter" );
	createvox( "insta_kill", "powerup_instakill" );
	createvox( "double_points", "powerup_doublepoints" );
	createvox( "nuke", "powerup_nuke" );
	createvox( "full_ammo", "powerup_maxammo" );
	createvox( "fire_sale", "powerup_firesale" );
	createvox( "minigun", "powerup_death_machine" );
	createvox( "zombie_blood", "powerup_zombie_blood" );
	createvox( "boxmove", "event_magicbox" );
	createvox( "dogstart", "event_dogstart" );
	thread init_gamemodespecificvox( getDvar( "ui_gametype" ), getDvar( "ui_zm_mapstartlocation" ) );
	level.allowzmbannouncer = 1;
}

init_gamemodespecificvox( mode, location ) //checked matches cerberus output
{
	switch( mode )
	{
		case "zmeat":
			init_meatvox( "meat" );
			break;
		case "zrace":
			init_racevox( "race", location );
			break;
		case "zgrief":
			init_griefvox( "grief" );
			break;
		case "zcleansed":
			init_cleansed( location );
			break;
		default:
			init_gamemodecommonvox();
			break;
	}
}

init_gamemodecommonvox( prefix ) //checked matches cerberus output
{
	createvox( "rules", "rules", prefix );
	createvox( "countdown", "intro", prefix );
	createvox( "side_switch", "side_switch", prefix );
	createvox( "round_win", "win_rd", prefix );
	createvox( "round_lose", "lose_rd", prefix );
	createvox( "round_tied", "tied_rd", prefix );
	createvox( "match_win", "win", prefix );
	createvox( "match_lose", "lose", prefix );
	createvox( "match_tied", "tied", prefix );
}

init_griefvox( prefix ) //checked matches cerberus output
{
	init_gamemodecommonvox( prefix );
	createvox( "1_player_down", "1rivdown", prefix );
	createvox( "2_player_down", "2rivdown", prefix );
	createvox( "3_player_down", "3rivdown", prefix );
	createvox( "4_player_down", "4rivdown", prefix );
	createvox( "grief_restarted", "restart", prefix );
	createvox( "grief_lost", "lose", prefix );
	createvox( "grief_won", "win", prefix );
	createvox( "1_player_left", "1rivup", prefix );
	createvox( "2_player_left", "2rivup", prefix );
	createvox( "3_player_left", "3rivup", prefix );
	createvox( "last_player", "solo", prefix );
}

init_cleansed( prefix ) //checked matches cerberus output
{
	init_gamemodecommonvox( prefix );
	createvox( "dr_start_single_0", "dr_start_0" );
	createvox( "dr_start_2", "dr_start_1" );
	createvox( "dr_start_3", "dr_start_2" );
	createvox( "dr_cure_found_line", "dr_cure_found" );
	createvox( "dr_monkey_killer", "dr_monkey_0" );
	createvox( "dr_monkey_killee", "dr_monkey_1" );
	createvox( "dr_human_killed", "dr_kill_plr" );
	createvox( "dr_human_killer", "dr_kill_plr_2" );
	createvox( "dr_survival", "dr_plr_survive_0" );
	createvox( "dr_zurvival", "dr_zmb_survive_2" );
	createvox( "dr_countdown0", "dr_plr_survive_1" );
	createvox( "dr_countdown1", "dr_plr_survive_2" );
	createvox( "dr_countdown2", "dr_plr_survive_3" );
	createvox( "dr_ending", "dr_time_0" );
}

init_meatvox( prefix ) //checked matches cerberus output
{
	init_gamemodecommonvox( prefix );
	createvox( "meat_drop", "drop", prefix );
	createvox( "meat_grab", "grab", prefix );
	createvox( "meat_grab_A", "team_cdc", prefix );
	createvox( "meat_grab_B", "team_cia", prefix );
	createvox( "meat_land", "land", prefix );
	createvox( "meat_hold", "hold", prefix );
	createvox( "meat_revive_1", "revive1", prefix );
	createvox( "meat_revive_2", "revive2", prefix );
	createvox( "meat_revive_3", "revive3", prefix );
	createvox( "meat_ring_splitter", "ring_tripple", prefix );
	createvox( "meat_ring_minigun", "ring_death", prefix );
	createvox( "meat_ring_ammo", "ring_ammo", prefix );
}

init_racevox( prefix, location ) //checked changed to match cerberus output
{
	init_gamemodecommonvox( prefix );
	switch( location )
	{
		case "tunnel":
			createvox( "rules", "rules_" + location, prefix );
			createvox( "countdown", "intro_" + location, prefix );
			break;
		case "power":
			createvox( "rules", "rules_" + location, prefix );
			createvox( "countdown", "intro_" + location, prefix );
			createvox( "lap1", "lap1", prefix );
			createvox( "lap2", "lap2", prefix );
			createvox( "lap_final", "lap_final", prefix );
			break;
		case "farm":
			createvox( "rules", "rules_" + location, prefix );
			createvox( "countdown", "intro_" + location, prefix );
			createvox( "hoop_area", "hoop_area", prefix );
			createvox( "hoop_miss", "hoop_miss", prefix );
			break;
		default:
			break;
		createvox( "race_room_2_ally", "room2_ally", prefix );
		createvox( "race_room_3_ally", "room3_ally", prefix );
		createvox( "race_room_4_ally", "room4_ally", prefix );
		createvox( "race_room_5_ally", "room5_ally", prefix );
		createvox( "race_room_2_axis", "room2_axis", prefix );
		createvox( "race_room_3_axis", "room3_axis", prefix );
		createvox( "race_room_4_axis", "room4_axis", prefix );
		createvox( "race_room_5_axis", "room5_axis", prefix );
		createvox( "race_ahead_1_ally", "ahead1_ally", prefix );
		createvox( "race_ahead_2_ally", "ahead2_ally", prefix );
		createvox( "race_ahead_3_ally", "ahead3_ally", prefix );
		createvox( "race_ahead_4_ally", "ahead4_ally", prefix );
		createvox( "race_ahead_1_axis", "ahead1_axis", prefix );
		createvox( "race_ahead_2_axis", "ahead2_axis", prefix );
		createvox( "race_ahead_3_axis", "ahead3_axis", prefix );
		createvox( "race_ahead_4_axis", "ahead4_axis", prefix );
		createvox( "race_kill_15", "door15", prefix );
		createvox( "race_kill_10", "door10", prefix );
		createvox( "race_kill_5", "door5", prefix );
		createvox( "race_kill_3", "door3", prefix );
		createvox( "race_kill_1", "door1", prefix );
		createvox( "race_door_open", "door_open", prefix );
		createvox( "race_door_nag", "door_nag", prefix );
		createvox( "race_grief_incoming", "grief_income_ammo", prefix );
		createvox( "race_grief_land", "grief_land", prefix );
		createvox( "race_laststand", "last_stand", prefix );
	}
}

createvox( type, alias, gametype ) //checked matches cerberus output
{
	if ( !isDefined( gametype ) )
	{
		gametype = "";
	}
	else
	{
		gametype += "_";
	}
	game[ "zmbdialog" ][ type ] = gametype + alias;
}

announceroundwinner( winner, delay ) //checked changed to match cerberus output
{
	if ( isDefined( delay ) && delay > 0 )
	{
		wait delay;
	}
	if ( !isDefined( winner ) || isplayer( winner ) )
	{
		return;
	}
	if ( winner != "tied" )
	{
		players = get_players();
		foreach ( player in players )
		{
			if ( isdefined( player._encounters_team ) && player._encounters_team == winner )
			{
				winning_team = player.pers[ "team" ];
				break;
			}
		}
		losing_team = getotherteam( winning_team );
		leaderdialog( "round_win", winning_team, undefined, 1 );
		leaderdialog( "round_lose", losing_team, undefined, 1 );
	}
	else
	{
		leaderdialog( "round_tied", undefined, undefined, 1 );
	}
}

announcematchwinner( winner, delay ) //checked changed to match cerberus output
{
	if ( isDefined( delay ) && delay > 0 )
	{
		wait delay;
	}
	if ( !isDefined( winner ) || isplayer( winner ) )
	{
		return;
	}
	if ( winner != "tied" )
	{
		players = get_players();
		foreach ( player in players )
		{
			if ( isdefined( player._encounters_team ) && player._encounters_team == winner )
			{
				winning_team = player.pers["team"];
				break;
			}
		}
		losing_team = getotherteam( winning_team );
		leaderdialog( "match_win", winning_team, undefined, 1 );
		leaderdialog( "match_lose", losing_team, undefined, 1 );
	}
	else
	{
		leaderdialog( "match_tied", undefined, undefined, 1 );
	}
}

announcegamemoderules() //checked matches cerberus output
{
	if ( getDvar( "ui_zm_mapstartlocation" ) == "town" )
	{
		leaderdialog( "rules", undefined, undefined, undefined, 20 );
	}
}

leaderdialog( dialog, team, group, queue, waittime ) //checked changed to match cerberus output
{
	if ( !isDefined( team ) )
	{
		leaderdialogbothteams( dialog, "allies", dialog, "axis", group, queue, waittime );
		return;
	}
	i = 0;
	for ( i = 0; i < level.players.size; i++ )
	{
		player = level.players[ i ];
		if ( isdefined ( player.pers[ "team" ] ) && player.pers[ "team" ] == team )
		{
			player leaderdialogonplayer( dialog, group, queue, waittime );
		}
	}
}

leaderdialogbothteams( dialog1, team1, dialog2, team2, group, queue, waittime ) //checked changed to match cerberus output
{
	players = get_players();
	for ( i = 0; i < players.size; i++ )
	{
		team = players[ i ].pers[ "team" ];
		if ( !isdefined( team ) )
		{
			return;
		}
		if ( team == team1 )
		{
			players[ i ] leaderdialogonplayer( dialog1, group, queue, waittime );
		}
		if ( team == team2 )
		{
			players[ i ] leaderdialogonplayer( dialog2, group, queue, waittime );
		}
	}
}

leaderdialogonplayer( dialog, group, queue, waittime ) //checked changed to match cerberus output
{
	team = self.pers[ "team" ];
	if ( !isDefined( team ) )
	{
		return;
	}
	if ( team != "allies" && team != "axis" )
	{
		return;
	}
	if ( isDefined( group ) )
	{
		if ( self.zmbdialoggroup == group )
		{
			return;
		}
		hadgroupdialog = isDefined( self.zmbdialoggroups[ group ] );
		self.zmbdialoggroups[ group ] = dialog;
		dialog = group;
		if ( isDefined( hadgroupdialog ) && hadgroupdialog )
		{
			return;
		}
	}
	if ( !is_true( self.zmbdialogactive ) )
	{
		self thread playleaderdialogonplayer( dialog, team, waittime );
	}
	else if ( is_true( queue ) )
	{
		self.zmbdialogqueue[ self.zmbdialogqueue.size ] = dialog;
	}
}

playleaderdialogonplayer( dialog, team, waittime ) //checked changed to match cerberus output
{
	self endon( "disconnect" );

	if ( level.allowzmbannouncer )
	{
		if ( !isDefined( game[ "zmbdialog" ][ dialog ] ) )
		{
			return;
		}
	}
	self.zmbdialogactive = 1;
	if ( isDefined( self.zmbdialoggroups[ dialog ] ) )
	{
		group = dialog;
		dialog = self.zmbdialoggroups[ group ];
		self.zmbdialoggroups[ group ] = undefined;
		self.zmbdialoggroup = group;
	}
	if ( level.allowzmbannouncer )
	{
		alias = game[ "zmbdialog" ][ "prefix" ] + "_" + game[ "zmbdialog" ][ dialog ];
		variant = self getleaderdialogvariant( alias );
		if ( !isDefined( variant ) )
		{
			full_alias = alias;
		}
		else
		{
			full_alias =  alias + "_" + variant;
		}
		self playlocalsound( full_alias );
	}
	if ( isDefined( waittime ) )
	{
		wait waittime;
	}
	else
	{
		wait 4;
	}
	self.zmbdialogactive = 0;
	self.zmbdialoggroup = "";
	if ( self.zmbdialogqueue.size > 0 && level.allowzmbannouncer )
	{
		nextdialog = self.zmbdialogqueue[0];
		for( i = 1; i < self.zmbdialogqueue.size; i++ )
		{
			self.zmbdialogqueue[ i - 1 ] = self.zmbdialogqueue[ i ];
		}
		self.zmbdialogqueue[ i - 1 ] = undefined;
		self thread playleaderdialogonplayer( nextdialog, team );
	}
}

getleaderdialogvariant( alias ) //checked changed to match cerberus output
{
	if ( !isDefined( alias ) )
	{
		return;
	}
	if ( !isDefined( level.announcer_dialog ) )
	{
		level.announcer_dialog = [];
		level.announcer_dialog_available = [];
	}
	num_variants = maps/mp/zombies/_zm_spawner::get_number_variants( alias );
	if ( num_variants <= 0 )
	{
		return undefined;
	}
	for ( i = 0; i < num_variants; i++ )
	{
		level.announcer_dialog[ alias ][ i ] = i;
	}
	level.announcer_dialog_available[ alias ] = [];
	if ( level.announcer_dialog_available[ alias ].size <= 0 )
	{
		level.announcer_dialog_available[ alias ] = level.announcer_dialog[ alias ];
	}
	variation = random( level.announcer_dialog_available[ alias ] );
	level.announcer_dialog_available[ alias ] = arrayremovevalue( level.announcer_dialog_available[ alias ], variation );
	return variation;
}

getroundswitchdialog( switchtype ) //checked matches cerberus output
{
	switch( switchtype )
	{
		case "halftime":
			return "halftime";
		case "overtime":
			return "overtime";
		default:
			return "side_switch";
	}
}

getotherteam( team ) //checked matches cerberus output
{
	if ( team == "allies" )
	{
		return "axis";
	}
	else
	{
		return "allies";
	}
}

