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.1 by elmex, Sun Aug 13 17:16:03 2006 UTC vs.
Revision 1.10 by root, Wed Sep 20 21:53:50 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines