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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines