/**
 * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
 */

class UDKGameInteraction extends UIInteraction
	native;

/** Semaphore for blocking UI input. */
var int		BlockUIInputSemaphore;

cpptext
{
	/**
	 * Check a key event received by the viewport.
	 *
	 * @param	Viewport - The viewport which the key event is from.
	 * @param	ControllerId - The controller which the key event is from.
	 * @param	Key - The name of the key which an event occured for.
	 * @param	Event - The type of event which occured.
	 * @param	AmountDepressed - For analog keys, the depression percent.
	 * @param	bGamepad - input came from gamepad (ie xbox controller)
	 *
	 * @return	True to consume the key event, false to pass it on.
	 */
	virtual UBOOL InputKey(INT ControllerId,FName Key,EInputEvent Event,FLOAT AmountDepressed=1.f,UBOOL bGamepad=FALSE);

	/**
	 * Check an axis movement received by the viewport.
	 *
	 * @param	Viewport - The viewport which the axis movement is from.
	 * @param	ControllerId - The controller which the axis movement is from.
	 * @param	Key - The name of the axis which moved.
	 * @param	Delta - The axis movement delta.
	 * @param	DeltaTime - The time since the last axis update.
	 *
	 * @return	True to consume the axis movement, false to pass it on.
	 */
	virtual UBOOL InputAxis(INT ControllerId,FName Key,FLOAT Delta,FLOAT DeltaTime, UBOOL bGamepad=FALSE);

	/**
	 * Check a character input received by the viewport.
	 *
	 * @param	Viewport - The viewport which the axis movement is from.
	 * @param	ControllerId - The controller which the axis movement is from.
	 * @param	Character - The character.
	 *
	 * @return	True to consume the character, false to pass it on.
	 */
	virtual UBOOL InputChar(INT ControllerId,TCHAR Character);
}

/**
 * @return Whether or not we should process input.
 */
native final function bool ShouldProcessUIInput() const;

/**
 * Calls all of the UI input blocks and sees if we can unblock ui input.
 */
event ClearUIInputBlocks()
{
	BlockUIInputSemaphore = 0;
}

/** Tries to block the input for the UI. */
event BlockUIInput(bool bBlock)
{
	if(bBlock)
	{
		BlockUIInputSemaphore++;
	}
	else if(BlockUIInputSemaphore > 0)
	{
		BlockUIInputSemaphore--;
	}
}

/* === Interaction interface === */

/**
 * Called when the current map is being unloaded.  Cleans up any references which would prevent garbage collection.
 */
function NotifyGameSessionEnded()
{
	Super.NotifyGameSessionEnded();

	// if a scene is closed before its opening animation completes, it can result in unmatched calls to BlockUIInput
	// which will prevent the game from processing any input; so if we don't have any scenes open, make sure the
	// semaphore is reset to 0
	if ( !SceneClient.IsUIActive() )
	{
		ClearUIInputBlocks();
	}
}