diff -BburpN --exclude=.svn tbamud-3.51/changelog tbamud-3.52/changelog
--- tbamud-3.51/changelog	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/changelog	2007-04-20 16:47:41.000000000 +0200
@@ -0,0 +1,356 @@
+TbaMUD is currently being developed by The Builder Academy. If you need any
+help, find any bugs, or have ideas for improvement please stop by TBA. 
+Rumble
+The Builder Academy
+builderacademy.net 9091
+ 
+tbaMUD 3.52
+[Apr 14 2007] - Rumble
+  IP's only visible to LVL_GOD and above now for the paranoid people out there.
+[Apr 13 2007] - Rumble
+  Finally made gemote actually work like emote and not just use socials. (thanks Fizban)
+  Reworded and standardized the trigedit attachment menu.
+  Numerous minor fixes taken from the latest CWG release. (thanks Zizazat)
+  Update to is_number to check for negative numbers. (thanks Kyle)
+  Update to isname to disallow abbreviated numbers. (thanks Sryth)
+[Apr 08 2007] - Rumble
+  Removed all usage of CAP(str) causing a memory leak (thanks Kyle).
+  Removed object type TRAP.
+  Removed oasis_delete.h.
+  Renamed variable wovel to vowel in ban.c.
+  Renamed several functions to lower case.
+[Apr 02 2007] - Rumble
+  Stopped Checking abbrevs with doors so players can't spam open a, open b, etc.
+  Added questpoints!
+[Mar 30 2007] - Rumble
+  Added unlimited fountains and containers (Thanks Adam Scriven).
+  Removed object types MISSILE and FIRE WEAPON.
+  Removed the do_oasis function and called the Xedit commands directly (thanks Rhade).
+[Mar 25 2007] - Rumble
+  Updated idle timer to keep track of imms too (thanks Jamdog).
+  Standardized OLC messages.
+  Updated README.WIN, README.MSVC8, and README.CYGWIN.
+[Mar 20 2007] - Rumble
+  Added object type FURNITURE (thanks Dark).
+  Added ZZZ directories to plrfiles and plrvars (thanks Zizazat).
+  Added 00 files to plrfiles directories (thanks Khorlane).
+  Added mail check at reconnect and when coming back from AFK.
+[Mar 19 2007] - Rumble
+  Added JamDog's updated levenshtein_distance that compiles clean with MSVC++.
+  Added AFK to player L-desc.
+  Cleaned up the code by running it through a g++ compiler (thanks Rhade).
+  Added AFK to the prompt.
+  Stop snooping at do_quit to prevent snooping of passwords on deletion or password reset.
+[Mar 17 2007] - Rumble
+  Fixed locate object spell (thanks JamDog).
+  Added plist and and improved history command (thanks Rhade).
+  Renamed immort_level_ok to no_mort_to_immort and rewrote the convuluted comments.
+[Mar 04 2007] - Rumble
+  Fixed fight_messages not displaying (thanks Rhade).
+  Removed LVL_FREEZE and set ban/freeze to LVL_GRGOD.
+  Added send_cannot_edit function (thanks Rhade).
+[Feb 26 2007] - Rumble
+  updated CYGWIN.README, FAQ, and README
+  Added an in game changelog command (thanks Rhade).
+  Moved do_file to act.wizard.c.
+  Alphabetized Makefile.in, yeah I'm anal like that.
+  Clarified licheck so people know to enter Q to accept the license and quit.
+[Feb 25 2007] - Rumble
+  Fixed oat and wat (thanks Rhade).
+  Numerous social fixes (thanks Rhade, Fizban, and Amber).
+  Removed do_insult.
+  Cleaned up hedit formatting and fixed possible bug from editing a help file
+    you can't view (thanks Rhade).
+  Fixed cast ' ' so it won't cast armor (thanks Rhade).
+ 
+tbaMUD 3.51
+- Removed the extra space when you have no title (thanks Rhade).
+- Added "Top of File" to the do_file command (thanks Rhade).
+- Removed socials from wizhelp (thanks Rhade).
+- Changed zlist with no arg to list zones (thanks Rhade).
+- Wiznet can now be seen while in OLC, again (thanks Fizban).
+- Removed MOBprograms.
+- Added ALL_PERMISSIONS so anyone with OLC can have access to the entire World.
+  Included set <player> olc all. (thanks Rhade).
+- Fixed color bleeding from listing consecutive mobs (yellow) and objs(green)
+  in room or vice versa (thanks Rhade).
+- Removed trg/index double entries (thanks Fizban).
+- Cleaned up search_help and do_helpcheck. Now using player level instead of 
+  the entire char structure (thanks Rhade).
+- Fixed do_sstat_room so stat can display more than just the room you are 
+  standing in (thanks Rhade).
+- Fixed crash if you try to boot the game without a shop (thanks Rhade).
+- Added online mail notification, "You have mail." as soon as mudmail is sent
+  (thanks JamDog) and when coming back from afk (thanks Rhade).
+- Removed strip_string function; strip_cr does the same thing (thanks Rhade).
+- Released tbaMUD3.51rc.
+- Limited trigedit numeric arg to 0-100.
+- Removed the magic numbers for setting DRUNK, HUNGER, THIRST. 
+- Renamed FULL to HUNGER.
+- Changed page to level 1.
+- Snooping log message is now only visible by higher imms.
+- Moved nohassle, holylight, showvnums, color, compact, syslog, poofin, 
+  poofout, and autoexit to toggle <option>.
+- Added "Did you mean" to unknown commands instead of Huh?!? (thanks Rhade).
+- Updated do_set Alphabetically. Removed set idnum & lessons (practice still 
+  there). Can no longer set level to 0 (thanks Fizban).
+- Added autoloot, autogold, autosplit, autosac, and autoassist.
+- Removed all whitespace (tabs and spaces at EOL).
+- Added years to messages (thanks Rhade).
+- Updated version and files to new name: tbaMUD!
+- Renamed medit_alias and oedit_namelist to _keyword for consistency.
+- Moved numerous protos only used once from .h files to appropriate .c file
+  (thanks Del).
+- Renamed numerous functions for clarity (mostly shop functions like copy_list
+  to copy_shop_list, etc) (thanks Del).
+- Renamed update_objects to update_all_objects so it wouldn't be confused with
+  update_object (thanks Del).
+- Renamed data to dg_data in function queue_head in dg_event.c for clarity
+  (thanks Del).
+- Moved function log_death_trap to a log since that is all it did anyways
+  (thanks Del).
+- Renamed unmatched gettimeofday protos  (thanks Del).
+- Renamed oasis_copy.o and oasis_list.o to appropriate .c for CXREF_FILES.
+- Fixed a bunch of strange bugs in objsave.c and altered build_player_index() 
+  to conform to gcc 4.1 standards. This mainly consisted of removing a cast 
+  which was not needed. 
+- Replaced kill_ems() with strip_cr(), for consistency.
+- Updated Makefile.*.
+- Removed redundant olc.c, oasis_delete.c, olc.h and tedit.h files from the 
+  build. Added prototypes for the new variable save functions to players.c
+- DG script variables now save to the player file instead of their own file. 
+  The load function has been kept for backwards compatibility.
+- Moved alias saving to Ascii pflies by default. Aliases in the old files will 
+  still be read (once per char).
+- do_toggle actually toggles everything now (thanks Rhade). Moved slowns, 
+  track, syslog, pagelength, wimpy, and color to toggle <option> <arg>. Keeping
+  do_gen_tog so the old command toggles still work.
+- Immortals no longer have to pay to mudmail.
+- Autosaved aliases.
+- Added afk to do_set.
+- Removed unused olc_bitvector and save_etext functions.
+- Added min_level check to hindex.
+- Fixed zlist and index files 
+- Renamed roomflags to showvnums.
+- Mini world zone 0, 12, 30 error free (Added 1.trg to index.mini for examples)
+- Updated errors for no time/config files.
+- Added -l(eader) and -g(rouped) options to do_who (thanks Rhade).
+- Added MERC license and help entry.
+- Spellchecked stock.hlp.
+- Updated fixes from 3.1 CVS snapshot.
+- Fixed permissions on numerous files.
+- Renamed shit. No really; in zmalloc.c unsigned char * shit;
+- Spellchecked help.hlp.
+- Updated /doc/README.Cygwin.
+- Updated /doc/syserr.txt (much more to do though, along with all /doc, 
+  submissions welcome).
+- Modified all comments referring to old playerfile and removed obsolete code.
+- Removed .accepted, conf.h, and Makefile. 
+- Moved text/hedit to text/help directory. Now 2 help files to choose from 
+  help.hlp (TBA's helpfiles) and the oldhelp directory.
+- Fixed error from adding poofs to do_stat and not checking !IS_NPC.
+- Fixed help search so it checks player level so HELP AC can exist as a mortal
+  helpfile and an immortal helpfile.
+- Fixed hindex to check help entry level.
+- Added house saving call to do_saveall.
+ 
+CircleMUD 3.5
+- New do_who by Rhade.
+- Core files generated with unique time stamp.
+- Updated README, FAQ, news.
+- Removed all CIRCLEMUD_VERSION and #IF 0 debugging checks.
+- Renamed _DEAF to _NOSHOUT.
+- Added greetings, ihelp, wizlist, and immlist to tedit.
+- Changed all usage of dscr to desc for standardization.
+- Increased PLR_DESC_LENGTH from 240 to 512.
+- Renamed EXDSCR_LENGTH and CON_EXDESC to PLR_DESC_LENGTH and CON_PLR_DESC.
+- Moved lastlist (lists entire last file) to last *.
+- Removed edit command.
+- Fixed everything so MUD would load error free in mini mode.
+- Moved cheat to return. If not in a mob typing return will advance you to the
+  level specified in do_cheat. IDNUM 1 advanced to IMPL
+- Changed OLC to default to off, again.
+- Added Ascii Pfiles V3.0.1
+- Added pagelength to toggle.
+- Update to list_obj_to_char for object stacking and iedit objects.
+- Increased MAX_STRING_LENGTH to 49152.
+- Moved poofin/out to set self poofin/out. 
+- Removed poofs command, poofs can be viewed under stat or score.
+- Isname updates.
+- Added mob/obj delete.
+- Update to delete_room to remove the room from the htree.
+- Counts colorcodes now when formatting in the text editor.
+- Update to create_new_zone to correct buildwalk issues after a new zone is created.
+- Added zpurge, checkload and zcheck Immortal commands.
+- Doubled MAX_INPUT_LENGTH to 512.
+- Usage: attach { mtr | otr | wtr } { trigger } { name } [ location ]
+- Usage: detach [ mob | object | room ] { target } { trigger | 'all' }
+- Added show zone <name> option.
+- Added look around command.
+- Fixed hidden object stacking.
+- Added vnum room/trig options to search by name.
+- Added hedit, helpcheck and hindex. Plus seperate imm/mort screens.
+- Added hidden mobs. medit-l-desc beginnin with a period (.) can only be seen 
+  with holylight.
+- Update to zreset and do_links.
+- Added paragraph option in the text editor /f 4-8 to make a para lines 4-8.
+- Object stacking fix, only stack if they are the same vnum AND short descr.
+- Update to do_hit to prevent crash if the player is AFF_CHARM somehow without 
+  a master.
+- Added Did you mean? to non-existing helpfile query.
+- Added TBA's donated zones to stock.
+- DG Scripts 1.0.14.
+- Set OLC options #, aedit, hedit, off.
+- Updates to parse_object, oedit_disp_perm_menu and oedit_parse to remove the 
+  ability of setting AFF_CHARM as on object perm affect. Setting this on a 
+  player (without having a clearly defined MASTER) causes a crash.
+- Added social gossip bug fix in do_gen_comm to give commands priority.
+- Did away with the #ifndef STOCK_CIRCLE tags.  
+- Removed some unused code from cedit_creation.
+- Update MAX_STRING_SIZE.
+- Update to do_gen_comm to make gemote and gossip behave the same for socials.
+- Update to do_gen_comm to remove SYSERRs generated while switched into mobs.
+- Update to SPECIAL(shop_keeer) so that MSG_NO_STEAL_HERE is sent TO_ROOM as 
+  well as TO_CHAR.
+- Update to zedit_parse.
+- Expanded zones to unsigned int. NOWHERE/corpse is now 65535, not -1
+- Added PRF_AFK.
+- Updated load_zones to fix reported bug with behavior of the 'Set a global 
+  variable' zedit command.
+- Replaced calls for ch|vict|obj->in_room to IN_ROOM(ch|vict|obj). Use of 
+  the macro is better.
+- Autosave everything except Buildwalk, dig, and rdelete.
+- Corrected minor typo in parse_class which is part of stock Circle 3.1.
+- Updates to free_room_strings, free_room, and free_srings.
+- Change to free_strings() in oasis_delete.c related to freeing extra descs.
+- Also made changes to copyover/saved room code for more logical behavior.
+- Removed @ as save character in the text editor since it is a color code.
+- Update to do_dig.
+- Change to remove_unique_id to plug mem leek.
+- Changes in dg_comm.c!
+- Added look_in_obj fix which was causing conflicts between room keywords and 
+  object keywords. 
+- Changed to unsigned int to double zones.
+- Added some missing dg_scripts related logic to save_char.
+- Added do_gemote command which allows you to emote over the gossip channel.
+- Changed the color code character from '&' to '@'. 
+- Fixed color bleeding in all the lists.
+- Added IMM command peace to stop all fighting in that room.
+- Fix for LOADROOM and copyover conflicts.
+- Changed copyover to save room player was in.
+- Made an option so shopkeepers never go broke.
+- Added Welcor's manual_color update with numerous updates.
+- replaced numerous special procedures with triggers (still some to go).
+- Removed leftover debug message from dg_mobcmd.c
+- Removed duplicate code in zedit.c related to who can do zone edits.
+- Corrected logic in object get code which was out of order.
+- Fix to read_mobile in db.c, was causing mobs to be assigned triggers twice.
+- Fixed /fi to not add two spaces after quoted "text."
+- Patched in Oasis 2.0.6
+- Set OLC to off on immortal advance
+- Changes in enter_player_game to use calls from CONFIG_ defs used by CEDIT. 
+- Fixes to redit.c for ROOM FLAGS.
+- Added objstacking.
+- Changed valid_dg_target to allow everyone to trigger except IMPL
+- Change to save_char related to problems with the copyover function.
+- Fixed buildwalk from continuing into next zone.
+- Added Aedit, Astat, and over 100 new socials.
+- Replaced all ch->in_room calls with IN_ROOM(ch) for general cleanliness.
+- Changed default olc to be -1 not 0.
+- Wiznet is now visible in OLC.
+- Added hidden objs. oedit-l-desc beginnin with a period (.) can only be seen 
+  with holylight.
+- Fixed tilde in room desc crash (and other world files).
+- Fixed socials taking precedence over commands and not allowing abbrevs.
+- Changed do_simple_move so players couldn't find hidden exits by trying to 
+  walk into them.
+- Fixed shopkeepers so they could sell just one item.
+- Fixed oedit where it did not recognize any change when modifying just weight
+  or values.
+- Some minor changes to redit in the way it interacts with door flags.
+- Added online dictionary. Tell m-w <word>.
+- Bugfix for enchant_weapon spell.
+- Added LVL_BUILDER.
+- Bugfix for locate_object spell.
+- Fixed all the OLC crashes from large numbers. Weight, cost, max contain, exp,
+  gold, and fountain contains to name a few.
+- Save room on copyover reboot.
+- Dg_scripts update to calls in spell_recall and spell_teleport.
+- Fixed mhunt.
+- Made all imm commands requiring zone # default to current zone if no arg.
+- Add formatting for trigedit. /f indents to make things easier to read.
+- Zero level mobs are set to level 1 in db.c.
+- Added links command.
+- Fixed social bodyparts.
+- Added mail saving.
+- Fixed Enter spell (0 for none): having 0 spell causes error, should be -1.
+- Added /r/n to "gate is closed from the other side" and "cool immortal."
+- Fixed variable file not deleting at player deletion.
+- Fixed the 2 shopkeepers one room crash.
+- Fixed colorcodes preventing capitalization.
+- Fixed /f, /fi creating an extra line.
+- Made object values reset when type is changed.
+- Added vdelete [*].
+- Fixed where so players in OLC would be listed.
+- The weapon dice check now works.
+- All olc files uses the can_edit_zone() function where appropriate.
+- Added OLC permissions to attach and detach.
+- Made it possible  to use one shopkeeper for more than one shop.
+- Restore skills and spells on advancement.
+- Added context help system, lib/text/contexthelp.
+- Fixed sedit crash caused by deleting room that where shops.
+- Added don't parse character \, use %% for %.
+- Fixed rdelete crash from deleting a room that is linked to itself.
+- Fixed exits to default to -1 instead of 0 when just making an edit desc.
+- Added a warning if a NOTE has an extra desc.
+- Fixed practice to show skills with 0 practices remaining.
+- Added file <option> to view logs.
+- Added several new names to the xnames file.
+- Added copyover.
+- Improved the last command.
+- Added switched people to the who list.
+- Added zedit commands to stat room.
+- Added triggers and shops to show stat.
+- Added more info to all the vstat options.
+- Added invis level at login to prevent greeting imms who are hiding.
+- Added delete option to extra desc's. Just /c.
+- Added history command to show last 100 comms.
+- Added an export command that would QQ and compress a zone.
+- Numerous new logs for force, buildwalk, delete, snoop, etc.
+- Added vnum and TRIG tags to everything, showvnums toggles it on/off.
+- Added keyword seperation when statting extra desc. [desk] [notes papers]
+- Added buildwalk and dig.
+ 
+Release history:
+Version 3.52 release: April, 2007
+Version 3.51 release: February, 2007
+Version 3.5 release: December, 2006
+Version 3.1  (yes, no beta pl): November 18, 2002
+Version 3.00 beta pl22 release: October 4, 2002
+Version 3.00 beta pl21 release: April 15, 2002
+Version 3.00 beta pl20 release: January 15, 2002
+Version 3.00 beta pl19 release: August 14, 2001
+Version 3.00 beta pl18 release: March 18, 2001
+Version 3.00 beta pl17 release: January 23, 2000
+Version 3.00 beta pl16 release: August 30, 1999
+Version 3.00 beta pl15 release: March 16, 1999
+Version 3.00 beta pl14 release: July 3, 1998
+Version 3.00 beta pl13a release: June 4, 1998
+Version 3.00 beta pl13 release: June 1, 1998
+Version 3.00 beta pl12 release: October 29, 1997
+Version 3.00 beta pl11 release: April 14, 1996
+Version 3.00 beta pl10 release: March 11, 1996
+Version 3.00 beta pl9 release: February 6, 1996
+Version 3.00 beta pl8 release: May 23, 1995
+Version 3.00 beta pl7 release: March 9, 1995
+Version 3.00 beta pl6 release: March 6, 1995
+Version 3.00 beta pl5 release: February 23, 1995
+Version 3.00 beta pl4 release: September 28, 1994
+Version 3.00 beta pl1-3, internal releases for beta-testers.
+Version 3.00 alpha: Ran on net for testing.  Code not released.
+Version 2.20 release: November 17, 1993
+Version 2.11 release: September 19, 1993
+Version 2.10 release: September 1, 1993
+Version 2.02 release: Late August 1993
+Version 2.01 release: Early August 1993
+Version 2.00 release: July 16, 1993 (Initial public release)
diff -BburpN --exclude=.svn tbamud-3.51/doc/README.CYGWIN tbamud-3.52/doc/README.CYGWIN
--- tbamud-3.51/doc/README.CYGWIN	2007-02-24 22:36:46.000000000 +0100
+++ tbamud-3.52/doc/README.CYGWIN	2007-04-20 16:46:10.000000000 +0200
@@ -1,16 +1,14 @@
-The README.Cygwin that comes with CircleMUD is outdated. Below is current and
-works as of December 2006.
-
-                          Compiling CircleMUD
+Updated: Apr 2007
+                            Compiling tbaMUD
                   under Microsoft Windows using CygWin
 
-CircleMUD 3.1 compiles under Cygwin without needing any special modifications.
+tbaMUD compiles under Cygwin without needing any special modifications.
 This free pseudo-Unix environment for Windows includes the "bash" shell, "gcc"
 family of compilers, and a full set of programs and libraries for Windows users
 to compile and run programs from source code intended for Unix. It can be
 downloaded from: http://cygwin.com/
 
-Compiling Circle under Cygwin is basically the same as it would be under
+Compiling tbaMUD under Cygwin is basically the same as it would be under
 another form of Unix:
 
 1) Download from: http://cygwin.com/setup.exe
@@ -23,20 +21,38 @@ another form of Unix:
    Click Next.
    Install, follow prompts.
 
-2) Download and uncompress the latest version of CircleMUD. TBA is now 
-   recommending everyone use CWG (CircleMUD With Goodies) Buddha since it comes
-   pre-packaged with many important features like OLC and Trigedit. Join the 
-   forum and download Buddha at: http://cwg.lazuras.org/ The forums will 
-   also be a great resource for any problems that come up. Once you download 
-   and uncompress Buddha (I use winRAR) read through the /doc directory.
+2) Download and uncompress the latest version of tbaMUD:
+   http://cwg.lazuras.org/modules.php?name=Downloads&d_op=viewdownload&cid=16
+   Join the forums as they will be a great resource for any problems that you
+   encounter. Once you download and uncompress tbaMUD (I use winRAR) read 
+   through the /doc directory.
 
 3) Start the Cygwin "bash" shell by double clicking the Cygwin Icon. This will 
    open a telnet looking window that mimics a *nix server where you can run the
-   MUD. Go to the directory where you extracted CircleMUD by using the "cd" change
+   MUD. Go to the directory where you extracted tbaMUD by using the "cd" change
    directory command and "dir" directory listing to find the correct files. For
-   example "C:\circle". "cd c:/circle" "dir" in the listed files you should see 
+   example "C:\tbaMUD". "cd c:/tbaMUD" "dir" in the listed files you should see 
    one called configure. DO NOT go into the SRC directory yet.
 
+OPTIONAL: Make the following change to src/Makefile.in to make copyover work:
+
+	--- Makefile.in.old 2007-02-26 05:52:19.000000000 +0100
+	+++ Makefile.in     2007-03-26 17:21:56.000000000 +0200
+	@@ -61,6 +61,8 @@ circle:
+	        $(MAKE) $(BINDIR)/circle
+
+	 $(BINDIR)/circle : $(OBJFILES)
+	+       @-rm $(BINDIR)/circleold.exe
+	+       @-mv $(BINDIR)/circle.exe $(BINDIR)/circleold.exe
+	        $(CC) -o $(BINDIR)/circle $(PROFILE) $(OBJFILES) $(LIBS)
+
+	 clean:
+
+   The above is a "patch" file. All you need to do is add the two lines with
+   the +'s to your file Makefile.in. If you are still confused check out these
+   links on how to patch: http://www.circlemud.org/cdp/wtfaq/handpatch.html
+   http://cwg.lazuras.org/modules.php?name=Forums&file=viewtopic&t=757
+
 4) Run the configure script by typing "./configure".  This will automatically 
    detect what programs and library functions are available, and create the 
    files "Makefile" and "conf.h" based on the results.
@@ -46,12 +62,12 @@ another form of Unix:
    an executable, you can also try "sh configure", "sh ./configure",
    "bash configure" and "bash ./configure" until one of them works.
 
-5) NOW change to the /circle/src directory "cd src", and type "make", and watch
-   CircleMUD and the additional utilies included in the Circle distribution
-   automatically being compiled and placed in /circle/bin.
+5) NOW change to the /tbaMUD/src directory "cd src", and type "make", and watch
+   tbaMUD and the additional utilities included in the tbaMUD distribution
+   automatically being compiled and placed in /tbaMUD/bin.
 
-6) Go back to /circle, and run the MUD either directly by typing
-   "bin/circle", or by using the "./autorun &" script.
+6) Go back to /tbaMUD, and run the MUD either directly by typing
+   "bin/tbaMUD", or by using the "./autorun &" script.
 
 7) Start a telnet program.  Open a connection to your own machine "localhost"
    on port 4000.  You should see the MUD's login screen welcoming you. The
@@ -59,22 +75,15 @@ another form of Unix:
 
 If you have problems, read this document again.  Most of the questions received
 in email or which are posted to USENET newsgroups are answered in this file, or 
-in other documents included in the CircleMUD distribution.  If you are still 
+in other documents included in the tbaMUD distribution.  If you are still 
 having problems and you're *sure* that your question is not answered in this 
-document or in one of the others files in the /circle/doc directory, try 
-reading the through the CircleMUD website at: http://www.circlemud.org
-It really can not be stressed enough: READ EVERYTHING.
+document or in one of the others files in the /tbaMUD/doc directory, try 
+reading the forums at http://cwg.lazuras.org/ or stop by TBA for assistance.
 
-Credit where credit is due:
+It really can not be stressed enough: READ EVERYTHING.
 
-Some parts of this document have been derived or outright copied from other
-files in the CircleMUD distribution by:
-Jeremy Elson
-David Goldstein
-Tony Robbins
-George Greer
+Authors: Jeremy Elson, David Goldstein, Tony Robbins, and George Greer.
 
 Rumble
-Rumble@@builderacademy.net 
 The Builder Academy
 builderacademy.net 9091
diff -BburpN --exclude=.svn tbamud-3.51/doc/README.MSVC8 tbamud-3.52/doc/README.MSVC8
--- tbamud-3.51/doc/README.MSVC8	2007-02-24 22:36:46.000000000 +0100
+++ tbamud-3.52/doc/README.MSVC8	2007-04-20 16:46:10.000000000 +0200
@@ -1,3 +1,4 @@
+Updated: Apr 2007
                  Compiling CircleMUD under Microsoft Windows XP
                      using Microsoft Visual C++ 2005 (8.0)
 
@@ -69,3 +70,16 @@ greerga@circlemud.org
 
 Jason Pullara
 webmaster@geekstreak.com
\ No newline at end of file
+
+To eliminate warnings like these:
+  warning C4996: 'strcpy': This function or variable may be unsafe.
+  warning C4996: 'getch': The POSIX name for this item is deprecated.
+Do this:
+  In Solution Explorer
+  Right click the 'project'
+  Select 'Properties' which brings up the Property Pages dialog
+  Expand 'Configuration Properties'
+  Expand 'C/C++'
+  Click on Preprocessor
+  At the end of the 'Preprocessor Definitions' add:
+  ;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE 
diff -BburpN --exclude=.svn tbamud-3.51/doc/README.WIN tbamud-3.52/doc/README.WIN
--- tbamud-3.51/doc/README.WIN	2007-02-24 22:36:46.000000000 +0100
+++ tbamud-3.52/doc/README.WIN	2007-04-20 16:46:10.000000000 +0200
@@ -1,52 +1,38 @@
-                           Compiling CircleMUD
-                    under Microsoft Windows 95 and NT
-                             by Jeremy Elson
-                  For help, write to help@circlemud.org
+Updated: Apr 2007
+                           Compiling tbaMUD
+                        under Microsoft Windows
+
+There are a number of different compilers available for Microsoft Windows that 
+can be used to compile tbaMUD.  Each compiler works differently, so each 
+compiler has a different set of instructions.
 
+We currently have instructions for using the following compilers:
 
-There are a number of different compilers available for Microsoft Windows
-95 and NT that can be used to compile CircleMUD.  Each compiler works
-differently, so each compiler has a different set of instructions.
+1.  Cygnus CYGWIN (Formerly Cygnus GNU-Win32).  This is a FREE compiler for 
+Microsoft Windows!  If you don't own a compiler, you can just download this 
+one off the net and get tbaMUD up and running in no time.  Read the file 
+README.CYGWIN.
 
-For up-to-date information on compiling CircleMUD under Windows, check out 
-Rob Baumstark's page at http://shirak.circlemud.net/
+2.  Microsoft Visual C++ version 4.x -- read the file README.MSVC4.
 
+3.  Microsoft Visual C++ version 5.x -- read the file README.MSVC5.
 
-We currently have instructions for using the following compilers:
+4.  Microsoft Visual C++ version 6.x -- read the file README.MSVC6.
+
+5.  Microsoft Visual C++ version 8.x -- read the file README.MSVC8. This is 
+    also called Microsoft Visual C++ 2005 and the express edition is free and 
+    can be downloaded from Microsoft.
+
+6.  Borland C++ -- read the file README.BORLAND
+
+7.  Watcom C++ v.11 -- read the file README.WATCOM
 
-1.  Cygnus CYGWIN (Formerly Cygnus GNU-Win32).  This is a FREE
-    compiler for Microsoft Windows 95 and NT!  If you don't own a
-    compiler, you can just download this one off the net and get
-    Circle up and running in no time.  Read the file README.CYGWIN
-    (submitted by David Goldstein <goldstei@cs.sunysb.edu>).
-    Please note however that the CYGWIN system is not recommended
-    for those unfamiliar with the Unix environment.
-
-2.  Microsoft Visual C++ version 4.x -- read the file README.MSVC4
-
-3.  Microsoft Visual C++ version 5.x -- read the file README.MSVC5
-
-4.  Borland C++ -- read the file README.BORLAND
-
-5.  Watcom C++ v.11 -- read the file README.WATCOM
-
-
-It should be possible to compile CircleMUD using other compilers that are
-not listed here, or other versions of these compilers -- as long as they
-support long filenames, etc.  However, we don't have instructions handy
-for those compilers.  Rob's page (http://www.connect.ab.ca/~rbmstrk) has
-a lot of useful information about compiling under Windows; try looking
-there for tips.
-
-However, it not easy (and maybe even impossible) to compile at all
-under Windows 3.x or DOS because they lack a number of features that
-Circle requires such as the Win32 API and long filenames.  It is
-theoretically possible to compile under Windows 3.x by finding 3.x API
-equivalents to the Win32 API calls, and changing all the filenames in
-the entire distribution to fit the 8.3 DOS/Win3.x filenaming standard,
-but I will never do this.
+It should be possible to compile tbaMUD using other compilers that are not 
+listed here, or other versions of these compilers -- as long as they support 
+long filenames, etc.  However, we don't have instructions handy for those 
+compilers. Feel free to submit your own.
 
 Have fun!
+For help, check out http://www.cwg.lazuras.org
 
-Jeremy Elson
-(To get help, write to help@circlemud.org)
+Originally written by: Jeremy Elson 
diff -BburpN --exclude=.svn tbamud-3.51/lib/misc/socials.new tbamud-3.52/lib/misc/socials.new
--- tbamud-3.51/lib/misc/socials.new	2007-02-24 22:39:32.000000000 +0100
+++ tbamud-3.52/lib/misc/socials.new	2007-04-20 16:47:40.000000000 +0200
@@ -568,36 +568,6 @@ $n blinks at your $t.
 You blinks at $p.
 $n blinks at $p.
 
-~blink2 blink2 0 5 8 0
-#
-This action is unfinished.
-#
-#
-#
-#
-#
-#
-#
-#
-#
-#
-#
-
-~bloink bloink 0 5 0 0
-Who do you want to boink?
-$n looks around, puzzled.
-You boink $M.
-$n boinks $N with ultimate passion.
-$n boinks you passionately.
-Who's that?
-You boink yourself on the head.
-*YUCK* $n boinks $mself on the head.
-You boink $S $t.
-$n boinks $N's $t.
-$n boinks your $t.
-You boink $p.
-$n boinks $p.
-
 ~bloob bloob 0 0 8 0
 You tell a story about a bloober, you once saw.
 $n bloobs out about nothing and everything.
@@ -688,6 +658,21 @@ $n boggles over your $t.
 You are boggled by $p.
 $n seems to be boggled over $p.
 
+~boink boink 0 5 0 0
+Who do you want to boink?
+$n looks around, puzzled.
+You boink $M.
+$n boinks $N with ultimate passion.
+$n boinks you passionately.
+Who's that?
+You boink yourself on the head.
+*YUCK* $n boinks $mself on the head.
+You boink $S $t.
+$n boinks $N's $t.
+$n boinks your $t.
+You boink $p.
+$n boinks $p.
+
 ~bonk bonk 0 5 0 0
 Whom do you wish to bonk on the head?
 $n is looking for someone to bonk, RUN!
@@ -5968,21 +5953,6 @@ $n playfully splashes water at your $t..
 You splash $p with water, trying to clean off those nasty bloodstains. 
 $n splashes $p with water, and starts to wash away an imaginary bloodstain.
 
-~spondebath spondebath 0 0 8 0
-This action is unfinished.
-This action is unfinished.
-#
-#
-#
-#
-#
-#
-#
-#
-#
-#
-#
-
 ~spongebath spongebath 0 6 0 0
 You demand a sponge bath.
 $n demands a sponge bath.
@@ -6301,7 +6271,7 @@ $n swears at $p.
 ~sweat sweat 0 5 0 0
 Cool down?
 $n sweats a river!
-You look at $s and break out into a sweat.
+You look at $S and break out into a sweat.
 $n looks at $N and breaks out in a sweat.
 $n looks at you and starts sweating.
 You break out in a sweat.
diff -BburpN --exclude=.svn tbamud-3.51/lib/plrfiles/A-E/00 tbamud-3.52/lib/plrfiles/A-E/00
--- tbamud-3.51/lib/plrfiles/A-E/00	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/lib/plrfiles/A-E/00	2007-04-20 16:46:13.000000000 +0200
@@ -0,0 +1 @@
+This is a placeholder file so the directory will be created
diff -BburpN --exclude=.svn tbamud-3.51/lib/plrfiles/F-J/00 tbamud-3.52/lib/plrfiles/F-J/00
--- tbamud-3.51/lib/plrfiles/F-J/00	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/lib/plrfiles/F-J/00	2007-04-20 16:46:14.000000000 +0200
@@ -0,0 +1 @@
+This is a placeholder file so the directory will be created
diff -BburpN --exclude=.svn tbamud-3.51/lib/plrfiles/K-O/00 tbamud-3.52/lib/plrfiles/K-O/00
--- tbamud-3.51/lib/plrfiles/K-O/00	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/lib/plrfiles/K-O/00	2007-04-20 16:46:14.000000000 +0200
@@ -0,0 +1 @@
+This is a placeholder file so the directory will be created
diff -BburpN --exclude=.svn tbamud-3.51/lib/plrfiles/P-T/00 tbamud-3.52/lib/plrfiles/P-T/00
--- tbamud-3.51/lib/plrfiles/P-T/00	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/lib/plrfiles/P-T/00	2007-04-20 16:46:12.000000000 +0200
@@ -0,0 +1 @@
+This is a placeholder file so the directory will be created
diff -BburpN --exclude=.svn tbamud-3.51/lib/plrfiles/U-Z/00 tbamud-3.52/lib/plrfiles/U-Z/00
--- tbamud-3.51/lib/plrfiles/U-Z/00	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/lib/plrfiles/U-Z/00	2007-04-20 16:46:14.000000000 +0200
@@ -0,0 +1 @@
+This is a placeholder file so the directory will be created
diff -BburpN --exclude=.svn tbamud-3.51/lib/plrfiles/ZZZ/00 tbamud-3.52/lib/plrfiles/ZZZ/00
--- tbamud-3.51/lib/plrfiles/ZZZ/00	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/lib/plrfiles/ZZZ/00	2007-04-20 16:46:14.000000000 +0200
@@ -0,0 +1 @@
+This is a placeholder file so the directory will be created
diff -BburpN --exclude=.svn tbamud-3.51/lib/plrvars/ZZZ/00 tbamud-3.52/lib/plrvars/ZZZ/00
--- tbamud-3.51/lib/plrvars/ZZZ/00	1970-01-01 01:00:00.000000000 +0100
+++ tbamud-3.52/lib/plrvars/ZZZ/00	2007-04-20 16:47:39.000000000 +0200
@@ -0,0 +1 @@
+This is a placeholder file so the directory will be created
diff -BburpN --exclude=.svn tbamud-3.51/lib/text/help/help.hlp tbamud-3.52/lib/text/help/help.hlp
--- tbamud-3.51/lib/text/help/help.hlp	2007-02-24 22:41:08.000000000 +0100
+++ tbamud-3.52/lib/text/help/help.hlp	2007-04-20 16:52:51.000000000 +0200
@@ -734,7 +734,7 @@ is 4-20 points damage.
    The question often comes up as to what damage a weapon should inflict. I 
 will attempt to explain. To understand damage you first need to know hitpoints.
 A player starts with 10 hitpoints. Then they gain a certain amount depending on
-their class when they level. Stock CircleMUD uses the following: Magic Users
+their class when they level. Stock tbaMUD uses the following: Magic Users
 gain 3-8, Clerics 5-10, Thieves 7-13, Warriors 10-15. So a level 1 Warrior
 will have 20-25 hitpoints. Now, let us apply common sense. A weapon that does
 25 points of damage could kill a level 1 player in one hit. While a weapon with
@@ -847,19 +847,16 @@ These are numerous and I will add them a
 #31
 CYGWIN README.CYGWIN README-CYGWIN COMPILER SHELLS
 
-The README.Cygwin that comes with CircleMUD is outdated. Below is current and
-works as of December 2006.
-
-                          Compiling CircleMUD
+                          Compiling tbaMUD
                   under Microsoft Windows using CygWin
 
-CircleMUD 3.1 compiles under Cygwin without needing any special modifications.
+tbaMUD compiles under Cygwin without needing any special modifications.
 This free pseudo-Unix environment for Windows includes the "bash" shell, "gcc"
 family of compilers, and a full set of programs and libraries for Windows users
 to compile and run programs from source code intended for Unix. It can be
 downloaded from: http://cygwin.com/
 
-Compiling Circle under Cygwin is basically the same as it would be under
+Compiling tbaMUD under Cygwin is basically the same as it would be under
 another form of Unix:
 
 1) Download from: http://cygwin.com/setup.exe
@@ -872,21 +869,39 @@ another form of Unix:
    Click Next.
    Install, follow prompts.
 
-2) Download and uncompress the latest version of CircleMUD. TBA is now 
-   recommending everyone use CWG (CircleMUD With Goodies) Buddha since it comes
-   pre-packaged with many important features like OLC and Trigedit. Join the 
-   forum and download Buddha at: http://cwg.lazuras.org/ The forums will 
-   also be a great resource for any problems that come up. Once you download 
-   and uncompress Buddha (I use winRAR) read through the /doc directory.
+2) Download and uncompress the latest version of tbaMUD:
+   http://cwg.lazuras.org/modules.php?name=Downloads&d_op=viewdownload&cid=16
+   Join the forums as they will be a great resource for any problems that you
+   encounter. Once you download and uncompress tbaMUD (I use winRAR) read 
+   through the /doc directory.
 
 3) Start the Cygwin "bash" shell by double clicking the Cygwin Icon. This will 
    open a telnet looking window that mimics a *nix server where you can run the
-   MUD. Go to the directory where you extracted CircleMUD by using the "cd" change
+   MUD. Go to the directory where you extracted tbaMUD by using the "cd" change
    directory command and "dir" directory listing to find the correct files. For
-   example "C:\circle". "cd c:/circle" "dir" in the listed files you should see 
+   example "C:\tbaMUD". "cd c:/tbaMUD" "dir" in the listed files you should see 
    one called configure. DO NOT go into the SRC directory yet.
 
-4) Run the configure script by typing "./configure".  This will automatically 
+4) Make the following change to src/Makefile.in to make copyover work:
+
+	--- Makefile.in.old 2007-02-26 05:52:19.000000000 +0100
+	+++ Makefile.in     2007-03-26 17:21:56.000000000 +0200
+	@@ -61,6 +61,8 @@ circle:
+	        $(MAKE) $(BINDIR)/circle
+
+	 $(BINDIR)/circle : $(OBJFILES)
+	+       @-rm $(BINDIR)/circleold.exe
+	+       @-mv $(BINDIR)/circle.exe $(BINDIR)/circleold.exe
+	        $(CC) -o $(BINDIR)/circle $(PROFILE) $(OBJFILES) $(LIBS)
+
+	 clean:
+
+   The above is a "patch" file. All you need to do is add the two lines with
+   the +'s to your file Makefile.in. If you are still confused check out these
+   links on how to patch: http://www.circlemud.org/cdp/wtfaq/handpatch.html
+   http://cwg.lazuras.org/modules.php?name=Forums&file=viewtopic&t=757
+
+   Run the configure script by typing "./configure".  This will automatically 
    detect what programs and library functions are available, and create the 
    files "Makefile" and "conf.h" based on the results.
 
@@ -895,12 +910,12 @@ another form of Unix:
    an executable, you can also try "sh configure", "sh ./configure",
    "bash configure" and "bash ./configure" until one of them works.
 
-5) NOW change to the /circle/src directory "cd src", and type "make", and watch
-   CircleMUD and the additional utilities included in the Circle distribution
-   automatically being compiled and placed in /circle/bin.
+5) NOW change to the /tbaMUD/src directory "cd src", and type "make", and watch
+   tbaMUD and the additional utilities included in the tbaMUD distribution
+   automatically being compiled and placed in /tbaMUD/bin.
 
-6) Go back to /circle, and run the MUD either directly by typing
-   "bin/circle", or by using the "./autorun &" script.
+6) Go back to /tbaMUD, and run the MUD either directly by typing
+   "bin/tbaMUD", or by using the "./autorun &" script.
 
 7) Start a telnet program.  Open a connection to your own machine "localhost"
    on port 4000.  You should see the MUD's login screen welcoming you. The
@@ -908,23 +923,16 @@ another form of Unix:
 
 If you have problems, read this document again.  Most of the questions received
 in email or which are posted to USENET newsgroups are answered in this file, or 
-in other documents included in the CircleMUD distribution.  If you are still 
+in other documents included in the tbaMUD distribution.  If you are still 
 having problems and you're *sure* that your question is not answered in this 
-document or in one of the others files in the /circle/doc directory, try 
-reading the through the CircleMUD website at: http://www.circlemud.org
-It really can not be stressed enough: READ EVERYTHING.
+document or in one of the others files in the /tbaMUD/doc directory, try 
+reading the forums at http://cwg.lazuras.org/ or stop by TBA for assistance.
 
-Credit where credit is due:
+It really can not be stressed enough: READ EVERYTHING.
 
-Some parts of this document have been derived or outright copied from other
-files in the CircleMUD distribution by:
-Jeremy Elson
-David Goldstein
-Tony Robbins
-George Greer
+Authors: Jeremy Elson, David Goldstein, Tony Robbins, and George Greer.
 
 Rumble
-Rumble@@builderacademy.net 
 The Builder Academy
 builderacademy.net 9091
 
@@ -932,9 +940,9 @@ See also: CODING, DOWNLOADS
 #31
 TILDES ~
 
-On stock CircleMUD a tilde is used in the world files to denote an end of line.
-This way the files can be saved and read. Because of this adding a tilde in any
-of the editors on older versions of CircleMUD could make the MUD unbootable. 
+On tbaMUD a tilde is used in the world files to denote an end of line. This way
+the files can be saved and read. Because of this adding a tilde in any of the 
+editors on older versions of CircleMUD could make the MUD unbootable. 
 
 See also: WORLD-FILE
 #31
@@ -1045,7 +1053,7 @@ as in "women's hemlines."  
 
 We rest our case. Now do whatever you want...after all, it is your area.
 #31
-OBJ-NOTES OBJECT-NOTES BOOKS PENS NOTES QUILLS NEWSPAPERS POSTITS POST-ITS OBJ-TYPE-NOTE
+OBJ-NOTES OBJECT-NOTES BOOKS PENS NOTES QUILLS NEWSPAPERS POSTITS POST-ITS OBJ-TYPE-NOTE PAPERS
 
    With Object Type NOTE you can then use the A-desc to write what you want 
 people to see when they read it.  Players will then be able to write on the
@@ -1062,23 +1070,21 @@ CWG BUDDHA SUNTZU RASPUTIN CIRCLEMUD-WIT
 
    CWG is short for CircleMUD with Goodies. It is a customized codebase free
 to download from http://cwg.lazuras.org/. It comes in three versions: Buddha,
-Suntzu, and Rasputin.
+Suntzu, and Rasputin. CWG is also nice enough to host the tbaMUD forums and
+downloads section.
  
 See also: RESOURCES 
 #31
 SOURCES RESOURCES CODEBASE FTP DOWNLOADS DOCUMENTATION OLC-SOURCE CODEOLC OLCCODE OLC-CODE CODE-OLC WTFAQ MAILING-LISTS FORUMS MAILINGLISTS GROUPS 
 
+Source:      http://cwg.lazuras.org/modules.php?name=Downloads&d_op=viewdownload&cid=16
 CWG:         http://cwg.lazuras.org/
-Stock:       ftp://ftp.circlemud.org/pub/CircleMUD/3.x/
 Trigedit:    http://builderacademy.net/Oasis_DG_pages/contents/downloads.htm
 GDB:         http://www.cs.clemson.edu/~ihcho/courses/cs360/common/gdb.html
 
 Documentation:
-http://www.circlemud.org
-ftp://ftp.circlemud.org/pub/CircleMUD/3.x/uncompressed/circle-3.1/doc/
 http://builderacademy.net/Oasis_DG_pages/index.html
 http://www.circlemud.org/cdp/wtfaq/
-http://developer.circlemud.org/
 
    You should join the following forums and mailing lists. Learn how to search
 them for any problems you have:
@@ -1144,7 +1150,7 @@ C2       - Player has color set to norma
 NO_WIZ   - Builder can not see wiznet.
 L1       - Builder has syslog set to brief. 
 L2       - Builder has syslog set to normal.
-           BOTH: Builder has syslog set to on.
+           BOTH: Builder has syslog set to on and will see ALL logs (spammy).
 NO_AUC   - Player can not see auctions.
 NO_GOS   - Player can not see gossips. 
 NO_GTZ   - Player can not see grats.
@@ -1264,7 +1270,7 @@ road.
    what you intended to have there all along. Novels have editors, and so 
    should any zone.
 
-2) Add secrets! Reward players for participating in game that the zone 
+2) Add secrets! Reward players for participating in the game that the zone 
    represents. Always include at least one interesting thing per three or so 
    rooms. For example, have a bench in the garden or a table loaded to the 
    room. Many objects don't have to do anything, just break up the sparse 
@@ -1497,7 +1503,7 @@ road.
      browns, and yellows unless you can make that description only show during 
      that season.
 
-@cNOTE: If you would like to use this information for your game, you may do so
+@cNOTE:@n If you would like to use this information for your game, you may do so
         so long as you copy the entirety as is, keep Elaseth's copyright label 
         at the top of it, and make any corrections as specific to your mud in 
         parenthesis. If you wish to use this as a basis for your own building 
@@ -1616,7 +1622,7 @@ See also: STANDARDS
 PREREQUISITES CONSTRUCTIVE-CRITICISM
 
    Do you own a dictionary? Can you write in complete sentences? Builders
-are expected to be able to write decent descriptions. MUDs will not implement
+are expected to be able to write decent descriptions. Good MUDs will not use
 zones that are grammatical nightmares. The goal of the Builder Academy is to
 develop great builders, part of this requires a grasp on the English language.
 We understand English is not the first language for most people, but that is no
@@ -1708,7 +1714,7 @@ http://www.degraeve.com/img2txt.php
 
 See also: TBAMAP, MAPPING
 #31
-ABBREVIATIONS
+ABBREVIATIONS ABBREVS
 
    We have added abbreviations so you do not have to type everything exactly as
 it appears. This also means that when you enter keywords in OLC you do not have
@@ -1841,7 +1847,7 @@ Be original, finish what you start, have
 #31
 CALENDAR CALENDER MONTHS WEEKS DAYS HOURS 
 
-The CircleMUD calendar consists of 75 seconds per minute, 35 days a month and
+The tbaMUD calendar consists of 75 seconds per minute, 35 days a month and
 17 months a year.
 
 Days of the week:
@@ -1879,16 +1885,11 @@ See also: DATE, TIME
 FOUNTAINS DRINK-UNITS OEDIT-FOUNTAINS 
 
    After selecting object type FOUNTAIN you must then select C) Values to set
-the capacity of the fountain. A good number is 500 for both the capacity and
-quantity. When loading the fountain through zedit you should remove and then
-load the fountain every zone reset. This can be done by choosing the R)
-Remove an object option in zedit followed by the O) Load Object to room command.  
-This way your fountain will reload every zone reset and always be full.
-
-Example: @RAT 23429 STAT ROOM@n
+the capacity of the fountain. The first number is max capacity. The second is
+the current contents. To make a fountain contain that never runs out set the
+2nd number to -1.
 
 See also: VALUES
-
 #31
 ALIGNMENT GOOD NEUTRAL EVIL %ACTOR.ALIGN% %ALIGN% %ALIGNMENT% 
 
@@ -1989,7 +1990,7 @@ file.
 
 See also: HEDIT, HINDEX
 #31
-HEDIT
+HEDIT HELP-EDITOR
 
 Usage: hedit <keyword>
 
@@ -2113,11 +2114,10 @@ FREEZE THAW FREEZING FROZEN
 Usage: freeze [target]
        thaw [target]
 
-   FREEZE, originally invented here at CircleMUD (we think), is used to prevent
-a player from playing.  If frozen, the game will ignore all commands entered
-by the player, including QUIT, until the player is unfrozen with THAW. 
-Obviously, this command should only be used in extreme disciplinary 
-circumstances.
+   FREEZE is used to prevent a player from playing.  If frozen, the game will 
+ignore all commands entered by the player, including QUIT, until the player is 
+unfrozen with THAW. Obviously, this command should only be used in extreme 
+disciplinary circumstances.
 
 #31
 GOTO TRANSFER TRANSPORT TELEPORT
@@ -2272,7 +2272,7 @@ NOHASSLE HASSLE DARK NO_HASSLE DISABLE N
 
 Usage: nohassle
 
-   Toggles a flag to prevent aggressive monsters from attacking and also prevents
+   Toggles a flag to prevent aggressive monsters from attacking, and also prevents
 immortals from firing triggers. If you wish to test triggers you must turn 
 nohassle off.
 
@@ -2439,7 +2439,7 @@ TIME TICKS
 
 Usage: time
 
-Gives you the current game time. CircleMUD uses zulu time 0-24 hours. There are
+Gives you the current game time. tbaMUD uses zulu time 0-24 hours. There are
 75 seconds per minute, 35 days per month, and 17 months per year. 1 MUD year 
 takes about 12 days.
 
@@ -2457,7 +2457,7 @@ takes about 12 days.
 
 See also: DATE, %TIME%
 #31
-SET INVSTART
+SET INVSTART NOWIZLIST
   
 Usage: set [ file | player ] <character> <field> <value>
  
@@ -2494,7 +2494,7 @@ exp            LVL_GOD          BOTH    
 frozen         LVL_FREEZE       PC      BINARY      FROZEN flag
 gold           LVL_BUILDER      BOTH    NUMBER      Gold (On hand)
 height         LVL_BUILDER      BOTH    NUMBER      Height
-hit            LVL_BUILDER      BOTH    NUMBER      Current HP
+hitpoints      LVL_BUILDER      BOTH    NUMBER      Current HP
 hitroll        LVL_BUILDER      BOTH    NUMBER      To-Hit modifier
 hunger         LVL_BUILDER      BOTH    MISC        Hrs to hunger
 int            LVL_BUILDER      BOTH    NUMBER      Intelligence
@@ -2518,6 +2518,7 @@ poofin         LVL_IMMORT       PC      
 poofout        LVL_IMMORT       PC      MISC        Poofout
 practices      LVL_GOD          PC      NUMBER      # of practices
 quest          LVL_GOD          PC      BINARY      QUEST flag
+questpoints    LVL_GOD          PC      NUMBER      Questpoints
 room           LVL_BUILDER      BOTH    NUMBER      Move to room
 sex            LVL_GOD          BOTH    MISC        Sex
 showvnums      LVL_BUILDER      PC      BINARY      ShowVnums
@@ -2677,7 +2678,7 @@ entity by its Vnum. Vnums are not seen b
 a Vnum.  The zone Vnum for any zone is simply the room, mob, object, shop, or 
 trigger Vnum divided by 100. For example, The Builder Academy is zone 13, 
 consisting of Vnums 1300 to 1399.
-   CircleMUD worlds are divided into distinct sections called zones.  Each
+   tbaMUD worlds are divided into distinct sections called zones.  Each
 zone typically consists of a single region of the MUD's virtual world with a
 consistent storyline.  Each zone can define its own rooms, mobs, objects,
 shops, and triggers. A single zone typically contains 100 rooms, 100 mobs, 100
@@ -2692,7 +2693,7 @@ See also: TERMINOLOGY, VNUM, SHOW-ZONES,
 #31
 GCC
 
-Several people have problems with configuring CircleMUD in cygwin the first
+Several people have problems with configuring tbaMUD in cygwin the first
 time. They will get an error saying "GCC could not be found" This means a C
 compiler was not installed because you failed to follow the directions under
 HELP CYGWIN. Reread them and add the compiler to the default download.
@@ -3103,12 +3104,12 @@ eval stunned %actor.hitp%     - evaluate
 eval num_hitp %actor.hitp%/2  - calculate half of hitpoints and then damage
 %damage% %actor% %num_hitp% 
 
-Example: @RTSTAT 16
+Example: @RTSTAT 16, 51
          TSTAT 3008@n
 
 See also: DAMAGE, GUNS, DEATH
 #31
-%DOOR% WDOOR ODOOR MDOOR TRIGEDIT-EXIT TRIG-EXIT TRIGEDIT-DOORS TRIGEDIT-MENU-DOORS SECRET-DOORS TRIG-DOOR 
+%DOOR% WDOOR ODOOR MDOOR TRIGEDIT-EXIT TRIG-EXIT TRIGEDIT-DOORS TRIGEDIT-MENU-DOORS SECRET-DOORS TRIG-DOOR %EXIT%
 
 %door% <vnum> < direction> < field> [value] 
 
@@ -3130,7 +3131,7 @@ room        - value is the vnum of the r
  
 Example: @RTSTAT 17, 23603@n
 #31
-%ECHO% %ECHOAROUND% %SEND% TRIG-SEND %ZONEECHO% ZONEECHO ZECHOAROUND ECHOAROUND OECHO WECHO MECHO OECHOAROUND WECHOAROUND MECHOAROUD OSEND WSEND MSEND ZONECHO RECHO %ZECHO% ZSOUND MECHOAROUND MZONEECHO MRECHO
+%ECHO% %ECHOAROUND% %SEND% TRIG-SEND %ZONEECHO% ZONEECHO ZONECHO %ZONECHO% ZECHOAROUND ECHOAROUND OECHO WECHO MECHO OECHOAROUND WECHOAROUND MECHOAROUD OSEND WSEND MSEND ZONECHO RECHO %ZECHO% ZSOUND MECHOAROUND MZONEECHO MRECHO
 
 %echo% <message>
    Message is sent to all non-sleeping characters in the same room that this 
@@ -3147,7 +3148,10 @@ the victim.
    Zoneecho echoes message to the entire zone. room vnum should be any vnum in 
    the zone you wish to echo to. 13400 would echo in zone 134.
 
-NOTE: When used with mobs make sure the mobs can see the players. i.e not blind, set INFRA.
+To send a blank line use: %send% %actor% \
+NOTE: When used with mobs make sure the mobs can see the players. 
+      i.e not blind, set INFRA, DET_INVIS.
+
 Example: @RTSTAT 18@n
 
 See also: %ASOUND%
@@ -3176,7 +3180,7 @@ wait 1 s
 %load% <obj|mob> <vnum> [name [position]]
 
    This command loads a mob or object into the game. No-take objects loaded to
-a mob will load to the room.
+an actor will load to the room. NO_RENT objects can not be loaded.
 
 load an object to room: %load% obj 1300
 load a mob to room    : %load% mob 1300
@@ -3201,13 +3205,20 @@ Examples: 
    %purge% %actor.inventory(1300)%   
    %purge% %actor.eq(hold)%
  
+When purging objects make sure the object exists. If it does not the room will 
+be purged:
+
+if %actor.inventory(700)%
+  %purge% %actor.inventory(700)%
+end
+
 Example: @RTSTAT 1375, 6300@n
 
 See also: POSITIONS
 #31
 %TELEPORT% WTELEPORT OTELEPORT MTELEPORT PORTALS %TRANSPORT% TRIG-TELEPORT
 
-Stock CircleMUD does not have an object type portal. This is instead done with
+Stock tbaMUD does not have an object type portal. This is instead done with
 trigedit.
 
  %teleport% <victim> <location>
@@ -3305,7 +3316,7 @@ mjunk <object | all>
 is sent by this command. Only mobs may use this command.
 
 #31
-%FOLLOWER% TRIG-FOLLOW MFOLLOW %MASTER% MASTER %SELF.FOLLOWER% %SELF.MASTER%
+%FOLLOWER% TRIG-FOLLOW MFOLLOW %MASTER% MASTER %SELF.FOLLOWER% %SELF.MASTER% %FOLLOW%
 
 mfollow <victim>
 
@@ -3323,8 +3334,9 @@ MHUNT %HUNT% HUNT 
 mhunt <victim>
 
    The mobile will begin to hunt for victim, and engage in combat upon finding 
-them. Only Mobiles may use this command. Hunting mobs will walk through NOMOB
-rooms. %kill% may be used for mobs attacking mobs.
+them. Only Mobiles may use this command. Hunting mobs will ignore STAY_ZONE and
+SENTINEL flags. They will also walk through NOMOB rooms. %kill% may be used for
+mobs attacking mobs.
 
 Examples: @RTSTAT 19596, 19595@n
 
@@ -3365,7 +3377,7 @@ load trigger will be executed.
 
 Example: @RTSTAT 21, 1370@n
 #31
-OTIMER %TIMER% 
+OTIMER %TIMER% %OTIMER%
 
 otimer <value>
 
@@ -3376,13 +3388,15 @@ Example: @RTSTAT 11894@n
 
 See also: TIMER, TRIGEDIT-OBJ-TIMER
 #31
-OSETVAL %SETVAL%
+OSETVAL %SETVAL% VAL0 VAL1 VAL2 VAL3 %VAL0% %VAL1% %VAL2% %VAL3%
 
 osetval <position> <value>
 
    Osetval lets you alter the object values of an object. The meaning of the 
-values depends on the object type (@RHELP OEDIT-VALUES@n).
+values depends on the object type (@RHELP OEDIT-VALUES@n). "osetval 3 50" will
+set the objects 3rd value to 50.
 
+Example: @RTSTAT 42@n
 #31
 COMMENT * 
 
@@ -3399,7 +3413,7 @@ trigger text try /*.
 
 See also: REDIT-ROOM-FLAGS
 #31
-NOP NO-OPERATION NON-OPERATION TRIG-EXPERIENCE %ACTOR.EXP% ACTOR.EXP TRIG-GOLD ACTOR.GOLD %ACTOR.GOLD% %NOP% %POSITION% %POS% %ACTOR.POS% ACTOR.POS
+NOP NO-OPERATION NON-OPERATION TRIG-EXPERIENCE %ACTOR.EXP% ACTOR.EXP TRIG-GOLD ACTOR.GOLD %ACTOR.GOLD% %NOP% %POSITION% %POS% %ACTOR.POS% ACTOR.POS TRIGEDIT-NOP
 
    Almost a no-operation. Certain variable/subfield combinations for characters 
 change some attribute about the character. nop allows those changes to be used 
@@ -3444,13 +3458,13 @@ check the global variable to allow or pr
 set has_bribed_guard 1
 global has_bribed_guard
 
-Global variables are checked when the specified variable is not recognized. It can
-also be used to check for variables.
-if %actor.varexists(variable)%
+Globals can be checked by varexists: if %actor.varexists(<variable>)%
 
 Global variables should not be used when you want to remember something about a 
 player. To save something to a players file for future use always use REMOTE. 
 
+Examples: @RTSTAT 23612, 23613, 23614@n
+
 See also: REMOTE, VARIABLES, CONTEXT
 #31
 CONTEXT %CONTEXT% 
@@ -3472,7 +3486,7 @@ name, differing only by context. Players
 removes the need for variable context. Previously, a player's ID could be used 
 as variable context to allow a trigger to service multiple players at once.
 
-Example @RTSTAT 23612@n
+Example: @RTSTAT 23612@n
 
 See also: REMOTE
 #31
@@ -3491,6 +3505,8 @@ the result of the immediate evaluation o
 exists a "set" command, with the same syntax. Set differs in that the expression
 is not evaluated until the variable is accessed.
 
+Example: @RTSTAT 49@n
+
 See also: TRIG-SET
 #31
 TRIG-SET %SET% MSET
@@ -3513,9 +3529,9 @@ the provided expression, which will be e
 There also exists an "eval" command, with the same syntax. Eval differs in that 
 the expression is evaluated immediately.
 
-Example: @RTSTAT 41005@n
+Example: @RTSTAT 49, 41005@n
 
-See also: EVAL
+See also: EVAL, OSETVAL
 #31
 UNSET
 
@@ -3606,9 +3622,24 @@ end
   mkill %actor%
 
 #31
-MAKEUID VAREXISTS %VAREXISTS% %EXISTS% EXISTS UID
+VAREXISTS %VAREXISTS% %EXISTS% EXISTS
+
+Usage: if %actor.varexists(on_quest_zone_1)%
+
+  The above usage checks if the variable on_quest_zone_1 has been saved to the 
+player file or to a mob (does not work for objects). It can also be used with 
+!%actor.varexists(on_quest_zone_1)% to mean does not exist. This is useful on 
+quests or other complex triggers that need to save variables to a player file 
+by using remote.
+
+Example: @RTSTAT 138, 139@n
+
+See Also: REMOTE
+#30
+MAKEUID UID
 
 Usage: makeuid variable id
+
 * We have one mob giving a quest. This mob sets the targets id as a global on 
 * the player via the 'remote' command, like this:
 eval quest_object %obj.id%
@@ -3665,7 +3696,7 @@ Examples: @RTSTAT 199, 190-192, 23612-23
 
 See also: RDELETE, VDELETE, TRIG-SET, CONTEXT
 #31
-TRIG-RETURN RETURN-0 CONTINUE %RETURN%
+TRIG-RETURN RETURN-0 CONTINUE %RETURN% RETURN-1
  
 Usage: return 0
 
@@ -3676,11 +3707,13 @@ fire is to have the first one return 0. 
 
 Get, Give, Drop, Wear, Leave, and Consume trigs with return 0 prevents the action.
 Command trigs with return 0 allow the command to continue to the MUD and not be
-captured by the trigger.
+stopped by the trigger.
 
 Return does not end the triggers execution. It is returned after all commands have
 been executed, or a wait or halt command is called.
 
+Return 1 is rarely used since it just means normal termination of the trigger.
+
 Example: @RTSTAT 1364@n
 
 See also: TRIG-TYPE, HALT, WAIT
@@ -3714,7 +3747,7 @@ Case is used to begin a new conditional 
 Default is similar to case but matches any condition not met. 
 Done is used to terminate a while or switch block.
 
-Example: @RTSTAT 18@n
+Example: @RTSTAT 18, 6@n
 #31
 WHILE DONE %NEXT% NEXT LOOP TRIG-LOOPS TRIG-WHILE TRIG-DONE
 
@@ -3724,7 +3757,7 @@ Usage: while expression
 or negative. This can make permanent loops - be careful. The switch block must 
 be terminated by a done. While loops are disabled after looping 100 times.
 
-Room example: @RTSTAT 24@n
+Room example: @RTSTAT 24, 2201@n
 Obj example:  @RTSTAT 23@n
 Mob example:  @RTSTAT 11858@n
 #31
@@ -3847,7 +3880,7 @@ mudcommand - Returns the mud command the
 
 Example: @RTSTAT 30@n
 #31
-TRIGEDIT-VARIABLES-SPECIALS SPEC-VAR %SELF% RANDOM %RANDOM% %TIME% %PEOPLE% TRIGEDIT-SPEC-VAR %RANDOM.CHAR% %SPEECH% DG_LETTER DG-LETTERS TRIGEDIT-LETTERS
+TRIGEDIT-VARIABLES-SPECIALS SPEC-VAR %SELF% RANDOM %RANDOM% %TIME% %PEOPLE% TRIGEDIT-SPEC-VAR %RANDOM.CHAR% %SPEECH% DG_LETTER DG-LETTERS TRIGEDIT-LETTERS FINDMOB FINDOBJ
 
 Special Variables When using field - The variable returns:
  
@@ -3876,8 +3909,6 @@ findmob.<room vnum X>(<mob vnum Y>)
 &%var%        - it, you, he/she            Example: @RTSTAT 91@n
 *%var%        - it, you, him/her
 ^%var%        - its, your, his/her
-  object only
-'%obj%        - something, name
 
 Use \ for do not parse, or %% for %.
 
@@ -3910,7 +3941,7 @@ Example: @RTSTAT 29@n
 
 See also: RANDOM-THOUGHTS
 #31
-TRIGEDIT-VARIABLES-OBJECTS OBJ-VAR %SHORTDESC% TRIGEDIT-OBJ-VAR VAL0 VAL1 VAL2 VAL3 %ITEM% %OBJECT% OBJVARS OBJ-VARS %NEXT_IN_LIST% %OBJ% OBJ-COMMAND   IS_INROOM
+TRIGEDIT-VARIABLES-OBJECTS OBJ-VAR %SHORTDESC% TRIGEDIT-OBJ-VAR VAL0 VAL1 VAL2 VAL3 %ITEM% %OBJECT% OBJVARS OBJ-VARS %NEXT_IN_LIST% %OBJ% OBJ-COMMAND IS_INROOM WORN_BY NEXT_IN_LIST
 
 Objects When using field - The variable returns:
  
@@ -3963,11 +3994,11 @@ Examples: @RTSTAT 94, 9116@n
 
 See also: TRIG-INV, %PURGE%, %LOAD%, POSITIONS, CHAR-VAR
 #31
-%NEXT_IN_ROOM% CHAR_VAR TRIG-FIELDS %ACTOR.SEX% %ACTOR.HITPOINTS% %ACTOR.HP% %HIS% IS_FIGHTING %FIGHTING% ACTOR.FIGHTING %ACTOR.FIGHTING% IN_ROOM IS_ROOM POS() HISHER %MASTER% %SELF.MASTER% %FOLLOWER.NAME% PVAR %HISHER% %SEX%
+%NEXT_IN_ROOM% CHAR_VAR TRIG-FIELDS %ACTOR.SEX% %ACTOR.HITPOINTS% %ACTOR.HP% %ACTOR.HITP% %HIS% IS_FIGHTING %FIGHTING% ACTOR.FIGHTING %ACTOR.FIGHTING% IN_ROOM IS_ROOM POS() HISHER %MASTER% %SELF.MASTER% %FOLLOWER.NAME% PVAR %HISHER% %SEX% %ACTOR.HISHER%
 
 See @RHELP CHAR-VAR@n
 #31
-CHAR-VARS TRIGEDIT-VARIABLES-CHARACTERS %TITLE% %ACTOR.TITLE% CHAR-VARIABLES TRIGEDIT-CHAR-VAR %ACTOR.ID% ACTOR.ID ACTOR.VNUM %ACTOR.VNUM% %ACTOR.NAME% %ACTOR% %VICTIM% SELF %SELF% MOBVARS MOB-VARS TRIGEDIT-LEVEL %SELF.ID% SELF.ID NEXT_IN_ROOM
+CHAR-VARS TRIGEDIT-VARIABLES-CHARACTERS %TITLE% %ACTOR.TITLE% CHAR-VARIABLES TRIGEDIT-CHAR-VAR %ACTOR.ID% ACTOR.ID ACTOR.VNUM %ACTOR.VNUM% %ACTOR.NAME% %ACTOR% %VICTIM% SELF %SELF% MOBVARS MOB-VARS TRIGEDIT-LEVEL %SELF.ID% SELF.ID NEXT_IN_ROOM ACTOR-VAR
 
 The following fields can be used with %actor%. i.e. %actor.<field>%
 Excluding the subfield () returns the value. Adding a subfield modifies it.
@@ -4008,7 +4039,7 @@ next_in_room     - The next mob/player i
 pos()            - %actor.pos% returns position. Subfield modifies. Sleeping,
                    resting, sitting, fighting, standing. @RTSTAT 1399, 20997@n     
 prac()           - The actor's number of practices. Subfield modifies.
-race             - The actor's race, as a string. (not used in stock Circle)
+race             - The actor's race, as a string. (not used in tbaMUD)
 room             - The room the actor is in as a room variable. 
 sex              - The actor's sex, as a string: MALE, FEMALE, or NEUTRAL.
 skill()          - The percentage of learnedness in the skill subfield.
@@ -4260,7 +4291,7 @@ noise, and other ambience into your zone
 Numeric Arg : 0-100: percentage chance this trigger will run.
 Argument    : not used.
 
-Example: @RTSTAT 51@n 
+Example: @RTSTAT 51, 2202, 2201@n 
 
 See also: RANDOM-TIMING, TRIGEDIT-ROOM-GLOBAL
 #31
@@ -4277,7 +4308,7 @@ fires by modifying numeric arg to the fo
 50%  = 26 seconds
 100% = 13 seconds
 
-The actual equation is 100/numeric arg X 13 = time in seconds. 100/20 X 13 = 63 seconds
+The actual equation is 100/numeric arg X 13 = time in seconds. 100/20 X 13 = 65 seconds
 
 See also: TRIGEDIT-OBJ-RANDOM, TRIGEDIT-MOB-RANDOM, TRIGEDIT-ROOM-RANDOM
 #31
@@ -4298,7 +4329,7 @@ Variables:
 %cmd%   - the exact command (without arguments) issued
 %arg%   - the arguments, if any, following the command
 
-Example: @RTSTAT 52, 1218@n
+Example: @RTSTAT 52, 1214@n
 #31
 TRIGEDIT-ROOM-SPEECH TRIGSPEECH TRIG-SPEECH TRIGEDIT-SPEECH TRIG-ROOM-SPEECH 
 
@@ -4306,7 +4337,7 @@ Activates when matching text is spoken b
  
 Numeric Arg : 0: argument is a substring that must be found in the speech to cause a
                  match. 
-              1: argument is a list of words, any of which found in the speech will
+          1-100: argument is a list of words, any of which found in the speech will
                  activate the trigger.
 Argument    : a phrase or wordlist to be matched.
 
@@ -4380,7 +4411,7 @@ Variables: 
 
 Example: @RTSTAT 57@n 
 #31
-TRIGEDIT-ROOM-LEAVE TRIG-ROOM-LEAVE TRIG-ROOM-EXIT TRIGEDIT-ROOM-EXIT 
+TRIGEDIT-ROOM-LEAVE TRIG-ROOM-LEAVE TRIG-ROOM-EXIT TRIGEDIT-ROOM-EXIT TRIG-LEAVE
 
 Activated when someone leaves the room.
 
@@ -4412,7 +4443,7 @@ Variables:
 
 Example: @RTSTAT 59@n 
 #31
-TRIGEDIT-ROOM-TIME TRIGEDIT-TIME
+TRIGEDIT-ROOM-TIME TRIGEDIT-TIME TRIG-ROOM-TIME
 
 Activated by MUD hour listed in Numeric Arg. A player must be in the room for 
 it to work unless you use it in conjunction with @RTRIGEDIT-ROOM-GLOBAL@n.
@@ -4495,7 +4526,7 @@ Variables:
 %target% - the target of the action, if any
 %arg%    - the entire phrase
 
-Example: @RTSTAT 64, 1372@n
+Example: @RTSTAT 127, 64, 1372@n
 #31
 TRIGEDIT-MOB-DEATH TRIG-MOB-DEATH MOB-DEATH MOBDEATH MDEATH  
 
@@ -4731,7 +4762,7 @@ Variables:
 %cmd%   - the exact command (without arguments) issued
 %arg%   - the arguments, if any, following the command
 
-Example: @RTSTAT 81, 154, 9800, 11859@n
+Example: @RTSTAT 81, 154, 6, 9800, 11859@n
 #31
 TRIGEDIT-OBJ-TIMER TRIGEDIT-TIMER TRIG-TIMER TRIGEDIT-OBJECT-TIMER  
  
@@ -4748,7 +4779,7 @@ See also: TIMER, %TIMER%, %TIME%
 #31
 TRIGEDIT-ADVANCED-EXAMPLES
 
-To add life to the worlds CircleMUD uses something called triggers. There are 
+To add life to the worlds tbaMUD uses something called triggers. There are 
 three things in game that can have triggers attached to them: mobiles, objects,
 and rooms. Examples of common triggers include:
 
@@ -4943,19 +4974,16 @@ TRIGEDIT-NAMES TRIG-NAMES TRIGGER-NAMES
 
 1) Name         : @ynew trigger@n
 
-Always use names that explain the trigger. More importantly: always include the
-VNUM for the mob/obj/room the trigger is going to be attached to.
-
-   It is important to give your trigger a name you and others can understand. 
-Even more important is including the VNUM of what it is attached to. This way
-tlist and stat will show the name description and VNUM allowing others to 
-quickly comprehend what the trigger does. A good name could be 'guard shout for
-help - 101' or 'mage cast poison - 300' even 'cursed object - 130.'
-
-Examples:
-   Quest Offer - 1310       --> trigger attached to mob 1310
-   Fall Down Stairs - 1300  --> trigger attached to room 1300
-   No Dropping Stuff - 1301 --> trigger attached to obj 1301
+Always use names that explain your trigger and include the VNUM for the 
+mob/obj/room the trigger is going to be attached to. It is important to give 
+your trigger a name you and others can understand. This way others can search 
+"vnum trigger <keyword>." This will also make it easier when using tlist and 
+tstat. Allowing others to quickly comprehend what the trigger does. Here are
+some good examples:
+
+Princess Shout for Help - M2229     --> Trigger 2204 attached to mob 2229.
+Tutorial Example Quest Offer - M14  --> Trigger 1 attached to mob 14.
+No Recall - R0                      --> Trigger 1201 attached to room 0.
 
 #31
 TRIGEDIT-INTENDED
@@ -5311,12 +5339,16 @@ positions to an array. See the examples 
 
 @RTSTAT 150, 41005, 1325, 57715@n
 #31
-ASSEMBLIES ASSEMBLE ASSEMBLY VEHICLES MAKE BAKE BREW CRAFT FLETCH KNIT MIX THATCH WEAVE ASSEDIT FORGE
+TRIG-EXAMPLES ASSEMBLIES ASSEMBLE ASSEMBLY VEHICLES MAKE BAKE BREW CRAFT FLETCH KNIT MIX THATCH WEAVE ASSEDIT FORGE SMOKE SMOKING CIGARS CIGARETTES PIPES SHOTGUN BLAST SHOOT RANGED-WEAPONS FIRE-WEAPONS BOWS QUIVERS MISSILES GUNS FIREARMS AMMO
+
+   The above list of skills are not implemented since the same thing can be done with trigedit.
  
-   These are no longer implemented here since the same thing can be done with
-Trigedit.
+Assemblies: @RTSTAT 38, 48, 335@n
+Smokables: @RTSTAT 159@n
+Furniture: @RTSTAT 1399@n
+Weapons: @RTSTAT 1361, 9000, 11840, 13005@n
 
-@RTSTAT 38, 48, 335@n
+See Also: @RTRIG-QUESTS@n
 #31
 DG_AFFECTS SCRIPT-AFFLICTED AFFLICTED DG-AFFECTS DG-AFFECTS %DG_AFFECT% DG-EFFECT DG_EFFECT
 
@@ -5441,29 +5473,6 @@ Warning: Some clients will give you prob
 like the / character (Avplay, Mush, and SimpleMU).
 
 #31
-FURNITURE COUCH CHAIR
-
-   There is no object type for furniture since this is stock CircleMUD. But it
-can be done through trigedit. Just set the object type to OTHER and attach a
-trigger similar to the example below. Just change the word chair to the name
-you desire.
-
-Example: @RTSTAT 1399@n
-#31
-SMOKE SMOKING CIGARS CIGARETTES PIPES
-
-   Smokable objects are not implemented on CircleMUD. The same effect may be
-created through trigedit.
-
-@RTSTAT 159@n 
-#31
-SHOTGUN BLAST SHOOT RANGED-WEAPONS FIRE-WEAPONS BOWS QUIVERS MISSILES GUNS 
-
-   Object type Fire Weapon and MISSILE are not implemented in CircleMUD. The  
-same effect may be created through trigedit.
-
-@RTSTAT 1361, 9000, 11840, 13005@n
-#31
 TRIGEDIT TRIGS TRIGEDITOR TRIGGEREDIT TRIGGER-EDIT TRIGGERS DG-SCRIPTS TRIG-HELP SCRIPTS MOBPROGS MPROGS PROGS SCRIPTING TRIGMENU
 
 Builders working on their trial vnum do not need to learn this command, yet.
@@ -5502,21 +5511,16 @@ male PC 'Rumble'  IDNum: [ 3531], In roo
 
 See also: REMOTE, RDELETE
 #31
-ASSEMBLIES ASSEMBLE ASSEMBLY VEHICLES MAKE BAKE BREW CRAFT FLETCH KNIT MIX THATCH WEAVE ASSEDIT FORGE
-
-See: @RTRIG-EXAMPLES@n
-
-#31
-TRIG-QUESTS TRIGEDIT-QUESTS AUTOQUEST QUESTS QUESTPOINTS QUEST-POINTS QUESTMASTERS TRIG-EXAMPLES TRIGEDIT-EXAMPLES QUEST-MOBS QUESTMOBS QEDIT TRIG_EXAMPLES
+TRIG-QUESTS TRIGEDIT-QUESTS AUTOQUEST QUESTS QUESTPOINTS QUEST-POINTS QUESTMASTERS QUEST-MOBS QUESTMOBS QEDIT TRIG_EXAMPLES
 
    Many zones have their own quests and examples within them, such as:
 
-Questmaster Example: @RTSTAT 139, GOTO 113@n
+Questmaster Example: @RTSTAT 138-144, GOTO 113@n
 Assembly Examples: @RTSTAT 38, 48, 335, GOTO 366@n
 Questshop Example: @RTSTAT 167, GOTO 265@n
 Fizban's Questshop Example: @RTSTAT 57705-57707@n
 
-See Also Examples: BOATS, PORTALS, GUNS, ASSASSINS
+See Also Examples: TRIG-EXAMPLES, BOATS, PORTALS, GUNS, ASSASSINS
 #31
 CANBESEEN %CANBESEEN% %ACTOR.CANBESEEN%
 
@@ -5604,7 +5608,7 @@ See also: REDIT, OEDIT, MEDIT, SEDIT, ZE
           RLIST, OLIST, MLIST, SLIST, SHOW-ZONE  
 Advanced: TRIGEDIT, TSTAT, TLIST, DIG, RCLONE, BUILDWALK
 #31
-BUILDERS
+BUILDERS IMMORTALS
 
    A builder is a term usually used to describe a person who designs MUD zones
 for other characters to explore. Any player with motivation, ideas, and good 
@@ -6264,8 +6268,7 @@ the command should be placed. Use the SA
 the rose. This will bump the command, which loads the rose down. Then you will
 be at a command options menu. Enter R for remove an object from a room. If no 
 one comes along and gets the rose, the game will remove it and load another 
-one. This will prevent build up. Also use the remove option to remove fountains
-before they reload so it will be full after every reset.    
+one. This will prevent build up. 
    Zedit can not currently give a container to a mob and then load an object to
 that container. A workaround for this is to load the object to the room before
 loading the mob. Then attach a load trigger to the mob that will force it to
@@ -6334,8 +6337,9 @@ D) Open/Close/Lock a Door
   use option 2). This will close and lock a door. It is not necessary to close
   it with one command, then lock it with another. @RHELP REDIT-EXIT@n.
 R) Remove an object from the room 
-  Important for refilling fountains and to load a single instance of an object 
-  with a maxload greater than 1. @RHELP FOUNTAIN@n, @RHELP ZEDIT-ADVANCED@n. 
+  Important for reloading containers that a player may have emptied and to load
+  a single instance of an object with a maxload greater than 1. @RHELP FOUNTAIN@n, 
+  @RHELP ZEDIT-ADVANCED@n. 
 T) Assign a trigger (Advanced builders only)
   Attach a trigger to a mob, obj, or room. Usually done through REDIT, MEDIT,
   or OEDIT.  DO NOT USE THIS OPTION WITHOUT FIRST CLEARING IT WITH A LEVEL 33 
@@ -6696,7 +6700,7 @@ objects and quests. 
 
 See also: AUTOROLL
 #31
-MEDIT-POSITION MEDIT-DEFAULT
+MEDIT-POSITIONS MEDIT-DEFAULT
 
 I) Position  : @yStanding@n
 J) Default   : @yStanding@n
@@ -6886,27 +6890,27 @@ $S his/her target of staff/wand/scroll/p
 
 PROPER USAGE: @RVSTAT OBJ 350@n
 #31
-OEDIT-TYPES OBJECT-TYPES OBJ-TYPES OBJ-WEAPONS TRASH 
+OEDIT-TYPES OBJECT-TYPES OBJ-TYPES OBJ-WEAPONS TRASH FURNITURE COUCH CHAIRS
 
 5) Type        : @cUNDEFINED@n
    This specifies what type an object is defined as; also controls the meanings
 of value0 through value4 (option C). The Type Flag must be one of the following:
  
-0    UNDEFINED      Do Not Set.
+0    UNDEFINED      Do not set.
 1    LIGHT          Item is a light source.
 2    SCROLL         Item is a magical scroll.
 3    WAND           Item is a magical wand.
 4    STAFF          Item is a magical staff.
 5    WEAPON         Must be piercing to backstab.
-6    FIREWEAPON     Not implemented.  Do not use. @RHELP GUN@n.
-7    MISSILE        Not implemented.  Do not use.
+6    FURNITURE      Item may be sat on.
+7    FREE           Do not set.
 8    TREASURE       Item is treasure other than gold coins (i.e. gems)
 9    ARMOR          Item is armor.
 10   POTION         Item is a magical potion.
 11   WORN           Item is worn, but not armor.
 12   OTHER          Miscellaneous object with no special properties.
 13   TRASH          Trash is not bought by shopkeepers.
-14   TRAP           Currently not implemented.  Do not use.
+14   FREE2          Do not set.
 15   CONTAINER      Item is a container. Be creative, make robes with pockets, etc.
 16   NOTE           Item is a note @RHELP OBJ-NOTE@n for more info.
 17   LIQ CONTAINER  Item is a drink container. Do not include liquid type in s-desc.
@@ -6915,7 +6919,8 @@ of value0 through value4 (option C). The
 20   MONEY          Value set in the C) Applies. Cost not used. Max 1000 coins.
 21   PEN            Item is a pen.
 22   BOAT           Item is a boat; allows you to traverse water (noswim).
-23   FOUNTAIN       Item is a fountain.
+23   FOUNTAIN       Item is a fountain. Set Values to -1 to make it unlimited.
+24   CHAIR          Item is a chair people can sit in.
 
    Good items should be very rare, and hard to get. Lousy items should require 
 much less effort. Give the most powerful items actually to a mob; Thieves and
@@ -6926,8 +6931,7 @@ beneficial lying around. This may sound 
    Also consider creating objects that are harmful to the owner. Objects that
 lower certain stats, saving throws, or confer weaknesses make the game more
 interesting. Remember that a lot of small items make an area more interesting 
-than a few incredibly powerful items, for the most part. Do not feel limited to
-items players consider useful, such as weapons and armor. A giant untakeable
+than a few incredibly powerful items, for the most part. Do not feel lim armor. A giant untakeable
 monolith, and other strange and odd items can add a lot of atmosphere to an 
 area. They can also be used to distract players. Most of the useless items are 
 often best as trash, but can be worn, and do not feel that items should not get 
@@ -7099,8 +7103,10 @@ WEAPON 
            12) blast                13) punch                
            14) stab                 
 
-FIREWEAPON - No values currently used. - not implemented. 
-MISSILE - No values currently used. - not implemented. 
+FURNITURE 
+   value 0: Number of people that can sit on this object.
+
+FREE - Not used. 
 TREASURE - No values currently used.
 
 ARMOR
@@ -7123,10 +7129,10 @@ value 3: Spell number 3
 WORN - No values currently used.
 OTHER - No values currently used.
 TRASH - No values currently used.
-TRAP - No values currently used. - not implemented. 
+FREE2 - Not used.
 
 CONTAINER
-   value 0: Capacity (max containable weight) of container
+   value 0: Capacity (max containable weight) of container. -1 for unlimited.
    value 1: Container flag bitvector
      1)    CLOSEABLE      Container can be closed and locked.
      2)    PICKPROOF      Lock on container cannot be picked.
@@ -7153,8 +7159,8 @@ BOAT - No values currently used. 
 
 DRINKCON
 FOUNTAIN
-   value 0: Capacity of container
-   value 1: Current quantity in container
+   value 0: Capacity of container. -1 for unlimited.
+   value 1: Current quantity in container.    
    value 2: see below
    value 3: If the drink is poisoned, how long will the poison burn? 0 if not poisoned.
 
@@ -7300,26 +7306,21 @@ SCRIPT-MENU MEDIT-SCRIPT-MENU OEDIT-SCRI
 S) Script      : @cNot Set.@n
 Selecting S within redit will take you to the script attachment menu:
 
-Script Editor
+Trigger Attachment
 
 Trigger List:
 <none>
 The first few lines tell you what triggers, if any, are already attached.
 
-N)  New trigger for this script
-To add a new trigger select N and then enter its VNUM.
-
-D)  Delete a trigger in this script
-This can be used to delete existing triggers from the room.
-
-X)  Exit Script Editor
-Of course, you figure it out.
-
-NOTE:  Scripts (also called triggers) are an advanced form of OLC, they can 
-cause problems when used incorrectly. If you do not know what you are
-doing, do not mess with them. Do not worry too much about these until you
-are assigned a zone and are comfortable with all other forms of OLC.
+N)  Attach trigger - Adds a new trigger, select N and then enter its VNUM.
+X)  Detach trigger - Detaches the trigger.
+Q)  Quit - You figure it out.
+
+NOTE: Scripts, also called triggers, are an advanced form of OLC. Do not worry 
+too much about these until you are assigned a zone and are comfortable with all
+other forms of OLC.
 
+See Also: TRIGEDIT
 #31
 EXTRA-DESCRIPTIONS EXTRA-DESCS E-DESCRIPTIONS REDIT-E-DESCRIPTIONS REDIT-MENU-E-DESCRIPTIONS REDIT-EXTRA-DESCRIPTIONS 
  
@@ -7348,7 +7349,7 @@ use /fi by typing it into the last line 
 or the Description blank and exit.
 
 #31
-REDIT-EXITS DOORFLAGS REDIT-KEYS PICKPROOF REDIT-EXIT-MENU EXIT-BASICS DOOR-FLAGS 
+REDIT-EXITS DOORFLAGS REDIT-KEYS PICKPROOF REDIT-EXIT-MENU EXIT-BASICS DOOR-FLAGS EXIT-MENU PURGE-EXITS
 
 Choosing to modify an exit will bring you to the exit menu. 
 
@@ -7447,11 +7448,10 @@ The following room flags can be selected
 1)  DARK       - The room is dark, players need a light source, or infravision.
 2)  DEATH      - Players die on entry. All dropped items will be junked.
 3)  NO_MOB     - Mobs will not enter this room. This can be used to define the
-            	 zone where any mob can wander. For example, lower level 
-	         mobiles can be set so that only they can wander on the first 
-	         level of a dungeon by making the stairwells no mob. Be warned 
-        	 that making a !MOB room will limit pets and charmed mobs from 
-	         following players through them.
+                 zone where any mob can wander. For example, lower level mobs 
+                 can be set so that only they can wander on the first level of 
+                 a dungeon by making the stairwells NO_MOB. A NO_MOB room will 
+                 also prevent pets and charmed mobs from following players.
 4)  INDOORS    - Weather messages will not be sent to room, always lighted. 
                  Call lightning will not work.
 5)  PEACEFUL   - No violence will work here. Use sparingly.
@@ -7460,7 +7460,7 @@ The following room flags can be selected
 7)  NO_TRACK   - Track will never find a path through this room.
 8)  NO_MAGIC   - No magic will work here. 
 9)  TUNNEL     - Only one person allowed at one time.
-10) PRIVATE    - Cannot enter if more than two people are already in the room. 
+10) PRIVATE    - Only room for 2 players/mobs i.e. a tunnel or small space.
 11) GODROOM    - Only allows GODS of level 33 or above to goto.
 12) HOUSE      - DO NOT USE. Room is a house.       \  automatically
 13) HCRSH      - DO NOT USE. House needs saving.     >    set by 
@@ -7476,7 +7476,7 @@ This requires repeating since it is so o
 
 See Also: TOGGLE
 #31
-BULLETINS BOARDS BULLETIN-BOARDS MESSAGE-BOARDS
+BULLETINS BOARDS BULLETIN-BOARDS MESSAGE-BOARDS POSTING
 
 Bulletin boards are the forum of inter-player communication on the MUD.
 There are different bulletin boards for different purposes -- for example,
@@ -7695,8 +7695,8 @@ See also: OLC
 #31
 DRUNK WINE LIQUID-CONTAINERS BEER SPIRITS DRINK-TYPES LIQUOR WHISKEY WHISKY LIQUIDS LIQ-CONTAINERS
 
-   When selecting object type FOUNTAIN or DRINK CONTAINER you will need
-to choose the type of liquid it contains from the following list: 
+   When selecting object type FOUNTAIN or DRINK CONTAINER you will need to 
+choose the type of liquid it contains from the following list: 
 
   0) water                  1) beer                 
   2) wine                   3) ale                  
@@ -7718,13 +7718,14 @@ about being a newbie here.
 #31
 ALIAS-EXAMPLES
   
-  To set up aliases to use older CircleMUD building commands:
+  To set up aliases to use older tbaMUD building commands:
   
 alias poofin set self poofin $*
 alias poofout set self poofout $*
 alias poofs score
 alias cheat return
 alias mail at postmaster mail $*
+alias history history all
 
 See also: ALIASES
 #31
@@ -7739,6 +7740,19 @@ head and legs X2.
 
 See also: MEDIT-AC
 #31
+PLIST PLAYERLIST P-LIST PLAYER-LIST
+
+Usage: plist [minlev[-maxlev]] [-n name] [-d days] [-h hours] [-i] [-m]
+
+   This command allows immortals to search through the player files using
+specific criteria.
+
+Examples:
+   plist 0          - List everyone level 0.
+   plist -i -h 2    - List all immortals that have logged in in the past hour.
+
+See Also: LAST
+#31
 TOGGLES CONFIGURE SETTINGS
 
 Usage: toggle
@@ -7776,12 +7790,12 @@ See also: AREAS
 #0
 AREAS ZONES
 
-These zones are maintained in the latest CircleMUD format with DG Scripts on 
+These zones are maintained in the latest tbaMUD format with DG Scripts on 
 The Builder Academy (TBA) telnet://builderacademy.net:9091/ 
 
-These areas include all donated areas from TBA, CircleMUD FTP, and stock. TBA 
-is always looking for new submissions or help on improving the current zones. 
-Please report any bugs, typos, ideas, or submissions to:
+These areas include all donated areas from tbaMUD. We are always looking for 
+new submissions or help on improving the current zones. Please report any bugs,
+typos, ideas, or submissions to:
 
 Rumble
 The Builder Academy
@@ -7988,7 +8002,7 @@ you went idle.
 #0
 STOCK
 
-This is a listing of stock areas available with CircleMUD.
+This is a listing of stock areas.
 
 0   Limbo                       -- DikuMud
 9   River Island Of Minos       -- Mahatma of HexOynx
@@ -8042,6 +8056,16 @@ commands.
 
 See also: BUG, TYPO, IDEA
 #0
+CLASSES
+
+   There are 4 classes on tbaMUD. See the help files on each for details.
+
+WARRIOR
+MAGIC USER
+CLERIC
+THIEF
+
+#0
 CLERIC
 
 Clerics have an ancient belief in not carrying sharp weapons.  Hence, they can
@@ -8224,15 +8248,16 @@ See also: NOSUMMON
 #0
 DISPLAYS PROMPTS HIT-PNT-DISPLAY
 
-Usage: display < H | M | V | all | auto | off >
+Usage: prompt < H | M | V | all | auto | off >
 
 Modify your prompt to show your hit points, mana, and/or movement points.
 
-  > display hv          Display hit points and movement points
-  > display off         Return to normal display
-  > display all         Display hit, mana, and move points
-  > display auto        Display hit, mana, and move when they are below 30%
+  > prompt hv       Display hit points and movement points.
+  > prompt off      Return to no prompt.
+  > prompt all      Display hit, mana, and movement points.
 
+  > prompt auto     A seperate toggle that will only display your selected 
+                    prompt if the values drop below 30% of max.
 See also: TOGGLE
 #0
 ASSIST
@@ -8256,12 +8281,13 @@ importance to everyone.    
 
 See also: MUDMAIL, BOARDS
 #0
-TELNET CLIENTS ZMUD GMUD TINYFUGUE TINTIN PUEBLO MUDMASTER MUSH PARSING TERMINALS
+TELNET CLIENTS ZMUD GMUD TINYFUGUE TINTIN PUEBLO MUDMASTER MUSH PARSING TERMINALS CMUD
 
 Below is a list of specialty telnet programs for connecting to MUDs. Plus a 
 few normal telnet program that have slipped in because people like them. 
 
 ZMud (PC) - @Chttp://www.zuggsoft.com/zmud/down.asp#zMUD@n
+CMUD (PC) - http://www.zuggsoft.com/cmud/
 Atlantis (Mac) - http://riverdark.net/atlantis/
 Portal (PC) - http://gameaxle.com/
 GMud (PC) - http://www.uberworld.org/gmud.exe (fits on a floppy).
@@ -8436,16 +8462,13 @@ the body you are wearing the armor.  Som
 subtract from the AC directly. Negative AC is better. 
 
 #0
-PASSWORD PW
+PASSWORDS PW
 
-A secret series of characters that enables a user to access a file,
-computer, or program.  On multi-user systems, each user must enter his or her
-password before the computer will respond to commands.  The password helps
-ensure that unauthorized users do not access the computer.  In addition, data
-files and programs may require a password.  Ideally, the password should be
-something that nobody could guess.  In practice, most people choose a password
-that is easy to remember, such as their name or their initials.  This is one
-reason it is relatively easy to break into most computer systems.    
+Ideally, your password should be something that nobody could guess.  In 
+reality, most people choose a password that is easy to remember and they never
+change it. While passwords on most MUDs are encrypted there is no rule that 
+they have to be. So please NEVER use a password on a MUD that you use anywhere 
+else. Choose a separate MUDding password and change it occasionally.
 
 If you forget your password any IMP can reset it for you.
 #0
@@ -8562,14 +8585,15 @@ traveling and require some rest to conti
 See also: MANA, HITPOINTS
 #0
 CIRCLEMUD CREDITS
-                    C  I  R  C  L  E  M  U  D     3  .  5
 
-CircleMUD was developed from DikuMUD (Gamma 0.0) by Jeremy "Ras" Elson at
-Johns Hopkins University's Department of Computer Science.  All code unique
-to CircleMUD is protected under a copyright by the Trustees of the Johns
-Hopkins University.
+                        t  b  a  M  U  D     3  .  5  1
 
-Many, many people contributed to CircleMUD in one way or another throughout
+tbaMUD (formerly known as CircleMUD) was developed from DikuMUD (Gamma 0.0) by 
+Jeremy "Ras" Elson at Johns Hopkins University's Department of Computer Science.
+All code unique to tbaMUD is protected under a copyright by the Trustees of 
+the Johns Hopkins University.
+
+Many, many people contributed to tbaMUD in one way or another throughout
 the course of its development.  Although it is impossible for me to remember
 them all, I'd like to extend special thanks to certain people:
 
@@ -8594,16 +8618,15 @@ them all, I'd like to extend special tha
 ...plus everyone else in the Circle community who has submitted material!
 Thanks everyone!
 
-  Anonymous FTP:  ftp.circlemud.org or ftp2.circlemud.org in pub/CircleMUD
   Bugs and Help:  builderacademy.net 9091
-            URL:  http://www.circlemud.org/
-   Mailing List:  listserv@@post.queensu.ca
-                  (write "subscribe circle <first name> <last name>")
+            URL:  http://tbaMUD.com/
+   Mailing List:  http://cwg.lazuras.org/
 
 --Jeremy Elson
 
-CircleMUD is currently being developed by The Builder Academy and all bugs and
-requests for help should be directed to: builderacademy.net 9091
+tbaMUD (formerly known as CircleMUD) is currently being developed by The 
+Builder Academy. All bugs and requests for help should be directed to: 
+builderacademy.net 9091
 
 --Rumble
 #0
@@ -9105,7 +9128,7 @@ Level 31 builders can not drop objects o
 
 See also: DONATE, GET, JUNK
 #0
-EATING DRINKING SIP TASTE HUNGRY HUNGER THIRSTY FOOD
+EATING DRINKING SIP TASTE HUNGRY HUNGER THIRSTY FOOD NIBBLE
 
 Usage: eat <item>
        taste [from] <item>
@@ -9120,7 +9143,7 @@ If you're hungry or thirsty, these comma
   > sip fountain
   
 If you taste or sip, you don't get large portions and won't be
-hurt badly by poison. You don't get satisfied either, though.
+hurt badly by poison. You :Sdon't get satisfied either, though.
 
 Thirst and Hunger are modified by objects in units of hours. So an object
 with 24 drink units will quench thirst for 24 hours. Same for food. 
@@ -9145,9 +9168,10 @@ See also: SOCIALS, GEMOTE
 GEMOTES GMOTES EMOTICONS
 
 Usage: gemote <social>
+       gemote @@ <message>
 
-Allows you to perform socials over gossip for everyone on the gossip channel 
-to see.
+Allows you to perform socials or messages like emote over gossip for everyone 
+on the gossip channel to see.
 
 Example:
 If your name is "Manivo",
@@ -9754,11 +9778,10 @@ Accumulative: -
 Duration    : Instantaneous
 Level       : Mage level 6.
 
-If possible you will know exactly where an object is, or the
-name of the person using it.  If more than one object by the
-same name exists, you will get a listing of several objects.
-The maximum number of objects you can simultaneously locate is
-your level divided by 2.
+If possible you will know exactly where an object is, or the name of the person 
+using it.  If more than one object by the same name exists, you will get a 
+listing of several objects. The maximum number of objects you can 
+simultaneously locate is your level divided by 2.
 #0
 MAGIC-MISSILE
 
@@ -9840,7 +9863,7 @@ This spell is more powerful than the bur
 
 See also: BURNING-HANDS
 #0
-SENSE-LIFE
+SENSE-LIFE DETECT-LIFE
 
 Usage       : cast 'sense life'
 Accumulative: Yes (Duration)
@@ -9970,7 +9993,7 @@ room.
 
 See also: GROUP, TELL, SAY
 #0
-HELPFILES
+HELPFILES HELP-FILES
 
 Usage: help [command]
 
@@ -10009,16 +10032,15 @@ from the guest list.
 
 See also: HOUSES
 #0
-POLICIES INFO NEWS POLICY VERSION UPDATES
+POLICIES INFO NEWS POLICY VERSION UPDATES RULES
 
-These commands show you important information about CircleMUD.  It is a good
-idea to read them every once in a while.
+These commands show you important information about tbaMUD.
 
    info     - useful information about the game for beginners
    news     - latest changes to the code and areas
    policy   - policies on topics like player killing
-   credits  - the people who made CircleMUD possible!
-   version  - displays the current CircleMUD version number
+   credits  - the people who made tbaMUD possible!
+   version  - displays the current tbaMUD version number
 
 #0
 INVENTORY
@@ -10169,7 +10191,7 @@ Usage: notell
 Use NO<channel> if you wish to stop using and seeing that channel. A 
 (no<channel>) flag will appear after your name in the WHO list.
 
-See also: TOGGLE, FLAGS, TELL, TOGGLE, WHO
+See also: TOGGLE, FLAGS, TELL, WHO
 #0
 OFFER RENTING UNRENTING UN-RENTING 
 
@@ -10770,7 +10792,7 @@ Examples:
 
 See also: FLEE, TOGGLE
 #0
-SOCIALS
+SOCIALS ALIST
 
 Usage: socials
 
@@ -10857,13 +10879,12 @@ DELETE SUICIDE
 select the option to delete your character. 
 
 #0
-SEARCH FLY PEEK SCAN WHOIS OOC OUT-OF-CHARACTER DUALWIELD DUAL-WIELD SINGING REMORTS RECLASS CLANS SWIMMING COMPARE IEDIT LANGUAGES PERCENT-LOADING PERCENTAGE-LOADING IDENTIFY CLONES CLONING CLANS MUSIC
+SEARCH FLY PEEK SCAN WHOIS OOC OUT-OF-CHARACTER DUALWIELD DUAL-WIELD SINGING REMORTS RECLASS CLANS SWIMMING COMPARE IEDIT LANGUAGES PERCENT-LOADING PERCENTAGE-LOADING IDENTIFY CLONES CLONING CLANS MUSIC RACES
 
    Not implemented.
 
 #0
-ORDINAL-DIRECTIONS NORTHWEST NORTHEAST SOUTHWEST SOUTHEAST NW SW SE NE STATLIST GEDIT TRUST ZDELETE TCLONE OCLONE MCLONE XCLONES RCOPY OCOPY MCOPY ZCOPY MOUNTS RIDE TAME PARALYZE HASTE BLOCKING IGNORE COOK CAMPFIRES HORSES ZONE-DELETE
-
+ORDINAL-DIRECTIONS NORTHWEST NORTHEAST SOUTHWEST SOUTHEAST NW SW SE NE STATLIST GEDIT TRUST ZDELETE TCLONE OCLONE MCLONE XCLONES OCOPY MCOPY ZCOPY MOUNTS RIDE TAME PARALYZE HASTE BLOCKING IGNORE COOK CAMPFIRES HORSES ZONE-DELETE IMC LINKLOAD
 
    Not implemented.
 
@@ -10964,22 +10985,24 @@ you are logged in the MUD or not.
 BACKDOOR HACKING 
 
    Not a good thing to be searching for help on. Your IP address has been logged
-and we will be contacting your service provider. Just Kidding. CircleMUD is 
+and we will be contacting your service provider. Just Kidding. tbaMUD is 
 actually very stable. I have never heard of one being hacked except via weak or
 compromised passwords. 
 
 #0
 DIKU ROM DBX DBZ SMAUG
 
-   These are other types of MUD codebases. We only focus on the latest version
-of CircleMUD here.
+   These are other types of MUD codebases. We only focus on tbaMUD (the codebase
+formerly known as CircleMUD).
+
 #0
 HISTORY
 
-Usage: history
+Usage: history < all | say | gossip | wiznet | tell | shout | grats | holler | auction >
 
-   Shows last 100 communications your player has seen while in the game. 
-Automatically clears after you check it or leave the game.
+   This command displays what has been said over the channel you input along
+with a time stamp for when it was sent. History all will list the history of
+all channels.
 
 See also: CHANNELS
 #0
@@ -11046,4 +11069,31 @@ Thanks to ...
 Share and enjoy.
 MERC Industries
 #0
+PROMOTE PROMOTIONS ADVANCEMENTS RAISES LVLS LEVELS GAINS 31 32 33 34 RANKS RANKING HIRING 
+
+   Here at The Builder Academy the level of an immortal generally denotes
+their skill at building. This makes it easier for people to know who is in 
+charge, who they can ask for help, and who they should be wary of taking tips 
+from. I encourage everyone to help each other. Just realize that if the person
+is not at least level 32 they may have relatively little experience.
+  
+Level 31 (Immortal) Anyone who is new to TBA and is working on their trial vnum
+         or zone.
+Level 32 (God) An experienced builder that has proven their knowledge and is
+         willing to teach others. Level 32 and above is considered staff.
+Level 33 (Greater God) An experienced builder that has contributed significantly
+         to TBA.
+Level 34 (Implementor) Welcor and I (Rumble). Welcor codes, I administrate.
+
+   Do not bother asking to be advanced, and if that is why you are here, you
+are wasting your time. Note, this does not mean you are not a quality builder,
+but TBA is not your typical MUD. On the contrary, we are here as dedicated
+people to help you learn to build. Because of this the only chance of
+advancement is if you are willing to learn to build and then help teach others.
+If you are willing to give back to the tbaMUD community, and have the
+necessary skills to do so, you will be advanced and given further privileges
+to help teach others. Generally, if you have to ask for a promotion you will be
+less likely to receive it. Performance is everything here.
+
+#0
 $~
diff -BburpN --exclude=.svn tbamud-3.51/lib/text/motd tbamud-3.52/lib/text/motd
--- tbamud-3.51/lib/text/motd	2007-02-24 22:36:50.000000000 +0100
+++ tbamud-3.52/lib/text/motd	2007-04-20 16:46:16.000000000 +0200
@@ -2,7 +2,7 @@
 
       Welcome to
 
-		       T  B  A  M   U   D     3  .  5  1
+        		       T  B  A  M   U   D
                   "We addict players for their own enjoyment."
                             Created by Jeremy Elson
 
diff -BburpN --exclude=.svn tbamud-3.51/lib/text/news tbamud-3.52/lib/text/news
--- tbamud-3.51/lib/text/news	2007-02-24 22:36:50.000000000 +0100
+++ tbamud-3.52/lib/text/news	2007-04-20 16:46:16.000000000 +0200
@@ -1,77 +1,75 @@
 (lib/text/news)
-
-			    THE tbaMUD HERALD
+			   THE 2007 tbaMUD HERALD
    		 "We addict players for their own enjoyment."
-			      February, 2007
-
 
 NEW COMMANDS AND NEW MUD BEHAVIOR:
 ---------------------------------
-**  Over 100 new socials, check them out and feel free to suggest new ones.
+**  Added questpoints so be sure to ask about quests.
+
+**  Added furniture for your MUDding comfort.
 
-**  You will now be notified when you have new mail.
+**  You will now be immediately notified when you have new mail, when coming
+    back from AFK and reconnecting.
 
 **  New toggles: autoloot, autogold, autosplit, autosac, and autoassist.
 
 **  Improved toggle command allowing more options.
 
-**  You can now use the history command to see the last 100 communications
-    from all the channels. It clears upon viewing or log off.
+**  You can now use the history command to see a log of all channels.
 
 **  Your mail will now be saved so you will not lose it when you log off.
 
-**  You can now use the AFK toggle to let people see you are gone under
-    who.
+**  NEW AFK toggle that displays in your prompt, under who, and when people
+    look at the room.
 
 **  You now have almost 180 stock zones to play.
 
 **  You can now interact with rooms, mobs, and objects through triggers.
 
-**  Multiple objects will now be stacked and preceeded by a quantity so
-    your inventory won't be as long. (3) A waybread.
+**  Multiple objects will now be stacked and preceeded by a quantity so your 
+    inventory won't be as long. i.e. (3) A waybread.
 
-**  Over 100 new socials, and the gemote command to use socials over the 
-    gossip channel. Socials can now target bodyparts too, behave.
+**  Over 100 new socials, and the gemote command to use socials over the gossip
+    channel. Socials can now target bodyparts too, behave. Check them out and 
+    feel free to suggest new ones.
 
 **  You can now use color! @RHELP COLORCODES@n.
 
-**  Added new invisible mobs and objects so everything may not be as it
-    appears (not even visible with detect invis).
+**  Added new invisible mobs and objects so everything may not be as it appears
+    (not even visible with detect invis and sense life).
 
 **  Added an online dictionary. Tell m-w <word>.
 
-**  The player description length has been increased so please write a 
-    decent description for yourself.
+**  The player description length has been increased so please write a decent 
+    description for yourself.
 
-**  You can now set your pagelength with the same command.
+**  You can now set your pagelength!
 
 **  You can now "look around" to see anything of interest in the room. But,
     some things may still be hidden and require further investigation.
 
-**  You can now use "all" and "all.x" very generally with the get, put,
-    drop, junk, donate, give, wear and remove commands.  Type HELP GET
-    for more info.
-
-**  The "track" function will show you the first step on the shortest
-    path to anyone in the game.
-
-**  You can now remove your own messages from the board.  Also, if you
-    put someone else's name in parentheses in the message header, they
-    will be able to remove the message too.
-
-**  The MIDGAARD MAIL SYSTEM is now complete.  The Post Office is north
-    of the entrance to the Grunting Boar inn.  Stamps cost 150 coins.
-
-**  Fountains have now been implemented.  You can drink from fountains
-    or fill containers from fountains using the FILL command.
-
-**  The SHOUT command, as always, only reaches people in your zone (you
-    can see who these people are by typing WHERE).  The HOLLER command
-    reaches everyone in the game but costs extra movement points.
-
-**  When you are writing a message, you will now not be interrupted
-    by tells, shouts, emotes, socials, and even people talking in the
-    same room.
+**  You can now use "all" and "all.x" very generally with the get, put, drop, 
+    junk, donate, give, wear and remove commands.  Type HELP GET for more info.
+
+**  The "track" function will show you the first step on the shortest path to 
+    anyone in the game.
+
+**  You can now remove your own messages from the board.  Also, if you put 
+    someone else's name in parentheses in the message header, they will be 
+    able to remove the message too.
+
+**  The MIDGAARD MAIL SYSTEM is now complete.  The Post Office is north of the 
+    entrance to the Grunting Boar inn.  Stamps cost 150 coins.
+
+**  Fountains have now been implemented.  You can drink from fountains or fill 
+    containers from fountains using the FILL command.
+
+**  The SHOUT command, as always, only reaches people in your zone (you can see
+    who these people are by typing WHERE).  The HOLLER command reaches everyone
+    in the game but costs extra movement points.
+
+**  When you are writing a message, you will now not be interrupted by tells, 
+    shouts, emotes, socials, and even people talking in the same room.
 
 *****************************************************************************
     IF YOU LEAVE THE GAME FOR MORE THAN AN HOUR, either by renting or plain
@@ -79,8 +77,8 @@ NEW COMMANDS AND NEW MUD BEHAVIOR:
     when you come back!  This doesn't work if you're poisoned.
 *****************************************************************************
 
-**  Use the ASSIST command to engage in mortal combat with someone in the
-    room who is getting pummeled.
+**  Use the ASSIST command to engage in mortal combat with someone in the room
+    who is getting pummeled.
 
 **  Use the SPLIT command to split gold among the members of your group
     (including yourself) who are in the room.  i.e. If you are in a group
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/mob/2.mob tbamud-3.52/lib/world/mob/2.mob
--- tbamud-3.51/lib/world/mob/2.mob	2007-02-24 22:39:30.000000000 +0100
+++ tbamud-3.52/lib/world/mob/2.mob	2007-04-20 16:47:38.000000000 +0200
@@ -160,4 +160,33 @@ bdnopqr 0 0 E
 8 8 2
 E
 T 167
+#211
+phoenix~
+the phoenix~
+A phoenix looks up at you with intelligent eyes.
+~
+   This beautiful and magical bird is the source of many tales.  Most so
+outrageous they can't be true, or can they?
+~
+bd 0 0 E
+3 19 8 0d0+30 1d2+0
+0 900
+8 8 0
+E
+T 203
+#212
+pirate parrot~
+a parrot with an eye patch~
+This parrot seems to have lost his pirate. He squawks incessantly.
+~
+   The parrot paces back and forth with a look of authority.  The usual
+scratching of its small feet is punctuated by a thudding.  Upon closer
+inspection the parrot has a wooden leg and an eye patch!
+~
+bd 0 0 E
+30 10 -8 6d6+300 5d5+5
+300 90000
+8 8 1
+E
+T 204
 $
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/obj/0.obj tbamud-3.52/lib/world/obj/0.obj
--- tbamud-3.51/lib/world/obj/0.obj	2007-02-24 22:38:58.000000000 +0100
+++ tbamud-3.52/lib/world/obj/0.obj	2007-04-20 16:47:13.000000000 +0200
@@ -189,7 +189,7 @@ A steaming pile of stool has recently be
 0 0 0 0
 1 1 0 0
 #15
-quest token~
+quest_token_zone_1 token~
 a quest token~
 A quest token needs to be returned to the questmaster.~
 ~
@@ -1137,13 +1137,19 @@ two ankle braces.
 A
 14 -5
 #87
-lightwing's board~
-free~
-Lightwing's board is floating here.~
+throne chair bayonets~
+a throne of bayonets~
+A throne of sharp bayonets looks like the last place you would want to sit.~
+~
+6 0 0 0
+1 0 0 0
+50 100 0 0
+E
+throne chair bayonets~
+   The chair is made completely out of bayonets with the sharpest points in the
+most inconvenient of spots.  A plaque on the bottom reads: "You can build a
+throne of bayonets, but you can't sit on it for long."  
 ~
-13 0 0 0
-0 0 0 0
-0 0 0 0
 #88
 idleout timer stayalive bracelet~
 Rumble's stayalive bracelet~
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/obj/1.obj tbamud-3.52/lib/world/obj/1.obj
--- tbamud-3.51/lib/world/obj/1.obj	2007-02-24 22:38:53.000000000 +0100
+++ tbamud-3.52/lib/world/obj/1.obj	2007-04-20 16:47:12.000000000 +0200
@@ -401,7 +401,7 @@ a backpack~
 A backpack is here.~
 ~
 15 0 ao 0
-10 0 0 0
+0 0 -1 0
 5 250 0 0
 E
 backpack~
@@ -1007,7 +1007,7 @@ A bar of platinum must have been dropped
 ~
 8 0 a 0
 0 0 0 0
-3 1 0 0
+10 300 0 0
 E
 bar platinum~
    The platinum bar is formed perfectly into a rectangular block.  Its surface
@@ -1020,7 +1020,7 @@ A bar of mithril must have been dropped 
 ~
 8 0 a 0
 0 0 0 0
-3 1 0 0
+10 300 0 0
 E
 bar mithril~
    The mithril bar is formed perfectly into a rectangular block.  Its surface
@@ -1033,7 +1033,7 @@ A bar of gold must have been dropped her
 ~
 8 0 a 0
 0 0 0 0
-1 1 0 0
+10 200 0 0
 E
 bar gold~
    The gold bar is formed perfectly into a rectangular block.  Its surface is
@@ -1046,7 +1046,7 @@ A bar of silver must have been dropped h
 ~
 8 0 a 0
 0 0 0 0
-1 1 0 0
+10 100 0 0
 E
 bar silver~
    The silver bar is formed perfectly into a rectangular block.  Its surface is
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/obj/2.obj tbamud-3.52/lib/world/obj/2.obj
--- tbamud-3.51/lib/world/obj/2.obj	2007-02-24 22:38:58.000000000 +0100
+++ tbamud-3.52/lib/world/obj/2.obj	2007-04-20 16:47:13.000000000 +0200
@@ -240,22 +240,36 @@ A loaf of freshly baked bread was left h
 19 0 a 0
 5 0 0 0
 1 10 0 0
+#219
+pile ashes~
+a pile of ashes~
+A pile of ashes is slowly being blown away by the wind.~
+~
+12 0 0 0
+0 0 0 0
+0 0 0 0
+T 212
+E
+pile ashes~
+   The ashes are an unnatural mix of black and silver powder.  Too fine to have
+come from a regular fire.
+~
 #251
 marble fountain~
 a marble fountain~
 A large fountain with two statues standing protectively above it.~
 ~
 23 0 0 0
-500 500 0 0
+-1 -1 0 0
 0 0 0 0
 T 201
 E
-fountain~
-   This is the most beautiful fountain you have ever set your eyes upon!  It
-has a marble bottom, which is clean enough to eat off from.  In the center of
-the fountain, you see some stone FIGURES.  They have their mouths open.  As you
-look closely you can see that there is water streaming out from the mouths.  
-What a neat idea!    
+rumble names ferret~
+   To bring peace where there was only war.  To bring justice where there was
+only inequity.  To bring freedom where there was only coercion.  To bring
+balance where there was only chaos.  To bring Sanctum to the world.    
+
+DO NOTE ENTER FOUNTAIN!
 ~
 E
 statues figures~
@@ -263,11 +277,11 @@ statues figures~
 below the names but you must look more closely to read it.    
 ~
 E
-rumble names ferret~
-   To bring peace where there was only war.  To bring justice where there was
-only inequity.  To bring freedom where there was only coercion.  To bring
-balance where there was only chaos.  To bring Sanctum to the world.    
-
-DO NOTE ENTER FOUNTAIN!
+fountain~
+   This is the most beautiful fountain you have ever set your eyes upon!  It
+has a marble bottom, which is clean enough to eat off from.  In the center of
+the fountain, you see some stone FIGURES.  They have their mouths open.  As you
+look closely you can see that there is water streaming out from the mouths.  
+What a neat idea!    
 ~
 $~
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/obj/3.obj tbamud-3.52/lib/world/obj/3.obj
--- tbamud-3.51/lib/world/obj/3.obj	2007-02-24 22:38:53.000000000 +0100
+++ tbamud-3.52/lib/world/obj/3.obj	2007-04-20 16:47:12.000000000 +0200
@@ -200,13 +200,13 @@ A small sword lies here.~
 0 1 6 11
 3 60 0 0
 E
-sword small~
-   The small sword seems to have an inscription of some sort inscription...  
-~
-E
 inscription~
    It says: 'May this sword be a good companion.  '
 ~
+E
+sword small~
+   The small sword seems to have an inscription of some sort inscription...  
+~
 #322
 sword long~
 a long sword~
@@ -286,12 +286,12 @@ atm teller bank machine~
 occurrences to the bank manager.  
 ~
 #335
-fountain water~
+fountain water marble~
 the large fountain~
-A crumbled down fountain is seeping water through its side is barely surviving here.~
+An elegant fountain of marble gurgles peacefully.~
 ~
-23 cdeg 0 0
-500 500 15 0
+23 e 0 0
+0 -1 0 0
 0 0 0 0
 E
 marble blue streaked~
@@ -612,13 +612,13 @@ A large, sociable bulletin board is moun
 0 0 0 0
 0 0 0 0
 E
-board~
-   If you can read this, the board is not working.  
-~
-E
 social bulletin~
    Use 'look board' to read the board.  
 ~
+E
+board~
+   If you can read this, the board is not working.  
+~
 #397
 board frozen bulletin~
 a frozen bulletin board~
@@ -628,13 +628,13 @@ A large bulletin board is here, carved f
 0 0 0 0
 0 0 0 0
 E
-board~
-   If you can read this, the board is not working.  
-~
-E
 freeze bulletin~
    Use 'look board' to read the board.  
 ~
+E
+board~
+   If you can read this, the board is not working.  
+~
 #398
 board holy bulletin~
 a holy bulletin board~
@@ -644,13 +644,13 @@ A large bulletin board is mounted on a w
 0 0 0 0
 0 0 0 0
 E
-board~
-   If you can read this, the board is not working.  
-~
-E
 holy bulletin~
    Use 'look board' to read the board.  
 ~
+E
+board~
+   If you can read this, the board is not working.  
+~
 #399
 board bulletin~
 a bulletin board~
@@ -660,11 +660,11 @@ A large bulletin board is mounted on a w
 0 0 0 0
 0 0 0 0
 E
-board~
-   If you can read this, the board is not working.  
-~
-E
 bulletin~
    Use 'look board' to read the board.  
 ~
+E
+board~
+   If you can read this, the board is not working.  
+~
 $~
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/0.trg tbamud-3.52/lib/world/trg/0.trg
--- tbamud-3.51/lib/world/trg/0.trg	2007-02-24 22:39:18.000000000 +0100
+++ tbamud-3.52/lib/world/trg/0.trg	2007-04-20 16:47:27.000000000 +0200
@@ -5,7 +5,7 @@ Non-attachable trigger~
 * You can't attach trigger 0!
 ~
 #1
-Mob Tutorial Example Quest Offer - 14~
+Mob Tutorial Example Quest Offer - M14~
 0 g 100
 ~
 * we don't want him to tell this to mobs. Check if actor is a player.
@@ -93,85 +93,98 @@ else
 end
 ~
 #6
-Obj Command Magic Eight Ball - 47~
-1 c 100
+Obj Command Magic Eight Ball - O47~
+1 c 2
 shake~
-* Numeric Arg: 2 means in character's carried inventory
-* does not work for level 32 and above.
+* By Rumble of The Builder Academy builderacademy.net 9091
+* Numeric Arg: 2 means in character's carried inventory.
+* Command trigs do not work for level 32 and above.
 * There are 20 possible answers that the Magic Eight Ball can give. 
 * Of these, nine are full positive, two are full negative, one is 
 * mostly positive, three are mostly negative, and five are abstentions. 
 *
+* Check arguments if they match. /= checks abbreviations.
 if ball /= %arg% || eightball /= %arg%
-  %echoaround% %actor% %actor.name% shakes the magic eight ball vigorously.
-  %send% %actor% You shake the magic eight ball vigorously.
+  * Echo text to everyone else in the room and the actor.
+  %echoaround% %actor% %actor.name% shakes %self.shortdesc% vigorously.
+  %send% %actor% You shake %self.shortdesc% vigorously.
+  * Use a switch to choose a random response (1-20).
   switch %random.20%
+    * Send the answer! %self% is the 8ball, or whatever the trig is attached to.
+    * Only the actor sees the answer.
+    * Case is what we are trying to match. Does %random.20% == 1? 
     case 1
-      %send% %actor% The magic eight ball reveals the answer: Outlook Good 
+      %send% %actor% %self.shortdesc% reveals the answer: Outlook Good 
+      * We are done with this case so check the next one.
     break
     case 2
-      %send% %actor% The magic eight ball reveals the answer: Outlook Not So Good 
+      %send% %actor% %self.shortdesc% reveals the answer: Outlook Not So Good 
     break
     case 3
-      %send% %actor% The magic eight ball reveals the answer: My Reply Is No
+      %send% %actor% %self.shortdesc% reveals the answer: My Reply Is No
     break
     case 4
-      %send% %actor% The magic eight ball reveals the answer: Don't Count On It
+      %send% %actor% %self.shortdesc% reveals the answer: Don't Count On It
     break
     case 5
-      %send% %actor% The magic eight ball reveals the answer: You May Rely On It
+      %send% %actor% %self.shortdesc% reveals the answer: You May Rely On It
     break
     case 6
-      %send% %actor% The magic eight ball reveals the answer: Ask Again Later
+      %send% %actor% %self.shortdesc% reveals the answer: Ask Again Later
     break
     case 7
-      %send% %actor% The magic eight ball reveals the answer: Most Likely 
+      %send% %actor% %self.shortdesc% reveals the answer: Most Likely 
     break
     case 8
-      %send% %actor% The magic eight ball reveals the answer: Cannot Predict Now
+      %send% %actor% %self.shortdesc% reveals the answer: Cannot Predict Now
     break
     case 9
-      %send% %actor% The magic eight ball reveals the answer: Yes 
+      %send% %actor% %self.shortdesc% reveals the answer: Yes 
     break
     case 10
-      %send% %actor% The magic eight ball reveals the answer: Yes, definitely
+      %send% %actor% %self.shortdesc% reveals the answer: Yes, definitely
     break
     case 11
-      %send% %actor% The magic eight ball reveals the answer: Better Not Tell You Now 
+      %send% %actor% %self.shortdesc% reveals the answer: Better Not Tell You Now 
     break
     case 12
-      %send% %actor% The magic eight ball reveals the answer: It Is Certain
+      %send% %actor% %self.shortdesc% reveals the answer: It Is Certain
     break
     case 13
-      %send% %actor% The magic eight ball reveals the answer: Very Doubtful
+      %send% %actor% %self.shortdesc% reveals the answer: Very Doubtful
     break
     case 14
-      %send% %actor% The magic eight ball reveals the answer: It Is Decidedly So
+      %send% %actor% %self.shortdesc% reveals the answer: It Is Decidedly So
     break
     case 15
-      %send% %actor% The magic eight ball reveals the answer: Concentrate And Ask Again
+      %send% %actor% %self.shortdesc% reveals the answer: Concentrate And Ask Again
     break
     case 16
-      %send% %actor% The magic eight ball reveals the answer: Signs Point To Yes 
+      %send% %actor% %self.shortdesc% reveals the answer: Signs Point To Yes 
     break
     case 17
-      %send% %actor% The magic eight ball reveals the answer: My Sources Say No 
+      %send% %actor% %self.shortdesc% reveals the answer: My Sources Say No 
     break
     case 18
-      %send% %actor% The magic eight ball reveals the answer: Without A Doubt 
+      %send% %actor% %self.shortdesc% reveals the answer: Without A Doubt 
     break
     case 19
-      %send% %actor% The magic eight ball reveals the answer: Reply Hazy, Try Again
+      %send% %actor% %self.shortdesc% reveals the answer: Reply Hazy, Try Again
     break
     case 20
-      %send% %actor% The magic eight ball reveals the answer: As I See It, Yes
+      %send% %actor% %self.shortdesc% reveals the answer: As I See It, Yes
     break
+    * Every switch should have a default. A catch-all if the cases do not match.
     default
-      %send% %actor% The magic eight ball explodes since your question is unanswerable.
+      %send% %actor% %self.shortdesc% explodes since your question is unanswerable.
     break
+    * Every switch must have a done! Just like every if needs an end!
   done
+  * The actor didn't use the command shake with arg ball or eightball.
 else
-  %send% %actor% shake What?
+  * Return 0 allows the command to continue through to the MUD. The player will 
+  * get the Huh!?! response or the shake social if you have one.
+  return 0
 end
 ~
 #7
@@ -495,34 +508,63 @@ end
 * end
 ~
 #23
-Object While Damage Example~
+While Damage Example - Grenade O1301~
 1 h 100
 ~
-* By Rumble
-* A script to make a bomb go off 3 seconds after it is dropped.
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* A small script to make a grenade go off 3 seconds after it is dropped.
+* Set the rooms ID to a variable.
+set room_var %actor.room%
+wait 3 s
+* Send a message when the bomb goes off.
+%echo% The Grenade blasts into smithereens, striking everyone here.
+* Target the first char.
+set target_char %room_var.people%
+* Now loop through everyone in the room and hurt them.
+while %target_char%
+  %send% %actor% People: %target_char.name%
+  %send% %actor% Next_in_room: %self.next_in_room%
+  * Set the next target before this one perhaps dies.
+  set tmp_target %target_char.next_in_room%
+  * This is where the good/bad things are supposed to happen.
+  %send% %target_char% The explosion hurts you.
+  * Damage them... 30 hitpoints. To heal use -#.
+  %damage% %target_char% 30
+  * Set the next target.
+  set target_char %tmp_target%
+  * Loop back.
+done
+* After we go through everyone get rid of the grenade.
+%purge% %self%
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* A small script to make a grenade go off 3 seconds after it is dropped.
+* Set the rooms ID to a variable.
 set room_var %actor.room%
-* Wait, then send a message when the bomb goes off.
 wait 3 s
+* Send a message when the bomb goes off.
 %echo% The Grenade blasts into smithereens, striking everyone here.
-* Target the first char
+* Target the first char.
 set target_char %room_var.people%
-* Do stuff
+* Now loop through everyone in the room and hurt them.
 while %target_char%
   * Set the next target before this one perhaps dies.
   set tmp_target %target_char.next_in_room%
   * This is where the good/bad things are supposed to happen.
   %send% %target_char% The explosion hurts you.
+  * Damage them... 30 hitpoints. To heal use -#.
   %damage% %target_char% 30
-  * Find next target
+  * Set the next target.
   set target_char %tmp_target%
-  * Loop back
+  * Loop back.
 done
+* After we go through everyone get rid of the grenade.
+%purge% %self%
 ~
 #24
 Room While Teleport Example~
 2 b 100
 ~
-* By Rumble
+* By Rumble of The Builder Academy    builderacademy.net 9091
 * Target the first person or mob in the room.
 eval person %self.people%
 wait 1 sec
@@ -1196,14 +1238,14 @@ Container with Personal Key~
 *~
 * By Jamie Nelson from the forum http://groups.yahoo.com/group/dg_scripts/
 * Container script for use with no key
-if %actor.is_pc%
+if !%actor.is_pc%
   return 0 
   halt
 end
 *
 switch %cmd%
   case codeset
-    if %actor.name% != test
+    if %actor.name% != rumble
       %send% %actor% I am sorry %actor.name%, only Rumble can set the code.
       halt
     end
@@ -1424,87 +1466,25 @@ else
 end
 ~
 #49
-free~
-1 c 2
-shake~
-* By Rumble
-* Numeric Arg: 2 means in character's carried inventory
-* does not work for level 32 and above.
-* There are 20 possible answers that the Magic Eight Ball can give. 
-* Of these, nine are full positive, two are full negative, one is 
-* mostly positive, three are mostly negative, and five are abstentions. 
+Eval and Set Example~
+2 d 100
+test~
+* By Rumble of The Builder Academy builderacademy.net 9091
+* This is a speech trig @RHELP TRIGEDIT ROOM SPEECH@n, say 'test' to activate.
+* There is much confusion about the difference between set and eval. So this is
+* the simplest way I can think of to explain it (assume %actor.level% = 34):
+*
+* Set stores the variable and will not process it until called.
+* In the example below %set_variable% will contain '34 + 1' 
+set set_variable %actor.level% + 1
+%echo% Set Variable: %set_variable%
+*
+* Eval immediately evaluates the variable. 
+* In the example below %eval_variable% will contain '35'
+eval eval_variable %actor.level% + 1
+%echo% Eval Variable: %eval_variable%
 *
-if %arg% /= ball || %arg% /= eightball
-  %echoaround% %actor.name% %actor.name% shakes the magic eight ball vigorously.
-  %send% %actor% You shake the magic eight ball vigorously.
-    switch %random.20%
-      case 1
-        %send% %actor% The magic eight ball reveals the answer: Outlook Good 
-      break
-      case 2
-        %send% %actor% The magic eight ball reveals the answer: Outlook Not So Good 
-      break
-      case 3
-        %send% %actor% The magic eight ball reveals the answer: My Reply Is No
-      break
-      case 4
-        %send% %actor% The magic eight ball reveals the answer: Don't Count On It
-      break
-      case 5
-        %send% %actor% The magic eight ball reveals the answer: You May Rely On It
-      break
-      case 6
-        %send% %actor% The magic eight ball reveals the answer: Ask Again Later
-      break
-      case 7
-        %send% %actor% The magic eight ball reveals the answer: Most Likely 
-      break
-      case 8
-        %send% %actor% The magic eight ball reveals the answer: Cannot Predict Now
-      break
-      case 9
-        %send% %actor% The magic eight ball reveals the answer: Yes 
-      break
-      case 10
-        %send% %actor% The magic eight ball reveals the answer: Yes Definately
-      break
-      case 11
-        %send% %actor% The magic eight ball reveals the answer: Better Not Tell You Now 
-      break
-      case 12
-        %send% %actor% The magic eight ball reveals the answer: It Is Certain
-      break
-      case 13
-        %send% %actor% The magic eight ball reveals the answer: Very Doubtful
-      break
-      case 14
-        %send% %actor% The magic eight ball reveals the answer: It Is Decidedly So
-      break
-      case 15
-        %send% %actor% The magic eight ball reveals the answer: Concentrate And Ask Again
-      break
-      case 16
-        %send% %actor% The magic eight ball reveals the answer: Signs Point To Yes 
-      break
-      case 17
-        %send% %actor% The magic eight ball reveals the answer: My Sources Say No 
-      break
-      case 18
-        %send% %actor% The magic eight ball reveals the answer: Without A Doubt 
-      break
-      case 19
-        %send% %actor% The magic eight ball reveals the answer: Reply Hazy, Try Again
-      break
-      case 20
-        %send% %actor% The magic eight ball reveals the answer: As I See It, Yes
-      break
-      default
-        %send% %actor% The magic eight ball explodes since your question is unanswerable.
-      break
-    done
-else
-%send% %actor% shake What?
-end
+%echo% Level: %actor.level%
 ~
 #50
 Room Global Random Example~
@@ -1533,16 +1513,8 @@ Room Random Example~
 * Fires only when a player is in the room.
 * Actor is not defined with random, so lets define it.
 set actor %random.char%
-%damage% %actor% -100
+%damage% %actor% -10
 %echo% A healing breeze flows through the room.
-* Example by Snowlock
-* %echo% The pungent fumes burn your lungs!
-* set target_char %self.people%
-* while %target_char%
-*   set tmp_target %target_char.next_in_room%
-*   %damage% %target_char% 3
-*   set target_char %tmp_target%
-* done
 ~
 #52
 Room Command Example~
@@ -2107,8 +2079,6 @@ eval thing %self.name.car%
 %echo% IT, YOU, HE/SHE:         &%thing%
 %echo% IT, YOU, HIM/HER:        *%thing%
 %echo% ITS, YOUR' HIS/HER:      ^%thing%
-* object only
-%echo% SOMETHING, NAME          '%thing%
 ~
 #92
 Room Command Combination Lock~
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/1.trg tbamud-3.52/lib/world/trg/1.trg
--- tbamud-3.51/lib/world/trg/1.trg	2007-02-24 22:39:19.000000000 +0100
+++ tbamud-3.52/lib/world/trg/1.trg	2007-04-20 16:47:27.000000000 +0200
@@ -443,6 +443,10 @@ end
 Mob Act - 156 speaker greet~
 0 e 0
 has entered the game.~
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Num Arg 0 means the argument has to match exactly. So trig will only fire off:
+* "has entered game." and not "has" or "entered" etc. (that would be num arg 1).
+* Figure out what vnum the mob is in so we can use zoneecho.
 eval inroom %self.room%
 %zoneecho% %inroom.vnum% %self.name% shouts, 'Welcome, %actor.name%!'
 ~
@@ -598,42 +602,58 @@ end
 Thief Guildguard - 177~
 0 q 100
 ~
-* Check the direction the player must go to enter the guild.
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* This replaces stock guildguard spcial procedure that stops non-class members.
 if %direction% == up
+  * Let the guildmaster pass to pawn players items. T137.
   if %actor.vnum% == 122
     halt
   end
   * Stop them if they are not the appropriate class.
   if %actor.class% != thief
     return 0
+    * Just send the block message to players.
+    if %actor.is_pc%
     %send% %actor% The guard humiliates you, and blocks your way.
     %echoaround% %actor% The guard humiliates %actor.name%, and blocks %actor.hisher% way.
   end
+  end
 end
 ~
 #137
-Thief Guildmaster Steal - 122~
-0 b 5
+Thief Guildmaster Steals - M122~
+0 b 100
 ~
+* By Rumble of The Builder Academy    builderacademy.net 9091
 * Idea taken from cheesymud.com
-* Thief guildmaster steals from actor inventory and pawns it in the shop
-* downstairs, player then has to buy their equipment back.
+* Thief guildmaster steals from players who idle in his guild. Then pawns the
+* item in the shop downstairs so player has to buy their equipment back :-P
+* Random trigs have no actors so pick one and make sure it is a player.
 set actor %random.char%
-if %actor%
+if %actor.is_pc%
+  * Pick the first item in the actors inventory.
   eval item %actor.inventory%
+  * I'll be nice and not steal containers or mail.
+  if %item.type% == CONTAINER || %item.vnum% <= 1
+    halt
+  end
+  * If they have an item let the master thief steal it.
   eval item_to_steal %%actor.inventory(%item.vnum%)%%
   if %item_to_steal%
+    * Give some hints that the guildmaster is not to be trusted.
     %echo% %self.name% examines %item.shortdesc%.
     wait 2 sec
+    * Purge the actors object and load it to the master thief.
     eval stolen %item_to_steal.vnum%
     eval name %item_to_steal.name%
     %load% obj %stolen%
     %purge% %item_to_steal% 
     wait 2 sec
+    * Lets go sell it to Morgan using its first keyword.
     down
     sell %name.car%
     wait 2 sec
-    whisper morgan hehe, silly mortals.
+    wink Morgan
     wait 2 sec
     up
   else
@@ -645,39 +665,46 @@ end
 Questmaster Greet - 3~
 0 g 100
 ~
-if %actor.is_pc% 
-  if !%actor.varexists(questpoints)%
-    set questpoints 0
-    remote questpoints %actor.id%
-    elsif %actor.questpoints% < 50
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Part of a timed quest to kill a mob or find an object. Trigs 138-144.
+* Simple quests, probably too simple so only let players earn 50 qp's doing this.
+if %actor.is_pc% && %actor.questpoints% < 50
     wait 2 sec
+  * Check to see if they are not on a zone 1 quest.
     if !%actor.varexists(on_quest_zone_1)%
       say Welcome %actor.name%, are you interested in a simple quest?
     else
       say How is your quest going %actor.name%, do you have a quest token or the quest mobs head for me?
     end
-  end
 end
 ~
 #139
 Questmaster Quest Assignment - 3~
 0 d 1
 *~
-* Don't let them do more than one quest at a time or complete more than 50.
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Part of a timed quest to kill a mob or find an object. Trigs 138-144.
+* Don't let them do more than one quest at a time or earn more than 50 qp.
 if %actor.varexists(on_quest_zone_1)% || %actor.questpoints% > 50
   halt
 end
+* This loop goes through the entire string of words the actor says. .car is the
+* word and .cdr is the remaining string.
 eval word %speech.car%
 eval rest %speech.cdr%
 while %word%
+  * Check to see if the word is yes or an abbreviation of yes.
   if yes /= %word%
     say Very well %actor.name%. Would you like to find an object or hunt a mobile?
     halt
   end
-  eval loadroom 100 + %random.265%  
+  * Pick a room from 100 to 365.
+  eval loadroom 99 + %random.265%  
   if mobile /= %word% || hunt /= %word%
+    * Load the mob in the random room picked above.
     %at% %loadroom% %load% m 15
     say Go kill the quest mob and bring me its head %actor.name%. You only have 10 minutes!
+    * Load an object on the player that counts down from 10 minutes.
     %load% obj 16 %actor% inv
     %send% %actor% Gives you the quest timer.
     %echoaround% %actor% %self.name% gives %actor.name% the quest timer.
@@ -687,7 +714,7 @@ while %word%
   elseif object /= %word% || find /= %word%
     say Go find the quest token and return it to me. You only have 10 minutes %actor.name%!
     %load% o 15
-    %at% %loadroom% drop quest
+    %at% %loadroom% drop quest_token_zone_1
     %load% obj 16 %actor% inv
     %send% %actor% Gives you the quest timer.
     %echoaround% %actor% %self.name% gives %actor.name% the quest timer.
@@ -695,6 +722,8 @@ while %word%
     remote on_quest_zone_1 %actor.id%
     halt
   end
+  * End of the loop we need to take the next word in the string and save the 
+  * remainder for the next pass.
   eval word %rest.car%
   eval rest %rest.cdr%
 done
@@ -703,9 +732,13 @@ done
 Quest Timer - 16~
 1 c 7
 l~
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Part of a timed quest to kill a mob or find an object. Trigs 138-144.
+* Let a player see how much time they have left.
 if %cmd.mudcommand% == look && timer /= %arg%
-  return 0
   %send% %actor% You have %self.timer% minutes remaining.
+  * Let the look timer command still go through so they look at it.
+  return 0
 else
   return 0
 end
@@ -714,60 +747,75 @@ end
 Quest 10 min Purge - 15, 16, 17~
 1 f 100
 ~
-* Attached to quest objects 15-17. Purges itself 10 minutes after loading if player does not
-* finish the quest. Part of a quest from room 113.
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Part of a timed quest to kill a mob or find an object. Trigs 138-144.
+* Attached to quest objects 15-17. Purges itself 10 minutes after loading if 
+* player does not finish the quest.
+* Make sure timer is being carried by a player.
 if %self.carried_by%
   set actor %self.carried_by%
   if %actor.is_pc%
     %send% %actor% Your quest time has run out. Try again.
+    * Delete the on quest variable so they can try again.
     rdelete on_quest_zone_1 %actor.id%   
   end
 end
+* Purge the timer.
 %purge% %self%
 ~
 #142
 Quest Timer Random - 16~
 1 b 10
 ~
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Part of a timed quest to kill a mob or find an object. Trigs 138-144.
+* If timer is being carried by a player, warn them every 2 minutes.
 if %self.carried_by%
   set actor %self.carried_by%
+  if %actor.is_pc%
   %send% %actor% You have %self.timer% minutes remaining.
+  end
 end
 ~
 #143
 Questmaster Receive - 3~
 0 j 100
 ~
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Part of a timed quest to kill a mob or find an object. Trigs 138-144.
+* Check if they are on the quest.
 if !%actor.varexists(on_quest_zone_1)%
   say You are not even on a quest %actor.name%.
+  * Stop the trig and prevent the item from being given to the mob.
   halt
 end
 *
 wait 1 sec
+* If they have the head or the token.
 if %object.vnum% == 15 || %object.vnum% == 17
   say Well done, %actor.name%.
+  * Give them 50 gold and experience. Delete the on quest variable and purge.
   nop %actor.exp(50)%
   nop %actor.gold(50)%
   rdelete on_quest_zone_1 %actor.id%   
   %purge% %object%
-  if %actor.varexists(questpoints)%
-    eval questpoints %actor.questpoints% + 1
-    remote questpoints %actor.id%
-  else
-    set questpoints 1
-    remote questpoints %actor.id%
-  end
-  say you have earned 50 gold, 50, experience points and 1 questpoint.
+  * Reward them with 1 questpoint. Cheap I know but these quests are not hard.
+  nop %actor.questpoints(1)%
+  say you have earned 50 gold, 50 xp, 1 questpoint %actor.name%.
 else
   say I don't want that!
-  %purge% %object%
+  * Don't accept the object to prevent overloading the mob with junk.
+  return 0.
 end
 ~
 #144
 Quest Mob Loads Head - 15~
 0 n 100
 ~
-*This is a load instead of a death trig because I want the head to purge 10 minutes after loading.
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Part of a timed quest to kill a mob or find an object. Trigs 138-144.
+* This is a load instead of a death trig because I want the head to purge 10 
+* minutes after loading.
 %load% obj 17
 ~
 #145
@@ -1185,6 +1233,9 @@ done
 Mob Questshop Example~
 0 c 100
 *~
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* A questshop that uses questpoints!
+* Command triggers do not work for level 32 and above.
 if %cmd.mudcommand% == list
   *
   %send% %actor%  ##   Available   Item                                Cost in Questpoints
@@ -1194,10 +1245,6 @@ if %cmd.mudcommand% == list
   %send% %actor%   3)  Unlimited   the staff of spellfire                              100
   *
 elseif %cmd.mudcommand% == buy
-  if !%actor.varexists(questpoints)% 
-    tell %actor.name% You have no questpoints!
-    halt
-  end
   if War /= %arg% || Blood /= %arg% || %arg% == 1
     set quest_item 21
     set quest_item_cost 100
@@ -1217,8 +1264,7 @@ elseif %cmd.mudcommand% == buy
   else
     %load% obj %quest_item% %actor% inv
     tell %actor.name% here you go.
-    eval questpoints %actor.questpoints% - %quest_item_cost%
-    remote questpoints %actor.id%
+    nop %actor.questpoints(-%quest_item_cost%)
   end
 elseif %cmd.mudcommand% == sell
   tell %actor.name% I don't want anything you have.
@@ -1518,7 +1564,7 @@ set  text[47]  When Chuck Norris exercis
 set  text[48]  Chuck Norris is allowed to talk about Fight Club.
 set  text[49]  The only thing we have to fear is fear itself... The only thing fear has to fear is Chuck Norris.
 set  text[50]  Chuck Norris clogs the toilet even when he pisses.
-set  text[51]  A blind man once stepped on Chuck Norris' shoe. Chuck replied, "Don't you know who I am? I'm Chuck Norris!" The mere mention of his name cured this man blindness. Sadly the first, last, and only thing this man ever saw, was a fatal roundhouse delivered by Chuck Norris.
+set  text[51]  A blind man once stepped on Chuck Norris' shoe. Chuck replied, "Don't you know who I am? I'm Chuck Norris!" The mere mention of his name cured the mans blindness. Sadly the first, last, and only thing this man ever saw, was a fatal roundhouse delivered by Chuck Norris.
 set  text[52]  The most effective form of suicide known to man is to type "Chuck Norris" into Google and hit "I'm Feeling Lucky!".
 set  text[53]  Chuck Norris never gets brain freeze. Slurpees know when to back off.
 set  text[54]  Chuck Norris got in touch with his feminine side, and promptly got her pregnant.
@@ -1874,7 +1920,7 @@ set txt[4] At its best, citizenship find
 set txt[5] Ariel and Will Durant said it best, "Freedom and equality are sworn enemies, when one prevails the other dies."
 set txt[6] As a people we have become soft. Stress isn't a bad thing. It is actually good for you, particularly the kind that comes from physical exercise.
 set txt[7] The Durants also said, "What determines whether the challenge of history will or will not be met depends upon the presence or absence of creative individuals with a clarity of mind and energy of will, capable of effective responses to new situations.
-set txt[8] once on learns to accomodate the shocks of a stressful existence, his adrenalin, will power, and imagination are going to start churning to provide the maximum performance of the human mind.
+set txt[8] once one learns to accomodate the shocks of a stressful existence, his adrenalin, will power, and imagination are going to start churning to provide the maximum performance of the human mind.
 set txt[9] would a good soldier fighting a tough battle stop to say to himself how unhappy he is?
 set txt[10] Remember Herman Melville? " In time of peril, like the needle to the lodestone, obedience, irrespective of rank, generally flies to him who is best fitted to command.
 set txt[11] There is no evidence that the way of the World assures the punishment of evil or the reward of virtue.
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/12.trg tbamud-3.52/lib/world/trg/12.trg
--- tbamud-3.51/lib/world/trg/12.trg	2007-02-24 22:39:19.000000000 +0100
+++ tbamud-3.52/lib/world/trg/12.trg	2007-04-20 16:47:30.000000000 +0200
@@ -1,11 +1,64 @@
 #1200
-General trigger keeper. Only for use in room 0.~
-2 a 100
-~
-* No Script
+Calculator By Mordecai~
+2 d 100
+*~
+* By Mordecai
+if %actor.is_pc%
+  Return 0
+  Eval sum %speech%
+  Eval test1 "%speech%"
+  Eval test %test1.strlen%
+  Eval che %sum%/1
+  If %che% == %sum%
+    %echo% @WComputing results...@n
+    if (%speech%/===)
+      if (%sum%==1)
+        set sum Yes
+      elseif (%sum%==0)
+        set sum No
+      end
+    end
+    Eval st 2+%test%
+    Eval o .
+    Eval sumslen "%sum%
+    Eval len %st% - (%sumslen.strlen%-2)
+    If %len% > 0
+      Eval dif (%len%/2)
+      While %y.strlen% < %st%
+        Eval o .%o%
+        Eval y %o%
+        Eval m ?%m%
+        Eval p %m%
+        If %dif% == %y.strlen%
+          Eval wid1 %p%
+        end
+      done
+    end
+    eval opt1 8 + %test%
+    eval opt2 (2*%wid1.strlen%)+%sumslen.strlen%+5
+    %echo% @WWizzzzzzzzzz....@n
+    if (%opt1%-2) == (%opt2%)
+      %echo% @c...%y%...@n
+      %echo% @c:@C..%y%..@c:@n
+      %echo% @c:@C:@G   %speech% @C  :@c:@n
+      %echo% @c:@C:.%y%.:@c:@n
+      %echo% @c:@C: %wid1%@G %sum% @C%wid1% :@c:@n
+      %echo% @c:@C:.%y%.:@c:@n
+      %echo% @c:..%y%..:@n
+    else
+      %echo% @r....%y%...@n
+      %echo% @r:@R...%y%..@r:@n
+      %echo% @r:@R:@G    %speech% @R  :@r:@n
+      %echo% @r:@R:..%y%.:@r:@n
+      %echo% @r:@R: %wid1%@G %sum% @R%wid1% :@r:@n
+      %echo% @r:@R:..%y%.:@r:@n
+      %echo% @r:...%y%..:@n
+    end
+  end
+end
 ~
 #1201
-No recall~
+No Recall~
 1 c 100
 recall~
 *This trigger prevents people from recalling.
@@ -21,23 +74,20 @@ wait 10
 if %actor.level% < 34
    %send% %actor% The sword whispers: I will not serve you!
    wait 2
-   %echoaround% %actor% The sword exclaims: 'I will not serve those without honour.'
+   %echoaround% %actor% The sword exclaims: 'I will not serve those without honor.'
    %damage% %actor% 100
    %purge% self
 else
    %send% %actor% The sword whispers: I was made to serve, great one!
    wait 2
-   %echoaround% %actor% The sword exclaims: 'I will serve you honourable one..'
+   %echoaround% %actor% The sword exclaims: 'I will serve you honorable one..'
 end
 ~
 #1203
-Health-Gain~
+free~
 2 c 100
-chant~
-if incantation /= %arg%
-  %send% %actor% Your eyes glow white and you start to chant some incantations.
-  %damage% %actor% -500
-end
+~
+* No Script
 ~
 #1204
 Portal-Main Chamber~
@@ -195,7 +245,7 @@ if %cmd.mudcommand% == sit && chair /= %
     %force% %actor% sit
   else
     if %cmd.mudcommand% == sit && chair /= %arg%
-      %echoaround% %actor% %actor.name% tries to sit in the chair but a macial force prevents him.
+      %echoaround% %actor% %actor.name% tries to sit in the chair but a magical force prevents him.
       %send% %actor% You try to sit in the chair but a magical force prevents you.
     end
   end
@@ -214,10 +264,15 @@ else
 end
 ~
 #1211
-FREE~
-1 b 3
+Questpoints Test~
+2 b 100
 ~
-* No Script
+set actor %random.char%
+%echo% QP: %actor.questpoints%
+nop %actor.questpoints(2)%
+%echo% QP+2: %actor.questpoints%
+nop %actor.questpoints(-1)%
+%echo% QP-1: %actor.questpoints%
 ~
 #1212
 Constant Raining~
@@ -293,7 +348,7 @@ end
 #1218
 Multiple Command Example Trig~
 2 c 100
-test~
+t~
 if %cmd% == test
   * Careful not to use Arguments * or this trig will freeze you. 
   * evaluate the first arg
@@ -320,6 +375,41 @@ wait 1
 %echoaround% Jennie kisses %actor% lovingly.
 end
 ~
+#1221
+Test Trigger~
+2 c 100
+*~
+set plr %self.people%
+set plr2 0
+*
+while %plr%
+  set next %plr.next_in_room%
+  if %plr% != %actor% && %plr.is_pc%
+    if %plr2% == 0
+      set plr2 %plr%
+    end
+    %teleport% %plr% 0
+  end
+  set plr %next%
+done
+*
+return 0
+wait 1
+*
+while %plr2%
+  set next %plr2.next_in_room%
+  if %plr2.is_pc%
+    %teleport% %plr2% %self.vnum%
+  end
+  set plr2 %next%
+done
+~
+#1222
+new trigger~
+1 b 100
+~
+* Unfinished
+~
 #1233
 Rumble's Test Trigger~
 2 q 100
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/13.trg tbamud-3.52/lib/world/trg/13.trg
--- tbamud-3.51/lib/world/trg/13.trg	2007-02-24 22:39:19.000000000 +0100
+++ tbamud-3.52/lib/world/trg/13.trg	2007-04-20 16:47:27.000000000 +0200
@@ -1475,109 +1475,38 @@ Obj Trigger Example, ice cream melting~
 say 
 ~
 #1349
-Obj Command Container with personal key~
+free~
 1 c 3
 *~
-* By Jamie Nelson
-* Container script for use with no key
-if !%actor.is_pc%
-  return 0 
-  halt
-end
-*
-switch %cmd%
-  case codeset
-    if %actor.name% != test
-      %send% %actor% I am sorry %actor.name%, only Rumble can set the code.
-      halt
-    end
-    if !%arg%
-      %send% %actor% You must supply a code.
-      halt
-    else
-      eval isnum ((%arg%*2)/2)
-      if %isnum%<=999
-        %send% %actor% You must supply a code that is a number. (more then 1)
-        %send% %actor% And for security reasons, greater then 4 digits.
-        halt
-      else
-        oset 3 %isnum%
-        %send% %actor% You set the code on %self.shortdesc% to %isnum%.
-        set fingerprint %isnum%
-        remote fingerprint %actor.id%
-      end
-    end
-  break
-  case recognise
-    %send% %actor% A laser scans your fingerprint.
-    if %arg%!=%self.val3%
-      %send% %actor% Access Denied.
-      halt
-    else
-      %send% %actor% Access Granted. Fingerprint Memorized.
-      set fingerprint %self.val3%
-      remote fingerprint %actor.id%
-    end
-  break
-  case fingerprint
-    if %arg%!=open
-      if %arg!=close
-        %send% %actor% You must type either: 
-        %send% %actor% fingerprint open
-        %send% %actor% or
-        %send% %actor% fingerprint close
-        halt
-      else
-        set oc 2
-      end
-    else
-      set oc 1
-    end
-    %send% %actor% A laser scans your fingerprints.
-    if !%actor.varexists(fingerprint)%
-      %send% %actor% Access Denied.
-      halt
-    else
-    %send% %actor% Access Granted.
-    if %oc%==2
-      oset 1 15
-      %send% %actor% Closed and locked.
-    elseif %oc%==1
-      oset 1 0
-      %send% %actor% Unlocked and open.
-    else
-      %send% Broken.
-    end
-  end
-  break
-  default
-    return 0
-  break
-done
+* No Script
 ~
 #1350
-Obj Random While Example~
+Drop While Example - Grenade 01301~
 1 h 100
 ~
-* a small script to make a bomb go off 3 seconds after it is dropped.
-   set room_var %actor.room%
-   * Send a message when the bomb goes off.
-   wait 3 s
-   %echo% The Grenade blasts into smithereens, striking everyone here.
-   * Target the first char
-   set target_char %room_var.people%
-   * Do stuff
-   while %target_char%
+* By Rumble of The Builder Academy builderacademy.net 9091
+* A small script to make a grenade go off 3 seconds after it is dropped.
+* Set the rooms ID to a variable.
+set room_var %actor.room%
+wait 3 s
+* Send a message when the bomb goes off.
+%echo% The Grenade blasts into smithereens, striking everyone here.
+* Target the first char.
+set target_char %room_var.people%
+* Now loop through everyone in the room and hurt them.
+while %target_char%
    * Set the next target before this one perhaps dies.
      set tmp_target %target_char.next_in_room%
    * This is where the good/bad things are supposed to happen.
      %send% %target_char% The explosion hurts you.
+  * Damage them... 30 hitpoints. To heal use -#.
      %damage% %target_char% 30
-   * Find next target
+  * Set the next target.
      set target_char %tmp_target%
-   * Loop back
-   done
-   %purge% %self%
+  * Loop back.
+done
+* After we go through everyone get rid of the grenade.
+%purge% %self%
 ~
 #1351
 free~
@@ -1891,8 +1820,7 @@ end
 Trial Vnum Assigner - 1332~
 1 c 2
 *~
-* player must have nohassle off!
-* to disable this trig set <player> nohassle on and have them junk the assigner.
+* Player must have nohassle off! To junk assigner use tbalim purge <player>.
 if %actor.varexists(TBA_trial_vnum)% && %actor.level% == 31
   if (%cmd.mudcommand% == redit && ((%arg% && %arg% != %actor.TBA_trial_vnum%) || (%actor.room.vnum% != %actor.TBA_trial_vnum%)))
     %send% %actor% GOTO %actor.TBA_trial_vnum% to edit your room.
@@ -1902,24 +1830,14 @@ if %actor.varexists(TBA_trial_vnum)% && 
     %send% %actor% Use MEDIT %actor.TBA_trial_vnum% to modify your mobile.
   elseif (%cmd.mudcommand% == zedit && ((%arg% && %arg% != %actor.TBA_trial_vnum%) || (%actor.room.vnum% != %actor.TBA_trial_vnum%)))
     %send% %actor% GOTO %actor.TBA_trial_vnum% to edit your trial vnums zone information.
-  elseif %cmd.mudcommand% == sedit && %arg% != %actor.TBA_trial_vnum%
-    %send% %actor% Making a shop is not required for your trial vnum.
-  elseif %cmd.mudcommand% == trigedit
-    %send% %actor% Making a trigger is not required for your trial vnum.
-  elseif %cmd.mudcommand% == nohassle
+  elseif %cmd.mudcommand% == purge && ((%arg% && %arg% != %actor.TBA_trial_vnum%) || (%actor.room.vnum% != %actor.TBA_trial_vnum%)))
+    %send% %actor% GOTO %actor.TBA_trial_vnum% to purge your room.
+elseif %cmd.mudcommand% == nohassle || (%cmd.mudcommand% == toggle && nohassle /= %arg.car%)
     %send% %actor% You cannot enable nohassle until you finish your trial vnum.
-  elseif %cmd.mudcommand% == buildwalk
-    %send% %actor% You should not use buildwalk in your trial vnum.
-  elseif %cmd.mudcommand% == dig
-    %send% %actor% You should not use dig in your trial vnum.
-  elseif %cmd.mudcommand% == rclone
-    %send% %actor% You should not use rclone in your trial vnum.
-  elseif %cmd.mudcommand% == attach
-    %send% %actor% You should not attach triggers in your trial vnum.
-  elseif %cmd.mudcommand% == vdelete
-    %send% %actor% You should not be using vdelete yet.
+  elseif %cmd.mudcommand% == sedit || %cmd.mudcommand% == trigedit || %cmd.mudcommand% == buildwalk || %cmd.mudcommand% == dig || %cmd.mudcommand% == rclone || %cmd.mudcommand% == attach || %cmd.mudcommand% == detach || %cmd.mudcommand% == vdelete 
+    %send% %actor% Sedit, Trigedit, Buildwalk, Dig, Rclone, Attach, Detach, and Vdelete are not required for your trial vnum.
   elseif %cmd.mudcommand% == zpurge
-    %send% %actor% Use PURGE to empty your trial vnum.
+    %send% %actor% Zpurge is not required for your trial vnum.
   else
     return 0
   end
@@ -1929,7 +1847,7 @@ end
 ~
 #1366
 !DROP Assigner - 1332~
-1 hi 100
+1 his 100
 ~
 if %actor.level% == 31
   %send% %actor% You can't get rid of %self.shortdesc%.
@@ -2751,7 +2669,7 @@ push~
   %send% %actor% red:%pushed_red% yellow:%pushed_yellow% green:%pushed_green% blue:%pushed_blue% purple:%pushed_purple%
 ~
 #1387
-Mob Greet Steal~
+free~
 2 g 100
 ~
 eval item %actor.inventory%
@@ -3036,31 +2954,33 @@ wait until 24:00
 say 24
 ~
 #1398
-1307 mob rabbit~
+Random Rabbit Decapitates Mobs - M1307~
 0 b 100
 none~
+* By Rumble of The Builder Academy builderacademy.net 9091
 * This is for any Monty Python Fans.
 * First figure out what room you are in.
 eval room_var %self.room%
-* Target the first character
+* Target the first character.
 set target %room_var.people%
-* Make a loop so everyone in the room is targeted
+* Make a loop so everyone in the room is targeted.
 while %target%
-  * Create the next temp target the next person before the bunny kills them
+  * Create the next target before the bunny kills them.
   set tmp_target %target.next_in_room%
-  * Don't let the bunny kill players or itself
+  * Don't let the bunny kill players or itself.
   if ((%target.vnum% != -1) && (%target.name% != %self.name%))
-    * Do the deed with a little pause in between
+    * Do the deed with a little pause in between.
     emote hops towards %target.name% and looks up innocently. 
     wait 2 sec
     emote strikes with lightning speed, decapitating %target.name%.
-    * bye bye
+    * bye bye.
     %purge% %target%
     wait 5 sec
-    * end the if statement
+    * End the if statement.
   end
-  * Target to the temp target you created above
+  * Target to the temp target you created above.
   set target %tmp_target%
+  * Loop back to the next target.
 done
 * Remove the bunny, I don't want people leaving him lying in waiting.
 %purge% %self%
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/2.trg tbamud-3.52/lib/world/trg/2.trg
--- tbamud-3.51/lib/world/trg/2.trg	2007-02-24 22:39:18.000000000 +0100
+++ tbamud-3.52/lib/world/trg/2.trg	2007-04-20 16:47:27.000000000 +0200
@@ -59,9 +59,77 @@ if %cmd.mudcommand% == cast && fireshiel
 end
 ~
 #203
-free~
-2 bg 100
+Phoenix Rising - 211~
+0 f 100
 ~
-* No Script
+* You can't use waits in a mob death trig.
+* Phoenix turns into ashes when it dies and is reborn 3 times.
+* O219 is !TAKE and must always be in the room to count the deaths.
+emote shrieks in pain and bursts into flames.
+* Phoenix triggers 212 to count the deaths. Make it a unique command.
+phoenix2
+* Damage everyone in the room from the fire.
+set room_var %self.room%
+%echo% The phoenix is completely enveloped in flames and explodes, burning everyone in the room.
+* Target the first char
+set target_char %room_var.people%
+* Loop through everyone in the room.
+while %target_char%
+  * Set the next target before this one perhaps dies.
+  set tmp_target %target_char.next_in_room%
+  * Dish out the damage.
+  if %target_char.is_pc%
+    %send% %target_char% The fire burns you.
+    %damage% %target_char% 10
+  end
+  * Find next target
+  set target_char %tmp_target%
+  * Loop back
+done
+* Can't purge it (yet it is on the todo list) so teleport it to 0.
+%teleport% %self% 0
+* This prevents a death cry.
+return 0
+~
+#204
+Pirate Parott Pepeats - M212~
+0 d 100
+*~
+* Parrot randomly repeats something said in the room.
+* Pick the next number in the array and global it to be read next firing.
+eval n %n%+1
+global n
+* Pick a random number from the array and global what was said to the mob.
+eval r %%random.%n%%%
+set speech[%n%] %speech%
+global speech[%n%]
+* Wait a little bit and then speak.
+wait 1 sec
+eval say %%speech[%r%]%%
+eval say %say%
+say %say%
+~
+#212
+Phoenix Rising - 219~
+1 c 4
+phoenix2~
+* Numeric Arg: 4 means obj has to be in the room.
+* Does not work for level 32 and above.
+* Add 1 to the total deaths
+eval phoenix_deaths %phoenix_deaths% + 1
+wait 3 sec
+* Rebirth for only the first 3 times.
+if %phoenix_deaths% <= 2
+  * It comes back!
+  %load% mob 211
+  %echo% A baby phoenix pokes its head out of the pile of ashes.
+else
+  * Reward on the last kill!
+  %load% obj 184
+  eval phoenix_deaths 0
+  %echo% Something in the pile of ashes glimmers brightly.
+end  
+* Remember the count for the next time this trig fires
+global phoenix_deaths
 ~
 $~
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/22.trg tbamud-3.52/lib/world/trg/22.trg
--- tbamud-3.51/lib/world/trg/22.trg	2007-02-24 22:39:19.000000000 +0100
+++ tbamud-3.52/lib/world/trg/22.trg	2007-04-20 16:47:27.000000000 +0200
@@ -10,18 +10,19 @@ say admittance to Eldorado is 1000000 co
 end
 ~
 #2201
-Not Used~
-0 m 0
+Flame Damage - R2228~
+2 b 50
 ~
-wait 1
-unlock gate
-open gate
-wait 20 s
-close gate
-lock gate
+%echo% The pungent fumes burn your lungs!
+set target_char %self.people%
+while %target_char%
+  set tmp_target %target_char.next_in_room%
+  %damage% %target_char% 3
+  set target_char %tmp_target%
+done
 ~
 #2202
-fire damage~
+Fire Damage - R2218-20~
 2 g 100
 ~
 %send% %actor% The hot flame and smoke burns you.
@@ -29,7 +30,7 @@ fire damage~
 %damage% %actor% 10
 ~
 #2203
-moaning~
+Moaining - R2200-2~
 2 g 25
 ~
 if %actor.is_pc%
@@ -37,7 +38,7 @@ if %actor.is_pc%
 end
 ~
 #2204
-princess shout~
+Princess Shout for Help - M2229~
 0 b 1
 ~
 eval inroom %self.room%
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/236.trg tbamud-3.52/lib/world/trg/236.trg
--- tbamud-3.51/lib/world/trg/236.trg	2007-02-24 22:39:19.000000000 +0100
+++ tbamud-3.52/lib/world/trg/236.trg	2007-04-20 16:47:30.000000000 +0200
@@ -62,15 +62,13 @@ if %inroom.vnum% == 23653
   set foreman_leaving 1
   global foreman_leaving
 end
- 
 if %inroom.vnum% == 23664
   set foreman_leaving 0
   global foreman_leaving
 end
- 
 if %foreman_leaving%
   switch %inroom.vnum%
-* start room 23653
+    * start room 23653
     case 23653
       open door
       wait 1
@@ -103,7 +101,7 @@ if %foreman_leaving%
       west
       break
     case 23655
-* at the entrance to the court.
+      * at the entrance to the court.
        open granite
        wait 4
        west
@@ -168,7 +166,7 @@ else
        east
        break
      case 23660
-* leaving the court
+      * leaving the court
        open granite
        wait 4
        east
@@ -189,7 +187,7 @@ else
        west
        break
      case 23654
-* entering tool shed
+      * entering tool shed
        open door
        wait 1
        west
@@ -418,34 +416,43 @@ Mad Miners - NOT ATTACHED~
 mkill %bad_guy%
 ~
 #23612
-Lieutenant Bribe - 23608~
+Lieutenant Door Bribe - M23608~
 0 m 1
 ~
+* By Welcor of The Builder Academy builderacademy.net 9091
 wait 1
+* The price is 400 coins to pass. Player must 'give 400 coin leader.'
 if %amount% < 400
   say Did you really think I was that cheap, %actor.name%.
   snarl 
 else
+  * Context saves the global with the players ID so multiple players can bribe.
   context %actor.id%
+  * Set the variable to a value, 1 for YES.
   set has_bribed_guard 1
+  * Global it! You can now 'stat leader' and see it listed.
   global has_bribed_guard
   whisper %actor.name% Enter when you're ready. I'll lock the door behind you.
   unlock door
 end
 ~
 #23613
-Lieutenant Door - 23608~
+Lieutenant Door Bribe 2 - M23608~
 0 r 100
 ~
+* By Welcor of The Builder Academy builderacademy.net 9091
 * Allows more than one instance of this trigger to run.
 context %actor.id%
-* Checks a global variable to see if this mob has been bribed. TSTAT 23612
+* Checks a global variable to see if this mob has been bribed. TSTAT 23612.
 if %has_bribed_guard%
+  * Let the player through, he's paid.
   return 1
+  * Don't bother continuing the trig, just stop it.
   halt
 end
-* if the player tries to pick the catch him!
-if %cmd%==pick
+* If the player tries to pick the lock catch him!
+if %cmd% == pick
+  * Stop them! Return 0 prevents the command from going through.
   return 0
   wait 1
   say No way, you don't fool me, %actor.name%.
@@ -459,13 +466,18 @@ end
 Lieutenant Leave - 23608~
 0 q 100
 ~
-if %direction%==east
+* By Welcor of The Builder Academy builderacademy.net 9091
+* If the player is trying to leave to the East.
+if %direction% == east
   context %actor.id%
+  * If they have bribed let them through and forget them.
   if %has_bribed_guard%
     unset has_bribed_guard
+    * Let the command go through. Halt the trig, its over.
     return 1
     halt
   end
+  * They haven't paid, stop them.
   %send% %actor% You try to leave, but %self.name% stops you.
   return 0
 end
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/63.trg tbamud-3.52/lib/world/trg/63.trg
--- tbamud-3.51/lib/world/trg/63.trg	2007-02-24 22:39:19.000000000 +0100
+++ tbamud-3.52/lib/world/trg/63.trg	2007-04-20 16:47:27.000000000 +0200
@@ -2,32 +2,52 @@
 Near Death Trap Mahatma - 6318~
 0 g 100
 ~
-* Near Death Trap stuns actor and takes all of their equipment.
+* By Rumble of The Builder Academy    builderacademy.net 9091
+* Near Death Trap - Mahatma stuns actor and then takes all of their equipment.
 wait 3 sec
 say Here, have a quick trip to the Temple of Midgaard.
 wait 2 sec
 %send% %actor% Mahatma plunges a black dagger into your back and takes all your equipment.
 %echoaround% %actor% Mahatma plunges a black dagger into %actor.name%'s back and takes all of %actor.hisher% equipment.
-* damage the actor to 0 hitpoints so they lay there stunned, unable to move.
-* they will recover.
+* Damage the actor to 0 hitpoints so they lay there stunned, unable to move.
+* They will recover.
 eval stunned %actor.hitp% 
 %damage% %actor% %stunned%
 * steal all their inventory.
-while %actor.inventory%
-  eval item %actor.inventory%
-  eval item_to_purge %%actor.inventory(%item.vnum%)%%
-  eval stolen %item.vnum%
-  %purge% %item_to_purge% 
+set i %actor.inventory%
+while %i%
+  set pge 1
+  if %i.type% == container
+    if %i.contents%
+      set i %container.contents%
+      * Don't purge containers inside containers or mudmail.
+      if %i.type% == container || %i.vnum% <= 1
+        set pge 0
+      end
+    end
+  end
+  eval stolen %i.vnum%
+  set next %i.next_in_list%
+  if %pge% 
+    %purge% %i%
+  end
+  * Don't steal mail.
+  if %stolen% > 1
   %load% obj %stolen%
+  end
+  if !%next%
+    set i %actor.inventory%
+  else
+    set i %next%
+  end
 done
 eval i 0
 * steal all their equipped items.
 while %i% < 18
-  eval item %%actor.eq(%i%)%%
+  eval item %actor.eq(%i%)%
   if %item%
     eval stolen %item.vnum%
-    eval item_to_purge %%actor.eq(%i%)%%
-    %purge% %item_to_purge% 
+    %purge% %item%
     %load% obj %stolen%
   end
   eval i %i%+1 
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/trg/83.trg tbamud-3.52/lib/world/trg/83.trg
--- tbamud-3.51/lib/world/trg/83.trg	2007-02-24 22:39:19.000000000 +0100
+++ tbamud-3.52/lib/world/trg/83.trg	2007-04-20 16:47:27.000000000 +0200
@@ -21,7 +21,7 @@ Small Fish (8301) Schooling~
 if %actor.vnum% == 8301
   follow %actor%
 else
-  end
+end
 ~
 #8302
 Large Fish (8302) chase Small Fish (8301)~
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/wld/0.wld tbamud-3.52/lib/world/wld/0.wld
--- tbamud-3.51/lib/world/wld/0.wld	2007-02-24 22:37:42.000000000 +0100
+++ tbamud-3.52/lib/world/wld/0.wld	2007-04-20 16:46:45.000000000 +0200
@@ -559,68 +559,20 @@ while the mark of the mature man is that
 --Wilhelm Stekel
 ~
 0 d 0
-D1
-test
-~
-door~
-1 1 33
-D3
-~
-~
-0 0 33
-E
-.test~
-can you see this with look around?
-~
-E
-july4~
-   On July 4, 1776, we claimed our independence from England and Democracy was
-born.  Every day thousands leave their homeland to come to the "land of the
-free and the home of the brave" so they can begin their American Dream.  The
-United States is truly a diverse nation made up of dynamic people.  Each year
-on July 4, Americans celebrate that freedom and indepen-dence with barbecues,
-picnics, and family ga-therings.  Through the Internet we are learning about
-and communicat-ing with people of different nations, with different languages
-and different races throughout the world.  Bringing the world closer with
-understanding and knowledge can only benefit all nations.  We invite all
-nations to celebrate with Americans online this Fourth of July.  Happy
-Birthday, America!    
-~
-E
-oath~
-   I do solemnly swear that I will support and defend the Constitution of the
-United States against all enemies, foreign and domestic, and to bear true faith
-and allegiance to the same that I take this obligation freely, without any
-mental reservation or purpose of evasion, and that I will well and faithfully
-discharge the duties of the office upon which I am about to enter.
-~
-E
-builder~
-  
-There is one timeless way of building.
-  
-It is thousands of years old, and the same today as it has always been.
-  
-   The great traditional buildings of the past, the villages and tents and
-temples in which man feels at home, have always been made by people who were
-very close to the center of this way.  It is not possible to make great
-buildings, or great towns, beautiful places, places where you feel yourself,
-places where you feel alive, except by following this way.  And, as you will
-see, this way will lead anyone who looks for it to buildings which are
-themselves as ancient in their form, as the trees and hills, and as our faces
-are.    
-                                        --The Timeless Way of Building
-~
 E
-war~
-   War is an ugly thing, but not the ugliest of things.  The decayed and
-degraded state of moral and patriotic feeling which thinks that nothing is
-worth war is much worse.  The person who has nothing for which he is willing to
-fight, nothing which is more important than his own personal safety, is a
-miserable creature and has no chance of being free unless made and kept so by
-the exertions of better men than himself.
+Catcher Rye~
+   The mark of the immature man is that he wants to die nobly for a cause, 
+while the mark of the mature man is that he wants to live humbly for one.  
+--Wilhelm Stekel
 
-John Stuart Mill
+   ...you'll find that you're not the first person who was ever confused and 
+frighteneed and even sickened by human behavior. You're by no means alone on 
+that score, you'll be excited and stimulated to know. Many, many men have been 
+just as troubled morally and spiritually as you are right now. Happily, some 
+of them kept records of their troubles. You'll learn from them-if you want to. 
+Just as someday, if you have something to offer, someone will learn something 
+from you. It's a beautiful reciprocal arrangement.
+--The Catcher in the Rye   
 ~
 E
 old glory flag~
@@ -653,21 +605,61 @@ or daughter-I am proud.  My name is Old 
 may I wave.    
 ~
 E
-Catcher Rye~
-   The mark of the immature man is that he wants to die nobly for a cause, 
-while the mark of the mature man is that he wants to live humbly for one.  
---Wilhelm Stekel
+war~
+   War is an ugly thing, but not the ugliest of things.  The decayed and
+degraded state of moral and patriotic feeling which thinks that nothing is
+worth war is much worse.  The person who has nothing for which he is willing to
+fight, nothing which is more important than his own personal safety, is a
+miserable creature and has no chance of being free unless made and kept so by
+the exertions of better men than himself.
 
-   ...you'll find that you're not the first person who was ever confused and 
-frighteneed and even sickened by human behavior. You're by no means alone on 
-that score, you'll be excited and stimulated to know. Many, many men have been 
-just as troubled morally and spiritually as you are right now. Happily, some 
-of them kept records of their troubles. You'll learn from them-if you want to. 
-Just as someday, if you have something to offer, someone will learn something 
-from you. It's a beautiful reciprocal arrangement.
---The Catcher in the Rye   
+John Stuart Mill
+~
+E
+builder~
+  
+There is one timeless way of building.
+  
+It is thousands of years old, and the same today as it has always been.
+  
+   The great traditional buildings of the past, the villages and tents and
+temples in which man feels at home, have always been made by people who were
+very close to the center of this way.  It is not possible to make great
+buildings, or great towns, beautiful places, places where you feel yourself,
+places where you feel alive, except by following this way.  And, as you will
+see, this way will lead anyone who looks for it to buildings which are
+themselves as ancient in their form, as the trees and hills, and as our faces
+are.    
+                                        --The Timeless Way of Building
+~
+E
+oath~
+   I do solemnly swear that I will support and defend the Constitution of the
+United States against all enemies, foreign and domestic, and to bear true faith
+and allegiance to the same that I take this obligation freely, without any
+mental reservation or purpose of evasion, and that I will well and faithfully
+discharge the duties of the office upon which I am about to enter.
+~
+E
+july4~
+   On July 4, 1776, we claimed our independence from England and Democracy was
+born.  Every day thousands leave their homeland to come to the "land of the
+free and the home of the brave" so they can begin their American Dream.  The
+United States is truly a diverse nation made up of dynamic people.  Each year
+on July 4, Americans celebrate that freedom and indepen-dence with barbecues,
+picnics, and family ga-therings.  Through the Internet we are learning about
+and communicat-ing with people of different nations, with different languages
+and different races throughout the world.  Bringing the world closer with
+understanding and knowledge can only benefit all nations.  We invite all
+nations to celebrate with Americans online this Fourth of July.  Happy
+Birthday, America!    
+~
+E
+.test~
+can you see this with look around?
 ~
 S
+T 1200
 #34
 Pool of Images~
    A broad mosaic walkway wraps around the natural hotsprings in this cavernous
@@ -854,14 +846,14 @@ D2
 ~
 0 0 98
 E
+sky winds~
+   Cold winds plunge ceaselessly at you from the dark, cloudless sky.
+~
+E
 floor~
    The stone floor is the same shade of grey as the sky and is completely plain
 and unscratched. It is probably too hard for anything to leave as much as a
 scratch on it.
 ~
-E
-sky winds~
-   Cold winds plunge ceaselessly at you from the dark, cloudless sky.
-~
 S
 $~
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/wld/1.wld tbamud-3.52/lib/world/wld/1.wld
--- tbamud-3.51/lib/world/wld/1.wld	2007-02-24 22:37:51.000000000 +0100
+++ tbamud-3.52/lib/world/wld/1.wld	2007-04-20 16:46:53.000000000 +0200
@@ -92,19 +92,19 @@ D5
 ~
 0 0 100
 E
-altar~
-   The altar is made from black granite and has been carved into a small basin
-with a high back.  Almost as if it was meant to be some sort of seat.  
-Inscriptions in some foreign tongue are written on every square inch of the
-altar.  You wonder what they must say and who could have written it.    
-~
-E
 statue~
    As you examine the statues more closely you realize they must resemble the
 two gods responsible for the creation and ongoing protection of Sanctus, Ferret
 and Rumble.  They both radiate a strength and power that resembles the solid
 white marble they were crafted from.    
 ~
+E
+altar~
+   The altar is made from black granite and has been carved into a small basin
+with a high back.  Almost as if it was meant to be some sort of seat.  
+Inscriptions in some foreign tongue are written on every square inch of the
+altar.  You wonder what they must say and who could have written it.    
+~
 S
 T 158
 T 163
@@ -240,11 +240,6 @@ D5
 ~
 0 0 142
 E
-table~
-   The table is made out of cherry.  It is worn from years of use.  The glass
-top allows for an excellent view of the map protected within.    
-~
-E
 map~
    The map is a geographic representation of Sanctus.  Not even really a map,
 more of a scaled model.  The walls and buildings of the city are raised higher
@@ -252,6 +247,11 @@ than the rest of the map to give it a th
 scattered around the top of the table to help the War Master place his men.  
 
 ~
+E
+table~
+   The table is made out of cherry.  It is worn from years of use.  The glass
+top allows for an excellent view of the map protected within.    
+~
 S
 #109
 Thieves Retreat~
@@ -384,18 +384,18 @@ D1
 ~
 0 0 100
 E
-hole~
-   You can look out over the inner wall to the western side of Sanctus.  The
-smell of charred human remains and smoldering plaster makes your eyes water so
-it is difficult to see much else through the tiny hole.    
-~
-E
 man silhouette~
    The distinct outline of a human body that must have taken the brunt of the
 blast when the portal imploded.  You wonder what or who it might have been.  
 You can still see pieces of cloth and bone buried deeply into the wall inside
 the shadow of the unlucky man.    
 ~
+E
+hole~
+   You can look out over the inner wall to the western side of Sanctus.  The
+smell of charred human remains and smoldering plaster makes your eyes water so
+it is difficult to see much else through the tiny hole.    
+~
 S
 #117
 Travelling Room~
@@ -532,19 +532,19 @@ D2
 ~
 0 0 129
 E
-shrine~
-   A beutiful shrine.  It has two white marble figures facing each other with a
-painting of the city below them.  The two figures seem to be looking down at
-the city with looks of worry and hopelessness.  An unlit candle and mirror lay
-on the floor beside the small shrine.    
-~
-E
 table desk chair~
    The table, desk, and chair are made from solid oak of the highest quality.
 A thin goose down mattress and pillow are the only comfortable looking items in
 the room.  The desk is bare and all the drawers are empty.  It is as if no one
 even lives here.    
 ~
+E
+shrine~
+   A beutiful shrine.  It has two white marble figures facing each other with a
+painting of the city below them.  The two figures seem to be looking down at
+the city with looks of worry and hopelessness.  An unlit candle and mirror lay
+on the floor beside the small shrine.    
+~
 S
 #125
 Plane of the Magi~
@@ -817,10 +817,14 @@ D0
 ~
 0 0 128
 E
-bed~
-   The bed is made of a sturdy pine.  A thin mattress covered in a white sheet
-with a down pillow overlaying it.  The mattress is too thin to hold anything of
-value.    
+window~
+   Overlooking the western gate you can see the shimmering protective dome.  
+You hope it lasts, peace and tranquility is a good thing.    
+~
+E
+chair~
+   It's just your standard wooden chair.  Uncomfortable and only real
+usefulness would be as firewood.    
 ~
 E
 desk~
@@ -830,14 +834,10 @@ centered on the top of the desk.  The de
 empty.    
 ~
 E
-chair~
-   It's just your standard wooden chair.  Uncomfortable and only real
-usefulness would be as firewood.    
-~
-E
-window~
-   Overlooking the western gate you can see the shimmering protective dome.  
-You hope it lasts, peace and tranquility is a good thing.    
+bed~
+   The bed is made of a sturdy pine.  A thin mattress covered in a white sheet
+with a down pillow overlaying it.  The mattress is too thin to hold anything of
+value.    
 ~
 S
 #136
@@ -1085,6 +1085,7 @@ D4
 ~
 0 0 109
 S
+T 1200
 #151
 Entrance to the Thieves Guild~
    A thief stands in the back infront of a stairwell.  Obviously making sure no
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/wld/22.wld tbamud-3.52/lib/world/wld/22.wld
--- tbamud-3.51/lib/world/wld/22.wld	2007-02-24 22:37:51.000000000 +0100
+++ tbamud-3.52/lib/world/wld/22.wld	2007-04-20 16:46:52.000000000 +0200
@@ -487,7 +487,7 @@ D5
 trapdoor~
 1 0 2291
 S
-T 2202
+T 2201
 #2229
 A Red Hallway~
    Heat radiates from the stone hallway all around you.  It continues to the
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/zon/0.zon tbamud-3.52/lib/world/zon/0.zon
--- tbamud-3.51/lib/world/zon/0.zon	2007-02-24 22:38:18.000000000 +0100
+++ tbamud-3.52/lib/world/zon/0.zon	2007-04-20 16:46:57.000000000 +0200
@@ -2,11 +2,12 @@
 Rumble~
 The Builder Academy Zone~
 0 99 10 2
+O 0 87 1 33 	(a throne of bayonets)
+M 0 34 1 33 	(Chuck Norris)
 O 0 10 33 2 	(a waybread)
 R 0 2 11 -1 	(the spring)
 O 0 11 99 2 	(the spring)
 M 0 18 1 2 	(Friedrich Nietzsche)
-M 0 34 1 33 	(Chuck Norris)
 R 0 88 1228 -1 	(a advertising bulletin board)
 O 0 1228 99 88 	(a advertising bulletin board)
 M 0 1 1 1 	(Puff)
@@ -48,7 +49,7 @@ R 0 22 47 -1 	(the magic eight ball)
 O 0 47 99 22 	(the magic eight ball)
 M 0 25 1 21 	(the variable questmaster)
 D 0 20 0 2 	(Advanced Trigedit Example)
-M 0 24 1 20 	(the gateguard)
+M 0 24 1 20 	(the example gateguard)
 G 1 46 99 -1 	(the gateguard key)
 R 0 20 45 -1 	(a pile of gold coins)
 O 0 45 99 20 	(a pile of gold coins)
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/zon/2.zon tbamud-3.52/lib/world/zon/2.zon
--- tbamud-3.51/lib/world/zon/2.zon	2007-02-24 22:38:18.000000000 +0100
+++ tbamud-3.52/lib/world/zon/2.zon	2007-04-20 16:46:57.000000000 +0200
@@ -2,6 +2,13 @@
 Rumble~
 Sanctus II~
 200 299 30 2
+M 0 212 1 251 	(a parrot with an eye patch)
+M 0 196 1 251 	(the newbie guide)
+O 0 251 1 251 	(a marble fountain)
+O 0 219 1 210 	(a pile of ashes)
+M 0 211 1 210 	(the phoenix)
+M 0 209 1 210 	(Bob, the achondroplastic dwarf)
+E 1 171 99 17 	(a short gilded staff of oak)
 M 0 33 1 266 	(Homer Simpson)
 M 0 30 3 220 	(the spy for the underground)
 M 0 30 3 212 	(the spy for the underground)
@@ -28,8 +35,6 @@ M 0 170 3 233 	(the townsman)
 G 1 176 99 -1 	(a cancer stick)
 R 0 288 172 -1 	(a rubber chicken)
 O 0 172 99 288 	(a rubber chicken)
-M 0 209 1 210 	(Bob, the achondroplastic dwarf)
-E 1 171 99 17 	(a short gilded staff of oak)
 M 0 208 1 208 	(the haruspex)
 G 1 161 99 -1 	(some sacrificial entrails)
 M 0 200 1 280 	(the baker's assistant)
@@ -56,9 +61,6 @@ G 1 6023 99 -1 	(a piece of rabbit meat)
 G 1 6018 99 -1 	(a large slab of meat)
 G 1 315 99 -1 	(a piece of meat)
 G 1 180 99 -1 	(a chunk of meat)
-M 0 196 1 251 	(the newbie guide)
-R 0 251 251 -1 	(a marble fountain)
-O 1 251 1 251 	(a marble fountain)
 M 0 124 1 264 	(Fiona)
 G 1 27200 99 -1 	(a salted herring)
 G 1 27217 99 -1 	(a bowl of ma gung)
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/zon/3.zon tbamud-3.52/lib/world/zon/3.zon
--- tbamud-3.51/lib/world/zon/3.zon	2007-02-24 22:38:29.000000000 +0100
+++ tbamud-3.52/lib/world/zon/3.zon	2007-04-20 16:46:57.000000000 +0200
@@ -2,6 +2,7 @@
 Rumble~
 Sanctus III~
 300 399 30 2
+O 0 335 1 334 	(the large fountain)
 M 0 30 3 343 	(the spy for the underground)
 M 0 99 1 367 	(Death)
 E 1 99 1 16 	(the Scythe of Death)
@@ -20,8 +21,8 @@ M 0 198 2 340 	(a temple cleric)
 M 0 125 3 340 	(the young girl)
 M 0 170 3 340 	(the townsman)
 G 1 176 99 -1 	(a cancer stick)
-D 0 338 3 1 	(The Clerics Quarter)
-D 0 338 2 1 	(The Clerics Quarter)
+D 0 338 3 1 	(The Clerics' Quarters)
+D 0 338 2 1 	(The Clerics' Quarters)
 M 0 190 3 338 	(the cat)
 G 1 174 99 -1 	(a nasty hairball)
 R 0 333 164 -1 	(some beggin strips)
diff -BburpN --exclude=.svn tbamud-3.51/lib/world/zon/83.zon tbamud-3.52/lib/world/zon/83.zon
--- tbamud-3.51/lib/world/zon/83.zon	2007-02-24 22:38:10.000000000 +0100
+++ tbamud-3.52/lib/world/zon/83.zon	2007-04-20 16:46:57.000000000 +0200
@@ -1,5 +1,5 @@
 #83
-Meyekul~
+Meyekul Benighted~
 Glumgold's Sea~
 8300 8399 30 1
 D 0 8393 5 2 	(The Mid-Deck)
diff -BburpN --exclude=.svn tbamud-3.51/src/Makefile.in tbamud-3.52/src/Makefile.in
--- tbamud-3.51/src/Makefile.in	2007-02-24 22:36:41.000000000 +0100
+++ tbamud-3.52/src/Makefile.in	2007-04-20 16:46:01.000000000 +0200
@@ -24,28 +24,30 @@ CFLAGS = @CFLAGS@ $(MYFLAGS) $(PROFILE)
 LIBS = @LIBS@ @CRYPTLIB@ @NETLIB@
 
 OBJFILES = act.comm.o act.informative.o act.item.o act.movement.o \
-	act.offensive.o act.other.o act.social.o act.wizard.o alias.o ban.o \
-	boards.o castle.o cedit.o class.o comm.o config.o constants.o db.o \
-	fight.o genmob.o genobj.o genolc.o genshp.o genwld.o genzon.o graph.o \
-	handler.o house.o improved-edit.o interpreter.o limits.o magic.o mail.o \
-	medit.o mobact.o modify.o oasis.o oasis_copy.o oasis_delete.o \
-	oasis_list.o objsave.o oedit.o random.o redit.o sedit.o \
-	shop.o spec_assign.o spec_procs.o spell_parser.o spells.o tedit.o \
-	utils.o weather.o zedit.o bsd-snprintf.o \
-	dg_comm.o dg_db_scripts.o dg_event.o dg_handler.o dg_mobcmd.o \
-	dg_misc.o dg_objcmd.o dg_scripts.o dg_triggers.o dg_wldcmd.o dg_olc.o \
-	dg_variables.o \
-	context_help.o hedit.o aedit.o zmalloc.o players.o
+	act.offensive.o act.other.o act.social.o act.wizard.o aedit.o alias.o \
+	ban.o boards.o bsd-snprintf.o castle.o cedit.o class.o comm.o config.o \
+	constants.o context_help.o db.o dg_comm.o dg_db_scripts.o dg_event.o \
+	dg_handler.o dg_misc.o dg_mobcmd.o dg_objcmd.o dg_olc.o dg_scripts.o \
+	dg_triggers.o dg_variables.o dg_wldcmd.o fight.o genmob.o \
+	genobj.o genolc.o genshp.o genwld.o genzon.o graph.o handler.o hedit.o \
+	house.o improved-edit.o interpreter.o limits.o magic.o mail.o medit.o \
+	mobact.o modify.o oasis.o oasis_copy.o oasis_delete.o oasis_list.o \
+	objsave.o oedit.o players.o random.o redit.o sedit.o shop.o \
+	spec_assign.o spec_procs.o spell_parser.o spells.o tedit.o utils.o \
+	weather.o zedit.o zmalloc.o 
 
 CXREF_FILES = act.comm.c act.informative.c act.item.c act.movement.c \
-	act.offensive.c act.other.c act.social.c act.wizard.c alias.c ban.c \
-	boards.c castle.c cedit.c class.c comm.c config.c constants.c db.c \
-	fight.c genmob.c genobj.c genolc.c genshp.c genwld.c genzon.c graph.c \
-	handler.c house.c improved-edit.c interpreter.c limits.c magic.c mail.c \
-	medit.c mobact.c modify.c oasis.c oasis_copy.c oasis_delete.c \
-	oasis_list.c objsave.c oedit.c olc.c random.c redit.c sedit.c \
-	shop.c spec_assign.c spec_procs.c spell_parser.c spells.c tedit.c \
-	utils.c weather.c zedit.c hedit.c bsd-snprintf.c players.c
+	act.offensive.c act.other.c act.social.c act.wizard.c aedit.c alias.c \
+	ban.c boards.c bsd-snprintf.c castle.c cedit.c class.c comm.c config.c \
+	constants.c context_help.c db.c dg_comm.c dg_db_scripts.c dg_event.c \
+	dg_handler.c dg_misc.c dg_mobcmd.c dg_objcmd.c dg_olc.c dg_scripts.c \
+	dg_triggers.c dg_variables.c dg_wldcmd.c fight.c genmob.c \
+	genobj.c genolc.c genshp.c genwld.c genzon.c graph.c handler.c hedit.c \
+	house.c improved-edit.c interpreter.c limits.c magic.c mail.c medit.c \
+	mobact.c modify.c oasis.c oasis_copy.c oasis_delete.c oasis_list.c \
+	objsave.c oedit.c players.c random.c redit.c sedit.c shop.c \
+	spec_assign.c spec_procs.c spell_parser.c spells.c tedit.c utils.c \
+	weather.c zedit.c zmalloc.c
 
 default: all
 
diff -BburpN --exclude=.svn tbamud-3.51/src/act.comm.c tbamud-3.52/src/act.comm.c
--- tbamud-3.51/src/act.comm.c	2007-02-24 22:36:41.000000000 +0100
+++ tbamud-3.52/src/act.comm.c	2007-04-20 16:46:01.000000000 +0200
@@ -48,16 +46,23 @@ ACMD(do_say)
   if (!*argument)
     send_to_char(ch, "Yes, but WHAT do you want to say?\r\n");
   else {
-    char buf[MAX_INPUT_LENGTH + 14];
+    char buf[MAX_INPUT_LENGTH + 14], *msg;
+
+    snprintf(buf, sizeof(buf), "$n@n says, '%s@n'", argument);
+    msg = act(buf, FALSE, ch, 0, 0, TO_ROOM | DG_NO_TRIG);
 
-    snprintf(buf, sizeof(buf), "$n says, '%s@n'", argument);
-    act(buf, FALSE, ch, 0, 0, TO_ROOM | DG_NO_TRIG | LOG_MESSG);
+    struct char_data *vict;
+    for (vict = world[IN_ROOM(ch)].people; vict; vict = vict->next_in_room)
+      if (vict != ch && GET_POS(vict) > POS_SLEEPING)
+        add_history(vict, msg, HIST_SAY);
 
     if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT))
       send_to_char(ch, "%s", CONFIG_OK);
     else {
       delete_doubledollar(argument);
-      send_to_char(ch, "You say, '%s@n'\r\n", argument);
+      sprintf(buf, "You say, '%s@n'", argument);
+      msg = act(buf, FALSE, ch, 0, 0, TO_CHAR | DG_NO_TRIG);
+      add_history(ch, msg, HIST_SAY);
     }
   }
   /* trigger check */
@@ -90,10 +94,10 @@ ACMD(do_gsay)
     snprintf(buf, sizeof(buf), "$n tells the group, '%s@n'", argument);
 
     if (AFF_FLAGGED(k, AFF_GROUP) && (k != ch))
-      act(buf, FALSE, ch, 0, k, TO_VICT | TO_SLEEP | LOG_MESSG);
+      act(buf, FALSE, ch, 0, k, TO_VICT | TO_SLEEP);
     for (f = k->followers; f; f = f->next)
       if (AFF_FLAGGED(f->follower, AFF_GROUP) && (f->follower != ch))
-	act(buf, FALSE, ch, 0, f->follower, TO_VICT | TO_SLEEP | LOG_MESSG);
+        act(buf, FALSE, ch, 0, f->follower, TO_VICT | TO_SLEEP);
 
     if (PRF_FLAGGED(ch, PRF_NOREPEAT))
       send_to_char(ch, "%s", CONFIG_OK);
@@ -102,23 +106,20 @@ ACMD(do_gsay)
   }
 }
 
-
 void perform_tell(struct char_data *ch, struct char_data *vict, char *arg)
 {
-  char buf[MAX_STRING_LENGTH];
+  char buf[MAX_STRING_LENGTH], *msg;
 
-  send_to_char(vict, "%s", CCRED(vict, C_NRM));
-  snprintf(buf, sizeof(buf), "$n tells you, '%s'", arg);
-  act(buf, FALSE, ch, 0, vict, TO_VICT | TO_SLEEP | LOG_MESSG);
-  send_to_char(vict, "%s", CCNRM(vict, C_NRM));
+  snprintf(buf, sizeof(buf), "%s$n tells you, '%s'%s", CCRED(vict, C_NRM), arg, CCNRM(vict, C_NRM));
+  msg = act(buf, FALSE, ch, 0, vict, TO_VICT | TO_SLEEP);
+  add_history(vict, msg, HIST_TELL);
 
   if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT))
     send_to_char(ch, "%s", CONFIG_OK);
   else {
-    send_to_char(ch, "%s", CCRED(ch, C_CMP));
-    snprintf(buf, sizeof(buf), "You tell $N, '%s'", arg);
-    act(buf, FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP);
-    send_to_char(ch, "%s", CCNRM(ch, C_CMP));
+    snprintf(buf, sizeof(buf), "%sYou tell $N, '%s'%s", CCRED(ch, C_NRM), arg, CCNRM(ch, C_NRM));
+    msg = act(buf, FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP);     
+    add_history(ch, msg, HIST_TELL);
   }
 
   if (!IS_NPC(vict) && !IS_NPC(ch))
@@ -270,7 +261,7 @@ ACMD(do_spec_comm)
     char buf1[MAX_STRING_LENGTH];
 
     snprintf(buf1, sizeof(buf1), "$n %s you, '%s'", action_plur, buf2);
-    act(buf1, FALSE, ch, 0, vict, TO_VICT | LOG_MESSG);
+    act(buf1, FALSE, ch, 0, vict, TO_VICT);
 
     if (PRF_FLAGGED(ch, PRF_NOREPEAT))
       send_to_char(ch, "%s", CONFIG_OK);
@@ -384,13 +368,13 @@ ACMD(do_page)
       if (GET_LEVEL(ch) > LVL_GOD) {
 	for (d = descriptor_list; d; d = d->next)
 	  if (STATE(d) == CON_PLAYING && d->character)
-	    act(buf, FALSE, ch, 0, d->character, TO_VICT | LOG_MESSG);
+	    act(buf, FALSE, ch, 0, d->character, TO_VICT);
       } else
 	send_to_char(ch, "You will never be godly enough to do that!\r\n");
       return;
     }
     if ((vict = get_char_vis(ch, arg, NULL, FIND_CHAR_WORLD)) != NULL) {
-      act(buf, FALSE, ch, 0, vict, TO_VICT | LOG_MESSG);
+      act(buf, FALSE, ch, 0, vict, TO_VICT);
       if (PRF_FLAGGED(ch, PRF_NOREPEAT))
 	send_to_char(ch, "%s", CONFIG_OK);
       else
@@ -400,16 +384,12 @@ ACMD(do_page)
   }
 }
 

/**********************************************************************
 * generalized communication func, originally by Fred C. Merkel (Torg) *
  *********************************************************************/
 ACMD(do_gen_comm)
 {
   struct descriptor_data *i;
   char color_on[24];
-  char buf1[MAX_INPUT_LENGTH];
+  char buf1[MAX_INPUT_LENGTH], buf2[MAX_INPUT_LENGTH], *msg;
 
   /* Array of flags which must _not_ be set in order for comm to be heard */
   int channels[] = {
@@ -422,12 +402,18 @@ ACMD(do_gen_comm)
     0
   };
 
-  /*
-   * com_msgs: [0] Message if you can't perform the action because of noshout
+  int hist_type[] = {
+    HIST_HOLLER,
+    HIST_SHOUT,
+    HIST_GOSSIP,
+    HIST_AUCTION,
+    HIST_GRATS,
+  };
+
+  /* com_msgs: [0] Message if you can't perform the action because of noshout
    *           [1] name of the action
    *           [2] message if you're not on the channel
-   *           [3] a color string.
-   */
+   *           [3] a color string. */
   const char *com_msgs[][4] = {
     {"You cannot holler!!\r\n",
       "holler",
@@ -518,8 +504,11 @@ ACMD(do_gen_comm)
   /* first, set up strings to be given to the communicator */
   if (PRF_FLAGGED(ch, PRF_NOREPEAT))
     send_to_char(ch, "%s", CONFIG_OK);
-  else
-    send_to_char(ch, "%sYou %s, '%s'%s\r\n", COLOR_LEV(ch) >= C_CMP ? color_on : "", com_msgs[subcmd][1], argument, CCNRM(ch, C_CMP));
+  else {
+    snprintf(buf1, sizeof(buf1), "%sYou %s, '%s'%s", COLOR_LEV(ch) >= C_CMP ? color_on : "", com_msgs[subcmd][1], argument, CCNRM(ch, C_CMP));
+    msg = act(buf1, FALSE, ch, 0, 0, TO_CHAR);
+    add_history(ch, msg, hist_type[subcmd]);
+  }
 
   snprintf(buf1, sizeof(buf1), "$n %ss, '%s'", com_msgs[subcmd][1], argument);
 
@@ -538,11 +527,9 @@ ACMD(do_gen_comm)
        !AWAKE(i->character)))
       continue;
 
-    if (COLOR_LEV(i->character) >= C_NRM)
-      send_to_char(i->character, "%s", color_on);
-    act(buf1, FALSE, ch, 0, i->character, TO_VICT | TO_SLEEP | LOG_MESSG);
-    if (COLOR_LEV(i->character) >= C_NRM)
-      send_to_char(i->character, "%s", KNRM);
+    snprintf(buf2, sizeof(buf2), "%s%s%s", (COLOR_LEV(i->character) >= C_NRM) ? color_on : "", buf1, KNRM); 
+    msg = act(buf2, FALSE, ch, 0, i->character, TO_VICT | TO_SLEEP);
+    add_history(i->character, msg, hist_type[subcmd]);
   }
 }
 
@@ -577,71 +563,10 @@ ACMD(do_qcomm)
       }
     for (i = descriptor_list; i; i = i->next)
       if (STATE(i) == CON_PLAYING && i != ch->desc && PRF_FLAGGED(i->character, PRF_QUEST))
-	act(buf, 0, ch, 0, i->character, TO_VICT | TO_SLEEP | LOG_MESSG);
+       act(buf, 0, ch, 0, i->character, TO_VICT | TO_SLEEP);
   }
 }
 
-#define HIST_LENGTH  100
-
-void free_hist_messg(struct descriptor_data *d)
-{
-  struct txt_block *tmp = d->comms, *ftmp;
-  while (tmp) {
-    ftmp = tmp;
-    tmp = tmp->next;
-    if (ftmp->text)
-      free(ftmp->text);
-    free(ftmp);
-  }
-  d->comms = NULL;
-}
-
-void new_hist_messg(struct descriptor_data *d, const char *msg)
-{
-  struct txt_block *tmp = d->comms;
-  int l = 0;
-  if (!tmp) {
-    CREATE(d->comms, struct txt_block, 1);
-    d->comms->text = strdup(msg);
-    return;
-  }
-  while (tmp->next)
-    tmp = tmp->next;
-  CREATE(tmp->next, struct txt_block, 1);
-  tmp->next->text = strdup(msg);
-
-  for (tmp = d->comms; tmp ; tmp= tmp->next)
-    l++;
-
-  for (; l > HIST_LENGTH && d->comms; l--) {
-    tmp = d->comms;
-    d->comms = tmp->next;
-    if (tmp->text)
-      free(tmp->text);
-    free(tmp);
-  }
-}
-
-ACMD(do_list_history)
-{
-  struct txt_block *tmp;
-  struct descriptor_data *d = ch->desc;
-
-  if (!d)
-    return;
-
-  if (!d->comms) {
-    write_to_output(d, "No communications in history.\r\n");
-    return;
-  }
-  write_to_output(d, "Last %d communications:\r\n", HIST_LENGTH);
-
-  for (tmp = d->comms;tmp;tmp = tmp->next)
-    write_to_output(d, "%s%s%s", QWHT, tmp->text, QNRM);
-
-  free_hist_messg(d);
-}
-
 void handle_webster_file(void) {
   FILE *fl;
   struct char_data *ch = find_char(last_webster_teller);
diff -BburpN --exclude=.svn tbamud-3.51/src/act.informative.c tbamud-3.52/src/act.informative.c
--- tbamud-3.51/src/act.informative.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/act.informative.c	2007-04-20 16:46:03.000000000 +0200
@@ -40,7 +40,6 @@ extern char *class_abbrevs[];
 
 /* extern functions */
 ACMD(do_action);
-ACMD(do_insult);
 bitvector_t find_class_bitvector(const char *arg);
 int level_exp(int chclass, int level);
 char *title_male(int chclass, int level);
@@ -99,20 +98,36 @@ int *cmd_sort_info;
 
 void show_obj_to_char(struct obj_data *obj, struct char_data *ch, int mode)
 {
+  int found = 0;   
+  struct char_data *temp;
+  
   if (!obj || !ch) {
     log("SYSERR: NULL pointer in show_obj_to_char(): obj=%p ch=%p", obj, ch);
-    /*  SYSERR_DESC:
-     *  Somehow a NULL pointer was sent to show_obj_to_char() in either the
-     *  'obj' or the 'ch' variable.  The error will indicate which was NULL
-     *  by listing both of the pointers passed to it.  This is often a
-     *  difficult one to trace, and may require stepping through a debugger.
-     */
+    /*  SYSERR_DESC: Somehow a NULL pointer was sent to show_obj_to_char() in 
+     *  either the 'obj' or the 'ch' variable.  The error will indicate which 
+     *  was NULL by listing both of the pointers passed to it.  This is often a
+     *  difficult one to trace, and may require stepping through a debugger. */
     return;
   }
 
+  if ((mode == 0) && obj->description) {
+    if (!GET_OBJ_VAL(obj, 1) == 0 || OBJ_SAT_IN_BY(obj)) {
+      temp = OBJ_SAT_IN_BY(obj);
+      for (temp = OBJ_SAT_IN_BY(obj); temp; temp = NEXT_SITTING(temp)) {
+        if (temp == ch)
+          found++;
+      }
+      if (found) {
+        send_to_char(ch, "You are %s upon %s.", GET_POS(ch) == POS_SITTING ? "sitting" :
+        "resting", obj->short_description);
+        goto end;
+      }
+    }
+  }
+
   switch (mode) {
   case SHOW_OBJ_LONG:
    /* hide objects starting with . from non-holylighted people Idea from Elaseth of TBA */
     if (*obj->description == '.' && (IS_NPC(ch) || !PRF_FLAGGED(ch, PRF_HOLYLIGHT)))
       return;
 
@@ -154,15 +169,14 @@ void show_obj_to_char(struct obj_data *o
 
   default:
     log("SYSERR: Bad display mode (%d) in show_obj_to_char().", mode);
-    /*  SYSERR_DESC:
-     *  show_obj_to_char() has some predefined 'mode's (argument #3) to tell
-     *  it what to display to the character when it is called.  If the mode
-     *  is not one of these, it will output this error, and indicate what
-     *  mode was passed to it.  To correct it, you will need to find the
-     *  call with the incorrect mode and change it to an acceptable mode.
-     */
+    /*  SYSERR_DESC:  show_obj_to_char() has some predefined 'mode's (argument 
+     *  #3) to tell it what to display to the character when it is called.  If 
+     *  the mode is not one of these, it will output this error, and indicate 
+     *  what mode was passed to it.  To correct it, you will need to find the
+     *  call with the incorrect mode and change it to an acceptable mode. */
     return;
   }
+  end:
 
   show_obj_modifiers(obj, ch);
   send_to_char(ch, "\r\n");
@@ -294,6 +308,7 @@ void look_at_char(struct char_data *i, s
 
 void list_one_char(struct char_data *i, struct char_data *ch)
 {
+  struct obj_data *furniture;
   const char *positions[] = {
     " is lying here, dead.",
     " is lying here, mortally wounded.",
@@ -330,7 +345,7 @@ void list_one_char(struct char_data *i, 
   }
 
   if (IS_NPC(i))
-    send_to_char(ch, "%s", CAP(strdup(i->player.short_descr)));
+    send_to_char(ch, "%c%s", UPPER(*i->player.short_descr), i->player.short_descr + 1); 
   else
   send_to_char(ch, "%s%s%s", i->player.name, *GET_TITLE(i) ? " " : "", GET_TITLE(i));
 
@@ -342,13 +357,21 @@ void list_one_char(struct char_data *i, 
     send_to_char(ch, " (linkless)");
   if (!IS_NPC(i) && PLR_FLAGGED(i, PLR_WRITING))
     send_to_char(ch, " (writing)");
-
   if (!IS_NPC(i) && PRF_FLAGGED(i, PRF_BUILDWALK))
     send_to_char(ch, " (buildwalk)");
+  if (!IS_NPC(i) && PRF_FLAGGED(i, PRF_AFK))
+    send_to_char(ch, " (AFK)");
 
-  if (GET_POS(i) != POS_FIGHTING)
+  if (GET_POS(i) != POS_FIGHTING) {
+    if (!SITTING(i))
     send_to_char(ch, "%s", positions[(int) GET_POS(i)]);
   else {
+    furniture = SITTING(i);
+    send_to_char(ch, " is %s upon %s.", (GET_POS(i) == POS_SLEEPING ? 
+        "sleeping" : (GET_POS(i) == POS_RESTING ? "resting" : "sitting")), 
+        OBJS(furniture, ch));
+  }
+  } else {
     if (FIGHTING(i)) {
       send_to_char(ch, " is here, fighting ");
       if (FIGHTING(i) == ch)
@@ -541,9 +564,15 @@ void look_in_obj(struct char_data *ch, c
       if (GET_OBJ_VAL(obj, 1) <= 0)
 	send_to_char(ch, "It is empty.\r\n");
       else {
-	if (GET_OBJ_VAL(obj,0) <= 0 || GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0)) {
+        if (GET_OBJ_VAL(obj, 0) < 0)
+        {
+          char buf2[MAX_STRING_LENGTH];
+          sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2));
+          send_to_char(ch, "It's full of a %s liquid.\r\n", buf2);
+        }
+	else if (GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0)) 
 	  send_to_char(ch, "Its contents seem somewhat murky.\r\n"); /* BUG */
-	} else {
+        else {
           char buf2[MAX_STRING_LENGTH];
 	  amt = (GET_OBJ_VAL(obj, 1) * 3) / GET_OBJ_VAL(obj, 0);
 	  sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2));
@@ -764,8 +789,8 @@ ACMD(do_score)
   send_to_char(ch, "Your armor class is %d/10, and your alignment is %d.\r\n",
 	  compute_armor_class(ch), GET_ALIGNMENT(ch));
 
-  send_to_char(ch, "You have scored %d exp, and have %d gold coins.\r\n",
-	  GET_EXP(ch), GET_GOLD(ch));
+  send_to_char(ch, "You have %d exp, %d gold coins, and %d questpoints.\r\n",
+	  GET_EXP(ch), GET_GOLD(ch), GET_QUESTPOINTS(ch));
 
   if (GET_LEVEL(ch) < LVL_IMMORT)
     send_to_char(ch, "You need %d exp to reach your next level.\r\n",
@@ -800,7 +825,12 @@ ACMD(do_score)
     send_to_char(ch, "You are resting.\r\n");
     break;
   case POS_SITTING:
+    if (!SITTING(ch))
     send_to_char(ch, "You are sitting.\r\n");
+    else {
+      struct obj_data *furniture = SITTING(ch);
+      send_to_char(ch, "You are sitting upon %s.\r\n", furniture->short_description);
+    }
     break;
   case POS_FIGHTING:
     send_to_char(ch, "You are fighting %s.\r\n", FIGHTING(ch) ? PERS(FIGHTING(ch), ch) : "thin air");
@@ -994,7 +1019,7 @@ int search_help(char *argument, int leve
     else 
       top = mid - 1; 
   } 
-  return -1;      
+  return NOWHERE;      
 }
 
 ACMD(do_help)
@@ -1020,9 +1045,8 @@ ACMD(do_help)
   }
 
   space_to_minus(argument);
-  mid = search_help(argument, GET_LEVEL(ch));
 
-  if (mid < 0) {
+  if ((mid = search_help(argument, GET_LEVEL(ch))) == NOWHERE) {
     send_to_char(ch, "There is no help on that word.\r\n");
     mudlog(NRM, MAX(LVL_IMPL, GET_INVIS_LEV(ch)), TRUE,
       "%s tried to get help on %s", GET_NAME(ch), argument);
@@ -1468,7 +1492,7 @@ ACMD(do_gen_ps)
     send_to_char(ch, "\033[H\033[J");
     break;
   case SCMD_VERSION:
-    send_to_char(ch, "%s\r\n", circlemud_version);
+    send_to_char(ch, "%s\r\n", tbamud_version);
     send_to_char(ch, "%s\r\n", oasisolc_version);
     send_to_char(ch, "%s\r\n", DG_SCRIPT_VERSION);
     send_to_char(ch, "%s\r\n", ascii_pfiles_version);
@@ -1866,13 +1888,13 @@ ACMD(do_toggle)
     {"holylight", PRF_HOLYLIGHT, LVL_IMMORT,
     "HolyLight mode off.\r\n",
     "HolyLight mode on.\r\n"},
-    {"slownameserver", -1, LVL_IMPL,
+    {"slownameserver", 0, LVL_IMPL,
     "Nameserver_is_slow changed to OFF; IP addresses will now be resolved.\r\n",
     "Nameserver_is_slow changed to ON; sitenames will no longer be resolved.\r\n"},
     {"autoexits", PRF_AUTOEXIT, 0,
     "Autoexits disabled.\r\n",
     "Autoexits enabled.\r\n"},
-    {"trackthru", -1, LVL_IMPL,
+    {"trackthru", 0, LVL_IMPL,
     "Players can no longer track through doors.\r\n",
     "Players can now track through doors.\r\n"},
     {"clsolc", PRF_CLS, LVL_BUILDER,
@@ -1884,10 +1906,10 @@ ACMD(do_toggle)
     {"afk", PRF_AFK, 0,
     "AFK is now Off.\r\n",
     "AFK is now On.\r\n"},
-    {"color", -1, 0, "\n", "\n"},
-    {"syslog", -1, LVL_IMMORT, "\n", "\n"},
-    {"wimpy", -1, 0, "\n", "\n"},
-    {"pagelength", -1, 0, "\n", "\n"},
+    {"color", 0, 0, "\n", "\n"},
+    {"syslog", 0, LVL_IMMORT, "\n", "\n"},
+    {"wimpy", 0, 0, "\n", "\n"},
+    {"pagelength", 0, 0, "\n", "\n"},
     {"autoloot", PRF_AUTOLOOT, 0,
     "Autoloot disabled.\r\n",
     "Autoloot enabled.\r\n"},
@@ -1903,7 +1925,7 @@ ACMD(do_toggle)
     {"autoassist", PRF_AUTOASSIST, 0,
     "Autoassist disabled.\r\n",
     "Autoassist enabled.\r\n"},
-    {"\n", -1, -1, "\n", "\n"} /* must be last */
+    {"\n", 0, -1, "\n", "\n"} /* must be last */
   };
 
 	len = strlen(arg);
@@ -1924,7 +1946,7 @@ ACMD(do_toggle)
     }
 
     if (((tp = search_block(arg2, types, FALSE)) == -1)) {
-      send_to_char(ch, "Usage: color { Off | Normal | On }\r\n");
+      send_to_char(ch, "Usage: toggle color { Off | Normal | On }\r\n");
       return;
     }
     REMOVE_BIT(PRF_FLAGS(ch), PRF_COLOR_1 | PRF_COLOR_2);
@@ -1938,7 +1960,7 @@ ACMD(do_toggle)
       return;
     }
     if (((tp = search_block(arg2, types, FALSE)) == -1)) {
-      send_to_char(ch, "Usage: syslog { Off | Brief | Normal | On }\r\n");
+      send_to_char(ch, "Usage: toggle syslog { Off | Brief | Normal | On }\r\n");
       return;
     }
     REMOVE_BIT(PRF_FLAGS(ch), PRF_LOG1 | PRF_LOG2);
@@ -1968,7 +1990,7 @@ ACMD(do_toggle)
     if ((result = PRF_TOG_CHK(ch, PRF_AFK)))
       act("$n is now away from $s keyboard.", TRUE, ch, 0, 0, TO_ROOM);
     else {
-      act("$n has return to $s keyboard.", TRUE, ch, 0, 0, TO_ROOM);
+      act("$n has returned to $s keyboard.", TRUE, ch, 0, 0, TO_ROOM);
       if (has_mail(GET_IDNUM(ch))) 
         send_to_char(ch, "You have mail waiting.\r\n"); 
     } 
@@ -2092,7 +2114,7 @@ ACMD(do_commands)
     if ((complete_cmd_info[i].minimum_level >= LVL_IMMORT) != wizhelp)
       continue;
 
-    if (!wizhelp && socials != (complete_cmd_info[i].command_pointer == do_action || complete_cmd_info[i].command_pointer == do_insult))
+    if (!wizhelp && socials != (complete_cmd_info[i].command_pointer == do_action))
       continue;
 
     if (wizhelp && complete_cmd_info[i].command_pointer == do_action) 
@@ -2104,3 +2126,89 @@ ACMD(do_commands)
   if (no % 7 != 1)
     send_to_char(ch, "\r\n");
 }
+
+void free_history(struct char_data *ch, int type)
+{
+  struct txt_block *tmp = GET_HISTORY(ch, type), *ftmp;     
+
+  while ((ftmp = tmp)) {
+    tmp = tmp->next;
+    if (ftmp->text)   
+      free(ftmp->text);
+    free(ftmp);
+  }
+  GET_HISTORY(ch, type) = NULL;       
+}
+
+ACMD(do_history)
+{
+  char arg[MAX_INPUT_LENGTH];
+
+  one_argument(argument, arg);
+
+  int type = search_block(arg, history_types, FALSE);
+  if (!*arg || type < 0) {
+    int i;
+
+    send_to_char(ch, "Usage: history <");
+    for (i = 0; *history_types[i] != '\n'; i++) {
+      send_to_char(ch, " %s ", history_types[i]);
+      if (*history_types[i + 1] == '\n')
+        send_to_char(ch, ">\r\n");
+      else
+        send_to_char(ch, "|");
+    }
+    return;
+  }
+
+  if (GET_HISTORY(ch, type) && GET_HISTORY(ch, type)->text && *GET_HISTORY(ch, type)->text) {
+    struct txt_block *tmp;
+    for (tmp = GET_HISTORY(ch, type); tmp; tmp = tmp->next)
+      send_to_char(ch, "%s", tmp->text);
+/* Make this a 1 if you want history to clear after viewing */
+#if 0
+      free_history(ch, type);
+#endif
+  } else
+    send_to_char(ch, "You have no history in that channel.\r\n");
+}
+
+#define HIST_LENGTH 100 
+void add_history(struct char_data *ch, char *str, int type)
+{
+  int i = 0;
+  char time_str[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH];
+
+  if (IS_NPC(ch)) 
+    return;
+
+  struct txt_block *tmp = GET_HISTORY(ch, type);
+  time_t ct = time(0);
+  strftime(time_str, sizeof(time_str), "%H:%M ", localtime(&ct));
+
+  sprintf(buf, "%s%s", time_str, str);
+
+  if (!tmp) {
+    CREATE(GET_HISTORY(ch, type), struct txt_block, 1);
+    GET_HISTORY(ch, type)->text = strdup(buf);
+  } 
+  else {   
+    while (tmp->next)
+      tmp = tmp->next;
+    CREATE(tmp->next, struct txt_block, 1);
+    tmp->next->text = strdup(buf);
+
+    for (tmp = GET_HISTORY(ch, type); tmp; tmp = tmp->next, i++);
+
+    for (; i > HIST_LENGTH && GET_HISTORY(ch, type); i--) {
+      tmp = GET_HISTORY(ch, type);
+      GET_HISTORY(ch, type) = tmp->next;
+      if (tmp->text)
+        free(tmp->text);
+      free(tmp);
+    }
+  }
+  /* add this history message to ALL */
+  if (type != HIST_ALL)
+    add_history(ch, str, HIST_ALL);
+}
diff -BburpN --exclude=.svn tbamud-3.51/src/act.item.c tbamud-3.52/src/act.item.c
--- tbamud-3.51/src/act.item.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/act.item.c	2007-04-20 16:46:03.000000000 +0200
@@ -65,7 +62,8 @@ void perform_put(struct char_data *ch, s
   if (!obj) /* object might be extracted by drop_otrigger */
     return;
 
-  if (GET_OBJ_WEIGHT(cont) + GET_OBJ_WEIGHT(obj) > GET_OBJ_VAL(cont, 0))
+  if ((GET_OBJ_VAL(cont, 0) > 0) &&
+      (GET_OBJ_WEIGHT(cont) + GET_OBJ_WEIGHT(obj) > GET_OBJ_VAL(cont, 0)))
     act("$p won't fit in $P.", FALSE, ch, obj, cont, TO_CHAR);
   else if (OBJ_FLAGGED(obj, ITEM_NODROP) && IN_ROOM(cont) != NOWHERE)
     act("You can't get $p out of your hand.", FALSE, ch, obj, NULL, TO_CHAR);
@@ -462,9 +442,10 @@ int perform_drop(struct char_data *ch, s
   if ((mode == SCMD_DROP) && !drop_wtrigger(obj, ch))
     return 0;
 
-  if (OBJ_FLAGGED(obj, ITEM_NODROP)) {
+  if (OBJ_FLAGGED(obj, ITEM_NODROP) && !PRF_FLAGGED(ch, PRF_NOHASSLE)) {
     snprintf(buf, sizeof(buf), "You can't %s $p, it must be CURSED!", sname);
     act(buf, FALSE, ch, obj, 0, TO_CHAR);
+    return (0);
   }
 
   snprintf(buf, sizeof(buf), "You %s $p.%s", sname, VANISH(mode));
@@ -920,10 +883,11 @@ ACMD(do_drink)
 
   amount = MIN(amount, GET_OBJ_VAL(temp, 1));
 
-  /* You can't subtract more than the object weighs */
+  /* You can't subtract more than the object weighs, unless its unlimited. */
+  if (GET_OBJ_VAL(temp, 0) > 0) {
   weight = MIN(amount, GET_OBJ_WEIGHT(temp));
-
   weight_change_object(temp, -weight);	/* Subtract amount */
+  }
 
   gain_condition(ch, DRUNK,  drink_aff[GET_OBJ_VAL(temp, 2)][DRUNK]  * amount / 4);
   gain_condition(ch, HUNGER,   drink_aff[GET_OBJ_VAL(temp, 2)][HUNGER]   * amount / 4);
@@ -949,13 +913,15 @@ ACMD(do_drink)
     af.bitvector = AFF_POISON;
     affect_join(ch, &af, FALSE, FALSE, FALSE, FALSE);
   }
-  /* empty the container, and no longer poison. */
+  /* Empty the container (unless unlimited), and no longer poison. */
+  if (GET_OBJ_VAL(temp, 0) > 0) {
   GET_OBJ_VAL(temp, 1) -= amount;
   if (!GET_OBJ_VAL(temp, 1)) {	/* The last bit */
     name_from_drinkcon(temp);
     GET_OBJ_VAL(temp, 2) = 0;
     GET_OBJ_VAL(temp, 3) = 0;
   }
+  }
   return;
 }
 
@@ -1040,7 +1003,7 @@ ACMD(do_pour)
 {
   char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
   struct obj_data *from_obj = NULL, *to_obj = NULL;
-  int amount;
+  int amount = 0;
 
   two_arguments(argument, arg1, arg2);
 
@@ -1094,6 +1057,7 @@ ACMD(do_pour)
       return;
     }
     if (!str_cmp(arg2, "out")) {
+      if (GET_OBJ_VAL(from_obj, 0) > 0) {
       act("$n empties $p.", TRUE, ch, from_obj, 0, TO_ROOM);
       act("You empty $p.", FALSE, ch, from_obj, 0, TO_CHAR);
 
@@ -1103,6 +1067,9 @@ ACMD(do_pour)
       GET_OBJ_VAL(from_obj, 1) = 0;
       GET_OBJ_VAL(from_obj, 2) = 0;
       GET_OBJ_VAL(from_obj, 3) = 0;
+      }
+      else
+        send_to_char(ch, "You can't possibly pour that container out!\r\n");
 
       return;
     }
@@ -1120,8 +1087,8 @@ ACMD(do_pour)
     send_to_char(ch, "A most unproductive effort.\r\n");
     return;
   }
-  if ((GET_OBJ_VAL(to_obj, 1) != 0) &&
-      (GET_OBJ_VAL(to_obj, 2) != GET_OBJ_VAL(from_obj, 2))) {
+  if ((GET_OBJ_VAL(to_obj, 0) < 0) ||
+      (!(GET_OBJ_VAL(to_obj, 1) < GET_OBJ_VAL(to_obj, 0)))) {
     send_to_char(ch, "There is already another liquid in it!\r\n");
     return;
   }
@@ -1144,6 +1111,7 @@ ACMD(do_pour)
   GET_OBJ_VAL(to_obj, 2) = GET_OBJ_VAL(from_obj, 2);
 
   /* Then how much to pour */
+  if (GET_OBJ_VAL(from_obj, 0) > 0) {
   GET_OBJ_VAL(from_obj, 1) -= (amount =
 			 (GET_OBJ_VAL(to_obj, 0) - GET_OBJ_VAL(to_obj, 1)));
 
@@ -1157,12 +1125,17 @@ ACMD(do_pour)
     GET_OBJ_VAL(from_obj, 2) = 0;
     GET_OBJ_VAL(from_obj, 3) = 0;
   }
-  /* Then the poison boogie */
-  GET_OBJ_VAL(to_obj, 3) =
-    (GET_OBJ_VAL(to_obj, 3) || GET_OBJ_VAL(from_obj, 3));
+  }
+  else
+    GET_OBJ_VAL(to_obj, 1) = GET_OBJ_VAL(to_obj, 0);
 
-  /* And the weight boogie */
+  /* Poisoned? */
+  GET_OBJ_VAL(to_obj, 3) = (GET_OBJ_VAL(to_obj, 3) || GET_OBJ_VAL(from_obj, 3))
+;
+  /* Weight change, except for unlimited. */
+  if (GET_OBJ_VAL(from_obj, 0) > 0) {
   weight_change_object(from_obj, -amount);
+  }
   weight_change_object(to_obj, amount);	/* Add weight */
 }
 
@@ -1459,13 +1418,11 @@ void perform_remove(struct char_data *ch
 
   if (!(obj = GET_EQ(ch, pos)))
     log("SYSERR: perform_remove: bad pos %d passed.", pos);
-    /*  SYSERR_DESC:
-     *  This error occurs when perform_remove() is passed a bad 'pos'
-     *  (location) to remove an object from.
-     */
-  else if (OBJ_FLAGGED(obj, ITEM_NODROP))
+    /*  This error occurs when perform_remove() is passed a bad 'pos'
+     *  (location) to remove an object from. */
+  else if (OBJ_FLAGGED(obj, ITEM_NODROP) && !PRF_FLAGGED(ch, PRF_NOHASSLE)) 
     act("You can't remove $p, it must be CURSED!", FALSE, ch, obj, 0, TO_CHAR);
-  else if (IS_CARRYING_N(ch) >= CAN_CARRY_N(ch))
+  else if (IS_CARRYING_N(ch) >= CAN_CARRY_N(ch)&& !PRF_FLAGGED(ch, PRF_NOHASSLE))
     act("$p: you can't carry that many items!", FALSE, ch, obj, 0, TO_CHAR);
   else {
     if (!remove_otrigger(obj, ch))
diff -BburpN --exclude=.svn tbamud-3.51/src/act.movement.c tbamud-3.52/src/act.movement.c
--- tbamud-3.51/src/act.movement.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/act.movement.c	2007-04-20 16:46:03.000000000 +0200
@@ -52,11 +49,6 @@ int has_boat(struct char_data *ch)
   struct obj_data *obj;
   int i;
 
-/*
-  if (ROOM_IDENTITY(IN_ROOM(ch)) == DEAD_SEA)
-    return (1);
-*/
-
   if (GET_LEVEL(ch) > LVL_IMMORT)
     return (1);
 
@@ -567,6 +529,8 @@ ACMD(do_stand)
   case POS_SITTING:
     send_to_char(ch, "You stand up.\r\n");
     act("$n clambers to $s feet.", TRUE, ch, 0, 0, TO_ROOM);
+    /* Were they sitting in something? */
+    char_from_furniture(ch);
     /* Will be sitting after a successful bash and may still be fighting. */
     GET_POS(ch) = FIGHTING(ch) ? POS_FIGHTING : POS_STANDING;
     break;
@@ -574,6 +538,8 @@ ACMD(do_stand)
     send_to_char(ch, "You stop resting, and stand up.\r\n");
     act("$n stops resting, and clambers on $s feet.", TRUE, ch, 0, 0, TO_ROOM);
     GET_POS(ch) = POS_STANDING;
+    /* Were they sitting in something. */
+    char_from_furniture(ch);
     break;
   case POS_SLEEPING:
     send_to_char(ch, "You have to wake up first!\r\n");
@@ -590,14 +556,56 @@ ACMD(do_stand)
   }
 }
 
 ACMD(do_sit)
 {
+  char arg[MAX_STRING_LENGTH];
+  struct obj_data *furniture;
+  struct char_data *tempch;
+  int found;
+
+  one_argument(argument, arg);
+ 
+  if (!*arg)
+    found = 0;
+  if (!(furniture = get_obj_in_list_vis(ch, arg, NULL, world[ch->in_room].contents)))
+    found = 0;
+  else
+    found = 1;
+  
   switch (GET_POS(ch)) {
   case POS_STANDING:
+    if (found == 0) {
     send_to_char(ch, "You sit down.\r\n");
     act("$n sits down.", FALSE, ch, 0, 0, TO_ROOM);
     GET_POS(ch) = POS_SITTING;
+    } else {   
+      if (GET_OBJ_TYPE(furniture) != ITEM_FURNITURE) {
+        send_to_char(ch, "You can't sit on that!\r\n");
+        return;
+      } else if (GET_OBJ_VAL(furniture, 1) > GET_OBJ_VAL(furniture, 0)) {
+        /* Val 1 is current number sitting, 0 is max in sitting. */
+        act("$p looks like it's all full.", TRUE, ch, furniture, 0, TO_CHAR);
+        log("SYSERR: Furniture %d holding too many people.", GET_OBJ_VNUM(furniture));
+        return;
+      } else if (GET_OBJ_VAL(furniture, 1) == GET_OBJ_VAL(furniture, 0)) {
+        act("There is no where left to sit upon $p.", TRUE, ch, furniture, 0, TO_CHAR);
+        return;
+      } else { 
+        if (OBJ_SAT_IN_BY(furniture) == NULL)
+          OBJ_SAT_IN_BY(furniture) = ch;
+        for (tempch = OBJ_SAT_IN_BY(furniture); tempch != ch ; tempch = NEXT_SITTING(tempch)) {
+          if (NEXT_SITTING(tempch))
+            continue;
+          NEXT_SITTING(tempch) = ch;
+        }
+        act("You sit down upon $p.", TRUE, ch, furniture, 0, TO_CHAR);
+        act("$n sits down upon $p.", TRUE, ch, furniture, 0, TO_ROOM);
+        SITTING(ch) = furniture;
+        NEXT_SITTING(ch) = NULL;
+        GET_OBJ_VAL(furniture, 1) += 1;
+        GET_POS(ch) = POS_SITTING;
+      }
+    }
     break;
   case POS_SITTING:
     send_to_char(ch, "You're sitting already.\r\n");
@@ -714,6 +719,8 @@ ACMD(do_wake)
   else {
     send_to_char(ch, "You awaken, and sit up.\r\n");
     act("$n awakens.", TRUE, ch, 0, 0, TO_ROOM);
+    /* Were they asleep while sitting? */
+    char_from_furniture(ch);
     GET_POS(ch) = POS_SITTING;
   }
 }
diff -BburpN --exclude=.svn tbamud-3.51/src/act.other.c tbamud-3.52/src/act.other.c
--- tbamud-3.51/src/act.other.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/act.other.c	2007-04-20 16:46:03.000000000 +0200
@@ -37,6 +36,7 @@ SPECIAL(shop_keeper);
 ACMD(do_gen_comm);
 void die(struct char_data *ch, struct char_data * killer);
 void Crash_rentsave(struct char_data *ch, int cost);
+int has_mail(long id);
 
 /* local functions */
 ACMD(do_quit);
@@ -58,7 +58,6 @@ ACMD(do_use);
 ACMD(do_display);
 ACMD(do_gen_tog);
 ACMD(do_gen_write);
-ACMD(do_file);
 
 ACMD(do_quit)
 {
@@ -77,17 +76,22 @@ ACMD(do_quit)
 
     if (CONFIG_FREE_RENT)
       Crash_rentsave(ch, 0);
 
     GET_LOADROOM(ch) = GET_ROOM_VNUM(IN_ROOM(ch));
 
+    /* Stop snooping so you can't see passwords during deletion or change. */
+    if (ch->desc->snoop_by) {
+      write_to_output(ch->desc->snoop_by, "Your victim is no longer among us.\r\n");
+      ch->desc->snoop_by->snooping = NULL;
+      ch->desc->snoop_by = NULL;
+    }
+
     extract_char(ch);		/* Char is saved before extracting. */
   }
 }
@@ -412,7 +396,7 @@ ACMD(do_group)
   }
 
   if (ch->master) {
-    act("You can not enroll group members without being head of a group.",
+    act("You cannot enroll group members without being head of a group.",
 	FALSE, ch, 0, 0, TO_CHAR);
     return;
   }
@@ -916,8 +880,11 @@ ACMD(do_gen_tog)
     result = PRF_TOG_CHK(ch, PRF_AFK);
     if (PRF_FLAGGED(ch, PRF_AFK))
       act("$n has gone AFK.", TRUE, ch, 0, 0, TO_ROOM);
-    else
+    else {
       act("$n has come back from AFK.", TRUE, ch, 0, 0, TO_ROOM);
+      if (has_mail(GET_IDNUM(ch)))
+        send_to_char(ch, "You have mail waiting.\r\n");
+    }
     break;
   default:
     log("SYSERR: Unknown subcmd %d in do_gen_toggle.", subcmd);
@@ -931,104 +898,3 @@ ACMD(do_gen_tog)
 
   return;
 }
-
-ACMD(do_file)
-{
-  FILE *req_file;
-  int cur_line = 0, num_lines = 0, req_lines = 0, i, j, l;
-  char field[MAX_INPUT_LENGTH], value[MAX_INPUT_LENGTH], line[READ_SIZE];
-  char buf[MAX_STRING_LENGTH];
-  size_t len = 0, nlen;
-
-  struct file_struct {
-    char *cmd;
-    char level;
-    char *file;
-  } fields[] = {
-    { "bugs",           LVL_BUILDER,    "../lib/misc/bugs"},
-    { "typos",          LVL_BUILDER ,   "../lib/misc/typos"},
-    { "ideas",          LVL_BUILDER,    "../lib/misc/ideas"},
-    { "xnames",         LVL_BUILDER,     "../lib/misc/xnames"},
-    { "levels",         LVL_BUILDER,    "../log/levels" },
-    { "rip",            LVL_BUILDER,    "../log/rip" },
-    { "players",        LVL_BUILDER,    "../log/newplayers" },
-    { "rentgone",       LVL_BUILDER,    "../log/rentgone" },
-    { "errors",         LVL_BUILDER,    "../log/errors" },
-    { "godcmds",        LVL_BUILDER,    "../log/godcmds" },
-    { "syslog",         LVL_BUILDER,    "../syslog" },
-    { "crash",          LVL_BUILDER,    "../syslog.CRASH" },
-    { "help",           LVL_BUILDER,    "../log/help" },
-    { "\n", 0, "\n" }
-  };
-
-   skip_spaces(&argument);
-
-   if (!*argument) {
-     send_to_char(ch, "USAGE: file <option> <num lines>\r\n\r\nFile options:\r\n");
-     for (j = 0, i = 0; fields[i].level; i++)
-       if (fields[i].level <= GET_LEVEL(ch))
-         send_to_char(ch, "%-15s%s\r\n", fields[i].cmd, fields[i].file);
-     return;
-   }
-
-   two_arguments(argument, field, value);
-
-   for (l = 0; *(fields[l].cmd) != '\n'; l++)
-     if (!strncmp(field, fields[l].cmd, strlen(field)))
-     break;
-
-   if(*(fields[l].cmd) == '\n') {
-     send_to_char(ch, "That is not a valid option!\r\n");
-     return;
-   }
-
-   if (GET_LEVEL(ch) < fields[l].level) {
-     send_to_char(ch, "You are not godly enough to view that file!\r\n");
-     return;
-   }
-
-   if(!*value)
-     req_lines = 15; /* default is the last 15 lines */
-   else
-     req_lines = atoi(value);
-
-   if (!(req_file=fopen(fields[l].file,"r"))) {
-     mudlog(BRF, LVL_IMPL, TRUE,
-            "SYSERR: Error opening file %s using 'file' command.",
-            fields[l].file);
-     return;
-   }
-
-   get_line(req_file, line);
-   while (!feof(req_file)) {
-     num_lines++;
-     get_line(req_file,line);
-   }
-   rewind(req_file);
-
-   req_lines = MIN(MIN(req_lines, num_lines),150);
-
-   len = snprintf(buf, sizeof(buf), "Last %d lines of %s:\r\n", req_lines, fields[l].file);
-
-   if (req_lines == num_lines)
-     len += snprintf(buf + len, sizeof(buf) - len, "Top of file.\r\n");                 
-   get_line(req_file,line);
-   while (!feof(req_file)) {
-     cur_line++;
-     if(cur_line > (num_lines - req_lines)) {
-       nlen = snprintf(buf + len, sizeof(buf) - len, "%s\r\n", line);
-       if (len + nlen >= sizeof(buf) || nlen < 0)
-         break;
-       len += nlen;
-     }
-     get_line(req_file,line);
-   }
-   fclose(req_file);
-
-   if (len >= sizeof(buf)) {
-     const char *overflow = "\r\n**OVERFLOW**\r\n";
-     strcpy(buf + sizeof(buf) - strlen(overflow) - 1, overflow); /* strcpy: OK */
-   }
-   page_string(ch->desc, buf, 1);
-
-}
diff -BburpN --exclude=.svn tbamud-3.51/src/act.social.c tbamud-3.52/src/act.social.c
--- tbamud-3.51/src/act.social.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/act.social.c	2007-04-20 16:46:03.000000000 +0200
@@ -23,7 +21,6 @@
 /* local functions */
 int find_action(int cmd);
 ACMD(do_action);
-ACMD(do_insult);
 void free_social_messages(void);
 void free_action(struct social_messg *mess);
 void free_command_list(void);
@@ -108,55 +105,6 @@ ACMD(do_action)
   }
 }
 
-
-
-ACMD(do_insult)
-{
-  char arg[MAX_INPUT_LENGTH];
-  struct char_data *victim;
-
-  one_argument(argument, arg);
-
-  if (*arg) {
-    if (!(victim = get_char_vis(ch, arg, NULL, FIND_CHAR_ROOM)))
-      send_to_char(ch, "Can't hear you!\r\n");
-    else {
-      if (victim != ch) {
-	send_to_char(ch, "You insult %s.\r\n", GET_NAME(victim));
-
-	switch (rand_number(0, 2)) {
-	case 0:
-	  if (GET_SEX(ch) == SEX_MALE) {
-	    if (GET_SEX(victim) == SEX_MALE)
-	      act("$n accuses you of fighting like a woman!", FALSE, ch, 0, victim, TO_VICT);
-	    else
-	      act("$n says that women can't fight.", FALSE, ch, 0, victim, TO_VICT);
-	  } else {		/* Ch == Woman */
-	    if (GET_SEX(victim) == SEX_MALE)
-	      act("$n accuses you of having the smallest... (brain?)",
-		  FALSE, ch, 0, victim, TO_VICT);
-	    else
-	      act("$n tells you that you'd lose a beauty contest against a troll.",
-		  FALSE, ch, 0, victim, TO_VICT);
-	  }
-	  break;
-	case 1:
-	  act("$n calls your mother a bitch!", FALSE, ch, 0, victim, TO_VICT);
-	  break;
-	default:
-	  act("$n tells you to get lost!", FALSE, ch, 0, victim, TO_VICT);
-	  break;
-	}			/* end switch */
-
-	act("$n insults $N.", TRUE, ch, 0, victim, TO_NOTVICT);
-      } else {			/* ch == victim */
-	send_to_char(ch, "You feel insulted.\r\n");
-      }
-    }
-  } else
-    send_to_char(ch, "I'm sure you don't want to insult *everybody*...\r\n");
-}
-
 /* this function adds in the loaded socials and assigns them a command # */
 void create_command_list(void)
 {
@@ -299,7 +246,8 @@ ACMD(do_gmote)
         break;
 
   if ((act_nr = find_action(cmd)) < 0) {
-    send_to_char(ch, "That's not a social!\r\n");
+    snprintf(buf, sizeof(buf), "Gossip: $n%s", argument);
+    act(buf, FALSE, ch, 0, vict, TO_GMOTE);
     return;
   }
 
diff -BburpN --exclude=.svn tbamud-3.51/src/act.wizard.c tbamud-3.52/src/act.wizard.c
--- tbamud-3.51/src/act.wizard.c	2007-02-24 22:41:35.000000000 +0100
+++ tbamud-3.52/src/act.wizard.c	2007-04-20 16:49:23.000000000 +0200
 extern socket_t mother_desc;
 extern ush_int port;
 extern const char *pc_class_types[];
+extern int top_of_p_table;
+extern struct player_index_element *player_table;
 
 /* external functions */
 int level_exp(int chclass, int level);
 void show_shops(struct char_data *ch, char *value);
-void hcontrol_list_houses(struct char_data *ch);
+void hcontrol_list_houses(struct char_data *ch, char *arg);
 void do_start(struct char_data *ch);
 void appear(struct char_data *ch);
 void reset_zone(zone_rnum zone);
@@ -48,12 +50,13 @@ void roll_real_abils(struct char_data *c
 int parse_class(char arg);
 void run_autowiz(void);
 int save_all(void);
-extern zone_rnum real_zone_by_thing(room_vnum vznum); /* added for zone_checker */
+zone_rnum real_zone_by_thing(room_vnum vznum);
 SPECIAL(shop_keeper);
 void Crash_rentsave(struct char_data * ch, int cost);
 void new_hist_messg(struct descriptor_data *d, const char *msg);
 void clearMemory(struct char_data *ch);
 int perform_set_dg_var(struct char_data *ch, struct char_data *vict, char *val_arg);
+struct time_info_data *real_time_passed(time_t t2, time_t t1);
 
 /* local functions */
 int perform_set(struct char_data *ch, struct char_data *vict, int mode, char *val_arg);
@@ -113,6 +116,7 @@ ACMD(do_poofs);
 ACMD(do_copyover);
 ACMD(do_peace);
 void mod_llog_entry(struct last_entry *llast,int type);
+ACMD(do_plist);
 
 int purge_room(room_rnum room)
 {
@@ -642,6 +644,7 @@ void do_stat_object(struct char_data *ch
   struct obj_data *j2;
   struct extra_descr_data *desc;
   char buf[MAX_STRING_LENGTH];
+  struct char_data *tempch;
 
   send_to_char(ch, "Name: '%s%s%s', Aliases: %s\r\n", CCYEL(ch, C_NRM),
 	  j->short_description ? j->short_description : "<None>",
@@ -717,9 +718,6 @@ void do_stat_object(struct char_data *ch
   case ITEM_ARMOR:
     send_to_char(ch, "AC-apply: [%d]\r\n", GET_OBJ_VAL(j, 0));
     break;
-  case ITEM_TRAP:
-    send_to_char(ch, "Spell: %d, - Hitpoints: %d\r\n", GET_OBJ_VAL(j, 0), GET_OBJ_VAL(j, 1));
-    break;
   case ITEM_CONTAINER:
     sprintbit(GET_OBJ_VAL(j, 1), container_bits, buf, sizeof(buf));
     send_to_char(ch, "Weight capacity: %d, Lock Type: %s, Key Num: %d, Corpse: %s\r\n",
@@ -744,6 +741,13 @@ void do_stat_object(struct char_data *ch
   case ITEM_MONEY:
     send_to_char(ch, "Coins: %d\r\n", GET_OBJ_VAL(j, 0));
     break;
+  case ITEM_FURNITURE:
+    send_to_char(ch, "Can hold: [%d] Num. of People in: [%d]\r\n", GET_OBJ_VAL(j, 0), GET_OBJ_VAL(j, 1));
+    send_to_char(ch, "Holding : ");
+    for (tempch = OBJ_SAT_IN_BY(j); tempch; tempch = NEXT_SITTING(tempch))
+      send_to_char(ch, "%s ", GET_NAME(tempch));
+    send_to_char(ch, "\r\n");
+    break;
   default:
     send_to_char(ch, "Values 0-3: [%d] [%d] [%d] [%d]\r\n",
 	    GET_OBJ_VAL(j, 0), GET_OBJ_VAL(j, 1),
@@ -751,11 +755,6 @@ void do_stat_object(struct char_data *ch
     break;
   }
 
-  /*
-   * I deleted the "equipment status" code from here because it seemed
-   * more or less useless and just takes up valuable screen space.
-   */
-
   if (j->contains) {
     int column;
 
@@ -830,7 +829,7 @@ void do_stat_character(struct char_data 
 	 k->player.hometown, GET_TALK(k, 0), GET_TALK(k, 1), GET_TALK(k, 2),
 	    GET_PRACTICES(k), int_app[GET_INT(k)].learn,
 	    wis_app[GET_WIS(k)].bonus);
-    /*. Display OLC zone for immorts .*/
+    /* Display OLC zone for immorts. */
     if (GET_LEVEL(k) >= LVL_BUILDER) {
       if (GET_OLC_ZONE(k)==AEDIT_PERMISSION)
         send_to_char(ch, ", OLC[%sAedit%s]", CCCYN(ch, C_NRM), CCNRM(ch, C_NRM));
@@ -859,8 +858,8 @@ void do_stat_character(struct char_data 
 	  CCGRN(ch, C_NRM), GET_MANA(k), GET_MAX_MANA(k), mana_gain(k), CCNRM(ch, C_NRM),
 	  CCGRN(ch, C_NRM), GET_MOVE(k), GET_MAX_MOVE(k), move_gain(k), CCNRM(ch, C_NRM));
 
-  send_to_char(ch, "Coins: [%9d], Bank: [%9d] (Total: %d)\r\n",
-	  GET_GOLD(k), GET_BANK_GOLD(k), GET_GOLD(k) + GET_BANK_GOLD(k));
+  send_to_char(ch, "Gold: [%9d], Bank: [%9d] (Total: %d), Questpoints: [%d]\r\n",
+	  GET_GOLD(k), GET_BANK_GOLD(k), GET_GOLD(k) + GET_BANK_GOLD(k), GET_QUESTPOINTS(k));
 
   send_to_char(ch, "AC: [%d%+d/10], Hitroll: [%2d], Damroll: [%2d], Saving throws: [%d/%d/%d/%d/%d]\r\n",
 	  GET_AC(k), dex_app[GET_DEX(k)].defensive, k->points.hitroll,
@@ -1429,7 +1422,7 @@ ACMD(do_purge)
   if (*buf) {
     if ((vict = get_char_vis(ch, buf, NULL, FIND_CHAR_ROOM)) != NULL) {
       if (!IS_NPC(vict) && (GET_LEVEL(ch) <= GET_LEVEL(vict))) {
-	send_to_char(ch, "Fuuuuuuuuu!\r\n");
+	send_to_char(ch, "You can't purge them!\r\n");
 	return;
       }
       act("$n disintegrates $N.", FALSE, ch, 0, vict, TO_NOTVICT);
@@ -1521,14 +1514,12 @@ ACMD(do_advance)
 		GET_NAME(ch), GET_NAME(victim), newlevel, oldlevel);
 
   if (oldlevel >= LVL_IMMORT && newlevel < LVL_IMMORT) {
-    /* If they are no longer an immortal, let's remove some of the
-     * nice immortal only flags, shall we?
-     */
+    /* If they are no longer an immortal, remove the immortal only flags. */
     REMOVE_BIT(PRF_FLAGS(victim), PRF_LOG1 | PRF_LOG2);
     REMOVE_BIT(PRF_FLAGS(victim), PRF_NOHASSLE | PRF_HOLYLIGHT | PRF_SHOWVNUMS);
     run_autowiz();
   } else if (oldlevel < LVL_IMMORT && newlevel >= LVL_IMMORT) {
-    SET_BIT(PRF_FLAGS(victim), PRF_LOG1);
+    SET_BIT(PRF_FLAGS(victim), PRF_LOG2);
     SET_BIT(PRF_FLAGS(victim), PRF_HOLYLIGHT | PRF_SHOWVNUMS | PRF_AUTOEXIT);
         for (i = 1; i <= MAX_SKILLS; i++)
           SET_SKILL(victim, i, 100);
@@ -1804,7 +1786,7 @@ struct last_entry *find_llog_entry(int p
   int size,recs,tmp;
 
   if(!(fp=fopen(LAST_FILE,"r"))) {
-    log("error opening last_file for reading");
+    log("Error opening last_file for reading, will create.");
     return NULL;
   }
   fseek(fp,0L,SEEK_END);
@@ -2141,7 +2113,7 @@ ACMD(do_force)
 ACMD(do_wiznet)
 {
   char buf1[MAX_INPUT_LENGTH + MAX_NAME_LENGTH + 32],
-	buf2[MAX_INPUT_LENGTH + MAX_NAME_LENGTH + 32];
+       buf2[MAX_INPUT_LENGTH + MAX_NAME_LENGTH + 32], *msg;
   struct descriptor_data *d;
   char emote = FALSE;
   char any = FALSE;
@@ -2202,21 +2174,25 @@ ACMD(do_wiznet)
     return;
   }
   if (level > LVL_IMMORT) {
-    snprintf(buf1, sizeof(buf1), "%s: <%d> %s%s\r\n", GET_NAME(ch), level, emote ? "<--- " : "", argument);
-    snprintf(buf2, sizeof(buf1), "Someone: <%d> %s%s\r\n", level, emote ? "<--- " : "", argument);
+    snprintf(buf1, sizeof(buf1), "@c%s: <%d> %s%s@n\r\n", GET_NAME(ch), level, emote ? "<--- " : "", argument);
+    snprintf(buf2, sizeof(buf1), "@cSomeone: <%d> %s%s@n\r\n", level, emote ? "<--- " : "", argument);
   } else {
-    snprintf(buf1, sizeof(buf1), "%s: %s%s\r\n", GET_NAME(ch), emote ? "<--- " : "", argument);
-    snprintf(buf2, sizeof(buf1), "Someone: %s%s\r\n", emote ? "<--- " : "", argument);
+    snprintf(buf1, sizeof(buf1), "@c%s: %s%s@n\r\n", GET_NAME(ch), emote ? "<--- " : "", argument);
+    snprintf(buf2, sizeof(buf1), "@cSomeone: %s%s@n\r\n", emote ? "<--- " : "", argument);
   }
 
   for (d = descriptor_list; d; d = d->next) {
     if (IS_PLAYING(d) && (GET_LEVEL(d->character) >= level) && 
 	(!PRF_FLAGGED(d->character, PRF_NOWIZ))
 	&& (d != ch->desc || !(PRF_FLAGGED(d->character, PRF_NOREPEAT)))) {
-      send_to_char(d->character, "%s", CCCYN(d->character, C_NRM));
+      if (CAN_SEE(d->character, ch)) {
+        msg = strdup(buf1);
       send_to_char(d->character, "%s", buf1);
-      new_hist_messg(d, buf1);
-      send_to_char(d->character, "%s", CCNRM(d->character, C_NRM));
+      } else {
+        msg = strdup(buf2);
+        send_to_char(d->character, "%s", buf2);
+      }   
+      add_history(d->character, msg, HIST_WIZNET);
     }
   }
 
@@ -2649,7 +2619,7 @@ ACMD(do_show)
 
   /* show houses */
   case 9:
-    hcontrol_list_houses(ch);
+    hcontrol_list_houses(ch, value);
     break;
 
   /* show snoop */
@@ -2715,10 +2685,10 @@ ACMD(do_show)
    { "frozen",		LVL_FREEZE, 	PC,	BINARY },  /* 15 */
    { "gold",		LVL_BUILDER, 	BOTH, 	NUMBER },
    { "height",		LVL_BUILDER,	BOTH,	NUMBER },
-   { "hit", 		LVL_BUILDER, 	BOTH, 	NUMBER },
+   { "hitpoints",       LVL_BUILDER, 	BOTH, 	NUMBER },
    { "hitroll",		LVL_BUILDER, 	BOTH, 	NUMBER },
    { "hunger",		LVL_BUILDER, 	BOTH, 	MISC },    /* 20 */
    { "int", 		LVL_BUILDER, 	BOTH, 	NUMBER },
@@ -2754,6 +2724,7 @@ ACMD(do_show)
    { "variable",        LVL_GRGOD,	PC,	MISC },
    { "weight",		LVL_BUILDER,	BOTH,	NUMBER },
    { "wis", 		LVL_BUILDER, 	BOTH, 	NUMBER },
+   { "questpoints",     LVL_GOD,        PC,     NUMBER },
    { "\n", 0, BOTH, MISC }
   };
 
@@ -3018,7 +2988,7 @@ int perform_set(struct char_data *ch, st
       else if (is_abbrev(val_arg, "off"))
         GET_OLC_ZONE(vict) = NOWHERE;
       else if (!is_number(val_arg))  {
-        send_to_char(ch, "Value must be either 'aedit', 'hedit', 'off' or a zone number.\r\n");
+        send_to_char(ch, "Value must be a zone number, 'aedit', 'hedit', 'off' or 'all'.\r\n");
         return (0);
       } else
         GET_OLC_ZONE(vict) = atoi(val_arg);
@@ -3129,6 +3099,9 @@ int perform_set(struct char_data *ch, st
       vict->real_abils.wis = value;
       affect_total(vict);
       break;
+    case 54: /* questpoints */
+      GET_QUESTPOINTS(vict) = RANGE(0, 100000000);
+      break;
     default:
       send_to_char(ch, "Can't set that!\r\n");
       return (0);
@@ -4105,3 +4060,256 @@ ACMD(do_zpurge)
     mudlog(NRM, MAX(LVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s purged entire world.", GET_NAME(ch));
   }
 }
+
+ACMD(do_file)
+{
+  FILE *req_file;
+  int cur_line = 0, num_lines = 0, req_lines = 0, i, j, l;
+  char field[MAX_INPUT_LENGTH], value[MAX_INPUT_LENGTH], line[READ_SIZE];
+  char buf[MAX_STRING_LENGTH];
+  size_t len = 0, nlen;
+
+  struct file_struct {
+    char *cmd;
+    char level;
+    char *file;
+  } fields[] = {
+    { "bugs",           LVL_GOD,    "../lib/misc/bugs"},
+    { "typos",          LVL_GOD,    "../lib/misc/typos"},
+    { "ideas",          LVL_GOD,    "../lib/misc/ideas"},
+    { "xnames",         LVL_GOD,    "../lib/misc/xnames"},
+    { "levels",         LVL_GOD,    "../log/levels" },
+    { "rip",            LVL_GOD,    "../log/rip" },
+    { "players",        LVL_GOD,    "../log/newplayers" },
+    { "rentgone",       LVL_GOD,    "../log/rentgone" },
+    { "errors",         LVL_GOD,    "../log/errors" },
+    { "godcmds",        LVL_GOD,    "../log/godcmds" },
+    { "syslog",         LVL_GOD,    "../syslog" },
+    { "crash",          LVL_GOD,    "../syslog.CRASH" },
+    { "help",           LVL_GOD,    "../log/help" },
+    { "\n", 0, "\n" }
+  };
+
+   skip_spaces(&argument);
+
+   if (!*argument) {
+     send_to_char(ch, "USAGE: file <option> <num lines>\r\n\r\nFile options:\r\n");
+     for (j = 0, i = 0; fields[i].level; i++)
+       if (fields[i].level <= GET_LEVEL(ch))
+         send_to_char(ch, "%-15s%s\r\n", fields[i].cmd, fields[i].file);
+     return;
+   }
+
+   two_arguments(argument, field, value);
+
+   for (l = 0; *(fields[l].cmd) != '\n'; l++)
+     if (!strncmp(field, fields[l].cmd, strlen(field)))
+     break;
+
+   if(*(fields[l].cmd) == '\n') {
+     send_to_char(ch, "That is not a valid option!\r\n");
+     return;
+   }
+
+   if (GET_LEVEL(ch) < fields[l].level) {
+     send_to_char(ch, "You are not godly enough to view that file!\r\n");
+     return;
+   }
+
+   if(!*value)
+     req_lines = 15; /* default is the last 15 lines */
+   else
+     req_lines = atoi(value);
+
+   if (!(req_file=fopen(fields[l].file,"r"))) {
+     mudlog(BRF, LVL_IMPL, TRUE,
+            "SYSERR: Error opening file %s using 'file' command.",
+            fields[l].file);
+     return;
+   }
+
+   get_line(req_file, line);
+   while (!feof(req_file)) {
+     num_lines++;
+     get_line(req_file,line);
+   }
+   rewind(req_file);
+
+   req_lines = MIN(MIN(req_lines, num_lines),150);
+
+   len = snprintf(buf, sizeof(buf), "Last %d lines of %s:\r\n", req_lines, fields[l].file);
+
+   if (req_lines == num_lines)
+     len += snprintf(buf + len, sizeof(buf) - len, "Top of file.\r\n");
+   get_line(req_file,line);
+   while (!feof(req_file)) {
+     cur_line++;
+     if(cur_line > (num_lines - req_lines)) {
+       nlen = snprintf(buf + len, sizeof(buf) - len, "%s\r\n", line);
+       if (len + nlen >= sizeof(buf) || nlen < 0)
+         break;
+       len += nlen;
+     }
+     get_line(req_file,line);
+   }
+   fclose(req_file);
+
+   if (len >= sizeof(buf)) {
+     const char *overflow = "\r\n**OVERFLOW**\r\n";
+     strcpy(buf + sizeof(buf) - strlen(overflow) - 1, overflow); /* strcpy: OK */
+   }
+   page_string(ch->desc, buf, 1);
+}
+
+ACMD(do_changelog)
+{
+  time_t rawtime;      
+  char tmstr[MAX_INPUT_LENGTH], line[READ_SIZE], last_buf[READ_SIZE],
+      buf[READ_SIZE];   
+  FILE *fl, *new;
+ 
+  skip_spaces(&argument);
+ 
+  if (!*argument) {
+    send_to_char(ch, "Usage: changelog <change>\r\n");
+    return;
+  }
+ 
+  sprintf(buf, "%s.bak", CHANGE_LOG_FILE);
+  if (rename(CHANGE_LOG_FILE, buf)) {
+    mudlog(BRF, LVL_IMPL, TRUE,
+           "SYSERR: Error making backup changelog file (%s)", buf);
+    return;
+  }
+ 
+  if (!(fl = fopen(buf, "r"))) {
+    mudlog(BRF, LVL_IMPL, TRUE,
+           "SYSERR: Error opening backup changelog file (%s)", buf);
+    return;
+  }
+ 
+  if (!(new = fopen(CHANGE_LOG_FILE, "w"))) {
+    mudlog(BRF, LVL_IMPL, TRUE,
+           "SYSERR: Error opening new changelog file (%s)", CHANGE_LOG_FILE);
+    return;
+  }
+ 
+  while (get_line(fl, line)) {
+    if (*line != '[')
+      fprintf(new, "%s\n", line);
+    else {
+      strcpy(last_buf, line);
+      break;
+    }
+  }
+ 
+  rawtime = time(0);
+  strftime(tmstr, sizeof(tmstr), "%b %d %Y", localtime(&rawtime));
+ 
+  sprintf(buf, "[%s] - %s", tmstr, GET_NAME(ch));
+ 
+  fprintf(new, "%s\n", buf);
+  fprintf(new, "  %s\n", argument);
+ 
+  if (strcmp(buf, last_buf))
+    fprintf(new, "%s\n", line);
+ 
+  while (get_line(fl, line))
+    fprintf(new, "%s\n", line);
+ 
+  fclose(fl);
+  fclose(new);
+  send_to_char(ch, "Change added.\r\n");
+}
+
+#define PLIST_FORMAT \
+  "Usage: plist [minlev[-maxlev]] [-n name] [-d days] [-h hours] [-i] [-m]"
+
+ACMD(do_plist)
+{
+  int i, len = 0, count = 0;
+  char mode, buf[MAX_STRING_LENGTH], name_search[MAX_NAME_LENGTH], time_str[MAX_STRING_LENGTH];
+  struct time_info_data time_away;
+  int low = 0, high = LVL_IMPL, low_day = 0, high_day = 10000, low_hr = 0, high_hr = 24;
+
+  skip_spaces(&argument);
+  strcpy(buf, argument);        /* strcpy: OK (sizeof: argument == buf) */
+  name_search[0] = '\0';
+
+  while (*buf) {
+    char arg[MAX_INPUT_LENGTH], buf1[MAX_INPUT_LENGTH];
+
+    half_chop(buf, arg, buf1);
+    if (isdigit(*arg)) {
+      if (sscanf(arg, "%d-%d", &low, &high) == 1)
+        high = low;
+      strcpy(buf, buf1);        /* strcpy: OK (sizeof: buf1 == buf) */
+    } else if (*arg == '-') {
+      mode = *(arg + 1);        /* just in case; we destroy arg in the switch */
+      switch (mode) {
+      case 'l':
+        half_chop(buf1, arg, buf);
+        sscanf(arg, "%d-%d", &low, &high);
+        break;
+      case 'n':
+        half_chop(buf1, name_search, buf);
+        break;
+      case 'i':
+        strcpy(buf, buf1);
+        low = LVL_IMMORT;
+        break;
+      case 'm':
+        strcpy(buf, buf1); 
+        high = LVL_IMMORT - 1;
+        break;
+      case 'd':
+        half_chop(buf1, arg, buf);
+        if (sscanf(arg, "%d-%d", &low_day, &high_day) == 1)
+          high_day = low_day;
+        break;
+      case 'h':
+        half_chop(buf1, arg, buf);
+        if (sscanf(arg, "%d-%d", &low_hr, &high_hr) == 1)
+          high_hr = low_hr;
+        break;
+      default:
+        send_to_char(ch, "%s\r\n", PLIST_FORMAT);
+        return;   
+      }
+    } else {
+      send_to_char(ch, "%s\r\n", PLIST_FORMAT);
+      return;
+    }
+  }
+
+  len = 0;   
+  len += snprintf(buf + len, sizeof(buf) - len, "@W[ Id] (Lv) Name         Last@n\r\n"
+                  "%s-----------------------------------------------%s\r\n", CCCYN(ch, C_NRM),
+                  CCNRM(ch, C_NRM));
+
+  for (i = 0; i <= top_of_p_table; i++) {
+    if (player_table[i].level < low || player_table[i].level > high)
+      continue;
+
+    time_away = *real_time_passed(time(0), player_table[i].last);
+
+    if (*name_search && str_cmp(name_search, player_table[i].name))
+      continue;
+
+    if (time_away.day > high_day || time_away.day < low_day)
+      continue;
+    if (time_away.hours > high_hr || time_away.hours < low_hr)
+      continue;
+
+    strcpy(time_str, asctime(localtime(&player_table[i].last)));
+    time_str[strlen(time_str) - 1] = '\0';
+
+    len += snprintf(buf + len, sizeof(buf) - len, "[%3ld] (%2d) %c%-15s %s\r\n",
+                    player_table[i].id, player_table[i].level,
+                    UPPER(*player_table[i].name), player_table[i].name + 1, time_str);
+    count++;
+  }
+  snprintf(buf + len, sizeof(buf) - len, "%s-----------------------------------------------%s\r\n"
+           "%d players listed.\r\n", CCCYN(ch, C_NRM), CCNRM(ch, C_NRM), count);
+  page_string(ch->desc, buf, TRUE);
+}
diff -BburpN --exclude=.svn tbamud-3.51/src/aedit.c tbamud-3.52/src/aedit.c
--- tbamud-3.51/src/aedit.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/aedit.c	2007-04-20 16:46:02.000000000 +0200
@@ -34,20 +31,17 @@ void aedit_setup_existing(struct descrip
   char arg[MAX_INPUT_LENGTH];
   struct descriptor_data *d;
   int i;
 
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+    
   if (CONFIG_NEW_SOCIALS == 0) {
     send_to_char(ch, "Socials cannot be edited at the moment.\r\n");
     return;
@@ -357,7 +333,7 @@ void aedit_parse(struct descriptor_data 
          break;
        default:
          write_to_output(d, "Invalid choice!\r\n"
-                            "Do you wish to save this action internally? ");
+                            "Do you wish to save your changes? : ");
          break;
       }
       return; /* end of AEDIT_CONFIRM_SAVESTRING */
@@ -418,7 +394,7 @@ void aedit_parse(struct descriptor_data 
       switch (*arg) {
        case 'q': case 'Q':
          if (OLC_VAL(d))  { /* Something was modified */
-            write_to_output(d, "Do you wish to save this action internally? ");
+            write_to_output(d, "Do you wish to save your changes? : ");
             OLC_MODE(d) = AEDIT_CONFIRM_SAVESTRING;
          }
          else cleanup_olc(d, CLEANUP_ALL);
diff -BburpN --exclude=.svn tbamud-3.51/src/ban.c tbamud-3.52/src/ban.c
--- tbamud-3.51/src/ban.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/ban.c	2007-04-20 16:46:03.000000000 +0200
@@ -29,10 +27,9 @@ void _write_one_node(FILE *fp, struct ba
 void write_ban_list(void);
 ACMD(do_ban);
 ACMD(do_unban);
-int Valid_Name(char *newname);
-void Read_Invalid_List(void);
-void Free_Invalid_List(void);
-
+int valid_name(char *newname);
+void read_invalid_list(void);
+void free_invalid_list(void);
 
 const char *ban_types[] = {
   "no",
@@ -245,37 +229,33 @@ ACMD(do_unban)
 char *invalid_list[MAX_INVALID_NAMES];
 int num_invalid = 0;
 
-int Valid_Name(char *newname)
+int valid_name(char *newname)
 {
-  int i, wovels = 0;
+  int i, vowels = 0;
   struct descriptor_data *dt;
   char tempname[MAX_INPUT_LENGTH];
 
-  /*
-   * Make sure someone isn't trying to create this same name.  We want to
-   * do a 'str_cmp' so people can't do 'Bob' and 'BoB'.  The creating login
-   * will not have a character name yet and other people sitting at the
-   * prompt won't have characters yet.
-   *
-   * New, unindexed characters (i.e., characters who are in the process of creating)
-   * will have an idnum of -1, set by clear_char() in db.c.  If someone is creating a
-   * character by the same name as the one we are checking, then the name is invalid,
-   * to prevent character duping.
-   * THIS SHOULD FIX THE 'invalid name' if disconnected from OLC-bug - WELCOR 9/00
-   */
+  /* Make sure someone isn't trying to create this same name.  We want to do a 
+   * 'str_cmp' so people can't do 'Bob' and 'BoB'.  The creating login will not
+   * have a character name yet and other people sitting at the prompt won't 
+   * have characters yet. New, unindexed characters (i.e., characters who are 
+   * in the process of creating) will have an idnum of -1, set by clear_char() 
+   * in db.c.  If someone is creating a character by the same name as the one 
+   * we are checking, then the name is invalid, to prevent character duping.
+   * THIS SHOULD FIX THE 'invalid name' if disconnected from OLC-bug - Welcor */
   for (dt = descriptor_list; dt; dt = dt->next)
     if (dt->character && GET_NAME(dt->character) && !str_cmp(GET_NAME(dt->character), newname))
       if (GET_IDNUM(dt->character) == -1)
         return (IS_PLAYING(dt));
 
-  /* count wovels */
+  /* count vowels */
   for (i = 0; newname[i]; i++) {
     if (strchr("aeiouyAEIOUY", newname[i]))
-      wovels++;
+      vowels++;
   }
 
-  /* return invalid if no wovels */
-  if (!wovels)
+  /* return invalid if no vowels */
+  if (!vowels)
     return (0);
 
   /* return valid if list doesn't exist */
@@ -295,9 +275,7 @@ int Valid_Name(char *newname)
   return (1);
 }
 
-
-/* What's with the wacky capitalization in here? */
-void Free_Invalid_List(void)
+void free_invalid_list(void)
 {
   int invl;
 
@@ -307,8 +285,7 @@ void Free_Invalid_List(void)
   num_invalid = 0;
 }
 
-
-void Read_Invalid_List(void)
+void read_invalid_list(void)
 {
   FILE *fp;
   char temp[256];
diff -BburpN --exclude=.svn tbamud-3.51/src/boards.c tbamud-3.52/src/boards.c
--- tbamud-3.51/src/boards.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/boards.c	2007-04-20 16:46:02.000000000 +0200
@@ -60,14 +42,12 @@ TO ADD A NEW BOARD, simply follow our ea
 /* Board appearance order. */
 #define	NEWEST_AT_TOP	FALSE
 
-/*
-format:	vnum, read lvl, write lvl, remove lvl, filename, 0 at end
-Be sure to also change NUM_OF_BOARDS in board.h
-*/
+/* Format: vnum, read lvl, write lvl, remove lvl, filename, 0 at end. Be sure 
+ * to also change NUM_OF_BOARDS in board.h*/
 struct board_info_type board_info[NUM_OF_BOARDS] = {
   {3099, 0, 0, LVL_GOD, LIB_ETC "board.mortal", 0},
   {3098, LVL_IMMORT, LVL_IMMORT, LVL_GRGOD, LIB_ETC "board.immortal", 0},
-  {3097, LVL_IMMORT, LVL_FREEZE, LVL_IMPL, LIB_ETC "board.freeze", 0},
+  {3097, LVL_IMMORT, LVL_GRGOD, LVL_IMPL, LIB_ETC "board.freeze", 0},
   {3096, 0, 0, LVL_IMMORT, LIB_ETC "board.social", 0},
   {1226, 0, 0, LVL_IMPL, LIB_ETC "board.builder", 0},
   {1227, 0, 0, LVL_IMPL, LIB_ETC "board.staff", 0},
@@ -84,9 +64,8 @@ int msg_storage_taken[INDEX_SIZE];
 int num_of_msgs[NUM_OF_BOARDS];
 int ACMD_READ, ACMD_LOOK, ACMD_EXAMINE, ACMD_WRITE, ACMD_REMOVE;
 struct board_msginfo msg_index[NUM_OF_BOARDS][MAX_BOARD_MESSAGES];
-void    Board_reset_board(int board_type);
-void    Board_clear_board(int board_type);
-
+void board_reset_board(int board_type);
+void board_clear_board(int board_type);
 
 int find_slot(void)
 {
@@ -142,14 +119,13 @@ void init_boards(void)
       memset((char *) &(msg_index[i][j]), 0, sizeof(struct board_msginfo));
       msg_index[i][j].slot_num = -1;
     }
-    Board_load_board(i);
+    board_load_board(i);
   }
 
-//  if (fatal_error)
-//    exit(1);
+  if (fatal_error)
+    exit(1);
 }
 
-
 SPECIAL(gen_board)
 {
   int board_type;
@@ -178,19 +154,18 @@ SPECIAL(gen_board)
     return (0);
   }
   if (cmd == ACMD_WRITE)
-    return (Board_write_message(board_type, ch, argument, board));
+    return (board_write_message(board_type, ch, argument, board));
   else if (cmd == ACMD_LOOK || cmd == ACMD_EXAMINE)
-    return (Board_show_board(board_type, ch, argument, board));
+    return (board_show_board(board_type, ch, argument, board));
   else if (cmd == ACMD_READ)
-    return (Board_display_msg(board_type, ch, argument, board));
+    return (board_display_msg(board_type, ch, argument, board));
   else if (cmd == ACMD_REMOVE)
-    return (Board_remove_msg(board_type, ch, argument, board));
+    return (board_remove_msg(board_type, ch, argument, board));
   else
     return (0);
 }
 
-
-int Board_write_message(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
+int board_write_message(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
 {
   time_t ct;
   char buf[MAX_INPUT_LENGTH], buf2[MAX_NAME_LENGTH + 3], tmstr[MAX_STRING_LENGTH];
@@ -238,8 +213,7 @@ int Board_write_message(int board_type, 
   return (1);
 }
 
-
-int Board_show_board(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
+int board_show_board(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
 {
   int i;
   char tmp[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH];
@@ -300,8 +274,7 @@ fubar:
   return (1);
 }
 
-
-int Board_display_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
+int board_display_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
 {
   char number[MAX_INPUT_LENGTH], buffer[MAX_STRING_LENGTH];
   int msg, ind;
@@ -310,7 +283,7 @@ int Board_display_msg(int board_type, st
   if (!*number)
     return (0);
   if (isname(number, board->name))	/* so "read board" works */
-    return (Board_show_board(board_type, ch, arg, board));
+    return (board_show_board(board_type, ch, arg, board));
   if (!is_number(number))	/* read 2.mail, look 2.sword */
     return (0);
   if (!(msg = atoi(number)))
@@ -356,8 +329,7 @@ int Board_display_msg(int board_type, st
   return (1);
 }
 
-
-int Board_remove_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
+int board_remove_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board)
 {
   int ind, msg, slot_num;
   char number[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH];
@@ -425,13 +397,12 @@ int Board_remove_msg(int board_type, str
   send_to_char(ch, "Message removed.\r\n");
   snprintf(buf, sizeof(buf), "$n just removed message %d.", msg);
   act(buf, FALSE, ch, 0, 0, TO_ROOM);
-  Board_save_board(board_type);
+  board_save_board(board_type);
 
   return (1);
 }
 
-
-void Board_save_board(int board_type)
+void board_save_board(int board_type)
 {
   FILE *fl;
   int i;
@@ -470,8 +441,7 @@ void Board_save_board(int board_type)
   fclose(fl);
 }
 
-
-void Board_load_board(int board_type)
+void board_load_board(int board_type)
 {
   FILE *fl;
   int i, len1, len2;
@@ -485,14 +455,14 @@ void Board_load_board(int board_type)
   fread(&(num_of_msgs[board_type]), sizeof(int), 1, fl);
   if (num_of_msgs[board_type] < 1 || num_of_msgs[board_type] > MAX_BOARD_MESSAGES) {
     log("SYSERR: Board file %d corrupt.  Resetting.", board_type);
-    Board_reset_board(board_type);
+    board_reset_board(board_type);
     return;
   }
   for (i = 0; i < num_of_msgs[board_type]; i++) {
     fread(&(msg_index[board_type][i]), sizeof(struct board_msginfo), 1, fl);
     if ((len1 = msg_index[board_type][i].heading_len) <= 0) {
       log("SYSERR: Board file %d corrupt!  Resetting.", board_type);
-      Board_reset_board(board_type);
+      board_reset_board(board_type);
       return;
     }
     CREATE(tmp1, char, len1);
@@ -501,7 +471,7 @@ void Board_load_board(int board_type)
 
     if ((MSG_SLOTNUM(board_type, i) = find_slot()) == -1) {
       log("SYSERR: Out of slots booting board %d!  Resetting...", board_type);
-      Board_reset_board(board_type);
+      board_reset_board(board_type);
       return;
     }
     if ((len2 = msg_index[board_type][i].message_len) > 0) {
@@ -515,19 +485,17 @@ void Board_load_board(int board_type)
   fclose(fl);
 }
 
-
 /* When shutting down, clear all boards. */
-void Board_clear_all(void)
+void board_clear_all(void)
 {
   int i;
 
   for (i = 0; i < NUM_OF_BOARDS; i++)
-    Board_clear_board(i);
+    board_clear_board(i);
 }
 
-
 /* Clear the in-memory structures. */
-void Board_clear_board(int board_type)
+void board_clear_board(int board_type)
 {
   int i;
 
@@ -545,10 +513,9 @@ void Board_clear_board(int board_type)
   num_of_msgs[board_type] = 0;
 }
 
-
 /* Destroy the on-disk and in-memory board. */
-void Board_reset_board(int board_type)
+void board_reset_board(int board_type)
 {
-  Board_clear_board(board_type);
+  board_clear_board(board_type);
   remove(FILENAME(board_type));
 }
diff -BburpN --exclude=.svn tbamud-3.51/src/boards.h tbamud-3.52/src/boards.h
--- tbamud-3.51/src/boards.h	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/boards.h	2007-04-20 16:46:02.000000000 +0200
@@ -45,10 +45,10 @@ struct board_info_type {
 #define MSG_SLOTNUM(i, j) (msg_index[i][j].slot_num)
 #define MSG_LEVEL(i, j) (msg_index[i][j].level)
 
-int	Board_display_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
-int	Board_show_board(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
-int	Board_remove_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
-int	Board_write_message(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
-void	Board_save_board(int board_type);
-void	Board_load_board(int board_type);
-void	Board_clear_all(void);
+int board_display_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
+int board_show_board(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
+int board_remove_msg(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
+int board_write_message(int board_type, struct char_data *ch, char *arg, struct obj_data *board);
+void board_save_board(int board_type);
+void board_load_board(int board_type);
+void board_clear_all(void);
diff -BburpN --exclude=.svn tbamud-3.51/src/cedit.c tbamud-3.52/src/cedit.c
--- tbamud-3.51/src/cedit.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/cedit.c	2007-04-20 16:46:02.000000000 +0200
@@ -41,9 +42,11 @@ ACMD(do_oasis_cedit)
   struct descriptor_data *d;
   char buf1[MAX_STRING_LENGTH];
 
-  /****************************************************************************/
-  /** Parse any arguments.                                                   **/
-  /****************************************************************************/
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+
+  /* Parse any arguments. */
   one_argument(argument, buf1);
 
   if (GET_LEVEL(ch) < LVL_IMPL) {
@@ -106,11 +101,9 @@ void cedit_setup(struct descriptor_data 
   OLC_CONFIG(d)->play.dts_are_dumps       = CONFIG_DTS_ARE_DUMPS;
   OLC_CONFIG(d)->play.load_into_inventory = CONFIG_LOAD_INVENTORY;
   OLC_CONFIG(d)->play.track_through_doors = CONFIG_TRACK_T_DOORS;
-  OLC_CONFIG(d)->play.immort_level_ok     = CONFIG_IMMORT_LEVEL_OK;
+  OLC_CONFIG(d)->play.no_mort_to_immort   = CONFIG_NO_MORT_TO_IMMORT;
 
  /****************************************************************************/
  /** Crash Saves                                                            **/
  /****************************************************************************/
@@ -385,7 +349,7 @@ int save_config( IDXTYPE nowhere )
   fprintf(fl, "* Should PC's be able to track through hidden or closed doors?\n"
               "track_through_doors = %d\n\n", CONFIG_TRACK_T_DOORS);
   fprintf(fl, "* Should players who reach enough exp automatically level to immortal?\n"
-              "immort_level_ok = %d\n\n", CONFIG_IMMORT_LEVEL_OK);
+              "no_mort_to_immort = %d\n\n", CONFIG_NO_MORT_TO_IMMORT);
 
   strcpy(buf, CONFIG_OK);
   strip_cr(buf);
@@ -642,7 +590,7 @@ void cedit_disp_game_play_options(struct
         grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.dts_are_dumps),
         grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.load_into_inventory),
         grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.track_through_doors),
-        grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.immort_level_ok),
+        grn, nrm, cyn, CHECK_VAR(OLC_CONFIG(d)->play.no_mort_to_immort),
 
         grn, nrm, cyn, OLC_CONFIG(d)->play.OK,
         grn, nrm, cyn, OLC_CONFIG(d)->play.NOPERSON,
@@ -810,12 +743,10 @@ void cedit_parse(struct descriptor_data 
           return;
         default :
           write_to_output(d, "\r\nThat is an invalid choice!\r\n");
-          write_to_output(d, "Do you wish to save the configuration? (y/n) : ");
+          write_to_output(d, "Do you wish to save your changes? : ");
           return;
       }
 
@@ -850,7 +781,7 @@ void cedit_parse(struct descriptor_data 
 
         case 'q':
         case 'Q':
-          write_to_output(d, "Do you wish to save the configuration? (y/n) : ");
+          write_to_output(d, "Do you wish to save your changes? : ");
           OLC_MODE(d) = CEDIT_CONFIRM_SAVESTRING;
           break;
 
@@ -953,7 +881,7 @@ void cedit_parse(struct descriptor_data 
 
         case 'p':
         case 'P':
-          TOGGLE_VAR(OLC_CONFIG(d)->play.immort_level_ok);
+          TOGGLE_VAR(OLC_CONFIG(d)->play.no_mort_to_immort);
           break;
 
         case '1':
diff -BburpN --exclude=.svn tbamud-3.51/src/class.c tbamud-3.52/src/class.c
--- tbamud-3.51/src/class.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/class.c	2007-04-20 16:46:01.000000000 +0200
diff -BburpN --exclude=.svn tbamud-3.51/src/comm.c tbamud-3.52/src/comm.c
--- tbamud-3.51/src/comm.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/comm.c	2007-04-20 16:46:03.000000000 +0200
@@ -78,7 +76,7 @@
 extern struct ban_list_element *ban_list;
 extern int num_invalid;
 extern char *GREETINGS;
-extern const char *circlemud_version;
+extern const char *tbamud_version;
 extern const char *oasisolc_version;
 extern const char *ascii_pfiles_version;
 extern int circle_restrict;
@@ -156,11 +154,10 @@ sigfunc *my_signal(int signo, sigfunc *f
 byte webster_file_ready = FALSE;/* signal: SIGUSR2 */
 RETSIGTYPE websterlink(int sig);
 extern void handle_webster_file();
-void copyover_recover( void );
+void copyover_recover(void);
 size_t proc_colors(char *txt, size_t maxlen, int parse);
-void free_hist_messg(struct descriptor_data *d);
 
/* extern fcnts */
 void reboot_wizlists(void);
@@ -171,9 +168,9 @@ int isbanned(char *hostname);
 void weather_and_time(int mode);
 int perform_alias(struct descriptor_data *d, char *orig, size_t maxlen);
 void free_messages(void);
-void Board_clear_all(void);
+void board_clear_all(void);
 void free_social_messages(void);
-void Free_Invalid_List(void);
+void free_invalid_list(void);
 void free_command_list(void);
 void load_config(void);
 void new_hist_messg(struct descriptor_data *d, const char *msg);
@@ -355,12 +337,10 @@ int main(int argc, char **argv)
   /* All arguments have been parsed, try to open log file. */
   setup_log(CONFIG_LOGNAME, STDERR_FILENO);
 
-  /*
-   * Moved here to distinguish command line options and to show up
-   * in the log if stderr is redirected to a file.
-   */
+  /* Moved here to distinguish command line options and to show up
+   * in the log if stderr is redirected to a file. */
   log("Using %s for configuration.", CONFIG_CONFFILE);
-  log("%s", circlemud_version);
+  log("%s", tbamud_version);
   log("%s", oasisolc_version);
   log("%s", DG_SCRIPT_VERSION);
   log("%s", ascii_pfiles_version);
@@ -387,12 +367,12 @@ int main(int argc, char **argv)
     free_player_index();	/* players.c */
     free_messages();		/* fight.c */
     free_text_files();		/* db.c */
-    Board_clear_all();		/* boards.c */
+    board_clear_all();		/* boards.c */
     free(cmd_sort_info);	/* act.informative.c */
     free_command_list();        /* act.informative.c */
     free_social_messages();	/* act.social.c */
     free_help_table();		/* db.c */
-    Free_Invalid_List();	/* ban.c */
+    free_invalid_list();	/* ban.c */
     free_strings(&config_info, OASIS_CFG); /* oasis_delete.c */
   }
 
@@ -1290,6 +1213,12 @@ char *make_prompt(struct descriptor_data
         len += count;
     }
 
+    if (PRF_FLAGGED(d->character, PRF_AFK) && len < sizeof(prompt)) {
+      count = snprintf(prompt + len, sizeof(prompt) - len, "AFK ");
+      if (count >= 0)
+        len += count;
+    }
+
     if (len < sizeof(prompt))
       strncat(prompt, "> ", sizeof(prompt) - len - 1);	/* strncat: OK */
   } else if (STATE(d) == CON_PLAYING && IS_NPC(d->character))
@@ -2231,8 +2079,6 @@ void close_socket(struct descriptor_data
     free(d->history);
   }
 
-  free_hist_messg(d);
-
   if (d->showstr_head)
     free(d->showstr_head);
   if (d->showstr_count)
@@ -2581,15 +2396,11 @@ void send_to_range(room_vnum start, room


 /* higher-level communication: the act() function */
-void perform_act(const char *orig, struct char_data *ch, struct obj_data *obj,
+char *perform_act(const char *orig, struct char_data *ch, struct obj_data *obj,
 		const void *vict_obj, const struct char_data *to)
 {
   const char *i = NULL;
@@ -2706,37 +2517,32 @@ void perform_act(const char *orig, struc
   *(++buf) = '\n';
   *(++buf) = '\0';
 
-  if (to->desc) {
+  if (to->desc)
     write_to_output(to->desc, "%s", CAP(lbuf));
-    if (log_this_messg)
-      new_hist_messg(to->desc, lbuf);
-  }
-  log_this_messg = 0;
 
   if ((IS_NPC(to) && dg_act_check) && (to != ch))
     act_mtrigger(to, lbuf, ch, dg_victim, obj, dg_target, dg_arg);
-}
 
+  return strdup(lbuf);
+}
 
-void act(const char *str, int hide_invisible, struct char_data *ch,
+char *act(const char *str, int hide_invisible, struct char_data *ch,
 	 struct obj_data *obj, const void *vict_obj, int type)
 {
+  char *msg = NULL;
   const struct char_data *to;
   int to_sleeping;
 
   if (!str || !*str)
-    return;
+    return NULL;
 
  /*
   * Warning: the following TO_SLEEP code is a hack.
@@ -2747,22 +2553,18 @@ void act(const char *str, int hide_invis
   if (!(dg_act_check = !IS_SET(type, DG_NO_TRIG))) 
     REMOVE_BIT(type, DG_NO_TRIG);
 
-  /* And this too.. */
-  log_this_messg = IS_SET(type, LOG_MESSG);
-  if (log_this_messg)
-    REMOVE_BIT(type, LOG_MESSG);
-
   if (type == TO_CHAR) {
     if (ch && SENDOK(ch))
-      perform_act(str, ch, obj, vict_obj, ch);
-    return;
+      return perform_act(str, ch, obj, vict_obj, ch);
+    return NULL;
   }
 
   if (type == TO_VICT) {
     if ((to = (const struct char_data *) vict_obj) != NULL && SENDOK(to))
-      perform_act(str, ch, obj, vict_obj, to);
-    return;
+      return perform_act(str, ch, obj, vict_obj, to);
+    return NULL;
   }
+
 #include "screen.h"
   if (type == TO_GMOTE) {
     struct descriptor_data *i;
@@ -2766,18 +2568,19 @@ void act(const char *str, int hide_invis
 #include "screen.h"
   if (type == TO_GMOTE) {
     struct descriptor_data *i;
+    char buf[MAX_STRING_LENGTH];
+    
     for (i = descriptor_list; i; i = i->next) {
       if (!i->connected && i->character &&
           !PRF_FLAGGED(i->character, PRF_NOGOSS) &&
           !PLR_FLAGGED(i->character, PLR_WRITING) &&
           !ROOM_FLAGGED(IN_ROOM(i->character), ROOM_SOUNDPROOF)) {
 
-        send_to_char(i->character, "%s", CCYEL(i->character, C_NRM));
-        perform_act(str, ch, obj, vict_obj, i->character);
-        send_to_char(i->character, "%s", CCNRM(i->character, C_NRM));
+        sprintf(buf, "%s%s%s", CCYEL(i->character, C_NRM), str, CCNRM(i->character, C_NRM));
+        msg = perform_act(buf, ch, obj, vict_obj, i->character);
       }
     }
-    return;
+    return msg;
   }
   /* ASSUMPTION: at this point we know type must be TO_NOTVICT or TO_ROOM */
 
@@ -2787,7 +2590,7 @@ void act(const char *str, int hide_invis
     to = world[IN_ROOM(obj)].people;
   else {
     log("SYSERR: no valid target to act()!");
-    return;
+    return NULL;
   }
 
   for (; to; to = to->next_in_room) {
@@ -2797,11 +2600,11 @@ void act(const char *str, int hide_invis
       continue;
     if (type != TO_ROOM && to == vict_obj)
       continue;
-    perform_act(str, ch, obj, vict_obj, to);
+    msg = perform_act(str, ch, obj, vict_obj, to);
   }
+  return msg;
 }
 
-
 /* Prefer the file over the descriptor. */
 void setup_log(const char *filename, int fd)
 {
diff -BburpN --exclude=.svn tbamud-3.51/src/comm.h tbamud-3.52/src/comm.h
--- tbamud-3.51/src/comm.h	2007-02-24 22:36:41.000000000 +0100
+++ tbamud-3.52/src/comm.h	2007-04-20 16:46:01.000000000 +0200
@@ -1,31 +1,31 @@
-/* ************************************************************************
-*   File: comm.h                                        Part of CircleMUD *
-*  Usage: header file: prototypes of public communication functions       *
+/**************************************************************************
+*  File: comm.h                                            Part of tbaMUD *
+*  Usage: Header file, prototypes of public communication functions.      *
 *                                                                         *
-*  All rights reserved.  See license.doc for complete information.        *
+*  All rights reserved.  See license for complete information.            *
 *                                                                         *
 *  Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
 *  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
-************************************************************************ */
+**************************************************************************/
 
 #define NUM_RESERVED_DESCS	8
 #define COPYOVER_FILE "copyover.dat"
 
 /* comm.c */
-size_t	send_to_char(struct char_data *ch, const char *messg, ...) __attribute__ ((format (printf, 2, 3)));
-void	send_to_all(const char *messg, ...) __attribute__ ((format (printf, 1, 2)));
-void	send_to_room(room_rnum room, const char *messg, ...) __attribute__ ((format (printf, 2, 3)));
-void	send_to_outdoor(const char *messg, ...) __attribute__ ((format (printf, 1, 2)));
-void send_to_range(room_vnum start, room_vnum finish, const char *messg, ...) __attribute__ ((format (printf, 3, 4)));
-
+size_t send_to_char(struct char_data *ch, const char *messg, ...) __attribute__ 
+    ((format (printf, 2, 3)));
+void send_to_all(const char *messg, ...) __attribute__ ((format (printf, 1, 
+    2)));
+void send_to_room(room_rnum room, const char *messg, ...) __attribute__ ((format
+    (printf, 2, 3)));
+void send_to_outdoor(const char *messg, ...) __attribute__ ((format (printf, 1,
+    2)));
+void send_to_range(room_vnum start, room_vnum finish, const char *messg, ...)
+    __attribute__ ((format (printf, 3, 4)));
 
 void	close_socket(struct descriptor_data *d);
-
-void	perform_act(const char *orig, struct char_data *ch,
-		struct obj_data *obj, const void *vict_obj, const struct char_data *to);
-
-void	act(const char *str, int hide_invisible, struct char_data *ch,
-		struct obj_data *obj, const void *vict_obj, int type);
+char * perform_act(const char *orig, struct char_data *ch, struct obj_data *obj, const void *vict_obj, const struct char_data *to);
+char * act(const char *str, int hide_invisible, struct char_data *ch, struct obj_data *obj, const void *vict_obj, int type);
 
 #define TO_ROOM		1
 #define TO_VICT		2
@@ -34,7 +34,7 @@ void	act(const char *str, int hide_invis
 #define TO_GMOTE        5
 #define TO_SLEEP	128	/* to char, even if sleeping */
 #define DG_NO_TRIG      256     /* don't check act trigger   */
-#define LOG_MESSG       512     /* log to message history    */
+
 /* I/O functions */
 void	write_to_q(const char *txt, struct txt_q *queue, int aliased);
 int	write_to_descriptor(socket_t desc, const char *txt);
diff -BburpN --exclude=.svn tbamud-3.51/src/config.c tbamud-3.52/src/config.c
--- tbamud-3.51/src/config.c	2007-02-24 22:36:42.000000000 +0100
+++ tbamud-3.52/src/config.c	2007-04-20 16:46:01.000000000 +0200
@@ -100,109 +85,82 @@ int idle_rent_time = 48;
 /* This level and up is immune to idling, LVL_IMPL+1 will disable it. */
 int idle_max_level = LVL_GOD;
 
-/* should items in death traps automatically be junked? */
+/* Should items in death traps automatically be junked? */
 int dts_are_dumps = YES;
 
-/*
- * Whether you want items that immortals load to appear on the ground or not.
+/* Whether you want items that immortals load to appear on the ground or not.
  * It is most likely best to set this to 'YES' so that something else doesn't
  * grab the item before the immortal does, but that also means people will be
- * able to carry around things like boards.  That's not necessarily a bad
- * thing, but this will be left at a default of 'NO' for historic reasons.
- */
+ * able to carry around things like boards.  That's not necessarily a bad thing,
+ * but this will be left at a default of 'NO' for historic reasons. */
 int load_into_inventory = YES;
 
 /* "okay" etc. */
 const char *OK = "Okay.\r\n";
-const char *NOPERSON = "No-one by that name here.\r\n";
+const char *NOPERSON = "No one by that name here.\r\n";
 const char *NOEFFECT = "Nothing seems to happen.\r\n";
 
-/*
- * You can define or not define TRACK_THOUGH_DOORS, depending on whether
- * or not you want track to find paths which lead through closed or
- * hidden doors. A setting of 'NO' means to not go through the doors
- * while 'YES' will pass through doors to find the target.
- */
+/* You can define or not define TRACK_THOUGH_DOORS, depending on whether or not
+ * you want track to find paths which lead through closed or hidden doors. A 
+ * setting of 'NO' means to not go through the doors while 'YES' will pass 
+ * through doors to find the target. */
 int track_through_doors = YES;
 
-/*
- * If you want mortals to level up to immortal once they have enough
- * experience, then set this to NO.  This is the stock behaviour for
- * CircleMUD because it was the stock DikuMud behaviour.  Subtracting
- * this from LVL_IMMORT gives the top level that people can advance to
- * in gain_exp() in limits.c
- * For example, to stop people from advancing to LVL_IMMORT, simply set
- * immort_level_ok to YES.
- */
-int immort_level_ok = NO;
-
-/****************************************************************************/
-/****************************************************************************/
-
+/* If you do not want mortals to level up to immortal once they have enough 
+ * experience, then set this to YES. Subtracting this from LVL_IMMORT gives 
+ * the top level that people can advance to in gain_exp() in limits.c */
+int no_mort_to_immort = YES;
 
 /* RENT/CRASHSAVE OPTIONS */

diff -BburpN --exclude=.svn tbamud-3.51/src/constants.c tbamud-3.52/src/constants.c
--- tbamud-3.51/src/constants.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/constants.c	2007-04-20 16:46:03.000000000 +0200
@@ -1,26 +1,21 @@
-/* ************************************************************************
-*   File: constants.c                                   Part of CircleMUD *
-*  Usage: Numeric and string contants used by the MUD                     *
+/**************************************************************************
+*  File: constants.c                                       Part of tbaMUD *
+*  Usage: Numeric and string contants used by the MUD.                    *
 *                                                                         *
-*  All rights reserved.  See license.doc for complete information.        *
+*  All rights reserved.  See license for complete information.            *
 *                                                                         *
 *  Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
 *  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
-************************************************************************ */
+**************************************************************************/
 
 #include "conf.h"
 #include "sysdep.h"
 #include "structs.h"
 #include "interpreter.h"	/* alias_data */
 
-cpp_extern const char *circlemud_version =
-        "tbaMUD, version 3.51";
-
-cpp_extern const char *oasisolc_version =
-	"OasisOLC 2.0.6";
-
-cpp_extern const char *ascii_pfiles_version =
-	"ASCII Player Files 3.0.1";
+cpp_extern const char *tbamud_version = "tbaMUD, version 3.52";
+cpp_extern const char *oasisolc_version = "OasisOLC 2.0.6";
+cpp_extern const char *ascii_pfiles_version = "ASCII Player Files 3.0.1";
 
 /* strings corresponding to ordinals/bitvectors in structs.h */
 /* (Note: strings for class definitions in class.c instead of here) */
@@ -312,15 +301,15 @@ const char *item_types[] = {
   "WAND",
   "STAFF",
   "WEAPON",
-  "FIRE WEAPON",
-  "MISSILE",
+  "FURNITURE",
+  "FREE",
   "TREASURE",
   "ARMOR",
   "POTION",
   "WORN",
   "OTHER",
   "TRASH",
-  "TRAP",
+  "FREE2",
   "CONTAINER",
   "NOTE",
   "LIQ CONTAINER",
@@ -836,12 +820,22 @@ const char *wtrig_types[] = {
   "\n"
 };
 
+const char *history_types[] = {
+  "all",   
+  "say",   
+  "gossip",
+  "wiznet",
+  "tell",
+  "shout",
+  "grats",
+  "holler",
+  "auction",
+  "\n"   
+};
 /* --- End of constants arrays. --- */
 
/*
diff -BburpN --exclude=.svn tbamud-3.51/src/constants.h tbamud-3.52/src/constants.h
--- tbamud-3.51/src/constants.h	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/constants.h	2007-04-20 16:46:03.000000000 +0200
@@ -1,4 +1,14 @@
-extern const char *circlemud_version;
+extern const char *tbamud_version;
 extern const char *oasisolc_version;
 extern const char *ascii_pfiles_version;
 extern const char *dirs[];
@@ -38,6 +48,7 @@ extern int drink_aff[][3];
 extern const char *trig_types[];
 extern const char *otrig_types[];
 extern const char *wtrig_types[];
+extern const char *history_types[];
 extern size_t room_bits_count;
 extern size_t action_bits_count;
 extern size_t affected_bits_count;
diff -BburpN --exclude=.svn tbamud-3.51/src/db.c tbamud-3.52/src/db.c
--- tbamud-3.51/src/db.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/db.c	2007-04-20 16:46:02.000000000 +0200
@@ -149,7 +143,7 @@ void update_obj_file(void);	/* In objsav
 void sort_commands(void);
 void sort_spells(void);
 void load_banned(void);
-void Read_Invalid_List(void);
+void read_invalid_list(void);
 void boot_the_shops(FILE *shop_f, char *filename, int rec_count);
 int hsort(const void *a, const void *b);
 void prune_crlf(char *txt);
@@ -166,18 +160,14 @@ extern struct descriptor_data *descripto
 extern const char *unused_spellname;	/* spell_parser.c */
 extern int no_specials;
 extern int scheck;
-
 extern struct player_index_element *player_table;
-int top_of_p_table;
-long top_idnum;
+extern int top_of_p_table;
+extern long top_idnum;
 
 /* external ASCII Player Files vars */
 extern int auto_pwipe;
@@ -1797,6 +1719,8 @@ char *parse_object(FILE *obj_f, int nr)
   GET_OBJ_RENT(obj_proto + i) = t[2];
   GET_OBJ_LEVEL(obj_proto + i) = t[3];
 
+  obj_proto[i].sitting_here = NULL;
+
   /* check to make sure that weight of containers exceeds curr. quantity */
   if (GET_OBJ_TYPE(obj_proto + i) == ITEM_DRINKCON ||
       GET_OBJ_TYPE(obj_proto + i) == ITEM_FOUNTAIN) {
@@ -2623,6 +2513,10 @@ void free_char(struct char_data *ch)
     if (ch->player.description)
       free(ch->player.description);
 
+    for (i = 0; i < NUM_HIST; i++)
+      if (GET_HISTORY(ch, i))
+        free(GET_HISTORY(ch, i));
+  
     /* free script proto list */
     free_proto_script(ch, MOB_TRIGGER);
 
@@ -2796,6 +2671,7 @@ void reset_char(struct char_data *ch)
   ch->next_fighting = NULL;
   ch->next_in_room = NULL;
   FIGHTING(ch) = NULL;
+  char_from_furniture(ch);
   ch->char_specials.position = POS_STANDING;
   ch->mob_specials.default_pos = POS_STANDING;
   ch->char_specials.carry_weight = 0;
@@ -3073,7 +2926,8 @@ int check_object(struct obj_data *obj)
   }
   /* Fall through. */
   case ITEM_FOUNTAIN:
-    if (GET_OBJ_VAL(obj, 1) > GET_OBJ_VAL(obj, 0) && (error = TRUE))
+    if ((GET_OBJ_VAL(obj,0) > 0) && (GET_OBJ_VAL(obj, 1) > GET_OBJ_VAL(obj, 0) 
+        && (error = TRUE)))
       log("SYSERR: Object #%d (%s) contains (%d) more than maximum (%d).",
 		GET_OBJ_VNUM(obj), obj->short_description,
 		GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 0));
@@ -3108,7 +2962,13 @@ int check_object(struct obj_data *obj)
       } while (onealias && *onealias);
     }
   break;
-}
+  case ITEM_FURNITURE:
+    if (GET_OBJ_VAL(obj, 1) > GET_OBJ_VAL(obj, 0) && (error = TRUE))
+      log("SYSERR: Object #%d (%s) contains (%d) more than maximum (%d).",
+          GET_OBJ_VNUM(obj), obj->short_description, GET_OBJ_VAL(obj, 1), 
+	  GET_OBJ_VAL(obj, 0));
+    break;
+  }
 
   return (error);
 }
@@ -3194,7 +3052,7 @@ extern int idle_max_level;
 extern int dts_are_dumps;
 extern int load_into_inventory;
 extern int track_through_doors;
-extern int immort_level_ok;
+extern int no_mort_to_immort;
 extern int free_rent;
 extern int max_obj_save;
 extern int min_rent_cost;
@@ -3255,11 +3109,9 @@ void load_default_config( void )
   CONFIG_NOPERSON		= strdup(NOPERSON);
   CONFIG_NOEFFECT		= strdup(NOEFFECT);
   CONFIG_TRACK_T_DOORS          = track_through_doors;
-  CONFIG_IMMORT_LEVEL_OK	= immort_level_ok;
+  CONFIG_NO_MORT_TO_IMMORT	= no_mort_to_immort;
 
  /****************************************************************************/
  /** Rent / crashsave options.                                              **/
@@ -3407,8 +3251,8 @@ void load_config( void )
           CONFIG_IDLE_RENT_TIME = num;
         else if (!str_cmp(tag, "idle_max_level"))
           CONFIG_IDLE_MAX_LEVEL = num;
-        else if (!str_cmp(tag, "immort_level_ok"))
-          CONFIG_IMMORT_LEVEL_OK = num;
+        else if (!str_cmp(tag, "no_mort_to_immort"))
+          CONFIG_NO_MORT_TO_IMMORT = num;
         else if (!str_cmp(tag, "immort_start_room"))
           CONFIG_IMMORTAL_START = num;
         break;
diff -BburpN --exclude=.svn tbamud-3.51/src/db.h tbamud-3.52/src/db.h
--- tbamud-3.51/src/db.h	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/db.h	2007-04-20 16:46:02.000000000 +0200
@@ -111,6 +111,7 @@
 #define BAN_FILE	LIB_ETC"badsites"  /* for the siteban system	*/
 #define HCONTROL_FILE	LIB_ETC"hcontrol"  /* for the house system	*/
 #define TIME_FILE	LIB_ETC"time"	   /* for calendar system	*/
+#define CHANGE_LOG_FILE "../changelog"     /* for the changelog         */
 
 /* new bitvector data for use in player_index_element */
 #define PINDEX_DELETED		(1 << 0)	/* deleted player	*/
diff -BburpN --exclude=.svn tbamud-3.51/src/dg_objcmd.c tbamud-3.52/src/dg_objcmd.c
--- tbamud-3.51/src/dg_objcmd.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/dg_objcmd.c	2007-04-20 16:46:01.000000000 +0200
@@ -603,8 +583,10 @@ OCMD(do_oasound)
     if (world[room].dir_option[door] != NULL &&
        (world[room].dir_option[door])->to_room != NOWHERE &&
        (world[room].dir_option[door])->to_room != room &&
-        world[(world[room].dir_option[door])->to_room].people)
-          sub_write(argument, world[(world[room].dir_option[door])->to_room].people, TRUE, TO_ROOM | TO_CHAR);
+        world[(world[room].dir_option[door])->to_room].people) { 
+          sub_write(argument, world[(world[room].dir_option[door])->to_room].people, TRUE, TO_ROOM); 
+          sub_write(argument, world[(world[room].dir_option[door])->to_room].people, TRUE, TO_CHAR); 
+    }
   }
 }
 
@@ -723,36 +702,43 @@ OCMD(do_osetval)
     obj_log(obj, "osetval: position out of bounds!");
 }
 
-/* submitted by PurpleOnyx - tkhasi@shadowglen.com*/
+/* Submitted by PurpleOnyx */
 OCMD(do_oat)
 {
-  char location[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
-  int vnum = 0, rnum = 0;
-  obj_data *object;
+  room_rnum loc = NOWHERE;
+  struct char_data *ch;
+  struct obj_data *object;
+  char arg[MAX_INPUT_LENGTH], *command;
 
-  half_chop(argument, location, arg2);
+  command = any_one_arg(argument, arg);
 
-  if (!*location || !*arg2 || !isdigit(*location)) {
-      obj_log(obj, "oat: bad syntax : %s", argument);
+  if (!*arg) {
+    obj_log(obj, "oat called with no args");
       return;
   }
 
-  vnum = atoi(location);
-  rnum = real_room(vnum);
+  skip_spaces(&command);
 
-  if (rnum == NOWHERE) {
-      obj_log(obj, "oat: location not found");
+  if (!*command) {
+    obj_log(obj, "oat called without a command");
       return;
   }
 
-  object = read_object(GET_OBJ_VNUM(obj), VIRTUAL);
-  if (!object)
+  if (isdigit(*arg)) loc = real_room(atoi(arg));
+  else if ((ch = get_char_by_obj(obj, arg))) loc = IN_ROOM(ch); 
+
+  if (loc == NOWHERE) {
+    obj_log(obj, "oat: location not found (%s)", arg);
     return;
+  }
 
-  obj_to_room(object, rnum);
-  obj_command_interpreter(object, arg2);
+  if (!(object = read_object(GET_OBJ_VNUM(obj), VIRTUAL)))
+    return;
 
-  if (object->in_room == rnum)
+  obj_to_room(object, loc);
+  obj_command_interpreter(object, command);
+
+  if (object->in_room == loc) 
     extract_obj(object);
 }
 
diff -BburpN --exclude=.svn tbamud-3.51/src/dg_olc.c tbamud-3.52/src/dg_olc.c
--- tbamud-3.51/src/dg_olc.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/dg_olc.c	2007-04-20 16:46:02.000000000 +0200
@@ -39,18 +33,17 @@ int format_script(struct descriptor_data
 void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num);
 void trigedit_setup_new(struct descriptor_data *d);
 
-/* ***********************************************************************
- * trigedit
- * ***********************************************************************/
-
+/* Trigedit */
 ACMD(do_oasis_trigedit)
 {
   int number, real_num;
   struct descriptor_data *d;
 
-  /*
-   * Parse any arguments.
-   */
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+
+  /* Parse any arguments. */
   skip_spaces(&argument);
   if (!*argument || !isdigit(*argument)) {
     send_to_char(ch, "Specify a trigger VNUM to edit.\r\n");
@@ -92,23 +79,18 @@ ACMD(do_oasis_trigedit)
     return;
   }
 
-  /*
-   * Everyone but IMPLs can only edit zones they have been assigned.
-   */
+  /* Everyone but IMPLs can only edit zones they have been assigned.*/
   if (!can_edit_zone(ch, OLC_ZNUM(d))) {
-send_to_char(ch, " You do not have permission to edit zone %d. Try zone %d.\r\n", zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-    mudlog(BRF, LVL_IMPL, TRUE, "OLC: %s tried to edit zone %d (allowed zone %d)",
-      GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
+    send_cannot_edit(ch, zone_table[OLC_ZNUM(d)].number);
+    /* Free the OLC structure. */
     free(d->olc);
     d->olc = NULL;
     return;
@@ -152,16 +133,12 @@ void trigedit_setup_new(struct descripto
   */
   CREATE(trig, struct trig_data, 1);
 
-  trig->nr = -1;
+  trig->nr = NOWHERE;
 
  /*
   * Set up some defaults
@@ -298,7 +272,7 @@ void trigedit_parse(struct descriptor_da
            if (!GET_TRIG_TYPE(OLC_TRIG(d))) {
              write_to_output(d, "Invalid Trigger Type! Answer a to abort quit!\r\n");
            }
-           write_to_output(d, "Do you wish to save the changes to the trigger? (y/n): ");
+           write_to_output(d, "Do you wish to save your changes? : ");
            OLC_MODE(d) = TRIGEDIT_CONFIRM_SAVESTRING;
          } else
            cleanup_olc(d, CLEANUP_ALL);
@@ -358,7 +332,7 @@ void trigedit_parse(struct descriptor_da
           break;
         default:
           write_to_output(d, "Invalid choice!\r\n");
-          write_to_output(d, "Do you wish to save the trigger? : ");
+          write_to_output(d, "Do you wish to save your changes? : ");
           return;
       }
       break;
@@ -664,7 +633,7 @@ void trigedit_save(struct descriptor_dat
   remove(buf);
   rename(fname, buf);
 
-  write_to_output(d, "Saving Index file\r\n");
+  write_to_output(d, "Trigger saved to disk.\r\n");
   trigedit_create_index(zone, "trg");
 }
 
@@ -755,7 +719,7 @@ void dg_script_menu(struct descriptor_da
   OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_MAIN_MENU;
 
   clear_screen(d);
-  write_to_output(d, "     Script Editor\r\n\r\n     Trigger List:\r\n");
+  write_to_output(d, "     Triggers Attached:\r\n");
 
   editscript = OLC_SCRIPT(d);
 
@@ -774,9 +738,9 @@ void dg_script_menu(struct descriptor_da
     write_to_output(d, "     <none>\r\n");
 
   write_to_output(d,  "\r\n"
-    " %sN%s)  New trigger for this script\r\n"
-    " %sD%s)  Delete a trigger in this script\r\n"
-    " %sX%s)  Exit Script Editor\r\n\r\n"
+    " %sN%s)  Attach trigger\r\n"
+    " %sX%s)  Detach trigger\r\n"
+    " %sQ%s)  Quit\r\n\r\n"
     "     Enter choice :",
     grn, nrm, grn, nrm, grn, nrm);
 }
@@ -789,40 +753,29 @@ int dg_script_edit_parse(struct descript
   switch(OLC_SCRIPT_EDIT_MODE(d)) {
     case SCRIPT_MAIN_MENU:
       switch(tolower(*arg)) {
-        case 'x':
-          /* this was buggy.
-             First we created a copy of a thing, but maintained pointers to scripts,
-             then if we altered the scripts, we freed the pointers and added new ones
-             to the OLC_THING. If we then chose _NOT_ to save the changes, the
-             pointers in the original thing pointed to garbage. If we saved changes
-             the pointers were updated correctly.
-
-             Solution:
-             Here we just point the working copies to the new proto_scripts
-             We only update the original when choosing to save internally,
-             then free the unused memory there.
-
-             Welcor
-
-             Thanks to
-             Jeremy Stanley - fungi@yuggoth.org and
-             Torgny Bjers - artovil@arcanerealms.org
-             for the bug report.
-
-             After updating to OasisOLC 2.0.3 I discovered some malfunctions
-             in this code, so I restructured it a bit. Now things work like this:
-             OLC_SCRIPT(d) is assigned a copy of the edited things' proto_script.
-             OLC_OBJ(d), etc.. are initalized with proto_script = NULL;
-             On save, the saved copy is updated with OLC_SCRIPT(d) as new proto_script (freeing the old one).
-             On quit/nosave, OLC_SCRIPT is free()'d, and the prototype not touched.
-
-           */
+        case 'q':
+          /* This was buggy. First we created a copy of a thing, but maintained
+	   * pointers to scripts, then if we altered the scripts, we freed the 
+	   * pointers and added new ones to the OLC_THING. If we then choose NOT
+	   * to save the changes, the pointers in the original pointed to 
+	   * garbage. If we saved changes the pointers were updated correctly.
+	   * Solution: Here we just point the working copies to the new 
+	   * proto_scripts. We only update the original when choosing to save 
+	   * internally, then free the unused memory there. -Welcor
+	   * Thanks to Jeremy Stanley and Torgny Bjers for the bug report.
+	   * After updating to OasisOLC 2.0.3 I discovered some malfunctions
+	   * in this code, so I restructured it a bit. Now things work like 
+	   * this: OLC_SCRIPT(d) is assigned a copy of the edited things' 
+	   * proto_script. OLC_OBJ(d), etc.. are initalized with proto_script =
+	   * NULL; On save, the saved copy is updated with OLC_SCRIPT(d) as new
+	   * proto_script (freeing the old one). On quit/nosave, OLC_SCRIPT is 
+	   * free()'d, and the prototype not touched. */
           return 0;
         case 'n':
           write_to_output(d, "\r\nPlease enter position, vnum   (ex: 1, 200):");
           OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_NEW_TRIGGER;
           break;
-        case 'd':
+        case 'x':
           write_to_output(d, "     Which entry should be deleted?  0 to abort :");
           OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_DEL_TRIGGER;
           break;
diff -BburpN --exclude=.svn tbamud-3.51/src/dg_scripts.c tbamud-3.52/src/dg_scripts.c
--- tbamud-3.51/src/dg_scripts.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/dg_scripts.c	2007-04-20 16:46:02.000000000 +0200
@@ -1568,23 +1508,19 @@ int process_if(char *cond, void *go, str
   struct cmdlist_element *c;
   char *p;
 
-  if (!(cl->next)) { //rryan: if this is the last line, theres no end
+  if (!(cl->next)) { /* rryan: if this is the last line, theres no end */
     script_log("Trigger VNum %d has 'if' without 'end'. (error 1)", GET_TRIG_VNUM(trig));
     return cl;
   }
 
-  for (c = cl->next; c && c->next; c = c?c->next:NULL) {
+  for (c = cl->next; c; c = c->next) {
     for (p = c->cmd; *p && isspace(*p); p++);
 
     if (!strn_cmp("if ", p, 3))
@@ -2562,7 +2448,7 @@ int script_driver(void *go_adress, trig_
   dg_owner_purged = 0;
 
   for (cl = (mode == TRIG_NEW) ? trig->cmdlist : trig->curr_state;
-       cl && GET_TRIG_DEPTH(trig); cl = cl ? cl->next : NULL) {
+      cl && GET_TRIG_DEPTH(trig); cl = cl->next) {
     for (p = cl->cmd; *p && isspace(*p); p++);
 
     if (*p == '*') /* comment */
diff -BburpN --exclude=.svn tbamud-3.51/src/dg_variables.c tbamud-3.52/src/dg_variables.c
--- tbamud-3.51/src/dg_variables.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/dg_variables.c	2007-04-20 16:46:03.000000000 +0200
@@ -869,6 +835,15 @@ in the vault (vnum: 453) now and then. y
             snprintf(str, slen, "%d", GET_PRACTICES(c));
           }
           break;
+        case 'q':
+          if (!str_cmp(field, "questpoints")) {
+            if (subfield && *subfield) {
+              int addition = atoi(subfield);
+              GET_QUESTPOINTS(c) += addition;
+            }
+            snprintf(str, slen, "%d", GET_QUESTPOINTS(c));
+          }
+          break;
         case 'r':
           if (!str_cmp(field, "room")) {  /* in NOWHERE, return the void */
 /* see note in dg_scripts.h */
diff -BburpN --exclude=.svn tbamud-3.51/src/dg_wldcmd.c tbamud-3.52/src/dg_wldcmd.c
--- tbamud-3.51/src/dg_wldcmd.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/dg_wldcmd.c	2007-04-20 16:46:03.000000000 +0200
@@ -560,26 +537,34 @@ WCMD(do_wdamage) {
   script_damage(ch, dam);
 }
 
+WCMD(do_wat)     
+{
+  room_rnum loc = NOWHERE;
+  struct char_data *ch;
+  char arg[MAX_INPUT_LENGTH], *command; 
 
-WCMD(do_wat) {
-    char location[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
-    int vnum = 0;
-    room_data *r2;
-
-    half_chop(argument, location, arg2);
+  command = any_one_arg(argument, arg); 
 
-    if (!*location || !*arg2 || !isdigit(*location)) {
-        wld_log(room, "wat: bad syntax");
+  if (!*arg) {
+    wld_log(room, "wat called with no args");
         return;
     }
-    vnum = atoi(location);
-    if (NOWHERE == real_room(vnum)) {
-        wld_log(room, "wat: location not found");
+
+  skip_spaces(&command); 
+
+  if (!*command) {
+    wld_log(room, "wat called without a command");
         return;
     }
 
-    r2 = &world[real_room(vnum)];
-    wld_command_interpreter(r2, arg2);
+  if (isdigit(*arg)) loc = real_room(atoi(arg));
+  else if ((ch = get_char_by_room(room, arg))) loc = IN_ROOM(ch);
+  
+  if (loc == NOWHERE) {
+    wld_log(room, "wat: location not found (%s)", arg);
+    return;
+  }
+  wld_command_interpreter(&world[loc], command);
 }
 
 const struct wld_command_info wld_cmd_info[] = {
diff -BburpN --exclude=.svn tbamud-3.51/src/fight.c tbamud-3.52/src/fight.c
--- tbamud-3.51/src/fight.c	2007-02-24 22:36:41.000000000 +0100
+++ tbamud-3.52/src/fight.c	2007-04-20 16:46:01.000000000 +0200
@@ -155,6 +148,7 @@ void load_messages(void)
     fight_messages[i].msg = NULL;
   }
 
+  while (!feof(fl)) {
   fgets(chk, 128, fl);
   while (!feof(fl) && (*chk == '\n' || *chk == '*'))
     fgets(chk, 128, fl);
@@ -190,7 +184,7 @@ void load_messages(void)
     while (!feof(fl) && (*chk == '\n' || *chk == '*'))
       fgets(chk, 128, fl);
   }
-
+  }
   fclose(fl);
 }
 
@@ -593,13 +562,15 @@ void dam_message(int dam, struct char_da
   act(buf, FALSE, ch, NULL, victim, TO_NOTVICT);
 
   /* damage message to damager */
-  send_to_char(ch, "@Y(%d)", dam);
+  if (GET_LEVEL(ch) >= LVL_IMMORT)
+	send_to_char(ch, "(%d) ", dam);
   buf = replace_string(dam_weapons[msgnum].to_char,
 	  attack_hit_text[w_type].singular, attack_hit_text[w_type].plural);
   act(buf, FALSE, ch, NULL, victim, TO_CHAR);
   send_to_char(ch, CCNRM(ch, C_CMP));
 
   /* damage message to damagee */
+  if (GET_LEVEL(ch) >= LVL_IMMORT)
   send_to_char(victim, "@R(%d)", dam);
   buf = replace_string(dam_weapons[msgnum].to_victim,
 	  attack_hit_text[w_type].singular, attack_hit_text[w_type].plural);
diff -BburpN --exclude=.svn tbamud-3.51/src/genobj.c tbamud-3.52/src/genobj.c
--- tbamud-3.51/src/genobj.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/genobj.c	2007-04-20 16:46:02.000000000 +0200
@@ -80,17 +73,15 @@ int update_all_objects(struct obj_data *
     obj->contains = swap.contains;
     obj->next_content = swap.next_content;
     obj->next = swap.next;
+    obj->sitting_here = swap.sitting_here;
   }
 
   return count;
@@ -407,8 +361,8 @@ int delete_object(obj_rnum rnum)
   struct obj_data *obj, *tmp;
   int shop, j;
 
-  if (rnum == NOWHERE || rnum > top_of_objt)
-    return FALSE;
+  if (rnum == NOTHING || rnum > top_of_objt)
+    return NOTHING;
 
   obj = &obj_proto[rnum];
 
@@ -509,5 +457,5 @@ int delete_object(obj_rnum rnum)
 
   save_objects(zrnum);
 
-  return TRUE;
+  return rnum;
 }
diff -BburpN --exclude=.svn tbamud-3.51/src/genolc.c tbamud-3.52/src/genolc.c
--- tbamud-3.51/src/genolc.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/genolc.c	2007-04-20 16:46:02.000000000 +0200
@@ -204,12 +181,8 @@ int in_save_list(zone_vnum zone, int typ
/*
 * Used from do_show(), ideally.
 */
-void do_show_save_list(struct char_data *ch)
+ACMD(do_show_save_list)
 {
   if (save_list == NULL)
     send_to_char(ch, "All world files are up to date.\r\n");
diff -BburpN --exclude=.svn tbamud-3.51/src/genzon.c tbamud-3.52/src/genzon.c
--- tbamud-3.51/src/genzon.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/genzon.c	2007-04-20 16:46:02.000000000 +0200
diff -BburpN --exclude=.svn tbamud-3.51/src/handler.c tbamud-3.52/src/handler.c
--- tbamud-3.51/src/handler.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/handler.c	2007-04-20 16:46:03.000000000 +0200
@@ -98,8 +96,10 @@ int isname(const char *str, const char *
 
   newlist = strdup(namelist); /* make a copy since strtok 'modifies' strings */
   for(curtok = strtok(newlist, WHITESPACE); curtok; curtok = strtok(NULL, WHITESPACE))
-     if(curtok && is_abbrev(str, curtok))
-       {
+    if(curtok && is_abbrev(str, curtok)) {
+      /* Don't allow abbreviated numbers. - Sryth */
+      if (isdigit(*str) && (atoi(str) != atoi(curtok)))
+        return 0;
        free(newlist);
        return 1;
        }
@@ -753,7 +700,10 @@ void obj_to_obj(struct obj_data *obj, st
   obj->next_content = obj_to->contains;
   obj_to->contains = obj;
   obj->in_obj = obj_to;
+  tmp_obj = obj->in_obj;
 
+  /* Add weight to container, unless unlimited. */
+  if (GET_OBJ_VAL(obj->in_obj, 0) > 0) {	  
   for (tmp_obj = obj->in_obj; tmp_obj->in_obj; tmp_obj = tmp_obj->in_obj)
     GET_OBJ_WEIGHT(tmp_obj) += GET_OBJ_WEIGHT(obj);
 
@@ -761,9 +711,9 @@ void obj_to_obj(struct obj_data *obj, st
   GET_OBJ_WEIGHT(tmp_obj) += GET_OBJ_WEIGHT(obj);
   if (tmp_obj->carried_by)
     IS_CARRYING_W(tmp_obj->carried_by) += GET_OBJ_WEIGHT(obj);
+  }
 }
 
-
 /* remove an object from an object */
 void obj_from_obj(struct obj_data *obj)
 {
@@ -774,9 +724,11 @@ void obj_from_obj(struct obj_data *obj)
     return;
   }
   obj_from = obj->in_obj;
+  temp = obj->in_obj;
   REMOVE_FROM_LIST(obj, obj_from->contains, next_content);
 
-  /* Subtract weight from containers container */
+  /* Subtract weight from containers container unless unlimited. */
+  if (GET_OBJ_VAL(obj->in_obj, 0) > 0) {
   for (temp = obj->in_obj; temp->in_obj; temp = temp->in_obj)
     GET_OBJ_WEIGHT(temp) -= GET_OBJ_WEIGHT(obj);
 
@@ -784,7 +736,7 @@ void obj_from_obj(struct obj_data *obj)
   GET_OBJ_WEIGHT(temp) -= GET_OBJ_WEIGHT(obj);
   if (temp->carried_by)
     IS_CARRYING_W(temp->carried_by) -= GET_OBJ_WEIGHT(obj);
-
+  }
   obj->in_obj = NULL;
   obj->next_content = NULL;
 }
@@ -804,6 +754,7 @@ void object_list_new_owner(struct obj_da
 /* Extract an object from the world */
 void extract_obj(struct obj_data *obj)
 {
+  struct char_data *ch, *next = NULL;
   struct obj_data *temp;
 
   if (obj->worn_by != NULL)
@@ -816,6 +767,17 @@ void extract_obj(struct obj_data *obj)
   else if (obj->in_obj)
     obj_from_obj(obj);
 
+  if (OBJ_SAT_IN_BY(obj)){
+    for (ch = OBJ_SAT_IN_BY(obj); OBJ_SAT_IN_BY(obj); ch = next){
+      if (!NEXT_SITTING(ch))
+        OBJ_SAT_IN_BY(obj) = NULL;
+      else
+        OBJ_SAT_IN_BY(obj) = (next = NEXT_SITTING(ch));
+      SITTING(ch) = NULL;
+      NEXT_SITTING(ch) = NULL;
+    }
+  }
+
   /* Get rid of the contents of the object, as well. */
   while (obj->contains)
     extract_obj(obj->contains);
@@ -984,22 +933,16 @@ void extract_char_final(struct char_data
 */
 void extract_char(struct char_data *ch)
 {
+  char_from_furniture(ch);
+  
   if (IS_NPC(ch))
     SET_BIT(MOB_FLAGS(ch), MOB_NOTDEADYET);
   else
diff -BburpN --exclude=.svn tbamud-3.51/src/hedit.c tbamud-3.52/src/hedit.c
--- tbamud-3.51/src/hedit.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/hedit.c	2007-04-20 16:46:03.000000000 +0200
@@ -24,14 +24,14 @@ extern struct descriptor_data *descripto
 void hedit_disp_menu(struct descriptor_data *d);
 
 /* external variables */
-struct help_index_element *help_table;
-int top_of_h_table = 0;		/* ref to top of help table	 */
-int top_of_h_file = 0;		/* ref of size of help file	 */
-long top_help_idnum = 0;	/* highest idnum in use		 */
+extern struct help_index_element *help_table;
 void get_one_line(FILE *fl, char *buf);
 int search_help(char *argument, int level);
 ACMD(do_reboot);
 
+/* local variables */
+int top_of_h_table = 0;         /* ref to top of help table      */
+
 /* local functions */
 void hedit_save_internally(struct descriptor_data *d);
 void hedit_save_to_disk(struct descriptor_data *d);
@@ -112,8 +112,12 @@ ACMD(do_oasis_hedit)
   struct descriptor_data *d;
   int i;
 
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+
   if (!can_edit_zone(ch, HEDIT_PERMISSION)) {
-    send_to_char(ch, "You don't have access to editing Help files.\r\n");
+    send_to_char(ch, "You don't have access to editing help files.\r\n");
     return;
   }
 
@@ -140,25 +144,21 @@ ACMD(do_oasis_hedit)
 
   OLC_NUM(d) = 0;
   OLC_STORAGE(d) = strdup(argument);
-  OLC_ZNUM(d) = search_help(OLC_STORAGE(d), GET_LEVEL(ch));
+  OLC_ZNUM(d) = search_help(OLC_STORAGE(d), LVL_IMPL);
 
   for(i = 0; i < (int)strlen(argument); i++)
     argument[i] = toupper(argument[i]);
 
-  if (OLC_ZNUM(d) <= 0)
+  if (OLC_ZNUM(d) == NOWHERE)
      hedit_setup_new(d, OLC_STORAGE(d));
   else
      hedit_setup_existing(d, OLC_ZNUM(d));
@@ -249,36 +234,25 @@ void hedit_save_to_disk(struct descripto
   clear_screen(d);
   write_to_output(d,
 
-"\r\n@c-------------------------------------------------------------------------@n\r\n"
-	  "                         @CHelpfile Editor@n        \r\n"
-"@c-------------------------------------------------------------------------@n\r\n"
-	  "@g1@n) Keyword [@G%-12s@g]@n\r\n"
-	  "@g2@n) Entry       : \n@y%s\r\n"
+         "-- Help file editor\r\n"
+         "@g1@n) Keywords    : @y%s@n\r\n"
+         "@g2@n) Entry       :\r\n@y%s@n"
 	  "@g3@n) Min Level   : @c%d@n\r\n"
 	  "@gQ@n) Quit\r\n"
 	  "Enter choice : ",
@@ -333,7 +299,7 @@ void hedit_parse(struct descriptor_data 
     case 'q':
     case 'Q':
       if (OLC_VAL(d)) { /* Something has been modified. */
-	write_to_output(d, "Do you wish to save this help entry? : ");
+	write_to_output(d, "Do you wish to save your changes? : ");
 	OLC_MODE(d) = HEDIT_CONFIRM_SAVESTRING;
       } else {
         log("this is a test of quit out of hedit");
@@ -431,7 +391,7 @@ ACMD(do_helpcheck)
 
   for (i = 1; *(complete_cmd_info[i].command) != '\n'; i++) {
     if (complete_cmd_info[i].command_pointer != do_action) {
-      if (search_help((char *) complete_cmd_info[i].command, GET_LEVEL(ch)) < 0) {
+      if (search_help((char *) complete_cmd_info[i].command, LVL_IMPL) == NOWHERE) {
         nlen = snprintf(buf + len, sizeof(buf) - len, " %-20.20s%s",
             complete_cmd_info[i].command, (++count % 3 ? "|":"\r\n"));
         if (len + nlen >= sizeof(buf) || nlen < 0)
diff -BburpN --exclude=.svn tbamud-3.51/src/interpreter.c tbamud-3.52/src/interpreter.c
--- tbamud-3.51/src/interpreter.c	2007-02-24 22:41:48.000000000 +0100
+++ tbamud-3.52/src/interpreter.c	2007-04-20 16:48:50.000000000 +0200
@@ -49,7 +48,7 @@ void do_start(struct char_data *ch);
 int parse_class(char arg);
 int special(struct char_data *ch, int cmd, char *arg);
 int isbanned(char *hostname);
-int Valid_Name(char *newname);
+int valid_name(char *newname);
 void read_aliases(struct char_data *ch);
 void delete_aliases(const char *charname);
 void remove_player(int pfilepos);
@@ -73,16 +72,20 @@ ACMD(do_alias);
 ACMD(do_assist);
 ACMD(do_astat);
 ACMD(do_at);
+ACMD(do_attach);
 ACMD(do_backstab);
 ACMD(do_ban);
 ACMD(do_bash);
 ACMD(do_cast);
+ACMD(do_changelog);
+ACMD(do_checkloadstatus);
 ACMD(do_commands);
 ACMD(do_consider);
 ACMD(do_copyover);
 ACMD(do_credits);
 ACMD(do_date);
 ACMD(do_dc);
+ACMD(do_detach);
 ACMD(do_diagnose);
 ACMD(do_dig);
 ACMD(do_display);
@@ -95,6 +98,8 @@ ACMD(do_equipment);
 ACMD(do_examine);
 ACMD(do_exit);
 ACMD(do_exits);
+ACMD(do_export_zone);
+ACMD(do_file);
 ACMD(do_flee);
 ACMD(do_follow);
 ACMD(do_force);
@@ -114,11 +119,11 @@ ACMD(do_gsay);
 ACMD(do_hcontrol);
 ACMD(do_help);
 ACMD(do_hindex);
+ACMD(do_history);
 ACMD(do_helpcheck);
 ACMD(do_hide);
 ACMD(do_hit);
 ACMD(do_house);
-ACMD(do_insult);
 ACMD(do_inventory);
 ACMD(do_invis);
 ACMD(do_kick);
@@ -126,13 +131,36 @@ ACMD(do_kill);
 ACMD(do_last);
 ACMD(do_leave);
 ACMD(do_levels);
+ACMD(do_links);
 ACMD(do_load);
 ACMD(do_look);
+ACMD(do_masound);
+ACMD(do_mat);
+ACMD(do_mdamage);
+ACMD(do_mdoor);
+ACMD(do_mecho);
+ACMD(do_mechoaround);
+ACMD(do_mfollow);
+ACMD(do_mforce);
+ACMD(do_mgoto);
+ACMD(do_mhunt);
+ACMD(do_mjunk);
+ACMD(do_mkill);
+ACMD(do_mload);
 /* ACMD(do_move); -- interpreter.h */
+ACMD(do_mpurge);
+ACMD(do_msend);
+ACMD(do_mteleport);
+ACMD(do_mremember);
+ACMD(do_mforget);
+ACMD(do_mtransform);
+ACMD(do_mzoneecho);
+ACMD(do_mrecho);
 ACMD(do_not_here);
 ACMD(do_order);
 ACMD(do_page);
 ACMD(do_peace);
+ACMD(do_plist);
 ACMD(do_pour);
 ACMD(do_practice);
 ACMD(do_purge);
@@ -155,6 +183,7 @@ ACMD(do_score);
 ACMD(do_send);
 ACMD(do_set);
 ACMD(do_show);
+ACMD(do_show_save_list);
 ACMD(do_shutdown);
 ACMD(do_sit);
 ACMD(do_skillset);
@@ -171,13 +200,16 @@ ACMD(do_teleport);
 ACMD(do_tell);
 ACMD(do_time);
 ACMD(do_title);
+ACMD(do_tlist);
 ACMD(do_toggle);
 ACMD(do_track);
 ACMD(do_trans);
+ACMD(do_tstat);
 ACMD(do_unban);
 ACMD(do_ungroup);
 ACMD(do_use);
 ACMD(do_users);
+ACMD(do_vdelete);
 ACMD(do_visible);
 ACMD(do_vnum);
 ACMD(do_vstat);
@@ -191,60 +223,19 @@ ACMD(do_wizlock);
 ACMD(do_wiznet);
 ACMD(do_wizutil);
 ACMD(do_write);
+ACMD(do_zcheck);
 ACMD(do_zreset);
 ACMD(do_zpurge);
 
-/* DG Script ACMD's */
-ACMD(do_attach);
-ACMD(do_detach);
-ACMD(do_tstat);
-ACMD(do_masound);
-ACMD(do_mkill);
-ACMD(do_mjunk);
-ACMD(do_mdoor);
-ACMD(do_mechoaround);
-ACMD(do_msend);
-ACMD(do_mecho);
-ACMD(do_mload);
-ACMD(do_mpurge);
-ACMD(do_mgoto);
-ACMD(do_mat);
-ACMD(do_mdamage);
-ACMD(do_mteleport);
-ACMD(do_mforce);
-ACMD(do_mhunt);
-ACMD(do_mremember);
-ACMD(do_mforget);
-ACMD(do_mtransform);
-ACMD(do_mzoneecho);
-ACMD(do_mrecho);
-ACMD(do_vdelete);
-ACMD(do_mfollow);
-ACMD(do_tlist);
-
-/* TBA specifics */
-ACMD(do_file);
-ACMD(do_checkloadstatus);
-ACMD(do_links);
-ACMD(do_zcheck);
-ACMD(do_list_history);
-ACMD(do_export_zone);


 struct command_info *complete_cmd_info;
@@ -260,12 +251,13 @@ cpp_extern const struct command_info cmd
   /* now, the main list */
   { "at"       , "at"      , POS_DEAD    , do_at       , LVL_IMMORT, 0 },
   { "advance"  , "adv"     , POS_DEAD    , do_advance  , LVL_GRGOD, 0 },
-  { "aedit"    , "aed"     , POS_DEAD    , do_oasis    , LVL_GOD, SCMD_OASIS_AEDIT },
+  { "aedit"    , "aed"     , POS_DEAD    , do_oasis_aedit, LVL_GOD, 0 },
   { "alias"    , "ali"     , POS_DEAD    , do_alias    , 0, 0 },
   { "afk"      , "afk"     , POS_DEAD    , do_gen_tog  , 0, SCMD_AFK },
   { "assist"   , "as"      , POS_FIGHTING, do_assist   , 1, 0 },
   { "ask"      , "ask"     , POS_RESTING , do_spec_comm, 0, SCMD_ASK },
   { "astat"    , "ast"     , POS_DEAD    , do_astat    , 0, 0 },
+  { "attach"   , "attach"  , POS_DEAD    , do_attach   , LVL_BUILDER, 0 },
   { "auction"  , "auc"     , POS_SLEEPING, do_gen_comm , 0, SCMD_AUCTION },
   { "autoexits" , "autoex"  , POS_DEAD    , do_gen_tog  , 0, SCMD_AUTOEXIT },
 
@@ -279,7 +271,8 @@ cpp_extern const struct command_info cmd
   { "bug"      , "bug"     , POS_DEAD    , do_gen_write, 0, SCMD_BUG },
 
   { "cast"     , "c"       , POS_SITTING , do_cast     , 1, 0 },
-  { "cedit"    , "cedit"   , POS_DEAD    , do_oasis    , LVL_IMPL, SCMD_OASIS_CEDIT },
+  { "cedit"    , "cedit"   , POS_DEAD    , do_oasis_cedit, LVL_IMPL, 0 },
+  { "changelog", "cha"     , POS_DEAD    , do_changelog, LVL_IMPL, 0 },
   { "check"    , "ch"      , POS_STANDING, do_not_here , 1, 0 },
   { "checkload", "checkl"  , POS_DEAD    , do_checkloadstatus, LVL_GOD, 0 },
   { "close"    , "cl"      , POS_SITTING , do_gen_door , 0, SCMD_CLOSE },
@@ -295,6 +288,7 @@ cpp_extern const struct command_info cmd
   { "date"     , "da"      , POS_DEAD    , do_date     , LVL_IMMORT, SCMD_DATE },
   { "dc"       , "dc"      , POS_DEAD    , do_dc       , LVL_GOD, 0 },
   { "deposit"  , "depo"    , POS_STANDING, do_not_here , 1, 0 },
+  { "detach"   , "detach"  , POS_DEAD    , do_detach   , LVL_BUILDER, 0 },
   { "diagnose" , "diag"    , POS_RESTING , do_diagnose , 0, 0 },
   { "dig"      , "dig"     , POS_DEAD    , do_dig      , LVL_BUILDER, 0 },
   { "display"  , "disp"    , POS_DEAD    , do_display  , 0, 0 },
@@ -317,7 +311,7 @@ cpp_extern const struct command_info cmd
   { "file"     , "file"    , POS_SLEEPING, do_file     , LVL_GOD, 0 },
   { "flee"     , "fl"      , POS_FIGHTING, do_flee     , 1, 0 },
   { "follow"   , "fol"     , POS_RESTING , do_follow   , 0, 0 },
-  { "freeze"   , "freeze"  , POS_DEAD    , do_wizutil  , LVL_FREEZE, SCMD_FREEZE },
+  { "freeze"   , "freeze"  , POS_DEAD    , do_wizutil  , LVL_GRGOD, SCMD_FREEZE },
 
   { "get"      , "g"       , POS_RESTING , do_get      , 0, 0 },
   { "gecho"    , "gecho"   , POS_DEAD    , do_gecho    , LVL_GOD, 0 },
@@ -333,13 +327,13 @@ cpp_extern const struct command_info cmd
   { "gtell"    , "gt"      , POS_SLEEPING, do_gsay     , 0, 0 },
 
   { "help"     , "h"       , POS_DEAD    , do_help     , 0, 0 },
-  { "hedit"    , "hedit"   , POS_DEAD    , do_oasis    , LVL_GOD  , SCMD_OASIS_HEDIT },
+  { "hedit"    , "hedit"   , POS_DEAD    , do_oasis_hedit, LVL_GOD , 0 },
   { "hindex"   , "hind"    , POS_DEAD    , do_hindex   , 0, 0 },
   { "helpcheck", "helpch"  , POS_DEAD    , do_helpcheck, LVL_IMPL, 0 },
   { "hide"     , "hi"      , POS_RESTING , do_hide     , 1, 0 },
   { "handbook" , "handb"   , POS_DEAD    , do_gen_ps   , LVL_IMMORT, SCMD_HANDBOOK },
   { "hcontrol" , "hcontrol", POS_DEAD    , do_hcontrol , LVL_GRGOD, 0 },
-  { "history"  , "histo"   , POS_DEAD    , do_list_history, 1, 0},
+  { "history"  , "history" , POS_DEAD    , do_history, 0, 0},
   { "hit"      , "hit"     , POS_FIGHTING, do_hit      , 0, SCMD_HIT },
   { "hold"     , "hold"    , POS_RESTING , do_grab     , 1, 0 },
   { "holler"   , "holler"  , POS_RESTING , do_gen_comm , 1, SCMD_HOLLER },
@@ -351,7 +345,6 @@ cpp_extern const struct command_info cmd
   { "imotd"    , "imo"     , POS_DEAD    , do_gen_ps   , LVL_IMMORT, SCMD_IMOTD },
   { "immlist"  , "imm"     , POS_DEAD    , do_gen_ps   , 0, SCMD_IMMLIST },
   { "info"     , "info"    , POS_SLEEPING, do_gen_ps   , 0, SCMD_INFO },
-  { "insult"   , "insult"  , POS_RESTING , do_insult   , 0, 0 },
   { "invis"    , "invi"    , POS_DEAD    , do_invis    , LVL_IMMORT, 0 },
 
   { "junk"     , "j"       , POS_RESTING , do_drop     , 0, SCMD_JUNK },
@@ -370,8 +363,8 @@ cpp_extern const struct command_info cmd
 
   { "motd"     , "motd"    , POS_DEAD    , do_gen_ps   , 0, SCMD_MOTD },
   { "mail"     , "mail"    , POS_STANDING, do_not_here , 1, 0 },
-  { "medit"    , "med"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_MEDIT },
-  { "mlist"    , "mlist"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_MLIST },
+  { "medit"    , "med"     , POS_DEAD    , do_oasis_medit, LVL_BUILDER, 0 },
+  { "mlist"    , "mlist"   , POS_DEAD    , do_oasis_list , LVL_BUILDER, SCMD_OASIS_MLIST },
   { "mute"     , "mute"    , POS_DEAD    , do_wizutil  , LVL_GOD, SCMD_SQUELCH },
 
   { "news"     , "news"    , POS_SLEEPING, do_gen_ps   , 0, SCMD_NEWS },
@@ -389,9 +382,9 @@ cpp_extern const struct command_info cmd
   { "open"     , "o"       , POS_SITTING , do_gen_door , 0, SCMD_OPEN },
   { "order"    , "ord"     , POS_RESTING , do_order    , 1, 0 },
   { "offer"    , "off"     , POS_STANDING, do_not_here , 1, 0 },
-  { "olc"      , "olc"     , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OLC_SAVEINFO },
-  { "olist"    , "olist"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_OLIST },
-  { "oedit"    , "oedit"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_OEDIT },
+  { "olc"      , "olc"     , POS_DEAD    , do_show_save_list, LVL_BUILDER, 0 },
+  { "olist"    , "olist"   , POS_DEAD    , do_oasis_list, LVL_BUILDER, SCMD_OASIS_OLIST },
+  { "oedit"    , "oedit"   , POS_DEAD    , do_oasis_oedit, LVL_BUILDER, 0 },
 
   { "put"      , "p"       , POS_RESTING , do_put      , 0, 0 },
   { "peace"    , "pe"      , POS_DEAD    , do_peace    , LVL_BUILDER, 0 },
@@ -399,6 +392,7 @@ cpp_extern const struct command_info cmd
   { "practice" , "pr"     , POS_RESTING , do_practice , 1, 0 },
   { "page"     , "pag"     , POS_DEAD    , do_page     , 1, 0 },
   { "pardon"   , "pardon"  , POS_DEAD    , do_wizutil  , LVL_GOD, SCMD_PARDON },
+  { "plist"    , "plist"   , POS_DEAD    , do_plist    , LVL_GOD, 0 },
   { "policy"   , "pol"     , POS_DEAD    , do_gen_ps   , 0, SCMD_POLICIES },
   { "pour"     , "pour"    , POS_STANDING, do_pour     , 0, SCMD_POUR },
   { "prompt"   , "pro"     , POS_DEAD    , do_display  , 0, 0 },
@@ -424,8 +418,8 @@ cpp_extern const struct command_info cmd
   { "rescue"   , "resc"    , POS_FIGHTING, do_rescue   , 1, 0 },
   { "restore"  , "resto"   , POS_DEAD    , do_restore  , LVL_GOD, 0 },
   { "return"   , "retu"    , POS_DEAD    , do_return   , 0, 0 },
-  { "redit"    , "redit"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_REDIT },
-  { "rlist"    , "rlist"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_RLIST },
+  { "redit"    , "redit"   , POS_DEAD    , do_oasis_redit, LVL_BUILDER, 0 },
+  { "rlist"    , "rlist"   , POS_DEAD    , do_oasis_list, LVL_BUILDER, SCMD_OASIS_RLIST },
   { "rclone"   , "rclone"  , POS_DEAD    , do_room_copy, LVL_BUILDER, 0 },
   { "roomflags", "roomflags", POS_DEAD   , do_gen_tog  , LVL_IMMORT, SCMD_SHOWVNUMS },
 
@@ -436,7 +430,7 @@ cpp_extern const struct command_info cmd
   { "save"     , "sav"     , POS_SLEEPING, do_save     , 0, 0 },
   { "saveall"  , "saveall" , POS_DEAD    , do_saveall  , LVL_BUILDER, 0},
   { "sell"     , "sell"    , POS_STANDING, do_not_here , 0, 0 },
-  { "sedit"    , "sedit"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_SEDIT },
+  { "sedit"    , "sedit"   , POS_DEAD    , do_oasis_sedit, LVL_BUILDER, 0 },
   { "send"     , "send"    , POS_SLEEPING, do_send     , LVL_GOD, 0 },
   { "set"      , "set"     , POS_DEAD    , do_set      , LVL_IMMORT, 0 },
   { "shout"    , "sho"     , POS_RESTING , do_gen_comm , 0, SCMD_SHOUT },
@@ -446,7 +440,7 @@ cpp_extern const struct command_info cmd
   { "sip"      , "sip"     , POS_RESTING , do_drink    , 0, SCMD_SIP },
   { "skillset" , "skillset", POS_SLEEPING, do_skillset , LVL_GRGOD, 0 },
   { "sleep"    , "sl"      , POS_SLEEPING, do_sleep    , 0, 0 },
-  { "slist"    , "slist"   , POS_SLEEPING, do_oasis    , LVL_BUILDER, SCMD_OASIS_SLIST },
+  { "slist"    , "slist"   , POS_SLEEPING, do_oasis_list, LVL_BUILDER, SCMD_OASIS_SLIST },
   { "sneak"    , "sneak"   , POS_STANDING, do_sneak    , 1, 0 },
   { "snoop"    , "snoop"   , POS_DEAD    , do_snoop    , LVL_GOD, 0 },
   { "socials"  , "socials" , POS_DEAD    , do_commands , 0, SCMD_SOCIALS },
@@ -461,14 +455,16 @@ cpp_extern const struct command_info cmd
   { "taste"    , "tas"     , POS_RESTING , do_eat      , 0, SCMD_TASTE },
   { "teleport" , "tele"    , POS_DEAD    , do_teleport , LVL_GOD, 0 },
   { "tedit"    , "tedit"   , POS_DEAD    , do_tedit    , LVL_GOD, 0 },  /* XXX: Oasisify */
-  { "thaw"     , "thaw"    , POS_DEAD    , do_wizutil  , LVL_FREEZE, SCMD_THAW },
+  { "thaw"     , "thaw"    , POS_DEAD    , do_wizutil  , LVL_GRGOD, SCMD_THAW },
   { "title"    , "title"   , POS_DEAD    , do_title    , 0, 0 },
   { "time"     , "time"    , POS_DEAD    , do_time     , 0, 0 },
   { "toggle"   , "toggle"  , POS_DEAD    , do_toggle   , 0, 0 },
   { "track"    , "track"   , POS_STANDING, do_track    , 0, 0 },
   { "transfer" , "transfer", POS_SLEEPING, do_trans    , LVL_GOD, 0 },
-  { "trigedit" , "trigedit", POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_TRIGEDIT},
+  { "trigedit" , "trigedit", POS_DEAD    , do_oasis_trigedit, LVL_BUILDER, 0 },
   { "typo"     , "typo"    , POS_DEAD    , do_gen_write, 0, SCMD_TYPO },
+  { "tlist"    , "tlist"   , POS_DEAD    , do_oasis_list, LVL_BUILDER, SCMD_OASIS_TLIST },
+  { "tstat"    , "tstat"   , POS_DEAD    , do_tstat    , LVL_BUILDER, 0 },
 
   { "unlock"   , "unlock"  , POS_SITTING , do_gen_door , 0, SCMD_UNLOCK },
   { "ungroup"  , "ungroup" , POS_DEAD    , do_ungroup  , 0, 0 },
@@ -483,6 +479,7 @@ cpp_extern const struct command_info cmd
   { "visible"  , "vis"     , POS_RESTING , do_visible  , 1, 0 },
   { "vnum"     , "vnum"    , POS_DEAD    , do_vnum     , LVL_IMMORT, 0 },
   { "vstat"    , "vstat"   , POS_DEAD    , do_vstat    , LVL_IMMORT, 0 },
+  { "vdelete"  , "vdelete" , POS_DEAD    , do_vdelete  , LVL_BUILDER, 0 },
 
   { "wake"     , "wake"    , POS_SLEEPING, do_wake     , 0, 0 },
   { "wear"     , "wea"     , POS_RESTING , do_wear     , 0, 0 },
@@ -501,16 +498,12 @@ cpp_extern const struct command_info cmd
   { "write"    , "write"   , POS_STANDING, do_write    , 1, 0 },
 
   { "zreset"   , "zreset"  , POS_DEAD    , do_zreset   , LVL_BUILDER, 0 },
-  { "zedit"    , "zedit"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_ZEDIT },
-  { "zlist"    , "zlist"   , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_ZLIST },
+  { "zedit"    , "zedit"   , POS_DEAD    , do_oasis_zedit, LVL_BUILDER, 0 },
+  { "zlist"    , "zlist"   , POS_DEAD    , do_oasis_list, LVL_BUILDER, SCMD_OASIS_ZLIST },
   { "zcheck"   , "zcheck"  , POS_DEAD    , do_zcheck   , LVL_GOD, 0 },
   { "zpurge"   , "zpurge"  , POS_DEAD    , do_zpurge   , LVL_BUILDER, 0 },
 
   /* DG trigger commands */
-  { "attach"   , "attach"  , POS_DEAD    , do_attach   , LVL_BUILDER, 0 },
-  { "detach"   , "detach"  , POS_DEAD    , do_detach   , LVL_BUILDER, 0 },
-  { "tlist"    , "tlist"    , POS_DEAD    , do_oasis    , LVL_BUILDER, SCMD_OASIS_TLIST },
-  { "tstat"    , "tstat"   , POS_DEAD    , do_tstat    , LVL_BUILDER, 0 },
   { "masound"  , "masound" , POS_DEAD    , do_masound  , -1, 0 },
   { "mkill"    , "mkill"   , POS_STANDING, do_mkill    , -1, 0 },
   { "mjunk"    , "mjunk"   , POS_SITTING , do_mjunk    , -1, 0 },
@@ -531,7 +524,6 @@ cpp_extern const struct command_info cmd
   { "mforget"  , "mforget" , POS_DEAD    , do_mforget  , -1, 0 },
   { "mtransform", "mtransform", POS_DEAD , do_mtransform,-1, 0 },
   { "mzoneecho", "mzoneecho", POS_DEAD   , do_mzoneecho, -1, 0 },
-  { "vdelete"  , "vdelete" , POS_DEAD    , do_vdelete  , LVL_BUILDER, 0 },
   { "mfollow"  , "mfollow" , POS_DEAD    , do_mfollow  , -1, 0 },
 
   { "\n", "zzzzzzz", 0, 0, 0, 0 } };	/* this must be last */
@@ -902,9 +868,12 @@ int search_block(char *arg, const char *
   return (-1);
 }
 
-
 int is_number(const char *str)
 {
+  if(*str == '-')
+     str++;
+  if(!*str)
+     return (0);
   while (*str)
     if (!isdigit(*(str++)))
       return (0);
@@ -1295,7 +1216,14 @@ int perform_dupe_check(struct descriptor
   case RECON:
     write_to_output(d, "Reconnecting.\r\n");
     act("$n has reconnected.", TRUE, d->character, 0, 0, TO_ROOM);
-    mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s [%s] has reconnected.", GET_NAME(d->character), d->host);
+
+    if (GET_INVIS_LEV(d->character))
+      mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s has reconnected. (invis %d)", GET_NAME(d->character), GET_INVIS_LEV(d->character));
+    else
+      mudlog(BRF, LVL_IMMORT, TRUE, "%s has reconnected.", GET_NAME(d->character));
+
+    if (has_mail(GET_IDNUM(d->character)))
+      write_to_output(d, "You have mail waiting.\r\n");
     break;
   case USURP:
     write_to_output(d, "You take over your own body, already in use!\r\n");
@@ -1428,7 +1349,7 @@ void nanny(struct descriptor_data *d, ch
       char buf[MAX_INPUT_LENGTH], tmp_name[MAX_INPUT_LENGTH];
 
       if ((_parse_name(arg, tmp_name)) || strlen(tmp_name) < 2 ||
-	  strlen(tmp_name) > MAX_NAME_LENGTH || !Valid_Name(tmp_name) ||
+	  strlen(tmp_name) > MAX_NAME_LENGTH || !valid_name(tmp_name) ||
 	  fill_word(strcpy(buf, tmp_name)) || reserved_word(buf)) {	/* strcpy: OK (mutual MAX_INPUT_LENGTH) */
 	write_to_output(d, "Invalid name, please try another.\r\nName: ");
 	return;
@@ -1437,17 +1358,15 @@ void nanny(struct descriptor_data *d, ch
 
 		/* We get a false positive from the original deleted character. */
 	  free_char(d->character);
-	  /* Check for multiple creations... */
-	  if (!Valid_Name(tmp_name)) {
+	  /* Check for multiple creations. */
+	  if (!valid_name(tmp_name)) {
 	    write_to_output(d, "Invalid name, please try another.\r\nName: ");
 	    return;
 	  }
@@ -1467,6 +1386,7 @@ void nanny(struct descriptor_data *d, ch
 	  REMOVE_BIT(PLR_FLAGS(d->character),
 		     PLR_WRITING | PLR_MAILING | PLR_CRYO);
 	  REMOVE_BIT(AFF_FLAGS(d->character), AFF_GROUP);
+          d->character->player.time.logon = time(0);
 	  write_to_output(d, "Password: ");
 	  echo_off(d);
 	  d->idle_tics = 0;
@@ -1476,7 +1396,7 @@ void nanny(struct descriptor_data *d, ch
 	/* player unknown -- make new character */
 
 	/* Check for multiple creations of a character. */
-	if (!Valid_Name(tmp_name)) {
+	if (!valid_name(tmp_name)) {
 	  write_to_output(d, "Invalid name, please try another.\r\nName: ");
 	  return;
 	}
@@ -1576,12 +1494,9 @@ void nanny(struct descriptor_data *d, ch
 	write_to_output(d, "%s", motd);
 
       if (GET_INVIS_LEV(d->character))
-        mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE,
-        "%s [%s] has connected. (invis %d)", GET_NAME(d->character), d->host,
-        GET_INVIS_LEV(d->character));
+        mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s has connected. (invis %d)", GET_NAME(d->character), GET_INVIS_LEV(d->character));
       else
-        mudlog(BRF, LVL_IMMORT, TRUE,
-               "%s [%s] has connected.", GET_NAME(d->character), d->host);
+        mudlog(BRF, LVL_IMMORT, TRUE, "%s has connected.", GET_NAME(d->character));
 
       if (load_result) {
         write_to_output(d, "\r\n\r\n\007\007\007"
@@ -1663,6 +1578,10 @@ void nanny(struct descriptor_data *d, ch
     } else
       GET_CLASS(d->character) = load_result;
 
+      if (d->olc) {
+        free(d->olc);
+        d->olc = NULL;
+      }
     if (GET_PFILEPOS(d->character) < 0)
       GET_PFILEPOS(d->character) = create_entry(GET_PC_NAME(d->character));
     /* Now GET_NAME() will work properly. */
@@ -1675,7 +1594,7 @@ void nanny(struct descriptor_data *d, ch
     GET_PREF(d->character)= rand_number(1, 128000);
     GET_HOST(d->character)= strdup(d->host);
 
-    mudlog(NRM, LVL_IMMORT, TRUE, "%s [%s] new player.", GET_NAME(d->character), d->host);
+    mudlog(NRM, LVL_GOD, TRUE, "%s [%s] new player.", GET_NAME(d->character), d->host);
     break;
 
   case CON_RMOTD:		/* read CR after printing motd   */
diff -BburpN --exclude=.svn tbamud-3.51/src/interpreter.h tbamud-3.52/src/interpreter.h
--- tbamud-3.51/src/interpreter.h	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/interpreter.h	2007-04-20 16:46:03.000000000 +0200
@@ -223,24 +212,13 @@ struct alias_data {
 #define SCMD_LOCK       3
 #define SCMD_PICK       4
 
-/* do_olc */
-#define SCMD_OASIS_REDIT	0
-#define SCMD_OASIS_OEDIT	1
-#define SCMD_OASIS_ZEDIT	2
-#define SCMD_OASIS_MEDIT	3
-#define SCMD_OASIS_SEDIT	4
-#define SCMD_OASIS_CEDIT	5
-#define SCMD_OLC_SAVEINFO	7
-#define SCMD_OASIS_RLIST 	8
-#define SCMD_OASIS_MLIST	9
-#define SCMD_OASIS_OLIST	10
-#define SCMD_OASIS_SLIST	11
-#define SCMD_OASIS_ZLIST        12
-#define SCMD_OASIS_TRIGEDIT     13
-#define SCMD_OASIS_AEDIT        14
-#define SCMD_OASIS_TLIST        15
-#define SCMD_OASIS_LINKS        16
-#define SCMD_OASIS_HEDIT        17
+/* do_oasis_Xlist */
+#define SCMD_OASIS_RLIST       0
+#define SCMD_OASIS_MLIST       1
+#define SCMD_OASIS_OLIST       2
+#define SCMD_OASIS_SLIST       3
+#define SCMD_OASIS_ZLIST       4
+#define SCMD_OASIS_TLIST       5
 
 /* do_last */
 #define SCMD_LIST_ALL 1
diff -BburpN --exclude=.svn tbamud-3.51/src/licheck tbamud-3.52/src/licheck
--- tbamud-3.51/src/licheck	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/licheck	2007-04-20 16:46:02.000000000 +0200
@@ -2,15 +2,15 @@
 
 cat << EOF
 
-CircleMUD is freeware (it doesn't cost anything), but it is copyrighted
+TbaMUD is freeware (it doesn't cost anything), but it is copyrighted
 and has a license.  You must read and agree to abide by the license before
-using CircleMUD.
+using tbaMUD.
 
 This message will only appear once (the first time you compile the server),
 but is contained in the file doc/license.txt if you'd like to refer back to
 it in the future.
 
-Press return to read the license.
+Press return to read the license. Press Q to ACCEPT the terms and quit.
 EOF
 read temp
 cat ../doc/license.txt | $1
diff -BburpN --exclude=.svn tbamud-3.51/src/limits.c tbamud-3.52/src/limits.c
--- tbamud-3.51/src/limits.c	2007-02-24 22:36:42.000000000 +0100
+++ tbamud-3.52/src/limits.c	2007-04-20 16:46:01.000000000 +0200
@@ -254,7 +236,7 @@ void gain_exp(struct char_data *ch, int 
   if (gain > 0) {
     gain = MIN(CONFIG_MAX_EXP_GAIN, gain);	/* put a cap on the max gain per kill */
     GET_EXP(ch) += gain;
-    while (GET_LEVEL(ch) < LVL_IMMORT - CONFIG_IMMORT_LEVEL_OK &&
+    while (GET_LEVEL(ch) < LVL_IMMORT - CONFIG_NO_MORT_TO_IMMORT &&
 	GET_EXP(ch) >= level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1)) {
       GET_LEVEL(ch) += 1;
       num_levels++;
@@ -425,6 +402,8 @@ void point_update(void)
       update_char_objects(i);
       if (GET_LEVEL(i) < CONFIG_IDLE_MAX_LEVEL)
 	check_idling(i);
+      else 
+        (i->char_specials.timer)++;
     }
   }
 
diff -BburpN --exclude=.svn tbamud-3.51/src/magic.c tbamud-3.52/src/magic.c
--- tbamud-3.51/src/magic.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/magic.c	2007-04-20 16:46:03.000000000 +0200
@@ -704,16 +635,8 @@ const char *mag_summon_fail_msgs[] = {
   "There is no corpse!\r\n"
 };
 
-/* These mobiles do not exist. */
-#define MOB_MONSUM_I		130
-#define MOB_MONSUM_II		140
-#define MOB_MONSUM_III		150
-#define MOB_GATE_I		160
-#define MOB_GATE_II		170
-#define MOB_GATE_III		180
-
 /* Defined mobiles. */
-#define MOB_ELEMENTAL_BASE	20	/* Only one for now. */
+#define MOB_ELEMENTAL_BASE	20
 #define MOB_CLONE		10
 #define MOB_ZOMBIE		11
 #define MOB_AERIALSERVANT	19
diff -BburpN --exclude=.svn tbamud-3.51/src/mail.c tbamud-3.52/src/mail.c
--- tbamud-3.51/src/mail.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/mail.c	2007-04-20 16:46:03.000000000 +0200
@@ -414,7 +381,8 @@ void postmaster_receive_mail(struct char
     return;
   }
   while (has_mail(GET_IDNUM(ch))) {
-    obj = read_object(1, VIRTUAL); /*a pair of wings will work :)*/
+    obj = create_obj(); 
+    obj->item_number = 1; 
     obj->name = strdup("mail paper letter");
     obj->short_description = strdup("a piece of mail");
     obj->description = strdup("Someone has left a piece of mail here.");
diff -BburpN --exclude=.svn tbamud-3.51/src/medit.c tbamud-3.52/src/medit.c
--- tbamud-3.51/src/medit.c	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/medit.c	2007-04-20 16:46:02.000000000 +0200
@@ -128,21 +120,16 @@ ACMD(do_oasis_medit)
  /** Everyone but IMPLs can only edit zones they have been assigned.        **/
  /****************************************************************************/
   if (!can_edit_zone(ch, OLC_ZNUM(d))) {
-    send_to_char(ch, " You do not have permission to edit zone %d. Try zone %d.\r\n", zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-mudlog(BRF, LVL_IMPL, TRUE, "OLC: %s tried to edit zone %d allowed zone %d",
-      GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
+    send_cannot_edit(ch, zone_table[OLC_ZNUM(d)].number);
+    /* Free the OLC structure. */
     free(d->olc);
     d->olc = NULL;
     return;
@@ -552,19 +477,18 @@ void medit_parse(struct descriptor_data 
       return;
     default:
       write_to_output(d, "Invalid choice!\r\n");
-      write_to_output(d, "Do you wish to save the mobile? : ");
+      write_to_output(d, "Do you wish to save your changes? : ");
       return;
     }
     break;
 
-/*-------------------------------------------------------------------*/
   case MEDIT_MAIN_MENU:
     i = 0;
     switch (*arg) {
     case 'q':
     case 'Q':
       if (OLC_VAL(d)) {	/* Anything been changed? */
-	write_to_output(d, "Do you wish to save the changes to the mobile? (y/n) : ");
+	write_to_output(d, "Do you wish to save your changes? : ");
 	OLC_MODE(d) = MEDIT_CONFIRM_SAVESTRING;
       } else
 	cleanup_olc(d, CLEANUP_ALL);
@@ -846,7 +767,7 @@ void medit_parse(struct descriptor_data 
 
   case MEDIT_DELETE:
     if (*arg == 'y' || *arg == 'Y') {
-      if (delete_mobile(GET_MOB_RNUM(OLC_MOB(d))))
+      if (delete_mobile(GET_MOB_RNUM(OLC_MOB(d))) != NOBODY) 
         write_to_output(d, "Mobile deleted.\r\n");
       else
         write_to_output(d, "Couldn't delete the mobile!\r\n");
diff -BburpN --exclude=.svn tbamud-3.51/src/mobact.c tbamud-3.52/src/mobact.c
--- tbamud-3.51/src/mobact.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/mobact.c	2007-04-20 16:46:03.000000000 +0200
diff -BburpN --exclude=.svn tbamud-3.51/src/modify.c tbamud-3.52/src/modify.c
--- tbamud-3.51/src/modify.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/modify.c	2007-04-20 16:46:03.000000000 +0200
diff -BburpN --exclude=.svn tbamud-3.51/src/oasis.c tbamud-3.52/src/oasis.c
--- tbamud-3.51/src/oasis.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/oasis.c	2007-04-20 16:46:03.000000000 +0200
@@ -51,131 +45,20 @@ struct olc_scmd_info_t {
 
 const char *nrm, *grn, *cyn, *yel;
 
/******************************************************************************/
/** Internal Functions                                                       **/
/******************************************************************************/
 void free_config(struct config_data *data);
 
/* -------------------------------------------------------------------------- */

/*
 * Only player characters should be using OLC anyway.
 */
 void clear_screen(struct descriptor_data *d)
 {
   if (PRF_FLAGGED(d->character, PRF_CLS))
     write_to_output(d, "[H[J");
 }
 
-/* -------------------------------------------------------------------------- */
-
-/*
- * Exported ACMD do_oasis function.
- *
- * This function is the OLC interface.  It deals with all the
- * generic OLC stuff, then passes control to the sub-olc sections.
- *
- * UPDATE:
- *  I believe that yes, putting the code together that is common in all of the
- *  olc functions is good to a certain extent, but the do_oasis command was
- *  getting ridiculous.  Therefore, I have separated them into separate
- *  functions that get called from in do_oasis....yes, similar code, but it is
- *  easier to handle....   - Kip Potter
- */
-ACMD(do_oasis)
-{
-  /*
-   * No screwing around as a mobile.
-   */
-  if (IS_NPC(ch) || !ch->desc)
-    return;
-
-  /*
-   * Prevent forcing people in OLC to edit other stuff.
-   * 'force' just lets command_interpreter() handle the input,
-   * regardless of the state of the victim.
-   * This can wreck havoc if people are i OLC already
-   * - ie. their input would have been redirected by nanny(), and
-   * never get to command_interpreter().
-   * -- Welcor 09/03
-   * - thanks to Mark Garringer (zizazat@hotmail.com) for the bug report.
-   */
-  if (STATE(ch->desc) != CON_PLAYING)
-    return;
-
-  switch (subcmd) {
-  /*
-   * The command to see what needs to be saved, typically 'olc'.
-   */
-    case SCMD_OLC_SAVEINFO:
-      do_show_save_list(ch);
-      break;
-
-    case SCMD_OASIS_CEDIT:
-      do_oasis_cedit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_ZEDIT:
-      do_oasis_zedit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_REDIT:
-      do_oasis_redit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_OEDIT:
-      do_oasis_oedit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_MEDIT:
-      do_oasis_medit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_SEDIT:
-      do_oasis_sedit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_RLIST:
-    case SCMD_OASIS_MLIST:
-    case SCMD_OASIS_OLIST:
-    case SCMD_OASIS_SLIST:
-    case SCMD_OASIS_ZLIST:
-    case SCMD_OASIS_TLIST:
-      do_oasis_list(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_LINKS:
-      do_oasis_links(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_TRIGEDIT:
-      do_oasis_trigedit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_AEDIT:
-      do_oasis_aedit(ch, argument, cmd, subcmd);
-      break;
-
-    case SCMD_OASIS_HEDIT:
-      do_oasis_hedit(ch, argument, cmd, subcmd);
-      break;
-
-    default:
-      log("SYSERR: (OLC) Invalid subcmd passed to do_oasis, subcmd - (%d)", subcmd);
-      return;
-  }
-  return;
-}

/*------------------------------------------------------------*\
 Exported utilities
@@ -408,6 +243,7 @@ int can_edit_zone(struct char_data *ch, 
     return (TRUE);
 
   /* always access if a player helped build the zone in the first place */
+  if (rnum != HEDIT_PERMISSION && rnum != AEDIT_PERMISSION)
   if (is_name(GET_NAME(ch), zone_table[rnum].builders))
     return (TRUE);
 
@@ -426,3 +262,18 @@ int can_edit_zone(struct char_data *ch, 
 
   return (FALSE);
 }
+
+void send_cannot_edit(struct char_data *ch, zone_vnum zone)
+{
+  char buf[MAX_STRING_LENGTH];
+	   
+  if (GET_OLC_ZONE(ch) != NOWHERE) {
+    send_to_char(ch, "You do not have permission to edit zone %d.  Try zone %d.\r\n", zone, GET_OLC_ZONE(ch));
+    sprintf(buf, "OLC: %s tried to edit zone %d (allowed zone %d).", GET_NAME(ch), zone, GET_OLC_ZONE(ch));
+  } else {
+    send_to_char(ch, "You do not have permission to edit zone %d.\r\n", GET_OLC_ZONE(ch));
+    sprintf(buf, "OLC: %s tried to edit zone %d.", GET_NAME(ch), zone);
+  }
+  mudlog(BRF, LVL_IMPL, TRUE, buf);
+}
+
diff -BburpN --exclude=.svn tbamud-3.51/src/oasis.h tbamud-3.52/src/oasis.h
--- tbamud-3.51/src/oasis.h	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/oasis.h	2007-04-20 16:46:03.000000000 +0200
@@ -372,7 +332,7 @@ extern const char *nrm, *grn, *cyn, *yel
 #define CEDIT_DTS_ARE_DUMPS		31
 #define CEDIT_LOAD_INTO_INVENTORY	32
 #define CEDIT_TRACK_THROUGH_DOORS	33
-#define CEDIT_IMMORT_LEVEL_OK		34
+#define CEDIT_NO_MORT_TO_IMMORT		34
 #define CEDIT_MAX_OBJ_SAVE		35
 #define CEDIT_MIN_RENT_COST		36
 #define CEDIT_AUTOSAVE_TIME		37
diff -BburpN --exclude=.svn tbamud-3.51/src/oasis_delete.h tbamud-3.52/src/oasis_delete.h
--- tbamud-3.51/src/oasis_delete.h	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/oasis_delete.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-/*
- * Function prototypes defined in oasis_delete.c.
- */
-void remove_room_from_memory(room_rnum rnum);
diff -BburpN --exclude=.svn tbamud-3.51/src/oasis_list.c tbamud-3.52/src/oasis_list.c
--- tbamud-3.51/src/oasis_list.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/oasis_list.c	2007-04-20 16:46:03.000000000 +0200
diff -BburpN --exclude=.svn tbamud-3.51/src/objsave.c tbamud-3.52/src/objsave.c
--- tbamud-3.51/src/objsave.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/objsave.c	2007-04-20 16:46:03.000000000 +0200
@@ -86,7 +81,7 @@ int objsave_save_obj_record(struct obj_d
     temp=read_object(GET_OBJ_VNUM(obj), VIRTUAL);
   else {
     temp = create_obj();
-    temp->item_number = -1;
+    temp->item_number = NOWHERE;
   }
 
   if (obj->action_description) {
diff -BburpN --exclude=.svn tbamud-3.51/src/oedit.c tbamud-3.52/src/oedit.c
--- tbamud-3.51/src/oedit.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/oedit.c	2007-04-20 16:46:02.000000000 +0200
@@ -65,15 +62,14 @@ ACMD(do_oasis_oedit)
  /****************************************************************************/
  /** Parse any arguments.                                                   **/
  /****************************************************************************/
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+    
+  /* Parse any arguments. */
   buf3 = two_arguments(argument, buf1, buf2);
 
  /****************************************************************************/
@@ -137,40 +125,27 @@ ACMD(do_oasis_oedit)
  /** Everyone but IMPLs can only edit zones they have been assigned.        **/
  /****************************************************************************/
   if (!can_edit_zone(ch, OLC_ZNUM(d))) {
-    send_to_char(ch, " You do not have permission to edit zone %d. Try zone %d.\r\n", zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-mudlog(BRF, LVL_IMPL, TRUE, "OLC: %s tried to edit zone %d allowed zone %d",
-      GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-
-    /**************************************************************************/
-    /** Free the descriptor's OLC structure.                                 **/
-    /**************************************************************************/
+    send_cannot_edit(ch, zone_table[OLC_ZNUM(d)].number);
+    /* Free the OLC structure. */
     free(d->olc);
     d->olc = NULL;
     return;
@@ -478,24 +410,20 @@ void oedit_disp_spells_menu(struct descr
   get_char_colors(d->character);
   clear_screen(d);
 
-  for (counter = 0; counter < NUM_SPELLS; counter++) {
+  for (counter = 1; counter <= NUM_SPELLS; counter++) {
     write_to_output(d, "%s%2d%s) %s%-20.20s %s", grn, counter, nrm, yel,
 		spell_info[counter].name, !(++columns % 3) ? "\r\n" : "");
   }
@@ -505,16 +433,14 @@ void oedit_disp_val1_menu(struct descrip
     write_to_output(d, "Apply to AC : ");
     break;
   case ITEM_CONTAINER:
-    write_to_output(d, "Max weight to contain : ");
+    write_to_output(d, "Max weight to contain (-1 for unlimited) : ");
     break;
   case ITEM_DRINKCON:
   case ITEM_FOUNTAIN:
@@ -527,18 +453,16 @@ void oedit_disp_val1_menu(struct descrip
     write_to_output(d, "Number of gold coins : ");
     break;
   case ITEM_NOTE:
-    /*
-     * This is supposed to be language, but it's unused.
-     */
+    break;
+  case ITEM_FURNITURE:
+    write_to_output(d, "Number of people it can hold : ");
     break;
   default:
     oedit_disp_menu(d);
@@ -830,19 +723,17 @@ void oedit_parse(struct descriptor_data 
       return;
     default:
       write_to_output(d, "Invalid choice!\r\n");
-      write_to_output(d, "Do you wish to save this object?\r\n");
+      write_to_output(d, "Do you wish to save your changes? : \r\n");
       return;
     }
 
   case OEDIT_MAIN_MENU:
-    /*
-     * Throw us out to whichever edit mode based on user input.
-     */
+    /* Throw us out to whichever edit mode based on user input. */
     switch (*arg) {
     case 'q':
     case 'Q':
       if (OLC_VAL(d)) {	/* Something has been modified. */
-	write_to_output(d, "Do you wish to save this object? : ");
+	write_to_output(d, "Do you wish to save your changes? : ");
 	OLC_MODE(d) = OEDIT_CONFIRM_SAVESTRING;
       } else
 	cleanup_olc(d, CLEANUP_ALL);
@@ -1056,29 +941,30 @@ void oedit_parse(struct descriptor_data 
     return;
 
   case OEDIT_VALUE_1:
-    /*
-     * Lucky, I don't need to check any of these for out of range values.
-     * Hmm, I'm not so sure - Rv
-     */
+    number = atoi(arg);
     switch (GET_OBJ_TYPE(OLC_OBJ(d))) {
+    case ITEM_FURNITURE:
+      if (number < 0 || number > MAX_PEOPLE)
+        oedit_disp_val1_menu(d);
+      else {
+        GET_OBJ_VAL(OLC_OBJ(d), 0) = number;
+        oedit_disp_val2_menu(d);
+      }
+      break;
     case ITEM_WEAPON:
       GET_OBJ_VAL(OLC_OBJ(d), 0) = MIN(MAX(atoi(arg), -50), 50);
       break;
     case ITEM_CONTAINER:
-      GET_OBJ_VAL(OLC_OBJ(d), 0) = LIMIT(atoi(arg), 0, MAX_CONTAINER_SIZE);
+      GET_OBJ_VAL(OLC_OBJ(d), 0) = LIMIT(atoi(arg), -1, MAX_CONTAINER_SIZE);
       break;
     default:
       GET_OBJ_VAL(OLC_OBJ(d), 0) = atoi(arg);
@@ -1301,7 +1176,7 @@ void oedit_parse(struct descriptor_data 
     break;
   case OEDIT_DELETE:
     if (*arg == 'y' || *arg == 'Y') {
-      if (delete_object(GET_OBJ_RNUM(OLC_OBJ(d))))
+      if (delete_object(GET_OBJ_RNUM(OLC_OBJ(d))) != NOTHING)
         write_to_output(d, "Object deleted.\r\n");
       else
         write_to_output(d, "Couldn't delete the object!\r\n");
diff -BburpN --exclude=.svn tbamud-3.51/src/pfdefaults.h tbamud-3.52/src/pfdefaults.h
--- tbamud-3.51/src/pfdefaults.h	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/pfdefaults.h	2007-04-20 16:46:03.000000000 +0200
@@ -49,8 +49,9 @@
 #define PFDEF_HUNGER		0
 #define PFDEF_THIRST		0
 #define PFDEF_DRUNK		0
-#define PFDEF_OLC               65535
+#define PFDEF_OLC               NOWHERE 
 #define PFDEF_PAGELENGTH        22
+#define PFDEF_QUESTPOINTS       0
 
 #endif
 
diff -BburpN --exclude=.svn tbamud-3.51/src/players.c tbamud-3.52/src/players.c
--- tbamud-3.51/src/players.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/players.c	2007-04-20 16:46:02.000000000 +0200
@@ -295,6 +264,9 @@ int load_char(const char *name, struct c
     GET_HOST(ch) = NULL;
     GET_PAGE_LENGTH(ch) = PFDEF_PAGELENGTH;
     GET_ALIASES(ch) = NULL;
+    SITTING(ch) = NULL;
+    NEXT_SITTING(ch) = NULL;
+    GET_QUESTPOINTS(ch) = PFDEF_QUESTPOINTS;
 
     while (get_line(fl, line)) {
       tag_argument(line, tag);
@@ -378,10 +350,8 @@ int load_char(const char *name, struct c
        if (!strcmp(tag, "Page"))  GET_PAGE_LENGTH(ch) = atoi(line);
 	else if (!strcmp(tag, "Pass"))	strcpy(GET_PASSWD(ch), line);
 	else if (!strcmp(tag, "Plyd"))	ch->player.time.played	= atoi(line);
- #if ASCII_SAVE_POOFS
 	else if (!strcmp(tag, "PfIn"))	POOFIN(ch)		= strdup(line);
 	else if (!strcmp(tag, "PfOt"))	POOFOUT(ch)		= strdup(line);
- #endif
 	else if (!strcmp(tag, "Pref"))	PRF_FLAGS(ch)		= asciiflag_conv(line);
 	break;
 
@@ -535,10 +489,8 @@ void save_char(struct char_data * ch)
     strip_cr(buf);
     fprintf(fl, "Desc:\n%s~\n", buf);
   }
-#if ASCII_SAVE_POOFS
   if (POOFIN(ch))				fprintf(fl, "PfIn: %s\n", POOFIN(ch));
   if (POOFOUT(ch))				fprintf(fl, "PfOt: %s\n", POOFOUT(ch));
-#endif
   if (GET_SEX(ch)	     != PFDEF_SEX)	fprintf(fl, "Sex : %d\n", GET_SEX(ch));
   if (GET_CLASS(ch)	   != PFDEF_CLASS)	fprintf(fl, "Clas: %d\n", GET_CLASS(ch));
   if (GET_LEVEL(ch)	   != PFDEF_LEVEL)	fprintf(fl, "Levl: %d\n", GET_LEVEL(ch));
@@ -603,6 +555,7 @@ void save_char(struct char_data * ch)
   if (GET_DAMROLL(ch)	   != PFDEF_DAMROLL)	fprintf(fl, "Drol: %d\n", GET_DAMROLL(ch));
   if (GET_OLC_ZONE(ch)     != PFDEF_OLC)        fprintf(fl, "Olc : %d\n", GET_OLC_ZONE(ch));
   if (GET_PAGE_LENGTH(ch)  != PFDEF_PAGELENGTH) fprintf(fl, "Page: %d\n", GET_PAGE_LENGTH(ch));
+  if (GET_QUESTPOINTS(ch)  != PFDEF_QUESTPOINTS) fprintf(fl, "Qstp: %d\n", GET_QUESTPOINTS(ch));
 
   /* Save skills */
   if (GET_LEVEL(ch) < LVL_IMMORT) {
diff -BburpN --exclude=.svn tbamud-3.51/src/redit.c tbamud-3.52/src/redit.c
--- tbamud-3.51/src/redit.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/redit.c	2007-04-20 16:46:03.000000000 +0200
@@ -44,6 +40,10 @@ ACMD(do_oasis_redit)
   int number = NOWHERE, save = 0, real_num;
   struct descriptor_data *d;
 
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+
   /* Parse any arguments. */
   buf3 = two_arguments(argument, buf1, buf2);
 
@@ -114,10 +112,8 @@ ACMD(do_oasis_redit)
 
   /* Make sure the builder is allowed to modify this zone. */
   if (!can_edit_zone(ch, OLC_ZNUM(d))) {
-send_to_char(ch, " You do not have permission to edit zone %d. Try zone %d.\r\n", zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-mudlog(BRF, LVL_IMPL, TRUE, "OLC: %s tried to edit zone %d allowed zone %d",
-               GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-
+    send_cannot_edit(ch, zone_table[OLC_ZNUM(d)].number);
+    /* Free the OLC structure. */
     free(d->olc);
     d->olc = NULL;
     return;
@@ -555,7 +502,7 @@ void redit_parse(struct descriptor_data 
     case 'q':
     case 'Q':
       if (OLC_VAL(d)) { /* Something has been modified. */
-        write_to_output(d, "Do you wish to save this room ? : ");
+        write_to_output(d, "Do you wish to save your changes? : ");
         OLC_MODE(d) = REDIT_CONFIRM_SAVESTRING;
       } else
         cleanup_olc(d, CLEANUP_ALL);
diff -BburpN --exclude=.svn tbamud-3.51/src/sedit.c tbamud-3.52/src/sedit.c
--- tbamud-3.51/src/sedit.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/sedit.c	2007-04-20 16:46:02.000000000 +0200
@@ -63,9 +61,11 @@ ACMD(do_oasis_sedit)
  /****************************************************************************/
  /** Parse any arguments.                                                   **/
  /****************************************************************************/
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+    
+  /* Parse any arguments. */
   buf3 = two_arguments(argument, buf1, buf2);
 
   if (!*buf1) {
@@ -142,15 +132,10 @@ ACMD(do_oasis_sedit)
  /****************************************************************************/
  /** Everyone but IMPLs can only edit zones they have been assigned.        **/
  /****************************************************************************/
+  /* Everyone but IMPLs can only edit zones they have been assigned. */
   if (!can_edit_zone(ch, OLC_ZNUM(d))) {
-send_to_char(ch, " You do not have permission to edit zone %d. Try zone %d.\r\n", zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-
-    /**************************************************************************/
-    /** Free the OLC structure.                                              **/
-    /**************************************************************************/
+    send_cannot_edit(ch, zone_table[OLC_ZNUM(d)].number);
+    /* Free the OLC structure. */
     free(d->olc);
     d->olc = NULL;
     return;
@@ -520,19 +464,18 @@ void sedit_parse(struct descriptor_data 
       cleanup_olc(d, CLEANUP_ALL);
       return;
     default:
-      write_to_output(d, "Invalid choice!\r\nDo you wish to save the shop? : ");
+     write_to_output(d, "Invalid choice!\r\nDo you wish to save your changes? : ");
       return;
     }
     break;
 
-/*-------------------------------------------------------------------*/
   case SEDIT_MAIN_MENU:
     i = 0;
     switch (*arg) {
     case 'q':
     case 'Q':
       if (OLC_VAL(d)) {		/* Anything been changed? */
-	write_to_output(d, "Do you wish to save the changes to the shop? (y/n) : ");
+	write_to_output(d, "Do you wish to save your changes? : ");
 	OLC_MODE(d) = SEDIT_CONFIRM_SAVESTRING;
       } else
 	cleanup_olc(d, CLEANUP_ALL);
diff -BburpN --exclude=.svn tbamud-3.51/src/spell_parser.c tbamud-3.52/src/spell_parser.c
--- tbamud-3.51/src/spell_parser.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/spell_parser.c	2007-04-20 16:46:03.000000000 +0200
@@ -26,6 +23,7 @@
 
 /* local globals */
 struct spell_info_type spell_info[TOP_SPELL_DEFINE + 1];
+char cast_arg2[MAX_INPUT_LENGTH];
 
 /* local functions */
 void say_spell(struct char_data *ch, int spellnum, struct char_data *tch, struct obj_data *tobj);
@@ -542,10 +511,12 @@ ACMD(do_cast)
   }
   t = strtok(NULL, "\0");
 
+  skip_spaces(&s); 
+
   /* spellnum = search_block(s, spells, 0); */
   spellnum = find_skill_num(s);
 
-  if ((spellnum < 1) || (spellnum > MAX_SPELLS)) {
+  if ((spellnum < 1) || (spellnum > MAX_SPELLS) || !*s) { 
     send_to_char(ch, "Cast what?!?\r\n");
     return;
   }
diff -BburpN --exclude=.svn tbamud-3.51/src/spells.c tbamud-3.52/src/spells.c
--- tbamud-3.51/src/spells.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/spells.c	2007-04-20 16:46:03.000000000 +0200
@@ -25,6 +23,7 @@
 /* external variables */
 extern room_rnum r_mortal_start_room;
 extern int mini_mud;
+extern char cast_arg2[MAX_STRING_LENGTH];
 
 /* external functions */
 void weight_change_object(struct obj_data *obj, int weight);
@@ -157,7 +150,52 @@ ASPELL(spell_summon)
   greet_memory_mtrigger(victim);
 }
 
+/* Used by the locate object spell to check the alias list on objects */
+int isname_obj(char *search, char *list)
+{
+  char *found_in_list; //but could be something like 'ring' in 'shimmering'
+  char searchname[128];
+  char namelist[MAX_STRING_LENGTH];
+  int found_pos = -1;
+  int found_name=0; /* found the name we're looking for */
+  int match = 1;
+  int i;
 
+  /* Force to lowercase for string comparisons */
+  sprintf(searchname, "%s", search);
+  for (i = 0; searchname[i]; i++)
+    searchname[i] = LOWER(searchname[i]);
+
+  sprintf(namelist, "%s", list);
+  for (i = 0; namelist[i]; i++)
+    namelist[i] = LOWER(namelist[i]);
+
+  /* see if searchname exists any place within namelist */
+  found_in_list = strstr(namelist, searchname);
+  if (!found_in_list) {
+    return 0;
+  }
+
+  /* Found the name in the list, now see if it's a valid hit. The following 
+   * avoids substrings (like ring in shimmering) is it at beginning of 
+   * namelist? */
+  for (i = 0; searchname[i]; i++)
+    if (searchname[i] != namelist[i])
+      match = 0;
+
+  if (match) /* It was found at the start of the namelist string. */
+    found_name = 1;
+  else { /* It is embedded inside namelist. Is it preceded by a space? */
+    found_pos = found_in_list - namelist;
+    if (namelist[found_pos-1] == ' ')
+      found_name = 1;
+  }
+
+  if (found_name)
+    return 1;
+  else
+    return 0;
+}
 
 ASPELL(spell_locate_object)
 {
@@ -165,25 +203,21 @@ ASPELL(spell_locate_object)
   char name[MAX_INPUT_LENGTH];
   int j;
 
-  /*
-   * FIXME: This is broken.  The spell parser routines took the argument
-   * the player gave to the spell and located an object with that keyword.
-   * Since we're passed the object and not the keyword we can only guess
-   * at what the player originally meant to search for. -gg
-   */
   if (!obj) {
     send_to_char(ch, "You sense nothing.\r\n");
     return;
   }
 
-  strlcpy(name, fname(obj->name), sizeof(name));
-  j = level / 2;
+  /*  added a global var to catch 2nd arg. */
+  sprintf(name, "%s", cast_arg2); 
+
+  j = GET_LEVEL(ch) / 2;  /* # items to show = twice char's level */
 
   for (i = object_list; i && (j > 0); i = i->next) {
-    if (!isname(name, i->name))
+    if (!isname_obj(name, i->name))
       continue;
 
-    send_to_char(ch, "%s", CAP(strdup(i->short_description)));
+  send_to_char(ch, "%c%s", UPPER(*i->short_description), i->short_description + 1); 
 
     if (i->carried_by)
       send_to_char(ch, " is being carried by %s.\r\n", PERS(i->carried_by, ch));
@@ -198,13 +232,8 @@ ASPELL(spell_locate_object)
 
     j--;
   }
-
-  if (j == level / 2)
-    send_to_char(ch, "You sense nothing.\r\n");
 }
 
-
-
 ASPELL(spell_charm)
 {
   struct affected_type af;
diff -BburpN --exclude=.svn tbamud-3.51/src/structs.h tbamud-3.52/src/structs.h
--- tbamud-3.51/src/structs.h	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/structs.h	2007-04-20 16:46:03.000000000 +0200
@@ -1,41 +1,30 @@
-/* ************************************************************************
-*   File: structs.h                                     Part of CircleMUD *
-*  Usage: header file for central structures and contstants               *
+/**************************************************************************
+*  File: structs.h                                         Part of tbaMUD *
+*  Usage: Header file for central structures and constants.               *
 *                                                                         *
-*  All rights reserved.  See license.doc for complete information.        *
+*  All rights reserved.  See license for complete information.            *
 *                                                                         *
 *  Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
 *  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
-************************************************************************ */
-
-/*
- * Intended use of this macro is to allow external packages to work with
- * a variety of CircleMUD versions without modifications.  For instance,
- * an IS_CORPSE() macro was introduced in pl13.  Any future code add-ons
- * could take into account the CircleMUD version and supply their own
- * definition for the macro if used on an older version of CircleMUD.
- * You are supposed to compare this with the macro CIRCLEMUD_VERSION()
- * in utils.h.  See there for usage.
- */
-#define _CIRCLEMUD	0x030510 /* Major/Minor/Patchlevel - MMmmPP */
-
-/*
- * If you want equipment to be automatically equipped to the same place
- * it was when players rented, set the define below to 1.
- */
-#define USE_AUTOEQ	1	/* TRUE/FALSE aren't defined yet. */
+**************************************************************************/
 
+/* Intended use of this macro is to allow external packages to work with a 
+ * variety of versions without modifications.  For instance, an IS_CORPSE()
+ * macro was introduced in pl13.  Any future code add-ons could take into 
+ * account the version and supply their own definition for the macro if used 
+ * on an older version. You are supposed to compare this with the macro 
+ * TBAMUD_VERSION() in utils.h. */
+#define _TBAMUD    0x030520 /* Major/Minor/Patchlevel - MMmmPP */
 
-/* preamble *************************************************************/
+/* If you want equipment to be automatically equipped to the same place
+ * it was when players rented, set the define below to 1. */
+#define USE_AUTOEQ	1	/* TRUE/FALSE aren't defined yet. */
 
-/*
- * As of bpl20, it should be safe to use unsigned data types for the
- * various virtual and real number data types.  There really isn't a
- * reason to use signed anymore so use the unsigned types and get
- * 65,535 objects instead of 32,768.
- *
- * NOTE: This will likely be unconditionally unsigned later.
- */
+/* preamble */
+/* As of bpl20, it should be safe to use unsigned data types for the various 
+ * virtual and real number data types.  There really isn't a reason to use 
+ * signed anymore so use the unsigned types and get 65,535 objects instead of 
+ * 32,768. NOTE: This will likely be unconditionally unsigned later. */
 #define CIRCLE_UNSIGNED_INDEX	1	/* 0 = signed, 1 = unsigned */
 
 #if CIRCLE_UNSIGNED_INDEX
@@ -105,9 +88,20 @@
 #define SECT_FLYING	     8		   /* Wheee!			*/
 #define SECT_UNDERWATER	     9		   /* Underwater		*/
 
+/* char and mob-related defines */
 
-/* char and mob-related defines *****************************************/
+/* History */
+#define HIST_ALL       0
+#define HIST_SAY       1
+#define HIST_GOSSIP    2
+#define HIST_WIZNET    3
+#define HIST_TELL      4
+#define HIST_SHOUT     5
+#define HIST_GRATS     6
+#define HIST_HOLLER    7
+#define HIST_AUCTION   8
 
+#define NUM_HIST       9
 
 /* PC classes */
 #define CLASS_UNDEFINED	  (-1)
@@ -300,25 +288,22 @@
 #define ITEM_WAND       3		/* Item is a wand		*/
 #define ITEM_STAFF      4		/* Item is a staff		*/
 #define ITEM_WEAPON     5		/* Item is a weapon		*/
-#define ITEM_FIREWEAPON 6		/* Unimplemented		*/
-#define ITEM_MISSILE    7		/* Unimplemented		*/
+#define ITEM_FURNITURE  6		/* Sittable Furniture		*/
+#define ITEM_FREE       7		/* Unimplemented		*/
 #define ITEM_TREASURE   8		/* Item is a treasure, not gold	*/
 #define ITEM_ARMOR      9		/* Item is armor		*/
 #define ITEM_POTION    10 		/* Item is a potion		*/
 #define ITEM_WORN      11		/* Unimplemented		*/
 #define ITEM_OTHER     12		/* Misc object			*/
 #define ITEM_TRASH     13		/* Trash - shopkeeps won't buy	*/
-#define ITEM_TRAP      14		/* Unimplemented		*/
+#define ITEM_FREE2     14		/* Unimplemented		*/
 #define ITEM_CONTAINER 15		/* Item is a container		*/
 #define ITEM_NOTE      16		/* Item is note 		*/
 #define ITEM_DRINKCON  17		/* Item is a drink container	*/
@@ -474,20 +443,15 @@
 /* Builders that have access to the saveall command */
 #define LVL_BUILDER	LVL_IMMORT
 
-/* Level of the 'freeze' command */
-#define LVL_FREEZE	LVL_GRGOD
-
 #define NUM_OF_DIRS	6	/* number of directions in a room (nsewud) */
 #define MAGIC_NUMBER	(0x06)	/* Arbitrary number that won't be in a string */
 
@@ -518,7 +482,7 @@
 /* ** MAX_PWD_LENGTH changed from 10 to 30 for ascii test - Sam ** */
 #define MAX_PWD_LENGTH		30
 #define MAX_TITLE_LENGTH	80
-#define HOST_LENGTH		30
+#define HOST_LENGTH		40
 #define PLR_DESC_LENGTH		512
 #define MAX_TONGUE		3
 #define MAX_SKILLS		200
@@ -634,12 +586,10 @@ struct obj_data {
 
    struct obj_data *next_content; /* For 'contains' lists             */
    struct obj_data *next;         /* For the object list              */
+   struct char_data *sitting_here;/* who is sitting in it             */
 };
/* ======================================================================= */

@@ -816,6 +747,8 @@ struct char_special_data_saved {
 struct char_special_data {
    struct char_data *fighting;	/* Opponent				*/
    struct char_data *hunting;	/* Char hunted by this char		*/
+   struct obj_data *furniture;      /* Object the char is sitting in        */
+   struct char_data *next_in_furniture; /* The next person sitting */
 
    byte position;		/* Standing, fighting, sleeping, etc.	*/
 
@@ -837,17 +770,16 @@ struct player_special_data_saved {
    long /*bitvector_t*/	pref;	/* preference flags for PC's.		*/
    ubyte bad_pws;		/* number of bad password attemps	*/
    sbyte conditions[3];         /* Drunk, hunger, thirst		*/
-
+   struct txt_block *comm_hist[NUM_HIST]; /* Player's communcations history     */
    ubyte page_length;
    int spells_to_learn;		/* How many can you learn yet this level*/
    int olc_zone;
+   int questpoints;
 };
 
/*
@@ -969,7 +894,6 @@ struct descriptor_data {
    int	bufspace;		/* space left in the output buffer	*/
    struct txt_block *large_outbuf; /* ptr to large buffer, if we need it */
    struct txt_q input;		/* q of unprocessed input		*/
-   struct txt_block *comms;     /* latest comms history.                */
    struct char_data *character;	/* linked to char			*/
    struct char_data *original;	/* original char if switched		*/
    struct descriptor_data *snooping; /* Who is this char snooping	*/
@@ -1138,18 +1045,14 @@ struct game_data {
   int dts_are_dumps;      /* Should items in dt's be junked?	  */
   int load_into_inventory;/* Objects load in immortals inventory. */
   int track_through_doors;/* Track through doors while closed?    */
-  int immort_level_ok;    /* Automatically level mortals to imm?  */
+  int no_mort_to_immort;  /* Prevent mortals leveling to imms?    */
 
   char *OK;               /* When player receives 'Okay.' text.	  */
-  char *NOPERSON;         /* 'No-one by that name here.'	  */
+  char *NOPERSON;         /* 'No one by that name here.'	  */
   char *NOEFFECT;         /* 'Nothing seems to happen.'	          */
 };
 
diff -BburpN --exclude=.svn tbamud-3.51/src/util/plrtoascii.c tbamud-3.52/src/util/plrtoascii.c
--- tbamud-3.51/src/util/plrtoascii.c	2007-02-24 22:36:30.000000000 +0100
+++ tbamud-3.52/src/util/plrtoascii.c	2007-04-20 16:45:55.000000000 +0200
@@ -18,7 +18,7 @@
 
 #define MAX_PWD_LENGTH		30  /* Used in char_file_u *DO*NOT*CHANGE* */
 #define MAX_TITLE_LENGTH	80  /* Used in char_file_u *DO*NOT*CHANGE* */
-#define HOST_LENGTH		30  /* Used in char_file_u *DO*NOT*CHANGE* */
+#define HOST_LENGTH		40  /* Used in char_file_u *DO*NOT*CHANGE* */
 #define PLR_DESC_LENGTH		512 /* Used in char_file_u *DO*NOT*CHANGE* */
 #define MAX_TONGUE		3   /* Used in char_file_u *DO*NOT*CHANGE* */
 #define MAX_SKILLS		200 /* Used in char_file_u *DO*NOT*CHANGE* */
diff -BburpN --exclude=.svn tbamud-3.51/src/utils.c tbamud-3.52/src/utils.c
--- tbamud-3.51/src/utils.c	2007-02-24 22:36:41.000000000 +0100
+++ tbamud-3.52/src/utils.c	2007-04-20 16:46:01.000000000 +0200
@@ -710,19 +637,78 @@ int room_is_dark(room_rnum room)
 int levenshtein_distance(char *s1, char *s2)
 {
   int s1_len = strlen(s1), s2_len = strlen(s2);
-  int d[s1_len + 1][s2_len + 1];
-  int i, j;
+  int *d = NULL;
+  int i, j, k;       
+
+  s1_len++;
+  s2_len++;
+
+  CREATE(d, int, (s1_len * s2_len));
+
+  for (i = 0; i < s1_len; i++)
+    d[i] = i;   
+  for (j = 0; j < s2_len; j++)
+    d[j*s1_len] = j;   
+
+  for (i = 1; i < s1_len; i++)
+    for (j = 1; j < s2_len; j++)
+      d[(j*s1_len)+i] = MIN(d[(j*s1_len) + i - 1] + 1, MIN(d[i+((j-1)*s1_len)]
+        + 1, d[((j-1)*s1_len) + i - 1] + ((s1[i - 1] == s2[j - 1]) ? 0 : 1)));
+
+  k = d[s1_len*s2_len-1];
+
+  free (d);
+
+  return k; 
+}
+
+void char_from_furniture(struct char_data *ch)
+{
+  struct obj_data *furniture;
+  struct char_data *tempch;
+  int i, found = 0;
+
+  if (!SITTING(ch))
+    return;
 
-  for (i = 0; i <= s1_len; i++)
-    d[i][0] = i;
-  for (j = 0; j <= s2_len; j++)
-    d[0][j] = j;
-
-  for (i = 1; i <= s1_len; i++)
-    for (j = 1; j <= s2_len; j++)
-      d[i][j] = MIN(d[i - 1][j] + 1,
-      MIN(d[i][j - 1] + 1,
-      d[i - 1][j - 1] + ((s1[i - 1] == s2[j - 1]) ? 0 : 1)));
+  if (!(furniture = SITTING(ch))){
+    log("SYSERR: No furniture for char in char_from_furniture.");
+    SITTING(ch) = NULL;
+    NEXT_SITTING(ch) = NULL;
+    return;
+  }
+  
+  if (!(tempch = OBJ_SAT_IN_BY(furniture))){
+    log("SYSERR: Char from furniture, but no furniture!");
+    SITTING(ch) = NULL;
+    NEXT_SITTING(ch) = NULL;
+    return;
+  }
 
-  return d[s1_len][s2_len];
+  if (tempch == ch){
+    if (!NEXT_SITTING(ch))  
+      OBJ_SAT_IN_BY(furniture) = NULL;
+    else
+      OBJ_SAT_IN_BY(furniture) = NEXT_SITTING(ch);
+    GET_OBJ_VAL(furniture, 1) -= 1;
+    SITTING(ch) = NULL;
+    NEXT_SITTING(ch) = NULL;
+    return;
+  }
+
+  for (i = 0; i < GET_OBJ_VAL(furniture, 1) && found == 0; i++){
+    if (NEXT_SITTING(tempch) != ch){
+      NEXT_SITTING(tempch) = NEXT_SITTING(ch);
+      found++;
+    }   
+  }
+  if (found)
+    log("SYSERR: Char flagged as sitting, but not in furniture.");
+  else
+    GET_OBJ_VAL(furniture, 1) -= 1;
+   
+  SITTING(ch) = NULL;
+  NEXT_SITTING(ch) = NULL;
+
+ return;
 }
diff -BburpN --exclude=.svn tbamud-3.51/src/utils.h tbamud-3.52/src/utils.h
--- tbamud-3.51/src/utils.h	2007-02-24 22:36:43.000000000 +0100
+++ tbamud-3.52/src/utils.h	2007-04-20 16:46:01.000000000 +0200
@@ -33,17 +31,15 @@ int	get_filename(char *filename, size_t 
 time_t	mud_time_to_secs(struct time_info_data *now);
 struct time_info_data *age(struct char_data *ch);
 int	num_pc_in_room(struct room_data *room);
-void	core_dump_real(const char *, int);
+void	core_dump_real(const char *who, int line);
 int     count_color_chars(char *string);
 int	room_is_dark(room_rnum room);
 int     levenshtein_distance(char *s1, char *s2);
@@ -77,6 +73,7 @@ bool	circle_follow(struct char_data *ch,
 
 /* in act.informative.c */
 void	look_at_room(struct char_data *ch, int mode);
+void    add_history(struct char_data *ch, char *msg, int type);
 
 /* in act.movmement.c */
 int	do_simple_move(struct char_data *ch, int dir, int following);
@@ -94,8 +91,12 @@ void	gain_condition(struct char_data *ch
 void	point_update(void);
 void	update_pos(struct char_data *victim);
 
+void char_from_furniture(struct char_data *ch);
+#define SITTING(ch)             ((ch)->char_specials.furniture)
+#define NEXT_SITTING(ch)        ((ch)->char_specials.next_in_furniture)
+#define OBJ_SAT_IN_BY(obj)      ((obj)->sitting_here)
 
/* various constants *****************************************************/
 
@@ -332,7 +309,9 @@ void	update_pos(struct char_data *victim
 #define GET_LAST_TELL(ch)	CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->last_tell))
 #define GET_PREF(ch)      ((ch)->pref)
 #define GET_HOST(ch)		CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->host))
-
+#define GET_HISTORY(ch, i)      CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.comm_hist[i]))
+#define GET_PAGE_LENGTH(ch)     CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.page_length))
+#define GET_QUESTPOINTS(ch)     CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.questpoints))
 
 #define GET_SKILL(ch, i)	CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.skills[i]))
 #define SET_SKILL(ch, i, pct)	do { CHECK_PLAYER_SPECIAL((ch), (ch)->player_specials->saved.skills[i]) = pct; } while(0)
@@ -579,12 +537,12 @@ void	update_pos(struct char_data *victim
 #define CONFIG_DTS_ARE_DUMPS    config_info.play.dts_are_dumps
 #define CONFIG_LOAD_INVENTORY   config_info.play.load_into_inventory
 #define CONFIG_TRACK_T_DOORS    config_info.play.track_through_doors
-#define CONFIG_IMMORT_LEVEL_OK  config_info.play.immort_level_ok
+#define CONFIG_NO_MORT_TO_IMMORT config_info.play.no_mort_to_immort
 #define CONFIG_OK               config_info.play.OK
 #define CONFIG_NOPERSON         config_info.play.NOPERSON
 #define CONFIG_NOEFFECT         config_info.play.NOEFFECT
@@ -617,9 +575,7 @@ void	update_pos(struct char_data *victim
 #define CONFIG_USE_AUTOWIZ      config_info.autowiz.use_autowiz
 #define CONFIG_MIN_WIZLIST_LEV  config_info.autowiz.min_wizlist_lev
 
-#define GET_PAGE_LENGTH(ch)         CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.page_length))
-
diff -BburpN --exclude=.svn tbamud-3.51/src/zedit.c tbamud-3.52/src/zedit.c
--- tbamud-3.51/src/zedit.c	2007-02-24 22:36:44.000000000 +0100
+++ tbamud-3.52/src/zedit.c	2007-04-20 16:46:03.000000000 +0200
@@ -48,14 +43,14 @@ ACMD(do_oasis_zedit)

  /****************************************************************************/
  /** Parse any arguments.                                                   **/
  /****************************************************************************/
+  /* No building as a mob or while being forced. */
+  if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING)
+    return;
+
+  /* Parse any arguments. */
   buf3 = two_arguments(argument, buf1, buf2);
 
  /****************************************************************************/
@@ -146,36 +129,27 @@ ACMD(do_oasis_zedit)
  /****************************************************************************/
  /** Everyone but IMPLs can only edit zones they have been assigned.        **/
  /****************************************************************************/
   if (!can_edit_zone(ch, OLC_ZNUM(d))) {
-send_to_char(ch, " You do not have permission to edit zone %d. Try zone %d.\r\n", zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
-mudlog(BRF, LVL_IMPL, TRUE, "OLC: %s tried to edit zone %d allowed zone %d",
-      GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
+    send_cannot_edit(ch, zone_table[OLC_ZNUM(d)].number);
+    /* Free the OLC structure. */
     free(d->olc);
     d->olc = NULL;
     return;
@@ -770,19 +663,18 @@ void zedit_parse(struct descriptor_data 
       break;
     default:
       write_to_output(d, "Invalid choice!\r\n");
-      write_to_output(d, "Do you wish to save the zone info? : ");
+      write_to_output(d, "Do you wish to save your changes? : ");
       break;
     }
     break;
    /* End of ZEDIT_CONFIRM_SAVESTRING */
 
/*-------------------------------------------------------------------*/
   case ZEDIT_MAIN_MENU:
     switch (*arg) {
     case 'q':
     case 'Q':
       if (OLC_ZONE(d)->age || OLC_ZONE(d)->number) {
-	write_to_output(d, "Do you wish to save the changes to the zone info? (y/n) : ");
+	write_to_output(d, "Do you wish to save your changes? : ");
 	OLC_MODE(d) = ZEDIT_CONFIRM_SAVESTRING;
       } else {
 	write_to_output(d, "No changes made.\r\n");
