/***************************************************************************
* ROM 2.4 is copyright 1993-1995 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@pacinfo.com) *
* Gabrielle Taylor (gtaylor@pacinfo.com) *
* Brian Moore (rom@rom.efn.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
* Alias code modifications by Ron Yacketta (dajy@telmaron.com) *
* Please Give credit to those who have made this snippet *
* possible. Please send any comments,questions or concerns * *
* to dajy@telmaron.com */
/*
LOAD PROCEDURES:
1) in comm.c
CHANGE:
interpret( d->character, cmdline );
TO:
substitute_alias( d, cmdline );
2) ADD the following members to the end of the pc_data struct
char * alias[MAX_ALIAS];
char *alias_sub[MAX_ALIAS];
3) In mud.h
AFTER:
#define MAX_HERB20
ADD:
#define MAX_ALIAS 20
4) add the following to fwrite_char in save.c
AFTER:
SKILLTYPE *skill;
ADD:
int pos;
AFTER:
fprintf( fp, "Pagerlen%d\n",ch->pcdata->pagerlen );
ADD:
for ( pos = 0; pos < MAX_ALIAS ; pos++ )
{
if ( !ch->pcdata->alias[pos]
|| !ch->pcdata->alias_sub[pos] )
break;
fprintf( fp, "Alias %s %s~\n", ch->pcdata->alias[pos],
ch->pcdata->alias_sub[pos] );
}
5) In fread_char (save.c)
AFETR:
bool fMatch;
ADD:
int count = 0;
6) ADD the following to the case 'A' in fread_char
AFTER:
if ( !str_cmp( word, "AttrMod" ) )
{
line = fread_line( fp );
x1=x2=x3=x4=x5=x6=x7=13;
sscanf( line, "%d %d %d %d %d %d %d",
&x1, &x2, &x3, &x4, &x5, &x6, &x7 );
ch->mod_str = x1;
ch->mod_int = x2;
ch->mod_wis = x3;
ch->mod_dex = x4;
ch->mod_con = x5;
ch->mod_cha = x6;
ch->mod_lck = x7;
if (!x7)
ch->mod_lck = 0;
fMatch = TRUE;
break;
}
ADD:
if ( !str_cmp( word, "Alias" ) )
{
if( count >= MAX_ALIAS )
{
fread_to_eol( fp );
fMatch = TRUE;
break;
}
ch->pcdata->alias[count] = str_dup( fread_word( fp ) );
ch->pcdata->alias_sub[count] = fread_string( fp );
count++;
fMatch = TRUE;
break;
}
7) make clean ; make smuag
*/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#include "mud.h"
void alias_sub( DESCRIPTOR_DATA *d, char *alias_sub, char *arg );
/* does aliasing and other fun stuff */
void substitute_alias(DESCRIPTOR_DATA *d, char *argument)
{
CHAR_DATA *ch;
char buf[MAX_STRING_LENGTH],name[MAX_INPUT_LENGTH];
char *point;
int alias;
ch = d->original ? d->original : d->character;
if (IS_NPC(ch) || ch->pcdata->alias[0] == NULL
|| !str_prefix("alias",argument) || !str_prefix("una",argument) )
/*|| !str_prefix("prefix",argument)) */
{
interpret(d->character, argument);
return;
}
strcpy(buf,argument);
for (alias = 0; alias < MAX_ALIAS; alias++) /* go through the aliases */
{
if (ch->pcdata->alias[alias] == NULL)
break;
if (!str_prefix(ch->pcdata->alias[alias],argument))
{
point = one_argument(argument,name);
if (!strcmp(ch->pcdata->alias[alias],name))
{
alias_sub(ch->desc, ch->pcdata->alias_sub[alias], point);
return;
}
if (strlen(buf) > MAX_INPUT_LENGTH)
{
send_to_char("Alias substitution too long. Truncated.\r\n",ch);
buf[MAX_INPUT_LENGTH -1] = '\0';
}
}
}
interpret(d->character,buf);
}
bool check_alias(CHAR_DATA *ch, char * alias, bool alias_used[MAX_ALIAS] )
{
char buf[ MAX_STRING_LENGTH ];
char * pbuf;
int pos;
while ( *alias == ' ' ) alias++;
if ( *alias == '%' )
{
alias++;
if ( *alias >= '0' && *alias <= '9' )
return FALSE;
alias--;
}
for ( pos = 0 ; pos <= MAX_ALIAS && ch->pcdata->alias[ pos ] != NULL ; pos++ )
if ( !str_prefix( ch->pcdata->alias[ pos ], alias ) )
{
if ( alias_used[ pos ] )
return FALSE;
else
{
alias_used[ pos ] = TRUE;
if ( !check_alias( ch, ch->pcdata->alias_sub[ pos ], alias_used ) )
return FALSE;
}
}
strcpy( buf, alias );
pbuf = buf;
while ( ( pbuf = strchr( pbuf, '%' ) ) != NULL && *(++pbuf) != ';' );
if ( pbuf != NULL && *pbuf != '\0' )
{
pbuf++;
if ( !check_alias( ch, pbuf, alias_used ) )
return FALSE;
}
return TRUE;
}
void do_alia(CHAR_DATA *ch, char *argument)
{
send_to_char("I'm sorry, alias must be entered in full.\n\r",ch);
return;
}
void do_alias(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *rch;
char arg[MAX_INPUT_LENGTH],buf[MAX_STRING_LENGTH];
int pos;
bool alias_used[MAX_ALIAS];
if (ch->desc == NULL)
rch = ch;
else
rch = ch->desc->original ? ch->desc->original : ch;
if (IS_NPC(rch))
return;
smash_tilde( argument );
argument = one_argument(argument,arg);
if (arg[0] == '\0')
{
if (rch->pcdata->alias[0] == NULL)
{
send_to_char("You have no aliases defined.\n\r",ch);
return;
}
send_to_char("Your current aliases are:\n\r",ch);
for (pos = 0; pos < MAX_ALIAS; pos++)
{
if (rch->pcdata->alias[pos] == NULL
|| rch->pcdata->alias_sub[pos] == NULL)
break;
sprintf(buf," %s: %s\n\r",rch->pcdata->alias[pos],
rch->pcdata->alias_sub[pos]);
send_to_char(buf,ch);
}
return;
}
if (!str_prefix("una",arg) || !str_cmp("alias",arg))
{
send_to_char("Sorry, that word is reserved.\n\r",ch);
return;
}
if (argument[0] == '\0')
{
for (pos = 0; pos < MAX_ALIAS; pos++)
{
if (rch->pcdata->alias[pos] == NULL
|| rch->pcdata->alias_sub[pos] == NULL)
break;
if (!str_cmp(arg,rch->pcdata->alias[pos]))
{
sprintf(buf,"%s aliases to '%s'.\n\r",rch->pcdata->alias[pos],
rch->pcdata->alias_sub[pos]);
send_to_char(buf,ch);
return;
}
}
send_to_char("That alias is not defined.\n\r",ch);
return;
}
if (!str_prefix(argument,"delete") || !str_prefix(argument,"prefix"))
{
send_to_char("That shall not be done!\n\r",ch);
return;
}
for ( pos = 0 ; pos < MAX_ALIAS ; pos++ )
alias_used[ pos ] = FALSE;
for (pos = 0; pos < MAX_ALIAS; pos++)
{
if (rch->pcdata->alias[pos] == NULL)
break;
if (!str_cmp(arg,rch->pcdata->alias[pos])) /* redefine an alias */
{
strcpy( buf, rch->pcdata->alias_sub[pos] );
DISPOSE(rch->pcdata->alias_sub[pos]);
rch->pcdata->alias_sub[pos] = str_dup(argument);
if ( !check_alias( rch, argument, alias_used ) )
{
send_to_char( "Invalid alias (possibly recursive)\n\r", rch );
DISPOSE( rch->pcdata->alias_sub[pos] );
rch->pcdata->alias_sub[pos] = str_dup( buf );
return;
}
sprintf(buf,"%s is now realiased to '%s'.\n\r",arg,argument);
send_to_char(buf,ch);
return;
}
}
if (pos >= MAX_ALIAS)
{
send_to_char("Sorry, you have reached the alias limit.\n\r",ch);
return;
}
/* make a new alias */
rch->pcdata->alias[pos] = str_dup(arg);
rch->pcdata->alias_sub[pos] = str_dup(argument);
if ( !check_alias( rch, argument, alias_used ) )
{
send_to_char( "Invalid alias (possibly recursive)\n\r", rch );
DISPOSE( rch->pcdata->alias[pos] );
DISPOSE( rch->pcdata->alias_sub[pos] );
return;
}
sprintf(buf,"%s is now aliased to '%s'.\n\r",arg,argument);
send_to_char(buf,ch);
}
void do_unalias(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *rch;
char arg[MAX_INPUT_LENGTH];
int pos;
bool found = FALSE;
if (ch->desc == NULL)
rch = ch;
else
rch = ch->desc->original ? ch->desc->original : ch;
if (IS_NPC(rch))
return;
argument = one_argument(argument,arg);
if (arg == '\0')
{
send_to_char("Unalias what?\n\r",ch);
return;
}
for (pos = 0; pos < MAX_ALIAS; pos++)
{
if (rch->pcdata->alias[pos] == NULL)
break;
if (found)
{
rch->pcdata->alias[pos-1] = rch->pcdata->alias[pos];
rch->pcdata->alias_sub[pos-1] = rch->pcdata->alias_sub[pos];
rch->pcdata->alias[pos] = NULL;
rch->pcdata->alias_sub[pos] = NULL;
continue;
}
if(!strcmp(arg,rch->pcdata->alias[pos]))
{
send_to_char("Alias removed.\n\r",ch);
DISPOSE(rch->pcdata->alias[pos]);
DISPOSE(rch->pcdata->alias_sub[pos]);
rch->pcdata->alias[pos] = NULL;
rch->pcdata->alias_sub[pos] = NULL;
found = TRUE;
}
}
if (!found)
send_to_char("No alias of that name to remove.\n\r",ch);
}
void alias_sub( DESCRIPTOR_DATA *d, char *alias_sub, char *arg )
{
char alias_args[10][MAX_INPUT_LENGTH];
char *arguments = arg;
char buf[MAX_STRING_LENGTH];
char c;
int i;
bzero( buf, sizeof( buf ) );
strcpy( alias_args[ 0 ], arg );
for ( i = 1 ; i < 10 ; i++ )
arguments = one_argument( arguments, alias_args[ i ] );
i = 0;
while( ( c = *alias_sub ) != '\0' )
{
alias_sub++;
if ( c != '%' )
buf[ i++ ] = c;
else
{
switch( *alias_sub )
{
default :
buf[i++] = '%';
buf[i++] = *alias_sub;
break;
case '%':
buf[i++] = '%';
break;
case ';':
buf[i++] = '\n';
break;
case '0':
strcat( buf, alias_args[ 0 ] );
i = strlen( buf );
break;
case '1':
strcat( buf, alias_args[ 1 ] );
i = strlen( buf );
break;
case '2':
strcat( buf, alias_args[ 2 ] );
i = strlen( buf );
break;
case '3':
strcat( buf, alias_args[ 3 ] );
i = strlen( buf );
break;
case '4':
strcat( buf, alias_args[ 4 ] );
i = strlen( buf );
break;
case '5':
strcat( buf, alias_args[ 5 ] );
i = strlen( buf );
break;
case '6':
strcat( buf, alias_args[ 6 ] );
i = strlen( buf );
break;
case '7':
strcat( buf, alias_args[ 7 ] );
i = strlen( buf );
break;
case '8':
strcat( buf, alias_args[ 8 ] );
i = strlen( buf );
break;
case '9':
strcat( buf, alias_args[ 9 ] );
i = strlen( buf );
break;
}
alias_sub++;
}
}
buf[ i ] = '\0';
i = 0;
while( ( c = buf[ i++ ] ) != '\n' && c != '\0' );
if ( buf[ --i ] == '\n' )
{
strcat( buf, "\n" );
strcat( buf, d->inbuf );
strcpy( d->inbuf, &buf[ i ] );
}
buf[ i ] = '\0';
substitute_alias( d, buf );
}
/*
=============================================================================
/ ______ _______ ____ _____ ___ __ _ ______ ____ ____ _____ /
\ | ____|__ __| _ \ / ____\ / _ \| \ / | ____| / __ \| _ \ / ____\ \
/ | |__ | | | |_| | | | |_| | |\/| | |___ | | | | |_| | | /
/ | ___| | | | ___/| | __| _ | | | | ____| | | | | __/| | ___ \
\ | | | | | | | |___| | | | | | | | |____ | |__| | |\ \| |___| | /
/ |_| |_| |_| o \_____/|_| |_|_| |_|______|o \____/|_| \_|\_____/ \
\ /
============================================================================
------------------------------------------------------------------------------
ftp://ftp.game.org/pub/mud FTP.GAME.ORG http://www.game.org/ftpsite/
------------------------------------------------------------------------------
This file came from FTP.GAME.ORG, the ultimate source for MUD resources.
------------------------------------------------------------------------------
*/