public BattleState runBattleRound(Room currentRoom) throws BadGameStateException {
        // init has already taken place, it's in the constructor
        // ok, what are the *real* end conditions for the battle?
        boolean defendersAble = unitsAreAble(defenders);
        boolean attackersAreAble = unitsAreAble(attackers);
        boolean defenseFacilitiesAreAble = unitsAreAble(defenderBase.getDefenseFacilities());
        boolean anyDefendersAreAble = defendersAble || defenseFacilitiesAreAble;

        if (!anyDefendersAreAble && attackersAreAble) {
            // clear win for attacker!
            return BattleState.ATTACKER_WINS;
        } else if (!attackersAreAble) {
            // defender wins by default if attackers can't continue
            return BattleState.DEFENDER_WINS;
        } else if (anyDefendersAreAble && attackersAreAble) {
            // the attackers are able ... as are defenders or facilities, the battle continues!
            // set up a new room if required
            if (currentRoom == null || currentRoom.isDone()) {
                // set up a room to fight in
                currentRoom = new Room(MainUtil.getAbleUnits(attackers),
                        MainUtil.getAbleUnits(defenders),
                        MainUtil.getAbleUnits(defenderBase.getDefenseFacilities()));
            }
            // fight the round in this room
            List<MUnit> all = currentRoom.getAllAble();
            rollInitiativeAndSort(all);
            // now each occupant gets a turn
            for (MUnit occ : all) {
                RoomAction action = calcBestActionFromAllSkills(context, occ, all);
                action.execute();
            }

        } else {
            throw new BadGameStateException("Unknown Game State! This should be impossible.");
        }
        return BattleState.BUSY;
    }