parsesound.cpp
来自「2002年」· C++ 代码 · 共 372 行
CPP
372 行
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stopwatch.h"
#include "parsesound.h"
#include "bitaudio.h"
#include "worldmodel.h"
#include "perceptron.h"
#include "utils.h"
#include "agent.h"
#include "log.h"
/*-----------------------Parse_Sound() ---------------by laoni
here we discriminate different people,coachs,allies,opponents,trainers ...
-----------------------------------------------------------*/
void ParseSoundV7::Parse_Sound(int time, char *SoundInfo)
{
if ( SoundInfo[1] == 'r' ){ /* Referee or Coach message */
SoundInfo += 9; /* " referee " */
if (strncmp(SoundInfo, "training", 8) == 0)
Parse_Trainer_Sound(SoundInfo+8);
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] == situation.MySide ){
advance_to(' ',&SoundInfo); /* advance to end of side */
SoundInfo++;
Parse_My_Coach_Sound(time,SoundInfo);
}
else if ( SoundInfo[0] == situation.TheirSide ){
advance_to(' ',&SoundInfo); /* advance to end of side */
SoundInfo++;
Parse_Their_Coach_Sound(time,SoundInfo);
}
else
my_error("online_coach_?");
return;
}
else if ( SoundInfo[1] == 's'){
/* Self's message need not process */
}
else{
nonempty_msg = true;
/* Here you could do something with the heard message */
ProcessMsg(SoundInfo + 1);
}
}
/************* ProcessMsg ******************/
//My auditorymsg: "Angel (TeamName time ...
void ParseSoundV7::ProcessMsg(char * auditorymsg){
float from_angle = get_float(&auditorymsg);
auditorymsg += 3;
// Compare TeamName
if (strncmp(auditorymsg, MyTeamName, MyTeamNameLen) != 0)
return;
// Get int
auditorymsg += MyTeamNameLen;
int time = get_int(&auditorymsg);
// time = decrypt(time);
if (time > situation.CurrentTime + 1 || time < situation.CurrentTime - 2)
return;
int playernum = get_int(&auditorymsg);
// playernum = decrypt(playernum);
if (playernum <=0 || playernum > SP_team_size)
return;
if (playernum == Agent::MyNumber)
return;
auditorymsg += 2; //skip ')' and ' '
auditorysystem.ProcessMsg(auditorymsg, playernum, time);
return;
}
void ParseSoundV7::Parse_Trainer_Sound(char *msg){
}
void ParseSoundV7::Parse_Referee_Sound(char *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' ){
if (msg[10] == 'f'){ /*free_kick_fault_?*/
if ( msg[16] == situation.MySide )
situation.HearMode(PM_Their_Free_Kick_Fault);
else if ( msg[16] == situation.TheirSide )
situation.HearMode(PM_My_Free_Kick_Fault);
}else{ /* 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':
if(msg[1] == 'a'){ /*back_pass_?*/
if(msg[10] == situation.MySide ){
situation.HearMode(PM_Their_BackPass);
}else{
situation.HearMode(PM_My_BackPass);
}
}else{ /*before_kick_off*/
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 ????");
}
}
/*-----------------------Parse_Sound() ---------------by laoni
here we discriminate different people,coachs,allies,opponents,trainers ...
-----------------------------------------------------------*/
void ParseSoundV8::Parse_Sound(int time, char *SoundInfo)
{
#ifdef Version7_Compatible
if (ServerParam::version < 8.0) {
ParseSoundV7::Parse_Sound( time, SoundInfo);
return;
}
#endif
switch(SoundInfo[1]){
case 'r' : /* Referee or Coach message */
SoundInfo += 9; /* " referee " */
if (strncmp(SoundInfo, "training", 8) == 0)
Parse_Trainer_Sound(SoundInfo+8);
else if (islower(SoundInfo[0]) ){
Parse_Referee_Sound(SoundInfo);
}
else
my_error("Referee sounds should start with lower case letters!");
break;
case 's':
/* Self's message need not process */
break;
case 'o':
switch( SoundInfo[2]){
case 'n': /* Online coach message */
SoundInfo += 14; /* online_coach_ */
if ( SoundInfo[0] == situation.MySide ){
advance_to(' ',&SoundInfo); /* advance to end of side */
SoundInfo++;
Parse_My_Coach_Sound(time,SoundInfo);
}
else if ( SoundInfo[0] == situation.TheirSide ){
advance_to(' ',&SoundInfo); /* advance to end of side */
SoundInfo++;
Parse_Their_Coach_Sound(time,SoundInfo);
}
else
my_error("online_coach_?");
break;
case 'p': /* opponent short message*/
break;
case 'u': /* ally short message*/
break;
default:
break;
}
break;
default:
angle = get_float(&SoundInfo);
if (SoundInfo[2] == 'u'){/* ally full message*/
num = get_int(&SoundInfo);
if(SoundInfo[0] == ')') break;//empty message
nonempty_msg = true;
World::stopwatch.IdentifyCachetime(SW_Recv_Soundinfo);
SoundInfo += 2;
auditorysystem.ProcessMsg(SoundInfo, num, time);
if(!situation.ClockStopped && time == situation.CurrentTime){
DoRecord("find slow sound ");
}
}else{ /* opponent full message*/
}
break;
}
}
void ParseSoundV8::Coach_AnnounceAll(int time, char *msg)
{
if(situation.playmode == PM_Play_On) return;
TimedData<NoiseVector> data;
int t = AudioDatamap::map_from_printablechar(*msg);
msg ++;
//time checking -- start
if(time % 64 == t){
data.time = time;
}else if((time-1) % 64 == t){
data.time = time - 1;
}else{
return;
}
//time checking -- end
data.data.delta= 0.0f; ///is it?
int i;
for(i=1; i<= 11; i++){
//MyPlayer(i)
data.data.mean.x = AudioDatamap::DualByteDemap(msg);
msg += 2;
data.data.mean.y = AudioDatamap::DualByteDemap(msg);
msg += 2;
if(PitchInfo.WithInField(data.data.mean)){
MyPlayer(i).Parse_HearPos(data);
}
//TheirPlayer(i)
data.data.mean.x = AudioDatamap::DualByteDemap(msg);
msg += 2;
data.data.mean.y = AudioDatamap::DualByteDemap(msg);
msg += 2;
if(PitchInfo.WithInField(data.data.mean)){
TheirPlayer(i).Parse_HearPos(data);
}
}
//ball
data.data.mean.x = AudioDatamap::DualByteDemap(msg);
msg += 2;
data.data.mean.y = AudioDatamap::DualByteDemap(msg);
msg += 2;
if (data.data.mean.mod() <200){
ball.Parse_HearPos(data);
data.data.mean = 0;
data.data.delta = 0;
ball.Parse_HearVel(data);
}
}
void ParseSoundV8::Parse_My_Coach_Sound(int time, char *msg)
{
switch (msg[1]){
case 'i': //info massage
break;
case 'a': //advice massage
break;
case 'd': //define massage
break;
case 'm': //meta massage
break;
case 'f': //freeform massage
if (msg[11] == 'a') Coach_AnnounceAll(time,msg +12);
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?