Stop snooping at do_quit, added afk to prompt, g++ compiler cleanup (thanks Rhade), fixed locate object (thanks JamDog), and renamed immort_level_ok to no_mort_to_immort --Rumble

This commit is contained in:
Rumble 2007-03-18 16:10:10 +00:00
parent 86568f9d4d
commit 1f74a71456
18 changed files with 445 additions and 949 deletions

View file

@ -1,11 +1,18 @@
TbaMUD is currently being developed by The Builder Academy. If you need any TbaMUD is currently being developed by The Builder Academy. If you need any
help, find any bugs, or have ideas for improvement please stop by TBA. help, find any bugs, or have ideas for improvement please stop by TBA.
Rumble Rumble
The Builder Academy The Builder Academy
builderacademy.net 9091 builderacademy.net 9091
tbaMUD 3.52 tbaMUD 3.52
[Mar 18 2007] - Rumble
Cleaned up the code by running it through a g++ compiler (thanks Rhade).
Added AFK to the prompt.
Stop snooping at do_quit to prevent snooping of passwords on deletion or password reset.
[Mar 17 2007] - Rumble
Fixed locate object spell (thanks JamDog).
Added plist and and improved history command (thanks Rhade).
Renamed immort_level_ok to no_mort_to_immort and rewrote the convuluted comments.
[Mar 04 2007] - Rumble [Mar 04 2007] - Rumble
Fixed fight_messages not displaying (thanks Rhade). Fixed fight_messages not displaying (thanks Rhade).
Removed LVL_FREEZE and set ban/freeze to LVL_GRGOD. Removed LVL_FREEZE and set ban/freeze to LVL_GRGOD.

View file

@ -1852,13 +1852,13 @@ ACMD(do_toggle)
{"holylight", PRF_HOLYLIGHT, LVL_IMMORT, {"holylight", PRF_HOLYLIGHT, LVL_IMMORT,
"HolyLight mode off.\r\n", "HolyLight mode off.\r\n",
"HolyLight mode on.\r\n"}, "HolyLight mode on.\r\n"},
{"slownameserver", -1, LVL_IMPL, {"slownameserver", 0, LVL_IMPL,
"Nameserver_is_slow changed to OFF; IP addresses will now be resolved.\r\n", "Nameserver_is_slow changed to OFF; IP addresses will now be resolved.\r\n",
"Nameserver_is_slow changed to ON; sitenames will no longer be resolved.\r\n"}, "Nameserver_is_slow changed to ON; sitenames will no longer be resolved.\r\n"},
{"autoexits", PRF_AUTOEXIT, 0, {"autoexits", PRF_AUTOEXIT, 0,
"Autoexits disabled.\r\n", "Autoexits disabled.\r\n",
"Autoexits enabled.\r\n"}, "Autoexits enabled.\r\n"},
{"trackthru", -1, LVL_IMPL, {"trackthru", 0, LVL_IMPL,
"Players can no longer track through doors.\r\n", "Players can no longer track through doors.\r\n",
"Players can now track through doors.\r\n"}, "Players can now track through doors.\r\n"},
{"clsolc", PRF_CLS, LVL_BUILDER, {"clsolc", PRF_CLS, LVL_BUILDER,
@ -1870,10 +1870,10 @@ ACMD(do_toggle)
{"afk", PRF_AFK, 0, {"afk", PRF_AFK, 0,
"AFK is now Off.\r\n", "AFK is now Off.\r\n",
"AFK is now On.\r\n"}, "AFK is now On.\r\n"},
{"color", -1, 0, "\n", "\n"}, {"color", 0, 0, "\n", "\n"},
{"syslog", -1, LVL_IMMORT, "\n", "\n"}, {"syslog", 0, LVL_IMMORT, "\n", "\n"},
{"wimpy", -1, 0, "\n", "\n"}, {"wimpy", 0, 0, "\n", "\n"},
{"pagelength", -1, 0, "\n", "\n"}, {"pagelength", 0, 0, "\n", "\n"},
{"autoloot", PRF_AUTOLOOT, 0, {"autoloot", PRF_AUTOLOOT, 0,
"Autoloot disabled.\r\n", "Autoloot disabled.\r\n",
"Autoloot enabled.\r\n"}, "Autoloot enabled.\r\n"},
@ -1889,7 +1889,7 @@ ACMD(do_toggle)
{"autoassist", PRF_AUTOASSIST, 0, {"autoassist", PRF_AUTOASSIST, 0,
"Autoassist disabled.\r\n", "Autoassist disabled.\r\n",
"Autoassist enabled.\r\n"}, "Autoassist enabled.\r\n"},
{"\n", -1, -1, "\n", "\n"} /* must be last */ {"\n", 0, -1, "\n", "\n"} /* must be last */
}; };
len = strlen(arg); len = strlen(arg);
@ -2141,12 +2141,12 @@ ACMD(do_history)
void add_history(struct char_data *ch, char *str, int type) void add_history(struct char_data *ch, char *str, int type)
{ {
int i = 0; int i = 0;
struct txt_block *tmp = GET_HISTORY(ch, type);
char time_str[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH]; char time_str[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH];
if (IS_NPC(ch)) if (IS_NPC(ch))
return; return;
struct txt_block *tmp = GET_HISTORY(ch, type);
time_t ct = time(0); time_t ct = time(0);
strftime(time_str, sizeof(time_str), "%H:%M ", localtime(&ct)); strftime(time_str, sizeof(time_str), "%H:%M ", localtime(&ct));

View file

@ -1,5 +1,5 @@
/* ************************************************************************ /* ************************************************************************
* File: act.other.c Part of CircleMUD * * File: act.other.c *
* Usage: Miscellaneous player-level commands * * Usage: Miscellaneous player-level commands *
* * * *
* All rights reserved. See license.doc for complete information. * * All rights reserved. See license.doc for complete information. *
@ -12,7 +12,6 @@
#include "conf.h" #include "conf.h"
#include "sysdep.h" #include "sysdep.h"
#include "structs.h" #include "structs.h"
#include "utils.h" #include "utils.h"
#include "comm.h" #include "comm.h"
@ -76,23 +75,26 @@ ACMD(do_quit)
mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has quit the game.", GET_NAME(ch)); mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has quit the game.", GET_NAME(ch));
send_to_char(ch, "Goodbye, friend.. Come back soon!\r\n"); send_to_char(ch, "Goodbye, friend.. Come back soon!\r\n");
/* We used to check here for duping attempts, but we may as well /* We used to check here for duping attempts, but we may as well do it right
* do it right in extract_char(), since there is no check if a * in extract_char(), since there is no check if a player rents out and it
* player rents out and it can leave them in an equally screwy * can leave them in an equally screwy situation. */
* situation.
*/
if (CONFIG_FREE_RENT) if (CONFIG_FREE_RENT)
Crash_rentsave(ch, 0); Crash_rentsave(ch, 0);
GET_LOADROOM(ch) = GET_ROOM_VNUM(IN_ROOM(ch)); GET_LOADROOM(ch) = GET_ROOM_VNUM(IN_ROOM(ch));
/* Stop snooping so you can't see passwords during deletion or change. */
if (ch->desc->snoop_by) {
write_to_output(ch->desc->snoop_by, "Your victim is no longer among us.\r\n");
ch->desc->snoop_by->snooping = NULL;
ch->desc->snoop_by = NULL;
}
extract_char(ch); /* Char is saved before extracting. */ extract_char(ch); /* Char is saved before extracting. */
} }
} }
ACMD(do_save) ACMD(do_save)
{ {
if (IS_NPC(ch) || !ch->desc) if (IS_NPC(ch) || !ch->desc)
@ -106,16 +108,13 @@ ACMD(do_save)
GET_LOADROOM(ch) = GET_ROOM_VNUM(IN_ROOM(ch)); GET_LOADROOM(ch) = GET_ROOM_VNUM(IN_ROOM(ch));
} }
/* Generic function for commands which are normally overridden by special
/* generic function for commands which are normally overridden by * procedures - i.e., shop commands, mail commands, etc. */
special procedures - i.e., shop commands, mail commands, etc. */
ACMD(do_not_here) ACMD(do_not_here)
{ {
send_to_char(ch, "Sorry, but you cannot do that here!\r\n"); send_to_char(ch, "Sorry, but you cannot do that here!\r\n");
} }
ACMD(do_sneak) ACMD(do_sneak)
{ {
struct affected_type af; struct affected_type af;
@ -142,8 +141,6 @@ ACMD(do_sneak)
affect_to_char(ch, &af); affect_to_char(ch, &af);
} }
ACMD(do_hide) ACMD(do_hide)
{ {
byte percent; byte percent;
@ -166,9 +163,6 @@ ACMD(do_hide)
SET_BIT(AFF_FLAGS(ch), AFF_HIDE); SET_BIT(AFF_FLAGS(ch), AFF_HIDE);
} }
ACMD(do_steal) ACMD(do_steal)
{ {
struct char_data *vict; struct char_data *vict;
@ -293,8 +287,6 @@ ACMD(do_steal)
hit(vict, ch, TYPE_UNDEFINED); hit(vict, ch, TYPE_UNDEFINED);
} }
ACMD(do_practice) ACMD(do_practice)
{ {
char arg[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH];
@ -310,8 +302,6 @@ ACMD(do_practice)
list_skills(ch); list_skills(ch);
} }
ACMD(do_visible) ACMD(do_visible)
{ {
if (GET_LEVEL(ch) >= LVL_IMMORT) { if (GET_LEVEL(ch) >= LVL_IMMORT) {
@ -326,8 +316,6 @@ ACMD(do_visible)
send_to_char(ch, "You are already visible.\r\n"); send_to_char(ch, "You are already visible.\r\n");
} }
ACMD(do_title) ACMD(do_title)
{ {
skip_spaces(&argument); skip_spaces(&argument);
@ -347,7 +335,6 @@ ACMD(do_title)
} }
} }
int perform_group(struct char_data *ch, struct char_data *vict) int perform_group(struct char_data *ch, struct char_data *vict)
{ {
if (AFF_FLAGGED(vict, AFF_GROUP) || !CAN_SEE(ch, vict)) if (AFF_FLAGGED(vict, AFF_GROUP) || !CAN_SEE(ch, vict))
@ -361,7 +348,6 @@ int perform_group(struct char_data *ch, struct char_data *vict)
return (1); return (1);
} }
void print_group(struct char_data *ch) void print_group(struct char_data *ch)
{ {
struct char_data *k; struct char_data *k;
@ -394,8 +380,6 @@ void print_group(struct char_data *ch)
} }
} }
ACMD(do_group) ACMD(do_group)
{ {
char buf[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH];
@ -442,8 +426,6 @@ ACMD(do_group)
} }
} }
ACMD(do_ungroup) ACMD(do_ungroup)
{ {
char buf[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH];
@ -496,9 +478,6 @@ ACMD(do_ungroup)
stop_follower(tch); stop_follower(tch);
} }
ACMD(do_report) ACMD(do_report)
{ {
char buf[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH];
@ -527,8 +506,6 @@ ACMD(do_report)
send_to_char(ch, "You report to the group.\r\n"); send_to_char(ch, "You report to the group.\r\n");
} }
ACMD(do_split) ACMD(do_split)
{ {
char buf[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH];
@ -613,8 +590,6 @@ ACMD(do_split)
} }
} }
ACMD(do_use) ACMD(do_use)
{ {
char buf[MAX_INPUT_LENGTH], arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH], arg[MAX_INPUT_LENGTH];
@ -641,10 +616,8 @@ ACMD(do_use)
return; return;
default: default:
log("SYSERR: Unknown subcmd %d passed to do_use.", subcmd); log("SYSERR: Unknown subcmd %d passed to do_use.", subcmd);
/* SYSERR_DESC: /* SYSERR_DESC: This is the same as the unhandled case in do_gen_ps(),
* This is the same as the unhandled case in do_gen_ps(), but in the * but in the function which handles 'quaff', 'recite', and 'use'. */
* function which handles 'quaff', 'recite', and 'use'.
*/
return; return;
} }
} }
@ -722,8 +695,6 @@ ACMD(do_display)
send_to_char(ch, "%s", CONFIG_OK); send_to_char(ch, "%s", CONFIG_OK);
} }
ACMD(do_gen_write) ACMD(do_gen_write)
{ {
FILE *fl; FILE *fl;
@ -765,11 +736,9 @@ ACMD(do_gen_write)
if (stat(filename, &fbuf) < 0) { if (stat(filename, &fbuf) < 0) {
perror("SYSERR: Can't stat() file"); perror("SYSERR: Can't stat() file");
/* SYSERR_DESC: /* SYSERR_DESC: This is from do_gen_write() and indicates that it cannot
* This is from do_gen_write() and indicates that it cannot call the * call the stat() system call on the file required. The error string at
* stat() system call on the file required. The error string at the * the end of the line should explain what the problem is. */
* end of the line should explain what the problem is.
*/
return; return;
} }
if (fbuf.st_size >= CONFIG_MAX_FILESIZE) { if (fbuf.st_size >= CONFIG_MAX_FILESIZE) {
@ -778,11 +747,9 @@ ACMD(do_gen_write)
} }
if (!(fl = fopen(filename, "a"))) { if (!(fl = fopen(filename, "a"))) {
perror("SYSERR: do_gen_write"); perror("SYSERR: do_gen_write");
/* SYSERR_DESC: /* SYSERR_DESC: This is from do_gen_write(), and will be output if the file
* This is from do_gen_write(), and will be output if the file in * in question cannot be opened for appending to. The error string at the
* question cannot be opened for appending to. The error string * end of the line should explain what the problem is. */
* at the end of the line should explain what the problem is.
*/
send_to_char(ch, "Could not open the file. Sorry.\r\n"); send_to_char(ch, "Could not open the file. Sorry.\r\n");
return; return;
@ -795,9 +762,7 @@ ACMD(do_gen_write)
#define TOG_OFF 0 #define TOG_OFF 0
#define TOG_ON 1 #define TOG_ON 1
#define PRF_TOG_CHK(ch,flag) ((TOGGLE_BIT(PRF_FLAGS(ch), (flag))) & (flag)) #define PRF_TOG_CHK(ch,flag) ((TOGGLE_BIT(PRF_FLAGS(ch), (flag))) & (flag))
ACMD(do_gen_tog) ACMD(do_gen_tog)
{ {
long result; long result;
@ -845,7 +810,6 @@ ACMD(do_gen_tog)
"AFK flag is now on.\r\n"} "AFK flag is now on.\r\n"}
}; };
if (IS_NPC(ch)) if (IS_NPC(ch))
return; return;

View file

@ -42,7 +42,7 @@ extern struct player_index_element *player_table;
/* external functions */ /* external functions */
int level_exp(int chclass, int level); int level_exp(int chclass, int level);
void show_shops(struct char_data *ch, char *value); void show_shops(struct char_data *ch, char *value);
void hcontrol_list_houses(struct char_data *ch); void hcontrol_list_houses(struct char_data *ch, char *arg);
void do_start(struct char_data *ch); void do_start(struct char_data *ch);
void appear(struct char_data *ch); void appear(struct char_data *ch);
void reset_zone(zone_rnum zone); void reset_zone(zone_rnum zone);
@ -50,7 +50,7 @@ void roll_real_abils(struct char_data *ch);
int parse_class(char arg); int parse_class(char arg);
void run_autowiz(void); void run_autowiz(void);
int save_all(void); int save_all(void);
extern zone_rnum real_zone_by_thing(room_vnum vznum); /* added for zone_checker */ zone_rnum real_zone_by_thing(room_vnum vznum);
SPECIAL(shop_keeper); SPECIAL(shop_keeper);
void Crash_rentsave(struct char_data * ch, int cost); void Crash_rentsave(struct char_data * ch, int cost);
void new_hist_messg(struct descriptor_data *d, const char *msg); void new_hist_messg(struct descriptor_data *d, const char *msg);
@ -2634,7 +2634,7 @@ ACMD(do_show)
/* show houses */ /* show houses */
case 9: case 9:
hcontrol_list_houses(ch); hcontrol_list_houses(ch, value);
break; break;
/* show snoop */ /* show snoop */
@ -4234,7 +4234,7 @@ ACMD(do_changelog)
} }
#define PLIST_FORMAT \ #define PLIST_FORMAT \
"plist [minlev[-maxlev]] [-n name] [-d days] [-h hours] [-i] [-m]" "Usage: plist [minlev[-maxlev]] [-n name] [-d days] [-h hours] [-i] [-m]"
ACMD(do_plist) ACMD(do_plist)
{ {
@ -4315,7 +4315,7 @@ ACMD(do_plist)
strcpy(time_str, asctime(localtime(&player_table[i].last))); strcpy(time_str, asctime(localtime(&player_table[i].last)));
time_str[strlen(time_str) - 1] = '\0'; time_str[strlen(time_str) - 1] = '\0';
len += snprintf(buf + len, sizeof(buf) - len, "[%3ld] (%2d) %-12s %s\r\n", len += snprintf(buf + len, sizeof(buf) - len, "[%3ld] (%2d) %-15s %s\r\n",
player_table[i].id, player_table[i].level, player_table[i].id, player_table[i].level,
CAP(strdup(player_table[i].name)), time_str); CAP(strdup(player_table[i].name)), time_str);
count++; count++;

View file

@ -41,9 +41,7 @@ ACMD(do_oasis_cedit)
struct descriptor_data *d; struct descriptor_data *d;
char buf1[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH];
/****************************************************************************/ /* Parse any arguments. */
/** Parse any arguments. **/
/****************************************************************************/
one_argument(argument, buf1); one_argument(argument, buf1);
if (GET_LEVEL(ch) < LVL_IMPL) { if (GET_LEVEL(ch) < LVL_IMPL) {
@ -76,21 +74,13 @@ ACMD(do_oasis_cedit)
cedit_save_to_disk(); cedit_save_to_disk();
} }
/*-------------------------------------------------------------------*/
void cedit_setup(struct descriptor_data *d) void cedit_setup(struct descriptor_data *d)
{ {
/****************************************************************************/ /* Create the config_data struct. */
/** Create the config_data struct. **/
/****************************************************************************/
CREATE(OLC_CONFIG(d), struct config_data, 1); CREATE(OLC_CONFIG(d), struct config_data, 1);
/****************************************************************************/ /* Copy the current configuration from the config_info to this one and copy
/** Copy the current configuration from the config_info to this one. **/ * the game play options from the configuration info struct. */
/****************************************************************************/
/****************************************************************************/
/** Copy the game play options from the configuration info struct. **/
/****************************************************************************/
OLC_CONFIG(d)->play.pk_allowed = CONFIG_PK_ALLOWED; OLC_CONFIG(d)->play.pk_allowed = CONFIG_PK_ALLOWED;
OLC_CONFIG(d)->play.pt_allowed = CONFIG_PT_ALLOWED; OLC_CONFIG(d)->play.pt_allowed = CONFIG_PT_ALLOWED;
OLC_CONFIG(d)->play.level_can_shout = CONFIG_LEVEL_CAN_SHOUT; OLC_CONFIG(d)->play.level_can_shout = CONFIG_LEVEL_CAN_SHOUT;
@ -106,11 +96,9 @@ void cedit_setup(struct descriptor_data *d)
OLC_CONFIG(d)->play.dts_are_dumps = CONFIG_DTS_ARE_DUMPS; OLC_CONFIG(d)->play.dts_are_dumps = CONFIG_DTS_ARE_DUMPS;
OLC_CONFIG(d)->play.load_into_inventory = CONFIG_LOAD_INVENTORY; OLC_CONFIG(d)->play.load_into_inventory = CONFIG_LOAD_INVENTORY;
OLC_CONFIG(d)->play.track_through_doors = CONFIG_TRACK_T_DOORS; OLC_CONFIG(d)->play.track_through_doors = CONFIG_TRACK_T_DOORS;
OLC_CONFIG(d)->play.immort_level_ok = CONFIG_IMMORT_LEVEL_OK; OLC_CONFIG(d)->play.no_mort_to_immort = CONFIG_NO_MORT_TO_IMMORT;
/****************************************************************************/ /* Crash Saves */
/** Crash Saves **/
/****************************************************************************/
OLC_CONFIG(d)->csd.free_rent = CONFIG_FREE_RENT; OLC_CONFIG(d)->csd.free_rent = CONFIG_FREE_RENT;
OLC_CONFIG(d)->csd.max_obj_save = CONFIG_MAX_OBJ_SAVE; OLC_CONFIG(d)->csd.max_obj_save = CONFIG_MAX_OBJ_SAVE;
OLC_CONFIG(d)->csd.min_rent_cost = CONFIG_MIN_RENT_COST; OLC_CONFIG(d)->csd.min_rent_cost = CONFIG_MIN_RENT_COST;
@ -119,9 +107,7 @@ void cedit_setup(struct descriptor_data *d)
OLC_CONFIG(d)->csd.crash_file_timeout = CONFIG_CRASH_TIMEOUT; OLC_CONFIG(d)->csd.crash_file_timeout = CONFIG_CRASH_TIMEOUT;
OLC_CONFIG(d)->csd.rent_file_timeout = CONFIG_RENT_TIMEOUT; OLC_CONFIG(d)->csd.rent_file_timeout = CONFIG_RENT_TIMEOUT;
/****************************************************************************/ /* Room Numbers */
/** Room Numbers **/
/****************************************************************************/
OLC_CONFIG(d)->room_nums.mortal_start_room = CONFIG_MORTAL_START; OLC_CONFIG(d)->room_nums.mortal_start_room = CONFIG_MORTAL_START;
OLC_CONFIG(d)->room_nums.immort_start_room = CONFIG_IMMORTAL_START; OLC_CONFIG(d)->room_nums.immort_start_room = CONFIG_IMMORTAL_START;
OLC_CONFIG(d)->room_nums.frozen_start_room = CONFIG_FROZEN_START; OLC_CONFIG(d)->room_nums.frozen_start_room = CONFIG_FROZEN_START;
@ -129,9 +115,7 @@ void cedit_setup(struct descriptor_data *d)
OLC_CONFIG(d)->room_nums.donation_room_2 = CONFIG_DON_ROOM_2; OLC_CONFIG(d)->room_nums.donation_room_2 = CONFIG_DON_ROOM_2;
OLC_CONFIG(d)->room_nums.donation_room_3 = CONFIG_DON_ROOM_3; OLC_CONFIG(d)->room_nums.donation_room_3 = CONFIG_DON_ROOM_3;
/****************************************************************************/ /* Game Operation */
/** Game Operation **/
/****************************************************************************/
OLC_CONFIG(d)->operation.DFLT_PORT = CONFIG_DFLT_PORT; OLC_CONFIG(d)->operation.DFLT_PORT = CONFIG_DFLT_PORT;
OLC_CONFIG(d)->operation.max_playing = CONFIG_MAX_PLAYING; OLC_CONFIG(d)->operation.max_playing = CONFIG_MAX_PLAYING;
OLC_CONFIG(d)->operation.max_filesize = CONFIG_MAX_FILESIZE; OLC_CONFIG(d)->operation.max_filesize = CONFIG_MAX_FILESIZE;
@ -141,16 +125,12 @@ void cedit_setup(struct descriptor_data *d)
OLC_CONFIG(d)->operation.auto_save_olc = CONFIG_OLC_SAVE; OLC_CONFIG(d)->operation.auto_save_olc = CONFIG_OLC_SAVE;
OLC_CONFIG(d)->operation.nameserver_is_slow = CONFIG_NS_IS_SLOW; OLC_CONFIG(d)->operation.nameserver_is_slow = CONFIG_NS_IS_SLOW;
/****************************************************************************/ /* Autowiz */
/** Autowiz **/
/****************************************************************************/
OLC_CONFIG(d)->autowiz.use_autowiz = CONFIG_USE_AUTOWIZ; OLC_CONFIG(d)->autowiz.use_autowiz = CONFIG_USE_AUTOWIZ;
OLC_CONFIG(d)->autowiz.min_wizlist_lev = CONFIG_MIN_WIZLIST_LEV; OLC_CONFIG(d)->autowiz.min_wizlist_lev = CONFIG_MIN_WIZLIST_LEV;
/****************************************************************************/ /* Allocate space for the strings. */
/** Allocate space for the strings. **/
/****************************************************************************/
OLC_CONFIG(d)->play.OK = str_udup(CONFIG_OK); OLC_CONFIG(d)->play.OK = str_udup(CONFIG_OK);
OLC_CONFIG(d)->play.NOPERSON = str_udup(CONFIG_NOPERSON); OLC_CONFIG(d)->play.NOPERSON = str_udup(CONFIG_NOPERSON);
OLC_CONFIG(d)->play.NOEFFECT = str_udup(CONFIG_NOEFFECT); OLC_CONFIG(d)->play.NOEFFECT = str_udup(CONFIG_NOEFFECT);
@ -188,15 +168,11 @@ void cedit_setup(struct descriptor_data *d)
cedit_disp_menu(d); cedit_disp_menu(d);
} }
/******************************************************************************/
void cedit_save_internally(struct descriptor_data *d) void cedit_save_internally(struct descriptor_data *d)
{ {
/* see if we need to reassign spec procs on rooms */ /* see if we need to reassign spec procs on rooms */
int reassign = (CONFIG_DTS_ARE_DUMPS != OLC_CONFIG(d)->play.dts_are_dumps); int reassign = (CONFIG_DTS_ARE_DUMPS != OLC_CONFIG(d)->play.dts_are_dumps);
/****************************************************************************/ /* Copy the data back from the descriptor to the config_info structure. */
/** Copy the data back from the descriptor to the config_info structure. **/
/****************************************************************************/
CONFIG_PK_ALLOWED = OLC_CONFIG(d)->play.pk_allowed; CONFIG_PK_ALLOWED = OLC_CONFIG(d)->play.pk_allowed;
CONFIG_PT_ALLOWED = OLC_CONFIG(d)->play.pt_allowed; CONFIG_PT_ALLOWED = OLC_CONFIG(d)->play.pt_allowed;
CONFIG_LEVEL_CAN_SHOUT = OLC_CONFIG(d)->play.level_can_shout; CONFIG_LEVEL_CAN_SHOUT = OLC_CONFIG(d)->play.level_can_shout;
@ -212,11 +188,9 @@ void cedit_save_internally(struct descriptor_data *d)
CONFIG_DTS_ARE_DUMPS = OLC_CONFIG(d)->play.dts_are_dumps; CONFIG_DTS_ARE_DUMPS = OLC_CONFIG(d)->play.dts_are_dumps;
CONFIG_LOAD_INVENTORY = OLC_CONFIG(d)->play.load_into_inventory; CONFIG_LOAD_INVENTORY = OLC_CONFIG(d)->play.load_into_inventory;
CONFIG_TRACK_T_DOORS = OLC_CONFIG(d)->play.track_through_doors; CONFIG_TRACK_T_DOORS = OLC_CONFIG(d)->play.track_through_doors;
CONFIG_IMMORT_LEVEL_OK = OLC_CONFIG(d)->play.immort_level_ok; CONFIG_NO_MORT_TO_IMMORT = OLC_CONFIG(d)->play.no_mort_to_immort;
/****************************************************************************/ /* Crash Saves */
/** Crash Saves **/
/****************************************************************************/
CONFIG_FREE_RENT = OLC_CONFIG(d)->csd.free_rent; CONFIG_FREE_RENT = OLC_CONFIG(d)->csd.free_rent;
CONFIG_MAX_OBJ_SAVE = OLC_CONFIG(d)->csd.max_obj_save; CONFIG_MAX_OBJ_SAVE = OLC_CONFIG(d)->csd.max_obj_save;
CONFIG_MIN_RENT_COST = OLC_CONFIG(d)->csd.min_rent_cost; CONFIG_MIN_RENT_COST = OLC_CONFIG(d)->csd.min_rent_cost;
@ -225,9 +199,7 @@ void cedit_save_internally(struct descriptor_data *d)
CONFIG_CRASH_TIMEOUT = OLC_CONFIG(d)->csd.crash_file_timeout; CONFIG_CRASH_TIMEOUT = OLC_CONFIG(d)->csd.crash_file_timeout;
CONFIG_RENT_TIMEOUT = OLC_CONFIG(d)->csd.rent_file_timeout; CONFIG_RENT_TIMEOUT = OLC_CONFIG(d)->csd.rent_file_timeout;
/****************************************************************************/ /* Room Numbers */
/** Room Numbers **/
/****************************************************************************/
CONFIG_MORTAL_START = OLC_CONFIG(d)->room_nums.mortal_start_room; CONFIG_MORTAL_START = OLC_CONFIG(d)->room_nums.mortal_start_room;
CONFIG_IMMORTAL_START = OLC_CONFIG(d)->room_nums.immort_start_room; CONFIG_IMMORTAL_START = OLC_CONFIG(d)->room_nums.immort_start_room;
CONFIG_FROZEN_START = OLC_CONFIG(d)->room_nums.frozen_start_room; CONFIG_FROZEN_START = OLC_CONFIG(d)->room_nums.frozen_start_room;
@ -235,9 +207,7 @@ void cedit_save_internally(struct descriptor_data *d)
CONFIG_DON_ROOM_2 = OLC_CONFIG(d)->room_nums.donation_room_2; CONFIG_DON_ROOM_2 = OLC_CONFIG(d)->room_nums.donation_room_2;
CONFIG_DON_ROOM_3 = OLC_CONFIG(d)->room_nums.donation_room_3; CONFIG_DON_ROOM_3 = OLC_CONFIG(d)->room_nums.donation_room_3;
/****************************************************************************/ /* Game Operation */
/** Game Operation **/
/****************************************************************************/
CONFIG_DFLT_PORT = OLC_CONFIG(d)->operation.DFLT_PORT; CONFIG_DFLT_PORT = OLC_CONFIG(d)->operation.DFLT_PORT;
CONFIG_MAX_PLAYING = OLC_CONFIG(d)->operation.max_playing; CONFIG_MAX_PLAYING = OLC_CONFIG(d)->operation.max_playing;
CONFIG_MAX_FILESIZE = OLC_CONFIG(d)->operation.max_filesize; CONFIG_MAX_FILESIZE = OLC_CONFIG(d)->operation.max_filesize;
@ -247,15 +217,11 @@ void cedit_save_internally(struct descriptor_data *d)
CONFIG_NS_IS_SLOW = OLC_CONFIG(d)->operation.nameserver_is_slow; CONFIG_NS_IS_SLOW = OLC_CONFIG(d)->operation.nameserver_is_slow;
CONFIG_OLC_SAVE = OLC_CONFIG(d)->operation.auto_save_olc; CONFIG_OLC_SAVE = OLC_CONFIG(d)->operation.auto_save_olc;
/****************************************************************************/ /* Autowiz */
/** Autowiz **/
/****************************************************************************/
CONFIG_USE_AUTOWIZ = OLC_CONFIG(d)->autowiz.use_autowiz; CONFIG_USE_AUTOWIZ = OLC_CONFIG(d)->autowiz.use_autowiz;
CONFIG_MIN_WIZLIST_LEV = OLC_CONFIG(d)->autowiz.min_wizlist_lev; CONFIG_MIN_WIZLIST_LEV = OLC_CONFIG(d)->autowiz.min_wizlist_lev;
/****************************************************************************/ /* Allocate space for the strings. */
/** Allocate space for the strings. **/
/****************************************************************************/
if (CONFIG_OK) if (CONFIG_OK)
free(CONFIG_OK); free(CONFIG_OK);
CONFIG_OK = str_udup(OLC_CONFIG(d)->play.OK); CONFIG_OK = str_udup(OLC_CONFIG(d)->play.OK);
@ -275,7 +241,6 @@ void cedit_save_internally(struct descriptor_data *d)
else else
CONFIG_DFLT_IP = NULL; CONFIG_DFLT_IP = NULL;
if (CONFIG_DFLT_DIR) if (CONFIG_DFLT_DIR)
free(CONFIG_DFLT_DIR); free(CONFIG_DFLT_DIR);
if (OLC_CONFIG(d)->operation.DFLT_DIR) if (OLC_CONFIG(d)->operation.DFLT_DIR)
@ -318,18 +283,12 @@ void cedit_save_internally(struct descriptor_data *d)
add_to_save_list(NOWHERE, SL_CFG); add_to_save_list(NOWHERE, SL_CFG);
} }
/******************************************************************************/
void cedit_save_to_disk( void ) void cedit_save_to_disk( void )
{ {
/****************************************************************************/ /* Just call save_config and get it over with. */
/** Just call save_config and get it over with. **/
/****************************************************************************/
save_config( NOWHERE ); save_config( NOWHERE );
} }
/******************************************************************************/
int save_config( IDXTYPE nowhere ) int save_config( IDXTYPE nowhere )
{ {
FILE *fl; FILE *fl;
@ -385,7 +344,7 @@ int save_config( IDXTYPE nowhere )
fprintf(fl, "* Should PC's be able to track through hidden or closed doors?\n" fprintf(fl, "* Should PC's be able to track through hidden or closed doors?\n"
"track_through_doors = %d\n\n", CONFIG_TRACK_T_DOORS); "track_through_doors = %d\n\n", CONFIG_TRACK_T_DOORS);
fprintf(fl, "* Should players who reach enough exp automatically level to immortal?\n" fprintf(fl, "* Should players who reach enough exp automatically level to immortal?\n"
"immort_level_ok = %d\n\n", CONFIG_IMMORT_LEVEL_OK); "no_mort_to_immort = %d\n\n", CONFIG_NO_MORT_TO_IMMORT);
strcpy(buf, CONFIG_OK); strcpy(buf, CONFIG_OK);
strip_cr(buf); strip_cr(buf);
@ -405,11 +364,7 @@ int save_config( IDXTYPE nowhere )
fprintf(fl, "* Text sent to players when an effect fails.\n" fprintf(fl, "* Text sent to players when an effect fails.\n"
"noeffect = %s\n", buf); "noeffect = %s\n", buf);
/* RENT / CRASHSAVE OPTIONS */
/************************************************************************
** RENT / CRASHSAVE OPTIONS **
************************************************************************/
fprintf(fl, "\n\n\n* [ Rent/Crashsave Options ]\n"); fprintf(fl, "\n\n\n* [ Rent/Crashsave Options ]\n");
fprintf(fl, "* Should the MUD allow you to 'rent' for free? (i.e. if you just quit,\n" fprintf(fl, "* Should the MUD allow you to 'rent' for free? (i.e. if you just quit,\n"
@ -431,10 +386,7 @@ int save_config( IDXTYPE nowhere )
fprintf(fl, "* Lifetime of normal rent files in days.\n" fprintf(fl, "* Lifetime of normal rent files in days.\n"
"rent_file_timeout = %d\n\n", CONFIG_RENT_TIMEOUT); "rent_file_timeout = %d\n\n", CONFIG_RENT_TIMEOUT);
/* ROOM NUMBERS */
/************************************************************************
** ROOM NUMBERS **
************************************************************************/
fprintf(fl, "\n\n\n* [ Room Numbers ]\n"); fprintf(fl, "\n\n\n* [ Room Numbers ]\n");
fprintf(fl, "* The virtual number of the room that mortals should enter at.\n" fprintf(fl, "* The virtual number of the room that mortals should enter at.\n"
@ -562,13 +514,7 @@ int save_config( IDXTYPE nowhere )
return (TRUE); return (TRUE);
} }
/************************************************************************** /* Menu functions - The main menu. */
Menu functions
**************************************************************************/
/*
* the main menu
*/
void cedit_disp_menu(struct descriptor_data *d) void cedit_disp_menu(struct descriptor_data *d)
{ {
get_char_colors(d->character); get_char_colors(d->character);
@ -598,7 +544,6 @@ void cedit_disp_menu(struct descriptor_data *d)
OLC_MODE(d) = CEDIT_MAIN_MENU; OLC_MODE(d) = CEDIT_MAIN_MENU;
} }
/*-------------------------------------------------------------------*/
void cedit_disp_game_play_options(struct descriptor_data *d) void cedit_disp_game_play_options(struct descriptor_data *d)
{ {
get_char_colors(d->character); get_char_colors(d->character);
@ -642,7 +587,7 @@ void cedit_disp_game_play_options(struct descriptor_data *d)
grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.dts_are_dumps), grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.dts_are_dumps),
grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.load_into_inventory), grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.load_into_inventory),
grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.track_through_doors), grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.track_through_doors),
grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.immort_level_ok), grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.no_mort_to_immort),
grn, nrm, cyn, OLC_CONFIG(d)->play.OK, grn, nrm, cyn, OLC_CONFIG(d)->play.OK,
grn, nrm, cyn, OLC_CONFIG(d)->play.NOPERSON, grn, nrm, cyn, OLC_CONFIG(d)->play.NOPERSON,
@ -654,8 +599,6 @@ void cedit_disp_game_play_options(struct descriptor_data *d)
OLC_MODE(d) = CEDIT_GAME_OPTIONS_MENU; OLC_MODE(d) = CEDIT_GAME_OPTIONS_MENU;
} }
/*-------------------------------------------------------------------*/
void cedit_disp_crash_save_options(struct descriptor_data *d) void cedit_disp_crash_save_options(struct descriptor_data *d)
{ {
get_char_colors(d->character); get_char_colors(d->character);
@ -684,8 +627,6 @@ void cedit_disp_crash_save_options(struct descriptor_data *d)
OLC_MODE(d) = CEDIT_CRASHSAVE_OPTIONS_MENU; OLC_MODE(d) = CEDIT_CRASHSAVE_OPTIONS_MENU;
} }
/*-------------------------------------------------------------------*/
void cedit_disp_room_numbers(struct descriptor_data *d) void cedit_disp_room_numbers(struct descriptor_data *d)
{ {
get_char_colors(d->character); get_char_colors(d->character);
@ -712,9 +653,6 @@ void cedit_disp_room_numbers(struct descriptor_data *d)
OLC_MODE(d) = CEDIT_ROOM_NUMBERS_MENU; OLC_MODE(d) = CEDIT_ROOM_NUMBERS_MENU;
} }
/*-------------------------------------------------------------------*/
void cedit_disp_operation_options(struct descriptor_data *d) void cedit_disp_operation_options(struct descriptor_data *d)
{ {
get_char_colors(d->character); get_char_colors(d->character);
@ -757,9 +695,6 @@ void cedit_disp_operation_options(struct descriptor_data *d)
OLC_MODE(d) = CEDIT_OPERATION_OPTIONS_MENU; OLC_MODE(d) = CEDIT_OPERATION_OPTIONS_MENU;
} }
/*-------------------------------------------------------------------*/
void cedit_disp_autowiz_options(struct descriptor_data *d) void cedit_disp_autowiz_options(struct descriptor_data *d)
{ {
get_char_colors(d->character); get_char_colors(d->character);
@ -778,12 +713,7 @@ void cedit_disp_autowiz_options(struct descriptor_data *d)
OLC_MODE(d) = CEDIT_AUTOWIZ_OPTIONS_MENU; OLC_MODE(d) = CEDIT_AUTOWIZ_OPTIONS_MENU;
} }
/*-------------------------------------------------------------------*/ /* The GARGANTAUN event handler */
/**************************************************************************
The GARGANTAUN event handler
**************************************************************************/
void cedit_parse(struct descriptor_data *d, char *arg) void cedit_parse(struct descriptor_data *d, char *arg)
{ {
char *oldtext = NULL; char *oldtext = NULL;
@ -814,8 +744,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
return; return;
} }
/*-------------------------------------------------------------------*/
case CEDIT_MAIN_MENU: case CEDIT_MAIN_MENU:
switch (*arg) { switch (*arg) {
case 'g': case 'g':
@ -861,9 +789,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_GAME_OPTIONS_MENU: case CEDIT_GAME_OPTIONS_MENU:
switch (*arg) { switch (*arg) {
case 'a': case 'a':
@ -953,7 +878,7 @@ void cedit_parse(struct descriptor_data *d, char *arg)
case 'p': case 'p':
case 'P': case 'P':
TOGGLE_VAR(OLC_CONFIG(d)->play.immort_level_ok); TOGGLE_VAR(OLC_CONFIG(d)->play.no_mort_to_immort);
break; break;
case '1': case '1':
@ -984,8 +909,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_game_play_options(d); cedit_disp_game_play_options(d);
return; return;
/*-------------------------------------------------------------------*/
case CEDIT_CRASHSAVE_OPTIONS_MENU: case CEDIT_CRASHSAVE_OPTIONS_MENU:
switch (*arg) { switch (*arg) {
case 'a': case 'a':
@ -1040,8 +963,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_crash_save_options(d); cedit_disp_crash_save_options(d);
return; return;
/*-------------------------------------------------------------------*/
case CEDIT_ROOM_NUMBERS_MENU: case CEDIT_ROOM_NUMBERS_MENU:
switch (*arg) { switch (*arg) {
case 'a': case 'a':
@ -1089,8 +1010,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_room_numbers(d); cedit_disp_room_numbers(d);
return; return;
/*-------------------------------------------------------------------*/
case CEDIT_OPERATION_OPTIONS_MENU: case CEDIT_OPERATION_OPTIONS_MENU:
switch (*arg) { switch (*arg) {
case 'a': case 'a':
@ -1214,8 +1133,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_operation_options(d); cedit_disp_operation_options(d);
return; return;
/*-------------------------------------------------------------------*/
case CEDIT_AUTOWIZ_OPTIONS_MENU: case CEDIT_AUTOWIZ_OPTIONS_MENU:
switch (*arg) { switch (*arg) {
case 'a': case 'a':
@ -1241,8 +1158,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_autowiz_options(d); cedit_disp_autowiz_options(d);
return; return;
/*-------------------------------------------------------------------*/
case CEDIT_LEVEL_CAN_SHOUT: case CEDIT_LEVEL_CAN_SHOUT:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1254,8 +1169,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_HOLLER_MOVE_COST: case CEDIT_HOLLER_MOVE_COST:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1267,8 +1180,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_TUNNEL_SIZE: case CEDIT_TUNNEL_SIZE:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1280,8 +1191,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_EXP_GAIN: case CEDIT_MAX_EXP_GAIN:
if (*arg) if (*arg)
OLC_CONFIG(d)->play.max_exp_gain = atoi(arg); OLC_CONFIG(d)->play.max_exp_gain = atoi(arg);
@ -1289,8 +1198,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_game_play_options(d); cedit_disp_game_play_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_EXP_LOSS: case CEDIT_MAX_EXP_LOSS:
if (*arg) if (*arg)
OLC_CONFIG(d)->play.max_exp_loss = atoi(arg); OLC_CONFIG(d)->play.max_exp_loss = atoi(arg);
@ -1298,9 +1205,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_game_play_options(d); cedit_disp_game_play_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_NPC_CORPSE_TIME: case CEDIT_MAX_NPC_CORPSE_TIME:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1312,8 +1216,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_PC_CORPSE_TIME: case CEDIT_MAX_PC_CORPSE_TIME:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1325,8 +1227,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_IDLE_VOID: case CEDIT_IDLE_VOID:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1338,8 +1238,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_IDLE_RENT_TIME: case CEDIT_IDLE_RENT_TIME:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1351,8 +1249,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_IDLE_MAX_LEVEL: case CEDIT_IDLE_MAX_LEVEL:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1364,8 +1260,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_OK: case CEDIT_OK:
if (!genolc_checkstring(d, arg)) if (!genolc_checkstring(d, arg))
break; break;
@ -1379,8 +1273,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_game_play_options(d); cedit_disp_game_play_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_NOPERSON: case CEDIT_NOPERSON:
if (!genolc_checkstring(d, arg)) if (!genolc_checkstring(d, arg))
break; break;
@ -1394,8 +1286,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_game_play_options(d); cedit_disp_game_play_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_NOEFFECT: case CEDIT_NOEFFECT:
if (!genolc_checkstring(d, arg)) if (!genolc_checkstring(d, arg))
break; break;
@ -1409,8 +1299,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
cedit_disp_game_play_options(d); cedit_disp_game_play_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_OBJ_SAVE: case CEDIT_MAX_OBJ_SAVE:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1422,8 +1310,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MIN_RENT_COST: case CEDIT_MIN_RENT_COST:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1435,8 +1321,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_AUTOSAVE_TIME: case CEDIT_AUTOSAVE_TIME:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1448,8 +1332,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_CRASH_FILE_TIMEOUT: case CEDIT_CRASH_FILE_TIMEOUT:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1461,8 +1343,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_RENT_FILE_TIMEOUT: case CEDIT_RENT_FILE_TIMEOUT:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1474,8 +1354,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MORTAL_START_ROOM: case CEDIT_MORTAL_START_ROOM:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1491,8 +1369,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_IMMORT_START_ROOM: case CEDIT_IMMORT_START_ROOM:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1508,8 +1384,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_FROZEN_START_ROOM: case CEDIT_FROZEN_START_ROOM:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1525,8 +1399,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_DONATION_ROOM_1: case CEDIT_DONATION_ROOM_1:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1542,8 +1414,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_DONATION_ROOM_2: case CEDIT_DONATION_ROOM_2:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1559,8 +1429,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_DONATION_ROOM_3: case CEDIT_DONATION_ROOM_3:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1576,15 +1444,11 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_DFLT_PORT: case CEDIT_DFLT_PORT:
OLC_CONFIG(d)->operation.DFLT_PORT = atoi(arg); OLC_CONFIG(d)->operation.DFLT_PORT = atoi(arg);
cedit_disp_operation_options(d); cedit_disp_operation_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_DFLT_IP: case CEDIT_DFLT_IP:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1596,8 +1460,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_DFLT_DIR: case CEDIT_DFLT_DIR:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1609,8 +1471,6 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_LOGNAME: case CEDIT_LOGNAME:
if (!*arg) { if (!*arg) {
write_to_output(d, write_to_output(d,
@ -1622,29 +1482,21 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_PLAYING: case CEDIT_MAX_PLAYING:
OLC_CONFIG(d)->operation.max_playing = atoi(arg); OLC_CONFIG(d)->operation.max_playing = atoi(arg);
cedit_disp_operation_options(d); cedit_disp_operation_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_FILESIZE: case CEDIT_MAX_FILESIZE:
OLC_CONFIG(d)->operation.max_filesize = atoi(arg); OLC_CONFIG(d)->operation.max_filesize = atoi(arg);
cedit_disp_operation_options(d); cedit_disp_operation_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MAX_BAD_PWS: case CEDIT_MAX_BAD_PWS:
OLC_CONFIG(d)->operation.max_bad_pws = atoi(arg); OLC_CONFIG(d)->operation.max_bad_pws = atoi(arg);
cedit_disp_operation_options(d); cedit_disp_operation_options(d);
break; break;
/*-------------------------------------------------------------------*/
case CEDIT_MIN_WIZLIST_LEV: case CEDIT_MIN_WIZLIST_LEV:
if (atoi(arg) > LVL_IMPL) { if (atoi(arg) > LVL_IMPL) {
write_to_output(d, write_to_output(d,
@ -1656,22 +1508,14 @@ void cedit_parse(struct descriptor_data *d, char *arg)
} }
break; break;
/*-------------------------------------------------------------------*/ default: /* We should never get here, but just in case... */
default:
/*
* We should never get here, but just in case...
*/
cleanup_olc(d, CLEANUP_CONFIG); cleanup_olc(d, CLEANUP_CONFIG);
mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: cedit_parse(): Reached default case!"); mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: cedit_parse(): Reached default case!");
write_to_output(d, "Oops...\r\n"); write_to_output(d, "Oops...\r\n");
break; break;
} }
} } /* End of parse_cedit() */
/*
* End of parse_cedit()
*/
void reassign_rooms(void) void reassign_rooms(void)
{ {
void assign_rooms(void); void assign_rooms(void);

View file

@ -1219,6 +1219,12 @@ char *make_prompt(struct descriptor_data *d)
len += count; len += count;
} }
if (PRF_FLAGGED(d->character, PRF_AFK) && len < sizeof(prompt)) {
count = snprintf(prompt + len, sizeof(prompt) - len, "AFK ");
if (count >= 0)
len += count;
}
if (len < sizeof(prompt)) if (len < sizeof(prompt))
strncat(prompt, "> ", sizeof(prompt) - len - 1); /* strncat: OK */ strncat(prompt, "> ", sizeof(prompt) - len - 1); /* strncat: OK */
} else if (STATE(d) == CON_PLAYING && IS_NPC(d->character)) } else if (STATE(d) == CON_PLAYING && IS_NPC(d->character))

View file

@ -13,37 +13,26 @@
#include "conf.h" #include "conf.h"
#include "sysdep.h" #include "sysdep.h"
#include "structs.h" #include "structs.h"
#include "interpreter.h" /* alias_data definition for structs.h */ #include "interpreter.h" /* alias_data definition for structs.h */
/* /* Update: The following constants and variables are now the default values
* Update: The following constants and variables are now the default values
* for backwards compatibility with the new cedit game configurator. If you * for backwards compatibility with the new cedit game configurator. If you
* would not like to use the cedit command, you can change the values in * would not like to use the cedit command, you can change the values in
* this file instead. - Mythran * this file instead. - Mythran */
*/
/* /* Below are several constants which you can change to alter certain aspects
* Below are several constants which you can change to alter certain aspects
* of the way CircleMUD acts. Since this is a .c file, all you have to do * of the way CircleMUD acts. Since this is a .c file, all you have to do
* to change one of the constants (assuming you keep your object files around) * to change one of the constants (assuming you keep your object files around)
* is change the constant in this file and type 'make'. Make will recompile * is change the constant in this file and type 'make'. Make will recompile
* this file and relink; you don't have to wait for the whole thing to * this file and relink; you don't have to wait for the whole thing to recompile
* recompile as you do if you change a header file. * as you do if you change a header file. I realize that it would be slightly
* * more efficient to have lots of #defines strewn about, so that, for example,
* I realize that it would be slightly more efficient to have lots of * the autowiz code isn't compiled at all if you don't want to use autowiz.
* #defines strewn about, so that, for example, the autowiz code isn't * However, the actual code for the various options is quite small, as is the
* compiled at all if you don't want to use autowiz. However, the actual * computational time in checking the option you've selected at run-time, so
* code for the various options is quite small, as is the computational time * I've decided the convenience of having all your options in this one file
* in checking the option you've selected at run-time, so I've decided the * outweighs the efficency of doing it the other way. */
* convenience of having all your options in this one file outweighs the
* efficency of doing it the other way.
*
*/
/****************************************************************************/
/****************************************************************************/
/* GAME PLAY OPTIONS */ /* GAME PLAY OPTIONS */
#if !defined(NO) #if !defined(NO)
@ -62,34 +51,31 @@
#define TRUE (!FALSE) #define TRUE (!FALSE)
#endif #endif
/* /* pk_allowed sets the tone of the entire game. If pk_allowed is set to NO,
* pk_allowed sets the tone of the entire game. If pk_allowed is set to * then players will not be allowed to kill, summon, charm, or sleep other
* NO, then players will not be allowed to kill, summon, charm, or sleep * players, as well as a variety of other "asshole player" protections. However,
* other players, as well as a variety of other "asshole player" protections. * if you decide you want to have an all-out knock-down drag-out PK Mud, just
* However, if you decide you want to have an all-out knock-down drag-out * set pk_allowed to YES - and anything goes. */
* PK Mud, just set pk_allowed to YES - and anything goes.
*/
int pk_allowed = NO; int pk_allowed = NO;
/* is playerthieving allowed? */ /* Is playerthieving allowed? */
int pt_allowed = NO; int pt_allowed = NO;
/* minimum level a player must be to shout/holler/gossip/auction */ /* Minimum level a player must be to shout/holler/gossip/auction. */
int level_can_shout = 1; int level_can_shout = 1;
/* number of movement points it costs to holler */ /* Number of movement points it costs to holler. */
int holler_move_cost = 20; int holler_move_cost = 20;
/* how many people can get into a tunnel? The default is two, but there /* How many people can get into a tunnel? The default is two, but there is
* is also an alternate message in the case of one person being allowed. * also an alternate message in the case of one person being allowed. */
*/
int tunnel_size = 2; int tunnel_size = 2;
/* exp change limits */ /* Exp change limits. */
int max_exp_gain = 100000; /* max gainable per kill */ int max_exp_gain = 100000; /* max gainable per kill */
int max_exp_loss = 500000; /* max losable per death */ int max_exp_loss = 500000; /* max losable per death */
/* number of tics (usually 75 seconds) before PC/NPC corpses decompose */ /* Number of tics (usually 75 seconds) before PC/NPC corpses decompose. */
int max_npc_corpse_time = 5; int max_npc_corpse_time = 5;
int max_pc_corpse_time = 10; int max_pc_corpse_time = 10;
@ -100,16 +86,14 @@ int idle_rent_time = 48;
/* This level and up is immune to idling, LVL_IMPL+1 will disable it. */ /* This level and up is immune to idling, LVL_IMPL+1 will disable it. */
int idle_max_level = LVL_GOD; int idle_max_level = LVL_GOD;
/* should items in death traps automatically be junked? */ /* Should items in death traps automatically be junked? */
int dts_are_dumps = YES; int dts_are_dumps = YES;
/* /* Whether you want items that immortals load to appear on the ground or not.
* Whether you want items that immortals load to appear on the ground or not.
* It is most likely best to set this to 'YES' so that something else doesn't * It is most likely best to set this to 'YES' so that something else doesn't
* grab the item before the immortal does, but that also means people will be * grab the item before the immortal does, but that also means people will be
* able to carry around things like boards. That's not necessarily a bad * able to carry around things like boards. That's not necessarily a bad thing,
* thing, but this will be left at a default of 'NO' for historic reasons. * but this will be left at a default of 'NO' for historic reasons. */
*/
int load_into_inventory = YES; int load_into_inventory = YES;
/* "okay" etc. */ /* "okay" etc. */
@ -117,92 +101,67 @@ const char *OK = "Okay.\r\n";
const char *NOPERSON = "No-one by that name here.\r\n"; const char *NOPERSON = "No-one by that name here.\r\n";
const char *NOEFFECT = "Nothing seems to happen.\r\n"; const char *NOEFFECT = "Nothing seems to happen.\r\n";
/* /* You can define or not define TRACK_THOUGH_DOORS, depending on whether or not
* You can define or not define TRACK_THOUGH_DOORS, depending on whether * you want track to find paths which lead through closed or hidden doors. A
* or not you want track to find paths which lead through closed or * setting of 'NO' means to not go through the doors while 'YES' will pass
* hidden doors. A setting of 'NO' means to not go through the doors * through doors to find the target. */
* while 'YES' will pass through doors to find the target.
*/
int track_through_doors = YES; int track_through_doors = YES;
/* /* If you do not want mortals to level up to immortal once they have enough
* If you want mortals to level up to immortal once they have enough * experience, then set this to YES. Subtracting this from LVL_IMMORT gives
* experience, then set this to NO. This is the stock behaviour for * the top level that people can advance to in gain_exp() in limits.c */
* CircleMUD because it was the stock DikuMud behaviour. Subtracting int no_mort_to_immort = YES;
* this from LVL_IMMORT gives the top level that people can advance to
* in gain_exp() in limits.c
* For example, to stop people from advancing to LVL_IMMORT, simply set
* immort_level_ok to YES.
*/
int immort_level_ok = NO;
/****************************************************************************/
/****************************************************************************/
/* RENT/CRASHSAVE OPTIONS */ /* RENT/CRASHSAVE OPTIONS */
/* Should the MUD allow you to 'rent' for free? (i.e. if you just quit, your
/* * objects are saved at no cost). */
* Should the MUD allow you to 'rent' for free? (i.e. if you just quit,
* your objects are saved at no cost, as in Merc-type MUDs.)
*/
int free_rent = YES; int free_rent = YES;
/* maximum number of items players are allowed to rent */ /* Maximum number of items players are allowed to rent. */
int max_obj_save = 30; int max_obj_save = 30;
/* receptionist's surcharge on top of item costs */ /* Receptionist's surcharge on top of item costs. */
int min_rent_cost = 100; int min_rent_cost = 100;
/* /* Should the game automatically save people? (i.e., save player data every 4
* Should the game automatically save people? (i.e., save player data * kills (on average), and Crash-save as defined below. If auto_save is YES,
* every 4 kills (on average), and Crash-save as defined below. This * then the 'save' command will be disabled to prevent item duplication via
* option has an added meaning past bpl13. If auto_save is YES, then * game crashes. */
* the 'save' command will be disabled to prevent item duplication via
* game crashes.
*/
int auto_save = YES; int auto_save = YES;
/* /* if auto_save (above) is yes, how often (in minutes) should the MUD Crash-save
* if auto_save (above) is yes, how often (in minutes) should the MUD * people's objects? Also, this number indicates how often the MUD will Crash-
* Crash-save people's objects? Also, this number indicates how often * save players' houses. */
* the MUD will Crash-save players' houses.
*/
int autosave_time = 5; int autosave_time = 5;
/* Lifetime of crashfiles and forced-rent (idlesave) files in days */ /* Lifetime of crashfiles and forced-rent (idlesave) files in days. */
int crash_file_timeout = 10; int crash_file_timeout = 10;
/* Lifetime of normal rent files in days */ /* Lifetime of normal rent files in days. */
int rent_file_timeout = 30; int rent_file_timeout = 30;
/* Do you want to automatically wipe players who've been gone too long? */ /* Do you want to automatically wipe players who've been gone too long? */
int auto_pwipe = NO; int auto_pwipe = NO;
/* Autowipe deletion criteria /* Autowipe deletion criteria. This struct holds information used to determine
This struct holds information used to determine which players to wipe * which players to wipe when the mud boots. The levels must be in ascending
then the mud boots. The levels must be in ascending order, with a * order, with a descending level marking the end of the array. A level -1
descending level marking the end of the array. A level -1 entry in the * entry in the beginning is the case for players with the PLR_DELETED flag.
beginning is the case for players with the PLR_DELETED flag. The * The values below match the stock purgeplay.c criteria.
values below match the stock purgeplay.c criteria.
Detailed explanation by array element: Detailed explanation by array element:
* Element 0, level -1, days 0: Players with PLR_DELETED flag are always wiped * Element 0, level -1, days 0: Players with PLR_DELETED flag are always wiped
* Element 1, level 0, days 0: Players at level 0 have created a * Element 1, level 0, days 0: Players at level 0 have created a character,
character, but have never actually entered the game, so always but have never actually entered the game, so always wipe them.
wipe them. * Element 2, level 1, days 4: Players at level 1 are wiped if they haven't
* Element 2, level 1, days 4: Players at level 1 are wiped if they logged on in the past 4 days.
haven't logged on in the past 4 days. * Element 3, level 4, days 7: Players level 2 through 4 are wiped if they
* Element 3, level 4, days 7: Players level 2 through 4 are wiped if haven't logged on in the past 7 days.
they haven't logged on in the past 7 days.
* Element 4, level 10, days 30: Players level 5-10 get 30 days. * Element 4, level 10, days 30: Players level 5-10 get 30 days.
* Element 5, level LVL_IMMORT - 1, days 60: All other mortals get * Element 5, level LVL_IMMORT - 1, days 60: All other mortals get 60 days.
60 days.
* Element 6, level LVL_IMPL, days 90: Immortals get 90 days. * Element 6, level LVL_IMPL, days 90: Immortals get 90 days.
* Element 7: Because -2 is less than LVL_IMPL, this is assumed to * Element 7: Because -2 is less than LVL_IMPL, this is assumed to be the end
be the end of the criteria. The days entry is not used in this of the criteria. The days entry is not used in this case. */
case.
*/
struct pclean_criteria_data pclean_criteria[] = { struct pclean_criteria_data pclean_criteria[] = {
/* LEVEL DAYS */ /* LEVEL DAYS */
{ 0 ,0 }, /* level 0 */ { 0 ,0 }, /* level 0 */
@ -214,126 +173,89 @@ struct pclean_criteria_data pclean_criteria[] = {
{ -1 ,0 } /* no more level checks */ { -1 ,0 } /* no more level checks */
}; };
/* Do you want players who self-delete to be wiped immediately with no /* Do you want players who self-delete to be wiped immediately with no backup? */
backup?
*/
int selfdelete_fastwipe = YES; int selfdelete_fastwipe = YES;
/****************************************************************************/
/****************************************************************************/
/* ROOM NUMBERS */ /* ROOM NUMBERS */
/* Virtual number of room that mortals should enter at. */
/* virtual number of room that mortals should enter at */
room_vnum mortal_start_room = 3001; room_vnum mortal_start_room = 3001;
/* virtual number of room that immorts should enter at by default */ /* Virtual number of room that immorts should enter at by default. */
room_vnum immort_start_room = 1204; room_vnum immort_start_room = 1204;
/* virtual number of room that frozen players should enter at */ /* Virtual number of room that frozen players should enter at. */
room_vnum frozen_start_room = 1202; room_vnum frozen_start_room = 1202;
/* /* Virtual numbers of donation rooms. note: you must change code in do_drop of
* virtual numbers of donation rooms. note: you must change code in * act.item.c if you change the number of non-NOWHERE donation rooms. */
* do_drop of act.item.c if you change the number of non-NOWHERE
* donation rooms.
*/
room_vnum donation_room_1 = 3063; room_vnum donation_room_1 = 3063;
room_vnum donation_room_2 = 5510; room_vnum donation_room_2 = 5510;
room_vnum donation_room_3 = 235; room_vnum donation_room_3 = 235;
/****************************************************************************/
/****************************************************************************/
/* GAME OPERATION OPTIONS */ /* GAME OPERATION OPTIONS */
/* This is the default port on which the game should run if no port is given on
/* * the command-line. NOTE WELL: If you're using the 'autorun' script, the port
* This is the default port on which the game should run if no port is * number there will override this setting. Change the PORT= line in autorun
* given on the command-line. NOTE WELL: If you're using the * instead of (or in addition to) changing this. */
* 'autorun' script, the port number there will override this setting.
* Change the PORT= line in autorun instead of (or in addition to)
* changing this.
*/
ush_int DFLT_PORT = 4000; ush_int DFLT_PORT = 4000;
/* /* IP address to which the MUD should bind. This is only useful if you're
* IP address to which the MUD should bind. This is only useful if * running Circle on a host that host more than one IP interface, and you only
* you're running Circle on a host that host more than one IP interface, * want to bind to *one* of them instead of all of them. Setting this to NULL
* and you only want to bind to *one* of them instead of all of them. * (the default) causes Circle to bind to all interfaces on the host.
* Setting this to NULL (the default) causes Circle to bind to all * Otherwise, specify a numeric IP address in dotted quad format, and Circle
* interfaces on the host. Otherwise, specify a numeric IP address in * will only bind to that IP address. (Of course, that IP address must be one
* dotted quad format, and Circle will only bind to that IP address. (Of * of your host's interfaces, or it won't work.) */
* course, that IP address must be one of your host's interfaces, or it
* won't work.)
*/
const char *DFLT_IP = NULL; /* bind to all interfaces */ const char *DFLT_IP = NULL; /* bind to all interfaces */
/* const char *DFLT_IP = "192.168.1.1"; -- bind only to one interface */ /* const char *DFLT_IP = "192.168.1.1"; -- bind only to one interface */
/* default directory to use as data directory */ /* Default directory to use as data directory. */
const char *DFLT_DIR = "lib"; const char *DFLT_DIR = "lib";
/* /* What file to log messages to (ex: "log/syslog"). Setting this to NULL means
* What file to log messages to (ex: "log/syslog"). Setting this to NULL * you want to log to stderr, which was the default in earlier versions of
* means you want to log to stderr, which was the default in earlier * Circle. If you specify a file, you don't get messages to the screen. (Hint:
* versions of Circle. If you specify a file, you don't get messages to * Try 'tail -f' if you have a UNIX machine.) */
* the screen. (Hint: Try 'tail -f' if you have a UNIX machine.)
*/
const char *LOGNAME = NULL; const char *LOGNAME = NULL;
/* const char *LOGNAME = "log/syslog"; -- useful for Windows users */ /* const char *LOGNAME = "log/syslog"; -- useful for Windows users */
/* maximum number of players allowed before game starts to turn people away */ /* Maximum number of players allowed before game starts to turn people away. */
int max_playing = 300; int max_playing = 300;
/* maximum size of bug, typo and idea files in bytes (to prevent bombing) */ /* Maximum size of bug, typo and idea files in bytes (to prevent bombing). */
int max_filesize = 50000; int max_filesize = 50000;
/* maximum number of password attempts before disconnection */ /* Maximum number of password attempts before disconnection. */
int max_bad_pws = 3; int max_bad_pws = 3;
/* /* Rationale for enabling this, as explained by naved@bird.taponline.com.
* Rationale for enabling this, as explained by naved@bird.taponline.com.
*
* Usually, when you select ban a site, it is because one or two people are * Usually, when you select ban a site, it is because one or two people are
* causing troubles while there are still many people from that site who you * causing troubles while there are still many people from that site who you
* want to still log on. Right now if I want to add a new select ban, I need * want to still log on. Right now if I want to add a new select ban, I need
* to first add the ban, then SITEOK all the players from that site except for * to first add the ban, then SITEOK all the players from that site except for
* the one or two who I don't want logging on. Wouldn't it be more convenient * the one or two who I don't want logging on. Wouldn't it be more convenient
* to just have to remove the SITEOK flags from those people I want to ban * to just have to remove the SITEOK flags from those people I want to ban
* rather than what is currently done? * rather than what is currently done? */
*/
int siteok_everyone = TRUE; int siteok_everyone = TRUE;
/* /* Some nameservers are very slow and cause the game to lag terribly every time
* Some nameservers are very slow and cause the game to lag terribly every * someone logs in. The lag is caused by the gethostbyaddr() function which is
* time someone logs in. The lag is caused by the gethostbyaddr() function * responsible for resolving numeric IP addresses to alphabetic names.
* which is responsible for resolving numeric IP addresses to alphabetic names.
* Sometimes, nameservers can be so slow that the incredible lag caused by * Sometimes, nameservers can be so slow that the incredible lag caused by
* gethostbyaddr() isn't worth the luxury of having names instead of numbers * gethostbyaddr() isn't worth the luxury of having names instead of numbers
* for players' sitenames. * for players' sitenames. If your nameserver is fast, set the variable below
* * to NO. If your nameserver is slow, of it you would simply prefer to have
* If your nameserver is fast, set the variable below to NO. If your * numbers instead of names for some other reason, set the variable to YES.
* nameserver is slow, of it you would simply prefer to have numbers * You can experiment with the setting of nameserver_is_slow on-line using the
* instead of names for some other reason, set the variable to YES. * SLOWNS command from within the MUD. */
*
* You can experiment with the setting of nameserver_is_slow on-line using
* the SLOWNS command from within the MUD.
*/
int nameserver_is_slow = NO; int nameserver_is_slow = NO;
/* /* Will changes save automaticaly in OLC? */
* Will changes save automaticaly in OLC ?
*/
int auto_save_olc = YES; int auto_save_olc = YES;
/* /* if you wish to enable Aedit, set this to YES. This will make the mud look
* if you wish to enable Aedit, set this to YES * for a file called socials.new, which is in a different format than the
* This will make the mud look for a file called socials.new, * stock socials file. */
* which is in a different format than the stock socials file.
*/
int use_new_socials = YES; int use_new_socials = YES;
const char *MENU = const char *MENU =
@ -348,8 +270,6 @@ const char *MENU =
"\r\n" "\r\n"
" Make your choice: "; " Make your choice: ";
const char *WELC_MESSG = const char *WELC_MESSG =
"\r\n" "\r\n"
"Welcome to tbaMUD! May your visit here be... Enlightening" "Welcome to tbaMUD! May your visit here be... Enlightening"
@ -360,19 +280,12 @@ const char *START_MESSG =
"gain experience, find weapons and equipment, and much more -- while\r\n" "gain experience, find weapons and equipment, and much more -- while\r\n"
"meeting people from around the world!\r\n"; "meeting people from around the world!\r\n";
/****************************************************************************/
/****************************************************************************/
/* AUTOWIZ OPTIONS */ /* AUTOWIZ OPTIONS */
/* Should the game automatically create a new wizlist/immlist every time someone
/* * immorts, or is promoted to a higher (or lower) god level? NOTE: this only
* Should the game automatically create a new wizlist/immlist every time * works under UNIX systems. */
* someone immorts, or is promoted to a higher (or lower) god level?
* NOTE: this only works under UNIX systems.
*/
int use_autowiz = YES; int use_autowiz = YES;
/* If yes, what is the lowest level which should be on the wizlist? (All /* If yes, what is the lowest level which should be on the wizlist? (All immort
immort levels below the level you specify will go on the immlist instead.) */ * levels below the level you specify will go on the immlist instead.) */
int min_wizlist_lev = LVL_GOD; int min_wizlist_lev = LVL_GOD;

398
src/db.c
View file

@ -12,8 +12,6 @@
#include "conf.h" #include "conf.h"
#include "sysdep.h" #include "sysdep.h"
#include "structs.h" #include "structs.h"
#include "utils.h" #include "utils.h"
#include "db.h" #include "db.h"
@ -28,22 +26,18 @@
#include "dg_scripts.h" #include "dg_scripts.h"
#include "dg_event.h" #include "dg_event.h"
/************************************************************************** /* declarations of most of the 'global' variables */
* declarations of most of the 'global' variables *
**************************************************************************/
struct config_data config_info; /* Game configuration list. */ struct config_data config_info; /* Game configuration list. */
struct room_data *world = NULL; /* array of rooms */ struct room_data *world = NULL; /* array of rooms */
room_rnum top_of_world = 0; /* ref to top element of world */ room_rnum top_of_world = 0; /* ref to top element of world */
struct char_data *character_list = NULL; /* global linked list of struct char_data *character_list = NULL; /* global linked list of chars */
* chars */
struct index_data *mob_index; /* index table for mobile file */ struct index_data *mob_index; /* index table for mobile file */
struct char_data *mob_proto; /* prototypes for mobs */ struct char_data *mob_proto; /* prototypes for mobs */
mob_rnum top_of_mobt = 0; /* top of mobile index table */ mob_rnum top_of_mobt = 0; /* top of mobile index table */
struct obj_data *object_list = NULL; /* global linked list of objs */ struct obj_data *object_list = NULL; /* global linked list of objs */
struct index_data *obj_index; /* index table for object file */ struct index_data *obj_index; /* index table for object file */
struct obj_data *obj_proto; /* prototypes for objs */ struct obj_data *obj_proto; /* prototypes for objs */
obj_rnum top_of_objt = 0; /* top of object index table */ obj_rnum top_of_objt = 0; /* top of object index table */
@ -166,18 +160,14 @@ extern struct descriptor_data *descriptor_list;
extern const char *unused_spellname; /* spell_parser.c */ extern const char *unused_spellname; /* spell_parser.c */
extern int no_specials; extern int no_specials;
extern int scheck; extern int scheck;
extern struct player_index_element *player_table; extern struct player_index_element *player_table;
int top_of_p_table; extern int top_of_p_table;
long top_idnum; extern long top_idnum;
/* external ASCII Player Files vars */ /* external ASCII Player Files vars */
extern int auto_pwipe; extern int auto_pwipe;
/************************************************************************* /* routines for booting the system */
* routines for booting the system *
*************************************************************************/
char *fread_action(FILE *fl, int nr) char *fread_action(FILE *fl, int nr)
{ {
char buf[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH];
@ -185,11 +175,9 @@ char *fread_action(FILE *fl, int nr)
fgets(buf, MAX_STRING_LENGTH, fl); fgets(buf, MAX_STRING_LENGTH, fl);
if (feof(fl)) { if (feof(fl)) {
log("SYSERR: fread_action: unexpected EOF near action #%d", nr); log("SYSERR: fread_action: unexpected EOF near action #%d", nr);
/* SYSERR_DESC: /* SYSERR_DESC: fread_action() will fail if it discovers an end of file
* fread_action() will fail if it discovers an end of file marker * marker before it is able to read in the expected string. This can be
* before it is able to read in the expected string. This can be * caused by a truncated socials file. */
* caused by a truncated socials file.
*/
exit(1); exit(1);
} }
if (*buf == '#') if (*buf == '#')
@ -209,11 +197,9 @@ void boot_social_messages(void)
/* open social file */ /* open social file */
if (!(fl = fopen(SOCMESS_FILE_NEW, "r"))) { if (!(fl = fopen(SOCMESS_FILE_NEW, "r"))) {
log("SYSERR: can't open socials file '%s': %s", SOCMESS_FILE_NEW, strerror(errno)); log("SYSERR: can't open socials file '%s': %s", SOCMESS_FILE_NEW, strerror(errno));
/* SYSERR_DESC: /* SYSERR_DESC: This error, from boot_social_messages(), occurs when the
* This error, from boot_social_messages(), occurs when the server * server fails to open the file containing the social messages. The
* fails to open the file containing the social messages. The error * error at the end will indicate the reason why. */
* at the end will indicate the reason why.
*/
exit(1); exit(1);
} }
/* count socials */ /* count socials */
@ -227,11 +213,9 @@ void boot_social_messages(void)
/* open social file */ /* open social file */
if (!(fl = fopen(SOCMESS_FILE, "r"))) { if (!(fl = fopen(SOCMESS_FILE, "r"))) {
log("SYSERR: can't open socials file '%s': %s", SOCMESS_FILE, strerror(errno)); log("SYSERR: can't open socials file '%s': %s", SOCMESS_FILE, strerror(errno));
/* SYSERR_DESC: /* SYSERR_DESC: This error, from boot_social_messages(), occurs when the
* This error, from boot_social_messages(), occurs when the server * server fails to open the file containing the social messages. The
* fails to open the file containing the social messages. The error * error at the end will indicate the reason why. */
* at the end will indicate the reason why.
*/
exit(1); exit(1);
} }
/* count socials */ /* count socials */
@ -255,14 +239,12 @@ void boot_social_messages(void)
if (fscanf(fl, " %s %d %d %d %d \n", if (fscanf(fl, " %s %d %d %d %d \n",
sorted, &hide, &min_char_pos, &min_pos, &min_lvl) != 5) { sorted, &hide, &min_char_pos, &min_pos, &min_lvl) != 5) {
log("SYSERR: format error in social file near social '%s'", next_soc); log("SYSERR: format error in social file near social '%s'", next_soc);
/* SYSERR_DESC: /* SYSERR_DESC: From boot_social_messages(), this error is output when
* From boot_social_messages(), this error is output when the * the server is expecting to find the remainder of the first line of the
* server is expecting to find the remainder of the first line of the * social ('hide' and 'minimum position'). These must follow the name of
* social ('hide' and 'minimum position'). These must follow the * the social with a single space such as: 'accuse 0 5\n'. This error
* name of the social with a single space such as: 'accuse 0 5\n'. * often occurs when one of the numbers is missing or the social name has
* This error often occurs when one of the numbers is missing or the * a space in it (i.e., 'bend over'). */
* social name has a space in it (i.e., 'bend over').
*/
exit(1); exit(1);
} }
curr_soc++; curr_soc++;
@ -275,14 +257,12 @@ void boot_social_messages(void)
} else { /* old style */ } else { /* old style */
if (fscanf(fl, " %d %d \n", &hide, &min_pos) != 2) { if (fscanf(fl, " %d %d \n", &hide, &min_pos) != 2) {
log("SYSERR: format error in social file near social '%s'", next_soc); log("SYSERR: format error in social file near social '%s'", next_soc);
/* SYSERR_DESC: /* SYSERR_DESC: From boot_social_messages(), this error is output when the
* From boot_social_messages(), this error is output when the * server is expecting to find the remainder of the first line of the
* server is expecting to find the remainder of the first line of the * social ('hide' and 'minimum position'). These must follow the name of
* social ('hide' and 'minimum position'). These must follow the * the social with a single space such as: 'accuse 0 5\n'. This error
* name of the social with a single space such as: 'accuse 0 5\n'. * often occurs when one of the numbers is missing or the social name has
* This error often occurs when one of the numbers is missing or the * a space in it (i.e., 'bend over'). */
* social name has a space in it (i.e., 'bend over').
*/
exit(1); exit(1);
} }
curr_soc++; curr_soc++;
@ -297,13 +277,11 @@ void boot_social_messages(void)
#ifdef CIRCLE_ACORN #ifdef CIRCLE_ACORN
if (fgetc(fl) != '\n') if (fgetc(fl) != '\n')
log("SYSERR: Acorn bug workaround failed."); log("SYSERR: Acorn bug workaround failed.");
/* SYSERR_DESC: /* SYSERR_DESC: The only time that this error should ever arise is if you
* The only time that this error should ever arise is if you are running * are running your MUD on the Acorn platform. The error arises when the
* your CircleMUD on the Acorn platform. The error arises when the * server cannot properly read a '\n' out of the file at the end of the
* server cannot properly read a '\n' out of the file at the end of the * first line of the social (that with 'hide' and 'min position'). This
* first line of the social (that with 'hide' and 'min position'). This * is in boot_social_messages(). */
* is in boot_social_messages().
*/
#endif #endif
soc_mess_list[curr_soc].char_no_arg = fread_action(fl, nr); soc_mess_list[curr_soc].char_no_arg = fread_action(fl, nr);
@ -343,7 +321,6 @@ void reboot_wizlists(void)
file_to_string_alloc(IMMLIST_FILE, &immlist); file_to_string_alloc(IMMLIST_FILE, &immlist);
} }
/* Wipe out all the loaded text files, for shutting down. */ /* Wipe out all the loaded text files, for shutting down. */
void free_text_files(void) void free_text_files(void)
{ {
@ -360,13 +337,9 @@ void free_text_files(void)
} }
} }
/* Too bad it doesn't check the return values to let the user know about -1
/* * values. This will result in an 'Okay.' to a 'reload' command even when the
* Too bad it doesn't check the return values to let the user * string was not replaced. To fix later. */
* know about -1 values. This will result in an 'Okay.' to a
* 'reload' command even when the string was not replaced.
* To fix later, if desired. -gg 6/24/99
*/
ACMD(do_reboot) ACMD(do_reboot)
{ {
char arg[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH];
@ -458,7 +431,6 @@ ACMD(do_reboot)
send_to_char(ch, "%s", CONFIG_OK); send_to_char(ch, "%s", CONFIG_OK);
} }
void boot_world(void) void boot_world(void)
{ {
log("Loading zone table."); log("Loading zone table.");
@ -491,7 +463,6 @@ void boot_world(void)
} }
} }
void free_extra_descriptions(struct extra_descr_data *edesc) void free_extra_descriptions(struct extra_descr_data *edesc)
{ {
struct extra_descr_data *enext; struct extra_descr_data *enext;
@ -505,7 +476,6 @@ void free_extra_descriptions(struct extra_descr_data *edesc)
} }
} }
/* Free the world, in a memory allocation sense. */ /* Free the world, in a memory allocation sense. */
void destroy_db(void) void destroy_db(void)
{ {
@ -601,7 +571,6 @@ void destroy_db(void)
destroy_shops(); destroy_shops();
/* Zones */ /* Zones */
#define THIS_CMD zone_table[cnt].cmd[itr] #define THIS_CMD zone_table[cnt].cmd[itr]
for (cnt = 0; cnt <= top_of_zone_table; cnt++) { for (cnt = 0; cnt <= top_of_zone_table; cnt++) {
@ -663,10 +632,8 @@ void destroy_db(void)
/* context sensitive help system */ /* context sensitive help system */
free_context_help(); free_context_help();
} }
/* body of the booting system */ /* body of the booting system */
void boot_db(void) void boot_db(void)
{ {
@ -793,7 +760,6 @@ void boot_db(void)
log("Boot db -- DONE."); log("Boot db -- DONE.");
} }
/* reset the time in the game from file */ /* reset the time in the game from file */
void reset_time(void) void reset_time(void)
{ {
@ -844,7 +810,6 @@ time_info = *mud_time_passed(time(0), beginning_of_time);
weather_info.sky = SKY_CLOUDLESS; weather_info.sky = SKY_CLOUDLESS;
} }
/* Write the time in 'when' to the MUD-time file. */ /* Write the time in 'when' to the MUD-time file. */
void save_mud_time(struct time_info_data *when) void save_mud_time(struct time_info_data *when)
{ {
@ -858,11 +823,8 @@ void save_mud_time(struct time_info_data *when)
} }
} }
/* /* Thanks to Andrey (andrey@alex-ua.com) for this bit of code, although I did
* Thanks to Andrey (andrey@alex-ua.com) for this bit of code, although I * add the 'goto' and changed some "while()" into "do { } while()". -gg */
* did add the 'goto' and changed some "while()" into "do { } while()".
* -gg 6/24/98 (technically 6/25/98, but I care not.)
*/
int count_alias_records(FILE *fl) int count_alias_records(FILE *fl)
{ {
char key[READ_SIZE], next_key[READ_SIZE]; char key[READ_SIZE], next_key[READ_SIZE];
@ -916,8 +878,6 @@ int count_hash_records(FILE *fl)
return (count); return (count);
} }
void index_boot(int mode) void index_boot(int mode)
{ {
const char *index_filename, *prefix = NULL; /* NULL or egcs 1.1 complains */ const char *index_filename, *prefix = NULL; /* NULL or egcs 1.1 complains */
@ -994,9 +954,7 @@ void index_boot(int mode)
exit(1); exit(1);
} }
/* /* "bytes" does _not_ include strings or other later malloc'd things. */
* NOTE: "bytes" does _not_ include strings or other later malloc'd things.
*/
switch (mode) { switch (mode) {
case DB_BOOT_TRG: case DB_BOOT_TRG:
CREATE(trig_index, struct index_data *, rec_count); CREATE(trig_index, struct index_data *, rec_count);
@ -1070,7 +1028,6 @@ void index_boot(int mode)
} }
} }
void discrete_load(FILE *fl, int mode, char *filename) void discrete_load(FILE *fl, int mode, char *filename)
{ {
int nr = -1, last; int nr = -1, last;
@ -1080,10 +1037,8 @@ void discrete_load(FILE *fl, int mode, char *filename)
/* modes positions correspond to DB_BOOT_xxx in db.h */ /* modes positions correspond to DB_BOOT_xxx in db.h */
for (;;) { for (;;) {
/* /* We have to do special processing with the obj files because they have no
* we have to do special processing with the obj files because they have * end-of-record marker. */
* no end-of-record marker :(
*/
if (mode != DB_BOOT_OBJ || nr < 0) if (mode != DB_BOOT_OBJ || nr < 0)
if (!get_line(fl, line)) { if (!get_line(fl, line)) {
if (nr == -1) { if (nr == -1) {
@ -1162,7 +1117,6 @@ bitvector_t asciiflag_conv(char *flag)
return (flags); return (flags);
} }
/* load the rooms */ /* load the rooms */
void parse_room(FILE *fl, int virtual_nr) void parse_room(FILE *fl, int virtual_nr)
{ {
@ -1233,10 +1187,8 @@ void parse_room(FILE *fl, int virtual_nr)
CREATE(new_descr, struct extra_descr_data, 1); CREATE(new_descr, struct extra_descr_data, 1);
new_descr->keyword = fread_string(fl, buf2); new_descr->keyword = fread_string(fl, buf2);
new_descr->description = fread_string(fl, buf2); new_descr->description = fread_string(fl, buf2);
/* fix for crashes in the editor when formatting /* Fix for crashes in the editor when formatting. E-descs are assumed to
* - e-descs are assumed to end with a \r\n * end with a \r\n. -Welcor */
* -- Welcor 09/03
*/
{ {
char *end = strchr(new_descr->description, '\0'); char *end = strchr(new_descr->description, '\0');
if (end > new_descr->description && *(end-1) != '\n') { if (end > new_descr->description && *(end-1) != '\n') {
@ -1267,8 +1219,6 @@ void parse_room(FILE *fl, int virtual_nr)
} }
} }
/* read direction data */ /* read direction data */
void setup_dir(FILE *fl, int room, int dir) void setup_dir(FILE *fl, int room, int dir)
{ {
@ -1300,7 +1250,6 @@ void setup_dir(FILE *fl, int room, int dir)
world[room].dir_option[dir]->to_room = ((t[2] == -1 || t[2] == 0) ? NOWHERE : t[2]); world[room].dir_option[dir]->to_room = ((t[2] == -1 || t[2] == 0) ? NOWHERE : t[2]);
} }
/* make sure the start rooms exist & resolve their vnums to rnums */ /* make sure the start rooms exist & resolve their vnums to rnums */
void check_start_rooms(void) void check_start_rooms(void)
{ {
@ -1320,7 +1269,6 @@ void check_start_rooms(void)
} }
} }
/* resolve all vnums into rnums in the world */ /* resolve all vnums into rnums in the world */
void renum_world(void) void renum_world(void)
{ {
@ -1334,20 +1282,14 @@ void renum_world(void)
real_room(world[room].dir_option[door]->to_room); real_room(world[room].dir_option[door]->to_room);
} }
#define ZCMD zone_table[zone].cmd[cmd_no] #define ZCMD zone_table[zone].cmd[cmd_no]
/* /* Resolve vnums into rnums in the zone reset tables. In English: Once all of
* "resulve vnums into rnums in the zone reset tables" * the zone reset tables have been loaded, we resolve the virtual numbers into
* * real numbers all at once so we don't have to do it repeatedly while the game
* Or in English: Once all of the zone reset tables have been loaded, we * is running. This does make adding any room, mobile, or object a little more
* resolve the virtual numbers into real numbers all at once so we don't have * difficult while the game is running. Assumes NOWHERE == NOBODY == NOTHING.
* to do it repeatedly while the game is running. This does make adding any * Assumes sizeof(room_rnum) >= (sizeof(mob_rnum) and sizeof(obj_rnum)) */
* room, mobile, or object a little more difficult while the game is running.
*
* NOTE 1: Assumes NOWHERE == NOBODY == NOTHING.
* NOTE 2: Assumes sizeof(room_rnum) >= (sizeof(mob_rnum) and sizeof(obj_rnum))
*/
void renum_zone_table(void) void renum_zone_table(void)
{ {
int cmd_no; int cmd_no;
@ -1407,8 +1349,6 @@ void renum_zone_table(void)
} }
} }
void parse_simple_mob(FILE *mob_f, int i, int nr) void parse_simple_mob(FILE *mob_f, int i, int nr)
{ {
int j, t[10]; int j, t[10];
@ -1485,31 +1425,22 @@ void parse_simple_mob(FILE *mob_f, int i, int nr)
GET_WEIGHT(mob_proto + i) = 200; GET_WEIGHT(mob_proto + i) = 200;
GET_HEIGHT(mob_proto + i) = 198; GET_HEIGHT(mob_proto + i) = 198;
/* /* These are now save applies; base save numbers for MOBs are now from the
* these are now save applies; base save numbers for MOBs are now from * warrior save table. */
* the warrior save table.
*/
for (j = 0; j < 5; j++) for (j = 0; j < 5; j++)
GET_SAVE(mob_proto + i, j) = 0; GET_SAVE(mob_proto + i, j) = 0;
} }
/* interpret_espec is the function that takes espec keywords and values and
/* * assigns the correct value to the mob as appropriate. Adding new e-specs is
* interpret_espec is the function that takes espec keywords and values * absurdly easy -- just add a new CASE statement to this function! No other
* and assigns the correct value to the mob as appropriate. Adding new * changes need to be made anywhere in the code.
* e-specs is absurdly easy -- just add a new CASE statement to this
* function! No other changes need to be made anywhere in the code.
*
* CASE : Requires a parameter through 'value'. * CASE : Requires a parameter through 'value'.
* BOOL_CASE : Being specified at all is its value. * BOOL_CASE : Being specified at all is its value. */
*/
#define CASE(test) \ #define CASE(test) \
if (value && !matched && !str_cmp(keyword, test) && (matched = TRUE)) if (value && !matched && !str_cmp(keyword, test) && (matched = TRUE))
#define BOOL_CASE(test) \ #define BOOL_CASE(test) \
if (!value && !matched && !str_cmp(keyword, test) && (matched = TRUE)) if (!value && !matched && !str_cmp(keyword, test) && (matched = TRUE))
#define RANGE(low, high) \ #define RANGE(low, high) \
(num_arg = MAX((low), MIN((high), (num_arg)))) (num_arg = MAX((low), MIN((high), (num_arg))))
@ -1517,10 +1448,8 @@ void interpret_espec(const char *keyword, const char *value, int i, int nr)
{ {
int num_arg = 0, matched = FALSE; int num_arg = 0, matched = FALSE;
/* /* If there isn't a colon, there is no value. While Boolean options are
* If there isn't a colon, there is no value. While Boolean options are * possible, we don't actually have any. Feel free to make some. */
* possible, we don't actually have any. Feel free to make some.
*/
if (value) if (value)
num_arg = atoi(value); num_arg = atoi(value);
@ -1586,7 +1515,6 @@ void parse_espec(char *buf, int i, int nr)
interpret_espec(buf, ptr, i, nr); interpret_espec(buf, ptr, i, nr);
} }
void parse_enhanced_mob(FILE *mob_f, int i, int nr) void parse_enhanced_mob(FILE *mob_f, int i, int nr)
{ {
char line[READ_SIZE]; char line[READ_SIZE];
@ -1607,7 +1535,6 @@ void parse_enhanced_mob(FILE *mob_f, int i, int nr)
exit(1); exit(1);
} }
void parse_mobile(FILE *mob_f, int nr) void parse_mobile(FILE *mob_f, int nr)
{ {
static int i = 0; static int i = 0;
@ -1621,15 +1548,13 @@ void parse_mobile(FILE *mob_f, int nr)
clear_char(mob_proto + i); clear_char(mob_proto + i);
/* /* Mobiles should NEVER use anything in the 'player_specials' structure.
* Mobiles should NEVER use anything in the 'player_specials' structure.
* The only reason we have every mob in the game share this copy of the * The only reason we have every mob in the game share this copy of the
* structure is to save newbie coders from themselves. -gg 2/25/98 * structure is to save newbie coders from themselves. -gg */
*/
mob_proto[i].player_specials = &dummy_mob; mob_proto[i].player_specials = &dummy_mob;
sprintf(buf2, "mob vnum %d", nr); /* sprintf: OK (for 'buf2 >= 19') */ sprintf(buf2, "mob vnum %d", nr); /* sprintf: OK (for 'buf2 >= 19') */
/***** String data *****/ /* String data */
mob_proto[i].player.name = fread_string(mob_f, buf2); mob_proto[i].player.name = fread_string(mob_f, buf2);
tmpptr = mob_proto[i].player.short_descr = fread_string(mob_f, buf2); tmpptr = mob_proto[i].player.short_descr = fread_string(mob_f, buf2);
if (tmpptr && *tmpptr) if (tmpptr && *tmpptr)
@ -1640,7 +1565,7 @@ void parse_mobile(FILE *mob_f, int nr)
mob_proto[i].player.description = fread_string(mob_f, buf2); mob_proto[i].player.description = fread_string(mob_f, buf2);
GET_TITLE(mob_proto + i) = NULL; GET_TITLE(mob_proto + i) = NULL;
/* *** Numeric data *** */ /* Numeric data */
if (!get_line(mob_f, line)) { if (!get_line(mob_f, line)) {
log("SYSERR: Format error after string section of mob #%d\n" log("SYSERR: Format error after string section of mob #%d\n"
"...expecting line of form '# # # {S | E}', but file ended!", nr); "...expecting line of form '# # # {S | E}', but file ended!", nr);
@ -1708,9 +1633,6 @@ void parse_mobile(FILE *mob_f, int nr)
top_of_mobt = i++; top_of_mobt = i++;
} }
/* read all objects from obj file; generate index and prototypes */ /* read all objects from obj file; generate index and prototypes */
char *parse_object(FILE *obj_f, int nr) char *parse_object(FILE *obj_f, int nr)
{ {
@ -1730,7 +1652,7 @@ char *parse_object(FILE *obj_f, int nr)
sprintf(buf2, "object #%d", nr); /* sprintf: OK (for 'buf2 >= 19') */ sprintf(buf2, "object #%d", nr); /* sprintf: OK (for 'buf2 >= 19') */
/* *** string data *** */ /* string data */
if ((obj_proto[i].name = fread_string(obj_f, buf2)) == NULL) { if ((obj_proto[i].name = fread_string(obj_f, buf2)) == NULL) {
log("SYSERR: Null obj name or format error at or near %s", buf2); log("SYSERR: Null obj name or format error at or near %s", buf2);
exit(1); exit(1);
@ -1746,7 +1668,7 @@ char *parse_object(FILE *obj_f, int nr)
CAP(tmpptr); CAP(tmpptr);
obj_proto[i].action_description = fread_string(obj_f, buf2); obj_proto[i].action_description = fread_string(obj_f, buf2);
/* *** numeric data *** */ /* numeric data */
if (!get_line(obj_f, line)) { if (!get_line(obj_f, line)) {
log("SYSERR: Expecting first numeric line of %s, but file ended!", buf2); log("SYSERR: Expecting first numeric line of %s, but file ended!", buf2);
exit(1); exit(1);
@ -1804,14 +1726,13 @@ char *parse_object(FILE *obj_f, int nr)
GET_OBJ_WEIGHT(obj_proto + i) = GET_OBJ_VAL(obj_proto + i, 1) + 5; GET_OBJ_WEIGHT(obj_proto + i) = GET_OBJ_VAL(obj_proto + i, 1) + 5;
} }
/* *** extra descriptions and affect fields *** */ /* extra descriptions and affect fields */
for (j = 0; j < MAX_OBJ_AFFECT; j++) { for (j = 0; j < MAX_OBJ_AFFECT; j++) {
obj_proto[i].affected[j].location = APPLY_NONE; obj_proto[i].affected[j].location = APPLY_NONE;
obj_proto[i].affected[j].modifier = 0; obj_proto[i].affected[j].modifier = 0;
} }
strcat(buf2, ", after numeric constants\n" /* strcat: OK (for 'buf2 >= 87') */ strcat(buf2, ", after numeric constants\n" /* strcat: OK (for 'buf2 >= 87') */
"...expecting 'E', 'A', '$', or next object number"); "...expecting 'E', 'A', '$', or next object number");
j = 0; j = 0;
@ -1865,9 +1786,7 @@ char *parse_object(FILE *obj_f, int nr)
} }
} }
#define Z zone_table[zone] #define Z zone_table[zone]
/* load the zone table and command tables */ /* load the zone table and command tables */
void load_zones(FILE *fl, char *zonename) void load_zones(FILE *fl, char *zonename)
{ {
@ -1883,10 +1802,9 @@ void load_zones(FILE *fl, char *zonename)
for (tmp = 0; tmp < 3; tmp++) for (tmp = 0; tmp < 3; tmp++)
get_line(fl, buf); get_line(fl, buf);
/* More accurate count. Previous was always 4 or 5 too high. -gg 2001/1/17 /* More accurate count. Previous was always 4 or 5 too high. -gg Note that if
* Note that if a new zone command is added to reset_zone(), this string * a new zone command is added to reset_zone(), this string will need to be
* will need to be updated to suit. - ae. * updated to suit. - ae. */
*/
while (get_line(fl, buf)) while (get_line(fl, buf))
if ((strchr("MOPGERDTV", buf[0]) && buf[1] == ' ') || (buf[0] == 'S' && buf[1] == '\0')) if ((strchr("MOPGERDTV", buf[0]) && buf[1] == ' ') || (buf[0] == 'S' && buf[1] == '\0'))
num_of_cmds++; num_of_cmds++;
@ -1919,11 +1837,9 @@ void load_zones(FILE *fl, char *zonename)
line_num += get_line(fl, buf); line_num += get_line(fl, buf);
if (sscanf(buf, " %hd %hd %d %d ", &Z.bot, &Z.top, &Z.lifespan, &Z.reset_mode) != 4) { if (sscanf(buf, " %hd %hd %d %d ", &Z.bot, &Z.top, &Z.lifespan, &Z.reset_mode) != 4) {
/* /* This may be due to the fact that the zone has no builder. So, we just
* This may be due to the fact that the zone has no builder. So, we just attempt * attempt to fix this by copying the previous 2 last reads into this
* to fix this by copying the previous 2 last reads into this variable and the * variable and the last one. */
* last one.
*/
log("SYSERR: Format error in numeric constant line of %s, attempting to fix.", zname); log("SYSERR: Format error in numeric constant line of %s, attempting to fix.", zname);
if (sscanf(Z.name, " %hd %hd %d %d ", &Z.bot, &Z.top, &Z.lifespan, &Z.reset_mode) != 4) { if (sscanf(Z.name, " %hd %hd %d %d ", &Z.bot, &Z.top, &Z.lifespan, &Z.reset_mode) != 4) {
log("SYSERR: Could not fix previous error, aborting game."); log("SYSERR: Could not fix previous error, aborting game.");
@ -2001,10 +1917,8 @@ void load_zones(FILE *fl, char *zonename)
top_of_zone_table = zone++; top_of_zone_table = zone++;
} }
#undef Z #undef Z
void get_one_line(FILE *fl, char *buf) void get_one_line(FILE *fl, char *buf)
{ {
if (fgets(buf, READ_SIZE, fl) == NULL) { if (fgets(buf, READ_SIZE, fl) == NULL) {
@ -2015,10 +1929,6 @@ void get_one_line(FILE *fl, char *buf)
buf[strlen(buf) - 1] = '\0'; /* take off the trailing \n */ buf[strlen(buf) - 1] = '\0'; /* take off the trailing \n */
} }
/*************************************************************************
* procedures for resetting, both play-time and boot-time *
*************************************************************************/
int vnum_mobile(char *searchname, struct char_data *ch) int vnum_mobile(char *searchname, struct char_data *ch)
{ {
int nr, found = 0; int nr, found = 0;
@ -2032,8 +1942,6 @@ int vnum_mobile(char *searchname, struct char_data *ch)
return (found); return (found);
} }
int vnum_object(char *searchname, struct char_data *ch) int vnum_object(char *searchname, struct char_data *ch)
{ {
int nr, found = 0; int nr, found = 0;
@ -2086,7 +1994,6 @@ struct char_data *create_char(void)
return (ch); return (ch);
} }
/* create a new mobile from a prototype */ /* create a new mobile from a prototype */
struct char_data *read_mobile(mob_vnum nr, int type) /* and mob_rnum */ struct char_data *read_mobile(mob_vnum nr, int type) /* and mob_rnum */
{ {
@ -2133,7 +2040,6 @@ struct char_data *read_mobile(mob_vnum nr, int type) /* and mob_rnum */
return (mob); return (mob);
} }
/* create an object, and add it to the object list */ /* create an object, and add it to the object list */
struct obj_data *create_obj(void) struct obj_data *create_obj(void)
{ {
@ -2151,7 +2057,6 @@ struct obj_data *create_obj(void)
return (obj); return (obj);
} }
/* create a new object from a prototype */ /* create a new object from a prototype */
struct obj_data *read_object(obj_vnum nr, int type) /* and obj_rnum */ struct obj_data *read_object(obj_vnum nr, int type) /* and obj_rnum */
{ {
@ -2181,10 +2086,7 @@ struct obj_data *read_object(obj_vnum nr, int type) /* and obj_rnum */
return (obj); return (obj);
} }
#define ZO_DEAD 999 #define ZO_DEAD 999
/* update zone ages, queue for reset if necessary, and dequeue when possible */ /* update zone ages, queue for reset if necessary, and dequeue when possible */
void zone_update(void) void zone_update(void)
{ {
@ -2194,11 +2096,8 @@ void zone_update(void)
/* jelson 10/22/92 */ /* jelson 10/22/92 */
if (((++timer * PULSE_ZONE) / PASSES_PER_SEC) >= 60) { if (((++timer * PULSE_ZONE) / PASSES_PER_SEC) >= 60) {
/* one minute has passed */ /* one minute has passed NOT accurate unless PULSE_ZONE is a multiple of
/* * PASSES_PER_SEC or a factor of 60 */
* NOT accurate unless PULSE_ZONE is a multiple of PASSES_PER_SEC or a
* factor of 60
*/
timer = 0; timer = 0;
@ -2229,9 +2128,8 @@ void zone_update(void)
} }
} /* end - one minute has passed */ } /* end - one minute has passed */
/* Dequeue zones (if possible) and reset. This code is executed every 10
/* dequeue zones (if possible) and reset */ * seconds (i.e. PULSE_ZONE). */
/* this code is executed every 10 seconds (i.e. PULSE_ZONE) */
for (update_u = reset_q.head; update_u; update_u = update_u->next) for (update_u = reset_q.head; update_u; update_u = update_u->next)
if (zone_table[update_u->zone_to_reset].reset_mode == 2 || if (zone_table[update_u->zone_to_reset].reset_mode == 2 ||
is_empty(update_u->zone_to_reset)) { is_empty(update_u->zone_to_reset)) {
@ -2282,11 +2180,9 @@ void reset_zone(zone_rnum zone)
if (ZCMD.if_flag && !last_cmd) if (ZCMD.if_flag && !last_cmd)
continue; continue;
/* This is the list of actual zone commands. If any new /* This is the list of actual zone commands. If any new zone commands are
* zone commands are added to the game, be certain to update * added to the game, be certain to update the list of commands in load_zone
* the list of commands in load_zone() so that the counting * () so that the counting will still be correct. - ae. */
* will still be correct. - ae.
*/
switch (ZCMD.command) { switch (ZCMD.command) {
case '*': /* ignore command */ case '*': /* ignore command */
last_cmd = 0; last_cmd = 0;
@ -2501,8 +2397,6 @@ void reset_zone(zone_rnum zone)
} }
} }
/* for use in reset_zone; return TRUE if zone 'nr' is free of PC's */ /* for use in reset_zone; return TRUE if zone 'nr' is free of PC's */
int is_empty(zone_rnum zone_nr) int is_empty(zone_rnum zone_nr)
{ {
@ -2515,10 +2409,8 @@ int is_empty(zone_rnum zone_nr)
continue; continue;
if (world[IN_ROOM(i->character)].zone != zone_nr) if (world[IN_ROOM(i->character)].zone != zone_nr)
continue; continue;
/* /* If an immortal has nohassle off, he counts as present. Added for testing
* if an immortal has nohassle off, he counts as present * zone reset triggers -Welcor */
* added for testing zone reset triggers - Welcor
*/
if ((GET_LEVEL(i->character) >= LVL_IMMORT) && (PRF_FLAGGED(i->character, PRF_NOHASSLE))) if ((GET_LEVEL(i->character) >= LVL_IMMORT) && (PRF_FLAGGED(i->character, PRF_NOHASSLE)))
continue; continue;
@ -2528,11 +2420,7 @@ int is_empty(zone_rnum zone_nr)
return (1); return (1);
} }
/************************************************************************ /* Functions of a general utility nature. */
* funcs of a (more or less) general utility nature *
************************************************************************/
/* read and allocate space for a '~'-terminated string from a given file */ /* read and allocate space for a '~'-terminated string from a given file */
char *fread_string(FILE *fl, const char *error) char *fread_string(FILE *fl, const char *error)
{ {
@ -2655,20 +2543,14 @@ void free_char(struct char_data *ch)
if (ch->desc) if (ch->desc)
ch->desc->character = NULL; ch->desc->character = NULL;
/* find_char helper */ /* find_char helper, when free_char is called with a blank character struct,
/* * ID is set to 0, and has not yet been added to the lookup table */
* when free_char is called with a blank character struct, ID is set
* to 0, and has not yet been added to the lookup table.
*/
if (GET_ID(ch) != 0) if (GET_ID(ch) != 0)
remove_from_lookup_table(GET_ID(ch)); remove_from_lookup_table(GET_ID(ch));
free(ch); free(ch);
} }
/* release memory allocated for an obj struct */ /* release memory allocated for an obj struct */
void free_obj(struct obj_data *obj) void free_obj(struct obj_data *obj)
{ {
@ -2692,25 +2574,15 @@ void free_obj(struct obj_data *obj)
free(obj); free(obj);
} }
/* Steps: 1: Read contents of a text file. 2: Make sure no one is using the
/* * pointer in paging. 3: Allocate space. 4: Point 'buf' to it.
* Steps: * We don't want to free() the string that someone may be viewing in the pager.
* 1: Read contents of a text file. * page_string() keeps the internal strdup()'d copy on ->showstr_head and it
* 2: Make sure no one is using the pointer in paging. * won't care if we delete the original. Otherwise, strings are kept on
* 3: Allocate space. * ->showstr_vector but we'll only match if the pointer is to the string we're
* 4: Point 'buf' to it. * interested in and not a copy. If someone is reading a global copy we're
* * trying to replace, give everybody using it a different copy so as to avoid
* We don't want to free() the string that someone may be * special cases. */
* viewing in the pager. page_string() keeps the internal
* strdup()'d copy on ->showstr_head and it won't care
* if we delete the original. Otherwise, strings are kept
* on ->showstr_vector but we'll only match if the pointer
* is to the string we're interested in and not a copy.
*
* If someone is reading a global copy we're trying to
* replace, give everybody using it a different copy so
* as to avoid special cases.
*/
int file_to_string_alloc(const char *name, char **buf) int file_to_string_alloc(const char *name, char **buf)
{ {
int temppage; int temppage;
@ -2742,7 +2614,6 @@ int file_to_string_alloc(const char *name, char **buf)
return (0); return (0);
} }
/* read contents of a text file, and place in buf */ /* read contents of a text file, and place in buf */
int file_to_string(const char *name, char *buf) int file_to_string(const char *name, char *buf)
{ {
@ -2778,8 +2649,6 @@ int file_to_string(const char *name, char *buf)
return (0); return (0);
} }
/* clear some of the the working variables of a char */ /* clear some of the the working variables of a char */
void reset_char(struct char_data *ch) void reset_char(struct char_data *ch)
{ {
@ -2811,8 +2680,6 @@ void reset_char(struct char_data *ch)
GET_LAST_TELL(ch) = NOBODY; GET_LAST_TELL(ch) = NOBODY;
} }
/* clear ALL the working variables of a char; do NOT free any space alloc'ed */ /* clear ALL the working variables of a char; do NOT free any space alloc'ed */
void clear_char(struct char_data *ch) void clear_char(struct char_data *ch)
{ {
@ -2830,7 +2697,6 @@ void clear_char(struct char_data *ch)
ch->points.max_mana = 100; ch->points.max_mana = 100;
} }
void clear_object(struct obj_data *obj) void clear_object(struct obj_data *obj)
{ {
memset((char *) obj, 0, sizeof(struct obj_data)); memset((char *) obj, 0, sizeof(struct obj_data));
@ -2840,13 +2706,8 @@ void clear_object(struct obj_data *obj)
obj->worn_on = NOWHERE; obj->worn_on = NOWHERE;
} }
/* Called during character creation after picking character class (and then
* never again for that character). */
/*
* Called during character creation after picking character class
* (and then never again for that character).
*/
void init_char(struct char_data *ch) void init_char(struct char_data *ch)
{ {
int i; int i;
@ -2855,7 +2716,7 @@ void init_char(struct char_data *ch)
if (ch->player_specials == NULL) if (ch->player_specials == NULL)
CREATE(ch->player_specials, struct player_special_data, 1); CREATE(ch->player_specials, struct player_special_data, 1);
/* *** if this is our first player --- he be God *** */ /* If this is our first player make him IMPL. */
if (top_of_p_table == 0) { if (top_of_p_table == 0) {
GET_LEVEL(ch) = LVL_IMPL; GET_LEVEL(ch) = LVL_IMPL;
GET_EXP(ch) = 7000000; GET_EXP(ch) = 7000000;
@ -2884,14 +2745,10 @@ void init_char(struct char_data *ch)
for (i = 0; i < MAX_TONGUE; i++) for (i = 0; i < MAX_TONGUE; i++)
GET_TALK(ch, i) = 0; GET_TALK(ch, i) = 0;
/* /* Bias the height and weight of the character depending on what gender
* make favors for sex -- or in English, we bias the height and weight of the * they have chosen. While it is possible to have a tall, heavy female it's
* character depending on what gender they've chosen for themselves. While it * not as likely as a male. Height is in centimeters. Weight is in pounds.
* is possible to have a tall, heavy female it's not as likely as a male. * The only place they're ever printed (in stock code) is SPELL_IDENTIFY. */
*
* Height is in centimeters. Weight is in pounds. The only place they're
* ever printed (in stock code) is SPELL_IDENTIFY.
*/
if (GET_SEX(ch) == SEX_MALE) { if (GET_SEX(ch) == SEX_MALE) {
GET_WEIGHT(ch) = rand_number(120, 180); GET_WEIGHT(ch) = rand_number(120, 180);
GET_HEIGHT(ch) = rand_number(160, 200); /* 5'4" - 6'8" */ GET_HEIGHT(ch) = rand_number(160, 200); /* 5'4" - 6'8" */
@ -2931,8 +2788,6 @@ void init_char(struct char_data *ch)
GET_LOADROOM(ch) = NOWHERE; GET_LOADROOM(ch) = NOWHERE;
} }
/* returns the real number of the room with given virtual number */ /* returns the real number of the room with given virtual number */
room_rnum real_room(room_vnum vnum) room_rnum real_room(room_vnum vnum)
{ {
@ -2958,8 +2813,6 @@ room_rnum real_room(room_vnum vnum)
} }
} }
/* returns the real number of the monster with given virtual number */ /* returns the real number of the monster with given virtual number */
mob_rnum real_mobile(mob_vnum vnum) mob_rnum real_mobile(mob_vnum vnum)
{ {
@ -2985,7 +2838,6 @@ mob_rnum real_mobile(mob_vnum vnum)
} }
} }
/* returns the real number of the object with given virtual number */ /* returns the real number of the object with given virtual number */
obj_rnum real_object(obj_vnum vnum) obj_rnum real_object(obj_vnum vnum)
{ {
@ -3011,7 +2863,6 @@ obj_rnum real_object(obj_vnum vnum)
} }
} }
/* returns the real number of the zone with given virtual number */ /* returns the real number of the zone with given virtual number */
zone_rnum real_zone(zone_vnum vnum) zone_rnum real_zone(zone_vnum vnum)
{ {
@ -3037,12 +2888,7 @@ zone_rnum real_zone(zone_vnum vnum)
} }
} }
/* Extend later to include more checks and add checks for unknown bitvectors. */
/*
* Extend later to include more checks.
*
* TODO: Add checks for unknown bitvectors.
*/
int check_object(struct obj_data *obj) int check_object(struct obj_data *obj)
{ {
char objname[MAX_INPUT_LENGTH + 32]; char objname[MAX_INPUT_LENGTH + 32];
@ -3121,10 +2967,8 @@ int check_object_spell_number(struct obj_data *obj, int val)
if (GET_OBJ_VAL(obj, val) == -1) /* i.e.: no spell */ if (GET_OBJ_VAL(obj, val) == -1) /* i.e.: no spell */
return (error); return (error);
/* /* Check for negative spells, spells beyond the top define, and any spell
* Check for negative spells, spells beyond the top define, and any * which is actually a skill. */
* spell which is actually a skill.
*/
if (GET_OBJ_VAL(obj, val) < 0) if (GET_OBJ_VAL(obj, val) < 0)
error = TRUE; error = TRUE;
if (GET_OBJ_VAL(obj, val) > TOP_SPELL_DEFINE) if (GET_OBJ_VAL(obj, val) > TOP_SPELL_DEFINE)
@ -3194,7 +3038,7 @@ extern int idle_max_level;
extern int dts_are_dumps; extern int dts_are_dumps;
extern int load_into_inventory; extern int load_into_inventory;
extern int track_through_doors; extern int track_through_doors;
extern int immort_level_ok; extern int no_mort_to_immort;
extern int free_rent; extern int free_rent;
extern int max_obj_save; extern int max_obj_save;
extern int min_rent_cost; extern int min_rent_cost;
@ -3230,13 +3074,9 @@ extern const char *NOEFFECT;
void load_default_config( void ) void load_default_config( void )
{ {
/****************************************************************************/ /* This function is called only once, at boot-time. We assume config_info is
/** This function is called only once, at boot-time. **/ * empty. -Welcor */
/** - We assume config_info is empty -- Welcor **/ /* Game play options. */
/****************************************************************************/
/****************************************************************************/
/** Game play options. **/
/****************************************************************************/
CONFIG_PK_ALLOWED = pk_allowed; CONFIG_PK_ALLOWED = pk_allowed;
CONFIG_PT_ALLOWED = pt_allowed; CONFIG_PT_ALLOWED = pt_allowed;
CONFIG_LEVEL_CAN_SHOUT = level_can_shout; CONFIG_LEVEL_CAN_SHOUT = level_can_shout;
@ -3255,11 +3095,9 @@ void load_default_config( void )
CONFIG_NOPERSON = strdup(NOPERSON); CONFIG_NOPERSON = strdup(NOPERSON);
CONFIG_NOEFFECT = strdup(NOEFFECT); CONFIG_NOEFFECT = strdup(NOEFFECT);
CONFIG_TRACK_T_DOORS = track_through_doors; CONFIG_TRACK_T_DOORS = track_through_doors;
CONFIG_IMMORT_LEVEL_OK = immort_level_ok; CONFIG_NO_MORT_TO_IMMORT = no_mort_to_immort;
/****************************************************************************/ /* Rent / crashsave options. */
/** Rent / crashsave options. **/
/****************************************************************************/
CONFIG_FREE_RENT = free_rent; CONFIG_FREE_RENT = free_rent;
CONFIG_MAX_OBJ_SAVE = max_obj_save; CONFIG_MAX_OBJ_SAVE = max_obj_save;
CONFIG_MIN_RENT_COST = min_rent_cost; CONFIG_MIN_RENT_COST = min_rent_cost;
@ -3268,9 +3106,7 @@ void load_default_config( void )
CONFIG_CRASH_TIMEOUT = crash_file_timeout; CONFIG_CRASH_TIMEOUT = crash_file_timeout;
CONFIG_RENT_TIMEOUT = rent_file_timeout; CONFIG_RENT_TIMEOUT = rent_file_timeout;
/****************************************************************************/ /* Room numbers. */
/** Room numbers. **/
/****************************************************************************/
CONFIG_MORTAL_START = mortal_start_room; CONFIG_MORTAL_START = mortal_start_room;
CONFIG_IMMORTAL_START = immort_start_room; CONFIG_IMMORTAL_START = immort_start_room;
CONFIG_FROZEN_START = frozen_start_room; CONFIG_FROZEN_START = frozen_start_room;
@ -3278,9 +3114,7 @@ void load_default_config( void )
CONFIG_DON_ROOM_2 = donation_room_2; CONFIG_DON_ROOM_2 = donation_room_2;
CONFIG_DON_ROOM_3 = donation_room_3; CONFIG_DON_ROOM_3 = donation_room_3;
/****************************************************************************/ /* Game operation options. */
/** Game operation options. **/
/****************************************************************************/
CONFIG_DFLT_PORT = DFLT_PORT; CONFIG_DFLT_PORT = DFLT_PORT;
if (DFLT_IP) if (DFLT_IP)
@ -3306,9 +3140,7 @@ void load_default_config( void )
CONFIG_WELC_MESSG = strdup(WELC_MESSG); CONFIG_WELC_MESSG = strdup(WELC_MESSG);
CONFIG_START_MESSG = strdup(START_MESSG); CONFIG_START_MESSG = strdup(START_MESSG);
/****************************************************************************/ /* Autowiz options. */
/** Autowiz options. **/
/****************************************************************************/
CONFIG_USE_AUTOWIZ = use_autowiz; CONFIG_USE_AUTOWIZ = use_autowiz;
CONFIG_MIN_WIZLIST_LEV = min_wizlist_lev; CONFIG_MIN_WIZLIST_LEV = min_wizlist_lev;
} }
@ -3330,9 +3162,7 @@ void load_config( void )
return; return;
} }
/****************************************************************************/ /* Load the game configuration file. */
/** Load the game configuration file. **/
/****************************************************************************/
while (get_line(fl, line)) { while (get_line(fl, line)) {
split_argument(line, tag); split_argument(line, tag);
num = atoi(line); num = atoi(line);
@ -3407,8 +3237,8 @@ void load_config( void )
CONFIG_IDLE_RENT_TIME = num; CONFIG_IDLE_RENT_TIME = num;
else if (!str_cmp(tag, "idle_max_level")) else if (!str_cmp(tag, "idle_max_level"))
CONFIG_IDLE_MAX_LEVEL = num; CONFIG_IDLE_MAX_LEVEL = num;
else if (!str_cmp(tag, "immort_level_ok")) else if (!str_cmp(tag, "no_mort_to_immort"))
CONFIG_IMMORT_LEVEL_OK = num; CONFIG_NO_MORT_TO_IMMORT = num;
else if (!str_cmp(tag, "immort_start_room")) else if (!str_cmp(tag, "immort_start_room"))
CONFIG_IMMORTAL_START = num; CONFIG_IMMORTAL_START = num;
break; break;

View file

@ -14,7 +14,6 @@
#include "conf.h" #include "conf.h"
#include "sysdep.h" #include "sysdep.h"
#include "structs.h" #include "structs.h"
#include "utils.h" #include "utils.h"
#include "comm.h" #include "comm.h"
@ -39,18 +38,13 @@ int format_script(struct descriptor_data *d);
void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num); void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num);
void trigedit_setup_new(struct descriptor_data *d); void trigedit_setup_new(struct descriptor_data *d);
/* *********************************************************************** /* Trigedit */
* trigedit
* ***********************************************************************/
ACMD(do_oasis_trigedit) ACMD(do_oasis_trigedit)
{ {
int number, real_num; int number, real_num;
struct descriptor_data *d; struct descriptor_data *d;
/* /* Parse any arguments. */
* Parse any arguments.
*/
skip_spaces(&argument); skip_spaces(&argument);
if (!*argument || !isdigit(*argument)) { if (!*argument || !isdigit(*argument)) {
send_to_char(ch, "Specify a trigger VNUM to edit.\r\n"); send_to_char(ch, "Specify a trigger VNUM to edit.\r\n");
@ -59,9 +53,7 @@ ACMD(do_oasis_trigedit)
number = atoi(argument); number = atoi(argument);
/* /* Check that it isn't already being edited. */
* Check that it isn't already being edited.
*/
for (d = descriptor_list; d; d = d->next) { for (d = descriptor_list; d; d = d->next) {
if (STATE(d) == CON_TRIGEDIT) { if (STATE(d) == CON_TRIGEDIT) {
if (d->olc && OLC_NUM(d) == number) { if (d->olc && OLC_NUM(d) == number) {
@ -72,9 +64,7 @@ ACMD(do_oasis_trigedit)
} }
} }
d = ch->desc; d = ch->desc;
/* /* Give descriptor an OLC structure. */
* Give descriptor an OLC structure.
*/
if (d->olc) { if (d->olc) {
mudlog(BRF, LVL_IMMORT, TRUE, mudlog(BRF, LVL_IMMORT, TRUE,
"SYSERR: do_oasis_trigedit: Player already had olc structure."); "SYSERR: do_oasis_trigedit: Player already had olc structure.");
@ -82,9 +72,7 @@ ACMD(do_oasis_trigedit)
} }
CREATE(d->olc, struct oasis_olc_data, 1); CREATE(d->olc, struct oasis_olc_data, 1);
/* /* Find the zone. */
* Find the zone.
*/
if ((OLC_ZNUM(d) = real_zone_by_thing(number)) == NOWHERE) { if ((OLC_ZNUM(d) = real_zone_by_thing(number)) == NOWHERE) {
send_to_char(ch, "Sorry, there is no zone for that number!\r\n"); send_to_char(ch, "Sorry, there is no zone for that number!\r\n");
free(d->olc); free(d->olc);
@ -103,10 +91,8 @@ ACMD(do_oasis_trigedit)
} }
OLC_NUM(d) = number; OLC_NUM(d) = number;
/* /* If this is a new trigger, setup a new one, otherwise, setup the a copy of
* If this is a new trigger, setup a new one, * the existing trigger. */
* otherwise, setup the a copy of the existing trigger
*/
if ((real_num = real_trigger(number)) == NOTHING) if ((real_num = real_trigger(number)) == NOTHING)
trigedit_setup_new(d); trigedit_setup_new(d);
else else
@ -121,8 +107,8 @@ ACMD(do_oasis_trigedit)
GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
} }
/* called when a mob or object is being saved to disk, so its script can */ /* Called when a mob or object is being saved to disk, so its script can be
/* be saved */ * saved. */
void script_save_to_disk(FILE *fp, void *item, int type) void script_save_to_disk(FILE *fp, void *item, int type)
{ {
struct trig_proto_list *t; struct trig_proto_list *t;
@ -145,21 +131,16 @@ void script_save_to_disk(FILE *fp, void *item, int type)
} }
} }
void trigedit_setup_new(struct descriptor_data *d) void trigedit_setup_new(struct descriptor_data *d)
{ {
struct trig_data *trig; struct trig_data *trig;
/* /* Allocate a scratch trigger structure. */
* Allocate a scratch trigger structure
*/
CREATE(trig, struct trig_data, 1); CREATE(trig, struct trig_data, 1);
trig->nr = -1; trig->nr = NOWHERE;
/* /* Set up some defaults. */
* Set up some defaults
*/
trig->name = strdup("new trigger"); trig->name = strdup("new trigger");
trig->trigger_type = MTRIG_GREET; trig->trigger_type = MTRIG_GREET;
@ -179,9 +160,7 @@ void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num)
{ {
struct trig_data *trig; struct trig_data *trig;
struct cmdlist_element *c; struct cmdlist_element *c;
/* /* Allocate a scratch trigger structure. */
* Allocate a scratch trigger structure
*/
CREATE(trig, struct trig_data, 1); CREATE(trig, struct trig_data, 1);
trig_data_copy(trig, trig_index[rtrg_num]->proto); trig_data_copy(trig, trig_index[rtrg_num]->proto);
@ -197,8 +176,8 @@ void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num)
strcat(OLC_STORAGE(d), "\r\n"); strcat(OLC_STORAGE(d), "\r\n");
c = c->next; c = c->next;
} }
/* now trig->cmdlist is something to pass to the text editor */ /* Now trig->cmdlist is something to pass to the text editor it will be
/* it will be converted back to a real cmdlist_element list later */ * converted back to a real cmdlist_element list later. */
OLC_TRIG(d) = trig; OLC_TRIG(d) = trig;
OLC_VAL(d) = 0; /* Has changed flag. (It hasn't so far, we just made it.) */ OLC_VAL(d) = 0; /* Has changed flag. (It hasn't so far, we just made it.) */
@ -206,7 +185,6 @@ void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num)
trigedit_disp_menu(d); trigedit_disp_menu(d);
} }
void trigedit_disp_menu(struct descriptor_data *d) void trigedit_disp_menu(struct descriptor_data *d)
{ {
struct trig_data *trig = OLC_TRIG(d); struct trig_data *trig = OLC_TRIG(d);
@ -404,7 +382,6 @@ void trigedit_parse(struct descriptor_data *d, char *arg)
trigedit_disp_menu(d); trigedit_disp_menu(d);
} }
/* save the zone's triggers to internal memory and to disk */ /* save the zone's triggers to internal memory and to disk */
void trigedit_save(struct descriptor_data *d) void trigedit_save(struct descriptor_data *d)
{ {
@ -584,9 +561,7 @@ void trigedit_save(struct descriptor_data *d)
for (live_trig = trigger_list; live_trig; live_trig = live_trig->next_in_world) for (live_trig = trigger_list; live_trig; live_trig = live_trig->next_in_world)
GET_TRIG_RNUM(live_trig) += (GET_TRIG_RNUM(live_trig) > rnum); GET_TRIG_RNUM(live_trig) += (GET_TRIG_RNUM(live_trig) > rnum);
/* /* Update other trigs being edited. */
* Update other trigs being edited.
*/
for (dsc = descriptor_list; dsc; dsc = dsc->next) for (dsc = descriptor_list; dsc; dsc = dsc->next)
if (STATE(dsc) == CON_TRIGEDIT) if (STATE(dsc) == CON_TRIGEDIT)
if (GET_TRIG_RNUM(OLC_TRIG(dsc)) >= rnum) if (GET_TRIG_RNUM(OLC_TRIG(dsc)) >= rnum)
@ -594,13 +569,11 @@ void trigedit_save(struct descriptor_data *d)
} }
/* now write the trigger out to disk, along with the rest of the */ /* now write the trigger out to disk, along with the rest of the triggers for
/* triggers for this zone, of course */ * this zone. We write this to disk NOW instead of letting the builder have
/* note: we write this to disk NOW instead of letting the builder */ * control because if we lose this after having assigned a new trigger to an
/* have control because if we lose this after having assigned a */ * item, we will get SYSERR's upton reboot that could make things hard to
/* new trigger to an item, we will get SYSERR's upton reboot that */ * debug. */
/* could make things hard to debug. */
zone = zone_table[OLC_ZNUM(d)].number; zone = zone_table[OLC_ZNUM(d)].number;
top = zone_table[OLC_ZNUM(d)].top; top = zone_table[OLC_ZNUM(d)].top;
@ -666,7 +639,6 @@ void trigedit_save(struct descriptor_data *d)
trigedit_create_index(zone, "trg"); trigedit_create_index(zone, "trg");
} }
void trigedit_create_index(int znum, char *type) void trigedit_create_index(int znum, char *type)
{ {
FILE *newfile, *oldfile; FILE *newfile, *oldfile;
@ -687,10 +659,8 @@ void trigedit_create_index(int znum, char *type)
return; return;
} }
/* /* Index contents must be in order: search through the old file for the right
* Index contents must be in order: search through the old file for the * place, insert the new file, then copy the rest over. */
* right place, insert the new file, then copy the rest over.
*/
snprintf(buf1, sizeof(buf1), "%d.%s", znum, type); snprintf(buf1, sizeof(buf1), "%d.%s", znum, type);
while (get_line(oldfile, buf)) { while (get_line(oldfile, buf)) {
if (*buf == '$') { if (*buf == '$') {
@ -711,9 +681,7 @@ void trigedit_create_index(int znum, char *type)
fclose(newfile); fclose(newfile);
fclose(oldfile); fclose(oldfile);
/* /* Out with the old, in with the new. */
* Out with the old, in with the new.
*/
remove(old_name); remove(old_name);
rename(new_name, old_name); rename(new_name, old_name);
} }
@ -788,33 +756,23 @@ int dg_script_edit_parse(struct descriptor_data *d, char *arg)
case SCRIPT_MAIN_MENU: case SCRIPT_MAIN_MENU:
switch(tolower(*arg)) { switch(tolower(*arg)) {
case 'x': case 'x':
/* this was buggy. /* This was buggy. First we created a copy of a thing, but maintained
First we created a copy of a thing, but maintained pointers to scripts, * pointers to scripts, then if we altered the scripts, we freed the
then if we altered the scripts, we freed the pointers and added new ones * pointers and added new ones to the OLC_THING. If we then choose NOT
to the OLC_THING. If we then chose _NOT_ to save the changes, the * to save the changes, the pointers in the original pointed to
pointers in the original thing pointed to garbage. If we saved changes * garbage. If we saved changes the pointers were updated correctly.
the pointers were updated correctly. * Solution: Here we just point the working copies to the new
* proto_scripts. We only update the original when choosing to save
Solution: * internally, then free the unused memory there. -Welcor
Here we just point the working copies to the new proto_scripts * Thanks to Jeremy Stanley - fungi@yuggoth.org and Torgny Bjers -
We only update the original when choosing to save internally, * artovil@arcanerealms.org for the bug report.
then free the unused memory there. * After updating to OasisOLC 2.0.3 I discovered some malfunctions
* in this code, so I restructured it a bit. Now things work like
Welcor * this: OLC_SCRIPT(d) is assigned a copy of the edited things'
* proto_script. OLC_OBJ(d), etc.. are initalized with proto_script =
Thanks to * NULL; On save, the saved copy is updated with OLC_SCRIPT(d) as new
Jeremy Stanley - fungi@yuggoth.org and * proto_script (freeing the old one). On quit/nosave, OLC_SCRIPT is
Torgny Bjers - artovil@arcanerealms.org * free()'d, and the prototype not touched. */
for the bug report.
After updating to OasisOLC 2.0.3 I discovered some malfunctions
in this code, so I restructured it a bit. Now things work like this:
OLC_SCRIPT(d) is assigned a copy of the edited things' proto_script.
OLC_OBJ(d), etc.. are initalized with proto_script = NULL;
On save, the saved copy is updated with OLC_SCRIPT(d) as new proto_script (freeing the old one).
On quit/nosave, OLC_SCRIPT is free()'d, and the prototype not touched.
*/
return 0; return 0;
case 'n': case 'n':
write_to_output(d, "\r\nPlease enter position, vnum (ex: 1, 200):"); write_to_output(d, "\r\nPlease enter position, vnum (ex: 1, 200):");

View file

@ -23,14 +23,14 @@ extern struct descriptor_data *descriptor_list;
void hedit_disp_menu(struct descriptor_data *d); void hedit_disp_menu(struct descriptor_data *d);
/* external variables */ /* external variables */
struct help_index_element *help_table; extern struct help_index_element *help_table;
int top_of_h_table = 0; /* ref to top of help table */
int top_of_h_file = 0; /* ref of size of help file */
long top_help_idnum = 0; /* highest idnum in use */
void get_one_line(FILE *fl, char *buf); void get_one_line(FILE *fl, char *buf);
int search_help(char *argument, int level); int search_help(char *argument, int level);
ACMD(do_reboot); ACMD(do_reboot);
/* local variables */
int top_of_h_table = 0; /* ref to top of help table */
/* local functions */ /* local functions */
void hedit_save_internally(struct descriptor_data *d); void hedit_save_internally(struct descriptor_data *d);
void hedit_save_to_disk(struct descriptor_data *d); void hedit_save_to_disk(struct descriptor_data *d);

View file

@ -238,7 +238,7 @@ void gain_exp(struct char_data *ch, int gain)
if (gain > 0) { if (gain > 0) {
gain = MIN(CONFIG_MAX_EXP_GAIN, gain); /* put a cap on the max gain per kill */ gain = MIN(CONFIG_MAX_EXP_GAIN, gain); /* put a cap on the max gain per kill */
GET_EXP(ch) += gain; GET_EXP(ch) += gain;
while (GET_LEVEL(ch) < LVL_IMMORT - CONFIG_IMMORT_LEVEL_OK && while (GET_LEVEL(ch) < LVL_IMMORT - CONFIG_NO_MORT_TO_IMMORT &&
GET_EXP(ch) >= level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1)) { GET_EXP(ch) >= level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1)) {
GET_LEVEL(ch) += 1; GET_LEVEL(ch) += 1;
num_levels++; num_levels++;

View file

@ -330,7 +330,7 @@ extern const char *nrm, *grn, *cyn, *yel;
#define CEDIT_DTS_ARE_DUMPS 31 #define CEDIT_DTS_ARE_DUMPS 31
#define CEDIT_LOAD_INTO_INVENTORY 32 #define CEDIT_LOAD_INTO_INVENTORY 32
#define CEDIT_TRACK_THROUGH_DOORS 33 #define CEDIT_TRACK_THROUGH_DOORS 33
#define CEDIT_IMMORT_LEVEL_OK 34 #define CEDIT_NO_MORT_TO_IMMORT 34
#define CEDIT_MAX_OBJ_SAVE 35 #define CEDIT_MAX_OBJ_SAVE 35
#define CEDIT_MIN_RENT_COST 36 #define CEDIT_MIN_RENT_COST 36
#define CEDIT_AUTOSAVE_TIME 37 #define CEDIT_AUTOSAVE_TIME 37

View file

@ -81,7 +81,7 @@ int objsave_save_obj_record(struct obj_data *obj, FILE *fp, int locate)
temp=read_object(GET_OBJ_VNUM(obj), VIRTUAL); temp=read_object(GET_OBJ_VNUM(obj), VIRTUAL);
else { else {
temp = create_obj(); temp = create_obj();
temp->item_number = -1; temp->item_number = NOWHERE;
} }
if (obj->action_description) { if (obj->action_description) {

View file

@ -11,8 +11,6 @@
#include "conf.h" #include "conf.h"
#include "sysdep.h" #include "sysdep.h"
#include "structs.h" #include "structs.h"
#include "utils.h" #include "utils.h"
#include "interpreter.h" #include "interpreter.h"
@ -26,6 +24,7 @@
/* local globals */ /* local globals */
struct spell_info_type spell_info[TOP_SPELL_DEFINE + 1]; struct spell_info_type spell_info[TOP_SPELL_DEFINE + 1];
char cast_arg2[MAX_INPUT_LENGTH];
/* local functions */ /* local functions */
void say_spell(struct char_data *ch, int spellnum, struct char_data *tch, struct obj_data *tobj); void say_spell(struct char_data *ch, int spellnum, struct char_data *tch, struct obj_data *tobj);
@ -35,19 +34,16 @@ ACMD(do_cast);
void unused_spell(int spl); void unused_spell(int spl);
void mag_assign_spells(void); void mag_assign_spells(void);
/* /* This arrangement is pretty stupid, but the number of skills is limited by
* This arrangement is pretty stupid, but the number of skills is limited by
* the playerfile. We can arbitrarily increase the number of skills by * the playerfile. We can arbitrarily increase the number of skills by
* increasing the space in the playerfile. Meanwhile, 200 should provide * increasing the space in the playerfile. Meanwhile, 200 should provide
* ample slots for skills. * ample slots for skills. */
*/
struct syllable { struct syllable {
const char *org; const char *org;
const char *news; const char *news;
}; };
struct syllable syls[] = { struct syllable syls[] = {
{" ", " "}, {" ", " "},
{"ar", "abra"}, {"ar", "abra"},
@ -84,7 +80,6 @@ struct syllable syls[] = {
}; };
const char *unused_spellname = "!UNUSED!"; /* So we can get &unused_spellname */ const char *unused_spellname = "!UNUSED!"; /* So we can get &unused_spellname */
int mag_manacost(struct char_data *ch, int spellnum) int mag_manacost(struct char_data *ch, int spellnum)
{ {
return MAX(SINFO.mana_max - (SINFO.mana_change * return MAX(SINFO.mana_max - (SINFO.mana_change *
@ -92,7 +87,6 @@ int mag_manacost(struct char_data *ch, int spellnum)
SINFO.mana_min); SINFO.mana_min);
} }
void say_spell(struct char_data *ch, int spellnum, struct char_data *tch, void say_spell(struct char_data *ch, int spellnum, struct char_data *tch,
struct obj_data *tobj) struct obj_data *tobj)
{ {
@ -150,11 +144,9 @@ void say_spell(struct char_data *ch, int spellnum, struct char_data *tch,
} }
} }
/* /* This function should be used anytime you are not 100% sure that you have
* This function should be used anytime you are not 100% sure that you have
* a valid spell/skill number. A typical for() loop would not need to use * a valid spell/skill number. A typical for() loop would not need to use
* this because you can guarantee > 0 and <= TOP_SPELL_DEFINE. * this because you can guarantee > 0 and <= TOP_SPELL_DEFINE. */
*/
const char *skill_name(int num) const char *skill_name(int num)
{ {
if (num > 0 && num <= TOP_SPELL_DEFINE) if (num > 0 && num <= TOP_SPELL_DEFINE)
@ -165,7 +157,6 @@ const char *skill_name(int num)
return ("UNDEFINED"); return ("UNDEFINED");
} }
int find_skill_num(char *name) int find_skill_num(char *name)
{ {
int skindex, ok; int skindex, ok;
@ -194,15 +185,12 @@ int find_skill_num(char *name)
return (-1); return (-1);
} }
/* /*
* This function is the very heart of the entire magic system. All * This function is the very heart of the entire magic system. All invocations
* invocations of all types of magic -- objects, spoken and unspoken PC * of all types of magic -- objects, spoken and unspoken PC and NPC spells, the
* and NPC spells, the works -- all come through this function eventually. * works -- all come through this function eventually. This is also the entry
* This is also the entry point for non-spoken or unrestricted spells. * point for non-spoken or unrestricted spells. Spellnum 0 is legal but silently
* Spellnum 0 is legal but silently ignored here, to make callers simpler. * ignored here, to make callers simpler. */
*/
int call_magic(struct char_data *caster, struct char_data *cvict, int call_magic(struct char_data *caster, struct char_data *cvict,
struct obj_data *ovict, int spellnum, int level, int casttype) struct obj_data *ovict, int spellnum, int level, int casttype)
{ {
@ -245,7 +233,6 @@ int call_magic(struct char_data *caster, struct char_data *cvict,
break; break;
} }
if (IS_SET(SINFO.routines, MAG_DAMAGE)) if (IS_SET(SINFO.routines, MAG_DAMAGE))
if (mag_damage(level, caster, cvict, spellnum, savetype) == -1) if (mag_damage(level, caster, cvict, spellnum, savetype) == -1)
return (-1); /* Successful and target died, don't cast again. */ return (-1); /* Successful and target died, don't cast again. */
@ -293,20 +280,15 @@ int call_magic(struct char_data *caster, struct char_data *cvict,
return (1); return (1);
} }
/* /* mag_objectmagic: This is the entry-point for all magic items. This should
* mag_objectmagic: This is the entry-point for all magic items. This should
* only be called by the 'quaff', 'use', 'recite', etc. routines. * only be called by the 'quaff', 'use', 'recite', etc. routines.
*
* For reference, object values 0-3: * For reference, object values 0-3:
* staff - [0] level [1] max charges [2] num charges [3] spell num * staff - [0] level [1] max charges [2] num charges [3] spell num
* wand - [0] level [1] max charges [2] num charges [3] spell num * wand - [0] level [1] max charges [2] num charges [3] spell num
* scroll - [0] level [1] spell num [2] spell num [3] spell num * scroll - [0] level [1] spell num [2] spell num [3] spell num
* potion - [0] level [1] spell num [2] spell num [3] spell num * potion - [0] level [1] spell num [2] spell num [3] spell num
* * Staves and wands will default to level 14 if the level is not specified; the
* Staves and wands will default to level 14 if the level is not specified; * DikuMUD format did not specify staff and wand levels in the world files */
* the DikuMUD format did not specify staff and wand levels in the world
* files (this is a CircleMUD enhancement).
*/
void mag_objectmagic(struct char_data *ch, struct obj_data *obj, void mag_objectmagic(struct char_data *ch, struct obj_data *obj,
char *argument) char *argument)
{ {
@ -337,12 +319,8 @@ void mag_objectmagic(struct char_data *ch, struct obj_data *obj,
/* Level to cast spell at. */ /* Level to cast spell at. */
k = GET_OBJ_VAL(obj, 0) ? GET_OBJ_VAL(obj, 0) : DEFAULT_STAFF_LVL; k = GET_OBJ_VAL(obj, 0) ? GET_OBJ_VAL(obj, 0) : DEFAULT_STAFF_LVL;
/* /* Area/mass spells on staves can cause crashes. So we use special cases
* Problem : Area/mass spells on staves can cause crashes. * for those spells spells here. */
* Solution: Remove the special nature of area/mass spells on staves.
* Problem : People like that behavior.
* Solution: We special case the area/mass spells here.
*/
if (HAS_SPELL_ROUTINE(GET_OBJ_VAL(obj, 3), MAG_MASSES | MAG_AREAS)) { if (HAS_SPELL_ROUTINE(GET_OBJ_VAL(obj, 3), MAG_MASSES | MAG_AREAS)) {
for (i = 0, tch = world[IN_ROOM(ch)].people; tch; tch = tch->next_in_room) for (i = 0, tch = world[IN_ROOM(ch)].people; tch; tch = tch->next_in_room)
i++; i++;
@ -451,15 +429,10 @@ void mag_objectmagic(struct char_data *ch, struct obj_data *obj,
} }
} }
/* cast_spell is used generically to cast any spoken spell, assuming we already
/* * have the target char/obj and spell number. It checks all restrictions,
* cast_spell is used generically to cast any spoken spell, assuming we * prints the words, etc. Entry point for NPC casts. Recommended entry point
* already have the target char/obj and spell number. It checks all * for spells cast by NPCs via specprocs. */
* restrictions, etc., prints the words, etc.
*
* Entry point for NPC casts. Recommended entry point for spells cast
* by NPCs via specprocs.
*/
int cast_spell(struct char_data *ch, struct char_data *tch, int cast_spell(struct char_data *ch, struct char_data *tch,
struct obj_data *tobj, int spellnum) struct obj_data *tobj, int spellnum)
{ {
@ -512,12 +485,10 @@ int cast_spell(struct char_data *ch, struct char_data *tch,
} }
/* /* do_cast is the entry point for PC-casted spells. It parses the arguments,
* do_cast is the entry point for PC-casted spells. It parses the arguments,
* determines the spell number and finds a target, throws the die to see if * determines the spell number and finds a target, throws the die to see if
* the spell can be cast, checks for sufficient mana and subtracts it, and * the spell can be cast, checks for sufficient mana and subtracts it, and
* passes control to cast_spell(). * passes control to cast_spell(). */
*/
ACMD(do_cast) ACMD(do_cast)
{ {
struct char_data *tch = NULL; struct char_data *tch = NULL;
@ -566,6 +537,9 @@ ACMD(do_cast)
strlcpy(arg, t, sizeof(arg)); strlcpy(arg, t, sizeof(arg));
one_argument(arg, t); one_argument(arg, t);
skip_spaces(&t); skip_spaces(&t);
/* Copy target to global cast_arg2, for use in spells like locate object */
strcpy(cast_arg2, t);
} }
if (IS_SET(SINFO.targets, TAR_IGNORE)) { if (IS_SET(SINFO.targets, TAR_IGNORE)) {
target = TRUE; target = TRUE;
@ -653,8 +627,6 @@ ACMD(do_cast)
} }
} }
void spell_level(int spell, int chclass, int level) void spell_level(int spell, int chclass, int level)
{ {
int bad = 0; int bad = 0;
@ -700,7 +672,6 @@ void spello(int spl, const char *name, int max_mana, int min_mana,
spell_info[spl].wear_off_msg = wearoff; spell_info[spl].wear_off_msg = wearoff;
} }
void unused_spell(int spl) void unused_spell(int spl)
{ {
int i; int i;
@ -718,52 +689,30 @@ void unused_spell(int spl)
} }
#define skillo(skill, name) spello(skill, name, 0, 0, 0, 0, 0, 0, 0, NULL); #define skillo(skill, name) spello(skill, name, 0, 0, 0, 0, 0, 0, 0, NULL);
/* Arguments for spello calls:
/*
* Arguments for spello calls:
*
* spellnum, maxmana, minmana, manachng, minpos, targets, violent?, routines. * spellnum, maxmana, minmana, manachng, minpos, targets, violent?, routines.
*
* spellnum: Number of the spell. Usually the symbolic name as defined in * spellnum: Number of the spell. Usually the symbolic name as defined in
* spells.h (such as SPELL_HEAL). * spells.h (such as SPELL_HEAL).
*
* spellname: The name of the spell. * spellname: The name of the spell.
*
* maxmana : The maximum mana this spell will take (i.e., the mana it * maxmana : The maximum mana this spell will take (i.e., the mana it
* will take when the player first gets the spell). * will take when the player first gets the spell).
*
* minmana : The minimum mana this spell will take, no matter how high * minmana : The minimum mana this spell will take, no matter how high
* level the caster is. * level the caster is.
*
* manachng: The change in mana for the spell from level to level. This * manachng: The change in mana for the spell from level to level. This
* number should be positive, but represents the reduction in mana cost as * number should be positive, but represents the reduction in mana cost as
* the caster's level increases. * the caster's level increases.
*
* minpos : Minimum position the caster must be in for the spell to work * minpos : Minimum position the caster must be in for the spell to work
* (usually fighting or standing). targets : A "list" of the valid targets * (usually fighting or standing). targets : A "list" of the valid targets
* for the spell, joined with bitwise OR ('|'). * for the spell, joined with bitwise OR ('|').
*
* violent : TRUE or FALSE, depending on if this is considered a violent * violent : TRUE or FALSE, depending on if this is considered a violent
* spell and should not be cast in PEACEFUL rooms or on yourself. Should be * spell and should not be cast in PEACEFUL rooms or on yourself. Should be
* set on any spell that inflicts damage, is considered aggressive (i.e. * set on any spell that inflicts damage, is considered aggressive (i.e.
* charm, curse), or is otherwise nasty. * charm, curse), or is otherwise nasty.
*
* routines: A list of magic routines which are associated with this spell * routines: A list of magic routines which are associated with this spell
* if the spell uses spell templates. Also joined with bitwise OR ('|'). * if the spell uses spell templates. Also joined with bitwise OR ('|').
* * See the documentation for a more detailed description of these fields. You
* See the CircleMUD documentation for a more detailed description of these * only need a spello() call to define a new spell; to decide who gets to use
* fields. * a spell or skill, look in class.c. -JE */
*/
/*
* NOTE: SPELL LEVELS ARE NO LONGER ASSIGNED HERE AS OF Circle 3.0 bpl9.
* In order to make this cleaner, as well as to make adding new classes
* much easier, spell levels are now assigned in class.c. You only need
* a spello() call to define a new spell; to decide who gets to use a spell
* or skill, look in class.c. -JE 5 Feb 1996
*/
void mag_assign_spells(void) void mag_assign_spells(void)
{ {
int i; int i;
@ -978,10 +927,8 @@ void mag_assign_spells(void)
TAR_CHAR_ROOM | TAR_OBJ_INV | TAR_OBJ_ROOM, FALSE, MAG_MANUAL, TAR_CHAR_ROOM | TAR_OBJ_INV | TAR_OBJ_ROOM, FALSE, MAG_MANUAL,
NULL); NULL);
/* /* These spells are currently not used, not implemented, and not castable.
* These spells are currently not used, not implemented, and not castable. * Values for the 'breath' spells are filled in assuming a dragon's breath. */
* Values for the 'breath' spells are filled in assuming a dragon's breath.
*/
spello(SPELL_FIRE_BREATH, "fire breath", 0, 0, 0, POS_SITTING, spello(SPELL_FIRE_BREATH, "fire breath", 0, 0, 0, POS_SITTING,
TAR_IGNORE, TRUE, 0, TAR_IGNORE, TRUE, 0,
@ -1008,12 +955,9 @@ void mag_assign_spells(void)
TAR_IGNORE, TRUE, 0, TAR_IGNORE, TRUE, 0,
NULL); NULL);
/* /* Declaration of skills - this actually doesn't do anything except set it up
* Declaration of skills - this actually doesn't do anything except * so that immortals can use these skills by default. The min level to use
* set it up so that immortals can use these skills by default. The * the skill for other classes is set up in class.c. */
* min level to use the skill for other classes is set up in class.c.
*/
skillo(SKILL_BACKSTAB, "backstab"); skillo(SKILL_BACKSTAB, "backstab");
skillo(SKILL_BASH, "bash"); skillo(SKILL_BASH, "bash");
skillo(SKILL_HIDE, "hide"); skillo(SKILL_HIDE, "hide");

View file

@ -11,7 +11,6 @@
#include "conf.h" #include "conf.h"
#include "sysdep.h" #include "sysdep.h"
#include "structs.h" #include "structs.h"
#include "utils.h" #include "utils.h"
#include "comm.h" #include "comm.h"
@ -25,6 +24,7 @@
/* external variables */ /* external variables */
extern room_rnum r_mortal_start_room; extern room_rnum r_mortal_start_room;
extern int mini_mud; extern int mini_mud;
extern char cast_arg2[MAX_STRING_LENGTH];
/* external functions */ /* external functions */
void weight_change_object(struct obj_data *obj, int weight); void weight_change_object(struct obj_data *obj, int weight);
@ -33,10 +33,7 @@ void name_to_drinkcon(struct obj_data *obj, int type);
void name_from_drinkcon(struct obj_data *obj); void name_from_drinkcon(struct obj_data *obj);
int compute_armor_class(struct char_data *ch); int compute_armor_class(struct char_data *ch);
/* /* Special spells appear below. */
* Special spells appear below.
*/
ASPELL(spell_create_water) ASPELL(spell_create_water)
{ {
int water; int water;
@ -65,7 +62,6 @@ ASPELL(spell_create_water)
} }
} }
ASPELL(spell_recall) ASPELL(spell_recall)
{ {
if (victim == NULL || IS_NPC(victim)) if (victim == NULL || IS_NPC(victim))
@ -81,7 +77,6 @@ ASPELL(spell_recall)
greet_memory_mtrigger(victim); greet_memory_mtrigger(victim);
} }
ASPELL(spell_teleport) ASPELL(spell_teleport)
{ {
room_rnum to_room; room_rnum to_room;
@ -105,7 +100,6 @@ ASPELL(spell_teleport)
} }
#define SUMMON_FAIL "You failed.\r\n" #define SUMMON_FAIL "You failed.\r\n"
ASPELL(spell_summon) ASPELL(spell_summon)
{ {
if (ch == NULL || victim == NULL) if (ch == NULL || victim == NULL)
@ -157,7 +151,52 @@ ASPELL(spell_summon)
greet_memory_mtrigger(victim); greet_memory_mtrigger(victim);
} }
/* Used by the locate object spell to check the alias list on objects */
int isname_obj(char *search, char *list)
{
char *found_in_list; //but could be something like 'ring' in 'shimmering'
char searchname[128];
char namelist[MAX_STRING_LENGTH];
int found_pos = -1;
int found_name=0; /* found the name we're looking for */
int match = 1;
int i;
/* Force to lowercase for string comparisons */
sprintf(searchname, "%s", search);
for (i = 0; searchname[i]; i++)
searchname[i] = LOWER(searchname[i]);
sprintf(namelist, "%s", list);
for (i = 0; namelist[i]; i++)
namelist[i] = LOWER(namelist[i]);
/* see if searchname exists any place within namelist */
found_in_list = strstr(namelist, searchname);
if (!found_in_list) {
return 0;
}
/* Found the name in the list, now see if it's a valid hit. The following
* avoids substrings (like ring in shimmering) is it at beginning of
* namelist? */
for (i = 0; searchname[i]; i++)
if (searchname[i] != namelist[i])
match = 0;
if (match) /* It was found at the start of the namelist string. */
found_name = 1;
else { /* It is embedded inside namelist. Is it preceded by a space? */
found_pos = found_in_list - namelist;
if (namelist[found_pos-1] == ' ')
found_name = 1;
}
if (found_name)
return 1;
else
return 0;
}
ASPELL(spell_locate_object) ASPELL(spell_locate_object)
{ {
@ -165,22 +204,18 @@ ASPELL(spell_locate_object)
char name[MAX_INPUT_LENGTH]; char name[MAX_INPUT_LENGTH];
int j; int j;
/*
* FIXME: This is broken. The spell parser routines took the argument
* the player gave to the spell and located an object with that keyword.
* Since we're passed the object and not the keyword we can only guess
* at what the player originally meant to search for. -gg
*/
if (!obj) { if (!obj) {
send_to_char(ch, "You sense nothing.\r\n"); send_to_char(ch, "You sense nothing.\r\n");
return; return;
} }
strlcpy(name, fname(obj->name), sizeof(name)); /* added a global var to catch 2nd arg. */
j = level / 2; sprintf(name, "%s", cast_arg2);
j = GET_LEVEL(ch) / 2; /* # items to show = twice char's level */
for (i = object_list; i && (j > 0); i = i->next) { for (i = object_list; i && (j > 0); i = i->next) {
if (!isname(name, i->name)) if (!isname_obj(name, i->name))
continue; continue;
send_to_char(ch, "%s", CAP(strdup(i->short_description))); send_to_char(ch, "%s", CAP(strdup(i->short_description)));
@ -198,13 +233,8 @@ ASPELL(spell_locate_object)
j--; j--;
} }
if (j == level / 2)
send_to_char(ch, "You sense nothing.\r\n");
} }
ASPELL(spell_charm) ASPELL(spell_charm)
{ {
struct affected_type af; struct affected_type af;

View file

@ -1040,7 +1040,7 @@ struct game_data {
int dts_are_dumps; /* Should items in dt's be junked? */ int dts_are_dumps; /* Should items in dt's be junked? */
int load_into_inventory;/* Objects load in immortals inventory. */ int load_into_inventory;/* Objects load in immortals inventory. */
int track_through_doors;/* Track through doors while closed? */ int track_through_doors;/* Track through doors while closed? */
int immort_level_ok; /* Automatically level mortals to imm? */ int no_mort_to_immort; /* Prevent mortals leveling to imms? */
char *OK; /* When player receives 'Okay.' text. */ char *OK; /* When player receives 'Okay.' text. */
char *NOPERSON; /* 'No-one by that name here.' */ char *NOPERSON; /* 'No-one by that name here.' */

View file

@ -152,9 +152,9 @@ void write_wizlist(FILE * out, int minlev, int maxlev)
int i, j; int i, j;
fprintf(out, fprintf(out,
"*************************************************************************\n" "*******************************************************************************\n"
"* The following people have reached immortality on tbaMUD. *\n" "* The following people have reached immortality on tbaMUD. *\n"
"*************************************************************************\n\n"); "*******************************************************************************\n\n");
for (curr_level = levels; curr_level; curr_level = curr_level->next) { for (curr_level = levels; curr_level; curr_level = curr_level->next) {
if (curr_level->params->level < minlev || if (curr_level->params->level < minlev ||

View file

@ -577,7 +577,7 @@ void update_pos(struct char_data *victim);
#define CONFIG_DTS_ARE_DUMPS config_info.play.dts_are_dumps #define CONFIG_DTS_ARE_DUMPS config_info.play.dts_are_dumps
#define CONFIG_LOAD_INVENTORY config_info.play.load_into_inventory #define CONFIG_LOAD_INVENTORY config_info.play.load_into_inventory
#define CONFIG_TRACK_T_DOORS config_info.play.track_through_doors #define CONFIG_TRACK_T_DOORS config_info.play.track_through_doors
#define CONFIG_IMMORT_LEVEL_OK config_info.play.immort_level_ok #define CONFIG_NO_MORT_TO_IMMORT config_info.play.no_mort_to_immort
#define CONFIG_OK config_info.play.OK #define CONFIG_OK config_info.play.OK
#define CONFIG_NOPERSON config_info.play.NOPERSON #define CONFIG_NOPERSON config_info.play.NOPERSON
#define CONFIG_NOEFFECT config_info.play.NOEFFECT #define CONFIG_NOEFFECT config_info.play.NOEFFECT