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.7 by root, Sun Sep 10 15:59:57 2006 UTC vs.
Revision 1.30 by root, Mon Dec 25 14:54:44 2006 UTC

1
2/*
3 * static char *rcsid_c_misc_c =
4 * "$Id: c_misc.C,v 1.7 2006/09/10 15:59:57 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
22 16
23 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
24 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 20
27 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>
28*/ 22*/
29 23
30#include <global.h> 24#include <global.h>
31#include <loader.h> 25#include <loader.h>
32#ifndef __CEXTRACT__
33# include <sproto.h> 26#include <sproto.h>
34#endif 27
28#include <dirent.h>
35 29
36extern weathermap_t **weathermap; 30extern weathermap_t **weathermap;
37 31
38/* Handles misc. input request - things like hash table, malloc, maps, 32/* Handles misc. input request - things like hash table, malloc, maps,
39 * who, etc. 33 * who, etc.
40 */ 34 */
41 35
42void 36void
43map_info (object *op, char *search) 37map_info (object *op, char *search)
44{ 38{
45 mapstruct *m; 39 maptile *m;
46 char buf[MAX_BUF], map_path[MAX_BUF]; 40 char buf[MAX_BUF], map_path[MAX_BUF];
47 long sec = seconds (); 41 long sec = time (0);
48 42
49 new_draw_info_format (NDI_UNIQUE, 0, op, "Current time is: %02ld:%02ld:%02ld.", (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60); 43 new_draw_info_format (NDI_UNIQUE, 0, op, "Current time is: %02ld:%02ld:%02ld.", (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60);
50 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");
51 for (m = first_map; m != NULL; m = m->next) 45 for (m = first_map; m != NULL; m = m->next)
52 { 46 {
59 else 53 else
60 strcpy (map_path, m->path + strlen (m->path) - 18); 54 strcpy (map_path, m->path + strlen (m->path) - 18);
61 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",
62 map_path, m->players, players_on_map (m, FALSE), 56 map_path, m->players, players_on_map (m, FALSE),
63 m->in_memory, m->timeout, m->difficulty, 57 m->in_memory, m->timeout, m->difficulty,
64 (MAP_WHEN_RESET (m) % 86400) / 3600, (MAP_WHEN_RESET (m) % 3600) / 60, MAP_WHEN_RESET (m) % 60); 58 (m->reset_time % 86400) / 3600, (m->reset_time % 3600) / 60, m->reset_time % 60);
65 new_draw_info (NDI_UNIQUE, 0, op, buf); 59 new_draw_info (NDI_UNIQUE, 0, op, buf);
66 } 60 }
67} 61}
68 62
69/* This command dumps the body information for object *op. 63/* This command dumps the body information for object *op.
150} 144}
151 145
152void 146void
153current_map_info (object *op) 147current_map_info (object *op)
154{ 148{
155 mapstruct *m = op->map; 149 maptile *m = op->map;
156 150
157 if (!m) 151 if (!m)
158 return; 152 return;
159 153
160 new_draw_info_format (NDI_UNIQUE, 0, op, "%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));
161 155
162 if (QUERY_FLAG (op, FLAG_WIZ)) 156 if (QUERY_FLAG (op, FLAG_WIZ))
163 { 157 {
164 new_draw_info_format (NDI_UNIQUE, 0, op, 158 new_draw_info_format (NDI_UNIQUE, 0, op,
165 "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",
166 m->players, m->difficulty, MAP_WIDTH (m), MAP_HEIGHT (m), MAP_ENTER_X (m), MAP_ENTER_Y (m), MAP_TIMEOUT (m)); 160 m->players, m->difficulty, m->width, m->height, m->enter_x, m->enter_y, m->timeout);
167 161
168 } 162 }
169 if (m->msg) 163 if (m->msg)
170 new_draw_info (NDI_UNIQUE, NDI_NAVY, op, m->msg); 164 new_draw_info (NDI_UNIQUE, NDI_NAVY, op, m->msg);
171} 165}
198 */ 192 */
199 for (reg = first_region; reg != NULL; reg = reg->next) 193 for (reg = first_region; reg != NULL; reg = reg->next)
200 { 194 {
201 reg->counter = 0; 195 reg->counter = 0;
202 } 196 }
203 for (pl = first_player; pl != NULL; pl = pl->next) 197 for_all_players (pl)
204 if (pl->ob->map != NULL) 198 if (pl->ob->map != NULL)
205 get_region_by_map (pl->ob->map)->counter++; 199 get_region_by_map (pl->ob->map)->counter++;
206 200
207 /* 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... */
208 for (reg = first_region; reg != NULL; reg = reg->next) 202 for (reg = first_region; reg != NULL; reg = reg->next)
229{ 223{
230 char namebuf[MAX_BUF]; 224 char namebuf[MAX_BUF];
231 int login_order; 225 int login_order;
232} chars_names; 226} chars_names;
233 227
234/*local functon for qsort comparison*/
235static int
236name_cmp (const chars_names * c1, const chars_names * c2)
237{
238 return strcasecmp (c1->namebuf, c2->namebuf);
239}
240
241int
242command_who (object *op, char *params)
243{
244 player *pl;
245 uint16 i;
246 region *reg;
247 char *format;
248 int num_players = 0;
249 int num_wiz = 0;
250 int num_afk = 0;
251 chars_names *chars = NULL;
252
253 /*
254 * The who formats are defined in config to be blank. They should have been
255 * overridden by the settings file, if there are no entries however, it will
256 * have stayed blank. Since this probably isn't what is wanted, we will check if
257 * new formats have been specified, and if not we will use the old defaults.
258 */
259 if (!strcmp (settings.who_format, ""))
260 strcpy (settings.who_format, "%N_%T%t%h%d%n[%m]");
261 if (!strcmp (settings.who_wiz_format, ""))
262 strcpy (settings.who_wiz_format, "%N_%T%t%h%d%nLevel %l [%m](@%i)(%c)");
263 if (op == NULL || QUERY_FLAG (op, FLAG_WIZ))
264 format = settings.who_wiz_format;
265 else
266 format = settings.who_format;
267
268 reg = get_region_from_string (params);
269
270 for (pl = first_player; pl != NULL; pl = pl->next)
271 {
272 if (pl->ob->map == NULL)
273 continue;
274 if (pl->hidden && !QUERY_FLAG (op, FLAG_WIZ))
275 continue;
276
277 if (!region_is_child_of_region (get_region_by_map (pl->ob->map), reg))
278 continue;
279
280 if (pl->state == ST_PLAYING || pl->state == ST_GET_PARTY_PASSWORD)
281 {
282
283 num_players++;
284 chars = (chars_names *) realloc (chars, num_players * sizeof (chars_names));
285 if (chars == NULL)
286 {
287 new_draw_info (NDI_UNIQUE, 0, op, "who failed - out of memory!");
288 return 0;
289 }
290 sprintf (chars[num_players - 1].namebuf, "%s", &pl->ob->name);
291 chars[num_players - 1].login_order = num_players;
292 /*Check for WIZ's & AFK's */
293 if (QUERY_FLAG (pl->ob, FLAG_WIZ))
294 num_wiz++;
295 if (QUERY_FLAG (pl->ob, FLAG_AFK))
296 num_afk++;
297 }
298 }
299 if (first_player != (player *) NULL)
300 {
301 if (reg == NULL)
302 new_draw_info_format (NDI_UNIQUE, 0, op, "Total Players (%d) -- WIZ(%d) AFK(%d)", num_players, num_wiz, num_afk);
303 else if (reg->longname == NULL)
304 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);
305 else
306 new_draw_info_format (NDI_UNIQUE, 0, op, "Total Players in %s (%d) -- WIZ(%d) AFK(%d)",
307 reg->longname, num_players, num_wiz, num_afk);
308 }
309 qsort (chars, num_players, sizeof (chars_names), (int (*)(const void *, const void *)) name_cmp);
310 for (i = 0; i < num_players; i++)
311 display_who_entry (op, find_player (chars[i].namebuf), format);
312 free (chars);
313 return 1;
314}
315
316/* Display a line of 'who' to op, about pl, using the formatting specified by format */
317void
318display_who_entry (object *op, player *pl, const char *format)
319{
320 char tmpbuf[MAX_BUF];
321 char outbuf[MAX_BUF];
322 size_t i;
323
324 outbuf[0] = '\0'; /* we strcat to this, so reset it here. */
325 if (pl == NULL)
326 {
327 LOG (llevError, "display_who_entry(): I was passed a null player");
328 return;
329 }
330 for (i = 0; i <= strlen (format); i++)
331 {
332 if (format[i] == '%')
333 {
334 i++;
335 get_who_escape_code_value (tmpbuf, format[i], pl);
336 strcat (outbuf, tmpbuf);
337 }
338 else if (format[i] == '_')
339 strcat (outbuf, " "); /* allow '_' to be used in place of spaces */
340 else
341 {
342 sprintf (tmpbuf, "%c", format[i]);
343 strcat (outbuf, tmpbuf);
344 }
345 }
346 new_draw_info (NDI_UNIQUE, 0, op, outbuf);
347}
348
349/* Returns the value of the escape code used in the who format specifier
350 * the values are:
351 * N Name of character
352 * t title of character
353 * T the optional "the " sequence value (depend if player has own_title or not)
354 * c count
355 * n newline
356 * h [Hostile] if character is hostile, nothing otherwise
357 * d [WIZ] if character is a dm, nothing otherwise
358 * a [AFK] if character is afk, nothing otherwise
359 * l the level of the character
360 * m the map path the character is currently on
361 * M the map name of the map the character is currently on
362 * r the region name (eg scorn, wolfsburg)
363 * R the regional title (eg The Kingdom of Scorn, The Port of Wolfsburg)
364 * i player's ip adress
365 * % a literal %
366 * _ a literal underscore
367 */
368
369void
370get_who_escape_code_value (char *return_val, const char letter, player *pl)
371{
372
373 switch (letter)
374 {
375 case 'N':
376 strcpy (return_val, pl->ob->name);
377 break;
378 case 't':
379 strcpy (return_val, (pl->own_title[0] == '\0' ? pl->title : pl->own_title));
380 break;
381 case 'T':
382 if (pl->own_title[0] == '\0')
383 strcpy (return_val, "the ");
384 else
385 *return_val = '\0';
386 break;
387 case 'c':
388 sprintf (return_val, "%d", pl->ob->count);
389 break;
390 case 'n':
391 strcpy (return_val, "\n");
392 break;
393 case 'h':
394 strcpy (return_val, pl->peaceful ? "" : " [Hostile]");
395 break;
396 case 'l':
397 sprintf (return_val, "%d", pl->ob->level);
398 break;
399 case 'd':
400 strcpy (return_val, (QUERY_FLAG (pl->ob, FLAG_WIZ) ? " [WIZ]" : ""));
401 break;
402 case 'a':
403 strcpy (return_val, (QUERY_FLAG (pl->ob, FLAG_AFK) ? " [AFK]" : ""));
404 break;
405 case 'm':
406 strcpy (return_val, pl->ob->map->path);
407 break;
408 case 'M':
409 strcpy (return_val, pl->ob->map->name ? pl->ob->map->name : "Untitled");
410 break;
411 case 'r':
412 strcpy (return_val, get_name_of_region_for_map (pl->ob->map));
413 break;
414 case 'R':
415 strcpy (return_val, get_region_longname (get_region_by_map (pl->ob->map)));
416 break;
417 case 'i':
418 strcpy (return_val, pl->socket.host);
419 break;
420 case '%':
421 strcpy (return_val, "%");
422 break;
423 case '_':
424 strcpy (return_val, "_");
425 break;
426 }
427
428}
429
430
431int 228int
432command_afk (object *op, char *params) 229command_afk (object *op, char *params)
433{ 230{
434 if QUERY_FLAG 231 if ((op->contr->ns->afk = !op->contr->ns->afk))
435 (op, FLAG_AFK)
436 {
437 CLEAR_FLAG (op, FLAG_AFK);
438 new_draw_info (NDI_UNIQUE, 0, op, "You are no longer AFK"); 232 new_draw_info (NDI_UNIQUE, 0, op, "You are no longer AFK");
439 }
440 else 233 else
441 {
442 SET_FLAG (op, FLAG_AFK);
443 new_draw_info (NDI_UNIQUE, 0, op, "You are now AFK"); 234 new_draw_info (NDI_UNIQUE, 0, op, "You are now AFK");
444 } 235
445 return 1; 236 return 1;
446} 237}
447 238
448int 239int
449command_mapinfo (object *op, char *params) 240command_mapinfo (object *op, char *params)
649int 440int
650command_dumpbelow (object *op, char *params) 441command_dumpbelow (object *op, char *params)
651{ 442{
652 if (op && op->below) 443 if (op && op->below)
653 { 444 {
654 dump_object (op->below); 445 char *dump = dump_object (op->below);
655 new_draw_info (NDI_UNIQUE, 0, op, errmsg); 446 new_draw_info (NDI_UNIQUE, 0, op, dump);
447 free (dump);
656 /* Let's push that item on the dm's stack */ 448 /* Let's push that item on the dm's stack */
657 dm_stack_push (op->contr, op->below->count); 449 dm_stack_push (op->contr, op->below->count);
658 } 450 }
659 return 0; 451 return 0;
660} 452}
661 453
662int 454int
663command_wizpass (object *op, char *params)
664{
665 int i;
666
667 if (!op)
668 return 0;
669
670 if (!params)
671 i = (QUERY_FLAG (op, FLAG_WIZPASS)) ? 0 : 1;
672 else
673 i = onoff_value (params);
674
675 if (i)
676 {
677 new_draw_info (NDI_UNIQUE, 0, op, "You will now walk through walls.\n");
678 SET_FLAG (op, FLAG_WIZPASS);
679 }
680 else
681 {
682 new_draw_info (NDI_UNIQUE, 0, op, "You will now be stopped by walls.\n");
683 CLEAR_FLAG (op, FLAG_WIZPASS);
684 }
685 return 0;
686}
687
688int
689command_wizcast (object *op, char *params)
690{
691 int i;
692
693 if (!op)
694 return 0;
695
696 if (!params)
697 i = (QUERY_FLAG (op, FLAG_WIZCAST)) ? 0 : 1;
698 else
699 i = onoff_value (params);
700
701 if (i)
702 {
703 new_draw_info (NDI_UNIQUE, 0, op, "You can now cast spells anywhere.");
704 SET_FLAG (op, FLAG_WIZCAST);
705 }
706 else
707 {
708 new_draw_info (NDI_UNIQUE, 0, op, "You now cannot cast spells in no-magic areas.");
709 CLEAR_FLAG (op, FLAG_WIZCAST);
710 }
711 return 0;
712}
713
714int
715command_dumpallobjects (object *op, char *params)
716{
717 dump_all_objects ();
718 return 0;
719}
720
721int
722command_dumpfriendlyobjects (object *op, char *params) 455command_dumpfriendlyobjects (object *op, char *params)
723{ 456{
724 dump_friendly_objects (); 457 dump_friendly_objects ();
725 return 0;
726}
727
728int
729command_dumpallarchetypes (object *op, char *params)
730{
731 dump_all_archetypes ();
732 return 0; 458 return 0;
733} 459}
734 460
735int 461int
736command_dumpmap (object *op, char *params) 462command_dumpmap (object *op, char *params)
850int 576int
851command_statistics (object *pl, char *params) 577command_statistics (object *pl, char *params)
852{ 578{
853 if (!pl->contr) 579 if (!pl->contr)
854 return 1; 580 return 1;
855#ifndef WIN32
856 new_draw_info_format (NDI_UNIQUE, 0, pl, " Experience: %lld", pl->stats.exp);
857 new_draw_info_format (NDI_UNIQUE, 0, pl, " Next Level: %lld", level_exp (pl->level + 1, pl->expmul));
858#else
859 new_draw_info_format (NDI_UNIQUE, 0, pl, " Experience: %I64d", pl->stats.exp); 581 new_draw_info_format (NDI_UNIQUE, 0, pl, " Experience: %" PRId64, pl->stats.exp);
860 new_draw_info_format (NDI_UNIQUE, 0, pl, " Next Level: %I64d", level_exp (pl->level + 1, pl->expmul)); 582 new_draw_info_format (NDI_UNIQUE, 0, pl, " Next Level: %" PRId64, level_exp (pl->level + 1, pl->expmul));
861#endif
862 new_draw_info (NDI_UNIQUE, 0, pl, "\nStat Nat/Real/Max"); 583 new_draw_info (NDI_UNIQUE, 0, pl, "\nStat Nat/Real/Max");
863 584
864 new_draw_info_format (NDI_UNIQUE, 0, pl, "Str %2d/ %3d/%3d", 585 new_draw_info_format (NDI_UNIQUE, 0, pl, "Str %2d/ %3d/%3d",
865 pl->contr->orig_stats.Str, pl->stats.Str, 20 + pl->arch->clone.stats.Str); 586 pl->contr->orig_stats.Str, pl->stats.Str, 20 + pl->arch->clone.stats.Str);
866 new_draw_info_format (NDI_UNIQUE, 0, pl, "Dex %2d/ %3d/%3d", 587 new_draw_info_format (NDI_UNIQUE, 0, pl, "Dex %2d/ %3d/%3d",
883 604
884int 605int
885command_fix_me (object *op, char *params) 606command_fix_me (object *op, char *params)
886{ 607{
887 sum_weight (op); 608 sum_weight (op);
888 fix_player (op); 609 op->update_stats ();
889 return 1; 610 return 1;
890} 611}
891 612
892int 613int
893command_players (object *op, char *paramss) 614command_players (object *op, char *paramss)
900 t = buf + strlen (buf); 621 t = buf + strlen (buf);
901 if ((Dir = opendir (buf)) != NULL) 622 if ((Dir = opendir (buf)) != NULL)
902 { 623 {
903 const struct dirent *Entry; 624 const struct dirent *Entry;
904 625
905 while ((Entry = readdir (Dir)) != NULL) 626 while ((Entry = readdir (Dir)))
906 { 627 {
907 /* skip '.' , '..' */ 628 /* skip '.' , '..' */
908 if (!((Entry->d_name[0] == '.' && Entry->d_name[1] == '\0') || 629 if (!((Entry->d_name[0] == '.' && Entry->d_name[1] == '\0') ||
909 (Entry->d_name[0] == '.' && Entry->d_name[1] == '.' && Entry->d_name[2] == '\0'))) 630 (Entry->d_name[0] == '.' && Entry->d_name[1] == '.' && Entry->d_name[2] == '\0')))
910 { 631 {
936 657
937 658
938int 659int
939command_logs (object *op, char *params) 660command_logs (object *op, char *params)
940{ 661{
941 int i;
942 int first;
943
944 first = 1;
945 for (i = 2; i < socket_info.allocated_sockets; i++)
946 {
947 if (init_sockets[i].old_mode == Old_Listen)
948 {
949 if (first)
950 {
951 new_draw_info (NDI_UNIQUE, 0, op, "Kill-logs are sent to:");
952 first = 0;
953 }
954 new_draw_info_format (NDI_UNIQUE, 0, op, "%s: %s", init_sockets[i].host, init_sockets[i].comment);
955 }
956 }
957 if (first)
958 {
959 new_draw_info (NDI_UNIQUE, 0, op, "Nobody is currently logging kills."); 662 new_draw_info (NDI_UNIQUE, 0, op, "Nobody is currently logging kills.");
960 } 663
961 return 1; 664 return 1;
962} 665}
963 666
964int 667int
965command_applymode (object *op, char *params) 668command_applymode (object *op, char *params)
1076 for (obl = first_friendly_object; obl != NULL; obl = next) 779 for (obl = first_friendly_object; obl != NULL; obl = next)
1077 { 780 {
1078 object *ob = obl->ob; 781 object *ob = obl->ob;
1079 782
1080 next = obl->next; 783 next = obl->next;
1081 if (get_owner (ob) == op) 784 if (ob->owner == op)
1082 { 785 {
1083 if (target == 0) 786 if (target == 0)
1084 { 787 {
1085 if (counter == 0) 788 if (counter == 0)
1086 new_draw_info (NDI_UNIQUE, 0, op, "Pets:"); 789 new_draw_info (NDI_UNIQUE, 0, op, "Pets:");
1193 char filename[MAX_BUF], line[80]; 896 char filename[MAX_BUF], line[80];
1194 int namelen, linelen = 0; 897 int namelen, linelen = 0;
1195 898
1196 switch (what) 899 switch (what)
1197 { 900 {
1198 case 1: 901 case 1:
1199 sprintf (filename, "%s/wizhelp", settings.datadir); 902 sprintf (filename, "%s/wizhelp", settings.datadir);
1200 new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:"); 903 new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:");
1201 break; 904 break;
1202 case 3: 905 case 3:
1203 sprintf (filename, "%s/mischelp", settings.datadir); 906 sprintf (filename, "%s/mischelp", settings.datadir);
1204 new_draw_info (NDI_UNIQUE, 0, op, " Misc help:"); 907 new_draw_info (NDI_UNIQUE, 0, op, " Misc help:");
1205 break; 908 break;
1206 default: 909 default:
1207 sprintf (filename, "%s/help", settings.datadir); 910 sprintf (filename, "%s/help", settings.datadir);
1208 new_draw_info (NDI_UNIQUE, 0, op, " Commands:"); 911 new_draw_info (NDI_UNIQUE, 0, op, " Commands:");
1209 break; 912 break;
1210 } 913 }
914
1211 if (!(dirp = opendir (filename))) 915 if (!(dirp = opendir (filename)))
1212 return; 916 return;
1213 917
1214 line[0] = '\0'; 918 line[0] = '\0';
1215 for (de = readdir (dirp); de; de = readdir (dirp)) 919 while (de = readdir (dirp))
1216 { 920 {
1217 namelen = NAMLEN (de); 921 namelen = strlen (de->d_name);
1218 if (namelen <= 2 && *de->d_name == '.' && (namelen == 1 || de->d_name[1] == '.')) 922 if (namelen <= 2 && *de->d_name == '.' && (namelen == 1 || de->d_name[1] == '.'))
1219 continue; 923 continue;
1220 linelen += namelen + 1; 924 linelen += namelen + 1;
1221 if (linelen > 42) 925 if (linelen > 42)
1222 { 926 {
1437} 1141}
1438 1142
1439int 1143int
1440command_real_quit (object *op, char *params) 1144command_real_quit (object *op, char *params)
1441{ 1145{
1442 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, "Quitting will delete your character.\nAre you sure you want to quit (y/n):"); 1146 send_query (op->contr->ns, CS_QUERY_SINGLECHAR, "Quitting will delete your character.\nAre you sure you want to quit (y/n):");
1443 1147
1444 op->contr->state = ST_CONFIRM_QUIT; 1148 op->contr->ns->state = ST_CONFIRM_QUIT;
1445 return 1; 1149 return 1;
1446} 1150}
1447 1151
1448/* 1152/*
1449 * don't allow people to exit explore mode. It otherwise becomes 1153 * don't allow people to exit explore mode. It otherwise becomes
1473} 1177}
1474 1178
1475int 1179int
1476command_sound (object *op, char *params) 1180command_sound (object *op, char *params)
1477{ 1181{
1478 if (op->contr->socket.sound) 1182 if (op->contr->ns->sound)
1479 { 1183 {
1480 op->contr->socket.sound = 0; 1184 op->contr->ns->sound = 0;
1481 new_draw_info (NDI_UNIQUE, 0, op, "Silence is golden..."); 1185 new_draw_info (NDI_UNIQUE, 0, op, "Silence is golden...");
1482 } 1186 }
1483 else 1187 else
1484 { 1188 {
1485 op->contr->socket.sound = 1; 1189 op->contr->ns->sound = 1;
1486 new_draw_info (NDI_UNIQUE, 0, op, "The sounds are enabled."); 1190 new_draw_info (NDI_UNIQUE, 0, op, "The sounds are enabled.");
1487 } 1191 }
1488 return 1;
1489}
1490 1192
1491/* Perhaps these should be in player.c, but that file is
1492 * already a bit big.
1493 */
1494
1495void
1496receive_player_name (object *op, char k)
1497{
1498
1499 if (!check_name (op->contr, op->contr->write_buf + 1))
1500 {
1501 get_name (op);
1502 return;
1503 }
1504 op->name = op->contr->write_buf + 1;
1505 op->name_pl = op->contr->write_buf + 1;
1506 new_draw_info (NDI_UNIQUE, 0, op, op->contr->write_buf);
1507 op->contr->name_changed = 1;
1508 get_password (op);
1509}
1510
1511void
1512receive_player_password (object *op, char k)
1513{
1514
1515 unsigned int pwd_len = strlen (op->contr->write_buf);
1516
1517 if (pwd_len <= 1 || pwd_len > 17)
1518 {
1519 get_name (op);
1520 return;
1521 }
1522 new_draw_info (NDI_UNIQUE, 0, op, " "); /* To hide the password better */
1523
1524 if (checkbanned (op->name, op->contr->socket.host))
1525 {
1526 LOG (llevInfo, "Banned player tried to add: [%s@%s]\n", &op->name, op->contr->socket.host);
1527 new_draw_info (NDI_UNIQUE | NDI_RED, 0, op, "You are not allowed to play.");
1528 get_name (op);
1529 return;
1530 }
1531
1532 if (op->contr->state == ST_CONFIRM_PASSWORD)
1533 {
1534 if (!check_password (op->contr->write_buf + 1, op->contr->password))
1535 {
1536 new_draw_info (NDI_UNIQUE, 0, op, "The passwords did not match.");
1537 get_name (op);
1538 return;
1539 }
1540 clear_win_info (op);
1541 display_motd (op);
1542 new_draw_info (NDI_UNIQUE, 0, op, " ");
1543 new_draw_info (NDI_UNIQUE, 0, op, "Welcome, Brave New Warrior!");
1544 new_draw_info (NDI_UNIQUE, 0, op, " ");
1545 Roll_Again (op);
1546 op->contr->state = ST_ROLL_STAT;
1547 return;
1548 }
1549 strcpy (op->contr->password, crypt_string (op->contr->write_buf + 1, NULL));
1550 op->contr->state = ST_ROLL_STAT;
1551 check_login (op);
1552 return; 1193 return 1;
1553} 1194}
1554
1555 1195
1556int 1196int
1557explore_mode (void) 1197explore_mode (void)
1558{ 1198{
1559 player *pl; 1199 player *pl;
1564 if (pl->explore) 1204 if (pl->explore)
1565 return 1; 1205 return 1;
1566 } 1206 }
1567 return 0; 1207 return 0;
1568} 1208}
1569
1570 1209
1571int 1210int
1572command_title (object *op, char *params) 1211command_title (object *op, char *params)
1573{ 1212{
1574 char buf[MAX_BUF]; 1213 char buf[MAX_BUF];
1615} 1254}
1616 1255
1617int 1256int
1618command_save (object *op, char *params) 1257command_save (object *op, char *params)
1619{ 1258{
1620// if (get_map_flags(op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) {
1621// new_draw_info(NDI_UNIQUE, 0, op, "You can not save on unholy ground");
1622// } else
1623 if (!op->stats.exp) 1259 if (!op->stats.exp)
1624 {
1625 new_draw_info (NDI_UNIQUE, 0, op, "You don't deserve to save yet."); 1260 new_draw_info (NDI_UNIQUE, 0, op, "You don't deserve to save yet.");
1261 else
1626 } 1262 {
1627 else 1263 op->contr->save ();
1628 {
1629 if (save_player (op, 1))
1630 new_draw_info (NDI_UNIQUE, 0, op, "You have been saved."); 1264 new_draw_info (NDI_UNIQUE, 0, op, "You have been saved.");
1631 else
1632 new_draw_info (NDI_UNIQUE, 0, op, "SAVE FAILED!");
1633 } 1265 }
1634 return 1;
1635}
1636 1266
1267 return 1;
1268}
1637 1269
1638int 1270int
1639command_peaceful (object *op, char *params) 1271command_peaceful (object *op, char *params)
1640{ 1272{
1641 new_draw_info (NDI_UNIQUE, 0, op, 1273 new_draw_info (NDI_UNIQUE, 0, op,
1650 new_draw_info(NDI_UNIQUE, 0,op,"You will attack other players."); 1282 new_draw_info(NDI_UNIQUE, 0,op,"You will attack other players.");
1651*/ 1283*/
1652 return 1; 1284 return 1;
1653} 1285}
1654 1286
1655
1656
1657int 1287int
1658command_wimpy (object *op, char *params) 1288command_wimpy (object *op, char *params)
1659{ 1289{
1660 int i; 1290 int i;
1661 char buf[MAX_BUF]; 1291 char buf[MAX_BUF];
1670 new_draw_info (NDI_UNIQUE, 0, op, buf); 1300 new_draw_info (NDI_UNIQUE, 0, op, buf);
1671 op->run_away = i; 1301 op->run_away = i;
1672 return 1; 1302 return 1;
1673} 1303}
1674 1304
1675
1676int 1305int
1677command_brace (object *op, char *params) 1306command_brace (object *op, char *params)
1678{ 1307{
1679 if (!params) 1308 if (!params)
1680 op->contr->braced = !op->contr->braced; 1309 op->contr->braced = !op->contr->braced;
1684 if (op->contr->braced) 1313 if (op->contr->braced)
1685 new_draw_info (NDI_UNIQUE, 0, op, "You are braced."); 1314 new_draw_info (NDI_UNIQUE, 0, op, "You are braced.");
1686 else 1315 else
1687 new_draw_info (NDI_UNIQUE, 0, op, "Not braced."); 1316 new_draw_info (NDI_UNIQUE, 0, op, "Not braced.");
1688 1317
1689 fix_player (op); 1318 op->update_stats ();
1690 return 0; 1319 return 0;
1691} 1320}
1692 1321
1693int 1322int
1694command_style_map_info (object *op, char *params) 1323command_style_map_info (object *op, char *params)
1695{ 1324{
1696 extern mapstruct *styles; 1325 extern maptile *styles;
1697 mapstruct *mp; 1326 maptile *mp;
1698 int maps_used = 0, mapmem = 0, objects_used = 0, x, y; 1327 int maps_used = 0, mapmem = 0, objects_used = 0, x, y;
1699 object *tmp; 1328 object *tmp;
1700 1329
1701 for (mp = styles; mp != NULL; mp = mp->next) 1330 for (mp = styles; mp != NULL; mp = mp->next)
1702 { 1331 {
1703 maps_used++; 1332 maps_used++;
1704 mapmem += MAP_WIDTH (mp) * MAP_HEIGHT (mp) * (sizeof (object *) + sizeof (MapSpace)) + sizeof (mapstruct); 1333 mapmem += mp->width * mp->height * (sizeof (object *) + sizeof (mapspace)) + sizeof (maptile);
1705 for (x = 0; x < MAP_WIDTH (mp); x++) 1334 for (x = 0; x < mp->width; x++)
1706 { 1335 {
1707 for (y = 0; y < MAP_HEIGHT (mp); y++) 1336 for (y = 0; y < mp->height; y++)
1708 { 1337 {
1709 for (tmp = get_map_ob (mp, x, y); tmp != NULL; tmp = tmp->above) 1338 for (tmp = GET_MAP_OB (mp, x, y); tmp != NULL; tmp = tmp->above)
1710 objects_used++; 1339 objects_used++;
1711 } 1340 }
1712 } 1341 }
1713 } 1342 }
1714 new_draw_info_format (NDI_UNIQUE, 0, op, "Style maps loaded: %d", maps_used); 1343 new_draw_info_format (NDI_UNIQUE, 0, op, "Style maps loaded: %d", maps_used);
1737 for (obl = first_friendly_object; obl != NULL; obl = next) 1366 for (obl = first_friendly_object; obl != NULL; obl = next)
1738 { 1367 {
1739 object *ob = obl->ob; 1368 object *ob = obl->ob;
1740 1369
1741 next = obl->next; 1370 next = obl->next;
1742 if (get_owner (ob) == op) 1371 if (ob->owner == op)
1743 if (++counter == target || (target == 0 && !strcasecmp (ob->name, params))) 1372 if (++counter == target || (target == 0 && !strcasecmp (ob->name, params)))
1744 { 1373 {
1745 if (!QUERY_FLAG (ob, FLAG_REMOVED))
1746 remove_ob (ob);
1747 remove_friendly_object (ob);
1748 free_object (ob); 1374 ob->destroy ();
1749 removecount++; 1375 removecount++;
1750 } 1376 }
1751 } 1377 }
1752 if (removecount != 0) 1378 if (removecount != 0)
1753 new_draw_info_format (NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount); 1379 new_draw_info_format (NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines