/****************************************************************************
* [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | *
* -----------------------------------------------------------| \\._.// *
* SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version) | (0...0) *
* -----------------------------------------------------------| ).:.( *
* SMAUG (C) 1994, 1995, 1996 by Derek Snider | {o o} *
* -----------------------------------------------------------| / ' ' \ *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, |~'~.VxvxV.~'~*
* Scryn, Swordbearer, Rennard, Tricops, and Gorog. | *
* ------------------------------------------------------------------------ *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe. *
* ------------------------------------------------------------------------ *
* Comments: 'notes' attached to players to keep track of outstanding *
* and problem players. -haus 6/25/1995 *
****************************************************************************/
/* INSTALLATION: 1) Add following stuff to smaug.h
*
* CNoteData * comments; (* inside CCharacter definition *)
* DECLARE_DO_FUN (do_comment );
*
* 2) Add do_comment to interp.c, as usual
*
* 3) in save.c the following must be added
*
* save.c:107: if (ch->comments) (* saves comments *)
* save.c:108: fwrite_comments (ch, fp); (* in file *)
*
*
* save.c:411: ch->comments = NULL; (* nulls ch->comments *)
*
*
* save.c:457: else if (!str_cmp (word, "COMMENT")) fread_comment (ch, fp); (*snags #COMMENT*)
*
* 4) That looks like it to these eyes. Lemme know if i forgot anything.
*
*
* EXAMPLE: See end of this file.
*
*/
#include "stdafx.h"
#include "smaug.h"
#include "smaugx.h"
#include "objects.h"
#include "rooms.h"
#include "SmaugWizDoc.h"
#include "descriptor.h"
#include "character.h"
void note_attach (CCharacter *ch);
void comment_remove (CCharacter *ch, CCharacter *victim, CNoteData *pnote)
{
if (!victim->comments)
{
bug ("comment remove: null board", 0);
return;
}
if (!pnote)
{
bug ("comment remove: null pnote", 0);
return;
}
/*
* Remove comment from linked list.
*/
if (!pnote->GetPrev ())
victim->comments = pnote->GetNext ();
else
pnote->GetPrev ()->SetNext (pnote->GetNext ());
STRFREE (pnote->text );
STRFREE (pnote->subject);
STRFREE (pnote->to_list);
STRFREE (pnote->date );
STRFREE (pnote->sender );
delete pnote;
/*
* Rewrite entire list.
*/
save_char_obj (victim);
return;
}
void do_comment (CCharacter *ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
char arg1[MAX_INPUT_LENGTH];
CNoteData *pnote;
CCharacter *victim;
int vnum;
int anum;
if (ch->IsNpc ())
{
ch->SendText ("Mobs can't use the comment command.\n\r");
return;
}
if (!ch->GetDesc ())
{
bug ("do_comment: no descriptor", 0);
return;
}
/* Put in to prevent crashing when someone issues a comment command
from within the editor. -Narn */
if (ch->GetDesc ()->m_Connected == CON_EDITING)
{
ch->SendText ("You can't use the comment command from within the editor.\n\r");
return;
}
switch (ch->GetSubstate ())
{
default:
break;
case SUB_WRITING_NOTE:
if (!ch->GetNotes ())
{
bug ("do_comment: note got lost?", 0);
ch->SendText ("Your note got lost!\n\r");
ch->StopEditing ();
return;
}
if (ch->dest_buf != ch->GetNotes ())
bug ("do_comment: sub_writing_note: ch->dest_buf != ch->GetNotes ()", 0);
STRFREE (ch->GetNotes ()->text);
ch->GetNotes ()->text = ch->GetEditBuffer ();
ch->StopEditing ();
return;
}
set_char_color (AT_NOTE, ch);
argument = one_argument (argument, arg);
smash_tilde (argument);
if (!str_cmp (arg, "about"))
{
victim = get_char_world (ch, argument);
if (!victim)
{
ch->SendText ("They're not logged on!\n\r"); /* maybe fix this? */
return;
}
if (victim->IsNpc ())
{
ch->SendText ("No comments about mobs\n\r");
return;
}
}
if (!str_cmp (arg, "list"))
{
victim = get_char_world (ch, argument);
if (!victim)
{
ch->SendText ("They're not logged on!\n\r"); /* maybe fix this? */
return;
}
if (victim->IsNpc ())
{
ch->SendText ("No comments about mobs\n\r");
return;
}
if (victim->GetTrustLevel () >= ch->GetTrustLevel ())
{
ch->SendText ("You're not of the right caliber to do this...\n\r");
return;
}
if (!victim->comments)
{
ch->SendText ("There are no relevant comments.\n\r");
return;
}
vnum = 0;
for (pnote = victim->comments; pnote; pnote = pnote->GetNext ())
{
vnum++;
sprintf (buf, "%2d) %-10s [%s] %s\n\r",
vnum,
pnote->sender,
pnote->date,
pnote->subject);
/* Brittany added date to comment list and whois with above change */
ch->SendText (buf);
}
/* act (AT_ACTION, "$n glances over the notes.");, NULL, NULL, TO_ROOM); */
return;
}
if (!str_cmp (arg, "read"))
{
BOOL fAll;
argument = one_argument (argument, arg1);
victim = get_char_world (ch, arg1);
if (!victim)
{
ch->SendText ("They're not logged on!\n\r"); /* maybe fix this? */
return;
}
if (victim->IsNpc ())
{
ch->SendText ("No comments about mobs\n\r");
return;
}
if (victim->GetTrustLevel () >= ch->GetTrustLevel ())
{
ch->SendText ("You're not of the right caliber to do this...\n\r");
return;
}
if (!victim->comments)
{
ch->SendText ("There are no relevant comments.\n\r");
return;
}
if (!str_cmp (argument, "all"))
{
fAll = TRUE;
anum = 0;
}
else
if (is_number (argument))
{
fAll = FALSE;
anum = atoi (argument);
}
else
{
ch->SendText ("Note read which number?\n\r");
return;
}
vnum = 0;
for (pnote = victim->comments; pnote; pnote = pnote->GetNext ())
{
vnum++;
if (vnum == anum || fAll)
{
sprintf (buf, "[%3d] %s: %s\n\r%s\n\rTo: %s\n\r",
vnum,
pnote->sender,
pnote->subject,
pnote->date,
pnote->to_list
);
ch->SendText (buf);
ch->SendText (pnote->text);
/* act (AT_ACTION, "$n reads a note.");, NULL, NULL, TO_ROOM); */
return;
}
}
ch->SendText ("No such comment.\n\r");
return;
}
if (!str_cmp (arg, "write"))
{
note_attach (ch);
ch->SetSubstate (SUB_WRITING_NOTE);
ch->dest_buf = ch->GetNotes ();
start_editing (ch, ch->GetNotes ()->text);
return;
}
if (!str_cmp (arg, "subject"))
{
note_attach (ch);
STRFREE (ch->GetNotes ()->subject);
ch->GetNotes ()->subject = STRALLOC (argument);
ch->SendText ("Ok.\n\r");
return;
}
if (!str_cmp (arg, "to"))
{
note_attach (ch);
STRFREE (ch->GetNotes ()->to_list);
ch->GetNotes ()->to_list = STRALLOC (argument);
ch->SendText ("Ok.\n\r");
return;
}
if (!str_cmp (arg, "clear"))
{
if (ch->GetNotes ())
{
STRFREE (ch->GetNotes ()->text);
STRFREE (ch->GetNotes ()->subject);
STRFREE (ch->GetNotes ()->to_list);
STRFREE (ch->GetNotes ()->date);
STRFREE (ch->GetNotes ()->sender);
delete ch->GetNotes ();
}
ch->SetNotes (NULL);
ch->SendText ("Ok.\n\r");
return;
}
if (!str_cmp (arg, "show"))
{
if (!ch->GetNotes ())
{
ch->SendText ("You have no comment in progress.\n\r");
return;
}
sprintf (buf, "%s: %s\n\rTo: %s\n\r",
ch->GetNotes ()->sender,
ch->GetNotes ()->subject,
ch->GetNotes ()->to_list
);
ch->SendText (buf);
ch->SendText (ch->GetNotes ()->text);
return;
}
if (!str_cmp (arg, "post"))
{
char *strtime;
if (!ch->GetNotes ())
{
ch->SendText ("You have no comment in progress.\n\r");
return;
}
argument = one_argument (argument, arg1);
victim = get_char_world (ch, arg1);
if (!victim)
{
ch->SendText ("They're not logged on!\n\r"); /* maybe fix this? */
return;
}
if (victim->IsNpc ())
{
ch->SendText ("No comments about mobs\n\r");
return;
}
if (victim->GetTrustLevel () > ch->GetTrustLevel ())
{
ch->SendText ("You're not of the right caliber to do this...\n\r");
return;
}
/* act (AT_ACTION, "$n posts a note.");, NULL, NULL, TO_ROOM); */
strtime = NCCP CurrentTime.GetString ();
ch->GetNotes ()->date = STRALLOC (strtime);
pnote = ch->GetNotes ();
ch->SetNotes (NULL);
/* LIFO to make life easier */
pnote->SetNext (victim->comments);
if (victim->comments)
victim->comments->SetPrev (pnote);
pnote->SetPrev (NULL);
victim->comments = pnote;
save_char_obj (victim);
#ifdef NOTDEFD
fclose (fpReserve);
sprintf (notefile, "%s/%s", BOARD_DIR, board->note_file);
if ((fp = fopen (notefile, "a")) == NULL)
{
perror (notefile);
}
else
{
fprintf (fp, "Sender %s~\nDate %s~\nTo %s~\nSubject %s~\nText\n%s~\n\n",
pnote->sender,
pnote->date,
pnote->to_list,
pnote->subject,
pnote->text
);
fclose (fp);
}
fpReserve = fopen (NULL_FILE, "r");
#endif
ch->SendText ("Ok.\n\r");
return;
}
if (!str_cmp (arg, "remove"))
{
argument = one_argument (argument, arg1);
victim = get_char_world (ch, arg1);
if (!victim)
{
ch->SendText ("They're not logged on!\n\r"); /* maybe fix this? */
return;
}
if (victim->IsNpc ())
{
ch->SendText ("No comments about mobs\n\r");
return;
}
if ( (victim->GetTrustLevel () >= ch->GetTrustLevel ())
|| (ch->GetTrustLevel () < 58)) /* switch to some LEVEL_ thingie */
{
ch->SendText ("You're not of the right caliber to do this...\n\r");
return;
}
/*argument = one_argument (argument, arg); */
if (!is_number (argument))
{
ch->SendText ("Comment remove which number?\n\r");
return;
}
anum = atoi (argument);
vnum = 0;
for (pnote = victim->comments; pnote; pnote = pnote->GetNext ())
{
vnum++;
if ((58 <= ch->GetTrustLevel ()) /* switch to some LEVEL_ thingie */
&& (vnum == anum))
{
comment_remove (ch, victim, pnote);
ch->SendText ("Ok.\n\r");
/* act (AT_ACTION, "$n removes a note.");, NULL, NULL, TO_ROOM); */
return;
}
}
ch->SendText ("No such comment.\n\r");
return;
}
ch->SendText ("Huh? Type 'help comment' for usage (i hope!).\n\r");
return;
}
void fwrite_comments (CCharacter *ch, FILE *fp)
{
CNoteData *pnote;
if (! ch->comments)
return;
for (pnote=ch->comments; pnote; pnote = pnote->GetNext ()) {
fprintf (fp, "#COMMENT\n");
fprintf (fp, "sender %s~\n", pnote->sender);
fprintf (fp, "date %s~\n", pnote->date);
fprintf (fp, "to %s~\n", pnote->to_list);
fprintf (fp, "subject %s~\n", pnote->subject);
fprintf (fp, "text\n%s~\n", pnote->text);
}
}
void fread_comment (CCharacter *ch, FILE *fp)
{
char *word, *pLine;
CNoteData *pNote = new CNoteData;
for (;;) {
if (feof (fp)) {
fclose (fp);
delete pNote;
bug ("fread_comment: EOF while read for %s", ch->GetName ());
return;
}
pLine = fread_line (fp);
word = ParseWord (pLine);
if (! str_cmp (word, "sender"))
pNote->sender = ParseString (pLine, fp);
else if (! str_cmp (word, "date"))
pNote->date = ParseString (pLine, fp);
else if (! str_cmp (word, "to"))
pNote->to_list = ParseString (pLine, fp);
else if (! str_cmp (word, "subject"))
pNote->subject = ParseString (pLine, fp);
else if (! str_cmp (word, "text")) {
pNote->text = ParseString (pLine, fp);
break;
}
else {
bug ("fread_comment: Bad keyword (%s)", word);
ThrowSmaugException (SE_NOTES);
}
}
pNote->SetNext (ch->comments);
pNote->SetPrev (NULL);
ch->comments = pNote;
}
/*
<758hp 100m 690mv> <#10316> loadup boo
Log: Haus: loadup boo
Log: Reading in player data for: Boo
Done.
<758hp 100m 690mv> <#10316> poke boo
You poke him in the ribs.
<758hp 100m 690mv> <#10316> comment subject boo's a nutcase!
Ok.
<758hp 100m 690mv> <#10316> comment to all
Ok.
<758hp 100m 690mv> <#10316> comment write
Begin entering your text now (/? = help /s = save /c = clear /l = list)
-----------------------------------------------------------------------
> He transed shimmy to temple square!
> /s
Done.
<758hp 100m 690mv> <#10316> comment post boo
Ok.
<758hp 100m 690mv> <#10316> comment list boo
1) Haus: boo's a nutcase!
<758hp 100m 690mv> <#10316> comment read boo 1
[ 1] Haus: boo's a nutcase!
Sun Jun 25 18:26:54 1995
To: all
He transed shimmy to temple square!
<758hp 100m 690mv> <#10316> comment remove boo 1
Ok.
<758hp 100m 690mv> <#10316> comment list boo
There are no relevent comments.
*/