00001 /* 00002 * $Id: RCTeam_8java-source.html,v 1.2 2002/07/07 20:59:52 stork Exp $ 00003 * 00004 * $Log: RCTeam_8java-source.html,v $ 00004 * Revision 1.2 2002/07/07 20:59:52 stork 00004 * update dokumenation 00004 * 00005 * Revision 1.18 2002/07/05 18:34:08 stork 00006 * update dokumentation 00007 * 00008 * Revision 1.17 2002/07/03 17:24:03 stork 00009 * add log to shell 00010 * 00011 * Revision 1.16 2002/07/02 20:56:19 stork 00012 * add support for central Log 00013 * 00014 * Revision 1.15 2002/06/27 20:26:40 stork 00015 * add + update dokumentation 00016 * 00017 * Revision 1.14 2002/06/22 20:15:41 stork 00018 * add some more dokumentation 00019 * 00020 * Revision 1.13 2002/06/21 17:35:32 stork 00021 * little fix 00022 * 00023 * Revision 1.12 2002/06/16 17:46:21 stork 00024 * rounding double to 3 digits after the comma 00025 * 00026 * Revision 1.11 2002/06/10 20:51:02 stork 00027 * add enemies to info command 00028 * 00029 * Revision 1.10 2002/06/08 14:41:13 stork 00030 * add info to shell 00031 * 00032 * Revision 1.9 2002/06/07 21:41:28 stork 00033 * modify the shell: 00034 * - remove quad. from config 00035 * 00036 * Revision 1.8 2002/06/07 18:15:15 stork 00037 * add send support for shell 00038 * 00039 * Revision 1.5 2002/05/30 15:37:16 stork 00040 * improve handling when server dies before we 00041 * 00042 * Revision 1.4 2002/05/29 21:07:19 stork 00043 * new config file syntax 00044 * 00045 * Revision 1.3 2002/05/25 22:03:56 stork 00046 * add config file support 00047 * 00048 * Revision 1.2 2002/05/21 20:57:14 stork 00049 * first communicator version 00050 * 00051 * Revision 1.1.1.1 2002/05/21 20:32:05 stork 00052 * empty project 00053 * 00054 */ 00055 import java.io.*; 00056 import java.util.*; 00057 00062 public class RCTeam { 00064 public static RCPlayer[] Players; 00065 00073 public static double doubleRound( double Value, int Digits ){ 00074 return (((double)((int)(Value*Math.pow(10,Math.abs(Digits)))))/(1.0*Math.pow(10,Math.abs(Digits)))); 00075 } 00076 00082 static public void main ( String args[] ){ 00083 String TeamName = ""; 00084 String Server = "localhost"; 00085 int Port = 6000; 00086 int PlayerCount = 0 ; // number of players we create 00087 00088 // parse arguments 00089 if( (args.length == 0) || (args.length > 3) ){ 00090 /* wrong arguments */ 00091 System.out.println("usage: java RCTeam \"TEAMNAME\" [SERVER] [PORT] "); 00092 System.exit(1); 00093 }else{ 00094 /* parse arguments */ 00095 try{ 00096 TeamName = args[0]; 00097 if( args.length >= 2 ) 00098 Server = args[1]; 00099 if ( args.length == 3 ) 00100 Port = Integer.parseInt(args[2], 10); 00101 }catch(NumberFormatException e){ 00102 System.out.println(e); 00103 System.exit(1); 00104 } 00105 } 00106 00107 // create players 00108 Players = new RCPlayer[11]; 00109 // create log 00110 RCLog Log = new RCLog(); 00111 try{ 00112 /* open log file */ 00113 BufferedReader Config = new BufferedReader(new FileReader("RCTeam.cfg"));; 00114 String Line ; 00115 /* read & parse config file */ 00116 while( ((Line=Config.readLine()) != null) && (PlayerCount < 11) ){ 00117 Line = Line.trim(); 00118 if( Line.startsWith("#") == false ){ 00119 StringTokenizer tk = new StringTokenizer(Line, ":"); 00120 if( tk.countTokens() == 6){ 00121 try{ 00122 boolean Goalie = Boolean.valueOf(tk.nextToken()).booleanValue(); 00123 boolean Visual = Boolean.valueOf(tk.nextToken()).booleanValue(); 00124 00125 /* create a new player */ 00126 Players[PlayerCount] = new RCPlayer(TeamName, 00127 Visual, 00128 Server, 00129 Port, 00130 Goalie, 00131 Float.valueOf(tk.nextToken()).floatValue(), 00132 Float.valueOf(tk.nextToken()).floatValue(), 00133 Float.valueOf(tk.nextToken()).floatValue(), 00134 Float.valueOf(tk.nextToken()).floatValue(), 00135 Log); 00136 /* start the player */ 00137 //Players[PlayerCount].setPriority(Thread.MAX_PRIORITY); 00138 Players[PlayerCount].start(); 00139 /* update internal state */ 00140 PlayerCount++; 00141 }catch(Exception e){ 00142 System.out.println(e.toString()); 00143 System.exit(1); 00144 } 00145 } 00146 } 00147 } 00148 }catch(IOException e){ 00149 // shit happens 00150 System.out.println(e.toString()); 00151 System.exit(1); 00152 } 00153 00154 00155 // open shell 00156 final String Prompt = "[rcteam]> "; 00157 boolean doShell = true; 00158 BufferedReader Input = new BufferedReader(new InputStreamReader(System.in)); 00159 00160 /* display prolog */ 00161 System.out.println("RCTeam Shell"); 00162 System.out.println("use h <ENTER> for help"); 00163 /* enter input loop */ 00164 while( doShell ){ 00165 try{ 00166 String Command; 00167 System.out.print(Prompt); 00168 StringTokenizer Line= new StringTokenizer(Input.readLine().trim()); 00169 00170 /* wrong input ? */ 00171 if( Line.hasMoreTokens()) 00172 Command = Line.nextToken().trim(); 00173 else 00174 Command = "help"; 00175 00176 /* try to satisfy the user */ 00177 if( (Command.compareTo("quit") == 0) || (Command.compareTo("q") == 0) ){ 00178 // we are finish 00179 doShell = false; 00180 }else if((Command.compareTo("log") == 0) || (Command.compareTo("l") == 0) ){ 00181 if( Line.hasMoreTokens() ){ 00182 try{ 00183 Log.activeLog = (Boolean.valueOf(Line.nextToken())).booleanValue(); 00184 }catch(Exception e){ 00185 System.out.println("log "+e.toString()); 00186 } 00187 } 00188 // output the current status 00189 if( Log.activeLog == true ) 00190 System.out.println("Logging enabled"); 00191 else 00192 System.out.println("Logging disabled"); 00193 00194 }else if( (Command.compareTo("info") == 0) || (Command.compareTo("i") == 0)){ 00195 if( Line.hasMoreTokens() ){ 00196 try{ 00197 int PlayerNumber = Math.abs(Integer.parseInt(Line.nextToken())); 00198 00199 if( (PlayerNumber > 0) && (PlayerNumber <= PlayerCount)){ 00200 System.out.println("Player's Number = " + PlayerNumber); 00201 System.out.println("Player's Time = " + Players[PlayerNumber-1].World.CurrentTimeStamp); 00202 System.out.println("Player's Angle = " + Players[PlayerNumber-1].World.angle); 00203 System.out.println("Player'a Position = ("+RCTeam.doubleRound((Players[PlayerNumber-1].World.getOurself().X(0)),3)+", "+RCTeam.doubleRound((Players[PlayerNumber-1].World.getOurself().Y(0)),3)+")"); 00204 System.out.println("Player's Ball = (" + RCTeam.doubleRound(Players[PlayerNumber-1].World.Ball.X(0),3)+"/"+RCTeam.doubleRound(Players[PlayerNumber-1].World.Ball.Y(0),3)+") at "+ Players[PlayerNumber-1].World.Ball.Time(0) ); 00205 System.out.println("Player's Area = ("+ 00206 RCTeam.doubleRound(Players[PlayerNumber-1].World.X1,3)+", "+RCTeam.doubleRound(Players[PlayerNumber-1].World.Y1,3)+") => ("+ 00207 RCTeam.doubleRound(Players[PlayerNumber-1].World.X2,3)+", "+RCTeam.doubleRound(Players[PlayerNumber-1].World.Y2,3)+")"); 00208 for(int x = 0; x < 11 ; x++){ 00209 System.out.println("Player's Enemy "+x+" : ("+ 00210 RCTeam.doubleRound(Players[PlayerNumber-1].World.Enemies[x].X(0),3)+", "+ 00211 RCTeam.doubleRound(Players[PlayerNumber-1].World.Enemies[x].Y(0),3)+") at "+ 00212 Players[PlayerNumber-1].World.Enemies[x].Time(0)); 00213 } 00214 } 00215 }catch(Exception e){ 00216 System.out.println("parse error"); 00217 } 00218 } 00219 }else if( (Command.compareTo("network") == 0) || (Command.compareTo("n") == 0)){ 00220 // show information of connection 00221 System.out.println("Server : " + Server ); 00222 System.out.println("Port : " + Port); 00223 }else if( (Command.compareTo("display")==0) || (Command.compareTo("d")==0)){ 00224 if( Line.hasMoreTokens()){ 00225 try{ 00226 int number = Math.abs(Integer.parseInt(Line.nextToken())); 00227 if( (number <= PlayerCount) && (number > 0) ){ 00228 Players[number-1].setVisible(true); 00229 } 00230 }catch(Exception e){ 00231 00232 } 00233 } 00234 }else if( (Command.compareTo("config")==0) || (Command.compareTo("c")==0) ){ 00235 System.out.println("Number of Players : " + PlayerCount ); 00236 System.out.println("Number\tGoalie\tVisual\tStartPoint\tCurrentPoint"); 00237 System.out.println("================================================================================"); 00238 for(int c = 0 ; c < PlayerCount ; c++){ 00239 System.out.println((c+1)+ 00240 "\t"+Players[c].Communicator.Goalie+ 00241 "\t"+Players[c].isVisible()+ 00242 "\t("+RCTeam.doubleRound(((Players[c].World.X1+Players[c].World.X2)/2),3)+", "+RCTeam.doubleRound(((Players[c].World.Y1+Players[c].World.Y2)/2), 3)+")"+ 00243 "\t("+RCTeam.doubleRound((Players[c].World.getOurself().X(0)),3)+", "+RCTeam.doubleRound((Players[c].World.getOurself().Y(0)),3)+")"); 00244 // "\t("+Players[c].World.X1+", "+Players[c].World.Y1+") => ("+Players[c].World.X2+", "+Players[c].World.Y2+")"); 00245 } 00246 }else if( (Command.compareTo("send") == 0) || (Command.compareTo("s") == 0)){ 00247 if( Line.hasMoreTokens() ){ 00248 try{ 00249 int PlayerNumber = Math.abs(Integer.parseInt(Line.nextToken())); 00250 // send the message 00251 00252 if( (PlayerNumber > 0) && 00253 (PlayerNumber <= PlayerCount) && 00254 (Line.hasMoreTokens())){ 00255 String Message = ""; 00256 //while( Line.hasMoreTokens() ) 00257 // Message = Message + Line.nextToken()+ " "; 00258 Message = Line.nextToken("\n").trim(); 00259 System.out.println("< "+Message); 00260 Players[PlayerNumber-1].Communicator.send(Message); 00261 } 00262 00263 }catch(Exception e){ 00264 00265 } 00266 } 00267 }else{ 00268 // print help message 00269 System.out.println("(c)onfig - print configuration of the team"); 00270 System.out.println("(d)isplay NUM - activate display for the specified player"); 00271 System.out.println("(i)nfo NUM - dump information for current player"); 00272 System.out.println("(h)elp - print this message"); 00273 System.out.println("(l)og BOOL - 1=enable, 0=disable"); 00274 System.out.println("(n)network - show connection info"); 00275 System.out.println("(q)uit - quit the team with all the players"); 00276 System.out.println("(s)end NUM MSG - send MSG for player NUM"); 00277 } 00278 }catch(IOException e){ 00279 System.out.println(e.toString()); 00280 doShell = false; 00281 00282 } 00283 } 00284 00285 // kill all players 00286 for( int x=0 ; x < PlayerCount ; x++ ) 00287 Players[x].interrupt(); 00288 00289 // just for fun 00290 System.out.print("A Strange Game .\n"); 00291 System.out.println("The only winning move is not to play."); 00292 00293 // we are finish 00294 System.exit(0); 00295 } 00296 }