695 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			695 lines
		
	
	
		
			28 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
 | |
|   - 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
 | |
| 
 | |
| * Planets/Planes
 | |
|   - Rooms are connected to Planets
 | |
|   - Planets are connected to Planes
 | |
|   - Rooms may have different descriptions depending on the Plane the Character
 | |
|     is active on
 | |
| 
 | |
| * Player grouping (AKA Party)
 | |
| 
 | |
| * 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 should be decorated with different objects.
 | |
|   - Houses get untidy over time, so they need to be cleaned
 | |
|   - House maids
 | |
| 
 | |
| * 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
 | |
|       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
 | |
|       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
 | |
|   - Sacrifice
 | |
|       Sacrificed items become energy, which the Gods retun as Sacrifice Points.
 | |
|   - Salvage
 | |
|       Most items can be salvaged to get some raw materials back
 | |
|   - Auction
 | |
|       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)
 | |
|   - Sacrifices
 | |
|   - Prayers
 | |
| 
 | |
| * Reputation system
 | |
| 
 | |
| * Player Clans
 | |
|   o Clan bank
 | |
|   o 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
 | |
|     . Maybe these objects (or some of them) should be seen in the dark
 | |
|   - Spell reagent
 | |
|   - Material
 | |
|   - Artifacts
 | |
|   - Containers
 | |
|     . Bags
 | |
| 
 | |
| * 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
 | |
|   o Quests given by NPCs
 | |
|   o Player creatable quests
 | |
|   o 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)
 | |
| 
 | |
| * 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> arrives from <direction>
 | |
| 
 | |
| * 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
 | |
|   o Death trap rooms
 | |
|   o Regeneration rooms
 | |
|   o 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 should 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 to show all the spells that affects the character (spell name,
 | |
|     apply count, duration, applier name)
 | |
|   - SCORE to show the player's statistics
 | |
|   - INVENTORY to show the character's inventory
 | |
|   - EQUIPMENT to show the equipped items
 | |
|   - AUTOEXIT to toggle exit display on LOOK
 | |
|   - 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]
 | |
|     . 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 should exit the game
 | |
|   - LOGOUT should go back to intro menu
 | |
|   - USE may 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"
 | |
| };
 |