class EmperorSelected : Inventory { Default { Inventory.MaxAmount 1; } }

#region Ammo
//$Color 6

class EmperorAmmo : Ammo
{
	Default
	{
		//$Title Golden Emperor Rocket
		Tag "Emperor Rocket";
		Inventory.PickupMessage "Picked up an ''Golden Emperor'' rocket. Somehow.";
		Inventory.PickupSound "Matriarch/Ammo";
		Inventory.Amount 1;
		Inventory.MaxAmount 10;
		Ammo.BackpackAmount 0;
		Ammo.BackpackMaxAmount 10;
		Inventory.Icon "MPRMX0";
	}
	
	States
	{
	Spawn:
		TNT1 A -1;
		Loop;
	}
}

//Golden Emperor ammo refill.
/*class EmperorAmmoRefill : Thinker {
    int countdown, countdownReload, ammoRefill;
    Class<Inventory> weaponClass, ammoClass;
    override void PostBeginPlay() {
        super.PostBeginPlay();
        countdown = 0;
        countdownReload = 210;
        ammoRefill = 1;
        weaponClass = 'GoldenEmperor';
        ammoClass = 'EmperorAmmo';
    }
    override void Tick() {
        if (--countdown > 0) return;
        countdown = countdownReload;
        for (int i = 0; i < MAXPLAYERS; ++i) {
            if (!playeringame[i]) continue;
            let target = players[i].mo;
            let ammoToCheck = Ammo(target.FindInventory(ammoClass));
            if (target.CountInv(weaponClass) > 0 && ammoToCheck.amount < ammoToCheck.maxAmount) {
                target.A_GiveInventory(ammoClass, ammoRefill);
            }
        }
    }
}*/

#endregion

#region Gnus
//$color 14

class GoldenEmperor : GuncasterWeapon
{
    Default
    {
		//$Title Golden Emperor
		Inventory.PickupSound "Guncaster/Laugh1";
		Inventory.PickupMessage "$GETEMPEROR";
		Obituary "%o bowed down to might of %k's ''Golden Emperor''.";
		Tag "Golden Emperor";
        Weapon.AmmoGive 20;
        Weapon.AmmoType "EmperorAmmo";
        Weapon.AmmoUse 1;
		Weapon.UpSound "GoldenEmperor/Up";
		Weapon.SelectionOrder 7;
		Weapon.SlotNumber 7;
		Weapon.BobStyle 'InverseSmooth';
		Weapon.BobSpeed 1.2;
		Weapon.BobRangeY 1.2;
		Weapon.BobRangeX 0.5;
		+WEAPON.AMMO_OPTIONAL
		+WEAPON.ALT_AMMO_OPTIONAL
	}
	
	int GunzerkShot, GunzerkShot2;
	double GunzX, GunzY;
	
	int Countdown, CountdownSummit, AmmoCount;
    Class<Inventory> AmmoClass;
	
	override void PostBeginPlay()
	{
		if(!bDROPPED && random(0,20) == 0)
		{
			A_DropItem("EmperorStratGiver",-1,256);
		}
		Super.PostBeginPlay();
		Return;
	}
	
	//Ammo Refill.
	override void AttachToOwner(Actor user)
	{
		Countdown = 0;
        CountdownSummit = 315;
        AmmoCount = 1;
        AmmoClass = 'EmperorAmmo';
		Super.AttachToOwner(user);
	}
	
	override void DoEffect() {
		AmmoRefill();
		Super.DoEffect();
    }
	
	void AmmoRefill() {
		let AmmoToCheck = Ammo(Owner.FindInventory(AmmoClass));
        if (AmmoToCheck.Amount < AmmoToCheck.MaxAmount) {
			CountdownSummit = Owner.CountInv("PowerGunzerking") ? 158 : 315;
			Countdown++;
			if(Countdown >= CountdownSummit) {
				Owner.A_GiveInventory(AmmoClass, AmmoCount);
				Countdown = 0;
			}
        }
	}
	
