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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines