/*
Copyright (C) 1997-2001 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
--------------------------------------------------------------
The ACE Bot is a product of Steve Yeager, and is available from
the ACE Bot homepage, at http://www.axionfx.com/ace.

This program is a modification of the ACE Bot, and is therefore
in NO WAY supported by Steve Yeager.
*/

//	local to acebot files
//==========================================================

#include "ai_nodes_local.h"
#include "ai_weapons.h"
#include "../g_gametypes.h"


#define AI_VERSION_STRING "A0058"

//bot debug_chase options
extern  cvar_t				*bot_showpath;
extern  cvar_t				*bot_showcombat;
extern  cvar_t				*bot_showsrgoal;
extern  cvar_t				*bot_showlrgoal;
extern	cvar_t				*bot_debugmonster;
#ifndef WSW_RELEASE
extern	cvar_t				*bot_dummy;
#endif

//----------------------------------------------------------

#define MAX_BOTS 64
#define AI_GOAL_SR_RADIUS		200
#define AI_DEFAULT_YAW_SPEED	900
#define AI_WATERJUMP_HEIGHT		24

// Platform states: 
#define	STATE_TOP			0
#define	STATE_BOTTOM		1
#define STATE_UP			2
#define STATE_DOWN			3

// Bot state types
#define BOT_STATE_STAND			0
#define BOT_STATE_MOVE			1
#define BOT_STATE_WANDER		2
#define BOT_STATE_ATTACK		3
#define BOT_STATE_DEFEND		4


#define BOT_MOVE_LEFT			0
#define BOT_MOVE_RIGHT			1
#define BOT_MOVE_FORWARD		2
#define BOT_MOVE_BACK			3


//acebot_items.c players table
//----------------------------------------------------------
int	num_AIEnemies;
edict_t *AIEnemies[MAX_EDICTS];		// pointers to all players in the game


//Debug & creating and linking nodes
//----------------------------------------------------------
typedef struct
{
	
	qboolean	debugMode;

	qboolean	showPLinks;
	edict_t		*plinkguy;

	qboolean	debugChased;
	edict_t		*chaseguy;

} ai_devel_t;
ai_devel_t	AIDevel;



//----------------------------------------------------------

//game
//----------------------------------------------------------
void		Use_Plat (edict_t *ent, edict_t *other, edict_t *activator);


// bot_spawn.c
//----------------------------------------------------------
void		BOT_Respawn(edict_t *ent);


// ai_main.c
//----------------------------------------------------------
void		AI_Think (edict_t *ent);
void		AI_PickLongRangeGoal(edict_t *ent);
void		AI_Frame (edict_t *self, usercmd_t *ucmd);
void		AI_SetUpMoveWander( edict_t *ent );
void		AI_ResetNavigation(edict_t *ent);
void		AI_ResetWeights(edict_t *ent);


// ai_items.c
//----------------------------------------------------------
float		AI_ItemWeight(edict_t *ent, edict_t *item);
qboolean	AI_ItemIsReachable(edict_t *self,vec3_t goal);


// ai_movement.c
//----------------------------------------------------------
void		AI_ChangeAngle (edict_t *ent);
qboolean	AI_MoveToGoalEntity(edict_t *self, usercmd_t *ucmd);
qboolean	AI_SpecialMove(edict_t *self, usercmd_t *ucmd);
qboolean	AI_CanMove(edict_t *self, int direction);
qboolean	AI_IsLadder(vec3_t origin, vec3_t v_angle, vec3_t mins, vec3_t maxs, edict_t *passent);
qboolean	AI_IsStep (edict_t *ent);
//qboolean	AI_IsLadder(vec3_t origin, vec3_t v_angle, vec3_t mins, vec3_t maxs, edict_t *passent);


// ai_navigation.c
//----------------------------------------------------------
int			AI_FindCost(int from, int to, int movetypes);
int			AI_FindClosestReachableNode( vec3_t origin, edict_t *passent, int range, int flagsmask );
int			AI_FindClosestNode( vec3_t origin, float mindist, int range, int flagsmask );
void		AI_SetGoal(edict_t *self, int goal_node);
qboolean	AI_FollowPath(edict_t *self);


// ai_nodes.c
//----------------------------------------------------------
qboolean	AI_DropNodeOriginToFloor( vec3_t origin, edict_t *passent );
void		AI_InitNavigationData(void);
int			AI_FlagsForNode( vec3_t origin, edict_t *passent );
qboolean	AI_LoadPLKFile( char *mapname );

void		AITools_AddBotRoamNode_Cmd(void);
void		AITools_AddNode_Cmd(void);


// ai_tools.c
//----------------------------------------------------------
void		AIDebug_SetChased(edict_t *ent);
void		AITools_DrawPath(edict_t *self, int node_to);
void		AITools_DrawLine(vec3_t origin, vec3_t dest);
void		AITools_InitEditnodes( void );
void		AITools_InitMakenodes( void );
void		AITools_SaveNodes( void );

// ai_links.c
//----------------------------------------------------------
qboolean	AI_VisibleOrigins (vec3_t spot1, vec3_t spot2);
int			AI_LinkCloseNodes(void);
int			AI_FindLinkType(int n1, int n2);
qboolean	AI_AddLink( int n1, int n2, int linkType );
qboolean	AI_PlinkExists(int n1, int n2);
int			AI_PlinkMoveType(int n1, int n2);
int			AI_findNodeInRadius (int from, vec3_t org, float rad, qboolean ignoreHeight);
char		*AI_LinkString( int linktype );
int			AI_GravityBoxToLink(int n1, int n2);

//bot_status.c
//----------------------------------------------------------
qboolean	AI_CanPick_Ammo (edict_t *ent, gitem_t *item);
qboolean	AI_CanUseArmor (gitem_t *item, edict_t *other);
void		AI_BotRoamFinishTimeouts(edict_t *self);


//bot_classes
//----------------------------------------------------------
void		BOT_DMclass_InitPersistant(edict_t *self);
qboolean	BOT_ChangeWeapon (edict_t *ent, gitem_t *item);
void		M_default_Spawn (void);

//ai_weapons.c
//----------------------------------------------------------
void		AI_InitAIWeapons (void);

//ai_common.c
//----------------------------------------------------------
void		AI_SetUpAnimMoveFlags( edict_t *ent, usercmd_t *ucmd );
qboolean	AI_visible (edict_t *self, edict_t *other);
qboolean	AI_infront (edict_t *self, edict_t *other);
