restrictions.c-Dateireferenz

#include "/sys/thing/properties.h"
#include <defines.h>
#include <thing/description.h>
Include-Abhängigkeitsdiagramm für restrictions.c:

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

Makro-Dokumentation

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


Dokumentation der Funktionen

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 }

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

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 }

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

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().

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

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 }

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

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 }

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

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 }

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

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 }

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

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

varargs int PreventInsert ( object  ob  ) 

Definiert in Zeile 177 der Datei restrictions.c.

00177 { return 0; }

varargs int PreventInsertLiving ( object  ob  ) 

Definiert in Zeile 179 der Datei restrictions.c.

00179 { return 0; }

varargs int PreventLeave ( object  ob,
mixed  dest 
)

Definiert in Zeile 178 der Datei restrictions.c.

00178 { return 0; }

varargs int PreventLeaveLiving ( object  ob,
mixed  dest 
)

Definiert in Zeile 180 der Datei restrictions.c.

00180 { return 0; }

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 }

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

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


Variablen-Dokumentation

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
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().

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