public void run() {
    // Make the initial map data, convert to PIT format
    String parts[] = gameData.split("\\|");
    String planets[] = parts[0].split(":");
    String planetData[];
    StringBuilder map = new StringBuilder();
    StringBuilder planet;
    for (String p : planets) {
      planetData = p.split("\\,");
      planet = new StringBuilder("P");

      for (String _p : planetData) {
        planet.append(" ");
        planet.append(_p);
      }
      map.append(planet.toString());
      map.append("\n");
    }
    String mapPIT = map.toString();
    String turns[] = parts[1].split(":");
    // Create the games by issuing the same orders as the game would
    // copy the object each move into a buffer for rendering
    games = new Game[turns.length];
    // initial game object
    Game tGame = new Game(mapPIT, turns.length + 1, 1, "log.txt");
    tGame.Init();
    for (int i = 0; i < turns.length; ++i) {
      Game thisFrame = (Game)tGame.clone();
      String[] items = turns[i].split("\\,");
      for (int j = 0; j < tGame.NumPlanets(); ++j) {
        Planet p = thisFrame.GetPlanet(j);
        String[] fields = items[j].split("\\.");
	p.Owner(Integer.parseInt(fields[0]));
	p.NumShips(Integer.parseInt(fields[1]));
      }
      //System.out.println("NumPlanets: " + tGame.NumPlanets());
      //System.out.println("Items:");
      //for (int j = 0; j < items.length; ++j) {
      //  System.out.println("    " + j + ": " + items[j]);
      //}
      for (int j = tGame.NumPlanets(); j < items.length; ++j) {
        String[] fields = items[j].split("\\.");
        Fleet f = new Fleet(Integer.parseInt(fields[0]),
			    Integer.parseInt(fields[1]),
			    Integer.parseInt(fields[2]),
			    Integer.parseInt(fields[3]),
			    Integer.parseInt(fields[4]),
			    Integer.parseInt(fields[5]));
	thisFrame.AddFleet(f);
      }
      games[i] = thisFrame;
    }
    for (JButton btn : buttons) {
      if (btn != pauseButton)
        btn.setEnabled(true);
    }
    lastClicked = pauseButton;
    progress.setIndeterminate(false);
    progress.setMaximum(100 * games.length);
    progress.setStringPainted(true);
    progress.setString("0 / " + Integer.toString(games.length));
    int millisecondsBetweenFrames = (int)((double)1000 / desiredFramerate);
    timer = new Timer(millisecondsBetweenFrames, this);
    timer.setActionCommand("animTick");
    update();
  }