/*
* This file handles command interpreting
*/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* include main header file */
#include "mud.h"
void handle_cmd_input(D_SOCKET *dsock, char *arg)
{
D_MOBILE *dMob;
char command[MAX_BUFFER];
bool found_cmd = FALSE;
int i;
char logline[MAX_BUFFER];
if ((dMob = dsock->player) == NULL)
return;
strcpy (logline, arg);
if (!isalpha (arg[0]) && !isdigit (arg[0]))
{
command[0] = arg[0];
command[1] = '\0';
arg++;
while (isspace (*arg))
arg++;
}
else
{
arg = one_arg(arg, command);
}
for (i = 0; tabCmd[i].cmd_name[0] != '\0' && !found_cmd; i++)
{
if (tabCmd[i].level > dMob->level) continue;
if (is_prefix(command, tabCmd[i].cmd_name))
{
found_cmd = TRUE;
(*tabCmd[i].cmd_funct)(dMob, arg);
}
}
if (!found_cmd)
text_to_mobile(dMob, "No such command.\n\r");
}
/*
* The command table, very simple, but easy to extend.
*/
const struct typCmd tabCmd [] =
{
/* command function Req. Level */
/* -------------------------------------------------- */
{ "'", cmd_say, LEVEL_GUEST },
/* Movement Commands */
{ "north", cmd_north, LEVEL_GUEST },
{ "south", cmd_south, LEVEL_GUEST },
{ "east", cmd_east, LEVEL_GUEST },
{ "west", cmd_west, LEVEL_GUEST },
{ "up", cmd_up, LEVEL_GUEST },
{ "down", cmd_down, LEVEL_GUEST },
{ "open", cmd_open, LEVEL_GUEST },
{ "close", cmd_close, LEVEL_GUEST },
{ "/", cmd_recall, LEVEL_GUEST },
{ "recall", cmd_recall, LEVEL_GUEST },
{ "where", cmd_where, LEVEL_GUEST },
{ "location", cmd_location, LEVEL_GUEST },
{ "look", cmd_look, LEVEL_GUEST },
/* Communcations */
{ "say", cmd_say, LEVEL_GUEST },
{ "chat", cmd_chat, LEVEL_GUEST },
{ "config", cmd_config, LEVEL_GUEST },
{ "title", cmd_title, LEVEL_GUEST },
{ "note", cmd_note, LEVEL_GUEST },
{ "score", cmd_score, LEVEL_GUEST },
{ "train", cmd_train, LEVEL_GUEST },
{ "changes", do_changes, LEVEL_GUEST },
/* Other crap */
{ "skills", cmd_skills, LEVEL_GUEST },
{ "commands", cmd_commands, LEVEL_GUEST },
{ "compress", cmd_compress, LEVEL_GUEST },
{ "help", cmd_help, LEVEL_GUEST },
{ "save", cmd_save, LEVEL_GUEST },
{ "quit", cmd_quit, LEVEL_GUEST },
{ "who", cmd_who, LEVEL_GUEST },
{ "time", cmd_time, LEVEL_GUEST },
/* Admin/Builder Commands */
{ "linkdead", cmd_linkdead, LEVEL_ADMIN },
{ "displaybits", cmd_display_bits,LEVEL_ADMIN },
{ "omniview", cmd_omni_view, LEVEL_ADMIN },
{ "passdoor", cmd_pass_door, LEVEL_ADMIN },
{ "copyover", cmd_copyover, LEVEL_ADMIN },
{ "echo", cmd_echo, LEVEL_ADMIN },
{ "pset", cmd_pset, LEVEL_ADMIN },
{ "edit", cmd_leave_trail,LEVEL_ADMIN },
{ "goto", cmd_goto, LEVEL_ADMIN },
{ "sector_number", cmd_number_here,LEVEL_ADMIN },
{ "make_box", cmd_edit_box, LEVEL_ADMIN },
/* Thri's Commands */
{ "addchange", do_addchange, LEVEL_GOD },
{ "delchange", do_delchange, LEVEL_GOD },
{ "clearchanges", cmd_clearchanges,LEVEL_GOD },
{ "shutdown", cmd_shutdown, LEVEL_GOD },
{ "advance", cmd_advance, LEVEL_GOD },
{ "saveworld", cmd_save_world, LEVEL_GOD },
{ "loadimage", cmd_load_image, LEVEL_GOD },
{ "loadimagesm", cmd_load_small, LEVEL_GOD },
{ "saveimage", cmd_save_image, LEVEL_GOD },
{ "addarea", cmd_add_area, LEVEL_GOD },
{ "scrye", cmd_scrye, LEVEL_GOD },
{ "mobiles", cmd_mobiles, LEVEL_GOD },
/* end of table */
{ "", 0 }
};
/*
* is_number
*
* true if its a number
* false if its not
*/
bool is_number (char *arg)
{
if (*arg == '\0')
return FALSE;
if (*arg == '+' || *arg == '-')
arg++;
for (; *arg != '\0'; arg++)
{
if (!isdigit (*arg))
return FALSE;
}
return TRUE;
}