Class UnrealArmor : UTArmor
{
	Default
	{
		-INVENTORY.ALWAYSPICKUP;
	}
}

Class UArmor : UnrealArmor
{
	Default
	{
		Tag "$T_UARMOR";
		Inventory.Amount 100;
		Inventory.MaxAmount 100;
		Inventory.InterHubAmount 100;
		UTArmor.ArmorAbsorption 90;
		UTArmor.AbsorptionPriority 7;
		Inventory.PickupMessage "$I_UARMOR";
		Inventory.PickupSound "misc/u1armor";
		Inventory.Icon "I_Armor";
	}
	States
	{
	Spawn:
		UARM A -1;
		Stop;
	}
}

Class AsbestosSuit : UnrealArmor
{
	Default
	{
		Tag "$T_ASBSUIT";
		Inventory.Amount 50;
		Inventory.MaxAmount 50;
		Inventory.InterHubAmount 50;
		UTArmor.ArmorAbsorption 50;
		UTArmor.AbsorptionPriority 6;
		Inventory.PickupMessage "$I_ASBSUIT";
		Inventory.PickupSound "misc/suit";
		Inventory.Icon "I_Suit";
	}
	override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
	{
		if ( passive && (Amount > 0) && ((damageType == 'Fire') || (damageType == 'Ice')) )
			newdamage = 0;
	}
	override void AttachToOwner( Actor other )
	{
		Super.AttachToOwner(other);
		if ( sting_allsuits ) return;
		// remove other suits
		Inventory i = other.FindInventory("ToxinSuit");
		if ( i ) other.RemoveInventory(i);
		i = other.FindInventory("KevlarSuit");
		if ( i ) other.RemoveInventory(i);
	}
	States
	{
	Spawn:
		ASBS A -1;
		Stop;
	}
}

Class ToxinSuit : UnrealArmor
{
	Default
	{
		Tag "$T_TOXSUIT";
		Inventory.Amount 50;
		Inventory.MaxAmount 50;
		Inventory.InterHubAmount 50;
		UTArmor.ArmorAbsorption 50;
		UTArmor.AbsorptionPriority 6;
		Inventory.PickupMessage "$I_TOXSUIT";
		Inventory.PickupSound "misc/suit";
		Inventory.Icon "I_TSuit";
	}
	override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
	{
		if ( passive && (Amount > 0) && ((damageType == 'Slime') || (damageType == 'Poison')) )
			newdamage = 0;
	}
	override void AttachToOwner( Actor other )
	{
		Super.AttachToOwner(other);
		if ( sting_allsuits ) return;
		// remove other suits
		Inventory i = other.FindInventory("AsbestosSuit");
		if ( i ) other.RemoveInventory(i);
		i = other.FindInventory("KevlarSuit");
		if ( i ) other.RemoveInventory(i);
	}
	States
	{
	Spawn:
		TOXS A -1;
		Stop;
	}
}

Class KevlarSuit : UnrealArmor
{
	Default
	{
		Tag "$T_KEVSUIT";
		Inventory.Amount 100;
		Inventory.MaxAmount 100;
		Inventory.InterHubAmount 100;
		UTArmor.ArmorAbsorption 80;
		UTArmor.AbsorptionPriority 6;
		Inventory.PickupMessage "$I_KEVSUIT";
		Inventory.PickupSound "misc/suit";
		Inventory.Icon "I_Kevlar";
	}
	override void AttachToOwner( Actor other )
	{
		Super.AttachToOwner(other);
		if ( sting_allsuits ) return;
		// remove other suits
		Inventory i = other.FindInventory("AsbestosSuit");
		if ( i ) other.RemoveInventory(i);
		i = other.FindInventory("ToxinSuit");
		if ( i ) other.RemoveInventory(i);
	}
	States
	{
	Spawn:
		KEVS A -1;
		Stop;
	}
}

Class ShieldBelt : UnrealArmor
{
	override void AbsorbDamage( int damage, Name damageType, out int newdamage )
	{
		if ( (damage > 0) && (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) )
		{
			Owner.A_StartSound("belt/absorb",CHAN_POWERUP4);
			UTMainHandler.DoFlash(Owner,Color(80,255,224,0),5);
		}
		Super.AbsorbDamage(damage,damageType,newdamage);
	}
	override void DepleteOrDestroy()
	{
		if ( (amount <= 0) && Owner.CheckLocalView() )
			Console.Printf(StringTable.Localize("$D_SHIELDBELT"));
		Super.DepleteOrDestroy();
	}
	Default
	{
		Tag "$T_SHIELDBELT";
		+COUNTITEM;
		+INVENTORY.BIGPOWERUP;
		+INVENTORY.ALWAYSPICKUP;
		Inventory.Amount 100;
		Inventory.MaxAmount 100;
		Inventory.InterHubAmount 100;
		UTArmor.ArmorAbsorption 100;
		UTArmor.AbsorptionPriority 10;
		Inventory.PickupMessage "$I_SHIELDBELT";
		Inventory.PickupSound "belt/pickup";
		Inventory.RespawnTics 2100;
		Inventory.Icon "I_Shield";
	}
	States
	{
	Spawn:
		BELT A -1;
		Stop;
	}
}

