#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h> /* OLC 1.1b */
#include <time.h>
#include "merc.h"
#include "build.h"
extern int maxSocial;
/*
* Social editor
*/
const struct olc_cmd_type sedit_table [ ] =
{
{ "name", sedit_name },
{ "create", sedit_create },
{ "delete", sedit_delete },
{ "show", sedit_show },
{ "char_no_arg", sedit_cna },
{ "cna", sedit_cna },
{ "others_no_arg", sedit_ona },
{ "ona", sedit_ona },
{ "char_found", sedit_cf },
{ "cf", sedit_cf },
{ "others_found", sedit_of },
{ "of", sedit_of },
{ "victim_found", sedit_vf },
{ "vf", sedit_vf },
{ "char_auto", sedit_ca },
{ "ca", sedit_ca },
{ "others_auto", sedit_oa },
{ "oa", sedit_oa },
{ "commands", show_commands },
{ "?", show_help },
{ "", 0 }
};
/*
* Find a social based on name
*/
int social_lookup (const char *name)
{
int i;
for (i = 0; i < maxSocial ; i++)
if (!str_cmp(name, social_table[i].name))
return i;
return -1;
}
void sedit( CHAR_DATA *ch, char *argument )
{
char arg [ MAX_INPUT_LENGTH ];
char command [ MAX_INPUT_LENGTH ];
int cmd;
struct social_type *pSoc;
EDIT_SOCIAL(ch, pSoc);
smash_tilde( argument );
strcpy( arg, argument );
argument = one_argument( argument, command );
if( ch->pcdata->security <= 10 )
{
stc( "SEdit: Insufficient security to modify social.\n\r", ch );
return;
}
if( arg[0] == '\0' )
{
sedit_show( ch, argument );
return;
}
if( !str_cmp( arg, "done" ) )
{
edit_done(ch);
return;
}
for( cmd = 0; *sedit_table[cmd].name; cmd++ )
{
if( !str_prefix( command, sedit_table[cmd].name ) )
{
if( (*sedit_table[cmd].olc_fun) ( ch, argument ) )
save_socials();
return;
}
}
/* Default to Standard Intepreter. */
interpret( ch, arg );
return;
}
void do_sedit(CHAR_DATA *ch, char *argument)
{
struct social_type *pSocial;
char command[MIL];
int social;
if ( IS_NPC(ch) || ch->desc == NULL )
return;
if ( argument[0] == '\0' )
{
send_to_char( "Syntax : SEdit [social]\n\r", ch );
send_to_char( " SEdit new [social]\n\r", ch );
send_to_char( " SEdit delete [social]\n\r", ch );
return;
}
if (ch->pcdata->security < 10 )
{
send_to_char( "SEdit : Insuficant security to edit socials.\n\r", ch );
return;
}
argument = one_argument( argument, command );
if ( !str_cmp( command, "new" ) )
{
if ( sedit_create(ch, argument) )
save_socials();
return;
}
if ( !str_cmp( command, "delete" ) )
{
if ( sedit_delete(ch, argument) )
save_socials();
return;
}
if( command[0] == 's' && !str_prefix( command, "save" ) )
{
save_socials( );
return;
}
if ( (social = social_lookup(command)) == -1 )
{
send_to_char( "SEdit : Social doesn't exist.\n\r", ch );
return;
}
pSocial = &social_table[social];
ch->desc->pEdit=(void *)pSocial;
ch->desc->editor= ED_SOCIAL;
sedit_show( ch, "" );
return;
}
bool sedit_create( CHAR_DATA *ch, char *argument )
{
char buf[MAX_INPUT_LENGTH];
char *p;
DESCRIPTOR_DATA *d;
CHAR_DATA *tch;
struct social_type *new_table;
int iSocial;
if( !argument || argument[0] == '\0' )
{
stc( "Syntax: SEdit create <$name>\n\r", ch );
return FALSE;
}
strcpy( buf, argument );
for( p = &buf[0]; p && *p; ++p )
*p = LOWER( *p );
iSocial = social_lookup( argument );
if (iSocial != -1)
{
send_to_char ("A social with that name already exists\n\r",ch);
return FALSE;
}
/*
* Really bad if someone else is editing a social
* and you delete it.
*/
for ( d = descriptor_list; d; d = d->next )
{
if ( d->connected != CON_PLAYING
|| (tch = CH(d)) == NULL || tch->desc == NULL )
continue;
if ( tch->desc->editor == ED_SOCIAL )
edit_done(ch);
}
/* reallocate the table */
/*
* Note that the table contains
* maxSocial socials PLUS one empty spot!
*/
maxSocial++;
new_table = realloc (social_table, sizeof(struct social_type) * (maxSocial + 1));
if (!new_table) /* realloc failed */
{
send_to_char ("Memory allocation failed. Brace for impact.\n\r",ch);
return FALSE;
}
social_table = new_table;
social_table[maxSocial-1].name = str_dup (buf);
social_table[maxSocial-1].char_no_arg = str_dup ("");
social_table[maxSocial-1].others_no_arg = str_dup ("");
social_table[maxSocial-1].char_found = str_dup ("");
social_table[maxSocial-1].others_found = str_dup ("");
social_table[maxSocial-1].vict_found = str_dup ("");
social_table[maxSocial-1].char_auto = str_dup ("");
social_table[maxSocial-1].others_auto = str_dup ("");
social_table[maxSocial].name = str_dup (""); /* 'terminating' empty string */
ch->desc->editor = ED_SOCIAL;
ch->desc->pEdit = (void *) &social_table[maxSocial-1];
send_to_char( "SEdit: Social created.\n\r", ch );
if( strchr( buf, ' ' ) )
send_to_char( "Be careful with spaces, "
"they might stuff you up here.\n\r", ch );
return TRUE;
}
bool sedit_delete ( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
CHAR_DATA *tch;
int i,j,iSocial;
struct social_type *new_table;
if ( argument[0] == '\0' )
{
send_to_char( "Syntax : delete [social]\n\r", ch );
return FALSE;
}
iSocial = social_lookup(argument);
if (iSocial == -1)
{
send_to_char( "SEdit : social doesn't exhist\n\r", ch );
return FALSE;
}
/*
* Really bad if someone else is editing a social
* and you delete it.
*/
for ( d = descriptor_list; d; d = d->next )
{
if ( d->connected != CON_PLAYING
|| (tch = CH(d)) == NULL || tch->desc == NULL )
continue;
if ( tch->desc->editor == ED_SOCIAL )
edit_done(ch);
}
new_table = malloc (sizeof(struct social_type) * maxSocial);
if (!new_table)
{
send_to_char ("Memory allocation failed. Brace for impact...\n\r",ch);
return FALSE;
}
/* Copy all elements of old table into new table, except the deleted social */
for (i = 0, j = 0; i < maxSocial+1; i++)
{
if (i != iSocial) /* copy, increase only if copied */
{
new_table[j] = social_table[i];
j++;
}
}
free (social_table);
social_table = new_table;
maxSocial--; /* Important :() */
send_to_char ("Social Deleted.\n\r",ch);
return TRUE;
}
bool sedit_show( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL(ch,pSocial );
ch_printf( ch, "{gName {b[{c%s{b]\n\r", pSocial->name );
ch_printf( ch, "{gChar_No_Arg: {w%s\n\r", pSocial->char_no_arg );
ch_printf( ch, "{gOthers_No_Arg:{w%s\n\r", pSocial->others_no_arg );
ch_printf( ch, "{gChar_Found: {w%s\n\r", pSocial->char_found );
ch_printf( ch, "{gOthers_Found: {w%s\n\r", pSocial->others_found );
ch_printf( ch, "{gVictim_Found: {w%s\n\r", pSocial->vict_found );
ch_printf( ch, "{gChar_Auto: {w%s\n\r", pSocial->char_auto );
ch_printf( ch, "{gOthers_Auto: {w%s\n\r", pSocial->others_auto );
return FALSE;
}
bool sedit_name( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: name <$name>\n\r", ch );
return FALSE;
}
free_string( pSocial->name );
pSocial->name = str_dup( argument );
send_to_char( "Name set.\n\r", ch );
return FALSE;
}
bool sedit_change( CHAR_DATA *ch, char *argument, char **which,
bool hasvict )
{
char const *legal = "nNeEmMsSgGoO%$";
const char *p;
if( !hasvict )
legal = "nemsgo%$";
for( p = strchr( argument, '$' );
p && *p; p = strchr( p, '$' ) )
{
p++;
if( !*p || !strchr( legal, *p ) )
{
send_to_char( "Illegal act string.\n\r", ch );
return FALSE;
}
}
free_string( *which );
*which = str_dup( argument );
send_to_char( "Value set.\n\r", ch );
return TRUE;
}
bool sedit_cna( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: cna <$char no arg>\n\r", ch );
return FALSE;
}
return sedit_change( ch, argument, &pSocial->char_no_arg, FALSE );
}
bool sedit_ona( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: ona <$others no arg>\n\r", ch );
return FALSE;
}
return sedit_change( ch, argument, &pSocial->others_no_arg, FALSE );
}
bool sedit_cf( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: cf <$char found>\n\r", ch );
return FALSE;
}
return sedit_change( ch, argument, &pSocial->char_found, TRUE );
}
bool sedit_of( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: of <$others found>\n\r", ch );
return FALSE;
}
return sedit_change( ch, argument, &pSocial->others_found, TRUE );
}
bool sedit_vf( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: vf <$victim found>\n\r", ch );
return FALSE;
}
return sedit_change( ch, argument, &pSocial->vict_found, TRUE );
}
bool sedit_ca( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: ca <$char auto>\n\r", ch );
return FALSE;
}
return sedit_change( ch, argument, &pSocial->char_auto, FALSE );
}
bool sedit_oa( CHAR_DATA *ch, char *argument )
{
struct social_type *pSocial;
EDIT_SOCIAL( ch, pSocial );
if( argument[0] == '\0' )
{
send_to_char( "Syntax: oa <$others auto>\n\r", ch );
return FALSE;
}
return sedit_change( ch, argument, &pSocial->others_auto, FALSE );
}