unit.c-Dateireferenz

#include <unit.h>
#include <properties.h>
#include <defines.h>
#include <language.h>
#include <moving.h>
#include <wizlevels.h>
Include-Abhängigkeitsdiagramm für unit.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES
#define ZDEBUG(x)

Funktionen

protected void create ()
protected void create_super ()
static void check_leave ()
static int _set_amount (int am)
static int _query_u_req ()
static int _query_value ()
static int _set_value (int num)
static int _query_weight ()
static int _set_weight (int num)
static int _query_total_weight ()
static int _query_plural ()
static mixed _query_name ()
static mixed _set_name (mixed names)
void AddSingularId (mixed str)
void RemoveSingularId (mixed str)
void AddPluralId (mixed str)
void RemovePluralId (mixed str)
void SetCoinsPerUnits (int coins, int units)
void SetGramsPerUnits (int grams, int units)
int * QueryCoinsPerUnits ()
int * QueryGramsPerUnits ()
void AddAmount (int am)
int IsUnit ()
int IsEqual (object ob)
varargs string name (int fall, int demo)
varargs string QueryPronoun (int casus)
string short ()
varargs string long ()
varargs int id (string str, int lvl)
varargs int move (mixed dest, int method)
void reset ()
varargs int remove ()
protected void NotifyMove (object dest, object oldenv, int method)
private void _call_DoDecay (object *klone)
public int DoDecay (int silent)
protected void DoDecayMessage (int oldamount, int zerfall)
static int _query_unit_decay_interval ()
static int _set_unit_decay_interval (int zeit)
static int _query_unit_decay_quota ()
static int _set_unit_decay_quota (int quota)
static int _query_unit_decay_min ()
static int _query_unit_decay_flags ()

Variablen

inherit std thing
private nosave string lastverb

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 15 der Datei unit.c.

#define ZDEBUG ( x   ) 

Definiert in Zeile 27 der Datei unit.c.


Dokumentation der Funktionen

private void _call_DoDecay ( object *  klone  ) 

Definiert in Zeile 469 der Datei unit.c.

Benutzt call_out(), i, ME, NO_DECAY, P_UNIT_DECAY_FLAGS, QueryProp() und ZDEBUG.

00469                                           {
00470   ZDEBUG(sprintf("call_DoDecay() in %O\n",ME));
00471   // Clone oder kein Decay konfiguriert?
00472   if (clonep()
00473       || QueryProp(P_UNIT_DECAY_FLAGS) & NO_DECAY)
00474     return;
00475 
00476   if (!pointerp(klone))
00477     klone = clones(2);
00478   // Klone da?
00479   int i=sizeof(klone);
00480   if (!i)
00481     return;
00482 
00483   // in allen Klonen DoDecay rufen
00484   while(get_eval_cost() > __MAX_EVAL_COST__/2 && i--) {
00485     if (objectp(klone[i]))
00486       catch(call_other(klone[i],"DoDecay", 0);publish);
00487   }
00488   // das i ist schon abgearbeitet.
00489   i--;
00490   // noch was uebrig?
00491   if (i >= 0)
00492     call_out(#'_call_DoDecay, 4, klone[0..i]);
00493 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static mixed _query_name (  )  [static]

Definiert in Zeile 118 der Datei unit.c.

Benutzt P_NAME, Query() und U_REQ.

00119 {
00120   if (Query(U_REQ)==1)
00121     return "%s%s"+((string *)Query(P_NAME))[0];
00122   return "%d %s"+((string *)Query(P_NAME))[1];
00123 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _query_plural (  )  [static]

Definiert in Zeile 110 der Datei unit.c.

Benutzt i, Query() und U_REQ.

00111 {
00112   int i;
00113   i=Query(U_REQ); // wichtig _nicht_ QueryProp
00114   return (i<=1 ? 0 : i);
00115 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _query_total_weight (  )  [static]

Definiert in Zeile 99 der Datei unit.c.

Benutzt MAX, P_AMOUNT, Query() und U_GPU.

00100 {
00101   mixed gpu, amount;
00102   if ((amount=Query(P_AMOUNT))<1) return 0;
00103   gpu=Query(U_GPU);
00104   if (intp(gpu))
00105     return amount*(int)gpu;
00106   if (!pointerp(gpu)) return 0;
00107   return MAX(1,(amount*gpu[0])/gpu[1]);
00108 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _query_u_req (  )  [static]

Definiert in Zeile 58 der Datei unit.c.

Benutzt lastverb, P_AMOUNT, Query(), Set() und U_REQ.

00059 {
00060   if (lastverb!=query_verb()) {
00061     lastverb=0;
00062     Set(U_REQ, Query(P_AMOUNT));
00063   }
00064   return Query(U_REQ);
00065 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _query_unit_decay_flags (  )  [static]

Definiert in Zeile 690 der Datei unit.c.

00690                                      {
00691   if (clonep()) {
00692     // hat dieses Objekt einen eigenen wert gespeichert?
00693     int flags=Query(P_UNIT_DECAY_FLAGS, F_VALUE);
00694     if (flags)
00695       return flags;
00696     // sonst den Wert aus der Blueprint
00697     if (objectp(blueprint()))
00698       return blueprint()->QueryProp(P_UNIT_DECAY_FLAGS);
00699     else
00700       return load_object(load_name())->QueryProp(P_UNIT_DECAY_FLAGS);
00701   }
00702   // Die BP liefert den Wert auf jeden Fall ohne NO_DECAY_UNTIL_MOVE zurueck,
00703   // weil dieses Flag im Falle der BP nicht zurueckgesetzt wird und bei Clients 
00704   // ohne eigene Flags der Zerfall stoppen wuerde.
00705   return Query(P_UNIT_DECAY_FLAGS, F_VALUE) & ~NO_DECAY_UNTIL_MOVE;
00706 }

static int _query_unit_decay_interval (  )  [static]

Definiert in Zeile 604 der Datei unit.c.

00604                                         {
00605   if (clonep()) {
00606     // fuer clones den Wert aus der BP liefern, der Wert in Clones ist eh
00607     // uninteressant.
00608     if (objectp(blueprint()))
00609       return blueprint()->QueryProp(P_UNIT_DECAY_INTERVAL);
00610     else
00611       return load_object(load_name())->QueryProp(P_UNIT_DECAY_INTERVAL);
00612   }
00613   return Query(P_UNIT_DECAY_INTERVAL);
00614 }

static int _query_unit_decay_min (  )  [static]

Definiert in Zeile 675 der Datei unit.c.

00675                                    {
00676   if (clonep()) {
00677     // hat dieses Objekt einen eigenen wert gespeichert?
00678     int minimum=Query(P_UNIT_DECAY_MIN, F_VALUE);
00679     if (minimum)
00680       return minimum;
00681     // sonst den Wert aus der Blueprint
00682     if (objectp(blueprint()))
00683       return blueprint()->QueryProp(P_UNIT_DECAY_MIN);
00684     else
00685       return load_object(load_name())->QueryProp(P_UNIT_DECAY_MIN);
00686   }
00687   return Query(P_UNIT_DECAY_MIN, F_VALUE);
00688 }

static int _query_unit_decay_quota (  )  [static]

Definiert in Zeile 652 der Datei unit.c.

00652                                      {
00653   if (clonep()) {
00654     // hat dieses Objekt einen eigenen wert gespeichert?
00655     int quota=Query(P_UNIT_DECAY_QUOTA, F_VALUE);
00656     if (quota)
00657       return quota;
00658     // sonst den Wert aus der Blueprint
00659     if (objectp(blueprint()))
00660       return blueprint()->QueryProp(P_UNIT_DECAY_QUOTA);
00661     else
00662       return load_object(load_name())->QueryProp(P_UNIT_DECAY_QUOTA);
00663   }
00664   return Query(P_UNIT_DECAY_QUOTA, F_VALUE);
00665 }

static int _query_value (  )  [static]

Definiert in Zeile 68 der Datei unit.c.

Benutzt Query(), U_CPU und U_REQ.

00069 {
00070   mixed cpu;
00071   cpu=Query(U_CPU);
00072   if (intp(cpu)) return Query(U_REQ)*(int)cpu;
00073   if (!pointerp(cpu)) return 0;
00074   return (Query(U_REQ)*cpu[0])/cpu[1];
00075 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _query_weight (  )  [static]

Definiert in Zeile 83 der Datei unit.c.

Benutzt MAX, Query(), U_GPU und U_REQ.

00084 {
00085   mixed gpu, req;
00086   if ((req=Query(U_REQ))<1) return 0;
00087   gpu=Query(U_GPU);
00088   if (intp(gpu)) return req*(int)gpu;
00089   if (!pointerp(gpu)) return 0;
00090   return MAX(1,(req*gpu[0])/gpu[1]);
00091 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _set_amount ( int  am  )  [static]

Definiert in Zeile 51 der Datei unit.c.

Benutzt call_out(), P_AMOUNT, Set() und U_REQ.

00052 {
00053   if (am<1) call_out("check_leave",1);
00054   Set(U_REQ, am);
00055   return Set(P_AMOUNT,am);
00056 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static mixed _set_name ( mixed  names  )  [static]

Definiert in Zeile 126 der Datei unit.c.

Benutzt P_NAME, QueryProp() und Set().

00127 {
00128   if(!names)
00129     return Set(P_NAME,({"",""}));
00130   if(stringp(names))
00131     return Set(P_NAME,({names,names}));
00132   if(pointerp(names))
00133     switch(sizeof(names)) {
00134       case 0:  return Set(P_NAME,({"",""}));
00135       case 1:  if(!stringp(names[0]))
00136                  names[0]="";
00137                return Set(P_NAME,({names[0],names[0]}));
00138       default: if(!stringp(names[0]))
00139                  names[0]="";
00140                if(!stringp(names[1]))
00141                  names[1]="";
00142                return Set(P_NAME,names[0..1]);
00143     }
00144   return QueryProp(P_NAME);
00145 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _set_unit_decay_interval ( int  zeit  )  [static]

Definiert in Zeile 616 der Datei unit.c.

00616                                               {
00617   // fuer Clones ist die Prop sinnlos und kann nicht gesetzt werden.
00618   if (clonep()) {
00619     if (objectp(blueprint()))
00620       return blueprint()->QueryProp(P_UNIT_DECAY_INTERVAL);
00621     else
00622       return load_object(load_name())->QueryProp(P_UNIT_DECAY_INTERVAL);
00623   }
00624   // ueber diese Prop liesse sich der Reset relativ beliebig veraendern,
00625   // verhindern, etc. Daher darf sie nur von diesem Objekt gesetzt werden, von
00626   // Weisen+ oder eines Objektes, das die gleiche UID hat wie dieses hier oder
00627   // des Programmieres dieses Objekts oder eines Magiers, der berechtigt fuer
00628   // die jeweilige UID ist. Letztere beiden werden ueber den Ruf von
00629   // QueryUIDsForWizard() ermittelt.
00630   // erstes fremdes Objekt finden und pruefen.
00631   foreach(object po: caller_stack(1)) {
00632     if (po != ME) {
00633       // fremden Aufrufer gefunden
00634       if (getuid(po) != getuid(ME) 
00635                   && member(master()->QueryUIDsForWizard(getuid(po)),getuid(ME)) == -1
00636                   && (!this_interactive() || !IS_ELDER(this_interactive()) ) )
00637                 // unberechtigt, Abbruch
00638                 return QueryProp(P_UNIT_DECAY_INTERVAL);
00639       else
00640                 // nur das erste ext. Objekt in der Callkette wird geprueft, raus.
00641                 break;
00642     }
00643   }
00644   set_next_reset(zeit);
00645   // falls dies aus dem create() gesetzt wird, muss zeitverzoegert eine
00646   // Funktion von aussen am Objekt gerufen werden, da nach einem create() das
00647   // Objekt als resettet gilt und sonst keinen Reset kriegt.
00648   call_out("_query_unit_decay_interval",1);
00649   return Set(P_UNIT_DECAY_INTERVAL, zeit, F_VALUE);
00650 }

static int _set_unit_decay_quota ( int  quota  )  [static]

Definiert in Zeile 667 der Datei unit.c.

00667                                             { 
00668   // momentan nur quota zwischen 0 und 10000
00669   if (quota >= 0 && quota <=10000)
00670     return Set(P_UNIT_DECAY_QUOTA, quota, F_VALUE);
00671   else
00672     return Query(P_UNIT_DECAY_QUOTA, F_VALUE);
00673 }

static int _set_value ( int  num  )  [static]

Definiert in Zeile 77 der Datei unit.c.

Benutzt P_VALUE, Query(), QueryProp(), SetCoinsPerUnits() und U_REQ.

00077                                {
00078 // Setzt den Wert fuer die derzeitige Anzahl
00079   SetCoinsPerUnits(num, Query(U_REQ));
00080   return QueryProp(P_VALUE);
00081 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _set_weight ( int  num  )  [static]

Definiert in Zeile 93 der Datei unit.c.

Benutzt P_WEIGHT, Query(), QueryProp(), SetGramsPerUnits() und U_REQ.

00093                                 {
00094 // Setzt das Gewicht fuer die derzeitige Anzahl
00095     SetGramsPerUnits(num, Query(U_REQ));
00096     return QueryProp(P_WEIGHT);
00097 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void AddAmount ( int  am  ) 

Definiert in Zeile 216 der Datei unit.c.

Benutzt P_AMOUNT, Query() und SetProp().

00216                        {
00217   SetProp(P_AMOUNT, am+Query(P_AMOUNT));
00218 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void AddPluralId ( mixed  str  ) 

Definiert in Zeile 166 der Datei unit.c.

Benutzt ids, Query(), Set() und U_IDS.

Wird benutzt von create().

00167 {
00168   string *ids;
00169   
00170   if (!pointerp(str))
00171     str=({str});
00172   ids=Query(U_IDS);
00173   Set(U_IDS,({ids[0],ids[1]+str}));
00174 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void AddSingularId ( mixed  str  ) 

Definiert in Zeile 149 der Datei unit.c.

Benutzt ids, Query(), Set() und U_IDS.

Wird benutzt von create().

00150 {
00151   string *ids;
00152   if (!pointerp(str))
00153     str=({str});
00154   ids=Query(U_IDS);
00155   Set(U_IDS,({ids[0]+str,ids[1]}));
00156 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

static void check_leave (  )  [static]

Definiert in Zeile 48 der Datei unit.c.

Benutzt P_AMOUNT und Query().

00049 {  if (Query(P_AMOUNT)<1) remove();  }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

protected void create (  ) 

Definiert in Zeile 31 der Datei unit.c.

Benutzt create(), F_MODE_AS, P_AMOUNT, P_GENDER, P_UNIT_DECAY_INTERVAL, P_UNIT_DECAY_QUOTA, PROTECTED, Set(), SetProp() und U_IDS.

00032 {
00033   ::create();
00034   SetProp(U_IDS,({({}),({})}));
00035   SetProp(P_GENDER, 1);
00036   SetProp(P_AMOUNT, 1);
00037   // Props sollten nicht direkt manipuliert werden, nur ueber Set-Methoden
00038   Set(P_UNIT_DECAY_INTERVAL, PROTECTED, F_MODE_AS);
00039   Set(P_UNIT_DECAY_QUOTA, PROTECTED, F_MODE_AS);
00040 } 

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

protected void create_super (  ) 

Definiert in Zeile 42 der Datei unit.c.

Benutzt set_next_reset().

00042                               {
00043   set_next_reset(-1);
00044 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int DoDecay ( int  silent  ) 

Definiert in Zeile 497 der Datei unit.c.

00497                                {
00498   // nur fuer Clones
00499   if (!clonep())
00500     return 0;
00501   ZDEBUG(sprintf("DoDecay() in %O\n",ME));
00502 
00503   // wenn das Objekt NO_DECAY oder NO_DECAY_UNTIL_MOVE in den Flags
00504   // zerfaellt nix.
00505   int flags = QueryProp(P_UNIT_DECAY_FLAGS);
00506   if ((flags & NO_DECAY) || (flags & NO_DECAY_UNTIL_MOVE) )
00507     return QueryProp(P_AMOUNT);
00508 
00509   int quota = QueryProp(P_UNIT_DECAY_QUOTA);
00510 
00511   // Zugewinn ist nicht. Ausserdem kann nicht mehr zerfallen, als da ist...
00512   // Also ohne gueltiges Quota raus. Nur bei abs. Zerfall sind Zahlen > 10000
00513   // erlaubt, bei relativen Zerfall waere das sinnlos.
00514   if (quota <= 0 || 
00515       (quota > 10000 && !(flags & ABSOLUTE_DECAY) ) ) 
00516     return QueryProp(P_AMOUNT);
00517   
00518   int amount = QueryProp(P_AMOUNT);
00519   int minimum = QueryProp(P_UNIT_DECAY_MIN);
00520   // Zerfall nur, wenn man mehr als das Minimum hat.
00521   if (amount > minimum) {
00522     int zerfall;
00523     if (flags & ABSOLUTE_DECAY) {
00524       // Decay Quota soll einfach als abs. Zahl aufgefasst werden:
00525       zerfall = quota;
00526     }
00527     else if (flags & INACCURATE_DECAY) {
00528       // Rundungsfehler ignorieren und dafuer immer min. eine Einheit
00529       // zerfallen lassein
00530       zerfall = (amount * quota) / 10000;
00531       if (zerfall <= 0) zerfall = 1;
00532     }
00533     else {
00534       // Standardfall:
00535       // nicht-ganzzahligen Rest als Wahrscheinlichkeit fuer den Zerfall einer
00536       // Einheit auffassen
00537       float tmp = amount * quota / 10000.0;
00538       zerfall = to_int(tmp);
00539       tmp -= zerfall; // Rest in tmp
00540       // tmp*n ist eine Zahl zwischen 0 und n, wenn tmp*n > random(n)+1,
00541       // dann zerfaellt eine Einheit extra. Da das Random fuer grosse Zahlen
00542       // besser verteilt ist, nehm ich n = __INT_MAX__
00543       if (ceil(tmp * __INT_MAX__) > random(__INT_MAX__) + 1)
00544                 zerfall++;
00545     }
00546 
00547     // nicht unter Minimum zerfallen
00548     if (amount - zerfall < minimum)
00549       zerfall = amount - minimum;
00550 
00551     // erst ggf. Meldung ausgeben.
00552     if (!silent)
00553       DoDecayMessage(amount, zerfall);
00554     // dann runtersetzen.
00555     SetProp(P_AMOUNT, amount - zerfall);
00556     ZDEBUG(sprintf("%O decayed by %d\n",ME, zerfall));
00557     return amount-zerfall;
00558   }
00559   else if (amount < 0)
00560     return 0; // neg. Anzahl gilt als "0 uebrig".
00561   
00562   // sonst ists wohl zwischen 0 und minimum, nix aendert sich.
00563   return amount;
00564 }

protected void DoDecayMessage ( int  oldamount,
int  zerfall 
)

Definiert in Zeile 571 der Datei unit.c.

00571                                                           {
00572   string msg;
00573   if (oldamount == zerfall) {
00574     if (living(environment())) {
00575       tell_object(environment(), break_string(sprintf(
00576                   "Auf einmal %s%s zu Staub!",
00577                   (oldamount>1?"zerfallen Deine ":"zerfaellt D"), name(WER)),78));
00578     }
00579     // das tell_room() muss auf jeden fall sein, weil es "lebende" Raeume
00580     // gibt. Liegt der KRam in einem solchen wuerden die Livings in diesem Raum
00581     // sonst keine meldung kriegen.
00582     tell_room(environment(), break_string(sprintf(
00583                   "Auf einmal %s %s zu Staub!",
00584                   (oldamount>1?"zerfallen":"zerfaellt"), name(WER)),78),
00585                 ({environment()}));
00586   }
00587   else {
00588      if (living(environment())) {
00589       tell_object(environment(), break_string(sprintf(
00590                   "Auf einmal %s %d Deiner %s zu Staub!",
00591                   (zerfall>1?"zerfallen":"zerfaellt"),
00592                   zerfall, Query(P_NAME)[1]),78));
00593     }
00594     // das tell_room() muss auf jeden fall sein, weil es "lebende" Raeume
00595     // gibt. Liegt der KRam in einem solchen wuerden die Livings in diesem Raum
00596     // sonst keine meldung kriegen.
00597     tell_room(environment(), break_string(sprintf(
00598                   "Auf einmal %s %d %s zu Staub!",
00599                   (zerfall>1?"zerfallen":"zerfaellt"),
00600                   zerfall, Query(P_NAME)[1]),78), ({environment()}) ); 
00601   }
00602 }

varargs int id ( string  str,
int  lvl 
)

Definiert in Zeile 291 der Datei unit.c.

00292 {
00293   int i,amount;
00294   string s1,s2,*ids;
00295 
00296   if (!str) return 0;
00297   if (lastverb!=query_verb()) lastverb=0;
00298   if (::id(str)) {
00299     Set(U_REQ, Query(P_AMOUNT));
00300     lastverb=query_verb();
00301     return 1;
00302   }
00303   amount=Query(P_AMOUNT);
00304   //die casts auf 'mixed' sind absicht. Sonst geht der Driver offenbar davon
00305   //aus, dass ids[1] ein String ist. Es ist aber aber ein Array von Strings
00306   //und genau das will auch match_item() haben. ;-) Zesstra
00307   if (!amount || !(ids=Query(U_IDS))) return 0;
00308   if (match_item(str,(mixed)ids[1] )) {
00309     Set(U_REQ, amount);
00310     lastverb=query_verb();
00311     return 1;
00312   }
00313   if (match_item(str,(mixed)ids[0] )) {
00314     Set(U_REQ,1);
00315     lastverb=query_verb();
00316     return 1;
00317   }
00318   if (sscanf(str,"%s %s",s1,s2) && s1[0..3]=="alle" && 
00319     match_item(s2,(mixed)ids[1] )) {
00320     Set(U_REQ, amount);
00321     lastverb=query_verb();
00322     return 1;
00323   }
00324   if (sscanf(str,"%d %s",i,s1)==2 && i==1 && match_item(s1,(mixed)ids[0] )) {
00325     Set(U_REQ,1);
00326     lastverb=query_verb();
00327     return 1;
00328   }
00329   if (sscanf(str,"%d %s",i,s1)==2 && match_item(s1,(mixed)ids[1] ) && 
00330       i<=amount && i>0) {
00331     Set(U_REQ,i);
00332     lastverb=query_verb();
00333     return 1;
00334   }
00335   return 0;
00336 }

int IsEqual ( object  ob  ) 

Definiert in Zeile 224 der Datei unit.c.

Benutzt BLUE_NAME und ME.

00226 {
00227   if (ob==this_object()) return 0; // das ist ZU gleich :)
00228   return (BLUE_NAME(ME)==BLUE_NAME(ob));
00229 }

int IsUnit (  ) 

Definiert in Zeile 220 der Datei unit.c.

Wird benutzt von cmd_shoot().

00220              {
00221   return 1;
00222 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

varargs string long (  ) 

Definiert in Zeile 285 der Datei unit.c.

00286 {
00287   return (QueryProp(P_LONG) ? process_string(QueryProp(P_LONG)) : "")+
00288     sprintf("Du siehst %s.\n",name(WEN));
00289 }

varargs int move ( mixed  dest,
int  method 
)

Definiert in Zeile 338 der Datei unit.c.

00339 {
00340   int i, j, amount, req;
00341   string fname;
00342   mixed env;
00343   
00344   amount = QueryProp(P_AMOUNT);
00345   req = QueryProp(U_REQ);
00346   fname = BLUE_NAME(ME);
00347   
00348   if ( !(method & (M_MOVE_ALL|M_FORCE_SPLIT)) && amount != req ){
00349       env = environment(); // wird nur benoetigt bei amount!=U_REQ
00350       
00351      if ( env )
00352          env->query_weight_contents();
00353      // wenn in einem alten Paket das Gewicht noch nicht neu berechnet
00354      // wurde muss dies geschehn solange die Muenzen im Paket noch das
00355      // volle Gewicht haben...
00356      Set( P_AMOUNT, req );
00357   }
00358   
00359   i = ::move( dest, method );
00360   
00361   if ( i != 1 ){
00362       if (env){
00363           Set( P_AMOUNT, amount ); // verfruehte Aenderung rueckgaengig machen
00364           // ohne move auch keine Aenderung an P_LAST_CONTENT_CHANGE noetig
00365       }
00366       
00367       return i;
00368   }
00369   
00370   if (env) { // schliesst automatisch amount != req mit ein!
00371       if ( env == environment() && !(method & M_NOCHECK) ){
00372           // Objekt wurde nur an den Anfang des inventory bewegt, sonst nichts.
00373           Set( P_AMOUNT, amount ); // verfruehte Aenderung rueckgaengig machen.
00374           env = this_object();
00375           
00376           while ( env = environment(env) )
00377           // Ja. Man ruft die _set_xxx()-Funktionen eigentlich nicht direkt auf.
00378           // Aber das move() ist schon *so* rechenintensiv und gerade der
00379           // P_LAST_CONTENT_CHANGE-Cache wird *so* oft benoetigt, dass es mir
00380           // da um jedes bisschen Rechenzeit geht.
00381           // Der Zweck heiligt ja bekanntlich die Mittel. ;-)
00382           //
00383           // Tiamak
00384               env->_set_last_content_change(); // wurde beim ::move veraendert
00385       }
00386       else{ // verbleibende Muenzen zurueck moven
00387           object temp;
00388           temp = clone_object(fname);
00389           temp->SetProp( P_AMOUNT, amount-req );
00390           temp->move( env, M_NOCHECK );
00391       }
00392   }
00393   
00394   // wenn man in frisch geclonten Muenzen die noch kein environment haben
00395   // per Hand U_REQ auf einen Wert != P_AMOUNT setzt, so gehen die
00396   // Restmuenzen verloren (man behaelt ja eh keinen Zeiger darauf).
00397   if ( method & M_NOCHECK || !environment() )
00398       return 1;
00399 
00400   foreach(object item: all_inventory(environment())) {
00401       if ( IS_EQUAL(item) ) { // feature, bitte nicht ausbauen!!!
00402           amount = Query(P_AMOUNT) + item->Query(P_AMOUNT);
00403           item->Set( P_AMOUNT, 0 );
00404           item->remove();
00405 
00406           Set( P_AMOUNT, amount );
00407           if ( req < 0 )
00408               Set( U_REQ, amount );
00409       }
00410   }
00411 
00412   if ( amount < 1 )
00413       call_out( "check_leave", 1 );
00414   
00415   return 1;
00416 }

varargs string name ( int  fall,
int  demo 
)

Definiert in Zeile 233 der Datei unit.c.

Benutzt name, P_NAME_ADJ, Query(), QueryProp(), RAW und U_REQ.

00234 {
00235   int req;
00236   mixed n_adj;
00237   string adj;
00238 
00239   if ((req=Query(U_REQ))<1) return 0;
00240   if (fall!=RAW && 
00241       pointerp(n_adj=QueryProp(P_NAME_ADJ)) && sizeof(n_adj) )
00242     adj = implode(map(n_adj, #'DeclAdj, fall, demo && req==1), "");
00243   else
00244     adj = "";
00245 
00246   if (req==1)
00247     return sprintf(QueryProp(P_NAME),
00248                    (fall==RAW || !QueryProp(P_ARTICLE) 
00249                     ? "" : QueryArticle(fall,demo,1)), adj) /* +korrektur */;
00250 
00251   if (fall!=WEM)
00252     return sprintf(QueryProp(P_NAME), req, adj);
00253   else {
00254      int last;
00255      last=Query(P_NAME)[1][<1];
00256      return sprintf(QueryProp(P_NAME), req, adj)
00257                   +(last!='s' && last!='n' ? "n" : "");
00258   }
00259 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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

Definiert in Zeile 455 der Datei unit.c.

Benutzt NO_DECAY_UNTIL_MOVE, NotifyMove(), P_UNIT_DECAY_FLAGS, QueryProp() und SetProp().

00455                                                                   {
00456   //TODO: Kram aus dem move() hierher verlagern.
00457 
00458   // wenn NO_DECAY_UNTIL_MOVE an ist und dieses ein Move ist, was von einem
00459   // Env in ein anderes Env geht, loeschen. Nicht geloescht wird
00460   // hingegen, wenn das move() in das allererste Env erfolgt (nach dem Clonen)
00461   if ( (QueryProp(P_UNIT_DECAY_FLAGS) & NO_DECAY_UNTIL_MOVE)
00462       && objectp(dest) && objectp(oldenv) && dest != oldenv)
00463     SetProp(P_UNIT_DECAY_FLAGS, 
00464                 QueryProp(P_UNIT_DECAY_FLAGS) & ~NO_DECAY_UNTIL_MOVE );
00465   ::NotifyMove(dest, oldenv, method);
00466 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int* QueryCoinsPerUnits (  ) 

Definiert in Zeile 200 der Datei unit.c.

Benutzt Query() und U_CPU.

00201 {
00202   mixed cpu;
00203   cpu=Query(U_CPU);
00204   if (intp(cpu)) return ({ cpu, 1 });
00205   return cpu;
00206 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int* QueryGramsPerUnits (  ) 

Definiert in Zeile 208 der Datei unit.c.

Benutzt Query() und U_GPU.

00209 {
00210   mixed gpu;
00211   gpu=Query(U_GPU);
00212   if (intp(gpu)) return ({ gpu, 1 });
00213   return gpu;
00214 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs string QueryPronoun ( int  casus  ) 

Definiert in Zeile 261 der Datei unit.c.

Benutzt WEM und WER.

00262 {
00263   if (Query(U_REQ)==1)
00264     return ::QueryPronoun(casus);
00265   switch(casus) {
00266     case WESSEN: return "ihrer";
00267     case WEM:    return "ihnen";
00268     //default:     return "sie";
00269   }
00270   return("sie"); //fall-through
00271 }

varargs int remove (  ) 

Definiert in Zeile 445 der Datei unit.c.

Benutzt lastverb, P_AMOUNT, Query(), remove(), SetProp() und U_REQ.

00446 {
00447   if (lastverb==query_verb() && Query(P_AMOUNT)>Query(U_REQ)) {
00448     SetProp(P_AMOUNT, Query(P_AMOUNT)-Query(U_REQ));
00449     return 1;
00450   }
00451   return ::remove();
00452 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void RemovePluralId ( mixed  str  ) 

Definiert in Zeile 176 der Datei unit.c.

Benutzt Query(), Set() und U_IDS.

00177 { 
00178   if(stringp(str))
00179     str=({str});
00180   if(pointerp(str))
00181     return Set(U_IDS,({Query(U_IDS)[0],Query(U_IDS)[1]-str}));
00182 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void RemoveSingularId ( mixed  str  ) 

Definiert in Zeile 158 der Datei unit.c.

Benutzt Query(), Set() und U_IDS.

00159 { 
00160   if(stringp(str))
00161     str=({str});
00162   if(pointerp(str))
00163     return Set(U_IDS,({Query(U_IDS)[0]-str,Query(U_IDS)[1]}));
00164 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void reset ( void   ) 

Definiert in Zeile 418 der Datei unit.c.

00418              {
00419   if (!clonep(ME)) {
00420     // Blueprint ist Master fuer zerfallende Unitobjekte
00421     // das Decay sollte besser nicht durch manuellen Aufruf in der BP
00422     // ausgeloest werden, daher Pruefung hier (PO == ME, falls der Reset vom
00423     // Driver kommt).
00424     if (previous_object() && previous_object() != ME)
00425       return; 
00426     int zeit = QueryProp(P_UNIT_DECAY_INTERVAL);
00427     if (zeit > 0) {
00428       set_next_reset(zeit);
00429       // Das Callout muss auf jeden Fall gemacht werden, wenn ein Decay
00430       // Intervall gesetzt ist, damit die Blueprint auch den naechsten Reset
00431       // kriegt, auch wenn es jetzt keine Clone gibt. Wenn es kein Quota gibt,
00432       // kann der Callout wegfallen, beim Setzen eines Quota wird ja eine
00433       // Funktion an diesem Objekt gerufen.
00434       if (QueryProp(P_UNIT_DECAY_QUOTA) > 0)
00435                 call_out(#'_call_DoDecay, 1, 0);
00436     }
00437   }
00438   else {
00439     // Clones
00440     if (Query(P_AMOUNT)<1) remove();
00441     else ::reset();
00442   }
00443 }

void SetCoinsPerUnits ( int  coins,
int  units 
)

Definiert in Zeile 184 der Datei unit.c.

Benutzt Set() und U_CPU.

Wird benutzt von _set_value() und create().

00185 {
00186   if (coins<0||units<=0) return;
00187   if (units==1)
00188     Set(U_CPU, coins);
00189   else Set(U_CPU,({coins,units}));
00190 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void SetGramsPerUnits ( int  grams,
int  units 
)

Definiert in Zeile 192 der Datei unit.c.

Benutzt Set() und U_GPU.

Wird benutzt von _set_weight() und create().

00193 {
00194   if (grams<0||units<=0) return;
00195   if (units==1)
00196     Set(U_GPU, grams);
00197   else Set(U_GPU,({grams,units}));
00198 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

string short (  ) 

Definiert in Zeile 273 der Datei unit.c.

00274 {
00275   int req;
00276   if (!lastverb||query_verb()!=lastverb) Set(U_REQ, Query(P_AMOUNT));
00277   if ((req=Query(U_REQ))<1 || QueryProp(P_INVIS)) return 0;
00278   return capitalize(name(WER,0))+".\n";
00279   /*
00280   if (req>1) return sprintf(QueryProp(P_NAME), req)+".\n";
00281   return capitalize(sprintf(QueryProp(P_NAME), QueryArticle(WER,0,1)))+".\n";
00282   */
00283 }


Variablen-Dokumentation

private nosave string lastverb

Definiert in Zeile 29 der Datei unit.c.

Wird benutzt von _query_u_req() und remove().

inherit std thing

Definiert in Zeile 13 der Datei unit.c.

Erzeugt am Thu Jun 3 14:43:24 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3