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 + -
显示快捷键?