// block.c -- Hier sammeln sich die Raten fuer das Seherhaus
//
// (c) 1994 Wargon@MorgenGrauen
//
// $Id: block.c,v 1.2 2003/11/15 13:56:01 mud Exp $
//
#include <properties.h>
#include <language.h>
#include <moving.h>
#include <combat.h>
#include "haus.h"

inherit "/std/clothing";

private nosave int shadowing;

protected void create()
{
  if (!clonep(this_object())) return;

  ::create();

  SetProp( P_SHORT, "Der MG MASTER-BLOCK" );
  SetProp( P_NAME, "MASTERBLOCK" );
  SetProp( P_WEIGHT, 100 );
  SetProp( P_GENDER, MALE );
  SetProp( P_NODROP, 1 );
  SetProp( P_NEVERDROP, 1 );
  // wenn es keinen TP gibt, muss das Ding per SetProp(P_AUTOLOADOBJ)
  // konfiguriert werden, nicht hier. Zesstra, 20.10.2007
  if (objectp(this_player()))
    Set( P_AUTOLOADOBJ, ({ 0, this_player()->QueryProp(P_AGE) + MAX_TIME, 
	                   MAX_TIME/2, B_EP }) );
  Set( P_AUTOLOADOBJ, SECURED, F_MODE );
  SetProp( P_NOBUY, 1 );
  SetProp(P_MATERIAL, MAT_MARBLE);

  SetProp(P_WEAR_FUNC, this_object());
  SetProp(P_REMOVE_FUNC, this_object());

  AddId( ({ "block", "masterblock", "master-block", "MG MASTER-BLOCK", "mg master-block", "\n block" }) );

  AddCmd( "", "remindMe", 1);
}

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

int
WearFunc(object me)
{
  if (!shadowing && (Query(P_AUTOLOADOBJ)[V_FLAGS] & B_ACTIVE) ) {
    clone_object("/std/player/shadows/block_shadow");
    shadowing = 1;
  }
  return 1;
}

int
RemoveFunc(object me)
{
  // manchmal gibts keinen TP und machmal ist TP nicht der Spieler, der den
  // Block traegt.
  if (this_player() && this_player() == environment()) {
    shadowing = 0;
    this_player()->SeherHatGenug();
    return 1;
  }
  return 0;
}

static int
_query_value()
{
  return( Query(P_AUTOLOADOBJ)[0] );
}

static int
_query_cursed()
{
  return 0;
}

static int
_set_schwer(int schwer)
{
  int *al;

  al = Query(P_AUTOLOADOBJ);
  if (schwer && !(al[V_FLAGS] & B_FAST)) {
    al[V_DLINE] -= MAX_TIME/2;
    al[V_WTIME] /= 2;
    al[V_FLAGS] |= B_FAST;
  }
  else if (!schwer && (al[V_FLAGS] & B_FAST)) {
    al[V_DLINE] += MAX_TIME/2;
    al[V_WTIME] *= 2;
    al[V_FLAGS] &= ~B_FAST;
  }
  Set( P_AUTOLOADOBJ, al[0..]);
  return al[V_FLAGS] & B_FAST;
}

static int
_query_schwer()
{
  return (Query(P_AUTOLOADOBJ)[V_FLAGS] & B_FAST);
}

static mixed
_set_autoloadobj(mixed al)
{
  object ti;

  if ((ti = this_interactive()) && old_explode(object_name(ti),"#")[0] != "/secure/login")
    HLOG("SET_AL",sprintf("Block: TI = %O, ENV = %O\n",this_interactive(), environment()));

  /* Kompatibilitaet... */
  if (pointerp(al) && !(al[V_FLAGS] & B_EP)) {
    al[V_MONEY] *= 4;
    al[V_FLAGS] |= B_EP;
  }
  return Set(P_AUTOLOADOBJ, al);
}

static string
_query_long()
{
  int *al;
  int laufzeit, einzahlung;
  int ratenhoehe;
  string ret;

  al = Query(P_AUTOLOADOBJ);
  ret = "Dies ist der MG MASTER-BLOCK. Er besteht aus massivem Marmor, um die Sicher-\n"
       +"heit der eingezahlten Rate zu gewaehrleisten. Mit einem Goldkettchen versehen,\n"
       +"kann man ihn tragen wie ein Amulett. Dies ist auch noetig, wenn auf den Block\n"
       +"eingezahlt werden soll.\n";

  ratenhoehe = RATENHOEHE;
  if (al[V_FLAGS] & B_EXTEND)
    ratenhoehe += (RATENHOEHE*6)/10;
  laufzeit = 2*(al[V_DLINE]-this_player()->QueryProp(P_AGE));
  einzahlung = al[V_MONEY];

  if (laufzeit < 0)
    ret += "Leider hast Du die Zahlung dieser Rate verpasst!\n";
  else {
    if (einzahlung >= ratenhoehe)
      ret += "Er ist vollstaendig mit der Rate gefuellt.\n";
    else
      ret += sprintf( "Du hast bis jetzt %d (von %d) Punkten eingezahlt.\n", einzahlung, ratenhoehe );

    ret += time2string("Diese Rate muss bis in %h %H, %m %M und %s %S abbezahlt sein!\n", laufzeit);
  }
  return ret;
}

