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.3 by root, Tue Aug 29 08:01:37 2006 UTC vs.
Revision 1.34 by pippijn, Sat Jan 6 14:42:30 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines