/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments 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 *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* 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 *
***************************************************************************/
/***************************************************************************
* ROT 1.4 is copyright 1996-1997 by Russ Walsh *
* By using this code, you have agreed to follow the terms of the *
* ROT license, in the file doc/rot.license *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"
#include "recycle.h"
#include "tables.h"
/* local procedures */
void parse_sign ( CHAR_DATA * ch, char *argument, int type );
CH_CMD ( do_sign )
{
parse_sign ( ch, argument, NOTE_SIGN );
}
void sign_attach ( CHAR_DATA * ch, int type )
{
NOTE_DATA *pnote;
if ( ch->pnote != NULL )
return;
pnote = new_note ( );
pnote->next = NULL;
pnote->sender = str_dup ( ch->name );
pnote->date = str_dup ( "" );
pnote->to_list = str_dup ( "" );
pnote->subject = str_dup ( "" );
pnote->text = str_dup ( "" );
pnote->type = type;
ch->pnote = pnote;
return;
}
void parse_sign ( CHAR_DATA * ch, char *argument, int type )
{
BUFFER *buffer;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
if ( IS_NPC ( ch ) )
return;
argument = one_argument ( argument, arg );
smash_tilde ( argument );
if ( arg[0] == '\0' )
{
return;
}
if ( !str_cmp ( arg, "+" ) )
{
sign_attach ( ch, type );
if ( ch->pnote->type != type )
{
send_to_char
( "You already have a different note in progress.\n\r", ch );
return;
}
if ( strlen ( ch->pnote->text ) + strlen ( argument ) >= 4096 )
{
send_to_char ( "Sign too long.\n\r", ch );
return;
}
buffer = new_buf ( );
add_buf ( buffer, ch->pnote->text );
add_buf ( buffer, argument );
add_buf ( buffer, "\n\r" );
free_string ( ch->pnote->text );
ch->pnote->text = str_dup ( buf_string ( buffer ) );
free_buf ( buffer );
send_to_char ( "Ok.\n\r", ch );
return;
}
if ( !str_cmp ( arg, "-" ) )
{
int len;
bool found = FALSE;
sign_attach ( ch, type );
if ( ch->pnote->type != type )
{
send_to_char
( "You already have a different note in progress.\n\r", ch );
return;
}
if ( ch->pnote->text == NULL || ch->pnote->text[0] == '\0' )
{
send_to_char ( "No lines left to remove.\n\r", ch );
return;
}
strcpy ( buf, ch->pnote->text );
for ( len = strlen ( buf ); len > 0; len-- )
{
if ( buf[len] == '\r' )
{
if ( !found ) /* back it up */
{
if ( len > 0 )
len--;
found = TRUE;
}
else /* found the second one */
{
buf[len + 1] = '\0';
free_string ( ch->pnote->text );
ch->pnote->text = str_dup ( buf );
return;
}
}
}
buf[0] = '\0';
free_string ( ch->pnote->text );
ch->pnote->text = str_dup ( buf );
return;
}
if ( !str_prefix ( arg, "make" ) )
{
sign_attach ( ch, type );
if ( ch->pnote->type != type )
{
send_to_char
( "You already have a different note in progress.\n\r", ch );
return;
}
free_string ( ch->pnote->to_list );
free_string ( ch->pnote->subject );
send_to_char ( "Ok.\n\r", ch );
return;
}
if ( !str_prefix ( arg, "clear" ) )
{
if ( ch->pnote != NULL )
{
free_note ( ch->pnote );
ch->pnote = NULL;
}
send_to_char ( "Ok.\n\r", ch );
return;
}
if ( !str_prefix ( arg, "show" ) )
{
if ( ch->pnote == NULL )
{
send_to_char ( "You have no sign in progress.\n\r", ch );
return;
}
if ( ch->pnote->type != type )
{
send_to_char ( "You aren't working on that kind of note.\n\r",
ch );
return;
}
send_to_char ( ch->pnote->text, ch );
return;
}
if ( !str_prefix ( arg, "post" ) || !str_prefix ( arg, "send" ) ||
!str_prefix ( arg, "save" ) )
{
EXTRA_DESCR_DATA *ed;
if ( ch->pnote == NULL )
{
send_to_char ( "You have no sign in progress.\n\r", ch );
return;
}
if ( ch->pnote->type != type )
{
send_to_char ( "You aren't working on that kind of note.\n\r",
ch );
return;
}
pObjIndex = get_obj_index ( OBJ_VNUM_QUEST_SIGN );
obj = create_object ( pObjIndex, ch->level );
obj_to_room ( obj, ch->in_room );
ed = new_extra_descr ( );
ed->keyword = str_dup ( "sign" );
buffer = new_buf ( );
add_buf ( buffer, ch->pnote->text );
ed->description = str_dup ( buf_string ( buffer ) );
ed->next = NULL;
obj->extra_descr = ed;
ch->pnote = NULL;
send_to_char ( "A sign now floats before you.\n\r", ch );
return;
}
send_to_char ( "You can't do that.\n\r", ch );
return;
}