733 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			733 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| wMUD TODO file
 | |
| ==============
 | |
| 
 | |
| This file is continuously migrated into the Zim wiki (later it will become
 | |
| media or dokuwiki).
 | |
| 
 | |
| Legend
 | |
| ------
 | |
| 
 | |
| [  ] planned
 | |
| [f ] feature request added to flyspray
 | |
| [ i] implementation began
 | |
| [XX] finished
 | |
| 
 | |
| Data storage and code flow
 | |
| --------------------------
 | |
| 
 | |
| [ i] * Store EVERYTHING in an SQLite3 database
 | |
| 
 | |
| [ i] * Separate threads for separate jobs. Game thread for accepting players,
 | |
| 	 maintenance thread to continuously maintain the database, chat threads
 | |
| 	 for different chat protocols, world builder thread for online world
 | |
|          building.
 | |
| 
 | |
| [  ] * All descriptions should be written in a markup language to support bold,
 | |
|          underline, colours, and such
 | |
| 
 | |
| [f ] * Loadable modules for commands, races, classes, etc.
 | |
| 
 | |
| Game world
 | |
| ----------
 | |
| 
 | |
| [  ] * Movement
 | |
| [ i]   - 10 directions (N, E, S, W, NE, NW, SE, SW, U, D)
 | |
| [  ]   - Also, some rooms may have other exits, like portals, which can be
 | |
|            ENTER'ed.
 | |
| [  ]   - Doors can be locked or hidden
 | |
| [  ]   - <mob> arrives from <direction>
 | |
| 
 | |
| [ i] * Planets/Planes
 | |
| [ i]   - Rooms are connected to Planets
 | |
| [ i]   - Planets are connected to Planes
 | |
| [  ]  - Rooms may have different descriptions depending on the Plane the
 | |
|           Character is active on
 | |
| 
 | |
| [  ] * Player grouping (AKA Party or formations)
 | |
| [  ]   - Group leader (can promote others, demoting themselves)
 | |
| [  ]   - Maximum group size
 | |
| [  ]   - Following is not grouping
 | |
| 
 | |
| [  ] * People start in a well-defined start location (randomly selected during
 | |
|          character generation)
 | |
| [  ]   - All Races have at least one possible start locations
 | |
| [  ]   - The whole world should have one fallback start location (Tree of
 | |
|            Memories?)
 | |
| 
 | |
| [  ] * Housing system should automatically expand towns (this will be fun to
 | |
| 	 write).  Maybe a better alternative is to check for free housing and
 | |
|          if the amount goes too low, manually create some new one.
 | |
| [  ]   - Housing can be decorated with different objects ('decoration' item
 | |
|            flag; can not exceed a maximum number, depending on house size).
 | |
| [  ]   - Houses get untidy over time, so they need to be cleaned
 | |
| [  ]   - House maids (for cleaning, and maybe basic cooking)
 | |
| [  ]   - Houses have a fix price
 | |
| [  ]   - Locks
 | |
| [  ]     . Locks of houses not visited occasionally get more and more rusty,
 | |
| 	     making it easier to break into them. Burglars can take whatever
 | |
|              they want!
 | |
| [  ]     . Locks decompose after a given time, making the house door openable
 | |
|              and the house accessible to anyone
 | |
| [  ]     . Fixing the lock requires Mechanics after a given amount of condition
 | |
|              loss, otherwise a small amount of oil helps
 | |
| [  ]     . Unowned houses' locks are maintained regularly
 | |
| [  ]     . Houses must be bought, players can't just occupy an abandoned one
 | |
| 	     (or can they? Funny decision to make, maybe it will be
 | |
| 	     configurable instead). Abandoned houses instead get occupied by
 | |
|              town guards, and are sold again after a given time.
 | |
| 
 | |
| [  ] * Inn and Tavern system
 | |
| [  ]   - Characters can set their hometown in an Inn; however, Inns have only a
 | |
|            limited amount of rooms. Inn rooms cost some amount of gold per day,
 | |
| 	   which is pre-paid. If the rent is over, the character's start
 | |
| 	   location is set to one of the racial defaults. If the character is
 | |
| 	   online when the rent is over, they should get a warning message
 | |
| 	   about this. If the player gets an own house, their home location
 | |
|            should be automatically set to it
 | |
| [  ]   - Tavern system
 | |
| [  ]     . Tables and chairs
 | |
| [  ]     . Tables are private chat rooms with a maximum number of members
 | |
| [  ]     . Each tavern has a fixed amount of tables and chairs
 | |
| [  ]     . Chairs can be moved from one table to another
 | |
| [  ]     . Tables have a maximum number of chairs (which may vary depending on
 | |
|              the table's size)
 | |
| 
 | |
| [  ] * Item disposal methods
 | |
| [  ]   - Drop (DROP <item>)
 | |
| 	   Dropped items don't generate points, nor money. They also get the
 | |
| 	   dropped flag, so they loose some (most) of their property bonuses
 | |
|            unless their original owner picks them up
 | |
| [  ]   - Donation (DONATE <item>)
 | |
| 	   Donated items automatically appear in the nearest donation room (or
 | |
| 	   random, maybe). Donations are recorded, and the characters who
 | |
| 	   donate in larger amounts and/or more valuable items may get rewards
 | |
| 	   for public service. Items dropped in donation centers also count as
 | |
|            donated
 | |
| [  ]   - Sacrifice (SACRIFICE <item> [to] <god>)
 | |
| 	   Sacrificed items become energy, which the Gods retun as Sacrifice
 | |
|            Points
 | |
| [  ]   - Salvage (SALVAGE <item>)
 | |
| 	   Most items can be salvaged to get some raw materials back. Of
 | |
| 	   course, it is way less than the original amount required to craft
 | |
|            the item. Salvaging may require tools.
 | |
| [  ]   - Auction (AUCTION <item>)
 | |
|            Items can be auctioned at the Market Squares
 | |
| 
 | |
| [  ] * Item creation (AKA combining or Professions)
 | |
| [  ]   - Trainers, who know only specific recipes
 | |
| [  ]   - Recipe scrolls (e.g to be dropped by mobs and such)
 | |
| [  ]   - Corpse skinning (only specific corpses)
 | |
| [  ]   - Corpse butching (only specific corpses)
 | |
| [  ]   - Fishing
 | |
| [  ]   - Mining
 | |
| [  ]   - Foraging
 | |
| [  ]   - Blacksmithing
 | |
| [  ]   - Alchemy
 | |
| 
 | |
| [  ] * Companions
 | |
| [  ]   - Combat/Pack animals
 | |
| [  ]   - Mounts (may also act as combat/pack animals)
 | |
| [  ]   - Charming
 | |
| [  ]   - Servants, pages
 | |
| 
 | |
| [  ] * Gods
 | |
| [  ]   - Gods may be chosen upon character creation (for wMUD, a character MUST
 | |
|          have at least two Gods in Iminiru. Amount should be configurable)
 | |
| [  ]   - Sacrifices
 | |
| [  ]   - Prayers
 | |
| 
 | |
| [  ] * Reputation system
 | |
| 
 | |
| [  ] * Player Clans
 | |
| [  ]   - Clan bank
 | |
| [  ]   - Clan wars (Players from a Guild may PK players from another Guild if
 | |
|            the two Guilds are in war with each other)
 | |
| 
 | |
| [  ] * Item types
 | |
| [  ]   - Armour/Clothing
 | |
| [  ]      . Shields
 | |
| [  ]   - Weapon
 | |
| [  ]     . Ballista
 | |
| [  ]     . Bashing
 | |
| [  ]     . Bow
 | |
| [  ]     . Crossbow
 | |
| [  ]     . Club
 | |
| [  ]     . Knuckle
 | |
| [  ]     . Lash
 | |
| [  ]     . Net
 | |
| [  ]     . Piercing
 | |
| [  ]     . Slashing
 | |
| [  ]     . Whip
 | |
| [  ]   - Potion
 | |
| [  ]   - Poison (appliable to weapons)
 | |
| [  ]   - Food/Water/Alcohol/Sugar
 | |
| [  ]   - Light
 | |
| [  ]   - Spell reagent
 | |
| [  ]   - Material
 | |
| [  ]   - Artifacts
 | |
| [  ]   - Containers
 | |
| [  ]     . Bags
 | |
| [  ]     . Chests
 | |
| 
 | |
| [  ] * Death system, Rebirth
 | |
| 
 | |
| [  ] * War Machines
 | |
| 
 | |
| [  ] * Shops
 | |
| [  ]   - Most shops should open/close depending on the in-game time
 | |
| 
 | |
| [  ] * Skills/Spells/Talents granted by the Gods
 | |
| [  ]   - Fear
 | |
| 
 | |
| [  ] * Magic Profession
 | |
| 
 | |
| [  ] * Fighting Professions with practicing
 | |
| [  ]   - Disarm
 | |
| [  ]   - Dual Wield
 | |
| [  ]   - Stun
 | |
| 
 | |
| [  ] * The whole system should be built with class support, although wMUD will
 | |
| 	 technically have only one "Adventurer" class. Also, multiclassing
 | |
|          should be possible
 | |
| 
 | |
| [  ] * Character aging, with racial maximum age. When a character is too old,
 | |
| 	 they can retire (e.g they will become story tellers or such), or die
 | |
| 	 and rebirth.  Reborn characters have a bonus to their maximum age.
 | |
| 	 Upon rebirth they create a totally new character, with all their old
 | |
| 	 data remaining in the database. Reborn characters have the possibility
 | |
|          to regain all their old powers after a few years
 | |
| 
 | |
| [  ] * Quests
 | |
| [  ]   - Quests given by NPCs
 | |
| [  ]   - Player creatable quests
 | |
| [  ]   - Character bounty, which can be placed by other characters for a fee
 | |
|            (should be enabled per world), or NPCs.
 | |
| 
 | |
| [  ] * In-game chat (whisper, say, shout, emotes, group/party, guild). Guild
 | |
| 	 chat should be accessible without entering the game (from the
 | |
| 	 Circle-like main menu), or even via IRC or something like that
 | |
| 
 | |
| [  ] * Speedwalking?
 | |
| 
 | |
| [  ] * Arenas
 | |
| 
 | |
| [  ] * Mercy mob flag: mobs will stop attacking if their enemy is unable to
 | |
|          fight any more
 | |
| 
 | |
| [  ] * Mobs should be able to wear/wield items, have an inventory, have Skills,
 | |
|          Spells and Talents
 | |
| 
 | |
| [  ] * Sneaking, thieving, robbery
 | |
| [  ]   - A mob may steal stuff from you, you may detect it, and maybe able to
 | |
| 	   catch it and get your stuff back. However, killing them in a city
 | |
|            may result in punishment by the guards.
 | |
| [  ]   - Player killing/thieving should be enabled/disabled per world
 | |
| 
 | |
| [  ] * Gossips
 | |
| [  ]   - Bragging NPCs: if a character gets killed by a specific NPCs, those
 | |
|            NPCs will humiliate that character for a while
 | |
| 
 | |
| [  ] * Weapon USE: wielded weapons may do something (like cast spells or such)
 | |
| 	 if a specific attribute is set. The item spell should recharge over
 | |
|          time, or recharge upon a specific condition
 | |
| 
 | |
| [  ] * Money (with the possibility to create several money types, like
 | |
|          different currencies for different Races or Countries)
 | |
| [  ]   - Money has weight
 | |
| 
 | |
| [  ] * Banks
 | |
| [  ]   - Money deposit (with interest in some banks)
 | |
| [  ]   - Storage, for a fee
 | |
| [  ]   - Loans
 | |
| 
 | |
| [  ] * All looted items should be used in some way or another. Sacrifice is a
 | |
| 	 common way, but some items may be milled (e.g bones and herbs) or
 | |
| 	 disassembled (e.g Mechanics objects or armour), others may be used as
 | |
| 	 raw materials. Extracted body parts (e.g blood or meat) should
 | |
| 	 decompose over time, even in an inventory, unless put in a special
 | |
|          container
 | |
| 
 | |
| [  ] * Object affects and attribute modifiers, like an earring which make the
 | |
| 	 character deaf. These affects may be hidden, and even delayed (e.g the
 | |
| 	 character puts on the earring that gives a high amount of charisma,
 | |
| 	 but after wearing it for a specific time, they will become deaf, and
 | |
| 	 they will have no idea what caused it. The same object can also be
 | |
| 	 cursed, so it cannot be removed except by some professional magicians
 | |
| 
 | |
| [  ] * Item modifiers, like sharpening stones
 | |
| 
 | |
| [  ] * Item durability. Items must have a Profession and a Profession Level
 | |
|          associated to them to show who can repair it
 | |
| 
 | |
| [  ] * Mob glowing (e.g they will be unable to sneak)
 | |
| 
 | |
| [  ] * Polls
 | |
| 
 | |
| [  ] * Configurable prompt
 | |
| 
 | |
| [  ] * Marriage?
 | |
| 
 | |
| [  ] * Character titles, which can be rewards for quests, or be bought for a
 | |
|          high amount of money
 | |
| 
 | |
| [  ] * Spirit world
 | |
| [  ]   - Some rooms (at least one) should be marked as Spirit World. Upon
 | |
| 	   death, characters get the DEAD flag, and get to this room. They must
 | |
| 	   find their way to remove the DEAD flag, and/or find a way back to
 | |
|            the real world.
 | |
| 
 | |
| [  ] * Blood may remain on the floor during a fight (even without a kill)
 | |
| 
 | |
| [  ] * Special rooms
 | |
| [  ]   - Death trap rooms
 | |
| [  ]   - Regeneration rooms
 | |
| [  ]   - Teleportation objects (portal machines) and rooms (elevators)
 | |
| 
 | |
| [  ] * Languages
 | |
| 
 | |
| [  ] * Books
 | |
| 
 | |
| [  ] * Rivers should have some kind of a current. If you get into a river (even
 | |
|          on a boat, or by swimming), it will move you automatically somewhere
 | |
| 
 | |
| [  ] * Gambling (may be illegal in some towns ;) )
 | |
| 
 | |
| [  ] * Guides that can be payed for. E.g in a big city, a guide can lead you to
 | |
|          the Inn, or something like that for a small fee.
 | |
| 
 | |
| [  ] * Automatically hiding/appearing exits (e.g to create mazes or to hide
 | |
|          stuff)
 | |
| 
 | |
| [  ] * Mailing
 | |
| 
 | |
| [  ] * Abilities
 | |
| [  ]   - Rolled upon character creation
 | |
| [  ]   - May be trained (ability training may be enabled/disabled system wide)
 | |
| [  ]   - There should be a racial maximum
 | |
| [  ]   - May be modified by affections and worn items
 | |
| [  ]   - May increase/decrease with age
 | |
| 
 | |
| [  ] * Tattoes, scars, piercings, etc.
 | |
| 
 | |
| Commands
 | |
| --------
 | |
| 
 | |
| [  ] * Commands already defined in Zim Wiki:
 | |
| [  ]   - DROP
 | |
| [  ]   - GET
 | |
| [  ]   - PRACISE/PRACTICE
 | |
| [  ]   - PRAY
 | |
| [  ]   - RECALL
 | |
| 	   Take back the character to their house, or the Inn room they have
 | |
| 	   rented. Specific rooms may have a flag so there must be no recall
 | |
| 	   from them (this should also mean that upon logout/login, the
 | |
|            character will get back to this room)
 | |
| [  ]   - SURVEY
 | |
| [  ]   - TALE
 | |
| 
 | |
| [  ] * Commands that should be present
 | |
| [  ]   - AFFECTS
 | |
| 	   Shows all the spells that affects the character (spell name, apply
 | |
|            count, duration, applier name)
 | |
| [  ]   - SCORE
 | |
|            Shows the player's statistics
 | |
| [  ]   - INVENTORY
 | |
|            Shows the character's inventory
 | |
| [  ]   - EQUIPMENT
 | |
|            Shows the equipped items
 | |
| [  ]   - LOOK
 | |
| [  ]   - EXITS
 | |
| [  ]   - EXAMINE should be an alias to LOOK, except it should work only on objects
 | |
| [  ]   - CONSIDER
 | |
| [  ]   - SET
 | |
| [  ]     . AUTOLOOT    [OFF]
 | |
| [  ]     . AUTOSKIN    [OFF]
 | |
| [  ]     . AUTODRAIN   [OFF]
 | |
| [  ]     . AUTOSPLIT   [OFF]
 | |
| [  ]     . AUTOEXIT    [ON ]
 | |
| [  ]     . COLOR       [ON ]
 | |
| [  ]     . AUTOLOOK    [ON ]
 | |
| [  ]     . WIMPY       [OFF]
 | |
| [  ]     . AUTOCONSUME [OFF]
 | |
| 	     (To automatically consume food and drink when hungry/thirsty)
 | |
| [  ]     . GROUPINV    [ON ]
 | |
| [  ]     . PAGELENGTH  [30 ]
 | |
| [  ]   - BURY/DIG
 | |
| [  ]   - EQUIP/WIELD
 | |
| [  ]   - IGNORE/UNIGNORE
 | |
| [  ]   - WHO/WHOIS
 | |
| [  ]   - QUIT
 | |
|            Exits the game
 | |
| [  ]   - LOGOUT
 | |
|            Goes back to the intro menu
 | |
| [  ]   - USE
 | |
| 	   Use objects in hand (map, weapons with spells, etc.), or in room
 | |
|            (buttons, levers, etc.)
 | |
| 
 | |
| Materia Magica command list
 | |
| ---------------------------
 | |
| 
 | |
| $ = gold
 | |
| . = shout
 | |
| / = chat
 | |
| ; = formtalk
 | |
| ? = help
 | |
| 
 | |
| away affects affected auction align alias alliance bury build backstab bash
 | |
| breathe bank cast channels combat ctf clear cls commands consider chat clan
 | |
| clantalk ct close charge chess changes credits class challenge description
 | |
| donate dream dig drink drop disarm dismount effects evoke equipment examine
 | |
| enter extinguish emote eat empty equip fill feed flee friends faction formation
 | |
| ft feign get gold give grab grapple guide gohome hitch help hold herald hint
 | |
| hide history home inventory invoke ignore kill kick knock look light levels
 | |
| lock locker lay mix memorize mail marks mount news novice notify order open
 | |
| practice pktalk pray pick put pull push play protocols page quest quit rest
 | |
| read report rules relay reply remove run recall rewardunit religion raise snare
 | |
| sit stand sweep score socials skills scan survey say sayto shop shout search
 | |
| sacrifice set sleep sneak ship steal shift slit strike tell tag time termreset
 | |
| typo title turn take throw track train unhitch use unequip unlock vendor
 | |
| visible version wield who whisper weather wimpy wear write wake where yell
 | |
| 
 | |
| CircleMUD commands
 | |
| ------------------
 | |
| 
 | |
| { "north"    , POS_STANDING, do_move     , 0, SCMD_NORTH },
 | |
| { "east"     , POS_STANDING, do_move     , 0, SCMD_EAST },
 | |
| { "south"    , POS_STANDING, do_move     , 0, SCMD_SOUTH },
 | |
| { "west"     , POS_STANDING, do_move     , 0, SCMD_WEST },
 | |
| { "up"       , POS_STANDING, do_move     , 0, SCMD_UP },
 | |
| { "down"     , POS_STANDING, do_move     , 0, SCMD_DOWN },
 | |
| { "at"       , POS_DEAD    , do_at       , LVL_IMMORT, 0 },
 | |
| { "advance"  , POS_DEAD    , do_advance  , LVL_IMPL, 0 },
 | |
| { "alias"    , POS_DEAD    , do_alias    , 0, 0 },
 | |
| { "accuse"   , POS_SITTING , do_action   , 0, 0 },
 | |
| { "applaud"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "assist"   , POS_FIGHTING, do_assist   , 1, 0 },
 | |
| { "ask"      , POS_RESTING , do_spec_comm, 0, SCMD_ASK },
 | |
| { "auction"  , POS_SLEEPING, do_gen_comm , 0, SCMD_AUCTION },
 | |
| { "autoexit" , POS_DEAD    , do_gen_tog  , 0, SCMD_AUTOEXIT },
 | |
| { "autoloot" , POS_DEAD    , do_gen_tog  , 0, SCMD_AUTOLOOT },
 | |
| { "autodrain", POS_DEAD    , do_gen_tog  , 0, SCMD_AUTODRAIN },
 | |
| { "bounce"   , POS_STANDING, do_action   , 0, 0 },
 | |
| { "backstab" , POS_STANDING, do_backstab , 1, 0 },
 | |
| { "ban"      , POS_DEAD    , do_ban      , LVL_GRGOD, 0 },
 | |
| { "balance"  , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "bash"     , POS_FIGHTING, do_bash     , 1, 0 },
 | |
| { "beg"      , POS_RESTING , do_action   , 0, 0 },
 | |
| { "bleed"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "blush"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "bow"      , POS_STANDING, do_action   , 0, 0 },
 | |
| { "brb"      , POS_RESTING , do_action   , 0, 0 },
 | |
| { "brief"    , POS_DEAD    , do_gen_tog  , 0, SCMD_BRIEF },
 | |
| { "burp"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "bury"     , POS_STANDING, do_bury     , 0, 0 },
 | |
| { "buy"      , POS_STANDING, do_not_here , 0, 0 },
 | |
| { "bug"      , POS_DEAD    , do_gen_write, 0, SCMD_BUG },
 | |
| { "cast"     , POS_SITTING , do_cast     , 1, 0 },
 | |
| { "cackle"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "check"    , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "chuckle"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "clap"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "clear"    , POS_DEAD    , do_gen_ps   , 0, SCMD_CLEAR },
 | |
| { "close"    , POS_SITTING , do_gen_door , 0, SCMD_CLOSE },
 | |
| { "cls"      , POS_DEAD    , do_gen_ps   , 0, SCMD_CLEAR },
 | |
| { "consider" , POS_RESTING , do_consider , 0, 0 },
 | |
| { "color"    , POS_DEAD    , do_color    , 0, 0 },
 | |
| { "comfort"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "comb"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "commands" , POS_DEAD    , do_commands , 0, SCMD_COMMANDS },
 | |
| { "compact"  , POS_DEAD    , do_gen_tog  , 0, SCMD_COMPACT },
 | |
| { "cough"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "credits"  , POS_DEAD    , do_gen_ps   , 0, SCMD_CREDITS },
 | |
| { "cringe"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "cry"      , POS_RESTING , do_action   , 0, 0 },
 | |
| { "cuddle"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "curse"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "curtsey"  , POS_STANDING, do_action   , 0, 0 },
 | |
| { "dance"    , POS_STANDING, do_action   , 0, 0 },
 | |
| { "date"     , POS_DEAD    , do_date     , LVL_IMMORT, SCMD_DATE },
 | |
| { "daydream" , POS_SLEEPING, do_action   , 0, 0 },
 | |
| { "dc"       , POS_DEAD    , do_dc       , LVL_GOD, 0 },
 | |
| { "deposit"  , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "diagnose" , POS_RESTING , do_diagnose , 0, 0 },
 | |
| { "dig"      , POS_STANDING, do_dig      , 0, 0 },
 | |
| { "display"  , POS_DEAD    , do_display  , 0, 0 },
 | |
| { "donate"   , POS_RESTING , do_drop     , 0, SCMD_DONATE },
 | |
| { "drain"    , POS_STANDING, do_drain    , 0, 0 },
 | |
| { "drink"    , POS_RESTING , do_drink    , 0, SCMD_DRINK },
 | |
| { "drop"     , POS_RESTING , do_drop     , 0, SCMD_DROP },
 | |
| { "drool"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "eat"      , POS_RESTING , do_eat      , 0, SCMD_EAT },
 | |
| { "echo"     , POS_SLEEPING, do_echo     , LVL_IMMORT, SCMD_ECHO },
 | |
| { "emote"    , POS_RESTING , do_echo     , 1, SCMD_EMOTE },
 | |
| { ":"        , POS_RESTING, do_echo      , 1, SCMD_EMOTE },
 | |
| { "embrace"  , POS_STANDING, do_action   , 0, 0 },
 | |
| { "enter"    , POS_STANDING, do_enter    , 0, 0 },
 | |
| { "equipment", POS_SLEEPING, do_equipment, 0, 0 },
 | |
| { "exits"    , POS_RESTING , do_exits    , 0, 0 },
 | |
| { "examine"  , POS_SITTING , do_examine  , 0, 0 },
 | |
| { "force"    , POS_SLEEPING, do_force    , LVL_GOD, 0 },
 | |
| { "fart"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "fill"     , POS_STANDING, do_pour     , 0, SCMD_FILL },
 | |
| { "flee"     , POS_FIGHTING, do_flee     , 1, 0 },
 | |
| { "flip"     , POS_STANDING, do_action   , 0, 0 },
 | |
| { "flirt"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "follow"   , POS_RESTING , do_follow   , 0, 0 },
 | |
| { "fondle"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "freeze"   , POS_DEAD    , do_wizutil  , LVL_FREEZE, SCMD_FREEZE },
 | |
| { "french"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "frown"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "fume"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "get"      , POS_RESTING , do_get      , 0, 0 },
 | |
| { "gasp"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "gecho"    , POS_DEAD    , do_gecho    , LVL_GOD, 0 },
 | |
| { "give"     , POS_RESTING , do_give     , 0, 0 },
 | |
| { "giggle"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "glare"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "goto"     , POS_SLEEPING, do_goto     , LVL_IMMORT, 0 },
 | |
| { "gold"     , POS_RESTING , do_gold     , 0, 0 },
 | |
| { "gossip"   , POS_SLEEPING, do_gen_comm , 0, SCMD_GOSSIP },
 | |
| { "group"    , POS_RESTING , do_group    , 1, 0 },
 | |
| { "grab"     , POS_RESTING , do_grab     , 0, 0 },
 | |
| { "grats"    , POS_SLEEPING, do_gen_comm , 0, SCMD_GRATZ },
 | |
| { "greet"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "grin"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "groan"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "grope"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "grovel"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "growl"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "gsay"     , POS_SLEEPING, do_gsay     , 0, 0 },
 | |
| { "gtell"    , POS_SLEEPING, do_gsay     , 0, 0 },
 | |
| { "help"     , POS_DEAD    , do_help     , 0, 0 },
 | |
| { "handbook" , POS_DEAD    , do_gen_ps   , LVL_IMMORT, SCMD_HANDBOOK },
 | |
| { "hcontrol" , POS_DEAD    , do_hcontrol , LVL_GRGOD, 0 },
 | |
| { "hiccup"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "hide"     , POS_RESTING , do_hide     , 1, 0 },
 | |
| { "hit"      , POS_FIGHTING, do_hit      , 0, SCMD_HIT },
 | |
| { "hold"     , POS_RESTING , do_grab     , 1, 0 },
 | |
| { "holler"   , POS_RESTING , do_gen_comm , 1, SCMD_HOLLER },
 | |
| { "holylight", POS_DEAD    , do_gen_tog  , LVL_IMMORT, SCMD_HOLYLIGHT },
 | |
| { "hop"      , POS_RESTING , do_action   , 0, 0 },
 | |
| { "house"    , POS_RESTING , do_house    , 0, 0 },
 | |
| { "hug"      , POS_RESTING , do_action   , 0, 0 },
 | |
| { "inventory", POS_DEAD    , do_inventory, 0, 0 },
 | |
| { "idea"     , POS_DEAD    , do_gen_write, 0, SCMD_IDEA },
 | |
| { "imotd"    , POS_DEAD    , do_gen_ps   , LVL_IMMORT, SCMD_IMOTD },
 | |
| { "immlist"  , POS_DEAD    , do_gen_ps   , 0, SCMD_IMMLIST },
 | |
| { "info"     , POS_SLEEPING, do_gen_ps   , 0, SCMD_INFO },
 | |
| { "insult"   , POS_RESTING , do_insult   , 0, 0 },
 | |
| { "invis"    , POS_DEAD    , do_invis    , LVL_IMMORT, 0 },
 | |
| { "junk"     , POS_RESTING , do_drop     , 0, SCMD_JUNK },
 | |
| { "kill"     , POS_FIGHTING, do_kill     , 0, 0 },
 | |
| { "kick"     , POS_FIGHTING, do_kick     , 1, 0 },
 | |
| { "kiss"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "look"     , POS_RESTING , do_look     , 0, SCMD_LOOK },
 | |
| { "laugh"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "last"     , POS_DEAD    , do_last     , LVL_GOD, 0 },
 | |
| { "leave"    , POS_STANDING, do_leave    , 0, 0 },
 | |
| { "levels"   , POS_DEAD    , do_levels   , 0, 0 },
 | |
| { "list"     , POS_STANDING, do_not_here , 0, 0 },
 | |
| { "lick"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "lock"     , POS_SITTING , do_gen_door , 0, SCMD_LOCK },
 | |
| { "load"     , POS_DEAD    , do_load     , LVL_GOD, 0 },
 | |
| { "love"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "moan"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "motd"     , POS_DEAD    , do_gen_ps   , 0, SCMD_MOTD },
 | |
| { "mail"     , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "massage"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "mute"     , POS_DEAD    , do_wizutil  , LVL_GOD, SCMD_SQUELCH },
 | |
| { "murder"   , POS_FIGHTING, do_hit      , 0, SCMD_MURDER },
 | |
| { "news"     , POS_SLEEPING, do_gen_ps   , 0, SCMD_NEWS },
 | |
| { "nibble"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "nod"      , POS_RESTING , do_action   , 0, 0 },
 | |
| { "noauction", POS_DEAD    , do_gen_tog  , 0, SCMD_NOAUCTION },
 | |
| { "nogossip" , POS_DEAD    , do_gen_tog  , 0, SCMD_NOGOSSIP },
 | |
| { "nograts"  , POS_DEAD    , do_gen_tog  , 0, SCMD_NOGRATZ },
 | |
| { "nohassle" , POS_DEAD    , do_gen_tog  , LVL_IMMORT, SCMD_NOHASSLE },
 | |
| { "norepeat" , POS_DEAD    , do_gen_tog  , 0, SCMD_NOREPEAT },
 | |
| { "noshout"  , POS_SLEEPING, do_gen_tog  , 1, SCMD_DEAF },
 | |
| { "nosummon" , POS_DEAD    , do_gen_tog  , 1, SCMD_NOSUMMON },
 | |
| { "notell"   , POS_DEAD    , do_gen_tog  , 1, SCMD_NOTELL },
 | |
| { "notitle"  , POS_DEAD    , do_wizutil  , LVL_GOD, SCMD_NOTITLE },
 | |
| { "nowiz"    , POS_DEAD    , do_gen_tog  , LVL_IMMORT, SCMD_NOWIZ },
 | |
| { "nudge"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "nuzzle"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "olc"      , POS_DEAD    , do_olc      , LVL_IMPL, 0 },
 | |
| { "order"    , POS_RESTING , do_order    , 1, 0 },
 | |
| { "offer"    , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "open"     , POS_SITTING , do_gen_door , 0, SCMD_OPEN },
 | |
| { "put"      , POS_RESTING , do_put      , 0, 0 },
 | |
| { "pat"      , POS_RESTING , do_action   , 0, 0 },
 | |
| { "page"     , POS_DEAD    , do_page     , LVL_GOD, 0 },
 | |
| { "pardon"   , POS_DEAD    , do_wizutil  , LVL_GOD, SCMD_PARDON },
 | |
| { "peer"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "pick"     , POS_STANDING, do_gen_door , 1, SCMD_PICK },
 | |
| { "point"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "poke"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "policy"   , POS_DEAD    , do_gen_ps   , 0, SCMD_POLICIES },
 | |
| { "ponder"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "poofin"   , POS_DEAD    , do_poofset  , LVL_IMMORT, SCMD_POOFIN },
 | |
| { "poofout"  , POS_DEAD    , do_poofset  , LVL_IMMORT, SCMD_POOFOUT },
 | |
| { "pour"     , POS_STANDING, do_pour     , 0, SCMD_POUR },
 | |
| { "pout"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "prompt"   , POS_DEAD    , do_display  , 0, 0 },
 | |
| { "practice" , POS_RESTING , do_practice , 1, 0 },
 | |
| { "pray"     , POS_SITTING , do_action   , 0, 0 },
 | |
| { "puke"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "punch"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "purr"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "purge"    , POS_DEAD    , do_purge    , LVL_GOD, 0 },
 | |
| { "quaff"    , POS_RESTING , do_use      , 0, SCMD_QUAFF },
 | |
| { "qecho"    , POS_DEAD    , do_qcomm    , LVL_IMMORT, SCMD_QECHO },
 | |
| { "quest"    , POS_DEAD    , do_gen_tog  , 0, SCMD_QUEST },
 | |
| { "qui"      , POS_DEAD    , do_quit     , 0, 0 },
 | |
| { "quit"     , POS_DEAD    , do_quit     , 0, SCMD_QUIT },
 | |
| { "qsay"     , POS_RESTING , do_qcomm    , 0, SCMD_QSAY },
 | |
| { "reply"    , POS_SLEEPING, do_reply    , 0, 0 },
 | |
| { "rest"     , POS_RESTING , do_rest     , 0, 0 },
 | |
| { "read"     , POS_RESTING , do_look     , 0, SCMD_READ },
 | |
| { "reload"   , POS_DEAD    , do_reboot   , LVL_IMPL, 0 },
 | |
| { "recite"   , POS_RESTING , do_use      , 0, SCMD_RECITE },
 | |
| { "receive"  , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "remove"   , POS_RESTING , do_remove   , 0, 0 },
 | |
| { "rent"     , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "report"   , POS_RESTING , do_report   , 0, 0 },
 | |
| { "reroll"   , POS_DEAD    , do_wizutil  , LVL_GRGOD, SCMD_REROLL },
 | |
| { "rescue"   , POS_FIGHTING, do_rescue   , 1, 0 },
 | |
| { "restore"  , POS_DEAD    , do_restore  , LVL_GOD, 0 },
 | |
| { "return"   , POS_DEAD    , do_return   , 0, 0 },
 | |
| { "roll"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "roomflags", POS_DEAD    , do_gen_tog  , LVL_IMMORT, SCMD_ROOMFLAGS },
 | |
| { "ruffle"   , POS_STANDING, do_action   , 0, 0 },
 | |
| { "say"      , POS_RESTING , do_say      , 0, 0 },
 | |
| { "'"        , POS_RESTING , do_say      , 0, 0 },
 | |
| { "save"     , POS_SLEEPING, do_save     , 0, 0 },
 | |
| { "score"    , POS_DEAD    , do_score    , 0, 0 },
 | |
| { "scream"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "sell"     , POS_STANDING, do_not_here , 0, 0 },
 | |
| { "send"     , POS_SLEEPING, do_send     , LVL_GOD, 0 },
 | |
| { "set"      , POS_DEAD    , do_set      , LVL_GOD, 0 },
 | |
| { "shout"    , POS_RESTING , do_gen_comm , 0, SCMD_SHOUT },
 | |
| { "shake"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "shiver"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "show"     , POS_DEAD    , do_show     , LVL_IMMORT, 0 },
 | |
| { "shrug"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "shutdow"  , POS_DEAD    , do_shutdown , LVL_IMPL, 0 },
 | |
| { "shutdown" , POS_DEAD    , do_shutdown , LVL_IMPL, SCMD_SHUTDOWN },
 | |
| { "sigh"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "sing"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "sip"      , POS_RESTING , do_drink    , 0, SCMD_SIP },
 | |
| { "sit"      , POS_RESTING , do_sit      , 0, 0 },
 | |
| { "skillset" , POS_SLEEPING, do_skillset , LVL_GRGOD, 0 },
 | |
| { "sleep"    , POS_SLEEPING, do_sleep    , 0, 0 },
 | |
| { "slap"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "slowns"   , POS_DEAD    , do_gen_tog  , LVL_IMPL, SCMD_SLOWNS },
 | |
| { "smile"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "smirk"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "snicker"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "snap"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "snarl"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "sneeze"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "sneak"    , POS_STANDING, do_sneak    , 1, 0 },
 | |
| { "sniff"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "snore"    , POS_SLEEPING, do_action   , 0, 0 },
 | |
| { "snowball" , POS_STANDING, do_action   , LVL_IMMORT, 0 },
 | |
| { "snoop"    , POS_DEAD    , do_snoop    , LVL_GOD, 0 },
 | |
| { "snuggle"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "socials"  , POS_DEAD    , do_commands , 0, SCMD_SOCIALS },
 | |
| { "split"    , POS_SITTING , do_split    , 1, 0 },
 | |
| { "spank"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "spit"     , POS_STANDING, do_action   , 0, 0 },
 | |
| { "squeeze"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "stand"    , POS_RESTING , do_stand    , 0, 0 },
 | |
| { "stare"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "stat"     , POS_DEAD    , do_stat     , LVL_IMMORT, 0 },
 | |
| { "steal"    , POS_STANDING, do_steal    , 1, 0 },
 | |
| { "steam"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "stroke"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "strut"    , POS_STANDING, do_action   , 0, 0 },
 | |
| { "sulk"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "switch"   , POS_DEAD    , do_switch   , LVL_GRGOD, 0 },
 | |
| { "syslog"   , POS_DEAD    , do_syslog   , LVL_IMMORT, 0 },
 | |
| { "tell"     , POS_DEAD    , do_tell     , 0, 0 },
 | |
| { "tackle"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "take"     , POS_RESTING , do_get      , 0, 0 },
 | |
| { "tango"    , POS_STANDING, do_action   , 0, 0 },
 | |
| { "taunt"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "taste"    , POS_RESTING , do_eat      , 0, SCMD_TASTE },
 | |
| { "teleport" , POS_DEAD    , do_teleport , LVL_GOD, 0 },
 | |
| { "thank"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "think"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "thaw"     , POS_DEAD    , do_wizutil  , LVL_FREEZE, SCMD_THAW },
 | |
| { "title"    , POS_DEAD    , do_title    , 0, 0 },
 | |
| { "tickle"   , POS_RESTING , do_action   , 0, 0 },
 | |
| { "time"     , POS_DEAD    , do_time     , 0, 0 },
 | |
| { "toggle"   , POS_DEAD    , do_toggle   , 0, 0 },
 | |
| { "track"    , POS_STANDING, do_track    , 0, 0 },
 | |
| { "trackthru", POS_DEAD    , do_gen_tog  , LVL_IMPL, SCMD_TRACK },
 | |
| { "transfer" , POS_SLEEPING, do_trans    , LVL_GOD, 0 },
 | |
| { "twiddle"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "typo"     , POS_DEAD    , do_gen_write, 0, SCMD_TYPO },
 | |
| { "unlock"   , POS_SITTING , do_gen_door , 0, SCMD_UNLOCK },
 | |
| { "ungroup"  , POS_DEAD    , do_ungroup  , 0, 0 },
 | |
| { "unban"    , POS_DEAD    , do_unban    , LVL_GRGOD, 0 },
 | |
| { "unaffect" , POS_DEAD    , do_wizutil  , LVL_GOD, SCMD_UNAFFECT },
 | |
| { "uptime"   , POS_DEAD    , do_date     , LVL_IMMORT, SCMD_UPTIME },
 | |
| { "use"      , POS_SITTING , do_use      , 1, SCMD_USE },
 | |
| { "users"    , POS_DEAD    , do_users    , LVL_IMMORT, 0 },
 | |
| { "value"    , POS_STANDING, do_not_here , 0, 0 },
 | |
| { "version"  , POS_DEAD    , do_gen_ps   , 0, SCMD_VERSION },
 | |
| { "visible"  , POS_RESTING , do_visible  , 1, 0 },
 | |
| { "vnum"     , POS_DEAD    , do_vnum     , LVL_IMMORT, 0 },
 | |
| { "vstat"    , POS_DEAD    , do_vstat    , LVL_IMMORT, 0 },
 | |
| { "wake"     , POS_SLEEPING, do_wake     , 0, 0 },
 | |
| { "wave"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "wear"     , POS_RESTING , do_wear     , 0, 0 },
 | |
| { "weather"  , POS_RESTING , do_weather  , 0, 0 },
 | |
| { "who"      , POS_DEAD    , do_who      , 0, 0 },
 | |
| { "whoami"   , POS_DEAD    , do_gen_ps   , 0, SCMD_WHOAMI },
 | |
| { "where"    , POS_RESTING , do_where    , 1, 0 },
 | |
| { "whisper"  , POS_RESTING , do_spec_comm, 0, SCMD_WHISPER },
 | |
| { "whine"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "whistle"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "wield"    , POS_RESTING , do_wield    , 0, 0 },
 | |
| { "wiggle"   , POS_STANDING, do_action   , 0, 0 },
 | |
| { "wimpy"    , POS_DEAD    , do_wimpy    , 0, 0 },
 | |
| { "wink"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "withdraw" , POS_STANDING, do_not_here , 1, 0 },
 | |
| { "wiznet"   , POS_DEAD    , do_wiznet   , LVL_IMMORT, 0 },
 | |
| { ";"        , POS_DEAD    , do_wiznet   , LVL_IMMORT, 0 },
 | |
| { "wizhelp"  , POS_SLEEPING, do_commands , LVL_IMMORT, SCMD_WIZHELP },
 | |
| { "wizlist"  , POS_DEAD    , do_gen_ps   , 0, SCMD_WIZLIST },
 | |
| { "wizlock"  , POS_DEAD    , do_wizlock  , LVL_IMPL, 0 },
 | |
| { "worship"  , POS_RESTING , do_action   , 0, 0 },
 | |
| { "write"    , POS_STANDING, do_write    , 1, 0 },
 | |
| { "yawn"     , POS_RESTING , do_action   , 0, 0 },
 | |
| { "yodel"    , POS_RESTING , do_action   , 0, 0 },
 | |
| { "zreset"   , POS_DEAD    , do_zreset   , LVL_GRGOD, 0 },
 | |
| 
 | |
| const char *fill[] =
 | |
| {
 | |
|   "in",
 | |
|   "from",
 | |
|   "with",
 | |
|   "the",
 | |
|   "on",
 | |
|   "at",
 | |
|   "to",
 | |
|   "\n"
 | |
| };
 | |
| 
 | |
| const char *reserved[] =
 | |
| {
 | |
|   "a",
 | |
|   "an",
 | |
|   "self",
 | |
|   "me",
 | |
|   "all",
 | |
|   "room",
 | |
|   "someone",
 | |
|   "something",
 | |
|   "\n"
 | |
| };
 |