/*
** botcommands.h
** Contains bot structures and prototypes
**
**---------------------------------------------------------------------------
** Copyright 2000-2010 Brad Carney
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
**
** 1. Redistributions of source code must retain the above copyright
**    notice, this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright
**    notice, this list of conditions and the following disclaimer in the
**    documentation and/or other materials provided with the distribution.
** 3. The name of the author may not be used to endorse or promote products
**    derived from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**---------------------------------------------------------------------------
**
*/

#ifndef __BOTCOMMANDS_H__
#define __BOTCOMMANDS_H__

#include "bots.h"

//*****************************************************************************
//  DEFINES

#define	SETENEMY_LASTSEEN		0
#define	SETENEMY_LASTSHOTBY		1

// Different results for pathing commands.
#define	PATH_UNREACHABLE			-1
#define	PATH_INCOMPLETE				0
#define	PATH_COMPLETE				1
#define	PATH_REACHEDGOAL			2

// This is the size of the return string for the bot command functions.
#define	BOTCMD_RETURNSTRING_SIZE	256

//*****************************************************************************
typedef enum
{
	BOTCMD_CHANGESTATE,									// Basic botcmd utility functions.
	BOTCMD_DELAY,
	BOTCMD_RAND,
	BOTCMD_STRINGSAREEQUAL,
	BOTCMD_LOOKFORPOWERUPS,								// Search functions.
	BOTCMD_LOOKFORWEAPONS,
	BOTCMD_LOOKFORAMMO,
	BOTCMD_LOOKFORBASEHEALTH,
	BOTCMD_LOOKFORBASEARMOR,
	BOTCMD_LOOKFORSUPERHEALTH,
	BOTCMD_LOOKFORSUPERARMOR,				/* 10 */
	BOTCMD_LOOKFORPLAYERENEMIES,
	BOTCMD_GETCLOSESTPLAYERENEMY,
	BOTCMD_MOVELEFT,									// Movement functions.
	BOTCMD_MOVERIGHT,
	BOTCMD_MOVEFORWARD,
	BOTCMD_MOVEBACKWARDS,
	BOTCMD_STOPMOVEMENT,
	BOTCMD_STOPFORWARDMOVEMENT,
	BOTCMD_STOPSIDEWAYSMOVEMENT,
	BOTCMD_CHECKTERRAIN,					/* 20 */
	BOTCMD_PATHTOGOAL,									// Pathing functions.
	BOTCMD_PATHTOLASTKNOWNENEMYPOSITION,
	BOTCMD_PATHTOLASTHEARDSOUND,
	BOTCMD_ROAM,
	BOTCMD_GETPATHINGCOSTTOITEM,
	BOTCMD_GETDISTANCETOITEM,
	BOTCMD_GETITEMNAME,
	BOTCMD_ISITEMVISIBLE,
	BOTCMD_SETGOAL,
	BOTCMD_BEGINAIMINGATENEMY,				/* 30 */	// Aiming functions.
	BOTCMD_STOPAIMINGATENEMY,
	BOTCMD_TURN,
	BOTCMD_GETCURRENTANGLE,
	BOTCMD_SETENEMY,									// Enemy functions.
	BOTCMD_CLEARENEMY,
	BOTCMD_ISENEMYALIVE,
	BOTCMD_ISENEMYVISIBLE,
	BOTCMD_GETDISTANCETOENEMY,
	BOTCMD_GETPLAYERDAMAGEDBY,
	BOTCMD_GETENEMYINVULNERABILITYTICKS,	/* 40 */
	BOTCMD_FIREWEAPON,									// Weapon functions.
	BOTCMD_BEGINFIRINGWEAPON,
	BOTCMD_STOPFIRINGWEAPON,
	BOTCMD_GETCURRENTWEAPON,
	BOTCMD_CHANGEWEAPON,
	BOTCMD_GETWEAPONFROMITEM,
	BOTCMD_ISWEAPONOWNED,
	BOTCMD_ISFAVORITEWEAPON,
	BOTCMD_SAY,											// Chat functions.
	BOTCMD_SAYFROMFILE,						/* 50 */
	BOTCMD_SAYFROMCHATFILE,
	BOTCMD_BEGINCHATTING,
	BOTCMD_STOPCHATTING,
	BOTCMD_CHATSECTIONEXISTS,
	BOTCMD_CHATSECTIONEXISTSINFILE,
	BOTCMD_GETLASTCHATSTRING,
	BOTCMD_GETLASTCHATPLAYER,
	BOTCMD_GETCHATFREQUENCY,
	BOTCMD_JUMP,										// Jumping functions.
	BOTCMD_BEGINJUMPING,					/* 60 */
	BOTCMD_STOPJUMPING,
	BOTCMD_TAUNT,										// Other action functions.
	BOTCMD_RESPAWN,
	BOTCMD_TRYTOJOINGAME,
	BOTCMD_ISDEAD,										// Information about self functions.
	BOTCMD_ISSPECTATING,
	BOTCMD_GETHEALTH,
	BOTCMD_GETARMOR,
	BOTCMD_GETBASEHEALTH,
	BOTCMD_GETBASEARMOR,					/* 70 */
	BOTCMD_GETBOTSKILL,									// Botskill functions.
	BOTCMD_GETACCURACY,
	BOTCMD_GETINTELLECT,
	BOTCMD_GETANTICIPATION,
	BOTCMD_GETEVADE,
	BOTCMD_GETREACTIONTIME,
	BOTCMD_GETPERCEPTION,
	BOTCMD_SETSKILLINCREASE,							// Botskill modifying functions functions.
	BOTCMD_ISSKILLINCREASED,
	BOTCMD_SETSKILLDECREASE,				/* 80 */
	BOTCMD_ISSKILLDECREASED,
	BOTCMD_GETGAMEMODE,									// Other functions.
	BOTCMD_GETSPREAD,
	BOTCMD_GETLASTJOINEDPLAYER,
	BOTCMD_GETPLAYERNAME,
	BOTCMD_GETRECEIVEDMEDAL,
	BOTCMD_ACS_EXECUTE,
	BOTCMD_GETFAVORITEWEAPON,
	BOTCMD_SAYFROMLUMP,
	BOTCMD_SAYFROMCHATLUMP,					/* 90 */
	BOTCMD_CHATSECTIONEXISTSINLUMP,
	BOTCMD_CHATSECTIONEXISTSINCHATLUMP,

	NUM_BOTCMDS

} BOTCMD_e;

