

class PainPlayer : DoomPlayer
{
	Default
	{
		Player.WeaponSlot 1, "Fist";
		Player.WeaponSlot 2, "LightningRod";
		Player.WeaponSlot 3, "WandofEmbers";
		Player.StartItem "Fist";
	}
}

Class LightChanger: Actor
{
	static void Brighten()
	{
		for(int i = 0; i < level.sectors.size(); i++) {
			level.sectors[i].lightlevel++;
		}
	}
	static void Darken()
	{
		for(int i = 0; i < level.sectors.size(); i++) {
			level.sectors[i].lightlevel--;
		}
	}
}

Class PainLightOrb : Weapon
{
	int FracHealth;
	
	Default
	{
		Weapon.AmmoUse 0;
		Weapon.AmmoGive 0;
		Weapon.SlotNumber 5;
		Inventory.PickupMessage "Picked up the Orb of Light.";
		Inventory.PickupSound "LightOrbPickup";
		Obituary "%o fell into darkness."; // Should never be needed, but hey ho.
	}
	States
	{
	Ready:
		TNT1 A 0;
		LORB D 1 A_WeaponReady;
		Loop;
	Select:
		LORB D 1 A_Raise;
		Loop;
	Deselect:
		LORB D 1 A_Lower;
		Loop;
	Fire:
		TNT1 A 0 A_StartSound("LightOrbFire");
		TNT1 A 0 {
			invoker.FracHealth++;
			if (invoker.FracHealth>2)
			{
				A_DamageSelf(1);
				invoker.FracHealth=0;
			}
		}
		LORB H 3 A_AttachLight("Elendil",DynamicLight.PointLight,"White",128,32);
		LORB E 3 A_AttachLight("Elendil",DynamicLight.PointLight,"White",256,64);
		LORB F 3 A_AttachLight("Elendil",DynamicLight.PointLight,"White",384,96);
		LORB G 3 A_AttachLight("Elendil",DynamicLight.PointLight,"White",512,128);
		LORB F 3 A_AttachLight("Elendil",DynamicLight.PointLight,"White",384,96);
		LORB E 3 A_AttachLight("Elendil",DynamicLight.PointLight,"White",256,64);
		TNT1 A 0 A_Refire;
		LORB H 3 A_AttachLight("Elendil",DynamicLight.PointLight,"White",128,32);
		TNT1 A 0 A_RemoveLight("Elendil");
		Goto Ready;
	Spawn:
		LORB ABCB 3;
		Loop;
	}
}

Class HealthBonus5 : HealthBonus
{
	Default
	{
		Inventory.Amount 5;
	}
	States
	{
	Spawn:
		BON5 ABCDCB 6;
		Loop;
	}
}

Class PainSatyr : Actor
{
	Default
	{
		Health 50;
		Radius 24;
		Height 64;
		Scale 1.0;
		Speed 10;
		PainChance 50;
		Mass 100;
		SeeSound "satyr/sight";
		PainSound "knight/pain";
		DeathSound "satyr/death";
		ActiveSound "knight/active";
		HitObituary "%o was mauled by a satyr.";
		MONSTER;
		+FLOORCLIP
		+NOINFIGHTING
	}
	States
	{
	Spawn:
		STYR AB 10 A_Look();
		Loop;
	See:
		STYR AABBCCDD 3 A_Chase();
		Loop;
	Melee:
		STYR EF 6 A_FaceTarget();
		STYR G 6 A_CustomMeleeAttack(4*Random(1, 8), "Baron/Melee");
		STYR PQ 5 A_FaceTarget();
		STYR R 6 A_CustomMeleeAttack(4*Random(1, 8), "Baron/Melee");
		Goto See;
	Pain:
		STYR H 2;
		STYR H 2 A_Pain();
		Goto See;
	Death:
		STYR I 5;
		STYR J 5 A_Scream();
		STYR K 6 Satyr_SpawnDrops();
		STYR L 7 A_Fall();
		STYR M 4;
		STYR N 4;
		STYR O -1;
		Stop;
	Raise:
		STYR ONMLKJI 8;
		Goto See;
	}
	
	void Satyr_SpawnDrops()
	{
		// Drop nine health bonuses on death.
		vector3 pos = self.pos;
		double height = self.height;
		for (int i = 0; i < 9; i++)
		{
            let spawnedActor = Actor.Spawn("HealthBonus", (pos.x, pos.y, pos.z + (height/2)));
            spawnedActor.vel.X = frandom(-2, 2);
            spawnedActor.vel.Y = frandom(-2, 2);
            spawnedActor.vel.Z = frandom(5, 8);
        }
	}
}

Class Zagreus : Actor
{
	Default
	{
		Health 500;
		Radius 40;
		Height 112;
		Speed 8;
		Scale 2;
		PainChance 100;
		SeeSound "Wizard2/Sight";
		PainSound "Wizard2/Pain";
		DeathSound "Wizard2/Death";
		ActiveSound "Wizard2/Active";
		Obituary "%o could not withstand the might of Zagreus.";
		Monster;
		+FloorClip
		+NoGravity
		+Float
		+NOINFIGHTING
		+DONTHARMCLASS
	}
	States
	{
	Spawn:
		APDP AB 10 A_Look();
		Loop;
	See:
		APDP A 0 A_SetTranslucent(1, 0);
		APDP AABB 3 A_Chase();
		Loop;
	Missile:
		APDP C 0 A_FaceTarget();
		APDP C 2 A_SetTranslucent(0.50, 0);
		APDP C 2 A_SetTranslucent(1, 0);
		APDP C 2 A_SetTranslucent(0.50, 0);
		APDP C 2 A_SetTranslucent(1, 0);
		APDP C 2 A_SetTranslucent(0.50, 0);
		APDP C 2 A_SetTranslucent(1, 0);
		APDP C 2 A_SetTranslucent(0.50, 0);
		APDP C 2 A_SetTranslucent(1, 0);
		APDP C 0 A_Jump(64, "Missile2");
		APDP C 0 A_Jump(64, "Missile3");
		APDP D 6 ApprenticeBlast();
		Goto See;
	Missile2:
		APDP D 1 A_SetTranslucent(0.90, 0);
		APDP D 1 A_SetTranslucent(0.80, 0);
		APDP D 1 A_SetTranslucent(0.70, 0);
		APDP D 1 A_SetTranslucent(0.60, 0);
		APDP D 1 A_SetTranslucent(0.50, 0);
		APDP D 1 A_SetTranslucent(0.40, 0);
		APDP D 1 A_SetTranslucent(0.30, 0);
		APDP D 1 A_SetTranslucent(0.20, 0);
		APDP D 1 A_SetTranslucent(0.10, 0);
		APDP D 1 A_SetTranslucent(0.00, 0);
		APDP D 0 A_SetInvulnerable();
		APDP D 0 A_Stop();
		APDP DDDDDDDDDDDDDDDD 2 A_Wander();
		APDP D 6 ApprenticeBlast();
		APDP DDDDDDDDDDDDDDDD 2 A_Wander();
		APDP D 6 ApprenticeBlast();
		APDP DDDDDDDDDDDDDDDD 2 A_Wander();
		APDP D 6 ApprenticeBlast();
		APDP DDDDDDDDDDDDDDDD 2 A_Wander();
		APDP D 6 ApprenticeBlast();
		APDP DDDDDDDDDDDDDDDD 2 A_Wander();
		APDP D 1 A_SetTranslucent(0.10, 0);
		APDP D 1 A_SetTranslucent(0.20, 0);
		APDP D 1 A_SetTranslucent(0.30, 0);
		APDP D 1 A_SetTranslucent(0.40, 0);
		APDP D 1 A_SetTranslucent(0.50, 0);
		APDP D 1 A_SetTranslucent(0.60, 0);
		APDP D 1 A_SetTranslucent(0.70, 0);
		APDP D 1 A_SetTranslucent(0.80, 0);
		APDP D 1 A_SetTranslucent(0.90, 0);
		APDP D 1 A_UnSetInvulnerable();
		APDP D 1 A_SetTranslucent(1, 0);
		Goto See;
	Missile3:
		APDP C 0 A_FaceTarget();
		APDP C 0 A_StartSound("Wizard2/Attack");
		APDP D 4 A_SpawnProjectile("SuperFireBlast", 15, 0, 0);
		Goto See;
	Pain:
		APDP E 0 A_SetTranslucent(1,0);
		APDP E 4;
		APDP E 4 A_Pain();
		Goto See;
	Death:
		APDP E 0 A_SetTranslucent(1,0);
		APDP E 6;
		APDP F 6 A_Scream();
		APDP G 6 A_SpawnItem("SoulSphere"); // May not keep this.
		APDP H 6 A_SpawnItemEx("ZagreusGhost", 0, 0, 8, 0, 0, 0, 0, 128);
		APDP I 6 A_Fall();
		APDP JKL 6;
		APDP M -1;
		Stop;
	Raise:
		APDP ML 8;
		APDP KJI 6;
		Goto See;
	}

	void ApprenticeBlast()
	{
		A_FaceTarget();
		A_StartSound("Wizard2/Attack");
		A_SpawnProjectile("FireBlast", 30, -10, 4);
		A_SpawnProjectile("FireBlast", 30, 0, 0);
		A_SpawnProjectile("FireBlast", 30, 10, -4);
	}
}

