class Inventory : Actor native
{

	native Actor Owner;						// Who owns this item? NULL if it's still a pickup.
	native int Amount;						// Amount of item this instance has
	native int MaxAmount;					// Max amount of item this instance can have
	native int InterHubAmount;				// Amount of item that can be kept between hubs or levels
	native int RespawnTics;					// Tics from pickup time to respawn time
	native TextureID Icon;					// Icon to show on status bar or HUD
	native int DropTime;					// Countdown after dropping
	native Class<Actor> SpawnPointClass;	// For respawning like Heretic's mace
	native Class<Actor> PickupFlash;		// actor to spawn as pickup flash
	native Sound PickupSound;
	native bool bPickupGood;
	native bool bCreateCopyMoved;
	native bool bInitEffectFailed;
	
	Default
	{
		Inventory.Amount 1;
		Inventory.MaxAmount 1;
		Inventory.InterHubAmount 1;
		Inventory.UseSound "misc/invuse";
		Inventory.PickupSound "misc/i_pkup";
		Inventory.PickupMessage "$TXT_DEFAULTPICKUPMSG";
	}
	
	// These are regular functions for the item itself.
	private native void A_RestoreSpecialDoomThing();
	private native void A_RestoreSpecialThing1();
	private native void A_RestoreSpecialThing2();
	
	native bool, Actor CallTryPickup(Actor toucher);

	States(Actor, Overlay, Weapon, Item)
	{
	HideDoomish:
		TNT1 A 1050;
		TNT1 A 0 A_RestoreSpecialPosition;
		TNT1 A 1 A_RestoreSpecialDoomThing;
		Stop;
	HideSpecial:
		ACLO E 1400;
		ACLO A 0 A_RestoreSpecialPosition;
		ACLO A 4 A_RestoreSpecialThing1;
		ACLO BABCBCDC 4;
		ACLO D 4 A_RestoreSpecialThing2;
		Stop;
	Held:
		TNT1 A -1;
		Stop;
	HoldAndDestroy:
		TNT1 A 1;
		Stop;
	}
}

class StateProvider : Inventory native
{
	action native state A_JumpIfNoAmmo(statelabel label);
	action native void A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class<Actor> pufftype = "BulletPuff", double range = 0, double lifesteal = 0, int lifestealmax = 0, class<BasicArmorBonus> armorbonustype = "ArmorBonus", sound MeleeSound = 0, sound MissSound = "");
	action native void A_FireBullets(double spread_xy, double spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", int flags = 1, double range = 0, class<Actor> missile = null, double Spawnheight = 32, double Spawnofs_xy = 0);
	action native void A_FireCustomMissile(class<Actor> missiletype, double angle = 0, bool useammo = true, double spawnofs_xy = 0, double spawnheight = 0, int flags = 0, double pitch = 0);
	action native void A_RailAttack(int damage, int spawnofs_xy = 0, bool useammo = true, color color1 = 0, color color2 = 0, int flags = 0, double maxdiff = 0, class<Actor> pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class<Actor> spawnclass = "none", double spawnofs_z = 0, int spiraloffset = 270, int limit = 0);
	action native void A_WeaponReady(int flags = 0);
	action native void A_Lower();
	action native void A_Raise();

	action native void A_ReFire(statelabel flash = null);
	action native void A_ClearReFire();
	action native void A_CheckReload();
	action native void A_GunFlash(statelabel flash = null, int flags = 0);
	action native void A_FireAssaultGun();
	action native state A_CheckForReload(int counter, statelabel label, bool dontincrement = false);
	action native void A_ResetReloadCounter();
}

class ScoreItem : Inventory native
{
	Default
	{
		Height 10;
		+COUNTITEM
		Inventory.Amount 1;
		+Inventory.ALWAYSPICKUP
	}
}

class Ammo : Inventory native
{
	native int BackpackAmount;
	native int BackpackMaxAmount;
	
