version "4.10"

Class PandFunTagService : Service
{
	override String GetString( String request, String stringarg, int intarg, double doublearg, object objectarg )
	{
		if ( request != "GetFunTag" ) return "";
		int ntags = 1;
		String basetag = "";
		switch ( objectarg.GetClassName() )
		{
		case 'PistolZombie':
			basetag = "ZOMBIE";
			break;
		case 'PlasmaPistolZombie':
			basetag = "PANDPISTOLZOMBIE";
			break;
		case 'LaserRifleZombie':
			basetag = "PANDLASERZOMBIE";
			break;
		case 'SpecOpsRifleman':
			basetag = "PANDSPECOPS";
			break;
		case 'NewShotgunGuy':
			basetag = "SHOTGUN";
			break;
		case 'SuperShotgunZombie':
			basetag = "PANDSSGZOMBIE";
			break;
		case 'AutoShotgunZombie':
			basetag = "PANDAUTOSHOTGUY";
			break;
		case 'RocketZombie':
			basetag = "PANDROCKETZOMBIE";
			break;
		case 'ShotgunAdmiral':
			basetag = "PANDADMIRAL";
			break;
		case 'SlugShotgunZombie':
			basetag = "PANDSLUGZOMBIE";
			break;
		case 'ChaosWarrior':
			basetag = "PANDCHAOSWARRIOR";
			break;
		case 'SpecOpsShotgunner':
			basetag = "PANDSPECSHOTGUY";
			break;
		case 'AssaultGunner':
			basetag = "PANDASSGUNNER";
			break;
		case 'ChaingunZombie':
			basetag = "HEAVY";
			break;
		case 'BFGCommando':
			basetag = "PANDBFGGUY";
			break;
		case 'NailborgCommando':
			basetag = "PANDNAILGUY";
			break;
		case 'PlasmaRifleZombie':
			basetag = "PANDPLASMAZOMBIE";
			break;
		case 'ChaosDeathmark':
			basetag = "PANDCHAOSMARK";
			break;
		case 'BFG10kWarrior':
			basetag = "PANDBFG10GUY";
			break;
		case 'SpecOpsGunner':
			basetag = "PANDSPECGUNNER";
			break;
		case 'SpecOpsLieutenant':
			basetag = "PANDSPECLT";
			break;
		case 'NewImp':
			basetag = "IMP";
			break;
		case 'DarkImp':
			basetag = "PANDDARKIMP";
			break;
		case 'PhaseImp':
			basetag = "PANDPHASEIMP";
			break;
		case 'Scoundrel':
			basetag = "PANDSCOUNDREL";
			break;
		case 'Devil':
			basetag = "PANDDEVIL";
			break;
		case 'Plagueling':
			basetag = "PANDPLAGUELING";
			break;
		case 'ChaosImp':
			basetag = "PANDCHAOSIMP";
			break;
		case 'NewDemon':
			basetag = "DEMON";
			break;
		case 'BloodFiend':
			basetag = "PANDBLOODFIEND";
			break;
		case 'MechDemon':
			basetag = "PANDMECHPINKY";
			break;
		case 'MagmaDemon':
			basetag = "PANDMAGMAPINKY";
			break;
		case 'PandMauler':
			basetag = "PANDMAULER";
			break;
		case 'ChaosFlayer':
			basetag = "PANDCHAOSFLY";
			break;
		case 'NewSpectre':
			basetag = "SPECTRE";
			break;
		case 'NightmareDemon':
			basetag = "PANDNITEDEMON";
			break;
		case 'Delusion':
			basetag = "PANDDELUDE";
			break;
		case 'Darkbeast':
			basetag = "PANDDARKBEAST";
			break;
		case 'Wretch':
			basetag = "PANDWRETCH";
			break;
		case 'ChaosOphydian':
			basetag = "PANDWHIPLASH";
			break;
		case 'NewCacodemon':
			basetag = "CACO";
			break;
		case 'DarkCacodemon':
			basetag = "PANDDARKCACO";
			break;
		case 'Crackodemon':
			basetag = "PANDCRACKO";
			break;
		case 'Agathodemon':
			basetag = "PANDGEMCACO";
			break;
		case 'Witherdemon':
			basetag = "PANDWITHERCACO";
			break;
		case 'Cacobot':
			basetag = "PANDCACOBOT";
			break;
		case 'NewPainElemental':
			basetag = "PAIN";
			break;
		case 'DarkElemental':
			basetag = "PANDDARKPAIN";
			break;
		case 'PlasmaticElemental':
			basetag = "PANDPLASPAIN";
			break;
		case 'HadesElemental':
			basetag = "PANDHADES";
			break;
		case 'ChaosBeholder':
			basetag = "PANDBEHOLDER";
			break;
		case 'NewLostSoul':
			basetag = "LOST";
			break;
		case 'Phantasm':
			basetag = "PANDPANTSMAN";
			break;
		case 'Electrosoul':
			basetag = "PANDZAPLOST";
			break;
		case 'PandWraith':
			basetag = "PANDWRAITH";
			break;
		case 'SoullessDrone':
			basetag = "PANDDRONELESS";
			break;
		case 'ChaosUmbra':
			basetag = "PANDUMBRA";
			break;
		case 'NewHellKnight':
			basetag = "HELL";
			break;
		case 'HellViscount':
			basetag = "PANDBISCUIT";
			break;
		case 'CyberHellKnight':
			basetag = "PANDCYKNIGHT";
			break;
		case 'CyberHellViscount':
			basetag = "PANDCYBISCUIT";
			break;
		case 'Infernoble':
			basetag = "PANDINFERNOBLE";
			break;
		case 'HellWarden':
			basetag = "PANDWARDEN";
			break;
		case 'HellWardenShieldHitbox':
			basetag = "PANDWARDSHIELD";
			break;
		case 'NewBaronOfHell':
			basetag = "BARON";
			break;
		case 'ArchonOfHell':
			basetag = "PANDARCHON";
			break;
		case 'Cybruiser':
			basetag = "PANDCYBARON";
			break;
		case 'Afrit':
			basetag = "PANDAFRIT";
			break;
		case 'BruiserDemon':
			basetag = "PANDBRUISERBROS";
			break;
		case 'DarkCybruiser':
			basetag = "PANDDARKCYBARON";
			break;
		case 'Pyrobruiser':
			basetag = "PANDPYROBULL";
			break;
		case 'Cyberwarden':
			basetag = "PANDCYBARONDEUX";
			break;
		case 'NewRevenant':
			basetag = "REVEN";
			break;
		case 'DarkRevenant':
			basetag = "PANDDARKREV";
			break;
		case 'MissileRevenant':
			basetag = "PANDREVMISL";
			break;
		case 'ChaosHollow':
			basetag = "PANDCHAOHOLE";
			break;
		case 'Sentry':
			basetag = "PANDSENTRY";
			break;
		case 'PandSentinel':
			basetag = "PANDSENTINEL";
			break;
		case 'Mancubus':
			basetag = "MANCU";
			break;
		case 'Hectebus':
			basetag = "PANDHECKBUS";
			break;
		case 'Mafibus':
			basetag = "PANDMUFFIBUS";
			break;
		case 'Corpulent':
			basetag = "PANDFLATULENT";
			break;
		case 'Maxibus':
			basetag = "PANDMINIBUS";
			break;
		case 'Tankubus':
			basetag = "PANDTANKSLED";
			break;
		case 'Tankubus2':
			basetag = "PANDTANKUBUS";
			break;
		case 'NewArachnotron':
			basetag = "ARACH";
			break;
		case 'NailgunArachnotron':
			basetag = "PANDNAILARACH";
			break;
		case 'FusionArachnotron':
			basetag = "PANDFUSEARACH";
			break;
		case 'Widow':
			basetag = "PANDWIDOW";
			break;
		case 'AugmentedArachnotron':
			basetag = "PANDAUGRACH";
			break;
		case 'Arachknight':
			basetag = "PANDARACHKNIGHT";
			break;
		case 'ChaosObserver':
			basetag = "PANDCHAOSORB";
			break;
		case 'NewArchvile':
			basetag = "ARCH";
			break;
		case 'DarkVile':
			basetag = "PANDDARKARCH";
			break;
		case 'Diabolist':
			basetag = "PANDDIABLOIST";
			break;
		case 'Distortionist':
			basetag = "PANDDISTORTIONIST";
			break;
		case 'Cryptek':
			basetag = "PANDKOOLWORD";
			break;
		case 'Infernalist':
			basetag = "PANDINFERNALIST";
			break;
		case 'NewCyberdemon':
			basetag = "CYBER";
			break;
		case 'Annihilator':
			basetag = "PANDDOUBLECYBER";
			break;
		case 'DarkCyberdemon':
			basetag = "PANDDARKCYBER";
			break;
		case 'DarkCardinal':
			basetag = "PANDCARDINAL";
			break;
		case 'Terminator':
			basetag = "PANDOVERUSEDBOSS";
			break;
		case 'Plamexis':
			basetag = "PANDPLAXIS";
			break;
		case 'Dreamweaver':
			basetag = "PANDWEBEDITOR";
			break;
		case 'Eradicator':
			basetag = "PANDRADICAL";
			break;
		case 'NewSpiderMastermind':
			basetag = "SPIDER";
			break;
		case 'Demolisher':
			basetag = "PANDDEMOSPIDER";
			break;
		case 'Arachnophyte':
			basetag = "PANDARACHNOFLY";
			break;
		case 'SpiderMasterspark':
			basetag = "PANDSPIDERMARI";
			break;
		case 'ChaosMonolith':
			basetag = "PANDCHAOSMON";
			break;
		case 'Sayori':
			basetag = "DDLCSAYORI";
			break;
		case 'Belfast':
			basetag = "ALBELFAST";
			break;
		case 'Enterprise1':
		case 'Enterprise2':
			basetag = "ALENTERPRISE";
			break;
		case 'Littorio':
			basetag = "ALLITTORIO";
			break;
		case 'Scythe2Afrit':
			basetag = "PANDS2AFRIT";
			break;
		case 'Scythe2Marine':
			basetag = "PANDS2MISTERX";
			break;
		case 'Epic2Alien':
			basetag = "PANDE2ALIEN";
			break;
		case 'Epic2Keen':
			basetag = "KEEN";
			break;
		case 'myrkura':
			basetag = "MYRKURA";
			break;
		case 'GeneralRoasterock':
			basetag = "ROASTEROCK";
			break;
		// 2.3 additions
		case 'CinderZombie':
			basetag = "PANDCINDER";
			break;
		case 'PyroZombie':
			basetag = "PANDPYRO";
			break;
		case 'InfernalCommando':
			basetag = "PANDINFERCOM";
			break;
		case 'ChaosCultist':
			basetag = "PANDCULTIST";
			break;
		case 'ChaosAcolyte':
			basetag = "PANDACOLYTE";
			break;
		case 'Abaddon':
			basetag = "PANDABADDON";
			break;
		case 'ChaosStalker':
			basetag = "PANDCHAOSCACO";
			break;
		case 'AutomatonElemental':
			basetag = "PANDAUTOMATO";
			break;
		case 'Cydestructor':
			basetag = "PANDCYDESTRUCTOR";
			break;
		case 'Apollyon':
			basetag = "PANDAPOLLYON";
			break;
		case 'ChaosPylon':
			basetag = "PANDCHAOSPYLON";
			break;
		case 'Arachnoscorcher':
			basetag = "PANDARASCORCH";
			break;
		case 'Demolitron':
			basetag = "PANDDEMOLITRON";
			break;
		case 'ChaosEcclesiarch':
			basetag = "PANDCHAOSCYBER";
			break;
		case 'DarkMastermind':
			basetag = "PANDDARKERMIND";
			break;
		// 2.4 additions
		case 'ScourgeZombie':
			basetag = "PANDSCOURGEZOMB";
			break;
		case 'BrimstoneImp':
			basetag = "PANDFLINTSTONE";
			break;
		case 'CyberImp':
			basetag = "PANDCYBIMP";
			break;
		case 'AbyssalSavage':
			basetag = "PANDSAVAGE";
			break;
		case 'HellPrinceAsch':
			basetag = "PANDASCH";
			break;
		// 2.4.1 additions
		case 'AncientGladiator':
			basetag = "PANDGLADIATOR";
			break;
		// Anarchy additions
		case 'QuadShotgunZombie':
			basetag = "PANDAQUADSHOT";
			break;
		case 'Harvester':
			basetag = "PANDAHARVESTER";
			break;
		case 'DarkCyberwarden':
			basetag = "PANDADARKCYWARD";
			break;
		case 'DarkCydestructor':
			basetag = "PANDADARKCYDEST";
			break;
		case 'DarkAnnihilator':
			basetag = "PANDADARKNIHIL";
			break;
		case 'Desolator':
			basetag = "PANDADESOLES";
			break;
		// Anarchy boss variants
		case 'Eradicator_Anarchic':
			basetag = "PANDARADICAL";
			break;
		}
		String funtag = "FN_"..basetag.."_FUN";
		String lfuntag = StringTable.Localize(funtag,false);
		if ( lfuntag != funtag ) return lfuntag;
		String nfuntag = "FN_"..basetag.."_FUNN";
		String lnfuntag = StringTable.Localize(nfuntag,false);
		if ( lnfuntag == nfuntag ) return "";
		ntags = lnfuntag.ToInt();
		String ftag = StringTable.Localize(String.Format("$FN_%s_FUN%d",basetag,Random[FunTags](1,ntags)));
		// colored tag support
		if ( (objectarg is 'PandMonster') && pan_coloredtags )
			ftag = "\c"..PandMonster(objectarg).tagcol..ftag.."\c-";
		return ftag;
	}
}

Class SWWMPandyPursuerTracker : Inventory
{
	override void DoEffect()
	{
		if ( Owner && Owner.InStateSequence(Owner.CurState,Owner.FindState("SpawnRoasterockLoop")) )
		{
			let def = GetDefaultByType('GeneralRoasterock');
			String tag = def.GetTag();
			if ( pan_coloredtags ) tag = "\c"..def.tagcol..tag.."\c-";
			Console.MidPrint(smallfont,String.Format(StringTable.Localize("$D_ROAST"),tag));
			DepleteOrDestroy();
			return;
		}
	}
}

Class SWWMPandyHandler : EventHandler
{
	override void WorldThingSpawned( WorldEvent e )
	{
		if ( !e.Thing ) return;
		if ( e.Thing.GetClass() == 'myrkura' )
			SWWMHandler.AddBossActor(e.Thing,"$BT_MYRKURA");
		else if ( e.Thing.GetClass() == 'GeneralRoasterock' )
			SWWMHandler.AddBossActor(e.Thing,"$BT_ROASTEROCK");
		else if ( e.Thing.GetClass() == 'MyrkuraSpawner' )
			Console.Printf(StringTable.Localize("$D_MYRKURA"));
		else if ( e.Thing.GetClass() == 'PandPursuerBossSpawner' )
		{
			Console.Printf(StringTable.Localize("$D_PURSE"));
			e.Thing.GiveInventory("SWWMPandyPursuerTracker",1);
		}
	}
}
