/*! */ void CrossGenerator::updateReceivers( const WorldModel & wm ) { static const double shootable_dist2 = std::pow( 16.0, 2 ); // Magic Number static const double min_cross_dist2 = std::pow( ServerParam::i().defaultKickableArea() * 2.2, 2 ); static const double max_cross_dist2 = std::pow( inertia_n_step_distance( ServerParam::i().ballSpeedMax(), 9, ServerParam::i().ballDecay() ), 2 ); const Vector2D goal = ServerParam::i().theirTeamGoalPos(); const bool is_self_passer = ( M_passer->unum() == wm.self().unum() ); for ( AbstractPlayerCont::const_iterator p = wm.ourPlayers().begin(), end = wm.ourPlayers().end(); p != end; ++p ) { if ( *p == M_passer ) continue; if ( is_self_passer ) { if ( (*p)->isGhost() ) continue; if ( (*p)->posCount() >= 4 ) continue; if ( (*p)->pos().x > wm.offsideLineX() ) continue; } else { // ignore other players if ( (*p)->unum() != wm.self().unum() ) { continue; } } if ( (*p)->pos().dist2( goal ) > shootable_dist2 ) continue; double d2 = (*p)->pos().dist2( M_first_point ); if ( d2 < min_cross_dist2 ) continue; if ( max_cross_dist2 < d2 ) continue; M_receiver_candidates.push_back( *p ); #ifdef DEBUG_UPDATE_OPPONENT dlog.addText( Logger::CROSS, "Cross receiver %d pos(%.1f %.1f)", (*p)->unum(), (*p)->pos().x, (*p)->pos().y ); #endif } }
/*! */ void Strategy::updatePosition( const WorldModel & wm ) { static GameTime s_update_time( 0, 0 ); if ( s_update_time == wm.time() ) { return; } s_update_time = wm.time(); Formation::Ptr f = getFormation( wm ); if ( ! f ) { std::cerr << wm.teamName() << ':' << wm.self().unum() << ": " << wm.time() << " ***ERROR*** could not get the current formation" << std::endl; return; } int ball_step = 0; if ( wm.gameMode().type() == GameMode::PlayOn || wm.gameMode().type() == GameMode::GoalKick_ ) { ball_step = std::min( 1000, wm.interceptTable()->teammateReachCycle() ); ball_step = std::min( ball_step, wm.interceptTable()->opponentReachCycle() ); ball_step = std::min( ball_step, wm.interceptTable()->selfReachCycle() ); } Vector2D ball_pos = wm.ball().inertiaPoint( ball_step ); dlog.addText( Logger::TEAM, __FILE__": HOME POSITION: ball pos=(%.1f %.1f) step=%d", ball_pos.x, ball_pos.y, ball_step ); M_positions.clear(); f->getPositions( ball_pos, M_positions ); if ( ServerParam::i().useOffside() ) { double max_x = wm.offsideLineX(); if ( ServerParam::i().kickoffOffside() && ( wm.gameMode().type() == GameMode::BeforeKickOff || wm.gameMode().type() == GameMode::AfterGoal_ ) ) { max_x = 0.0; } else { int mate_step = wm.interceptTable()->teammateReachCycle(); if ( mate_step < 50 ) { Vector2D trap_pos = wm.ball().inertiaPoint( mate_step ); if ( trap_pos.x > max_x ) max_x = trap_pos.x; } max_x -= 1.0; } for ( int unum = 1; unum <= 11; ++unum ) { if ( M_positions[unum-1].x > max_x ) { dlog.addText( Logger::TEAM, "____ %d offside. home_pos_x %.2f -> %.2f", unum, M_positions[unum-1].x, max_x ); M_positions[unum-1].x = max_x; } } } M_position_types.clear(); for ( int unum = 1; unum <= 11; ++unum ) { PositionType type = Position_Center; if ( f->isSideType( unum ) ) { type = Position_Left; } else if ( f->isSymmetryType( unum ) ) { type = Position_Right; } M_position_types.push_back( type ); dlog.addText( Logger::TEAM, "__ %d home pos (%.2f %.2f) type=%d", unum, M_positions[unum-1].x, M_positions[unum-1].y, type ); dlog.addCircle( Logger::TEAM, M_positions[unum-1], 0.5, "#000000" ); } }
/*! */ double Strategy::get_normal_dash_power( const WorldModel & wm ) { static bool s_recover_mode = false; if ( wm.self().staminaModel().capacityIsEmpty() ) { return std::min( ServerParam::i().maxDashPower(), wm.self().stamina() + wm.self().playerType().extraStamina() ); } const int self_min = wm.interceptTable()->selfReachCycle(); const int mate_min = wm.interceptTable()->teammateReachCycle(); const int opp_min = wm.interceptTable()->opponentReachCycle(); // check recover if ( wm.self().staminaModel().capacityIsEmpty() ) { s_recover_mode = false; } else if ( wm.self().stamina() < ServerParam::i().staminaMax() * 0.5 ) { s_recover_mode = true; } else if ( wm.self().stamina() > ServerParam::i().staminaMax() * 0.7 ) { s_recover_mode = false; } /*--------------------------------------------------------*/ double dash_power = ServerParam::i().maxDashPower(); const double my_inc = wm.self().playerType().staminaIncMax() * wm.self().recovery(); if ( wm.ourDefenseLineX() > wm.self().pos().x && wm.ball().pos().x < wm.ourDefenseLineX() + 20.0 ) { dlog.addText( Logger::TEAM, __FILE__": (get_normal_dash_power) correct DF line. keep max power" ); // keep max power dash_power = ServerParam::i().maxDashPower(); } else if ( s_recover_mode ) { dash_power = my_inc - 25.0; // preffered recover value if ( dash_power < 0.0 ) dash_power = 0.0; dlog.addText( Logger::TEAM, __FILE__": (get_normal_dash_power) recovering" ); } // exist kickable teammate else if ( wm.existKickableTeammate() && wm.ball().distFromSelf() < 20.0 ) { dash_power = std::min( my_inc * 1.1, ServerParam::i().maxDashPower() ); dlog.addText( Logger::TEAM, __FILE__": (get_normal_dash_power) exist kickable teammate. dash_power=%.1f", dash_power ); } // in offside area else if ( wm.self().pos().x > wm.offsideLineX() ) { dash_power = ServerParam::i().maxDashPower(); dlog.addText( Logger::TEAM, __FILE__": in offside area. dash_power=%.1f", dash_power ); } else if ( wm.ball().pos().x > 25.0 && wm.ball().pos().x > wm.self().pos().x + 10.0 && self_min < opp_min - 6 && mate_min < opp_min - 6 ) { dash_power = bound( ServerParam::i().maxDashPower() * 0.1, my_inc * 0.5, ServerParam::i().maxDashPower() ); dlog.addText( Logger::TEAM, __FILE__": (get_normal_dash_power) opponent ball dash_power=%.1f", dash_power ); } // normal else { dash_power = std::min( my_inc * 1.7, ServerParam::i().maxDashPower() ); dlog.addText( Logger::TEAM, __FILE__": (get_normal_dash_power) normal mode dash_power=%.1f", dash_power ); } return dash_power; }