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