	States
	{
	Spawn:
		MPRG X -1;
		Stop;

	SelectStuff:
		TNT1 A 0 {
			//A_Overlay(99,"Debug");
			invoker.GunzerkShot = 0;
			invoker.GunzerkShot2 = 0;
			A_GiveInventory("EmperorSelected",1);
			A_Overlay(16,"Guidance");
			A_SetCrosshair(50);
		}
		Goto SelectLoop;
	SelectLoop:
		TNT1 A 1 A_Raise;
		Loop;
		
	DeselectStuff:
		TNT1 A 0 {
			A_TakeInventory("EmperorSelected",1);
		}
		Goto DeselectLoop;
		
	Guidance:
		TNT1 A 1 {
			if(CountInv("EmperorStrat") && GetPlayerInput(INPUT_BUTTONS) & BT_RELOAD) {
				//A_GiveInventory("EmperorStratActive",1);
				A_FireBullets(0,0,1,0,"LasersightPuff",FBF_NOFLASH|FBF_NORANDOMPUFFZ);
			}
			//} else {
			//	A_TakeInventory("EmperorStratActive",1);
			//}
		}
		Loop;
		
	/*Debug:
		TNT1 A 35 {
			A_Log(String.Format("WeapAction %i", invoker.WeapAction));
			A_Log(String.Format("LeftHand %i", invoker.LeftHand));
		}
		Loop;*/
	
	//RIGHT SIDE
	
	RightActive:
		"####" "#" 0 {
			if(GetCvar("GC_Gunslinger") || CountInv("PowerGunzerking")) {
				invoker.GunzX = 35;
				invoker.GunzY = 5;
			} else {
				invoker.GunzX = 0;
				invoker.GunzY = 0;
			}
			A_OverlayOffset(OverlayID(),invoker.GunzX,invoker.GunzY);
		}
		MPRG A 0;
		"####" "#" 1;
        "####" "#" 0 {	
			//Fire.
			If(!(GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking")) &&
				!invoker.weapSwitch && !invoker.LeftHand && !CountInv("MenuWheelActive") && 
				GetPlayerInput(INPUT_BUTTONS) & BT_ATTACK) {
				Return ResolveState("MainFire");
			}
			
			//Gunzerk fire.
			If((GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking")) &&
				!CountInv("MenuWheelActive") && 
				!invoker.WeapSwitch && GetPlayerInput(INPUT_BUTTONS) & BT_ALTATTACK) {
				Return ResolveState("MainFire");
			}
			Return ResolveState(Null);
		}
		Loop;
		
	//FIRE
	
	MainFire:
		//"####" A 0 A_JumpIf(GetCvar("GC_Gunslinger") || CountInv("PowerGunzerking"),2);
		//"####" A 0 A_CheckReload;
		"####" A 0 A_JumpIf(OverlayID() == 3,3);
		"####" A 0 A_JumpIfNoAmmo("RightActive");
		"####" A 0 A_Jump(256,2);
		"####" A 0 A_JumpIfNoAmmo("LeftActive");
		"####" "#" 0 {
			invoker.WeapAction++;
			
			//Gunzerk recoil modifier.
			invoker.GMod = GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking") ? 0.5 : 1.0;
			
			//Projectile.
			if(OverlayID() == -3 && (GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking"))) {
				A_FireProjectile("EmperorRocket",0,1,12,-3);
				A_FireProjectile("Mourning_Flare",0,0,12,-3);
				for(invoker.Loopler = 0; invoker.Loopler <= 15; invoker.Loopler++)
				{
					A_FireProjectile("Mourning_Ember",frandom(22.0,-22.0),0,12,-3,FPF_NOAUTOAIM,frandom(22.0,-12.0));
					A_FireProjectile("Mourning_Cloud",frandom(18.0,-18.0),0,12,-3,FPF_NOAUTOAIM,frandom(18.0,-18.0));
					A_FireProjectile("Gunsmoke_Large",frandom(12.0,-12.0),0,12,-3,FPF_NOAUTOAIM,frandom(12.0,-12.0));
					A_SetPitch(-pitch);
					A_FireProjectile("Mourning_Ember",frandom(202.0,158.0),0,12,-3,FPF_NOAUTOAIM,frandom(22.0,-12.0));
					A_FireProjectile("Mourning_Cloud",frandom(202.0,158.0),0,12,-3,FPF_NOAUTOAIM,frandom(18.0,-18.0));
					A_FireProjectile("Gunsmoke_Large",frandom(202.0,158.0),0,12,-3,FPF_NOAUTOAIM,frandom(12.0,-12.0));
					A_SetPitch(-pitch);
				}
			} else if(OverlayID() == 3 && (GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking"))) {
				invoker.LeftHand = 1;
				A_FireProjectile("EmperorRocket",0,1,-12,-3);
				A_FireProjectile("Mourning_Flare",0,0,-12,-3);
				for(invoker.Loopler = 0; invoker.Loopler <= 15; invoker.Loopler++)
				{
					A_FireProjectile("Mourning_Ember",frandom(22.0,-22.0),0,-12,-3,FPF_NOAUTOAIM,frandom(22.0,-12.0));
					A_FireProjectile("Mourning_Cloud",frandom(18.0,-18.0),0,-12,-3,FPF_NOAUTOAIM,frandom(18.0,-18.0));
					A_FireProjectile("Gunsmoke_Large",frandom(12.0,-12.0),0,-12,-3,FPF_NOAUTOAIM,frandom(12.0,-12.0));
					A_SetPitch(-pitch);
					A_FireProjectile("Mourning_Ember",frandom(202.0,158.0),0,-12,-3,FPF_NOAUTOAIM,frandom(22.0,-12.0));
					A_FireProjectile("Mourning_Cloud",frandom(202.0,158.0),0,-12,-3,FPF_NOAUTOAIM,frandom(18.0,-18.0));
					A_FireProjectile("Gunsmoke_Large",frandom(202.0,158.0),0,-12,-3,FPF_NOAUTOAIM,frandom(12.0,-12.0));
					A_SetPitch(-pitch);
				}
			} else {
				invoker.LeftHand = 1;
				A_FireProjectile("EmperorRocket",0,1,2,2);
				A_FireProjectile("Mourning_Flare",0,0,2,2);
				for(invoker.Loopler = 0; invoker.Loopler <= 15; invoker.Loopler++)
				{
					A_FireProjectile("Mourning_Ember",frandom(22.0,-22.0),0,2,2,FPF_NOAUTOAIM,frandom(22.0,-12.0));
					A_FireProjectile("Mourning_Cloud",frandom(18.0,-18.0),0,2,2,FPF_NOAUTOAIM,frandom(18.0,-18.0));
					A_FireProjectile("Gunsmoke_Large",frandom(12.0,-12.0),0,2,2,FPF_NOAUTOAIM,frandom(12.0,-12.0));
					A_SetPitch(-pitch);
					A_FireProjectile("Mourning_Ember",frandom(202.0,158.0),0,2,2,FPF_NOAUTOAIM,frandom(22.0,-12.0));
					A_FireProjectile("Mourning_Cloud",frandom(202.0,158.0),0,2,2,FPF_NOAUTOAIM,frandom(18.0,-18.0));
					A_FireProjectile("Gunsmoke_Large",frandom(202.0,158.0),0,2,2,FPF_NOAUTOAIM,frandom(12.0,-12.0));
					A_SetPitch(-pitch);
				}
			} 
			
			//Cruft.
			A_PlaySound("GoldenEmperor/Add",1,0.8);
			A_SetBlend("Yellow",0.15,20);
			A_Recoil(15.0 * invoker.Gmod * (CountInv("PowerDeadmaker") ? 0.1 : 1.0) * (CountInv("PowerSuitToken") ? 0.1 : 1.0) * GetCvar("GC_PhysicalRecoil"));
			A_AlertMonsters();
			if(GetCvar("GC_QuakeRecoil")) { A_QuakeEx(8, 8, 5, 35, 0, 256, "", QF_SCALEDOWN); }
		}
		MPRF A 0;
		"####" A 1 Bright {
			A_OverlayOffset(OverlayID(),1+invoker.GunzX+frandom(6.0,-6.0),1+invoker.GunzY+frandom(6.0,-6.0),WOF_INTERPOLATE);
			if(GetCvar("GC_ZoomRecoil")) { A_ZoomFactor(0.99); }
			A_SetPitch(pitch - 0.5 * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
			A_SetAngle(angle + (OverlayID() == -3 ? -0.5 : 0.5) * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
		}
		"####" A 1 Bright {
			A_OverlayOffset(OverlayID(),6+invoker.GunzX+frandom(6.0,-6.0),6+invoker.GunzY+frandom(6.0,-6.0),WOF_INTERPOLATE);
			if(GetCvar("GC_ZoomRecoil")) { A_ZoomFactor(0.97); }
			A_SetPitch(pitch - 1.5 * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
			A_SetAngle(angle + (OverlayID() == -3 ? -1.5 : 1.5) * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
		}
		"####" B 1 Bright {
			A_OverlayOffset(OverlayID(),9+invoker.GunzX+frandom(5.0,-5.0),9+invoker.GunzY+frandom(5.0,-5.0),WOF_INTERPOLATE);
			if(GetCvar("GC_ZoomRecoil")) { A_ZoomFactor(0.96); }
			A_SetPitch(pitch - 3.0 * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
			A_SetAngle(angle + (OverlayID() == -3 ? -3.0 : 3.0) * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
		}
		"####" B 1 Bright {
			A_OverlayOffset(OverlayID(),13+invoker.GunzX+frandom(5.0,-5.0),13+invoker.GunzY+frandom(5.0,-5.0),WOF_INTERPOLATE);
			if(GetCvar("GC_ZoomRecoil")) { A_ZoomFactor(0.95); }
			A_SetPitch(pitch - 1.5 * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
			A_SetAngle(angle + (OverlayID() == -3 ? -1.5 : 1.5) * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
		}
		"####" C 1 Bright {
			A_OverlayOffset(OverlayID(),17+invoker.GunzX+frandom(4.0,-4.0),17+invoker.GunzY+frandom(4.0,-4.0),WOF_INTERPOLATE);
			if(GetCvar("GC_ZoomRecoil")) { A_ZoomFactor(0.945); }
			A_SetPitch(pitch - 1.5 * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
			A_SetAngle(angle + (OverlayID() == -3 ? -1.5 : 1.5) * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
		}
		"####" C 1 Bright {
			A_OverlayOffset(OverlayID(),21+invoker.GunzX+frandom(4.0,-4.0),21+invoker.GunzY+frandom(4.0,-4.0),WOF_INTERPOLATE);
			if(GetCvar("GC_ZoomRecoil")) { A_ZoomFactor(0.94); }
			A_SetPitch(pitch - 1.0 * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
			A_SetAngle(angle + (OverlayID() == -3 ? -1.0 : 1.0) * GetCvar("GC_WeaponRecoil") * invoker.Gmod, SPF_INTERPOLATE);
		}
		MPRG A 0;
		"####" AAAA 1 {
			//Position.
			static const double pos[] = { 24.0, 26.0, 27.0, 28.0 };
			static const double zoom[] = { 0.95, 0.945, 0.94, 0.93 }; 
			static const double factor[] = { -2.0, -1.5, -1.0, -0.5 };
			
			//Right side.
			if(OverlayID() == -3) {
			
				//Increment array.
				int rsize = 4;
				if(invoker.LoopRight + 1 < rsize) { invoker.LoopRight++; }
				int right = invoker.LoopRight;

				//Apply position.
				A_OverlayOffset(OverlayID(), pos[right] + invoker.GunzX + frandom(3.0,-3.0), pos[right] + invoker.GunzY + frandom(3.0,-3.0), WOF_INTERPOLATE);

				//Apply zoom.
				A_ZoomFactor(zoom[right]);
				
				//Apply recoil.
				double shift = factor[right] * GetCVar("GC_WeaponRecoil") * invoker.Gmod;

				A_SetPitch(pitch + shift, SPF_INTERPOLATE);
				A_SetAngle(angle + shift, SPF_INTERPOLATE);
				Return ResolveState(Null);
			}
			//Left side.
			else
			{
				//Increment array.
				int lsize = 4;
				if(invoker.LoopLeft + 1 < lsize) { invoker.LoopLeft++; }
				int left = invoker.LoopLeft;
				
				//Apply position.
				A_OverlayOffset(OverlayID(), pos[left] + invoker.GunzX, pos[left] + invoker.GunzY, WOF_INTERPOLATE);
				 
				 //Apply zoom.
				 A_ZoomFactor(zoom[left]);
				 
				 //Apply recoil.
				double shift2 = factor[left] * GetCVar("GC_WeaponRecoil") * invoker.Gmod;
				
				A_SetPitch(pitch + shift2, SPF_INTERPOLATE);
				A_SetAngle(angle - shift2, SPF_INTERPOLATE);
				Return ResolveState(Null);
			}
		}
		"####" AAAA 1 A_OverlayOffset(OverlayID(), 28.0 + invoker.GunzX + frandom(2.0,-2.0), 28.0 + invoker.GunzY + frandom(2.0,-2.0), WOF_INTERPOLATE);
		"####" AAAA 1 A_OverlayOffset(OverlayID(), 28.0 + invoker.GunzX + frandom(1.0,-1.0), 28.0 + invoker.GunzY + frandom(1.0,-1.0), WOF_INTERPOLATE);
		"####" AAAAAAAAAAA 1 {
			//Position.
			static const double pos[] = { 28.0, 27.0, 25.0, 21.0, 17.0, 12.0, 8.0, 4.0, 2.0, 1.0, 0.0 };
			static const double zoom[] = { 0.93, 0.925, 0.92, 0.91, 0.93, 0.95, 0.97, 0.98, 0.99, 0.995, 1.0 }; 
			static const double factor[] = { 0.5, 1.0, 1.5, 2.5, 2.5, 2.0, 1.5, 1.0, 0.75, 0.5, 0.25 };
			
			//Right side.
			if(OverlayID() == -3) {
			
				//Increment array.
				int rsize = 11;
				if(invoker.LoopRight + 1 < rsize) { invoker.LoopRight++; }
				int right = invoker.LoopRight;

				//Apply position.
				A_OverlayOffset(OverlayID(), pos[right] + invoker.GunzX, pos[right] + invoker.GunzY, WOF_INTERPOLATE);

				//Apply zoom.
				A_ZoomFactor(zoom[right]);
				
				//Apply recoil.
				double shift = factor[right] * GetCVar("GC_WeaponRecoil") * invoker.Gmod;

				A_SetPitch(pitch + shift, SPF_INTERPOLATE);
				A_SetAngle(angle + shift, SPF_INTERPOLATE);
			}
			//Left side.
			else
			{
				//Increment array.
				int lsize = 11;
				if(invoker.LoopLeft + 1 < lsize) { invoker.LoopLeft++; }
				int left = invoker.LoopLeft;
				
				//Apply position.
				A_OverlayOffset(OverlayID(), pos[left] + invoker.GunzX, pos[left] + invoker.GunzY, WOF_INTERPOLATE);
				 
				 //Apply zoom.
				 A_ZoomFactor(zoom[left]);
				 
				 //Apply recoil.
				double shift2 = factor[left] * GetCVar("GC_WeaponRecoil") * invoker.Gmod;
				
				A_SetPitch(pitch + shift2, SPF_INTERPOLATE);
				A_SetAngle(angle - shift2, SPF_INTERPOLATE);
			}
		}
		"####" A 18;
		"####" A 0 {
			if(OverlayID() == -3) { invoker.LoopRight = 0; } else { invoker.LoopLeft = 0; }
			if(OverlayID() == 3 || OverlayID() == -3 && !(GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking"))) { invoker.LeftHand = 0; }
			invoker.WeapAction--;
		}
		"####" A 0 A_JumpIf(OverlayID() == 3,"LeftActive");
		Goto RightActive;
		
	//LEFT SIDE
			
	LeftActive:
		TNT1 A 0 {
			if(GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking")) {
				A_OverlayFlags(3,PSPF_MIRROR|PSPF_FLIP,1);
			} else {
				A_OverlayFlags(3,PSPF_MIRROR|PSPF_FLIP,0);
			}
			A_OverlayOffset(OverlayID(),invoker.GunzX,invoker.GunzY);
		}
		TNT1 A 0 A_JumpIf(GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking"),3);
		TNT1 A 1;
		TNT1 A 0 {
				If(!invoker.WeapSwitch && !CountInv("MenuWheelActive") && !invoker.LeftHand &&
				!(GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking")) &&
				GetPlayerInput(INPUT_BUTTONS) & BT_ALTATTACK) {
					Return ResolveState("Cast");
				}
				If(!invoker.WeapSwitch && !CountInv("MenuWheelActive") && !invoker.LeftHand &&
				!(GetCVar("GC_Gunslinger") || CountInv("PowerGunzerking")) && GetCvar("GC_Trogdor") &&
				GetPlayerInput(INPUT_BUTTONS) & BT_ZOOM) {
					Return ResolveState("DeadPunchStart");
				}
				Return ResolveState(Null);
		}
		Loop;
		MPRG A 0;
		"####" A 1;
		"####" A 0 A_JumpIf(!invoker.WeapSwitch && !CountInv("MenuWheelActive") && GetPlayerInput(INPUT_BUTTONS) & BT_ATTACK, "MainFire");
        Loop;
	}
}

#endregion