Class ZagreusGhost : Actor
{
	Default
	{
		Radius 1;
		Height 1;
		Speed 0;
		RenderStyle "Translucent";
		Alpha 0.75;
		SeeSound "AoD/Ghost";
		Projectile;
		+NoClip
	}
	States
	{
	Spawn:
	Death:
		AODG ABCDEF 5 Bright;
		AODG G 5 Bright A_FadeOut();
		Stop;
	}
}

Class FireBlast : Actor
{
	Default
	{
		Speed 12;
		Scale 0.75;
		Damage 5;
		DeathSound "FireBlast/Explode";
		Decal "Scorch";
		Projectile;
		+StrifeDamage
		+NoGravity
	}
	States
	{
	Spawn:
		PROJ ABC 4 Bright;
		Loop;
	Death:
		PROJ D 4 Bright A_Explode(8, 64, 0);
		PROJ EFGH 4 Bright;
		PROJ I 4 Bright A_Fadeout(0.50);
		Stop;
	}
}

Class SuperFireBlast : FireBlast
{
	Default
	{
		Speed 10;
		Scale 1.5;
		DamageFunction 20*Random(2, 4);
		DeathSound "SuperFireBlast/Explode";
		Decal "BigScorch";
	}
	States
	{
	Spawn:
		PROJ ABC 4 Bright;
		Loop;
	Death:
		PROJ D 4 Bright A_Explode(128, 128, 0);
		PROJ EFGH 4 Bright;
		PROJ I 4 Bright A_Fadeout(0.50);
		Stop;
	}
}

Class PainImp : DoomImp
{
	Default
	{
		Tag "PainImp";
		+NOINFIGHTING
		+NOTARGET
	}
	States
	{
		Death:
			TROO I 8;
			TROO J 8 A_Scream;
			TROO K 3 Imp_SpawnDrops;
			TROO K 3 A_DropItem("HealthBonus5",1);
			TROO L 6 A_NoBlocking;
			TROO M -1;
			Stop;
	}
	
	void Imp_SpawnDrops()
	{
		// Drop ten health bonuses on death.
		vector3 pos = self.pos;
		double height = self.height;
		for (int i = 0; i < 10; i++)
		{
            let spawnedActor = Actor.Spawn("HealthBonus", (pos.x, pos.y, pos.z + (height/2)));
            spawnedActor.vel.X = frandom(-2, 2);
            spawnedActor.vel.Y = frandom(-2, 2);
            spawnedActor.vel.Z = frandom(5, 8);
        }
	}

}

Class PainDevil : DoomImp
{
	Default
	{
		Tag "Devil";
		Obituary "%o was fried by a Devil.";
		HitObituary "%o was flayed by a Devil.";
		Health 80;
		Radius 20;
		Height 56;
		Mass 120;
		Speed 10;
		PainChance 160;
		SeeSound "monster/dvlsit";
		PainSound "monster/dvlpai";
		DeathSound "monster/dvldth";
		ActiveSound "monster/dvlact";
		MONSTER;
		+NOINFIGHTING
		+FLOORCLIP
		+NOTARGET
	}
	States
	{
	Spawn:
		TRO2 AB 10 A_Look;
		Loop;
	See:
		TRO2 AABBCCDD 3 A_Chase;
		Loop;
	Melee:
	Missile:
		TRO2 EF 6 A_FaceTarget;
		TRO2 G 4 A_TroopAttack;
		TRO2 B 2;
		TRO2 HI 6 A_FaceTarget;
		TRO2 J 4 A_TroopAttack;
		TRO2 B 2;
		Goto See;
	Pain:
		TRO2 K 2;
		TRO2 K 2 A_Pain;
		Goto See;
	Pain.wepkick:
		TRO2 K 2;
		TRO2 K 50 A_Pain;
		Goto See;
	Death:
		TRO2 L 8;
		TRO2 M 8 A_Scream;
		TRO2 N 6 Devil_SpawnDrops;
		TRO2 O 6 A_NoBlocking;
		TRO2 P -1;
		Stop;
	XDeath:
		TRO2 Q 5;
		TRO2 R 5 A_XScream;
		TRO2 S 5;
		TRO2 T 5 A_NoBlocking;
		TRO2 UVW 5;
		TRO2 X -1;
		Stop;
	Raise:
		TRO2 PO 8;
		TRO2 NML 6;
		Goto See;
	}
	
	void Devil_SpawnDrops()
	{
		// Drop twelve health bonuses on death.
		vector3 pos = self.pos;
		double height = self.height;
		for (int i = 0; i < 12; i++)
		{
            let spawnedActor = Actor.Spawn("HealthBonus", (pos.x, pos.y, pos.z + (height/2)));
            spawnedActor.vel.X = frandom(-2, 2);
            spawnedActor.vel.Y = frandom(-2, 2);
            spawnedActor.vel.Z = frandom(5, 8);
        }
	}
}