static int
remindMe()
{
  int noch, next, *al, ratenhoehe;
  object vertrag;

  al = Query(P_AUTOLOADOBJ);
  next = al[V_WTIME];
  ratenhoehe = RATENHOEHE;
  if (al[V_FLAGS] & B_EXTEND)
    ratenhoehe += (RATENHOEHE*6)/10;

  if (al[V_MONEY] < ratenhoehe) {
    noch = al[V_DLINE]-this_player()->QueryProp(P_AGE);
    if (noch >= 0) {
      if (next > noch) {
	call_out("doRemind", 0, this_player(), time2string( "Die naechste Rate wird in %h %H, %m %M und %s %S faellig!\n", 2*noch));
	do next -= WARN_TIME; while (next>0 && next>noch);
	if (next < 0)
	  next = 0;
	al[V_WTIME] = next;
	Set(P_AUTOLOADOBJ, al[0..]);
      }
    }
    else {
      if (al[V_FLAGS] & B_EXTEND) {
	string s;

	write( "Du hast die Strafrate nicht bezahlt!\n" );
	if (vertrag = present( "sehe\rvertrag", this_player())) {
	  write( "Damit verfaellt auch Dein Bausparvertrag! Und das im wahrsten Sinne des\nWortes...\n" );
	  vertrag->remove();
	}
	s = "Block: "+getuid(this_player())+" hat ueberzogen... ;)\n";
	HLOG(getuid(this_player()), s);
	HLOG("BANK.LOG", s);
	remove(1);
      }
      else {
	write( "Du hast die letzte Ratenzahlung verpasst!\n"
	      +"Die Ratenhoehe erhoeht sich um die Strafgebuehr.\n" );
	al[V_FLAGS] |= B_EXTEND;
	if (al[V_FLAGS] & B_FAST) {
	  al[V_DLINE] += MAX_TIME/4;
	  al[V_WTIME] = MAX_TIME/8;
	}
	else {
	  al[V_DLINE] += MAX_TIME/2;
	  al[V_WTIME] = MAX_TIME/4;
	}
	Set( P_AUTOLOADOBJ, al[0..]);
      }
    }
  }

  return 0;
}

int
Gutschreiben(int money)
{
  int back, ratenhoehe;
  mixed al;

  if (!QueryProp(P_WORN))  // Zum Gutschreiben muss der Block getragen werden!
    return money;

  al = Query(P_AUTOLOADOBJ);
  back = 0;

  ratenhoehe = RATENHOEHE;
  if (al[V_FLAGS] & B_EXTEND)
    ratenhoehe += (RATENHOEHE*6)/10;

  if (old_explode(object_name(previous_object()),"#")[0] != "/std/player/shadows/block_shadow") {
    mixed env;

    env = environment();
    if (env)
      env = getuid(env);
    else
      env = "BANK.LOG";
    HLOG(env, sprintf("Block: Gutschrift von aussen (%d EP), TI = %O)!\n", money, this_interactive()));
  }
  al[V_MONEY] += money;
  if (al[V_MONEY] >= ratenhoehe) {  // genug eingezahlt...
    back = al[V_MONEY]-ratenhoehe;
    al[V_MONEY] = ratenhoehe;
    al[V_FLAGS] &= ~B_ACTIVE;
    money -= back;
    call_out("blockVoll",0,environment());
  }

  Set(P_AUTOLOADOBJ, al[0..]);

  return back;
}

void
blockVoll(object pl)
{
  tell_object(pl, "Der Block fuer diese Rate ist jetzt voll!\n");
  pl->SeherHatGenug();	// shadow entfernen
}

void
doRemind(object pl, string str)
{
  tell_object(pl, str);
}

protected int PreventMove(object dest, object oldenv, int method) {
  if (previous_object() && previous_object()->QueryBuyFact()) // Im Laden...
    return ME_CANT_BE_DROPPED;
  return ::PreventMove(dest, oldenv, method);
}

protected void NotifyMove(object dest, object oldenv, int method) {

  if (oldenv || (object_name(previous_object()) != PATH+"sb_antrag" &&
		  object_name(previous_object()) != PATH+"sb_einzahlung" &&
		  object_name(previous_object()) != object_name(dest)))
    HLOG("MOVING", sprintf("Block: von %O -> %O mit %O (%O)\n",
			   environment(), dest,
			   previous_object(), getuid(previous_object())));

  return ::NotifyMove(dest, oldenv, method);
}

varargs int remove(int silent)
{
  if (clonep(this_object()) && environment())
    environment()->SeherHatGenug();

  return ::remove(silent);
}

// $Log: block.c,v $
// Revision 1.2  2003/11/15 13:56:01  mud
// MAT_MARBLE
//
// Revision 1.1.1.1  2000/08/20 20:22:42  mud
// Ins CVS eingecheckt
//
// Revision 1.4  1994/12/17  15:56:58  Wargon
// Etwas mehr Sicherheit gegen Zugriffe von aussen.
//
// Revision 1.3  1994/10/21  09:50:20  Wargon
// long()->_query_long()
// Shadow wird nur aktiv, wenn der Block gezueckt ist.
//
// Revision 1.2  1994/10/09  21:04:27  Wargon
// Man kann jetzt einstellen, ob der Block zu einem leichten, aber
// teureren oder zu einem schweren, aber billigeren Vertrag gehoert.
// Falls man eine Rate verpasst hat, verfaellt damit auch der Ver-
// trag.
// Gutgeschrieben wird nur, wenn der Block gezueckt ist.
// Gutschreiben() liefert ueberzaehliges Geld zurueck.
//
// Revision 1.1  1994/10/07  14:35:34  Wargon
// Initial revision
//
