blob: d415ec55c6af035456f8e6672741ab9bca1fb7eb [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// shells/magier.c -- magier shell
4//
5// $Id: magier.c 9231 2015-05-27 21:53:32Z Zesstra $
6
7//
8// Magiershell Basisfile
9//
10// Ueberarbeitung abgeschlossen am 18.12.2002
11//
12// Dank an Zwirch@PK, Rikus@MG, Zoran@PK, Vanion@MG
13// und viele andere, die ich vergessen habe.
14//
15// Fragen und Bughinweise an Mandragon@MG oder einen
16// Erzmagier Deiner Wahl.
17//
18// Zur Shell gehoeren ausser dieser Datei:
19// admin.c: Administrative Befehle
20// comm.c: Kommunikationsbefehle
21// fileedit.c: Befehle zum Veraendern von Dateien
22// fileview.c: Befehle zum Lesen von Dateien
23// magier_ext.c: Generelle Magierbefehle
24// moving.c: Bewegungsbefehle
25// objects.c: Erzeugen und zerstoeren von Objekten
26// parsing.c Auswertung von Pfadangaben und Wildcards
27// players.c: Befehle zur Beeinflussung von Spielern
28// todo.c: Implementation der Todoliste
29// upd.c: Der Befehl upd
30// magier.h Generelle Header-Datei
31//
32
33#pragma strict_types,save_types
34
35inherit "/std/player/base";
36inherit "/std/shells/magier/magier_ext";
37
38#include <wizlevels.h>
39#include <moving.h>
40#include <properties.h>
41#include <new_skills.h>
42#include <config.h>
Zesstra268e3fd2019-07-25 14:29:01 +020043#include <player/telnetneg.h>
MG Mud User88f12472016-06-24 23:31:02 +020044
45protected void create()
46{
47 if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
48 set_next_reset(-1);
49 return;
50 }
51
52 base::create();
53
54 Set(P_RACE, SAVE, F_MODE);
55 Set(P_ZAP_MSG, SAVE, F_MODE);
56 Set(P_TRANK_FINDEN, SAVE, F_MODE);
57 Set(P_HANDS, SAVE, F_MODE);
58 Set(P_RACESTRING, SAVE, F_MODE);
59 SetDefaultHome("/gilden/abenteurer");
60 SetProp(P_ENEMY_DEATH_SEQUENCE,
61 ([17:"Der Tod schuettelt verstaendnislos den Kopf.\n\n",
62 18:"Der Tod sagt: WIESO MUSSTEST DU DICH AUCH UNBEDINGT "
63 "MIT EINEM MAGIER ANLEGEN?\n\n"]));
64 SetProp(P_ATTRIBUTES_OFFSETS,([]));
65 SetProp(P_AVERAGE_SIZE,185);
66 if(!QueryProp(P_DEFAULT_GUILD)) SetProp(P_DEFAULT_GUILD,"abenteurer");
67}
68
69protected void create_super() {
70 set_next_reset(-1);
71}
72
73
74protected void heart_beat()
75{
76 mixed *en;
77
78 if (!QueryProp(P_WANTS_TO_LEARN)||((en=QueryEnemies())&&sizeof(en[0])))
79 base::heart_beat();
Zesstra268e3fd2019-07-25 14:29:01 +020080 else if (!CheckTelnetKeepAlive(QueryProp(P_TELNET_KEEPALIVE_DELAY)))
81 {
MG Mud User88f12472016-06-24 23:31:02 +020082 // Wenn der Magier kein Telnet Keep-Alive wuenscht, kann der HB ganz
83 // abgeschaltet werden. Sonst muss er aber weiterlaufen, damit
84 // CheckTelnetKeepAlive() regelmaessig gerufen wird.
85 set_heart_beat(0);
86 }
87}
88
89
90public varargs int remove(int silent)
91{
92 string workroom;
93
94 if (IS_WIZARD(this_object()))
95 workroom = "/players/"+getuid()+"/workroom";
96 else
97 workroom = "/secure/merlin";
98 if( !environment() || object_name(environment()) != workroom )
99 catch(move(workroom, M_GO, "nach Hause"));
100 return base::remove(silent);
101}
102
103public string NotifyDestruct(object caller) {
104
105 if (previous_object() != master()
106 || object_name(this_object()) == __FILE__[..<3])
107 return 0;
108
109 // Nicht-EMs sollen keine EMs zerstoeren koennen, woraufhin auch evtl.
110 // EM-Tools rumliegen koennten.
111 if ( IS_ARCH(this_object()) && caller != this_object()
112 && getuid(caller) != ROOTID
113 && (process_call() || !ARCH_SECURITY) )
114 return "Das Zerstoeren von EMs ist ein Fehler. ;-)\n";
115
116 return ::NotifyDestruct(caller);
117}
118
119void reset()
120{
121 if (!interactive(this_object()))
122 {
123 quit();
124 if (this_object())
125 remove();
126 if (this_object())
127 destruct(this_object());
128 return;
129 }
130}
131
132// ####################
133//################# Query-Funktionen ##################
134// ####################
135
136varargs int id (string str) {
137 if (QueryProp(P_INVIS) &&
138 (!this_interactive() ||!IS_LEARNER(this_interactive())))
139 return 0;
140 return ::id(str);
141}
142
143
144static string *_query_racestring()
145{
146 if (pointerp(Query(P_RACESTRING)))
147 return Query(P_RACESTRING);
Arathorn6e045052018-02-03 13:25:26 +0100148 else {
149 string rstring = (QueryProp(P_GENDER)==FEMALE ? "Magierin" : "Magier");
heull001f55a8c62018-02-07 19:22:41 +0100150 return allocate(4, rstring);
Arathorn6e045052018-02-03 13:25:26 +0100151 }
MG Mud User88f12472016-06-24 23:31:02 +0200152}
153
154
155static string _query_default_guild()
156{
157 return (Query(P_DEFAULT_GUILD)||"abenteurer");
158}
159
160
161static string _query_racedescr()
162{
163 return "Magier koennen einfach alles. Aber manche Magier koennen mehr.\n";
164}
165
166
167static string _query_race()
168{
bugfixd94d0932020-04-08 11:27:13 +0200169 if (previous_object() && ({int})previous_object()->query_login_object())
MG Mud User88f12472016-06-24 23:31:02 +0200170 return 0;
171
172 return Query(P_RACE) ? Query(P_RACE) : Set(P_RACE, "Magier");
173}
174
175
176static mixed _query_localcmds()
177{
178 return
179 base::_query_localcmds()
180 +magier_ext::_query_localcmds();
181}
182
183
184static void upd_my_age()
185{
186 age=_age+absolute_hb_count()-_hbstop;
187 _age=age;
188 _hbstop=absolute_hb_count();
189 return;
190}
191
192
193static int _query_age()
194{
195 upd_my_age();
196 return age;
197}
198
199static int _set_earmuffs(int level)
200{
201 int maxl=1+query_wiz_level(this_object());
202 maxl = max(maxl,99);
203 return Set(P_EARMUFFS,min(maxl,level));
204}
205
206
207// ############################
208//#################### Interne Shell-Funktionen ####################
209// ############################
210
211int MayAddWeight(int w) { return 0;}
212int MayAddObject(object ob) { return 1; }
213
214
215static void initialize()
216{
217 magier_ext::initialize();
218 return;
219}
220
221
222static void FinalSetup()
223{
224 SetProp(P_CURRENTDIR,"/players/"+getuid());
225 initialize();
226 if (IS_LEARNER(this_player())) cat("/etc/WIZNEWS");
227 _age=age;
228 _hbstop=absolute_hb_count();
229 return;
230}
231
232
233void save_me(int i)
234{
235 upd_my_age();
236 base::save_me(i);
237 return;
238}
239
240
241varargs void Reconnect(int silent,string my_ip)
242{
243 base::Reconnect(silent,my_ip);
244 magier_ext::reconnect();
245 return;
246}
247
248
249void notify_player_change(string who, int rein, int invis)
250{
251 string *list,name;
252 mixed mlist;
253 int vis_change;
254
255 if (invis) name="("+who+")";
256 else name=who;
257
258 if(query_verb() && (query_verb()=="vis" || query_verb()=="invis"))
259 vis_change=1;
260
261 if (Query(P_INFORMME) && !vis_change)
262 {
263 if (rein)
264 tell_object(this_object(),
265 sprintf("%s ist gerade ins "MUDNAME" gekommen.\n",name));
266 else
267 tell_object(this_object(),
268 sprintf("%s hat gerade das "MUDNAME" verlassen.\n",name));
269 }
270
271 if(Query(P_WAITFOR_FLAGS) & (0x01))return ;
272
273 if (pointerp(list=Query(P_WAITFOR))&&sizeof(list))
Arathorn888af762021-01-20 00:19:48 +0100274 if (member(list,who)!=-1) {
275 if (QueryProp(P_NO_ASCII_ART))
276 delayed_write(
277 ({
278 ({sprintf("%s%s IST JETZT %s!!!\n",
Bugfix3afcb792022-01-21 22:32:42 +0100279 ((QueryProp(P_ALERT) & AL_NO_SOUND)? "" : sprintf("%c",7)),
Arathorn888af762021-01-20 00:19:48 +0100280 name,
281 (vis_change?
282 (rein?"SICHTBAR":"UNSICHTBAR"):
283 (rein?"DA":"NICHT MEHR DA"))),
284 0})
285 }));
286 else
287 delayed_write(
288 ({
289 ({sprintf("%s%s I S T J E T Z T %s !!!\n",
Bugfix3afcb792022-01-21 22:32:42 +0100290 ((QueryProp(P_ALERT) & AL_NO_SOUND)? "" : sprintf("%c",7)),
Arathorn888af762021-01-20 00:19:48 +0100291 name,
292 (vis_change?
293 (rein?"S I C H T B A R":"U N S I C H T B A R"):
294 (rein?"D A":"N I C H T M E H R D A"))),
295 0})
296 }));
297 }
MG Mud User88f12472016-06-24 23:31:02 +0200298
299 if (rein && (sizeof(mlist=QueryProp(P_WAITFOR_REASON))) &&
300 (mappingp(mlist)) && (mlist[who]))
301 Show_WaitFor_Reason(who,invis);
302 return;
303}
304
305mixed modify_command(string str) {
306 if (previous_object() &&
307 (previous_object()!=this_object() || process_call()) )
308 {
309 if (IS_ARCH(this_object()))
310 tell_object(this_object(),
311 sprintf("Illegal modify_command(%s) from %O\n",
312 str, previous_object()));
313 return 0;
314 }
315 //////////////////////////////////////////////////////////////////////
316 // Magier-Escape-Kommandos werden behandelt
317 if (str=="\\ESCAPE" && IS_LORD(this_object()))
318 {
319 __set_environment(this_object(),"/room/void");
bugfixd94d0932020-04-08 11:27:13 +0200320 ({void})environment()->init();
MG Mud User88f12472016-06-24 23:31:02 +0200321 printf("You escaped.\n");
322 return "";
323 }
324 if (str[0..2]=="\\\\\\" && IS_LORD(this_object()))
325 {
326 str = _return_args(str);
327 string* input = explode(str[3..]," ");
328 string verb = input[0];
329 if (verb && verb!="")
330 {
331 string cmd = implode(input[1..]," ");
332 if (!__auswerten(cmd,verb))
333 SoulComm(cmd,verb);
334 }
335 return 1;
336 }
337 //////////////////////////////////////////////////////////////////////
338
339 return ::modify_command(str);
340}
341