/** * @file command.c * * Command types, function prototypes, and maintenence routines. * * @author Geoff Davis <geoff@circlemudsquared.org> * @ingroup command * @license All rights reserved. See license.doc for complete information. * @package cs * @since v1.0 * * Copyright (C) 2006 Geoff Davis <geoff@circlemudsquared.org> * Greg Buxton <greg@circlemudsquared.org> * * Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. */ #define __COMMAND_C__ #include "structs.h" #include "utils.h" #include "comm.h" #include "command.h" #include "constants.h" #include "dao.h" #include "db.h" #include "interpreter.h" #include "log.h" /* * External variables. */ extern int no_specials; /* * External functions. */ socialData_t *find_action(const commandData_t *cmd); int special(charData_t *ch, const commandData_t *cmd, char *arg); /** * The ACMD table. * @ingroup command * @var const acmdData_t[] */ BEGIN_ACMD_REGISTRY(acmd_registry) REGISTER_ACMD(do_action) REGISTER_ACMD(do_advance) REGISTER_ACMD(do_alias) REGISTER_ACMD(do_appraise) REGISTER_ACMD(do_assist) REGISTER_ACMD(do_at) REGISTER_ACMD(do_authorize) REGISTER_ACMD(do_backstab) REGISTER_ACMD(do_ban) REGISTER_ACMD(do_bash) REGISTER_ACMD(do_buy) REGISTER_ACMD(do_cast) REGISTER_ACMD(do_color) REGISTER_ACMD(do_commands) REGISTER_ACMD(do_consider) REGISTER_ACMD(do_date) REGISTER_ACMD(do_dc) REGISTER_ACMD(do_diagnose) REGISTER_ACMD(do_display) REGISTER_ACMD(do_drink) REGISTER_ACMD(do_drop) REGISTER_ACMD(do_eat) REGISTER_ACMD(do_echo) REGISTER_ACMD(do_enter) REGISTER_ACMD(do_equipment) REGISTER_ACMD(do_examine) REGISTER_ACMD(do_exits) REGISTER_ACMD(do_flee) REGISTER_ACMD(do_follow) REGISTER_ACMD(do_force) REGISTER_ACMD(do_gecho) REGISTER_ACMD(do_gen_comm) REGISTER_ACMD(do_gen_door) REGISTER_ACMD(do_gen_ps) REGISTER_ACMD(do_gen_write) REGISTER_ACMD(do_get) REGISTER_ACMD(do_give) REGISTER_ACMD(do_gold) REGISTER_ACMD(do_goto) REGISTER_ACMD(do_grab) REGISTER_ACMD(do_group) REGISTER_ACMD(do_gsay) REGISTER_ACMD(do_hcontrol) REGISTER_ACMD(do_help) REGISTER_ACMD(do_hide) REGISTER_ACMD(do_hit) REGISTER_ACMD(do_house) REGISTER_ACMD(do_insult) REGISTER_ACMD(do_inventory) REGISTER_ACMD(do_invis) REGISTER_ACMD(do_kick) REGISTER_ACMD(do_kill) REGISTER_ACMD(do_last) REGISTER_ACMD(do_leave) REGISTER_ACMD(do_levels) REGISTER_ACMD(do_list) REGISTER_ACMD(do_load) REGISTER_ACMD(do_look) REGISTER_ACMD(do_move) REGISTER_ACMD(do_not_here) /* REGISTER_ACMD(do_olc) */ REGISTER_ACMD(do_order) REGISTER_ACMD(do_page) REGISTER_ACMD(do_poofset) REGISTER_ACMD(do_pour) REGISTER_ACMD(do_practice) REGISTER_ACMD(do_purge) REGISTER_ACMD(do_put) REGISTER_ACMD(do_qcomm) REGISTER_ACMD(do_quit) REGISTER_ACMD(do_reboot) REGISTER_ACMD(do_remove) REGISTER_ACMD(do_reply) REGISTER_ACMD(do_report) REGISTER_ACMD(do_rescue) REGISTER_ACMD(do_rest) REGISTER_ACMD(do_restore) REGISTER_ACMD(do_return) REGISTER_ACMD(do_save) REGISTER_ACMD(do_savecommands) REGISTER_ACMD(do_savezone) REGISTER_ACMD(do_say) REGISTER_ACMD(do_score) REGISTER_ACMD(do_sell) REGISTER_ACMD(do_send) REGISTER_ACMD(do_set) REGISTER_ACMD(do_show) REGISTER_ACMD(do_shutdown) REGISTER_ACMD(do_sit) REGISTER_ACMD(do_skillset) REGISTER_ACMD(do_sleep) REGISTER_ACMD(do_slowns) REGISTER_ACMD(do_sneak) REGISTER_ACMD(do_snoop) REGISTER_ACMD(do_spec_comm) REGISTER_ACMD(do_split) REGISTER_ACMD(do_stand) REGISTER_ACMD(do_stat) REGISTER_ACMD(do_steal) REGISTER_ACMD(do_switch) REGISTER_ACMD(do_syslog) REGISTER_ACMD(do_teleport) REGISTER_ACMD(do_tell) REGISTER_ACMD(do_time) REGISTER_ACMD(do_title) REGISTER_ACMD(do_toggle) REGISTER_ACMD(do_track) REGISTER_ACMD(do_trackthru) REGISTER_ACMD(do_trans) REGISTER_ACMD(do_unban) REGISTER_ACMD(do_ungroup) REGISTER_ACMD(do_use) REGISTER_ACMD(do_users) REGISTER_ACMD(do_visible) REGISTER_ACMD(do_vnum) REGISTER_ACMD(do_vstat) REGISTER_ACMD(do_wake) REGISTER_ACMD(do_wear) REGISTER_ACMD(do_weather) REGISTER_ACMD(do_where) REGISTER_ACMD(do_who) REGISTER_ACMD(do_wield) REGISTER_ACMD(do_wimpy) REGISTER_ACMD(do_wizlock) REGISTER_ACMD(do_wiznet) REGISTER_ACMD(do_wizutil) REGISTER_ACMD(do_write) REGISTER_ACMD(do_zreset) END_ACMD_REGISTRY(); /** * The master command table. * @ingroup command * @var const commandData_t[] */ const commandData_t cmd_info[] = { /* directions must come before other commands but after RESERVED */ { "north", POS_STANDING, do_move, AUTH_NONE }, { "east", POS_STANDING, do_move, AUTH_NONE }, { "south", POS_STANDING, do_move, AUTH_NONE }, { "west", POS_STANDING, do_move, AUTH_NONE }, { "up", POS_STANDING, do_move, AUTH_NONE }, { "down", POS_STANDING, do_move, AUTH_NONE }, /* A */ { "at", POS_DEAD, do_at, AUTH_WIZARD }, { "accuse", POS_SITTING, do_action, AUTH_NONE }, { "advance", POS_DEAD, do_advance, AUTH_OWNER }, { "alias", POS_DEAD, do_alias, AUTH_GUEST }, { "applaud", POS_RESTING, do_action, AUTH_NONE }, { "appraise", POS_STANDING, do_appraise, AUTH_GUEST }, { "ask", POS_RESTING, do_spec_comm, AUTH_NONE }, { "assist", POS_FIGHTING, do_assist, AUTH_PLAYER }, { "auction", POS_SLEEPING, do_gen_comm, AUTH_GUEST }, { "authorize",POS_DEAD, do_authorize, AUTH_OWNER }, /* B */ { "bounce", POS_STANDING, do_action, AUTH_NONE }, { "backstab", POS_STANDING, do_backstab, AUTH_PLAYER }, { "ban", POS_DEAD, do_ban, AUTH_OWNER }, { "balance", POS_STANDING, do_not_here, AUTH_PLAYER }, { "bash", POS_FIGHTING, do_bash, AUTH_PLAYER }, { "beg", POS_RESTING, do_action, AUTH_NONE }, { "bleed", POS_RESTING, do_action, AUTH_NONE }, { "blush", POS_RESTING, do_action, AUTH_NONE }, { "bow", POS_STANDING, do_action, AUTH_NONE }, { "brb", POS_RESTING, do_action, AUTH_NONE }, { "burp", POS_RESTING, do_action, AUTH_NONE }, { "buy", POS_STANDING, do_buy, AUTH_GUEST }, { "bug", POS_DEAD, do_gen_write, AUTH_GUEST }, /* C */ { "cast", POS_SITTING, do_cast, AUTH_PLAYER }, { "cackle", POS_RESTING, do_action, AUTH_NONE }, { "check", POS_STANDING, do_not_here, AUTH_PLAYER }, { "chuckle", POS_RESTING, do_action, AUTH_NONE }, { "clap", POS_RESTING, do_action, AUTH_NONE }, { "clear", POS_DEAD, do_gen_ps, AUTH_NONE }, { "close", POS_SITTING, do_gen_door, AUTH_NONE }, { "cls", POS_DEAD, do_gen_ps, AUTH_NONE }, { "consider", POS_RESTING, do_consider, AUTH_NONE }, { "color", POS_DEAD, do_color, AUTH_NONE }, { "comfort", POS_RESTING, do_action, AUTH_NONE }, { "comb", POS_RESTING, do_action, AUTH_NONE }, { "commands", POS_DEAD, do_commands, AUTH_NONE }, { "cough", POS_RESTING, do_action, AUTH_NONE }, { "credits", POS_DEAD, do_gen_ps, AUTH_NONE }, { "cringe", POS_RESTING, do_action, AUTH_NONE }, { "cry", POS_RESTING, do_action, AUTH_NONE }, { "cuddle", POS_RESTING, do_action, AUTH_NONE }, { "curse", POS_RESTING, do_action, AUTH_NONE }, { "curtsey", POS_STANDING, do_action, AUTH_NONE }, /* D */ { "dance", POS_STANDING, do_action, AUTH_NONE }, { "date", POS_DEAD, do_date, AUTH_WIZARD }, { "daydream", POS_SLEEPING, do_action, AUTH_NONE }, { "dc", POS_DEAD, do_dc, AUTH_WIZARD }, { "deposit", POS_STANDING, do_not_here, AUTH_PLAYER }, { "diagnose", POS_RESTING, do_diagnose, AUTH_NONE }, { "display", POS_DEAD, do_display, AUTH_NONE }, { "donate", POS_RESTING, do_drop, AUTH_NONE }, { "drink", POS_RESTING, do_drink, AUTH_NONE }, { "drop", POS_RESTING, do_drop, AUTH_NONE }, { "drool", POS_RESTING, do_action, AUTH_NONE }, /* E */ { "eat", POS_RESTING, do_eat, AUTH_NONE }, { "echo", POS_SLEEPING, do_echo, AUTH_WIZARD }, { "emote", POS_RESTING, do_echo, AUTH_PLAYER }, { ":", POS_RESTING, do_echo, AUTH_PLAYER }, { "embrace", POS_STANDING, do_action, AUTH_NONE }, { "enter", POS_STANDING, do_enter, AUTH_NONE }, { "equipment",POS_SLEEPING, do_equipment, AUTH_NONE }, { "exits", POS_RESTING, do_exits, AUTH_NONE }, { "examine", POS_SITTING, do_examine, AUTH_NONE }, /* F */ { "force", POS_SLEEPING, do_force, AUTH_WIZARD }, { "fart", POS_RESTING, do_action, AUTH_NONE }, { "fill", POS_STANDING, do_pour, AUTH_NONE }, { "flee", POS_FIGHTING, do_flee, AUTH_PLAYER }, { "flip", POS_STANDING, do_action, AUTH_NONE }, { "flirt", POS_RESTING, do_action, AUTH_NONE }, { "follow", POS_RESTING, do_follow, AUTH_NONE }, { "fondle", POS_RESTING, do_action, AUTH_NONE }, { "freeze", POS_DEAD, do_wizutil, AUTH_FREEZE }, { "french", POS_RESTING, do_action, AUTH_NONE }, { "frown", POS_RESTING, do_action, AUTH_NONE }, { "fume", POS_RESTING, do_action, AUTH_NONE }, /* G */ { "get" , POS_RESTING , do_get , AUTH_NONE }, { "gasp" , POS_RESTING , do_action , AUTH_NONE }, { "gecho" , POS_DEAD , do_gecho , AUTH_WIZARD }, { "give" , POS_RESTING , do_give , AUTH_NONE }, { "giggle" , POS_RESTING , do_action , AUTH_NONE }, { "glare" , POS_RESTING , do_action , AUTH_NONE }, { "goto" , POS_SLEEPING, do_goto , AUTH_WIZARD }, { "gold" , POS_RESTING , do_gold , AUTH_NONE }, { "gossip" , POS_SLEEPING, do_gen_comm , AUTH_NONE }, { "group" , POS_RESTING , do_group , AUTH_PLAYER }, { "grab" , POS_RESTING , do_grab , AUTH_NONE }, { "grats" , POS_SLEEPING, do_gen_comm , AUTH_NONE }, { "greet" , POS_RESTING , do_action , AUTH_NONE }, { "grin" , POS_RESTING , do_action , AUTH_NONE }, { "groan" , POS_RESTING , do_action , AUTH_NONE }, { "grope" , POS_RESTING , do_action , AUTH_NONE }, { "grovel" , POS_RESTING , do_action , AUTH_NONE }, { "growl" , POS_RESTING , do_action , AUTH_NONE }, { "gsay" , POS_SLEEPING, do_gsay , AUTH_NONE }, { "gtell" , POS_SLEEPING, do_gsay , AUTH_NONE }, { "help" , POS_DEAD , do_help , AUTH_NONE }, { "handbook" , POS_DEAD , do_gen_ps , AUTH_WIZARD }, { "hcontrol" , POS_DEAD , do_hcontrol , AUTH_OWNER }, { "hiccup" , POS_RESTING , do_action , AUTH_NONE }, { "hide" , POS_RESTING , do_hide , AUTH_PLAYER }, { "hit" , POS_FIGHTING, do_hit , AUTH_NONE }, { "hold" , POS_RESTING , do_grab , AUTH_PLAYER }, { "holler" , POS_RESTING , do_gen_comm , AUTH_PLAYER }, { "hop" , POS_RESTING , do_action , AUTH_NONE }, { "house" , POS_RESTING , do_house , AUTH_NONE }, { "hug" , POS_RESTING , do_action , AUTH_NONE }, { "inventory", POS_DEAD , do_inventory, AUTH_NONE }, { "idea" , POS_DEAD , do_gen_write, AUTH_NONE }, { "imotd" , POS_DEAD , do_gen_ps , AUTH_WIZARD }, { "immlist" , POS_DEAD , do_gen_ps , AUTH_NONE }, { "info" , POS_SLEEPING, do_gen_ps , AUTH_NONE }, { "insult" , POS_RESTING , do_insult , AUTH_NONE }, { "invis" , POS_DEAD , do_invis , AUTH_WIZARD }, { "junk" , POS_RESTING , do_drop , AUTH_NONE }, { "kill" , POS_FIGHTING, do_kill , AUTH_NONE }, { "kick" , POS_FIGHTING, do_kick , AUTH_PLAYER }, { "kiss" , POS_RESTING , do_action , AUTH_NONE }, { "look" , POS_RESTING , do_look , AUTH_NONE }, { "laugh" , POS_RESTING , do_action , AUTH_NONE }, { "last" , POS_DEAD , do_last , AUTH_WIZARD }, { "leave" , POS_STANDING, do_leave , AUTH_NONE }, { "levels" , POS_DEAD , do_levels , AUTH_NONE }, { "list" , POS_SITTING , do_list , AUTH_NONE }, { "lick" , POS_RESTING , do_action , AUTH_NONE }, { "lock" , POS_SITTING , do_gen_door , AUTH_NONE }, { "load" , POS_DEAD , do_load , AUTH_WIZARD }, { "love" , POS_RESTING , do_action , AUTH_NONE }, { "moan" , POS_RESTING , do_action , AUTH_NONE }, { "motd" , POS_DEAD , do_gen_ps , AUTH_NONE }, { "mail" , POS_STANDING, do_not_here , AUTH_PLAYER }, { "massage" , POS_RESTING , do_action , AUTH_NONE }, { "mute" , POS_DEAD , do_wizutil , AUTH_WIZARD }, { "murder" , POS_FIGHTING, do_hit , AUTH_NONE }, { "news" , POS_SLEEPING, do_gen_ps , AUTH_NONE }, { "nibble" , POS_RESTING , do_action , AUTH_NONE }, { "nod" , POS_RESTING , do_action , AUTH_NONE }, { "notitle" , POS_DEAD , do_wizutil , AUTH_WIZARD }, { "nudge" , POS_RESTING , do_action , AUTH_NONE }, { "nuzzle" , POS_RESTING , do_action , AUTH_NONE }, { "order" , POS_RESTING , do_order , AUTH_PLAYER }, { "offer" , POS_STANDING, do_not_here , AUTH_PLAYER }, { "open" , POS_SITTING , do_gen_door , AUTH_NONE }, { "put" , POS_RESTING , do_put , AUTH_NONE }, { "pat" , POS_RESTING , do_action , AUTH_NONE }, { "page" , POS_DEAD , do_page , AUTH_WIZARD }, { "pardon" , POS_DEAD , do_wizutil , AUTH_WIZARD }, { "peer" , POS_RESTING , do_action , AUTH_NONE }, { "pick" , POS_STANDING, do_gen_door , AUTH_PLAYER }, { "point" , POS_RESTING , do_action , AUTH_NONE }, { "poke" , POS_RESTING , do_action , AUTH_NONE }, { "policy" , POS_DEAD , do_gen_ps , AUTH_NONE }, { "ponder" , POS_RESTING , do_action , AUTH_NONE }, { "poofin" , POS_DEAD , do_poofset , AUTH_WIZARD }, { "poofout" , POS_DEAD , do_poofset , AUTH_WIZARD }, { "pour" , POS_STANDING, do_pour , AUTH_NONE }, { "pout" , POS_RESTING , do_action , AUTH_NONE }, { "prompt" , POS_DEAD , do_display , AUTH_NONE }, { "practice" , POS_RESTING , do_practice , AUTH_PLAYER }, { "pray" , POS_SITTING , do_action , AUTH_NONE }, { "puke" , POS_RESTING , do_action , AUTH_NONE }, { "punch" , POS_RESTING , do_action , AUTH_NONE }, { "purr" , POS_RESTING , do_action , AUTH_NONE }, { "purge" , POS_DEAD , do_purge , AUTH_WIZARD }, { "quaff" , POS_RESTING , do_use , AUTH_NONE }, { "qecho" , POS_DEAD , do_qcomm , AUTH_WIZARD }, { "qui" , POS_DEAD , do_quit , AUTH_NONE }, { "quit" , POS_DEAD , do_quit , AUTH_NONE }, { "qsay" , POS_RESTING , do_qcomm , AUTH_NONE }, { "reply" , POS_SLEEPING, do_reply , AUTH_NONE }, { "rest" , POS_RESTING , do_rest , AUTH_NONE }, { "read" , POS_RESTING , do_look , AUTH_NONE }, { "reload" , POS_DEAD , do_reboot , AUTH_OWNER }, { "recite" , POS_RESTING , do_use , AUTH_NONE }, { "receive" , POS_STANDING, do_not_here , AUTH_PLAYER }, { "remove" , POS_RESTING , do_remove , AUTH_NONE }, { "rent" , POS_STANDING, do_not_here , AUTH_PLAYER }, { "report" , POS_RESTING , do_report , AUTH_NONE }, { "reroll" , POS_DEAD , do_wizutil , AUTH_OWNER }, { "rescue" , POS_FIGHTING, do_rescue , AUTH_PLAYER }, { "restore" , POS_DEAD , do_restore , AUTH_WIZARD }, { "return" , POS_DEAD , do_return , AUTH_NONE }, { "roll" , POS_RESTING , do_action , AUTH_NONE }, { "ruffle" , POS_STANDING, do_action , AUTH_NONE }, { "say" , POS_RESTING , do_say , AUTH_NONE }, { "'" , POS_RESTING , do_say , AUTH_NONE }, { "save" , POS_SLEEPING, do_save , AUTH_NONE }, { "savecommands", POS_DEAD , do_savecommands, AUTH_WIZARD }, { "savezone" , POS_DEAD , do_savezone , AUTH_WIZARD }, { "score" , POS_DEAD , do_score , AUTH_NONE }, { "scream" , POS_RESTING , do_action , AUTH_NONE }, { "sell" , POS_SITTING , do_sell , AUTH_GUEST }, { "send" , POS_SLEEPING, do_send , AUTH_WIZARD }, { "set" , POS_DEAD , do_set , AUTH_WIZARD }, { "shout" , POS_RESTING , do_gen_comm , AUTH_NONE }, { "shake" , POS_RESTING , do_action , AUTH_NONE }, { "shiver" , POS_RESTING , do_action , AUTH_NONE }, { "show" , POS_DEAD , do_show , AUTH_WIZARD }, { "shrug" , POS_RESTING , do_action , AUTH_NONE }, { "shutdow" , POS_DEAD , do_shutdown , AUTH_OWNER }, { "shutdown" , POS_DEAD , do_shutdown , AUTH_OWNER }, { "sigh" , POS_RESTING , do_action , AUTH_NONE }, { "sing" , POS_RESTING , do_action , AUTH_NONE }, { "sip" , POS_RESTING , do_drink , AUTH_NONE }, { "sit" , POS_RESTING , do_sit , AUTH_NONE }, { "skillset" , POS_SLEEPING, do_skillset , AUTH_OWNER }, { "sleep" , POS_SLEEPING, do_sleep , AUTH_NONE }, { "slap" , POS_RESTING , do_action , AUTH_NONE }, { "slowns" , POS_DEAD , do_slowns , AUTH_OWNER }, { "smile" , POS_RESTING , do_action , AUTH_NONE }, { "smirk" , POS_RESTING , do_action , AUTH_NONE }, { "snicker" , POS_RESTING , do_action , AUTH_NONE }, { "snap" , POS_RESTING , do_action , AUTH_NONE }, { "snarl" , POS_RESTING , do_action , AUTH_NONE }, { "sneeze" , POS_RESTING , do_action , AUTH_NONE }, { "sneak" , POS_STANDING, do_sneak , AUTH_PLAYER }, { "sniff" , POS_RESTING , do_action , AUTH_NONE }, { "snore" , POS_SLEEPING, do_action , AUTH_NONE }, { "snowball" , POS_STANDING, do_action , AUTH_WIZARD }, { "snoop" , POS_DEAD , do_snoop , AUTH_WIZARD }, { "snuggle" , POS_RESTING , do_action , AUTH_NONE }, { "socials" , POS_DEAD , do_commands , AUTH_NONE }, { "split" , POS_SITTING , do_split , AUTH_PLAYER }, { "spank" , POS_RESTING , do_action , AUTH_NONE }, { "spit" , POS_STANDING, do_action , AUTH_NONE }, { "squeeze" , POS_RESTING , do_action , AUTH_NONE }, { "stand" , POS_RESTING , do_stand , AUTH_NONE }, { "stare" , POS_RESTING , do_action , AUTH_NONE }, { "stat" , POS_DEAD , do_stat , AUTH_WIZARD }, { "steal" , POS_STANDING, do_steal , AUTH_PLAYER }, { "steam" , POS_RESTING , do_action , AUTH_NONE }, { "stroke" , POS_RESTING , do_action , AUTH_NONE }, { "strut" , POS_STANDING, do_action , AUTH_NONE }, { "sulk" , POS_RESTING , do_action , AUTH_NONE }, { "switch" , POS_DEAD , do_switch , AUTH_OWNER }, { "syslog" , POS_DEAD , do_syslog , AUTH_WIZARD }, { "tell" , POS_DEAD , do_tell , AUTH_NONE }, { "tackle" , POS_RESTING , do_action , AUTH_NONE }, { "take" , POS_RESTING , do_get , AUTH_NONE }, { "tango" , POS_STANDING, do_action , AUTH_NONE }, { "taunt" , POS_RESTING , do_action , AUTH_NONE }, { "taste" , POS_RESTING , do_eat , AUTH_NONE }, { "teleport" , POS_DEAD , do_teleport , AUTH_WIZARD }, { "thank" , POS_RESTING , do_action , AUTH_NONE }, { "think" , POS_RESTING , do_action , AUTH_NONE }, { "thaw" , POS_DEAD , do_wizutil , AUTH_FREEZE }, { "title" , POS_DEAD , do_title , AUTH_NONE }, { "tickle" , POS_RESTING , do_action , AUTH_NONE }, { "time" , POS_DEAD , do_time , AUTH_NONE }, { "toggle" , POS_DEAD , do_toggle , AUTH_NONE }, { "track" , POS_STANDING, do_track , AUTH_NONE }, { "trackthru", POS_DEAD , do_trackthru, AUTH_OWNER }, { "transfer" , POS_SLEEPING, do_trans , AUTH_WIZARD }, { "twiddle" , POS_RESTING , do_action , AUTH_NONE }, { "typo" , POS_DEAD , do_gen_write, AUTH_NONE }, { "unlock" , POS_SITTING , do_gen_door , AUTH_NONE }, { "ungroup" , POS_DEAD , do_ungroup , AUTH_NONE }, { "unban" , POS_DEAD , do_unban , AUTH_OWNER }, { "unaffect" , POS_DEAD , do_wizutil , AUTH_WIZARD }, { "uptime" , POS_DEAD , do_date , AUTH_WIZARD }, { "use" , POS_SITTING , do_use , AUTH_PLAYER }, { "users" , POS_DEAD , do_users , AUTH_WIZARD }, { "value" , POS_STANDING, do_not_here , AUTH_NONE }, { "version" , POS_DEAD , do_gen_ps , AUTH_NONE }, { "visible" , POS_RESTING , do_visible , AUTH_PLAYER }, { "vnum" , POS_DEAD , do_vnum , AUTH_WIZARD }, { "vstat" , POS_DEAD , do_vstat , AUTH_WIZARD }, { "wake" , POS_SLEEPING, do_wake , AUTH_NONE }, { "wave" , POS_RESTING , do_action , AUTH_NONE }, { "wear" , POS_RESTING , do_wear , AUTH_NONE }, { "weather" , POS_RESTING , do_weather , AUTH_NONE }, { "who" , POS_DEAD , do_who , AUTH_NONE }, { "whoami" , POS_DEAD , do_gen_ps , AUTH_NONE }, { "where" , POS_RESTING , do_where , AUTH_PLAYER }, { "whisper" , POS_RESTING , do_spec_comm, AUTH_NONE }, { "whine" , POS_RESTING , do_action , AUTH_NONE }, { "whistle" , POS_RESTING , do_action , AUTH_NONE }, { "wield" , POS_RESTING , do_wield , AUTH_NONE }, { "wiggle" , POS_STANDING, do_action , AUTH_NONE }, { "wimpy" , POS_DEAD , do_wimpy , AUTH_NONE }, { "wink" , POS_RESTING , do_action , AUTH_NONE }, { "withdraw" , POS_STANDING, do_not_here , AUTH_PLAYER }, { "wiznet" , POS_DEAD , do_wiznet , AUTH_WIZARD }, { ";" , POS_DEAD , do_wiznet , AUTH_WIZARD }, { "wizhelp" , POS_SLEEPING, do_commands , AUTH_WIZARD }, { "wizlist" , POS_DEAD , do_gen_ps , AUTH_NONE }, { "wizlock" , POS_DEAD , do_wizlock , AUTH_OWNER }, { "worship" , POS_RESTING , do_action , AUTH_NONE }, { "write" , POS_STANDING, do_write , AUTH_GUEST }, { "yawn" , POS_RESTING , do_action , AUTH_NONE }, { "yodel" , POS_RESTING , do_action , AUTH_NONE }, { "zreset" , POS_DEAD , do_zreset , AUTH_OWNER }, { "\n", 0, 0, 0 } /* this must be last */ }; /** * Interprets one command from a character. * @param ch the character for whom the command is executed * @param argument the command line to be interpreted as a command * @return none */ void command_interpreter(charData_t *ch, char *argument) { int length; char *line; char arg[MAX_INPUT_LENGTH]; const commandData_t *cmd = NULL; REMOVE_BIT(AFF_FLAGS(ch), AFF_HIDE); /* just drop to next line for hitting CR */ skip_spaces(&argument); if (!*argument) return; /* * special case to handle one-character, non-alphanumeric commands; * requested by many people so "'hi" or ";godnet test" is possible. * Patch sent by Eric Green and Stefan Wasilewski. */ if (!isalpha(*argument)) { arg[0] = argument[0]; arg[1] = '\0'; line = argument + 1; } else line = any_one_arg(argument, arg); /* otherwise, find the command */ for (length = strlen(arg), cmd = cmd_info; *(cmd->command) != '\n'; cmd++) if (!strncmp(cmd->command, arg, length)) if (GET_AUTH(ch) >= cmd->minimum_auth) break; if (strcmp(cmd->command, "\n") == 0) send_to_char(ch, "Huh?!?\r\n"); else if (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_FROZEN) && GET_AUTH(ch) < AUTH_OWNER) send_to_char(ch, "You try, but the mind-numbing cold prevents you...\r\n"); else if (cmd->command_pointer == NULL) send_to_char(ch, "Sorry, that command hasn't been implemented yet.\r\n"); else if (IS_NPC(ch) && cmd->minimum_auth >= AUTH_WIZARD) send_to_char(ch, "You can't use immortal commands while switched.\r\n"); else if (GET_POS(ch) < cmd->minimum_position) switch (GET_POS(ch)) { case POS_DEAD: send_to_char(ch, "Lie still; you are DEAD!!! :-(\r\n"); break; case POS_INCAP: case POS_MORTALLYW: send_to_char(ch, "You are in a pretty bad shape, unable to do anything!\r\n"); break; case POS_STUNNED: send_to_char(ch, "All you can do right now is think about the stars!\r\n"); break; case POS_SLEEPING: send_to_char(ch, "In your dreams, or what?\r\n"); break; case POS_RESTING: send_to_char(ch, "Nah... You feel too relaxed to do that..\r\n"); break; case POS_SITTING: send_to_char(ch, "Maybe you should get on your feet first?\r\n"); break; case POS_FIGHTING: send_to_char(ch, "No way! You're fighting for your life!\r\n"); break; } else if (no_specials || !special(ch, cmd, line)) { cmd->command_pointer(ch, line, cmd); } } /** * Searches for a command. * @param command the cannonical name of the command * @return the command, or NULL if the command cannot be found */ const commandData_t *find_command(const char *command) { /* Declare an iterator variable. */ register ssize_t cmd = 0; /* Iterate over the master command table. */ for (cmd = 0; strcmp(cmd_info[cmd].command, "\n") != 0; cmd++) { /* Test whether the current command is the one we're seeking. */ if (strcasecmp(cmd_info[cmd].command, command) == 0) { return &(cmd_info[cmd]); } } return (NULL); } /** * The SAVECOMMANDS command. * @param ch the character performing the command * @param argument the additional text passed after the command * @param cmd the command object that was performed * @returns none */ ACMD(do_savecommands) { /* Create the document DAO. */ daoData_t *rootDao = dao_newDocument(); /* Create the "Commands" container DAO. */ daoData_t *commandsDao = dao_newChild(rootDao, "Commands"); /* Declare an iterator variable. */ register int i = 0; /* Iterate over the command table. */ for (i = 0; strcmp(cmd_info[i].command, "\n") != 0; i++) { /* Declare a temporary string buffer. */ char buf[MAX_STRING_LENGTH]; /* Create the "Command#" container DAO. */ daoData_t *commandDao = dao_newChild(commandsDao, "%d", i); /* Look up the corresponding social. */ socialData_t *social = find_action(cmd_info + i); /* Only write non-NULL functions to the DAO. */ if (cmd_info[i].command_pointer != NULL) { /* Declare an iterator variable. */ register int j = 0; /* Iterate over the ACMD function table. */ for (j = 0; strcmp(acmd_registry[j].name, "\n") != 0; j++) { /* Determine if this is the ACMD we're searching for. */ if (acmd_registry[j].function == cmd_info[i].command_pointer) break; } /* Only write the function name if one was actually found. */ if (strcmp(acmd_registry[j].name, "\n") != 0) { /* Create the "Function" scalar DAO. */ dao_newScalar(commandDao, "Function", "%s", acmd_registry[j].name); } } /* Print the minimum auth value to the temporary buffer. */ sprinttype(cmd_info[i].minimum_auth, auth_types, buf, sizeof(buf)); /* Create the "MinimumAuth" scalar DAO. */ dao_newScalar(commandDao, "MinimumAuth", "%s", buf); /* Print the minimum position value to the temporary buffer. */ sprinttype(cmd_info[i].minimum_position, position_types, buf, sizeof(buf)); /* Create the "MinimumPosition" scalar DAO. */ dao_newScalar(commandDao, "MinimumPosition", "%s", buf); /* Create the "Name" scalar DAO. */ dao_newScalar(commandDao, "Name", cmd_info[i].command); /* Only write social information if its available. */ if (social) { /* Create the "Social" container DAO. */ daoData_t *socialDao = dao_newChild(commandDao, "Social"); /* Create the "Hidden" scalar DAO. */ dao_newScalar(socialDao, "Hidden", "%s", YESNO(social->hide)); } } /* Save the commands DAO out to disk. */ dao_saveFile(rootDao, COMMANDS_FILE); /* Free the root DAO. */ dao_free(rootDao); }