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";
	}
	
	virtual native bool Use (bool pickup);
	virtual native color GetBlend ();
	virtual native bool HandlePickup(Inventory item);
	virtual native Inventory CreateCopy(Actor other);
	virtual native Inventory CreateTossable();
	virtual native bool SpecialDropAction (Actor dropper);
	virtual native String PickupMessage();
	virtual native bool ShouldStay();
	virtual native void DoEffect();
	virtual native void PlayPickupSound(Actor user);
	virtual native void AttachToOwner(Actor user);
	virtual native void DetachFromOwner();
	
	virtual double GetSpeedFactor() { return 1; }
	virtual bool GetNoTeleportFreeze() { return false; }
	virtual void ModifyDamage(int damage, Name damageType, out int newdamage, bool passive) {}

	native void GoAwayAndDie();
	native void BecomeItem();
	native void BecomePickup();
	
	// These are regular functions for the item itself.
	private native void A_RestoreSpecialDoomThing();
	private native void A_RestoreSpecialThing1();
	private native void A_RestoreSpecialThing2();

	// In this case the caller function is more than a simple wrapper around the virtual method and
	// is what must be actually called to pick up an item.
	virtual protected native bool TryPickup(in out Actor toucher);
	virtual protected native bool TryPickupRestricted(in out Actor toucher);
	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;
	// [BC] Hide this item until told to return.
	HideIndefinitely:
		TNT1 A 1050;
		Loop;
	}
}

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_FireProjectile(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 state A_CheckForReload(int counter, statelabel label, bool dontincrement = false);
	action native void A_ResetReloadCounter();
	// [BB] Skulltag specific code pointers
	action native void A_CheckRailReload();
}

class DehackedPickup : Inventory native 
{
}

class FakeInventory : Inventory native 
{
	native bool Respawnable;
}

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