📄 parse.c
字号:
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); neckdir = 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, neckdir, time); } } } }}/****************************************************************************************/void Parse_Sound(Time time, char *SoundInfo){ if ( SoundInfo[1] == 'r' ){ /* Referee or Coach message */ SoundInfo += 9; /* " referee " */ if (strncmp(SoundInfo, "training", 8) == 0) Parse_Trainer_Sound(SoundInfo); else if ( islower(SoundInfo[0]) ) Parse_Referee_Sound(SoundInfo); else my_error("Referee sounds should start with lower case letters!"); return; } else if ( SoundInfo[1] == 'o' ){ /* Online coach message */ SoundInfo += 14; /* online_coach_ */ if ( SoundInfo[0] == Mem->MySide ){ advance_to(' ',&SoundInfo); /* advance to end of side */ SoundInfo++; Parse_My_Coach_Sound(time,SoundInfo); } else if ( SoundInfo[0] == Mem->TheirSide ){ advance_to(' ',&SoundInfo); /* advance to end of side */ SoundInfo++; Parse_Their_Coach_Sound(time,SoundInfo); } else my_error("online_coach_?"); return; } /* Here you could do something with the heard message */}/****************************************************************************************//****************************************************************************************//****************************************************************************************/void Parse_Referee_Sound(char *msg){ //printf("Parsing ref sound: '%s\'\n", msg); msg[strlen(msg) - 2] = 0; /* cut off the newline and paren */ Mem->LogAction3(200,"Referee message: %s",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_Goalie_Free_Kick); else if ( msg[18] == Mem->TheirSide ) Mem->SetPlayMode(PM_Their_Goalie_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->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->SetPlayMode(PM_Time_Up); } else if ( msg[5] == 'o' ) /* time_over */ { break; } else if ( msg[5] == 'e' ){ /* time_extended */ 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 ????"); }}/****************************************************************************************//* the trainer send a string that is essentially command line options */void Parse_Trainer_Sound(char *msg){ msg += 9; /* 'training ' */ msg[strlen(msg) - 2] = 0; /* cut off the newline and paren */ Mem->GetOptions(msg); Mem->GetBall()->forget(); /* set 0 confidence in ball pos */ cout << "Incorp trainer message" << endl; Mem->LogAction2(175, "Incorporated trainer sound");}/****************************************************************************************/void Parse_My_Coach_Sound(Time time, char *msg){ /* Here you can parse the coach message */}/****************************************************************************************/void Parse_Their_Coach_Sound(Time time, char *msg){ /* Here you can parse their coach's messages */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -