doors.c-Dateireferenz

#include <config.h>
#include <thing/properties.h>
#include <language.h>
#include <defines.h>
#include <doorroom.h>
Include-Abhängigkeitsdiagramm für doors.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES

Funktionen

varargs void AddCmd (mixed cmd, mixed func, mixed flag, mixed cmdid)
void AddExit (mixed cmd, mixed room)
void AddSpecialExit (mixed cmd, mixed functionname)
void RemoveSpecialExit (mixed cmd)
protected void create ()
protected void create_super ()
varargs int NewDoor (mixed cmds, string dest, mixed ids, mixed props)
void init ()
void reset ()
int oeffnen (string str)
int schliessen (string str)
varargs int go_door (string str)
int set_doors (string *cmds, int open)
string special_detail_doors (string key)

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 13 der Datei doors.c.


Dokumentation der Funktionen

varargs void AddCmd ( mixed  cmd,
mixed  func,
mixed  flag,
mixed  cmdid 
)

Definiert in Zeile 55 der Datei commands.c.

Benutzt added_cmds, cl und i.

Wird benutzt von create(), MakeDrink() und SetTravelCmds().

00055                                                                     {
00056  int i,j;
00057  closure cl;
00058  mixed *rule;
00059 
00060  // potentielle AddCmd mit Regel?
00061  if(stringp(cmd)) {
00062   // eine Regel? - aufsplitten
00063   if((i=member(cmd,'&'))>0) {
00064    // ... in Array mit Verknuepfungselementen
00065    rule=explode(cmd[(i+1)..],"&");
00066    j=sizeof(rule);
00067    // ... in Array mit Arrays mit Alternativelementen:
00068    // "p|q&r|s" -> ({ ({"p","q"}), ({"r","s"}} })
00069    while(j--)
00070     rule[j]=explode(rule[j],"|");
00071 
00072    // Regeln von Kommandoverben abschneiden
00073    cmd=cmd[0..(i-1)];
00074   }
00075   // Kommandoverben extrahieren
00076   cmd=explode(cmd,"|");
00077 
00078   // Satz von Regeln existiert: Aufsplitten von Fehlermeldungen
00079   if(rule)
00080    if(stringp(flag)) {
00081     mixed *fail;
00082     // in einfaches Array mit jeweiligen Fehlermeldungen
00083     fail=explode(flag,"|");
00084     j=0;
00085     i=sizeof(fail);
00086     while(j<i) {
00087      // write - Fehlermeldung entdeckt - Position ggf. eintragen
00088      if(member(fail[j],'^')>=0 && !intp(fail[<1]))
00089       fail+=({j});
00090      if(member(fail[j],'@')>=0) {
00091       int s;
00092       flag=regexplode(fail[j], "@WE[A-SU]*[0-9]");
00093       s=sizeof(flag);
00094       while((s-=2)>0) {
00095        int tmpint;
00096        tmpint=flag[s][<1]-'1';
00097        if(tmpint<0 || tmpint>j)
00098         raise_error(sprintf(
00099          "AddCmd: error-message %d contains out-of-bounds @WExx-rule.\n",j+1));
00100       }
00101      }
00102      j++;
00103     }
00104     // "Was?|Wie das?" -> ({"Was?","Wie das?"})
00105     // "Was?|Wie das?^|Womit das?|Worauf das?^@WER1 macht was." ->
00106     //  ({"Was?",
00107     //    "Wie das?^Womit das?",
00108     //            "Worauf das?^@WER1 macht was.",1})
00109     flag=sizeof(fail);
00110     if(flag && flag<sizeof(rule))
00111      raise_error(
00112       "AddCmd: number of error-messages does not match number of rules.\n");
00113     flag=fail; // ueberschreiben mit den parsefreundlichen Format
00114   } else if(flag)
00115    raise_error("AddCmd: rules exist but flags are not an error-string.\n");
00116  } // end if(stringp(cmd)) ... kein Regelstring vorhanden
00117 
00118  // kein Kommandoarray gewesen noch erzeugt?
00119  if(!pointerp(cmd))
00120    raise_error("AddCmd: missing string/pointer-parameter for command.\n");
00121 
00122  // Closure aus einem String erzeugen, wenn moeglich und sicher
00123  // (function_exists() filtert unnoetigerweise auch reine "static" funs,
00124  //  die genaue Pruefung ueber functionlist() kostet jedoch zuviel)
00125  if(stringp(func) &&
00126     (!extern_call() || function_exists(func,this_object())) &&
00127     closurep(cl=symbol_function(func,this_object())))
00128   func=cl;
00129 
00130  // jedes einzelne Verb mit seinen Regeln und Funktionen eintragen
00131  i=sizeof(cmd);
00132  if(!added_cmds) added_cmds=m_allocate(i,4);
00133  while(i--) {
00134   string str;
00135   str=cmd[i];
00136   if(!func)
00137    if(extern_call()) func=previous_object();
00138    else func=this_object();
00139   if(!member(added_cmds,str))
00140    added_cmds+=([str:allocate(0);allocate(0);allocate(0);0]);
00141   // existierendes Verb ergaenzen
00142   added_cmds[str,0]+=({func});
00143   added_cmds[str,1]+=({flag});
00144   added_cmds[str,2]+=({rule});
00145   // ggf. id in das ID-Mapping eintragen
00146   if(cmdid) {
00147    mixed *tmp;
00148    j=sizeof((string*)added_cmds[str,0]);
00149    tmp=added_cmds[str,3]||allocate(j);
00150    if(sizeof(tmp)<j) tmp+=allocate(j-sizeof(tmp));
00151    tmp[<1]=cmdid;
00152    added_cmds[str,3]=tmp;
00153   }
00154  }
00155 }

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

