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.5 by root, Sun Sep 3 00:18:42 2006 UTC vs.
Revision 1.8 by root, Thu Sep 14 22:34:03 2006 UTC

1/*
2 * static char *rcsid_c_misc_c =
3 * "$Id: c_misc.C,v 1.5 2006/09/03 00:18:42 root Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 22*/
28 23
29#include <global.h> 24#include <global.h>
30#include <loader.h> 25#include <loader.h>
31#ifndef __CEXTRACT__ 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)
38{
42 mapstruct *m; 39 mapstruct *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 "%-30s %5d %5d", body_locations[i].use_name, op->body_info[i], op->body_used[i]);
85 } 84 {
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]);
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
217 new_draw_info_format(NDI_UNIQUE, 0,op, 143 new_draw_info_format (NDI_UNIQUE, 0, op, "You are in %s. \n %s", get_region_longname (r), get_region_msg (r));
218 "You are in %s. \n %s", get_region_longname(r), get_region_msg(r));
219} 144}
220 145
146void
221void current_map_info(object *op) { 147current_map_info (object *op)
148{
222 mapstruct *m = op->map; 149 mapstruct *m = op->map;
223 150
224 if (!m) 151 if (!m)
225 return; 152 return;
226 153
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)); 154 new_draw_info_format (NDI_UNIQUE, 0, op, "%s (%s) in %s", m->name, m->path, get_name_of_region_for_map (m));
229 155
230 if (QUERY_FLAG(op,FLAG_WIZ)) { 156 if (QUERY_FLAG (op, FLAG_WIZ))
157 {
231 new_draw_info_format(NDI_UNIQUE, 0, op, 158 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;
425 case 't' : 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; 371 break;
372 case 't':
373 strcpy (return_val, (pl->own_title[0] == '\0' ? pl->title : pl->own_title));
374 break;
375 case 'T':
376 if (pl->own_title[0] == '\0')
377 strcpy (return_val, "the ");
378 else
379 *return_val = '\0';
380 break;
381 case 'c':
432 case 'c' : sprintf(return_val,"%d",pl->ob->count); 382 sprintf (return_val, "%d", pl->ob->count);
433 break; 383 break;
384 case 'n':
434 case 'n' : strcpy(return_val, "\n"); 385 strcpy (return_val, "\n");
435 break; 386 break;
387 case 'h':
436 case 'h' : strcpy(return_val,pl->peaceful?"":" [Hostile]"); 388 strcpy (return_val, pl->peaceful ? "" : " [Hostile]");
437 break; 389 break;
390 case 'l':
438 case 'l' : sprintf(return_val,"%d",pl->ob->level); 391 sprintf (return_val, "%d", pl->ob->level);
439 break; 392 break;
393 case 'd':
440 case 'd' : strcpy(return_val,(QUERY_FLAG(pl->ob,FLAG_WIZ)?" [WIZ]":"")); 394 strcpy (return_val, (QUERY_FLAG (pl->ob, FLAG_WIZ) ? " [WIZ]" : ""));
441 break; 395 break;
396 case 'a':
442 case 'a' : strcpy(return_val,(QUERY_FLAG(pl->ob,FLAG_AFK)?" [AFK]":"")); 397 strcpy (return_val, (QUERY_FLAG (pl->ob, FLAG_AFK) ? " [AFK]" : ""));
443 break; 398 break;
399 case 'm':
444 case 'm' : strcpy(return_val,pl->ob->map->path); 400 strcpy (return_val, pl->ob->map->path);
445 break; 401 break;
402 case 'M':
446 case 'M' : strcpy(return_val,pl->ob->map->name?pl->ob->map->name:"Untitled"); 403 strcpy (return_val, pl->ob->map->name ? pl->ob->map->name : "Untitled");
447 break; 404 break;
405 case 'r':
448 case 'r' : strcpy(return_val,get_name_of_region_for_map(pl->ob->map)); 406 strcpy (return_val, get_name_of_region_for_map (pl->ob->map));
449 break; 407 break;
408 case 'R':
450 case 'R' : strcpy(return_val,get_region_longname(get_region_by_map(pl->ob->map))); 409 strcpy (return_val, get_region_longname (get_region_by_map (pl->ob->map)));
451 break; 410 break;
411 case 'i':
452 case 'i' : strcpy(return_val,pl->socket.host); 412 strcpy (return_val, pl->socket.host);
453 break; 413 break;
414 case '%':
454 case '%' : strcpy(return_val, "%"); 415 strcpy (return_val, "%");
455 break; 416 break;
417 case '_':
456 case '_' : strcpy(return_val, "_"); 418 strcpy (return_val, "_");
457 break; 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_time (object *op, char *params)
502{
503 print_tod (op);
504 return 1;
505}
506
507int command_weather (object *op, char *params)
508{
509 int wx, wy, temp, sky;
510 char buf[MAX_BUF];
511
512 if (settings.dynamiclevel < 1)
513 return 1;
514
515 if (op->map == NULL)
516 return 1;
517
518 if (worldmap_to_weathermap(op->x, op->y, &wx, &wy, op->map) != 0)
519 return 1;
520
521 if (QUERY_FLAG(op, FLAG_WIZ)) { 485 if (QUERY_FLAG (op, FLAG_WIZ))
486 {
522 /* dump the weather, Dm style! Yo! */ 487 /* dump the weather, Dm style! Yo! */
523 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));
524 real_world_temperature(op->x, op->y, op->map));
525 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);
526 weathermap[wx][wy].temp);
527 new_draw_info_format(NDI_UNIQUE, 0, op, "Humid: %d", 490 new_draw_info_format (NDI_UNIQUE, 0, op, "Humid: %d", weathermap[wx][wy].humid);
528 weathermap[wx][wy].humid); 491 new_draw_info_format (NDI_UNIQUE, 0, op, "Wind: dir=%d speed=%d", weathermap[wx][wy].winddir, weathermap[wx][wy].windspeed);
529 new_draw_info_format(NDI_UNIQUE, 0, op, "Wind: dir=%d speed=%d",
530 weathermap[wx][wy].winddir, weathermap[wx][wy].windspeed);
531 new_draw_info_format(NDI_UNIQUE, 0, op, "Pressure: %d", 492 new_draw_info_format (NDI_UNIQUE, 0, op, "Pressure: %d", weathermap[wx][wy].pressure);
532 weathermap[wx][wy].pressure);
533 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);
534 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);
535 new_draw_info_format(NDI_UNIQUE, 0, op, "Rainfall: %d Water: %d",
536 weathermap[wx][wy].rainfall, weathermap[wx][wy].water);
537 } 495 }
538 496
539 temp = real_world_temperature(op->x, op->y, op->map); 497 temp = real_world_temperature (op->x, op->y, op->map);
540 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);
541 "Centigrade out.", temp);
542 499
543 /* humid */ 500 /* humid */
544 if (weathermap[wx][wy].humid < 20) 501 if (weathermap[wx][wy].humid < 20)
545 new_draw_info(NDI_UNIQUE, 0, op, "It is very dry."); 502 new_draw_info (NDI_UNIQUE, 0, op, "It is very dry.");
546 else if (weathermap[wx][wy].humid < 40) 503 else if (weathermap[wx][wy].humid < 40)
547 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.");
548 else if (weathermap[wx][wy].humid < 60) 505 else if (weathermap[wx][wy].humid < 60)
549 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.");
550 else if (weathermap[wx][wy].humid < 80) 507 else if (weathermap[wx][wy].humid < 80)
551 new_draw_info(NDI_UNIQUE, 0, op, "It is muggy."); 508 new_draw_info (NDI_UNIQUE, 0, op, "It is muggy.");
552 else 509 else
553 new_draw_info(NDI_UNIQUE, 0, op, "It is uncomfortably muggy."); 510 new_draw_info (NDI_UNIQUE, 0, op, "It is uncomfortably muggy.");
554 511
555 /* wind */ 512 /* wind */
556 switch (weathermap[wx][wy].winddir) { 513 switch (weathermap[wx][wy].winddir)
557 case 1: sprintf(buf, "north"); break;
558 case 2: sprintf(buf, "northeast"); break;
559 case 3: sprintf(buf, "east"); break;
560 case 4: sprintf(buf, "southeast"); break;
561 case 5: sprintf(buf, "south"); break;
562 case 6: sprintf(buf, "southwest"); break;
563 case 7: sprintf(buf, "west"); break;
564 case 8: sprintf(buf, "northwest"); break;
565 } 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 }
566 if (weathermap[wx][wy].windspeed < 5) 540 if (weathermap[wx][wy].windspeed < 5)
567 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);
568 "coming from the %s.", buf);
569 else if (weathermap[wx][wy].windspeed < 10) 542 else if (weathermap[wx][wy].windspeed < 10)
570 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);
571 "coming from the %s.", buf);
572 else if (weathermap[wx][wy].windspeed < 15) 544 else if (weathermap[wx][wy].windspeed < 15)
573 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);
574 "coming from the %s.", buf);
575 else if (weathermap[wx][wy].windspeed < 25) 546 else if (weathermap[wx][wy].windspeed < 25)
576 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);
577 "coming from the %s.", buf);
578 else if (weathermap[wx][wy].windspeed < 35) 548 else if (weathermap[wx][wy].windspeed < 35)
579 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);
580 "coming from the %s.", buf);
581 else 550 else
582 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);
583 "incredibly strong!", buf);
584 552
585 sky = weathermap[wx][wy].sky; 553 sky = weathermap[wx][wy].sky;
586 if (temp <= 0 && sky > SKY_OVERCAST && sky < SKY_FOG) 554 if (temp <= 0 && sky > SKY_OVERCAST && sky < SKY_FOG)
587 sky += 10; /*let it snow*/ 555 sky += 10; /*let it snow */
588 switch (sky) { 556 switch (sky)
557 {
558 case SKY_CLEAR:
589 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:
590 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:
591 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:
592 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:
593 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:
594 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:
595 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:
596 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:
597 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:
598 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:
599 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:
600 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:
601 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;
602 } 597 }
603 return 1; 598 return 1;
604} 599}
605 600
601int
606int command_archs (object *op, char *params) 602command_archs (object *op, char *params)
607{ 603{
608 arch_info(op); 604 arch_info (op);
609 return 1; 605 return 1;
610 } 606}
611 607
608int
612int command_hiscore (object *op, char *params) 609command_hiscore (object *op, char *params)
613{ 610{
614 display_high_score(op,op==NULL?9999:50, params); 611 display_high_score (op, op == NULL ? 9999 : 50, params);
615 return 1; 612 return 1;
616 } 613}
617 614
615int
618int command_debug (object *op, char *params) 616command_debug (object *op, char *params)
619{ 617{
620 int i; 618 int i;
621 char buf[MAX_BUF]; 619 char buf[MAX_BUF];
620
622 if(params==NULL || !sscanf(params, "%d", &i)) { 621 if (params == NULL || !sscanf (params, "%d", &i))
622 {
623 sprintf(buf,"Global debug level is %d.",settings.debug); 623 sprintf (buf, "Global debug level is %d.", settings.debug);
624 new_draw_info(NDI_UNIQUE, 0,op,buf); 624 new_draw_info (NDI_UNIQUE, 0, op, buf);
625 return 1; 625 return 1;
626 } 626 }
627 if(op != NULL && !QUERY_FLAG(op, FLAG_WIZ)) { 627 if (op != NULL && !QUERY_FLAG (op, FLAG_WIZ))
628 {
628 new_draw_info(NDI_UNIQUE, 0,op,"Privileged command."); 629 new_draw_info (NDI_UNIQUE, 0, op, "Privileged command.");
629 return 1; 630 return 1;
630 } 631 }
631 settings.debug = (enum LogLevel) FABS(i); 632 settings.debug = (enum LogLevel) FABS (i);
632 sprintf(buf,"Set debug level to %d.", i); 633 sprintf (buf, "Set debug level to %d.", i);
633 new_draw_info(NDI_UNIQUE, 0,op,buf); 634 new_draw_info (NDI_UNIQUE, 0, op, buf);
634 return 1; 635 return 1;
635 } 636}
636 637
637 638
638/* 639/*
639 * Those dumps should be just one dump with good parser 640 * Those dumps should be just one dump with good parser
640 */ 641 */
641 642
643int
642int command_dumpbelow (object *op, char *params) 644command_dumpbelow (object *op, char *params)
643{ 645{
644 if (op && op->below) { 646 if (op && op->below)
647 {
645 dump_object(op->below); 648 dump_object (op->below);
646 new_draw_info(NDI_UNIQUE, 0,op,errmsg); 649 new_draw_info (NDI_UNIQUE, 0, op, errmsg);
647 /* Let's push that item on the dm's stack */ 650 /* Let's push that item on the dm's stack */
648 dm_stack_push( op->contr, op->below->count ); 651 dm_stack_push (op->contr, op->below->count);
649 } 652 }
650 return 0; 653 return 0;
651} 654}
652 655
656int
653int command_wizpass (object *op, char *params) 657command_wizpass (object *op, char *params)
654{ 658{
655 int i; 659 int i;
656 660
657 if (!op) 661 if (!op)
658 return 0; 662 return 0;
659 663
660 if (!params) 664 if (!params)
661 i = (QUERY_FLAG(op, FLAG_WIZPASS)) ? 0 : 1; 665 i = (QUERY_FLAG (op, FLAG_WIZPASS)) ? 0 : 1;
662 else 666 else
663 i =onoff_value(params); 667 i = onoff_value (params);
664 668
665 if (i) { 669 if (i)
670 {
666 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");
667 SET_FLAG(op, FLAG_WIZPASS); 672 SET_FLAG (op, FLAG_WIZPASS);
673 }
668 } else { 674 else
675 {
669 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");
670 CLEAR_FLAG(op, FLAG_WIZPASS); 677 CLEAR_FLAG (op, FLAG_WIZPASS);
671 } 678 }
672 return 0; 679 return 0;
673} 680}
674 681
682int
675int command_wizcast (object *op, char *params) 683command_wizcast (object *op, char *params)
676{ 684{
677 int i; 685 int i;
678 686
679 if (!op) 687 if (!op)
680 return 0; 688 return 0;
681 689
682 if (!params) 690 if (!params)
683 i = (QUERY_FLAG(op, FLAG_WIZCAST)) ? 0 : 1; 691 i = (QUERY_FLAG (op, FLAG_WIZCAST)) ? 0 : 1;
684 else 692 else
685 i = onoff_value(params); 693 i = onoff_value (params);
686 694
687 if (i) { 695 if (i)
696 {
688 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.");
689 SET_FLAG(op, FLAG_WIZCAST); 698 SET_FLAG (op, FLAG_WIZCAST);
699 }
690 } else { 700 else
701 {
691 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.");
692 CLEAR_FLAG(op, FLAG_WIZCAST); 703 CLEAR_FLAG (op, FLAG_WIZCAST);
693 } 704 }
694 return 0; 705 return 0;
695} 706}
696 707
708int
697int command_dumpallobjects (object *op, char *params) 709command_dumpallobjects (object *op, char *params)
698{ 710{
699 dump_all_objects(); 711 dump_all_objects ();
700 return 0; 712 return 0;
701} 713}
702 714
715int
703int command_dumpfriendlyobjects (object *op, char *params) 716command_dumpfriendlyobjects (object *op, char *params)
704{ 717{
705 dump_friendly_objects(); 718 dump_friendly_objects ();
706 return 0; 719 return 0;
707} 720}
708 721
722int
709int command_dumpallarchetypes (object *op, char *params) 723command_dumpallarchetypes (object *op, char *params)
710{ 724{
711 dump_all_archetypes(); 725 dump_all_archetypes ();
712 return 0; 726 return 0;
713 } 727}
714 728
729int
715int command_dumpmap (object *op, char *params) 730command_dumpmap (object *op, char *params)
716{
717 if(op)
718 dump_map(op->map);
719 return 0;
720}
721
722int command_dumpallmaps (object *op, char *params)
723{
724 dump_all_maps();
725 return 0;
726}
727
728int command_printlos (object *op, char *params)
729{ 731{
730 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)
731 print_los(op); 748 print_los (op);
732 return 0; 749 return 0;
733} 750}
734 751
735 752
753int
736int command_version (object *op, char *params) 754command_version (object *op, char *params)
737{ 755{
738 version(op); 756 version (op);
739 return 0; 757 return 0;
740} 758}
741 759
742 760
743#ifndef BUG_LOG 761#ifndef BUG_LOG
744#define BUG_LOG "bug_log" 762# define BUG_LOG "bug_log"
745#endif 763#endif
764void
746void bug_report(const char * reportstring){ 765bug_report (const char *reportstring)
766{
747 FILE * fp; 767 FILE *fp;
768
748 if((fp = fopen( BUG_LOG , "a")) != NULL){ 769 if ((fp = fopen (BUG_LOG, "a")) != NULL)
770 {
749 fprintf(fp,"%s\n", reportstring); 771 fprintf (fp, "%s\n", reportstring);
750 fclose(fp); 772 fclose (fp);
773 }
751 } else { 774 else
775 {
752 LOG(llevError, "Cannot write bugs file %s: %s\n", BUG_LOG, strerror(errno)); 776 LOG (llevError, "Cannot write bugs file %s: %s\n", BUG_LOG, strerror (errno));
753 } 777 }
754} 778}
755 779
780int
756int command_output_sync(object *op, char *params) 781command_output_sync (object *op, char *params)
757{ 782{
758 int val; 783 int val;
759 784
760 if (!params) { 785 if (!params)
761 new_draw_info_format(NDI_UNIQUE, 0, op, 786 {
762 "Output sync time is presently %d", op->contr->outputs_sync); 787 new_draw_info_format (NDI_UNIQUE, 0, op, "Output sync time is presently %d", op->contr->outputs_sync);
763 return 1; 788 return 1;
764 } 789 }
765 val=atoi(params); 790 val = atoi (params);
766 if (val>0) { 791 if (val > 0)
792 {
767 op->contr->outputs_sync = val; 793 op->contr->outputs_sync = val;
768 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);
769 "Output sync time now set to %d", op->contr->outputs_sync);
770 } 795 }
771 else 796 else
772 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.");
773 798
774 return 1; 799 return 1;
775} 800}
776 801
802int
777int command_output_count(object *op, char *params) 803command_output_count (object *op, char *params)
778{ 804{
779 int val; 805 int val;
780 806
781 if (!params) { 807 if (!params)
782 new_draw_info_format(NDI_UNIQUE, 0, op, 808 {
783 "Output count is presently %d", op->contr->outputs_count); 809 new_draw_info_format (NDI_UNIQUE, 0, op, "Output count is presently %d", op->contr->outputs_count);
784 return 1; 810 return 1;
785 } 811 }
786 val=atoi(params); 812 val = atoi (params);
787 if (val>0) { 813 if (val > 0)
814 {
788 op->contr->outputs_count = val; 815 op->contr->outputs_count = val;
789 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);
790 "Output count now set to %d", op->contr->outputs_count);
791 } 817 }
792 else 818 else
793 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.");
794 820
795 return 1; 821 return 1;
796} 822}
797 823
824int
798int command_listen (object *op, char *params) 825command_listen (object *op, char *params)
799{ 826{
800 int i; 827 int i;
801 828
802 if(params==NULL || !sscanf(params, "%d", &i)) { 829 if (params == NULL || !sscanf (params, "%d", &i))
803 new_draw_info_format(NDI_UNIQUE, 0, op, 830 {
804 "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);
805 return 1; 832 return 1;
806 } 833 }
807 op->contr->listening=(char) i; 834 op->contr->listening = (char) i;
808 new_draw_info_format(NDI_UNIQUE, 0, op, 835 new_draw_info_format (NDI_UNIQUE, 0, op, "Your verbose level is now %d.", i);
809 "Your verbose level is now %d.",i);
810 return 1; 836 return 1;
811} 837}
812 838
813/* Prints out some useful information for the character. Everything we print 839/* Prints out some useful information for the character. Everything we print
814 * 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 -
815 * 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
816 * no meaning here. 842 * no meaning here.
817 */ 843 */
844int
818int command_statistics(object *pl, char *params) 845command_statistics (object *pl, char *params)
819{ 846{
820 if (!pl->contr) return 1; 847 if (!pl->contr)
848 return 1;
821#ifndef WIN32 849#ifndef WIN32
822 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);
823 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));
824#else 852#else
825 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);
826 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));
827#endif 855#endif
828 new_draw_info(NDI_UNIQUE, 0, pl, "\nStat Nat/Real/Max"); 856 new_draw_info (NDI_UNIQUE, 0, pl, "\nStat Nat/Real/Max");
829 857
830 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",
831 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);
832 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",
833 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);
834 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",
835 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);
836 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",
837 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);
838 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",
839 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);
840 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",
841 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);
842 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",
843 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);
844 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");
845 873
846 /* Can't think of anything else to print right now */ 874 /* Can't think of anything else to print right now */
847 return 0; 875 return 0;
848} 876}
849 877
878int
850int command_fix_me(object *op, char *params) 879command_fix_me (object *op, char *params)
851{ 880{
852 sum_weight(op); 881 sum_weight (op);
853 fix_player(op); 882 fix_player (op);
854 return 1; 883 return 1;
855} 884}
856 885
886int
857int command_players(object *op, char *paramss) 887command_players (object *op, char *paramss)
858{ 888{
859 char buf[MAX_BUF]; 889 char buf[MAX_BUF];
860 char *t; 890 char *t;
861 DIR *Dir; 891 DIR *Dir;
862 892
863 sprintf(buf,"%s/%s/",settings.localdir,settings.playerdir); 893 sprintf (buf, "%s/%s/", settings.localdir, settings.playerdir);
864 t=buf+strlen(buf); 894 t = buf + strlen (buf);
865 if ((Dir=opendir(buf))!=NULL) { 895 if ((Dir = opendir (buf)) != NULL)
896 {
866 const struct dirent *Entry; 897 const struct dirent *Entry;
867 898
868 while ((Entry=readdir(Dir))!=NULL) { 899 while ((Entry = readdir (Dir)) != NULL)
900 {
869 /* skip '.' , '..' */ 901 /* skip '.' , '..' */
870 if (!((Entry->d_name[0]=='.' && Entry->d_name[1]=='\0') || 902 if (!((Entry->d_name[0] == '.' && Entry->d_name[1] == '\0') ||
871 (Entry->d_name[0]=='.' && Entry->d_name[1]=='.' && Entry->d_name[2]=='\0'))) 903 (Entry->d_name[0] == '.' && Entry->d_name[1] == '.' && Entry->d_name[2] == '\0')))
872 { 904 {
873 struct stat Stat; 905 struct stat Stat;
874 906
875 strcpy(t,Entry->d_name); 907 strcpy (t, Entry->d_name);
876 if (stat(buf,&Stat)==0) { 908 if (stat (buf, &Stat) == 0)
909 {
877 /* This was not posix compatible 910 /* This was not posix compatible
878 * if ((Stat.st_mode & S_IFMT)==S_IFDIR) { 911 * if ((Stat.st_mode & S_IFMT)==S_IFDIR) {
879 */ 912 */
880 if (S_ISDIR(Stat.st_mode)){ 913 if (S_ISDIR (Stat.st_mode))
914 {
881 char buf2[MAX_BUF]; 915 char buf2[MAX_BUF];
882 struct tm *tm=localtime(&Stat.st_mtime); 916 struct tm *tm = localtime (&Stat.st_mtime);
917
883 sprintf(buf2,"%s\t%04d %02d %02d %02d %02d %02d", 918 sprintf (buf2, "%s\t%04d %02d %02d %02d %02d %02d",
884 Entry->d_name, 919 Entry->d_name, 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
885 1900+tm->tm_year,
886 1+tm->tm_mon,
887 tm->tm_mday,
888 tm->tm_hour,
889 tm->tm_min,
890 tm->tm_sec);
891 new_draw_info(NDI_UNIQUE, 0, op, buf2); 920 new_draw_info (NDI_UNIQUE, 0, op, buf2);
892 } 921 }
893 } 922 }
894 } 923 }
895 } 924 }
896 } 925 }
897 closedir(Dir); 926 closedir (Dir);
927 return 0;
928}
929
930
931
932int
933command_logs (object *op, char *params)
934{
935 int i;
936 int first;
937
938 first = 1;
939 for (i = 2; i < socket_info.allocated_sockets; i++)
940 {
941 if (init_sockets[i].old_mode == Old_Listen)
942 {
943 if (first)
944 {
945 new_draw_info (NDI_UNIQUE, 0, op, "Kill-logs are sent to:");
946 first = 0;
947 }
948 new_draw_info_format (NDI_UNIQUE, 0, op, "%s: %s", init_sockets[i].host, init_sockets[i].comment);
949 }
950 }
951 if (first)
952 {
953 new_draw_info (NDI_UNIQUE, 0, op, "Nobody is currently logging kills.");
954 }
955 return 1;
956}
957
958int
959command_applymode (object *op, char *params)
960{
961 unapplymode unapply = op->contr->unapply;
962 static const char *const types[] = { "nochoice", "never", "always" };
963
964 if (!params)
965 {
966 new_draw_info_format (NDI_UNIQUE, 0, op, "applymode is set to %s", types[op->contr->unapply]);
967 return 1;
968 }
969
970 if (!strcmp (params, "nochoice"))
971 op->contr->unapply = unapply_nochoice;
972 else if (!strcmp (params, "never"))
973 op->contr->unapply = unapply_never;
974 else if (!strcmp (params, "always"))
975 op->contr->unapply = unapply_always;
976 else
977 {
978 new_draw_info_format (NDI_UNIQUE, 0, op, "applymode: Unknown options %s, valid options are nochoice, never, always", params);
979 return 0;
980 }
981 new_draw_info_format (NDI_UNIQUE, 0, op, "Applymode %s set to %s",
982 (unapply == op->contr->unapply ? "" : " now"), types[op->contr->unapply]);
983 return 1;
984}
985
986int
987command_bowmode (object *op, char *params)
988{
989 bowtype_t oldtype = op->contr->bowtype;
990 static const char *const types[] = { "normal", "threewide", "spreadshot", "firenorth",
991 "firene", "fireeast", "firese", "firesouth",
992 "firesw", "firewest", "firenw", "bestarrow"
993 };
994 char buf[MAX_BUF];
995 int i, found;
996
997 if (!params)
998 {
999 new_draw_info_format (NDI_UNIQUE, 0, op, "bowmode is set to %s", types[op->contr->bowtype]);
1000 return 1;
1001 }
1002
1003 for (i = 0, found = 0; i <= bow_bestarrow; i++)
1004 {
1005 if (!strcmp (params, types[i]))
1006 {
1007 found++;
1008 op->contr->bowtype = (bowtype_t) i;
1009 break;
1010 }
1011 }
1012 if (!found)
1013 {
1014 sprintf (buf, "bowmode: Unknown options %s, valid options are:", params);
1015 for (i = 0; i <= bow_bestarrow; i++)
1016 {
1017 strcat (buf, " ");
1018 strcat (buf, types[i]);
1019 if (i < bow_nw)
1020 strcat (buf, ",");
1021 else
1022 strcat (buf, ".");
1023 }
1024 new_draw_info_format (NDI_UNIQUE, 0, op, buf);
1025 return 0;
1026 }
1027 new_draw_info_format (NDI_UNIQUE, 0, op, "bowmode %s set to %s", (oldtype == op->contr->bowtype ? "" : "now"), types[op->contr->bowtype]);
1028 return 1;
1029}
1030
1031int
1032command_petmode (object *op, char *params)
1033{
1034 petmode_t oldtype = op->contr->petmode;
1035 static const char *const types[] = { "normal", "sad", "defend", "arena" };
1036
1037 if (!params)
1038 {
1039 new_draw_info_format (NDI_UNIQUE, 0, op, "petmode is set to %s", types[op->contr->petmode]);
1040 return 1;
1041 }
1042
1043 if (!strcmp (params, "normal"))
1044 op->contr->petmode = pet_normal;
1045 else if (!strcmp (params, "sad"))
1046 op->contr->petmode = pet_sad;
1047 else if (!strcmp (params, "defend"))
1048 op->contr->petmode = pet_defend;
1049 else if (!strcmp (params, "arena"))
1050 op->contr->petmode = pet_arena;
1051 else
1052 {
1053 new_draw_info_format (NDI_UNIQUE, 0, op,
1054 "petmode: Unknown options %s, valid options are normal," "sad (seek and destroy), defend, arena", params);
1055 return 0;
1056 }
1057 new_draw_info_format (NDI_UNIQUE, 0, op, "petmode %s set to %s", (oldtype == op->contr->petmode ? "" : "now"), types[op->contr->petmode]);
1058 return 1;
1059}
1060
1061int
1062command_showpets (object *op, char *params)
1063{
1064 objectlink *obl, *next;
1065 int counter = 0, target = 0;
1066 int have_shown_pet = 0;
1067
1068 if (params != NULL)
1069 target = atoi (params);
1070 for (obl = first_friendly_object; obl != NULL; obl = next)
1071 {
1072 object *ob = obl->ob;
1073
1074 next = obl->next;
1075 if (get_owner (ob) == op)
1076 {
1077 if (target == 0)
1078 {
1079 if (counter == 0)
1080 new_draw_info (NDI_UNIQUE, 0, op, "Pets:");
1081 new_draw_info_format (NDI_UNIQUE, 0, op, "%d %s - level %d", ++counter, &ob->name, ob->level);
1082 }
1083 else if (!have_shown_pet && ++counter == target)
1084 {
1085 new_draw_info_format (NDI_UNIQUE, 0, op, "level %d %s", ob->level, &ob->name);
1086 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);
1087 /* this is not a nice way to do this, it should be made to be more like the statistics command */
1088 new_draw_info_format (NDI_UNIQUE, 0, op, "Str %d", ob->stats.Str);
1089 new_draw_info_format (NDI_UNIQUE, 0, op, "Dex %d", ob->stats.Dex);
1090 new_draw_info_format (NDI_UNIQUE, 0, op, "Con %d", ob->stats.Con);
1091 new_draw_info_format (NDI_UNIQUE, 0, op, "Int %d", ob->stats.Int);
1092 new_draw_info_format (NDI_UNIQUE, 0, op, "Wis %d", ob->stats.Wis);
1093 new_draw_info_format (NDI_UNIQUE, 0, op, "Cha %d", ob->stats.Cha);
1094 new_draw_info_format (NDI_UNIQUE, 0, op, "Pow %d", ob->stats.Pow);
1095 new_draw_info_format (NDI_UNIQUE, 0, op, "wc %d damage %d ac %d ", ob->stats.wc, ob->stats.dam, ob->stats.ac);
1096 have_shown_pet = 1;
1097 }
1098 }
1099 }
1100 if (counter == 0)
1101 new_draw_info (NDI_UNIQUE, 0, op, "you have no pets.");
1102 else if (target != 0 && have_shown_pet == 0)
1103 new_draw_info (NDI_UNIQUE, 0, op, "no such pet.");
1104 return 0;
1105}
1106
1107int
1108command_usekeys (object *op, char *params)
1109{
1110 usekeytype oldtype = op->contr->usekeys;
1111 static const char *const types[] = { "inventory", "keyrings", "containers" };
1112
1113 if (!params)
1114 {
1115 new_draw_info_format (NDI_UNIQUE, 0, op, "usekeys is set to %s", types[op->contr->usekeys]);
1116 return 1;
1117 }
1118
1119 if (!strcmp (params, "inventory"))
1120 op->contr->usekeys = key_inventory;
1121 else if (!strcmp (params, "keyrings"))
1122 op->contr->usekeys = keyrings;
1123 else if (!strcmp (params, "containers"))
1124 op->contr->usekeys = containers;
1125 else
1126 {
1127 new_draw_info_format (NDI_UNIQUE, 0, op, "usekeys: Unknown options %s, valid options are inventory, keyrings, containers", params);
1128 return 0;
1129 }
1130 new_draw_info_format (NDI_UNIQUE, 0, op, "usekeys %s set to %s", (oldtype == op->contr->usekeys ? "" : "now"), types[op->contr->usekeys]);
1131 return 1;
1132}
1133
1134int
1135command_resistances (object *op, char *params)
1136{
1137 int i;
1138
1139 if (!op)
898 return 0; 1140 return 0;
899}
900 1141
1142 for (i = 0; i < NROFATTACKS; i++)
1143 {
1144 if (i == ATNR_INTERNAL)
1145 continue;
901 1146
1147 new_draw_info_format (NDI_UNIQUE, 0, op, "%-20s %+5d", attacktype_desc[i], op->resist[i]);
1148 }
902 1149
903int command_logs (object *op, char *params) 1150 /* If dragon player, let's display natural resistances */
904{ 1151 if (is_dragon_pl (op))
905 int i; 1152 {
906 int first; 1153 int attack;
1154 object *tmp;
907 1155
908 first=1; 1156 for (tmp = op->inv; tmp != NULL; tmp = tmp->below)
909 for(i=2; i<socket_info.allocated_sockets; i++) { 1157 {
910 if (init_sockets[i].old_mode == Old_Listen) { 1158 if ((tmp->type == FORCE) && (strcmp (tmp->arch->name, "dragon_skin_force") == 0))
911 if (first) { 1159 {
912 new_draw_info(NDI_UNIQUE,0,op,"Kill-logs are sent to:"); 1160 new_draw_info (NDI_UNIQUE, 0, op, "\nNatural skin resistances:");
1161 for (attack = 0; attack < NROFATTACKS; attack++)
913 first=0; 1162 {
1163 if (atnr_is_dragon_enabled (attack))
1164 {
1165 new_draw_info_format (NDI_UNIQUE, 0, op, "%s: %d", change_resist_msg[attack], tmp->resist[attack]);
1166 }
1167 }
1168 break;
914 } 1169 }
915 new_draw_info_format(NDI_UNIQUE, 0, op, "%s: %s",
916 init_sockets[i].host,init_sockets[i].comment);
917 }
918 }
919 if (first) {
920 new_draw_info(NDI_UNIQUE,0,op,"Nobody is currently logging kills.");
921 }
922 return 1;
923}
924
925int command_applymode(object *op, char *params)
926{
927 unapplymode unapply = op->contr->unapply;
928 static const char* const types[]={"nochoice", "never", "always"};
929
930 if (!params) {
931 new_draw_info_format(NDI_UNIQUE, 0, op, "applymode is set to %s",
932 types[op->contr->unapply]);
933 return 1;
934 }
935
936 if (!strcmp(params,"nochoice"))
937 op->contr->unapply=unapply_nochoice;
938 else if (!strcmp(params,"never"))
939 op->contr->unapply=unapply_never;
940 else if (!strcmp(params,"always"))
941 op->contr->unapply=unapply_always;
942 else {
943 new_draw_info_format(NDI_UNIQUE, 0, op,
944 "applymode: Unknown options %s, valid options are nochoice, never, always",
945 params);
946 return 0;
947 }
948 new_draw_info_format(NDI_UNIQUE, 0, op, "Applymode %s set to %s",
949 (unapply==op->contr->unapply?"":" now"),
950 types[op->contr->unapply]);
951 return 1;
952}
953
954int command_bowmode(object *op, char *params)
955{
956 bowtype_t oldtype=op->contr->bowtype;
957 static const char* const types[] =
958 {"normal", "threewide", "spreadshot", "firenorth",
959 "firene", "fireeast", "firese", "firesouth",
960 "firesw", "firewest", "firenw", "bestarrow"};
961 char buf[MAX_BUF];
962 int i, found;
963
964 if (!params) {
965 new_draw_info_format(NDI_UNIQUE, 0, op, "bowmode is set to %s",
966 types[op->contr->bowtype]);
967 return 1;
968 }
969
970 for (i=0,found=0; i<=bow_bestarrow; i++) {
971 if (!strcmp(params, types[i])) {
972 found++;
973 op->contr->bowtype= (bowtype_t) i;
974 break;
975 }
976 }
977 if (!found) {
978 sprintf(buf, "bowmode: Unknown options %s, valid options are:", params);
979 for (i=0; i<=bow_bestarrow; i++) {
980 strcat(buf, " ");
981 strcat(buf, types[i]);
982 if (i < bow_nw)
983 strcat(buf, ",");
984 else
985 strcat(buf, ".");
986 }
987 new_draw_info_format(NDI_UNIQUE, 0, op, buf);
988 return 0;
989 }
990 new_draw_info_format(NDI_UNIQUE, 0, op, "bowmode %s set to %s",
991 (oldtype==op->contr->bowtype?"":"now"),
992 types[op->contr->bowtype]);
993 return 1;
994}
995
996int command_petmode(object *op, char *params)
997{
998 petmode_t oldtype=op->contr->petmode;
999 static const char* const types[]={"normal", "sad", "defend", "arena"};
1000
1001 if (!params) {
1002 new_draw_info_format(NDI_UNIQUE, 0, op, "petmode is set to %s",
1003 types[op->contr->petmode]);
1004 return 1;
1005 }
1006
1007 if (!strcmp(params,"normal"))
1008 op->contr->petmode=pet_normal;
1009 else if (!strcmp(params,"sad"))
1010 op->contr->petmode=pet_sad;
1011 else if (!strcmp(params,"defend"))
1012 op->contr->petmode=pet_defend;
1013 else if (!strcmp(params,"arena"))
1014 op->contr->petmode=pet_arena;
1015 else {
1016 new_draw_info_format(NDI_UNIQUE, 0, op,
1017 "petmode: Unknown options %s, valid options are normal,"
1018 "sad (seek and destroy), defend, arena", params);
1019 return 0;
1020 }
1021 new_draw_info_format(NDI_UNIQUE, 0, op, "petmode %s set to %s",
1022 (oldtype==op->contr->petmode?"":"now"),
1023 types[op->contr->petmode]);
1024 return 1;
1025}
1026
1027int command_showpets(object *op, char *params)
1028{
1029 objectlink *obl, *next;
1030 int counter=0, target=0;
1031 int have_shown_pet=0;
1032 if (params !=NULL) target= atoi(params);
1033 for (obl = first_friendly_object; obl != NULL; obl = next) {
1034 object *ob = obl->ob;
1035 next = obl->next;
1036 if (get_owner(ob) == op) {
1037 if (target ==0) {
1038 if (counter==0)
1039 new_draw_info(NDI_UNIQUE, 0, op, "Pets:");
1040 new_draw_info_format(NDI_UNIQUE, 0, op, "%d %s - level %d", ++counter, &ob->name, ob->level );
1041 }
1042 else if (!have_shown_pet && ++counter==target) {
1043 new_draw_info_format(NDI_UNIQUE, 0, op, "level %d %s", ob->level, &ob->name);
1044 new_draw_info_format(NDI_UNIQUE, 0, op, "%d/%d HP, %d/%d SP",
1045 ob->stats.hp, ob->stats.maxhp, ob->stats.sp, ob->stats.maxsp);
1046 /* this is not a nice way to do this, it should be made to be more like the statistics command */
1047 new_draw_info_format(NDI_UNIQUE, 0, op, "Str %d", ob->stats.Str);
1048 new_draw_info_format(NDI_UNIQUE, 0, op, "Dex %d", ob->stats.Dex);
1049 new_draw_info_format(NDI_UNIQUE, 0, op, "Con %d", ob->stats.Con);
1050 new_draw_info_format(NDI_UNIQUE, 0, op, "Int %d", ob->stats.Int);
1051 new_draw_info_format(NDI_UNIQUE, 0, op, "Wis %d", ob->stats.Wis);
1052 new_draw_info_format(NDI_UNIQUE, 0, op, "Cha %d", ob->stats.Cha);
1053 new_draw_info_format(NDI_UNIQUE, 0, op, "Pow %d", ob->stats.Pow);
1054 new_draw_info_format(NDI_UNIQUE, 0, op, "wc %d damage %d ac %d ",
1055 ob->stats.wc, ob->stats.dam, ob->stats.ac);
1056 have_shown_pet=1;
1057 } 1170 }
1058 }
1059 } 1171 }
1060 if (counter == 0) 1172
1061 new_draw_info(NDI_UNIQUE, 0, op, "you have no pets.");
1062 else if (target !=0 && have_shown_pet==0)
1063 new_draw_info(NDI_UNIQUE, 0, op, "no such pet.");
1064 return 0; 1173 return 0;
1065} 1174}
1066 1175
1067int command_usekeys(object *op, char *params)
1068{
1069 usekeytype oldtype=op->contr->usekeys;
1070 static const char* const types[]={"inventory", "keyrings", "containers"};
1071
1072 if (!params) {
1073 new_draw_info_format(NDI_UNIQUE, 0, op, "usekeys is set to %s",
1074 types[op->contr->usekeys]);
1075 return 1;
1076 }
1077
1078 if (!strcmp(params,"inventory"))
1079 op->contr->usekeys=key_inventory;
1080 else if (!strcmp(params,"keyrings"))
1081 op->contr->usekeys=keyrings;
1082 else if (!strcmp(params,"containers"))
1083 op->contr->usekeys=containers;
1084 else {
1085 new_draw_info_format(NDI_UNIQUE, 0, op,
1086 "usekeys: Unknown options %s, valid options are inventory, keyrings, containers",
1087 params);
1088 return 0;
1089 }
1090 new_draw_info_format(NDI_UNIQUE, 0, op, "usekeys %s set to %s",
1091 (oldtype==op->contr->usekeys?"":"now"),
1092 types[op->contr->usekeys]);
1093 return 1;
1094}
1095
1096int command_resistances(object *op, char *params)
1097{
1098 int i;
1099 if (!op)
1100 return 0;
1101
1102 for (i=0; i<NROFATTACKS; i++) {
1103 if (i==ATNR_INTERNAL) continue;
1104
1105 new_draw_info_format(NDI_UNIQUE, 0, op, "%-20s %+5d",
1106 attacktype_desc[i], op->resist[i]);
1107 }
1108
1109 /* If dragon player, let's display natural resistances */
1110 if ( is_dragon_pl( op ) )
1111 {
1112 int attack;
1113 object* tmp;
1114 for ( tmp = op->inv; tmp != NULL; tmp = tmp->below )
1115 {
1116 if ( ( tmp->type == FORCE ) && ( strcmp( tmp->arch->name, "dragon_skin_force" )== 0 ) )
1117 {
1118 new_draw_info( NDI_UNIQUE, 0, op, "\nNatural skin resistances:" );
1119 for ( attack = 0; attack < NROFATTACKS; attack++ )
1120 {
1121 if ( atnr_is_dragon_enabled( attack ) )
1122 {
1123 new_draw_info_format( NDI_UNIQUE, 0, op, "%s: %d", change_resist_msg[ attack ], tmp->resist[ attack ] );
1124 }
1125 }
1126 break;
1127 }
1128 }
1129 }
1130
1131return 0;
1132}
1133/* 1176/*
1134 * Actual commands. 1177 * Actual commands.
1135 * Those should be in small separate files (c_object.c, c_wiz.c, cmove.c,...) 1178 * Those should be in small separate files (c_object.c, c_wiz.c, cmove.c,...)
1136 */ 1179 */
1137 1180
1138 1181
1182static void
1139static void help_topics(object *op, int what) 1183help_topics (object *op, int what)
1140{ 1184{
1141 DIR *dirp; 1185 DIR *dirp;
1142 struct dirent *de; 1186 struct dirent *de;
1143 char filename[MAX_BUF], line[80]; 1187 char filename[MAX_BUF], line[80];
1144 int namelen, linelen=0; 1188 int namelen, linelen = 0;
1145 1189
1146 switch (what) { 1190 switch (what)
1191 {
1147 case 1: 1192 case 1:
1148 sprintf(filename, "%s/wizhelp", settings.datadir); 1193 sprintf (filename, "%s/wizhelp", settings.datadir);
1149 new_draw_info(NDI_UNIQUE, 0,op, " Wiz commands:"); 1194 new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:");
1150 break; 1195 break;
1151 case 3: 1196 case 3:
1152 sprintf(filename, "%s/mischelp", settings.datadir); 1197 sprintf (filename, "%s/mischelp", settings.datadir);
1153 new_draw_info(NDI_UNIQUE, 0,op, " Misc help:"); 1198 new_draw_info (NDI_UNIQUE, 0, op, " Misc help:");
1154 break; 1199 break;
1155 default: 1200 default:
1156 sprintf(filename, "%s/help", settings.datadir); 1201 sprintf (filename, "%s/help", settings.datadir);
1157 new_draw_info(NDI_UNIQUE, 0,op, " Commands:"); 1202 new_draw_info (NDI_UNIQUE, 0, op, " Commands:");
1158 break; 1203 break;
1159 } 1204 }
1160 if (!(dirp=opendir(filename))) 1205 if (!(dirp = opendir (filename)))
1161 return; 1206 return;
1162 1207
1163 line[0] ='\0'; 1208 line[0] = '\0';
1164 for (de = readdir(dirp); de; de = readdir(dirp)) { 1209 for (de = readdir (dirp); de; de = readdir (dirp))
1210 {
1165 namelen = NAMLEN(de); 1211 namelen = NAMLEN (de);
1166 if (namelen <= 2 && *de->d_name == '.' && 1212 if (namelen <= 2 && *de->d_name == '.' && (namelen == 1 || de->d_name[1] == '.'))
1167 (namelen == 1 || de->d_name[1] == '.' ) )
1168 continue; 1213 continue;
1169 linelen +=namelen+1; 1214 linelen += namelen + 1;
1170 if (linelen > 42) { 1215 if (linelen > 42)
1216 {
1171 new_draw_info(NDI_UNIQUE, 0,op, line); 1217 new_draw_info (NDI_UNIQUE, 0, op, line);
1172 sprintf(line, " %s", de->d_name); 1218 sprintf (line, " %s", de->d_name);
1173 linelen =namelen+1; 1219 linelen = namelen + 1;
1174 continue; 1220 continue;
1175 } 1221 }
1176 strcat(line, " "); 1222 strcat (line, " ");
1177 strcat(line, de->d_name); 1223 strcat (line, de->d_name);
1178 } 1224 }
1179 new_draw_info(NDI_UNIQUE, 0,op, line); 1225 new_draw_info (NDI_UNIQUE, 0, op, line);
1180 closedir(dirp); 1226 closedir (dirp);
1181} 1227}
1182 1228
1229static void
1183static void show_commands(object *op, int what) 1230show_commands (object *op, int what)
1184{ 1231{
1185 char line[80]; 1232 char line[80];
1186 int i, size, namelen, linelen=0; 1233 int i, size, namelen, linelen = 0;
1187 CommArray_s *ap; 1234 CommArray_s *ap;
1188 extern CommArray_s Commands[], WizCommands[]; 1235 extern CommArray_s Commands[], WizCommands[];
1189 extern const int CommandsSize, WizCommandsSize; 1236 extern const int CommandsSize, WizCommandsSize;
1190 1237
1191 switch (what) { 1238 switch (what)
1239 {
1192 case 1: 1240 case 1:
1193 ap =WizCommands; 1241 ap = WizCommands;
1194 size =WizCommandsSize; 1242 size = WizCommandsSize;
1195 new_draw_info(NDI_UNIQUE, 0,op, " Wiz commands:"); 1243 new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:");
1196 break; 1244 break;
1197 case 2: 1245 case 2:
1198 ap= CommunicationCommands; 1246 ap = CommunicationCommands;
1199 size= CommunicationCommandSize; 1247 size = CommunicationCommandSize;
1200 new_draw_info(NDI_UNIQUE, 0, op, " Communication commands:"); 1248 new_draw_info (NDI_UNIQUE, 0, op, " Communication commands:");
1201 break; 1249 break;
1202 default: 1250 default:
1203 ap =Commands; 1251 ap = Commands;
1204 size =CommandsSize; 1252 size = CommandsSize;
1205 new_draw_info(NDI_UNIQUE, 0,op, " Commands:"); 1253 new_draw_info (NDI_UNIQUE, 0, op, " Commands:");
1206 break; 1254 break;
1207 } 1255 }
1208 1256
1209 line[0] ='\0'; 1257 line[0] = '\0';
1210 for (i=0; i<size; i++) { 1258 for (i = 0; i < size; i++)
1259 {
1211 namelen = strlen(ap[i].name); 1260 namelen = strlen (ap[i].name);
1212 linelen +=namelen+1; 1261 linelen += namelen + 1;
1213 if (linelen > 42) { 1262 if (linelen > 42)
1263 {
1214 new_draw_info(NDI_UNIQUE, 0,op, line); 1264 new_draw_info (NDI_UNIQUE, 0, op, line);
1215 sprintf(line, " %s", ap[i].name); 1265 sprintf (line, " %s", ap[i].name);
1216 linelen =namelen+1; 1266 linelen = namelen + 1;
1217 continue; 1267 continue;
1218 } 1268 }
1219 strcat(line, " "); 1269 strcat (line, " ");
1220 strcat(line, ap[i].name); 1270 strcat (line, ap[i].name);
1221 } 1271 }
1222 new_draw_info(NDI_UNIQUE, 0,op, line); 1272 new_draw_info (NDI_UNIQUE, 0, op, line);
1223} 1273}
1224 1274
1225 1275
1276int
1226int command_help (object *op, char *params) 1277command_help (object *op, char *params)
1227{ 1278{
1228 struct stat st; 1279 struct stat st;
1229 FILE *fp; 1280 FILE *fp;
1230 char filename[MAX_BUF], line[MAX_BUF]; 1281 char filename[MAX_BUF], line[MAX_BUF];
1231 int len; 1282 int len;
1232 1283
1233 if(op != NULL) 1284 if (op != NULL)
1234 clear_win_info(op); 1285 clear_win_info (op);
1235 1286
1236/* 1287/*
1237 * Main help page? 1288 * Main help page?
1238 */ 1289 */
1239 if (!params) { 1290 if (!params)
1291 {
1240 sprintf(filename, "%s/def_help", settings.datadir); 1292 sprintf (filename, "%s/def_help", settings.datadir);
1241 if ((fp=fopen(filename, "r")) == NULL) { 1293 if ((fp = fopen (filename, "r")) == NULL)
1294 {
1242 LOG(llevError, "Cannot open help file %s: %s\n", filename, strerror(errno)); 1295 LOG (llevError, "Cannot open help file %s: %s\n", filename, strerror (errno));
1296 return 0;
1297 }
1298 while (fgets (line, MAX_BUF, fp))
1299 {
1300 line[MAX_BUF - 1] = '\0';
1301 len = strlen (line) - 1;
1302 if (line[len] == '\n')
1303 line[len] = '\0';
1304 new_draw_info (NDI_UNIQUE, 0, op, line);
1305 }
1306 fclose (fp);
1243 return 0; 1307 return 0;
1244 } 1308 }
1245 while (fgets(line, MAX_BUF, fp)) {
1246 line[MAX_BUF-1] ='\0';
1247 len =strlen(line)-1;
1248 if (line[len] == '\n')
1249 line[len] ='\0';
1250 new_draw_info(NDI_UNIQUE, 0,op, line);
1251 }
1252 fclose(fp);
1253 return 0;
1254 }
1255 1309
1256 /* 1310 /*
1257 * Topics list 1311 * Topics list
1258 */ 1312 */
1259 if (!strcmp(params, "topics")) { 1313 if (!strcmp (params, "topics"))
1314 {
1260 help_topics(op, 3); 1315 help_topics (op, 3);
1261 help_topics(op, 0); 1316 help_topics (op, 0);
1262 if (QUERY_FLAG(op, FLAG_WIZ)) 1317 if (QUERY_FLAG (op, FLAG_WIZ))
1263 help_topics(op, 1); 1318 help_topics (op, 1);
1264 return 0; 1319 return 0;
1265 } 1320 }
1266 1321
1267 /* 1322 /*
1268 * Commands list 1323 * Commands list
1269 */ 1324 */
1270 if (!strcmp(params, "commands")) { 1325 if (!strcmp (params, "commands"))
1326 {
1271 show_commands(op, 0); 1327 show_commands (op, 0);
1272 show_commands(op, 2); /* show comm commands */ 1328 show_commands (op, 2); /* show comm commands */
1273 if (QUERY_FLAG(op, FLAG_WIZ)) 1329 if (QUERY_FLAG (op, FLAG_WIZ))
1274 show_commands(op, 1); 1330 show_commands (op, 1);
1275 return 0; 1331 return 0;
1276 } 1332 }
1277 1333
1278 /* 1334 /*
1279 * User wants info about command 1335 * User wants info about command
1280 */ 1336 */
1281 if (strchr(params, '.') || strchr(params, ' ') || strchr(params, '/')) { 1337 if (strchr (params, '.') || strchr (params, ' ') || strchr (params, '/'))
1338 {
1282 sprintf(line, "Illegal characters in '%s'", params); 1339 sprintf (line, "Illegal characters in '%s'", params);
1283 new_draw_info(NDI_UNIQUE, 0,op, line); 1340 new_draw_info (NDI_UNIQUE, 0, op, line);
1284 return 0; 1341 return 0;
1285 } 1342 }
1286 1343
1287 sprintf(filename, "%s/mischelp/%s", settings.datadir, params); 1344 sprintf (filename, "%s/mischelp/%s", settings.datadir, params);
1288 if (stat(filename, &st) || !S_ISREG(st.st_mode)) { 1345 if (stat (filename, &st) || !S_ISREG (st.st_mode))
1346 {
1289 if (op) { 1347 if (op)
1290 sprintf(filename, "%s/help/%s", settings.datadir, params); 1348 {
1291 if (stat(filename, &st) || !S_ISREG(st.st_mode)) {
1292 if (QUERY_FLAG(op, FLAG_WIZ)) {
1293 sprintf(filename, "%s/wizhelp/%s", settings.datadir, params); 1349 sprintf (filename, "%s/help/%s", settings.datadir, params);
1294 if (stat(filename, &st) || !S_ISREG(st.st_mode)) 1350 if (stat (filename, &st) || !S_ISREG (st.st_mode))
1351 {
1352 if (QUERY_FLAG (op, FLAG_WIZ))
1353 {
1354 sprintf (filename, "%s/wizhelp/%s", settings.datadir, params);
1355 if (stat (filename, &st) || !S_ISREG (st.st_mode))
1356 goto nohelp;
1357 }
1358 else
1295 goto nohelp; 1359 goto nohelp;
1296 } else 1360 }
1297 goto nohelp;
1298 } 1361 }
1299 } 1362 }
1300 }
1301 1363
1302 /* 1364 /*
1303 * Found that. Just cat it to screen. 1365 * Found that. Just cat it to screen.
1304 */ 1366 */
1305 if ((fp=fopen(filename, "r")) == NULL) { 1367 if ((fp = fopen (filename, "r")) == NULL)
1368 {
1306 LOG(llevError, "Cannot open help file %s: %s\n", filename, strerror(errno)); 1369 LOG (llevError, "Cannot open help file %s: %s\n", filename, strerror (errno));
1307 return 0; 1370 return 0;
1308 } 1371 }
1309 sprintf(line, "Help about '%s'", params); 1372 sprintf (line, "Help about '%s'", params);
1310 new_draw_info(NDI_UNIQUE, 0,op, line); 1373 new_draw_info (NDI_UNIQUE, 0, op, line);
1311 while (fgets(line, MAX_BUF, fp)) { 1374 while (fgets (line, MAX_BUF, fp))
1375 {
1312 line[MAX_BUF-1] ='\0'; 1376 line[MAX_BUF - 1] = '\0';
1313 len =strlen(line)-1; 1377 len = strlen (line) - 1;
1314 if (line[len] == '\n') 1378 if (line[len] == '\n')
1315 line[len] ='\0'; 1379 line[len] = '\0';
1316 new_draw_info(NDI_UNIQUE, 0,op, line); 1380 new_draw_info (NDI_UNIQUE, 0, op, line);
1317 } 1381 }
1318 fclose(fp); 1382 fclose (fp);
1319 return 0; 1383 return 0;
1320 1384
1321 /* 1385 /*
1322 * No_help -escape 1386 * No_help -escape
1323 */ 1387 */
1324 nohelp: 1388nohelp:
1325 sprintf(line, "No help available on '%s'", params); 1389 sprintf (line, "No help available on '%s'", params);
1326 new_draw_info(NDI_UNIQUE, 0,op, line); 1390 new_draw_info (NDI_UNIQUE, 0, op, line);
1327 return 0; 1391 return 0;
1328} 1392}
1329 1393
1330 1394
1395int
1331int onoff_value(const char *line) 1396onoff_value (const char *line)
1332{ 1397{
1333 int i; 1398 int i;
1334 1399
1335 if (sscanf(line, "%d", &i)) 1400 if (sscanf (line, "%d", &i))
1336 return (i != 0); 1401 return (i != 0);
1337 switch (line[0]) { 1402 switch (line[0])
1403 {
1338 case 'o': 1404 case 'o':
1339 switch (line[1]) { 1405 switch (line[1])
1340 case 'n': return 1; /* on */ 1406 {
1341 default: return 0; /* o[ff] */ 1407 case 'n':
1342 } 1408 return 1; /* on */
1343 case 'y': /* y[es] */ 1409 default:
1344 case 'k': /* k[ylla] */ 1410 return 0; /* o[ff] */
1411 }
1412 case 'y': /* y[es] */
1413 case 'k': /* k[ylla] */
1345 case 's': 1414 case 's':
1346 case 'd': 1415 case 'd':
1347 return 1; 1416 return 1;
1348 case 'n': /* n[o] */ 1417 case 'n': /* n[o] */
1349 case 'e': /* e[i] */ 1418 case 'e': /* e[i] */
1350 case 'u': 1419 case 'u':
1351 default: 1420 default:
1352 return 0; 1421 return 0;
1353 } 1422 }
1354} 1423}
1355 1424
1425int
1356int command_quit (object *op, char *params) 1426command_quit (object *op, char *params)
1357{ 1427{
1428 new_draw_info (NDI_UNIQUE, 0, op,
1358 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."); 1429 "Quitting will delete your character PERMANENTLY. If you are sure you want to do this, then use the quit_character command instead of quit.");
1359 return 1; 1430 return 1;
1360} 1431}
1361 1432
1433int
1362int command_real_quit (object *op, char *params) 1434command_real_quit (object *op, char *params)
1363{ 1435{
1364 send_query(&op->contr->socket,CS_QUERY_SINGLECHAR, 1436 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, "Quitting will delete your character.\nAre you sure you want to quit (y/n):");
1365 "Quitting will delete your character.\nAre you sure you want to quit (y/n):");
1366 1437
1367 op->contr->state = ST_CONFIRM_QUIT; 1438 op->contr->state = ST_CONFIRM_QUIT;
1368 return 1; 1439 return 1;
1369 } 1440}
1370 1441
1371/* 1442/*
1372 * don't allow people to exit explore mode. It otherwise becomes 1443 * don't allow people to exit explore mode. It otherwise becomes
1373 * really easy to abuse this. 1444 * really easy to abuse this.
1374 */ 1445 */
1446int
1375int command_explore (object *op, char *params) 1447command_explore (object *op, char *params)
1376{ 1448{
1377 if (settings.explore_mode == FALSE) 1449 if (settings.explore_mode == FALSE)
1378 return 1; 1450 return 1;
1379 /* 1451 /*
1380 * I guess this is the best way to see if we are solo or not. Actually, 1452 * I guess this is the best way to see if we are solo or not. Actually,
1381 * are there any cases when first_player->next==NULL and we are not solo? 1453 * are there any cases when first_player->next==NULL and we are not solo?
1382 */ 1454 */
1383 if ((first_player!=op->contr) || (first_player->next!=NULL)) { 1455 if ((first_player != op->contr) || (first_player->next != NULL))
1456 {
1384 new_draw_info(NDI_UNIQUE, 0,op,"You can not enter explore mode if you are in a party"); 1457 new_draw_info (NDI_UNIQUE, 0, op, "You can not enter explore mode if you are in a party");
1458 }
1385 } else if (op->contr->explore) 1459 else if (op->contr->explore)
1386 new_draw_info(NDI_UNIQUE, 0,op, "There is no return from explore mode"); 1460 new_draw_info (NDI_UNIQUE, 0, op, "There is no return from explore mode");
1387 else { 1461 else
1462 {
1388 op->contr->explore=1; 1463 op->contr->explore = 1;
1389 new_draw_info(NDI_UNIQUE, 0,op, "You are now in explore mode"); 1464 new_draw_info (NDI_UNIQUE, 0, op, "You are now in explore mode");
1390 } 1465 }
1391 return 1; 1466 return 1;
1392} 1467}
1393 1468
1469int
1394int command_sound (object *op, char *params) 1470command_sound (object *op, char *params)
1395{ 1471{
1396 if (op->contr->socket.sound) { 1472 if (op->contr->socket.sound)
1473 {
1397 op->contr->socket.sound=0; 1474 op->contr->socket.sound = 0;
1398 new_draw_info(NDI_UNIQUE, 0,op, "Silence is golden..."); 1475 new_draw_info (NDI_UNIQUE, 0, op, "Silence is golden...");
1476 }
1477 else
1399 } 1478 {
1400 else {
1401 op->contr->socket.sound=1; 1479 op->contr->socket.sound = 1;
1402 new_draw_info(NDI_UNIQUE, 0,op, "The sounds are enabled."); 1480 new_draw_info (NDI_UNIQUE, 0, op, "The sounds are enabled.");
1403 } 1481 }
1404 return 1; 1482 return 1;
1405} 1483}
1406 1484
1407/* Perhaps these should be in player.c, but that file is 1485/* Perhaps these should be in player.c, but that file is
1408 * already a bit big. 1486 * already a bit big.
1409 */ 1487 */
1410 1488
1489void
1411void receive_player_name(object *op,char k) { 1490receive_player_name (object *op, char k)
1491{
1412 1492
1413 if(!check_name(op->contr,op->contr->write_buf+1)) { 1493 if (!check_name (op->contr, op->contr->write_buf + 1))
1414 get_name(op);
1415 return;
1416 } 1494 {
1417 op->name = op->contr->write_buf + 1;
1418 op->name_pl = op->contr->write_buf + 1;
1419 new_draw_info(NDI_UNIQUE, 0,op,op->contr->write_buf);
1420 op->contr->name_changed=1;
1421 get_password(op);
1422}
1423
1424void receive_player_password(object *op,char k) {
1425
1426 unsigned int pwd_len=strlen(op->contr->write_buf);
1427 if(pwd_len<=1||pwd_len>17) {
1428 get_name(op);
1429 return;
1430 }
1431 new_draw_info(NDI_UNIQUE, 0,op," "); /* To hide the password better */
1432
1433 if (checkbanned(op->name, op->contr->socket.host)) {
1434 LOG(llevInfo, "Banned player tried to add: [%s@%s]\n", &op->name, op->contr->socket.host);
1435 new_draw_info(NDI_UNIQUE|NDI_RED, 0, op, "You are not allowed to play.");
1436 get_name(op);
1437 return;
1438 }
1439
1440 if(op->contr->state==ST_CONFIRM_PASSWORD) {
1441 if(!check_password(op->contr->write_buf+1,op->contr->password)) {
1442 new_draw_info(NDI_UNIQUE, 0,op,"The passwords did not match.");
1443 get_name(op); 1495 get_name (op);
1444 return; 1496 return;
1445 } 1497 }
1498 op->name = op->contr->write_buf + 1;
1499 op->name_pl = op->contr->write_buf + 1;
1500 new_draw_info (NDI_UNIQUE, 0, op, op->contr->write_buf);
1501 op->contr->name_changed = 1;
1502 get_password (op);
1503}
1504
1505void
1506receive_player_password (object *op, char k)
1507{
1508
1509 unsigned int pwd_len = strlen (op->contr->write_buf);
1510
1511 if (pwd_len <= 1 || pwd_len > 17)
1512 {
1513 get_name (op);
1514 return;
1515 }
1516 new_draw_info (NDI_UNIQUE, 0, op, " "); /* To hide the password better */
1517
1518 if (checkbanned (op->name, op->contr->socket.host))
1519 {
1520 LOG (llevInfo, "Banned player tried to add: [%s@%s]\n", &op->name, op->contr->socket.host);
1521 new_draw_info (NDI_UNIQUE | NDI_RED, 0, op, "You are not allowed to play.");
1522 get_name (op);
1523 return;
1524 }
1525
1526 if (op->contr->state == ST_CONFIRM_PASSWORD)
1527 {
1528 if (!check_password (op->contr->write_buf + 1, op->contr->password))
1529 {
1530 new_draw_info (NDI_UNIQUE, 0, op, "The passwords did not match.");
1531 get_name (op);
1532 return;
1533 }
1446 clear_win_info(op); 1534 clear_win_info (op);
1447 display_motd(op); 1535 display_motd (op);
1448 new_draw_info(NDI_UNIQUE, 0,op," "); 1536 new_draw_info (NDI_UNIQUE, 0, op, " ");
1449 new_draw_info(NDI_UNIQUE, 0,op,"Welcome, Brave New Warrior!"); 1537 new_draw_info (NDI_UNIQUE, 0, op, "Welcome, Brave New Warrior!");
1450 new_draw_info(NDI_UNIQUE, 0,op," "); 1538 new_draw_info (NDI_UNIQUE, 0, op, " ");
1451 Roll_Again(op); 1539 Roll_Again (op);
1452 op->contr->state=ST_ROLL_STAT; 1540 op->contr->state = ST_ROLL_STAT;
1453 return; 1541 return;
1454 } 1542 }
1455 strcpy(op->contr->password,crypt_string(op->contr->write_buf+1,NULL)); 1543 strcpy (op->contr->password, crypt_string (op->contr->write_buf + 1, NULL));
1456 op->contr->state=ST_ROLL_STAT; 1544 op->contr->state = ST_ROLL_STAT;
1457 check_login(op); 1545 check_login (op);
1458 return; 1546 return;
1459} 1547}
1460 1548
1461 1549
1550int
1462int explore_mode(void) { 1551explore_mode (void)
1552{
1463 player *pl; 1553 player *pl;
1464 1554
1465 if (settings.explore_mode == TRUE) { 1555 if (settings.explore_mode == TRUE)
1556 {
1466 for (pl = first_player; pl != (player *) NULL; pl = pl->next) 1557 for (pl = first_player; pl != (player *) NULL; pl = pl->next)
1467 if (pl->explore) 1558 if (pl->explore)
1468 return 1; 1559 return 1;
1469 } 1560 }
1470 return 0; 1561 return 0;
1471} 1562}
1472 1563
1473 1564
1565int
1474int command_title (object *op, char *params) 1566command_title (object *op, char *params)
1475{ 1567{
1476 char buf[MAX_BUF]; 1568 char buf[MAX_BUF];
1477 1569
1478 if (settings.set_title == FALSE) { 1570 if (settings.set_title == FALSE)
1571 {
1479 new_draw_info(NDI_UNIQUE, 0, op, "You cannot change your title."); 1572 new_draw_info (NDI_UNIQUE, 0, op, "You cannot change your title.");
1480 return 1; 1573 return 1;
1481 } 1574 }
1482 1575
1483 /* dragon players cannot change titles */ 1576 /* dragon players cannot change titles */
1484 if (is_dragon_pl(op)) { 1577 if (is_dragon_pl (op))
1578 {
1485 new_draw_info(NDI_UNIQUE, 0, op, "Dragons cannot change titles."); 1579 new_draw_info (NDI_UNIQUE, 0, op, "Dragons cannot change titles.");
1486 return 1; 1580 return 1;
1487 }
1488 1581 }
1582
1489 if(params == NULL) { 1583 if (params == NULL)
1584 {
1490 if(op->contr->own_title[0]=='\0') 1585 if (op->contr->own_title[0] == '\0')
1491 sprintf(buf,"Your title is '%s'.", op->contr->title); 1586 sprintf (buf, "Your title is '%s'.", op->contr->title);
1492 else 1587 else
1493 sprintf(buf,"Your title is '%s'.", op->contr->own_title); 1588 sprintf (buf, "Your title is '%s'.", op->contr->own_title);
1494 new_draw_info(NDI_UNIQUE, 0,op,buf); 1589 new_draw_info (NDI_UNIQUE, 0, op, buf);
1495 return 1; 1590 return 1;
1496 } 1591 }
1497 if(strcmp(params, "clear")==0 || strcmp(params, "default")==0) { 1592 if (strcmp (params, "clear") == 0 || strcmp (params, "default") == 0)
1593 {
1498 if(op->contr->own_title[0]=='\0') 1594 if (op->contr->own_title[0] == '\0')
1499 new_draw_info(NDI_UNIQUE, 0,op,"Your title is the default title."); 1595 new_draw_info (NDI_UNIQUE, 0, op, "Your title is the default title.");
1500 else 1596 else
1501 new_draw_info(NDI_UNIQUE, 0,op,"Title set to default."); 1597 new_draw_info (NDI_UNIQUE, 0, op, "Title set to default.");
1502 op->contr->own_title[0]='\0'; 1598 op->contr->own_title[0] = '\0';
1503 return 1; 1599 return 1;
1504 } 1600 }
1505 1601
1506 if((int)strlen(params) >= MAX_NAME) { 1602 if ((int) strlen (params) >= MAX_NAME)
1603 {
1507 new_draw_info(NDI_UNIQUE, 0,op,"Title too long."); 1604 new_draw_info (NDI_UNIQUE, 0, op, "Title too long.");
1508 return 1; 1605 return 1;
1509 } 1606 }
1510 strcpy(op->contr->own_title, params); 1607 strcpy (op->contr->own_title, params);
1511 return 1; 1608 return 1;
1512} 1609}
1513 1610
1611int
1514int command_save (object *op, char *params) 1612command_save (object *op, char *params)
1515{ 1613{
1516// if (get_map_flags(op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) { 1614// if (get_map_flags(op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) {
1517// new_draw_info(NDI_UNIQUE, 0, op, "You can not save on unholy ground"); 1615// new_draw_info(NDI_UNIQUE, 0, op, "You can not save on unholy ground");
1518// } else 1616// } else
1519 if (!op->stats.exp) { 1617 if (!op->stats.exp)
1618 {
1520 new_draw_info(NDI_UNIQUE, 0, op, "You don't deserve to save yet."); 1619 new_draw_info (NDI_UNIQUE, 0, op, "You don't deserve to save yet.");
1521 } else { 1620 }
1621 else
1622 {
1522 if(save_player(op,1)) 1623 if (save_player (op, 1))
1523 new_draw_info(NDI_UNIQUE, 0,op,"You have been saved."); 1624 new_draw_info (NDI_UNIQUE, 0, op, "You have been saved.");
1524 else 1625 else
1525 new_draw_info(NDI_UNIQUE, 0,op,"SAVE FAILED!"); 1626 new_draw_info (NDI_UNIQUE, 0, op, "SAVE FAILED!");
1526 } 1627 }
1527 return 1; 1628 return 1;
1528} 1629}
1529 1630
1530 1631
1632int
1531int command_peaceful (object *op, char *params) 1633command_peaceful (object *op, char *params)
1532{ 1634{
1533 new_draw_info(NDI_UNIQUE, 0, op, 1635 new_draw_info (NDI_UNIQUE, 0, op,
1534 "You cannot change your peaceful setting with this command." 1636 "You cannot change your peaceful setting with this command."
1535 " Please speak to the priest in the temple of Gorokh" 1637 " Please speak to the priest in the temple of Gorokh"
1536 " if you want to become hostile or in temple of Valriel" 1638 " if you want to become hostile or in temple of Valriel" " if you want to become peaceful again.");
1537 " if you want to become peaceful again."
1538 );
1539 1639
1540/* 1640/*
1541 if((op->contr->peaceful=!op->contr->peaceful)) 1641 if((op->contr->peaceful=!op->contr->peaceful))
1542 new_draw_info(NDI_UNIQUE, 0,op,"You will not attack other players."); 1642 new_draw_info(NDI_UNIQUE, 0,op,"You will not attack other players.");
1543 else 1643 else
1544 new_draw_info(NDI_UNIQUE, 0,op,"You will attack other players."); 1644 new_draw_info(NDI_UNIQUE, 0,op,"You will attack other players.");
1545*/ 1645*/
1546 return 1; 1646 return 1;
1547} 1647}
1548 1648
1549 1649
1550 1650
1651int
1551int command_wimpy (object *op, char *params) 1652command_wimpy (object *op, char *params)
1552{ 1653{
1553 int i; 1654 int i;
1554 char buf[MAX_BUF]; 1655 char buf[MAX_BUF];
1555 1656
1556 if (params==NULL || !sscanf(params, "%d", &i)) { 1657 if (params == NULL || !sscanf (params, "%d", &i))
1658 {
1557 sprintf(buf, "Your current wimpy level is %d.", op->run_away); 1659 sprintf (buf, "Your current wimpy level is %d.", op->run_away);
1558 new_draw_info(NDI_UNIQUE, 0,op, buf); 1660 new_draw_info (NDI_UNIQUE, 0, op, buf);
1559 return 1; 1661 return 1;
1560 } 1662 }
1561 sprintf(buf, "Your new wimpy level is %d.", i); 1663 sprintf (buf, "Your new wimpy level is %d.", i);
1562 new_draw_info(NDI_UNIQUE, 0,op, buf); 1664 new_draw_info (NDI_UNIQUE, 0, op, buf);
1563 op->run_away = i; 1665 op->run_away = i;
1564 return 1; 1666 return 1;
1565} 1667}
1566 1668
1567 1669
1670int
1568int command_brace (object *op, char *params) 1671command_brace (object *op, char *params)
1569{ 1672{
1570 if (!params) 1673 if (!params)
1571 op->contr->braced =!op->contr->braced; 1674 op->contr->braced = !op->contr->braced;
1572 else 1675 else
1573 op->contr->braced =onoff_value(params); 1676 op->contr->braced = onoff_value (params);
1574 1677
1575 if(op->contr->braced) 1678 if (op->contr->braced)
1576 new_draw_info(NDI_UNIQUE, 0,op, "You are braced."); 1679 new_draw_info (NDI_UNIQUE, 0, op, "You are braced.");
1577 else 1680 else
1578 new_draw_info(NDI_UNIQUE, 0,op, "Not braced."); 1681 new_draw_info (NDI_UNIQUE, 0, op, "Not braced.");
1579 1682
1580 fix_player(op); 1683 fix_player (op);
1581 return 0; 1684 return 0;
1582} 1685}
1583 1686
1687int
1584int command_style_map_info(object *op, char *params) 1688command_style_map_info (object *op, char *params)
1585{ 1689{
1586 extern mapstruct *styles; 1690 extern mapstruct *styles;
1587 mapstruct *mp; 1691 mapstruct *mp;
1588 int maps_used=0, mapmem=0, objects_used=0, x,y; 1692 int maps_used = 0, mapmem = 0, objects_used = 0, x, y;
1589 object *tmp; 1693 object *tmp;
1590 1694
1591 for (mp = styles; mp!=NULL; mp=mp->next) { 1695 for (mp = styles; mp != NULL; mp = mp->next)
1696 {
1592 maps_used++; 1697 maps_used++;
1593 mapmem += MAP_WIDTH(mp)*MAP_HEIGHT(mp)*(sizeof(object *)+sizeof(MapSpace)) + sizeof(mapstruct); 1698 mapmem += MAP_WIDTH (mp) * MAP_HEIGHT (mp) * (sizeof (object *) + sizeof (MapSpace)) + sizeof (mapstruct);
1594 for (x=0; x<MAP_WIDTH(mp); x++) { 1699 for (x = 0; x < MAP_WIDTH (mp); x++)
1700 {
1595 for (y=0; y<MAP_HEIGHT(mp); y++) { 1701 for (y = 0; y < MAP_HEIGHT (mp); y++)
1702 {
1596 for (tmp=get_map_ob(mp, x, y); tmp!=NULL; tmp=tmp->above) 1703 for (tmp = get_map_ob (mp, x, y); tmp != NULL; tmp = tmp->above)
1597 objects_used++; 1704 objects_used++;
1598 } 1705 }
1599 } 1706 }
1600 } 1707 }
1601 new_draw_info_format(NDI_UNIQUE, 0, op, "Style maps loaded: %d", maps_used); 1708 new_draw_info_format (NDI_UNIQUE, 0, op, "Style maps loaded: %d", maps_used);
1602 new_draw_info(NDI_UNIQUE, 0, op, "Memory used, not"); 1709 new_draw_info (NDI_UNIQUE, 0, op, "Memory used, not");
1603 new_draw_info_format(NDI_UNIQUE, 0, op, "including objects: %d", mapmem); 1710 new_draw_info_format (NDI_UNIQUE, 0, op, "including objects: %d", mapmem);
1604 new_draw_info_format(NDI_UNIQUE, 0, op, "Style objects: %d", objects_used); 1711 new_draw_info_format (NDI_UNIQUE, 0, op, "Style objects: %d", objects_used);
1605 new_draw_info_format(NDI_UNIQUE, 0, op, "Mem for objects: %d", objects_used * sizeof(object)); 1712 new_draw_info_format (NDI_UNIQUE, 0, op, "Mem for objects: %d", objects_used * sizeof (object));
1606 return 0; 1713 return 0;
1607} 1714}
1608 1715
1716int
1609int command_kill_pets(object *op, char *params) 1717command_kill_pets (object *op, char *params)
1610{ 1718{
1611 objectlink *obl, *next; 1719 objectlink *obl, *next;
1612 int counter=0, removecount=0; 1720 int counter = 0, removecount = 0;
1721
1613 if (params == NULL) { 1722 if (params == NULL)
1723 {
1614 terminate_all_pets(op); 1724 terminate_all_pets (op);
1615 new_draw_info(NDI_UNIQUE, 0, op, "Your pets have been killed."); 1725 new_draw_info (NDI_UNIQUE, 0, op, "Your pets have been killed.");
1726 }
1727 else
1616 } 1728 {
1617 else {
1618 int target = atoi(params); 1729 int target = atoi (params);
1730
1619 for(obl = first_friendly_object; obl != NULL; obl = next) { 1731 for (obl = first_friendly_object; obl != NULL; obl = next)
1732 {
1620 object *ob = obl->ob; 1733 object *ob = obl->ob;
1734
1621 next = obl->next; 1735 next = obl->next;
1622 if (get_owner(ob) == op) 1736 if (get_owner (ob) == op)
1623 if (++counter==target || (target==0 && !strcasecmp(ob->name, params))) { 1737 if (++counter == target || (target == 0 && !strcasecmp (ob->name, params)))
1738 {
1624 if (!QUERY_FLAG(ob, FLAG_REMOVED)) 1739 if (!QUERY_FLAG (ob, FLAG_REMOVED))
1625 remove_ob(ob); 1740 remove_ob (ob);
1626 remove_friendly_object(ob); 1741 remove_friendly_object (ob);
1627 free_object(ob); 1742 free_object (ob);
1628 removecount++; 1743 removecount++;
1629 } 1744 }
1630 } 1745 }
1631 if (removecount!=0) 1746 if (removecount != 0)
1632 new_draw_info_format(NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount); 1747 new_draw_info_format (NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount);
1633 else 1748 else
1634 new_draw_info(NDI_UNIQUE, 0, op, "Couldn't find any suitable pets to kill.\n"); 1749 new_draw_info (NDI_UNIQUE, 0, op, "Couldn't find any suitable pets to kill.\n");
1635 } 1750 }
1636 return 0; 1751 return 0;
1637} 1752}
1638

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines