#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>
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 () |
| 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 }


| 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 }

| 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 }

| protected void create_super | ( | ) |
Definiert in Zeile 33 der Datei items.c.
Benutzt set_next_reset().
00033 { 00034 set_next_reset(-1); 00035 }

| protected object* maybe_own_stuff | ( | ) |
Definiert in Zeile 37 der Datei items.c.
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 }

| void reset | ( | void | ) |
Definiert in Zeile 234 der Datei items.c.
Benutzt _clone_items().
00236 { 00237 _clone_items(); 00238 }

1.6.3