亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? interception.cpp

?? 2002年
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include "interception.h"
#include "strategy.h"
#include "worldmodel.h"
#include "skill.h"
#include "agent.h"
#include "log.h"
/***********************   Interception   *****************************************/
Interception::Interception(){
	setsmartit(false);
}

void Interception::SetITPlayer(Player* p){
	dash_rate = p->dash_power_rate * p->effort_max;
	if(!p->Is_goalie){
		kickarea = ServerParam::ball_size + p->player_size + p->kickable_margin;
		reliable_kickarea = (float)(int(kickarea*10)/10.0f);
	}else{
		kickarea = ServerParam::catch_area_l;
		reliable_kickarea = ServerParam::catch_area_l;
	}
	maxdash_effect = ServerParam::max_power * dash_rate * p->effort_max;
	rundash_power = ServerParam::max_power;
	max_speed = p->max_speed;
}

void Interception::SetSelfIT(){
	dash_rate = Skill::action.Dashrate();
	kickarea = ServerParam::ball_size + Self.player_size + Self.kickable_margin;
	reliable_kickarea = (float)(int(kickarea*10)/10.0f);
	maxdash_effect = Skill::action.Max_DashEffect();
	max_speed = Self.max_speed; 
	
	Command command;
	Agent::motion.run(Self.max_speed, command);
	rundash_power = command.power;
}

void Interception::prepare_intercept_info(const Vector& ballpos, const Vector& ballvel, const Vector& startpoint, const Vector& selfvel, float bdfacing){
	int i;
	ball_pos[0] = ballpos;	ball_vel[0] = ballvel; 
	ball_speed[0] = ball_vel[0].mod();
	ballangle = ballvel.Angle();
	for(i = 1; i <= IT_simulate_cycles; i++){
		ball_pos[i] = ball_pos[i-1] + ball_vel[i-1];
		ball_vel[i] = ball_vel[i-1] * ServerParam::ball_decay;
		ball_speed[i] = ball_speed[i-1] * ServerParam::ball_decay;
	}

	ballcourse.SetValues(ballpos, ballangle);
	Vector boderpoint;
	if(PitchInfo.shrinked_field.IsWithin(ballpos)){
		PitchInfo.shrinked_field.RayIntersection(ballcourse, boderpoint);
	}else{
		PitchInfo.field.RayIntersection(ballcourse, boderpoint);
	}	
	dist_2_bounder = ballpos.dist(boderpoint);

	max_ballmove = Min(dist_2_bounder, (float)MoveFormula(ball_speed[0], log(0.1/ball_speed[0])/log(ServerParam::ball_decay), ServerParam::ball_decay)+0.1f);
	
	player_pos[0] = startpoint;	player_vel[0] = selfvel; 
	for(i = 1; i < 3;i++){
		player_pos[i] = player_pos[i-1] + player_vel[i-1];
		player_vel[i] = player_vel[i-1] * ServerParam::player_decay;
	}
	bodyfacing = bdfacing;
}
//輸入為turn intercept 的截球狀況
//Return value: 是否需要smart intercept,(yes/smart
bool Interception::Is_smart_intercept(Vector* it_infs, unsigned char it_state){
	if(!Is_smartit_needed) return false;

	float IT_reserved_opp_cycles = 2.0f;
	if(Self.IsForward() && Self.IsMid()){
		IT_reserved_opp_cycles = 1.0f;
	}
		
	float IT_smart_ball_minvel = 0.9f;

	int idx = get_closest_it_index(it_state);

	//某些情況下不能或不需要smart intercept
	if(	it_infs[idx].y >= IT_simulate_cycles
		|| it_infs[idx].y > their_min_cycles - IT_reserved_opp_cycles	//對手逼近
		|| pow(ball_speed[1], it_infs[idx].y) < IT_smart_ball_minvel	//球速太慢
		|| it_infs[idx].x >= dist_2_bounder - IT_reserved_opp_cycles	//快出界了
		|| fabs(ballangle) > 60){										//球向后滾 
		return false;
	}

	float max_dist;
	//對手的限制
	max_dist = Min(max_ballmove, (float)MoveFormula(ball_speed[0], their_min_cycles - IT_reserved_opp_cycles, ServerParam::ball_decay));
	//邊界的限制
	max_dist = Min(max_dist, dist_2_bounder - IT_reserved_opp_cycles);
	//當不是直塞時, 不如直接朝前跑接球,不必往后讓
	if(fabs(ballangle) > 30){
		Line l;
		l.LineFromRay(ballcourse); 
		float x = l.get_x(player_pos[1].y);
		if(!ballcourse.InRightDir(Vector(x, player_pos[1].y))) return false;		
		max_dist = Min(max_dist, ballcourse.DistanceFromOrigin(Vector(x, player_pos[1].y)));
	} 
	
	max_dist += 0.001f;
	//max_dist = Min(max_dist, 0.5f*(ball_speed[0] + IT_smart_ball_minvel)*(ball_speed[0] - IT_smart_ball_minvel)/ServerParam::ball_decay);
	if(it_state == 6){
		if(it_infs[2].x > max_dist){
			//只有一個peakpoint點+后段IT時, 而且后段不好
			return false;
		}else{//只取后段
			it_state = 4;
			idx = 2;
		}
	}

	//it_infs[idx].x - max_dist
	Index<Vector, IT_simulate_cycles> values;
	int i = int(it_infs[idx].y+0.9f) + 1;
	int min_cycle = i;
	if(i > IT_simulate_cycles) return false;

	float max_turnagl = (float)fabs(Skill::action.Max_TurnAng()); 
	float dist = ball_pos[i].dist(ball_pos[0]);// (float)MoveFormula(ball_speed[0], i, ServerParam::ball_decay);
	Vector tmp;
	while(dist < max_dist && i < IT_simulate_cycles){
		while((it_state & 2) && i-1 >= it_infs[1].y && i-1 <= (int)it_infs[2].y){
			//有峰值點
			i ++;
			if(i > IT_simulate_cycles) break;
			dist += ball_speed[i-1];
		}
		if(i > IT_simulate_cycles) break;
		if(dist > max_dist) break;

		//確保能一次轉到, 否則不如等到下次再考慮更優的
		Vector gap = ball_pos[i]-player_pos[1];
		if(fabs(NormalizeAngle(gap.Angle() - bodyfacing)) < max_turnagl 
			|| gap.mod2() < kickarea ){
			tmp.x = (float)i;
			tmp.y = FieldInfo.GetOffensiveSensitivity(ball_pos[i]);
			if(fabs(NormalizeAngle((ball_pos[i] - player_pos[1]).Angle() - bodyfacing)) < 7){
				//鼓勵不轉身截球
				tmp.y += 0.03f;
			}
			//懲罰最近點的危險截球
			if(i == min_cycle)	tmp.y -= 0.02f;
			values.Add(tmp);
		}

		i ++;
		dist += ball_speed[i-1];
	}

	if(!values.IsEmpty()){
		int bestvalue = values.Num_datas() - 1 ;
		for(i = bestvalue - 1; i >= 0; i--){
			if(values.Data(i).y > values.Data(bestvalue).y){
				bestvalue = i;
			}
		}
		best_IT_cycle = (int)values.Data(bestvalue).x;
		return true;
	}else{
		return false;
	}
}

bool Interception::smart_intercept(int bestcycle, InterceptionInfo& inf){	
	inf.IT_point = ball_pos[bestcycle];
	inf.IT_cycles = (float)bestcycle;
	inf.IT_valid = true;
	inf.IT_is_closeball = true;

	Vector gap = ball_pos[bestcycle] - player_pos[1];
	float angle = gap.Angle();
	float dist = gap.mod();
	if(dist < kickarea){
		inf.IT_rapidness = 0;
		if(bestcycle < 2){
			inf.IT_angle = 0;
		}else{
			inf.IT_angle = IT_smartstay_angle;
		}
		return true;
	}
	float allow_angle_diff = Min(ASin(Min(kickarea, 1.0f)/dist), 35.0f);		
	if(fabs(NormalizeAngle(angle-bodyfacing) ) < Max(allow_angle_diff, 7.0f)){
		inf.IT_angle = 360.0f;
		inf.IT_rapidness = Min(dist/bestcycle + 0.2f, 1.0f);
		if (fabs(NormalizeAngle(player_vel[0].Angle() - bodyfacing))<90){
			inf.IT_dashpow = (inf.IT_rapidness - player_vel[0].mod()) / Skill::action.Dashrate();
		}else{
			inf.IT_dashpow = (inf.IT_rapidness +  player_vel[0].mod()) / Skill::action.Dashrate();
		}
	}else{
		//如果我沖一下, 是否還能夠得著球 //wait
		inf.IT_angle = angle;
		inf.IT_rapidness = 1.0f;
	}
	inf.IT_valid = true;
	inf.IT_is_closeball = true;
	return true;
}

//self intercept - deliberate consideration
void Interception::smart_self_intercept(const Vector& ballpos, const Vector& ballvel, 
		const Vector& startpoint, const Vector& selfvel, float bodyfacing, InterceptionInfo& inf){

	Vector it_infs[3], it_inf;
	unsigned char it_state;
//1) preparation step
	prepare_intercept_info(ballpos, ballvel, startpoint, selfvel, bodyfacing);
	playercourse.SetValues(startpoint, bodyfacing);

	float dash_miss =(max_speed - maxdash_effect)/maxdash_effect ;
	dash_miss = Min(dash_miss, 0.9f);
	set_intercept_param(kickarea - dash_miss, max_speed);	//reliable_kick_area

//2) turn - intercept 
	Vector rel_pos = player_pos[1] - ball_pos[1];
	rel_pos = rel_pos.Rotate(- ballangle);
	set_intercept_param(kickarea - dash_miss, max_speed);	//reliable_kick_area
	it_state = GT_speed_utils::calc_interception_solution(rel_pos, ball_speed[1], it_infs);
	DoLog(LOG_IT, "TurnIT %u (%.1f,%.1f)(%.1f,%.1f)(%.1f,%.1f) ", it_state, 
		it_infs[0].x, it_infs[0].y, it_infs[1].x, it_infs[1].y, it_infs[2].x, it_infs[2].y);
/*	
	simulate_one_dash_step(player_pos[0], ball_pos[0], player_vel[0],ball_vel[0],bodyfacing,100);
	simulate_one_dash_step(player_pos[0], ball_pos[0], player_vel[0],ball_vel[0],bodyfacing,0);
	rel_pos = player_pos[0] - ball_pos[0];
	rel_pos = rel_pos.Rotate(- ballangle);
	it_state = GT_speed_utils::calc_interception_solution(rel_pos, ball_speed[2], it_infs);
*/	
//3) smart intercept consideration
	if(Is_smart_intercept(it_infs, it_state)){
		//smart intercept
		if(best_IT_cycle > 1){
			smart_intercept(best_IT_cycle, inf);
			DoLog(LOG_IT, "smart it %d", best_IT_cycle);
			if(inf.IT_angle < 200){//turn it
				float dist = player_pos[1].dist(ball_pos[best_IT_cycle]); 
				if(dist + dash_miss > (best_IT_cycle-1)*max_speed){
					//maybe dangerous 
					InterceptionInfo no_turn_inf;	
					float distball_noturn;
					if(interception_test(ballcourse, playercourse, ball_speed[0], bodyfacing, distball_noturn, no_turn_inf) == IT_test_ok){
						if(no_turn_inf.IT_cycles <= best_IT_cycle && no_turn_inf.IT_cycles > 5){
							inf = no_turn_inf;
							DoLog("no turn fix for smart it");
							return;
						}else{
							//no turn intercept is false because getcloseballinterception is more accurate
						}
					}
				}
			}
			/*
			*/
			return;	
		}
	}

//4) close ball consideration
	Vector it_infs_noturn[3];
	unsigned char it_state_noturn;
	rel_pos = player_pos[0] - ball_pos[0];
	rel_pos = rel_pos.Rotate(- ballangle); 
	set_intercept_param(kickarea, max_speed);	//reliable_kick_area
	it_state_noturn = GT_speed_utils::calc_interception_solution(rel_pos, ball_speed[0], it_infs_noturn);
	int idx = GT_speed_utils::get_closest_it_index(it_state_noturn);
	if(it_infs_noturn[idx].y <= IT_closeball_max_cycles){//may exist close interception
		safecloseit = bool(their_min_cycles > IT_closeball_max_cycles+0.5f);
		adversary_cycles = (int)their_min_cycles;
		if(getcloseballinterceptioninfo(player_pos[0], ball_pos[0], player_vel[0], ball_vel[0], bodyfacing, inf)){
			//patches
			if(inf.IT_cycles == IT_closeball_max_cycles && inf.IT_angle < 200.0f && noturn_cycles > 0){//turn it
				if(noturn_cycles < adversary_cycles){
					inf.IT_angle = 360.0f;
					inf.IT_point = ball_pos[noturn_cycles];
					inf.IT_cycles = (float)noturn_cycles;
					inf.IT_is_closeball = true;
					inf.IT_dashpow = ServerParam::max_power;
					DoLog("no turn close ball fix %d", noturn_cycles);
				}
			}else if(inf.IT_cycles < 2 && fabs(NormalizeAngle(ball.TheirGoalAngle() - bodyfacing)) > 50){
				float gap = (ball_pos[1] - player_pos[1]).mod() ;
				if(gap > ServerParam::ball_size + Self.player_size + 0.1f && gap < reliable_kickarea - 0.1f){
					inf.IT_angle = ball.TheirGoalAngle();
					DoLog(LOG_IT, "close ball, turn fix");
				}
			}
			DoLog(LOG_IT, "close ball it %.2f", getball_dist);
			return;
		}
	}

//5) no turn intercept consideration
	float distball_noturn;
	if (interception_test(ballcourse, playercourse, ball_speed[0], bodyfacing, distball_noturn, inf) == IT_test_ok){
		if(inf.IT_cycles >= IT_closeball_max_cycles && inf.IT_cycles >= it_infs_noturn[idx].y ){			
			int idx = get_closest_it_index(it_state);
			inf.IT_cycles = Min(inf.IT_cycles, float(int(it_infs[idx].y + 0.999f)) + 1.0f);
			DoLog(LOG_IT, "no turn it");
			return;
		}else{
			//no turn intercept is false because getcloseballinterception is more accurate
		}
	}

//6) has to turn intercept now.
	inf.IT_valid = true;
	inf.IT_rapidness = GT_speed_utils::Player_Intercept_Speed();
	inf.IT_is_closeball = false;
	if(it_state & 1){
		it_inf = it_infs[0];
	}else if(it_state & 2){
		it_inf = it_infs[1];
		if(it_inf.y <= 4.0f && (it_state & 4)){
			//dangerous peakpoint
			it_inf = it_infs[2];
		}
	}else{
		it_inf = it_infs[2];
	}
	inf.IT_cycles = float(int(it_inf.y + 0.999f));
	inf.IT_cycles += 1.0f;	

	bool turn_more = false;
	if(their_min_cycles > inf.IT_cycles + 1){
		if(MoveFormula(ball_speed[0], inf.IT_cycles+1, ServerParam::ball_decay) < max_ballmove){
			DoLog(LOG_IT, "turn more");
			turn_more = true;
			inf.IT_cycles ++;
		}
	}

	if(inf.IT_cycles < IT_simulate_cycles){
		inf.IT_point = ball_pos[(int)inf.IT_cycles];
	}else{
		it_inf.x = (float)MoveFormula(ball_speed[0], inf.IT_cycles, ServerParam::ball_decay);
		Vector rel_it_pos = Vector(it_inf.x, 0);
		inf.IT_point = rel_it_pos.Rotate(ballangle) + ball_pos[0];
	}
	inf.IT_angle = (inf.IT_point - startpoint).Angle();
	DoLog(LOG_IT, "normal turn it");
	if(turn_more)	inf.IT_cycles --; 
}

void Interception::SetInterceptionInfo(bool reset){
	int i, j, num_my, num_their, num_total;

	num_my = FieldInfo.Num_MyVisiblePlayers();
	num_their = FieldInfo.Num_TheirVisiblePlayers();
	num_total = num_my + num_their;
	
	Vector ballpos, ballvel;
	if(!reset){
		ballpos = ball.Pos(Self.updated_sight_time);
		ballvel = ball.Vel(Self.updated_sight_time);
	}else{
		ballpos = ball.pos;
		ballvel = ball.global_vel; 
	}
	Time sight_gap = situation.CurrentTime - Self.updated_sight_time; 
	if(sight_gap != 0){
		DoLog(LOG_IT, "sight gap%d", sight_gap);
	}

	Player *p;
	for(i = 0; i < num_my; i ++){
		MyPlayers_Interception[i] = FieldInfo.MyVisiblePlayers[i];
	}	
	for(i =0; i < num_their; i ++){
		TheirPlayers_Interception[i] = FieldInfo.TheirVisiblePlayers[i];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲va韩国va欧美va精品| 亚洲九九爱视频| 精品视频一区二区不卡| 91影院在线免费观看| 成人免费高清视频| 高清不卡在线观看| 国产精品99久久久久久宅男| 久久 天天综合| 精品一区二区三区不卡| 国产中文一区二区三区| 国产精品一区二区三区网站| 国内精品在线播放| 韩国女主播成人在线| 国产精品一级片在线观看| 国产一区二区三区四区在线观看 | 毛片av一区二区| 日本伊人精品一区二区三区观看方式| 午夜精品久久久久久| 奇米综合一区二区三区精品视频| 久久国产人妖系列| 成人福利电影精品一区二区在线观看| 成人高清免费观看| 色欧美片视频在线观看在线视频| 日本精品裸体写真集在线观看| 91麻豆免费视频| 91精品国产综合久久久久久漫画| 精品国产精品一区二区夜夜嗨| 欧美韩国一区二区| 亚洲免费av在线| 日韩av在线免费观看不卡| 久久综合综合久久综合| 丰满白嫩尤物一区二区| 色婷婷激情综合| 日韩欧美激情在线| 18成人在线观看| 婷婷综合久久一区二区三区| 九九国产精品视频| av毛片久久久久**hd| 欧美日韩精品一区二区在线播放| 精品少妇一区二区三区| 国产精品高潮呻吟| 秋霞午夜鲁丝一区二区老狼| 粉嫩13p一区二区三区| 欧美色爱综合网| 久久精品一二三| 丝袜美腿高跟呻吟高潮一区| 粉嫩av一区二区三区粉嫩| 欧美日韩久久久| 中文字幕色av一区二区三区| 奇米精品一区二区三区在线观看| av爱爱亚洲一区| 久久女同性恋中文字幕| 亚洲一区二区三区自拍| 丁香六月久久综合狠狠色| 3atv一区二区三区| 亚洲精品久久嫩草网站秘色| 国产乱人伦偷精品视频不卡 | 亚洲一区在线观看免费观看电影高清 | 欧美午夜不卡在线观看免费| 久久精品一区二区三区不卡| 免费看欧美女人艹b| 在线视频你懂得一区| 欧美国产乱子伦 | 欧美精品一区二区三区很污很色的| 亚洲精品国产一区二区精华液 | 成人av在线一区二区三区| 日韩一区二区三| 亚洲国产美国国产综合一区二区| 粉嫩久久99精品久久久久久夜| 欧美mv日韩mv国产网站app| 午夜精品福利在线| 欧美在线观看你懂的| 日韩一区在线免费观看| 成人丝袜18视频在线观看| 久久久久久电影| 国产老妇另类xxxxx| 精品久久国产老人久久综合| 麻豆91在线观看| 91精品国产福利在线观看| 日韩中文欧美在线| 欧美一级搡bbbb搡bbbb| 日韩av电影免费观看高清完整版在线观看| 欧美在线短视频| 亚洲一区二区四区蜜桃| 欧美久久久一区| 免费在线观看成人| 精品精品欲导航| 国产精品99久久久久久宅男| 国产日韩欧美制服另类| 成人美女视频在线观看18| 国产精品高清亚洲| 91国偷自产一区二区开放时间 | 精品奇米国产一区二区三区| 免费亚洲电影在线| 精品成人a区在线观看| 国产麻豆日韩欧美久久| 中文字幕精品一区| 色婷婷久久久综合中文字幕 | 天堂蜜桃91精品| 精品国产一区二区在线观看| 国产精品69久久久久水密桃| 中文字幕一区二区三区蜜月| 欧美专区日韩专区| 免费观看久久久4p| 国产精品国产馆在线真实露脸| 色国产综合视频| 麻豆视频一区二区| 一区精品在线播放| 91麻豆精品国产自产在线观看一区| 久久99九九99精品| 中文字幕 久热精品 视频在线 | 日日夜夜精品视频免费| 精品国产91乱码一区二区三区| jizz一区二区| 日本在线不卡视频| 国产精品乱码久久久久久| 欧美吞精做爰啪啪高潮| 国内久久婷婷综合| 亚洲一二三区在线观看| 久久综合五月天婷婷伊人| 色综合久久中文字幕综合网 | 久久精品在这里| 欧美视频精品在线| 国产福利91精品| 日韩在线观看一区二区| 日韩一区日韩二区| 精品欧美一区二区久久| 91国模大尺度私拍在线视频| 国产一区二三区好的| 午夜一区二区三区视频| 亚洲欧洲三级电影| 久久亚洲捆绑美女| 欧美精品久久久久久久多人混战| 成人一级视频在线观看| 理论电影国产精品| 亚洲国产成人porn| 亚洲素人一区二区| 中文字幕不卡在线观看| 欧美r级在线观看| 制服丝袜在线91| 在线精品视频免费观看| 色综合一区二区三区| 国产不卡高清在线观看视频| 美女精品自拍一二三四| 丝瓜av网站精品一区二区| 中文字幕一区二区不卡| 中文无字幕一区二区三区| 久久先锋影音av鲁色资源| 777亚洲妇女| 日韩一卡二卡三卡国产欧美| 欧美午夜不卡视频| 欧美专区日韩专区| 色综合久久六月婷婷中文字幕| 国产91丝袜在线播放九色| 国产一二三精品| 国产一区福利在线| 国产精品99久久久久久似苏梦涵| 久久成人免费电影| 经典一区二区三区| 精品亚洲免费视频| 国产一区二区久久| 国产精品911| 成人av在线电影| av在线不卡观看免费观看| 99久久精品国产麻豆演员表| 成人开心网精品视频| 国产91精品一区二区麻豆网站| 国产电影一区在线| 99精品视频在线观看| 色欧美88888久久久久久影院| 色婷婷综合激情| 欧美精品久久久久久久多人混战| 欧美另类videos死尸| 欧美一级理论性理论a| wwwwww.欧美系列| 国产精品女同一区二区三区| 中文字幕在线观看不卡视频| 亚洲男人的天堂在线aⅴ视频| 亚洲一区成人在线| 麻豆精品一区二区三区| 国产成人小视频| 色综合久久久久久久久久久| 欧美精品在线观看一区二区| 精品剧情在线观看| 最近日韩中文字幕| 天天免费综合色| 狠狠网亚洲精品| 91论坛在线播放| 91麻豆精品国产无毒不卡在线观看 | 高清不卡一二三区| 日本高清不卡一区| ww亚洲ww在线观看国产| 亚洲欧洲综合另类在线| 美女国产一区二区三区| 成人一区二区三区视频在线观看| 欧美日韩三级在线| 国产精品麻豆欧美日韩ww| 日精品一区二区| 91麻豆蜜桃一区二区三区| 精品国内二区三区|