blob: 4a9a5f4984f968a7ccc44b53e8568ec525fbd8df [file] [log] [blame]
// MorgenGrauen MUDlib
//
// money.c -- Unser Geld
//
// $Id: money.c 8893 2014-08-04 19:48:56Z Zesstra $
inherit "/std/unit";
#pragma strong_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 nicht 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;
}