/***************************************************************************
* 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);
void do_sign(CHAR_DATA *ch,char *argument)
{
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;
}