//*****************************************************************************
typedef enum
{
	RETURNVAL_VOID,
	RETURNVAL_INT,
	RETURNVAL_BOOLEAN,
	RETURNVAL_STRING,

} RETURNVAL_e;

//*****************************************************************************
//	STRUCTURES

typedef struct
{
	// Text name of this command.
	char		*pszName;

	// Function that corresponds to this bot command.
	void		(*pvFunction)( CSkullBot *pBot );

	// Number of args required for this command (excluding strings).
	LONG		lNumArgs;

	// Number of args string arguments required for this command.
	LONG		lNumStringArgs;

	// Type of return value of this function.
	RETURNVAL_e	ReturnType;

} BOTCMD_s;

//*****************************************************************************
typedef struct
{
	// The name of this section.
	char	szName[64];

	// Each entry in the section. Max of 64.
	char	szEntry[64][1024];

	// Number of entries in this section.
	LONG	lNumEntries;

} CHATFILESECTION_t;

//*****************************************************************************
class	CChatFile
{
public:
	CChatFile( );
	~CChatFile( );

	// Load a chat file of the specified name.
	bool		LoadChatFile( char *pszFileName );

	// Parse the chat file to build the sections, and their entries.
	void		ParseChatFile( void *pvFile );

	// Load a chat file of the specified name.
	bool		LoadChatLump( char *pszLumpName );

	// Parse the chat file to build the sections, and their entries.
	void		ParseChatLump( char *pszLumpName );

	// Add a new section to the chat file.
	CHATFILESECTION_t	*AddSection( char *pszName );

	// Add a new entry to the specified section.
	void		AddEntry( CHATFILESECTION_t *pSection, char *pszName );

	// Find the index of a section with the specified name.
	LONG		FindSection( char *pszName );

	// Return a random entry within the specified section.
	char		*ChooseRandomEntry( char *pszSection );

	// Reads a line from the given file.
	char		*ReadLine( char *pszString, LONG lSize, void *pvFile );

	//*************************************************************************
	CHATFILESECTION_t	Sections[64];

};

//*****************************************************************************
//  PROTOTYPES

// Standard API
void		BOTCMD_Construct( void );
void		BOTCMD_RunCommand( BOTCMD_e Command, CSkullBot *pBot );
void		BOTCMD_SetLastChatString( char *pszString );
void		BOTCMD_SetLastChatPlayer( char *pszString );
void		BOTCMD_SetLastJoinedPlayer( char *pszString );
void		BOTCMD_DoChatStringSubstitutions( CSkullBot *pBot, char *pszInString, char *pszOutString );
bool		BOTCMD_IgnoreItem( CSkullBot *pBot, LONG lIdx, bool bVisibilityCheck );

#endif	// __BOTCOMMANDS_H__