void AddExit ( mixed  cmd,
mixed  room 
)

Definiert in Zeile 116 der Datei exits.c.

Benutzt _MakePath(), i, msg(), P_EXITS, Query(), rescueExit(), ROUTER und Set().

Wird benutzt von AddSpecialExit(), create() und move().

00117 {
00118     int i;
00119     mapping exita;
00120   
00121     exita = Query(P_EXITS) || rescueExit();
00122     
00123     if ( !closurep(room) ){
00124         int s;
00125         string msg;
00126         object router;
00127     
00128         if( (s = member(room, '#')) != -1 ){
00129             msg  = room[0..s];
00130             room = room[s+1..];
00131         }
00132         else
00133             msg = "";
00134         
00135         room = _MakePath(room);
00136 
00137         if ( !clonep(this_object()) && objectp(router = find_object(ROUTER)) )
00138             router->RegisterExit( object_name(this_object()), cmd, room );
00139     
00140         room = msg + room;
00141     }
00142     
00143     if( !pointerp(cmd) )
00144         exita += ([ cmd : room ]);
00145     else 
00146         for( i = sizeof(cmd); i--; )
00147             exita += ([ cmd[i] : room ]);
00148 
00149     Set( P_EXITS, exita );
00150 }

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

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

void AddSpecialExit ( mixed  cmd,
mixed  functionname 
)

Definiert in Zeile 175 der Datei exits.c.

Benutzt AddExit().

Wird benutzt von set_doors().

00176 {
00177     
00178     if ( stringp(functionname) )
00179         functionname = symbol_function( functionname, this_object() );
00180     
00181     if ( !closurep(functionname) ) {
00182                 catch(raise_error(sprintf( "method %O doesn't exist\n",
00183                                 functionname)); publish);
00184                 return;
00185     }
00186     
00187     AddExit( cmd, functionname );
00188 }

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

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

protected void create (  ) 

Definiert in Zeile 28 der Datei doors.c.

Benutzt P_DOOR_INFOS und SetProp().

00029 {
00030   SetProp(P_DOOR_INFOS,0);
00031 }

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

protected void create_super (  ) 

Definiert in Zeile 33 der Datei doors.c.

Benutzt set_next_reset().

00033                               {
00034   set_next_reset(-1);
00035 }

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

varargs int go_door ( string  str  ) 

Definiert in Zeile 123 der Datei doors.c.

Benutzt DOOR_MASTER, P_DOOR_INFOS und QueryProp().

00124 {
00125   if (!QueryProp(P_DOOR_INFOS))
00126     return 0;
00127   if (call_other(DOOR_MASTER,"go_door",query_verb()))
00128     return 1;
00129   return 0;
00130 }

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

void init (  ) 

Definiert in Zeile 84 der Datei doors.c.

Benutzt cmds, D_CMDS, i, info, P_DOOR_INFOS und QueryProp().

00085 {
00086   mixed *info;
00087   string *cmds;
00088   int i,j;
00089 
00090   if (!pointerp(info=(mixed *)QueryProp(P_DOOR_INFOS))) return;
00091   add_action("oeffnen","oeffne");
00092   add_action("schliessen","schliesse");
00093   add_action("schliessen","schliess");
00094   for (i=sizeof(info)-1;i>=0;i--) {
00095     cmds=(string *)(info[i][D_CMDS]);
00096     for (j=sizeof(cmds)-1;j>=0;j--)
00097       add_action("go_door",cmds[j]);
00098     // Befehle IMMER anfuegen, gechecked wird sowieso erst beim Durchgehen.
00099   }
00100 }

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

varargs int NewDoor ( mixed  cmds,
string  dest,
mixed  ids,
mixed  props 
)

Definiert in Zeile 37 der Datei doors.c.

Benutzt DOOR_MASTER.

