193 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //-----------------------------------------------------------------------------
 | |
| // Torque Game Engine
 | |
| // Copyright (C) GarageGames.com, Inc.
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| #include "game/aiConnection.h"
 | |
| 
 | |
| IMPLEMENT_CONOBJECT( AIConnection );
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| AIConnection::AIConnection() {
 | |
|    mAIControlled = true;
 | |
|    mMove = NullMove;
 | |
| }
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| void AIConnection::clearMoves( U32 )
 | |
| {
 | |
|    // Clear the pending move list. This connection generates moves
 | |
|    // on the fly, so there are never any pending moves.
 | |
| }
 | |
| 
 | |
| void AIConnection::setMove(Move* m)
 | |
| {
 | |
|    mMove = *m;
 | |
| }
 | |
| 
 | |
| const Move& AIConnection::getMove()
 | |
| {
 | |
|    return mMove;
 | |
| }
 | |
| 
 | |
| /// Retrive the pending moves
 | |
| /**
 | |
|  * The GameConnection base class queues moves for delivery to the
 | |
|  * controll object.  This function is normally used to retrieve the
 | |
|  * queued moves recieved from the client.  The AI connection does not
 | |
|  * have a connected client and simply generates moves on-the-fly
 | |
|  * base on it's current state.
 | |
|  */
 | |
| void AIConnection::getMoveList( Move **lngMove, U32 *numMoves )
 | |
| {
 | |
|    *numMoves = 1;
 | |
|    *lngMove = &mMove;
 | |
| }
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Console functions & methods
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| static inline F32 moveClamp(F32 v)
 | |
| {
 | |
|    // Support function to convert/clamp the input into a move rotation
 | |
|    // which only allows 0 -> M_2PI.
 | |
|    F32 a = mClampF(v,-M_PI,M_PI);
 | |
|    return (a < 0)? a + M_2PI: a;
 | |
| }
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| /// Construct and connect an AI connection object
 | |
| ConsoleFunction(aiConnect, S32 , 2, 20, "(...)"
 | |
|                 "Make a new AIConnection, and pass arguments to the onConnect script callback.")
 | |
| {
 | |
|    // Create the connection
 | |
|    AIConnection *aiConnection = new AIConnection();
 | |
|    aiConnection->registerObject();
 | |
| 
 | |
|    // Add the connection to the client group
 | |
|    SimGroup *g = Sim::getClientGroup();
 | |
|    g->addObject( aiConnection );
 | |
| 
 | |
|    // Prep the arguments for the console exec...
 | |
|    // Make sure and leav args[1] empty.
 | |
|    const char* args[21];
 | |
|    args[0] = "onConnect";
 | |
|    for (S32 i = 1; i < argc; i++)
 | |
|       args[i + 1] = argv[i];
 | |
| 
 | |
|    // Execute the connect console function, this is the same
 | |
|    // onConnect function invoked for normal client connections
 | |
|    Con::execute(aiConnection, argc + 1, args);
 | |
|    return aiConnection->getId();
 | |
| }
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| ConsoleMethod(AIConnection,setMove,void,4, 4,"(string field, float value)"
 | |
|               "Set a field on the current move.\n\n"
 | |
|               "@param   field One of {'x','y','z','yaw','pitch','roll'}\n"
 | |
|               "@param   value Value to set field to.")
 | |
| {
 | |
|    Move move = object->getMove();
 | |
| 
 | |
|    // Ok, a little slow for now, but this is just an example..
 | |
|    if (!dStricmp(argv[2],"x"))
 | |
|       move.x = mClampF(dAtof(argv[3]),-1,1);
 | |
|       else
 | |
|    if (!dStricmp(argv[2],"y"))
 | |
|       move.y = mClampF(dAtof(argv[3]),-1,1);
 | |
|       else
 | |
|    if (!dStricmp(argv[2],"z"))
 | |
|       move.z = mClampF(dAtof(argv[3]),-1,1);
 | |
|       else
 | |
|    if (!dStricmp(argv[2],"yaw"))
 | |
|       move.yaw = moveClamp(dAtof(argv[3]));
 | |
|       else
 | |
|    if (!dStricmp(argv[2],"pitch"))
 | |
|       move.pitch = moveClamp(dAtof(argv[3]));
 | |
|       else
 | |
|    if (!dStricmp(argv[2],"roll"))
 | |
|       move.roll = moveClamp(dAtof(argv[3]));
 | |
| 
 | |
|    //
 | |
|    object->setMove(&move);
 | |
| }
 | |
| 
 | |
| ConsoleMethod(AIConnection,getMove,F32,3, 3,"(string field)"
 | |
|               "Get the given field of a move.\n\n"
 | |
|               "@param field One of {'x','y','z','yaw','pitch','roll'}\n"
 | |
|               "@returns The requested field on the current move.")
 | |
| {
 | |
|    const Move& move = object->getMove();
 | |
|    if (!dStricmp(argv[2],"x"))
 | |
|       return move.x;
 | |
|    if (!dStricmp(argv[2],"y"))
 | |
|       return move.y;
 | |
|    if (!dStricmp(argv[2],"z"))
 | |
|       return move.z;
 | |
|    if (!dStricmp(argv[2],"yaw"))
 | |
|       return move.yaw;
 | |
|    if (!dStricmp(argv[2],"pitch"))
 | |
|       return move.pitch;
 | |
|    if (!dStricmp(argv[2],"roll"))
 | |
|       return move.roll;
 | |
|    return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| ConsoleMethod(AIConnection,setFreeLook,void,3, 3,"(bool isFreeLook)"
 | |
|               "Enable/disable freelook on the current move.")
 | |
| {
 | |
|    Move move = object->getMove();
 | |
|    move.freeLook = dAtob(argv[2]);
 | |
|    object->setMove(&move);
 | |
| }
 | |
| 
 | |
| ConsoleMethod(AIConnection,getFreeLook,bool,2, 2,"getFreeLook()"
 | |
|               "Is freelook on for the current move?")
 | |
| {
 | |
|    return object->getMove().freeLook;
 | |
| }
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| ConsoleMethod(AIConnection,setTrigger,void,4, 4,"(int trigger, bool set)"
 | |
|               "Set a trigger.")
 | |
| {
 | |
|    S32 idx = dAtoi(argv[2]);
 | |
|    if (idx >= 0 && idx < MaxTriggerKeys)  {
 | |
|       Move move = object->getMove();
 | |
|       move.trigger[idx] = dAtob(argv[3]);
 | |
|       object->setMove(&move);
 | |
|    }
 | |
| }
 | |
| 
 | |
| ConsoleMethod(AIConnection,getTrigger,bool,4, 4,"(int trigger)"
 | |
|               "Is the given trigger set?")
 | |
| {
 | |
|    S32 idx = dAtoi(argv[2]);
 | |
|    if (idx >= 0 && idx < MaxTriggerKeys)
 | |
|       return object->getMove().trigger[idx];
 | |
|    return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| ConsoleMethod(AIConnection,getAddress,const char*,2, 2,"")
 | |
| {
 | |
|    // Override the netConnection method to return to indicate
 | |
|    // this is an ai connection.
 | |
|    return "ai:local";
 | |
| }
 | 
