diff -ur src/Makefile new/Makefile --- src/Makefile Thu Apr 24 12:37:54 2003 +++ new/Makefile Wed May 7 20:25:00 2003 @@ -2,7 +2,10 @@ PROF = -ggdb3 WARN = -Wall -Werror LIBS = -lcrypt -lz -D_FLAGS = -DNO_STRHASH #-DNO_MCCP +#STRHASH: 0 = no string hashing. + 1 = ROM fread_string() hashing only. + 2 = full string hashing +D_FLAGS = -DSTRHASH=0 #-DNO_MCCP -DNO_WEB -DNOCRYPT C_FLAGS = $(WARN) $(PROF) $(D_FLAGS) L_FLAGS = $(PROF) $(LIBS) Only in src/: Makefile.linux Only in src/: Makefile.normal Only in src/: Makefile.solaris diff -ur src/act_comm.c new/act_comm.c --- src/act_comm.c Sun Apr 27 22:08:24 2003 +++ new/act_comm.c Thu May 8 14:57:41 2003 @@ -117,7 +117,7 @@ const char *chan, const char *str, int type) { int i; - char time[MIL]; + char *time; char buf[MSL]; if (IS_NPC(viewer) || IS_NULLSTR(str) || IS_NULLSTR(chan) || last < 0 @@ -130,7 +130,7 @@ viewer->pcdata->history[last][i - 1]); } - strftime(time, 100, "%r", localtime(¤t_time)); + time = str_time(current_time, GET_TZONE(viewer), "%r"); switch (type) { case CHANNEL_NORMAL: @@ -1617,18 +1617,39 @@ return; } -int find_colour_slot(const char *code) +int attribute_lookup(const char *arg) { int i; - for (i = 0; colour_chars[i].code != NULL; i++) - if (!str_cmp(code, colour_chars[i].code)) + for (i = 0; colour_attributes[i].name != NULL; i++) + if (!str_prefix(arg, colour_attributes[i].name)) return i; - return 0; + return -1; +} + +int foreground_lookup(const char *arg) +{ + int i; + + for (i = 0; colour_foregrounds[i].name != NULL; i++) + if (!str_prefix(arg, colour_foregrounds[i].name)) + return i; + + return -1; +} + +int background_lookup(const char *arg) +{ + int i; + + for (i = 0; colour_backgrounds[i].name != NULL; i++) + if (!str_prefix(arg, colour_backgrounds[i].name)) + return i; + + return -1; } -/* Sets all or 1 custom colours to default */ void default_colour(CHAR_DATA * ch, int slot) { int i = 0; @@ -1638,17 +1659,25 @@ if (slot == -1) { - for (i = 0; cslot_table[i].def != NULL; i++) - ch->pcdata->colour[cslot_table[i].slot] = - find_colour_slot(cslot_table[i].def); + for (i = 0; i < MAX_CUSTOM_COLOUR; i++) + { + ch->pcdata->colour[cslot_table[i].slot][0] = + cslot_table[i].col_attr; + ch->pcdata->colour[cslot_table[i].slot][1] = + cslot_table[i].col_fore; + ch->pcdata->colour[cslot_table[i].slot][2] = + cslot_table[i].col_back; + } } else { - for (i = 0; cslot_table[i].def != NULL; i++) + for (i = 0; i < MAX_CUSTOM_COLOUR; i++) { if (cslot_table[i].slot == slot) { - ch->pcdata->colour[slot] = find_colour_slot(cslot_table[i].def); + ch->pcdata->colour[slot][0] = cslot_table[i].col_attr; + ch->pcdata->colour[slot][1] = cslot_table[i].col_fore; + ch->pcdata->colour[slot][2] = cslot_table[i].col_back; break; } } @@ -1657,81 +1686,42 @@ return; } -const char *color_default(CHAR_DATA * ch) -{ - int colour; - - if (!ch || IS_NPC(ch)) - return C_CLEAR; - - colour = ch->pcdata->colour[_DEFAULT]; - - if (colour < 0 || colour_chars[colour].code == NULL) - return C_CLEAR; - - else if (!str_cmp(colour_chars[colour].code, C_RANDOM)) - return random_colour(); - - else if (!str_cmp(colour_chars[colour].code, RANDOM_BG)) - return random_background(); - - else - return colour_chars[ch->pcdata->colour[_DEFAULT]].code; -} - -/* return the players ansi code for a slot */ const char *char_colour(CHAR_DATA * ch, int slot) { - int colour; - - if (!ch || IS_NPC(ch) || slot < 0 || slot > MAX_CUSTOM_COLOUR) - return C_CLEAR; - - colour = ch->pcdata->colour[slot]; - - if (colour < 0 || colour_chars[colour].code == NULL) - return C_CLEAR; - - else if (!str_cmp(colour_chars[colour].code, C_RANDOM)) - return random_colour(); - - else if (!str_cmp(colour_chars[colour].code, RANDOM_BG)) - return random_background(); - - else - return colour_chars[colour].code; + extern int col_attr, col_fore, col_back; -} - -/* return a colour number */ -int colour_lookup(const char *arg) -{ - int i; + if (!ch || !ch->desc || IS_NPC(ch) || slot < 0 || slot >= MAX_CUSTOM_COLOUR) + { + col_attr = CL_CLEAR; + col_fore = FG_NONE; + col_back = BG_NONE; + return CL_DEFAULT; + } - for (i = 0; colour_chars[i].name != NULL; i++) - if (!str_cmp(arg, colour_chars[i].name)) - return i; + col_attr = ch->pcdata->colour[slot][0]; + col_fore = ch->pcdata->colour[slot][1]; + col_back = ch->pcdata->colour[slot][2]; - return -1; + return make_colour(); } -/* returns a custom colour number */ int cslot_lookup(const char *arg) { int i; - for (i = 0; cslot_table[i].name != NULL; i++) + for (i = 0; i < MAX_CUSTOM_COLOUR; i++) if (!str_prefix(arg, cslot_table[i].name)) return cslot_table[i].slot; return -1; } -/* sets custom colours */ CH_CMD(do_colourset) { - char arg[MIL], arg2[MIL]; - int i = 0, pos = 0, slot = 0, color = 0; + char arg[MIL], attr[MIL], fore[MIL], back[MIL]; + int i = 0, slot = 0; + int c_attr, c_fore, c_back; + int pos = 0; if (!ch || IS_NPC(ch) || !ch->desc) return; @@ -1743,15 +1733,16 @@ } argument = one_argument(argument, arg); - argument = one_argument(argument, arg2); + argument = one_argument(argument, attr); + argument = one_argument(argument, fore); + argument = one_argument(argument, back); if (IS_NULLSTR(arg)) { - chprintln - (ch, - "Syntax: colourset colours - lists possible colours"); chprintln(ch, - " colourset options - lists options to colourize"); + "Syntax: colourset colours - lists possible colours"); + chprintln(ch, + " colourset status - lists options to colourize"); chprintln(ch, " colourset <option> <colour> - sets an option to a colour"); chprintln(ch, @@ -1760,43 +1751,59 @@ " colourset default all - reset all options to default values"); return; } - if (!str_prefix(arg, "colours") || !str_prefix(arg, "colors")) + else if (!str_prefix(arg, "colours") || !str_prefix(arg, "colors")) { - chprintln(ch, "Available Colours:"); - for (i = 0; colour_chars[i].name != NULL; i++) + int j = 0, k = 0; + + chprintln(ch, "Attributes Foregrounds Backgrounds"); + chprintln(ch, draw_line(ch, NULL, 58)); + for (i = 0; colour_attributes[i].name != NULL; i++) { - chprintf(ch, "%s%-10s{x", colour_chars[i].code, - colour_chars[i].name); - if (++pos % 4 == 0) - { + chprintf(ch, "%-15s ", colour_attributes[i].name); + if (colour_foregrounds[j].name != NULL) + chprintf(ch, "%-15s ", colour_foregrounds[j++].name); + else + chprintf(ch, "%-15s ", " "); + if (colour_backgrounds[k].name != NULL) + chprintlnf(ch, "%s", colour_backgrounds[k++].name); + else chprintln(ch, ""); - pos = 0; - } } - if (pos != 0) - chprintln(ch, ""); + while (colour_foregrounds[j].name != NULL) + { + chprintf(ch, "%-15s %-15s ", " ", colour_foregrounds[j++].name); + if (colour_backgrounds[k].name != NULL) + chprintlnf(ch, "%s", colour_backgrounds[k++].name); + else + chprintln(ch, ""); + } + while (colour_backgrounds[k].name != NULL) + chprintlnf(ch, "%-15s %-15s %s", " ", " ", + colour_backgrounds[k++].name); + chprintln(ch, draw_line(ch, NULL, 58)); } - else if (!str_prefix(arg, "options")) + else if (!str_prefix(arg, "status")) { - chprintln(ch, "Available Options:"); - for (i = 0; cslot_table[i].name != NULL; i++) + chprintln(ch, + "Options that can currently be configured for color are:"); + chprintln(ch, draw_line(ch, NULL, 58)); + + for (i = 0; i < MAX_CUSTOM_COLOUR; i++) { - chprintf(ch, "" CTAG(%d) "%-10s{x", cslot_table[i].slot, - cslot_table[i].name); - if (++pos % 6 == 0) - { + chprintf(ch, "%-12s - " CTAG(%d) "Looks like this..{x ", + cslot_table[i].name, cslot_table[i].slot); + if (++pos % 2 == 0) chprintln(ch, ""); - pos = 0; - } } - if (pos != 0) + if (pos % 2 != 0) chprintln(ch, ""); + chprintln(ch, draw_line(ch, NULL, 58)); } else if (!str_prefix(arg, "default")) { - if ((slot = cslot_lookup(arg2)) == -1) + if ((slot = cslot_lookup(attr)) == -1) { - if (!str_cmp(arg2, "all")) + if (!str_cmp(attr, "all")) chprintln(ch, "All colour values set to default."); else { @@ -1805,8 +1812,7 @@ } } else - chprintf(ch, "%s set to default value.\n\r", - cslot_table[slot].name); + chprintlnf(ch, "%s set to default value.", cslot_table[slot].name); default_colour(ch, slot); return; } @@ -1818,16 +1824,40 @@ return; } - if ((color = colour_lookup(arg2)) == -1) + if (IS_NULLSTR(attr) || IS_NULLSTR(fore) || IS_NULLSTR(back)) + { + chprintln + (ch, + "Syntax: colourset <option> <attribute> <foreground> <background>"); + return; + } + + if ((c_attr = attribute_lookup(attr)) == -1) + { + chprintln(ch, "Invalid Colour Attribute."); + return; + } + + if ((c_fore = foreground_lookup(fore)) == -1) + { + chprintln(ch, "Invalid Foreground Colour."); + return; + } + + if ((c_back = background_lookup(back)) == -1) { - chprintln(ch, "Invalid Colour."); + chprintln(ch, "Invalid background Colour."); return; } - ch->pcdata->colour[slot] = color; - chprintf(ch, "%s%s{x set to %s%s{x.\n\r", char_colour(ch, slot), - cslot_table[slot].name, char_colour(ch, slot), - colour_chars[color].name); + ch->pcdata->colour[slot][0] = colour_attributes[c_attr].col_type; + ch->pcdata->colour[slot][1] = colour_foregrounds[c_fore].col_type; + ch->pcdata->colour[slot][2] = colour_backgrounds[c_back].col_type; + chprintlnf(ch, "%s set to %s%s %s, with %s background{x.", + cslot_table[slot].name, char_colour(ch, slot), + colour_attributes[c_attr].name, + colour_foregrounds[c_fore].name, + colour_backgrounds[c_back].name); return; } } diff -ur src/act_info.c new/act_info.c --- src/act_info.c Sun Apr 27 22:08:24 2003 +++ new/act_info.c Thu May 8 14:57:41 2003 @@ -91,17 +91,17 @@ return buf; if (IS_OBJ_STAT(obj, ITEM_INVIS)) - strcat(buf, "(Invis) "); + strcat(buf, "({cInvis{x) "); if (IS_AFFECTED(ch, AFF_DETECT_EVIL) && IS_OBJ_STAT(obj, ITEM_EVIL)) - strcat(buf, "(Red Aura) "); + strcat(buf, "({RRed Aura{x) "); if (IS_AFFECTED(ch, AFF_DETECT_GOOD) && IS_OBJ_STAT(obj, ITEM_BLESS)) - strcat(buf, "(Blue Aura) "); + strcat(buf, "({BBlue Aura{x) "); if (IS_AFFECTED(ch, AFF_DETECT_MAGIC) && IS_OBJ_STAT(obj, ITEM_MAGIC)) - strcat(buf, "(Magical) "); + strcat(buf, "({MMagical{x) "); if (IS_OBJ_STAT(obj, ITEM_GLOW)) - strcat(buf, "(Glowing) "); + strcat(buf, "({YGlowing{x) "); if (IS_OBJ_STAT(obj, ITEM_HUM)) - strcat(buf, "(Humming) "); + strcat(buf, "({CHumming{x) "); if (IS_QUESTOR(ch) && (obj->pIndexData->vnum == ch->pcdata->questobj)) strcat(buf, "{r[{RTARGET{r]{x "); @@ -246,31 +246,31 @@ buf[0] = '\0'; if (IS_SET(victim->comm, COMM_AFK)) - strcat(buf, "[AFK] "); + strcat(buf, "{Y[{RAFK{Y]{x "); if (IS_AFFECTED(victim, AFF_INVISIBLE)) - strcat(buf, "(Invis) "); + strcat(buf, "({cInvis{x) "); if (victim->invis_level >= LEVEL_HERO) - strcat(buf, "(Wizi) "); + strcat(buf, "{c({WWizi{c){x "); if (IS_AFFECTED(victim, AFF_HIDE)) - strcat(buf, "(Hide) "); + strcat(buf, "({DHide{x) "); if (IS_AFFECTED(victim, AFF_CHARM)) - strcat(buf, "(Charmed) "); + strcat(buf, "({MCharmed{x) "); if (IS_AFFECTED(victim, AFF_PASS_DOOR)) - strcat(buf, "(Translucent) "); + strcat(buf, "({cTranslucent{x) "); if (IS_AFFECTED(victim, AFF_FAERIE_FIRE)) - strcat(buf, "(Pink Aura) "); + strcat(buf, "({MPink Aura{x) "); if (IS_EVIL(victim) && IS_AFFECTED(ch, AFF_DETECT_EVIL)) - strcat(buf, "(Red Aura) "); + strcat(buf, "({RRed Aura{x) "); if (IS_GOOD(victim) && IS_AFFECTED(ch, AFF_DETECT_GOOD)) - strcat(buf, "(Golden Aura) "); + strcat(buf, "({YGolden Aura{x) "); if (IS_AFFECTED(victim, AFF_SANCTUARY)) - strcat(buf, "(White Aura) "); + strcat(buf, "({WWhite Aura{x) "); if (!IS_NPC(victim) && IS_SET(victim->act, PLR_WAR)) - strcat(buf, "(WAR) "); + strcat(buf, "({RWAR{x) "); if (!IS_NPC(victim) && IS_SET(victim->act, PLR_KILLER)) - strcat(buf, "(KILLER) "); + strcat(buf, "({rKILLER{x) "); if (!IS_NPC(victim) && IS_SET(victim->act, PLR_THIEF)) - strcat(buf, "(THIEF) "); + strcat(buf, "({rTHIEF{x) "); if (IS_QUESTOR(ch) && IS_NPC(victim) && (victim->pIndexData->vnum == ch->pcdata->questmob)) strcat(buf, "{r[{RTARGET{r]{x "); @@ -278,7 +278,7 @@ if (ON_GQUEST(ch) && IS_NPC(victim) && is_gqmob(ch, victim->pIndexData->vnum) != -1) { - strcat(buf, "(Gquest) "); + strcat(buf, "{Y({RGquest{Y){x "); } if (victim->position == victim->start_pos && victim->long_descr[0] != '\0') @@ -967,7 +967,7 @@ (IS_NPC(ch) || IS_SET(ch->act, PLR_HOLYLIGHT))) || IS_BUILDER(ch, ch->in_room->area)) { - chprintf(ch, " [Room {R%ld" CTAG(_RTITLE) "]", ch->in_room->vnum); + chprintf(ch, " {w[{WRoom {R%ld{w]", ch->in_room->vnum); } chprintln(ch, "{x"); @@ -1693,6 +1693,24 @@ char *suf; int day; + if (!IS_NULLSTR(argument)) + { + CHAR_DATA *victim; + + if ((victim = get_char_world(ch, argument)) == NULL || IS_NPC(victim)) + { + chprintln(ch, "There is no such player."); + return; + } + if (GET_TZONE(victim) == -1) + { + act("$N doesn't have a time zone set.", ch, NULL, victim, TO_CHAR); + return; + } + act("{W$N's local time is $t.{x", ch, + str_time(current_time, GET_TZONE(victim), NULL), victim, TO_CHAR); + return; + } day = time_info.day + 1; if (day > 4 && day < 20) @@ -1712,11 +1730,54 @@ time_info.hour >= 12 ? "pm" : "am", day_name[day % 7], day, suf, month_name[time_info.month]); chprintlnf(ch, "ROM started up at %s\n\rThe system time is %s.", - str_boot_time, (char *) ctime(¤t_time)); + str_boot_time, str_time(current_time, -1, NULL)); + + if (GET_TZONE(ch) != -1) + chprintlnf(ch, "Your local time is %s", + str_time(current_time, GET_TZONE(ch), NULL)); + else + chprintln + (ch, + "Your local time is not set! Use the 'timezone' command to set your time zone."); return; } +CH_CMD(do_timezone) +{ + int i; + + if (IS_NPC(ch)) + return; + + if (IS_NULLSTR(argument)) + { + chprintlnf(ch, "%-6s %-29s (%s)", "Name", "City/Zone Crosses", "Time"); + chprintln(ch, draw_line(ch, NULL, 0)); + for (i = 0; i < MAX_TZONE; i++) + { + chprintlnf(ch, "%-6s %-29s (%s)", tzone_table[i].name, + tzone_table[i].zone, str_time(current_time, i, NULL)); + } + chprintln(ch, draw_line(ch, NULL, 0)); + return; + } + + i = tzone_lookup(argument); + + if (i == -1) + { + chprintln + (ch, + "That time zone does not exists. Make sure to use the exact name."); + return; + } + + ch->pcdata->timezone = i; + chprintlnf(ch, "Your time zone is now %s %s (%s)", tzone_table[i].name, + tzone_table[i].zone, str_time(current_time, i, NULL)); +} + CH_CMD(do_weather) { @@ -1740,8 +1801,6 @@ return; } -#define HELP_LOG "help.log" - /* Syntax(s): help <letter> - list help files that start with <letter> @@ -1849,7 +1908,6 @@ "No help found for %s. Try using just the first letter.\n\r", nohelp); add_buf(buffer, buf); - append_file(ch, HELP_LOG, nohelp); sprintf(log_buf, "Missing Help: %s", nohelp); wiznet(log_buf, ch, NULL, 0, 0, 0); } diff -ur src/act_obj.c new/act_obj.c --- src/act_obj.c Sun Apr 27 22:08:24 2003 +++ new/act_obj.c Thu May 8 14:57:41 2003 @@ -3191,10 +3191,7 @@ void save_donation_pit(void) { OBJ_DATA *pit; - FILE *fp; -#if !defined(WIN32) - char *TEMPFILE = PIT_FILE ".tmp"; -#endif + FILE_DATA *fp; for (pit = object_first; pit; pit = pit->next) { @@ -3205,21 +3202,14 @@ if (!pit) return; -#if defined(WIN32) - if ((fp = file_open(PIT_FILE, "w")) != NULL) -#else - if ((fp = file_open(TEMPFILE, "w")) != NULL) -#endif + if ((fp = fopen_temp(PIT_FILE)) != NULL) { if (pit->first_content) - fwrite_obj(NULL, pit->first_content, fp, 0, "P"); - fprintf(fp, "#END\n"); - fflush(fp); + fwrite_obj(NULL, pit->first_content, fp->file, 0, "P"); + fprintf(fp->file, "#END\n"); + fflush(fp->file); + fclose_temp(fp); } - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, PIT_FILE); -#endif } void load_donation_pit(void) diff -ur src/act_wiz.c new/act_wiz.c --- src/act_wiz.c Sun Apr 27 22:08:24 2003 +++ new/act_wiz.c Thu May 8 14:57:41 2003 @@ -4392,7 +4392,7 @@ } /* This file holds the copyover data */ -#define COPYOVER_FILE "copyover.data" +#define COPYOVER_FILE DATA_DIR "copyover.dat" /* This is the executable file */ #define EXE_FILE "../src/rom" @@ -4423,9 +4423,11 @@ return; } + set_vtimer(-1); + /* Consider changing all saved areas here, if you use OLC */ - do_asave(NULL, ""); + do_asave(NULL, "changed"); save_gquest_data(); @@ -4487,7 +4489,9 @@ fclose(fpReserve); +#if !defined(NO_WEB) shutdown_web_server(); +#endif /* exec - descriptors are inherited */ @@ -4518,6 +4522,8 @@ bool fOld; logf("Copyover recovery initiated"); + + set_vtimer(-1); fp = file_open(COPYOVER_FILE, "r"); diff -ur src/ansi.h new/ansi.h --- src/ansi.h Sun Apr 27 22:08:25 2003 +++ new/ansi.h Thu May 8 14:57:42 2003 @@ -32,49 +32,44 @@ #define ANSI_CUSTOM '\x11' #define ANSI_END '\x12' -#define C_BLANK "\x01B[%d;%dm" -#define C_REVERSE "\x01B[7m" -#define C_FLASH "\x01B[5m" -#define C_UNDERSCORE "\x01B[4m" -#define C_TILDE '~' -#define C_BEEP '\a' +#define FG_BLACK 30 +#define FG_RED 31 +#define FG_GREEN 32 +#define FG_YELLOW 33 +#define FG_BLUE 34 +#define FG_MAGENTA 35 +#define FG_CYAN 36 +#define FG_WHITE 37 +#define FG_RANDOM -1 +#define FG_NONE 0 -#define C_BLACK "\x01B[0;30m" -#define C_RED "\x01B[0;31m" -#define C_GREEN "\x01B[0;32m" -#define C_YELLOW "\x01B[0;33m" -#define C_BLUE "\x01B[0;34m" -#define C_MAGENTA "\x01B[0;35m" -#define C_CYAN "\x01B[0;36m" -#define C_WHITE "\x01B[0;37m" -#define CB_BLACK "\x01B[1;30m" -#define CB_RED "\x01B[1;31m" -#define CB_GREEN "\x01B[1;32m" -#define CB_YELLOW "\x01B[1;33m" -#define CB_BLUE "\x01B[1;34m" -#define CB_MAGENTA "\x01B[1;35m" -#define CB_CYAN "\x01B[1;36m" -#define CB_WHITE "\x01B[1;37m" -#define C_CLEAR "\x01B[0m" -#define C_RANDOM "{`" +#define BG_BLACK 40 +#define BG_RED 41 +#define BG_GREEN 42 +#define BG_YELLOW 43 +#define BG_BLUE 44 +#define BG_MAGENTA 45 +#define BG_CYAN 46 +#define BG_WHITE 47 +#define BG_RANDOM -1 +#define BG_NONE 0 -#define RED_BG "\x01B[0;41m" -#define BLUE_BG "\x01B[0;44m" -#define GREEN_BG "\x01B[0;42m" -#define BLACK_BG "\x01B[0;40m" -#define WHITE_BG "\x01B[0;47m" -#define MAGENTA_BG "\x01B[0;45m" -#define YELLOW_BG "\x01B[0;43m" -#define CYAN_BG "\x01B[0;46m" -#define RED_BBG "\x01B[1;41m" -#define BLUE_BBG "\x01B[1;44m" -#define GREEN_BBG "\x01B[1;42m" -#define BLACK_BBG "\x01B[1;40m" -#define WHITE_BBG "\x01B[1;47m" -#define MAGENTA_BBG "\x01B[1;45m" -#define YELLOW_BBG "\x01B[1;43m" -#define CYAN_BBG "\x01B[1;46m" -#define RANDOM_BG "{=" +#define CL_CLEAR 0 +#define CL_BRIGHT 1 +#define CL_DIM 2 +#define CL_STANDOUT 3 +#define CL_UNDER 4 +#define CL_BLINK 5 +#define CL_ITALIC 6 +#define CL_REVERSE 7 +#define CL_HIDDEN 8 +#define CL_RANDOM -1 + +#define CL_DEFAULT "\033[0m" + +#define CL_FORMAT1 "\033[%dm" +#define CL_FORMAT2 "\033[%d;%dm" +#define CL_FORMAT3 "\033[%d;%d;%dm" #define ALIGN_NONE 0 #define ALIGN_LEFT 1 diff -ur src/automap.c new/automap.c --- src/automap.c Sun Apr 27 22:08:24 2003 +++ new/automap.c Thu May 8 14:57:41 2003 @@ -500,6 +500,7 @@ } while (!alldesc); } + strcat(buf, "{x"); chprintln(ch, buf); } } diff -ur src/board.c new/board.c --- src/board.c Sun Apr 27 22:08:24 2003 +++ new/board.c Thu May 8 14:57:41 2003 @@ -242,14 +242,15 @@ /* save a single board */ static void save_board(BOARD_DATA * board) { - FILE *fp; + FILE_DATA *fp; char filename[200]; char buf[200]; NOTE_DATA *note; sprintf(filename, "%s/%s", NOTE_DIR, board->short_name); - fp = file_open(filename, "w"); + fp = fopen_temp(filename); + if (!fp) { sprintf(buf, "Error writing to: %s", filename); @@ -258,9 +259,9 @@ else { for (note = board->note_first; note; note = note->next) - append_note(fp, note); + append_note(fp->file, note); - file_close(fp); + fclose_temp(fp); } } @@ -451,7 +452,6 @@ /* Start writing a note */ static void do_nwrite(CHAR_DATA * ch, const char *argument) { - char *strtime; char buf[200]; if (IS_NPC(ch)) /* NPC cannot post notes */ @@ -479,11 +479,8 @@ ch->pcdata->in_progress = new_note(); ch->pcdata->in_progress->sender = str_dup(ch->name); - /* convert to ascii. ctime returns a string which last character is \n, so remove that */ - strtime = ctime(¤t_time); - strtime[strlen(strtime) - 1] = '\0'; - - ch->pcdata->in_progress->date = str_dup(strtime); + ch->pcdata->in_progress->date = + str_dup(str_time(current_time, -1, NULL)); } act("{G$n starts writing a note.{x", ch, NULL, NULL, TO_ROOM); @@ -532,8 +529,8 @@ chprintlnf(ch, "{YTo{x: %s\n\r" "{YExpires{x: %s\n\r" "{YSubject{x: %s", ch->pcdata->in_progress->to_list, - ctime(&ch->pcdata->in_progress->expire), - ch->pcdata->in_progress->subject); + str_time(ch->pcdata->in_progress->expire, GET_TZONE(ch), + NULL), ch->pcdata->in_progress->subject); chprintln(ch, "{GYour note so far:{x"); chprint(ch, ch->pcdata->in_progress->text); @@ -687,6 +684,25 @@ } } +CH_CMD(do_ncheck) +{ + int i, count = 0, unread = 0; + + for (i = 0; i < MAX_BOARD; i++) + { + unread = unread_notes(ch, &boards[i]); + if (unread != BOARD_NOACCESS) + count += unread; + } + + if (count < 1) + chprintln(ch, "You have no new notes on the board."); + else + chprintlnf(ch, + "You have {Y%d{x unread note%s on the board. Type 'board'.", + count, (count != 1) ? "s" : ""); +} + /* Dispatch function for backwards compatibility */ CH_CMD(do_note) { @@ -717,6 +733,8 @@ else if (!str_cmp(arg, "catchup")) do_ncatchup(ch, argument); + else if (!str_cmp(arg, "check")) + do_ncheck(ch, argument); else do_oldhelp(ch, "note"); } @@ -839,7 +857,6 @@ int board_index = board_lookup(board_name); BOARD_DATA *board; NOTE_DATA *note; - char *strtime; if (board_index == BOARD_NOTFOUND) { @@ -863,11 +880,7 @@ note->expire = current_time + expire_days * 60 * 60 * 24; note->text = str_dup(text); - /* convert to ascii. ctime returns a string which last character is \n, so remove that */ - strtime = ctime(¤t_time); - strtime[strlen(strtime) - 1] = '\0'; - - note->date = str_dup(strtime); + note->date = str_dup(str_time(current_time, -1, NULL)); finish_note(board, note); @@ -1010,8 +1023,9 @@ { ch->pcdata->in_progress->expire = current_time + ch->pcdata->board->purge_days * 24L * 3600L; - sprintf(buf, "This note will expire %s\r", - ctime(&ch->pcdata->in_progress->expire)); + sprintf(buf, "This note will expire %s\n\r", + str_time(ch->pcdata->in_progress->expire, GET_TZONE(ch), + NULL)); write_to_buffer(d, buf, 0); sprintf(buf, "\n\rEnter text. Type {W%cq{x or {W@{x on an empty line to end note, or {W%ch{x for help.\n\r" @@ -1063,8 +1077,6 @@ expire = current_time + (days * 24L * 3600L); /* 24 hours, 3600 seconds */ ch->pcdata->in_progress->expire = expire; - - /* note that ctime returns XXX\n so we only need to add an \r */ sprintf(buf, "\n\rEnter text. Type {W%cq{x or {W@{x on an empty line to end note, or {W%ch{x for help.\n\r" diff -ur src/comm.c new/comm.c --- src/comm.c Sun Apr 27 22:08:24 2003 +++ new/comm.c Thu May 8 14:57:41 2003 @@ -55,7 +55,11 @@ #include <ctype.h> #include <errno.h> #include <stdio.h> +#define __USE_GNU /* for strsignal() */ +#define _GNU_SOURCE #include <string.h> +#undef __USE_GNU +#undef _GNU_SOURCE #include <stdlib.h> #include <time.h> #include <stdarg.h> /* chprintf */ @@ -88,7 +92,10 @@ /* Needs to be global because of do_copyover */ int port, control; /* Global variable */ +#if !defined(WIN32) && !defined(__CYGWIN__) volatile sig_atomic_t crashed = 0; /* Are we currently crashing? */ +struct itimerval vtimer; +#endif #if defined( WIN32 ) #define WOULD_HAVE_BLOCKED ( WSAGetLastError() == WSAEWOULDBLOCK ) @@ -114,45 +121,117 @@ void set_game_levels args((int Old, int New)); void save_helps args((void)); +void set_vtimer(long sec) +{ +#if !defined(WIN32) && !defined(__CYGWIN__) +#define DEFAULT_VTIMER (60 * 60 * 3) // 3 minutes + vtimer.it_value.tv_sec = sec == -1 ? DEFAULT_VTIMER : sec; + vtimer.it_value.tv_usec = 0; + + if (setitimer(ITIMER_VIRTUAL, &vtimer, NULL) < 0) + { + log_string("Failed to set vtimer."); + exit(1); + } +#endif +} + #if !defined(WIN32) #if !defined(__CYGWIN__) + +void sigvalarm(int sig) +{ + static int safe_check = 0; + char crash_message_a[] = + "The mud has been looping for the past 60 seconds."; + char crash_message_b[] = "Initiating reboot..."; + char crash_message_c[] = + "The mud failed to inform the players of the above."; + + switch (safe_check) + { + case 0: + safe_check = 1; + bug(crash_message_a, 0); + bug(crash_message_b, 0); + break; + + case 1: + safe_check = 2; + log_string(crash_message_a); + log_string(crash_message_b); + log_string(crash_message_c); + break; + + case 2: + break; + } + + /* Reboot the MUD */ + + set_vtimer(-1); + + halt_mud(sig); // Shouldn't return + + exit(1); // Last resort +} + // Stop an endless loop -// Uses alarm() to check for game clock advance every 300 seconds. If more -// than 240 seconds of realtime has elapsed, assume loop and conduct a copyover. static void sigalrm(int sig) { + static int attempt = 0; time_t ptm; + time(&ptm); log_string("TOCK!"); - if ((ptm - current_time) > 240) + if ((ptm - current_time) > 200 || crashed) { - logf("Looping - Last Command: %s\r", last_command); - // this requires you to add an "if (ch)" before the chprint - // statements in do_copyover. - do_copyover(NULL, ""); - exit(1); + if (attempt != 1) + { + attempt = 1; // Try to reboot once... + + halt_mud(sig); // Should NOT return + } + + raise(SIGSEGV); // Something's wrong, cause a crash + exit(0); } - alarm(300); } -#endif -#else -void gettimeofday(struct timeval *t, void *tz) + +struct sigaction halt_action, ignore_action, alarm_action, valarm_action; + +struct signal_type { - struct timeb timebuffer; - ftime(&timebuffer); - t->tv_sec = timebuffer.time; - t->tv_usec = timebuffer.millitm * 1000; -} + int signum; + struct sigaction *act; + const char *name; // not used, strsignal() prefered. + const char *desc; // not used, strsignal() prefered. +}; -#endif +const struct signal_type signal_table[] = { -int main(int argc, char **argv) + {SIGPIPE, &ignore_action, "SIGPIPE", + "Broken pipe: write to pipe with no readers"}, + {SIGCHLD, &ignore_action, "SIGCHLD", "Child stopped or terminated"}, + + {SIGHUP, &ignore_action, "SIGHUP", + "Hangup detected on controlling terminal or death of controlling process"}, + {SIGINT, &halt_action, "SIGINT", "Interrupt from keyboard"}, + {SIGQUIT, &halt_action, "SIGQUIT", "Quit from keyboard"}, + {SIGILL, &halt_action, "SIGILL", "Illegal Instruction"}, + {SIGFPE, &halt_action, "SIGFPE", "Floating point exception"}, + {SIGSEGV, &halt_action, "SIGSEGV", "Invalid memory reference"}, + {SIGTERM, &halt_action, "SIGTERM", "Termination signal"}, + {SIGBUS, &halt_action, "SIGBUS", "Bus error (bad memory access)"}, + {SIGALRM, &alarm_action, "SIGALRM", "Timer signal from alarm(2)"}, + {SIGVTALRM, &valarm_action, "SIGVTALRM", "Virtual alarm clock"}, + {-1, NULL, NULL, NULL} +}; + +void set_signals(void) { - struct timeval now_time; -#if !defined(WIN32) && !defined(__CYGWIN__) - bool fCopyOver = FALSE; - struct sigaction halt_action, ignore_action, alarm_action; + int i; halt_action.sa_handler = halt_mud; sigemptyset(&halt_action.sa_mask); @@ -166,27 +245,45 @@ sigemptyset(&alarm_action.sa_mask); alarm_action.sa_flags = SA_NOMASK; - sigaction(SIGPIPE, &ignore_action, NULL); /* who cares about pipes? */ - sigaction(SIGCHLD, &ignore_action, NULL); /* stop zombie processes */ - sigaction(SIGHUP, &ignore_action, NULL); /* stay alive if user quits */ - sigaction(SIGINT, &halt_action, NULL); /* interrupted at keyboard */ - sigaction(SIGQUIT, &halt_action, NULL); /* quit at keyboard */ - sigaction(SIGILL, &halt_action, NULL); /* illegal instruction */ - sigaction(SIGFPE, &halt_action, NULL); /* floating point error */ - sigaction(SIGSEGV, &halt_action, NULL); /* invalid memory reference */ - sigaction(SIGTERM, &halt_action, NULL); /* terminate */ - sigaction(SIGBUS, &halt_action, NULL); /* out of memory?? */ - sigaction(SIGALRM, &alarm_action, NULL); /* endless loop check */ + valarm_action.sa_handler = sigvalarm; + sigemptyset(&valarm_action.sa_mask); + valarm_action.sa_flags = SA_NODEFER; + + for (i = 0; signal_table[i].signum != -1; i++) + sigaction(signal_table[i].signum, signal_table[i].act, NULL); + + vtimer.it_interval.tv_sec = 60; + vtimer.it_interval.tv_usec = 0; + set_vtimer(-1); +} - alarm(300); +#endif +#else +void gettimeofday(struct timeval *t, void *tz) +{ + struct timeb timebuffer; + ftime(&timebuffer); + t->tv_sec = timebuffer.time; + t->tv_usec = timebuffer.millitm * 1000; +} +#endif + +int main(int argc, char **argv) +{ + struct timeval now_time; +#if !defined(WIN32) && !defined(__CYGWIN__) + bool fCopyOver = FALSE; + + set_signals(); #endif /* * Init time. */ + tzset(); gettimeofday(&now_time, NULL); current_time = (time_t) now_time.tv_sec; - strcpy(str_boot_time, ctime(¤t_time)); + strcpy(str_boot_time, str_time(current_time, -1, NULL)); /* * Reserve one channel for our use. @@ -264,7 +361,9 @@ if (!fCopyOver) #endif control = init_socket(port); +#if !defined(NO_WEB) WebUP = init_web_server(); +#endif boot_db(); sprintf(log_buf, "ROM is ready to rock on port %d.", port); log_string(log_buf); @@ -273,7 +372,9 @@ copyover_recover(); #endif game_loop(control); +#if !defined(NO_WEB) shutdown_web_server(); +#endif close(control); /* @@ -432,15 +533,14 @@ void game_loop(int ctrl) { - static struct timeval null_time; - struct timeval last_time; + static struct timeval null_time = { 0, 0 }; + int vt_set = 0; #if !defined(WIN32) signal(SIGPIPE, SIG_IGN); signal(SIGCHLD, SIG_IGN); #endif - gettimeofday(&last_time, NULL); - current_time = (time_t) last_time.tv_sec; + SynchronizeClock(); /* Main loop */ while (!merc_down) @@ -537,6 +637,9 @@ d->fcommand = TRUE; stop_idling(d->character); + vt_set = 0; + set_vtimer(60); + /* OLC */ if (d->showstr_point) show_string(d, d->incomm); @@ -563,8 +666,10 @@ */ update_handler(); +#if !defined(NO_WEB) if (WebUP) update_web_server(); +#endif /* * Output. @@ -608,6 +713,12 @@ */ WaitForPulse(); SynchronizeClock(); + if (++vt_set >= 35) + { + vt_set = 0; + + set_vtimer(60); + } } return; @@ -1036,84 +1147,57 @@ return; } -char *random_colour(void) +int col_attr, col_fore, col_back; + +int random_attr(void) +{ + if (number_range(1, 50) < 25) + return CL_CLEAR; + else + return CL_BRIGHT; +} + +int random_fore(void) { - switch (number_range(1, 14)) - { - case 1: - return C_BLUE; - case 2: - return C_CYAN; - case 3: - return C_GREEN; - case 4: - return C_MAGENTA; - case 5: - return C_RED; - case 6: - return C_YELLOW; - case 7: - return CB_BLUE; - case 8: - return CB_CYAN; - case 9: - return CB_GREEN; - case 10: - return CB_MAGENTA; - case 11: - return CB_WHITE; - case 12: - return CB_RED; - case 13: - return C_WHITE; - case 14: - return CB_YELLOW; - default: - return C_CLEAR; - } + return number_range(FG_BLACK, FG_WHITE); } -char *random_background(void) +int random_back(void) { - switch (number_range(0, 13)) - { - case 0: - return BLACK_BG; - case 1: - return BLUE_BG; - case 2: - return CYAN_BG; - case 3: - return GREEN_BG; - case 4: - return MAGENTA_BG; - case 5: - return RED_BG; - case 6: - return YELLOW_BG; - case 7: - return BLUE_BBG; - case 8: - return CYAN_BBG; - case 9: - return GREEN_BBG; - case 10: - return MAGENTA_BBG; - case 12: - return RED_BBG; - case 13: - return YELLOW_BBG; - default: - return BLACK_BBG; - } + return number_range(BG_BLACK, BG_WHITE); +} + +char *make_colour(void) +{ + bool a, b; + + if (col_attr == CL_RANDOM) + col_attr = random_attr(); + if (col_fore == FG_RANDOM) + col_fore = random_fore(); + if (col_back == BG_RANDOM) + col_back = random_back(); + + a = (col_fore != FG_NONE); + b = (col_back != BG_NONE); + + if (!a && !b) + return FORMATF(CL_FORMAT1, col_attr); + else if (a && !b) + return FORMATF(CL_FORMAT2, col_attr, col_fore); + else if (!a && b) + return FORMATF(CL_FORMAT2, col_attr, col_back); + else + return FORMATF(CL_FORMAT3, col_attr, col_fore, col_back); } -/* Taken from Gary McNickel's WOTmud */ +/* Taken from Gary McNickel's WOTmud + Updated by Markanth */ bool process_ansi_output(DESCRIPTOR_DATA * d) { CHAR_DATA *ch; char *counter; - char output[MSL]; + char output[MSL * 10]; char temp[MSL]; char *work; bool success = TRUE; @@ -1124,13 +1208,13 @@ ch = (d->original ? d->original : d->character); - memset(output, 0, MSL); + memset(output, 0, sizeof(output)); counter = output; work = d->outbuf; while (*work != '\0' && (work - d->outbuf) < d->outtop) { - if ((int) (counter - output) >= MSL - 32) + if ((long) (counter - output) >= MSL - 32) { *counter++ = '\0'; @@ -1138,7 +1222,7 @@ if (!(success = write_to_descriptor(d, output, strlen(output)))) break; - memset(output, 0, MSL); + memset(output, 0, sizeof(output)); counter = output; } @@ -1160,138 +1244,137 @@ case ' ': sprintf(temp, "%c ", ANSI_KEY); break; - case 'x': - case 'X': - strcpy(temp, color_default(ch)); - break; - case 'v': - case 'V': - strcpy(temp, C_REVERSE); - break; - case 'u': - case 'U': - strcpy(temp, C_UNDERSCORE); - break; - case 'f': - case 'F': - strcpy(temp, C_FLASH); - break; - case 'b': - strcpy(temp, C_BLUE); - break; - case 'c': - strcpy(temp, C_CYAN); - break; - case 'g': - strcpy(temp, C_GREEN); - break; - case 'm': - strcpy(temp, C_MAGENTA); - break; - case 'd': - strcpy(temp, C_BLACK); - break; - case 'r': - strcpy(temp, C_RED); - break; - case 'y': - strcpy(temp, C_YELLOW); - break; - case 'w': - strcpy(temp, C_WHITE); - break; - case 'B': - strcpy(temp, CB_BLUE); - break; - case 'C': - strcpy(temp, CB_CYAN); - break; - case 'G': - strcpy(temp, CB_GREEN); - break; - case 'M': - strcpy(temp, CB_MAGENTA); - break; - case 'D': - strcpy(temp, CB_BLACK); - break; - case 'R': - strcpy(temp, CB_RED); - break; - case 'W': - strcpy(temp, CB_WHITE); - break; - case 'Y': - strcpy(temp, CB_YELLOW); - break; - case '`': - strcpy(temp, random_colour()); - break; - case '1': - strcpy(temp, RED_BG); - break; - case '2': - strcpy(temp, BLUE_BG); - break; - case '3': - strcpy(temp, GREEN_BG); - break; - case '4': - strcpy(temp, BLACK_BG); - break; - case '5': - strcpy(temp, WHITE_BG); - break; - case '6': - strcpy(temp, MAGENTA_BG); - break; - case '7': - strcpy(temp, YELLOW_BG); - break; - case '8': - strcpy(temp, CYAN_BG); - break; - case '!': - strcpy(temp, RED_BBG); - break; - case '@': - strcpy(temp, BLUE_BBG); - break; - case '#': - strcpy(temp, GREEN_BBG); - break; - case '$': - strcpy(temp, BLACK_BBG); - break; - case '%': - strcpy(temp, WHITE_BBG); - break; - case '^': - strcpy(temp, MAGENTA_BBG); - break; - case '&': - strcpy(temp, YELLOW_BBG); - break; - case '*': - strcpy(temp, CYAN_BBG); - break; - case '+': - case '=': - strcpy(temp, random_background()); - break; case '-': - sprintf(temp, "%c", C_TILDE); + strcpy(temp, "~"); break; case 'P': case 'p': - sprintf(temp, "%c", C_BEEP); + sprintf(temp, "%c", 007); break; case ANSI_KEY: sprintf(temp, "%c", ANSI_KEY); break; default: - strcpy(temp, C_CLEAR); - break; + { + switch (*work) + { + case 'x': + case 'X': + strcpy(temp, char_colour(ch, _DEFAULT)); + break; + case 'v': + case 'V': + col_attr = CL_REVERSE; + break; + case 'u': + case 'U': + col_attr = CL_UNDER; + break; + case 'f': + case 'F': + col_attr = CL_BLINK; + break; + case 'b': + col_attr = CL_CLEAR; + col_fore = FG_BLUE; + break; + case 'c': + col_attr = CL_CLEAR; + col_fore = FG_CYAN; + break; + case 'g': + col_attr = CL_CLEAR; + col_fore = FG_GREEN; + break; + case 'm': + col_attr = CL_CLEAR; + col_fore = FG_MAGENTA; + break; + case 'd': + col_attr = CL_CLEAR; + col_fore = FG_BLACK; + break; + case 'r': + col_attr = CL_CLEAR; + col_fore = FG_RED; + break; + case 'y': + col_attr = CL_CLEAR; + col_fore = FG_YELLOW; + break; + case 'w': + col_attr = CL_CLEAR; + col_fore = FG_WHITE; + break; + case 'B': + col_attr = CL_BRIGHT; + col_fore = FG_BLUE; + break; + case 'C': + col_attr = CL_BRIGHT; + col_fore = FG_CYAN; + break; + case 'G': + col_attr = CL_BRIGHT; + col_fore = FG_GREEN; + break; + case 'M': + col_attr = CL_BRIGHT; + col_fore = FG_MAGENTA; + break; + case 'D': + col_attr = CL_BRIGHT; + col_fore = FG_BLACK; + break; + case 'R': + col_attr = CL_BRIGHT; + col_fore = FG_RED; + break; + case 'W': + col_attr = CL_BRIGHT; + col_fore = FG_WHITE; + break; + case 'Y': + col_attr = CL_BRIGHT; + col_fore = FG_YELLOW; + break; + case '`': + col_attr = CL_RANDOM; + col_fore = FG_RANDOM; + break; + case '1': + col_back = BG_RED; + break; + case '2': + col_back = BG_BLUE; + break; + case '3': + col_back = BG_GREEN; + break; + case '4': + col_back = BG_BLACK; + break; + case '5': + col_back = BG_WHITE; + break; + case '6': + col_back = BG_MAGENTA; + break; + case '7': + col_back = BG_YELLOW; + break; + case '8': + col_back = BG_CYAN; + break; + case '+': + case '=': + col_attr = CL_RANDOM; + col_back = BG_RANDOM; + break; + } + strcpy(temp, make_colour()); + break; + } } } work++; @@ -1321,7 +1404,10 @@ if (slot < 0 || slot >= MAX_CUSTOM_COLOUR) { bug("ansi_output: invalid custom color", 0); - strcpy(temp, C_CLEAR); + strcpy(temp, CL_DEFAULT); + col_attr = CL_CLEAR; + col_fore = FG_NONE; + col_back = BG_NONE; } else if (DESC_FLAGGED(d, DESC_COLOUR) && (!ch || !IS_SET(ch->comm, COMM_NOCOLOUR))) @@ -2626,14 +2712,16 @@ struct sigaction default_action; int i; pid_t forkpid; + int status; - wait(NULL); + waitpid(-1, &status, WNOHANG); if (!crashed) { crashed++; - logf("GAME CRASHED (SIGNAL %d).\nLast command: %s", sig, last_command); + logf("GAME CRASHED (SIGNAL %d, %s).", sig, strsignal(sig)); + logf("Last command: %s", last_command); // Inform last command typer that he caused the crash - if (strlen(last_command2)) + if (!IS_NULLSTR(last_command2)) { write_to_descriptor(last_descriptor, "\n\rThe last command you typed, '", 0); @@ -2654,6 +2742,12 @@ } if (IS_NPC(ch)) continue; + + if ((sig == SIGVTALRM || sig == SIGALRM) + && get_trust(ch) >= LEVEL_IMMORTAL) + write_to_descriptor(d, + "\n\rThe mud has been unresponsive for 60 seconds. Rebooting.\n\r", + 0); write_to_descriptor(d, "\n\rThe mud has CRASHED.\007\n\r", 0); } @@ -2675,7 +2769,7 @@ if ((forkpid = fork()) > 0) { // Parent process copyover and exit - waitpid(forkpid, NULL, WNOHANG | WUNTRACED); + waitpid(forkpid, &status, WNOHANG); // this requires you to add an "if (ch)" before the chprint // statements in do_copyover. do_copyover(NULL, ""); @@ -2698,7 +2792,7 @@ default_action.sa_handler = SIG_DFL; sigaction(sig, &default_action, NULL); - // I run different scripts depending on my port + // Run gdb script. if (!fork()) { execl(CORE_EXAMINE_SCRIPT, CORE_EXAMINE_SCRIPT, (char *) NULL); @@ -2854,4 +2948,30 @@ mbr->level += mod; } save_members(); +} + +CH_CMD(do_crash) +{ + if (IS_NULLSTR(argument)) + { + chprintln(ch, "Syntax: crash confirm - send a SIGSEGV to the mud."); + chprintln(ch, " : crash loop - start an infinite loop."); + return; + } + + if (!str_cmp(argument, "loop")) + { + for (;;); + return; + } + else if (!str_cmp(argument, "confirm")) + { + raise(SIGSEGV); + return; + } + else + { + do_crash(ch, ""); + return; + } } diff -ur src/db.c new/db.c --- src/db.c Sun Apr 27 22:08:24 2003 +++ new/db.c Thu May 8 14:57:41 2003 @@ -69,7 +69,7 @@ MOB_INDEX_DATA *mob_index_hash[MAX_KEY_HASH]; OBJ_INDEX_DATA *obj_index_hash[MAX_KEY_HASH]; ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH]; -#if !defined(NO_STRHASH) +#if (STRHASH==1) char *string_hash[MAX_KEY_HASH]; #endif @@ -2678,7 +2678,7 @@ */ const char *fread_string(FILE * fp) { -#if !defined(NO_STRHASH) +#if (STRHASH==1) char *plast; char c; @@ -2948,25 +2948,131 @@ return NULL; } +#if (STRHASH==2) + +#define MAX_STRING_HASH (16*1024) + +typedef struct str str; +struct str +{ + const char *p; + int ref; + str *next; +}; + +str *hash_str[MAX_STRING_HASH]; + +#define strhash(s) (hashstr(s, 64, MAX_STRING_HASH)) + +/* +** A simple and fast generic string hasher based on Peter K. Pearson's +** article in CACM 33-6, pp. 677. +*/ + +static int TT[] = { + 1, 87, 49, 12, 176, 178, 102, 166, 121, 193, 6, 84, 249, 230, 44, 163, + 14, 197, 213, 181, 161, 85, 218, 80, 64, 239, 24, 226, 236, 142, 38, 200, + 110, 177, 104, 103, 141, 253, 255, 50, 77, 101, 81, 18, 45, 96, 31, 222, + 25, 107, 190, 70, 86, 237, 240, 34, 72, 242, 20, 214, 244, 227, 149, 235, + 97, 234, 57, 22, 60, 250, 82, 175, 208, 5, 127, 199, 111, 62, 135, 248, + 174, 169, 211, 58, 66, 154, 106, 195, 245, 171, 17, 187, 182, 179, 0, 243, + 132, 56, 148, 75, 128, 133, 158, 100, 130, 126, 91, 13, 153, 246, 216, 219, + 119, 68, 223, 78, 83, 88, 201, 99, 122, 11, 92, 32, 136, 114, 52, 10, + 138, 30, 48, 183, 156, 35, 61, 26, 143, 74, 251, 94, 129, 162, 63, 152, + 170, 7, 115, 167, 241, 206, 3, 150, 55, 59, 151, 220, 90, 53, 23, 131, + 125, 173, 15, 238, 79, 95, 89, 16, 105, 137, 225, 224, 217, 160, 37, 123, + 118, 73, 2, 157, 46, 116, 9, 145, 134, 228, 207, 212, 202, 215, 69, 229, + 27, 188, 67, 124, 168, 252, 42, 4, 29, 108, 21, 247, 19, 205, 39, 203, + 233, 40, 186, 147, 198, 192, 155, 33, 164, 191, 98, 204, 165, 180, 117, 76, + 140, 36, 210, 172, 41, 54, 159, 8, 185, 232, 113, 196, 231, 47, 146, 120, + 51, 65, 28, 144, 254, 221, 93, 189, 194, 139, 112, 43, 71, 109, 184, 209, +}; + +int hashstr(const char *s, int maxn, int hashs) +{ + register int h; + register unsigned char *p; + register int i; + + for (h = 0, i = 0, p = (unsigned char *) s; *p && i < maxn; i++, p++) + h = TT[h ^ *p]; + if (hashs > 256 && *s) + { + int oh = h; + for (i = 1, p = (unsigned char *) s, h = (*p++ + 1) & 0xff; + *p && i < maxn; i++, p++) + h = TT[h ^ *p]; + h += (oh << 8); + } + return h % hashs; /* With 16 bit ints h has to be made positive first! */ +} +static str *str_alloc(const char *p, int hash) +{ + str *s; + + alloc_mem(s, str, 1); + s->ref = 0; + s->p = p; + s->next = hash_str[hash]; + str_real_count++; + return hash_str[hash] = s; +} + +static str *str_lookup(const char *p, int *hash) +{ + str *s; + for (s = hash_str[*hash = strhash(p)]; s; s = s->next) + if (!str_cmp(s->p, p)) + return s; + return NULL; +} +#endif + /* * Duplicate a string into dynamic memory. * Fread_strings are read-only and shared. */ -const char *str_dup(const char *str) +const char *str_dup(const char *pstr) { char *str_new; +#if (STRHASH==2) + int hash; + str *s; +#endif - if (str[0] == '\0') + if (IS_NULLSTR(pstr)) return &str_empty[0]; -#if !defined(NO_STRHASH) - if (str >= string_space && str < top_string) - return str; +#if (STRHASH==1) + if (pstr >= string_space && pstr < top_string) + return pstr; #endif - alloc_mem(str_new, char, strlen(str) + 1); - strcpy(str_new, str); +#if STRHASH==2 + str_count++; + if ((s = str_lookup(pstr, &hash)) == NULL) + { + alloc_mem(str_new, char, strlen(pstr) + 1); + if (str_new == NULL) + { + bug("Failed to grab memory for str_dup...", 0); + return &str_empty[0]; + } + strcpy(str_new, pstr); + s = str_alloc(str_new, hash); + } + s->ref++; + return s->p; +#else + alloc_mem(str_new, char, strlen(pstr) + 1); + if (str_new == NULL) + { + bug("Failed to grab memory for str_dup...", 0); + return &str_empty[0]; + } + strcpy(str_new, pstr); return str_new; +#endif } /* @@ -2976,15 +3082,41 @@ */ void free_string(const char *pstr) { +#if STRHASH==2 + str *s, *q; + int hash; +#endif + if (pstr == NULL || pstr == &str_empty[0] -#if !defined(NO_STRHASH) - || (pstr >= string_space && pstr < top_string)) -#else - ) +#if (STRHASH==1) + || (pstr >= string_space && pstr < top_string) #endif + ) return; +#if STRHASH==2 + str_count--; + hash = strhash(pstr); + for (q = NULL, s = hash_str[hash]; s; s = s->next) + { + if (!str_cmp(s->p, pstr)) + break; + q = s; + } + + if (!s || --s->ref) + return; + + if (q) + q->next = s->next; + else + hash_str[hash] = hash_str[hash]->next; + str_real_count--; + free_mem(s->p); + free_mem(s); +#else free_mem(pstr); +#endif return; } @@ -3713,11 +3845,7 @@ */ void log_string(const char *str) { - char *strtime; - - strtime = ctime(¤t_time); - strtime[strlen(strtime) - 1] = '\0'; - fprintf(stderr, "%s :: %s\n", strtime, str); + fprintf(stderr, "%s :: %s\n", str_time(current_time, -1, NULL), str); return; } diff -ur src/db.h new/db.h --- src/db.h Sun Apr 27 22:08:25 2003 +++ new/db.h Thu May 8 14:57:42 2003 @@ -29,7 +29,7 @@ #if !defined(DB_H) #define DB_H -#if !defined(NO_STRHASH) +#if (STRHASH==1) #define MAX_STRING 4000*1024 #endif diff -ur src/db2.c new/db2.c --- src/db2.c Sun Apr 27 22:08:24 2003 +++ new/db2.c Thu May 8 14:57:41 2003 @@ -952,10 +952,12 @@ CH_CMD(do_memory_heap) { chprint(ch, separator); -#if !defined(NO_STRHASH) +#if (STRHASH==1) rptsd("String Space allocated at DB boot", MAX_STRING / 1024); rptdsd(nAllocString, "Strings in string space", sAllocString / 1024); rptsd("Excess string space", MAX_STRING / 1024 - sAllocString / 1024); +#elif (STRHASH==2) + chprintlnf(ch, " Strings %d (%d allocated)", str_count, str_real_count); #endif chprintlnf(ch, " Perms %d blocks of %ld kb.", nAllocPerm, sAllocPerm / 1024); @@ -1032,7 +1034,7 @@ void strspace_alloc() { -#if !defined(NO_STRHASH) +#if (STRHASH==1) extern char *top_string; if ((string_space = (char *) calloc(1, MAX_STRING)) == NULL) @@ -1084,6 +1086,52 @@ fpReserve = fopen(NULL_FILE, "r"); return TRUE; +} + +FILE_DATA *fopen_temp(const char *file) +{ + FILE_DATA *fp; + + if (IS_NULLSTR(file)) + return NULL; + + alloc_mem(fp, FILE_DATA, 1); + + if (!fp) + return NULL; + + strncpy(fp->name, file, PATH_MAX); +#if !defined(WIN32) + { + char temp[PATH_MAX]; + snprintf(temp, PATH_MAX, "%s.tmp%d", file, number_percent()); + strncpy(fp->tmp_name, temp, PATH_MAX); + } +#else + strncpy(fp->tmp_name, file, PATH_MAX); +#endif + if ((fp->file = file_open(fp->tmp_name, "w")) == NULL) + { + file_close(fp->file); + free_mem(fp); + fp = NULL; + return NULL; + } + return fp; +} + +void fclose_temp(FILE_DATA * fp) +{ + if (fp) + { + file_close(fp->file); +#if !defined(WIN32) + if (str_cmp(fp->tmp_name, fp->name)) + rename(fp->tmp_name, fp->name); +#endif + free_mem(fp); + } + fp = NULL; } const struct dofun_type dofun_table[] = { diff -ur src/dofun.h new/dofun.h --- src/dofun.h Sun Apr 27 22:08:25 2003 +++ new/dofun.h Thu May 8 14:57:42 2003 @@ -324,5 +324,7 @@ COMMAND_FUN (do_areaset) COMMAND_FUN (do_roster) COMMAND_FUN (do_map) +COMMAND_FUN (do_timezone) +COMMAND_FUN (do_crash) // *INDENT-ON* diff -ur src/globals.h new/globals.h --- src/globals.h Sun Apr 27 22:08:25 2003 +++ new/globals.h Thu May 8 14:57:42 2003 @@ -112,10 +112,13 @@ GLOBAL_DEF(bool fBootDb, FALSE); GLOBAL_DEF(int newmobs, 0); GLOBAL_DEF(int newobjs, 0); -#if !defined(NO_STRHASH) +#if (STRHASH==1) GLOBAL_DEF(char *string_space, NULL); GLOBAL_DEF(int nAllocString, 0); GLOBAL_DEF(size_t sAllocString, 0); +#elif (STRHASH==2) +GLOBAL_DEF(int str_count, 0); +GLOBAL_DEF(int str_real_count, 0); #endif GLOBAL_DEF(CHAR_DATA * char_free, NULL); GLOBAL_DEF(PC_DATA * pcdata_free, NULL); diff -ur src/gquest.c new/gquest.c --- src/gquest.c Sun Apr 27 22:08:24 2003 +++ new/gquest.c Thu May 8 14:57:41 2003 @@ -237,7 +237,6 @@ MOB_INDEX_DATA *mob; int i; GQUEST_HIST *hist; - char *strtime; char shortd[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; @@ -245,11 +244,9 @@ return; alloc_mem(hist, GQUEST_HIST, 1); - strtime = ctime(¤t_time); - strtime[strlen(strtime) - 1] = '\0'; - sprintf(shortd, "%24s %3d %3d %4d %12s\n\r", strtime, - gquest_info.minlevel, gquest_info.maxlevel, - gquest_info.mob_count, ch->name); + sprintf(shortd, "%24s %3d %3d %4d %12s\n\r", + str_time(current_time, -1, NULL), gquest_info.minlevel, + gquest_info.maxlevel, gquest_info.mob_count, ch->name); hist->short_descr = str_dup(shortd); output = new_buf(); sprintf(buf, "GLOBAL QUEST INFO\n\r-----------------\n\r"); @@ -263,7 +260,7 @@ sprintf(buf, "Those Playing\n\r-------------\n\r"); add_buf(output, buf); for (wch = char_first; wch != NULL; wch = wch->next) - if (!IS_NPC(ch) && ON_GQUEST(wch) + if (!IS_NPC(wch) && ON_GQUEST(wch) && count_gqmobs(wch) != gquest_info.mob_count) sprintf(buf, "%s [%d mobs left]\n\r", wch->name, gquest_info.mob_count - count_gqmobs(wch)); diff -ur src/handler.c new/handler.c --- src/handler.c Sun Apr 27 22:08:24 2003 +++ new/handler.c Thu May 8 14:57:41 2003 @@ -2646,3 +2646,29 @@ } return ch; } + +char *str_time(time_t timet, int tz, const char *format) +{ + static char buf_new[5][100]; + static int i; + char *result; + + // rotate buffers + ++i; + i %= 5; + result = buf_new[i]; + + if (timet <= 0) + { + timet = current_time; + } + if (tz > -1 && tz < MAX_TZONE) + { + timet += timezone; + timet += (60 * 60 * tzone_table[tz].gmt_offset); + } + strftime(result, 100, !IS_NULLSTR(format) ? format : "%a %b %d %r %Y", + localtime(&timet)); + + return result; +} diff -ur src/interp.c new/interp.c --- src/interp.c Sun Apr 27 22:08:24 2003 +++ new/interp.c Thu May 8 14:57:42 2003 @@ -661,7 +661,7 @@ /* Save disabled commands */ void save_disabled() { - FILE *fp; + FILE_DATA *fp; DISABLED_DATA *p; if (!disabled_first) /* delete file if no commands are disabled */ @@ -670,7 +670,7 @@ return; } - fp = file_open(DISABLED_FILE, "w"); + fp = fopen_temp(DISABLED_FILE); if (!fp) { @@ -679,9 +679,10 @@ } for (p = disabled_first; p; p = p->next) - fprintf(fp, "%s %d %s\n", p->command->name, p->level, p->disabled_by); + fprintf(fp->file, "%s %d %s\n", p->command->name, p->level, + p->disabled_by); - fprintf(fp, "%s\n", END_MARKER); + fprintf(fp->file, "%s\n", END_MARKER); - file_close(fp); + fclose_temp(fp); } diff -ur src/interp.h new/interp.h --- src/interp.h Sun Apr 27 22:08:25 2003 +++ new/interp.h Thu May 8 14:57:42 2003 @@ -101,5 +101,6 @@ DECLARE_DO_FUN(do_mset); DECLARE_DO_FUN(do_oset); DECLARE_DO_FUN(do_slookup); +DECLARE_DO_FUN(do_ncheck); #endif diff -ur src/lookup.c new/lookup.c --- src/lookup.c Sun Apr 27 22:08:24 2003 +++ new/lookup.c Thu May 8 14:57:42 2003 @@ -198,3 +198,20 @@ return NULL; } + +int tzone_lookup(const char *arg) +{ + int i; + + for (i = 0; i < MAX_TZONE; i++) + { + if (!str_cmp(arg, tzone_table[i].name)) + return i; + } + for (i = 0; i < MAX_TZONE; i++) + { + if (is_name(arg, tzone_table[i].zone)) + return i; + } + return -1; +} diff -ur src/lookup.h new/lookup.h --- src/lookup.h Sun Apr 27 22:08:25 2003 +++ new/lookup.h Thu May 8 14:57:42 2003 @@ -35,5 +35,6 @@ int size_lookup args((const char *name)); HELP_DATA *help_lookup args((const char *)); DEITY_DATA *deity_lookup args((const char *arg)); +int tzone_lookup args((const char *arg)); #endif diff -ur src/merc.h new/merc.h --- src/merc.h Sun Apr 27 22:08:25 2003 +++ new/merc.h Thu May 8 14:57:42 2003 @@ -148,6 +148,7 @@ typedef struct deity_type DEITY_DATA; typedef struct wpwd_data WPWD_DATA; typedef struct mbr_data MBR_DATA; +typedef struct file_data FILE_DATA; /* * Function types. @@ -182,6 +183,7 @@ * Adjust the pulse numbers to suit yourself. */ #define MAX_IN_GROUP 15 +#define MAX_TZONE 25 #define MAX_ALIAS 5 #define MAX_BUDDY 10 #define MAX_REMORT 2 // should never be higher than maxClass @@ -369,19 +371,20 @@ #define CON_GET_NEW_CLASS 8 #define CON_GET_ALIGNMENT 9 #define CON_GET_DEITY 10 -#define CON_DEFAULT_CHOICE 11 -#define CON_GEN_GROUPS 12 -#define CON_PICK_WEAPON 13 -#define CON_READ_IMOTD 14 -#define CON_READ_MOTD 15 -#define CON_BREAK_CONNECT 16 -#define CON_GET_TERM 17 -#define CON_COPYOVER_RECOVER 18 -#define CON_NOTE_TO 19 -#define CON_NOTE_SUBJECT 20 -#define CON_NOTE_EXPIRE 21 -#define CON_NOTE_TEXT 22 -#define CON_NOTE_FINISH 23 +#define CON_GET_TIMEZONE 11 +#define CON_DEFAULT_CHOICE 12 +#define CON_GEN_GROUPS 13 +#define CON_PICK_WEAPON 14 +#define CON_READ_IMOTD 15 +#define CON_READ_MOTD 16 +#define CON_BREAK_CONNECT 17 +#define CON_GET_TERM 18 +#define CON_COPYOVER_RECOVER 19 +#define CON_NOTE_TO 20 +#define CON_NOTE_SUBJECT 21 +#define CON_NOTE_EXPIRE 22 +#define CON_NOTE_TEXT 23 +#define CON_NOTE_FINISH 24 /* * Descriptor (channel) structure. @@ -1455,13 +1458,24 @@ #define WAR_WAITING 1 #define WAR_RUNNING 2 +enum war_types +{ + WAR_NONE = 0, + WAR_CLAN = 1, + WAR_RACE = 2, + WAR_CLASS = 3, + WAR_GENOCIDE = 4, + WAR_DEITY = 5, + MAX_WAR = 6 +}; + struct war_data { const char *who; int min_level; int max_level; int inwar; - int wartype; + enum war_types wartype; int timer; int iswar; int next; @@ -1741,7 +1755,7 @@ const char *alias[MAX_ALIAS]; const char *alias_sub[MAX_ALIAS]; int security; /* OLC *//* Builder security */ - int colour[MAX_CUSTOM_COLOUR]; + int colour[MAX_CUSTOM_COLOUR][3]; long gamestat[MAX_GAMESTAT]; int nextquest; int countdown; @@ -1769,6 +1783,7 @@ char str_ed_key; const char *buddies[MAX_BUDDY]; const char *history[LAST_MAX][LAST_PAGE_LENGTH]; + int timezone; }; /* Data for generating characters -- only used during generation */ @@ -2092,6 +2107,19 @@ PROG_CODE *prev; }; +#if defined(WIN32) +#define PATH_MAX MAX_PATH +#else +#include <limits.h> +#endif + +struct file_data +{ + FILE *file; + char tmp_name[PATH_MAX]; + char name[PATH_MAX]; +}; + #include "gsn.h" /* @@ -2356,6 +2384,8 @@ #define ON_GQUEST(ch) (!IS_NPC(ch) && IS_SET((ch)->act, PLR_GQUEST) && gquest_info.running != GQUEST_OFF) #define STR_EDIT_KEY(ch) (IS_NPC(ch) ? '.' : ch->pcdata->str_ed_key) + +#define GET_TZONE(ch) (IS_NPC(ch) ? -1 : ch->pcdata->timezone) /* * Object macros. diff -ur src/nanny.c new/nanny.c --- src/nanny.c Sun Apr 27 22:08:24 2003 +++ new/nanny.c Thu May 8 14:57:42 2003 @@ -37,6 +37,7 @@ #include "telnet.h" #include "recycle.h" #include "lookup.h" +#include "tables.h" bool check_playing args((DESCRIPTOR_DATA * d, const char *name)); bool check_parse_name args((const char *name)); @@ -61,10 +62,11 @@ case 't': case 'T': write_to_buffer(d, - "\n\rThis text should be " CB_GREEN - "GREEN" C_CLEAR - ".\n\rThis text should be " CB_RED "RED" - C_CLEAR ".\n\r", 0); + FORMATF("\n\rThis text should be " CL_FORMAT2 + "GREEN" CL_DEFAULT + ".\n\rThis text should be " CL_FORMAT2 "RED" + CL_DEFAULT ".\n\r", CL_BRIGHT, FG_GREEN, + CL_BRIGHT, FG_RED), 0); write_to_buffer(d, "\n\rDid you see colour? (Y)es, (N)o, (T)est: ", 0); return; default: @@ -555,6 +557,21 @@ return; } +void send_timezone_info(DESCRIPTOR_DATA * d) +{ + int i; + CHAR_DATA *ch = CH(d); + + chprintlnf(ch, "%-6s %-29s (%s)", "Name", "City/Zone Crosses", "Time"); + chprintlnf(ch, "%s", draw_line(ch, NULL, 0)); + for (i = 0; i < MAX_TZONE; i++) + { + chprintlnf(ch, "%-6s %-29s (%s)", tzone_table[i].name, + tzone_table[i].zone, str_time(current_time, i, NULL)); + } + chprintlnf(ch, "%s", draw_line(ch, NULL, 0)); +} + void handle_con_get_deity(DESCRIPTOR_DATA * d, const char *argument) { char arg[MIL]; @@ -588,6 +605,53 @@ ch->deity = i; sprintf(buf, "\n\rYou now worship %s.\n\r", ch->deity->name); write_to_buffer(d, buf, 0); + + send_timezone_info(d); + write_to_buffer(d, "What time zone do you live in?\n\r", 0); + d->connected = CON_GET_TIMEZONE; + return; +} + +void handle_con_get_timezone(DESCRIPTOR_DATA * d, const char *argument) +{ + int i; + char arg[MIL]; + char buf[MSL]; + CHAR_DATA *ch = CH(d); + + one_argument(argument, arg); + + if (IS_NULLSTR(arg)) + { + send_timezone_info(d); + write_to_buffer(d, "What time zone do you live in?\n\r", 0); + return; + } + if (!str_cmp(arg, "help")) + { + write_to_buffer(d, + "Time zones around the world are split up into 24 areas,\n\r", + 0); + write_to_buffer(d, "each relating to Greenwich Mean Time (GMT)\n\r", 0); + write_to_buffer(d, "What time zone do you live in?\n\r", 0); + return; + } + i = tzone_lookup(argument); + + if (i == -1) + { + write_to_buffer(d, + "That is not a valid time zone, please enter the full time zone name. (ex. GMT-5)\n\r", + 0); + write_to_buffer(d, "What time zone do you live in?\n\r", 0); + return; + } + + ch->pcdata->timezone = i; + sprintf(buf, "Your time zone is now %-6s %-29s (%s)\n\r", + tzone_table[i].name, tzone_table[i].zone, str_time(current_time, + i, NULL)); + write_to_buffer(d, buf, 0); write_to_buffer(d, "\n\r", 0); group_add(ch, "rom basics", FALSE); @@ -830,7 +894,7 @@ act("$n has entered the game.", ch->pet, NULL, NULL, TO_ROOM); } - do_function(ch, &do_board, ""); + do_function(ch, &do_ncheck, ""); unfinished_quest(ch); update_explored(ch); checkcorpse(ch); @@ -905,6 +969,10 @@ case CON_GET_DEITY: handle_con_get_deity(d, argument); + break; + + case CON_GET_TIMEZONE: + handle_con_get_timezone(d, argument); break; case CON_DEFAULT_CHOICE: diff -ur src/olc.c new/olc.c --- src/olc.c Sun Apr 27 22:08:25 2003 +++ new/olc.c Thu May 8 14:57:42 2003 @@ -759,7 +759,7 @@ {"create", NULL, olced_olded, (const void *) raedit_create}, {"delete", NULL, olced_olded, (const void *) raedit_delete}, {"show", NULL, olced_olded, (const void *) raedit_show}, - {"name", (void *) &xRace.name, olced_str, NULL}, + {"name", NULL, olced_olded, (const void *) raedit_name}, {"act", (void *) &xRace.act, olced_flag, (const void *) act_flags}, {"aff", (void *) &xRace.aff, olced_flag, (const void *) affect_flags}, {"form", (void *) &xRace.form, olced_flag, (const void *) form_flags}, diff -ur src/olc.h new/olc.h --- src/olc.h Sun Apr 27 22:08:25 2003 +++ new/olc.h Thu May 8 14:57:42 2003 @@ -354,6 +354,7 @@ DECLARE_OLC_FUN(raedit_mstats); DECLARE_OLC_FUN(raedit_skills); DECLARE_OLC_FUN(raedit_classx); +DECLARE_OLC_FUN(raedit_name); DECLARE_OLC_FUN(cledit_create); DECLARE_OLC_FUN(cledit_delete); diff -ur src/olc_group.c new/olc_group.c --- src/olc_group.c Sun Apr 27 22:08:25 2003 +++ new/olc_group.c Thu May 8 14:57:42 2003 @@ -68,6 +68,7 @@ GROUP_DATA *pGroup; struct group_type *new_table; char buf[MIL]; + CHAR_DATA *pch; if (!IS_NULLSTR(argument) && group_lookup(argument) == -1) sprintf(buf, argument); @@ -97,6 +98,12 @@ alloc_mem(group_table[i].rating, int, maxClass); + for (pch = player_first; pch; pch = pch->next_player) + { + realloc_mem(pch->pcdata->group_known, bool, maxGroup); + if (pch->gen_data != NULL) + realloc_mem(pch->gen_data->group_chosen, bool, maxGroup); + } pGroup = &group_table[i]; chprintln(ch, "Group created."); edit_start(ch, pGroup, ED_GROUP); diff -ur src/olc_race.c new/olc_race.c --- src/olc_race.c Sun Apr 27 22:08:25 2003 +++ new/olc_race.c Thu May 8 14:57:42 2003 @@ -421,3 +421,42 @@ return TRUE; } + +RAEDIT(raedit_name) +{ + RACE_DATA *pRace; + MOB_INDEX_DATA *pMob; + int ihash; + char arg[MIL]; + + EDIT_RACE(ch, pRace); + + first_arg(argument, arg, FALSE); + + if (IS_NULLSTR(arg)) + { + chprintln(ch, "Change name to what?"); + return FALSE; + } + + if (race_lookup(arg) != NULL) + { + chprintln(ch, "A race with that name already exists."); + return FALSE; + } + + if (str_cmp(arg, pRace->name)) + { + for (ihash = 0; ihash < MAX_KEY_HASH; ihash++) + { + for (pMob = mob_index_hash[ihash]; pMob; pMob = pMob->next) + { + if (pMob->race == pRace) + SET_BIT(pMob->area->area_flags, AREA_CHANGED); + } + } + } + replace_string(pRace->name, arg); + chprintln(ch, "Name set."); + return TRUE; +} diff -ur src/olc_save.c new/olc_save.c --- src/olc_save.c Sun Apr 27 22:08:25 2003 +++ new/olc_save.c Thu May 8 14:57:42 2003 @@ -97,33 +97,25 @@ ****************************************************************************/ void save_area_list() { - FILE *fp; + FILE_DATA *fp; AREA_DATA *pArea; -#if !defined(WIN32) - char *TEMPFILE = "area.lst.tmp"; -#else - char *TEMPFILE = "area.lst"; -#endif - if ((fp = file_open(TEMPFILE, "w")) == NULL) + if ((fp = fopen_temp("area.lst")) == NULL) { bug("Save_area_list: file_open", 0); perror("area.lst"); } else { - fprintf(fp, "%s\n", HELP_FILE); + fprintf(fp->file, "%s\n", HELP_FILE); for (pArea = area_first; pArea; pArea = pArea->next) { - fprintf(fp, "%s\n", pArea->file_name); + fprintf(fp->file, "%s\n", pArea->file_name); } - fprintf(fp, "$\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, "area.lst"); -#endif + fprintf(fp->file, "$\n"); + fclose_temp(fp); } return; @@ -936,32 +928,24 @@ void save_helps(void) { HELP_DATA *help; - FILE *fp; -#if !defined(WIN32) - char *TEMPFILE = HELP_FILE ".tmp"; + FILE_DATA *fp; - if ((fp = file_open(TEMPFILE, "w")) != NULL) -#else - if ((fp = file_open(HELP_FILE, "w")) != NULL) -#endif + if ((fp = fopen_temp(HELP_FILE)) != NULL) { - fprintf(fp, "#HELPS\n"); + fprintf(fp->file, "#HELPS\n"); for (help = help_first; help; help = help->next) { - fprintf(fp, "%d %s~\n", help->level, help->keyword); - fprintf(fp, "%s~\n\n", fix_string(help->text)); + fprintf(fp->file, "%d %s~\n", help->level, help->keyword); + fprintf(fp->file, "%s~\n\n", fix_string(help->text)); } - fprintf(fp, "-1 $~\n\n"); - fprintf(fp, "#$\n"); + fprintf(fp->file, "-1 $~\n\n"); + fprintf(fp->file, "#$\n"); + fclose_temp(fp); } else bug("Error opening " HELP_FILE ".", 0); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, HELP_FILE); -#endif return; } @@ -972,16 +956,9 @@ ****************************************************************************/ void save_area(AREA_DATA * pArea) { - FILE *fp; - char TEMPFILE[MIL]; + FILE_DATA *fp; -#if defined(WIN32) - strcpy(TEMPFILE, pArea->file_name); -#else - sprintf(TEMPFILE, "%s.tmp", pArea->file_name); -#endif - - if (!(fp = file_open(TEMPFILE, "w"))) + if (!(fp = fopen_temp(pArea->file_name))) { bug("Open_area: file_open", 0); perror(pArea->file_name); @@ -989,36 +966,33 @@ else { REMOVE_BIT(pArea->area_flags, AREA_CHANGED); - fprintf(fp, "#AREADATA\n"); - fprintf(fp, "Name %s~\n", pArea->name); - fprintf(fp, "Builders %s~\n", fix_string(pArea->builders)); - fprintf(fp, "VNUMs %ld %ld\n", pArea->min_vnum, pArea->max_vnum); - fprintf(fp, "Credits %s~\n", pArea->credits); + fprintf(fp->file, "#AREADATA\n"); + fprintf(fp->file, "Name %s~\n", pArea->name); + fprintf(fp->file, "Builders %s~\n", fix_string(pArea->builders)); + fprintf(fp->file, "VNUMs %ld %ld\n", pArea->min_vnum, pArea->max_vnum); + fprintf(fp->file, "Credits %s~\n", pArea->credits); if (!IS_NULLSTR(pArea->lvl_comment)) - fprintf(fp, "LvlComment %s~\n", pArea->lvl_comment); - fprintf(fp, "MinLevel %d\n", pArea->min_level); - fprintf(fp, "MaxLevel %d\n", pArea->max_level); - fprintf(fp, "Version %d\n", AREA_VERSION); - fprintf(fp, "Security %d\n", pArea->security); - fprintf(fp, "Flags %s\n", fwrite_flags(pArea->area_flags)); - fprintf(fp, "End\n\n\n\n"); - - save_mobiles(fp, pArea); - save_objects(fp, pArea); - save_rooms(fp, pArea); - save_specials(fp, pArea); - save_resets(fp, pArea); - save_shops(fp, pArea); - save_mobprogs(fp, pArea); - save_objprogs(fp, pArea); - save_roomprogs(fp, pArea); - - fprintf(fp, "#$\n"); - - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, pArea->file_name); -#endif + fprintf(fp->file, "LvlComment %s~\n", pArea->lvl_comment); + fprintf(fp->file, "MinLevel %d\n", pArea->min_level); + fprintf(fp->file, "MaxLevel %d\n", pArea->max_level); + fprintf(fp->file, "Version %d\n", AREA_VERSION); + fprintf(fp->file, "Security %d\n", pArea->security); + fprintf(fp->file, "Flags %s\n", fwrite_flags(pArea->area_flags)); + fprintf(fp->file, "End\n\n\n\n"); + + save_mobiles(fp->file, pArea); + save_objects(fp->file, pArea); + save_rooms(fp->file, pArea); + save_specials(fp->file, pArea); + save_resets(fp->file, pArea); + save_shops(fp->file, pArea); + save_mobprogs(fp->file, pArea); + save_objprogs(fp->file, pArea); + save_roomprogs(fp->file, pArea); + + fprintf(fp->file, "#$\n"); + + fclose_temp(fp); } return; } diff -ur src/olc_skill.c new/olc_skill.c --- src/olc_skill.c Sun Apr 27 22:08:25 2003 +++ new/olc_skill.c Thu May 8 14:57:42 2003 @@ -145,6 +145,7 @@ SKILL_DATA *pSkill; struct skill_type *new_table; char buf[MIL]; + CHAR_DATA *pch; if (!IS_NULLSTR(argument) && skill_lookup(argument) == -1) sprintf(buf, argument); @@ -181,6 +182,12 @@ alloc_mem(skill_table[i].skill_level, int, maxClass); alloc_mem(skill_table[i].rating, int, maxClass); + for (pch = player_first; pch; pch = pch->next_player) + { + realloc_mem(pch->pcdata->learned, int, maxSkill); + if (pch->gen_data != NULL) + realloc_mem(pch->gen_data->skill_chosen, bool, maxSkill); + } pSkill = &skill_table[i]; edit_start(ch, pSkill, ED_SKILL); chprintln(ch, "Skill created."); diff -ur src/proto.h new/proto.h --- src/proto.h Sun Apr 27 22:08:25 2003 +++ new/proto.h Thu May 8 14:57:42 2003 @@ -161,7 +161,7 @@ void fread_to_eol args((FILE * fp)); char *fread_word args((FILE * fp)); flag_t flag_convert args((char letter)); -const char *str_dup args((const char *str)); +const char *str_dup args((const char *pstr)); void free_string args((const char *pstr)); int number_fuzzy args((int number)); int number_fuzzier args((int number)); @@ -194,6 +194,8 @@ FILE *file_open args((const char *file, const char *mode)); bool file_close args((FILE * fp)); void free_runbuf args((DESCRIPTOR_DATA * d)); +FILE_DATA *fopen_temp args((const char *file)); +void fclose_temp args((FILE_DATA * fp)); /* effect.c */ void acid_effect args((void *vo, int level, int dam, int target)); @@ -591,6 +593,11 @@ const char *off)); void print_on_off args((CHAR_DATA * ch, bool is_set, const char *cmd, const char *desc)); + +char *make_colour args((void)); + +void set_vtimer args((long sec)); +char *str_time args((time_t timet, int tz, const char *format)); #undef CD #undef MID diff -ur src/save.c new/save.c --- src/save.c Sun Apr 27 22:08:25 2003 +++ new/save.c Thu May 8 14:57:42 2003 @@ -118,14 +118,14 @@ { AFFECT_DATA *paf; int sn, gn, pos; - int i; + int i, j; fprintf(fp, "#%s\n", IS_NPC(ch) ? "MOB" : "PLAYER"); fprintf(fp, "Name %s~\n", ch->name); fprintf(fp, "Id %ld\n", ch->id); fprintf(fp, "LogO %ld\n", current_time); - fprintf(fp, "Vers %d\n", 7); + fprintf(fp, "Vers %d\n", 8); if (ch->short_descr[0] != '\0') fprintf(fp, "ShD %s~\n", ch->short_descr); if (ch->long_descr[0] != '\0') @@ -255,7 +255,9 @@ fprintf(fp, "Trivia %d\n", ch->pcdata->trivia); if (ch->pcdata->str_ed_key != '.' && ch->pcdata->str_ed_key != ' ') - fprintf(fp, "StrEdKey\t%c\n", ch->pcdata->str_ed_key); + fprintf(fp, "StrEdKey %c\n", ch->pcdata->str_ed_key); + + fprintf(fp, "TimeZone %d\n", ch->pcdata->timezone); if (ch->pcdata->awins != 0) fprintf(fp, "AWins %d\n", ch->pcdata->awins); @@ -295,7 +297,8 @@ fprintf(fp, "Colo %d ", MAX_CUSTOM_COLOUR); for (i = 0; i < MAX_CUSTOM_COLOUR; i++) - fprintf(fp, "%d ", ch->pcdata->colour[i]); + for (j = 0; j < 3; j++) + fprintf(fp, "%d ", ch->pcdata->colour[i][j]); fprintf(fp, "\n"); if (ch->pcdata->who_descr[0] != '\0') @@ -621,6 +624,7 @@ ch->pcdata->trivia = 0; end_quest(ch, 0); reset_gqmob(ch, 0); + ch->pcdata->timezone = -1; } /* @@ -1028,13 +1032,17 @@ KEY("Comm", ch->comm, fread_flag(fp)); if (!str_cmp(word, "Colo")) { - int i, num = fread_number(fp); - - for (i = 0; i < num; i++) + if (ch->version >= 8) { - ch->pcdata->colour[i] = fread_number(fp); - if (i >= MAX_CUSTOM_COLOUR) - break; + int i, j, num = fread_number(fp); + + for (i = 0; i < num; i++) + { + for (j = 0; j < 3; j++) + ch->pcdata->colour[i][j] = fread_number(fp); + if (i >= MAX_CUSTOM_COLOUR) + break; + } } fread_to_eol(fp); fMatch = TRUE; @@ -1288,6 +1296,7 @@ KEY("Trust", ch->trust, fread_number(fp)); KEY("Tru", ch->trust, fread_number(fp)); KEY("Trivia", ch->pcdata->trivia, fread_number(fp)); + KEY("TimeZone", ch->pcdata->timezone, fread_number(fp)); if (!str_cmp(word, "Title") || !str_cmp(word, "Titl")) { ch->pcdata->title = fread_string(fp); @@ -1920,15 +1929,10 @@ void save_corpses(void) { - FILE *fp; + FILE_DATA *fp; CORPSE_DATA *c; -#if !defined(WIN32) - char *TEMPFILE = CORPSE_FILE ".tmp"; - if ((fp = file_open(TEMPFILE, "w")) == NULL) -#else - if ((fp = file_open(CORPSE_FILE, "w")) == NULL) -#endif + if ((fp = fopen_temp(CORPSE_FILE)) == NULL) { bug("save_corpses: " CORPSE_FILE " not found.", 0); } @@ -1937,17 +1941,14 @@ for (c = corpse_first; c != NULL; c = c->next) { if (c->corpse->item_type == ITEM_CORPSE_PC) - fwrite_obj(NULL, c->corpse, fp, 0, "C"); + fwrite_obj(NULL, c->corpse, fp->file, 0, "C"); else update_corpses(c->corpse, TRUE); } - fprintf(fp, "#END\n"); - fflush(fp); + fprintf(fp->file, "#END\n"); + fflush(fp->file); + fclose_temp(fp); } - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, CORPSE_FILE); -#endif return; } diff -ur src/string.c new/string.c --- src/string.c Sun Apr 27 22:08:25 2003 +++ new/string.c Thu May 8 14:57:42 2003 @@ -947,11 +947,18 @@ str++; if (*str == '-') { - buf[i] = C_TILDE; + buf[i] = '~'; i++; } str++; } + else if (*str == ANSI_CUSTOM) + { + str++; + while (*str != ANSI_END) + str++; + str++; + } else { buf[i] = *str; @@ -1050,6 +1057,13 @@ nCount++; continue; } + else if (temp == ANSI_CUSTOM) + { + temp = *count_string++; + while (temp != ANSI_END) + temp = *count_string++; + continue; + } nCount++; } @@ -1087,6 +1101,14 @@ pos++; continue; } + else if (temp == ANSI_CUSTOM) + { + temp = result[pos++] = *string++; + + while (temp != ANSI_END) + temp = result[pos++] = *string++; + continue; + } count++; } @@ -1106,7 +1128,7 @@ while (*string != '\0') { - if (*string != ANSI_KEY) + if (*string != ANSI_KEY && *string != ANSI_CUSTOM) { count++; string++; @@ -1125,7 +1147,16 @@ string++; continue; } - else if (*string == ANSI_KEY && *(string + 1) == '\0') + else if (*string == ANSI_CUSTOM && *(string + 1) != '\0') + { + string++; + while (*string != '\0' && *string != ANSI_END) + string++; + string++; + continue; + } + else if ((*string == ANSI_KEY || *string == ANSI_CUSTOM) + && *(string + 1) == '\0') { break; } @@ -1235,6 +1266,19 @@ count++; if (count >= mod) break; + continue; + } + else if (fill[m] == ANSI_CUSTOM) + { + lbuf[m] = fill[m]; + m++; + while (fill[m] != ANSI_END) + { + lbuf[m] = fill[m]; + m++; + } + lbuf[m] = fill[m]; + m++; continue; } else diff -ur src/tables.c new/tables.c --- src/tables.c Sun Apr 27 22:08:25 2003 +++ new/tables.c Thu May 8 14:57:42 2003 @@ -772,96 +772,95 @@ {weapon_type2, "weapon"} }; -const struct colour_type colour_chars[] = { - {"Reset", C_CLEAR}, - {"Black", C_BLACK}, - {"Red", C_RED}, - {"Green", C_GREEN}, - {"Yellow", C_YELLOW}, - {"Blue", C_BLUE}, - {"Magenta", C_MAGENTA}, - {"Cyan", C_CYAN}, - {"White", C_WHITE}, - {"B_Black", CB_BLACK}, - {"B_Red", CB_RED}, - {"B_Green", CB_GREEN}, - {"B_Yellow", CB_YELLOW}, - {"B_Blue", CB_BLUE}, - {"B_Magenta", CB_MAGENTA}, - {"B_Cyan", CB_CYAN}, - {"B_White", CB_WHITE}, - {"Random", C_RANDOM}, - {"RedBG", RED_BG}, - {"BlueBG", BLUE_BG}, - {"GreenBG", GREEN_BG}, - {"BlackBG", BLACK_BG}, - {"WhiteBG", WHITE_BG}, - {"MagentaBG", MAGENTA_BG}, - {"YellowBG", YELLOW_BG}, - {"CyanBG", CYAN_BG}, - {"B_RedBG", RED_BBG}, - {"B_BlueBG", BLUE_BBG}, - {"B_GreenBG", GREEN_BBG}, - {"B_BlackBG", BLACK_BBG}, - {"B_WhiteBG", WHITE_BBG}, - {"B_MagentaBG", MAGENTA_BBG}, - {"B_YellowBG", YELLOW_BBG}, - {"B_CyanBG", CYAN_BBG}, - {"RandomBG", RANDOM_BG}, - {NULL, C_FLASH}, - {NULL, C_UNDERSCORE}, - {NULL, C_REVERSE}, - {NULL, NULL} -}; - -const struct cslot_type cslot_table[] = { - - {"Clear", _DEFAULT, C_CLEAR}, - {"Gossip1", _GOSSIP1, C_MAGENTA}, - {"Gossip2", _GOSSIP2, CB_MAGENTA}, - {"Gossip3", _GOSSIP3, CB_GREEN}, - {"Music1", _MUSIC1, C_RED}, - {"Music2", _MUSIC2, CB_RED}, - {"Music3", _MUSIC3, CB_WHITE}, - {"Q/A1", _QA1, CB_YELLOW}, - {"Q/A2", _QA2, C_YELLOW}, - {"Q/A3", _QA3, C_CLEAR}, - {"Quote1", _QUOTE1, CB_GREEN}, - {"Quote2", _QUOTE2, CB_WHITE}, - {"Quote3", _QUOTE3, CB_RED}, - {"Gratz1", _GRATS1, CB_YELLOW}, - {"Gratz2", _GRATS2, C_GREEN}, - {"Gratz3", _GRATS3, CB_WHITE}, - {"Shout1", _SHOUT1, C_WHITE}, - {"Shout2", _SHOUT2, C_MAGENTA}, - {"ImmTalk1", _IMMTALK1, C_YELLOW}, - {"ImmTalk2", _IMMTALK2, C_CYAN}, - {"ImmTalk3", _IMMTALK3, C_CYAN}, - {"Tells1", _TELLS1, C_CYAN}, - {"Tells2", _TELLS2, CB_CYAN}, - {"Say1", _SAY1, C_GREEN}, - {"Say2", _SAY2, CB_GREEN}, - {"Skill", _SKILL, CB_YELLOW}, - {"YHit", _YHIT, C_GREEN}, - {"OHit", _OHIT, C_BLUE}, - {"VHit", _VHIT, C_RED}, - {"WhoRace", _WRACE, CB_RED}, - {"WhoClass", _WCLASS, CB_CYAN}, - {"WhoLevel", _WLEVEL, CB_BLUE}, - {"RoomTitle", _RTITLE, CB_GREEN}, - {"Score1", _SCORE1, C_CYAN}, - {"Score2", _SCORE2, CB_CYAN}, - {"Score3", _SCORE3, CB_WHITE}, - {"Score4", _SCOREB, C_CLEAR}, - {"Wiznet", _WIZNET, C_GREEN}, - {"Gtell1", _GTELL1, CB_BLUE}, - {"Gtell2", _GTELL2, CB_MAGENTA}, - {"Whois1", _WHOIS1, C_GREEN}, - {"Whois2", _WHOIS2, CB_WHITE}, - {"Whois3", _WHOISB, C_CYAN}, - {"Btalk1", _BTALK1, CB_BLUE}, - {"Btalk2", _BTALK2, CB_WHITE}, - {NULL, -1, NULL} +const struct colour_type colour_attributes[] = { + {"default", CL_CLEAR}, + {"bright", CL_BRIGHT}, + {"dim", CL_DIM}, + {"standout", CL_STANDOUT}, + {"underscore", CL_UNDER}, + {"blink", CL_BLINK}, + {"italic", CL_ITALIC}, + {"reverse", CL_REVERSE}, + {"hidden", CL_REVERSE}, + {"random", CL_RANDOM}, + {NULL, 0} +}; + +const struct colour_type colour_foregrounds[] = { + {"black", FG_BLACK}, + {"red", FG_RED}, + {"green", FG_GREEN}, + {"yellow", FG_YELLOW}, + {"blue", FG_BLUE}, + {"magenta", FG_MAGENTA}, + {"cyan", FG_CYAN}, + {"white", FG_WHITE}, + {"random", FG_RANDOM}, + {"none", FG_NONE}, + {NULL, 0} +}; + +const struct colour_type colour_backgrounds[] = { + {"black", BG_BLACK}, + {"red", BG_RED}, + {"green", BG_GREEN}, + {"yellow", BG_YELLOW}, + {"blue", BG_BLUE}, + {"magenta", BG_MAGENTA}, + {"cyan", BG_CYAN}, + {"white", BG_WHITE}, + {"random", BG_RANDOM}, + {"none", BG_NONE}, + {NULL, 0} +}; + +const struct cslot_type cslot_table[MAX_CUSTOM_COLOUR] = { + + {"Clear", _DEFAULT, CL_CLEAR, FG_NONE, BG_NONE}, + {"Gossip1", _GOSSIP1, CL_CLEAR, FG_MAGENTA, BG_NONE}, + {"Gossip2", _GOSSIP2, CL_BRIGHT, FG_MAGENTA, BG_NONE}, + {"Gossip3", _GOSSIP3, CL_BRIGHT, FG_GREEN, BG_NONE}, + {"Music1", _MUSIC1, CL_CLEAR, FG_RED, BG_NONE}, + {"Music2", _MUSIC2, CL_BRIGHT, FG_RED, BG_NONE}, + {"Music3", _MUSIC3, CL_BRIGHT, FG_WHITE, BG_NONE}, + {"Q/A1", _QA1, CL_BRIGHT, FG_YELLOW, BG_NONE}, + {"Q/A2", _QA2, CL_CLEAR, FG_YELLOW, BG_NONE}, + {"Q/A3", _QA3, CL_CLEAR, FG_NONE, BG_NONE}, + {"Quote1", _QUOTE1, CL_BRIGHT, FG_GREEN, BG_NONE}, + {"Quote2", _QUOTE2, CL_BRIGHT, FG_WHITE, BG_NONE}, + {"Quote3", _QUOTE3, CL_BRIGHT, FG_RED, BG_NONE}, + {"Gratz1", _GRATS1, CL_BRIGHT, FG_YELLOW, BG_NONE}, + {"Gratz2", _GRATS2, CL_CLEAR, FG_GREEN, BG_NONE}, + {"Gratz3", _GRATS3, CL_BRIGHT, FG_WHITE, BG_NONE}, + {"Shout1", _SHOUT1, CL_CLEAR, FG_WHITE, BG_NONE}, + {"Shout2", _SHOUT2, CL_CLEAR, FG_MAGENTA, BG_NONE}, + {"ImmTalk1", _IMMTALK1, CL_CLEAR, FG_YELLOW, BG_NONE}, + {"ImmTalk2", _IMMTALK2, CL_CLEAR, FG_CYAN, BG_NONE}, + {"ImmTalk3", _IMMTALK3, CL_CLEAR, FG_CYAN, BG_NONE}, + {"Tells1", _TELLS1, CL_CLEAR, FG_CYAN, BG_NONE}, + {"Tells2", _TELLS2, CL_BRIGHT, FG_CYAN, BG_NONE}, + {"Say1", _SAY1, CL_CLEAR, FG_GREEN, BG_NONE}, + {"Say2", _SAY2, CL_BRIGHT, FG_GREEN, BG_NONE}, + {"Skill", _SKILL, CL_BRIGHT, FG_YELLOW, BG_NONE}, + {"YHit", _YHIT, CL_CLEAR, FG_GREEN, BG_NONE}, + {"OHit", _OHIT, CL_CLEAR, FG_BLUE, BG_NONE}, + {"VHit", _VHIT, CL_CLEAR, FG_RED, BG_NONE}, + {"WhoRace", _WRACE, CL_BRIGHT, FG_RED, BG_NONE}, + {"WhoClass", _WCLASS, CL_BRIGHT, FG_CYAN, BG_NONE}, + {"WhoLevel", _WLEVEL, CL_BRIGHT, FG_BLUE, BG_NONE}, + {"RoomTitle", _RTITLE, CL_BRIGHT, FG_GREEN, BG_NONE}, + {"Score1", _SCORE1, CL_CLEAR, FG_CYAN, BG_NONE}, + {"Score2", _SCORE2, CL_BRIGHT, FG_CYAN, BG_NONE}, + {"Score3", _SCORE3, CL_BRIGHT, FG_WHITE, BG_NONE}, + {"Score4", _SCOREB, CL_CLEAR, FG_NONE, BG_NONE}, + {"Wiznet", _WIZNET, CL_CLEAR, FG_GREEN, BG_NONE}, + {"Gtell1", _GTELL1, CL_BRIGHT, FG_BLUE, BG_NONE}, + {"Gtell2", _GTELL2, CL_BRIGHT, FG_MAGENTA, BG_NONE}, + {"Whois1", _WHOIS1, CL_CLEAR, FG_GREEN, BG_NONE}, + {"Whois2", _WHOIS2, CL_BRIGHT, FG_WHITE, BG_NONE}, + {"Whois3", _WHOISB, CL_CLEAR, FG_CYAN, BG_NONE}, + {"Btalk1", _BTALK1, CL_BRIGHT, FG_BLUE, BG_NONE}, + {"Btalk2", _BTALK2, CL_BRIGHT, FG_WHITE, BG_NONE} }; const struct vnum_type vnum_table[] = { @@ -968,4 +967,32 @@ {"obj_char_defensive", TAR_OBJ_CHAR_DEF, TRUE}, {"obj_char_offensive", TAR_OBJ_CHAR_OFF, TRUE}, {NULL, 0, 0} +}; + +const struct tzone_type tzone_table[MAX_TZONE] = { + {"GMT-12", "Eniwetok", -12, 0}, + {"GMT-11", "Samoa", -11, 0}, + {"GMT-10", "Hawaii", -10, 0}, + {"GMT-9", "Alaska", -9, 0}, + {"GMT-8", "PST, Pacific US", -8, -7}, + {"GMT-7", "MST, Mountain US", -7, -6}, + {"GMT-6", "CST, Central US", -6, -5}, + {"GMT-5", "EST, Eastern US", -5, -4}, + {"GMT-4", "Atlantic, Canada", -4, 0}, + {"GMT-3", "Brazilia, Buenos Aries", -3, 0}, + {"GMT-2", "Mid-Atlantic", -2, 0}, + {"GMT-1", "Cape Verdes", -1, 0}, + {"GMT", "Greenwich Mean Time, Greenwich", 0, 0}, + {"GMT+1", "Berlin, Rome", 1, 0}, + {"GMT+2", "Israel, Cairo", 2, 0}, + {"GMT+3", "Moscow, Kuwait", 3, 0}, + {"GMT+4", "Abu Dhabi, Muscat", 4, 0}, + {"GMT+5", "Islamabad, Karachi", 5, 0}, + {"GMT+6", "Almaty, Dhaka", 6, 0}, + {"GMT+7", "Bangkok, Jakarta", 7, 0}, + {"GMT+8", "Hong Kong, Beijing", 8, 0}, + {"GMT+9", "Tokyo, Osaka", 9, 0}, + {"GMT+10", "Sydney, Melbourne, Guam", 10, 0}, + {"GMT+11", "Magadan, Soloman Is.", 11, 0}, + {"GMT+12", "Fiji, Wellington, Auckland", 12, 0} }; diff -ur src/tables.h new/tables.h --- src/tables.h Sun Apr 27 22:08:25 2003 +++ new/tables.h Thu May 8 14:57:42 2003 @@ -70,8 +70,10 @@ extern const struct flag_type position_flags[]; extern const struct flag_type ac_type[]; extern const struct bit_type bitvector_type[]; -extern const struct colour_type colour_chars[]; -extern const struct cslot_type cslot_table[]; +extern const struct colour_type colour_attributes[]; +extern const struct colour_type colour_foregrounds[]; +extern const struct colour_type colour_backgrounds[]; +extern const struct cslot_type cslot_table[MAX_CUSTOM_COLOUR]; extern const struct flag_type desc_flags[]; extern const struct vnum_type vnum_table[]; extern const struct flag_type info_flags[]; @@ -79,6 +81,7 @@ extern const struct spfun_type spell_table[]; extern const struct gsn_type gsn_table[]; extern const struct flag_type target_flags[]; +extern const struct tzone_type tzone_table[MAX_TZONE]; struct flag_type { @@ -128,14 +131,16 @@ struct colour_type { const char *name; - const char *code; + int col_type; }; struct cslot_type { const char *name; int slot; - const char *def; + int col_attr; + int col_fore; + int col_back; }; struct vnum_type @@ -148,6 +153,14 @@ { const char *name; SPELL_FUN *fun; +}; + +struct tzone_type +{ + const char *name; + const char *zone; + int gmt_offset; + int dst_offset; }; struct gsn_type diff -ur src/tablesave.c new/tablesave.c --- src/tablesave.c Sun Apr 27 22:08:25 2003 +++ new/tablesave.c Thu May 8 14:57:42 2003 @@ -774,8 +774,8 @@ fprintf(fp, "%s\t\t", temp->field); for (i = 0; i < - (temp->argument ? (int) temp-> - argument : *(int *) temp->argument2); i++) + (temp->argument ? (int) temp->argument : *(int *) temp-> + argument2); i++) fprintf(fp, "%d ", pbool[i] == TRUE ? 1 : 0); fprintf(fp, "@\n"); break; @@ -802,36 +802,27 @@ void save_commands(void) { - FILE *fp; + FILE_DATA *fp; CMD_DATA *i; -#if !defined(WIN32) - const char *TEMPFILE = COMMAND_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(COMMAND_FILE, "w"); -#endif + fp = fopen_temp(COMMAND_FILE); if (!fp) { perror("save_commands"); - file_close(fp); return; } for (i = cmd_first; i; i = i->next) { - fprintf(fp, "#COMMAND\n"); - save_struct(fp, &cmd, cmdsavetable, i); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#COMMAND\n"); + save_struct(fp->file, &cmd, cmdsavetable, i); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n\n"); + fprintf(fp->file, "#!\n\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, COMMAND_FILE); -#endif + fclose_temp(fp); } void load_commands(void) @@ -873,38 +864,29 @@ void save_skills(void) { - FILE *fp; + FILE_DATA *fp; int i; -#if !defined(WIN32) - const char *TEMPFILE = SKILL_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(SKILL_FILE, "w"); -#endif + fp = fopen_temp(SKILL_FILE); if (!fp) { bug("save_skills: NULL fp", 0); - file_close(fp); return; } - fprintf(fp, "%d\n", maxSkill); + fprintf(fp->file, "%d\n", maxSkill); for (i = 0; i < maxSkill; ++i) { - fprintf(fp, "#SKILL\n"); - save_struct(fp, &sk, skillsavetable, &skill_table[i]); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#SKILL\n"); + save_struct(fp->file, &sk, skillsavetable, &skill_table[i]); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, SKILL_FILE); -#endif + fclose_temp(fp); } void load_skills(void) @@ -962,15 +944,10 @@ void save_races(void) { - FILE *fp; + FILE_DATA *fp; RACE_DATA *temp; -#if !defined(WIN32) - const char *TEMPFILE = RACE_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(RACE_FILE, "w"); -#endif + fp = fopen_temp(RACE_FILE); if (!fp) { @@ -980,19 +957,14 @@ for (temp = race_first; temp; temp = temp->next) { - fprintf(fp, "#RACE\n"); - save_struct(fp, &race, racesavetable, temp); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#RACE\n"); + save_struct(fp->file, &race, racesavetable, temp); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n\n"); - - file_close(fp); - -#if !defined(WIN32) - rename(TEMPFILE, RACE_FILE); -#endif + fprintf(fp->file, "#!\n\n"); + fclose_temp(fp); } void load_races(void) @@ -1031,38 +1003,29 @@ void save_groups(void) { - FILE *fp; + FILE_DATA *fp; int i; -#if !defined(WIN32) - const char *TEMPFILE = GROUP_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(GROUP_FILE, "w"); -#endif + fp = fopen_temp(GROUP_FILE); if (!fp) { bug("save_groups: NULL fp", 0); - file_close(fp); return; } - fprintf(fp, "%d\n", maxGroup); + fprintf(fp->file, "%d\n", maxGroup); for (i = 0; i < maxGroup; ++i) { - fprintf(fp, "#GROUP\n"); - save_struct(fp, &grp, groupsavetable, &group_table[i]); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#GROUP\n"); + save_struct(fp->file, &grp, groupsavetable, &group_table[i]); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, GROUP_FILE); -#endif + fclose_temp(fp); } void load_groups(void) @@ -1120,38 +1083,29 @@ void save_classes(void) { - FILE *fp; + FILE_DATA *fp; int i; -#if !defined(WIN32) - const char *TEMPFILE = CLASS_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(CLASS_FILE, "w"); -#endif + fp = fopen_temp(CLASS_FILE); if (!fp) { bug("save_classes: NULL fp", 0); - file_close(fp); return; } - fprintf(fp, "%d\n", maxClass); + fprintf(fp->file, "%d\n", maxClass); for (i = 0; i < maxClass; ++i) { - fprintf(fp, "#CLASS\n"); - save_struct(fp, &cls, classsavetable, &class_table[i]); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#CLASS\n"); + save_struct(fp->file, &cls, classsavetable, &class_table[i]); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, CLASS_FILE); -#endif + fclose_temp(fp); } void load_classes(void) @@ -1209,36 +1163,27 @@ void save_social_table(void) { - FILE *fp; + FILE_DATA *fp; SOCIAL_DATA *i; -#if !defined(WIN32) - const char *TEMPFILE = SOCIAL_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(SOCIAL_FILE, "w"); -#endif + fp = fopen_temp(SOCIAL_FILE); if (!fp) { bug("save_socials: NULL fp", 0); - file_close(fp); return; } for (i = social_first; i; i = i->next) { - fprintf(fp, "#SOCIAL\n"); - save_struct(fp, &soc, socialsavetable, i); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#SOCIAL\n"); + save_struct(fp->file, &soc, socialsavetable, i); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, SOCIAL_FILE); -#endif + fclose_temp(fp); } void load_social_table(void) @@ -1280,36 +1225,27 @@ void save_clans(void) { - FILE *fp; + FILE_DATA *fp; CLAN_DATA *i; -#if !defined(WIN32) - const char *TEMPFILE = CLAN_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(CLAN_FILE, "w"); -#endif + fp = fopen_temp(CLAN_FILE); if (!fp) { bug("save_clans: NULL fp", 0); - file_close(fp); return; } for (i = clan_first; i; i = i->next) { - fprintf(fp, "#CLAN\n"); - save_struct(fp, &clan, clansavetable, i); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#CLAN\n"); + save_struct(fp->file, &clan, clansavetable, i); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, CLAN_FILE); -#endif + fclose_temp(fp); } void load_clans(void) @@ -1352,34 +1288,24 @@ void save_statlist(void) { STAT_DATA *pstat; - FILE *fp; -#if !defined(WIN32) - const char *TEMPFILE = STAT_FILE ".tmp"; + FILE_DATA *fp; - if ((fp = file_open(TEMPFILE, "w")) == NULL) -#else - if ((fp = file_open(STAT_FILE, "w")) == NULL) -#endif + if ((fp = fopen_temp(STAT_FILE)) == NULL) { perror(STAT_FILE); - file_close(fp); return; } for (pstat = stat_first; pstat != NULL; pstat = pstat->next) { - fprintf(fp, "#STAT\n"); - save_struct(fp, &stat, statsavetable, pstat); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#STAT\n"); + save_struct(fp->file, &stat, statsavetable, pstat); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); - - file_close(fp); + fprintf(fp->file, "#!\n"); -#if !defined(WIN32) - rename(TEMPFILE, STAT_FILE); -#endif + fclose_temp(fp); } void load_statlist(void) @@ -1416,35 +1342,24 @@ void save_bans(void) { BAN_DATA *pban; - FILE *fp; -#if !defined(WIN32) - const char *TEMPFILE = BAN_FILE ".tmp"; + FILE_DATA *fp; - if ((fp = file_open(TEMPFILE, "w")) == NULL) -#else - if ((fp = file_open(BAN_FILE, "w")) == NULL) -#endif + if ((fp = fopen_temp(BAN_FILE)) == NULL) { perror(BAN_FILE); - file_close(fp); return; } for (pban = ban_first; pban != NULL; pban = pban->next) { - fprintf(fp, "#BAN\n"); - save_struct(fp, &ban, bansavetable, pban); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#BAN\n"); + save_struct(fp->file, &ban, bansavetable, pban); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); - -#if !defined(WIN32) - rename(TEMPFILE, BAN_FILE); - return; -#endif + fclose_temp(fp); } void load_bans(void) @@ -1480,29 +1395,20 @@ bool save_gquest_data(void) { - FILE *fp; -#if !defined(WIN32) - char *TEMPFILE = GQUEST_FILE ".tmp"; + FILE_DATA *fp; - if (!(fp = file_open(TEMPFILE, "w"))) -#else - if (!(fp = file_open(GQUEST_FILE, "w"))) -#endif + if (!(fp = fopen_temp(GQUEST_FILE))) { bugf("Could not open file %s in order to save gquest data.", GQUEST_FILE); - file_close(fp); return FALSE; } - fprintf(fp, "#GQUESTDATA\n"); - save_struct(fp, &gq, gqsavetable, &gquest_info); - fprintf(fp, "#END\n"); - fprintf(fp, "\n#!\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, GQUEST_FILE); -#endif + fprintf(fp->file, "#GQUESTDATA\n"); + save_struct(fp->file, &gq, gqsavetable, &gquest_info); + fprintf(fp->file, "#END\n"); + fprintf(fp->file, "\n#!\n"); + fclose_temp(fp); return TRUE; } @@ -1542,36 +1448,27 @@ void save_deities(void) { - FILE *fp; + FILE_DATA *fp; DEITY_DATA *i; -#if !defined(WIN32) - char *TEMPFILE = DEITY_FILE ".tmp"; - fp = file_open(TEMPFILE, "w"); -#else - fp = file_open(DEITY_FILE, "w"); -#endif + fp = fopen_temp(DEITY_FILE); if (!fp) { bug("save_deities: NULL fp", 0); - file_close(fp); return; } for (i = deity_first; i; i = i->next) { - fprintf(fp, "#DEITY\n"); - save_struct(fp, &deity, deitysavetable, i); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#DEITY\n"); + save_struct(fp->file, &deity, deitysavetable, i); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); -#if !defined(WIN32) - rename(TEMPFILE, DEITY_FILE); -#endif + fclose_temp(fp); } void load_deities(void) @@ -1615,34 +1512,24 @@ void save_webpasses(void) { WPWD_DATA *ppwd; - FILE *fp; -#if !defined(WIN32) - char *TEMPFILE = WPWD_FILE ".tmp"; + FILE_DATA *fp; - if ((fp = file_open(TEMPFILE, "w")) == NULL) -#else - if ((fp = file_open(WPWD_FILE, "w")) == NULL) -#endif + if ((fp = fopen_temp(WPWD_FILE)) == NULL) { perror(WPWD_FILE); - file_close(fp); return; } for (ppwd = wpwd_first; ppwd != NULL; ppwd = ppwd->next) { - fprintf(fp, "#WPWD\n"); - save_struct(fp, &pwd, pwdsavetable, ppwd); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#WPWD\n"); + save_struct(fp->file, &pwd, pwdsavetable, ppwd); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); + fprintf(fp->file, "#!\n"); - file_close(fp); - -#if !defined(WIN32) - rename(TEMPFILE, WPWD_FILE); -#endif + fclose_temp(fp); } void load_webpasses(void) @@ -1684,17 +1571,11 @@ void save_members(void) { MBR_DATA *pmbr; - FILE *fp; -#if !defined(WIN32) - char *TEMPFILE = MBR_FILE ".tmp"; + FILE_DATA *fp; - if ((fp = file_open(TEMPFILE, "w")) == NULL) -#else - if ((fp = file_open(MBR_FILE, "w")) == NULL) -#endif + if ((fp = fopen_temp(MBR_FILE)) == NULL) { perror(MBR_FILE); - file_close(fp); return; } @@ -1705,18 +1586,14 @@ bugf("%s member data invalid.", pmbr->name); continue; } - fprintf(fp, "#MBR\n"); - save_struct(fp, &mbr, mbrsavetable, pmbr); - fprintf(fp, "#END\n\n"); + fprintf(fp->file, "#MBR\n"); + save_struct(fp->file, &mbr, mbrsavetable, pmbr); + fprintf(fp->file, "#END\n\n"); } - fprintf(fp, "#!\n"); - - file_close(fp); + fprintf(fp->file, "#!\n"); -#if !defined(WIN32) - rename(TEMPFILE, MBR_FILE); -#endif + fclose_temp(fp); } void load_members(void) diff -ur src/update.c new/update.c --- src/update.c Sun Apr 27 22:08:25 2003 +++ new/update.c Thu May 8 14:57:42 2003 @@ -1173,8 +1173,10 @@ /* number_range( PULSE_AREA / 2, 3 * PULSE_AREA / 2 ); */ area_update(); bank_update(); +#if !defined(NO_WEB) if (!WebUP) WebUP = init_web_server(); +#endif } if (--pulse_music <= 0) diff -ur src/war.c new/war.c --- src/war.c Sun Apr 27 22:08:25 2003 +++ new/war.c Thu May 8 14:57:42 2003 @@ -39,37 +39,45 @@ void make_note(const char *board_name, const char *sender, const char *to, const char *subject, const int expire_days, const char *text); -#define IS_SET_WAR(ch) (IS_SET((ch)->act, PLR_WAR) || (ch)->pcdata->still_in_war == TRUE) - -#define WAR_NONE 0 -#define WAR_RACE 1 -#define WAR_CLASS 2 -#define WAR_GENOCIDE 3 -#define WAR_CLAN 4 -#define MAX_WAR 5 +#define IS_SET_WAR(ch) (!IS_NPC(ch) && (IS_SET((ch)->act, PLR_WAR) || (ch)->pcdata->still_in_war == TRUE)) struct war_type { const char *name; - int type; + const char *plural; + enum war_types type; }; -const struct war_type war_table[] = { - {"none", WAR_NONE}, - {"race", WAR_RACE}, - {"class", WAR_CLASS}, - {"genocide", WAR_GENOCIDE}, - {"clan", WAR_CLAN}, - {NULL, -1}, +const struct war_type war_table[MAX_WAR] = { + {"none", "none", WAR_NONE}, + {"clan", "clans", WAR_CLAN}, + {"race", "races", WAR_RACE}, + {"class", "classes", WAR_CLASS}, + {"genocide", "people", WAR_GENOCIDE}, + {"deity", "deities", WAR_DEITY} }; -char *wartype_name(int type) +int war_lookup(const char *arg) { int i; - for (i = 0; war_table[i].name != NULL; i++) + for (i = WAR_NONE; i < MAX_WAR; i++) + { + if (is_number(arg) ? atoi(arg) == war_table[i].type + : !str_prefix(arg, war_table[i].name)) + return i; + } + return -1; +} + +char *wartype_name(int type, bool plural) +{ + int i; + + for (i = 0; i < MAX_WAR; i++) if (war_table[i].type == type) - return capitalize(war_table[i].name); + return capitalize(!plural ? war_table[i].name : + war_table[i].plural); return "Unknown"; } @@ -124,7 +132,7 @@ blevel = atoi(arg1); elevel = atoi(arg2); - type = atoi(arg3); + type = war_lookup(arg3); if (blevel <= 0 || blevel > MAX_LEVEL) { @@ -150,7 +158,7 @@ return FALSE; } - if (type <= WAR_NONE || type >= MAX_WAR) + if (type == -1) { int i; @@ -175,7 +183,7 @@ sprintf(buf, "It costs %d Trivia Points to start a %s war.", - WAR_COST, wartype_name(type)); + WAR_COST, wartype_name(type, FALSE)); do_mob_tell(ch, warmaster, buf); return FALSE; } @@ -184,7 +192,7 @@ sprintf(buf, "Thank you %s, %s war started, you are %d trivia points lighter.", - ch->name, wartype_name(type), WAR_COST); + ch->name, wartype_name(type, FALSE), WAR_COST); do_mob_tell(ch, warmaster, buf); } } @@ -193,15 +201,15 @@ replace_string(war_info.who, ch->name); war_info.min_level = blevel; war_info.max_level = elevel; - war_info.wartype = type; + war_info.wartype = war_table[type].type; announce(ch, INFO_WAR, "$n announces a %s war for levels %d to %d. Type 'WAR JOIN' to kill or be killed.", - wartype_name(war_info.wartype), war_info.min_level, + wartype_name(war_info.wartype, FALSE), war_info.min_level, war_info.max_level); if (ch) chprintf(ch, "You announce a %s war for levels %d to %d. Type 'WAR JOIN' to kill or be killed.", - wartype_name(war_info.wartype), war_info.min_level, + wartype_name(war_info.wartype, FALSE), war_info.min_level, war_info.max_level); war_info.timer = 3; war_info.next = 0; @@ -277,9 +285,11 @@ war_info.max_level = maxlvl; if (clan >= 2) - war_info.wartype = number_range(WAR_NONE, MAX_WAR - 1); + war_info.wartype = + (enum war_types) number_range(WAR_NONE + 1, MAX_WAR - 1); else - war_info.wartype = number_range(WAR_NONE, MAX_WAR - 2); + war_info.wartype = + (enum war_types) number_range(WAR_CLAN + 1, MAX_WAR - 1); if (war_info.wartype == WAR_NONE) war_info.wartype = WAR_GENOCIDE; @@ -287,13 +297,13 @@ announce(warmaster, INFO_WAR, "%s %s war for levels %d to %d%s. Type 'WAR JOIN' to kill or be killed.", !warmaster ? "A" : "$n announces a", - wartype_name(war_info.wartype), war_info.min_level, + wartype_name(war_info.wartype, FALSE), war_info.min_level, war_info.max_level, !warmaster ? " has started" : ""); if (warmaster) chprintf(warmaster, "You announce a %s war for levels %d" " to %d. Type 'WAR JOIN' to kill or be killed.", - wartype_name(war_info.wartype), war_info.min_level, + wartype_name(war_info.wartype, FALSE), war_info.min_level, war_info.max_level); war_info.timer = 3; war_info.next = 0; @@ -351,12 +361,42 @@ case WAR_CLASS: return class_table[ch->Class[0]].name; case WAR_GENOCIDE: - return ""; + return ch->name; case WAR_CLAN: return ch->clan->who_name; + case WAR_DEITY: + return ch->deity->name; + } +} + +void *wartype_data(CHAR_DATA * ch) +{ + switch (war_info.wartype) + { + default: + return NULL; + case WAR_RACE: + return ch->race; + case WAR_CLASS: + return &ch->Class[0]; + case WAR_GENOCIDE: + return &ch->id; + case WAR_CLAN: + return ch->clan; + case WAR_DEITY: + return ch->deity; } } +char *warrior_status(CHAR_DATA * ch) +{ + if (war_info.wartype != WAR_GENOCIDE) + return FORMATF("%s (%s, Lvl %d)", ch->name, wartype_info(ch), + ch->level); + else + return FORMATF("%s (Lvl %d)", ch->name, ch->level); +} + CH_CMD(do_war) { char arg[MIL]; @@ -449,7 +489,7 @@ war_info.iswar == WAR_WAITING ? "Waiting" : "Running", war_info.timer); chprintlnf(ch, "{RType : {W%s war.{x", - wartype_name(war_info.wartype)); + wartype_name(war_info.wartype, FALSE)); chprintlnf(ch, "{g%s{x", draw_line(ch, NULL, 0)); return; } @@ -465,8 +505,8 @@ if (IS_SET(wch->act, PLR_WAR)) { chprintf(ch, - "{W%-12s : [{R%ld%% hit{W] [{M%ld%% mana{W] [Pos: {G%s{W]{x", - wch == ch ? "You" : wch->name, + "{W%s : [{R%ld%% hit{W] [{M%ld%% mana{W] [Pos: {G%s{W]{x", + warrior_status(wch), wch->hit * 100 / wch->max_hit, wch->mana * 100 / wch->max_mana, position_flags[wch->position].name); @@ -535,13 +575,7 @@ char_to_room(ch, location); ch->pcdata->still_in_war = TRUE; SET_BIT(ch->act, PLR_WAR); - if (war_info.wartype == WAR_GENOCIDE) - announce(NULL, INFO_WAR, - "%s (Level %d) joins the war!", ch->name, ch->level); - else - announce(NULL, INFO_WAR, - "%s (Level %d, %s) joins the war!", - ch->name, ch->level, wartype_info(ch)); + announce(NULL, INFO_WAR, "%s joins the war!", warrior_status(ch)); act("$n arrives to get $s ass whipped!", ch, NULL, NULL, TO_ROOM); war_info.inwar++; do_function(ch, &do_look, "auto"); @@ -552,7 +586,7 @@ return; } -bool abort_race_war(void) +bool abort_war(void) { CHAR_DATA *ch; CHAR_DATA *vict; @@ -565,57 +599,7 @@ { if (IS_SET(vict->act, PLR_WAR)) { - if (ch->race == vict->race) - continue; - else - return FALSE; - } - } - } - } - return TRUE; -} - -bool abort_class_war(void) -{ - CHAR_DATA *ch; - CHAR_DATA *vict; - - for (ch = player_first; ch != NULL; ch = ch->next_player) - { - if (IS_SET(ch->act, PLR_WAR)) - { - for (vict = player_first; vict != NULL; vict = vict->next_player) - { - if (IS_SET(vict->act, PLR_WAR)) - { - if (prime_class(ch) == prime_class(vict)) - continue; - else - return FALSE; - } - } - } - } - return TRUE; -} - -bool abort_clan_war(void) -{ - CHAR_DATA *ch; - CHAR_DATA *vict; - - for (ch = player_first; ch != NULL; ch = ch->next_player) - { - if (IS_SET(ch->act, PLR_WAR) && is_clan(ch)) - { - for (vict = player_first; vict != NULL; vict = vict->next_player) - { - if (IS_SET(vict->act, PLR_WAR) && is_clan(vict)) - { - if (is_same_clan(ch, vict)) - continue; - else + if (wartype_data(ch) != wartype_data(vict)) return FALSE; } } @@ -634,49 +618,40 @@ return; output = new_buf(); - add_buf(output, "{WWAR INFO{g\n\r--------{x"); - sprintf(buf, "{RStarted by : {W%s", + add_buf(output, "{WWAR INFO{g\n\r--------{x\n\r"); + sprintf(buf, "{RStarted by : {W%s\n\r", IS_NULLSTR(war_info.who) ? "AutoWar (Tm)" : war_info.who); add_buf(output, buf); - sprintf(buf, "{RLevels : {W%d - %d{x", war_info.min_level, + sprintf(buf, "{RLevels : {W%d - %d{x\n\r", war_info.min_level, war_info.max_level); add_buf(output, buf); - sprintf(buf, "{RType : {W%s war.{x", wartype_name(war_info.wartype)); + sprintf(buf, "{RType : {W%s war.{x\n\r", + wartype_name(war_info.wartype, FALSE)); add_buf(output, buf); - add_buf(output, "{WWAR COMBATENTS{g\n\r--------------{x"); + add_buf(output, "{WWAR COMBATENTS{g\n\r--------------{x\n\r"); for (wch = player_first; wch != NULL; wch = wch->next_player) { if (!IS_SET_WAR(wch)) continue; - if (war_info.wartype != 3) - sprintf(buf, "{W%12s : (%s){x", wch->name, wartype_info(wch)); - else - sprintf(buf, "{W%s{x", wch->name); + + sprintf(buf, "{W%s{x\n\r", warrior_status(wch)); add_buf(output, buf); } - add_buf(output, "{g--------------{x"); + add_buf(output, "{g--------------{x\n\r"); switch (war_info.wartype) { case WAR_RACE: - sprintf(buf, "{WThe {R%s's{W won this war.{x", ch->race->name); - add_buf(output, buf); - break; case WAR_CLASS: - sprintf(buf, "{WThe {R%s's{W won this war.{x", - class_table[ch->Class[0]].name); - add_buf(output, buf); - break; - case WAR_GENOCIDE: - sprintf(buf, "{R%s{W won the Genocide war.{x", ch->name); + sprintf(buf, "{WThe {R%s's{W won this war.{x\n\r", wartype_info(ch)); add_buf(output, buf); break; - case WAR_CLAN: - sprintf(buf, "{R%s{W won this war.{x", ch->clan->who_name); + default: + sprintf(buf, "{R%s{W won this war.{x\n\r", wartype_info(ch)); add_buf(output, buf); break; } - sprintf(subject, "War Info %s", ctime(¤t_time)); + sprintf(subject, "War Info %s\n\r", str_time(current_time, -1, NULL)); sprintf(sender, "%s", IS_NULLSTR(war_info.who) ? "AutoWar (Tm)" : war_info.who); make_note("General", sender, "All", subject, 15, buf_string(output)); @@ -704,7 +679,7 @@ "%d minute%s left to join the war. (Levels %d - %d, %s War)", war_info.timer, war_info.timer == 1 ? "" : "s", war_info.min_level, war_info.max_level, - wartype_name(war_info.wartype)); + wartype_name(war_info.wartype, FALSE)); } else { @@ -713,20 +688,11 @@ end_war(); announce(NULL, INFO_WAR, "Not enough people for war."); } - else if (war_info.wartype == WAR_RACE && abort_race_war()) + else if (abort_war()) { + announce(NULL, INFO_WAR, "Not enough %s for war.", + wartype_name(war_info.wartype, TRUE)); end_war(); - announce(NULL, INFO_WAR, "Not enough races for war."); - } - else if (war_info.wartype == WAR_CLASS && abort_class_war()) - { - end_war(); - announce(NULL, INFO_WAR, "Not enough classes for war."); - } - else if (war_info.wartype == WAR_CLAN && abort_clan_war()) - { - end_war(); - announce(NULL, INFO_WAR, "Not enough clans for war"); } else { @@ -819,93 +785,36 @@ announce(NULL, INFO_WAR, "%s was killed in combat by %s!{x", victim->name, ch->name); - switch (war_info.wartype) + if (abort_war()) { - case WAR_RACE: - if (abort_race_war()) + switch (war_info.wartype) { - announce(NULL, INFO_WAR, "The %s's have won the War!", - ch->race->name); - note_war(ch); - for (wch = player_first; wch != NULL; wch = wch->next_player) - { - if (!IS_SET_WAR(wch)) - continue; - - if (wch->race == ch->race) - { - wch->gold += reward; - wch->pcdata->questpoints += qreward; - chprintf(wch, - "You recieve %d gold and %d questpoints from the war tribunal!", - reward, qreward); - } - } - end_war(); - return; - } // end abort - break; - case WAR_CLASS: - if (abort_class_war()) - { - announce(NULL, INFO_WAR, "The %s's have won the War!{x", - class_table[ch->Class[0]].name); - note_war(ch); - for (wch = player_first; wch != NULL; wch = wch->next_player) - { - if (!IS_SET_WAR(wch)) - continue; - if (wch->Class[0] == ch->Class[0]) - { - wch->gold += reward; - wch->pcdata->questpoints += qreward; - chprintf(wch, - "You recieve %d gold and %d questpoints from the war tribunal!", - reward, qreward); - } - } - end_war(); - return; + case WAR_RACE: + case WAR_CLASS: + announce(NULL, INFO_WAR, "The %s's have won the war!", + wartype_info(ch)); + break; + default: + announce(NULL, INFO_WAR, "%s has won the war!", wartype_info(ch)); + break; } - break; - case WAR_CLAN: - if (abort_clan_war()) + note_war(ch); + for (wch = player_first; wch != NULL; wch = wch->next_player) { - announce(NULL, INFO_WAR, "%s has won the War!{x", - ch->clan->who_name); - note_war(ch); - for (wch = player_first; wch != NULL; wch = wch->next_player) + if (!IS_SET_WAR(wch)) + continue; + + if (wartype_data(wch) == wartype_data(ch)) { - if (!IS_SET_WAR(wch)) - continue; - if (is_same_clan(ch, wch)) - { - wch->gold += reward; - wch->pcdata->questpoints += qreward; - chprintf(wch, - "You recieve %d gold and %d questpoints from the war tribunal!", - reward, qreward); - } + wch->gold += reward; + wch->pcdata->questpoints += qreward; + chprintf(wch, + "You recieve %d gold and %d questpoints from the war tribunal!", + reward, qreward); } - end_war(); - return; } - break; - case WAR_GENOCIDE: - if (war_info.inwar == 1) - { - announce(ch, INFO_WAR, "$n has won the War!"); - chprintln(ch, "You have won the War!"); - note_war(ch); - ch->gold += reward; - ch->pcdata->questpoints += qreward; - chprintf(ch, - "You recieve %d gold and %d questpoints from the war tribunal!", - reward, qreward); - end_war(); - return; - } - break; + end_war(); + return; } return; } @@ -918,16 +827,7 @@ if (!IS_IN_WAR(ch) || !IS_IN_WAR(wch)) return FALSE; - if (war_info.wartype == WAR_GENOCIDE) - return FALSE; - - if (war_info.wartype == WAR_RACE && ch->race == wch->race) - return TRUE; - - if (war_info.wartype == WAR_CLASS && ch->Class[0] == wch->Class[0]) - return TRUE; - - if (war_info.wartype == WAR_CLAN && is_same_clan(ch, wch)) + if (wartype_data(ch) == wartype_data(wch)) return TRUE; return FALSE; @@ -974,17 +874,7 @@ announce(ch, INFO_WAR, "$n has left. War over."); end_war(); } - if (abort_race_war()) - { - announce(ch, INFO_WAR, "$n has left. War over."); - end_war(); - } - else if (abort_class_war()) - { - announce(ch, INFO_WAR, "$n has left. War over."); - end_war(); - } - else if (abort_clan_war()) + if (abort_war()) { announce(ch, INFO_WAR, "$n has left. War over."); end_war(); diff -ur src/webserver.c new/webserver.c --- src/webserver.c Sun Apr 27 22:08:25 2003 +++ new/webserver.c Thu May 8 14:57:42 2003 @@ -198,6 +198,8 @@ return FALSE; } +#if !defined(NO_WEB) + /* Thanks to John Ludeman for this code... * Define translation matrix for Base64 decode. * it's fast and const should make it shared text page. @@ -2540,3 +2542,5 @@ free_mem(current); } } + +#endif diff -ur src/webserver.h new/webserver.h --- src/webserver.h Sun Apr 27 22:08:25 2003 +++ new/webserver.h Thu May 8 14:57:42 2003 @@ -32,6 +32,8 @@ #include "../win32/winstuff.h" #endif +#if !defined(NO_WEB) + #define DOCTYPE "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n" /* @@ -86,3 +88,5 @@ bool init_web_server(void); void update_web_server(void); void shutdown_web_server(void); + +#endif