/*************************************************************************** * 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; }