#include <config.h>#include <thing/properties.h>#include <language.h>#include <defines.h>#include <doorroom.h>
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) |
| 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 }

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


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


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

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

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

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

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

| void RemoveSpecialExit | ( | mixed | cmd | ) |
Definiert in Zeile 191 der Datei exits.c.
Benutzt RemoveExit().
Wird benutzt von set_doors().
00192 { 00193 RemoveExit( cmd ); 00194 }


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

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

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

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