#pragma strong_types,rtt_checks

inherit "/std/container";
#include <moving.h>
#include <errord.h>
#include <config.h>
#include <language.h>
#include <living/comm.h>

object cloner;

protected void create()
{
  cloner=previous_object();
  ::create();
  // Das Objekt raeumt sich selber im reset auf. (D.h. kein Env-Check)
  SetAutoObject(1);
}

// Dieses Objekt raeumt sich immer im ersten reset auf - es ist kurzlebig und
// transient und Aenderungen an seinen Daten bleiben nicht erhalten.
void reset()
{
  remove(1);
}

public varargs void init(object origin)
{
  // leer ueberschreiben. Das klingt abstrus, hat aber folgenden Hintergrund:
  // dieses Objekt ist nicht dazu gedacht, in irgendeine Umgebung zu gelangen.
  // Und selbst wenn das jemand mit M_NOCHECK tut, soll die Interaktion dieses
  // Objekts mit anderen minimiert werden. Also keine Anmeldung von actions
  // etc.
}

// Auch dies ist ungewoehnlich: Bewegung nie erlauben, daher eruebrigt sich
// der Aufruf des geerbten PreventMove(). Auch wird M_NOCHECK nicht
// beruecksichtigt... Don't do this anywhere else.
protected int PreventMove(object dest, object oldenv, int method)
{
  // Wert vom PreventMove liefern (fuer Meldungen bzgl. P_NOGET & Co), aber
  // wenn das die Bewegung erlauben wurde, darf sie dennoch nicht stattfinden,
  // dann generischer Move-Fehler.
  return ::PreventMove(dest, 0, method) || ME_NOT_ALLOWED;
}

public object *AllVirtualEnvironments()
{
  if (cloner)
  {
    object *cloner_envs = all_environment(cloner)
                          || cloner->AllVirtualEnvironments();
    if (cloner_envs)
      return ({cloner}) + cloner_envs;
    return ({cloner});
  }
  return 0;
}

// Fehler werden nicht an diesem Objekt eingetragen, sondern am erzeugenden
// Objekt. Wenn das unbekannt ist, wird das Standardverfahren zum Logging
// verwendet.
public int SmartLog(string unused, string error_type, string meldung,
                    string date)
{
  // Wenn kein Cloner, loggt der Aufrufer (vermutlich an diesem Objekt).
  // Und ausserdem nur Meldungen von Spielershells akzeptieren.
  if (!cloner
      || strstr(load_name(previous_object()),"/std/shells/") == -1)
    return 0;

  mapping err = ([ F_PROG: "unbekannt",
           F_LINE: 0,
           F_MSG: meldung,
           F_OBJ: cloner
         ]);
  string desc="etwas unbekanntes";
  switch(error_type) {
    case "BUGS":
      desc="einen Fehler";
      err[F_TYPE]=T_REPORTED_ERR;
      break;
    case "DETAILS":
      desc="ein fehlendes Detail";
      err[F_TYPE]=T_REPORTED_MD;
      break;
    case "IDEA":
      desc="eine Idee";
      err[F_TYPE]=T_REPORTED_IDEA;
      break;
    case "TYPO":
      desc="einen Typo";
      err[F_TYPE]=T_REPORTED_TYPO;
      break;
    case "SYNTAX":
      desc="einen Syntaxhinweis";
      err[F_TYPE]=T_REPORTED_SYNTAX;
      break;
  }
  // Eintragung in die Fehler-DB
  string hashkey = ({string})ERRORD->LogReportedError(err);
  if (stringp(hashkey))
  {
    previous_object()->ReceiveMsg(sprintf(
          "Ein kleiner Fehlerteufel hat D%s an %s unter der ID %s "
          "notiert.",
          (cloner->IsRoom() ? "diesem Raum" : cloner->name(WEM,1)), desc,
          hashkey || "N/A"),
        MT_NOTIFICATION | MSG_DONT_BUFFER | MSG_DONT_STORE | MSG_DONT_IGNORE,
        MA_UNKNOWN, 0, this_object());
    return 1; // wurde erfolgreich protokolliert.
  }

  return 0; // nicht erfolgreich, Aufrufer muss protokollieren.
}
