# Patch name: Vadiv FRP # Patch version: 1.2 # Author's name: David Cheatham (Vadiv@M*U*S*H) # Author's email: david@mush.cx # Version of PennMUSH: 1.7.5p9 # Date patch made: Sun Aug 25 09:41:09 EDT 2002 # Author is willing to support (yes/no): yes # Patch format: Context # # # This is a contributed PennMUSH patch. Its use is subject to the # same restrictions found in PennMUSH's hdrs/copyrite.h file. # # No warranty is given for this patch. It is not necessarily going # to work on your system, with any version of PennMUSH other than # the one above, etc. # # If the author given above was willing to support the patch, you # should write to the author if you have any questions or problems. Do # *NOT* send email messages to Javelin or any PennMUSH mailing list about # this patch! # # Below this line is the author's description of the patch, # followed by the patch itself. If the patch is in context diff # format, you'll probably apply it by typing: patch < patchfile # in your top-level MUSH directory, unless instructed otherwise # below. # # Vadiv's FRP (Frequently Requested Patches) # # These are simply the features I see people ask for day in and day out. # Some of them are on other servers, and some aren't, and they're all # pretty unlikely to end up in offical PennMUSH. Here's what they consist # of at the moment. If you do not like a certain feature, you're free to # comment that define out in options.h and everything will work fine, # exactly the way it was before. # # If you use this patch, I would love for you to contact me in some way. # If I hear of people using this patch, I will keep it up to date. If I # don't hear of anyone using it, I probably won't bother. # # And if you find anything weird going on, don't hesitate to email me. # # LOG_SHOW : # The @logshow command. Turn this on to enable wizards to watch logs in # real time within the game with @logshow/logtype/on. Look at @log for a # list of logtypes, and use /all to see them all. # # Usage: # @logshow/conn/on # @logshow # # EVIL_QUEUE_FUNCTIONS : # Enables trigger(), wait(), and force(). These functions are evil. # Have fun with them, don't blow anything up. # # Usage: # th trigger(me,startup) # +insecure_wizard_finger \[force(me,@shutdown/panic)] # # ANSI_SUBS : # Enables MUX and MUSH ansi color subs, aka, %z*. # # Usage: # :%zrw%znaves. # # MAKE_ALL_COMMANDS : # Makes things that aren't normally real commands be commands, like # WHO, DOING, home, etc. This has the side effect of making WHO work in # lowercase. You can also restrict them like normal command. (And, in fact, # SESSION is type restricted to WIZARD.) # # COLORED_NAMES : # Lets you color your name. Pretty easy to understand. # Use @CNAME to set. Note the ansified name has to match your real name # *exactly*, just with ansi (and, oddly enough, HTML). Even different # cases won't work. If you want to have your name in a different case, # just name yourself that way in the first place and stop whining. Note # you can @CNAME anything, not just players. # # Usage: # @cname *One=[ansi(g,O)][ansi(r,n)][ansi(g,e)] # @cname Sheep=[ansi(hw,Sheep)] # # EVALUATE_COMTITLES : # Evaluate comtitles. Lets you type @chan/title channel=/ # and that attribute will be evaluated to get your comtitle. (Note if # you want a traditional comtitle that starts with a #, you can use # something like '@chan/title channel=ansi(h,)# is a pound sign.' # But you only need that if the first character is a #.) The channel # name will be passed as %0, the string you typed will be passed as # %1, and the channel header will be passed as %2. (This is normally # , but can be changed with the #define below.) You may need # some logic to figure out if it's a pose or a say. # # Usage: # &CHAN_PUBLIC me=if(rand(2),Tall, Short) # @chan/title public=/CHAN_PUBLIC # # CHANNEL_HEADERS : # Channel headers. This lets you title channels with funky ansi, or # replace <> with [], or whatever. Unlike COLORED_NAMES, the names # don't have to match the actual name of the channel at all. Obviously # this can cause some confusion, but might be useful for a comsystem or # something. You normally should probably restrict yourself to having # the players able to figure out the name, though. # To keep from making a chat database change, you're going to have to # set these on every startup with @chan/header, or code an object to do so. # # Usage: # @chan/header Public=ansi(g,-<)ansi(h,Public)[ansi(g,>-)] # # DAILY_ATTR : # This enables @DAILY and @HOURLY attributes. You can set # events_daily_hour in mush.cnf to when you want @DAILY to run, or # leave it at the default of 7 in the morning. # # Usage: # @DAILY #1=@trig me/IDLE_DESTROY_PLAYERS # @HOURLY #1=@trig me/CALCULATE_USAGE # # SAY_HACKS : # This give you two different things, you can type # @SAYSTRING me=sez, # and you will, when you type 'say Hi.', give the message: # One sez, "Hi." # # But wait, there's more. @SPEECHFORMAT. # If you don't know how that works, look at TM3's help. # Works exactly like TinyMUSH's, with the minor exception that if you're # talking on a channel, %2 will be the channel name. # # You might want to add: # attribute_alias speechformat speechmod # to alias.cnf so people can use @SPEECHMOD instead. # # Usage: # @SAYSTRING me=yelling, # @SPEECHFORMAT me=ucstr(%0) *** /home/pennmush/pennmush//src/bsd.c Sat Jul 20 13:10:14 2002 --- src/bsd.c Fri Aug 9 14:06:13 2002 *************** *** 227,232 **** --- 227,235 ---- int conn_flags; unsigned long input_chars; unsigned long output_chars; + #ifdef LOG_SHOW + int logs; + #endif }; *************** *** 2611,2616 **** --- 2614,2622 ---- d->conn_flags = CONN_DEFAULT; d->input_chars = 0; d->output_chars = 0; + #ifdef LOG_SHOW + d->logs = 0; + #endif #ifdef NT_TCP /* protect adding the descriptor from the linked list from */ *************** *** 3626,3631 **** --- 3632,3640 ---- depth = 0; (d->cmds)++; + #ifdef MAKE_ALL_COMMANDS + if (!d->connected) { + #endif if (!strcmp(command, QUIT_COMMAND)) { return 0; } else if (!strcmp(command, LOGOUT_COMMAND)) { *************** *** 3660,3667 **** if (!d->connected) welcome_user(d); } } else { - if (d->connected) { send_prefix(d); cplr = d->player; strcpy(ccom, command); --- 3669,3681 ---- if (!d->connected) welcome_user(d); } + } else if (!d->connected) { + if (!check_connect(d, command)) + return 0; + #ifdef MAKE_ALL_COMMANDS + } + #endif } else { send_prefix(d); cplr = d->player; strcpy(ccom, command); *************** *** 3674,3683 **** process_command(d->player, command, d->player, 1); send_suffix(d); - } else { - if (!check_connect(d, command)) - return 0; - } } return 1; } --- 3688,3693 ---- *************** *** 5507,5513 **** #ifdef USE_MAILER d->mailp = NULL; #endif ! if (descriptor_list) descriptor_list->prev = d; d->next = descriptor_list; --- 5517,5525 ---- #ifdef USE_MAILER d->mailp = NULL; #endif ! #ifdef LOG_SHOW ! d->logs = 0; ! #endif if (descriptor_list) descriptor_list->prev = d; d->next = descriptor_list; *************** *** 5823,5825 **** --- 5835,5929 ---- } #endif + + #ifdef LOG_SHOW + void display_log(int, char *); + void do_logshow_set(dbref, int, int); + void notify_logs(dbref); + + void display_log(int logtype, char *msg) { + DESC *d; + int mask=pow(2, logtype); + int n=0; + n = strlen(msg); + + DESC_ITER_CONN(d) + if (d->logs & mask) + queue_newwrite(d, msg, n); + + } + + void do_logshow_set(dbref player, int logtype, int on) { + DESC *d; + int mask = 0xFF; + + if (logtype != -1) + mask = pow(2, logtype); + + if (on) { + DESC_ITER_CONN(d) + if (d->player == player) + d->logs |= mask; + } else { + mask = ~mask; + DESC_ITER_CONN(d) + if (d->player == player) + d->logs &= mask; + } + } + + void notify_logs(dbref player) { + DESC *d; + int mask = 0; + char log_list[35]; + + DESC_ITER_CONN(d) + if (d->player == player) + mask = d->logs; + + if (!mask) { + notify(player, "You aren't listening to any logs."); + return; + } + *log_list = '\0'; + + if (!((mask & 0xDF) ^ 0xDF)) + strcat(log_list, " ALL"); + else { + if (mask & 0x01) + strcat(log_list, " ERR"); + if (mask & 0x02) + strcat(log_list, " CMD"); + if (mask & 0x04) + strcat(log_list, " WIZ"); + if (mask & 0x08) + strcat(log_list, " CONN"); + if (mask & 0x10) + strcat(log_list, " TRACE"); + if (mask & 0x40) + strcat(log_list, " CHECK"); + if (mask & 0x80) + strcat(log_list, " HUH"); + } + notify_format(player, "You are listening to%s.", log_list); + } + #endif /* LOG_SHOW */ + + #ifdef MAKE_ALL_COMMANDS + void do_who(dbref, char *, char *); + + void + do_who(dbref player, char *called_as, char *match) { + DESC *d; + int doing = 0; + if (string_prefix("session", called_as)) + doing = 2; + else if (string_prefix("doing", called_as)) + doing = 1; + + DESC_ITER_CONN(d) + if (d->player == player) + dump_users(d, match, doing); + + } + #endif *** /home/pennmush/pennmush//src/cmds.c Sat Jul 20 13:10:14 2002 --- src/cmds.c Sun Aug 18 20:00:45 2002 *************** *** 120,125 **** --- 120,129 ---- do_chan_admin(player, arg_left, arg_right, 3); else if (SW_ISSET(sw, SWITCH_QUIET)) do_chan_admin(player, arg_left, arg_right, 4); + #ifdef CHANNEL_HEADERS + else if (SW_ISSET(sw, SWITCH_HEADER)) + do_chan_admin(player, arg_left, arg_right, -1); + #endif else if (SW_ISSET(sw, SWITCH_NOISY)) do_chan_admin(player, arg_left, "n", 4); else if (SW_ISSET(sw, SWITCH_DECOMPILE)) *************** *** 1075,1077 **** --- 1079,1153 ---- COMMAND (cmd_null) { return; } + + #ifdef MAKE_ALL_COMMANDS + COMMAND (cmd_home) { + do_move(player, "home", 0); + } + + COMMAND (cmd_who) { + do_who(player, cmd->name, arg_left); + } + #endif + + #ifdef COLORED_NAMES + COMMAND(cmd_colname) { + dbref victim; + char *tp; + char tbuf[BUFFER_LEN]; + + victim = noisy_match_result(player, arg_left, NOTYPE, MAT_EVERYTHING | MAT_ME | MAT_HERE); + + if (victim == NOTHING) + return; + if(!controls(player, victim)) { + notify(player, "Permission denied."); + return; + } + + if (!arg_right || !*arg_right) { + atr_clr(victim, "COLNAME", GOD); + notify(player, "Color name cleared."); + return; + } + strcpy(tbuf, Name(victim)); + if (IsExit(victim) && ((tp = strchr(tbuf, ';')))) + *tp = '\0'; + if (strncmp(tbuf, remove_markup(arg_right, NULL), strlen(tbuf) + 1)) + notify_format(player, "%s does not match %s", arg_right, tbuf); + else { + atr_add(victim, "COLNAME", arg_right, GOD, AF_NOPROG | AF_MDARK | + AF_WIZARD | AF_PRIVATE); + notify(player, "Color name set."); + } + } + #endif + + #ifdef LOG_SHOW + COMMAND (cmd_logshow) { + int logtype = 0; + + if (SW_ISSET(sw, SWITCH_CHECK)) + logtype = LT_CHECK; + else if (SW_ISSET(sw, SWITCH_CMD)) + logtype = LT_CMD; + else if (SW_ISSET(sw, SWITCH_CONN)) + logtype = LT_CONN; + else if (SW_ISSET(sw, SWITCH_ERR)) + logtype = LT_ERR; + else if (SW_ISSET(sw, SWITCH_TRACE)) + logtype = LT_TRACE; + else if (SW_ISSET(sw, SWITCH_WIZ)) + logtype = LT_WIZ; + else + logtype = -1; + + if (SW_ISSET(sw, SWITCH_ON)) + do_logshow_set(player, logtype, 1); + else if (SW_ISSET(sw, SWITCH_OFF)) + do_logshow_set(player, logtype, 0); + + notify_logs(player, logtype); + } + #endif /* LOG_SHOW */ + *** /home/pennmush/pennmush//src/command.c Sat Jul 20 13:10:14 2002 --- src/command.c Sun Aug 18 20:01:53 2002 *************** *** 65,71 **** --- 65,75 ---- {"@CEMIT", "NOEVAL NOISY", cmd_cemit, CMD_T_ANY | CMD_T_EQSPLIT | CMD_T_NOGAGGED, 0, 0, 0}, {"@CHANNEL", + #ifdef CHANNEL_HEADERS + "LIST ADD DELETE RENAME NAME PRIVS QUIET NOISY DECOMPILE DESCRIBE CHOWN WIPE MUTE UNMUTE GAG UNGAG HIDE UNHIDE WHAT TITLE BRIEF HEADER", + #else "LIST ADD DELETE RENAME NAME PRIVS QUIET NOISY DECOMPILE DESCRIBE CHOWN WIPE MUTE UNMUTE GAG UNGAG HIDE UNHIDE WHAT TITLE BRIEF", + #endif cmd_channel, CMD_T_ANY | CMD_T_SWITCHES | CMD_T_EQSPLIT | CMD_T_NOGAGGED, 0, 0, 0}, {"@CHAT", NULL, cmd_chat, CMD_T_ANY | CMD_T_EQSPLIT | CMD_T_NOGAGGED, 0, *************** *** 323,328 **** --- 327,346 ---- {"WITH", "NOEVAL", cmd_with, CMD_T_PLAYER | CMD_T_THING | CMD_T_EQSPLIT, 0, 0, 0}, + #ifdef MAKE_ALL_COMMANDS + {"WHO", NULL, cmd_who, CMD_T_ANY, 0, 0, 0}, + {"SESSION", NULL, cmd_who, CMD_T_ANY, WIZARD, 0, 0}, + {"DOING", NULL, cmd_who, CMD_T_ANY, 0, 0, 0}, + {"HOME", NULL, cmd_home, CMD_T_PLAYER | CMD_T_THING | CMD_T_NOFIXED, 0, 0, 0}, + #endif + #ifdef COLORED_NAMES + {"@CNAME", NULL, cmd_colname, CMD_T_ANY | CMD_T_EQSPLIT, 0, 0, 0}, + #endif + #ifdef LOG_SHOW + {"@LOGSHOW", "CHECK CMD CONN ERR TRACE WIZ ON OFF ALL", cmd_logshow, + CMD_T_PLAYER, WIZARD, 0, 0}, + #endif + /* ATTRIB_SET is an undocumented command - it's sugar to make it possible * enable/disable attribute setting with &XX or @XX */ *** /home/pennmush/pennmush//src/conf.c Sat Jul 20 13:10:14 2002 --- src/conf.c Sun Aug 18 20:07:38 2002 *************** *** 447,453 **** sizeof options.log_wipe_passwd, 0, NULL} , ! {NULL, NULL, NULL, 0, 0, NULL} }; --- 447,456 ---- sizeof options.log_wipe_passwd, 0, NULL} , ! #ifdef DAILY_ATTR ! {"events_daily_hour", cf_int, &options.events_daily_hour, 23, 0, "dump"} ! , ! #endif {NULL, NULL, NULL, 0, 0, NULL} }; *************** *** 941,946 **** --- 944,952 ---- options.max_attrcount = 2048; options.float_precision = 6; options.player_name_len = 16; + #ifdef DAILY_ATTR + options.events_daily_hour = 7; + #endif } /* Limit how many files we can nest */ *************** *** 1062,1067 **** --- 1068,1077 ---- /* these directives aren't player-settable but need to be initialized */ mudtime = time(NULL); + #ifdef DAILY_ATTR + options.events_daily_counter = 0; + options.events_hourly_counter = 0; + #endif options.dump_counter = mudtime + options.dump_interval; options.purge_counter = mudtime + options.purge_interval; options.dbck_counter = mudtime + options.dbck_interval; *************** *** 1504,1507 **** --- 1514,1553 ---- notify(player, T(" convtime() is stricter.")); #endif + #ifdef LOG_SHOW + notify(player, T(" @logshow is enabled.")); + #endif + + #ifdef EVIL_QUEUE_FUNCTIONS + notify(player, T(" trigger(), wait(), and force() are enabled.")); + #endif + + #ifdef ANSI_SUBS + notify(player, T(" %z ansi subs are enabled.")); + #endif + + #ifdef MAKE_ALL_COMMANDS + notify(player, T(" WHO, home, etc, are real commands.")); + #endif + + #ifdef COLORED_NAMES + notify(player, T(" @cname is enabled.")); + #endif + + #ifdef EVALUATE_COMTITLES + notify(player, T(" / comtitles evaluate.")); + #endif + + #ifdef CHANNEL_HEADERS + notify(player, T(" Channel headers are enabled.")); + #endif + + #ifdef DAILY_ATTR + notify(player, T(" @DAILY and @HOURLY are enabled.")); + #endif + + #ifdef SAY_HACKS + notify(player, T(" @SPEECHFORMAT and @SAYSTRING are enabled.")); + #endif + } *** /home/pennmush/pennmush//src/cque.c Sat Jul 20 13:10:14 2002 --- src/cque.c Fri Aug 9 17:21:24 2002 *************** *** 1139,1141 **** --- 1139,1153 ---- do_raw_restart(victim); } } + + #ifdef DAILY_ATTR + void queue_attribute_all(char const *aname) + { + dbref thing; + strcpy(ccom, aname); + flag_broadcast(0, 0, T("GAME: Running %s"), aname); + for (thing = 0; thing < db_top; thing++) + if (!IsGarbage(thing) && !(Halted(thing))) + queue_attribute_noparent(thing, aname, thing); + } + #endif *** /home/pennmush/pennmush//src/extchat.c Sat Jul 20 13:10:15 2002 --- src/extchat.c Wed Aug 21 13:27:11 2002 *************** *** 33,38 **** --- 33,44 ---- #ifdef CHAT_SYSTEM + #include "attrib.h" + #ifdef SAY_HACKS + void say_hacks(dbref player, char const *command, int checksys); + extern char *saystring, *speechmod; + #endif + #ifdef I_SETJMP extern jmp_buf db_err; #define OUTPUT(fun) do { if ((fun) < 0) longjmp(db_err, 1); } while (0) *************** *** 197,202 **** --- 203,211 ---- if (!ch) return NULL; ch->name[0] = '\0'; + #ifdef CHANNEL_HEADERS + ch->header[0] = '\0'; + #endif ch->title[0] = '\0'; ChanType(ch) = CHANNEL_DEFAULT_FLAGS; ChanCreator(ch) = NOTHING; *************** *** 1107,1112 **** --- 1116,1129 ---- const char *gap; char *title; int canhear; + #ifdef EVALUATE_COMTITLES + char tbuf[BUFFER_LEN]; + char *tp; + char const *ap; + ATTR *a = NULL; + dbref thing = -1; + #endif + char header[CHAN_NAME_LEN + 2]; if (!Chan_Ok_Type(chan, player)) { notify_format(player, *************** *** 1140,1149 **** notify(player, T("What do you want to say to that channel?")); return; } ! ! if (u &&CUtitle(u) && *CUtitle(u)) ! title = CUtitle(u); else title = NULL; /* figure out what kind of message we have */ --- 1157,1200 ---- notify(player, T("What do you want to say to that channel?")); return; } ! #ifdef CHANNEL_HEADERS ! if (*ChanHead(chan)) ! strcpy(header, ChanHead(chan)); else + #endif + sprintf(header, "%s%s%s", "<", ChanName(chan), ">"); + + if (u &&CUtitle(u) && *CUtitle(u)) { + title = CUtitle(u); + #ifdef EVALUATE_COMTITLES + if (*CUtitle(u) == '#') { + title = NULL; + strcpy(tbuf, CUtitle(u)); + if ((tp = strchr(tbuf, '/'))) { + *tp++ = '\0'; + thing = match_result(player, tbuf, NOTYPE, MAT_ABSOLUTE); + if (GoodObject(thing) && CanEval(player, thing)) + a = (ATTR *) atr_get(thing, upcasestr(tp)); + if (a && Can_Read_Attr(player, thing, a)) { + ap = safe_uncompress(a->value); + wenv[0] = chan->name; + wenv[1] = (char *) arg1; + wenv[2] = header; + *tbuf = '\0'; + tp = tbuf; + process_expression(tbuf, &tp, &ap, player, player, player, + PE_DEFAULT, PT_DEFAULT, NULL); + if (*tbuf) { + *tp = '\0'; + title = tbuf; + tbuf[CU_TITLE_LEN] = '\0'; + } + } + + } + } + #endif + } else title = NULL; /* figure out what kind of message we have */ *************** *** 1153,1177 **** gap = ""; /* FALLTHRU */ case POSE_TOKEN: ! arg1 = arg1 + 1; ! channel_broadcast(chan, player, 0, "<%s> %s%s%s%s%s%s", ChanName(chan), ! title ? title : "", title ? ANSI_NORMAL : "", ! title ? " " : "", accented_name(player), gap, arg1); if (!canhear) notify_format(player, T("To channel %s: %s%s%s"), ChanName(chan), ! accented_name(player), gap, arg1); break; default: if (CHAT_STRIP_QUOTE && (*arg1 == SAY_TOKEN)) arg1 = arg1 + 1; ! channel_broadcast(chan, player, 0, T("<%s> %s%s%s%s says, \"%s\""), ! ChanName(chan), title ? title : "", ! title ? ANSI_NORMAL : "", title ? " " : "", ! accented_name(player), arg1); if (!canhear) notify_format(player, ! T("To channel %s: %s says, \"%s\""), ChanName(chan), ! accented_name(player), arg1); break; } --- 1204,1236 ---- gap = ""; /* FALLTHRU */ case POSE_TOKEN: ! speechmod = (char *) arg1 + 1; ! #ifdef SAY_HACKS ! wenv[2] = ChanName(chan); ! /* This is silly. */ ! say_hacks(player, *gap ? "channel/pose" : "channel/pose/nospace", 0); ! #endif ! channel_broadcast(chan, player, 0, "%s %s%s%s%s%s%s", header, ! title ? title : " ", title ? ANSI_NORMAL : " ", ! title ? " " : " ", accented_name(player), gap, ! speechmod); if (!canhear) notify_format(player, T("To channel %s: %s%s%s"), ChanName(chan), ! accented_name(player), gap, speechmod); break; default: if (CHAT_STRIP_QUOTE && (*arg1 == SAY_TOKEN)) arg1 = arg1 + 1; ! #ifdef SAY_HACKS ! speechmod = (char *) arg1; ! say_hacks(player, "channel" , 1); ! #endif ! channel_broadcast(chan, player, 0, T("%s %s%s%s%s %s \"%s\""), ! header, title ? title : "", title ? ANSI_NORMAL : "", title ? " " : "", accented_name(player), saystring, speechmod); if (!canhear) notify_format(player, ! T("To channel %s: %s %s \"%s\""), ChanName(chan), ! accented_name(player), saystring, speechmod); break; } *************** *** 1239,1247 **** notify(player, T("What do you want to emit?")); return; } ! if (noisy) ! channel_broadcast(chan, player, 2, "<%s> %s", ChanName(chan), msg); ! else channel_broadcast(chan, player, 2, "%s", msg); if (!canhear) notify_format(player, T("Cemit to channel %s: %s"), ChanName(chan), msg); --- 1298,1316 ---- notify(player, T("What do you want to emit?")); return; } ! #ifdef SAY_HACKS ! speechmod = (char *) msg; ! say_hacks(player, "channel/cemit", 0); ! msg = speechmod; ! #endif ! if (noisy) { ! #ifdef CHANNEL_HEADERS ! if (*ChanHead(chan)) ! channel_broadcast(chan, player, 2, "%s %s", ChanHead(chan), msg); ! else ! #endif ! channel_broadcast(chan, player, 2, "<%s> %s", ChanName(chan), msg); ! } else channel_broadcast(chan, player, 2, "%s", msg); if (!canhear) notify_format(player, T("Cemit to channel %s: %s"), ChanName(chan), msg); *************** *** 1429,1434 **** --- 1498,1533 ---- notify_format(player, T("Quiet status on channel <%s> changed."), ChanName(chan)); break; + case -1: + if (!Chan_Can_Modify(chan, player)) { + notify(player, T("Permission denied.")); + return; + } + + if (strlen(perms) > CHAN_NAME_LEN - 1) { + notify(player, T("That header is too long.")); + return; + } + + if (*perms) { + if (*ChanHead(chan)) + channel_broadcast(chan, player, 1, + "%s %s has changed the header to %s%s.", + ChanHead(chan), Name(player), ANSI_NORMAL, perms); + else + channel_broadcast(chan, player, 1, + "<%s> %s has set the header to %s%s.", + ChanName(chan), Name(player), ANSI_NORMAL, perms); + strcpy(ChanHead(chan), perms); + notify(player, T("Channel header changed.")); + } else if (*ChanHead(chan)) { + channel_broadcast(chan, player, 1, + "%s %s has reset the header to <%s>.", + ChanHead(chan), Name(player), ChanName(chan)); + *ChanHead(chan) = '\0'; + notify(player, T("Channel header cleared.")); + } + break; } } *************** *** 2084,2089 **** --- 2183,2193 ---- if (ChanTitle(c)) notify_format(player, "@channel/desc %s = %s", ChanName(c), ChanTitle(c)); + #ifdef CHANNEL_HEADERS + if (*ChanHead(c)) + notify_format(player, "@channel/header %s = %s", ChanName(c), + ChanHead(c)); + #endif if (!brief) { for (u = ChanUsers(c); u; u = u->next) { *** /home/pennmush/pennmush//src/function.c Sat Jul 20 13:10:15 2002 --- src/function.c Fri Aug 2 00:21:49 2002 *************** *** 500,505 **** --- 500,511 ---- {"TAG", fun_tag, 1, INT_MAX, FN_REG}, {"ENDTAG", fun_endtag, 1, 1, FN_REG}, {"TAGWRAP", fun_tagwrap, 2, 3, FN_REG}, + #ifdef EVIL_QUEUE_FUNCTIONS + {"TRIGGER", fun_trigger, 1, 11, FN_REG}, + {"WAIT", fun_wait, 2, 2, FN_REG}, + {"WAITUNTIL", fun_wait, 2, 2, FN_REG}, + {"FORCE", fun_force, 2, 2, FN_REG}, + #endif {NULL, NULL, 0, 0, 0} }; *** /home/pennmush/pennmush//src/funufun.c Sat Jul 20 13:10:15 2002 --- src/funufun.c Fri Aug 2 00:18:50 2002 *************** *** 277,279 **** --- 277,304 ---- safe_str(T("#-1 NO SUCH USER FUNCTION"), buff, bp); return; } + + #ifdef EVIL_QUEUE_FUNCTIONS + #include "game.h" + #include "command.h" + FUNCTION(fun_wait) { + if(!command_check_byname(executor, "@wait")) + safe_str(T("#-1 PERMISSION DENIED"), buff, bp); + else + do_wait(executor, executor, args[0], args[1], strlen(called_as) > 5); + } + + FUNCTION(fun_force) { + if(!command_check_byname(executor, "@force")) + safe_str(T("#-1 PERMISION DENIED"), buff, bp); + else + do_force(executor, args[0], args[1]); + } + + FUNCTION(fun_trigger) { + if(!command_check_byname(executor, "@trigger")) + safe_str(T("#-1 PERMISSION DENIED"), buff, bp); + else + do_trigger(executor, args[0], args); + } + #endif *** /home/pennmush/pennmush//src/game.c Sat Jul 20 13:10:15 2002 --- src/game.c Fri Aug 9 17:20:28 2002 *************** *** 983,988 **** --- 983,989 ---- if ((!command || !*command) && !from_port) return; + #ifndef MAKE_ALL_COMMANDS /* important home checking comes first! */ if (strcmp(command, "home") == 0) { if (!Mobile(player)) *************** *** 993,998 **** --- 994,1000 ---- do_move(player, command, 0); return; } + #endif strcpy(unp, command); cptr = command_parse(player, cause, command, from_port); *************** *** 1573,1578 **** --- 1575,1590 ---- (options.warn_counter - mudtime) / 60, (options.warn_counter - mudtime) % 60); #endif + #ifdef DAILY_ATTR + if (options.events_hourly_counter) { + notify_format(player, + T(" Time until next @HOURLY: %ld minutes %ld seconds."), + (options.events_hourly_counter - mudtime) / 60, + (options.events_hourly_counter - mudtime) % 60); + if (options.events_daily_counter <= options.events_hourly_counter) + notify(player, T("Next @HOURLY will run @DAILY also.")); + } + #endif /* Mortals, go no further! */ if (!Wizard(player) || mortal) *** /home/pennmush/pennmush//src/log.c Sat Jul 20 13:10:16 2002 --- src/log.c Sat Aug 3 16:02:32 2002 *************** *** 181,186 **** --- 181,193 ---- } fprintf(f, "%s %s\n", timebuf, tbuf1); fflush(f); + #ifdef LOG_SHOW + /* If you want a time stamp, use the next line instead it. */ + /* + display_log(logtype, tprintf("%s GAME %s\r\n", timebuf, tbuf1)); + */ + display_log(logtype, tprintf("GAME %s\r\n", tbuf1)); + #endif } void WIN32_CDECL *** /home/pennmush/pennmush//src/move.c Sat Jul 20 13:10:16 2002 --- src/move.c Sat Aug 3 01:04:28 2002 *************** *** 289,295 **** dbref player; const char *direction; { ! if (!strcasecmp(direction, "home") && !Fixed(player)) return 1; /* otherwise match on exits */ --- 289,301 ---- dbref player; const char *direction; { ! ! if (!strcasecmp(direction, "home") ! #ifdef MAKE_ALL_COMMANDS ! ) ! #else ! && !Fixed(player)) ! #endif return 1; /* otherwise match on exits */ *************** *** 355,360 **** --- 361,372 ---- notify(player, T("Bad destination.")); return; } + #ifdef MAKE_ALL_COMMANDS + if (!command_check_byname(player, "home")) + #else + if (Fixed(player)) + #endif + return; if ((loc = Location(player)) != NOTHING && !Dark(player) && !Dark(loc)) { /* tell everybody else */ notify_except(Contents(loc), player, *************** *** 749,758 **** if (!Mobile(player)) return; - if (!strcasecmp(command, "home") && Fixed(player)) { - notify(player, T("You can't do that IC!")); - return; - } if (DO_GLOBALS) { if (can_move(player, command)) do_move(player, command, 0); --- 761,766 ---- *** /home/pennmush/pennmush//src/parse.c Sat Jul 20 13:10:16 2002 --- src/parse.c Fri Aug 2 17:27:09 2002 *************** *** 622,627 **** --- 622,704 ---- if (attrib) safe_str(uncompress(attrib->value), buff, bp); break; + #ifdef ANSI_SUBS + /* From Michael R. Rudel (mrr@dodds.net) */ + case 'z': + case 'Z': + nextc = **str; + (*str)++; + if (!nextc) + goto exit_sequence; + else { + switch (nextc) { + case 'h': /* hilite */ + safe_str (ANSI_HILITE, buff, bp); + break; + case 'i': /* inverse */ + safe_str (ANSI_INVERSE, buff, bp); + break; + case 'f': /* flash */ + safe_str (ANSI_BLINK, buff, bp); + break; + case 'u': /* underscore */ + safe_str (ANSI_UNDERSCORE, buff, bp); + break; + case 'n': /* normal */ + safe_str (ANSI_NORMAL, buff, bp); + break; + case 'x': /* black fg */ + safe_str (ANSI_BLACK, buff, bp); + break; + case 'r': /* red fg */ + safe_str (ANSI_RED, buff, bp); + break; + case 'g': /* green fg */ + safe_str (ANSI_GREEN, buff, bp); + break; + case 'y': /* yellow fg */ + safe_str (ANSI_YELLOW, buff, bp); + break; + case 'b': /* blue fg */ + safe_str (ANSI_BLUE, buff, bp); + break; + case 'm': /* magenta fg */ + safe_str (ANSI_MAGENTA, buff, bp); + break; + case 'c': /* cyan fg */ + safe_str (ANSI_CYAN, buff, bp); + break; + case 'w': /* white fg */ + safe_str (ANSI_WHITE, buff, bp); + break; + case 'X': /* black bg */ + safe_str (ANSI_BBLACK, buff, bp); + break; + case 'R': /* red bg */ + safe_str (ANSI_BRED, buff, bp); + break; + case 'G': /* green bg */ + safe_str (ANSI_BGREEN, buff, bp); + break; + case 'Y': /* yellow bg */ + safe_str (ANSI_BYELLOW, buff, bp); + break; + case 'B': /* blue bg */ + safe_str (ANSI_BBLUE, buff, bp); + break; + case 'M': /* magenta bg */ + safe_str (ANSI_BMAGENTA, buff, bp); + break; + case 'C': /* cyan bg */ + safe_str (ANSI_BCYAN, buff, bp); + break; + case 'W': /* white bg */ + safe_str (ANSI_BWHITE, buff, bp); + break; + } + break; + } + #endif /* ANSI_SUBS */ default: /* just copy */ safe_chr(savec, buff, bp); } *** /home/pennmush/pennmush//src/set.c Sat Jul 20 13:10:17 2002 --- src/set.c Sat Aug 3 17:39:18 2002 *************** *** 69,74 **** --- 69,82 ---- notify(player, T("Give it what new name?")); return; } + + #ifdef COLORED_NAMES + if (atr_get_noparent(thing, "COLNAME")) { + atr_clr(thing, "COLNAME", GOD); + notify(player, "Color name cleared."); + } + #endif + /* check for renaming a player */ if (IsPlayer(thing)) { if (Guest(player)) { *** /home/pennmush/pennmush//src/speech.c Sat Jul 20 13:10:17 2002 --- src/speech.c Wed Aug 21 13:33:50 2002 *************** *** 36,41 **** --- 36,50 ---- dbref na_zemit(dbref current, void *data); extern int WIN32_CDECL i_comp(const void *s1, const void *s2); static const char *spname(dbref thing); + #ifdef SAY_HACKS + void say_hacks(dbref player, char const *command, int checksay); + const char defaultsay[10]="says,"; + char *saystring, *speechmod; + #else + #ifdef SPEECHFORMAT_COMPAT + #undef SPEECHFORMAT_COMPAT + #endif + #endif static const char * spname(dbref thing) *************** *** 140,148 **** tbuf1++; /* notify everybody */ notify_format(player, T("You say, \"%s\""), tbuf1); notify_except(Contents(loc), player, ! tprintf(T("%s says, \"%s\""), spname(player), tbuf1)); } void --- 149,165 ---- tbuf1++; /* notify everybody */ + #ifdef SAY_HACKS + speechmod = (char *) tbuf1; + say_hacks(player, "SAY", 1); + tbuf1 = speechmod; + #else + saystring = (char *) defaultsay; + #endif notify_format(player, T("You say, \"%s\""), tbuf1); notify_except(Contents(loc), player, ! tprintf(T("%s %s \"%s\""), spname(player), ! saystring, tbuf1)); } void *************** *** 181,186 **** --- 198,209 ---- return; } + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) arg2; + say_hacks(player, "OEMIT", 0); + arg2 = speechmod; + #endif + if (!GoodObject(who)) oemit_notify_except(loc, NOTHING, loc, arg2); else *************** *** 261,266 **** --- 284,295 ---- } } + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) message; + say_hacks(player, "OEMIT", 0); + message = speechmod; + #endif + if (oneloc) { /* Only one room to oemit to. */ notify_anything(orator, na_exceptN, pass, ns_esnotify, 0, message); *************** *** 323,336 **** --- 352,380 ---- start = &head; /* Figure out what kind of message */ gap = " "; + + speechmod = (char *) arg2; switch (*arg2) { case SEMI_POSE_TOKEN: gap = ""; + key = 1; + speechmod++; + #ifdef SAY_HACKS + say_hacks(player, "WHISPER/POSE/NOSPACE", 0); + #endif + break; case POSE_TOKEN: key = 1; + speechmod++; + #ifdef SAY_HACKS + say_hacks(player, "WHISPER/POSE", 0); + #endif break; default: key = 2; + #ifdef SAY_HACKS + say_hacks(player, "WHISPER", 0); + #endif break; } *************** *** 386,397 **** safe_str(" senses, \"", tbuf2, &bp2); safe_str(Name(player), tbuf2, &bp2); safe_str(gap, tbuf2, &bp2); ! safe_str(arg2 + 1, tbuf2, &bp2); safe_chr('"', tbuf2, &bp2); break; case 2: safe_str(T("You whisper, \""), tbuf2, &bp2); ! safe_str(arg2, tbuf2, &bp2); safe_str("\" to ", tbuf2, &bp2); safe_str(tbuf, tbuf2, &bp2); safe_chr('.', tbuf2, &bp2); --- 430,441 ---- safe_str(" senses, \"", tbuf2, &bp2); safe_str(Name(player), tbuf2, &bp2); safe_str(gap, tbuf2, &bp2); ! safe_str(speechmod, tbuf2, &bp2); safe_chr('"', tbuf2, &bp2); break; case 2: safe_str(T("You whisper, \""), tbuf2, &bp2); ! safe_str(speechmod, tbuf2, &bp2); safe_str("\" to ", tbuf2, &bp2); safe_str(tbuf, tbuf2, &bp2); safe_chr('.', tbuf2, &bp2); *************** *** 417,423 **** safe_str(T("You sense: "), tbuf2, &bp2); safe_str(Name(player), tbuf2, &bp2); safe_str(gap, tbuf2, &bp2); ! safe_str(arg2 + 1, tbuf2, &bp2); *bp2 = '\0'; notify(good[who], tbuf2); if (noisy && !overheard && GoodObject(Location(player)) && --- 461,467 ---- safe_str(T("You sense: "), tbuf2, &bp2); safe_str(Name(player), tbuf2, &bp2); safe_str(gap, tbuf2, &bp2); ! safe_str(speechmod, tbuf2, &bp2); *bp2 = '\0'; notify(good[who], tbuf2); if (noisy && !overheard && GoodObject(Location(player)) && *************** *** 441,447 **** safe_str(tbuf, tbuf2, &bp2); } safe_str(": ", tbuf2, &bp2); ! safe_str(arg2, tbuf2, &bp2); *bp2 = '\0'; notify(good[who], tbuf2); if (noisy && !overheard && GoodObject(Location(player)) && --- 485,491 ---- safe_str(tbuf, tbuf2, &bp2); } safe_str(": ", tbuf2, &bp2); ! safe_str(speechmod, tbuf2, &bp2); *bp2 = '\0'; notify(good[who], tbuf2); if (noisy && !overheard && GoodObject(Location(player)) && *************** *** 507,512 **** --- 551,562 ---- listbuff[BUFFER_LEN - 1] = '\0'; l = trim_space_sep(listbuff, ' '); + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) message; + say_hacks(player, "PEMIT/LIST", 0); + message = speechmod; + #endif + while ((p = split_token(&l, ' '))) { who = noisy_match_result(player, p, NOTYPE, MAT_ABSOLUTE); if (GoodObject(who) && okay_pemit(player, who)) { *************** *** 551,556 **** --- 601,613 ---- Name(who)); return; } + + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) arg2; + say_hacks(player, "PEMIT", 0); + arg2 = speechmod; + #endif + if (!silent) notify_format(player, T("You pemit \"%s\" to %s."), arg2, Name(who)); if (nospoof && Nospoof(who)) { *************** *** 580,585 **** --- 637,648 ---- return; } + #ifdef SAY_HACKS + speechmod = (char *) tbuf1; + say_hacks(player, "POSE", 0); + tbuf1 = speechmod; + #endif + /* notify everybody */ if (!space) notify_except(Contents(loc), NOTHING, *************** *** 616,627 **** key = 1; if (CHAT_STRIP_QUOTE) message = message + 1; break; case SEMI_POSE_TOKEN: gap = ""; case POSE_TOKEN: key = 2; ! message = message + 1; break; } --- 679,704 ---- key = 1; if (CHAT_STRIP_QUOTE) message = message + 1; + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) message; + say_hacks(player, "@WALL", 1); + message = speechmod; + #else + if (privs != 2) + saystring = "shouts,"; + else + saystring = defaultsay; + #endif break; case SEMI_POSE_TOKEN: gap = ""; case POSE_TOKEN: key = 2; ! #ifdef SPEECHFORMAT_COMPAT ! speechmod = (char *) message + 1; ! say_hacks(player, *gap ? "@WALL/POSE" : "@WALL/POSE/NOSPACE", 0); ! message = speechmod; ! #endif break; } *************** *** 664,673 **** safe_chr(' ', tbuf, &bp); safe_str(Name(player), tbuf, &bp); safe_chr(' ', tbuf, &bp); ! if (privs != 2) ! safe_str(T("says,"), tbuf, &bp); ! else ! safe_str(T("shouts,"), tbuf, &bp); safe_str(" \"", tbuf, &bp); safe_str(message, tbuf, &bp); safe_chr('"', tbuf, &bp); --- 741,747 ---- safe_chr(' ', tbuf, &bp); safe_str(Name(player), tbuf, &bp); safe_chr(' ', tbuf, &bp); ! safe_str(saystring, tbuf, &bp); safe_str(" \"", tbuf, &bp); safe_str(message, tbuf, &bp); safe_chr('"', tbuf, &bp); *************** *** 796,804 **** --- 870,888 ---- gap = ""; case POSE_TOKEN: key = 1; + #ifdef SAY_HACKS + speechmod = (char *) message + 1; + say_hacks(player, *gap ? "PAGE/POSE" : "PAGE/POSE/NOSPACE", 0); + message = speechmod; + #endif break; default: key = 3; + #ifdef SAY_HACKS + speechmod = (char *) message; + say_hacks(player, "PAGE", 0); + message = speechmod; + #endif break; } *************** *** 923,929 **** safe_str(": ", tbuf, &tp); safe_str(Name(player), tbuf, &tp); safe_str(gap, tbuf, &tp); ! safe_str(message + 1, tbuf, &tp); break; case 3: safe_str(T("You paged "), tbuf, &tp); --- 1007,1013 ---- safe_str(": ", tbuf, &tp); safe_str(Name(player), tbuf, &tp); safe_str(gap, tbuf, &tp); ! safe_str(message, tbuf, &tp); break; case 3: safe_str(T("You paged "), tbuf, &tp); *************** *** 964,970 **** } } safe_str(gap, tbuf, &tp); ! safe_str(message + 1, tbuf, &tp); break; case 3: safe_str(Name(player), tbuf, &tp); --- 1048,1054 ---- } } safe_str(gap, tbuf, &tp); ! safe_str(message, tbuf, &tp); break; case 3: safe_str(Name(player), tbuf, &tp); *************** *** 1248,1254 **** do_think(dbref player, const char *message) { /* privately tell yourself a message */ ! notify(player, message); } --- 1332,1342 ---- do_think(dbref player, const char *message) { /* privately tell yourself a message */ ! #ifdef SPEECHFORMAT_COMPAT ! speechmod = (char *) message; ! say_hacks(player, "THINK", 0); ! message = speechmod; ! #endif notify(player, message); } *************** *** 1267,1272 **** --- 1355,1366 ---- return; } + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) tbuf1; + say_hacks(player, "EMIT", 0); + tbuf1 = speechmod; + #endif + /* notify everybody */ notify_anything(player, na_loc, &loc, ns_esnotify, 0, tbuf1); *************** *** 1308,1317 **** --- 1402,1421 ---- if (flags & 0x2) { /* @remit/list */ char *current; + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) arg2; + say_hacks(player, "REMIT/LIST", 0); + arg2 = speechmod; + #endif arg1 = trim_space_sep(arg1, ' '); while ((current = split_token(&arg1, ' ')) != NULL) do_one_remit(player, current, arg2, flags & 0x1); } else { + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) arg2; + say_hacks(player, "REMIT", 0); + arg2 = speechmod; + #endif do_one_remit(player, arg1, arg2, flags & 0x1); } } *************** *** 1347,1352 **** --- 1451,1461 ---- } else { if (!silent) notify_format(player, T("You lemit: \"%s\""), tbuf1); + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) tbuf1; + say_hacks(player, "LEMIT", 0); + tbuf1 = speechmod; + #endif oemit_notify_except(room, player, room, tbuf1); } } *************** *** 1410,1414 **** --- 1519,1560 ---- pass[2] = zone; pass[3] = player; pass[4] = player; + #ifdef SPEECHFORMAT_COMPAT + speechmod = (char *) arg2; + say_hacks(player, "ZEMIT", 0); + arg2 = speechmod; + #endif notify_anything(player, na_zemit, pass, ns_esnotify, 0, arg2); } + + #ifdef SAY_HACKS + void + say_hacks(dbref player, char const *command, int checksay) { + ATTR *a; + char const *ap; + char tbuf[BUFFER_LEN]="\0"; + char *tp; + + if ((a = atr_get(player, "SPEECHFORMAT"))) { + ap = safe_uncompress(a->value); + wenv[0] = speechmod; + wenv[1] = (char *) command; + tp = tbuf; + process_expression(tbuf, &tp, &ap, player, player, player, + PE_DEFAULT, PT_DEFAULT, NULL); + *tp='\0'; + speechmod=tbuf; + wenv[0] = NULL; + wenv[1] = NULL; + wenv[2] = NULL; + } + + if (checksay) { + if ((a = atr_get(player, "SAYSTRING"))) + saystring = safe_uncompress(a->value); + else + saystring = (char *) defaultsay; + } + return; + } + #endif *** /home/pennmush/pennmush//src/timer.c Sat Jul 20 13:10:17 2002 --- src/timer.c Fri Aug 9 17:17:47 2002 *************** *** 125,130 **** --- 125,150 ---- dbck(); } + #ifdef DAILY_ATTR + if (options.events_hourly_counter <= mudtime) { + if (options.events_hourly_counter) + queue_attribute_all("HOURLY"); + options.events_hourly_counter = 3600 + mudtime; + + /* We only check this if we just ran @HOURLY. */ + if (options.events_daily_counter <= mudtime) { + struct tm *for_counting; + for_counting = localtime(&mudtime); + for_counting->tm_min = 0; + for_counting->tm_hour = options.events_daily_hour; + for_counting->tm_mday++; + if (options.events_daily_counter) + queue_attribute_all("DAILY"); + options.events_daily_counter = mktime(for_counting); + } + } + #endif + if (idle_counter <= mudtime) { /* Inactivity check */ idle_counter = 60 + mudtime; *** /home/pennmush/pennmush//src/unparse.c Sat Jul 20 13:10:17 2002 --- src/unparse.c Fri Aug 9 14:02:47 2002 *************** *** 257,262 **** --- 257,270 ---- ATTR *na; static char fbuf[BUFFER_LEN]; + #ifdef COLORED_NAMES + if ((na = atr_get_noparent(thing, "COLNAME"))) { + sprintf(fbuf, "%s%s%s", ANSI_NORMAL, uncompress(AL_STR(na)), + ANSI_NORMAL); + return fbuf; + } + #endif + na = atr_get(thing, "NAMEACCENT"); if (!na) return Name(thing); *** /home/pennmush/pennmush//hdrs/atr_tab.h Sat Jul 20 13:10:12 2002 --- hdrs/atr_tab.h Sun Aug 18 20:06:06 2002 *************** *** 227,232 **** --- 227,244 ---- NULL, 0, NULL}, {"ZENTER", AF_NOPROG | AF_PREFIXMATCH, NULL, 0, NULL}, {"ZLEAVE", AF_NOPROG | AF_PREFIXMATCH, NULL, 0, NULL}, + #ifdef DAILY_ATTR + {"DAILY", AF_NOPROG | AF_PREFIXMATCH, NULL, 0, NULL}, + {"HOURLY", AF_NOPROG | AF_PREFIXMATCH, NULL, 0, NULL}, + #endif + #ifdef COLORED_NAMES + {"COLNAME", AF_NOPROG | AF_INTERNAL | AF_PRIVATE, NULL, + 0, NULL}, + #endif + #ifdef SAY_HACKS + {"SAYSTRING", AF_NOPROG | AF_PREFIXMATCH, NULL, 0, NULL}, + {"SPEECHFORMAT", AF_NOPROG | AF_PREFIXMATCH, NULL, 0, NULL}, + #endif {NULL, 0, NULL, 0, NULL} }; *** /home/pennmush/pennmush//hdrs/conf.h Sat Jul 20 13:10:12 2002 --- hdrs/conf.h Sun Aug 18 18:03:47 2002 *************** *** 223,228 **** --- 223,233 ---- int float_precision; int newline_one_char; int player_name_len; + #ifdef DAILY_ATTR + int events_daily_hour; + int events_daily_counter; + int events_hourly_counter; + #endif }; extern OPTTAB options; *** /home/pennmush/pennmush//hdrs/extchat.h Sat Jul 20 13:10:12 2002 --- hdrs/extchat.h Sun Aug 18 18:03:47 2002 *************** *** 70,75 **** --- 70,78 ---- #define CHAN_TITLE_LEN 256 struct channel { char name[CHAN_NAME_LEN]; /* Channel name */ + #ifdef CHANNEL_HEADERS + char header[CHAN_NAME_LEN]; /* Channel header */ + #endif char title[CHAN_TITLE_LEN]; /* Channel description */ long int type; /* Channel flags */ long int cost; /* Anyone can make a channel, but this is the cost */ *************** *** 113,118 **** --- 116,124 ---- #define MAX_CHANNELS (options.max_channels) #define ChanName(c) ((c)->name) + #ifdef CHANNEL_HEADERS + #define ChanHead(c) ((c)->header) + #endif #define ChanType(c) ((c)->type) #define ChanTitle(c) ((c)->title) #define ChanCreator(c) ((c)->creator) *** /home/pennmush/pennmush//game/mushcnf.dst Thu Aug 1 18:00:53 2002 --- game/mushcnf.dst Mon Aug 19 16:19:07 2002 *************** *** 245,250 **** --- 245,260 ---- # timed MUSH-wide checks will be disabled. warn_interval 3600 + # What hour @DAILY is triggered at. Be aware it runs after the @HOURLY + # for that hour, and @HOURLY does not work off the start of the hour, + # but the time the mush started. If you start the mush at 1:59, and set + # this to 7, the mush will run @HOURLY at 6:59, see that it's not 7 yet, + # wait an hour, and run @HOURLY again, and after that, will see it's + # past 7, and time to run @DAILY. So, remember, it will run sometimes + # *in* the hour, (or possibly a minute later, depending on how long + # @HOURLY takes,) not at the start of the hour. + events_daily_hour 15 + # If compiled with FLOATING_POINTS support, this controls the # decimal precision of numbers. Default is 6 digits after the # decimal point. *** /home/pennmush/pennmush//options.h.dist Thu Aug 1 18:00:11 2002 --- options.h.dist Mon Aug 19 16:19:06 2002 *************** *** 204,209 **** --- 204,262 ---- */ #define ROYALTY_FLAG /* */ + /* + * Enables @logshow. + */ + #define LOG_SHOW /* */ + + /* + * Enables trigger(), wait(), and force(). + */ + #define EVIL_QUEUE_FUNCTIONS /* */ + + /* + * Enables MUX and MUSH ansi color subs, aka, %z*. + */ + #define ANSI_SUBS /* */ + + /* + * Makes things that aren't normally real commands be commands. + */ + #define MAKE_ALL_COMMANDS /* */ + + /* + * Enables colored names. + */ + #define COLORED_NAMES /* */ + + /* + * Enables evaluating comtitles. + */ + #define EVALUATE_COMTITLES /* */ + + /* + * Channel headers. + */ + #define CHANNEL_HEADERS /* */ + + /* + * Enables @DAILY and @HOURLY. + */ + #define DAILY_ATTR /* */ + + /* + * Enable @SAYSTRING and @SPEECHFORMAT + */ + #define SAY_HACKS /* */ + + /* + * This enables @SPEECHFORMAT for commands like think and @pemit, and + * @wall commands. It doesn't make any sense to do this, but that's + * the way that TM3 works. If you don't turn this on, speechformat works + * just for say, pose, the channels, and various other commands that users + * tend to type from home. + */ + #define SPEECHFORMAT_COMPAT /* */ /*------------------------------ DB ----------------------------------*/