items.c-Dateireferenz

#include <thing/properties.h>
#include <thing/description.h>
#include <living/combat.h>
#include <npc.h>
#include <combat.h>
#include <config.h>
#include <moving.h>
#include <sys_debug.h>
Include-Abhängigkeitsdiagramm für items.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES

Funktionen

protected void create ()
protected void create_super ()
protected object * maybe_own_stuff ()
protected void _clone_items ()
public varargs object AddItem (mixed filename, int refresh, mixed props)
void reset ()

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 14 der Datei items.c.


Dokumentation der Funktionen

protected void _clone_items (  ) 

Definiert in Zeile 47 der Datei items.c.

Benutzt armours, CLONE_NO_CHECK, CLONE_WEAR, CLONE_WIELD, command, file(), i, items, maybe_own_stuff(), ob(), P_AC, P_ARMOURS, P_ITEMS, P_TOTAL_AC, P_TOTAL_WC, P_WC, P_WEAPON, P_WIELDED, P_WORN, QueryProp(), refresh, SetProp() und UseHands().

Wird benutzt von AddItem(), NotifyMove() und reset().

00048 {
00049   int i, j, mode, refresh;
00050   object ob, *inv1;
00051   mixed  props, *items;
00052   string file, *inv2;
00053 
00054   if (!pointerp(items=QueryProp(P_ITEMS))) return;
00055   if (environment()) { // Liste mit filenamen (inv2) erstellen.
00056     inv1 = maybe_own_stuff();
00057     inv2 = map(inv1, #'load_name);
00058   }
00059   else inv2=({}); // inv1 wird gar nicht mehr benoetigt
00060 
00061   for (i=sizeof(items)-1; i>=0; i--) {
00062     ob = items[i][RITEM_OBJECT];
00063     file = items[i][RITEM_FILE];
00064     mode = items[i][RITEM_REFRESH];
00065     refresh = mode & 0x0000ffff;
00066     props = items[i][RITEM_PROPS];
00067     if (props && intp(props)) { // unique Gegenstand?
00068       ob=find_object(file);
00069       if (ob) {
00070                 // kann ob aufgenommen werden? Wenn das Objekt in inv1 drin ist, ist es
00071                 // im Env oder in einer Leiche oder einem Haufen.
00072                 if (member(inv1,ob) > -1) {
00073                   if (environment()) {
00074                     if (environment(ob) == environment())
00075                       tell_room(environment(),
00076                                   capitalize(name(WER))+" hebt "+ob->name(WEN)+" auf.\n");
00077                     else
00078                       tell_room(environment(),break_string(
00079                                   capitalize(name(WER))+" nimmt "+ob->name(WEN)+ " aus "
00080                                   +environment(ob)->name(WEM) + ".",78));
00081                   }
00082                   ob->remove();  // zerstoeren und neuladen.
00083                   if (ob) destruct(ob);
00084                   if (catch(ob=load_object(file);publish))          
00085                       raise_error(sprintf(
00086                                 "_clone_items(): %O does not exist or is not loadable\n", file)); 
00087                   ob->move(this_object(), M_NOCHECK);
00088                   items[i][RITEM_OBJECT]=ob;
00089                 }
00090                 else switch( refresh ) {
00091                   case REFRESH_DESTRUCT:
00092                     if (environment(ob)) {
00093                       ob=0; // nicht zuecken, tragen, initialisieren...
00094                       break;
00095                     }
00096                   case REFRESH_ALWAYS:
00097                   case REFRESH_REMOVE:                          
00098                     ob->remove();
00099                     if (ob) destruct(ob);
00100                     if (catch(ob=load_object(file);publish)) 
00101                                 raise_error(sprintf("_clone_items(): "
00102                                       "%O does not exist or is not loadable\n", file));
00103                     ob->move(this_object(), M_NOCHECK);
00104                     items[i][RITEM_OBJECT]=ob;
00105                     break;
00106                   case REFRESH_NONE:
00107                   default: ob=0; // nicht zuecken, tragen, initialisieren...
00108                 }
00109       }
00110       else {
00111                 if (catch(ob=load_object(file);publish)) raise_error(sprintf(
00112                   "_clone_items(): %O does not exist or is not loadable\n", file));
00113                 if (objectp(ob)) ob->move(this_object(), M_NOCHECK);
00114                 items[i][RITEM_OBJECT]=ob;
00115       }
00116     } // if (props ...) // also nicht unique
00117     else {
00118       switch( refresh ) {
00119                 case REFRESH_DESTRUCT: // erfuellt auch REFRESH_REMOVE Bedingung...
00120                   if (ob) {
00121                     ob=0; // nicht zuecken, tragen, initialisieren...
00122                     break;
00123                   }
00124                 case REFRESH_REMOVE:
00125                   if (ob) {
00126             if(present(ob, this_object())) {
00127                       ob=0; // nicht zuecken, tragen, initialisieren...
00128                       break;
00129                     }
00130                     else {
00131                       if ((member(inv2, file))==-1) {  
00132                                 ob=0;
00133                       }
00134                     }
00135                   }
00136                 case REFRESH_NONE: // wird entfernt nach dem ersten clonen!!!
00137                 case REFRESH_ALWAYS:
00138                   // schauen ob der Gegenstand im environment liegt.
00139                   if ((j=member(inv2, file))!=-1) {
00140                     ob=inv1[j]; // inv1 kann leer sein, aber dann ist inv2 auch leer
00141                     inv1[j]=0; // wichtig falls mehrere gleiche AddItems
00142                     inv2[j]=0; // = 0 setzen um Array kopieren zu vermeiden
00143                     if (environment()) {
00144                       if (environment() == environment(ob))
00145                                 tell_room(environment(),
00146                                     capitalize(name(WER))+" hebt "+ob->name(WEN)+" auf.\n");
00147                       else
00148                                 tell_room(environment(),break_string(
00149                                     capitalize(name(WER))+" nimmt "+ob->name(WEN)+" aus "
00150                                     +environment(ob)->name(WEM) + ".",78));
00151                     }
00152                   }
00153                   if (ob) {
00154                     ob->remove();
00155                     if (ob) destruct(ob);
00156                   }
00157                   if (catch(ob=clone_object(file);publish)) raise_error(sprintf(
00158                     "_clone_items(): %O does not exist or is not loadable\n", file));
00159                   ob->move(this_object(), M_NOCHECK);
00160                   switch( refresh ) {
00161                   case REFRESH_NONE:
00162                     items[i] = 0; // Speicher freimachen
00163                     break;
00164                   case REFRESH_ALWAYS:
00165                     items[i][RITEM_OBJECT] = 0; // Objekt "vergessen"
00166                     break;
00167                   default:
00168                     items[i][RITEM_OBJECT] = ob;
00169                   }
00170                   break;
00171                 default: ob=0; // nicht zuecken, tragen, initialisieren...
00172       }
00173     } // if (props ...) else 
00174     if (ob) {
00175       if (mappingp(props)) walk_mapping(props, symbol_function("SetProp", ob));
00176       // Eigentlich will man hier sowas wie command("zuecke schwert")
00177       // machen, aber das handling der id's kann nicht sicherstellen,
00178       // dass der NPC die richtige Waffe erwischt, deshalb machen wir
00179       // das tragen hier von Hand.
00180       if (mode & CLONE_WEAR) {
00181                 if( mode & CLONE_NO_CHECK ) {
00182                   object *armours;
00183                   ob->DoUnwear(); // evtl. dem Vorgaenger abnehmen.
00184                   UseHands(ob, ob->QueryProp(P_NR_HANDS));
00185                   armours=QueryProp(P_ARMOURS)+({ ob });
00186                   SetProp(P_ARMOURS, armours);
00187                   SetProp(P_TOTAL_AC, QueryProp(P_TOTAL_AC)+ob->QueryProp(P_AC));
00188                   ob->SetProp(P_WORN, this_object());
00189                 } else {
00190                   command( "trage \n"+object_name(ob) );
00191                 }
00192       }
00193       if (mode & CLONE_WIELD) {
00194                 if( mode & CLONE_NO_CHECK ) {
00195                   ob->DoUnwield(); // evtl. dem Vorgaenger abnehmen. 
00196                   UseHands(ob, ob->QueryProp(P_NR_HANDS));
00197                   SetProp(P_WEAPON, ob);
00198                   SetProp(P_TOTAL_WC, ob->QueryProp(P_WC));
00199                   ob->SetProp(P_WIELDED, this_object());
00200                 } else {
00201                   command( "zuecke \n"+object_name(ob) );
00202                 }
00203       }
00204     } // if (ob) 
00205   } // for i
00206   items-=({ 0 }); // REFRESH_NONEs von nicht unique Objekten 
00207   if (!sizeof(items)) items=0; // Speicher sparen...
00208   SetProp(P_ITEMS, items);
00209   Set(NPC_NEEDS_ITEM_INIT, 0);
00210 }

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

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

public varargs object AddItem ( mixed  filename,
int  refresh,
mixed  props 
)

Definiert in Zeile 212 der Datei items.c.

Benutzt _clone_items(), MASTER, P_ITEMS, QueryProp() und SetProp().

00213 {
00214   // Aus Array ein Element auswaehlen
00215   if (pointerp(filename)) 
00216     filename = filename[random(sizeof(filename))];
00217  
00218   // Kein String? -> Fehler
00219   if (!stringp(filename)){
00220     raise_error("AddItem: filename or array of filenames expected.\n"); 
00221   } else {
00222     // Pfad normieren und eventuell vorhandenes ".c" entfernen
00223     filename = MASTER->_get_path(
00224                                   filename[<2..]==".c"?filename=filename[0..<3]
00225                                                       : filename,"?"); 
00226     // Property setzen
00227     SetProp(P_ITEMS, (QueryProp(P_ITEMS)||({}))+
00228                                      ({ ({ 0, filename, refresh, props }) }));
00229 
00230   if (environment()) _clone_items();
00231   }
00232 }

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

protected void create (  ) 

Definiert in Zeile 26 der Datei items.c.

Benutzt NPC_NEEDS_ITEM_INIT und Set().

00027 {
00028   // dieses flag ist nur bis zum ersten move gesetzt. Nimmt danach also auch
00029    Set(NPC_NEEDS_ITEM_INIT, 1);  // keinen Speicher mehr in Anspruch.
00030    // Set(P_ITEMS, ({})); // keine initialisierung spart Speicher  
00031 }

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

protected void create_super (  ) 

Definiert in Zeile 33 der Datei items.c.

Benutzt set_next_reset().

00033                               {
00034       set_next_reset(-1);
00035 }

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

protected object* maybe_own_stuff (  ) 

Definiert in Zeile 37 der Datei items.c.

Benutzt name, obs und WEM.

Wird benutzt von _clone_items().

00037                                     {
00038   object* obs = all_inventory(environment());
00039   object haufen = present("\nhaufen "+name(WEM),environment());
00040   if( objectp(haufen) ) obs += all_inventory(haufen);
00041   object leiche = present("\nleiche "+name(WEM),environment());
00042   if( objectp(leiche) ) obs += all_inventory(leiche);
00043   return obs;
00044 }

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

void reset ( void   ) 

Definiert in Zeile 234 der Datei items.c.

Benutzt _clone_items().

00236 {
00237   _clone_items();
00238 }

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

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