/**
   * Run the activities for the first character, in the order specified. Then repeat for the other
   * characters.
   */
  public void runActivities() {
    List<String> playerOrder = getGameState().getPlayerOrder();

    // run activities
    for (String clientId : playerOrder) {
      log.info("Running activities for clientId: " + clientId);

      // unalert weapon and unhide character for next day
      MRCharacter character = getGameState().getCharacter(clientId);
      character.reveal();
      character.getActiveWeapon().sleep();

      TileClearingLocation loc0 = getGameState().getBoard().getChitLocation(character);
      GameTile tile0 = getGameState().getBoard().getTile(loc0.getTileType());

      BirdsongActivities playerActivities = activities.get(clientId);
      for (Activity activity : playerActivities.getQueuedActivities()) {
        log.info("Executing activity " + activity);
        activity.execute(getGameState(), clientId);
        updateClients();
      }

      TileClearingLocation loc = getGameState().getBoard().getChitLocation(character);
      GameTile tile = getGameState().getBoard().getTile(loc.getTileType());

      if (tile0 != tile) {
        IClientService service = getGameState().getClientService(clientId);

        WarningChit wc = tile.getWarningChit();
        if (wc != null) service.sendMessage("Warning! " + wc.getWarningTile().name());
        if (tile.getSiteSoundChit() instanceof SoundChit) {
          String sound = ((SoundChit) tile.getSiteSoundChit()).getSoundType().name();
          sound = sound.substring(0, sound.length() - 1);
          service.sendMessage("Scary sounds of " + sound);
        }
      }
    }

    // switch state to evening
    EveningState eveningState = new EveningState(getGameState());
    getGameState().setState(eveningState);
    eveningState.init();
  }