/**************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefiting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************
* 1stMUD ROM Derivative (c) 2001-2002 by Ryan Jennings *
* http://1stmud.dlmud.com/ <r-jenn@shaw.ca> *
***************************************************************************/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include "olc.h"
#include "tables.h"
const char *do_fun_name args((DO_FUN * fun));
DO_FUN *do_fun_lookup args((const char *name));
#define CMDEDIT(fun) bool fun (CHAR_DATA *ch, const char *argument)
CH_CMD(do_cmdcheck)
{
int i;
DO_FUN *fun;
bool found = FALSE;
if (IS_NULLSTR(argument))
chprintln(ch, "Syntax: cmdcheck null|missing|<do_fun_name>");
else if (!str_prefix(argument, "null"))
{
chprintln(ch, "NULL commands:");
for (i = 0; i < maxCommands; i++)
{
if (cmd_table[i].do_fun == do_null)
{
found = TRUE;
chprintlnf(ch, "%s", cmd_table[i].name);
}
}
if (!found)
chprintln(ch, "None.");
}
else if (!str_prefix(argument, "missing"))
{
int cmd, pos = 0;
bool any = FALSE;
chprintln(ch, "Functions missing command entries:");
for (i = 0; dofun_table[i].fun != NULL; i++)
{
found = FALSE;
for (cmd = 0; cmd < maxCommands; cmd++)
{
if (dofun_table[i].fun == cmd_table[cmd].do_fun)
{
found = TRUE;
break;
}
}
if (!found)
{
any = TRUE;
chprintf(ch, "%15s ", dofun_table[i].name);
if (++pos % 4 == 0)
chprintln(ch, "");
}
}
if (pos % 4 != 0)
chprintln(ch, "");
if (!any)
chprintln(ch, "None.");
}
else if ((fun = do_fun_lookup(argument)) != NULL)
{
chprintlnf(ch, "%s commands:", argument);
for (i = 0; i < maxCommands; i++)
{
if (cmd_table[i].do_fun == fun)
{
found = TRUE;
chprintlnf(ch, "%s", cmd_table[i].name);
}
}
if (!found)
chprintln(ch, "None.");
}
return;
}
CMDEDIT(cmdedit_show)
{
CMD_DATA *pCmd;
EDIT_CMD(ch, pCmd);
chprintln(ch, draw_line(NULL, 0));
chprintlnf(ch, "Name : %s", pCmd->name);
chprintlnf(ch, "DoFun : %s", do_fun_name(pCmd->do_fun));
chprintlnf(ch, "Position : %s",
flag_string(position_flags, pCmd->position));
chprintlnf(ch, "Level : %d", pCmd->level);
chprintlnf(ch, "Log : %s", flag_string(log_flags, pCmd->log));
chprintlnf(ch, "fShow : %s", !pCmd->show ? "FALSE" : "TRUE");
chprintln(ch, draw_line(NULL, 0));
return TRUE;
}
CMDEDIT(cmdedit_create)
{
int j, i = maxCommands;
CMD_DATA *pCmd;
struct cmd_type *new_table;
char buf[MIL];
if (!IS_NULLSTR(argument) && command_lookup(argument) == -1)
sprintf(buf, argument);
else
sprintf(buf, "New Command%d", maxCommands + 1);
maxCommands++;
alloc_mem(new_table, struct cmd_type, maxCommands + 1);
if (!new_table)
{
chprintln(ch, "Memory Allocation Failed!!! Unable to create command.");
return FALSE;
}
for (j = 0; j < i; j++)
new_table[j] = cmd_table[j];
free_mem(cmd_table);
cmd_table = new_table;
cmd_table[i].name = str_dup(buf);
cmd_table[i].do_fun = do_null;
cmd_table[i].level = 0;
cmd_table[i].position = POS_DEAD;
cmd_table[i].show = TRUE;
cmd_table[i].log = LOG_NORMAL;
cmd_table[i + 1].name = str_dup("");
pCmd = &cmd_table[i];
edit_start(ch, pCmd, ED_CMD);
chprintln(ch, "Command created.");
return TRUE;
}
CMDEDIT(cmdedit_dofun)
{
CMD_DATA *pCmd;
DO_FUN *fun;
EDIT_CMD(ch, pCmd);
if (IS_NULLSTR(argument))
{
chprintln(ch, "Syntax: dofun <function>");
return FALSE;
}
if (is_name(argument, "none clear reset"))
{
pCmd->do_fun = do_null;
chprintln(ch, "Function entry reset.");
return TRUE;
}
if ((fun = do_fun_lookup(argument)) == do_null)
{
chprintln
(ch, "That is not a valid function (probably not coded in yet)");
return FALSE;
}
pCmd->do_fun = fun;
chprintlnf(ch, "%s now points to the %s function.", pCmd->name, argument);
return TRUE;
}
CMDEDIT(cmdedit_delete)
{
CMD_DATA *pCmd;
EDIT_CMD(ch, pCmd);
if (str_cmp(argument, "confirm"))
{
chprintln
(ch,
"Typing 'delete confirm' again will permanetely remove this command!");
return FALSE;
}
else
{
int i, j = 0, c;
struct cmd_type *new_table;
alloc_mem(new_table, struct cmd_type, maxCommands + 1);
if (!new_table)
{
chprintln
(ch, "Memory Allocation error!!! Unable to delete command.");
return FALSE;
}
c = command_lookup(pCmd->name);
for (i = 0; i < maxCommands; i++)
if (i != c)
new_table[j++] = cmd_table[i];
free_mem(cmd_table);
cmd_table = new_table;
maxCommands--;
pCmd = &cmd_table[0];
edit_start(ch, pCmd, ED_CMD);
chprintln(ch, "Command deleted.");
}
return TRUE;
}
CMDEDIT(cmdedit_rearrange)
{
CMD_DATA *pCmd;
int x;
int i, c;
CMD_DATA *new_table;
bool found = FALSE;
EDIT_CMD(ch, pCmd);
if (IS_NULLSTR(argument))
{
chprintln(ch, "Syntax: cmdedit rearrange <command to place before>");
return FALSE;
}
if ((x = command_lookup(argument)) == -1)
{
chprintln(ch, "That is not a command.");
return FALSE;
}
c = command_lookup(pCmd->name);
if (x == c)
{
chprintln(ch, "Can't rearrange the same command.");
return FALSE;
}
if (c < x)
{
chprintlnf(ch, "Error: command %s is already above %s.",
cmd_table[c].name, cmd_table[x].name);
return FALSE;
}
alloc_mem(new_table, struct cmd_type, maxCommands);
if (!new_table)
{
chprintln(ch, "Memory Allocation error!!! Unable to delete command.");
return FALSE;
}
for (i = 0; i < maxCommands; i++)
{
if (found)
{
new_table[i] = cmd_table[i - 1];
continue;
}
if (i + 1 == x)
{
new_table[i] = cmd_table[c];
i++;
new_table[i] = cmd_table[i - 1];
found = TRUE;
continue;
}
new_table[i] = cmd_table[i];
}
free_mem(cmd_table);
cmd_table = new_table;
chprintln(ch, "Command moved.");
return TRUE;
}