// MorgenGrauen MUDlib
//
// money.c -- Unser Geld
//
// $Id: money.c 8893 2014-08-04 19:48:56Z Zesstra $

inherit "/std/unit";

#pragma strict_types,rtt_checks

#include <properties.h>
#include <language.h>
#include <defines.h>
#include <unit.h>
#include <money.h>

// zum debuggen (debugmode kommt aus /std/unit.c
#include <living/comm.h>
#define ZDEBUG(x) if (stringp(debugmode) && find_player(debugmode)) \
  find_player(debugmode)->ReceiveMsg(x,MT_DEBUG,0,object_name()+": ",ME)
//#define ZDEBUG(x)

protected void NotifyMove(object dest, object oldenv, int method)
{
  // Logg-Funktion, um Nicht-Standard-Geldbugs zu finden.
  // Eingebaut 27.03.2000 - Tiamak
  // Vor vereinigen mit anderen Geldobjekten in NotifyMove().
  object moneylog = find_object("/p/daemon/moneylog");
  if ( (!environment() && previous_object() &&
        !query_once_interactive(previous_object()) &&
        load_name(previous_object()) != GELD) &&
        moneylog)
      moneylog->AddMoney( previous_object(), Query(U_REQ) );

  // Hier passiert Vereinigung mit anderen Geldobjekten... Etc.
  ::NotifyMove(dest, oldenv, method);

  // Zu diesem Zeitpunkt sind Vereinigungen mit anderen Geldobjekten in dest
  // schon gelaufen, hier muessen jetzt noch Geldboersen und Seherkarten
  // beruecksichtigt werden.
  // Sollverhalten ist:
  // Vereinigung mit Boersen+geldkarten nur in Lebewesen.
  // Ausserdem soll nicht vereinigt werden, wenn man muenzen aus einer Boerse
  // nimmt. 
  // A) Betrag ist positiv:
  // A1) mit der ersten geld-enhaltenen Geldboerse im Inventar vereinigen.
  //     Gibt es keine geld-gefuellte, wird die erste leere genommen.
  // B) Betrag ist negativ:
  //    Es wird versucht, mit geldgefuellten Boersen und aktiven Seherkarten
  //    (d.h. Karten, diesem Environment gehoeren) zu vereinigen.
  //    Es wird erst einer Boersen "abgebucht" (falls vorhanden) und dann
  //    (falls noch noetig) von einer Geldkarte. Ist der Betrag am Ende
  //    negativ, wird ein Fehler ausgeloest.
  if (!living(dest))
    return;
  // wenn wir aus einer Boerse in diesem Environment kommen, vereinigen wir
  // uns nicht wieder erneut.
  if (load_name(oldenv) == BOERSE
      && environment(oldenv) == environment())
    return;

  int amount = QueryProp(P_AMOUNT);
  ZDEBUG(sprintf("NotifyMove 1: amount: %d\n",
         amount));
  if (amount > 0)
  {
    object boerse = present(GELDBOERSE_MIT_GELD, environment())
                    || present(BOERSEID, environment());
    if (boerse)
    {
      boerse->MergeMoney(this_object());
      // Sollten wir jetzt P_AMOUNT == 0 haben, zerstoert uns der Code aus
      // unit.c spaeter.
      ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 1: amount: %d\n",
             QueryProp(P_AMOUNT)));
    }
  }
  else if (amount < 0)
  {
    object boerse = present(GELDBOERSE_MIT_GELD, environment());
    if (boerse)
    {
      boerse->MergeMoney(this_object());
      ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 2: amount: %d\n",
             QueryProp(P_AMOUNT)));
    }
    // wenn immer noch was auszugleichen ist, Geldkarte versuchen.
    if (QueryProp(P_AMOUNT) < 0)
    {
      object geldkarte = present(SEHERKARTEID_AKTIV, environment());
      if (geldkarte)
      {
        geldkarte->MergeMoney(this_object());
        ZDEBUG(sprintf("NotifyMove nach Kartenvereinigung: amount: %d\n",
               QueryProp(P_AMOUNT)));
      }
    }
    if (QueryProp(P_AMOUNT) < 0)
      catch(raise_error(sprintf(
            "Geld mit negativem Betrag immer noch negativ nach "
            "Vereinigung mit allen Geldquellen im Inventar: %O. Rest: %d\n",
            environment(), QueryProp(P_AMOUNT))); publish);
  }
}

