/***********************************************************************\
* GENERAL *
* GENERAL is by Jouster@COOLmud. He can be reached at *
* dan@betterbox.net. This file falls under the GPL and the licenses *
* of Diku, Merc, ROM, RoT, and any licenses that may apply to any *
* portions of any file that this program may modify. *
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*
* If you don't mind, I'd appreciate an email if you use this *
* file in your code. Thanks. *
* dan@coolmud.com *
\***********************************************************************/
/***********************************************************************\
* VERSION HISTORY *
* v0.1a--original development *
* v0.1--Initial Implementation *
* v0.2--Updated and revised to act as a fourth tier *
\***********************************************************************/
#ifdef macintosh
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "general.h"
/*
* Generals' Command Table
*/
const struct gnrl_cmd_type gnrl_cmd_table [] =
{
{ "advance", gnrl_advance, G1, LOG_ALWAYS },
{ "cash", gnrl_cash, G2, LOG_NORMAL },
{ "level", gnrl_level, G8, LOG_ALWAYS },
{ "restore", gnrl_restore, G1, LOG_NORMAL },
{ "spellup", gnrl_spellup, G3, LOG_NORMAL },
{ "transfer", gnrl_transfer, G4, LOG_NORMAL },
{ "questpoint", gnrl_qp, G6, LOG_NORMAL },
/*
* End of list.
*/
{ "", 0, 0, LOG_NORMAL }
};
/*
* Da Function. Only called if ch is a general to begin with.
*/
void interp_general( CHAR_DATA *ch, char *argument )
{
/*
* Thanks for the code on memchecks, Garry Turkington
* <gary@reddwarf.qub.ac.uk>
*/
extern int nAllocString;
extern int nAllocPerm;
int string_count = nAllocString;
int perm_count = nAllocPerm;
char command[MAX_INPUT_LENGTH];
char logline[MAX_INPUT_LENGTH];
int cmd;
bool found;
if ( IS_NPC( ch ) )
return;
/*
* Kill leading spaces.
*/
while ( isspace(*argument) )
argument++;
if ( argument[0] == '\0' )
return;
/*
* Copy logline for Gary and split the word.
*/
strcpy( logline, argument );
argument = one_argument( argument, command );
/*
* Look for da command in da table.
*/
found = FALSE;
for ( cmd = 0; gnrl_cmd_table[cmd].name[0] != '\0'; cmd++ )
if ( command[0] == gnrl_cmd_table[ cmd ].name[0] &&
!str_prefix( command, gnrl_cmd_table[ cmd ].name ) )
if ( gnrl_cmd_table[cmd].rank <= ch->pcdata->gnrl_rank )
{
found = TRUE;
break;
}
/*
* Straight copy from interp.c, then modified, since we don't want to
* repeat any log statements.
*/
if ( gnrl_cmd_table[cmd].log == LOG_ALWAYS
&& !IS_SET(ch->act, PLR_LOG)
&& ch->level != MAX_LEVEL
&& !fLogAll
&& gnrl_cmd_table[cmd].log != LOG_NEVER )
{
sprintf( log_buf, "Log %s: %s", ch->name, logline );
wiznet(log_buf,ch,NULL,WIZ_SECURE,0,get_trust(ch));
log_string( log_buf );
}
if ( !found )
{
send_to_char( "Huh?\n\r", ch );
return;
}
/*
* Dispatch the command.
*/
(*gnrl_cmd_table[cmd].do_fun) ( ch, argument );
if (string_count != nAllocString)
{
sprintf(log_buf, "%s in strings :: %s : %s.\n\r"
"%d to %d, a%s of %d",
( string_count < nAllocString ? "Increase" :
"Decrease" ),
ch->name, logline,
string_count, nAllocString,
( string_count < nAllocString ? "n increase" :
" decrease" ),
abs( ( nAllocString - string_count) ) );
wiznet(log_buf, NULL, NULL, WIZ_MEMCHECK,0,0);
}
if (perm_count != nAllocPerm)
{
sprintf(log_buf, "%s in perms :: %s : %s.\n\r"
"%d to %d, a%s of %d",
( perm_count < nAllocPerm ? "Increase" :
"Decrease" ),
ch->name, logline,
perm_count, nAllocPerm,
( perm_count < nAllocPerm ? "n increase" :
" decrease" ),
abs( ( nAllocPerm - perm_count) ) );
wiznet(log_buf, NULL, NULL, WIZ_MEMCHECK,0,0);
}
tail_chain( );
return;
}