📄 soccertypes.c
字号:
break; case 'F': // (F) unkown flag very close.. ignored o = OBJECT_UNKNOWN; break; case 'f': // (f ...), many options... switch( ptrStr[3] ) { case 'l': // (f l ... lines on left part of field if( ptrStr[6] == ')' ) // only one character at index '5' { switch( ptrStr[5] ) { case '0': o = OBJECT_FLAG_L_0; break; // (f l 0) case 't': o = OBJECT_FLAG_L_T; break; // (f l t) case 'b': o = OBJECT_FLAG_L_B; break; // (f l b) default: o = OBJECT_ILLEGAL; break; } } else // more than one character from index '5' { switch( ptrStr[7] ) { case '1': // (f l t 10) or (f l b 10) o = (ptrStr[5]=='t')? OBJECT_FLAG_L_T_10 :OBJECT_FLAG_L_B_10; break; case '2': // (f l t 20) or (f l b 20) o = (ptrStr[5]=='t')? OBJECT_FLAG_L_T_20 :OBJECT_FLAG_L_B_20; break; case '3': // (f l t 30) or (f l b 30) o = (ptrStr[5]=='t')? OBJECT_FLAG_L_T_30 :OBJECT_FLAG_L_B_30; break; default: o = OBJECT_ILLEGAL; break; } } break; case 'r': // (f r ... lines on right side of field if( ptrStr[6] == ')' ) // only one character at index '5' { switch( ptrStr[5] ) { case '0': o = OBJECT_FLAG_R_0; break; // (f l 0) case 't': o = OBJECT_FLAG_R_T; break; // (f l t) case 'b': o = OBJECT_FLAG_R_B; break; // (f l b) } } else { switch( ptrStr[7] ) // more than one character from index '5' { case '1': o = (ptrStr[5]=='t')? OBJECT_FLAG_R_T_10 :OBJECT_FLAG_R_B_10; break; case '2': // (f r t 10) or (f r b 10) o = (ptrStr[5]=='t')? OBJECT_FLAG_R_T_20 :OBJECT_FLAG_R_B_20; break; // (f r t 20) or (f r b 20) case '3': o = (ptrStr[5]=='t')? OBJECT_FLAG_R_T_30 :OBJECT_FLAG_R_B_30; break; // (f r t 30) or (f r b 30) default: o = OBJECT_ILLEGAL; break; } } break; case 't': // lines on top part of field if( ptrStr[5] == '0' ) o = OBJECT_FLAG_T_0; // (f t 0) center flag else { switch( ptrStr[7] ) // rest of the top flags { case '1': // (f t l 10) or (f t r 10) o = (ptrStr[5]=='l') ? OBJECT_FLAG_T_L_10 : OBJECT_FLAG_T_R_10; break; case '2': // (f t l 20) or (f t r 20) o = (ptrStr[5]=='l') ? OBJECT_FLAG_T_L_20 : OBJECT_FLAG_T_R_20; break; case '3': // (f t l 30) or (f t r 30) o = (ptrStr[5]=='l') ? OBJECT_FLAG_T_L_30 : OBJECT_FLAG_T_R_30; break; case '4': // (f t l 40) or (f t r 40) o = (ptrStr[5]=='l') ? OBJECT_FLAG_T_L_40 : OBJECT_FLAG_T_R_40; break; case '5': // (f t l 50) or (f t r 50) o = (ptrStr[5]=='l') ? OBJECT_FLAG_T_L_50 : OBJECT_FLAG_T_R_50; break; } } break; case 'b': // lines on bottom part of field if( ptrStr[5] == '0') o = OBJECT_FLAG_B_0; // (f b 0) center flag else { switch( ptrStr[7] ) // rest of the bottom flags { case '1': // (f b l 10) or (f b r 10) o = (ptrStr[5]=='l') ? OBJECT_FLAG_B_L_10 : OBJECT_FLAG_B_R_10; break; case '2': // (f b l 20) or (f b r 20) o = (ptrStr[5]=='l') ? OBJECT_FLAG_B_L_20 : OBJECT_FLAG_B_R_20; break; case '3': // (f b l 30) or (f b r 30) o = (ptrStr[5]=='l') ? OBJECT_FLAG_B_L_30 : OBJECT_FLAG_B_R_30; break; case '4': // (f b l 40) or (f b r 40) o = (ptrStr[5]=='l') ? OBJECT_FLAG_B_L_40 : OBJECT_FLAG_B_R_40; break; case '5': // (f b l 50) or (f b r 50) o = (ptrStr[5]=='l') ? OBJECT_FLAG_B_L_50 : OBJECT_FLAG_B_R_50; break; } } break; case 'c': // center flags if( ptrStr[4] == ')' ) o = OBJECT_FLAG_C; // (f c) flag in midpoint field else // (f c t) or (f c b) o = (ptrStr[5] == 't') ? OBJECT_FLAG_C_T : OBJECT_FLAG_C_B; break; case 'g': // goal flags if( ptrStr[5] == 'l' ) // (g l t) or (g l b) o = (ptrStr[7] == 't') ? OBJECT_FLAG_G_L_T : OBJECT_FLAG_G_L_B; else // (g r t) or (g r b) o = (ptrStr[7] == 't') ? OBJECT_FLAG_G_R_T : OBJECT_FLAG_G_R_B; break; case 'p': // flags at sides penalty area switch( ptrStr[7] ) { case 't': // (p l t) or (p r t) top penalty area o = (ptrStr[5] == 'l') ? OBJECT_FLAG_P_L_T : OBJECT_FLAG_P_R_T; break; case 'c': // (p l c) or (p r c) center penalty area o = (ptrStr[5] == 'l') ? OBJECT_FLAG_P_L_C : OBJECT_FLAG_P_R_C; break; case 'b': // (p l b) or (p r b) bottom penalty area o = (ptrStr[5] == 'l') ? OBJECT_FLAG_P_L_B : OBJECT_FLAG_P_R_B; break; default: o = OBJECT_ILLEGAL; break; } break; default: o = OBJECT_ILLEGAL; } break; // end flags (finally) case 'p': // (p team nr) or (p team) or (p) player teammate or opponent case 'P': // or (P) ptrStr += 2; if( Parse::gotoFirstSpaceOrClosingBracket(&ptrStr) == ')' ) o = OBJECT_PLAYER_UNKNOWN; // if (p) or (P) player is unknown. // check also with quotes since later versions use string around "teamname" else if( strncmp( ptrStr+1, strMyTeamName, strlen( strMyTeamName ) ) == 0 || strncmp( ptrStr+2, strMyTeamName, strlen( strMyTeamName ) ) == 0 ) { ptrStr++; if( Parse::gotoFirstSpaceOrClosingBracket(&ptrStr) == ' ' ) { // also team number switch( Parse::parseFirstInt( &ptrStr ) ) // get team number { case 1: o = OBJECT_TEAMMATE_1; break; // and find team member case 2: o = OBJECT_TEAMMATE_2; break; case 3: o = OBJECT_TEAMMATE_3; break; case 4: o = OBJECT_TEAMMATE_4; break; case 5: o = OBJECT_TEAMMATE_5; break; case 6: o = OBJECT_TEAMMATE_6; break; case 7: o = OBJECT_TEAMMATE_7; break; case 8: o = OBJECT_TEAMMATE_8; break; case 9: o = OBJECT_TEAMMATE_9; break; case 10: o = OBJECT_TEAMMATE_10; break; case 11: o = OBJECT_TEAMMATE_11; break; default: o = OBJECT_ILLEGAL; } if( ptrStr[0] != ')' && ptrStr[1] == 'g' ) // goalie *isGoalie = true; } else o = OBJECT_TEAMMATE_UNKNOWN; // (p team) but no nr } else // not a teammate { ptrStr++; if( Parse::gotoFirstSpaceOrClosingBracket( &ptrStr ) == ' ' ) { // also team number switch( Parse::parseFirstInt( &ptrStr ) ) // get team numer { case 1: o = OBJECT_OPPONENT_1; break; // and return opponent case 2: o = OBJECT_OPPONENT_2; break; case 3: o = OBJECT_OPPONENT_3; break; case 4: o = OBJECT_OPPONENT_4; break; case 5: o = OBJECT_OPPONENT_5; break; case 6: o = OBJECT_OPPONENT_6; break; case 7: o = OBJECT_OPPONENT_7; break; case 8: o = OBJECT_OPPONENT_8; break; case 9: o = OBJECT_OPPONENT_9; break; case 10: o = OBJECT_OPPONENT_10; break; case 11: o = OBJECT_OPPONENT_11; break; default: o = OBJECT_ILLEGAL; } if( ptrStr[0] != ')' && ptrStr[1] == 'g' ) // goalie *isGoalie = true; } else o = OBJECT_OPPONENT_UNKNOWN; // number not known } break; default: cerr << "(SoccerTypes::getObjectFromStr) Unknown msg: " << ptrStr << endl; char buf[1000]; printf("%d, %s\n", o, SoccerTypes::getObjectStr(buf,o,"1") ); break; } // go to the end of the object Parse::gotoFirstOccurenceOf( ')', &ptrStr ); *str=ptrStr; return o;}/*! This method returns the index of an object relative to the first object in that set. The index is always 1 smaller than its number, so OBJECT_OPPONENT_1 will become 0. This can be used for indexing an array of objects. \param o ObjectT type of object of which the index has to be calculated \return index of object or -1 when o was not a correct object */int SoccerTypes::getIndex( ObjectT o ){ if( o >= OBJECT_OPPONENT_1 && o <= OBJECT_OPPONENT_11 ) return o - OBJECT_OPPONENT_1; else if( o >= OBJECT_TEAMMATE_1 && o <= OBJECT_TEAMMATE_11 ) return o - OBJECT_TEAMMATE_1; else if( o >= OBJECT_GOAL_L && o <= OBJECT_GOAL_R ) return o - OBJECT_GOAL_L; else if( o >= OBJECT_FLAG_L_T && o <= OBJECT_FLAG_C ) return o - OBJECT_FLAG_L_T + 2; // 2 added for the two goals else if( o >= OBJECT_LINE_L && o <= OBJECT_LINE_T ) return o - OBJECT_LINE_L; else return -1;}/*! This method returns the object type of a teammate with index iIndex. When iIndex equals 3 for example OBJECT_TEAMMATE_4 is returned. \param iIndex index of teammate range is [0..10] \return object type corresponding to this index */ObjectT SoccerTypes::getTeammateObjectFromIndex( int iIndex ){ return (ObjectT) ( OBJECT_TEAMMATE_1 + iIndex );}/*! This method returns the object type of an opponent with index iIndex. When iIndex equals 9 for example OBJECT_OPPONENT_10 is returned. \param iIndex index of opponent range is [0..10] \return object type corresponding to this index */ObjectT SoccerTypes::getOpponentObjectFromIndex( int iIndex ){ return (ObjectT) ( OBJECT_OPPONENT_1 + iIndex );}/*! This method returns a boolean indicating whether the object o is part of the object set o_s. OBJECT_TEAMMATE_1 as o and OBJECT_SET_TEAMMATES will return for example the value true. \param o ObjectT of which should be checked whether it is a part of o_s \param o_s ObjectSet in which o should be \return true when o is included in set o_s, false otherwise */bool SoccerTypes::isInSet( ObjectT o, ObjectSetT o_g ){ switch( o_g ) { case OBJECT_SET_TEAMMATES: return isTeammate( o ) && isKnownPlayer( o ); case OBJECT_SET_OPPONENTS: return isOpponent( o ) && isKnownPlayer( o ); case OBJECT_SET_PLAYERS: return isPlayer ( o ) && isKnownPlayer( o ); case OBJECT_SET_FLAGS: return isFlag ( o ); case OBJECT_SET_LINES: return isLine ( o ); case OBJECT_SET_ILLEGAL: default: return false; } return false;}/*! This method determines whether object o is a flag. \param o an object type \return bool indicating whether o is a flag (return true) or not (false) */bool SoccerTypes::isFlag( ObjectT o ){ return ( o >= OBJECT_FLAG_L_T && o <= OBJECT_FLAG_C ) || ( o >= OBJECT_GOAL_L && o <= OBJECT_GOAL_R );}/*! This method determines whether object o is a line. \param o an object type \return bool indicating whether o is a line return true) or not (false) */bool SoccerTypes::isLine( ObjectT o ){ return o >= OBJECT_LINE_L && o <= OBJECT_LINE_T;}/*! This method determines whether object o is a goal \param o an object type \return bool indicating whether o is a goal (return true) or not (false) */bool SoccerTypes::isGoal( ObjectT o ){ return o == OBJECT_GOAL_L || o == OBJECT_GOAL_R;}/*! This method determines whether object o is a teammate \param o an object type \return bool indicating whether o is a teammate (true) or not (false) */bool SoccerTypes::isTeammate( ObjectT o ){ return o >= OBJECT_TEAMMATE_1 && o <= OBJECT_TEAMMATE_UNKNOWN;}/*! This method determines whether object o is an opponent \param o an object type \return bool indicating whether o is an opponent (true) or not (false) */bool SoccerTypes::isOpponent( ObjectT o ){ return o >= OBJECT_OPPONENT_1 && o <= OBJECT_OPPONENT_UNKNOWN;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -