📄 sensory.cpp
字号:
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 + -