MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // MorgenGrauen MUDlib |
| 2 | // |
| 3 | // room/doors.c -- new doors, managed by doormaster |
| 4 | // |
| 5 | // $Id: doors.c 9134 2015-02-02 19:26:03Z Zesstra $ |
| 6 | |
| 7 | #pragma strong_types |
| 8 | #pragma save_types |
| 9 | #pragma pedantic |
| 10 | #pragma range_check |
| 11 | #pragma no_clone |
| 12 | |
| 13 | #include <config.h> |
| 14 | #include <properties.h> |
| 15 | #include <defines.h> |
| 16 | #include <language.h> |
| 17 | #include <doorroom.h> |
| 18 | #define NEED_PROTOTYPES |
| 19 | #include <thing/properties.h> |
| 20 | #include <room/exits.h> |
| 21 | |
| 22 | protected void create() |
| 23 | { |
| 24 | if (object_name(this_object()) == __FILE__[0..<3]) |
| 25 | { |
| 26 | set_next_reset(-1); |
| 27 | return; |
| 28 | } |
| 29 | SetProp(P_DOOR_INFOS,0); |
| 30 | } |
| 31 | |
| 32 | protected void create_super() { |
| 33 | set_next_reset(-1); |
| 34 | } |
| 35 | |
| 36 | varargs int NewDoor(string|string* cmds, string dest, string|string* ids, |
| 37 | mapping|<int|string|string*>* props) |
| 38 | { |
| 39 | /* |
| 40 | cmds: Befehl(e), um durch die Tuer zu gehen (String oder Array von Strings) |
| 41 | dest: Zielraum |
| 42 | ids: Id(s) der Tuer, default "tuer" (String, Array von Strings oder 0) |
| 43 | props: besondere Eigenschaften der Tuer (optional) |
| 44 | Array mit Paaren Nummer der Eigenschaft, Inhalt |
| 45 | definierte Properties sind: |
| 46 | D_FLAGS: Flags wie bei Sir's Tueren |
| 47 | default: DOOR_CLOSED | DOOR_RESET_CL |
| 48 | Bei Schluesseln wird getestet, ob der String, den |
| 49 | QueryDoorKey zurueckliefert, gleich |
| 50 | "raumname1:raumname2" ist, wobei raumname1,2 die |
| 51 | kompletten Filenamen der beiden Raeume in sortierter |
| 52 | Reihenfolge sind. |
| 53 | D_LONG: lange Beschreibung der Tuer |
| 54 | default: "Eine Tuer.\n" |
| 55 | D_SHORT: kurze Beschreibung der Tuer, wird an die Raumbeschreibung |
| 56 | angefuegt, wobei %s durch geoeffnet bzw. geschlossen |
| 57 | ersetzt wird. |
| 58 | default: "Eine %se Tuer. " |
| 59 | D_NAME: Name, der beim Oeffnen/Schliessen und bei Fehlermeldungen |
| 60 | angezeigt wird. |
| 61 | default: "Tuer" |
| 62 | D_GENDER: default: FEMALE |
| 63 | D_FUNC: Funktion, die im Raum aufgerufen werden soll, wenn die |
| 64 | Tuer erfolgreich durchschritten wird. |
| 65 | default: 0 |
| 66 | D_MSGS: Falls String: ausgegebene Richtung fuer move |
| 67 | Falls Array: ({direction, textout, textin}) fuer move |
| 68 | default: 0 |
| 69 | |
| 70 | Beispiel: |
| 71 | NewDoor("norden","/players/rochus/room/test2","portal", |
| 72 | ({D_NAME,"Portal", |
| 73 | D_GENDER,NEUTER, |
| 74 | D_SHORT,"Im Norden siehst Du ein %ses Portal. ", |
| 75 | D_LONG,"Das Portal ist einfach nur gigantisch.\n" |
| 76 | })); |
| 77 | |
| 78 | */ |
| 79 | |
| 80 | if (!cmds || !dest) return 0; |
| 81 | return call_other(DOOR_MASTER,"NewDoor",cmds,dest,ids,props); |
| 82 | } |
| 83 | |
| 84 | void init() |
| 85 | { |
| 86 | mixed *info; |
| 87 | string *cmds; |
| 88 | int i,j; |
| 89 | |
| 90 | if (!pointerp(info=(mixed *)QueryProp(P_DOOR_INFOS))) return; |
| 91 | add_action("oeffnen","oeffne"); |
| 92 | add_action("schliessen","schliesse"); |
| 93 | add_action("schliessen","schliess"); |
| 94 | for (i=sizeof(info)-1;i>=0;i--) { |
| 95 | cmds=(string *)(info[i][D_CMDS]); |
| 96 | for (j=sizeof(cmds)-1;j>=0;j--) |
| 97 | add_action("go_door",cmds[j]); |
| 98 | // Befehle IMMER anfuegen, gechecked wird sowieso erst beim Durchgehen. |
| 99 | } |
| 100 | } |
| 101 | |
| 102 | void reset() |
| 103 | { |
| 104 | if (QueryProp(P_DOOR_INFOS)) |
| 105 | call_other(DOOR_MASTER,"reset_doors"); |
| 106 | } |
| 107 | |
| 108 | int oeffnen (string str) |
| 109 | { |
| 110 | if (!str || !QueryProp(P_DOOR_INFOS)) |
| 111 | return 0; |
| 112 | return (int) call_other(DOOR_MASTER,"oeffnen",str); |
| 113 | } |
| 114 | |
| 115 | int schliessen (string str) |
| 116 | { |
| 117 | if (!str || !QueryProp(P_DOOR_INFOS)) |
| 118 | return 0; |
| 119 | return (int) call_other(DOOR_MASTER,"schliessen",str); |
| 120 | } |
| 121 | |
| 122 | varargs int |
| 123 | go_door (string str) |
| 124 | { |
| 125 | if (!QueryProp(P_DOOR_INFOS)) |
| 126 | return 0; |
| 127 | if (call_other(DOOR_MASTER,"go_door",query_verb())) |
| 128 | return 1; |
| 129 | return 0; |
| 130 | } |
| 131 | |
| 132 | int set_doors(string *cmds,int open) |
| 133 | { |
| 134 | int j; |
| 135 | |
| 136 | if (!previous_object()) |
| 137 | return 0; |
| 138 | if (object_name(previous_object())!=DOOR_MASTER) |
| 139 | return 0; |
| 140 | // Andere sollen nicht rumpfuschen. |
| 141 | if (!this_player()) return 0; |
| 142 | if (environment(this_player())!=this_object()) |
| 143 | return 0; |
| 144 | // Ist sowieso keiner da... |
| 145 | if (!pointerp(cmds)) |
| 146 | return 0; |
| 147 | if (open) |
| 148 | AddSpecialExit(cmds,"go_door"); |
| 149 | else |
| 150 | RemoveSpecialExit(cmds); |
| 151 | for (j=sizeof(cmds)-1;j>=0;j--) |
| 152 | add_action("go_door",cmds[j]); |
| 153 | return 1; |
| 154 | } |
| 155 | |
| 156 | /* Fuer Tueren, die flexible Langbeschreibungen haben, wird ein |
| 157 | * SpecialDetail eingefuehrt. |
| 158 | */ |
| 159 | |
| 160 | string special_detail_doors(string key){ |
| 161 | return DOOR_MASTER->special_detail_doors(key); |
| 162 | } |