Class PowerShield : UnrealArmor
{
	bool gothit;
	int draintimer;

	override void AbsorbDamage( int damage, Name damageType, out int newdamage )
	{
		if ( (damage > 0) && (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) )
		{
			Owner.A_StartSound("belt/absorb",CHAN_POWERUP4);
			UTMainHandler.DoFlash(Owner,Color(80,224,0,255),5);
			if ( !sting_pshield )
			{
				gothit = true;
				damage = 0;
				newdamage = 0;
			}
		}
		if ( sting_pshield )
		{
			Super.AbsorbDamage(damage,damageType,newdamage);
			return;
		}
		if ( damage > 0 ) newdamage = ApplyDamageFactors(GetClass(),damageType,damage,damage);
	}
	override void DepleteOrDestroy()
	{
		if ( (amount <= 0) && Owner.CheckLocalView() )
			Console.Printf(StringTable.Localize("$D_POWERSHIELD"));
		Super.DepleteOrDestroy();
	}
	override void Tick()
	{
		Super.Tick();
		if ( sting_pshield && sting_pshield2 ) return;
		if ( !Owner || !Owner.player || (amount <= 0) ) return;
		if ( gothit )
		{
			amount--;
			gothit = false;
		}
		draintimer++;
		if ( draintimer > 35 )
		{
			amount--;
			draintimer = 0;
		}
		if ( amount <= 0 ) DepleteOrDestroy();
	}
	Default
	{
		Tag "$T_POWERSHIELD";
		+COUNTITEM;
		+INVENTORY.BIGPOWERUP;
		+INVENTORY.ALWAYSPICKUP;
		Inventory.Amount 200;
		Inventory.MaxAmount 200;
		Inventory.InterHubAmount 200;
		UTArmor.ArmorAbsorption 100;
		UTArmor.AbsorptionPriority 11;	// wow dude
		Inventory.PickupMessage "$I_POWERSHIELD";
		Inventory.PickupSound "sbelt/pickup";
		Inventory.RespawnTics 3500;
		Inventory.Icon "I_PBelt";
	}
	States
	{
	Spawn:
		BELT A -1;
		Stop;
	}
}

Class UArmorBonus : UArmor
{
	override bool TryPickup( in out Actor toucher )
	{
		if ( !sting_abonus ) return false;	// not allowed
		return Super.TryPickup(toucher);
	}
	override void Tick()
	{
		Super.Tick();
		if ( sting_abonus ) return;
		if ( !Owner )
		{
			let r = Spawn("ArmorBonus",pos,ALLOW_REPLACE);
			r.spawnangle = spawnangle;
			r.spawnpoint = spawnpoint;
			r.angle = angle;
			r.pitch = pitch;
			r.roll = roll;
			r.special = special;
			r.args[0] = args[0];
			r.args[1] = args[1];
			r.args[2] = args[2];
			r.args[3] = args[3];
			r.args[4] = args[4];
			r.ChangeTid(tid);
			r.SpawnFlags = SpawnFlags&~MTF_SECRET;
			r.HandleSpawnFlags();
			r.SpawnFlags = SpawnFlags;
			r.bCountSecret = SpawnFlags&MTF_SECRET;
			r.vel = vel;
			r.master = master;
			r.target = target;
			r.tracer = tracer;
			r.bDropped = bDropped;
			Destroy();
		}
		else
		{
			Owner.RemoveInventory(self);
			Destroy();
		}
	}
	override void AbsorbDamage( int damage, Name damageType, out int newdamage )
	{
		absorb = Clamp(Amount-50,25,100);
		Super.AbsorbDamage(damage,damageType,newdamage);
	}
	Default
	{
		Tag "$T_ARMORBONUS";
		+COUNTITEM;
		+INVENTORY.ALWAYSPICKUP;
		Inventory.Amount 5;
		Inventory.MaxAmount 200;
		Inventory.InterHubAmount 200;
		UTArmor.ArmorAbsorption 25;
		UTArmor.AbsorptionPriority 1;
		Inventory.PickupMessage "$I_ARMORBONUS";
		Inventory.PickupSound "misc/u1armor";
		Inventory.Icon "I_Bonus";
	}
	States
	{
	Spawn:
		XANH A -1;
		Stop;
	}
}
