    public void processEndOfRound() {
        InternalObject[] gameObjects = new InternalObject[gameObjectsByID.size()];
        gameObjects = gameObjectsByID.values().toArray(gameObjects);
        for (int i = 0; i < gameObjects.length; i++) {
            gameObjects[i].processEndOfRound();
        }
		if(timeLimitReached()&&winner==null) {
			List<InternalPowerNode> teamANodes = new ArrayList<InternalPowerNode>(connectedNodesByTeam.get(Team.A));
			List<InternalPowerNode> teamBNodes = new ArrayList<InternalPowerNode>(connectedNodesByTeam.get(Team.B));
			InternalRobot tower;
			for(InternalPowerNode n : teamANodes) {
				tower = nodeToTower(n);
				if(tower!=null)
					tower.takeDamage(GameConstants.TIME_LIMIT_DAMAGE/teamANodes.size());
			}
			for(InternalPowerNode n : teamBNodes) {
				tower = nodeToTower(n);
				if(tower!=null)
					tower.takeDamage(GameConstants.TIME_LIMIT_DAMAGE/teamBNodes.size());
			}
			removeDead();
			if(nodeToTower(baseNodes.get(Team.A))==null&&nodeToTower(baseNodes.get(Team.B))==null) {
				running=false;
				int diff=0;
				for(InternalPowerNode p : powerNodes) {
					if(p.getControllingTeam()==Team.A)
						diff++;
					else if(p.getControllingTeam()==Team.B)
						diff--;
				}
				if(!(setWinnerIfNonzero(diff,DominationFactor.BARELY_BEAT)||
					setWinnerIfNonzero(archons.get(Team.A).size()-archons.get(Team.B).size(),DominationFactor.BARELY_BEAT)||
					setWinnerIfNonzero(getEnergonDifference(),DominationFactor.BARELY_BEAT)))
				{
					if(teamAName.compareTo(teamBName)<=0)
						setWinner(Team.A,DominationFactor.WON_BY_DUBIOUS_REASONS);
					else
						setWinner(Team.B,DominationFactor.WON_BY_DUBIOUS_REASONS);
				}
			}
		}
        long aPoints = Math.round(teamRoundResources[Team.A.ordinal()] * 100), bPoints = Math.round(teamRoundResources[Team.B.ordinal()] * 100);
        roundStats = new RoundStats(teamResources[0] * 100, teamResources[1] * 100, teamRoundResources[0] * 100, teamRoundResources[1] * 100);
        lastRoundResources = teamRoundResources;
        teamRoundResources = new double[2];
    }

    public void processEndOfRound() {
        InternalObject[] gameObjects = new InternalObject[gameObjectsByID.size()];
        gameObjects = gameObjectsByID.values().toArray(gameObjects);
        for (int i = 0; i < gameObjects.length; i++) {
            gameObjects[i].processEndOfRound();
        }
		removeDead();
		if(timeLimitReached()&&winner==null) {
			List<InternalPowerNode> teamANodes = new ArrayList<InternalPowerNode>(connectedNodesByTeam.get(Team.A));
			List<InternalPowerNode> teamBNodes = new ArrayList<InternalPowerNode>(connectedNodesByTeam.get(Team.B));
			InternalRobot tower;
			for(InternalPowerNode n : teamANodes) {
				tower = nodeToTower(n);
				if(tower!=null)
					tower.takeDamage(GameConstants.TIME_LIMIT_DAMAGE/teamANodes.size());
			}
			for(InternalPowerNode n : teamBNodes) {
				tower = nodeToTower(n);
				if(tower!=null)
					tower.takeDamage(GameConstants.TIME_LIMIT_DAMAGE/teamBNodes.size());
			}
			removeDead();
			if(nodeToTower(baseNodes.get(Team.A))==null&&nodeToTower(baseNodes.get(Team.B))==null) {
				running=false;
				int diff=0;
				for(InternalPowerNode p : powerNodes) {
					if(p.getControllingTeam()==Team.A)
						diff++;
					else if(p.getControllingTeam()==Team.B)
						diff--;
				}
				if(!(setWinnerIfNonzero(diff,DominationFactor.BARELY_BEAT)||
					setWinnerIfNonzero(archons.get(Team.A).size()-archons.get(Team.B).size(),DominationFactor.BARELY_BEAT)||
					setWinnerIfNonzero(getEnergonDifference(),DominationFactor.BARELY_BEAT)))
				{
					if(teamAName.compareTo(teamBName)<=0)
						setWinner(Team.A,DominationFactor.WON_BY_DUBIOUS_REASONS);
					else
						setWinner(Team.B,DominationFactor.WON_BY_DUBIOUS_REASONS);
				}
			}
		}
        long aPoints = Math.round(teamRoundResources[Team.A.ordinal()] * 100), bPoints = Math.round(teamRoundResources[Team.B.ordinal()] * 100);
        roundStats = new RoundStats(teamResources[0] * 100, teamResources[1] * 100, teamRoundResources[0] * 100, teamRoundResources[1] * 100);
        lastRoundResources = teamRoundResources;
        teamRoundResources = new double[2];
    }
