This is patch04 to PennMUSH 1.7.7. After applying this patch, you will have version 1.7.7p4 To apply this patch, save it to a file in your top-level MUSH directory, and do the following: patch -p1 < 1.7.7-patch04 ./Configure -S make update make install If you use GNU patch 2.2, you probably want the above to be 'patch -b -p1', not just 'patch -p1'. Unix (or cygwin) users need not worry about failed hunks in src/switchinc.c, hdrs/switches.h, hdrs/cmds.h, or hdrs/funs.h. These files are automatically rebuilt on compile. Then @shutdown and restart your MUSH. - Alan/Javelin In this patch: Minor Changes: * When room_connects is on, @aconnect and @adisconnect also functions on things when players (dis)connect inside them. Suggested by Philip Mak. [SW] * Parser-enforced argument counts for user-defined @functions, as an option to @function. Config: * New mush.cnf option max_global_fns allows increasing the number of @functions allowed without editing source code. If you change this, you should reboot the MUSH or bad things can happen. Suggested by hilikiradi@Dardalani. Fixes: * mkcmds.sh doesn't always regenerate every file, only what's needed. Speeds up compiles. Suggested by Philip Mak. [SW] * Fixes from 1.7.6p4. Prereq: 1.7.7p3 *** 1_7_7.85/Patchlevel Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.5 600) --- 1_7_7.109(w)/Patchlevel Thu, 02 Jan 2003 23:53:28 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.6 600) *************** *** 1,2 **** Do not edit this file. It is maintained by the official PennMUSH patches. ! This is PennMUSH 1.7.7p3 --- 1,2 ---- Do not edit this file. It is maintained by the official PennMUSH patches. ! This is PennMUSH 1.7.7p4 *** 1_7_7.85/CHANGES Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/g/23_CHANGES 1.26 600) --- 1_7_7.109(w)/CHANGES Mon, 06 Jan 2003 15:37:46 -0600 dunemush (pennmush/g/23_CHANGES 1.30 600) *************** *** 18,23 **** --- 18,42 ---- ========================================================================== + Version 1.7.7 patchlevel 4 January 2, 2003 + + Minor Changes: + * When room_connects is on, @aconnect and @adisconnect also + functions on things when players (dis)connect inside them. + Suggested by Philip Mak. [SW] + * Parser-enforced argument counts for user-defined @functions, + as an option to @function. + Config: + * New mush.cnf option max_global_fns allows increasing the number + of @functions allowed without editing source code. If you change + this, you should reboot the MUSH or bad things can happen. + Suggested by hilikiradi@Dardalani. + Fixes: + * mkcmds.sh doesn't always regenerate every file, only what's + needed. Speeds up compiles. Suggested by Philip Mak. [SW] + * Fixes from 1.7.6p4. + + Version 1.7.7 patchlevel 3 December 25, 2002 Commands: *** 1_7_7.85/game/txt/hlp/pennvers.hlp Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.3.1.1.1.3.1.1.1.54.1.10.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.7.1.1.1.1.1.2.1.1.1.8 600) --- 1_7_7.109(w)/game/txt/hlp/pennvers.hlp Mon, 06 Jan 2003 15:38:31 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.3.1.1.1.3.1.1.1.54.1.10.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.7.1.1.1.1.1.2.1.1.1.4.1.2.1.1.1.1.1.1.1.2.1.3 600) *************** *** 1,5 **** & changes ! & 1.7.7p3 This is a list of changes in this patchlevel which are probably of interest to players. More information about new commands and functions can probably be gotten via 'help '. 'help credits' --- 1,5 ---- & changes ! & 1.7.7p4 This is a list of changes in this patchlevel which are probably of interest to players. More information about new commands and functions can probably be gotten via 'help '. 'help credits' *************** *** 11,16 **** --- 11,36 ---- A list of the patchlevels associated with each release can be read in 'help patchlevels'. + Version 1.7.7 patchlevel 4 January 2, 2003 + + Minor Changes: + * When room_connects is on, @aconnect and @adisconnect also + functions on things when players (dis)connect inside them. + Suggested by Philip Mak. [SW] + * Parser-enforced argument counts for user-defined @functions, + as an option to @function. + Config: + * New mush.cnf option max_global_fns allows increasing the number + of @functions allowed without editing source code. If you change + this, you should reboot the MUSH or bad things can happen. + Suggested by hilikiradi@Dardalani. + Fixes: + * mkcmds.sh doesn't always regenerate every file, only what's + needed. Speeds up compiles. Suggested by Philip Mak. [SW] + * Fixes from 1.7.6p4. + + + & 1.7.7p3 Version 1.7.7 patchlevel 3 December 25, 2002 Commands: *************** *** 1296,1301 **** --- 1316,1346 ---- * Indentation fixes [SW] * Fixes up to 1.7.4p12 merged in. + & 1.7.6p4 + Version 1.7.6 patchlevel 4 January 2, 2003 + + Minor Changes: + * English-style matching now applies to exits in the room + (so '1st down' can match the first 'down' exit if you're not carrying + anything that matches 'down'). New english-style matching adjective + 'toward' restricts the match to exits (so: 'look toward 1st down'). + Fixes: + * Code cleanup to fix several potential buffer overflows. + * The wildcard matcher had problems with backslash escapes in + some cases, making matching a : in a $command very hard. + Reported by Wayne@PDX. + * @chzone could cause crashes on some systems. Reported by Wayne@PDX. + * When two exits match, one is no longer chosen at random. + Instead, the ambiguity should be reported as an error. + Reported by Intrevis@M*U*S*H. + * The dbref returned by locate when given the X parameter is + no longer random, but the last one found (as per the help). + * Serious bug in reading locks from the db on startup corrected. + * The profiling timer is turned off duing dumps, as some systems + (FreeBSD?) appear to continue to use it and interrupt dumps + due to cpu limiting. Reported by Nathan Schuette. + + & 1.7.6p3 Version 1.7.6 patchlevel 3 December 22, 2002 *************** *** 5885,5892 **** For information on a specific patchlevel of one of the versions listed, type 'help p'. For example, 'help 1.7.2p3' ! 1.7.7: 0, 1, 2, 3 ! 1.7.6: 0, 1, 2, 3 1.7.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 --- 5930,5937 ---- For information on a specific patchlevel of one of the versions listed, type 'help p'. For example, 'help 1.7.2p3' ! 1.7.7: 0, 1, 2, 3, 4 ! 1.7.6: 0, 1, 2, 3, 4 1.7.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 *** 1_7_7.85/game/txt/hlp/penntop.hlp Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.13 600) --- 1_7_7.109(w)/game/txt/hlp/penntop.hlp Mon, 30 Dec 2002 23:35:19 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.12.1.2 600) *************** *** 1782,1791 **** Adjectives include: * my - an object you're carrying * this - an object in your location (also: this here ) * 1st, 2nd, etc. - one of a set of objects with the same names. Objects are ordered in the order in which they're listed in your ! inventory or room contents. ! You may combine some adjectives (my 1st box, this here 2nd box. & &HELP This is the AHELP index. & RESTRICT --- 1782,1792 ---- Adjectives include: * my - an object you're carrying * this - an object in your location (also: this here ) + * toward - an exit in your location * 1st, 2nd, etc. - one of a set of objects with the same names. Objects are ordered in the order in which they're listed in your ! inventory, room contents, and exit list (in that order). ! You may combine some adjectives (my 1st box, this here 2nd box). & &HELP This is the AHELP index. & RESTRICT *** 1_7_7.85/game/txt/hlp/pennfunc.hlp Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.2 600) --- 1_7_7.109(w)/game/txt/hlp/pennfunc.hlp Mon, 30 Dec 2002 19:01:27 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.2 600) *************** *** 1824,1830 **** T - Things F - Return #-1 if what's found is of a different type than the preferred one. ! X - Never return #-2. Use the last dbref found if the match is ambiguous. If you specify more than one type, the last one will be preferred. Unless you specify an F option, if an object of a different type is found and --- 1824,1830 ---- T - Things F - Return #-1 if what's found is of a different type than the preferred one. ! X - Never return #-2. Use the last dbref found if the match is ambiguous. If you specify more than one type, the last one will be preferred. Unless you specify an F option, if an object of a different type is found and *** 1_7_7.85/game/txt/hlp/penncmd.hlp Wed, 25 Dec 2002 02:21:26 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.3 600) --- 1_7_7.109(w)/game/txt/hlp/penncmd.hlp Thu, 02 Jan 2003 23:38:50 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.4 600) *************** *** 1254,1260 **** See also: PUPPET, DBREF & @function @function [] ! @function =, or @function =/ @function/ --- 1254,1260 ---- See also: PUPPET, DBREF & @function @function [] ! @function =,[,, ] or @function =/ @function/ *************** *** 1285,1291 **** Functions defined via @function should follow the format used by UFUN() - %0 is the first argument passed, %1 is the second argument ! passed, and so forth. Example: --- 1285,1292 ---- Functions defined via @function should follow the format used by UFUN() - %0 is the first argument passed, %1 is the second argument ! passed, and so forth. Option third and fourth arguments to @function ! can be used to set a parser-enforced number of arguments for the function. Example: *************** *** 1324,1333 **** For example: @function/delete ansi &ansi_fun #1234=%0 ! @function ansi=#1234, ansi_fun will create a new version of ansi() that doesn't do any ! colorization. See also: RESTRICT, FUNCTIONS, @startup & @grep --- 1325,1335 ---- For example: @function/delete ansi &ansi_fun #1234=%0 ! @function ansi=#1234, ansi_fun, 2, 2 will create a new version of ansi() that doesn't do any ! colorization, and that requires it to be called with exactly ! 2 arguments, like the built-in version. See also: RESTRICT, FUNCTIONS, @startup & @grep *** 1_7_7.85/game/mushcnf.dst Sun, 22 Dec 2002 18:04:18 -0600 dunemush (pennmush/41_mushcnf.ds 1.1.1.19.1.1.1.2.1.1.1.8.1.1.1.1.1.2 600) --- 1_7_7.109(w)/game/mushcnf.dst Mon, 06 Jan 2003 15:38:21 -0600 dunemush (pennmush/41_mushcnf.ds 1.1.1.19.1.1.1.2.1.1.1.8.1.1.1.1.1.5 600) *************** *** 189,194 **** --- 189,199 ---- # What's the max chain length of indirect locks allowed? max_depth 10 + # How many @functions can we have? If you change this without # doing a + # shutdown (or shutdown/reboot) immediately thereafter, you'll very likely + # crash your MUSH, so don't do that. + max_global_fns 50 + # How much does it cost a mortal to create a channel? chan_cost 1000 *************** *** 409,415 **** # check zones and the master room for aconnect/adisconnect? global_connects yes ! # trigger @aconnect/@adisconnect in the room? room_connects no ### --- 414,421 ---- # check zones and the master room for aconnect/adisconnect? global_connects yes ! # trigger @aconnect/@adisconnect in a connecting player's location ! # if the location is a room or thing? room_connects no ### *** 1_7_7.85/utils/mkcmds.sh.SH Sun, 22 Dec 2002 01:03:36 -0600 dunemush (pennmush/g/16_mkcmds.sh. 1.3 750) --- 1_7_7.109(w)/utils/mkcmds.sh.SH Wed, 25 Dec 2002 16:09:28 -0600 dunemush (pennmush/g/16_mkcmds.sh. 1.4 750) *************** *** 39,48 **** exit fi ! if [ -f "../hdrs/timestamp" ]; then ! exit ! fi ! if [ -d ../patches ]; then $echo "Rebuilding list of installed Patches" for bu in ../patches/*; do --- 39,46 ---- exit fi ! case $1 in ! patches) if [ -d ../patches ]; then $echo "Rebuilding list of installed Patches" for bu in ../patches/*; do *************** *** 68,76 **** rm -f ../hdrs/temp.h rm -f ../src/temp.c - touch ../hdrs/timestamp - #rm ../hdrs/patches.h $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h $echo "#ifndef _PATCH_H" >> ../hdrs/temp.h $echo "#define _PATCH_H" >> ../hdrs/temp.h --- 66,72 ---- *************** *** 88,93 **** --- 84,92 ---- mv -f ../hdrs/temp.h ../hdrs/patches.h fi + ;; + switches) + $echo "Rebuilding command switch file" snum=1 $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../src/temp.c *************** *** 112,135 **** mv -f ../hdrs/temp.h ../hdrs/switches.h mv -f ../src/temp.c ../src/switchinc.c $echo "Rebuilding command prototype file" $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h for c in `grep "^COMMAND *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do $echo >>../hdrs/temp.h "COMMAND_PROTO($c);" done ! mv -f ../hdrs/temp.h ../hdrs/cmds.h $echo "Rebuilding function prototype file" $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h for c in `grep "^FUNCTION *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do $echo >>../hdrs/temp.h "FUNCTION_PROTO($c);" done ! mv -f ../hdrs/temp.h ../hdrs/funs.h if [ -d "../win32" ]; then cp ../hdrs/funs.h ../win32/funs.h - cp ../hdrs/cmds.h ../win32/cmds.h fi !NO!SUBS! chmod 755 mkcmds.sh $eunicefix mkcmds.sh --- 111,157 ---- mv -f ../hdrs/temp.h ../hdrs/switches.h mv -f ../src/temp.c ../src/switchinc.c + ;; + commands) + $echo "Rebuilding command prototype file" $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h for c in `grep "^COMMAND *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do $echo >>../hdrs/temp.h "COMMAND_PROTO($c);" done ! cmp -s ../hdrs/cmds.h ../hdrs/temp.h ! cmpstat=$? ! if [ $cmpstat -eq 0 ]; then ! rm -f ../hdrs/temp.h ! else ! mv -f ../hdrs/temp.h ../hdrs/cmds.h ! fi ! ! if [ -d "../win32" ]; then ! cp ../hdrs/cmds.h ../win32/cmds.h ! fi ! ! ;; ! functions) $echo "Rebuilding function prototype file" $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h for c in `grep "^FUNCTION *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do $echo >>../hdrs/temp.h "FUNCTION_PROTO($c);" done ! cmp -s ../hdrs/funs.h ../hdrs/temp.h ! cmpstat=$? ! if [ $cmpstat -eq 0 ]; then ! rm -f ../hdrs/temp.h ! else ! mv -f ../hdrs/temp.h ../hdrs/funs.h ! fi if [ -d "../win32" ]; then cp ../hdrs/funs.h ../win32/funs.h fi + ;; + esac !NO!SUBS! chmod 755 mkcmds.sh $eunicefix mkcmds.sh *** 1_7_7.85/src/wiz.c Wed, 25 Dec 2002 02:11:42 -0600 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2.1.7.1.1.1.1.1.1.1.1.1.1.1.8.1.2.2.2.1.2.1.1.1.1.1.1.1.2.1.3 660) --- 1_7_7.109(w)/src/wiz.c Mon, 06 Jan 2003 16:22:22 -0600 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2.1.7.1.1.1.1.1.1.1.1.1.1.1.8.1.2.2.2.1.2.1.1.1.1.1.1.1.2.1.1.1.2 660) *************** *** 1914,1919 **** --- 1914,1920 ---- if (paranoid_checkpt < 1) paranoid_checkpt = 1; } + fork_and_dump(0); #ifndef WIN32 /* Some broken libcs appear to retain the itimer across exec! * So we make sure that if we get a SIGPROF in our next incarnation, *************** *** 1921,1927 **** */ ignore_signal(SIGPROF); #endif - fork_and_dump(0); dump_reboot_db(); #ifdef INFO_SLAVE kill_info_slave(); --- 1922,1927 ---- *** 1_7_7.85/src/wild.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/24_wild.c 1.11.1.1.1.9 660) --- 1_7_7.109(w)/src/wild.c Mon, 06 Jan 2003 16:22:22 -0600 dunemush (pennmush/b/24_wild.c 1.11.1.1.1.8.1.1.1.4.1.2 660) *************** *** 48,53 **** --- 48,54 ---- static int wild(const char *RESTRICT s, const char *RESTRICT d, int p, int cs); static int check_literals(const char *RESTRICT tstr, const char *RESTRICT dstr, int cs); + static char *strip_backslashes(const char *str); /* --------------------------------------------------------------------------- * quick_wild: do a wildcard match, without remembering the wild data. *************** *** 500,507 **** char *sp, *dp; strncpy(dbuf1, dstr, BUFFER_LEN - 1); dbuf1[BUFFER_LEN - 1] = '\0'; ! strncpy(tbuf1, tstr, BUFFER_LEN - 1); ! tbuf1[BUFFER_LEN - 1] = '\0'; if (!cs) { upcasestr(tbuf1); upcasestr(dbuf1); --- 501,507 ---- char *sp, *dp; strncpy(dbuf1, dstr, BUFFER_LEN - 1); dbuf1[BUFFER_LEN - 1] = '\0'; ! strcpy(tbuf1, strip_backslashes(tstr)); if (!cs) { upcasestr(tbuf1); upcasestr(dbuf1); *************** *** 518,520 **** --- 518,537 ---- } return 1; } + + + static char * + strip_backslashes(const char *str) + { + /* Remove backslashes from a string, and return it in a static buffer */ + static char buf[BUFFER_LEN]; + int i = 0; + + while (*str && (i < BUFFER_LEN - 1)) { + if (*str == '\\' && *(str + 1)) + str++; + buf[i++] = *str++; + } + buf[i] = '\0'; + return buf; + } *** 1_7_7.85/src/unparse.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/28_unparse.c 1.16.1.8 660) --- 1_7_7.109(w)/src/unparse.c Mon, 06 Jan 2003 16:22:19 -0600 dunemush (pennmush/b/28_unparse.c 1.16.1.7.1.2 660) *************** *** 81,87 **** real_unparse(dbref player, dbref loc, int obey_myopic, int use_nameformat, int use_nameaccent) { ! static char buf[BUFFER_LEN]; static char tbuf1[BUFFER_LEN]; char *p; int got_nameformat = 0; --- 81,87 ---- real_unparse(dbref player, dbref loc, int obey_myopic, int use_nameformat, int use_nameaccent) { ! static char buf[BUFFER_LEN], *bp; static char tbuf1[BUFFER_LEN]; char *p; int got_nameformat = 0; *************** *** 119,134 **** /* show everything */ if (SUPPORT_PUEBLO) couldunparse = 1; if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) ! sprintf(buf, "%s%s%s(#%d%s)", ANSI_HILITE, tbuf1, ! ANSI_NORMAL, loc, unparse_flags(loc, player)); else ! sprintf(buf, "%s(#%d%s)", tbuf1, loc, unparse_flags(loc, player)); return buf; } else { /* show only the name */ if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) { ! sprintf(buf, "%s%s%s", ANSI_HILITE, tbuf1, ANSI_NORMAL); return buf; } else return tbuf1; --- 119,139 ---- /* show everything */ if (SUPPORT_PUEBLO) couldunparse = 1; + bp = buf; if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) ! safe_format(buf, &bp, "%s%s%s(#%d%s)", ANSI_HILITE, tbuf1, ! ANSI_NORMAL, loc, unparse_flags(loc, player)); else ! safe_format(buf, &bp, "%s(#%d%s)", tbuf1, loc, ! unparse_flags(loc, player)); ! *bp = '\0'; return buf; } else { /* show only the name */ if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) { ! bp = buf; ! safe_format(buf, &bp, "%s%s%s", ANSI_HILITE, tbuf1, ANSI_NORMAL); ! *bp = '\0'; return buf; } else return tbuf1; *** 1_7_7.85/src/switchinc.c Wed, 25 Dec 2002 02:11:42 -0600 dunemush (pennmush/b/32_switchinc. 1.3.1.2.1.6.1.18.1.2.1.2.2.5.1.4.2.4.1.1.1.2.1.5.1.2.1.5.2.1.1.31.3.4.1.2.1.3 660) --- 1_7_7.109(w)/src/switchinc.c Mon, 06 Jan 2003 16:22:19 -0600 dunemush (pennmush/b/32_switchinc. 1.3.1.2.1.6.1.18.1.2.1.2.2.5.1.4.2.4.1.1.1.2.1.5.1.2.1.5.2.1.1.31.3.4.1.2.1.6 660) *************** *** 132,136 **** {"WIZARD", SWITCH_WIZARD}, {"YES", SWITCH_YES}, {"ZONE", SWITCH_ZONE}, ! {NULL, 0} }; --- 132,136 ---- {"WIZARD", SWITCH_WIZARD}, {"YES", SWITCH_YES}, {"ZONE", SWITCH_ZONE}, ! {NULL, 0} }; *** 1_7_7.85/src/set.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.12 660) --- 1_7_7.109(w)/src/set.c Mon, 06 Jan 2003 16:22:18 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.11.1.2 660) *************** *** 368,374 **** return 0; } /* Don't allow circular zones */ ! { dbref tmp; for (tmp = Zone(zone); GoodObject(tmp); tmp = Zone(tmp)) { if (tmp == thing) { --- 368,374 ---- return 0; } /* Don't allow circular zones */ ! if (GoodObject(zone)) { dbref tmp; for (tmp = Zone(zone); GoodObject(tmp); tmp = Zone(tmp)) { if (tmp == thing) { *** 1_7_7.85/src/rob.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.3.1.3.1.6 660) --- 1_7_7.109(w)/src/rob.c Mon, 06 Jan 2003 16:22:18 -0600 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.3.1.3.1.7 660) *************** *** 23,29 **** do_kill(dbref player, const char *what, int cost, int slay) { dbref victim; ! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN]; if (slay && !Wizard(player)) { notify(player, T("You do not have such power.")); --- 23,29 ---- do_kill(dbref player, const char *what, int cost, int slay) { dbref victim; ! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp; if (slay && !Wizard(player)) { notify(player, T("You do not have such power.")); *************** *** 76,83 **** if (((get_random_long(0, KILL_BASE_COST) < cost) || slay) && !Wizard(victim)) { /* you killed him */ ! sprintf(tbuf1, T("You killed %s!"), Name(victim)); ! sprintf(tbuf2, "killed %s!", Name(victim)); do_halt(victim, "", victim); did_it(player, victim, "DEATH", tbuf1, "ODEATH", tbuf2, "ADEATH", NOTHING); --- 76,87 ---- if (((get_random_long(0, KILL_BASE_COST) < cost) || slay) && !Wizard(victim)) { /* you killed him */ ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("You killed %s!"), Name(victim)); ! *tp = '\0'; ! tp = tbuf2; ! safe_format(tbuf2, &tp, "killed %s!", Name(victim)); ! *tp = '\0'; do_halt(victim, "", victim); did_it(player, victim, "DEATH", tbuf1, "ODEATH", tbuf2, "ADEATH", NOTHING); *** 1_7_7.85/src/player.c Sun, 22 Dec 2002 01:05:36 -0600 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.10 660) --- 1_7_7.109(w)/src/player.c Mon, 06 Jan 2003 16:22:18 -0600 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.6.1.2 660) *************** *** 488,497 **** const char *host; { char *s; ! char last_place[MAX_COMMAND_LEN]; s = ctime(&mudtime); ! s[strlen(s) - 1] = 0; ! sprintf(last_place, T("%s on %s"), host, s); (void) atr_add(player, "LASTFAILED", last_place, GOD, NOTHING); } --- 488,499 ---- const char *host; { char *s; ! char last_place[BUFFER_LEN], *bp; s = ctime(&mudtime); ! s[strlen(s) - 1] = '\0'; ! bp = last_place; ! safe_format(last_place, &bp, T("%s on %s"), host, s); ! *bp = '\0'; (void) atr_add(player, "LASTFAILED", last_place, GOD, NOTHING); } *** 1_7_7.85/src/move.c Mon, 07 Oct 2002 22:44:39 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1.1.5 660) --- 1_7_7.109(w)/src/move.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1.1.9 660) *************** *** 292,299 **** if (!strcasecmp(direction, "home") && !Fixed(player)) return 1; ! /* otherwise match on exits */ ! return (last_match_result(player, direction, TYPE_EXIT, MAT_EXIT) != NOTHING); } static dbref --- 292,300 ---- if (!strcasecmp(direction, "home") && !Fixed(player)) return 1; ! /* otherwise match on exits - don't use GoodObject here! */ ! return (match_result(player, direction, TYPE_EXIT, MAT_ENGLISH | MAT_EXIT) != ! NOTHING); } static dbref *************** *** 309,315 **** char buff[BUFFER_LEN], *bp; ATTR *a; dbref dest_room; - /* We'd like a DESTINATION attribute, but we'll settle for EXITTO, * for portability */ --- 310,315 ---- *************** *** 318,324 **** a = atr_get(exit_obj, "EXITTO"); if (!a) return NOTHING; - abuf = safe_uncompress(a->value); if (!abuf) return NOTHING; --- 318,323 ---- *************** *** 332,338 **** PE_DEFAULT, PT_DEFAULT, NULL); *bp = '\0'; dest_room = parse_dbref(buff); - free((Malloc_t) abuf); return (dest_room); } --- 331,336 ---- *************** *** 345,351 **** int type; /* type 0 is normal, type 1 is global, type 2 is zone */ { dbref exit_m, loc, var_dest; - if (!strcasecmp(direction, "home")) { /* send him home */ /* but steal all his possessions */ --- 343,348 ---- *************** *** 370,383 **** if (DO_GLOBALS && (type == 1)) exit_m = match_result(player, direction, TYPE_EXIT, ! MAT_EXIT | MAT_GLOBAL | MAT_CHECK_KEYS); else if (DO_GLOBALS && (type == 2)) exit_m = match_result(player, direction, TYPE_EXIT, ! MAT_EXIT | MAT_REMOTES | MAT_CHECK_KEYS); else exit_m = ! match_result(player, direction, TYPE_EXIT, MAT_EXIT | MAT_CHECK_KEYS); switch (exit_m) { case NOTHING: /* try to force the object */ --- 367,381 ---- if (DO_GLOBALS && (type == 1)) exit_m = match_result(player, direction, TYPE_EXIT, ! MAT_ENGLISH | MAT_EXIT | MAT_GLOBAL | MAT_CHECK_KEYS); else if (DO_GLOBALS && (type == 2)) exit_m = match_result(player, direction, TYPE_EXIT, ! MAT_ENGLISH | MAT_EXIT | MAT_REMOTES | MAT_CHECK_KEYS); else exit_m = ! match_result(player, direction, TYPE_EXIT, ! MAT_ENGLISH | MAT_EXIT | MAT_CHECK_KEYS); switch (exit_m) { case NOTHING: /* try to force the object */ *************** *** 418,424 **** did_it(player, exit_m, "SUCCESS", NULL, "OSUCCESS", NULL, "ASUCCESS", NOTHING); did_it(player, exit_m, "DROP", NULL, "ODROP", NULL, "ADROP", var_dest); - switch (Typeof(var_dest)) { case TYPE_ROOM: --- 416,421 ---- *************** *** 430,436 **** if (Location(player) != loc) follower_command(player, loc, tprintf("%s #%d", "move", exit_m)); break; - case TYPE_PLAYER: case TYPE_THING: if (IsGarbage(var_dest)) { --- 427,432 ---- *************** *** 466,476 **** { dbref thing; dbref loc; ! ! if ((thing = noisy_match_result(player, what, TYPE_EXIT, MAT_EXIT)) == ! NOTHING) return; - loc = Home(thing); if (!controls(player, loc)) { notify(player, T("You cannot modify exits in that room.")); --- 462,471 ---- { dbref thing; dbref loc; ! if ((thing = ! noisy_match_result(player, what, TYPE_EXIT, ! MAT_ENGLISH | MAT_EXIT)) == NOTHING) return; loc = Home(thing); if (!controls(player, loc)) { notify(player, T("You cannot modify exits in that room.")); *************** *** 490,508 **** { dbref loc = Location(player); dbref thing; ! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN]; long match_flags = MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH; char *myenv[10]; int i; - if (!IsRoom(loc) && !EnterOk(loc) && !controls(player, loc)) { notify(player, T("Permission denied.")); return; } if (!Long_Fingers(player)) match_flags |= MAT_CONTROL; - if (match_result(player, what, TYPE_THING, match_flags) == NOTHING) { if (POSSESSIVE_GET) { /* take care of possessive get (stealing) */ --- 485,501 ---- { dbref loc = Location(player); dbref thing; ! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp; long match_flags = MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH; char *myenv[10]; int i; if (!IsRoom(loc) && !EnterOk(loc) && !controls(player, loc)) { notify(player, T("Permission denied.")); return; } if (!Long_Fingers(player)) match_flags |= MAT_CONTROL; if (match_result(player, what, TYPE_THING, match_flags) == NOTHING) { if (POSSESSIVE_GET) { /* take care of possessive get (stealing) */ *************** *** 524,533 **** notify_format(Location(thing), T("%s was taken from you."), Name(thing)); notify_format(thing, T("%s took you."), Name(player)); ! sprintf(tbuf1, T("You take %s from %s."), Name(thing), ! Name(Location(thing))); ! sprintf(tbuf2, T("takes %s from %s."), Name(thing), ! Name(Location(thing))); moveto(thing, player); did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS", NOTHING); --- 517,530 ---- notify_format(Location(thing), T("%s was taken from you."), Name(thing)); notify_format(thing, T("%s took you."), Name(player)); ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("You take %s from %s."), Name(thing), ! Name(Location(thing))); ! *tp = '\0'; ! tp = tbuf2; ! safe_format(tbuf2, &tp, T("takes %s from %s."), Name(thing), ! Name(Location(thing))); ! *tp = '\0'; moveto(thing, player); did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS", NOTHING); *************** *** 570,577 **** if (could_doit(player, thing)) { moveto(thing, player); notify_format(thing, T("%s took you."), Name(player)); ! sprintf(tbuf1, T("You take %s."), Name(thing)); ! sprintf(tbuf2, T("takes %s."), Name(thing)); did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS", NOTHING); myenv[0] = (char *) mush_malloc(BUFFER_LEN, "dbref"); --- 567,578 ---- if (could_doit(player, thing)) { moveto(thing, player); notify_format(thing, T("%s took you."), Name(player)); ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("You take %s."), Name(thing)); ! *tp = '\0'; ! tp = tbuf2; ! safe_format(tbuf2, &tp, T("takes %s."), Name(thing)); ! *tp = '\0'; did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS", NOTHING); myenv[0] = (char *) mush_malloc(BUFFER_LEN, "dbref"); *************** *** 604,614 **** { dbref loc; dbref thing; ! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN]; ! if ((loc = Location(player)) == NOTHING) return; - switch (thing = match_result(player, name, TYPE_THING, MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL | --- 605,613 ---- { dbref loc; dbref thing; ! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp; if ((loc = Location(player)) == NOTHING) return; switch (thing = match_result(player, name, TYPE_THING, MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL | *************** *** 647,654 **** } break; } ! sprintf(tbuf1, T("You drop %s."), Name(thing)); ! sprintf(tbuf2, T("drops %s."), Name(thing)); did_it(player, thing, "DROP", tbuf1, "ODROP", tbuf2, "ADROP", NOTHING); } --- 646,657 ---- } break; } ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("You drop %s."), Name(thing)); ! *tp = '\0'; ! tp = tbuf2; ! safe_format(tbuf2, &tp, T("drops %s."), Name(thing)); ! *tp = '\0'; did_it(player, thing, "DROP", tbuf1, "ODROP", tbuf2, "ADROP", NOTHING); } *************** *** 661,671 **** dbref thing; dbref loc; long match_flags = MAT_CHECK_KEYS | MAT_NEIGHBOR | MAT_ENGLISH | MAT_ABSOLUTE; - if ((thing = noisy_match_result(player, what, TYPE_THING, match_flags)) == NOTHING) return; - switch (Typeof(thing)) { case TYPE_ROOM: case TYPE_EXIT: --- 664,672 ---- *************** *** 707,713 **** { dbref loc; loc = Location(player); ! if (IsRoom(loc) || IsGarbage(loc) || IsGarbage(Location(loc)) || NoLeave(loc) || !eval_lock(player, loc, Leave_Lock) ) { did_it(player, loc, "LFAIL", T("You can't leave."), "OLFAIL", --- 708,715 ---- { dbref loc; loc = Location(player); ! if (IsRoom(loc) || IsGarbage(loc) || IsGarbage(Location(loc)) ! || NoLeave(loc) || !eval_lock(player, loc, Leave_Lock) ) { did_it(player, loc, "LFAIL", T("You can't leave."), "OLFAIL", *************** *** 719,740 **** follower_command(player, loc, "leave"); } ! dbref global_exit(player, direction) dbref player; const char *direction; { ! return (last_match_result ! (player, direction, TYPE_EXIT, MAT_GLOBAL | MAT_EXIT) != NOTHING); } ! dbref remote_exit(player, direction) dbref player; const char *direction; { ! return (last_match_result ! (player, direction, TYPE_EXIT, MAT_REMOTES | MAT_EXIT) != NOTHING); } void --- 721,742 ---- follower_command(player, loc, "leave"); } ! int global_exit(player, direction) dbref player; const char *direction; { ! return (GoodObject ! (match_result(player, direction, TYPE_EXIT, MAT_GLOBAL | MAT_EXIT))); } ! int remote_exit(player, direction) dbref player; const char *direction; { ! return (GoodObject ! (match_result(player, direction, TYPE_EXIT, MAT_REMOTES | MAT_EXIT))); } void *************** *** 748,754 **** if (!Mobile(player)) return; - if (!strcasecmp(command, "home") && Fixed(player)) { notify(player, T("You can't do that IC!")); return; --- 750,755 ---- *************** *** 756,765 **** if (DO_GLOBALS) { if (can_move(player, command)) do_move(player, command, 0); ! else if ((Zone(Location(player)) != NOTHING) && ! remote_exit(player, command)) do_move(player, command, 2); ! else if ((Location(player) != MASTER_ROOM) && global_exit(player, command)) do_move(player, command, 1); else do_move(player, command, 0); --- 757,767 ---- if (DO_GLOBALS) { if (can_move(player, command)) do_move(player, command, 0); ! else ! if ((Zone(Location(player)) != NOTHING) && remote_exit(player, command)) do_move(player, command, 2); ! else if ((Location(player) != MASTER_ROOM) ! && global_exit(player, command)) do_move(player, command, 1); else do_move(player, command, 0); *************** *** 786,795 **** notify(player, T("I can't tell which one to follow.")); return; } ! if (!GoodObject(leader) || !GoodObject(Location(player)) || ! (IsPlayer(leader) && !Connected(leader)) || ! ((DarkLegal(leader) || (Dark(Location(player)) && !Light(leader))) && ! !See_All(player))) { notify(player, T("You don't see that here.")); return; } --- 788,798 ---- notify(player, T("I can't tell which one to follow.")); return; } ! if (!GoodObject(leader) || !GoodObject(Location(player)) ! || (IsPlayer(leader) && !Connected(leader)) ! || ((DarkLegal(leader) ! || (Dark(Location(player)) && !Light(leader))) ! && !See_All(player))) { notify(player, T("You don't see that here.")); return; } *************** *** 808,815 **** } /* Ok, are we allowed to follow them? */ if (!eval_lock(player, leader, Follow_Lock)) { ! notify_format(player, T("You're not allowed to follow %s."), ! Name(leader)); return; } /* Ok, looks good */ --- 811,818 ---- } /* Ok, are we allowed to follow them? */ if (!eval_lock(player, leader, Follow_Lock)) { ! notify_format(player, ! T("You're not allowed to follow %s."), Name(leader)); return; } /* Ok, looks good */ *************** *** 903,911 **** return; } /* Are we following or leading them? */ ! if (!is_following(who, player) && !is_following(player, who)) { ! notify_format(player, T("%s isn't following you, nor vice versa."), ! Name(who)); return; } /* Ok, looks good */ --- 906,915 ---- return; } /* Are we following or leading them? */ ! if (!is_following(who, player) ! && !is_following(player, who)) { ! notify_format(player, ! T("%s isn't following you, nor vice versa."), Name(who)); return; } /* Ok, looks good */ *************** *** 928,934 **** ATTR *a; char tbuf1[BUFFER_LEN]; char *bp; - a = atr_get_noparent(leader, "FOLLOWERS"); if (!a) { (void) atr_add(leader, "FOLLOWERS", unparse_dbref(follower), GOD, NOTHING); --- 932,937 ---- *************** *** 951,957 **** ATTR *a; char tbuf1[BUFFER_LEN]; char *bp; - a = atr_get_noparent(follower, "FOLLOWING"); if (!a) { (void) atr_add(follower, "FOLLOWING", unparse_dbref(leader), GOD, NOTHING); --- 954,959 ---- *************** *** 992,1006 **** ATTR *a; char tbuf1[BUFFER_LEN]; char flwr[BUFFER_LEN]; - a = atr_get_noparent(leader, "FOLLOWERS"); if (!a) return; /* No followers, so no deletion */ /* Let's take it apart and put it back together w/o follower */ strcpy(flwr, unparse_dbref(follower)); strcpy(tbuf1, uncompress(AL_STR(a))); ! (void) atr_add(leader, "FOLLOWERS", remove_word(tbuf1, flwr, ' '), GOD, ! NOTHING); } /* Delete someone from a player's FOLLOWING attribute */ --- 994,1007 ---- ATTR *a; char tbuf1[BUFFER_LEN]; char flwr[BUFFER_LEN]; a = atr_get_noparent(leader, "FOLLOWERS"); if (!a) return; /* No followers, so no deletion */ /* Let's take it apart and put it back together w/o follower */ strcpy(flwr, unparse_dbref(follower)); strcpy(tbuf1, uncompress(AL_STR(a))); ! (void) atr_add(leader, "FOLLOWERS", ! remove_word(tbuf1, flwr, ' '), GOD, NOTHING); } /* Delete someone from a player's FOLLOWING attribute */ *************** *** 1012,1026 **** ATTR *a; char tbuf1[BUFFER_LEN]; char ldr[BUFFER_LEN]; - a = atr_get_noparent(follower, "FOLLOWING"); if (!a) return; /* Not following, so no deletion */ /* Let's take it apart and put it back together w/o leader */ strcpy(ldr, unparse_dbref(leader)); strcpy(tbuf1, uncompress(AL_STR(a))); ! (void) atr_add(follower, "FOLLOWING", remove_word(tbuf1, ldr, ' '), GOD, ! NOTHING); } static void --- 1013,1026 ---- ATTR *a; char tbuf1[BUFFER_LEN]; char ldr[BUFFER_LEN]; a = atr_get_noparent(follower, "FOLLOWING"); if (!a) return; /* Not following, so no deletion */ /* Let's take it apart and put it back together w/o leader */ strcpy(ldr, unparse_dbref(leader)); strcpy(tbuf1, uncompress(AL_STR(a))); ! (void) atr_add(follower, "FOLLOWING", ! remove_word(tbuf1, ldr, ' '), GOD, NOTHING); } static void *************** *** 1035,1042 **** if (noisy) { strcpy(msg, tprintf(T("You stop following %s."), Name(leader))); notify_format(leader, T("%s stops following you."), Name(follower)); ! did_it(follower, leader, "UNFOLLOW", msg, "OUNFOLLOW", NULL, ! "AUNFOLLOW", NOTHING); } } --- 1035,1042 ---- if (noisy) { strcpy(msg, tprintf(T("You stop following %s."), Name(leader))); notify_format(leader, T("%s stops following you."), Name(follower)); ! did_it(follower, leader, "UNFOLLOW", msg, "OUNFOLLOW", ! NULL, "AUNFOLLOW", NOTHING); } } *************** *** 1052,1058 **** char *bp; dbref who; int first = 1; - a = atr_get_noparent(player, "FOLLOWERS"); if (!a) return (char *) ""; --- 1052,1057 ---- *************** *** 1085,1091 **** char *bp; dbref who; int first = 1; - a = atr_get_noparent(player, "FOLLOWING"); if (!a) return (char *) ""; --- 1084,1089 ---- *************** *** 1140,1146 **** char *s, *sp; char tbuf1[BUFFER_LEN]; dbref flwr; - a = atr_get_noparent(leader, "FOLLOWERS"); if (!a) return; /* No one's following me */ --- 1138,1143 ---- *************** *** 1167,1173 **** char *s, *sp; char tbuf1[BUFFER_LEN]; dbref ldr; - a = atr_get_noparent(follower, "FOLLOWING"); if (!a) return; /* I'm not following anyone */ --- 1164,1169 ---- *************** *** 1196,1202 **** char *s, *sp; char tbuf1[BUFFER_LEN]; char combuf[BUFFER_LEN]; - if (!com || !*com) return; strcpy(combuf, com); --- 1192,1197 ---- *************** *** 1208,1217 **** while (s) { sp = split_token(&s, ' '); follower = parse_dbref(sp); ! if (GoodObject(follower) && (Location(follower) == loc) && ! (Connected(follower) || IsThing(follower)) && ! (!(DarkLegal(leader) || (Dark(Location(follower)) && !Light(leader))) || ! See_All(follower))) { /* This is a follower who was in the room with the leader. Follow. */ notify_format(follower, T("You follow %s."), Name(leader)); process_command(follower, combuf, follower, 0); --- 1203,1213 ---- while (s) { sp = split_token(&s, ' '); follower = parse_dbref(sp); ! if (GoodObject(follower) && (Location(follower) == loc) ! && (Connected(follower) || IsThing(follower)) ! && (!(DarkLegal(leader) ! || (Dark(Location(follower)) && !Light(leader))) ! || See_All(follower))) { /* This is a follower who was in the room with the leader. Follow. */ notify_format(follower, T("You follow %s."), Name(leader)); process_command(follower, combuf, follower, 0); *** 1_7_7.85/src/match.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.5 660) --- 1_7_7.109(w)/src/match.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.4.1.1.1.1.1.1.1.1.1.2 660) *************** *** 76,82 **** const int type, const long int flags, dbref *last_match, int *match_count); static dbref match_exit(const dbref who, const char *name, ! const int type, const long int flags); static dbref match_exit_internal(const dbref match_who, const char *match_name, const int type, const long int flags, const dbref loc, --- 76,82 ---- const int type, const long int flags, dbref *last_match, int *match_count); static dbref match_exit(const dbref who, const char *name, ! const int type, const long int flags, int *match_count); static dbref match_exit_internal(const dbref match_who, const char *match_name, const int type, const long int flags, const dbref loc, *************** *** 92,97 **** --- 92,98 ---- static dbref choose_thing(const dbref match_who, const int preferred_type, long int flags, dbref thing1, dbref thing2, int *match_count); + extern int check_alias(const char *command, const char *list); /* game.c */ /* A wrapper for returning a match, AMBIGUOUS, or NOTHING *************** *** 204,250 **** match = match_remote_contents(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count++; exact_match = match; } } if (flags & MAT_NEIGHBOR) { match = match_neighbor(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count++; exact_match = match; } } if (flags & MAT_POSSESSION) { match = match_possession(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count++; exact_match = match; } } if (flags & MAT_EXIT) { ! match = match_exit(who, name, type, flags); if (GoodObject(match)) { ! exact_match_count++; exact_match = match; } } if (flags & MAT_CONTAINER) { match = match_container(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count++; exact_match = match; } } if (flags & MAT_CARRIED_EXIT) { match = match_exit_internal(who, name, type, flags, who, &match_count); if (GoodObject(match)) { ! exact_match_count++; exact_match = match; } } ! if ((flags & MAT_ENGLISH) && !GoodObject(last_match) ! && !GoodObject(exact_match)) { match = match_english(who, name, flags); if (GoodObject(match)) { exact_match_count++; --- 205,251 ---- match = match_remote_contents(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count += match_count; exact_match = match; } } if (flags & MAT_NEIGHBOR) { match = match_neighbor(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count += match_count; exact_match = match; } } if (flags & MAT_POSSESSION) { match = match_possession(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count += match_count; exact_match = match; } } if (flags & MAT_EXIT) { ! match = match_exit(who, name, type, flags, &match_count); if (GoodObject(match)) { ! exact_match_count += match_count; exact_match = match; } } if (flags & MAT_CONTAINER) { match = match_container(who, name, type, flags, &last_match, &match_count); if (GoodObject(match)) { ! exact_match_count += match_count; exact_match = match; } } if (flags & MAT_CARRIED_EXIT) { match = match_exit_internal(who, name, type, flags, who, &match_count); if (GoodObject(match)) { ! exact_match_count += match_count; exact_match = match; } } ! if ((flags & MAT_ENGLISH) && !GoodObject(exact_match) ! && !((flags & MAT_LAST) && GoodObject(last_match))) { match = match_english(who, name, flags); if (GoodObject(match)) { exact_match_count++; *************** *** 359,364 **** --- 360,366 ---- alias_match = lookup_player(match_name); DOLIST(first, first) { if (first == absolute) { + (*match_count)++; return first; } else if (!strcasecmp(Name(first), match_name) || (GoodObject(alias_match) && (alias_match == first))) { *************** *** 366,377 **** /* if there are multiple exact matches, don't match any but * make sure match_count is high enough that we report ambiguity */ - *match_count += 2; *last_match = choose_thing(match_who, type, flags, the_match, first, match_count); return NOTHING; ! } else the_match = first; } else if (string_match(Name(first), match_name)) { *last_match = choose_thing(match_who, type, flags, *last_match, first, match_count); --- 368,380 ---- /* if there are multiple exact matches, don't match any but * make sure match_count is high enough that we report ambiguity */ *last_match = choose_thing(match_who, type, flags, the_match, first, match_count); return NOTHING; ! } else { the_match = first; + (*match_count)++; + } } else if (string_match(Name(first), match_name)) { *last_match = choose_thing(match_who, type, flags, *last_match, first, match_count); *************** *** 412,435 **** } static dbref ! match_exit(who, name, type, flags) const dbref who; const char *name; const int type; const long flags; { dbref loc; loc = (IsRoom(who)) ? who : Location(who); if (DO_GLOBALS) { if (flags & MAT_REMOTES) { if (GoodObject(loc)) ! return match_exit_internal(who, name, type, flags, Zone(loc), NULL); else return NOTHING; } else if (flags & MAT_GLOBAL) ! return match_exit_internal(who, name, type, flags, MASTER_ROOM, NULL); } ! return match_exit_internal(who, name, type, flags, loc, NULL); } static dbref --- 415,441 ---- } static dbref ! match_exit(who, name, type, flags, match_count) const dbref who; const char *name; const int type; const long flags; + int *match_count; { dbref loc; loc = (IsRoom(who)) ? who : Location(who); if (DO_GLOBALS) { if (flags & MAT_REMOTES) { if (GoodObject(loc)) ! return match_exit_internal(who, name, type, flags, Zone(loc), ! match_count); else return NOTHING; } else if (flags & MAT_GLOBAL) ! return match_exit_internal(who, name, type, flags, MASTER_ROOM, ! match_count); } ! return match_exit_internal(who, name, type, flags, loc, match_count); } static dbref *************** *** 443,450 **** { dbref exit_tmp; dbref absolute; - const char *match; - const char *p; dbref the_match = NOTHING; if (!GoodObject(loc) || !match_name || !*match_name) --- 449,454 ---- *************** *** 453,491 **** return NOTHING; absolute = match_absolute(match_name); DOLIST(exit_tmp, Exits(loc)) { ! if (exit_tmp == absolute) { the_match = exit_tmp; ! } else { ! match = Name(exit_tmp); ! while (*match) { ! /* check out this one */ ! for (p = match_name; (*p && DOWNCASE(*p) == DOWNCASE(*match) ! && *match != EXIT_DELIMITER); p++, match++) ; ! /* did we get it? */ ! if (*p == '\0') { ! /* make sure there's nothing afterwards */ ! while (isspace((unsigned char) *match)) ! match++; ! if (*match == '\0' || *match == EXIT_DELIMITER) { ! /* we got it */ ! the_match = ! choose_thing(match_who, type, flags, the_match, exit_tmp, ! match_count); ! goto next_exit; ! } ! } ! /* we didn't get it, find next match */ ! while (*match && *match++ != EXIT_DELIMITER) ; ! while (isspace((unsigned char) *match)) ! match++; ! } ! } ! next_exit: ! ; } return the_match; } static dbref match_remote_contents(who, name, type, flags, last_match, match_count) const dbref who; --- 457,472 ---- return NOTHING; absolute = match_absolute(match_name); DOLIST(exit_tmp, Exits(loc)) { ! if (exit_tmp == absolute) the_match = exit_tmp; ! else if (check_alias(match_name, Name(exit_tmp))) ! the_match = ! choose_thing(match_who, type, flags, the_match, exit_tmp, match_count); } return the_match; } + static dbref match_remote_contents(who, name, type, flags, last_match, match_count) const dbref who; *************** *** 525,530 **** --- 506,512 ---- { int do_loc; int do_cont; + int do_exits, doing_exits; int num, matchnum; char *dupname, *p; char *mname; *************** *** 543,560 **** do_cont = 1; else do_cont = 0; if (do_loc && (!strncasecmp(dupname, "this here ", 10))) { dupname += 10; ! do_cont = 0; } else if (do_loc && (!strncasecmp(dupname, "here ", 5) || !strncasecmp(dupname, "this ", 5))) { dupname += 5; ! do_cont = 0; } else if (do_cont && (!strncasecmp(dupname, "my ", 3) || !strncasecmp(dupname, "me ", 3))) { dupname += 3; ! do_loc = 0; } while (*dupname == ' ') --- 525,549 ---- do_cont = 1; else do_cont = 0; + if (flags & MAT_EXIT) + do_exits = 1; + else + do_exits = 0; if (do_loc && (!strncasecmp(dupname, "this here ", 10))) { dupname += 10; ! do_cont = do_exits = 0; } else if (do_loc && (!strncasecmp(dupname, "here ", 5) || !strncasecmp(dupname, "this ", 5))) { dupname += 5; ! do_cont = do_exits = 0; } else if (do_cont && (!strncasecmp(dupname, "my ", 3) || !strncasecmp(dupname, "me ", 3))) { dupname += 3; ! do_loc = do_exits = 0; ! } else if (do_exits && (!strncasecmp(dupname, "toward ", 7))) { ! dupname += 7; ! do_loc = do_cont = 0; } while (*dupname == ' ') *************** *** 601,618 **** num = 1; } ! while (do_cont || do_loc) { if (do_cont) { item = Contents(who); do_cont = 0; ! } else { item = Contents(Location(who)); do_loc = 0; } matchnum = 0; DOLIST(item, item) { ! if (!strcasecmp(Name(item), dupname) ! || string_match(Name(item), dupname)) { matchnum++; if (matchnum == num) { mush_free(p, "string"); --- 590,613 ---- num = 1; } ! doing_exits = 0; ! while (do_cont || do_loc || do_exits) { if (do_cont) { item = Contents(who); do_cont = 0; ! } else if (do_loc) { item = Contents(Location(who)); do_loc = 0; + } else { + item = Exits(Location(who)); + doing_exits = 1; + do_exits = 0; } matchnum = 0; DOLIST(item, item) { ! if (doing_exits ? (check_alias(dupname, Name(item))) ! : (!strcasecmp(Name(item), dupname) ! || string_match(Name(item), dupname))) { matchnum++; if (matchnum == num) { mush_free(p, "string"); *************** *** 625,630 **** --- 620,626 ---- return NOTHING; } + static dbref choose_thing(match_who, preferred_type, flags, thing1, thing2, match_count) const dbref match_who; *************** *** 665,669 **** } if (match_count) (*match_count)++; ! return (get_random_long(0, 1) ? thing1 : thing2); } --- 661,665 ---- } if (match_count) (*match_count)++; ! return (thing1 > thing2 ? thing1 : thing2); } *** 1_7_7.85/src/look.c Sun, 22 Dec 2002 01:19:31 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.2 660) --- 1_7_7.109(w)/src/look.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.3 660) *************** *** 654,665 **** dbref player; { static char buf[BUFFER_LEN]; CHANLIST *c; if ((c = Chanlist(player))) { ! strcpy(buf, T("Channels:")); ! for (; c; c = c->next) ! sprintf(buf, "%s %s", buf, ChanName(c->chan)); } else strcpy(buf, T("Channels: *NONE*")); return buf; --- 654,670 ---- dbref player; { static char buf[BUFFER_LEN]; + char *bp; CHANLIST *c; if ((c = Chanlist(player))) { ! bp = buf; ! safe_str(T("Channels:"), buf, &bp); ! for (; c; c = c->next) { ! safe_chr(' ', buf, &bp); ! safe_str(ChanName(c->chan), buf, &bp); ! } ! *bp = '\0'; } else strcpy(buf, T("Channels: *NONE*")); return buf; *** 1_7_7.85/src/log.c Sat, 30 Nov 2002 17:42:23 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.1 660) --- 1_7_7.109(w)/src/log.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.2 660) *************** *** 44,64 **** quick_unparse(object) dbref object; { ! static char buff[BUFFER_LEN]; switch (object) { case NOTHING: ! sprintf(buff, T("*NOTHING*")); break; case AMBIGUOUS: ! sprintf(buff, T("*VARIABLE*")); break; case HOME: ! sprintf(buff, T("*HOME*")); break; default: ! sprintf(buff, "%s(#%d%s)", ! Name(object), object, unparse_flags(object, GOD)); } return buff; --- 44,66 ---- quick_unparse(object) dbref object; { ! static char buff[BUFFER_LEN], *bp; switch (object) { case NOTHING: ! strcpy(buff, T("*NOTHING*")); break; case AMBIGUOUS: ! strcpy(buff, T("*VARIABLE*")); break; case HOME: ! strcpy(buff, T("*HOME*")); break; default: ! bp = buff; ! safe_format(buff, &bp, "%s(#%d%s)", ! Name(object), object, unparse_flags(object, GOD)); ! *bp = '\0'; } return buff; *** 1_7_7.85/src/lock.c Tue, 17 Dec 2002 16:03:37 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.2 660) --- 1_7_7.109(w)/src/lock.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.1.1.2 660) *************** *** 382,387 **** --- 382,429 ---- return 1; } + /* Set the lock type on thing to boolexp. + * Used only on db load, when we can't safely test the player's + * permissions because they're not loaded yet. + */ + int + add_lock_raw(dbref player, dbref thing, lock_type type, struct boolexp *key, + int flags) + { + lock_list *ll, **t; + lock_type real_type = type; + + if (!GoodObject(thing)) { + return 0; + } + + ll = next_free_lock(); + if (!ll) { + /* Oh, this sucks */ + do_log(LT_ERR, 0, 0, "Unable to malloc memory for lock_list!"); + } else { + real_type = st_insert(type, &lock_names); + ll->type = real_type; + ll->key = key; + ll->creator = player; + if (flags == -1) { + const lock_list *l2 = get_lockproto(real_type); + if (l2) + ll->flags = l2->flags; + else + ll->flags = 0; + } else { + ll->flags = flags; + } + t = &Locks(thing); + while (*t && strcmp(L_TYPE(*t), L_TYPE(ll)) < 0) + t = &L_NEXT(*t); + L_NEXT(ll) = *t; + *t = ll; + } + return 1; + } + /* Very primitive. */ static void free_one_lock_list(lock_list *ll) *** 1_7_7.85/src/game.c Sun, 22 Dec 2002 01:18:53 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.3 660) --- 1_7_7.109(w)/src/game.c Mon, 06 Jan 2003 16:22:16 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.2 660) *************** *** 323,334 **** --- 323,341 ---- char tmpfl[2048]; FILE *f = NULL; + #ifndef WIN32 + ignore_signal(SIGPROF); + #endif + #ifdef I_SETJMP if (setjmp(db_err)) { /* The dump failed. Disk might be full or something went bad with the compression slave. Boo! */ do_rawlog(LT_ERR, T("ERROR! Database save failed.")); flag_broadcast(WIZARD | ROYALTY, 0, T("GAME: ERROR! Database save failed!")); + #ifdef HAS_ITIMER + install_sig_handler(SIGPROF, signal_cpu_limit); + #endif } else { local_dump_database(); *************** *** 401,406 **** --- 408,417 ---- #endif /* CHAT_SYSTEM */ } + #endif + #ifdef HAS_ITIMER + install_sig_handler(SIGPROF, signal_cpu_limit); + #endif } void *************** *** 617,622 **** --- 628,634 ---- command_init_preconfig(); config_file_startup(conf); command_init_postconfig(); + function_init_postconfig(); } int *** 1_7_7.85/src/function.c Mon, 23 Dec 2002 18:31:54 -0600 dunemush (pennmush/c/18_function.c 1.29.1.14.1.3.1.6.1.1.1.1.1.14.1.2.1.1.1.2 660) --- 1_7_7.109(w)/src/function.c Mon, 06 Jan 2003 16:22:14 -0600 dunemush (pennmush/c/18_function.c 1.29.1.14.1.3.1.6.1.1.1.1.1.14.1.2.1.1.1.4 660) *************** *** 4,9 **** --- 4,10 ---- #include #include #include + #include #include "conf.h" #include "attrib.h" #include "dbdefs.h" *************** *** 26,31 **** --- 27,33 ---- void func_hash_insert(const char *name, FUN *func); extern void local_functions(void); + USERFN_ENTRY *userfn_tab; HASHTAB htab_function; HASHTAB htab_user_function; *************** *** 566,572 **** } void ! init_func_hashtab() { FUNTAB *ftp; --- 568,574 ---- } void ! init_func_hashtab(void) { FUNTAB *ftp; *************** *** 578,583 **** --- 580,593 ---- local_functions(); } + void + function_init_postconfig(void) + { + userfn_tab = + (USERFN_ENTRY *) mush_malloc(MAX_GLOBAL_FNS * sizeof(USERFN_ENTRY), + "userfn_tab"); + } + int check_func(player, fp) dbref player; *************** *** 680,686 **** * User-defined global function handlers */ - USERFN_ENTRY userfn_tab[MAX_GLOBAL_FNS]; static Size_t userfn_count = 0; --- 690,695 ---- *************** *** 759,765 **** void do_function(dbref player, char *name, char *argv[]) { ! /* Command of format: @function =, * or @function =/ * Adds a new user-defined function. */ --- 768,774 ---- void do_function(dbref player, char *name, char *argv[]) { ! /* Command of format: @function =,[,,] * or @function =/ * Adds a new user-defined function. */ *************** *** 843,849 **** fp = func_hash_lookup(upcasestr(name)); if (!fp) { ! if (userfn_count >= MAX_GLOBAL_FNS) { notify(player, T("Function table full.")); return; } --- 852,858 ---- fp = func_hash_lookup(upcasestr(name)); if (!fp) { ! if (userfn_count >= (Size_t) MAX_GLOBAL_FNS) { notify(player, T("Function table full.")); return; } *************** *** 851,858 **** fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN"); fp->name = mush_strdup(name, "func_hash.name"); fp->where.offset = userfn_count; ! fp->minargs = 0; ! fp->maxargs = 10; fp->flags = 0; hashadd(name, fp, &htab_user_function); --- 860,882 ---- fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN"); fp->name = mush_strdup(name, "func_hash.name"); fp->where.offset = userfn_count; ! if (argv[3] && *argv[3]) { ! fp->minargs = parse_integer(argv[3]); ! if (fp->minargs < 0) ! fp->minargs = 0; ! else if (fp->minargs > 10) ! fp->minargs = 10; ! } else ! fp->minargs = 0; ! ! if (argv[4] && *argv[4]) { ! fp->maxargs = parse_integer(argv[4]); ! if (fp->maxargs < -10) ! fp->maxargs = -10; ! else if (fp->maxargs > 10) ! fp->maxargs = 10; ! } else ! fp->maxargs = 10; fp->flags = 0; hashadd(name, fp, &htab_user_function); *************** *** 873,887 **** return; } if (fp->flags & FN_BUILTIN) { /* Overriding a built in function */ ! if (userfn_count >= MAX_GLOBAL_FNS) { notify(player, T("Function table full.")); return; } fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN"); fp->name = mush_strdup(name, "func_hash.name"); fp->where.offset = userfn_count; - fp->minargs = 0; - fp->maxargs = 10; fp->flags = 0; userfn_count++; hashadd(name, fp, &htab_user_function); --- 897,909 ---- return; } if (fp->flags & FN_BUILTIN) { /* Overriding a built in function */ ! if (userfn_count >= (Size_t) MAX_GLOBAL_FNS) { notify(player, T("Function table full.")); return; } fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN"); fp->name = mush_strdup(name, "func_hash.name"); fp->where.offset = userfn_count; fp->flags = 0; userfn_count++; hashadd(name, fp, &htab_user_function); *************** *** 892,897 **** --- 914,936 ---- "userfn_tab.name"); userfn_tab[fp->where.offset].name = mush_strdup(upcasestr(argv[2]), "userfn_tab.name"); + if (argv[3] && *argv[3]) { + fp->minargs = parse_integer(argv[3]); + if (fp->minargs < 0) + fp->minargs = 0; + else if (fp->minargs > 10) + fp->minargs = 10; + } else + fp->minargs = 0; + + if (argv[4] && *argv[4]) { + fp->maxargs = parse_integer(argv[4]); + if (fp->maxargs < -10) + fp->maxargs = -10; + else if (fp->maxargs > 10) + fp->maxargs = 10; + } else + fp->maxargs = 10; notify(player, T("Function updated.")); } } *************** *** 1139,1176 **** first = 0; } ! *tp = '\0'; ! notify_format(player, T("Flags : %s"), tbuf); ! ! if (fp->flags & FN_BUILTIN) { ! maxargs = fp->maxargs; ! if (maxargs < 0) ! maxargs = -maxargs; ! tp = tbuf; ! ! if (fp->maxargs < 0) { ! safe_str(T("(Commas okay in last argument)"), tbuf, &tp); ! *tp = '\0'; ! } else ! tbuf[0] = '\0'; ! ! if (fp->minargs == maxargs) ! notify_format(player, T("Arguments : %d %s"), fp->minargs, tbuf); ! else if (fp->maxargs == INT_MAX) ! notify_format(player, T("Arguments : At least %d %s"), fp->minargs, tbuf); ! else ! notify_format(player, ! T("Arguments : %d to %d %s"), fp->minargs, maxargs, tbuf); ! } else { ! if (Global_Funcs(player)) ! notify_format(player, T("Location : #%d/%s"), ! userfn_tab[fp->where.offset].thing, ! userfn_tab[fp->where.offset].name); ! notify(player, T("Arguments : 0 to 10")); ! } } --- 1178,1207 ---- first = 0; } + *tp = '\0'; + notify_format(player, T("Flags : %s"), tbuf); + if (!(fp->flags & FN_BUILTIN) && Global_Funcs(player)) { + notify_format(player, T("Location : #%d/%s"), + userfn_tab[fp->where.offset].thing, + userfn_tab[fp->where.offset].name); + } + maxargs = abs(fp->maxargs); + tp = tbuf; + if (fp->maxargs < 0) { + safe_str(T("(Commas okay in last argument)"), tbuf, &tp); + *tp = '\0'; + } else + tbuf[0] = '\0'; ! if (fp->minargs == maxargs) ! notify_format(player, T("Arguments : %d %s"), fp->minargs, tbuf); ! else if (fp->maxargs == INT_MAX) ! notify_format(player, T("Arguments : At least %d %s"), fp->minargs, tbuf); ! else ! notify_format(player, ! T("Arguments : %d to %d %s"), fp->minargs, maxargs, tbuf); } *** 1_7_7.85/src/flags.c Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/c/20_flags.c 1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.2.1.1.1.1.1.2.2.2.2.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1.1.3.1.9.1.2.2.1.1.5 660) --- 1_7_7.109(w)/src/flags.c Mon, 06 Jan 2003 16:22:14 -0600 dunemush (pennmush/c/20_flags.c 1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.2.1.1.1.1.1.2.2.2.2.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1.1.3.1.9.1.2.2.1.1.2.1.1.1.2 660) *************** *** 690,709 **** if (IsThing(thing) && (f->type == TYPE_THING) && GoodObject(Location(thing)) && (hear || listener) && !Hearer(thing) && !Listener(thing)) { ! sprintf(tbuf1, T("%s is no longer listening."), Name(thing)); notify_except(Contents(Location(thing)), NOTHING, tbuf1); notify_except(Contents(thing), NOTHING, tbuf1); } if (IsRoom(thing) && (f->type == TYPE_ROOM) && (f->flag == ROOM_LISTEN) && !hear && !Listener(thing)) { ! sprintf(tbuf1, T("%s is no longer listening."), Name(thing)); notify_except(Contents(thing), NOTHING, tbuf1); } if ((f->flag == AUDIBLE) && (f->type == NOTYPE)) { switch (Typeof(thing)) { case TYPE_EXIT: if (Audible(Source(thing))) { ! sprintf(tbuf1, T("Exit %s is no longer broadcasting."), Name(thing)); notify_except(Contents(Source(thing)), NOTHING, tbuf1); } break; --- 690,716 ---- if (IsThing(thing) && (f->type == TYPE_THING) && GoodObject(Location(thing)) && (hear || listener) && !Hearer(thing) && !Listener(thing)) { ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("%s is no longer listening."), Name(thing)); ! *tp = '\0'; notify_except(Contents(Location(thing)), NOTHING, tbuf1); notify_except(Contents(thing), NOTHING, tbuf1); } if (IsRoom(thing) && (f->type == TYPE_ROOM) && (f->flag == ROOM_LISTEN) && !hear && !Listener(thing)) { ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("%s is no longer listening."), Name(thing)); ! *tp = '\0'; notify_except(Contents(thing), NOTHING, tbuf1); } if ((f->flag == AUDIBLE) && (f->type == NOTYPE)) { switch (Typeof(thing)) { case TYPE_EXIT: if (Audible(Source(thing))) { ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("Exit %s is no longer broadcasting."), ! Name(thing)); ! *tp = '\0'; notify_except(Contents(Source(thing)), NOTHING, tbuf1); } break; *************** *** 754,766 **** GoodObject(Location(thing)) && ((f->flag == THING_PUPPET) || (f->flag == THING_LISTEN)) && !hear && !listener) { ! sprintf(tbuf1, T("%s is now listening."), Name(thing)); notify_except(Contents(Location(thing)), NOTHING, tbuf1); notify_except(Contents(thing), NOTHING, tbuf1); } if (IsRoom(thing) && (f->type == TYPE_ROOM) && (f->flag == ROOM_LISTEN) && !hear && !listener) { ! sprintf(tbuf1, T("%s is now listening."), Name(thing)); notify_except(Contents(thing), NOTHING, tbuf1); } /* notify for audible exits */ --- 761,777 ---- GoodObject(Location(thing)) && ((f->flag == THING_PUPPET) || (f->flag == THING_LISTEN)) && !hear && !listener) { ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("%s is now listening."), Name(thing)); ! *tp = '\0'; notify_except(Contents(Location(thing)), NOTHING, tbuf1); notify_except(Contents(thing), NOTHING, tbuf1); } if (IsRoom(thing) && (f->type == TYPE_ROOM) && (f->flag == ROOM_LISTEN) && !hear && !listener) { ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("%s is now listening."), Name(thing)); ! *tp = '\0'; notify_except(Contents(thing), NOTHING, tbuf1); } /* notify for audible exits */ *************** *** 768,774 **** switch (Typeof(thing)) { case TYPE_EXIT: if (Audible(Source(thing))) { ! sprintf(tbuf1, T("Exit %s is now broadcasting."), Name(thing)); notify_except(Contents(Source(thing)), NOTHING, tbuf1); } break; --- 779,788 ---- switch (Typeof(thing)) { case TYPE_EXIT: if (Audible(Source(thing))) { ! tp = tbuf1; ! safe_format(tbuf1, &tp, T("Exit %s is now broadcasting."), ! Name(thing)); ! *tp = '\0'; notify_except(Contents(Source(thing)), NOTHING, tbuf1); } break; *** 1_7_7.85/src/extmail.c Sun, 22 Dec 2002 01:54:24 -0600 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5.1.9.1.2 660) --- 1_7_7.109(w)/src/extmail.c Mon, 06 Jan 2003 16:22:14 -0600 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5.1.9.1.1.1.2 660) *************** *** 415,421 **** /* print a mail message(s) */ struct mail *mp; ! char tbuf1[BUFFER_LEN]; char folderheader[BUFFER_LEN]; struct mail_selector ms; int j, folder; --- 415,421 ---- /* print a mail message(s) */ struct mail *mp; ! char tbuf1[BUFFER_LEN], *bp; char folderheader[BUFFER_LEN]; struct mail_selector ms; int j, folder; *************** *** 443,453 **** } else strcpy(folderheader, T("Folder:")); notify(player, DASH_LINE); if (IsPlayer(mp->from)) ! sprintf(tbuf1, "%s", Name(mp->from)); else ! sprintf(tbuf1, "%s (owner: %s)", Name(mp->from), ! Name(Owner(mp->from))); notify_format(player, T ("From: %-55s %s\nDate: %-25s %s %2d Message: %d\nStatus: %s"), --- 443,455 ---- } else strcpy(folderheader, T("Folder:")); notify(player, DASH_LINE); + bp = tbuf1; if (IsPlayer(mp->from)) ! safe_str(Name(mp->from), tbuf1, &bp); else ! safe_format(tbuf1, &bp, "%s (owner: %s)", Name(mp->from), ! Name(Owner(mp->from))); ! *bp = '\0'; notify_format(player, T ("From: %-55s %s\nDate: %-25s %s %2d Message: %d\nStatus: %s"), *** 1_7_7.85/src/db.c Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1.1.11 660) --- 1_7_7.109(w)/src/db.c Mon, 06 Jan 2003 16:22:13 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1.1.6.1.2 660) *************** *** 1021,1027 **** flags = parse_integer(val); /* boolexp */ b = getboolexp(f, type); ! add_lock(creator, i, type, b, flags); } } --- 1021,1027 ---- flags = parse_integer(val); /* boolexp */ b = getboolexp(f, type); ! add_lock_raw(creator, i, type, b, flags); } } *************** *** 1049,1055 **** /* getboolexp() would already have complained. */ return; } else { ! add_lock(Owner(i), i, buf, b, -1); } } ungetc(c, f); --- 1049,1055 ---- /* getboolexp() would already have complained. */ return; } else { ! add_lock_raw(Owner(i), i, buf, b, -1); } } ungetc(c, f); *** 1_7_7.85/src/conf.c Tue, 17 Dec 2002 16:03:37 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.2 660) --- 1_7_7.109(w)/src/conf.c Mon, 06 Jan 2003 16:22:13 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.2.1.2.1.1 660) *************** *** 327,332 **** --- 327,334 ---- {"queue_entry_cpu_time", cf_int, &options.queue_entry_cpu_time, 100000, 0, "limits"} , + {"max_global_fns", cf_int, &options.max_global_fns, 2000, 0, 0} + , #ifdef CHAT_SYSTEM {"max_channels", cf_int, &options.max_channels, 1000, 0, "chat"} *************** *** 924,929 **** --- 926,932 ---- options.max_guest_pennies = 100000; options.max_depth = 10; options.max_parents = 10; + options.max_global_fns = 50; options.purge_interval = 601; options.dbck_interval = 599; options.max_attrcount = 2048; *** 1_7_7.85/src/bsd.c Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.12.1.1.1.1.1.2.1.1.1.13.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.8.2.1.1.1.1.1.1.1.1.2.1.1.1.6 660) --- 1_7_7.109(w)/src/bsd.c Mon, 06 Jan 2003 16:22:13 -0600 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.12.1.1.1.1.1.2.1.1.1.13.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.8.2.1.1.1.1.1.1.1.1.2.1.1.1.7 660) *************** *** 4558,4564 **** (void) queue_attribute(player, "ACONNECT", player); if (ROOM_CONNECTS) { /* Do the room the player connected into */ ! if (IsRoom(loc)) { (void) queue_attribute(loc, "ACONNECT", player); } } --- 4558,4564 ---- (void) queue_attribute(player, "ACONNECT", player); if (ROOM_CONNECTS) { /* Do the room the player connected into */ ! if (IsRoom(loc) || IsThing(loc)) { (void) queue_attribute(loc, "ACONNECT", player); } } *************** *** 4636,4642 **** (void) queue_attribute(player, "ADISCONNECT", player); if (ROOM_CONNECTS) ! if (IsRoom(loc)) { (void) queue_attribute(loc, "ADISCONNECT", player); } if (GLOBAL_CONNECTS) { --- 4636,4642 ---- (void) queue_attribute(player, "ADISCONNECT", player); if (ROOM_CONNECTS) ! if (IsRoom(loc) || IsThing(loc)) { (void) queue_attribute(loc, "ADISCONNECT", player); } if (GLOBAL_CONNECTS) { *** 1_7_7.85/src/Makefile Mon, 18 Nov 2002 21:08:25 -0600 dunemush (pennmush/c/44_Makefile 1.21.1.11 700) --- 1_7_7.109(w)/src/Makefile Wed, 25 Dec 2002 16:09:28 -0600 dunemush (pennmush/c/44_Makefile 1.21.1.12 700) *************** *** 192,198 **** ../hdrs/patches.h: if [ ! -f ../hdrs/patches.h ]; then \ ! (cd ../utils; sh mkcmds.sh); \ fi ../po/pennmush.pot: $(C_FILES) $(H_FILES) --- 192,198 ---- ../hdrs/patches.h: if [ ! -f ../hdrs/patches.h ]; then \ ! (cd ../utils; sh mkcmds.sh patches); \ fi ../po/pennmush.pot: $(C_FILES) $(H_FILES) *** 1_7_7.85/hdrs/version.h Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.6 660) --- 1_7_7.109(w)/hdrs/version.h Mon, 06 Jan 2003 16:22:24 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.7 660) *************** *** 1,2 **** ! #define VERSION "PennMUSH version 1.7.7 patchlevel 3 [12/25/2002]" ! #define SHORTVN "PennMUSH 1.7.7p3" --- 1,2 ---- ! #define VERSION "PennMUSH version 1.7.7 patchlevel 4 [01/02/2003]" ! #define SHORTVN "PennMUSH 1.7.7p4" *** 1_7_7.85/hdrs/lock.h Wed, 20 Nov 2002 09:43:49 -0600 dunemush (pennmush/d/6_lock.h 1.13 660) --- 1_7_7.109(w)/hdrs/lock.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/6_lock.h 1.15 660) *************** *** 54,59 **** --- 54,61 ---- const lock_list *get_lockproto(lock_type type); int add_lock(dbref player, dbref thing, lock_type type, struct boolexp *key, int flags); + int add_lock_raw(dbref player, dbref thing, lock_type type, + struct boolexp *key, int flags); void free_locks(lock_list *ll); int eval_lock(dbref player, dbref thing, lock_type ltype); void do_unlock(dbref player, const char *name, lock_type type); *************** *** 64,82 **** void do_lset(dbref player, char *what, char *flags); const char *lock_flags(lock_list *ll); const char *lock_flags_long(lock_list *ll); - #define L_FLAGS(lock) ((lock)->flags) #define L_CREATOR(lock) ((lock)->creator) #define L_TYPE(lock) ((lock)->type) #define L_KEY(lock) ((lock)->key) #define L_NEXT(lock) ((lock)->next) - /* can p read/evaluate lock l on object x? */ int lock_visual(dbref, lock_type); #define Can_Read_Lock(p,x,l) \ (See_All(p) || controls(p,x) || ((Visual(x) || lock_visual(x, l)) && \ eval_lock(p,x,Examine_Lock))) - /* The actual magic cookies. */ extern const lock_type Basic_Lock; extern const lock_type Enter_Lock; --- 66,81 ---- *************** *** 101,107 **** extern const lock_type Dropto_Lock; /* Who follows the dropto of this room? */ extern const lock_type Destroy_Lock; /* Who can @dest me if I'm dest_ok? */ /* Declare new lock types here! */ - #include "boolexp.h" - #endif /* __LOCK_H */ --- 100,104 ---- *** 1_7_7.85/hdrs/game.h Tue, 17 Dec 2002 15:42:31 -0600 dunemush (pennmush/d/12_game.h 1.28.1.2.1.1.1.1.1.1.1.11 660) --- 1_7_7.109(w)/hdrs/game.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/12_game.h 1.28.1.2.1.1.1.1.1.1.1.7.1.2 660) *************** *** 159,164 **** --- 159,165 ---- /* From timer.c */ extern void init_timer(void); + extern void signal_cpu_limit(int signo); /* From version.c */ extern void do_version(dbref player); *** 1_7_7.85/hdrs/function.h Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/d/13_function.h 1.18 660) --- 1_7_7.109(w)/hdrs/function.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/13_function.h 1.20 660) *************** *** 30,38 **** #define FN_NOSIDEFX 0x800 - /* Number of user @functions */ - #define MAX_GLOBAL_FNS 50 - #ifndef HAVE_FUN_DEFINED typedef struct fun FUN; #define HAVE_FUN_DEFINED --- 30,35 ---- *************** *** 64,70 **** unsigned int flags; }; ! extern USERFN_ENTRY userfn_tab[MAX_GLOBAL_FNS]; extern void do_userfn(char *buff, char **bp, dbref obj, ATTR *attrib, --- 61,67 ---- unsigned int flags; }; ! extern USERFN_ENTRY *userfn_tab; extern void do_userfn(char *buff, char **bp, dbref obj, ATTR *attrib, *************** *** 85,91 **** extern void do_function_toggle(dbref player, char *name, int toggle); extern void do_function_report(dbref player, char *name); extern void do_function_delete(dbref player, char *name); ! #define FUNCTION_PROTO(fun_name) \ --- 82,88 ---- extern void do_function_toggle(dbref player, char *name, int toggle); extern void do_function_report(dbref player, char *name); extern void do_function_delete(dbref player, char *name); ! extern void function_init_postconfig(void); #define FUNCTION_PROTO(fun_name) \ *** 1_7_7.85/hdrs/externs.h Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8.2.1.1.2.1.1.1.1.1.2.1.6.1.3.1.4.2.6 660) --- 1_7_7.109(w)/hdrs/externs.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8.2.1.1.2.1.1.1.1.1.2.1.6.1.3.1.4.3.2 660) *************** *** 178,185 **** extern void do_move(dbref player, const char *direction, int type); extern void moveto(dbref what, dbref where); extern void safe_tel(dbref player, dbref dest, int nomovemsgs); ! extern dbref global_exit(dbref player, const char *direction); ! extern dbref remote_exit(dbref loc, const char *direction); extern void move_wrapper(dbref player, const char *command); extern void do_follow(dbref player, const char *arg); extern void do_unfollow(dbref player, const char *arg); --- 178,185 ---- extern void do_move(dbref player, const char *direction, int type); extern void moveto(dbref what, dbref where); extern void safe_tel(dbref player, dbref dest, int nomovemsgs); ! extern int global_exit(dbref player, const char *direction); ! extern int remote_exit(dbref loc, const char *direction); extern void move_wrapper(dbref player, const char *command); extern void do_follow(dbref player, const char *arg); extern void do_unfollow(dbref player, const char *arg); *** 1_7_7.85/hdrs/conf.h Sun, 22 Dec 2002 18:12:18 -0600 dunemush (pennmush/d/20_conf.h 1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.5.1.1.1.1.1.1.1.1.1.2.1.1.2.1.2.13.1.4 660) --- 1_7_7.109(w)/hdrs/conf.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/20_conf.h 1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.5.1.1.1.1.1.1.1.1.1.2.1.1.2.1.2.13.1.4.1.1 660) *************** *** 220,225 **** --- 220,226 ---- int player_name_len; int queue_entry_cpu_time; int ascii_names; + int max_global_fns; }; extern OPTTAB options; *************** *** 346,352 **** #define TINY_MATH (options.tiny_math) #define NEWLINE_ONE_CHAR (options.newline_one_char) #define ONLY_ASCII_NAMES (options.ascii_names) ! /* Compiler-specific stuff. */ --- 347,353 ---- #define TINY_MATH (options.tiny_math) #define NEWLINE_ONE_CHAR (options.newline_one_char) #define ONLY_ASCII_NAMES (options.ascii_names) ! #define MAX_GLOBAL_FNS (options.max_global_fns) /* Compiler-specific stuff. */ *** 1_7_7.85/Makefile.SH Wed, 30 Oct 2002 14:50:55 -0600 dunemush (pennmush/d/30_Makefile.S 1.14.1.1.1.7 700) --- 1_7_7.109(w)/Makefile.SH Wed, 25 Dec 2002 16:09:28 -0600 dunemush (pennmush/d/30_Makefile.S 1.14.1.1.1.8 700) *************** *** 60,66 **** @echo "Making all in src." (cd src; make all "CC=$(CC)" "CCFLAGS=$(CCFLAGS)" \ "LDFLAGS=$(LDFLAGS)" "CLIBS=$(CLIBS)" "MAKE=$(MAKE)" \ ! "MAKEFLAGS=$(MAKEFLAGS)"; rm -f ../hdrs/timestamp) @echo "If the make was successful, use 'make install' to install links." config.h: Configure --- 60,66 ---- @echo "Making all in src." (cd src; make all "CC=$(CC)" "CCFLAGS=$(CCFLAGS)" \ "LDFLAGS=$(LDFLAGS)" "CLIBS=$(CLIBS)" "MAKE=$(MAKE)" \ ! "MAKEFLAGS=$(MAKEFLAGS)") @echo "If the make was successful, use 'make install' to install links." config.h: Configure *************** *** 74,92 **** exit 1 hdrs/cmds.h: src/cmds.c src/command.c src/cque.c src/help.c src/set.c ! (cd utils; sh mkcmds.sh) hdrs/switches.h: src/SWITCHES ! (cd utils; sh mkcmds.sh) ! src/switchinc.c: src/SWITCHES ! (cd utils; sh mkcmds.sh) ! hdrs/funs.h: src/fun*.c ! (cd utils; sh mkcmds.sh) hdrs/patches.h: patches/* ! (cd utils; sh mkcmds.sh) install: localized all -rm -f game/netmush --- 74,92 ---- exit 1 hdrs/cmds.h: src/cmds.c src/command.c src/cque.c src/help.c src/set.c ! (cd utils; sh mkcmds.sh commands) hdrs/switches.h: src/SWITCHES ! (cd utils; sh mkcmds.sh switches) ! #src/switchinc.c: hdrs/switches.h ! # (cd utils; sh mkcmds.sh switches) ! hdrs/funs.h: src/fun*.c src/bsd.c src/conf.c src/extmail.c src/help.c src/wiz.c ! (cd utils; sh mkcmds.sh functions) hdrs/patches.h: patches/* ! (cd utils; sh mkcmds.sh patches) install: localized all -rm -f game/netmush *************** *** 222,228 **** gzip /tmp/dist.tar dist.tar: distclean versions - -rm -f hdrs/timestamp (cd utils; sh mkcmds.sh) makedist -c pennmush tar -cvf /tmp/dist.tar pennmush --- 222,227 ----