/*
 *  bausparvertrag.c -- Wir geben unsern Sehern ein Zuhause...
 *
 *  Grundversion von Jof, weiterbearbeitet von Wargon.
 *
 * $Date: 1994/12/17 15:56:11 $
 * $Revision: 1.4 $
 * $Log: bausparvertrag.c,v $
 * Revision 1.4  1994/12/17  15:56:11  Wargon
 * Etwas mehr Sicherheit gegen Zugriffe von aussen.
 *
 * Revision 1.3  1994/10/21  09:52:03  Wargon
 * zerreissen eingebaut.
 *
 * Revision 1.2  1994/10/09  21:00:59  Wargon
 * Laufzeit etc. ausgebaut, da das ueber den Block abgewickelt
 * wird.
 * Funktion Einzahlung() eingebaut (wird von der Bank aufgerufen).
 *
 * Revision 1.1  1994/10/09  20:49:28  Wargon
 * Initial revision
 *
 */
#pragma strong_types,rtt_checks

#include "haus.h"
#include <properties.h>
#include <moving.h>

inherit "/std/thing";

protected void create()
{
  if (!clonep(this_object())) return;
  ::create();
  SetProp(P_SHORT,"Ein Bausparvertrag");
  SetProp(P_NAME,"Bausparvertrag");
  Set(P_AUTOLOADOBJ, ({0, V_EP}) );
  Set(P_AUTOLOADOBJ, SECURED, F_MODE); // Sicher ist sicher...
  SetProp(P_NODROP,1);
  SetProp(P_NEVERDROP,1);
  SetProp(P_ARTICLE,1);
  SetProp(P_WEIGHT, 0);
  SetProp(P_GENDER,1);
  AddId( ({"bausparvertrag", "vertrag", "sehe\rvertrag"}) );
  AddCmd("lies","lesen");
  AddCmd( ({ "unterschreibe", "unterschreib" }), lambda( ({}),
    ({#',, ({#'notify_fail, "Hier kannst Du den Vertrag nicht unterschreiben!\n" }),
	   ({#'return, 0})
    }) ) );
  AddCmd( ({ "zerreiss", "zerreisse" }), lambda( ({ 'str }),
    ({#',, ({#'notify_fail, "Was willst Du zerreissen?\n"}),
	   ({#'?!, ({#'id, 'str}), ({#'return, 0}) }),
	   ({#'=, 'blk, ({#'present, "\n block", ({#'this_player}) }) }),
	   ({#'write, "Du zerreisst Deinen Vertrag.\n"}),
	   ({#'write_file, PATH+"log/BANK.LOG", ({#'sprintf, "%s - Vertrag: %s zerriss ihn.\n",
	       ({#'dtime, ({#'time}) }), ({#'getuid, ({#'this_player})})})}),
	   ({#'?, 'blk, ({#'call_other, 'blk, "remove", 1}) }),
	   ({#'remove, 1}),
	   ({#'return, 1})
    }) ) );
}

string _query_long()
{
  int max;

  max = (Query(P_AUTOLOADOBJ)[1] & V_FAST) ? SUMME_S : SUMME_L;
  if (Query(P_AUTOLOADOBJ)[1] & V_RAUM)
    max = max * 4/10;
  return sprintf(
      "Dies ist ein Bausparvertrag. Du hast bisher %d (von %d) Punkten eingezahlt.\n",
      QueryProp(P_AUTOLOADOBJ)[0], max);
}

#if 0
int query_prevent_shadow(object ob)
{
  HLOG("SHADOW", sprintf("%s, von %O im Vertrag.\n", dtime(time())[5..], ob));
  return 1;
}
#endif

int lesen(string str)
{
  if (id(str))
  {
    if (Query(P_AUTOLOADOBJ)[1] & V_RAUM)
      this_player()->More(PATH+"txt/vertrag_raum.txt",1);
    else
      this_player()->More(PATH+"txt/vertrag.txt",1);
    return 1;
  }
  return 0;
}

int Einzahlung()
{
  int *al;
  object env, po;

  if (old_explode(object_name(po=previous_object()),"#")[0] != PATH+"sb_einzahlung") {
    env = environment();
    HLOG( (env ? getuid(env) : "BANK.LOG"), sprintf("Vertrag: Einzahlung von aussen! TI = %O, PO = %O\n", this_interactive(), previous_object()));
  }
  al = Query(P_AUTOLOADOBJ);
  return Set(P_AUTOLOADOBJ, ({ al[0]+RATENHOEHE, al[1] }) )[0];
}

void Sign(int flag)
{
  Set(P_AUTOLOADOBJ, ({ Query(P_AUTOLOADOBJ)[0], flag }) );
}

public int move(mixed dest, int meth)
{
  object penv;
  int ret;

  penv = environment();
  ret = ::move(dest, meth);

  if (ret == 1 && (penv || (object_name(previous_object()) != PATH+"sb_antrag" &&
			    object_name(previous_object()) != (stringp(dest) ? dest : object_name(dest)))))
    HLOG("MOVING", sprintf("Vertrag: von %O -> %O mit %O (%O)\n", environment(), dest, previous_object(), getuid(previous_object())));
  return ret;
}

mixed _set_autoloadobj(mixed al)
{
  // Loggen, wenn nicht vom Spielerobjekt selber via den
  // Autoloader-Mechanismus gesetzt.
  if (previous_object(1)
      && strstr(load_name(previous_object(1)),"/std/shells") != 0)
    HLOG("SET_AL",sprintf("Vertrag: TP = %O, PO = %O, ENV = %O\n",
          this_player(), previous_object(), environment()));

  /* Kompatibilitaet zu alten Vertraegen */
  if (pointerp(al) && !(al[1] & V_EP)) {
    al[0] *= 4;
    al[1] |= V_EP;
    call_out("notifyChange", 0, this_player());
  }
  return Set(P_AUTOLOADOBJ, al);
}

void notifyChange(object wem)
{
  tell_object(wem,
       "\nNACHRICHT VON DER SEHERBANK:\n"
      +"Die Vertragsmodalitaeten haben sich geaendert! Bitte lesen Sie den\n"
      +"Vertrag noch einmal genau durch (insbes. Art. 4)!\n"
      +"Statt Geld haben Sie jetzt Erfahrungspunkte zu zahlen!\n\n" );
}

