📄 parse.c
字号:
SightInfo++; if ( !strncmp(SightInfo,Mem->MyTeamName,Mem->MyTeamNameLen) ) player_side = Mem->MySide; else{ if ( Mem->TheirTeamName[0] == '\n' ){ int a=0; while ( isalpha(*SightInfo) ) Mem->TheirTeamName[a++]=*SightInfo++; } player_side = Mem->TheirSide; } while ( *SightInfo != ' ' && *SightInfo != ')' ) SightInfo++; /* advance past team name */ if ( *SightInfo== ' ' ){ /* there's a number */ player_number = get_int(&SightInfo); } } } else if ( *SightInfo=='b' || *SightInfo=='B' ) object_type = OBJ_Ball; else my_error("unknown object"); advance_to(')',&SightInfo); /* advance to end of object */ /************************************/ ang = get_float(&SightInfo); if ( *SightInfo != ')' ) { /* 'high' quality */ view_qual = VQ_High; dist = ang; ang = get_float(&SightInfo); } else { printf("%s",SightInfo-30); view_qual = VQ_Low; } if ( view_qual != Mem->ViewQuality ) my_error("View quality %d correct?",view_qual); if ( *SightInfo != ')' ){ distChng = get_float(&SightInfo); dirChng = get_float(&SightInfo); } if ( *SightInfo != ')' ){ if (object_type != OBJ_Player) my_error("Only players should have facedir"); facedir = get_float(&SightInfo); } if ( *SightInfo != ')' ) my_error("Should be done with object info here"); SightInfo++; /* ")" */ /************************************/ switch (object_type){ case OBJ_Marker: case OBJ_Marker_Behind: /* Want to save 2 closest for triangulation */ /* don't want marker_behind unless necessary */ /* If it was a Marker_Behind and we don't know which one */ if ( marker == No_Marker ){ if ( object_type != OBJ_Marker_Behind ) my_error("Should know the marker"); break; } processThisMarker = FALSE; if ( view_qual == VQ_Low ){ /* Low quality */ /* DON'T BOTHER PROCESSING ANY??? I don't think it helps ... */ /* COULD process 2---then triangulate */ /*if ( closestMarkerDist > 0 ){ */ /* closestMarkerDist = 0; */ /* Only process 1*/ /* processThisMarker = TRUE; */ /*}*/ } else{ /* high quality */ if ( closestMarker == No_Marker || dist < closestMarkerDist){ closestMarker = marker; closestMarkerDist = dist; processThisMarker = TRUE; Mem->ClosestMarker = marker; } /* Don't bother with marker motion info -- get it from sense_body and my angle if ( dirChng != NOCHNGINFO && dist < motionInfoDist ){ motionInfoDist = dist; processThisMarker = TRUE; Mem->ClosestMotionMarker = marker; } */ } if ( processThisMarker ){ if ( view_qual == VQ_Low ) /* low quality */ Mem->SeeMarker(marker, ang, time); else /* if (dirChng == NOCHNGINFO) */ /* high quality */ Mem->SeeMarker(marker, dist, ang, time); /* No motion info*/ /* else Mem->SeeMarker(marker, dist, ang, distChng, dirChng, time); */ } break; case OBJ_Line: if ( *SightInfo != ')' ) /* There's another line coming. Assuming lines happen last in the visual string and the closer line comes first */ ; else if ( view_qual == VQ_Low ) /* low quality */ Mem->SeeLine(line, ang, time); else /* high quality */ Mem->SeeLine(line, dist, ang, time); break; case OBJ_Ball: if ( view_qual == VQ_Low ) /* low quality */ Mem->SeeBall(ang, time); else if ( dirChng == NOCHNGINFO ) /* high quality */ Mem->SeeBall(dist, ang, time); else /* know direction*/ Mem->SeeBall(dist, ang, distChng, dirChng, time); break; case OBJ_Player: if ( !player_side ){ /* Too far for team or num */ if ( view_qual == VQ_Low ) /* low quality */ Mem->SeePlayer(ang, time); else if ( dirChng == NOCHNGINFO ) /* high quality */ Mem->SeePlayer(dist, ang, time); else /* know direction*/ my_error("Shouldn't know dirChng when the player's far"); } else{ if ( !player_number ){ /* Too far for number */ if ( view_qual == VQ_Low ) /* low quality */ Mem->SeePlayer(player_side, ang, time); else if ( dirChng == NOCHNGINFO ) /* high quality */ Mem->SeePlayer(player_side, dist, ang, time); else /* know direction*/ my_error("Shouldn't know dirChng when the team member's far"); } else{ /* Know side AND number */ if ( view_qual == VQ_Low ) /* low quality */ Mem->SeePlayer(player_side, player_number, ang, time); else if ( dirChng == NOCHNGINFO ){ /* high quality */ printf("%s\n",SightInfo-30); my_error("Should know dirChng when know number"); Mem->SeePlayer(player_side, player_number, dist, ang, time); } else /* know direction*/ Mem->SeePlayer(player_side, player_number, dist, ang, distChng, dirChng, facedir, time); } } } }}/****************************************************************************************/void Parse_Sound(Time time, char *SoundInfo){ if ( SoundInfo[1] == 'r' ){ /* Referee or Coach message */ SoundInfo += 9; /* " referee " */ if ( islower(SoundInfo[0]) ) Parse_Referee_Sound(SoundInfo); /* Coach messages start with capital letters or are numbers */ else my_error("Not handling coach yet"); /* Parse_Coach_Sound (time, SoundInfo); */ return; } #ifndef RELEASE_VERSION Mem->ParsePlayerSound(SoundInfo, time); #endif /* How to parse a sound from a player depends on the communication mechanism you use. * Our communication mechanism is described in: * * First International Workshop on Collective Robotics (CRW'98) * Communication in Domains with Unreliable, Single-Channel, Low-Bandwidth Communication. * Peter Stone and Manuela Veloso * Available on-line at http://www.cs.cmu.edu/~pstone/pstone-papers.html */}/****************************************************************************************//****************************************************************************************//****************************************************************************************/void Parse_Referee_Sound(char *msg){ switch( msg[0] ){ case 'p': Mem->SetPlayMode(PM_Play_On); break; /* play_on */ case 'k': if ( msg[5] == 'i' ){ /* kick_in */ if ( msg[8] == Mem->MySide ) Mem->SetPlayMode(PM_My_Kick_In); else if ( msg[8] == Mem->TheirSide ) Mem->SetPlayMode(PM_Their_Kick_In); else my_error("kick_in_?"); } else if ( msg[5] == 'o' ){ /* kick_off */ if ( msg[9] == Mem->MySide ) Mem->SetPlayMode(PM_My_Kick_Off); else if ( msg[9] == Mem->TheirSide ) Mem->SetPlayMode(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] == Mem->MySide ) Mem->SetPlayMode(PM_My_Goal_Kick); else if ( msg[10] == Mem->TheirSide ) Mem->SetPlayMode(PM_Their_Goal_Kick); else my_error("goal_kick_?"); } else if ( msg[5] == 'e' ){ /* goalie_catch_ball */ if ( msg[18] == Mem->MySide ) Mem->SetPlayMode(PM_My_Free_Kick); else if ( msg[18] == Mem->TheirSide ) Mem->SetPlayMode(PM_Their_Free_Kick); else my_error("goalie_catch_ball_?"); } else if ( msg[5] == Mem->MySide ){ /* goal */ Mem->MyScore++; //Mem->MyScore = get_int(&msg[7]); Mem->KickOffMode = KO_Theirs; Mem->SetPlayMode(PM_Before_Kick_Off); } else if ( msg[5] == Mem->TheirSide ){ Mem->TheirScore++; //Mem->TheirScore = get_int(&msg[7]); Mem->KickOffMode = KO_Mine; Mem->SetPlayMode(PM_Before_Kick_Off); } else my_error("referee g..?"); break; case 'c': /* corner_kick */ if ( msg[12] == Mem->MySide ) Mem->SetPlayMode(PM_My_Corner_Kick); else if ( msg[12] == Mem->TheirSide ) Mem->SetPlayMode(PM_Their_Corner_Kick); else my_error("corner_kick_?"); break; case 'd': Mem->SetPlayMode(PM_Drop_Ball); break; /* drop_ball */ case 'o': /* offside */ if ( msg[8] == Mem->MySide ) Mem->SetPlayMode(PM_Their_Offside_Kick); else if ( msg[8] == Mem->TheirSide ) Mem->SetPlayMode(PM_My_Offside_Kick); else my_error("offside_?"); break; case 'f': if ( msg[5] == 'k' ){ /* free_kick */ if ( msg[10] == Mem->MySide ) Mem->SetPlayMode(PM_My_Free_Kick); else if ( msg[10] == Mem->TheirSide ) Mem->SetPlayMode(PM_Their_Free_Kick); else my_error("free_kick_?"); } else if ( msg[5] == Mem->MySide ) /* foul */ ; else if ( msg[5] == Mem->TheirSide ) ; else my_error("referee f..?"); break; case 'h': /* half_time */// Mem->WriteHalftimeStats("firstHalf");// Mem->InitializeHalftimeStats(); Mem->SetPlayMode(PM_Half_Time); /* play_mode to before_kick_off */ if ( Mem->MySide == 'l' ) Mem->KickOffMode = KO_Theirs; else Mem->KickOffMode = KO_Mine; break; case 'b': Mem->SetPlayMode(PM_Before_Kick_Off); break; /* before_kick_off */ case 't': if ( msg[5] == 'u' ){ /* time_up */// Mem->WriteFullGameStats();// Mem->WriteHalftimeStats("secondHalf"); Mem->SetPlayMode(PM_Time_Up); } else if ( msg[5] == 'o' ) /* time_over */ {// Mem->WriteFullGameStats(); break; } else if ( msg[5] == 'e' ){ /* time_extended */// Mem->WriteFullGameStats();// Mem->WriteHalftimeStats("secondHalf"); Mem->SetPlayMode(PM_Extended_Time); if ( Mem->MySide == 'l' ) Mem->KickOffMode = KO_Mine; else Mem->KickOffMode = KO_Theirs; } else my_error("referee t..?"); break; default: my_error("Referee msg ????"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -