BizMUD 0.1

Intro:
  - Written by Thyrr for PizzaParty's 32k MUD competition, Sept. 2005
  - Free to use as long as you give credit in the source code and in the game.

Requirements:
  - Python 2.4. May not work with 2.5 and beyond, whenever those are released.
  - Python is available from http://www.python.org
  - Make sure the "players/" directory is present.
  - A MUD/telnet client is probably a good idea ;)
  - The MUD assumes you have at least basic VT100/ANSI color support.

Getting started:
  - python mud.py
  - telnet to localhost port 8500

Important notes:
  - Binds to all interfaces at port 8500 by default.
  - Any player connected from 127.0.0.1 can toggle admin status with "xyzzy".
  - Admins can toggle the admin status of any other player in the same room.
  - So be careful with reverse proxies, SSH tunnels, etc.

Byte counts:
  - *.py            29108     (see methology below)
  - data.gz          1776
  - socials.txt.gz    298
  - help.txt.gz       941

  - Total           32123     (under the limit of 32768)

Source counting method:
  - See Erwin Andreasen's 16k.py script. Comments, blank lines, and trailing
    blanks are removed, indents of four spaces are converted to one tab.
    Options used: -h -b -p   (see http://www.andreasen.org/16k)

    File size:                    40296 bytes
    Lines:                         1432
    \r stripped:                  40296
    # removed:                    34308
    blank lines stripped:         33447
    spaces to tabs:               29124
    duplicate blanks stripped:    29108

    Final result:                 29108

Game Features:
  - Lope-style color codes, e.g. {R for red, {r for darker red
  - Player saving/loading
  - Persistent world that preserves NPCs and objects across shutdown/reboot
  - Socials (smile, laugh, scold, etc.)
  - A "combat" "system" with physical and social attacks (see "help combat")
  - Customizable prompt (e.g. type "prompt <$hp/$hpm $cash>")
  - Basic inventory system with get/drop/give/inv
  - Wearable clothing for the fashion-conscious. Look your best in battle!
  - Parser handles quotes and indexing ("give 'green tea 3' 'sugar daddy'")
  - Basic room building with string editor interface for rdesc
  - Players can rent property to gain room desc editing rights and run shops
  - Shops sell drinks with different "flavors" that can be combined
  - NPCs buy drinks from shops according to personal tastes which adapt to
      new flavors over time.
  - Basic AI allows NPCs to flock to shops with the best prices that also
      suit their preferences.

Not implemented due to lack of time/space:
  - NPC/obj/flavor editing/creation.
  - Businesses beyond beverages, like pizza, ice cream, clothing, bowling.
  - (And limit "flavors" -- a chocolate shirt is weird, but polyester is fine).
  - More interesting competition, e.g. monopolies, mafia, advertising.
  - Limited NPC knowledge. Right now they're almost omniscient consumers.
  - Ability to transfer cash between players.
  - Different effects for each combat social.
  - Different costs for various flavors/ingredients.
  - Runtime efficiency.
  - Penguins.

Known problems:
  - No penalty for falling behind on rent.
  - Bug: does not handle two connections creating players with the same name.
  - Players always load into the starting room.
  - Persistence is fairly fragile. And unconnected rooms will not be saved.
  - All player-run shops sell drinks. Thus you can have a "cherry apartment."
  - Lots of other gameplay issues.
  - NPCs are stupid.
  - No penguins.

Admin commands:
  - xyzzy [victim]: become admin or make someone an admin
  - frotz: misc commands, currently $ (get cash) and wsave (world save)
  - goto <thing>: goes to the room containing any named object/actor/room
  - lease: modify rent and ownership
  - rdig <dir>: creates a new room in a particular direction
  - rlink <dir> <dest>: links an exit on both sides. <dest> is a room name.
      Using "none" for <dest> unlinks one side.
  - creload: reloads cmd.py from source
  - shutdown: does a clean shutdown (does a world save / player save as well)

Reading the code:
  - Unlike in C, "if x: print 1; print 2" on one line is not a coding pitfall.
  - Common abbreviations:
    - S = self
    - t = text
    - l = line/text (often suffixed e.g. 'lv' for the name of a victim)
    - v = victim or viewer
    - c = connection
    - p = player
    - a = actor
    - r = room
    - f = file or function
    - any of the above suffixed with 's' for a list/tuple/iter of that type
    - pro = prompt
    - NL = newline ("\r\n")
  - Command to replace S with self in most cases: (for non-judges)
      sed -ie "s/\([^\"_'[:alnum:]]\)S\([^_'\"[:alnum:]]\|$\)/\1self\2/g" *.py
  - Yes, I used 'self' when writing this code and auto-replaced it later.

Changes since 0.1:
  - Now auto-saves on quit
  - Disconnect now auto-quits
  - NPCs no longer visit out-of-stock shops
  - Shops now give sales revenue to the owner hourly
  - All shops should be restocked now
  - Logging in as an online player disconnects the old connection
  - Changed cost of restocking
  - Fixed throwing during a fight