You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
knights/knights/proto_uci.cpp

219 lines
5.2 KiB

/***************************************************************************
proto_uci.cpp - description
-------------------
begin : Sat Oct 26 2002
copyright : (C) 2003 by Troy Corbin Jr.
email : tcorbin@users.sf.net
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include <tqstringlist.h>
#include <tqregexp.h>
#include "proto_uci.moc"
#include "definitions.h"
proto_uci::proto_uci( const int ID ) : proto_base( ID )
{
hintMode = FALSE;
initMode = FALSE;
JustMoved = FALSE;
myArmy = BLACK;
Turn = WHITE;
CMDList = new CommandList;
}
proto_uci::~proto_uci()
{
delete CMDList;
}
///////////////////////////////////////
//
// proto_uci::parse( const Command &command )
//
///////////////////////////////////////
void proto_uci::parse( const Command &command )
{
Command cmd = command;
if( initMode )
{
CMDList->append( command );
return;
}
switch( cmd.getCommand() )
{
/* Command: Init */
case CMD_Init:
emit output( "uci" );
initMode = TRUE;
break;
/* Command: New Game */
case CMD_NewGame:
emit output( "isready" );
break;
/* Command: Exit */
case CMD_Exit:
emit output( "quit" );
break;
/* Command: Move */
case CMD_Move:
if( JustMoved )
{
JustMoved = FALSE;
break;
}
if( FEN.isEmpty() )
{
emit output( TQString("position startpos moves %1").arg( cmd.getData() ) );
}
else
{
emit output( TQString("position fen %1 moves %2").arg( FEN ).arg( cmd.getData() ) );
}
emit output( TQString("go wtime %1 btime %2 depth %3").arg( cmd.getWhiteTime() ).arg( cmd.getBlackTime() ).arg( difficulty ) );
break;
/* Command: Set Difficulty */
case CMD_Set_Difficulty:
difficulty = cmd.getData();
break;
/* Command: Set Board */
case CMD_Set_Board:
FEN = cmd.getData();
break;
/* Command: Move Now */
case CMD_MoveNow:
emit output( "stop" );
break;
/* Command: UCI Hint */
case CMD_UCI_Hint:
hintMode = TRUE;
if( FEN.isEmpty() )
{
emit output( TQString("position startpos moves %1").arg( cmd.getData() ) );
}
else
{
emit output( TQString("position fen %1 moves %2").arg( FEN ).arg( cmd.getData() ) );
}
emit output( TQString("go wtime %1 btime %2 depth %3").arg( cmd.getWhiteTime() ).arg( cmd.getBlackTime() ).arg( difficulty ) );
break;
/* Command: Play White */
case CMD_Play_White:
myArmy = WHITE;
break;
/* Command: Play Black */
case CMD_Play_Black:
myArmy = BLACK;
break;
/* Command: Set Name */
case CMD_Set_Name:
engineName = cmd.getData();
break;
}
}
///////////////////////////////////////
//
// proto_uci::parse( const TQString &string )
//
///////////////////////////////////////
void proto_uci::parse( const TQString &string )
{
TQString strIn = string;
TQStringList strList( TQStringList::split( ' ', strIn ) );
/* Bestmove */
if( strList[0] == "bestmove" )
{
if( strList.count() < 2 )
{
kdWarning() << "proto_uci::parse: Incomplete Bestmove command" << endl;
return;
}
Command::clearMove( &myMove );
strcpy( myMove.CAN, strList[1].latin1() );
if( hintMode )
{
/* The Engine Gives a Hint */
hintMode = FALSE;
// emit output( Command( myID, CMD_Hint, i18n( "%1 suggests this move:\n%2" ).arg( engineName ).arg( strList[1] ) ) );
emit output( Command( myID, CMD_Hint, TQString( "%1 suggests this move:\n%2" ).arg( engineName ).arg( strList[1] ) ) );
}
else
{
/* The Engine Moves */
JustMoved = TRUE;
emit output( Command( myID, CMD_Move, 0, 0, myMove ) );
}
}
/* UCIOK */
if( strList[0] == "uciok" )
{
initMode = FALSE;
releaseBuffer();
}
/* READYOK */
if( strList[0] == "readyok" )
{
initMode = FALSE;
releaseBuffer();
}
/* ID */
if( strList[0] == "id" )
{
if( strList[1] == "name" )
{
engineName = strIn.right( strIn.length() - 8 );
}
if( strList[1] == "author" )
{
engineAuthor = strIn.right( strIn.length() - 10 );
}
}
/* COPYPROTECTION */
if( strList[0] == "copyprotection" )
{
if( strList[1] == "error" )
{
// emit output( Command( myID, CMD_Tell_User_Error, i18n( "%1 did not pass it's copy protection check." ).arg( engineName ) ) );
emit output( Command( myID, CMD_Tell_User_Error, TQString( "%1 did not pass it's copy protection check." ).arg( engineName ) ) );
}
}
}
///////////////////////////////////////
//
// proto_uci::releaseBuffer
//
///////////////////////////////////////
void proto_uci::releaseBuffer( void )
{
CommandList::Iterator it;
for( it = CMDList->begin(); it != CMDList->end(); it++ )
{
parse( *it );
}
CMDList->clear();
}