int _set_autoloadobj( mixed args )
{
  if (pointerp(args))
    args=args[0];
  if (stringp(args))
    sscanf(args,"%d",args);
  if (!intp(args))
    args=0;
  return SetProp(P_AMOUNT,args);
}

int _query_autoloadobj()
{
  return ({int})Query(P_AMOUNT, F_VALUE);
}

string current_long() {
 int r;
 r=Query(U_REQ);
 return(break_string(
  ((r==1)?"":"Du betrachtest eine der Muenzen genauer:\n")+
  "Die Oberflaeche der Goldmuenze ist vom taeglichen Gebrauch ziemlich "
  "mitgenommen. Kratzer und sogar Bissspuren zieren die Praegemuenze "
  "zusaetzlich zum Konterfei "+
  ({"des Jof","der Rumata","des Zook"})[(Query(P_AMOUNT)+r)%3]+
  ". Der Rand "+
  ((!(r%2))?"scheint etwas beschaedigt zu sein.":
            "ist wenigstens unbeschaedigt."),
  78,0,BS_LEAVE_MY_LFS));
}

static int action_schnipps(string str) {
 if(!id(str)) return 0;
 write(break_string(
  ((Query(U_REQ)==1)?"Du nimmst die Muenze":
                     "Du nimmst eine der Muenzen")+
  " und schnippst sie in die Luft. Sie klingt hell auf. "+
  ((this_player() && this_player()->QueryAttribute(A_DEX)>10)?
   "Geschickt faengst Du sie wieder auf.":
   "Sie plumpst Dir wieder in die Hand und beinahe laesst Du "
   "sie fallen."),78));
 if(this_player() && environment(this_player()))
  tell_room(environment(this_player()),
            break_string(this_player()->Name()+" schnippt mit hellem "
                         "Klingen ein Muenze in die Luft und faengt sie "
                         "wieder.",78),
            ({this_player()}));
 return 1;
}

static int action_pruefe(string str) {
 if(!id(str)) return 0;
 write(break_string(
  ((Query(U_REQ)==1)?"Du nimmst die Muenze":
                     "Du nimmst eine der Muenzen")+
  " und beisst vorsichtig hinein. Dein Zahn versinkt tief im reinen Gold, "
  "und Du bist Dir nun sicher, dass diese Muenze auch wirklich echt ist.",
  78));
 if(this_player() && environment(this_player()))
  tell_room(environment(this_player()),
            break_string(this_player()->Name()+" beisst in eine Muenze "
                         "und schaut irgendwie befriedigt drein.",78),
            ({this_player()}));
 return 1;
}


static string DetKonterfei() {
 string m;
 switch((Query(P_AMOUNT)+Query(U_REQ))%3) {
  default:
  case 0:
        m="Jofs rundes Gesicht grinst Dich vertrauenserweckend und "
          "freundlich an.";break;
  case 1:
        m="Rumata scheint Dir zuzublinzeln.";break;
  case 2:
        m="Zooks Gesicht schaut ziemlich frisch gepraegt drein. Wenn "
          "eine der Muenzen beim Schnippen klingt, dann bestimmt die.";break;
 }
 return(break_string(m,78));
}


static string DetRand() {
 return(break_string(
  ((!(Query(U_REQ)%2))?
            "Der Rand der Muenze ist zerklueftet und abgeschabt. Ob "
            "da jemand versucht hat, das Gold der Muenze abzuschaben, "
            "um sich etwas nebenher zu verdienen?":
            "Der Rand ist vollkommen in Ordnung, ein wirklich frische "
            "Praegung."),78));
}


