⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sensory.cpp

📁 RoboCup仿真组世界冠军源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	SP_catch_ban_cycle = get_int(&SensoryInfo);
	SP_slow_down_factor = get_float(&SensoryInfo);
	SP_use_offside = get_int(&SensoryInfo) == 1;
	SP_forbid_kickoff_offside = get_int(&SensoryInfo) == 1;
	SP_offside_kick_margin = get_float(&SensoryInfo);
	SP_audio_cut_dist = get_float(&SensoryInfo);
	SP_dist_qstep = get_float(&SensoryInfo);
	SP_land_qstep = get_float(&SensoryInfo);
	SP_dir_qstep = get_float(&SensoryInfo);
	SP_dist_qstep_l = get_float(&SensoryInfo);
	SP_dist_qstep_r = get_float(&SensoryInfo);
	SP_land_qstep_l = get_float(&SensoryInfo);
	SP_land_qstep_r = get_float(&SensoryInfo);
	SP_dir_qstep_l = get_float(&SensoryInfo);
	SP_dir_qstep_r = get_float(&SensoryInfo);
	SP_coach_mode = get_int(&SensoryInfo) == 1;
	SP_coach_w_referee_mode = get_int(&SensoryInfo) == 1;
	SP_old_hear = get_int(&SensoryInfo) == 1;
	SP_sv_step = get_int(&SensoryInfo);
}

void Sensory::Parse_PlayerParams(char *SensoryInfo){

}

void Sensory::Parse_PlayerTypes(char *SensoryInfo){
	int id = get_int(&SensoryInfo);
	playertypes[id].player_speed_max = get_float(&SensoryInfo);
	playertypes[id].stamina_inc_max = get_float(&SensoryInfo);
	playertypes[id].player_decay = get_float(&SensoryInfo);
	playertypes[id].inertia_moment = get_float(&SensoryInfo);
	playertypes[id].dash_power_rate = get_float(&SensoryInfo);
	playertypes[id].player_size = get_float(&SensoryInfo);
	playertypes[id].kickable_margin = get_float(&SensoryInfo);
	playertypes[id].kick_rand = get_float(&SensoryInfo);
	playertypes[id].extra_stamina = get_float(&SensoryInfo);
	playertypes[id].effort_max = get_float(&SensoryInfo);
	playertypes[id].effort_min = get_float(&SensoryInfo);
}

void Sensory::Parse_Trainer_Sound(char *msg){
	get_word(&msg);
	if (strncmp(msg, "Prepare_to_train", 16) == 0){
		Prepare_to_train = true;
	}
}

void Sensory::Parse_Referee_Sound(char *msg)
{
    printf("Referee sound: <%s \n", msg);
	msg[strlen(msg) - 2] = 0; /* cut off the newline and paren */
    
	switch( msg[0] ){
	case 'p': situation.HearMode(PM_Play_On); break;           /* play_on */
	case 'k': 
    if ( msg[5] == 'i' ){                                  /* kick_in */
      if ( msg[8] == situation.MySide )
		  situation.HearMode(PM_My_Kick_In);
	  else if ( msg[8] == situation.TheirSide )
		  situation.HearMode(PM_Their_Kick_In);
      else 
		  my_error("kick_in_?");
    }
	else if ( msg[5] == 'o' ){                            /* kick_off */
		if ( msg[9] == situation.MySide )
			situation.HearMode(PM_My_Kick_Off);
		else if ( msg[9] == situation.TheirSide )
			situation.HearMode(PM_Their_Kick_Off);
		else 
			my_error("kick_off_?");
    }
    else
		my_error("referee k..?");
    break;
	case 'g': 
		if ( msg[5] == 'k' ){                                 /* goal_kick */
			if ( msg[10] == situation.MySide )
				situation.HearMode(PM_My_Goal_Kick);
			else if ( msg[10] == situation.TheirSide )
				situation.HearMode(PM_Their_Goal_Kick);
			else 
				my_error("goal_kick_?");
		}
		else if ( msg[5] == 'e' ){                           /* goalie_catch_ball */
			if ( msg[18] == situation.MySide )
				situation.HearMode(PM_My_Goalie_Free_Kick);
			else if ( msg[18] == situation.TheirSide )
				situation.HearMode(PM_Their_Goalie_Free_Kick);
			else
				my_error("goalie_catch_ball_?");
		}
		else if ( msg[5] == situation.MySide ){                    /* goal */
			situation.UpdateScore(situation.MySide);
			situation.SetKickOffMode(KickOff_Theirs);
			situation.HearMode(PM_Before_Kick_Off);
		}
		else if ( msg[5] == situation.TheirSide ){
			situation.UpdateScore(situation.TheirSide);
			situation.SetKickOffMode(KickOff_Mine);
			situation.HearMode(PM_Before_Kick_Off);
		}
		else 
			my_error("referee g..?");
		break;
	case 'c':                                               /* corner_kick */
		if ( msg[12] == situation.MySide )
			situation.HearMode(PM_My_Corner_Kick);
		else if ( msg[12] == situation.TheirSide )
			situation.HearMode(PM_Their_Corner_Kick);
		else 
			my_error("corner_kick_?");
		break;
	case 'd': situation.HearMode(PM_Drop_Ball); break;        /* drop_ball */    
	case 'o':                                               /* offside */    
    if ( msg[8] == situation.MySide )
		situation.HearMode(PM_Their_Offside_Kick);
    else if ( msg[8] == situation.TheirSide )
		situation.HearMode(PM_My_Offside_Kick);
    else 
		my_error("offside_?");
    break;
	case 'f':
		if ( msg[5] == 'k' ){                                 /* free_kick */
			if ( msg[10] == situation.MySide )
				situation.HearMode(PM_My_Free_Kick);
			else if ( msg[10] == situation.TheirSide )
				situation.HearMode(PM_Their_Free_Kick);
			else 
				my_error("free_kick_?");
		}
		else if ( msg[5] == situation.MySide )                     /* foul */
      ;
    else if ( msg[5] == situation.TheirSide )
      ;
    else 
		my_error("referee f..?");
    break;
	case 'h':                                               /* half_time */
		situation.HearMode(PM_Half_Time);  /* play_mode to before_kick_off        */
		if ( situation.MySide == 'l' )
			situation.SetKickOffMode(KickOff_Theirs);
		else 
			situation.SetKickOffMode(KickOff_Mine);
		break;             
	case 'b': situation.HearMode(PM_Before_Kick_Off); break;       /* before_kick_off */
	case 't': 
		if ( msg[5] == 'u' ){                             /* time_up */
			situation.HearMode(PM_Time_Up); 
		}
		else if ( msg[5] == 'o' )                             /* time_over */
		{
			break;
		}
		else if ( msg[5] == 'e' ){                            /* time_extended */
			situation.HearMode(PM_Extended_Time);
			if ( situation.MySide == 'l' )
				situation.SetKickOffMode(KickOff_Mine);
			else 
				situation.SetKickOffMode(KickOff_Theirs);
		} 
		else 
			my_error("referee t..?");
		break;
	default: my_error("Referee msg ????");
    }
}

void Sensory::Parse_initialize_message(char *recvbuf){
	char mode[100];
	if ( !(strncmp(recvbuf,"(init",4)) ) {
    /* It's an init msg */
		sscanf(recvbuf,"(init %c %d %[^)]",&situation.MySide, &MyNumber, mode);
		if (situation.MySide == 'r'){
			situation.TheirSide = 'l';
			MyGoal = Goal_R;
			TheirGoal = Goal_L;
		}
		else{
			situation.TheirSide = 'r';
			MyGoal = Goal_L;
			TheirGoal = Goal_R;
		}

		ServerAlive = 1;
	}
	else if ( !(strncmp(recvbuf,"(reconnect",4)) ) {
    /* It's a reconnect msg */
		sscanf(recvbuf,"(reconnect %c %[^)]",&situation.MySide, mode);
		MyNumber = IP_reconnect;
		printf("reconnecting to %d on side %c!\n",MyNumber,situation.MySide);
		if (situation.MySide == 'r'){
			situation.TheirSide = 'l';
			MyGoal = Goal_R;
			TheirGoal = Goal_L;
		}
		else{
			situation.TheirSide = 'r';
			MyGoal = Goal_L;
			TheirGoal = Goal_R;
		}

		ServerAlive = 1;
	}
	else {
		my_error("Didn't get an init message: '%s')",recvbuf);
		ServerAlive = 0;
		PostMessage(hWND, WM_DESTROY, 0, 0);
	}

	if ( CP_goalie && FP_goalie_number != MyNumber )
		my_error("goalie number inconsistent with me being goalie");

	if ( !CP_goalie && FP_goalie_number == MyNumber )
		my_error("I should be the goalie");

	if ( mode[0] == 'b' ){ /* Before_kick_off */ 
		situation.HearMode(PM_Before_Kick_Off);
		if ( situation.MySide == 'l' )
			situation.SetKickOffMode(KickOff_Mine);
		else 
			situation.SetKickOffMode(KickOff_Theirs);
	}
	else                  /* Act as if the game's in progress */
		situation.HearMode(PM_Play_On);
}

/********************Set Sensed Infomation******************************************/