00038 {
00039 /*
00040   cmds: Befehl(e), um durch die Tuer zu gehen (String oder Array von Strings)
00041   dest: Zielraum
00042   ids:  Id(s) der Tuer, default "tuer" (String, Array von Strings oder 0)
00043   props: besondere Eigenschaften der Tuer (optional)
00044   Array mit Paaren Nummer der Eigenschaft, Inhalt
00045   definierte Properties sind:
00046   D_FLAGS:  Flags wie bei Sir's Tueren
00047   default: DOOR_CLOSED | DOOR_RESET_CL
00048   Bei Schluesseln wird getestet, ob der String, den
00049   QueryDoorKey zurueckliefert, gleich
00050   "raumname1:raumname2" ist, wobei raumname1,2 die
00051   kompletten Filenamen der beiden Raeume in sortierter
00052   Reihenfolge sind.
00053   D_LONG:   lange Beschreibung der Tuer
00054   default: "Eine Tuer.\n"
00055   D_SHORT:  kurze Beschreibung der Tuer, wird an die Raumbeschreibung
00056   angefuegt, wobei %s durch geoeffnet bzw. geschlossen
00057   ersetzt wird.
00058   default: "Eine %se Tuer. "
00059   D_NAME:   Name, der beim Oeffnen/Schliessen und bei Fehlermeldungen
00060   angezeigt wird.
00061   default: "Tuer"
00062   D_GENDER: default: FEMALE
00063   D_FUNC:   Funktion, die im Raum aufgerufen werden soll, wenn die
00064   Tuer erfolgreich durchschritten wird.
00065   default: 0
00066   D_MSGS:   Falls String: ausgegebene Richtung fuer move
00067   Falls Array: ({direction, textout, textin}) fuer move
00068   default: 0
00069 
00070   Beispiel:
00071   NewDoor("norden","/players/rochus/room/test2","portal",
00072   ({D_NAME,"Portal",
00073   D_GENDER,NEUTER,
00074   D_SHORT,"Im Norden siehst Du ein %ses Portal. ",
00075   D_LONG,"Das Portal ist einfach nur gigantisch.\n"
00076   }));
00077 
00078 */
00079 
00080   if (!cmds || !dest) return 0;
00081   return call_other(DOOR_MASTER,"NewDoor",cmds,dest,ids,props);
00082 }

int oeffnen ( string  str  ) 

Definiert in Zeile 108 der Datei doors.c.

Benutzt DOOR_MASTER, P_DOOR_INFOS und QueryProp().

00109 {
00110   if (!str || !QueryProp(P_DOOR_INFOS))
00111     return 0;
00112   return (int) call_other(DOOR_MASTER,"oeffnen",str);
00113 }

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

void RemoveSpecialExit ( mixed  cmd  ) 

Definiert in Zeile 191 der Datei exits.c.

Benutzt RemoveExit().

Wird benutzt von set_doors().

00192 {
00193     RemoveExit( cmd );
00194 }

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

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

void reset ( void   ) 

Definiert in Zeile 102 der Datei doors.c.

Benutzt DOOR_MASTER, P_DOOR_INFOS und QueryProp().

00103 {
00104   if (QueryProp(P_DOOR_INFOS))
00105     call_other(DOOR_MASTER,"reset_doors");
00106 }

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

int schliessen ( string  str  ) 

Definiert in Zeile 115 der Datei doors.c.

Benutzt DOOR_MASTER, P_DOOR_INFOS und QueryProp().

00116 {
00117   if (!str || !QueryProp(P_DOOR_INFOS))
00118     return 0;
00119   return (int) call_other(DOOR_MASTER,"schliessen",str);
00120 }

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

int set_doors ( string *  cmds,
int  open 
)

Definiert in Zeile 132 der Datei doors.c.

Benutzt AddSpecialExit(), DOOR_MASTER und RemoveSpecialExit().

00133 {
00134   int j;
00135   
00136   if (!previous_object())
00137     return 0;
00138   if (object_name(previous_object())!=DOOR_MASTER)
00139     return 0;
00140   // Andere sollen nicht rumpfuschen.
00141   if (!this_player()) return 0;
00142   if (environment(this_player())!=this_object())
00143     return 0;
00144   // Ist sowieso keiner da...
00145   if (!pointerp(cmds))
00146     return 0;
00147   if (open)
00148     AddSpecialExit(cmds,"go_door");
00149   else
00150     RemoveSpecialExit(cmds);
00151   for (j=sizeof(cmds)-1;j>=0;j--)
00152     add_action("go_door",cmds[j]);
00153 }

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

string special_detail_doors ( string  key  ) 

Definiert in Zeile 159 der Datei doors.c.

Benutzt DOOR_MASTER.

00159                                        {
00160   return DOOR_MASTER->special_detail_doors(key);
00161 }

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