#include "/sys/thing/properties.h"#include <defines.h>#include <thing/description.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
| #define | ENV environment |
| #define | PO previous_object() |
| #define | POS_INVERS 0x01 |
| #define | POS_LETZTES 0x02 |
Funktionen | |
| static int | _query_total_weight () |
| void | create () |
| static int | _query_last_content_change () |
| public varargs int | _set_last_content_change (mixed wert) |
| int | query_weight_contents () |
| static int | _query_total_objects () |
| int | MayAddObject (object ob) |
| int | MayAddWeight (int w) |
| varargs int | PreventInsert (object ob) |
| varargs int | PreventLeave (object ob, mixed dest) |
| varargs int | PreventInsertLiving (object ob) |
| varargs int | PreventLeaveLiving (object ob, mixed dest) |
| static int | _behalten (object ob, string uid) |
| object * | present_objects (string complex_desc) |
| object * | locate_objects (string complex_desc, int info) |
Variablen | |
| private nosave int | LastWeightCalc |
| private nosave int | contents |
| private nosave int | LastObjectCount |
| private nosave int | objcount |
| private nosave int | last_content_change |
| #define ENV environment |
Definiert in Zeile 125 der Datei restrictions.c.
| #define NEED_PROTOTYPES |
Definiert in Zeile 30 der Datei restrictions.c.
| #define PO previous_object() |
Definiert in Zeile 126 der Datei restrictions.c.
| #define POS_INVERS 0x01 |
Definiert in Zeile 204 der Datei restrictions.c.
Wird benutzt von present_objects().
| #define POS_LETZTES 0x02 |
Definiert in Zeile 205 der Datei restrictions.c.
Wird benutzt von present_objects().
| static int _behalten | ( | object | ob, | |
| string | uid | |||
| ) | [static] |
Definiert in Zeile 192 der Datei restrictions.c.
Benutzt P_KEEP_ON_SELL.
00193 { 00194 return (string)ob->QueryProp(P_KEEP_ON_SELL) == uid; 00195 }
| static int _query_last_content_change | ( | ) | [static] |
Definiert in Zeile 58 der Datei restrictions.c.
Benutzt last_content_change.
Wird benutzt von _query_int_light() und _query_total_light().
00059 { 00060 return last_content_change; 00061 }

| static int _query_total_objects | ( | ) | [static] |
Definiert in Zeile 99 der Datei restrictions.c.
Benutzt last_content_change, LastObjectCount und objcount.
00100 { 00101 if ( last_content_change == LastObjectCount ) 00102 return objcount; 00103 00104 objcount = sizeof( filter_objects( all_inventory(), "short" ) ); 00105 LastObjectCount = last_content_change; 00106 return objcount; 00107 }
| static int _query_total_weight | ( | ) | [static] |
Definiert in Zeile 184 der Datei restrictions.c.
Benutzt P_WEIGHT, P_WEIGHT_PERCENT, query_weight_contents() und QueryProp().
00185 { 00186 return QueryProp(P_WEIGHT) + 00187 (QueryProp(P_WEIGHT_PERCENT) * query_weight_contents() / 100); 00188 }

| public varargs int _set_last_content_change | ( | mixed | wert | ) |
Definiert in Zeile 66 der Datei restrictions.c.
Benutzt last_content_change.
00067 { 00068 // Der uebergebene Wert ist unerheblich. Die Property 00069 // P_LAST_CONTENT_CHANGE wird so oder so bei jedem SetProp()- 00070 // Aufruf um eins erhoeht, um der 2s-"Unschaerfe" von time() 00071 // aus dem Weg zu gehen. 00072 return ++last_content_change; 00073 }
| void create | ( | ) |
Definiert in Zeile 45 der Datei restrictions.c.
Benutzt F_MODE, F_SET_METHOD, LastObjectCount, LastWeightCalc, NOSETMETHOD, P_MAX_OBJECTS, P_TOTAL_OBJECTS, P_TOTAL_WEIGHT, P_WEIGHT_PERCENT, PROTECTED und Set().
00046 { 00047 Set( P_WEIGHT_PERCENT, 50 ); 00048 Set( P_TOTAL_WEIGHT, NOSETMETHOD, F_SET_METHOD ); 00049 Set( P_TOTAL_WEIGHT, PROTECTED, F_MODE ); 00050 Set( P_MAX_OBJECTS, 100 ); 00051 Set( P_TOTAL_OBJECTS, NOSETMETHOD, F_SET_METHOD ); 00052 Set( P_TOTAL_OBJECTS, PROTECTED, F_MODE ); 00053 LastWeightCalc = -1; 00054 LastObjectCount = -1; 00055 }

| object* locate_objects | ( | string | complex_desc, | |
| int | info | |||
| ) |
Definiert in Zeile 448 der Datei restrictions.c.
Benutzt present_objects().
00448 { 00449 string was, wo; 00450 00451 if ( sscanf( complex_desc, "%s in %s", was, wo ) == 2 ){ 00452 object *found_obs = ({}); 00453 foreach(object invob: present_objects(wo)) { 00454 // || ({}) weil invob ein Objekt ohne locate_objects() sein koennte. 00455 found_obs += (object *)invob->locate_objects( was, info) || ({}); 00456 } 00457 return found_obs; 00458 } 00459 // kein "in" gefunden 00460 return present_objects( complex_desc ); 00461 }

| int MayAddObject | ( | object | ob | ) |
Definiert in Zeile 111 der Datei restrictions.c.
Benutzt ME, P_MAX_OBJECTS, P_TOTAL_OBJECTS und QueryProp().
00112 { 00113 if (ob) { 00114 if ( !ob->short() ) 00115 return 1; // invis-Objekte duerfen immer 00116 00117 if ( ob == ME || environment(ob) == ME) 00118 return 1; // objekt ist schon drin 00119 } 00120 00121 return (QueryProp(P_TOTAL_OBJECTS) < QueryProp(P_MAX_OBJECTS)); 00122 }

| int MayAddWeight | ( | int | w | ) |
Definiert in Zeile 128 der Datei restrictions.c.
Benutzt ENV, ME, P_MAX_WEIGHT, P_WEIGHT_PERCENT, PO, query_weight_contents() und QueryProp().
00129 { 00130 int nw, aw; 00131 00132 // was nix wiegt, passt 00133 if ( w <= 0 ) 00134 return 0; 00135 00136 nw = w; // Gewicht im neuen Container 00137 aw = 0; // Gewicht fuer das env() 00138 00139 // Von Raum in Behaelter im Spieler: Container sieht volles Gewicht (nw=w), 00140 // Check im env() (Spieler) mit reduziertem Gewicht. 00141 if ( ENV() && PO && ENV(PO) != ENV() ) 00142 aw = QueryProp(P_WEIGHT_PERCENT) * w / 100 || 1; 00143 00144 if ( PO && ENV(PO) && ENV(ENV(PO)) ){ 00145 // Wenn das Objekt ein env() hochbewegt wird, wird das Gewicht im alten 00146 // Container abgezogen. Weiterer Check im env() ist unnoetig (aw=0). 00147 if ( ENV(ENV(PO)) == ME ) 00148 nw = w - (int)ENV(PO)->QueryProp(P_WEIGHT_PERCENT) * w / 100; 00149 // Eine Ebene tiefer bewegen: Test im neuen Container mit unveraendertem 00150 // Gewicht; Check im env() mit um Gewichtsreduktion verringertem Gewicht 00151 else if ( present( ME, ENV(PO) ) ) 00152 aw = QueryProp(P_WEIGHT_PERCENT) * w / 100 - w; 00153 // Auf derselben Ebene verschieben (von Paket in Beutel): 00154 // Neuer Container sieht volles Gewicht (nw=w), Check im env() mit 00155 // Differenz aus Gewicht in Container1 und in Container2. 00156 else if ( ENV(ENV(ENV(PO))) && ENV() == ENV(ENV(PO)) ) 00157 aw = QueryProp(P_WEIGHT_PERCENT) * w / 100 00158 - ((int)ENV(PO)->QueryProp(P_WEIGHT_PERCENT) * w / 100 || 1); 00159 } 00160 00161 if ( query_weight_contents() + nw > QueryProp(P_MAX_WEIGHT) ) 00162 // Container kann Gewicht nicht mehr aufnehmen 00163 return -1; 00164 00165 if ( aw && ENV()->MayAddWeight(aw) < 0 ) 00166 // Umgebung des Containers kann Gewicht nicht mehr aufnehmen 00167 return -2; 00168 00169 return 0; 00170 }

| object* present_objects | ( | string | complex_desc | ) |
Definiert in Zeile 207 der Datei restrictions.c.
Benutzt i, ME, name, ob(), obs, P_ARMOUR_TYPE, P_ARMOURS, P_WEAPON, P_WEAPON_TYPE, POS_INVERS, POS_LETZTES, QueryProp() und WEM.
Wird benutzt von __find_objects() und locate_objects().
00208 { 00209 int i; // Zaehlervariable 00210 int meth; // 0x01 = invers?, 0x02 = letztes? 00211 object ob; // einzelnes temporaeres Objekt 00212 object *obs; // liste der ausgewaehlten Objekte 00213 object *erg; // zum sammeln bis es nachher zurueckgegeben wird... 00214 string *strlst; // liste aller Gruppen die mit AND verknuepft sind 00215 object haufen; 00216 00217 strlst = allocate(2); 00218 00219 if ( sscanf( complex_desc, "%s ausser %s", strlst[0], strlst[1]) == 2 ){ 00220 erg = present_objects( strlst[0] ); 00221 obs = present_objects( strlst[1] ); 00222 return erg-obs; 00223 } 00224 00225 strlst = explode( complex_desc, " und " ); 00226 erg = ({}); 00227 00228 for ( i = sizeof(strlst); i--; ){ 00229 complex_desc = strlst[i]; 00230 // auf letzte/letztes/letzten pruefen... 00231 if ( complex_desc[0..5] == "letzte" ){ 00232 switch( complex_desc[6..6] ){ 00233 case " ": 00234 meth |= POS_LETZTES; 00235 complex_desc = complex_desc[7..]; 00236 break; 00237 case "s": 00238 case "n": 00239 case "m": 00240 case "r": 00241 if ( complex_desc[7..7] != " " ) 00242 break; 00243 meth |= POS_LETZTES; 00244 complex_desc = complex_desc[8..]; 00245 break; 00246 default: 00247 } 00248 } 00249 00250 // auf verneinung pruefen 00251 if ( complex_desc[0..5] == "nicht " ){ 00252 meth |= POS_INVERS; 00253 complex_desc = complex_desc[6..]; 00254 } 00255 obs=({}); 00256 // nun nach Main-Ids (Gruppen) suchen... 00257 if ( meth & POS_LETZTES ){ // geht es nur um den letzten Gegenstand? 00258 switch( complex_desc ){ 00259 case "waffe": 00260 obs = filter_objects( all_inventory(), "QueryProp", 00261 P_WEAPON_TYPE ); 00262 break; 00263 00264 case "ruestung": 00265 obs = filter_objects( all_inventory(), "QueryProp", 00266 P_ARMOUR_TYPE ); 00267 break; 00268 00269 case "kleidung": 00270 obs = filter_objects( all_inventory(), "IsClothing"); 00271 break; 00272 00273 case "verschiedenem": 00274 case "verschiedenes": 00275 obs = all_inventory(); 00276 obs -= filter_objects( obs, "QueryProp", P_WEAPON_TYPE ); 00277 obs -= filter_objects( obs, "QueryProp", P_ARMOUR_TYPE ); 00278 obs -= filter_objects( obs, "IsClothing"); 00279 obs -= filter( obs, #'living/*'*/ ); 00280 break; 00281 00282 case "eigenes": 00283 case "meins": 00284 if (objectp(haufen=present("\nhaufen "+ 00285 this_player()->name(WEM)))) { 00286 obs = all_inventory(haufen); 00287 } 00288 // kein break;, Fall-through! 00289 case "behaltenem": 00290 case "behaltenes": 00291 obs += filter( all_inventory(), "_behalten", ME, 00292 getuid(this_player() || previous_object()) ); 00293 00294 obs += (QueryProp(P_ARMOURS) || ({})) 00295 + ({ QueryProp(P_WEAPON) }) - ({ 0 }); 00296 break; 00297 00298 case "gegenstand": 00299 obs = all_inventory() - 00300 filter( all_inventory(), #'living/*'*/ ); 00301 break; 00302 00303 default: 00304 obs = filter_objects( all_inventory(), "id", complex_desc ); 00305 } 00306 00307 // unsichtbare objekte entfernen 00308 obs = filter_objects( obs, "short" ); 00309 00310 // letzten Gegenstand raussuchen 00311 obs = obs[0..0]; 00312 } 00313 else { // ganze Gruppen und nicht nur das letzte Objekt 00314 switch ( complex_desc ){ 00315 case "allem": 00316 case "alles": 00317 case "jeden gegenstand": 00318 case "jedem gegenstand": 00319 case "gegenstaende": 00320 case "alle gegenstaende": 00321 case "allen gegenstaenden": 00322 if ( meth & POS_INVERS ) 00323 continue; // alles nicht = nichts :) 00324 00325 obs = all_inventory() - 00326 filter( all_inventory(), #'living/*'*/ ); 00327 break; 00328 00329 case "waffen": 00330 case "jede waffe": 00331 case "jeder waffe": 00332 case "alle waffen": 00333 case "allen waffen": 00334 obs = filter_objects( all_inventory(), "QueryProp", 00335 P_WEAPON_TYPE ); 00336 break; 00337 00338 case "ruestungen": 00339 case "jede ruestung": 00340 case "jeder ruestung": 00341 case "alle ruestungen": 00342 case "allen ruestungen": 00343 obs = filter_objects( all_inventory(), "QueryProp", 00344 P_ARMOUR_TYPE ); 00345 break; 00346 00347 case "kleidung": 00348 case "jede kleidung": 00349 case "jeder kleidung": 00350 case "alle kleidung": 00351 case "allen kleidung": 00352 obs = filter_objects( all_inventory(), "IsClothing"); 00353 break; 00354 00355 case "gegenstand": 00356 obs = filter_objects( all_inventory() - 00357 filter( all_inventory(), 00358 #'living/*'*/ ), 00359 "short" )[0..0]; 00360 break; 00361 00362 case "verschiedenem": 00363 case "verschiedenes": 00364 obs = all_inventory(); 00365 obs -= filter_objects( obs, "QueryProp", P_WEAPON_TYPE ); 00366 obs -= filter_objects( obs, "QueryProp", P_ARMOUR_TYPE ); 00367 obs -= filter_objects( obs, "IsClothing"); 00368 obs -= filter( obs, #'living/*'*/ ); 00369 break; 00370 00371 case "eigenes": 00372 case "eigenem": 00373 case "eigenen": 00374 case "meins": 00375 case "alles eigene": 00376 if (objectp(haufen=present("\nhaufen "+ 00377 this_player()->name(WEM)))) { 00378 obs = all_inventory(haufen); 00379 } 00380 // kein break;, Fall-through! 00381 case "behaltenem": 00382 case "behaltenen": 00383 case "behaltenes": 00384 case "alles behaltene": 00385 obs += filter( all_inventory(), "_behalten", ME, 00386 getuid(this_player() || previous_object()) ); 00387 00388 obs += (QueryProp(P_ARMOURS) || ({})) 00389 + ({ QueryProp(P_WEAPON) }) - ({ 0 }); 00390 break; 00391 00392 default: 00393 if ( complex_desc[0..3] == "jede" || 00394 complex_desc[0..4] == "alle "){ 00395 if ( complex_desc[4..4] == " " ){ 00396 obs = filter_objects( all_inventory(), "id", 00397 complex_desc[5..] ); 00398 break; 00399 } 00400 else{ 00401 switch( complex_desc[4..5] ){ 00402 case "m ": 00403 case "r ": 00404 case "n ": 00405 case "s ": 00406 obs = filter_objects( all_inventory(), "id", 00407 complex_desc[6..] ); 00408 break; 00409 00410 default: 00411 obs = 0; 00412 } 00413 if (obs) 00414 break; 00415 } 00416 } 00417 ob = present( complex_desc, ME ); 00418 00419 if ( meth & POS_INVERS ){ 00420 if ( ob && ob != ME ) 00421 erg += (filter_objects( all_inventory(), "short" ) 00422 - ({ ob }) ); 00423 else 00424 erg += filter_objects( all_inventory(), "short" ); 00425 } 00426 else if ( ob && ob != ME ) 00427 erg += ({ ob }); 00428 continue; 00429 } 00430 // unsichtbare objekte entfernen 00431 obs = filter_objects( obs, "short" ); 00432 } 00433 if ( meth & POS_INVERS ) 00434 erg += ( filter_objects( all_inventory(), "short" ) - obs ); 00435 else 00436 erg += obs; 00437 } 00438 return erg; 00439 }


| varargs int PreventInsert | ( | object | ob | ) |
Definiert in Zeile 177 der Datei restrictions.c.
| varargs int PreventInsertLiving | ( | object | ob | ) |
Definiert in Zeile 179 der Datei restrictions.c.
| varargs int PreventLeave | ( | object | ob, | |
| mixed | dest | |||
| ) |
Definiert in Zeile 178 der Datei restrictions.c.
| varargs int PreventLeaveLiving | ( | object | ob, | |
| mixed | dest | |||
| ) |
Definiert in Zeile 180 der Datei restrictions.c.
| int query_weight_contents | ( | ) |
Definiert in Zeile 76 der Datei restrictions.c.
Benutzt contents, i, last_content_change, LastWeightCalc, P_TOTAL_WEIGHT, P_WEIGHT und QueryProp().
Wird benutzt von _query_total_weight() und MayAddWeight().
00077 { 00078 object *objs; 00079 int w, w2, i; 00080 00081 if ( last_content_change == LastWeightCalc ) 00082 return contents; 00083 00084 w = 0; 00085 objs = all_inventory(this_object()); 00086 i = sizeof(objs); 00087 00088 while ( i-- ){ 00089 if ( !(w2 = (int)objs[i]->QueryProp(P_TOTAL_WEIGHT)) ) 00090 w2 = (int)objs[i]->QueryProp(P_WEIGHT); 00091 w += w2; 00092 } 00093 00094 LastWeightCalc = last_content_change; 00095 return contents = w; 00096 }


| private nosave int contents |
Definiert in Zeile 41 der Datei restrictions.c.
Wird benutzt von empty(), fuelle() und query_weight_contents().
| private nosave int last_content_change |
Definiert in Zeile 42 der Datei restrictions.c.
Wird benutzt von _query_last_content_change(), _query_total_objects(), _set_last_content_change() und query_weight_contents().
| private nosave int LastObjectCount |
Definiert in Zeile 41 der Datei restrictions.c.
Wird benutzt von _query_total_objects() und create().
| private nosave int LastWeightCalc |
Definiert in Zeile 41 der Datei restrictions.c.
Wird benutzt von create() und query_weight_contents().
| private nosave int objcount |
Definiert in Zeile 41 der Datei restrictions.c.
Wird benutzt von _query_total_objects().
1.6.3