static int action_wurf(string str)
{
  int num, part;

  if (!id(str))
    return 0;

  num = Query(U_REQ);
  write (break_string(
	 ((num==1)?"Du nimmst die Muenze":
	  sprintf("Du nimmst %d Muenzen", num))+
	   ", wirfst sie hoch, laesst sie zu Boden prasseln und "
	   "betrachtest das Ergebnis:", 78));
  if (this_player() && environment(this_player()))
    tell_room(environment(this_player()),
	      break_string(this_player()->Name()+" wirft "+
         	   ((num==1)?"eine Muenze":
			   sprintf("%d Muenzen", num))+
		   " hoch, laesst sie zu Boden prasseln und betrachtet "
		   +"das Ergebnis:", 78), ({this_player()}));

  if (num == 1) {
    if (random(1000000) == 123456) {
      write("   Die Muenze bleibt auf dem Rand stehen.\n");
      if (this_player() && environment(this_player()))
	tell_room(environment(this_player()),
		  "   Die Muenze bleibt auf dem Rand stehen.\n",
		  ({this_player()}));
    }
    else if (random(100) < 50) {
      write("   Kopf.\n");
      if (this_player() && environment(this_player()))
	tell_room(environment(this_player()),
		  "   Kopf.\n",
		  ({this_player()}));
    }
    else {
      write("   Zahl.\n");
      if (this_player() && environment(this_player()))
	tell_room(environment(this_player()),
		  "   Zahl.\n",
		  ({this_player()}));
    }
  }
  else {
    part = 5*num + random(num+1) - random(num+1) // etwas Gauss-verteilen
		 + random(num+1) - random(num+1)
		 + random(num+1) - random(num+1)
		 + random(num+1) - random(num+1)
		 + random(num+1) - random(num+1);
    part = (part+5)/10;

    if (part) {
      printf("   %dx Kopf", part);
      if (part != num)
	printf(" und %dx Zahl", num-part);
      if(this_player() && environment(this_player()))
	tell_room(environment(this_player()),
		  sprintf("   %dx Kopf", part)+
		  ((part!=num)?sprintf(" und %dx Zahl", num-part):"")+
		  ".\n",
		  ({this_player()}));
    }
    else {
      printf("   %dx Zahl", num);
      if (this_player() && environment(this_player()))
	tell_room(environment(this_player()),
		  sprintf("   %dx Zahl.\n", num),
		  ({this_player()}));
    }
    write (".\n");
  }

  write(break_string(
	"Schnell sammelst Du "+
	((num==1)?"Deine Muenze":"Deine Muenzen")+" wieder ein.", 78));
  if (this_player() && environment(this_player()))
    tell_room(environment(this_player()),
	      break_string(this_player()->Name()+ " sammelt schnell "+
	      ((num==1)?(this_player()->QueryPossPronoun(FEMALE,WEN, SINGULAR)
			 +" Muenze wieder ein."):
	       (this_player()->QueryPossPronoun(FEMALE,WEN, PLURAL)+
		" Muenzen wieder ein."))), ({this_player()}));
  return 1;
}

protected void create()
{
  mixed plist, i;

  ::create();
  SetProp(P_NAME,({"Muenze","Muenzen"}));
  Set(P_LONG,#'current_long);
  SetProp(P_SHORT,"Geld");
  SetProp(P_INFO,"Du hast bei diesem Geld ein sicheres Gefuehl.\n");
  SetProp(P_MATERIAL,([MAT_GOLD:100]));
  AddSingularId("muenze");
  AddPluralId("muenzen");
  AddSingularId("goldstueck");
  AddPluralId("goldstuecke");
  AddId(({"geld", GELDID}));
  SetProp(P_GENDER,FEMALE);
  SetCoinsPerUnits(1,1);
  SetGramsPerUnits(1,4);

  if (!clonep(this_object())) {
    set_next_reset(-1);
    return;
  }
  AddDetail(({"rand","muenzrand"}),#'DetRand);
  AddDetail(({"oberflaeche","flaeche"}),break_string(
   "Diese Muenze ist schon durch viele Haende gegangen. Die Kratzer "
   "zeugen davon, dass sie selten allein getragen wurde, und die "
   "Bissspuren von mangelndem Vertrauen.",78));
  AddDetail("kratzer",break_string(
   "Das Konterfei ist schon ganz schoen zerkratzt.",78));
  AddDetail(({"bissspur","bissspuren"}),break_string(
   "Da hat doch tatsaechlich jemand so wenig Vertrauen in das Gold "
   "gezeigt, dass er hineingebissen hat, um es zu pruefen.",78));
  AddDetail(({"bild","konterfei","praegung"}),#'DetKonterfei);
  AddDetail("gold","Es glaenzt Dich verheissungsvoll an.\n");

  AddCmd(({"pruef","pruefe","beiss","beisse","test","teste"}),
         #'action_pruefe);
  AddCmd(({"schnipp","schnippe","schnipps","schnippse"}),
         #'action_schnipps);

  AddCmd( ({ "wirf", "werf", "werfe" }), #'action_wurf);
}

varargs string GetDetail(mixed key,mixed race,int sense) {
 string m;
 if(stringp(m=::GetDetail(&key,&race,&sense)) && sizeof(m)) {
  int r;
  r=Query(U_REQ);
  if(r!=1) m=sprintf("Du betrachtest eine der %d Muenzen genauer:\n",r)+m;
 }
 return m;
}