void Sensory::SetMySensedInfo(VIEWWIDTH viewidth, VIEWQUALITY viewqual, float stamina,float effort,float speed,AngleDeg rel_spd_angle,
	AngleDeg head_angle,int kicks,int dashes,int turns,int says,int turn_necks,Time time){
	if ( LastSenseTime == time && !situation.ClockStopped)
		return;

	PrevSenseTime = LastSenseTime;
	LastSenseTime = time;

	latestsenseinfo = !latestsenseinfo;
	sensebodyinfo[latestsenseinfo].setvalues(viewidth, viewqual, stamina,effort,speed,rel_spd_angle,head_angle,kicks,dashes,
							                  turns,says,turn_necks,time);
}

SenseBodyInfo& Sensory::GetSenseBodyInfo(Time time){
	return (time == LastSenseTime) ? sensebodyinfo[latestsenseinfo] : sensebodyinfo[!latestsenseinfo];
}

/************************	See Module	***************************/
void Sensory::SeeMarker(MarkerType marker,AngleDeg ang,Time time){
	//there are so many marker, foget those without known distance
	//this rem is non-trivial, because update assume all markers's distance is known

	//Markers[marker].set_polar(ang,time);
	//SeenMarkers.Data(time)[[num_seenmarkers.Data(time)++]] = marker;
}

void Sensory::SeeMarker(MarkerType marker,float dist,AngleDeg ang,Time time){
	Markers[marker].set_polar(ang,dist,time);
	SeenMarkers.Setdata(marker, num_seenmarkers.Data(time)++, time);
}

void Sensory::SeeLine(SideLine line,AngleDeg ang,Time time){
	Lines[line].set_polar(ang,time);
	SeenLines.Setdata(line, num_seenlines.Data(time)++, time);
}

void Sensory::SeeLine(SideLine line ,float dist,AngleDeg ang,Time time){
	Lines[line].set_polar(ang,dist,time);
	SeenLines.Setdata(line, num_seenlines.Data(time)++, time);
}

void Sensory::SeeBall(AngleDeg ang,Time time){
	ball.set_polar(ang,time);
}

void Sensory::SeeBall(float dist,AngleDeg ang,Time time){
	ball.set_polar(ang,dist,time);
}

void Sensory::SeeBall(float dist,AngleDeg ang,float distChng,float dirChng,Time time){
	ball.set_polar(ang,dist,time);
	ball.set_chinfo(distChng,dirChng,time);
}

void Sensory::SeePlayer(AngleDeg ang,Time time){
	if (num_teamlessplayers >= SP_team_size)
		return;
	TeamlessPlayers[num_teamlessplayers ++].set_polar(ang, time);
}

void Sensory::SeePlayer(float dist, AngleDeg ang,Time time){
	if (num_teamlessplayers >= SP_team_size)
		return;
	TeamlessPlayers[num_teamlessplayers ++].set_polar(ang, dist, time);
}

void Sensory::SeePlayer(char player_side, AngleDeg ang,Time time){
	if(player_side == situation.MySide){
		if (num_unknown_myplayers >= SP_team_size)
			return;
		UnknownMyPlayers[num_unknown_myplayers ++].set_polar(ang, time);
	}
	else{
		if (num_unknown_theirplayers >= SP_team_size)
			return;
		UnknownTheirPlayers[num_unknown_theirplayers ++].set_polar(ang, time);
	}
}

void Sensory::SeePlayer(char player_side,float dist,AngleDeg ang,Time time){
	if(player_side == situation.MySide){
		if (num_unknown_myplayers >= SP_team_size)
			return;
		UnknownMyPlayers[num_unknown_myplayers ++].set_polar(ang, dist, time);
	}
	else{
		if (num_unknown_theirplayers >= SP_team_size)
			return;
		UnknownTheirPlayers[num_unknown_theirplayers ++].set_polar(ang, dist, time);
	}
}

void Sensory::SeePlayer(char player_side,UNum NO,AngleDeg ang,Time time,bool IsGoalie){
	if(player_side == situation.MySide){
		MyPlayer(NO).set_polar(ang,time);
		IdentifyMyGoalie(NO, IsGoalie);
	}
	else{
		TheirPlayer(NO).set_polar(ang,time);
		IdentifyTheirGoalie(NO, IsGoalie);
	}
}

void Sensory::SeePlayer(char player_side,UNum NO,float dist,AngleDeg ang,Time time,bool IsGoalie){
	if(player_side == situation.MySide){
		MyPlayer(NO).set_polar(ang,dist,time);		
		IdentifyMyGoalie(NO, IsGoalie);
	}
	else{
		TheirPlayer(NO).set_polar(ang,dist,time);		
		IdentifyTheirGoalie(NO, IsGoalie);
	}
}

void Sensory::SeePlayer(char player_side,UNum NO,float dist,AngleDeg ang,float distChng,
	float dirChng,AngleDeg facedir,AngleDeg neckdir,Time time,bool IsGoalie){
	if(player_side == situation.MySide){

⌨️ 快捷键说明

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