player.cpp

来自「2009 ROBOCUP 仿真2DSERVER 源码」· C++ 代码 · 共 2,189 行 · 第 1/5 页

CPP
2,189
字号
//                     PVector kick_noise( drand( -maxrnd, maxrnd ),//                                         drand( -maxrnd, maxrnd ) );//                     accel += kick_noise;//                 }                // akiyama 2008-01-30                // new kick noise                // [0.5, 1]                double pos_rate = 0.5 + 0.5*( 1.0 - prob );                // [0.5, 1]                double speed_rate                    = 0.5                    + 0.5 * ( M_stadium.ball().vel().r()                              / ( ServerParam::instance().ballSpeedMax()                                  * ServerParam::instance().ballDecay() ) );                // [0, 2*kick_rand]                double max_rand = M_kick_rand                    * power_rate                    * ( pos_rate + speed_rate );                PVector kick_noise = PVector::fromPolar( drand( 0.0, max_rand ),                                                         drand( -M_PI, M_PI ) );                accel += kick_noise;                M_stadium.kickTaken( *this, accel );            }            else            {                M_state |= ( TACKLE | TACKLE_FAULT );            }        }        else        {            M_state |= TACKLE_FAULT;        }    }}voidPlayer::clang( int min, int max ){    //    std::ostrstream resp;    //    resp << "(ok clang (ver " << min << " " << max << "))" << std::ends;    //    send( resp.str() );    //    resp.freeze( false );    M_clang_min_ver = min;    M_clang_max_ver = max;    sendOKClang();    if( M_team != NULL        && team()->olcoach() != NULL        && team()->olcoach()->assigned() )    {        M_team->olcoach()->sendPlayerClangVer( *this );    }}voidPlayer::ear( bool on,             rcss::pcom::TEAM team_side,             std::string team_name,             rcss::pcom::EAR_MODE mode ){    Side s = NEUTRAL;    if ( team_side == rcss::pcom::OUR )    {        s = side();    }    else if ( team_side == rcss::pcom::OPP )    {        s = static_cast< Side >( - side() );    }    else if ( team_side == rcss::pcom::LEFT_SIDE )    {        s = LEFT;    }    else if ( team_side == rcss::pcom::RIGHT_SIDE )    {        s = RIGHT;    }    else if ( team_name.length() > 0 )    {        if ( team_name == M_stadium.teamLeft().name() )        {            s = M_stadium.teamLeft().side();        }        else if ( team_name == M_stadium.teamRight().name() )        {            s = M_stadium.teamRight().side();        }        else        {            sendErrorNoTeamName( team_name );            //        std::ostrstream ostr;            //        ostr << "(error no team with name " << team_name << ")" << std::ends;            //        send( ostr.str() );            //        ostr.freeze( false );            return;        }    }    //std::cerr << "Ear:\n";    //std::cerr << "\tSide: " << ( side == LEFT ? "left" : "right" ) << std::endl;    bool partial = true;    bool complete = true;    if ( mode == rcss::pcom::PARTIAL )    {        complete = false;    }    else if ( mode == rcss::pcom::COMPLETE )    {        partial = false;    }    //std::cerr << "\tOn: " << on << std::endl;    //std::cerr << "\t\tPartial: " << partial << std::endl;    //std::cerr << "\t\tComplete: " << complete << std::endl;    setEar( on, s, complete, partial );}// 2008-02-09 akiyama// comand to change the see message timervoidPlayer::synch_see(){    //std::cerr << unum() << "  recv synch_see" << std::endl;    switch ( M_view_width ) {    case rcss::pcom::NARROW:        M_vis_angle = defangle * ( 2.0 / 3.0 ); // == sim_step / send_step        M_vis_send = 1;        break;    case rcss::pcom::NORMAL:        M_vis_angle = defangle * ( 4.0 / 3.0 ); // == 2 * sim_step / send_step        M_vis_send = 2;        break;    case rcss::pcom::WIDE:        M_vis_angle = defangle * ( 6.0 / 3.0 ); // == 3 * sim_step / send_step        M_vis_send = 3;        break;    default:        return;        break;    }    M_synch_see = true;    M_highquality = true;    // TODO: move to the Observer    send( "(ok synch_see)" );}voidPlayer::sendInit(){    M_init_observer->sendInit();    M_init_observer->sendServerParams();    M_init_observer->sendPlayerParams();    M_init_observer->sendPlayerTypes();    M_init_observer->sendChangedPlayers();}voidPlayer::sendReconnect(){    M_init_observer->sendReconnect();    M_init_observer->sendServerParams();    M_init_observer->sendPlayerParams();    M_init_observer->sendPlayerTypes();    M_init_observer->sendChangedPlayers();}voidPlayer::sendVisual(){    if ( ! M_synch_see )    {        M_observer->sendVisual();    }}voidPlayer::sendSynchVisual(){    if ( M_synch_see )    {        M_observer->sendVisual();    }}/* contributed by Artur Merke */voidPlayer::sendFullstate(){    M_fullstate_observer->sendFullState();}boolPlayer::setSenders(){    rcss::SerializerPlayer::Creator ser_cre;    if ( ! rcss::SerializerPlayer::factory().getCreator( ser_cre,                                                         (int)version() ) )    {        return false;    }    const rcss::SerializerPlayer * ser = ser_cre();    if ( ! ser )    {        return false;    }    rcss::BodySenderPlayer::Params body_params( getTransport(),                                                *this,                                                *ser );    rcss::BodySenderPlayer::Creator body_cre;    if ( ! rcss::BodySenderPlayer::factory().getCreator( body_cre,                                                         (int)version() ) )    {        return false;    }    M_body_observer->setBodySender( body_cre( body_params ) );    rcss::VisualSenderPlayer::Params visual_params( getTransport(),                                                    *this,                                                    *ser,                                                    M_stadium );    rcss::VisualSenderPlayer::Creator vis_cre;    if ( ! rcss::VisualSenderPlayer::factory().getCreator( vis_cre,                                                           (int)version() ) )    {        return false;    }    M_observer->setVisualSender( vis_cre( visual_params ) );    rcss::InitSenderPlayer::Params init_params( getTransport(),                                                *this,                                                *ser,                                                M_stadium );    rcss::InitSenderPlayer::Creator init_cre;    if ( ! rcss::InitSenderPlayer::factory().getCreator( init_cre,                                                         (int)version() ) )    {        return false;    }    M_init_observer->setInitSender( init_cre( init_params ) );    rcss::FullStateSenderPlayer::Params fs_params( getTransport(),                                                   *this,                                                   *ser,                                                   M_stadium );    rcss::FullStateSenderPlayer::Creator full_cre;    if ( ! rcss::FullStateSenderPlayer::factory().getCreator( full_cre,                                                              (int)version() ) )    {        return false;    }    M_fullstate_observer->setFullStateSender( full_cre( fs_params ) );    rcss::AudioSenderPlayer::Params audio_params( getTransport(),                                                  *this,                                                  *ser,                                                  M_stadium );    rcss::AudioSenderPlayer::Creator audio_cre;    if ( ! rcss::AudioSenderPlayer::factory().getCreator( audio_cre,                                                          (int)version() ) )    {        return false;    }    setAudioSender( audio_cre( audio_params ) );    return true;}voidPlayer::turnImpl(){    M_angle_body_committed = this->M_angle_body;    M_angle_neck_committed = this->M_angle_neck;    M_vel.assign( 0.0, 0.0 );    M_accel.assign( 0.0, 0.0 );}voidPlayer::updateAngle(){    M_angle_body_committed = this->M_angle_body;    M_angle_neck_committed = this->M_angle_neck;}voidPlayer::collidedWithPost(){    addState( POST_COLLIDE );    M_post_collide = true;}doublePlayer::maxAccel() const{    if ( pos().y < 0.0 )    {        return M_max_accel * ( M_team->side() == LEFT                               ? ServerParam::instance().slownessOnTopForLeft()                               : ServerParam::instance().slownessOnTopForRight() );    }    return M_max_accel;}doublePlayer::maxSpeed() const{    if ( pos().y < 0.0 )    {        return M_max_speed * ( M_team->side() == LEFT                               ? ServerParam::instance().slownessOnTopForLeft()                               : ServerParam::instance().slownessOnTopForRight() );    }    return M_max_speed;}voidPlayer::decrementHearCapacity( const Player & sender ){    if ( team() == sender.team() )    {        M_hear_capacity_from_teammate            -= ServerParam::instance().hearDecay();    }    else    {        M_hear_capacity_from_opponent            -= ServerParam::instance().hearDecay();    }}boolPlayer::canHearFullFrom( const Player & sender ) const{    if ( team() == sender.team() )    {        return M_hear_capacity_from_teammate            >= (int)ServerParam::instance().hearDecay();    }    else    {        return M_hear_capacity_from_opponent            >= (int)ServerParam::instance().hearDecay();    }}voidPlayer::recoverAll(){    M_stamina = ServerParam::instance().staminaMax();    M_recovery = 1.0;    M_effort = M_player_type->effortMax();    recoverStaminaCapacity();    M_consumed_stamina = 0.0;    M_hear_capacity_from_teammate = ServerParam::instance().hearMax();    M_hear_capacity_from_opponent = ServerParam::instance().hearMax();}voidPlayer::recoverStaminaCapacity(){    M_stamina_capacity = ServerParam::instance().staminaCapacity();}voidPlayer::updateStamina(){    const ServerParam & param = ServerParam::instance();    if ( M_stamina <= param.recoverDecThr() * param.staminaMax() )    {        if ( M_recovery > param.recoverMin() )        {            M_recovery -= param.recoverDec();        }        if ( M_recovery < param.recoverMin() )        {            M_recovery = param.recoverMin();        }    }    if ( M_stamina <= param.effortDecThr() * param.staminaMax() )    {        if ( M_effort > M_player_type->effortMin() )        {            M_effort -= param.effortDec();        }        if ( M_effort < M_player_type->effortMin() )        {            M_effort = M_player_type->effortMin();        }    }    if ( M_stamina >= param.effortIncThr() * param.staminaMax() )    {        if ( M_effort < M_player_type->effortMax() )        {            M_effort += param.effortInc();            if ( M_effort > M_player_type->effortMax() )            {                M_effort = M_player_type->effortMax();            }        }    }    //M_stamina += ( M_recovery * M_player_type->staminaIncMax() );    //if ( M_stamina > param.staminaMax() )    //{    //    M_stamina = param.staminaMax();    //}    double stamina_inc = std::min( M_recovery * M_player_type->staminaIncMax(),                                   param.staminaMax() - M_stamina );    if ( param.staminaCapacity() >= 0.0 )    {        i

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?