ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/c_misc.C
(Generate patch)

Comparing deliantra/server/server/c_misc.C (file contents):
Revision 1.6 by root, Mon Sep 4 11:08:00 2006 UTC vs.
Revision 1.11 by root, Fri Sep 29 19:28:43 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines