public final boolean isAllTasksFinished() {
   for (OlympiadGameTask task : _tasks) {
     if (task.isRunning()) {
       return false;
     }
   }
   return true;
 }
  @Override
  public final void run() {
    if (Olympiad.getInstance().isOlympiadEnd()) {
      return;
    }

    if (Olympiad.getInstance().inCompPeriod()) {
      OlympiadGameTask task;
      AbstractOlympiadGame newGame;

      List<List<Integer>> readyClassed = OlympiadManager.getInstance().hasEnoughRegisteredClassed();
      boolean readyNonClassed = OlympiadManager.getInstance().hasEnoughRegisteredNonClassed();
      boolean readyTeams = OlympiadManager.getInstance().hasEnoughRegisteredTeams();

      if ((readyClassed != null) || readyNonClassed || readyTeams) {
        // set up the games queue
        for (int i = 0; i < _tasks.length; i++) {
          task = _tasks[i];
          synchronized (task) {
            if (!task.isRunning()) {
              // Fair arena distribution
              // 0,2,4,6,8.. arenas checked for classed or teams first
              if (((readyClassed != null) || readyTeams) && ((i % 2) == 0)) {
                // 0,4,8.. arenas checked for teams first
                if (readyTeams && ((i % 4) == 0)) {
                  newGame =
                      OlympiadGameTeams.createGame(
                          i, OlympiadManager.getInstance().getRegisteredTeamsBased());
                  if (newGame != null) {
                    task.attachGame(newGame);
                    continue;
                  }
                  readyTeams = false;
                }
                // if no ready teams found check for classed
                if (readyClassed != null) {
                  newGame = OlympiadGameClassed.createGame(i, readyClassed);
                  if (newGame != null) {
                    task.attachGame(newGame);
                    continue;
                  }
                  readyClassed = null;
                }
              }
              // 1,3,5,7,9.. arenas used for non-classed
              // also other arenas will be used for non-classed if no classed or teams available
              if (readyNonClassed) {
                newGame =
                    OlympiadGameNonClassed.createGame(
                        i, OlympiadManager.getInstance().getRegisteredNonClassBased());
                if (newGame != null) {
                  task.attachGame(newGame);
                  continue;
                }
                readyNonClassed = false;
              }
            }
          }

          // stop generating games if no more participants
          if ((readyClassed == null) && !readyNonClassed && !readyTeams) {
            break;
          }
        }
      }
    } else {
      // not in competition period
      if (isAllTasksFinished()) {
        OlympiadManager.getInstance().clearRegistered();
        _battleStarted = false;
        _log.log(Level.INFO, "Olympiad System: All current games finished.");
      }
    }
  }