ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/c_misc.C
(Generate patch)

Comparing deliantra/server/server/c_misc.C (file contents):
Revision 1.6 by root, Mon Sep 4 11:08:00 2006 UTC vs.
Revision 1.34 by pippijn, Sat Jan 6 14:42:30 2007 UTC

1/*
2 * static char *rcsid_c_misc_c =
3 * "$Id: c_misc.C,v 1.6 2006/09/04 11:08:00 root Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
11 7
12 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
21 17
22 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 21
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 23*/
28 24
29#include <global.h> 25#include <global.h>
30#include <loader.h> 26#include <loader.h>
31#ifndef __CEXTRACT__
32#include <sproto.h> 27#include <sproto.h>
33#endif
34 28
35extern weathermap_t **weathermap; 29#include <dirent.h>
36 30
37/* Handles misc. input request - things like hash table, malloc, maps, 31/* Handles misc. input request - things like hash table, malloc, maps,
38 * who, etc. 32 * who, etc.
39 */ 33 */
40 34
35//TODO
36#if 0
37void
41void map_info(object *op, char *search) { 38map_info (object *op, char *search)
42 mapstruct *m; 39{
40 maptile *m;
43 char buf[MAX_BUF], map_path[MAX_BUF]; 41 char buf[MAX_BUF], map_path[31];
44 long sec = seconds(); 42 long sec = time (0);
45 new_draw_info_format(NDI_UNIQUE, 0, op, 43
46 "Current time is: %02ld:%02ld:%02ld.", 44 new_draw_info_format (NDI_UNIQUE, 0, op, "Current time is: %02ld:%02ld:%02ld.", (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60);
47 (sec%86400)/3600,(sec%3600)/60,sec%60);
48 new_draw_info(NDI_UNIQUE, 0,op,"Path Pl PlM IM TO Dif Reset"); 45 new_draw_info (NDI_UNIQUE, 0, op, "Path Pl PlM IM TO Dif Reset");
49 for(m=first_map;m!=NULL;m=m->next) {
50 46
51 if ( search && strstr(m->path,search)==NULL ) continue; /* Skip unwanted maps */ 47 for (maps_container::iterator i = maps.begin (); i != maps.end (); ++i)
48 {
49 maptile *m = i->second;
50
51 if (search && !strstr (m->path, search))
52 continue; /* Skip unwanted maps */
53
52 /* Print out the last 18 characters of the map name... */ 54 /* Print out the last 30 characters of the map name... */
53 if (strlen(m->path)<=18) strcpy(map_path, m->path);
54 else strcpy(map_path, m->path + strlen(m->path) - 18); 55 strcpy (map_path, m->path + max (0, (int)strlen (m->path) - 30));
56
55 sprintf(buf,"%-18.18s %2d %2d %1d %4d %2d %02d:%02d:%02d", 57 sprintf (buf, "%-30.30s %2d %2d %1d %4d %2d %02d:%02d:%02d",
56 map_path, m->players,players_on_map(m,FALSE), 58 map_path, m->players, players_on_map (m, FALSE),
57 m->in_memory,m->timeout,m->difficulty, 59 m->in_memory, m->timeout, m->difficulty,
58 (MAP_WHEN_RESET(m)%86400)/3600,(MAP_WHEN_RESET(m)%3600)/60, 60 (m->reset_time % 86400) / 3600, (m->reset_time % 3600) / 60, m->reset_time % 60);
59 MAP_WHEN_RESET(m)%60);
60 new_draw_info(NDI_UNIQUE, 0,op,buf); 61 new_draw_info (NDI_UNIQUE, 0, op, buf);
61 } 62 }
62} 63}
64
65int
66command_style_map_info (object *op, char *params)
67{
68 extern maptile *styles;
69 maptile *mp;
70 int maps_used = 0, mapmem = 0, objects_used = 0, x, y;
71 object *tmp;
72
73 for (mp = styles; mp != NULL; mp = mp->next)
74 {
75 maps_used++;
76 mapmem += mp->width * mp->height * (sizeof (object *) + sizeof (mapspace)) + sizeof (maptile);
77 for (x = 0; x < mp->width; x++)
78 {
79 for (y = 0; y < mp->height; y++)
80 {
81 for (tmp = GET_MAP_OB (mp, x, y); tmp != NULL; tmp = tmp->above)
82 objects_used++;
83 }
84 }
85 }
86 new_draw_info_format (NDI_UNIQUE, 0, op, "Style maps loaded: %d", maps_used);
87 new_draw_info (NDI_UNIQUE, 0, op, "Memory used, not");
88 new_draw_info_format (NDI_UNIQUE, 0, op, "including objects: %d", mapmem);
89 new_draw_info_format (NDI_UNIQUE, 0, op, "Style objects: %d", objects_used);
90 new_draw_info_format (NDI_UNIQUE, 0, op, "Mem for objects: %d", objects_used * sizeof (object));
91 return 0;
92}
93#endif
63 94
64/* This command dumps the body information for object *op. 95/* This command dumps the body information for object *op.
65 * it doesn't care what the params are. 96 * it doesn't care what the params are.
66 * This is mostly meant as a debug command. 97 * This is mostly meant as a debug command.
67 */ 98 */
99int
68int command_body(object *op, char *params) 100command_body (object *op, char *params)
69{ 101{
70 int i; 102 int i;
71 103
72 /* Too hard to try and make a header that lines everything up, so just 104 /* Too hard to try and make a header that lines everything up, so just
73 * give a description. 105 * give a description.
74 */ 106 */
75 new_draw_info(NDI_UNIQUE, 0, op, "The first column is the name of the body location."); 107 new_draw_info (NDI_UNIQUE, 0, op, "The first column is the name of the body location.");
76 new_draw_info(NDI_UNIQUE, 0, op, "The second column is how many of those locations your body has."); 108 new_draw_info (NDI_UNIQUE, 0, op, "The second column is how many of those locations your body has.");
77 new_draw_info(NDI_UNIQUE, 0, op, "The third column is how many slots in that location are available."); 109 new_draw_info (NDI_UNIQUE, 0, op, "The third column is how many slots in that location are available.");
78 for (i=0; i<NUM_BODY_LOCATIONS; i++) { 110 for (i = 0; i < NUM_BODY_LOCATIONS; i++)
111 {
79 /* really debugging - normally body_used should not be set to anything 112 /* really debugging - normally body_used should not be set to anything
80 * if body_info isn't also set. 113 * if body_info isn't also set.
81 */ 114 */
82 if (op->body_info[i] || op->body_used[i]) { 115 if (op->body_info[i] || op->body_used[i])
83 new_draw_info_format(NDI_UNIQUE, 0, op, 116 {
84 "%-30s %5d %5d", body_locations[i].use_name, op->body_info[i], op->body_used[i]); 117 new_draw_info_format (NDI_UNIQUE, 0, op, "%-30s %5d %5d", body_locations[i].use_name, op->body_info[i], op->body_used[i]);
85 } 118 }
86 } 119 }
87 if (!QUERY_FLAG(op, FLAG_USE_ARMOUR)) 120 if (!QUERY_FLAG (op, FLAG_USE_ARMOUR))
88 new_draw_info(NDI_UNIQUE, 0, op, "You are not allowed to wear armor"); 121 new_draw_info (NDI_UNIQUE, 0, op, "You are not allowed to wear armor");
89 if (!QUERY_FLAG(op, FLAG_USE_WEAPON)) 122 if (!QUERY_FLAG (op, FLAG_USE_WEAPON))
90 new_draw_info(NDI_UNIQUE, 0, op, "You are not allowed to use weapons"); 123 new_draw_info (NDI_UNIQUE, 0, op, "You are not allowed to use weapons");
91 124
92 return 1; 125 return 1;
93} 126}
94 127
95 128
129int
96int command_motd(object *op, char *params) 130command_motd (object *op, char *params)
97{ 131{
98 display_motd(op); 132 display_motd (op);
99 return 1; 133 return 1;
100} 134}
101 135
136int
102int command_bug(object *op, char *params) 137command_bug (object *op, char *params)
103{ 138{
104 char buf[MAX_BUF]; 139 char buf[MAX_BUF];
105 140
106 if (params == NULL) { 141 if (params == NULL)
142 {
107 new_draw_info(NDI_UNIQUE, 0,op,"what bugs?"); 143 new_draw_info (NDI_UNIQUE, 0, op, "what bugs?");
108 return 1; 144 return 1;
109 } 145 }
110 strcpy(buf,op->name); 146 strcpy (buf, op->name);
111 strcat(buf," bug-reports: "); 147 strcat (buf, " bug-reports: ");
112 strncat(buf,++params,MAX_BUF - strlen(buf) ); 148 strncat (buf, ++params, MAX_BUF - strlen (buf));
113 buf[MAX_BUF - 1] = '\0'; 149 buf[MAX_BUF - 1] = '\0';
114 bug_report(buf); 150 bug_report (buf);
115 LOG(llevError,"%s\n",buf); 151 LOG (llevError, "%s\n", buf);
116 new_draw_info(NDI_ALL | NDI_UNIQUE, 1, NULL, buf); 152 new_draw_info (NDI_ALL | NDI_UNIQUE, 1, NULL, buf);
117 new_draw_info(NDI_UNIQUE, 0,op, "OK, thanks!"); 153 new_draw_info (NDI_UNIQUE, 0, op, "OK, thanks!");
118 return 1; 154 return 1;
119} 155}
120 156
121/* 157/*
122 * Pretty much identical to current map_info, but on a bigger scale 158 * Pretty much identical to current map_info, but on a bigger scale
123 * This function returns the name of the players current region, and 159 * This function returns the name of the players current region, and
124 * a description of it. It is there merely for flavour text. 160 * a description of it. It is there merely for flavour text.
125 */ 161 */
162void
126void current_region_info(object *op) { 163current_region_info (object *op)
164{
127 /* 165 /*
128 * Ok I /suppose/ I should write a seperate function for this, but it isn't 166 * Ok I /suppose/ I should write a seperate function for this, but it isn't
129 * going to be /that/ slow, and won't get called much 167 * going to be /that/ slow, and won't get called much
130 */ 168 */
131 region *r = get_region_by_name(get_name_of_region_for_map(op->map)); 169 region *r = get_region_by_name (get_name_of_region_for_map (op->map));
132 170
133 if (!r) 171 if (!r)
134 return; 172 return;
135 /* This should only be possible if regions are not operating on this server. */ 173 /* This should only be possible if regions are not operating on this server. */
136 174
137 new_draw_info_format(NDI_UNIQUE, 0,op, 175 new_draw_info_format (NDI_UNIQUE, 0, op, "You are in %s. \n %s", get_region_longname (r), get_region_msg (r));
138 "You are in %s. \n %s", get_region_longname(r), get_region_msg(r));
139} 176}
140 177
178void
141void current_map_info(object *op) { 179current_map_info (object *op)
180{
142 mapstruct *m = op->map; 181 maptile *m = op->map;
143 182
144 if (!m) 183 if (!m)
145 return; 184 return;
146 185
147 new_draw_info_format(NDI_UNIQUE, 0,op, 186 new_draw_info_format (NDI_UNIQUE, 0, op, "%s (%s) in %s", &m->name, &m->path, get_name_of_region_for_map (m));
148 "%s (%s) in %s", m->name, m->path, get_name_of_region_for_map(m));
149 187
150 if (QUERY_FLAG(op,FLAG_WIZ)) { 188 if (QUERY_FLAG (op, FLAG_WIZ))
189 {
151 new_draw_info_format(NDI_UNIQUE, 0, op, 190 new_draw_info_format (NDI_UNIQUE, 0, op,
152 "players:%d difficulty:%d size:%dx%d start:%dx%d timeout %ld", 191 "players:%d difficulty:%d size:%dx%d start:%dx%d timeout %ld",
153 m->players, m->difficulty, 192 m->players, m->difficulty, m->width, m->height, m->enter_x, m->enter_y, m->timeout);
154 MAP_WIDTH(m), MAP_HEIGHT(m),
155 MAP_ENTER_X(m), MAP_ENTER_Y(m),
156 MAP_TIMEOUT(m));
157 193
158 } 194 }
159 if (m->msg) 195 if (m->msg)
160 new_draw_info(NDI_UNIQUE, NDI_NAVY, op, m->msg); 196 new_draw_info (NDI_UNIQUE, NDI_NAVY, op, m->msg);
161} 197}
162 198
163#ifdef DEBUG_MALLOC_LEVEL 199#ifdef DEBUG_MALLOC_LEVEL
200int
164int command_malloc_verify(object *op, char *parms) 201command_malloc_verify (object *op, char *parms)
165{ 202{
166 extern int malloc_verify(void); 203 extern int malloc_verify (void);
167 204
168 if (!malloc_verify()) 205 if (!malloc_verify ())
169 new_draw_info(NDI_UNIQUE, 0,op,"Heap is corrupted."); 206 new_draw_info (NDI_UNIQUE, 0, op, "Heap is corrupted.");
170 else 207 else
171 new_draw_info(NDI_UNIQUE, 0,op,"Heap checks out OK."); 208 new_draw_info (NDI_UNIQUE, 0, op, "Heap checks out OK.");
172 return 1; 209 return 1;
210}
211#endif
212
213int
214command_whereabouts (object *op, char *params)
215{
216
217 region *reg;
218 player *pl;
219
220 /*
221 * reset the counter on the region, then use it to store the number of
222 * players there.
223 * I don't know how thread-safe this would be, I suspect not very....
224 */
225 for (reg = first_region; reg != NULL; reg = reg->next)
226 {
227 reg->counter = 0;
228 }
229 for_all_players (pl)
230 if (pl->ob->map != NULL)
231 get_region_by_map (pl->ob->map)->counter++;
232
233 /* we only want to print out by places with a 'longname' field... */
234 for (reg = first_region; reg != NULL; reg = reg->next)
235 {
236 if (reg->longname == NULL && reg->counter > 0)
237 {
238 if (reg->parent != NULL)
239 {
240 reg->parent->counter += reg->counter;
241 reg->counter = 0;
242 }
243 else /*uh oh, we shouldn't be here. */
244 LOG (llevError, "command_whereabouts() Region %s with no longname has no parent", reg->name);
173 } 245 }
246 }
247 new_draw_info_format (NDI_UNIQUE, 0, op, "In the world currently there are:");
248 for (reg = first_region; reg != NULL; reg = reg->next)
249 if (reg->counter > 0)
250 new_draw_info_format (NDI_UNIQUE, 0, op, "%u players in %s", reg->counter, get_region_longname (reg));
251 return 1;
252}
253
254typedef struct
255{
256 char namebuf[MAX_BUF];
257 int login_order;
258} chars_names;
259
260int
261command_afk (object *op, char *params)
262{
263 if ((op->contr->ns->afk = !op->contr->ns->afk))
264 new_draw_info (NDI_UNIQUE, 0, op, "You are no longer AFK");
265 else
266 new_draw_info (NDI_UNIQUE, 0, op, "You are now AFK");
267
268 return 1;
269}
270
271int
272command_mapinfo (object *op, char *params)
273{
274 current_map_info (op);
275 return 1;
276}
277
278int
279command_whereami (object *op, char *params)
280{
281 current_region_info (op);
282 return 1;
283}
284
285int
286command_time (object *op, char *params)
287{
288 print_tod (op);
289 return 1;
290}
291
292int
293command_weather (object *op, char *params)
294{
295#if 0
296 int wx, wy, temp, sky;
297 char buf[MAX_BUF];
298
299 if (settings.dynamiclevel < 1)
300 return 1;
301
302 if (op->map == NULL)
303 return 1;
304
305 if (worldmap_to_weathermap (op->x, op->y, &wx, &wy, op->map) != 0)
306 return 1;
307
308 if (QUERY_FLAG (op, FLAG_WIZ))
309 {
310 /* dump the weather, Dm style! Yo! */
311 new_draw_info_format (NDI_UNIQUE, 0, op, "Real temp: %d", real_world_temperature (op->x, op->y, op->map));
312 new_draw_info_format (NDI_UNIQUE, 0, op, "Base temp: %d", weathermap[wx][wy].temp);
313 new_draw_info_format (NDI_UNIQUE, 0, op, "Humid: %d", weathermap[wx][wy].humid);
314 new_draw_info_format (NDI_UNIQUE, 0, op, "Wind: dir=%d speed=%d", weathermap[wx][wy].winddir, weathermap[wx][wy].windspeed);
315 new_draw_info_format (NDI_UNIQUE, 0, op, "Pressure: %d", weathermap[wx][wy].pressure);
316 new_draw_info_format (NDI_UNIQUE, 0, op, "Avg Elevation: %d", weathermap[wx][wy].avgelev);
317 new_draw_info_format (NDI_UNIQUE, 0, op, "Rainfall: %d Water: %d", weathermap[wx][wy].rainfall, weathermap[wx][wy].water);
318 }
319
320 temp = real_world_temperature (op->x, op->y, op->map);
321 new_draw_info_format (NDI_UNIQUE, 0, op, "It's currently %d degrees " "Centigrade out.", temp);
322
323 /* humid */
324 if (weathermap[wx][wy].humid < 20)
325 new_draw_info (NDI_UNIQUE, 0, op, "It is very dry.");
326 else if (weathermap[wx][wy].humid < 40)
327 new_draw_info (NDI_UNIQUE, 0, op, "It is very comfortable today.");
328 else if (weathermap[wx][wy].humid < 60)
329 new_draw_info (NDI_UNIQUE, 0, op, "It is a bit muggy.");
330 else if (weathermap[wx][wy].humid < 80)
331 new_draw_info (NDI_UNIQUE, 0, op, "It is muggy.");
332 else
333 new_draw_info (NDI_UNIQUE, 0, op, "It is uncomfortably muggy.");
334
335 /* wind */
336 switch (weathermap[wx][wy].winddir)
337 {
338 case 1:
339 sprintf (buf, "north");
340 break;
341 case 2:
342 sprintf (buf, "northeast");
343 break;
344 case 3:
345 sprintf (buf, "east");
346 break;
347 case 4:
348 sprintf (buf, "southeast");
349 break;
350 case 5:
351 sprintf (buf, "south");
352 break;
353 case 6:
354 sprintf (buf, "southwest");
355 break;
356 case 7:
357 sprintf (buf, "west");
358 break;
359 case 8:
360 sprintf (buf, "northwest");
361 break;
362 }
363 if (weathermap[wx][wy].windspeed < 5)
364 new_draw_info_format (NDI_UNIQUE, 0, op, "There is a mild breeze " "coming from the %s.", buf);
365 else if (weathermap[wx][wy].windspeed < 10)
366 new_draw_info_format (NDI_UNIQUE, 0, op, "There is a strong breeze " "coming from the %s.", buf);
367 else if (weathermap[wx][wy].windspeed < 15)
368 new_draw_info_format (NDI_UNIQUE, 0, op, "There is a light wind " "coming from the %s.", buf);
369 else if (weathermap[wx][wy].windspeed < 25)
370 new_draw_info_format (NDI_UNIQUE, 0, op, "There is a strong wind " "coming from the %s.", buf);
371 else if (weathermap[wx][wy].windspeed < 35)
372 new_draw_info_format (NDI_UNIQUE, 0, op, "There is a heavy wind " "coming from the %s.", buf);
373 else
374 new_draw_info_format (NDI_UNIQUE, 0, op, "The wind from the %s is " "incredibly strong!", buf);
375
376 sky = weathermap[wx][wy].sky;
377 if (temp <= 0 && sky > SKY_OVERCAST && sky < SKY_FOG)
378 sky += 10; /*let it snow */
379 switch (sky)
380 {
381 case SKY_CLEAR:
382 new_draw_info (NDI_UNIQUE, 0, op, "There isn''t a cloud in the sky.");
383 break;
384 case SKY_LIGHTCLOUD:
385 new_draw_info (NDI_UNIQUE, 0, op, "There are a few light clouds in the sky.");
386 break;
387 case SKY_OVERCAST:
388 new_draw_info (NDI_UNIQUE, 0, op, "The sky is cloudy and dreary.");
389 break;
390 case SKY_LIGHT_RAIN:
391 new_draw_info (NDI_UNIQUE, 0, op, "It is raining softly.");
392 break;
393 case SKY_RAIN:
394 new_draw_info (NDI_UNIQUE, 0, op, "It is raining.");
395 break;
396 case SKY_HEAVY_RAIN:
397 new_draw_info (NDI_UNIQUE, 0, op, "It is raining heavily.");
398 break;
399 case SKY_HURRICANE:
400 new_draw_info (NDI_UNIQUE, 0, op, "There is a heavy storm! You should go inside!");
401 break;
402 case SKY_FOG:
403 new_draw_info (NDI_UNIQUE, 0, op, "It''s foggy and miserable.");
404 break;
405 case SKY_HAIL:
406 new_draw_info (NDI_UNIQUE, 0, op, "It''s hailing out! Take cover!");
407 break;
408 case SKY_LIGHT_SNOW:
409 new_draw_info (NDI_UNIQUE, 0, op, "Snow is gently falling from the sky.");
410 break;
411 case SKY_SNOW:
412 new_draw_info (NDI_UNIQUE, 0, op, "It''s snowing out.");
413 break;
414 case SKY_HEAVY_SNOW:
415 new_draw_info (NDI_UNIQUE, 0, op, "The snow is falling very heavily now.");
416 break;
417 case SKY_BLIZZARD:
418 new_draw_info (NDI_UNIQUE, 0, op, "A full blown blizzard is in effect. You might want to take cover!");
419 break;
420 }
174#endif 421#endif
175
176int command_whereabouts(object *op, char *params) {
177
178 region *reg;
179 player *pl;
180
181 /*
182 * reset the counter on the region, then use it to store the number of
183 * players there.
184 * I don't know how thread-safe this would be, I suspect not very....
185 */
186 for (reg=first_region;reg!=NULL;reg=reg->next) {
187 reg->counter=0;
188 }
189 for (pl=first_player;pl!=NULL;pl=pl->next)
190 if (pl->ob->map!=NULL)
191 get_region_by_map(pl->ob->map)->counter++;
192
193 /* we only want to print out by places with a 'longname' field...*/
194 for (reg=first_region;reg!=NULL;reg=reg->next) {
195 if (reg->longname==NULL && reg->counter>0) {
196 if(reg->parent !=NULL) {
197 reg->parent->counter+=reg->counter;
198 reg->counter=0;
199 }
200 else /*uh oh, we shouldn't be here. */
201 LOG(llevError,"command_whereabouts() Region %s with no longname has no parent", reg->name);
202 }
203 }
204 new_draw_info_format(NDI_UNIQUE, 0,op,
205 "In the world currently there are:");
206 for (reg=first_region;reg!=NULL;reg=reg->next)
207 if(reg->counter>0)
208 new_draw_info_format(NDI_UNIQUE, 0,op,
209 "%u players in %s", reg->counter, get_region_longname(reg));
210 return 1; 422 return 1;
211} 423}
212 424
213typedef struct 425int
214 {
215 char namebuf[MAX_BUF];
216 int login_order;
217 } chars_names;
218
219/*local functon for qsort comparison*/
220static int name_cmp (const chars_names *c1, const chars_names *c2)
221 {
222 return strcasecmp (c1->namebuf, c2->namebuf);
223 }
224
225int command_who (object *op, char *params) {
226 player *pl;
227 uint16 i;
228 region *reg;
229 char* format;
230 int num_players = 0;
231 int num_wiz = 0;
232 int num_afk = 0;
233 chars_names *chars = NULL;
234
235 /*
236 * The who formats are defined in config to be blank. They should have been
237 * overridden by the settings file, if there are no entries however, it will
238 * have stayed blank. Since this probably isn't what is wanted, we will check if
239 * new formats have been specified, and if not we will use the old defaults.
240 */
241 if (!strcmp(settings.who_format,""))
242 strcpy(settings.who_format, "%N_%T%t%h%d%n[%m]");
243 if (!strcmp(settings.who_wiz_format,""))
244 strcpy(settings.who_wiz_format, "%N_%T%t%h%d%nLevel %l [%m](@%i)(%c)");
245 if (op == NULL || QUERY_FLAG(op, FLAG_WIZ))
246 format=settings.who_wiz_format;
247 else
248 format=settings.who_format;
249
250 reg=get_region_from_string(params);
251
252 for (pl=first_player;pl!=NULL;pl=pl->next) {
253 if (pl->ob->map == NULL)
254 continue;
255 if (pl->hidden && !QUERY_FLAG(op, FLAG_WIZ)) continue;
256
257 if(!region_is_child_of_region(get_region_by_map(pl->ob->map),reg)) continue;
258
259 if (pl->state==ST_PLAYING || pl->state==ST_GET_PARTY_PASSWORD) {
260
261 num_players++;
262 chars = (chars_names *) realloc(chars, num_players*sizeof(chars_names));
263 if (chars == NULL) {
264 new_draw_info(NDI_UNIQUE, 0, op, "who failed - out of memory!");
265 return 0;
266 }
267 sprintf(chars[num_players-1].namebuf, "%s", &pl->ob->name);
268 chars[num_players-1].login_order = num_players;
269 /*Check for WIZ's & AFK's*/
270 if (QUERY_FLAG(pl->ob,FLAG_WIZ))
271 num_wiz++;
272 if (QUERY_FLAG(pl->ob,FLAG_AFK))
273 num_afk++;
274 }
275 }
276 if (first_player != (player *) NULL) {
277 if (reg == NULL)
278 new_draw_info_format(NDI_UNIQUE, 0, op, "Total Players (%d) -- WIZ(%d) AFK(%d)",
279 num_players, num_wiz, num_afk);
280 else if (reg->longname == NULL)
281 new_draw_info_format(NDI_UNIQUE, 0, op, "Total Players in %s (%d) -- WIZ(%d) AFK(%d)",
282 reg->name, num_players, num_wiz, num_afk);
283 else
284 new_draw_info_format(NDI_UNIQUE, 0, op, "Total Players in %s (%d) -- WIZ(%d) AFK(%d)",
285 reg->longname, num_players, num_wiz, num_afk);
286 }
287 qsort (chars, num_players, sizeof(chars_names), (int (*)(const void *, const void *))name_cmp);
288 for (i=0;i<num_players;i++)
289 display_who_entry(op, find_player(chars[i].namebuf), format);
290 free(chars);
291 return 1;
292}
293
294/* Display a line of 'who' to op, about pl, using the formatting specified by format */
295void display_who_entry(object *op, player *pl, const char *format) {
296 char tmpbuf[MAX_BUF];
297 char outbuf[MAX_BUF];
298 size_t i;
299 outbuf[0]='\0'; /* we strcat to this, so reset it here. */
300 if (pl==NULL) {
301 LOG(llevError,"display_who_entry(): I was passed a null player");
302 return;
303 }
304 for (i=0;i<=strlen(format);i++) {
305 if (format[i]=='%') {
306 i++;
307 get_who_escape_code_value(tmpbuf,format[i],pl);
308 strcat(outbuf, tmpbuf);
309 }
310 else if (format[i]=='_')
311 strcat(outbuf," "); /* allow '_' to be used in place of spaces */
312 else {
313 sprintf(tmpbuf,"%c",format[i]);
314 strcat(outbuf,tmpbuf);
315 }
316 }
317 new_draw_info(NDI_UNIQUE, 0, op, outbuf);
318}
319
320/* Returns the value of the escape code used in the who format specifier
321 * the values are:
322 * N Name of character
323 * t title of character
324 * T the optional "the " sequence value (depend if player has own_title or not)
325 * c count
326 * n newline
327 * h [Hostile] if character is hostile, nothing otherwise
328 * d [WIZ] if character is a dm, nothing otherwise
329 * a [AFK] if character is afk, nothing otherwise
330 * l the level of the character
331 * m the map path the character is currently on
332 * M the map name of the map the character is currently on
333 * r the region name (eg scorn, wolfsburg)
334 * R the regional title (eg The Kingdom of Scorn, The Port of Wolfsburg)
335 * i player's ip adress
336 * % a literal %
337 * _ a literal underscore
338 */
339
340void get_who_escape_code_value(char *return_val, const char letter, player *pl) {
341
342 switch (letter) {
343 case 'N' : strcpy(return_val, pl->ob->name);
344 break;
345 case 't' : strcpy(return_val,(pl->own_title[0]=='\0'?pl->title:pl->own_title));
346 break;
347 case 'T' : if (pl->own_title[0]=='\0')
348 strcpy(return_val,"the ");
349 else
350 *return_val='\0';
351 break;
352 case 'c' : sprintf(return_val,"%d",pl->ob->count);
353 break;
354 case 'n' : strcpy(return_val, "\n");
355 break;
356 case 'h' : strcpy(return_val,pl->peaceful?"":" [Hostile]");
357 break;
358 case 'l' : sprintf(return_val,"%d",pl->ob->level);
359 break;
360 case 'd' : strcpy(return_val,(QUERY_FLAG(pl->ob,FLAG_WIZ)?" [WIZ]":""));
361 break;
362 case 'a' : strcpy(return_val,(QUERY_FLAG(pl->ob,FLAG_AFK)?" [AFK]":""));
363 break;
364 case 'm' : strcpy(return_val,pl->ob->map->path);
365 break;
366 case 'M' : strcpy(return_val,pl->ob->map->name?pl->ob->map->name:"Untitled");
367 break;
368 case 'r' : strcpy(return_val,get_name_of_region_for_map(pl->ob->map));
369 break;
370 case 'R' : strcpy(return_val,get_region_longname(get_region_by_map(pl->ob->map)));
371 break;
372 case 'i' : strcpy(return_val,pl->socket.host);
373 break;
374 case '%' : strcpy(return_val, "%");
375 break;
376 case '_' : strcpy(return_val, "_");
377 break;
378 }
379
380}
381
382
383int command_afk (object *op, char *params)
384{
385 if QUERY_FLAG(op,FLAG_AFK) {
386 CLEAR_FLAG(op,FLAG_AFK);
387 new_draw_info(NDI_UNIQUE, 0, op, "You are no longer AFK");
388 }
389 else
390 {
391 SET_FLAG(op,FLAG_AFK);
392 new_draw_info(NDI_UNIQUE, 0, op, "You are now AFK");
393 }
394 return 1;
395}
396
397int command_mapinfo (object *op, char *params)
398{
399 current_map_info(op);
400 return 1;
401 }
402
403int command_whereami (object *op, char *params)
404{
405 current_region_info(op);
406 return 1;
407}
408
409 int command_maps (object *op, char *params)
410{
411 map_info(op,params);
412 return 1;
413 }
414
415int command_time (object *op, char *params)
416{
417 print_tod (op);
418 return 1;
419}
420
421int command_weather (object *op, char *params)
422{
423 int wx, wy, temp, sky;
424 char buf[MAX_BUF];
425
426 if (settings.dynamiclevel < 1)
427 return 1;
428
429 if (op->map == NULL)
430 return 1;
431
432 if (worldmap_to_weathermap(op->x, op->y, &wx, &wy, op->map) != 0)
433 return 1;
434
435 if (QUERY_FLAG(op, FLAG_WIZ)) {
436 /* dump the weather, Dm style! Yo! */
437 new_draw_info_format(NDI_UNIQUE, 0, op, "Real temp: %d",
438 real_world_temperature(op->x, op->y, op->map));
439 new_draw_info_format(NDI_UNIQUE, 0, op, "Base temp: %d",
440 weathermap[wx][wy].temp);
441 new_draw_info_format(NDI_UNIQUE, 0, op, "Humid: %d",
442 weathermap[wx][wy].humid);
443 new_draw_info_format(NDI_UNIQUE, 0, op, "Wind: dir=%d speed=%d",
444 weathermap[wx][wy].winddir, weathermap[wx][wy].windspeed);
445 new_draw_info_format(NDI_UNIQUE, 0, op, "Pressure: %d",
446 weathermap[wx][wy].pressure);
447 new_draw_info_format(NDI_UNIQUE, 0, op, "Avg Elevation: %d",
448 weathermap[wx][wy].avgelev);
449 new_draw_info_format(NDI_UNIQUE, 0, op, "Rainfall: %d Water: %d",
450 weathermap[wx][wy].rainfall, weathermap[wx][wy].water);
451 }
452
453 temp = real_world_temperature(op->x, op->y, op->map);
454 new_draw_info_format(NDI_UNIQUE, 0, op, "It's currently %d degrees "
455 "Centigrade out.", temp);
456
457 /* humid */
458 if (weathermap[wx][wy].humid < 20)
459 new_draw_info(NDI_UNIQUE, 0, op, "It is very dry.");
460 else if (weathermap[wx][wy].humid < 40)
461 new_draw_info(NDI_UNIQUE, 0, op, "It is very comfortable today.");
462 else if (weathermap[wx][wy].humid < 60)
463 new_draw_info(NDI_UNIQUE, 0, op, "It is a bit muggy.");
464 else if (weathermap[wx][wy].humid < 80)
465 new_draw_info(NDI_UNIQUE, 0, op, "It is muggy.");
466 else
467 new_draw_info(NDI_UNIQUE, 0, op, "It is uncomfortably muggy.");
468
469 /* wind */
470 switch (weathermap[wx][wy].winddir) {
471 case 1: sprintf(buf, "north"); break;
472 case 2: sprintf(buf, "northeast"); break;
473 case 3: sprintf(buf, "east"); break;
474 case 4: sprintf(buf, "southeast"); break;
475 case 5: sprintf(buf, "south"); break;
476 case 6: sprintf(buf, "southwest"); break;
477 case 7: sprintf(buf, "west"); break;
478 case 8: sprintf(buf, "northwest"); break;
479 }
480 if (weathermap[wx][wy].windspeed < 5)
481 new_draw_info_format(NDI_UNIQUE, 0, op, "There is a mild breeze "
482 "coming from the %s.", buf);
483 else if (weathermap[wx][wy].windspeed < 10)
484 new_draw_info_format(NDI_UNIQUE, 0, op, "There is a strong breeze "
485 "coming from the %s.", buf);
486 else if (weathermap[wx][wy].windspeed < 15)
487 new_draw_info_format(NDI_UNIQUE, 0, op, "There is a light wind "
488 "coming from the %s.", buf);
489 else if (weathermap[wx][wy].windspeed < 25)
490 new_draw_info_format(NDI_UNIQUE, 0, op, "There is a strong wind "
491 "coming from the %s.", buf);
492 else if (weathermap[wx][wy].windspeed < 35)
493 new_draw_info_format(NDI_UNIQUE, 0, op, "There is a heavy wind "
494 "coming from the %s.", buf);
495 else
496 new_draw_info_format(NDI_UNIQUE, 0, op, "The wind from the %s is "
497 "incredibly strong!", buf);
498
499 sky = weathermap[wx][wy].sky;
500 if (temp <= 0 && sky > SKY_OVERCAST && sky < SKY_FOG)
501 sky += 10; /*let it snow*/
502 switch (sky) {
503 case SKY_CLEAR: new_draw_info(NDI_UNIQUE, 0, op, "There isn''t a cloud in the sky."); break;
504 case SKY_LIGHTCLOUD: new_draw_info(NDI_UNIQUE, 0, op, "There are a few light clouds in the sky."); break;
505 case SKY_OVERCAST: new_draw_info(NDI_UNIQUE, 0, op, "The sky is cloudy and dreary."); break;
506 case SKY_LIGHT_RAIN: new_draw_info(NDI_UNIQUE, 0, op, "It is raining softly."); break;
507 case SKY_RAIN: new_draw_info(NDI_UNIQUE, 0, op, "It is raining."); break;
508 case SKY_HEAVY_RAIN: new_draw_info(NDI_UNIQUE, 0, op, "It is raining heavily."); break;
509 case SKY_HURRICANE: new_draw_info(NDI_UNIQUE, 0, op, "There is a heavy storm! You should go inside!"); break;
510 case SKY_FOG: new_draw_info(NDI_UNIQUE, 0, op, "It''s foggy and miserable."); break;
511 case SKY_HAIL: new_draw_info(NDI_UNIQUE, 0, op, "It''s hailing out! Take cover!"); break;
512 case SKY_LIGHT_SNOW: new_draw_info(NDI_UNIQUE, 0, op, "Snow is gently falling from the sky."); break;
513 case SKY_SNOW: new_draw_info(NDI_UNIQUE, 0, op, "It''s snowing out."); break;
514 case SKY_HEAVY_SNOW: new_draw_info(NDI_UNIQUE, 0, op, "The snow is falling very heavily now."); break;
515 case SKY_BLIZZARD: new_draw_info(NDI_UNIQUE, 0, op, "A full blown blizzard is in effect. You might want to take cover!"); break;
516 }
517 return 1;
518}
519
520int command_archs (object *op, char *params) 426command_archs (object *op, char *params)
521{ 427{
522 arch_info(op); 428 arch_info (op);
523 return 1; 429 return 1;
524 } 430}
525 431
432int
526int command_hiscore (object *op, char *params) 433command_hiscore (object *op, char *params)
527{ 434{
528 display_high_score(op,op==NULL?9999:50, params); 435 display_high_score (op, op == NULL ? 9999 : 50, params);
529 return 1; 436 return 1;
530 } 437}
531 438
439int
532int command_debug (object *op, char *params) 440command_debug (object *op, char *params)
533{ 441{
534 int i; 442 int i;
535 char buf[MAX_BUF]; 443 char buf[MAX_BUF];
444
536 if(params==NULL || !sscanf(params, "%d", &i)) { 445 if (params == NULL || !sscanf (params, "%d", &i))
446 {
537 sprintf(buf,"Global debug level is %d.",settings.debug); 447 sprintf (buf, "Global debug level is %d.", settings.debug);
538 new_draw_info(NDI_UNIQUE, 0,op,buf); 448 new_draw_info (NDI_UNIQUE, 0, op, buf);
539 return 1; 449 return 1;
540 } 450 }
541 if(op != NULL && !QUERY_FLAG(op, FLAG_WIZ)) { 451 if (op != NULL && !QUERY_FLAG (op, FLAG_WIZ))
452 {
542 new_draw_info(NDI_UNIQUE, 0,op,"Privileged command."); 453 new_draw_info (NDI_UNIQUE, 0, op, "Privileged command.");
543 return 1; 454 return 1;
544 } 455 }
545 settings.debug = (enum LogLevel) FABS(i); 456 settings.debug = (enum LogLevel) FABS (i);
546 sprintf(buf,"Set debug level to %d.", i); 457 sprintf (buf, "Set debug level to %d.", i);
547 new_draw_info(NDI_UNIQUE, 0,op,buf); 458 new_draw_info (NDI_UNIQUE, 0, op, buf);
548 return 1; 459 return 1;
549 } 460}
550 461
551 462
552/* 463/*
553 * Those dumps should be just one dump with good parser 464 * Those dumps should be just one dump with good parser
554 */ 465 */
555 466
467int
556int command_dumpbelow (object *op, char *params) 468command_dumpbelow (object *op, char *params)
557{ 469{
558 if (op && op->below) { 470 if (op && op->below)
471 {
559 dump_object(op->below); 472 char *dump = dump_object (op->below);
560 new_draw_info(NDI_UNIQUE, 0,op,errmsg); 473 new_draw_info (NDI_UNIQUE, 0, op, dump);
474 free (dump);
561 /* Let's push that item on the dm's stack */ 475 /* Let's push that item on the dm's stack */
562 dm_stack_push( op->contr, op->below->count ); 476 dm_stack_push (op->contr, op->below->count);
563 } 477 }
564 return 0; 478 return 0;
565} 479}
566 480
481int
482command_dumpfriendlyobjects (object *op, char *params)
483{
484 dump_friendly_objects ();
485 return 0;
486}
487
488int
489command_printlos (object *op, char *params)
490{
491 if (op)
492 print_los (op);
493 return 0;
494}
495
496
497int
498command_version (object *op, char *params)
499{
500 version (op);
501 return 0;
502}
503
504#ifndef BUG_LOG
505# define BUG_LOG "bug_log"
506#endif
507void
508bug_report (const char *reportstring)
509{
510 FILE *fp;
511
512 if ((fp = fopen (BUG_LOG, "a")) != NULL)
513 {
514 fprintf (fp, "%s\n", reportstring);
515 fclose (fp);
516 }
517 else
518 {
519 LOG (llevError, "Cannot write bugs file %s: %s\n", BUG_LOG, strerror (errno));
520 }
521}
522
523int
524command_output_sync (object *op, char *params)
525{
526 int val;
527
528 if (!params)
529 {
530 new_draw_info_format (NDI_UNIQUE, 0, op, "Output sync time is presently %d", op->contr->outputs_sync);
531 return 1;
532 }
533 val = atoi (params);
534 if (val > 0)
535 {
536 op->contr->outputs_sync = val;
537 new_draw_info_format (NDI_UNIQUE, 0, op, "Output sync time now set to %d", op->contr->outputs_sync);
538 }
539 else
540 new_draw_info (NDI_UNIQUE, 0, op, "Invalid value for output_sync.");
541
542 return 1;
543}
544
545int
546command_output_count (object *op, char *params)
547{
548 int val;
549
550 if (!params)
551 {
552 new_draw_info_format (NDI_UNIQUE, 0, op, "Output count is presently %d", op->contr->outputs_count);
553 return 1;
554 }
555 val = atoi (params);
556 if (val > 0)
557 {
558 op->contr->outputs_count = val;
559 new_draw_info_format (NDI_UNIQUE, 0, op, "Output count now set to %d", op->contr->outputs_count);
560 }
561 else
562 new_draw_info (NDI_UNIQUE, 0, op, "Invalid value for output_count.");
563
564 return 1;
565}
566
567int
567int command_wizpass (object *op, char *params) 568command_listen (object *op, char *params)
568{ 569{
569 int i; 570 int i;
570 571
571 if (!op)
572 return 0;
573
574 if (!params)
575 i = (QUERY_FLAG(op, FLAG_WIZPASS)) ? 0 : 1;
576 else
577 i =onoff_value(params);
578
579 if (i) {
580 new_draw_info(NDI_UNIQUE, 0,op, "You will now walk through walls.\n");
581 SET_FLAG(op, FLAG_WIZPASS);
582 } else {
583 new_draw_info(NDI_UNIQUE, 0,op, "You will now be stopped by walls.\n");
584 CLEAR_FLAG(op, FLAG_WIZPASS);
585 }
586 return 0;
587}
588
589int command_wizcast (object *op, char *params)
590{
591 int i;
592
593 if (!op)
594 return 0;
595
596 if (!params)
597 i = (QUERY_FLAG(op, FLAG_WIZCAST)) ? 0 : 1;
598 else
599 i = onoff_value(params);
600
601 if (i) {
602 new_draw_info(NDI_UNIQUE, 0, op, "You can now cast spells anywhere.");
603 SET_FLAG(op, FLAG_WIZCAST);
604 } else {
605 new_draw_info(NDI_UNIQUE, 0, op, "You now cannot cast spells in no-magic areas.");
606 CLEAR_FLAG(op, FLAG_WIZCAST);
607 }
608 return 0;
609}
610
611int command_dumpallobjects (object *op, char *params)
612{
613 dump_all_objects();
614 return 0;
615}
616
617int command_dumpfriendlyobjects (object *op, char *params)
618{
619 dump_friendly_objects();
620 return 0;
621}
622
623int command_dumpallarchetypes (object *op, char *params)
624{
625 dump_all_archetypes();
626 return 0;
627 }
628
629int command_dumpmap (object *op, char *params)
630{
631 if(op)
632 dump_map(op->map);
633 return 0;
634}
635
636int command_dumpallmaps (object *op, char *params)
637{
638 dump_all_maps();
639 return 0;
640}
641
642int command_printlos (object *op, char *params)
643{
644 if (op)
645 print_los(op);
646 return 0;
647}
648
649
650int command_version (object *op, char *params)
651{
652 version(op);
653 return 0;
654}
655
656
657#ifndef BUG_LOG
658#define BUG_LOG "bug_log"
659#endif
660void bug_report(const char * reportstring){
661 FILE * fp;
662 if((fp = fopen( BUG_LOG , "a")) != NULL){
663 fprintf(fp,"%s\n", reportstring);
664 fclose(fp);
665 } else {
666 LOG(llevError, "Cannot write bugs file %s: %s\n", BUG_LOG, strerror(errno));
667 }
668}
669
670int command_output_sync(object *op, char *params)
671{
672 int val;
673
674 if (!params) {
675 new_draw_info_format(NDI_UNIQUE, 0, op,
676 "Output sync time is presently %d", op->contr->outputs_sync);
677 return 1;
678 }
679 val=atoi(params);
680 if (val>0) {
681 op->contr->outputs_sync = val;
682 new_draw_info_format(NDI_UNIQUE, 0, op,
683 "Output sync time now set to %d", op->contr->outputs_sync);
684 }
685 else
686 new_draw_info(NDI_UNIQUE, 0, op,"Invalid value for output_sync.");
687
688 return 1;
689}
690
691int command_output_count(object *op, char *params)
692{
693 int val;
694
695 if (!params) {
696 new_draw_info_format(NDI_UNIQUE, 0, op,
697 "Output count is presently %d", op->contr->outputs_count);
698 return 1;
699 }
700 val=atoi(params);
701 if (val>0) {
702 op->contr->outputs_count = val;
703 new_draw_info_format(NDI_UNIQUE, 0, op,
704 "Output count now set to %d", op->contr->outputs_count);
705 }
706 else
707 new_draw_info(NDI_UNIQUE, 0, op,"Invalid value for output_count.");
708
709 return 1;
710}
711
712int command_listen (object *op, char *params)
713{
714 int i;
715
716 if(params==NULL || !sscanf(params, "%d", &i)) { 572 if (params == NULL || !sscanf (params, "%d", &i))
717 new_draw_info_format(NDI_UNIQUE, 0, op,
718 "Set listen to what (presently %d)?", op->contr->listening);
719 return 1;
720 } 573 {
574 new_draw_info_format (NDI_UNIQUE, 0, op, "Set listen to what (presently %d)?", op->contr->listening);
575 return 1;
576 }
721 op->contr->listening=(char) i; 577 op->contr->listening = (char) i;
722 new_draw_info_format(NDI_UNIQUE, 0, op, 578 new_draw_info_format (NDI_UNIQUE, 0, op, "Your verbose level is now %d.", i);
723 "Your verbose level is now %d.",i);
724 return 1; 579 return 1;
725} 580}
726 581
727/* Prints out some useful information for the character. Everything we print 582/* Prints out some useful information for the character. Everything we print
728 * out can be determined by the docs, so we aren't revealing anything extra - 583 * out can be determined by the docs, so we aren't revealing anything extra -
729 * rather, we are making it convenient to find the values. params have 584 * rather, we are making it convenient to find the values. params have
730 * no meaning here. 585 * no meaning here.
731 */ 586 */
587int
732int command_statistics(object *pl, char *params) 588command_statistics (object *pl, char *params)
733{ 589{
734 if (!pl->contr) return 1; 590 if (!pl->contr)
735#ifndef WIN32
736 new_draw_info_format(NDI_UNIQUE, 0, pl," Experience: %lld",pl->stats.exp);
737 new_draw_info_format(NDI_UNIQUE, 0, pl," Next Level: %lld",level_exp(pl->level+1, pl->expmul));
738#else
739 new_draw_info_format(NDI_UNIQUE, 0, pl," Experience: %I64d",pl->stats.exp);
740 new_draw_info_format(NDI_UNIQUE, 0, pl," Next Level: %I64d",level_exp(pl->level+1, pl->expmul));
741#endif
742 new_draw_info(NDI_UNIQUE, 0, pl, "\nStat Nat/Real/Max");
743
744 new_draw_info_format(NDI_UNIQUE, 0, pl, "Str %2d/ %3d/%3d",
745 pl->contr->orig_stats.Str, pl->stats.Str, 20+pl->arch->clone.stats.Str);
746 new_draw_info_format(NDI_UNIQUE, 0, pl, "Dex %2d/ %3d/%3d",
747 pl->contr->orig_stats.Dex, pl->stats.Dex, 20+pl->arch->clone.stats.Dex);
748 new_draw_info_format(NDI_UNIQUE, 0, pl, "Con %2d/ %3d/%3d",
749 pl->contr->orig_stats.Con, pl->stats.Con, 20+pl->arch->clone.stats.Con);
750 new_draw_info_format(NDI_UNIQUE, 0, pl, "Int %2d/ %3d/%3d",
751 pl->contr->orig_stats.Int, pl->stats.Int, 20+pl->arch->clone.stats.Int);
752 new_draw_info_format(NDI_UNIQUE, 0, pl, "Wis %2d/ %3d/%3d",
753 pl->contr->orig_stats.Wis, pl->stats.Wis, 20+pl->arch->clone.stats.Wis);
754 new_draw_info_format(NDI_UNIQUE, 0, pl, "Pow %2d/ %3d/%3d",
755 pl->contr->orig_stats.Pow, pl->stats.Pow, 20+pl->arch->clone.stats.Pow);
756 new_draw_info_format(NDI_UNIQUE, 0, pl, "Cha %2d/ %3d/%3d",
757 pl->contr->orig_stats.Cha, pl->stats.Cha, 20+pl->arch->clone.stats.Cha);
758 new_draw_info_format(NDI_UNIQUE, 0, pl, "\nAttack Mode: %s",pl->contr->peaceful? "Peaceful":"Hostile");
759
760 /* Can't think of anything else to print right now */
761 return 0;
762}
763
764int command_fix_me(object *op, char *params)
765{
766 sum_weight(op);
767 fix_player(op);
768 return 1; 591 return 1;
769} 592 new_draw_info_format (NDI_UNIQUE, 0, pl, " Experience: %" PRId64, pl->stats.exp);
593 new_draw_info_format (NDI_UNIQUE, 0, pl, " Next Level: %" PRId64, level_exp (pl->level + 1, pl->expmul));
594 new_draw_info (NDI_UNIQUE, 0, pl, "\nStat Nat/Real/Max");
770 595
596 new_draw_info_format (NDI_UNIQUE, 0, pl, "Str %2d/ %3d/%3d",
597 pl->contr->orig_stats.Str, pl->stats.Str, 20 + pl->arch->clone.stats.Str);
598 new_draw_info_format (NDI_UNIQUE, 0, pl, "Dex %2d/ %3d/%3d",
599 pl->contr->orig_stats.Dex, pl->stats.Dex, 20 + pl->arch->clone.stats.Dex);
600 new_draw_info_format (NDI_UNIQUE, 0, pl, "Con %2d/ %3d/%3d",
601 pl->contr->orig_stats.Con, pl->stats.Con, 20 + pl->arch->clone.stats.Con);
602 new_draw_info_format (NDI_UNIQUE, 0, pl, "Int %2d/ %3d/%3d",
603 pl->contr->orig_stats.Int, pl->stats.Int, 20 + pl->arch->clone.stats.Int);
604 new_draw_info_format (NDI_UNIQUE, 0, pl, "Wis %2d/ %3d/%3d",
605 pl->contr->orig_stats.Wis, pl->stats.Wis, 20 + pl->arch->clone.stats.Wis);
606 new_draw_info_format (NDI_UNIQUE, 0, pl, "Pow %2d/ %3d/%3d",
607 pl->contr->orig_stats.Pow, pl->stats.Pow, 20 + pl->arch->clone.stats.Pow);
608 new_draw_info_format (NDI_UNIQUE, 0, pl, "Cha %2d/ %3d/%3d",
609 pl->contr->orig_stats.Cha, pl->stats.Cha, 20 + pl->arch->clone.stats.Cha);
610 new_draw_info_format (NDI_UNIQUE, 0, pl, "\nAttack Mode: %s", pl->contr->peaceful ? "Peaceful" : "Hostile");
611
612 /* Can't think of anything else to print right now */
613 return 0;
614}
615
616int
617command_fix_me (object *op, char *params)
618{
619 sum_weight (op);
620 op->update_stats ();
621 return 1;
622}
623
624int
771int command_players(object *op, char *paramss) 625command_players (object *op, char *paramss)
772{ 626{
773 char buf[MAX_BUF]; 627 char buf[MAX_BUF];
774 char *t; 628 char *t;
775 DIR *Dir; 629 DIR *Dir;
776 630
777 sprintf(buf,"%s/%s/",settings.localdir,settings.playerdir); 631 sprintf (buf, "%s/%s/", settings.localdir, settings.playerdir);
778 t=buf+strlen(buf); 632 t = buf + strlen (buf);
779 if ((Dir=opendir(buf))!=NULL) { 633 if ((Dir = opendir (buf)) != NULL)
634 {
780 const struct dirent *Entry; 635 const struct dirent *Entry;
781 636
782 while ((Entry=readdir(Dir))!=NULL) { 637 while ((Entry = readdir (Dir)))
638 {
783 /* skip '.' , '..' */ 639 /* skip '.' , '..' */
784 if (!((Entry->d_name[0]=='.' && Entry->d_name[1]=='\0') || 640 if (!((Entry->d_name[0] == '.' && Entry->d_name[1] == '\0') ||
785 (Entry->d_name[0]=='.' && Entry->d_name[1]=='.' && Entry->d_name[2]=='\0'))) 641 (Entry->d_name[0] == '.' && Entry->d_name[1] == '.' && Entry->d_name[2] == '\0')))
786 { 642 {
787 struct stat Stat; 643 struct stat Stat;
788 644
789 strcpy(t,Entry->d_name); 645 strcpy (t, Entry->d_name);
790 if (stat(buf,&Stat)==0) { 646 if (stat (buf, &Stat) == 0)
647 {
791 /* This was not posix compatible 648 /* This was not posix compatible
792 * if ((Stat.st_mode & S_IFMT)==S_IFDIR) { 649 * if ((Stat.st_mode & S_IFMT)==S_IFDIR) {
793 */ 650 */
794 if (S_ISDIR(Stat.st_mode)){ 651 if (S_ISDIR (Stat.st_mode))
652 {
795 char buf2[MAX_BUF]; 653 char buf2[MAX_BUF];
796 struct tm *tm=localtime(&Stat.st_mtime); 654 struct tm *tm = localtime (&Stat.st_mtime);
655
797 sprintf(buf2,"%s\t%04d %02d %02d %02d %02d %02d", 656 sprintf (buf2, "%s\t%04d %02d %02d %02d %02d %02d",
798 Entry->d_name, 657 Entry->d_name, 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
799 1900+tm->tm_year,
800 1+tm->tm_mon,
801 tm->tm_mday,
802 tm->tm_hour,
803 tm->tm_min,
804 tm->tm_sec);
805 new_draw_info(NDI_UNIQUE, 0, op, buf2); 658 new_draw_info (NDI_UNIQUE, 0, op, buf2);
806 } 659 }
807 } 660 }
808 } 661 }
809 } 662 }
810 } 663 }
811 closedir(Dir); 664 closedir (Dir);
812 return 0; 665 return 0;
813} 666}
814 667
815 668
816 669
670int
817int command_logs (object *op, char *params) 671command_logs (object *op, char *params)
818{ 672{
819 int i; 673 new_draw_info (NDI_UNIQUE, 0, op, "Nobody is currently logging kills.");
820 int first;
821 674
822 first=1; 675 return 1;
823 for(i=2; i<socket_info.allocated_sockets; i++) { 676}
824 if (init_sockets[i].old_mode == Old_Listen) { 677
825 if (first) { 678int
679command_applymode (object *op, char *params)
680{
681 unapplymode unapply = op->contr->unapply;
682 static const char *const types[] = { "nochoice", "never", "always" };
683
684 if (!params)
685 {
686 new_draw_info_format (NDI_UNIQUE, 0, op, "applymode is set to %s", types[op->contr->unapply]);
687 return 1;
688 }
689
690 if (!strcmp (params, "nochoice"))
691 op->contr->unapply = unapply_nochoice;
692 else if (!strcmp (params, "never"))
693 op->contr->unapply = unapply_never;
694 else if (!strcmp (params, "always"))
695 op->contr->unapply = unapply_always;
696 else
697 {
698 new_draw_info_format (NDI_UNIQUE, 0, op, "applymode: Unknown options %s, valid options are nochoice, never, always", params);
699 return 0;
700 }
701 new_draw_info_format (NDI_UNIQUE, 0, op, "Applymode %s set to %s",
702 (unapply == op->contr->unapply ? "" : " now"), types[op->contr->unapply]);
703 return 1;
704}
705
706int
707command_bowmode (object *op, char *params)
708{
709 bowtype_t oldtype = op->contr->bowtype;
710 static const char *const types[] = { "normal", "threewide", "spreadshot", "firenorth",
711 "firene", "fireeast", "firese", "firesouth",
712 "firesw", "firewest", "firenw", "bestarrow"
713 };
714 char buf[MAX_BUF];
715 int i, found;
716
717 if (!params)
718 {
719 new_draw_info_format (NDI_UNIQUE, 0, op, "bowmode is set to %s", types[op->contr->bowtype]);
720 return 1;
721 }
722
723 for (i = 0, found = 0; i <= bow_bestarrow; i++)
724 {
725 if (!strcmp (params, types[i]))
726 {
727 found++;
728 op->contr->bowtype = (bowtype_t) i;
729 break;
730 }
731 }
732 if (!found)
733 {
734 sprintf (buf, "bowmode: Unknown options %s, valid options are:", params);
735 for (i = 0; i <= bow_bestarrow; i++)
736 {
737 strcat (buf, " ");
738 strcat (buf, types[i]);
739 if (i < bow_nw)
740 strcat (buf, ",");
741 else
742 strcat (buf, ".");
743 }
744 new_draw_info_format (NDI_UNIQUE, 0, op, buf);
745 return 0;
746 }
747 new_draw_info_format (NDI_UNIQUE, 0, op, "bowmode %s set to %s", (oldtype == op->contr->bowtype ? "" : "now"), types[op->contr->bowtype]);
748 return 1;
749}
750
751int
752command_petmode (object *op, char *params)
753{
754 petmode_t oldtype = op->contr->petmode;
755 static const char *const types[] = { "normal", "sad", "defend", "arena" };
756
757 if (!params)
758 {
759 new_draw_info_format (NDI_UNIQUE, 0, op, "petmode is set to %s", types[op->contr->petmode]);
760 return 1;
761 }
762
763 if (!strcmp (params, "normal"))
764 op->contr->petmode = pet_normal;
765 else if (!strcmp (params, "sad"))
766 op->contr->petmode = pet_sad;
767 else if (!strcmp (params, "defend"))
768 op->contr->petmode = pet_defend;
769 else if (!strcmp (params, "arena"))
770 op->contr->petmode = pet_arena;
771 else
772 {
773 new_draw_info_format (NDI_UNIQUE, 0, op,
774 "petmode: Unknown options %s, valid options are normal," "sad (seek and destroy), defend, arena", params);
775 return 0;
776 }
777 new_draw_info_format (NDI_UNIQUE, 0, op, "petmode %s set to %s", (oldtype == op->contr->petmode ? "" : "now"), types[op->contr->petmode]);
778 return 1;
779}
780
781int
782command_showpets (object *op, char *params)
783{
784 objectlink *obl, *next;
785 int counter = 0, target = 0;
786 int have_shown_pet = 0;
787
788 if (params != NULL)
789 target = atoi (params);
790 for (obl = first_friendly_object; obl != NULL; obl = next)
791 {
792 object *ob = obl->ob;
793
794 next = obl->next;
795 if (ob->owner == op)
796 {
797 if (target == 0)
798 {
799 if (counter == 0)
826 new_draw_info(NDI_UNIQUE,0,op,"Kill-logs are sent to:"); 800 new_draw_info (NDI_UNIQUE, 0, op, "Pets:");
827 first=0; 801 new_draw_info_format (NDI_UNIQUE, 0, op, "%d %s - level %d", ++counter, &ob->name, ob->level);
828 } 802 }
829 new_draw_info_format(NDI_UNIQUE, 0, op, "%s: %s",
830 init_sockets[i].host,init_sockets[i].comment);
831 }
832 }
833 if (first) {
834 new_draw_info(NDI_UNIQUE,0,op,"Nobody is currently logging kills.");
835 }
836 return 1;
837}
838
839int command_applymode(object *op, char *params)
840{
841 unapplymode unapply = op->contr->unapply;
842 static const char* const types[]={"nochoice", "never", "always"};
843
844 if (!params) {
845 new_draw_info_format(NDI_UNIQUE, 0, op, "applymode is set to %s",
846 types[op->contr->unapply]);
847 return 1;
848 }
849
850 if (!strcmp(params,"nochoice"))
851 op->contr->unapply=unapply_nochoice;
852 else if (!strcmp(params,"never"))
853 op->contr->unapply=unapply_never;
854 else if (!strcmp(params,"always"))
855 op->contr->unapply=unapply_always;
856 else {
857 new_draw_info_format(NDI_UNIQUE, 0, op,
858 "applymode: Unknown options %s, valid options are nochoice, never, always",
859 params);
860 return 0;
861 }
862 new_draw_info_format(NDI_UNIQUE, 0, op, "Applymode %s set to %s",
863 (unapply==op->contr->unapply?"":" now"),
864 types[op->contr->unapply]);
865 return 1;
866}
867
868int command_bowmode(object *op, char *params)
869{
870 bowtype_t oldtype=op->contr->bowtype;
871 static const char* const types[] =
872 {"normal", "threewide", "spreadshot", "firenorth",
873 "firene", "fireeast", "firese", "firesouth",
874 "firesw", "firewest", "firenw", "bestarrow"};
875 char buf[MAX_BUF];
876 int i, found;
877
878 if (!params) {
879 new_draw_info_format(NDI_UNIQUE, 0, op, "bowmode is set to %s",
880 types[op->contr->bowtype]);
881 return 1;
882 }
883
884 for (i=0,found=0; i<=bow_bestarrow; i++) {
885 if (!strcmp(params, types[i])) {
886 found++;
887 op->contr->bowtype= (bowtype_t) i;
888 break;
889 }
890 }
891 if (!found) {
892 sprintf(buf, "bowmode: Unknown options %s, valid options are:", params);
893 for (i=0; i<=bow_bestarrow; i++) {
894 strcat(buf, " ");
895 strcat(buf, types[i]);
896 if (i < bow_nw)
897 strcat(buf, ",");
898 else
899 strcat(buf, ".");
900 }
901 new_draw_info_format(NDI_UNIQUE, 0, op, buf);
902 return 0;
903 }
904 new_draw_info_format(NDI_UNIQUE, 0, op, "bowmode %s set to %s",
905 (oldtype==op->contr->bowtype?"":"now"),
906 types[op->contr->bowtype]);
907 return 1;
908}
909
910int command_petmode(object *op, char *params)
911{
912 petmode_t oldtype=op->contr->petmode;
913 static const char* const types[]={"normal", "sad", "defend", "arena"};
914
915 if (!params) {
916 new_draw_info_format(NDI_UNIQUE, 0, op, "petmode is set to %s",
917 types[op->contr->petmode]);
918 return 1;
919 }
920
921 if (!strcmp(params,"normal"))
922 op->contr->petmode=pet_normal;
923 else if (!strcmp(params,"sad"))
924 op->contr->petmode=pet_sad;
925 else if (!strcmp(params,"defend"))
926 op->contr->petmode=pet_defend;
927 else if (!strcmp(params,"arena"))
928 op->contr->petmode=pet_arena;
929 else {
930 new_draw_info_format(NDI_UNIQUE, 0, op,
931 "petmode: Unknown options %s, valid options are normal,"
932 "sad (seek and destroy), defend, arena", params);
933 return 0;
934 }
935 new_draw_info_format(NDI_UNIQUE, 0, op, "petmode %s set to %s",
936 (oldtype==op->contr->petmode?"":"now"),
937 types[op->contr->petmode]);
938 return 1;
939}
940
941int command_showpets(object *op, char *params)
942{
943 objectlink *obl, *next;
944 int counter=0, target=0;
945 int have_shown_pet=0;
946 if (params !=NULL) target= atoi(params);
947 for (obl = first_friendly_object; obl != NULL; obl = next) {
948 object *ob = obl->ob;
949 next = obl->next;
950 if (get_owner(ob) == op) {
951 if (target ==0) {
952 if (counter==0)
953 new_draw_info(NDI_UNIQUE, 0, op, "Pets:");
954 new_draw_info_format(NDI_UNIQUE, 0, op, "%d %s - level %d", ++counter, &ob->name, ob->level );
955 }
956 else if (!have_shown_pet && ++counter==target) { 803 else if (!have_shown_pet && ++counter == target)
804 {
957 new_draw_info_format(NDI_UNIQUE, 0, op, "level %d %s", ob->level, &ob->name); 805 new_draw_info_format (NDI_UNIQUE, 0, op, "level %d %s", ob->level, &ob->name);
958 new_draw_info_format(NDI_UNIQUE, 0, op, "%d/%d HP, %d/%d SP", 806 new_draw_info_format (NDI_UNIQUE, 0, op, "%d/%d HP, %d/%d SP", ob->stats.hp, ob->stats.maxhp, ob->stats.sp, ob->stats.maxsp);
959 ob->stats.hp, ob->stats.maxhp, ob->stats.sp, ob->stats.maxsp);
960 /* this is not a nice way to do this, it should be made to be more like the statistics command */ 807 /* this is not a nice way to do this, it should be made to be more like the statistics command */
961 new_draw_info_format(NDI_UNIQUE, 0, op, "Str %d", ob->stats.Str); 808 new_draw_info_format (NDI_UNIQUE, 0, op, "Str %d", ob->stats.Str);
962 new_draw_info_format(NDI_UNIQUE, 0, op, "Dex %d", ob->stats.Dex); 809 new_draw_info_format (NDI_UNIQUE, 0, op, "Dex %d", ob->stats.Dex);
963 new_draw_info_format(NDI_UNIQUE, 0, op, "Con %d", ob->stats.Con); 810 new_draw_info_format (NDI_UNIQUE, 0, op, "Con %d", ob->stats.Con);
964 new_draw_info_format(NDI_UNIQUE, 0, op, "Int %d", ob->stats.Int); 811 new_draw_info_format (NDI_UNIQUE, 0, op, "Int %d", ob->stats.Int);
965 new_draw_info_format(NDI_UNIQUE, 0, op, "Wis %d", ob->stats.Wis); 812 new_draw_info_format (NDI_UNIQUE, 0, op, "Wis %d", ob->stats.Wis);
966 new_draw_info_format(NDI_UNIQUE, 0, op, "Cha %d", ob->stats.Cha); 813 new_draw_info_format (NDI_UNIQUE, 0, op, "Cha %d", ob->stats.Cha);
967 new_draw_info_format(NDI_UNIQUE, 0, op, "Pow %d", ob->stats.Pow); 814 new_draw_info_format (NDI_UNIQUE, 0, op, "Pow %d", ob->stats.Pow);
968 new_draw_info_format(NDI_UNIQUE, 0, op, "wc %d damage %d ac %d ", 815 new_draw_info_format (NDI_UNIQUE, 0, op, "wc %d damage %d ac %d ", ob->stats.wc, ob->stats.dam, ob->stats.ac);
969 ob->stats.wc, ob->stats.dam, ob->stats.ac);
970 have_shown_pet=1; 816 have_shown_pet = 1;
971 } 817 }
972 } 818 }
973 } 819 }
974 if (counter == 0) 820 if (counter == 0)
975 new_draw_info(NDI_UNIQUE, 0, op, "you have no pets."); 821 new_draw_info (NDI_UNIQUE, 0, op, "you have no pets.");
976 else if (target !=0 && have_shown_pet==0) 822 else if (target != 0 && have_shown_pet == 0)
977 new_draw_info(NDI_UNIQUE, 0, op, "no such pet."); 823 new_draw_info (NDI_UNIQUE, 0, op, "no such pet.");
824 return 0;
825}
826
827int
828command_usekeys (object *op, char *params)
829{
830 usekeytype oldtype = op->contr->usekeys;
831 static const char *const types[] = { "inventory", "keyrings", "containers" };
832
833 if (!params)
834 {
835 new_draw_info_format (NDI_UNIQUE, 0, op, "usekeys is set to %s", types[op->contr->usekeys]);
836 return 1;
837 }
838
839 if (!strcmp (params, "inventory"))
840 op->contr->usekeys = key_inventory;
841 else if (!strcmp (params, "keyrings"))
842 op->contr->usekeys = keyrings;
843 else if (!strcmp (params, "containers"))
844 op->contr->usekeys = containers;
845 else
846 {
847 new_draw_info_format (NDI_UNIQUE, 0, op, "usekeys: Unknown options %s, valid options are inventory, keyrings, containers", params);
848 return 0;
849 }
850 new_draw_info_format (NDI_UNIQUE, 0, op, "usekeys %s set to %s", (oldtype == op->contr->usekeys ? "" : "now"), types[op->contr->usekeys]);
851 return 1;
852}
853
854int
855command_resistances (object *op, char *params)
856{
857 int i;
858
859 if (!op)
978 return 0; 860 return 0;
979}
980 861
981int command_usekeys(object *op, char *params)
982{
983 usekeytype oldtype=op->contr->usekeys;
984 static const char* const types[]={"inventory", "keyrings", "containers"};
985
986 if (!params) {
987 new_draw_info_format(NDI_UNIQUE, 0, op, "usekeys is set to %s",
988 types[op->contr->usekeys]);
989 return 1;
990 }
991
992 if (!strcmp(params,"inventory"))
993 op->contr->usekeys=key_inventory;
994 else if (!strcmp(params,"keyrings"))
995 op->contr->usekeys=keyrings;
996 else if (!strcmp(params,"containers"))
997 op->contr->usekeys=containers;
998 else {
999 new_draw_info_format(NDI_UNIQUE, 0, op,
1000 "usekeys: Unknown options %s, valid options are inventory, keyrings, containers",
1001 params);
1002 return 0;
1003 }
1004 new_draw_info_format(NDI_UNIQUE, 0, op, "usekeys %s set to %s",
1005 (oldtype==op->contr->usekeys?"":"now"),
1006 types[op->contr->usekeys]);
1007 return 1;
1008}
1009
1010int command_resistances(object *op, char *params)
1011{
1012 int i;
1013 if (!op)
1014 return 0;
1015
1016 for (i=0; i<NROFATTACKS; i++) { 862 for (i = 0; i < NROFATTACKS; i++)
1017 if (i==ATNR_INTERNAL) continue;
1018
1019 new_draw_info_format(NDI_UNIQUE, 0, op, "%-20s %+5d",
1020 attacktype_desc[i], op->resist[i]);
1021 } 863 {
864 if (i == ATNR_INTERNAL)
865 continue;
1022 866
867 new_draw_info_format (NDI_UNIQUE, 0, op, "%-20s %+5d", attacktype_desc[i], op->resist[i]);
868 }
869
1023 /* If dragon player, let's display natural resistances */ 870 /* If dragon player, let's display natural resistances */
1024 if ( is_dragon_pl( op ) ) 871 if (is_dragon_pl (op))
872 {
873 int attack;
874 object *tmp;
875
876 for (tmp = op->inv; tmp != NULL; tmp = tmp->below)
1025 { 877 {
1026 int attack; 878 if ((tmp->type == FORCE) && (strcmp (tmp->arch->name, "dragon_skin_force") == 0))
1027 object* tmp;
1028 for ( tmp = op->inv; tmp != NULL; tmp = tmp->below )
1029 { 879 {
1030 if ( ( tmp->type == FORCE ) && ( strcmp( tmp->arch->name, "dragon_skin_force" )== 0 ) ) 880 new_draw_info (NDI_UNIQUE, 0, op, "\nNatural skin resistances:");
881 for (attack = 0; attack < NROFATTACKS; attack++)
1031 { 882 {
1032 new_draw_info( NDI_UNIQUE, 0, op, "\nNatural skin resistances:" ); 883 if (atnr_is_dragon_enabled (attack))
1033 for ( attack = 0; attack < NROFATTACKS; attack++ )
1034 { 884 {
1035 if ( atnr_is_dragon_enabled( attack ) )
1036 {
1037 new_draw_info_format( NDI_UNIQUE, 0, op, "%s: %d", change_resist_msg[ attack ], tmp->resist[ attack ] ); 885 new_draw_info_format (NDI_UNIQUE, 0, op, "%s: %d", change_resist_msg[attack], tmp->resist[attack]);
1038 }
1039 } 886 }
1040 break;
1041 } 887 }
888 break;
1042 } 889 }
1043 } 890 }
891 }
1044 892
1045return 0; 893 return 0;
1046} 894}
895
1047/* 896/*
1048 * Actual commands. 897 * Actual commands.
1049 * Those should be in small separate files (c_object.c, c_wiz.c, cmove.c,...) 898 * Those should be in small separate files (c_object.c, c_wiz.c, cmove.c,...)
1050 */ 899 */
1051 900
1052 901
902static void
1053static void help_topics(object *op, int what) 903help_topics (object *op, int what)
1054{ 904{
1055 DIR *dirp; 905 DIR *dirp;
1056 struct dirent *de; 906 struct dirent *de;
1057 char filename[MAX_BUF], line[80]; 907 char filename[MAX_BUF], line[80];
1058 int namelen, linelen=0; 908 int namelen, linelen = 0;
1059 909
1060 switch (what) { 910 switch (what)
911 {
1061 case 1: 912 case 1:
1062 sprintf(filename, "%s/wizhelp", settings.datadir); 913 sprintf (filename, "%s/wizhelp", settings.datadir);
1063 new_draw_info(NDI_UNIQUE, 0,op, " Wiz commands:"); 914 new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:");
1064 break; 915 break;
1065 case 3: 916 case 3:
1066 sprintf(filename, "%s/mischelp", settings.datadir); 917 sprintf (filename, "%s/mischelp", settings.datadir);
1067 new_draw_info(NDI_UNIQUE, 0,op, " Misc help:"); 918 new_draw_info (NDI_UNIQUE, 0, op, " Misc help:");
1068 break; 919 break;
1069 default: 920 default:
1070 sprintf(filename, "%s/help", settings.datadir); 921 sprintf (filename, "%s/help", settings.datadir);
1071 new_draw_info(NDI_UNIQUE, 0,op, " Commands:"); 922 new_draw_info (NDI_UNIQUE, 0, op, " Commands:");
1072 break; 923 break;
1073 } 924 }
925
1074 if (!(dirp=opendir(filename))) 926 if (!(dirp = opendir (filename)))
1075 return; 927 return;
1076 928
1077 line[0] ='\0'; 929 line[0] = '\0';
1078 for (de = readdir(dirp); de; de = readdir(dirp)) { 930 while (de = readdir (dirp))
1079 namelen = NAMLEN(de); 931 {
1080 if (namelen <= 2 && *de->d_name == '.' && 932 namelen = strlen (de->d_name);
1081 (namelen == 1 || de->d_name[1] == '.' ) ) 933 if (namelen <= 2 && *de->d_name == '.' && (namelen == 1 || de->d_name[1] == '.'))
1082 continue; 934 continue;
1083 linelen +=namelen+1; 935 linelen += namelen + 1;
1084 if (linelen > 42) { 936 if (linelen > 42)
937 {
1085 new_draw_info(NDI_UNIQUE, 0,op, line); 938 new_draw_info (NDI_UNIQUE, 0, op, line);
1086 sprintf(line, " %s", de->d_name); 939 sprintf (line, " %s", de->d_name);
1087 linelen =namelen+1; 940 linelen = namelen + 1;
1088 continue; 941 continue;
1089 } 942 }
1090 strcat(line, " "); 943 strcat (line, " ");
1091 strcat(line, de->d_name); 944 strcat (line, de->d_name);
1092 } 945 }
1093 new_draw_info(NDI_UNIQUE, 0,op, line); 946 new_draw_info (NDI_UNIQUE, 0, op, line);
1094 closedir(dirp); 947 closedir (dirp);
1095} 948}
1096 949
950static void
1097static void show_commands(object *op, int what) 951show_commands (object *op, int what)
1098{ 952{
1099 char line[80]; 953 char line[80];
1100 int i, size, namelen, linelen=0; 954 int i, size, namelen, linelen = 0;
1101 CommArray_s *ap; 955 CommArray_s *ap;
1102 extern CommArray_s Commands[], WizCommands[]; 956 extern CommArray_s Commands[], WizCommands[];
1103 extern const int CommandsSize, WizCommandsSize; 957 extern const int CommandsSize, WizCommandsSize;
1104 958
1105 switch (what) { 959 switch (what)
960 {
1106 case 1: 961 case 1:
1107 ap =WizCommands; 962 ap = WizCommands;
1108 size =WizCommandsSize; 963 size = WizCommandsSize;
1109 new_draw_info(NDI_UNIQUE, 0,op, " Wiz commands:"); 964 new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:");
1110 break; 965 break;
1111 case 2: 966 case 2:
1112 ap= CommunicationCommands; 967 ap = CommunicationCommands;
1113 size= CommunicationCommandSize; 968 size = CommunicationCommandSize;
1114 new_draw_info(NDI_UNIQUE, 0, op, " Communication commands:"); 969 new_draw_info (NDI_UNIQUE, 0, op, " Communication commands:");
1115 break; 970 break;
1116 default: 971 default:
1117 ap =Commands; 972 ap = Commands;
1118 size =CommandsSize; 973 size = CommandsSize;
1119 new_draw_info(NDI_UNIQUE, 0,op, " Commands:"); 974 new_draw_info (NDI_UNIQUE, 0, op, " Commands:");
1120 break; 975 break;
1121 } 976 }
1122 977
1123 line[0] ='\0'; 978 line[0] = '\0';
1124 for (i=0; i<size; i++) { 979 for (i = 0; i < size; i++)
980 {
1125 namelen = strlen(ap[i].name); 981 namelen = strlen (ap[i].name);
1126 linelen +=namelen+1; 982 linelen += namelen + 1;
1127 if (linelen > 42) { 983 if (linelen > 42)
984 {
1128 new_draw_info(NDI_UNIQUE, 0,op, line); 985 new_draw_info (NDI_UNIQUE, 0, op, line);
1129 sprintf(line, " %s", ap[i].name); 986 sprintf (line, " %s", ap[i].name);
1130 linelen =namelen+1; 987 linelen = namelen + 1;
1131 continue; 988 continue;
1132 } 989 }
1133 strcat(line, " "); 990 strcat (line, " ");
1134 strcat(line, ap[i].name); 991 strcat (line, ap[i].name);
1135 } 992 }
1136 new_draw_info(NDI_UNIQUE, 0,op, line); 993 new_draw_info (NDI_UNIQUE, 0, op, line);
1137} 994}
1138 995
1139 996
997int
1140int command_help (object *op, char *params) 998command_help (object *op, char *params)
1141{ 999{
1142 struct stat st; 1000 struct stat st;
1143 FILE *fp; 1001 FILE *fp;
1144 char filename[MAX_BUF], line[MAX_BUF]; 1002 char filename[MAX_BUF], line[MAX_BUF];
1145 int len; 1003 int len;
1146 1004
1147 if(op != NULL) 1005 if (op != NULL)
1148 clear_win_info(op); 1006 clear_win_info (op);
1149 1007
1150/* 1008/*
1151 * Main help page? 1009 * Main help page?
1152 */ 1010 */
1153 if (!params) { 1011 if (!params)
1012 {
1154 sprintf(filename, "%s/def_help", settings.datadir); 1013 sprintf (filename, "%s/def_help", settings.datadir);
1155 if ((fp=fopen(filename, "r")) == NULL) { 1014 if ((fp = fopen (filename, "r")) == NULL)
1015 {
1156 LOG(llevError, "Cannot open help file %s: %s\n", filename, strerror(errno)); 1016 LOG (llevError, "Cannot open help file %s: %s\n", filename, strerror (errno));
1017 return 0;
1018 }
1019 while (fgets (line, MAX_BUF, fp))
1020 {
1021 line[MAX_BUF - 1] = '\0';
1022 len = strlen (line) - 1;
1023 if (line[len] == '\n')
1024 line[len] = '\0';
1025 new_draw_info (NDI_UNIQUE, 0, op, line);
1026 }
1027 fclose (fp);
1157 return 0; 1028 return 0;
1158 } 1029 }
1159 while (fgets(line, MAX_BUF, fp)) {
1160 line[MAX_BUF-1] ='\0';
1161 len =strlen(line)-1;
1162 if (line[len] == '\n')
1163 line[len] ='\0';
1164 new_draw_info(NDI_UNIQUE, 0,op, line);
1165 }
1166 fclose(fp);
1167 return 0;
1168 }
1169 1030
1170 /* 1031 /*
1171 * Topics list 1032 * Topics list
1172 */ 1033 */
1173 if (!strcmp(params, "topics")) { 1034 if (!strcmp (params, "topics"))
1035 {
1174 help_topics(op, 3); 1036 help_topics (op, 3);
1175 help_topics(op, 0); 1037 help_topics (op, 0);
1176 if (QUERY_FLAG(op, FLAG_WIZ)) 1038 if (QUERY_FLAG (op, FLAG_WIZ))
1177 help_topics(op, 1); 1039 help_topics (op, 1);
1178 return 0; 1040 return 0;
1179 } 1041 }
1180 1042
1181 /* 1043 /*
1182 * Commands list 1044 * Commands list
1183 */ 1045 */
1184 if (!strcmp(params, "commands")) { 1046 if (!strcmp (params, "commands"))
1047 {
1185 show_commands(op, 0); 1048 show_commands (op, 0);
1186 show_commands(op, 2); /* show comm commands */ 1049 show_commands (op, 2); /* show comm commands */
1187 if (QUERY_FLAG(op, FLAG_WIZ)) 1050 if (QUERY_FLAG (op, FLAG_WIZ))
1188 show_commands(op, 1); 1051 show_commands (op, 1);
1189 return 0; 1052 return 0;
1190 } 1053 }
1191 1054
1192 /* 1055 /*
1193 * User wants info about command 1056 * User wants info about command
1194 */ 1057 */
1195 if (strchr(params, '.') || strchr(params, ' ') || strchr(params, '/')) { 1058 if (strchr (params, '.') || strchr (params, ' ') || strchr (params, '/'))
1059 {
1196 sprintf(line, "Illegal characters in '%s'", params); 1060 sprintf (line, "Illegal characters in '%s'", params);
1197 new_draw_info(NDI_UNIQUE, 0,op, line); 1061 new_draw_info (NDI_UNIQUE, 0, op, line);
1198 return 0; 1062 return 0;
1199 } 1063 }
1200 1064
1201 sprintf(filename, "%s/mischelp/%s", settings.datadir, params); 1065 sprintf (filename, "%s/mischelp/%s", settings.datadir, params);
1202 if (stat(filename, &st) || !S_ISREG(st.st_mode)) { 1066 if (stat (filename, &st) || !S_ISREG (st.st_mode))
1067 {
1203 if (op) { 1068 if (op)
1204 sprintf(filename, "%s/help/%s", settings.datadir, params); 1069 {
1205 if (stat(filename, &st) || !S_ISREG(st.st_mode)) {
1206 if (QUERY_FLAG(op, FLAG_WIZ)) {
1207 sprintf(filename, "%s/wizhelp/%s", settings.datadir, params); 1070 sprintf (filename, "%s/help/%s", settings.datadir, params);
1208 if (stat(filename, &st) || !S_ISREG(st.st_mode)) 1071 if (stat (filename, &st) || !S_ISREG (st.st_mode))
1072 {
1073 if (QUERY_FLAG (op, FLAG_WIZ))
1074 {
1075 sprintf (filename, "%s/wizhelp/%s", settings.datadir, params);
1076 if (stat (filename, &st) || !S_ISREG (st.st_mode))
1077 goto nohelp;
1078 }
1079 else
1209 goto nohelp; 1080 goto nohelp;
1210 } else 1081 }
1211 goto nohelp;
1212 } 1082 }
1213 } 1083 }
1214 }
1215 1084
1216 /* 1085 /*
1217 * Found that. Just cat it to screen. 1086 * Found that. Just cat it to screen.
1218 */ 1087 */
1219 if ((fp=fopen(filename, "r")) == NULL) { 1088 if ((fp = fopen (filename, "r")) == NULL)
1089 {
1220 LOG(llevError, "Cannot open help file %s: %s\n", filename, strerror(errno)); 1090 LOG (llevError, "Cannot open help file %s: %s\n", filename, strerror (errno));
1221 return 0; 1091 return 0;
1222 } 1092 }
1223 sprintf(line, "Help about '%s'", params); 1093 sprintf (line, "Help about '%s'", params);
1224 new_draw_info(NDI_UNIQUE, 0,op, line); 1094 new_draw_info (NDI_UNIQUE, 0, op, line);
1225 while (fgets(line, MAX_BUF, fp)) { 1095 while (fgets (line, MAX_BUF, fp))
1096 {
1226 line[MAX_BUF-1] ='\0'; 1097 line[MAX_BUF - 1] = '\0';
1227 len =strlen(line)-1; 1098 len = strlen (line) - 1;
1228 if (line[len] == '\n') 1099 if (line[len] == '\n')
1229 line[len] ='\0'; 1100 line[len] = '\0';
1230 new_draw_info(NDI_UNIQUE, 0,op, line); 1101 new_draw_info (NDI_UNIQUE, 0, op, line);
1231 } 1102 }
1232 fclose(fp); 1103 fclose (fp);
1233 return 0; 1104 return 0;
1234 1105
1235 /* 1106 /*
1236 * No_help -escape 1107 * No_help -escape
1237 */ 1108 */
1238 nohelp: 1109nohelp:
1239 sprintf(line, "No help available on '%s'", params); 1110 sprintf (line, "No help available on '%s'", params);
1240 new_draw_info(NDI_UNIQUE, 0,op, line); 1111 new_draw_info (NDI_UNIQUE, 0, op, line);
1241 return 0; 1112 return 0;
1242} 1113}
1243 1114
1244 1115
1116int
1245int onoff_value(const char *line) 1117onoff_value (const char *line)
1246{ 1118{
1247 int i; 1119 int i;
1248 1120
1249 if (sscanf(line, "%d", &i)) 1121 if (sscanf (line, "%d", &i))
1250 return (i != 0); 1122 return (i != 0);
1251 switch (line[0]) { 1123 switch (line[0])
1124 {
1252 case 'o': 1125 case 'o':
1253 switch (line[1]) { 1126 switch (line[1])
1254 case 'n': return 1; /* on */ 1127 {
1255 default: return 0; /* o[ff] */ 1128 case 'n':
1256 } 1129 return 1; /* on */
1257 case 'y': /* y[es] */ 1130 default:
1258 case 'k': /* k[ylla] */ 1131 return 0; /* o[ff] */
1132 }
1133 case 'y': /* y[es] */
1134 case 'k': /* k[ylla] */
1259 case 's': 1135 case 's':
1260 case 'd': 1136 case 'd':
1261 return 1; 1137 return 1;
1262 case 'n': /* n[o] */ 1138 case 'n': /* n[o] */
1263 case 'e': /* e[i] */ 1139 case 'e': /* e[i] */
1264 case 'u': 1140 case 'u':
1265 default: 1141 default:
1266 return 0; 1142 return 0;
1267 } 1143 }
1268} 1144}
1269 1145
1146int
1270int command_quit (object *op, char *params) 1147command_quit (object *op, char *params)
1271{ 1148{
1149 new_draw_info (NDI_UNIQUE, 0, op,
1272 new_draw_info(NDI_UNIQUE, 0, op, "Quitting will delete your character PERMANENTLY. If you are sure you want to do this, then use the quit_character command instead of quit."); 1150 "Quitting will delete your character PERMANENTLY. If you are sure you want to do this, then use the quit_character command instead of quit.");
1273 return 1; 1151 return 1;
1274} 1152}
1275 1153
1154int
1276int command_real_quit (object *op, char *params) 1155command_real_quit (object *op, char *params)
1277{ 1156{
1278 send_query(&op->contr->socket,CS_QUERY_SINGLECHAR, 1157 send_query (op->contr->ns, CS_QUERY_SINGLECHAR, "Quitting will delete your character.\nAre you sure you want to quit (y/n):");
1279 "Quitting will delete your character.\nAre you sure you want to quit (y/n):");
1280 1158
1281 op->contr->state = ST_CONFIRM_QUIT; 1159 op->contr->ns->state = ST_CONFIRM_QUIT;
1282 return 1; 1160 return 1;
1283 } 1161}
1284 1162
1285/* 1163/*
1286 * don't allow people to exit explore mode. It otherwise becomes 1164 * don't allow people to exit explore mode. It otherwise becomes
1287 * really easy to abuse this. 1165 * really easy to abuse this.
1288 */ 1166 */
1167int
1289int command_explore (object *op, char *params) 1168command_explore (object *op, char *params)
1290{ 1169{
1291 if (settings.explore_mode == FALSE) 1170 if (settings.explore_mode == FALSE)
1292 return 1; 1171 return 1;
1293 /* 1172 /*
1294 * I guess this is the best way to see if we are solo or not. Actually, 1173 * I guess this is the best way to see if we are solo or not. Actually,
1295 * are there any cases when first_player->next==NULL and we are not solo? 1174 * are there any cases when first_player->next==NULL and we are not solo?
1296 */ 1175 */
1297 if ((first_player!=op->contr) || (first_player->next!=NULL)) { 1176 if ((first_player != op->contr) || (first_player->next != NULL))
1177 {
1298 new_draw_info(NDI_UNIQUE, 0,op,"You can not enter explore mode if you are in a party"); 1178 new_draw_info (NDI_UNIQUE, 0, op, "You can not enter explore mode if you are in a party");
1179 }
1299 } else if (op->contr->explore) 1180 else if (op->contr->explore)
1300 new_draw_info(NDI_UNIQUE, 0,op, "There is no return from explore mode"); 1181 new_draw_info (NDI_UNIQUE, 0, op, "There is no return from explore mode");
1301 else { 1182 else
1183 {
1302 op->contr->explore=1; 1184 op->contr->explore = 1;
1303 new_draw_info(NDI_UNIQUE, 0,op, "You are now in explore mode"); 1185 new_draw_info (NDI_UNIQUE, 0, op, "You are now in explore mode");
1304 } 1186 }
1305 return 1; 1187 return 1;
1306} 1188}
1307 1189
1190int
1308int command_sound (object *op, char *params) 1191command_sound (object *op, char *params)
1309{ 1192{
1310 if (op->contr->socket.sound) { 1193 if (op->contr->ns->sound)
1194 {
1311 op->contr->socket.sound=0; 1195 op->contr->ns->sound = 0;
1312 new_draw_info(NDI_UNIQUE, 0,op, "Silence is golden..."); 1196 new_draw_info (NDI_UNIQUE, 0, op, "Silence is golden...");
1197 }
1198 else
1313 } 1199 {
1314 else {
1315 op->contr->socket.sound=1; 1200 op->contr->ns->sound = 1;
1316 new_draw_info(NDI_UNIQUE, 0,op, "The sounds are enabled."); 1201 new_draw_info (NDI_UNIQUE, 0, op, "The sounds are enabled.");
1317 } 1202 }
1203
1318 return 1; 1204 return 1;
1319} 1205}
1320 1206
1321/* Perhaps these should be in player.c, but that file is 1207int
1322 * already a bit big.
1323 */
1324
1325void receive_player_name(object *op,char k) {
1326
1327 if(!check_name(op->contr,op->contr->write_buf+1)) {
1328 get_name(op);
1329 return;
1330 }
1331 op->name = op->contr->write_buf + 1;
1332 op->name_pl = op->contr->write_buf + 1;
1333 new_draw_info(NDI_UNIQUE, 0,op,op->contr->write_buf);
1334 op->contr->name_changed=1;
1335 get_password(op);
1336}
1337
1338void receive_player_password(object *op,char k) {
1339
1340 unsigned int pwd_len=strlen(op->contr->write_buf);
1341 if(pwd_len<=1||pwd_len>17) {
1342 get_name(op);
1343 return;
1344 }
1345 new_draw_info(NDI_UNIQUE, 0,op," "); /* To hide the password better */
1346
1347 if (checkbanned(op->name, op->contr->socket.host)) {
1348 LOG(llevInfo, "Banned player tried to add: [%s@%s]\n", &op->name, op->contr->socket.host);
1349 new_draw_info(NDI_UNIQUE|NDI_RED, 0, op, "You are not allowed to play.");
1350 get_name(op);
1351 return;
1352 }
1353
1354 if(op->contr->state==ST_CONFIRM_PASSWORD) {
1355 if(!check_password(op->contr->write_buf+1,op->contr->password)) {
1356 new_draw_info(NDI_UNIQUE, 0,op,"The passwords did not match.");
1357 get_name(op);
1358 return;
1359 }
1360 clear_win_info(op);
1361 display_motd(op);
1362 new_draw_info(NDI_UNIQUE, 0,op," ");
1363 new_draw_info(NDI_UNIQUE, 0,op,"Welcome, Brave New Warrior!");
1364 new_draw_info(NDI_UNIQUE, 0,op," ");
1365 Roll_Again(op);
1366 op->contr->state=ST_ROLL_STAT;
1367 return;
1368 }
1369 strcpy(op->contr->password,crypt_string(op->contr->write_buf+1,NULL));
1370 op->contr->state=ST_ROLL_STAT;
1371 check_login(op);
1372 return;
1373}
1374
1375
1376int explore_mode(void) { 1208explore_mode (void)
1209{
1377 player *pl; 1210 player *pl;
1378 1211
1379 if (settings.explore_mode == TRUE) { 1212 if (settings.explore_mode == TRUE)
1213 {
1380 for (pl = first_player; pl != (player *) NULL; pl = pl->next) 1214 for (pl = first_player; pl != (player *) NULL; pl = pl->next)
1381 if (pl->explore) 1215 if (pl->explore)
1382 return 1; 1216 return 1;
1383 } 1217 }
1384 return 0; 1218 return 0;
1385} 1219}
1386 1220
1387 1221int
1388int command_title (object *op, char *params) 1222command_title (object *op, char *params)
1389{ 1223{
1390 char buf[MAX_BUF]; 1224 char buf[MAX_BUF];
1391 1225
1392 if (settings.set_title == FALSE) { 1226 if (settings.set_title == FALSE)
1227 {
1393 new_draw_info(NDI_UNIQUE, 0, op, "You cannot change your title."); 1228 new_draw_info (NDI_UNIQUE, 0, op, "You cannot change your title.");
1394 return 1; 1229 return 1;
1395 } 1230 }
1396 1231
1397 /* dragon players cannot change titles */ 1232 /* dragon players cannot change titles */
1398 if (is_dragon_pl(op)) { 1233 if (is_dragon_pl (op))
1234 {
1399 new_draw_info(NDI_UNIQUE, 0, op, "Dragons cannot change titles."); 1235 new_draw_info (NDI_UNIQUE, 0, op, "Dragons cannot change titles.");
1400 return 1; 1236 return 1;
1401 }
1402 1237 }
1238
1403 if(params == NULL) { 1239 if (params == NULL)
1240 {
1404 if(op->contr->own_title[0]=='\0') 1241 if (op->contr->own_title[0] == '\0')
1405 sprintf(buf,"Your title is '%s'.", op->contr->title); 1242 sprintf (buf, "Your title is '%s'.", op->contr->title);
1406 else 1243 else
1407 sprintf(buf,"Your title is '%s'.", op->contr->own_title); 1244 sprintf (buf, "Your title is '%s'.", op->contr->own_title);
1408 new_draw_info(NDI_UNIQUE, 0,op,buf); 1245 new_draw_info (NDI_UNIQUE, 0, op, buf);
1409 return 1; 1246 return 1;
1410 } 1247 }
1411 if(strcmp(params, "clear")==0 || strcmp(params, "default")==0) { 1248 if (strcmp (params, "clear") == 0 || strcmp (params, "default") == 0)
1249 {
1412 if(op->contr->own_title[0]=='\0') 1250 if (op->contr->own_title[0] == '\0')
1413 new_draw_info(NDI_UNIQUE, 0,op,"Your title is the default title."); 1251 new_draw_info (NDI_UNIQUE, 0, op, "Your title is the default title.");
1414 else 1252 else
1415 new_draw_info(NDI_UNIQUE, 0,op,"Title set to default."); 1253 new_draw_info (NDI_UNIQUE, 0, op, "Title set to default.");
1416 op->contr->own_title[0]='\0'; 1254 op->contr->own_title[0] = '\0';
1417 return 1; 1255 return 1;
1418 } 1256 }
1419 1257
1420 if((int)strlen(params) >= MAX_NAME) { 1258 if ((int) strlen (params) >= MAX_NAME)
1259 {
1421 new_draw_info(NDI_UNIQUE, 0,op,"Title too long."); 1260 new_draw_info (NDI_UNIQUE, 0, op, "Title too long.");
1422 return 1; 1261 return 1;
1423 } 1262 }
1424 strcpy(op->contr->own_title, params); 1263 strcpy (op->contr->own_title, params);
1425 return 1; 1264 return 1;
1426} 1265}
1427 1266
1267int
1428int command_save (object *op, char *params) 1268command_save (object *op, char *params)
1429{ 1269{
1430// if (get_map_flags(op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) {
1431// new_draw_info(NDI_UNIQUE, 0, op, "You can not save on unholy ground");
1432// } else
1433 if (!op->stats.exp) { 1270 if (!op->stats.exp)
1434 new_draw_info(NDI_UNIQUE, 0, op, "You don't deserve to save yet."); 1271 new_draw_info (NDI_UNIQUE, 0, op, "You don't deserve to save yet.");
1435 } else { 1272 else
1436 if(save_player(op,1)) 1273 {
1274 op->contr->save ();
1437 new_draw_info(NDI_UNIQUE, 0,op,"You have been saved."); 1275 new_draw_info (NDI_UNIQUE, 0, op, "You have been saved.");
1438 else
1439 new_draw_info(NDI_UNIQUE, 0,op,"SAVE FAILED!");
1440 } 1276 }
1277
1441 return 1; 1278 return 1;
1442} 1279}
1443 1280
1444 1281int
1445int command_peaceful (object *op, char *params) 1282command_peaceful (object *op, char *params)
1446{ 1283{
1447 new_draw_info(NDI_UNIQUE, 0, op, 1284 new_draw_info (NDI_UNIQUE, 0, op,
1448 "You cannot change your peaceful setting with this command." 1285 "You cannot change your peaceful setting with this command."
1449 " Please speak to the priest in the temple of Gorokh" 1286 " Please speak to the priest in the temple of Gorokh"
1450 " if you want to become hostile or in temple of Valriel" 1287 " if you want to become hostile or in temple of Valriel" " if you want to become peaceful again.");
1451 " if you want to become peaceful again."
1452 );
1453 1288
1454/* 1289/*
1455 if((op->contr->peaceful=!op->contr->peaceful)) 1290 if((op->contr->peaceful=!op->contr->peaceful))
1456 new_draw_info(NDI_UNIQUE, 0,op,"You will not attack other players."); 1291 new_draw_info(NDI_UNIQUE, 0,op,"You will not attack other players.");
1457 else 1292 else
1458 new_draw_info(NDI_UNIQUE, 0,op,"You will attack other players."); 1293 new_draw_info(NDI_UNIQUE, 0,op,"You will attack other players.");
1459*/ 1294*/
1460 return 1; 1295 return 1;
1461} 1296}
1462 1297
1463 1298int
1464
1465int command_wimpy (object *op, char *params) 1299command_wimpy (object *op, char *params)
1466{ 1300{
1467 int i; 1301 int i;
1468 char buf[MAX_BUF]; 1302 char buf[MAX_BUF];
1469 1303
1470 if (params==NULL || !sscanf(params, "%d", &i)) { 1304 if (params == NULL || !sscanf (params, "%d", &i))
1305 {
1471 sprintf(buf, "Your current wimpy level is %d.", op->run_away); 1306 sprintf (buf, "Your current wimpy level is %d.", op->run_away);
1472 new_draw_info(NDI_UNIQUE, 0,op, buf); 1307 new_draw_info (NDI_UNIQUE, 0, op, buf);
1473 return 1; 1308 return 1;
1474 } 1309 }
1475 sprintf(buf, "Your new wimpy level is %d.", i); 1310 sprintf (buf, "Your new wimpy level is %d.", i);
1476 new_draw_info(NDI_UNIQUE, 0,op, buf); 1311 new_draw_info (NDI_UNIQUE, 0, op, buf);
1477 op->run_away = i; 1312 op->run_away = i;
1478 return 1; 1313 return 1;
1479} 1314}
1480 1315
1481 1316int
1482int command_brace (object *op, char *params) 1317command_brace (object *op, char *params)
1483{ 1318{
1484 if (!params) 1319 if (!params)
1485 op->contr->braced =!op->contr->braced; 1320 op->contr->braced = !op->contr->braced;
1486 else 1321 else
1487 op->contr->braced =onoff_value(params); 1322 op->contr->braced = onoff_value (params);
1488 1323
1489 if(op->contr->braced) 1324 if (op->contr->braced)
1490 new_draw_info(NDI_UNIQUE, 0,op, "You are braced."); 1325 new_draw_info (NDI_UNIQUE, 0, op, "You are braced.");
1491 else 1326 else
1492 new_draw_info(NDI_UNIQUE, 0,op, "Not braced."); 1327 new_draw_info (NDI_UNIQUE, 0, op, "Not braced.");
1493 1328
1494 fix_player(op); 1329 op->update_stats ();
1495 return 0; 1330 return 0;
1496} 1331}
1497 1332
1498int command_style_map_info(object *op, char *params) 1333int
1334command_kill_pets (object *op, char *params)
1499{ 1335{
1500 extern mapstruct *styles; 1336 objectlink *obl, *next;
1501 mapstruct *mp; 1337 int counter = 0, removecount = 0;
1502 int maps_used=0, mapmem=0, objects_used=0, x,y;
1503 object *tmp;
1504 1338
1505 for (mp = styles; mp!=NULL; mp=mp->next) { 1339 if (params == NULL)
1506 maps_used++; 1340 {
1507 mapmem += MAP_WIDTH(mp)*MAP_HEIGHT(mp)*(sizeof(object *)+sizeof(MapSpace)) + sizeof(mapstruct); 1341 terminate_all_pets (op);
1508 for (x=0; x<MAP_WIDTH(mp); x++) { 1342 new_draw_info (NDI_UNIQUE, 0, op, "Your pets have been killed.");
1509 for (y=0; y<MAP_HEIGHT(mp); y++) { 1343 }
1510 for (tmp=get_map_ob(mp, x, y); tmp!=NULL; tmp=tmp->above) 1344 else
1511 objects_used++; 1345 {
1346 int target = atoi (params);
1347
1348 for (obl = first_friendly_object; obl != NULL; obl = next)
1349 {
1350 object *ob = obl->ob;
1351
1352 next = obl->next;
1353 if (ob->owner == op)
1354 if (++counter == target || (target == 0 && !strcasecmp (ob->name, params)))
1355 {
1356 ob->destroy ();
1357 removecount++;
1512 } 1358 }
1513 } 1359 }
1514 }
1515 new_draw_info_format(NDI_UNIQUE, 0, op, "Style maps loaded: %d", maps_used);
1516 new_draw_info(NDI_UNIQUE, 0, op, "Memory used, not");
1517 new_draw_info_format(NDI_UNIQUE, 0, op, "including objects: %d", mapmem);
1518 new_draw_info_format(NDI_UNIQUE, 0, op, "Style objects: %d", objects_used);
1519 new_draw_info_format(NDI_UNIQUE, 0, op, "Mem for objects: %d", objects_used * sizeof(object));
1520 return 0;
1521}
1522
1523int command_kill_pets(object *op, char *params)
1524{
1525 objectlink *obl, *next;
1526 int counter=0, removecount=0;
1527 if (params == NULL) {
1528 terminate_all_pets(op);
1529 new_draw_info(NDI_UNIQUE, 0, op, "Your pets have been killed.");
1530 }
1531 else {
1532 int target = atoi(params);
1533 for(obl = first_friendly_object; obl != NULL; obl = next) {
1534 object *ob = obl->ob;
1535 next = obl->next;
1536 if (get_owner(ob) == op)
1537 if (++counter==target || (target==0 && !strcasecmp(ob->name, params))) {
1538 if (!QUERY_FLAG(ob, FLAG_REMOVED))
1539 remove_ob(ob);
1540 remove_friendly_object(ob);
1541 free_object(ob);
1542 removecount++;
1543 }
1544 }
1545 if (removecount!=0) 1360 if (removecount != 0)
1546 new_draw_info_format(NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount); 1361 new_draw_info_format (NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount);
1547 else 1362 else
1548 new_draw_info(NDI_UNIQUE, 0, op, "Couldn't find any suitable pets to kill.\n"); 1363 new_draw_info (NDI_UNIQUE, 0, op, "Couldn't find any suitable pets to kill.\n");
1549 } 1364 }
1550 return 0; 1365 return 0;
1551} 1366}
1552

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines