package icpc.challenge.main;
import icpc.challenge.builtin.DoNothingPlayer;
import icpc.challenge.link.InternalPlayerBase;
import icpc.challenge.link.PipedPlayer;
import icpc.challenge.play.PlaySplitter;
import icpc.challenge.play.SinglePlayerBumper;
import icpc.challenge.play.SinglePlayerSled;
import icpc.challenge.view.InteractiveView;
import icpc.challenge.view.SimpleView;
import icpc.challenge.view.TraceWriter;
import icpc.challenge.view.TurnWriter;
import icpc.challenge.view.View3D;
import icpc.challenge.world.AbstractPlayer;
import icpc.challenge.world.AbstractView;
import icpc.challenge.world.Simulation;
import java.awt.event.KeyListener;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Game
{
private Simulation sim;
private ArrayList<AbstractPlayer> players = new ArrayList();
private ArrayList<AbstractView> views = new ArrayList();
private InteractiveView interactiveView = null;
private KeyListener interactivePlayer = null;
private int turns = 900;
private static void usage(String paramString)
{
if (paramString != null)
System.err.println(paramString);
System.err.println("usage: Game");
System.err.println(" [-view simple]*");
System.err.println(" [-view trace <trace file>]*");
System.err.println(" [-view turns <turn history file>]*");
System.err.println(" [-view 3D]*");
System.err.println(" [-player builtin <builtin_class>]*");
System.err.println(" [-player cpp|synccpp <executable>]*");
System.err.println(" [-player java|syncjava <main_class>]*");
System.err.println(" [-player pipe|syncpipe <n> <cmd/arg>{n}]*");
System.err.println(" [-player sled|bumper0|bumper1 builtin <builtin_class>]*");
System.err.println(" [-player sled|bumper0|bumper1 cpp <executable>]*");
System.err.println(" [-player sled|bumper0|bumper1 java <main_class>]*");
System.err.println(" [-player sled|bumper0|bumper1 pipe <n> <cmd/arg>{n}]*");
System.err.println(" [-duration <n>]");
System.exit(-1);
}
private void makeUI()
{
}
private int parsePlayspec(String[] paramArrayOfString, int paramInt)
throws Exception
{
ArrayList localArrayList;
boolean bool;
Object localObject;
int i = 0;
if ((paramArrayOfString[paramInt].equals("builtin")) && (paramInt + 1 < paramArrayOfString.length))
{
Class localClass = Class.forName("icpc.challenge.builtin." + paramArrayOfString[(paramInt + 1)]);
InternalPlayerBase localInternalPlayerBase = (InternalPlayerBase)localClass.newInstance();
localInternalPlayerBase.setSide(this.players.size());
this.players.add(localInternalPlayerBase);
i = 2;
}
if ((((paramArrayOfString[paramInt].equals("pipe")) || (paramArrayOfString[paramInt].equals("syncpipe")))) && (paramInt + 1 < paramArrayOfString.length))
{
int j = Integer.valueOf(paramArrayOfString[(paramInt + 1)]).intValue();
if (paramInt + 1 + j >= paramArrayOfString.length)
usage("Not enough arguments for piped player");
bool = paramArrayOfString[paramInt].equals("syncpipe");
localObject = new ArrayList();
for (int k = 0; k < j; ++k) {
((ArrayList)localObject).add(paramArrayOfString[(paramInt + 2 + k)]);
}
PipedPlayer localPipedPlayer = new PipedPlayer(this.players.size(), bool, (List)localObject);
this.players.add(localPipedPlayer);
i = 2 + j;
}
if ((((paramArrayOfString[paramInt].equals("cpp")) || (paramArrayOfString[paramInt].equals("synccpp")))) && (paramInt + 1 < paramArrayOfString.length))
{
localArrayList = new ArrayList();
localArrayList.add(paramArrayOfString[(paramInt + 1)]);
bool = paramArrayOfString[paramInt].equals("synccpp");
localObject = new PipedPlayer(this.players.size(), bool, localArrayList);
this.players.add(localObject);
i = 2;
}
if ((((paramArrayOfString[paramInt].equals("java")) || (paramArrayOfString[paramInt].equals("syncjava")))) && (paramInt + 1 < paramArrayOfString.length))
{
localArrayList = new ArrayList();
localArrayList.add("java");
localArrayList.add(paramArrayOfString[(paramInt + 1)]);
bool = paramArrayOfString[paramInt].equals("syncjava");
localObject = new PipedPlayer(this.players.size(), bool, localArrayList);
this.players.add(localObject);
i = 2;
}
return i;
}
private int consumeArg(String[] paramArrayOfString, int paramInt) throws Exception {
int i = 0;
if ((paramArrayOfString[paramInt].equals("view")) && (paramInt + 1 < paramArrayOfString.length))
{
Object localObject1;
if (paramArrayOfString[(paramInt + 1)].equals("simple")) {
localObject1 = new SimpleView();
if (this.interactiveView == null)
this.interactiveView = ((InteractiveView)localObject1);
this.views.add(localObject1);
i = 2;
}
if (paramArrayOfString[(paramInt + 1)].equals("3D")) {
localObject1 = new View3D();
if (this.interactiveView == null)
this.interactiveView = ((InteractiveView)localObject1);
this.views.add(localObject1);
i = 2;
}
if ((paramArrayOfString[(paramInt + 1)].equals("trace")) && (paramInt + 2 < paramArrayOfString.length))
{
this.views.add(new TraceWriter(paramArrayOfString[(paramInt + 2)]));
i = 3;
}
if ((paramArrayOfString[(paramInt + 1)].equals("turns")) && (paramInt + 2 < paramArrayOfString.length))
{
this.views.add(new TurnWriter(paramArrayOfString[(paramInt + 2)]));
i = 3;
}
}
if ((paramArrayOfString[paramInt].equals("player")) && (paramInt + 1 < paramArrayOfString.length))
{
if (this.players.size() > 1)
usage("Too many players");
if ((((paramArrayOfString[(paramInt + 1)].equals("sled")) || (paramArrayOfString[(paramInt + 1)].equals("bumper0")) || (paramArrayOfString[(paramInt + 1)].equals("bumper1")))) && (paramInt + 2 < paramArrayOfString.length))
{
Object localObject2;
if (this.interactivePlayer != null)
usage("Only one interactive player permitted");
int j = parsePlayspec(paramArrayOfString, paramInt + 2);
if (j == 0)
usage("Invalid player specification for interactive player");
int k = this.players.size() - 1;
AbstractPlayer localAbstractPlayer = (AbstractPlayer)this.players.remove(k);
if (paramArrayOfString[(paramInt + 1)].equals("sled")) {
localObject2 = new SinglePlayerSled(localAbstractPlayer, k);
this.interactivePlayer = ((KeyListener)localObject2);
this.players.add(localObject2);
} else if (paramArrayOfString[(paramInt + 1)].equals("bumper0")) {
localObject2 = new SinglePlayerBumper(localAbstractPlayer, k, 0);
this.interactivePlayer = ((KeyListener)localObject2);
this.players.add(localObject2);
} else if (paramArrayOfString[(paramInt + 1)].equals("bumper1")) {
localObject2 = new SinglePlayerBumper(localAbstractPlayer, k, 1);
this.interactivePlayer = ((KeyListener)localObject2);
this.players.add(localObject2);
} else {
usage(null);
}
i = j + 2;
} else if ((paramArrayOfString[(paramInt + 1)].equals("split")) && (paramInt + 3 < paramArrayOfString.length))
{
PlaySplitter localPlaySplitter = new PlaySplitter(this.players.size(), Integer.parseInt(paramArrayOfString[(paramInt + 2)]), paramArrayOfString[(paramInt + 3)]);
this.players.add(localPlaySplitter);
i = 4;
} else {
i = 1 + parsePlayspec(paramArrayOfString, paramInt + 1);
}
}
if ((paramArrayOfString[paramInt].equals("duration")) && (paramInt + 1 < paramArrayOfString.length))
{
this.turns = Integer.valueOf(paramArrayOfString[(paramInt + 1)]).intValue();
i = 2;
}
return i;
}
private Game(String[] paramArrayOfString)
{
try {
int i = 0;
while (i < paramArrayOfString.length) {
if (paramArrayOfString[i].charAt(0) == '-')
paramArrayOfString[i] = paramArrayOfString[i].substring(1);
int j = consumeArg(paramArrayOfString, i);
if (j == 0)
usage(null);
i += j;
}
if ((this.views.size() == 0) || ((this.interactiveView == null) && (this.interactivePlayer != null)))
{
SimpleView localSimpleView = new SimpleView();
if (this.interactiveView == null)
this.interactiveView = localSimpleView;
this.views.add(localSimpleView);
}
if (this.interactivePlayer != null) {
this.interactiveView.addKeyListener(this.interactivePlayer);
}
makeUI();
this.sim = new Simulation();
} catch (Exception localException) {
System.err.println(localException);
System.exit(-1);
}
if (this.players.size() > 2)
usage(null);
while (this.players.size() < 2)
this.players.add(new DoNothingPlayer());
}
void run()
{
Object localObject;
this.sim.reset(this.views, this.players);
this.sim.run(this.turns);
for (Iterator localIterator = this.players.iterator(); localIterator.hasNext(); ) { localObject = (AbstractPlayer)localIterator.next();
((AbstractView)localObject).finished();
}
for (localIterator = this.views.iterator(); localIterator.hasNext(); ) { localObject = (AbstractView)localIterator.next();
((AbstractView)localObject).finished(); }
}
public static void main(String[] paramArrayOfString) {
Game localGame = new Game(paramArrayOfString);
localGame.run();
}
}