📄 setplay.cpp
字号:
#include "setplay.h"
#include "worldmodel.h"
#include "skill.h"
#include "log.h"
#include "agent.h"
#include "utils.h"
/***************** Set Play ****************************/
void Set_Play::AddRole(float attackness, float leftness, const Vector& pos){
roles[total_roles].attackness = attackness;
roles[total_roles].leftness = leftness;
roles[total_roles].strategical_pos = pos;
total_roles ++;
}
void Set_Play::AddRole(UNum No, const Vector& pos){
roles[total_roles].No = No;
roles[total_roles].strategical_pos = pos;
total_roles ++;
}
bool Set_Play::IsRole(UNum No){
int i;
for(i = 0; i< total_roles; i++){
if(No == roles[i].No) return true;
}
return false;
}
bool Set_Play::IsExecutor(UNum No){
return bool(No == Executor);
}
Vector Set_Play::GetSetPlayPos(UNum No){
int i;
for(i = 0; i< total_roles; i++){
if (No == roles[i].No){
return roles[i].strategical_pos;
}
}
return Vector(-1, -1);
}
Vector Set_Play::GetMySetPlayPos(){
return GetSetPlayPos(ClientParam::Number);
}
bool Set_Play::RecentSeen(){
return bool(situation.SightTime>situation.CurrentTime-2);
}
/******************** Before Kick Off **********************/
void BeforeKickOff::set_roles(){
total_roles=0;
Counter =0;
AddRole(1, Vector(-47.0f,0.0f));
AddRole(3, Vector(-25.0f,-12.0f));
AddRole(5, Vector(-25.0f,12.0f));
AddRole(2, Vector(-20.0f,20.0f));
AddRole(4, Vector(-20.0f,-20.0f));
AddRole(7, Vector( -5.0f,8.0f));
AddRole(8, Vector( -5.0f,-8.0f));
if (situation.kickoff_mode == KickOff_Mine)
{
AddRole(6, Vector(-15.0f,0.0f));
AddRole(10, Vector(-0.5f, 0.0f));
AddRole(9, Vector(-0.1f,18.0f));
AddRole(11,Vector(-0.1f,-18.0f));
}
else{
AddRole(6,Vector(-15.0f,0.0f));
AddRole(10, Vector(-10.0f, 0.0f));
AddRole(9, Vector(-0.5f,18.0f));
AddRole(11,Vector(-0.5f,-18.0f));
}
situation.ChangeSetPlay(SPST_Prego);
}
bool BeforeKickOff::within_range(Vector& pos){
return bool((Self.pos - pos).mod2() < 3);
}
void BeforeKickOff ::going(){
if (situation.IsSetPlayState(SPST_Initialize)){
set_roles();
}
Vector initialpos = GetMySetPlayPos();
if (!PitchInfo.WithInField(initialpos))
return;
if (!within_range(initialpos)){
if (fill_pos_move_time >= 8){
Skill::action.move(initialpos);
fill_pos_move_time = 0;
}
fill_pos_move_time ++;
}
/*
else{
if (fill_pos_turn_time >= 8){
AngleDeg angle = Self.pos.Angle() - Self.bodyfacing + 180;
angle = NormalizeAngle(angle);
if (fabs(angle) > 10){
Skill::action.turn(angle);
fill_pos_turn_time = 0;
}
}
else
Agent::motion.donothing();
fill_pos_turn_time ++;
}
Counter++;*/
}
void Newsetplay::CheckHeadingAndStamina()//检查队友是否正以正常速度向球移动
{ UNum i;
Vector meanvel,balldir;
for (i=2;i<=SP_team_size;i++)
{
if (Trackmark[i].x>ServerParam::pitch_length/2 || !MyPlayer(i).pos_valid())
{
HeadingToBall[i] = 1.0f - 2.0f * (situation.CurrentTime - situation.ModeChangedTime)/ ServerParam::drop_ball_time;
}
else
{
meanvel=MyPlayer(i).pos-Trackmark[i];
balldir=ball.pos-MyPlayer(i).pos;
if (balldir.mod()<1.0f)
HeadingToBall[i]=1.0f;
else
{
balldir.Normalize();
HeadingToBall[i]=
((meanvel.x*balldir.x+meanvel.y*balldir.y)/ClientParam::setplay_speed+1)/2;
}
}
pose_limitation(HeadingToBall[i],0,1);
if (MyPlayer(i).pos_valid())
Trackmark[i]=MyPlayer(i).pos;
else
Trackmark[i]=Vector(ServerParam::pitch_length,ServerParam::pitch_width);
}
}
UNum Newsetplay::JudgeExecutor()
{
Vector meanvel,balldir;
UNum i,select=Agent::MyNumber;
float min_pos_dis,min_cur_dis,player_i_pos_dis,player_i_cur_dis;
Vector ofpos;
if (situation.IsGoalieKick) return FieldParam::FP_goalie_number;
if (ball.kickable()) return Agent::MyNumber;
if (situation.playmode == PM_My_Kick_Off && Self.IsForward() && Self.IsMid())
return Agent::MyNumber;
if (Player::IsMyPlayer(situation.ballcontroller)&&(FieldInfo.mygoalie != situation.ballcontroller))
return situation.ballcontroller;
if (Counter%6==0&&Counter > 0) CheckHeadingAndStamina();
ofpos=formation.GetOffensivePoint(Self.attackness, Self.leftness, ball.pos);
min_pos_dis=ofpos.dist(ball.pos);
min_cur_dis=ball.distance;
for (i=2;i<=SP_team_size;i++)
if (i!=Agent::MyNumber)
{
if (HeadingToBall[i]<0.75) continue;
/*不考虑没有开球趋向的球员:
可能的原因:1。本来不应由他开球
2。该队员误判,故应由其它队员弥补
3。体力不足
*/
player_i_cur_dis=MyPlayer(i).pos.dist(ball.pos);
if (situation.CurrentTime - situation.ModeChangedTime < ServerParam::drop_ball_time/4)
{
ofpos=formation.GetOffensivePoint(FieldParam::FP_attackness[Idx(i)],FieldParam::FP_leftness[Idx(i)],ball.pos);
player_i_pos_dis=ofpos.dist(ball.pos);
if (player_i_pos_dis>1.2*min_pos_dis) continue;
//本位点明显比其它人离球近
if (min_pos_dis>1.2*player_i_pos_dis)
{
select=i;
min_pos_dis=player_i_pos_dis;
min_cur_dis=player_i_cur_dis;
}
else
{
//本位点离球差不多近,且现在所处距离明显近
if (player_i_cur_dis>1.2*min_cur_dis) continue;
if (min_cur_dis>1.2*player_i_cur_dis||i>select)//两者均相近,取号码大者
{
select=i;
min_pos_dis=player_i_pos_dis;
min_cur_dis=player_i_cur_dis;
}
}
}
else
{
if (player_i_cur_dis*1.1 < min_cur_dis || (min_cur_dis*1.1 > player_i_cur_dis && i>select))
{
select = i;
min_cur_dis=player_i_cur_dis;
}
}
}
return select;
}
bool Newsetplay::CanExecute(){
//moved out
return true;
}
void Newsetplay::AssistGo(){//接应跑动
/*假设向六个方向分别移动一定距离,估计可能得到的传球评价,与
当前位置的评价比较,若优于当前位置则移动*/
Agent::positioning.Offense();
if (FieldInfo.IsOffside())
return;
if (ball.distance<ServerParam::free_kick_buffer-Self.kickable_area||
situation.IsGoalieKick&&PitchInfo.my_penaltyarea.IsWithin(Self.pos))
{
DoLog(LOG_SETPLAY,"Assist going away");
if (situation.IsGoalieKick&&PitchInfo.my_penaltyarea.IsWithin(Self.pos))
{
if (Agent::MyNumber == 5 || Agent::MyNumber == 3)
Agent::motion.smartgoto(Self.pos+Vector(2,0),ClientParam::setplay_speed);
else if (Agent::MyNumber ==2)
Agent::motion.smartgoto(Self.pos+Vector(0,2),ClientParam::setplay_speed);
else if (Agent::MyNumber ==4)
Agent::motion.smartgoto(Self.pos+Vector(0,-2),ClientParam::setplay_speed);
else
Agent::motion.smartgoto(Self.pos+Polar2Vector(2,ball.global_angle+180),ClientParam::setplay_speed);
}
else
Agent::motion.smartgoto(Self.pos+Polar2Vector(2,ball.global_angle+180),ClientParam::setplay_speed);
return;
}
if (situation.IsGoalieKick)
{
if (Self.pos.x>ServerParam::penalty_area_length -ServerParam::semi_pitch_length+5.0f)
{
DoLog(LOG_SETPLAY,"Assist going just ahead");
Agent::motion.smartgoto(Self.pos-Vector(2,0),ClientParam::setplay_speed);
return;
}
}
else
{
if (ball.distance>ServerParam::unum_far_length-5.0f)
{
DoLog(LOG_SETPLAY,"Assist going just ahead");
Agent::motion.smartgoto(ball.pos,ClientParam::setplay_speed);
return;
}
}
}
bool Newsetplay::ShouldAssist(){
/*
接应条件:
自己与球连线附近一定方位内没有其他队员
*/
UNum i;
Line playerline;
Ray balltrack;
bool res=true;
Vector MyOfPos,TheirOfPos;
if (situation.IsSetPlayState(SPST_Initialize))
return false;
if (Executor==Agent::MyNumber) return false;
if (situation.IsGoalieKick)
{
/*if (Agent::MyNumber>1 && Agent::MyNumber<6) return true;
else return false;*/
return (Self.IsBack())&&(!Self.Is_goalie);
}
if (!ball.pos_valid()) return false;
MyOfPos = formation.GetOffensivePoint(Self.attackness,Self.leftness,ball.pos);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -