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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines