// This file contains compatibility wrappers for DECORATE functions with bad parameters or other things that were refactored since the first release.

extend class Object
{
	deprecated("2.4", "Use gameinfo.gametype instead") static int GameType()
	{ 
		return gameinfo.gametype; 
	}
	
	deprecated("2.4", "Use Console.MidPrint() instead") static void C_MidPrint(string fontname, string textlabel, bool bold = false)
	{
		let f = Font.GetFont(fontname);
		if (f == null) return;
		Console.MidPrint(f, textlabel, bold);
	}

}

extend class Actor
{
	//==========================================================================
	//
	// CheckClass
	//
	// NON-ACTION function to check a pointer's class.
	// deprecated because functionality is directly accessible.
	//
	//==========================================================================

	deprecated("3.7", "Use GetClass(), type cast, or 'is' operator instead") bool CheckClass(class<Actor> checkclass, int ptr_select = AAPTR_DEFAULT, bool match_superclass = false)
	{
		let check = GetPointer(ptr_select);
		if (check == null || checkclass == null)
		{
			return false;
		}
		else if (match_superclass)
		{
			return check is checkclass;
		}
		else
		{
			return check.GetClass() == checkclass;
		}
	}

	//==========================================================================
	//
	// GetDistance
	//
	// NON-ACTION function to get the distance in double.
	// deprecated because it requires AAPTR to work.
	//
	//==========================================================================
	deprecated("3.7", "Use Actor.Distance2D() or Actor.Distance3D() instead") double GetDistance(bool checkz, int ptr = AAPTR_TARGET) const
	{
		let target = GetPointer(ptr);

		if (!target || target == self)
		{
			return 0;
		}
		else
		{
			let diff = Vec3To(target);
			if (checkz)
				diff.Z += (target.Height - self.Height) / 2;
			else
				diff.Z = 0.;

			return diff.Length();
		}
	}

	//==========================================================================
	//
	// GetAngle
	//
	// NON-ACTION function to get the angle in degrees (normalized to -180..180)
	// deprecated because it requires AAPTR to work.
	//
	//==========================================================================

	deprecated("3.7", "Use Actor.AngleTo() instead") double GetAngle(int flags, int ptr = AAPTR_TARGET)
	{
		let target = GetPointer(ptr);

		if (!target || target == self)
		{
			return 0;
		}
		else
		{
			let angto = (flags & GAF_SWITCH) ? target.AngleTo(self) : self.AngleTo(target);
			let yaw = (flags & GAF_SWITCH) ? target.Angle : self.Angle;
			if (flags & GAF_RELATIVE) angto = deltaangle(yaw, angto);
			return angto;
		}
	}

	//==========================================================================
	//
	// GetSpriteAngle
	//
	// NON-ACTION function returns the sprite angle of a pointer.
	// deprecated because direct access to the data is now possible.
	//
	//==========================================================================
	
	deprecated("3.7", "Use Actor.SpriteAngle instead") double GetSpriteAngle(int ptr = AAPTR_DEFAULT)
	{
		let target = GetPointer(ptr);
		return target? target.SpriteAngle : 0;
	}

	//==========================================================================
	//
	// GetSpriteRotation
	//
	// NON-ACTION function returns the sprite rotation of a pointer.
	// deprecated because direct access to the data is now possible.
	//
	//==========================================================================

	deprecated("3.7", "Use Actor.SpriteRotation instead") double GetSpriteRotation(int ptr = AAPTR_DEFAULT)
	{
		let target = GetPointer(ptr);
		return target? target.SpriteRotation : 0;
	}

	deprecated("2.3", "Use A_SpawnProjectile() instead") void A_CustomMissile(class<Actor> missiletype, double spawnheight = 32, double spawnofs_xy = 0, double angle = 0, int flags = 0, double pitch = 0, int ptr = AAPTR_TARGET)
	{
		A_SpawnProjectile(missiletype, spawnheight, spawnofs_xy, angle, flags|CMF_BADPITCH, pitch, ptr);
	}
}

extend class StateProvider
{
	deprecated("2.3", "Use A_FireProjectile() instead") action 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)
	{
		A_FireProjectile(missiletype, angle, useammo, spawnofs_xy, spawnheight, flags, -pitch);
	}
}