	Default
	{
		+INVENTORY.KEEPDEPLETED
		Inventory.PickupSound "misc/ammo_pkup";
	}
}

class BackpackItem : Inventory native
{
	native bool bDepleted;
}

class Armor : Inventory native
{
	Default
	{
		Inventory.PickupSound "misc/armor_pkup";
	}
}

class BasicArmor : Armor native
{
	
	native int AbsorbCount;
	native double SavePercent;
	native int MaxAbsorb;
	native int MaxFullAbsorb;
	native int BonusCount;
	native Name ArmorType;
	native int ActualSaveAmount;
	
	Default
	{
		+Inventory.KEEPDEPLETED
	}
}

class BasicArmorBonus : Armor native
{
	native double SavePercent;	// The default, for when you don't already have armor
	native int MaxSaveAmount;
	native int MaxAbsorb;
	native int MaxFullAbsorb;
	native int SaveAmount;
	native int BonusCount;
	native int BonusMax;

	Default
	{
		+Inventory.AUTOACTIVATE
		+Inventory.ALWAYSPICKUP
		Inventory.MaxAmount 0;
		Armor.SavePercent 33.335;
	}
}

class BasicArmorPickup : Armor native
{

	native double SavePercent;
	native int MaxAbsorb;
	native int MaxFullAbsorb;
	native int SaveAmount;
	
	Default
	{
		+Inventory.AUTOACTIVATE;
		Inventory.MaxAmount 0;
	}
}

class HexenArmor : Armor native
{
	
	native double Slots[5];
	native double SlotsIncrement[4];
	
	Default
	{
		+Inventory.KEEPDEPLETED
		+Inventory.UNDROPPABLE
	}
}

class DehackedPickup : Inventory native {}

class FakeInventory : Inventory native 
{
	native bool Respawnable;
}

class CustomInventory : StateProvider native 
{
	Default
	{
		DefaultStateUsage SUF_ACTOR|SUF_OVERLAY|SUF_ITEM;
	}
}

class Health : Inventory native 
{
	native int PrevHealth;
	
	Default
	{
		Inventory.Amount 1;
		Inventory.MaxAmount 0;
		Inventory.PickupSound "misc/health_pkup";
	}
}

class HealthPickup : Inventory native 
{
	native int autousemode;

	Default
	{
		Inventory.DefMaxAmount;
		+INVENTORY.INVBAR
	}
}

class Key : Inventory native
{
	native uint8 KeyNumber;

	Default
	{
		+DONTGIB;		// Don't disappear due to a crusher
		Inventory.InterHubAmount 0;
		Inventory.PickupSound "misc/k_pkup";
	}
}

class PowerupGiver : Inventory native
{
	
	native Class<Actor> PowerupType;
	native int EffectTics;		// Non-0 to override the powerup's default tics
	native color BlendColor;	// Non-0 to override the powerup's default blend
	native Name Mode;			// Meaning depends on powerup - used for Invulnerability and Invisibility
	native double Strength;		// Meaning depends on powerup - currently used only by Invisibility
	
	Default
	{
		Inventory.DefMaxAmount;
		+INVENTORY.INVBAR
		+INVENTORY.FANCYPICKUPSOUND
		Inventory.PickupSound "misc/p_pkup";
	}
}

class Powerup : Inventory native 
{
	native int EffectTics;	
	native color BlendColor;
	native Name Mode;			// Meaning depends on powerup - used for Invulnerability and Invisibility
	native double Strength;		// Meaning depends on powerup - currently used only by Invisibility
}

class PowerInvulnerable : Powerup native
{
	Default
	{
		Powerup.Duration -30;
		inventory.icon "SPSHLD0";
	}
}

class PowerStrength : Powerup native
{
	Default
	{
		Powerup.Duration 1;
		Powerup.Color "ff 00 00", 0.5;
		+INVENTORY.HUBPOWER
	}
}

class PowerInvisibility : Powerup native
{
	Default
	{
		+SHADOW;
		Powerup.Duration -60;
		Powerup.Strength 80;
		Powerup.Mode "Fuzzy";
	}
}

class PowerGhost : PowerInvisibility
{
	Default
	{
		+GHOST;
		Powerup.Duration -60;
		Powerup.Strength 60;
		Powerup.Mode "None";
	}
}

class PowerShadow : PowerInvisibility
{
	Default
	{
		+INVENTORY.HUBPOWER
		Powerup.Duration -55;
		Powerup.Strength 75;
		Powerup.Mode "Cumulative";
	}
}

class PowerIronFeet : Powerup native
{
	Default
	{
		Powerup.Duration -60;
		Powerup.Color "00 ff 00", 0.125;
	}
}

class PowerMask : PowerIronFeet native
{
	Default
	{
		Powerup.Duration -80;
		Powerup.Color "00 00 00", 0;
		+INVENTORY.HUBPOWER
		Inventory.Icon "I_MASK";
	}
}

class PowerLightAmp : Powerup native
{
	Default
	{
		Powerup.Duration -120;
	}
}

class PowerTorch : PowerLightAmp native {}

class PowerFlight : Powerup native
{
	Default
	{
		Powerup.Duration -60;
		+INVENTORY.HUBPOWER
	}
}

class PowerWeaponLevel2 : Powerup native
{
	Default
	{
		Powerup.Duration -40;
		Inventory.Icon "SPINBK0";
		+INVENTORY.NOTELEPORTFREEZE
	}
}

class PowerSpeed : Powerup native
{
	native int SpeedFlags;

	Default
	{
		Powerup.Duration -45;
		Speed 1.5;
		Inventory.Icon "SPBOOT0";
		+INVENTORY.NOTELEPORTFREEZE
	}
}

// Player Speed Trail (used by the Speed Powerup) ----------------------------

class PlayerSpeedTrail : Actor
{
	Default
	{
		+NOBLOCKMAP
		+NOGRAVITY
		Alpha 0.6;
		RenderStyle "Translucent";
	}
	
	override void Tick()
	{
		Alpha -= .6 / 8;
		if (Alpha <= 0)
		{
			Destroy ();
		}
	}
}

class PowerMinotaur : Powerup native
{
	Default
	{
		Powerup.Duration -25;
		Inventory.Icon "SPMINO0";
	}
}

class PowerTargeter : Powerup native
{
	Default
	{
		Powerup.Duration -160;
		+INVENTORY.HUBPOWER
	}
	States
	{
	Targeter:
		TRGT A -1;
		Stop;
		TRGT B -1;
		Stop;
		TRGT C -1;
		Stop;
	}
}

class PowerFrightener : Powerup native
{
	Default
	{
		Powerup.Duration -60;
	}
}

class PowerBuddha : Powerup native
{
	Default
	{
		Powerup.Duration -60;
	}
}

class PowerScanner : Powerup native
{
	Default
	{
		Powerup.Duration -80;
		+INVENTORY.HUBPOWER
	}
}

class PowerTimeFreezer : Powerup native
{
	Default
	{
		Powerup.Duration -12;
	}
}

class PowerDamage : Powerup native
{
	Default
	{
		Powerup.Duration -25;
	}
}

class PowerProtection : Powerup native
{
	Default
	{
		Powerup.Duration -25;
	}
}

class PowerDrain : Powerup native
{
	Default
	{
		Powerup.Duration -60;
	}
}

class PowerRegeneration : Powerup native
{
	Default
	{
		Powerup.Duration -120;
		Powerup.Strength 5;
	}
}

class PowerHighJump : Powerup native {}

class PowerDoubleFiringSpeed : Powerup native {}

class PowerMorph : Powerup native
{
	native Class<PlayerPawn> PlayerClass;
	native Class<Actor> MorphFlash, UnMorphFlash;
	native int MorphStyle;
	native PlayerInfo MorphedPlayer;
	native bool bInUndoMorph;

	Default
	{
		Powerup.Duration -40;
	}
}

class PowerInfiniteAmmo : Powerup native
{
	Default
	{
		Powerup.Duration -30;
	}
}

class MapRevealer : Inventory native {}

class PuzzleItem : Inventory native 
{
	native int PuzzleItemNumber;

	Default
	{
		+NOGRAVITY
		+INVENTORY.INVBAR
		Inventory.DefMaxAmount;
		Inventory.UseSound "PuzzleSuccess";
		Inventory.PickupSound "misc/i_pkup";
	}
}

class Weapon : StateProvider native
{
	native uint WeaponFlags;
	native class<Ammo> AmmoType1, AmmoType2;		// Types of ammo used by this weapon
	native int AmmoGive1, AmmoGive2;				// Amount of each ammo to get when picking up weapon
	native int MinAmmo1, MinAmmo2;					// Minimum ammo needed to switch to this weapon
	native int AmmoUse1, AmmoUse2;					// How much ammo to use with each shot
	native int Kickback;
	native float YAdjust;							// For viewing the weapon fullscreen (visual only so no need to be a double)
	native sound UpSound, ReadySound;				// Sounds when coming up and idle
	native class<Weapon> SisterWeaponType;			// Another weapon to pick up with this one
	native class<Actor> ProjectileType;				// Projectile used by primary attack
	native class<Actor> AltProjectileType;			// Projectile used by alternate attack
	native int SelectionOrder;						// Lower-numbered weapons get picked first
	native int MinSelAmmo1, MinSelAmmo2;			// Ignore in BestWeapon() if inadequate ammo
	native double MoveCombatDist;					// Used by bots, but do they *really* need it?
	native int ReloadCounter;						// For A_CheckForReload
	native int BobStyle;							// [XA] Bobbing style. Defines type of bobbing (e.g. Normal, Alpha)  (visual only so no need to be a double)
	native float BobSpeed;							// [XA] Bobbing speed. Defines how quickly a weapon bobs.
	native float BobRangeX, BobRangeY;				// [XA] Bobbing range. Defines how far a weapon bobs in either direction.
	native Ammo Ammo1, Ammo2;						// In-inventory instance variables
	native Weapon SisterWeapon;
	native float FOVScale;
	native int Crosshair;							// 0 to use player's crosshair
	native bool GivenAsMorphWeapon;
	native bool bAltFire;							// Set when this weapon's alternate fire is used.
	native readonly bool bDehAmmo;

	Default
	{
		Inventory.PickupSound "misc/w_pkup";
		Weapon.DefaultKickback;
		Weapon.BobSpeed 1.0;
		Weapon.BobRangeX 1.0;
		Weapon.BobRangeY 1.0;
		+WEAPONSPAWN
		DefaultStateUsage SUF_ACTOR|SUF_OVERLAY|SUF_WEAPON;
	}
	States
	{
	LightDone:
		SHTG E 0 A_Light0;
		Stop;
	}
	
	native bool DepleteAmmo(bool altFire, bool checkEnough = true, int ammouse = -1);
	
	virtual State GetReadyState ()
	{
		return FindState('Ready');
	}
	
	
	native action void A_ZoomFactor(double scale = 1, int flags = 0);
	native action void A_SetCrosshair(int xhair);
	const ZOOM_INSTANT = 1;
	const ZOOM_NOSCALETURNING = 2;
	
}

class WeaponGiver : Weapon native
{
	
	native double DropAmmoFactor;
	
	Default
	{
		Weapon.AmmoGive1 -1;
		Weapon.AmmoGive2 -1;
	}
}

class WeaponHolder : Inventory native
{
	native int PieceMask;
	native Class<Actor> PieceWeapon;
	
	Default
	{
		+NOBLOCKMAP
		+NOSECTOR
		+INVENTORY.UNDROPPABLE
	}
}

class WeaponPiece : Inventory native 
{
	Default
	{
		+WEAPONSPAWN;
	}
}
