// MorgenGrauen MUDlib
/** \file /file.c
* Kurzbeschreibung.
* Langbeschreibung...
* \author <Autor>
* \date <date>
* \version $Id$
*/
/* Changelog:
*/
#pragma strong_types, save_types, rtt_checks
#pragma no_clone, no_shadow
#pragma pedantic, range_check
#pragma warn_deprecated

private void check_all_player(mapping allplayer, closure check_cl,
                             closure finish_cl, int res,
                             varargs mixed extra)
{
  // offenbar fertig mit allen Spielern, Aufrufer informieren.
  if (!sizeof(allplayer))
  {
    funcall(finish_cl, extra...);
    return;
  }

  string dir=m_indices(allplayer)[0];
  string *pls=allplayer[dir];
  foreach(string pl: &pls)
  {
    if (get_eval_cost() < res)
      break; // spaeter weitermachen
    catch(funcall(check_cl, pl, extra...) ; publish);
    pl = 0;
  }
  pls-=({0});
  allplayer[dir] = pls;

  if (!sizeof(allplayer[dir]))
    m_delete(allplayer,dir);

  call_out(#'check_all_player,2, allplayer, check_cl, finish_cl, res, extra...);
}

protected int start_player_check(closure check_cl, closure finish_cl, int res,
                             varargs mixed extra)
{
  // Reservierte Ticks, pausieren, wenn weniger.
  res ||= 1250000;
  mapping allplayer=master()->get_all_players();
  call_out(#'check_all_player,2, allplayer, check_cl, finish_cl, res, extra...);
  return 1;
}

