
class ZRandomSpawnerGame : RandomSpawner
{
	GlobalLevelHandler Event;

	override Name ChooseSpawn()
	{
		String sactor = self.GetClassName();
		int prob = d3d_enemyrandomprob;
		Event = GlobalLevelHandler(EventHandler.Find("GlobalLevelHandler"));
		if(Event) Event.InitRandomMapSettings(prob);

		if(d3d_enemyrandomtype==0) {
			if(random[RIDMAPPROB](1,256)>(256.0-(256.0*(prob/100.0)))) {
				sactor = "Doom" .. sactor;
			} else {
				sactor = "Duke" .. sactor;
			}
		} else if(d3d_enemyrandomtype==1) {
			if( Event && Event.LevelType==0 ) {
				sactor = "Doom" .. sactor;
			} else {
				sactor = "Duke" .. sactor;
			}
		} else if (d3d_enemyrandomtype==2) {
			if( Event && Event.SectorType[Level.pointInSector((self.pos.x, self.pos.y)).sectornum]==0 ) {
				sactor = "Doom" .. sactor;
			} else {
				sactor = "Duke" .. sactor;
			}
		} else if(d3d_enemyrandomtype==3) {
			if( Event && Event.MonsterCount()%2.0==0 ) {
				sactor = "Doom" .. sactor;
			} else {
				sactor = "Duke" .. sactor;
			}
		} else if(d3d_enemyrandomtype==4) {
			if( Level.levelnum%2.0==0 ) {
				sactor = "Doom" .. sactor;
			} else {
				sactor = "Duke" .. sactor;
			}
		} else if (d3d_enemyrandomtype==5) {
			if(Level.pointInSector((self.pos.x, self.pos.y)).sectornum%2.0==0 ) {
				sactor = "Doom" .. sactor;
			} else {
				sactor = "Duke" .. sactor;
			}
		} else {
			sactor = "Duke" .. sactor;
		}

		return sactor;
	}
}

class ZRandomSpawnerDukeNocheckPosition : RandomSpawner
{

	override Name ChooseSpawn()
	{
		bool chosen = false;
		Name sactor;

		while (!chosen)
		{
			sactor = super.ChooseSpawn();
			chosen = true;

			if (sactor == "Alien_Blue") {
				if(d3d_trooper64==1) chosen = false;
			}
		}

		return sactor;
	}

}

class ZRandomSpawnerDukeLight : RandomSpawner
{

	override Name ChooseSpawn()
	{
		bool chosen = false;
		Name sactor;

		while (!chosen)
		{
			sactor = super.ChooseSpawn();
			chosen = true;

			if (sactor == "AlienSniper") {
				if(d3d_aliensniper==1) chosen = false;
			}
			else if (sactor == "RobotLame") {
				if(d3d_robotlame==1) chosen = false;
			}
			else if (sactor == "DroneLame") {
				if(d3d_dronelame==1) chosen = false;
			}
			else if (sactor == "OctobrainLame") {
				if(d3d_octobrainlame==1) chosen = false;
			}
			else if (sactor == "OctobrainGreen") {
				if(d3d_octobraingreen==1) chosen = false;
			}
			else if (sactor == "KingCobra" || sactor == "GorillaCaptain") {
				if(d3d_nazireplace!=0) chosen = false;
			}
			else if (sactor == "TrooperLame2") {
				if(d3d_nazireplace!=1) chosen = false;
			}
			else if (sactor == "TrooperLame") {
				if(d3d_nazireplace!=2) chosen = false;
			}
			else if (sactor == "AMCNazi") {
				if(d3d_nazireplace!=3) chosen = false;
			}
		}

		return sactor;
	}

	override void PostSpawn(Actor spawned)
    	{
		Actor tempspawned = spawned;
		if ( !tempspawned.TestMobjLocation() ) {

			String aliens[6];
			aliens[0] = "Alien_Green";
			aliens[1] = "Alien_Red";
			aliens[2] = "PigCop";
			aliens[3] = "LizardGunner";
			aliens[4] = "Octobrain";
			aliens[5] = "FireflyTrooper";

			int sk = min(G_SkillPropertyInt(SKILLP_ACSReturn),3);
			int alien = max(random[RIDMONSTER](0,5)-(3-sk),0);

			spawned = Spawn(aliens[alien], tempspawned.pos);
			tempspawned.ClearCounters();
			tempspawned.Destroy();
		}

	        super.PostSpawn(spawned);
	}

}

class ZRandomSpawnerDukeMedium : RandomSpawner
{

	override Name ChooseSpawn()
	{
		bool chosen = false;
		Name sactor;

		while (!chosen)
		{
			sactor = super.ChooseSpawn();
			chosen = true;

			if (sactor == "RobotAlien") {
				if(d3d_robotalien==1) chosen = false;
			}
			else if (sactor == "CyberEnforcer") {
				if(d3d_cyberenforcer==1) chosen = false;
			}
			else if (sactor == "Dukinator") {
				if(d3d_dukinator==1) chosen = false;
			}
			else if (sactor == "Megabrain") {
				if(d3d_megabrain==1) chosen = false;
			}
			else if (sactor == "PigAssault") {
				if(d3d_pigassault==1) chosen = false;
			}
			else if (sactor == "PigBrute") {
				if(d3d_pigbrute==1) chosen = false;
			}
		}

		return sactor;
	}

	override void PostSpawn(Actor spawned)
    	{
		Actor tempspawned = spawned;
		if ( !tempspawned.TestMobjLocation() ) {

			String aliens[7];
			aliens[0] = "PigCop";
			aliens[1] = "LizardGunner";
			aliens[2] = "Octobrain";
			aliens[3] = "DukeAlien";
			aliens[4] = "NetherWorldQueen";
			aliens[5] = "FireflyTrooper";
			aliens[6] = "PigTank";

			int sk = min(G_SkillPropertyInt(SKILLP_ACSReturn),3);
			int alien = max(random[RIDMONSTER](3,6)-(3-sk),0);

			spawned = Spawn(aliens[alien], tempspawned.pos);
			tempspawned.ClearCounters();
			tempspawned.Destroy();
		}

	        super.PostSpawn(spawned);
	}

}

class ZRandomSpawnerDukeHeavy : RandomSpawner
{

	override void PostSpawn(Actor spawned)
    	{
		Actor tempspawned = spawned;
		if ( !tempspawned.TestMobjLocation() ) {

			String aliens[3];
			aliens[0] = "OverlordSentry";
			aliens[1] = "CycloidEmperorSentry";
			aliens[2] = "BattleLordSentry";

			int alien = random[RIDMONSTER](0,2);

			spawned = Spawn(aliens[alien], tempspawned.pos);
			tempspawned.ClearCounters();
			tempspawned.Destroy();
		}

	        super.PostSpawn(spawned);
	}

}

class ZRandomSpawnerDoomMedium : RandomSpawner
{

	override void PostSpawn(Actor spawned)
    	{
		Actor tempspawned = spawned;
		if ( !tempspawned.TestMobjLocation() ) {

			String aliens[4];
			aliens[0] = "ShotgunGuy";
			aliens[1] = "DoomImp";
			aliens[2] = "ChaingunGuy";
			aliens[3] = "Demon";

			int sk = min(G_SkillPropertyInt(SKILLP_ACSReturn),3);
			int alien = max(random[RIDMONSTER](1,3)-(3-sk),0);

			spawned = Spawn(aliens[alien], tempspawned.pos);
			tempspawned.ClearCounters();
			tempspawned.Destroy();
		}

	        super.PostSpawn(spawned);
	}

}

class ZRandomSpawnerBaseDecoration : RandomSpawner
{

	static const Name rsactors[] = 
	{
		"DukeBabeSpawner",
		"DukeBabeCapturedHangingSpawner",
		"DukeBabeCapturedLargeSpawner",
		"DukeBabeCapturedMediumSpawner",
		"DukeBabeCapturedSlimSpawner",
		"DukeBarrelSpawner",
		"DukeBarrelCanSpawner",
		"DukeBarrelJarSpawner",
		"DukeBarrelDamageSpawner",
		"DukeBarrelPotSpawner",
		"DukeCityRoadBlockSpawner",
		"DukeGoreSpawner",
		"DukeGoreHangingSpawner",
		"DukeLightBigSpawner",
		"DukeLightMediumSpawner",
		"DukeLightTechSpawner",
		"DukeLightCandleSpawner",
		"DukeLightHangingSpawner",
		"DukePillarSpawner",
		"DukeSpaceSatelliteSpawner",
		"DukeStatueSpawner",
		"DukeTreeSpawner",
		"DukeTreeFlowerPotSpawner"
	};

	static const String rsvars[] = 
	{
		"d3d_dbabe",
		"d3d_dbabecaptured",
		"d3d_dbabecaptured",
		"d3d_dbabecaptured",
		"d3d_dbabecaptured",
		"d3d_dbarrel",
		"d3d_dbarrel",
		"d3d_dbarrel",
		"d3d_dbarreldamage",
		"d3d_dbarrelpot",
		"d3d_droadblock",
		"d3d_dgorebody",
		"d3d_dgorebody",
		"d3d_dlight",
		"d3d_dlight",
		"d3d_dlight",
		"d3d_dlightsmall",
		"d3d_dlighthanging",
		"d3d_dpillar",
		"d3d_dsatellitedish",
		"d3d_dstatue",
		"d3d_dtree",
		"d3d_dflowerpot"
	};

	override Name ChooseSpawn()
	{
		bool spawndefault = true;
		CVar readsetting;
		Dropitem Sdropitem = self.GetDropItems();

		if (Sdropitem != null)
		{
			while (Sdropitem != null)
			{
				if (Sdropitem.Name != "None")
				{
					for (int i=0; i<rsactors.Size(); i++)
					{
						if (Sdropitem.Name == rsactors[i]) {
							readsetting = CVar.FindCVar(rsvars[i]);
							if(readsetting && readsetting.GetInt()==0 ) spawndefault = false;
						}
					}
				}
				Sdropitem = Sdropitem.Next;
			}
		}

		if (spawndefault) {
			String sactordefault = self.GetClassName();
			sactordefault.Replace("Spawner", "");
			sactordefault = sactordefault .. "D3D";

			return sactordefault;
		} else {
			bool chosen = false;
			Name sactor;

			while (!chosen)
			{
				sactor = super.ChooseSpawn();
				chosen = true;

				for (int i=0; i<rsactors.Size(); i++)
				{
					if (sactor == rsactors[i]) {
						readsetting = CVar.FindCVar(rsvars[i]);
						if(readsetting && readsetting.GetInt()==1 ) chosen = false;
					}
				}
			}

			return sactor;
		}
	}

}