player.cpp
来自「2009 ROBOCUP 仿真2DSERVER 源码」· C++ 代码 · 共 2,189 行 · 第 1/5 页
CPP
2,189 行
// -*-c++-*-/*************************************************************************** player.cpp A class for field players and goalies ------------------- begin : 26-NOV-2001 copyright : (C) 2001, 2002 by The RoboCup Soccer Server Maintenance Group. email : sserver-admin@lists.sourceforge.net***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU LGPL as published by the Free Software * * Foundation; either version 2 of the License, or (at your option) any * * later version. * * * ***************************************************************************/#ifdef HAVE_CONFIG_H#include <config.h>#endif#include "player.h"#include "coach.h"#include "field.h"#include "team.h"#include "types.h"#include "random.h"#include "referee.h"#include "heteroplayer.h"#include "serverparam.h"#include "playerparam.h"#include "utility.h"#include "serializer.h"#include "initsenderplayer.h"#include "bodysender.h"#include "fullstatesender.h"#include "visualsenderplayer.h"#include <algorithm>#include <cassert>#ifdef HAVE_SSTREAM#include <sstream>#else#include <strstream>#endifnamespace {inlinedoubleNormalizeDashPower( const double & p ){// return rcss::bound( ServerParam::instance().minPower(),// p,// ServerParam::instance().maxPower() ); return rcss::bound( ServerParam::instance().minDashPower(), p, ServerParam::instance().maxDashPower() );}inlinedoubleNormalizeDashAngle( const double & p ){ return rcss::bound( ServerParam::instance().minDashAngle(), p, ServerParam::instance().maxDashAngle() );}inlinedoubleNormalizeKickPower( const double & p ){ return rcss::bound( ServerParam::instance().minPower(), p, ServerParam::instance().maxPower() );}// For v11 or older versioninlinedoubleNormalizeTacklePower( const double & p ){ return rcss::bound( - ServerParam::instance().maxBackTacklePower(), p, ServerParam::instance().maxTacklePower() );}inlinedoubleNormalizeMoment( const double & p ){ return Deg2Rad( rcss::bound( ServerParam::instance().minMoment(), p, ServerParam::instance().maxMoment() ) );}inlinedoubleNormalizeNeckMoment( const double & p ){ return Deg2Rad( rcss::bound( ServerParam::instance().minNeckMoment(), p, ServerParam::instance().maxNeckMoment() ) );}inlinedoubleNormalizeNeckAngle( const double & p ){ return rcss::bound( Deg2Rad( ServerParam::instance().minNeckAngle() ), p, Deg2Rad( ServerParam::instance().maxNeckAngle() ) );}} // end of no-name namespacePlayer::Player( Stadium & stadium, Team * team, int number ) : MPObject( stadium, "", "", O_TYPE_PLAYER_NAME, O_TYPE_PLAYER_NAME_SHORT ), M_init_observer( new rcss::InitObserverPlayer ), M_observer( new rcss::ObserverPlayer ), M_body_observer( new rcss::BodyObserverPlayer ), M_fullstate_observer( new rcss::FullStateObserver ), M_team( team ), M_side( team->side() ), M_unum( number ), M_stamina( ServerParam::instance().staminaMax() ), M_recovery( ServerParam::instance().recoverInit() ), M_stamina_capacity( ServerParam::instance().staminaCapacity() ), M_consumed_stamina( 0.0 ), M_vis_angle( ServerParam::instance().visibleAngle() ), M_view_width( rcss::pcom::NORMAL ), defangle( ServerParam::instance().visibleAngle() ), vis_distance( ServerParam::instance().visibleDistance() ), vis_distance2( vis_distance * vis_distance ), M_version( 3.0 ), M_unum_far_length( 20.0 ), M_unum_too_far_length( 40.0 ), M_team_far_length( 40.0 ), M_team_too_far_length( 60.0 ), M_angle_body( 0.0 ), M_angle_body_committed( 0.0 ), M_angle_neck( 0.0 ), M_angle_neck_committed( 0.0 ), M_synch_see( false ), M_vis_send( 4 ), M_highquality( true ), M_state( DISABLE ), M_ball_collide( false ), M_player_collide( false ), M_post_collide( false ), M_command_done( false ), M_turn_neck_done( false ), M_done_received( false ), M_hear_capacity_from_teammate( ServerParam::instance().hearMax() ), M_hear_capacity_from_opponent( ServerParam::instance().hearMax() ), M_goalie( false ), M_goalie_catch_ban( 0 ), M_goalie_moves_since_catch( 0 ), M_kick_cycles( 0 ), M_kick_count( 0 ), M_dash_count( 0 ), M_turn_count( 0 ), M_catch_count( 0 ), M_move_count( 0 ), M_turn_neck_count( 0 ), M_change_view_count( 0 ), M_say_count( 0 ), M_arm( ServerParam::instance().pointToBan(), ServerParam::instance().pointToDuration() ), M_attentionto_count( 0 ), M_tackle_cycles( 0 ), M_tackle_count( 0 ), M_clang_min_ver( 0 ), M_clang_max_ver( 0 ), M_offside_mark( false ), M_parser( *this ){ assert( team ); M_enable = false; M_weight = ServerParam::instance().playerWeight(); M_max_speed = ServerParam::instance().playerSpeedMax(); M_max_accel = ServerParam::instance().playerAccelMax(); M_pos.x = -( unum() * 3 * team->side() ); M_pos.y = - ServerParam::PITCH_WIDTH/2.0 - 3.0; // pfr 8/14/00: for RC2000 evaluation M_kick_rand = ServerParam::instance().kickRand(); setPlayerType( 0 ); M_effort = M_player_type->effortMax();}Player::~Player(){#if 0 if ( ! isGoalie() ) { std::cerr << M_team->name() << ',' << unum() << ',' << M_player_type->staminaIncMax() << ',' << M_player_type->staminaIncMax() * 3000 << ',' << M_consumed_stamina;// << " dash_count = " << M_dash_count;// if ( M_dash_count > 0 )// {// std::cerr << " consumed_stamina/dash = " << M_consumed_stamina / M_dash_count;// } std::cerr << std::endl; }#endif delete M_init_observer; M_init_observer = NULL; delete M_observer; M_observer = NULL; delete M_body_observer; M_body_observer = NULL; delete M_fullstate_observer; M_fullstate_observer = NULL;}boolPlayer::init( const double & ver, const bool goalie ){ M_version = ver; M_goalie = goalie; setEnable(); M_goalie_catch_ban = 0; M_goalie_moves_since_catch = 0; { char lname[128], sname[128]; snprintf( lname, 128, PLAYER_NAME_FORMAT, team()->name().c_str(), unum() ); snprintf( sname, 128, PLAYER_NAME_FORMAT_SHORT, team()->name().c_str(), unum(), isGoalie() ? GOALIE_VISUAL_STRING : "" ); setName( lname, sname ); } char buf[128]; snprintf( buf, 128, PLAYER_NAME_FAR_FORMAT, team()->name().c_str() ); M_name_far = buf; snprintf( buf, 128, PLAYER_NAME_TOOFAR_FORMAT ); M_name_toofar = buf; snprintf( buf, 128, PLAYER_NAME_FAR_FORMAT_SHORT, team()->name().c_str() ); M_short_name_far = buf; snprintf( buf, 128, PLAYER_NAME_TOOFAR_FORMAT_SHORT ); M_short_name_toofar = buf; M_angle_body_committed = SideDirection( side() ); // pfr 8/14/00: for RC2000 evaluation double my_prand = ServerParam::instance().playerRand(); if ( ServerParam::instance().teamActuatorNoise() ) { my_prand *= team()->prandFactorTeam(); M_kick_rand *= team()->kickRandFactorTeam(); } M_randp = my_prand;#ifdef NEW_QSTEP dist_qstep_player = team->distQstepTeam(); land_qstep_player = team->landQstepTeam(); dir_qstep_player = team->dirQstepTeam();#endif if ( ! setSenders() ) { disable(); std::cerr << "Error: Could not find serializer or sender for version " << version() << std::endl; return false; } return true;}voidPlayer::setPlayerType( const int id ){ const HeteroPlayer * type = M_stadium.playerType( id ); if ( ! type ) { return; } M_player_type_id = id; M_player_type = type; M_max_speed = M_player_type->playerSpeedMax(); M_inertia_moment = M_player_type->inertiaMoment(); M_decay = M_player_type->playerDecay(); M_size = M_player_type->playerSize(); M_kick_rand = M_player_type->kickRand(); if ( ServerParam::instance().teamActuatorNoise() ) { M_kick_rand *= team()->kickRandFactorTeam(); }}voidPlayer::substitute( const int type ){ setPlayerType( type ); // reset stamina etc. M_stamina = ServerParam::instance().staminaMax(); M_recovery = 1.0; M_effort = M_player_type->effortMax(); M_stamina_capacity = ServerParam::instance().staminaCapacity(); M_consumed_stamina = 0.0; M_hear_capacity_from_teammate = ServerParam::instance().hearMax(); M_hear_capacity_from_opponent = ServerParam::instance().hearMax();}voidPlayer::setEnable(){ M_state = STAND; M_enable = true; if ( isGoalie() ) { M_state |= GOALIE; }}voidPlayer::resetState(){ if ( tackleCycles() > 0 ) { M_state &= ( STAND | GOALIE | DISCARD | TACKLE | TACKLE_FAULT ); } else { M_state &= ( STAND | GOALIE | DISCARD ); }}voidPlayer::disable(){ if ( M_enable ) { std::cout << "A player disconnected : (" << team()->name() << " " << unum() << ")\n"; } if ( isGoalie() && this == M_stadium.ballCatcher() ) { M_stadium.clearBallCatcher(); } M_enable = false; M_state = DISABLE; M_pos.x = -( unum() * 3 * side() ); M_pos.y = - ServerParam::PITCH_WIDTH/2.0 - 3.0; M_vel.x = 0.0; M_vel.y = 0.0; M_accel.x = 0.0; M_accel.y = 0.0; if ( connected() ) { RemoteClient::close(); }}voidPlayer::discard(){ if ( M_state & STAND ) { disable(); if ( ! ( M_state & DISCARD ) ) { M_state |= DISCARD; } else { M_state &= ~DISCARD; } }}voidPlayer::parseMsg( const char * msg, const size_t & len ){ char * command = const_cast< char * >( msg ); if ( command[ len - 1 ] != 0 ) { if ( version() >= 8.0 ) { send( "(warning message_not_null_terminated)" ); } command[ len ] = 0; } M_stadium.logger().writePlayerLog( *this, command, RECV ); /** Call the PlayerCommandParser */ if ( M_parser.parse( command ) != 0 ) //if ( ! parseCommand( command ) ) { send( "(error illegal_command_form)" ); std::cerr << "Error parsing >" << command << "<\n"; }}boolPlayer::parseCommand( const char * command ){ const char * buf = command; int n_read = 0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?