Class GHAGWillOWisp : GHAGPokemonMove
{
	Default
	{
		Weapon.SlotNumber 6;
		
		Tag "Will-O-Wisp";
		Inventory.PickupMessage "Tada! Gardevoir learned \cxWill-O-Wisp!"; // and thankfully didn't forget anything!
	}
	
	States
	{
		Spawn:
			TMFR A -1;
			Stop;
		Select:
			HAND I 1 A_GHAGRaise();
			Loop;
		Deselect:
			HAND I 1 A_GHAGLower();
			Loop;
		Ready:
			HAND I 1 {
				A_WeaponReady();
				A_Overlay(2, 'Fire.Overlay', true);
				A_OverlayScale(2, 2.2, 2.2);
				A_OverlayOffset(2, 250, 90);
			}
			Loop;
		Fire:
			TNT1 A 0 A_ClearOverlays(2, 3, false);
			HAND H 10;
		Fire.Loop:
			HAND K 5 {
				A_SetTics(int(max(GHAGGardevoir(self).getTicModifier(10), 5)));
				int rngrange = 2;
				A_OverlayOffset(0, random(-rngrange, rngrange), 43 + random(-rngrange, rngrange), WOF_INTERPOLATE);
			}
			TNT1 A 0 A_WispAttack();
			TNT1 A 0 A_Refire('Fire.Loop');
			HAND H 10;
			goto Ready;
		Fire.Overlay:
			WILL ABCD 4 Bright;
			Loop;
	}
	
	Action Void A_WispAttack()
	{
		int amount = int(10 + (20 * GHAGGardevoir(self).getRageModifier()));
		bool spawned;
		A_StartSound("attack/WispSpawn", CHAN_AUTO);
		for (int i = 0; i < amount; ++i)
		{
			let fire = GHAGWispSpinner(A_FireProjectile('GHAGWispSpinner', 0, false, 0, -40));
			if (fire)
			{
				fire.angleoffset = ((360.0 / double(amount)) * i) + ((i + 1) * random(10, 20));
				fire.counter = (i % 2 == 0);
				spawned = true;
			}
		}
		
		if (spawned) GHAGGardevoir(self).subtractAnger(10);
	}
}

Class GHAGWispSpinner : Actor
{
	Default
	{
		Projectile;
		+NoGravity;
		+Ripper;
		Damage (3);
		radius 8;
		height 12;
		Alpha 0.75;
		RenderStyle "Translucent";
		DamageType "Fire";
	}
	
	Vector3 startpos;
	Double angleoffset;
	int distance;
	bool counter;
	double startangle;
	
	override void BeginPlay()
	{
		Super.BeginPlay();
		startpos = pos;
		distance = 64;
		startangle = players[consoleplayer].mo.angle;
	}
	
	override void Tick()
	{
		Super.tick();
		
		A_Spin();
		angleoffset += 1;
	}	
	
	States
	{
		Spawn:
			WILL ABCD 2 Bright;
			Loop;
	}
	
	Action Void A_Spin()
	{
		int dist = -32 + (invoker.distance += 5);
		
		double newX = (dist * cos((invoker.angleoffset - invoker.startangle) * (invoker.counter == true ? -1 : 1))) + invoker.startpos.x;
		double newY = (dist * sin((invoker.angleoffset - invoker.startangle) * (invoker.counter == true ? -1 : 1))) + invoker.startpos.y;
		double newZ = invoker.startpos.z + (32 * abs(sin(invoker.angleoffset + (gametic * (invoker.counter == true ? -4 : 4)))));
		
		self.setOrigin((newX, newY, newZ), true);
		
		if (dist > 1024) A_FadeOut();
	}
}