Class PainJuggernaut : Actor
{
	Default
	{
		Health 200;
		PainChance 16;
		Speed 10;
		Radius 30;
		Height 62;
		Mass 1000;
		Meleerange 72;
		Scale 1.1;
		Monster;
		+FLOORCLIP
		+NOINFIGHTING
	  
		SeeSound "Juggernaut/Sight";
		PainSound "Juggernaut/Pain";
		DeathSound "Juggernaut/Death";
		Obituary "%o was pummelled by a juggernaut";
	}

	States
	{
	Spawn:
		JUGG A 10 A_Look;
		Loop;
	See:
		JUGG A 0 A_JumpIfHealthLower (500, "Rage");
		JUGG AA 3 A_Chase;
		JUGG A 0 A_StartSound("Juggernaut/Step", CHAN_5, 0, 0.5);
		JUGG BB 3 A_Chase;
		JUGG CC 3;
		JUGG C 0 A_StartSound("Juggernaut/Step", CHAN_5, 0, 0.5);
		JUGG DD 3 A_Chase;
		Loop;
	Rage:
		JUGG A 0 A_StartSound("Juggernaut/Sight");
		JUGG A 0 { bnopain = TRUE; } // A_ChangeFlag ("NOPAIN", TRUE);
		JUGG A 0 { bnofear = TRUE; } // A_ChangeFlag ("NOFEAR", TRUE);
	Sprint:
		JUGG AA 2 A_Chase;
		JUGG A 0 A_StartSound("Juggernaut/Step", CHAN_5, 0, 0.5);
		JUGG BB 2 A_Chase;
		JUGG CC 2 A_Chase;
		JUGG C 0 A_StartSound("Juggernaut/Step", CHAN_5, 0, 0.5);
		JUGG DD 2 A_Chase;
		Loop;
	Melee:
		JUGG EF 4 A_FaceTarget;
		JUGG G 4 A_FaceTarget;
		JUGG G 0 A_StartSound("Juggernaut/Attack", CHAN_5);
		JUGG G 0 A_StartSound("Juggernaut/Pain", CHAN_6);
		JUGG H 8 A_CustomMeleeAttack (35, "Juggernaut/Hit", "", "", 1);
		JUGG I 4 A_FaceTarget;
		JUGG I 0 A_StartSound("Juggernaut/Attack", CHAN_5);
		JUGG I 0 A_StartSound("Juggernaut/Pain", CHAN_6);
		JUGG J 8 A_CustomMeleeAttack (35, "Juggernaut/Hit", "", "", 1);
		JUGG J 0 A_JumpIfHealthLower (500, "Sprint");
		Goto See;
	Pain:
		JUGG E 2;
		JUGG E 2 A_Pain;
		Goto See;
	Death:
		JUGG K 7 A_Scream;
		JUGG L 7;
		JUGG M 7 Jugg_SpawnDrops;
		JUGG N 7 A_StartSound("Juggernaut/Thud");
		JUGG O 7 A_NoBlocking;
		JUGG P 7;
		JUGG Q -1;
		Stop;
	Raise:
		JUGG Q 0 { bnopain = FALSE; } // A_ChangeFlag ("NOPAIN", FALSE);
		JUGG Q 0 { bnofear = FALSE; } // A_ChangeFlag ("NOFEAR", FALSE);
		JUGG QPONMLK 6;
		Goto See;
	}

	void Jugg_SpawnDrops()
	{
		// Drop five big health bonuses and ten small ones on death.
		vector3 pos = self.pos;
		double height = self.height;
		for (int i = 0; i < 5; i++)
		{
            let spawnedActor = Actor.Spawn("HealthBonus5", (pos.x, pos.y, pos.z + (height/2)));
            spawnedActor.vel.X = frandom(-2, 2);
            spawnedActor.vel.Y = frandom(-2, 2);
            spawnedActor.vel.Z = frandom(5, 8);
        }
		for (int j = 0; j < 10; j++)
		{
            let spawnedActor = Actor.Spawn("HealthBonus", (pos.x, pos.y, pos.z + (height/2)));
            spawnedActor.vel.X = frandom(-3, 3);
            spawnedActor.vel.Y = frandom(-3, 3);
            spawnedActor.vel.Z = frandom(5, 8);
        }
	}
}
