/***************************************************************************
* 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 Envy Diku Mud, you must comply with *
* the original Diku license in 'license.doc', the Merc license in *
* 'license.txt', as well as the Envy license in 'license.nvy'. *
* 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-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
* *
* Code Adapted and Improved by Abandoned Realms Mud *
* and Aabahran: The Forsaken Lands Mud by Virigoth *
* *
* Continued Production of this code is available at www.flcodebase.com *
***************************************************************************/
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define _XOPEN_SOURCE
#include <unistd.h>
#include <crypt.h>
#include <time.h>
#include <ctype.h>
#include "merc.h"
#include "cabal.h"
#include "recycle.h"
#include "interp.h"
#include "magic.h"
#include "bounty.h"
#include "tome.h"
#include "misc.h"
#include "comm.h"
#include "clan.h"
extern int nAllocString;
extern int sAllocString;
int nAllocPerm;
int sAllocPerm;
extern void save_mud();
extern void read_mud();
extern void save_helps();
extern void make_htmlwho(bool fShow);
extern void seed_objects();
extern AREA_DATA* get_random_area args ( (int min_av, int max_av,
int min_rv, int max_rv,
int* includ, int i_num,
int* exclud, int e_num) );
/* checks if the demon can broadcast the message */
/* returns TRUE if can. */
bool can_demon_talk(CHAR_DATA* ch, int cost)
{
if(IS_NPC(ch))
return TRUE;
if (!IS_TELEPATH(ch))
return FALSE;
if (IS_IMMORTAL(ch))
return TRUE;
//Forget
if (is_affected(ch, gsn_forget))
{
send_to_char("You have forgotten how to communicate through telepathy.\n\r", ch);
return FALSE;
}
//Telelock
if (is_affected(ch, gsn_tele_lock))
{
send_to_char("Your efforts seem to be blocked and you fail.\n\r", ch);
return FALSE;
}
//Limbo
if (IS_SET(ch->in_room->room_flags, ROOM_DARK_RIFT))
{
send_to_char("You are alone.. So alone..\n\r", ch);
return FALSE;
}
//Cost
if (ch->mana < cost)
{
send_to_char("You lack the strength to broadcast your message.\n\r", ch);
return FALSE;
}
else
ch->mana -= cost;
return TRUE;
}
void do_delet( CHAR_DATA *ch, char *argument)
{
send_to_char("You must type the full command to delete yourself.\n\r",ch);
}
void do_delete( CHAR_DATA *ch, char *argument)
{
char strsave[MIL];
if (IS_NPC(ch))
return;
if (ch->pcdata->confirm_delete)
{
if (argument[0] != '\0')
{
send_to_char("Delete status removed.\n\r",ch);
ch->pcdata->confirm_delete = FALSE;
return;
}
/* start deleting */
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( ch->name ) );
wiznet("$N has deleted $Mself.",ch,NULL,0,0,0);
stop_fighting(ch,TRUE);
eq_purge(ch);
if (ch->level > 20)
deny_record(ch);
act("$n has left permanently, never to return.",ch,NULL,NULL,TO_ROOM);
if (ch->pCabal){
update_cabal_skills(ch, ch->pCabal, TRUE, TRUE);
char_from_cabal( ch );
}
if (HAS_CLAN(ch))
CharFromClan( ch );
if (ch->pcdata->pbounty){
rem_bounty( ch->pcdata->pbounty );
free_bounty( ch->pcdata->pbounty );
}
extract_char( ch, TRUE );
if ( ch->desc != NULL )
close_socket( ch->desc );
unlink(strsave);
return;
}
/* check for password */
if (!IS_NULLSTR(ch->pcdata->pwddel)){
if (IS_NULLSTR(argument)){
send_to_char("delete <password>\n\r", ch);
return;
}
if (strcmp( crypt( argument, ch->name ), ch->pcdata->pwddel )
&& strcmp( crypt( argument, ch->pcdata->pwddel ), ch->pcdata->pwddel ) )
{
WAIT_STATE( ch, 40 );
send_to_char( "Wrong password. Wait 10 seconds.\n\r", ch );
return;
}
}
if (is_fight_delay(ch,120)){
send_to_char("At request of players this command cannot be used after recent combat or death.\n\r", ch);
ch->pcdata->confirm_delete = FALSE;
return;
}
send_to_char("Type delete again to confirm this command.\n\r",ch);
send_to_char("WARNING: this command is irreversible.\n\r",ch);
send_to_char("Typing delete with an argument will undo delete status.\n\r",ch);
ch->pcdata->confirm_delete = TRUE;
wiznet("$N is contemplating deletion.",ch,NULL,0,0,get_trust(ch));
}
void do_channels( CHAR_DATA *ch, char *argument)
{
send_to_char(" channel status\n\r",ch);
send_to_char("---------------------\n\r",ch);
send_to_char("auction ",ch);
if (!IS_SET(ch->comm,COMM_NOAUCTION)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
/*
send_to_char("Q/A ",ch);
if (!IS_SET(ch->comm,COMM_NOQUESTION)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
*/
send_to_char("cabal ",ch);
if (!IS_SET(ch->comm,COMM_NOCABAL)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
if (IS_IMMORTAL(ch))
{
send_to_char("god channel ",ch);
if(!IS_SET(ch->comm,COMM_NOWIZ)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
send_to_char("pray ",ch);
if (!IS_SET(ch->comm,COMM_NOPRAY)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
}
if (!is_pk(ch,ch) || IS_IMMORTAL(ch) )
{
send_to_char("newbie chat ",ch);
if (!IS_SET(ch->comm,COMM_NONEWBIE)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
}
if ( IS_IMMORTAL(ch) )
{
send_to_char("hear all ",ch);
if (IS_SET(ch->act,PLR_HEARALL)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
}
send_to_char("yells ",ch);
if (!IS_SET(ch->comm,COMM_YELLSOFF)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
send_to_char("tells ",ch);
if (!IS_SET(ch->comm,COMM_DEAF)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
send_to_char("quiet mode ",ch);
if (IS_SET(ch->comm,COMM_QUIET)) send_to_char("ON\n\r",ch);
else send_to_char("OFF\n\r",ch);
if (IS_SET(ch->comm,COMM_AFK)) send_to_char("You are AFK.\n\r",ch);
if (IS_SET(ch->comm,COMM_SNOOP_PROOF)) send_to_char("You are immune to snooping.\n\r",ch);
if (ch->lines != PAGELEN)
{
if (ch->lines)
sendf(ch,"You display %d lines of scroll.\n\r",ch->lines+2);
else
send_to_char("Scroll buffering is off.\n\r",ch);
}
if (ch->prompt != NULL)
sendf(ch,"Your current prompt is: %s\n\r",ch->prompt);
if (IS_SET(ch->comm,COMM_NOYELL)) send_to_char("You cannot yell.\n\r",ch);
if (IS_SET(ch->comm,COMM_NOTELL)) send_to_char("You cannot use tell.\n\r",ch);
if (IS_SET(ch->comm,COMM_NOCHANNELS)) send_to_char("You cannot use channels.\n\r",ch);
if (IS_SET(ch->comm,COMM_NOEMOTE)) send_to_char("You cannot show emotions.\n\r",ch);
if (IS_SET(ch->act,PLR_DOOF)) send_to_char("You have lost the favor of the gods.\n\r",ch);
}
void do_deaf( CHAR_DATA *ch, char *argument)
{
if (IS_SET(ch->comm,COMM_DEAF))
{
send_to_char("You can now hear tells again.\n\r",ch);
REMOVE_BIT(ch->comm,COMM_DEAF);
}
else
{
send_to_char("From now on, you won't hear tells.\n\r",ch);
SET_BIT(ch->comm,COMM_DEAF);
}
}
void do_quiet ( CHAR_DATA *ch, char * argument)
{
if (IS_SET(ch->comm,COMM_QUIET))
{
send_to_char("Quiet mode removed.\n\r",ch);
REMOVE_BIT(ch->comm,COMM_QUIET);
}
else
{
send_to_char("From now on, you will only hear says and emotes.\n\r",ch);
SET_BIT(ch->comm,COMM_QUIET);
}
}
void do_afk ( CHAR_DATA *ch, char * argument)
{
if (IS_SET(ch->comm,COMM_AFK))
{
if (buf_string(ch->pcdata->buffer)[0] == '\0')
send_to_char("AFK mode removed.\n\r",ch);
else
send_to_char("AFK mode removed. Type 'replay' to see tells.\n\r",ch);
act("$n is no longer AFK.",ch,NULL,NULL,TO_ROOM);
REMOVE_BIT(ch->comm,COMM_AFK);
}
else
{
send_to_char("You are now in AFK mode.\n\r",ch);
act("$n is now AFK.",ch,NULL,NULL,TO_ROOM);
clear_buf(ch->pcdata->buffer);
SET_BIT(ch->comm,COMM_AFK);
}
}
void do_replay (CHAR_DATA *ch, char *argument)
{
if (IS_NPC(ch))
{
send_to_char("You can't replay.\n\r",ch);
return;
}
if (buf_string(ch->pcdata->buffer)[0] == '\0')
{
send_to_char("You have no tells to replay.\n\r",ch);
return;
}
page_to_char(buf_string(ch->pcdata->buffer),ch);
clear_buf(ch->pcdata->buffer);
}
void do_auction( CHAR_DATA *ch, char *argument )
{
char buf[MIL];
DESCRIPTOR_DATA *d;
if (argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_NOAUCTION))
{
send_to_char("Auction channel is now ON.\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOAUCTION);
}
else
{
send_to_char("Auction channel is now OFF.\n\r",ch);
SET_BIT(ch->comm,COMM_NOAUCTION);
}
return;
}
strcpy(buf, argument);
if (IS_SET(ch->comm,COMM_QUIET))
{
send_to_char("You must turn off quiet mode first.\n\r",ch);
return;
}
if ( ch->level < 2 )
{
send_to_char( "Sorry, not right now due to spammers.\n\r",ch);
return;
}
if (IS_SET(ch->comm,COMM_NOCHANNELS))
{
send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) )
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) )
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) )
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
REMOVE_BIT(ch->comm,COMM_NOAUCTION);
makedrunk(argument,ch);
sendf( ch, "You auction '`6%s``'\n\r", argument );
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch && d->character->in_room != NULL
&& (d->character->in_room->area == ch->in_room->area || IS_SET(d->character->act,PLR_HEARALL))
&& !IS_SET(d->character->comm,COMM_NOAUCTION) && !IS_SET(d->character->comm,COMM_QUIET)
&& !is_affected(d->character,gsn_silence) && !IS_AFFECTED2(d->character, AFF_SILENCE) && !is_ignore(d->character,ch))
act_new("$n auctions '`6$t``'", ch,
(is_affected(d->character, gsn_com_lan) ? buf: IS_IMMORTAL(d->character) ? buf : argument),
d->character,TO_VICT,POS_SLEEPING);
}
void do_pray( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
char arg_buf[MIL];
if ( (argument[0] == '\0' ) && IS_IMMORTAL(ch) )
{
if (IS_SET(ch->comm,COMM_NOPRAY))
{
send_to_char("Pray channel is now ON.\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOPRAY);
}
else
{
send_to_char("Pray channel is now OFF.\n\r",ch);
SET_BIT(ch->comm,COMM_NOPRAY);
}
return;
}
strcpy(arg_buf, argument);
if (IS_SET(ch->comm,COMM_QUIET))
{
send_to_char("You must turn off quiet mode first.\n\r",ch);
return;
}
if (IS_SET(ch->comm,COMM_NOCHANNELS))
{
send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
return;
}
if (IS_SET(ch->act,PLR_DOOF))
{
send_to_char("You pray, but nobody seems to care.\n\r",ch);
return;
}
REMOVE_BIT(ch->comm,COMM_NOPRAY);
sendf( ch, "You pray '`&%s``'\n\r", argument );
if (argument[0] == '\0')
return;
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch && IS_IMMORTAL(d->character)
&& !IS_SET(d->character->comm,COMM_NOPRAY) && !IS_SET(d->character->comm,COMM_QUIET) && !is_ignore(d->character,ch))
act_new( "$n prays '`&$t``'", ch,
(is_affected(d->character, gsn_com_lan) ? arg_buf: IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character, TO_VICT,POS_SLEEPING );
}
void do_question( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
char arg_buf[MIL];
if (argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_NOQUESTION))
{
send_to_char("Q/A channel is now ON.\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOQUESTION);
}
else
{
send_to_char("Q/A channel is now OFF.\n\r",ch);
SET_BIT(ch->comm,COMM_NOQUESTION);
}
return;
}
strcpy(arg_buf, argument);
if (IS_SET(ch->comm,COMM_QUIET))
{
send_to_char("You must turn off quiet mode first.\n\r",ch);
return;
}
if ( ch->level < 2 )
{
send_to_char( "Sorry, have to level before you can yell due to spammers.\n\r",ch);
return;
}
if (IS_SET(ch->comm,COMM_NOCHANNELS))
{
send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) )
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) )
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) )
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
REMOVE_BIT(ch->comm,COMM_NOQUESTION);
makedrunk(argument,ch);
sendf( ch, "You question '`6%s``'\n\r", argument );
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch && d->character->in_room != NULL
&& (d->character->in_room->area == ch->in_room->area || IS_SET(d->character->act,PLR_HEARALL))
&& !IS_AFFECTED2(d->character, AFF_SILENCE) && !IS_SET(d->character->comm,COMM_NOQUESTION)
&& !is_affected(d->character,gsn_silence) && !IS_SET(d->character->comm,COMM_QUIET) && !is_ignore(d->character,ch))
act_new("$n questions '`6$t``'", ch, (is_affected(d->character, gsn_com_lan) ? arg_buf: IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character,TO_VICT,POS_SLEEPING);
}
void do_answer( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
char arg_buf[MIL];
strcpy(arg_buf, argument);
if (argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_NOQUESTION))
{
send_to_char("Q/A channel is now ON.\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOQUESTION);
}
else
{
send_to_char("Q/A channel is now OFF.\n\r",ch);
SET_BIT(ch->comm,COMM_NOQUESTION);
}
return;
}
strcpy(arg_buf, argument);
if (IS_SET(ch->comm,COMM_QUIET))
{
send_to_char("You must turn off quiet mode first.\n\r",ch);
return;
}
if ( ch->level < 2 )
{
send_to_char( "Sorry, have to level before you can yell due to spammers.\n\r",ch);
return;
}
if (IS_SET(ch->comm,COMM_NOCHANNELS))
{
send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) )
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) )
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) )
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
REMOVE_BIT(ch->comm,COMM_NOQUESTION);
makedrunk(argument,ch);
sendf( ch, "You answer '`6%s``'\n\r", argument );
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch && d->character->in_room != NULL
&& (d->character->in_room->area == ch->in_room->area || IS_SET(d->character->act,PLR_HEARALL))
&& !IS_AFFECTED2(d->character, AFF_SILENCE) && !IS_SET(d->character->comm,COMM_NOQUESTION)
&& !is_affected(d->character,gsn_silence) && !IS_SET(d->character->comm,COMM_QUIET) && !is_ignore(d->character,ch))
act_new("$n answers '`6$t``'", ch,(is_affected(d->character, gsn_com_lan)? arg_buf : IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character,TO_VICT,POS_SLEEPING);
}
void do_cabaltalk( CHAR_DATA *ch, char *argument )
{
char buf[MSL], buf2[MSL] = "";
char arg_buf[MIL];
DESCRIPTOR_DATA *d;
const int demon_cost = 80;
bool fDemon = IS_TELEPATH(ch);
argument[0] = UPPER(argument[0]);
if (!ch->pCabal){
send_to_char("You aren't in a cabal.\n\r",ch);
return;
}
else if ( argument[0] == '\0' ){
if (IS_SET(ch->comm,COMM_NOCABAL)){
send_to_char("Cabal channel is now ON\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOCABAL);
}
else{
send_to_char("Cabal channel is now OFF\n\r",ch);
SET_BIT(ch->comm,COMM_NOCABAL);
}
return;
}
if (!IS_NPC(ch) && !IS_IMMORTAL(ch) && !IS_CABAL(get_parent(ch->pCabal), CABAL_CHAT)){
send_to_char("Your cabal does not posses this ability.\n\r", ch);
return;
}
strcpy(arg_buf, argument);
if (!IS_NPC(ch) && IS_SET(ch->comm,COMM_NOCHANNELS)){
send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
return;
}
else if (IS_AFFECTED2(ch, AFF_SILENCE) && !fDemon){
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
else if (!fDemon && is_affected(ch, gsn_gag)){
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
else if (!fDemon && is_affected(ch, gsn_uppercut)){
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
else if (fDemon && !can_demon_talk(ch, demon_cost))
return;
REMOVE_BIT(ch->comm,COMM_NOCABAL);
makedrunk(argument,ch);
if (!IS_NPC(ch) ){
sprintf(buf2, "(%s) ", get_crank( ch ) );
}
sprintf(buf,"[%s] %s$n: '`0$t``'", ch->pCabal->who_name, buf2);
act_new(buf,ch,argument,NULL,TO_CHAR,POS_DEAD);
for ( d = descriptor_list; d != NULL; d = d->next ){
CHAR_DATA* rch = d->character;
if ( d->connected != CON_PLAYING
|| rch == ch
|| rch->pCabal == NULL
|| (IS_SET(rch->comm, COMM_NOCABAL) && !IS_NPC(ch))
|| IS_AFFECTED2(rch, AFF_SILENCE)
|| IS_SET(rch->comm, COMM_QUIET)
|| !is_same_cabal(rch->pCabal, ch->pCabal)
|| is_ignore(rch, ch)){
continue;
}
act_new(buf, ch,
(is_affected(rch, gsn_com_lan)? arg_buf :
IS_IMMORTAL(rch) ? arg_buf :argument),
rch, TO_VICT, POS_DEAD);
if (!IS_NPC(rch) && rch->pcdata->eavesdropped != NULL
&& is_affected(rch->pcdata->eavesdropped,gsn_eavesdrop)
&& rch != ch && rch->pcdata->eavesdropped != ch
&& !fDemon)
{
char buf[MIL];
send_to_char("A faint message transmits from the spies.\n\r",rch->pcdata->eavesdropped);
sprintf(buf, "Someone cabaltalks '`)$t``'");
act_new(buf,rch->pcdata->eavesdropped, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ? arg_buf :argument),
NULL,TO_CHAR, POS_DEAD);
}
if (IS_NPC(rch) && rch->pIndexData->progtypes & SPEECH_PROG)
mprog_speech_trigger( arg_buf, ch, rch );
}
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL
&& is_affected(ch->pcdata->eavesdropped,gsn_eavesdrop)
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",ch->pcdata->eavesdropped);
sprintf(buf,"%s cabaltalks '`)$t``'",PERS(ch,ch->pcdata->eavesdropped));
act_new(buf,ch->pcdata->eavesdropped, (is_affected(ch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(ch) ? arg_buf : argument),
NULL,TO_CHAR, POS_DEAD);
}
}
void do_clantalk( CHAR_DATA *ch, char *argument )
{
char buf[MSL], buf2[MSL] = "";
char arg_buf[MIL];
DESCRIPTOR_DATA *d;
// const int demon_cost = 80;
bool fDemon = IS_TELEPATH(ch);
argument[0] = UPPER(argument[0]);
if (IS_NPC(ch) || !HAS_CLAN(ch))
{
send_to_char("You aren't in a clan.\n\r",ch);
return;
}
if ( argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_NOCLAN))
{
send_to_char("Clan channel is now ON\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOCLAN);
}
else
{
send_to_char("Clan channel is now OFF\n\r",ch);
SET_BIT(ch->comm,COMM_NOCLAN);
}
return;
}
strcpy(arg_buf, argument);
if (IS_SET(ch->comm,COMM_NOCHANNELS))
{
send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) && !fDemon)
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) && !fDemon)
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) && !fDemon)
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
/*
if (fDemon)
if (!can_demon_talk(ch, demon_cost))
return;
*/
sprintf(buf2, "(%s) ",clanr_table[ch->pcdata->clan_rank][1]);
REMOVE_BIT(ch->comm,COMM_NOCLAN);
makedrunk(argument,ch);
sprintf(buf,"[`8%s``]%s$n: '`0$t``'", GetClanName(GET_CLAN(ch)), buf2);
act_new(buf,ch,argument,NULL,TO_CHAR,POS_DEAD);
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch
&& !IS_AFFECTED2(d->character, AFF_SILENCE)
&& !IS_NPC(d->character)
&& !is_affected(d->character,gsn_silence)
&& !IS_SET(d->character->comm,COMM_NOCLAN)
&& !IS_SET(d->character->comm,COMM_QUIET)
&& !is_ignore(d->character,ch)){
if (GET_CLAN(ch) == GET_CLAN(d->character)){
CHAR_DATA* rch = d->character;
act_new(buf,ch,(is_affected(d->character, gsn_com_lan)? arg_buf : IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character, TO_VICT, POS_SLEEPING);
if (!IS_NPC(rch) && rch->pcdata->eavesdropped != NULL
&& is_affected(rch->pcdata->eavesdropped,gsn_eavesdrop)
&& rch != ch && rch->pcdata->eavesdropped != ch
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",rch->pcdata->eavesdropped);
sprintf(buf, "Someone clantalks '`#$t``'");
act_new(buf,rch->pcdata->eavesdropped, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ? arg_buf : argument),
NULL,TO_CHAR, POS_DEAD);
}//END parasite
}//END if same clan
}//end descriptior loop
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL
&& is_affected(ch->pcdata->eavesdropped,gsn_eavesdrop)
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",ch->pcdata->eavesdropped);
sprintf(buf,"%s clantalks '`#$t``'",PERS(ch,ch->pcdata->eavesdropped));
act_new(buf,ch->pcdata->eavesdropped, (is_affected(ch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(ch) ? arg_buf : argument),
NULL,TO_CHAR, POS_DEAD);
}
}
void do_jcabaltalk( CHAR_DATA *ch, char *argument )
{
char buf[MSL];
DESCRIPTOR_DATA *d;
char arg_buf[MIL];
bool fDemon = IS_TELEPATH(ch);
strcpy(arg_buf, argument);
makedrunk(argument,ch);
argument[0] = UPPER(argument[0]);
sprintf(buf,"[`0JUSTICE``] $n: '`0$t``'");
act_new(buf,ch,argument,NULL,TO_CHAR,POS_DEAD);
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING
&& ch->pCabal && IS_CABAL(ch->pCabal, CABAL_JUSTICE)
&& !IS_AFFECTED2(d->character, AFF_SILENCE)
&& !IS_SET(d->character->comm,COMM_NOCABAL)
&& !is_affected(d->character,gsn_silence)
&& !IS_SET(d->character->comm,COMM_QUIET)
&& !is_ignore(d->character,ch)){
CHAR_DATA* rch = d->character;
act_new(buf,ch,(is_affected(d->character, gsn_com_lan)? arg_buf :
IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character,TO_VICT,POS_SLEEPING);
if (!IS_NPC(rch) && rch->pcdata->eavesdropped != NULL
&& is_affected(rch->pcdata->eavesdropped,gsn_eavesdrop)
&& rch != ch && rch->pcdata->eavesdropped != ch
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",rch->pcdata->eavesdropped);
sprintf(buf, "Someone cabaltalks '`)$t``'");
act_new(buf,rch->pcdata->eavesdropped, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ? arg_buf : argument),
NULL,TO_CHAR, POS_DEAD);
}
if (IS_NPC(rch) && rch->pIndexData->progtypes & SPEECH_PROG)
mprog_speech_trigger( arg_buf, ch, rch );
}
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL
&& is_affected(ch->pcdata->eavesdropped,gsn_eavesdrop)
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",ch->pcdata->eavesdropped);
sprintf(buf,"%s cabaltalks '`)$t``'",PERS(ch,ch->pcdata->eavesdropped));
act_new(buf,ch->pcdata->eavesdropped, (is_affected(ch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(ch) ? arg_buf : argument),
NULL,TO_CHAR, POS_DEAD);
}
}
void do_newbiechat( CHAR_DATA *ch, char *argument )
{
char buf[MSL];
DESCRIPTOR_DATA *d;
argument[0] = UPPER(argument[0]);
if (is_pk(ch,ch)
&& (ch->pCabal == NULL || !IS_CABAL2(ch->pCabal, CABAL2_NEWBIE))
&& !IS_IMMORTAL(ch)
&& !IS_GAME(ch, GAME_NEWBIE))
{
send_to_char("You're all grown up now, you can't use newbie chat anymore.\n\r",ch);
return;
}
if ( argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_NONEWBIE))
{
send_to_char("Newbie chat is now ON\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NONEWBIE);
}
else
{
send_to_char("Newbie chat is now OFF\n\r",ch);
SET_BIT(ch->comm,COMM_NONEWBIE);
}
return;
}
if (IS_SET(ch->comm,COMM_NOCHANNELS))
{
send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
return;
}
REMOVE_BIT(ch->comm,COMM_NONEWBIE);
sprintf(buf, "$n NEWBIE chats: '`0$t``'");
act_new(buf,ch,argument,NULL,TO_CHAR,POS_DEAD);
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch
&& !IS_NPC(d->character)
&& (!is_pk(d->character,d->character)
|| IS_IMMORTAL(d->character)
|| (d->character->pCabal != NULL
&& IS_CABAL2(d->character->pCabal, CABAL2_NEWBIE))
|| IS_GAME(d->character, GAME_NEWBIE))
&& !IS_SET(d->character->comm,COMM_NONEWBIE)
&& !IS_SET(d->character->comm,COMM_QUIET)
&& !is_ignore(d->character,ch))
act_new(buf,ch,argument,d->character,TO_VICT,POS_MEDITATE);
}
void do_immtalk( CHAR_DATA *ch, char *argument )
{
char buf[MSL];
DESCRIPTOR_DATA *d;
char arg_buf[MIL];
argument[0] = UPPER(argument[0]);
if ( argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_NOWIZ))
{
send_to_char("Immortal channel is now ON\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOWIZ);
}
else
{
send_to_char("Immortal channel is now OFF\n\r",ch);
SET_BIT(ch->comm,COMM_NOWIZ);
}
return;
}
strcpy(arg_buf, argument);
REMOVE_BIT(ch->comm,COMM_NOWIZ);
makedrunk(argument,ch);
sprintf( buf, "$n: %s", argument );
act_new("$n IMM_TALKS: `!$t``",ch,argument,NULL,TO_CHAR,POS_DEAD);
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && IS_IMMORTAL(d->character)
&& !IS_SET(d->character->comm,COMM_NOWIZ) )
act_new("$n IMM_TALKS: `!$t``",ch,(is_affected(d->character, gsn_com_lan)? arg_buf : IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character,TO_VICT,POS_DEAD);
}
void do_imptalk( CHAR_DATA *ch, char *argument )
{
char buf[MSL];
DESCRIPTOR_DATA *d;
argument[0] = UPPER(argument[0]);
if ( argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_NOWIZ))
{
send_to_char("Immortal channel is now ON\n\r",ch);
REMOVE_BIT(ch->comm,COMM_NOWIZ);
}
else
{
send_to_char("Immortal channel is now OFF\n\r",ch);
SET_BIT(ch->comm,COMM_NOWIZ);
}
return;
}
REMOVE_BIT(ch->comm,COMM_NOWIZ);
sprintf( buf, "$n: %s", argument );
act_new("$n IMP_TALKS: `!$t``",ch,argument,NULL,TO_CHAR,POS_DEAD);
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && IS_TRUSTED(d->character,CREATOR)
&& !IS_SET(d->character->comm,COMM_NOWIZ) )
act_new("$n IMP_TALKS: `!$t``",ch,argument,d->character,TO_VICT,POS_DEAD);
}
void do_yell( CHAR_DATA *ch, char *Argument )
{
DESCRIPTOR_DATA *d;
char arg_buf[MIL], argument[MIL];
bool fDemon = IS_TELEPATH(ch);
strcpy(argument, Argument);
argument[0] = UPPER(argument[0]);
if (IS_NPC(ch) && ch->pIndexData->vnum == 10)
return;
if (argument[0] == '\0' )
{
if (IS_SET(ch->comm,COMM_YELLSOFF))
{
send_to_char("You can hear yells again.\n\r",ch);
REMOVE_BIT(ch->comm,COMM_YELLSOFF);
}
else
{
send_to_char("You will no longer hear yells.\n\r",ch);
SET_BIT(ch->comm,COMM_YELLSOFF);
}
return;
}
strcpy(arg_buf, argument);
if ( IS_SET(ch->comm, COMM_NOYELL) || fDemon)
{
send_to_char( "You can't yell.\n\r", ch );
return;
}
if ( ch->level < 3 )
{
send_to_char( "Sorry, have to level before you can yell due to spammers.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_TREEFORM))
{
send_to_char("Trees cannot yell!\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) )
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) )
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) )
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
REMOVE_BIT(ch->comm,COMM_YELLSOFF);
makedrunk(argument,ch);
act( "You yell '`6$T``'", ch, NULL, argument, TO_CHAR );
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch && d->character->in_room != NULL
&& (d->character->in_room->area == ch->in_room->area || IS_SET(d->character->act,PLR_HEARALL))
&& !IS_AFFECTED2(d->character, AFF_SILENCE) && !IS_SET(d->character->comm, COMM_YELLSOFF)
&& !is_affected(d->character,gsn_silence) && !IS_SET(d->character->comm, COMM_QUIET) && !is_ignore(d->character,ch))
act_new("$n yells '`6$t``'",ch,
(is_affected(d->character, gsn_com_lan)? arg_buf : IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character,TO_VICT,POS_RESTING);
}
void j_yell( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
char arg_buf[MIL];
bool fDemon = IS_TELEPATH(ch);
if (argument[0] == '\0' )
return;
/* if not awake or disabled we look for mob that will yell */
if (!IS_AWAKE(ch) || is_affected(ch, gsn_ecstacy)){
CHAR_DATA *vch, *vch_next;
for (vch = ch->in_room->people; vch; vch = vch_next){
vch_next = vch->next_in_room;
/* make sure if charmed only yells if owner is the victim */
if (IS_AFFECTED(vch, AFF_CHARM) && vch->master
&& vch->master != ch)
continue;
if (IS_AFFECTED2(vch, AFF_SILENCE) )
continue;
if (IS_NPC(vch)
&& (IS_GOOD(vch)
|| (vch->master && vch->master == ch)
|| is_name("guard", vch->name) )
&& IS_SET(vch->in_room->area->area_flags,AREA_LAWFUL)
&& IS_AWAKE(vch)
&& !is_affected(vch, gsn_ecstacy)) {
char buf[MIL];
if (vch->master && vch->master == ch)
sprintf(buf, "Help! My master is being attacked at %s!",
vch->in_room->name);
else
sprintf(buf, "Help! A crime is being commited at %s!",
vch->in_room->name);
REMOVE_BIT(vch->comm,COMM_NOCHANNELS);
REMOVE_BIT(vch->comm,COMM_NOYELL);
act("$n tries to shake $N awake.", vch, NULL, ch, TO_ROOM);
send_to_char( "You sense someone trying to shake you awake.", ch);
j_yell(vch, buf);
SET_BIT(vch->comm,COMM_NOYELL);
SET_BIT(vch->comm,COMM_NOCHANNELS);
return;
}
}
return;
}
/* Viri: done in a_yell now
if (!(IS_NPC(ch) && ch->master != NULL && IS_AFFECTED(ch,AFF_CHARM))){
*/
if (IS_SET(ch->comm, COMM_NOYELL) || fDemon)
{
send_to_char( "You can't yell.\n\r", ch );
return;
}
/*
}
*/
strcpy(arg_buf, argument);
if (IS_AFFECTED2(ch, AFF_SILENCE) )
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) )
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) )
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
REMOVE_BIT(ch->comm,COMM_YELLSOFF);
makedrunk(argument,ch);
act( "You yell '`6$T``'", ch, NULL, argument, TO_CHAR);
for ( d = descriptor_list; d != NULL; d = d->next )
if ( d->connected == CON_PLAYING && d->character != ch && d->character->in_room != NULL
&& (d->character->in_room->area == ch->in_room->area || IS_SET(d->character->act,PLR_HEARALL))
&& !IS_AFFECTED2(d->character, AFF_SILENCE) && !IS_SET(d->character->comm, COMM_YELLSOFF)
&& !is_affected(d->character,gsn_silence) && !IS_SET(d->character->comm, COMM_QUIET) && !is_ignore(d->character,ch))
{
if (!d->character->pCabal
|| (!IS_CABAL(d->character->pCabal, CABAL_JUSTICE)
&& !IS_CABAL(d->character->pCabal, CABAL_ROYAL))
)
act_new("$n yells '`6$t``'",ch,
(is_affected(d->character, gsn_com_lan)? arg_buf : IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character,TO_VICT,POS_RESTING);
else{
char buf[MIL];
int cnt = IS_NPC(ch) ? 0 : ch->pcdata->flagged;
/* include info about offenses */
sprintf(buf, "$n (%s) yells wildly '`6$t``'",
cnt <= 0 ? "`&Model``" :
cnt < 3 ? "`7Abiding``" :
cnt < 5 ? "`#Occasional``" :
cnt < 10 ? "`8Common``" : "`!Die-Hard``");
act_new(buf ,ch,
(is_affected(d->character, gsn_com_lan)? arg_buf : IS_IMMORTAL(d->character) ? arg_buf : argument),
d->character,TO_VICT,POS_RESTING);
}
}
}
/* checks an emote argument for quotes to replace with say color */
char* parse_emote( char* string){
static char buf[2 * MIL];
char* ptr = buf;
char* str;
char c;
bool fQuote = FALSE;
int skip = 0;
while (*string){
switch (*string){
case '\"':
if ( (fQuote = !fQuote) == TRUE){
str = "'`#";
skip = 3;
c = *(string + 1);
c = UPPER(c);
*(string + 1) = c;
}
else{
str = "``'";
skip = 3;
}
break;
default:
str = string;
skip = 1;
break;
}
while (skip--){
*ptr++ = *str++;
}
string++;
}
//make sure we've ended the quote
if (fQuote){
*ptr++ = '`';
*ptr++ = '`';
}
*ptr = 0;
return buf;
}
void do_recho( CHAR_DATA *ch, char *arg )
{
DESCRIPTOR_DATA *d;
char argument[MIL];
if ( arg[0] == '\0' )
{
send_to_char( "Local echo what?\n\r", ch );
return;
}
strcpy( argument, parse_emote( arg ));
for ( d = descriptor_list; d; d = d->next )
if ( d->connected == CON_PLAYING && d->character->in_room == ch->in_room )
{
if (get_trust(d->character) >= get_trust(ch))
send_to_char( "local> ",d->character);
sendf( d->character, "%s\n\r", argument );
}
}
void do_smote(CHAR_DATA *ch, char *arg )
{
CHAR_DATA *vch;
char *letter, *name;
char last[MIL], temp[MSL], argument[MIL];
int matches = 0;
strcpy( argument, parse_emote( arg ));
if ( !IS_NPC(ch) && IS_SET(ch->comm, COMM_NOEMOTE) )
{
send_to_char( "You can't show your emotions.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Smote what?\n\r", ch );
return;
}
if (strstr(argument,ch->name) == NULL)
{
send_to_char("You must include your name in an smote.\n\r",ch);
return;
}
sendf(ch, "%s\n\r", argument);
for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
{
if (vch->desc == NULL || vch == ch)
continue;
if ((letter = strstr(argument,vch->name)) == NULL)
{
sendf(vch, "%s\n\r", argument);
continue;
}
strcpy(temp,argument);
temp[strlen(argument) - strlen(letter)] = '\0';
last[0] = '\0';
name = vch->name;
for (; *letter != '\0'; letter++)
{
if (*letter == '\'' && matches == strlen(vch->name))
{
strcat(temp,"r");
continue;
}
if (*letter == 's' && matches == strlen(vch->name))
{
matches = 0;
continue;
}
if (matches == strlen(vch->name))
matches = 0;
if (*letter == *name)
{
matches++;
name++;
if (matches == strlen(vch->name))
{
strcat(temp,"you");
last[0] = '\0';
name = vch->name;
continue;
}
strncat(last,letter,1);
continue;
}
matches = 0;
strcat(temp,last);
strncat(temp,letter,1);
last[0] = '\0';
name = vch->name;
}
act(temp, vch, NULL, NULL, TO_CHAR);
// sendf(vch, "%s\n\r", temp);
}
}
void do_say( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
char arg[MSL];
char buf[MSL];
char arg_buf[MIL];
OBJ_DATA *obj, *obj_next;
Double_List * tmp_list;
const int demon_cost = 30;
bool fDemon = IS_TELEPATH(ch);
//for safety we copy string over as we are chaning it a bit.
if ( argument[0] == '\0' )
{
send_to_char( "Say what?\n\r", ch );
return;
}
/*
Theproblem here is that sometimes the mobs say
things that are passed as dynamic strings, and it seems to
create a problem when UPPER casing it.
So we simply stick it in array for a bit.
*/
strcpy(arg_buf, argument);
makedrunk(argument,ch);
strcpy(arg, argument);
arg[0] = UPPER(arg[0]);
if (IS_AFFECTED2(ch, AFF_SILENCE) && !fDemon)
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) && !fDemon)
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_TREEFORM))
{
send_to_char("Trees cannot speak!\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) && !fDemon)
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
if (fDemon)
{
if (can_demon_talk(ch, demon_cost))
act( "You broadcast '`#$t``'", ch, arg, NULL, TO_CHAR );
else
return;
}
else
act( "You say '`#$t``'", ch, arg, NULL, TO_CHAR );
for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
{
if ((!IS_AFFECTED2(rch,AFF_SILENCE) && !is_affected(rch,gsn_silence))
|| fDemon){
if (fDemon)
{
sprintf(buf,"[`8%s``] '`#$t``'",PERS(ch,rch));
act_new( buf, ch, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ? arg_buf : arg),
rch, TO_VICT, POS_DEAD);
}
else
{
sprintf(buf, "$n says '`#$t``'");
act_new( buf, ch, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ? arg_buf : arg),
rch, TO_VICT, POS_RESTING + 100 );
}
if (!IS_NPC(rch) && rch->pcdata->eavesdropped != NULL
&& is_affected(rch->pcdata->eavesdropped,gsn_eavesdrop)
&& rch != ch && rch->pcdata->eavesdropped != ch
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",rch->pcdata->eavesdropped);
sprintf(buf, "Someone says '`#$t``'");
act_new(buf,rch->pcdata->eavesdropped, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ? arg_buf : arg),
NULL,TO_CHAR, POS_DEAD);
}
/* OLD MPROG */
if (IS_NPC(rch) && rch->pIndexData->progtypes & SPEECH_PROG
&& rch->position == rch->pIndexData->default_pos)
mprog_speech_trigger( arg_buf, ch, rch );
/* NEW PROG */
if (IS_NPC(rch) && HAS_TRIGGER_MOB(rch, TRIG_SPEECH))
p_act_trigger( arg_buf, rch, NULL, NULL, ch, NULL, NULL, TRIG_SPEECH );
for ( obj = rch->carrying; obj; obj = obj_next ){
obj_next = obj->next_content;
if ( HAS_TRIGGER_OBJ( obj, TRIG_SPEECH ) )
p_act_trigger( arg_buf, NULL, obj, NULL, ch, NULL, NULL, TRIG_SPEECH );
}//END object check
}
}
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL
&& is_affected(ch->pcdata->eavesdropped,gsn_eavesdrop)
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",ch->pcdata->eavesdropped);
sprintf(buf,"%s says '`#$t``'",PERS(ch,ch->pcdata->eavesdropped));
act_new(buf,ch->pcdata->eavesdropped, (is_affected(ch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(ch) ? arg_buf : arg),
NULL,TO_CHAR, POS_DEAD);
}
/* check rooms objects in room */
for ( obj = ch->in_room->contents; obj; obj = obj_next ){
obj_next = obj->next_content;
if ( HAS_TRIGGER_OBJ( obj, TRIG_SPEECH ) )
p_act_trigger( arg_buf, NULL, obj, NULL, ch, NULL, NULL, TRIG_SPEECH );
}
/* check room */
if (HAS_TRIGGER_ROOM(ch->in_room, TRIG_SPEECH))
p_act_trigger( arg_buf, NULL, NULL, ch->in_room, ch, NULL, NULL, TRIG_SPEECH );
/* check spectating rooms */
rch = NULL;
tmp_list = ch->in_room->watch_vnums;
while (tmp_list != NULL) {
rch = (get_room_index ((int)tmp_list->cur_entry))->people;
while (rch != NULL) {
if ((!IS_AFFECTED2(rch,AFF_SILENCE) && !is_affected(rch,gsn_silence)) || fDemon){
if (fDemon) {
sprintf(buf,"[%s] [`8%s``] '`#$t``'",ch->in_room->name, PERS(ch,rch));
act_new( buf, ch, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ? arg_buf : arg),
rch, TO_VICT, POS_DEAD);
}
else {
sprintf(buf, "[%s] $n says '`#$t``'", ch->in_room->name);
act_new( buf, ch, (is_affected(rch, gsn_com_lan) ? arg_buf : IS_IMMORTAL(rch) ?
arg_buf : arg), rch, TO_VICT, POS_RESTING + 100 );
}
}
rch = rch->next_in_room;
}
tmp_list = tmp_list->next_node;
}// END to chars loop
}
void do_tell( CHAR_DATA *ch, char *argument )
{
char arg[MIL], buf[MSL];
char arg_buf[MIL];
CHAR_DATA *victim;
const int demon_cost = 60;
bool com_lan = FALSE;
bool fDemon = IS_TELEPATH(ch);
if (!IS_IMMORTAL(ch) && !IS_AWAKE(ch) && !fDemon)
{
send_to_char( "In your dreams, or what?\n\r", ch );
return;
}
/* progs avoid all this */
if (!IS_NPC(ch)){
if (IS_SET(ch->comm, COMM_NOTELL))
{
send_to_char( "Your message didn't get through.\n\r", ch );
return;
}
if ( IS_SET(ch->comm, COMM_QUIET))
{
send_to_char( "You must turn off quiet mode first.\n\r", ch);
return;
}
if (IS_SET(ch->comm,COMM_DEAF))
{
send_to_char("You must turn off deaf mode first.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_TREEFORM))
{
send_to_char("Trees cannot send tells!\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) && !fDemon)
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) && !fDemon)
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) && !fDemon)
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
}
argument = one_argument( argument, arg );
if ( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "Tell whom what?\n\r", ch );
return;
}
argument[0] = UPPER(argument[0]);
if ( ( victim = get_char_world( ch, arg ) ) == NULL
// || ( IS_NPC(victim) && victim->in_room != ch->in_room )
|| (IS_AFFECTED2(victim, AFF_SHADOWFORM) && !IS_IMMORTAL(ch)) )
/* || (IS_AFFECTED2(victim, AFF_TREEFORM) && !IS_IMMORTAL(ch)) )*/
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
strcpy(arg_buf, argument);
com_lan = (is_affected(victim, gsn_com_lan) || IS_IMMORTAL(victim));
if ( (!IS_AWAKE(victim)
|| IS_AFFECTED2(victim, AFF_SILENCE)
|| is_affected(victim, gsn_silence))
&& !fDemon
&& !IS_IMMORTAL(ch))
{
sendf(ch, "They can't hear you.\n\r");
return;
}
if ((IS_SET(victim->comm,COMM_QUIET) || IS_SET(victim->comm,COMM_DEAF)) && !IS_IMMORTAL(ch))
{
sendf(ch, "They are not receiving tells.\n\r");
return;
}
if (is_ignore(victim,ch) && !IS_IMMORTAL(ch))
{
sendf(ch, "They are ignoring you.\n\r");
return;
}
makedrunk(argument,ch);
if ( victim->desc == NULL && !IS_NPC(victim))
{
act("$N seems to have misplaced $S link...try again later.",ch,NULL,victim,TO_CHAR);
if (fDemon)
{
/* demons talk to demons for free */
if (IS_TELEPATH(ch)
|| can_demon_talk(ch, demon_cost))
sprintf(buf,"[`8%s``] '`2%s``'\n\r",PERS(ch, victim),
com_lan? arg_buf : argument);
else
return;
}
else
sprintf(buf,"%s tells you '`2%s``'\n\r",PERS(ch,victim),
com_lan? arg_buf : argument);
buf[0] = UPPER(buf[0]);
add_buf(victim->pcdata->buffer,buf);
return;
}
if (IS_SET(victim->comm,COMM_AFK))
{
if (IS_NPC(victim))
{
sendf(ch,"%s is AFK, and not receiving tells.\n\r",PERS2(victim));
return;
}
act("$N is AFK, but your tell will go through when $E returns.",ch,NULL,victim,TO_CHAR);
if (fDemon)
{
/* demons talk free to demons */
if (IS_TELEPATH(ch)
|| can_demon_talk(ch, demon_cost))
sprintf(buf,"[`8%s``] '`2%s``'\n\r",PERS(ch, victim) ,
com_lan? arg_buf : argument);
else
return;
}
else
sprintf(buf,"%s tells you '`2%s``'\n\r",PERS(ch,victim),
com_lan? arg_buf : argument);
buf[0] = UPPER(buf[0]);
add_buf(victim->pcdata->buffer,buf);
return;
}
if (fDemon)
{
/* demons talk free to demons */
if (IS_TELEPATH(ch)
|| can_demon_talk(ch, demon_cost))
{
act( "You project to $N '`2$t``'", ch, argument, victim, TO_CHAR );
act_new("[`8$n``] '`2$t``'",ch,
com_lan? arg_buf : argument,
victim,TO_VICT,POS_DEAD);
}
else
return;
}
else
{
act( "You tell $N '`2$t``'", ch, argument, victim, TO_CHAR );
act_new("$n tells you '`2$t``'",ch,
com_lan? arg_buf : argument,
victim,TO_VICT,POS_DEAD);
}
/* NEW PROG */
if (IS_NPC(victim) && HAS_TRIGGER_MOB(victim, TRIG_SPEECH) && (IS_NPC(ch) || victim->in_room == ch->in_room))
p_act_trigger( arg_buf, victim, NULL, NULL, ch, NULL, NULL, TRIG_SPEECH );
victim->reply = ch;
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL
&& is_affected(ch->pcdata->eavesdropped,gsn_eavesdrop)
&& ch->pcdata->eavesdropped != victim
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",ch->pcdata->eavesdropped);
sprintf(buf,"%s tells someone '`2$t``'",PERS(ch,ch->pcdata->eavesdropped));
act_new(buf,ch->pcdata->eavesdropped,
com_lan? arg_buf : argument,
NULL,TO_CHAR, POS_DEAD);
}
if (!IS_NPC(victim) && victim->pcdata->eavesdropped != NULL
&& is_affected(victim->pcdata->eavesdropped,gsn_eavesdrop)
&& victim->pcdata->eavesdropped != ch
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",victim->pcdata->eavesdropped);
sprintf(buf,"Someone tells %s '`2$t``'",PERS(victim,victim->pcdata->eavesdropped));
act_new(buf,victim->pcdata->eavesdropped,
com_lan? arg_buf : argument,
NULL,TO_CHAR, POS_DEAD);
}
if (IS_NPC(victim)){
if (victim->pIndexData->progtypes & TELL_PROG)
mprog_tell_trigger( argument, victim );
if ( HAS_TRIGGER_MOB( victim, TRIG_TELL ) )
p_act_trigger( argument, victim, NULL, NULL, ch, NULL, NULL, TRIG_TELL );
}
}
void do_reply( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MSL];
char arg_buf[MIL];
const int demon_cost = 30;
bool fDemon = IS_TELEPATH(ch);
bool com_lan = FALSE;
if ( ( victim = ch->reply ) == NULL )
{
send_to_char( "You have no one to reply too.\n\r", ch );
return;
}
strcpy(arg_buf, argument);
com_lan = (is_affected(victim, gsn_com_lan) || IS_IMMORTAL(victim));
if (!IS_IMMORTAL(victim) && !IS_AWAKE(ch) && !fDemon)
{
send_to_char( "In your dreams, or what?\n\r", ch );
return;
}
if (IS_AFFECTED2(ch, AFF_TREEFORM))
{
send_to_char("Trees cannot send tells!\n\r",ch);
return;
}
if (IS_SET(ch->comm, COMM_NOTELL))
{
send_to_char( "Your message didn't get through.\n\r", ch );
return;
}
if ( IS_SET(ch->comm, COMM_QUIET))
{
send_to_char( "You must turn off quiet mode first.\n\r", ch);
return;
}
if (IS_SET(ch->comm,COMM_DEAF))
{
send_to_char("You must turn off deaf mode first.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) && !fDemon)
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) && !fDemon)
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) && !fDemon)
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
if (( IS_NPC(victim) && victim->in_room != ch->in_room )
|| (IS_AFFECTED2(victim, AFF_SHADOWFORM) && !IS_IMMORTAL(ch)) )
/* || (IS_AFFECTED2(victim, AFF_TREEFORM) && !IS_IMMORTAL(ch)) )*/
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (argument[0] == '\0' )
{
send_to_char( "Reply what?\n\r", ch );
return;
}
argument[0] = UPPER(argument[0]);
makedrunk(argument,ch);
if ( victim->desc == NULL && !IS_NPC(victim))
{
act("$N seems to have misplaced $S link...try again later.",ch,NULL,victim,TO_CHAR);
if (fDemon)
{
/* demons talk free to demons */
if (IS_TELEPATH(ch)
|| can_demon_talk(ch, demon_cost))
sprintf(buf,"[`8%s``] '`2%s``'\n\r",PERS(ch,victim), com_lan? arg_buf : argument);
else
return;
}
else
sprintf(buf,"%s tells you '`2%s``'\n\r",PERS(ch,victim), com_lan? arg_buf : argument);
buf[0] = UPPER(buf[0]);
add_buf(victim->pcdata->buffer,buf);
return;
}
if ( (!IS_AWAKE(victim)
|| IS_AFFECTED2(victim, AFF_SILENCE)
|| is_affected(victim, gsn_silence))
&& !fDemon
&& !IS_IMMORTAL(ch))
{
sendf(ch, "They can't hear you.\n\r");
return;
}
if ((IS_SET(victim->comm,COMM_QUIET) || IS_SET(victim->comm,COMM_DEAF)) && !IS_IMMORTAL(ch))
{
sendf(ch, "They are not receiving tells.\n\r");
return;
}
if (is_ignore(victim,ch) && !IS_IMMORTAL(ch))
{
sendf(ch, "%s is ignoring you.\n\r", PERS2(victim));
return;
}
if (IS_SET(victim->comm,COMM_AFK))
{
if (IS_NPC(victim))
{
sendf(ch,"%s is AFK, and not receiving tells.\n\r",PERS2(victim));
return;
}
act("$N is AFK, but your tell will go through when $E returns.",ch,NULL,victim,TO_CHAR);
if (fDemon)
{
/* demons talk free to demons */
if (IS_TELEPATH(ch)
|| can_demon_talk(ch, demon_cost))
sprintf(buf,"[`8%s``] '`2%s``'\n\r",PERS(ch,victim), com_lan? arg_buf : argument);
else
return;
}
else
sprintf(buf,"%s tells you '`2%s``'\n\r",PERS(ch,victim), com_lan? arg_buf : argument);
buf[0] = UPPER(buf[0]);
add_buf(victim->pcdata->buffer,buf);
return;
}
if (fDemon)
{
/* demons talk free to demons */
if (IS_TELEPATH(ch)
|| can_demon_talk(ch, demon_cost))
{
act( "You project to $N '`2$t``'", ch, argument, victim, TO_CHAR );
act_new("[`8$n``] '`2$t``'",ch, com_lan? arg_buf : argument,victim,TO_VICT,POS_DEAD);
}
else
return;
}
else
{
act( "You tell $N '`2$t``'", ch, argument, victim, TO_CHAR );
act_new("$n tells you '`2$t``'",ch, com_lan? arg_buf : argument,victim,TO_VICT,POS_DEAD);
}
victim->reply = ch;
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL
&& is_affected(ch->pcdata->eavesdropped,gsn_eavesdrop)
&& ch->pcdata->eavesdropped != victim
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",ch->pcdata->eavesdropped);
sprintf(buf,"%s tells someone '`2$t``'",PERS(ch,ch->pcdata->eavesdropped));
act_new(buf,ch->pcdata->eavesdropped, com_lan? arg_buf : argument,NULL,TO_CHAR, POS_DEAD);
}
if (!IS_NPC(victim) && victim->pcdata->eavesdropped != NULL
&& is_affected(victim->pcdata->eavesdropped,gsn_eavesdrop)
&& victim->pcdata->eavesdropped != ch
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",victim->pcdata->eavesdropped);
sprintf(buf,"Someone tells %s '`2$t``'",PERS(victim,victim->pcdata->eavesdropped));
act_new(buf,victim->pcdata->eavesdropped, com_lan? arg_buf : argument,NULL,TO_CHAR, POS_DEAD);
}
if (IS_NPC(victim)
&& victim->pIndexData->progtypes & TELL_PROG)
mprog_tell_trigger( argument, victim );
}
void do_emote( CHAR_DATA *ch, char *argument ){
char* ptr;
if ( !IS_NPC(ch) && IS_SET(ch->comm, COMM_NOEMOTE) ){
send_to_char( "You can't show your emotions.\n\r", ch );
return;
}
if ( argument[0] == '\0' ){
send_to_char( "Emote what?\n\r", ch );
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) || is_affected(ch,gsn_garble)){
send_to_char("You are unable to get your point across.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) ){
send_to_char("You'd better not, you might injure your jaws even more.\n\r",ch);
return;
}
if (IS_AFFECTED2(ch, AFF_TREEFORM)){
affect_strip( ch, gsn_treeform );
REMOVE_BIT ( ch->affected_by, AFF_TREEFORM );
act("You emerge from your treeformed state.",ch,NULL,NULL,TO_CHAR);
act("$n emerges from $s treeformed state.",ch,NULL,NULL,TO_ROOM);
}
if (IS_AFFECTED(ch, AFF_HIDE)){
affect_strip( ch, gsn_hide );
REMOVE_BIT ( ch->affected_by, AFF_HIDE );
act("You step out of the shadows.",ch,NULL,NULL,TO_CHAR);
act("$n steps out of the shadows.",ch,NULL,NULL,TO_ROOM);
}
if (IS_AFFECTED2(ch, AFF_CAMOUFLAGE)){
affect_strip ( ch, gsn_camouflage );
REMOVE_BIT ( ch->affected2_by, AFF_CAMOUFLAGE );
act("You step out from your cover.",ch,NULL,NULL,TO_CHAR);
act("$n steps out from $s cover.",ch,NULL,NULL,TO_ROOM);
}
ptr = parse_emote( argument );
act_new( "$n $T", ch, NULL, ptr, TO_ROOM, POS_RESTING + 100 );
act_new( "$n $T", ch, NULL, ptr, TO_CHAR, POS_RESTING + 100 );
}
void do_pmote( CHAR_DATA *ch, char *arg )
{
CHAR_DATA *vch;
char *letter, *name;
char last[MSL], temp[MSL];
char argument[MSL];
int matches = 0;
/* some strings are passed as consts. and create problems
when worked on, we store them in array for a bit*/
strcpy(argument, parse_emote( arg ));
if ( !IS_NPC(ch) && IS_SET(ch->comm, COMM_NOEMOTE) )
{
send_to_char( "You can't show your emotions.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Pmote what?\n\r", ch );
return;
}
if (IS_AFFECTED2(ch, AFF_SILENCE) )
{
send_to_char("You are unable to get your point across.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) )
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
act( "$n $t", ch, argument, NULL, TO_CHAR );
for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
{
if (vch->desc == NULL || vch == ch)
continue;
if ((letter = strstr(argument,vch->name)) == NULL)
{
act("$N $t",vch,argument,ch,TO_CHAR);
continue;
}
strcpy(temp,argument);
temp[strlen(argument) - strlen(letter)] = '\0';
last[0] = '\0';
name = vch->name;
for (; *letter != '\0'; letter++)
{
if (*letter == '\'' && matches == strlen(vch->name))
{
strcat(temp,"r");
continue;
}
if (*letter == 's' && matches == strlen(vch->name))
{
matches = 0;
continue;
}
if (matches == strlen(vch->name))
matches = 0;
if (*letter == *name)
{
matches++;
name++;
if (matches == strlen(vch->name))
{
strcat(temp,"you");
last[0] = '\0';
name = vch->name;
continue;
}
strncat(last,letter,1);
continue;
}
matches = 0;
strcat(temp,last);
strncat(temp,letter,1);
last[0] = '\0';
name = vch->name;
}
act("$N $t",vch,temp,ch,TO_CHAR);
}
}
void do_bug( CHAR_DATA *ch, char *argument )
{
append_file( ch, BUG_FILE, argument );
send_to_char( "Bug logged.\n\r", ch );
}
void do_typo( CHAR_DATA *ch, char *argument )
{
append_file( ch, TYPO_FILE, argument );
send_to_char( "Typo logged.\n\r", ch );
}
void do_qui( CHAR_DATA *ch, char *argument )
{
send_to_char( "If you want to QUIT, you have to spell it out.\n\r", ch );
}
void do_quit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *vch, *vch_next, *rch;
DESCRIPTOR_DATA *d,*d_next;
OBJ_DATA* obj, *obj_next;
int id, rare_count = 0, limit= 0;
bool fCrus = FALSE;
if ( IS_NPC(ch) )
return;
if ( ch->position == POS_FIGHTING )
{
send_to_char( "No way! You are fighting.\n\r", ch );
return;
}
if ( ch->position < POS_STUNNED )
{
send_to_char( "You're not DEAD yet.\n\r", ch );
return;
}
if (ch->in_room->pCabal && ch->pCabal && ch->pCabal != ch->in_room->pCabal)
{
send_to_char( "You can't quit here!\n\r",ch);
return;
}
if (is_fight_delay(ch,120) || is_affected(ch,gen_ensnare))
{
send_to_char( "You can't quit yet! Your adrenaline is rushing.\n\r", ch);
return;
}
if (IS_SET(ch->act2,PLR_NOQUIT) || is_affected(ch,gsn_noquit) || is_affected(ch,gen_ensnare))
{
send_to_char("You are not allowed to quit!\n\r",ch);
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_NO_QUIT) && !IS_IMMORTAL(ch))
{
send_to_char( "You can't seem to leave this room!\n\r",ch);
return;
}
if (is_affected(ch,gsn_bat_form)
|| is_affected(ch,gsn_wolf_form)
|| is_affected(ch,gsn_mist_form)
|| is_affected(ch,gsn_weretiger)
|| is_affected(ch,gsn_werewolf)
|| is_affected(ch,gsn_werebear)
|| is_affected(ch,gsn_werefalcon)){
send_to_char("You must first revert to your natural form.\n\r",ch);
return;
}
if (ch->pcdata->pnote && ch->pcdata->pnote->text != NULL && ch->pcdata->pnote->text[0] != '\0' && ch->timer < 10)
{
send_to_char("You have a note in progress, either post it or clear it before you quit out.\n\r",ch);
return;
}
//check for rares over limit
if (ch->class == class_lookup("crusader")
&& !is_affected(ch, skill_lookup("undeniable order")))
fCrus = TRUE;
for (obj = ch->carrying; obj != NULL; obj = obj->next_content){
if (!IS_LIMITED(obj))
continue;
if (obj->wear_loc != -1 && !fCrus)
continue;
else
rare_count ++;
}
limit = (ch->level / 10) - 1;
if (fCrus)
limit *= 2;
if (!IS_NPC( ch) && !IS_IMMORTAL(ch)
&& rare_count
&& rare_count > limit
&& !ch->pcdata->confirm_quit){
send_to_char("You might lose limited items in your inventory. \"quit\" to confirm.\n\r", ch);
ch->pcdata->confirm_quit = TRUE;
return;
}
/* Successful quit */
for (obj = ch->carrying; obj != NULL; obj = obj_next){
obj_next = obj->next_content;
if (obj->item_type == ITEM_CABAL){
obj_from_char( obj );
obj_to_room( obj, ch->in_room );
}
}
if (!IS_NPC(ch))
{
CHAR_DATA* och;
AFFECT_DATA* paf;
if (ch->logon != 0 && ch->pcdata->member){
ch->pcdata->member->connected = FALSE;
ch->pcdata->member->last_update = mud_data.current_time;
}
if (is_affected(ch,gsn_familiar_link))
{
send_to_char("Your energy drains out as you lose link with your familiar.\n\r",ch);
affect_strip(ch,gsn_familiar_link);
}
if (ch->pcdata->familiar != NULL)
{
extract_char( ch->pcdata->familiar, TRUE );
ch->pcdata->familiar=NULL;
}
if (!IS_NPC(ch) && ch->pcdata->eavesdropping != NULL)
{
act("You stop eavesdropping on $N.",ch,NULL,ch->pcdata->eavesdropping,TO_CHAR);
affect_strip(ch,gsn_eavesdrop);
ch->pcdata->eavesdropping->pcdata->eavesdropped = NULL;
ch->pcdata->eavesdropping = NULL;
}
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL)
{
act("You stop eavesdropping on $N.",ch->pcdata->eavesdropped,NULL,ch,TO_CHAR);
affect_strip(ch->pcdata->eavesdropped,gsn_eavesdrop);
ch->pcdata->eavesdropped->pcdata->eavesdropping = NULL;
ch->pcdata->eavesdropped = NULL;
}
for ( paf = ch->affected; paf; paf = paf->next ){
if (paf->type != gen_challenge)
continue;
if ( (och = get_char(paf->string)) != NULL){
act_new("`&$N has declined your challenge.``", och, NULL, ch, TO_CHAR, POS_DEAD);
act_new("`&You have declined $n's challenge.``", och, NULL, ch, TO_VICT, POS_DEAD);
if (ch->pCabal != NULL && IS_SET(ch->pCabal->pIndexData->progress, PROGRESS_CHALL))
update_challenge( ch, ch->name, paf->string, 0, 0, 0, 1);
}
}
}
send_to_char( "You have escaped from the Forsaken Lands.\n\r",ch);
for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room)
if (get_trust(rch) >= ch->invis_level && ch->desc)
act_new( "$n has left the lands.", ch, NULL, rch, TO_VICT, POS_RESTING + 100 );
/* cabal echos */
if (ch->pCabal && !IS_IMMORTAL(ch)){
char * const his_her [] = { "its", "his", "her" };
if (IS_CABAL(ch->pCabal, CABAL_AREA)){
sprintf( log_buf, "%s %s has left the fray.",
get_crank_str( ch->pCabal, ch->pcdata->true_sex, ch->pcdata->rank ),
PERS2(ch));
}
else if (IS_CABAL(ch->pCabal, CABAL_ROYAL)){
sprintf( log_buf, "%s %s has withdrawn %s presence.",
get_crank_str( ch->pCabal, ch->pcdata->true_sex, ch->pcdata->rank ),
PERS2(ch),
his_her[URANGE(0,ch->sex,2)]);
}
else if (IS_CABAL(ch->pCabal, CABAL_JUSTICE)){
sprintf( log_buf, "%s %s no longer serves the Law with us.",
get_crank_str( ch->pCabal, ch->pcdata->true_sex, ch->pcdata->rank ),
PERS2(ch));
}
else if (IS_CABAL(ch->pCabal, CABAL_ROUGE)){
sprintf( log_buf, "%s %s has been noticed leaving the lands.",
get_crank_str( ch->pCabal, ch->pcdata->true_sex, ch->pcdata->rank ),
PERS2(ch));
}
else{
sprintf( log_buf, "%s %s has left our forces.",
get_crank_str( ch->pCabal, ch->pcdata->true_sex, ch->pcdata->rank ),
PERS2(ch));
}
cabal_echo(ch->pCabal, log_buf );
}
if (ch->desc)
sprintf( log_buf, "%s@%s has disconnected in room %d.", ch->name, ch->desc->host, ch->in_room->vnum);
else
sprintf( log_buf, "%s has disconnected.", ch->name);
log_string( log_buf );
wiznet(log_buf,NULL,NULL,WIZ_LOGINS,0,get_trust(ch));
/* After extract_char the ch is no longer valid! */
for ( vch = char_list; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if (is_affected(vch,gsn_doppelganger) && vch->doppel == ch)
{
send_to_char("You shift to your true form as your victim leaves.\n\r",vch);
affect_strip(vch,gsn_doppelganger);
}
if (!IS_NPC(vch) && vch->pcdata->guarding == ch)
{
act("You stops guarding $N.", vch, NULL, ch, TO_CHAR);
act("$n stops guarding you.", vch, NULL, ch, TO_VICT);
act("$n stops guarding $N.", vch, NULL, ch, TO_NOTVICT);
vch->pcdata->guarding = NULL;
ch->pcdata->guarded_by = NULL;
}
if (!IS_NPC(ch) && ch->pcdata->guarded_by != NULL)
{
ch->pcdata->guarded_by->pcdata->guarding = NULL;
ch->pcdata->guarded_by = NULL;
}
if (is_affected(vch,gsn_mirror_image) && is_affected(vch,gsn_doppelganger) && vch->doppel == ch)
{
extract_char(vch,TRUE);
continue;
}
/* save pets during quits
if (IS_NPC(vch)
&& vch->summoner != NULL
&& vch->summoner == ch
&& !IS_SET(vch->act, ACT_PET))
{
act( "$n slowly disappears.",vch,NULL,NULL,TO_ROOM );
extract_char(vch,TRUE);
continue;
}
*/
}
save_char_obj( ch );
id = ch->id;
d = ch->desc;
extract_char( ch, TRUE );
if ( d != NULL )
close_socket( d );
/* toast cheating people */
for (d = descriptor_list; d != NULL; d = d_next)
{
CHAR_DATA *tch = d->original ? d->original : d->character;
d_next = d->next;
if (tch && tch->id == id)
{
extract_char(tch,TRUE);
close_socket(d);
}
}
}
void do_save( CHAR_DATA *ch, char *argument )
{
char buf[MSL];
if ( IS_NPC(ch) )
return;
save_char_obj( ch );
WAIT_STATE(ch, 6);
sprintf(buf,"%s saves",ch->name);
wiznet(buf,ch,NULL,WIZ_SAVE,0,0);
send_to_char("Saving...\n\r", ch);
}
bool can_follow(CHAR_DATA* ch, CHAR_DATA* victim){
if (is_affected(ch,skill_lookup("apathey"))){
send_to_char("You don't care to follow anyone.\n\r",ch);
return FALSE;
}
else if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master != NULL ){
sendf(ch, "But you'd rather follow %s!\n\r", PERS2(ch->master));
return FALSE;
}
else if (is_affected(ch,gsn_heroism)){
send_to_char("You cannot allow others to join your quest.\n\r",ch);
return FALSE;
}
if (is_affected(ch, gen_crusade)){
send_to_char("You cannot allow others to aid you on Crusade.\n\r",ch);
return FALSE;
}
if (tarot_find(ch->affected) == 10){
send_to_char("You feel too solutide to want companion.\n\r",ch);
return FALSE;
}
/* check if we can master of a charmie */
if (IS_NPC(victim) && victim->master && !IS_NPC(victim->master)){
if (is_affected(victim->master, gen_crusade) && ch != victim){
act("$N has set out upon a holy Crusade and cannot be aided.", ch, NULL, victim->master, TO_CHAR);
return FALSE;
}
if(IS_SET(victim->master->act,PLR_NOFOLLOW)
|| is_affected(victim->master,gsn_heroism)
|| is_affected(victim->master,skill_lookup("apathey"))
|| tarot_find(victim->master->affected) == 10){
sendf(ch,"%s doesn't seem to want any followers.\n\r", PERS2(victim->master));
return FALSE;
}
}
if (is_affected(victim, gen_crusade) && ch != victim){
act("$N has set out upon a holy Crusade and cannot be aided.", ch, NULL, victim, TO_CHAR);
return FALSE;
}
else if ( ch != victim
&& !IS_NPC(victim)
&& (IS_SET(victim->act,PLR_NOFOLLOW)
|| is_affected(victim,gsn_heroism)
|| is_affected(victim,skill_lookup("apathey"))
|| tarot_find(victim->affected) == 10)
&& !IS_IMMORTAL(ch))
{
sendf(ch,"%s doesn't seem to want any followers.\n\r", PERS2(victim));
return FALSE;
}
return TRUE;
}
void do_follow( CHAR_DATA *ch, char *argument )
{
char arg[MIL];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Follow whom?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, NULL, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
if ( ch->master == NULL )
{
send_to_char( "You already follow yourself.\n\r", ch );
return;
}
else
{
send_to_char( "You now follow yourself.\n\r", ch );
stop_follower(ch);
return;
}
}
if (!can_follow(ch, victim))
return;
REMOVE_BIT(ch->act,PLR_NOFOLLOW);
if ( ch->master != NULL )
stop_follower( ch );
add_follower( ch, victim );
}
void add_follower( CHAR_DATA *ch, CHAR_DATA *master )
{
if ( ch->master != NULL )
{
bug( "Add_follower: non-null master.", 0 );
return;
}
ch->master = master;
ch->leader = NULL;
if ( can_see( master, ch ) )
act( "$n now follows you.", ch, NULL, master, TO_VICT );
act( "You now follow $N.", ch, NULL, master, TO_CHAR );
}
void stop_follower( CHAR_DATA *ch )
{
if ( ch->master == NULL ) {
return;
}
if (IS_NPC(ch)){
if (empty_char(ch))
act("$n spills some items on the ground.", ch, NULL, NULL, TO_ROOM);
}
if ( IS_AFFECTED(ch, AFF_CHARM) ) {
REMOVE_BIT( ch->affected_by, AFF_CHARM );
affect_strip( ch, gsn_charm_person );
}
if ( can_see( ch->master, ch ) && !IS_IMMORTAL(ch) && ch->in_room != NULL) {
act( "$n stops following you.", ch, NULL, ch->master, TO_VICT );
act( "You stop following $N.", ch, NULL, ch->master, TO_CHAR );
}
if (IS_NPC(ch) && ch->master && !IS_NPC(ch->master)
&& ch->master->pcdata->pStallion
&& ch->master->pcdata->pStallion == ch->pIndexData){
do_dismount(ch->master, "");
}
if (!IS_NPC(ch) && ch->pcdata->guarded_by != NULL) {
act("You stop guarding $N.",ch->pcdata->guarded_by,NULL,ch,TO_CHAR);
act("$n stops guarding you.",ch->pcdata->guarded_by,NULL,ch,TO_VICT);
act("$n stops guarding $N.",ch->pcdata->guarded_by,NULL,ch,TO_NOTVICT);
ch->pcdata->guarded_by->pcdata->guarding = NULL;
ch->pcdata->guarded_by = NULL;
}
if (!IS_NPC(ch) && ch->pcdata->guarding != NULL) {
act("You stop guarding $N.", ch, NULL, ch->pcdata->guarding, TO_CHAR);
act("$n stops guarding you.", ch, NULL, ch->pcdata->guarding, TO_VICT);
act("$n stops guarding $N.", ch, NULL, ch->pcdata->guarding, TO_NOTVICT);
ch->pcdata->guarding->pcdata->guarded_by = NULL;
ch->pcdata->guarding = NULL;
}
if (IS_NPC(ch) && ch->pIndexData->vnum == MOB_VNUM_SPECIAL_GUARD
&& ch->leader != NULL){
AFFECT_DATA af;
send_to_char("Cursing at the loss you send in a request for a new guard captain.\n\r", ch->leader);
af.type = UMAX(0, skill_lookup("guard captain"));
af.level = ch->level;
af.duration = 12;
af.where = TO_AFFECTS;
af.bitvector = 0;
af.location = APPLY_NONE;
af.modifier = 0;
affect_to_char(ch->leader, &af);
}
if (ch->master && !IS_NPC(ch->master) && ch->master->pcdata->familiar) {
if (is_affected(ch->master,gsn_familiar_link) && ch->master->pcdata->familiar != NULL
&& ch->master->pcdata->familiar == ch) {
AFFECT_DATA af;
send_to_char("Your energy drains out as you lose link with your familiar.\n\r",ch->master);
affect_strip(ch->master,gsn_familiar_link);
ch->master->pcdata->familiar=NULL;
af.type = gsn_drained;
af.level = ch->level;
af.duration = 12;
af.modifier = 0;
af.location = 0;
af.bitvector = 0;
affect_to_char(ch->master,&af);
}
}
if (ch->master->pet == ch) {
ch->master->pet = NULL;
}
ch->master = NULL;
ch->leader = NULL;
ch->summoner = NULL;
if (IS_NPC(ch) && ch->pIndexData->vnum == MOB_VNUM_DUMMY
&& is_affected(ch,gsn_mirror_image)){
act("$n shatters into tiny fragments of glass.",ch,NULL,NULL,TO_ROOM);
extract_char( ch, TRUE );
}
}
void nuke_pets( CHAR_DATA *ch )
{
CHAR_DATA *pet;
if ((pet = ch->pet) != NULL)
{
stop_follower(pet);
if (pet->in_room != NULL)
{
act( "$n slowly disappears.", pet, NULL, NULL, TO_ROOM );
extract_char(pet,TRUE);
}
}
ch->pet = NULL;
}
void die_follower( CHAR_DATA *ch, bool remove )
{
CHAR_DATA *fch, *fch_next;
if ( ch->master != NULL )
{
if (ch->master->pet == ch)
ch->master->pet = NULL;
if (!IS_NPC(ch->master) &&
ch->master->pcdata->familiar == ch)
ch->master->pcdata->familiar = NULL;
if (remove)
stop_follower( ch );
}
if ( ch->leader != NULL )
{
if (ch->leader->pet == ch)
ch->leader->pet = NULL;
if (!IS_NPC(ch->leader) &&
ch->leader->pcdata->familiar == ch)
ch->leader->pcdata->familiar = NULL;
}
for ( fch = char_list; fch != NULL; fch = fch_next )
{
fch_next = fch->next;
if ( fch->master == ch && (remove || IS_NPC(fch)))
{
stop_follower( fch );
if (IS_NPC(fch))
{
if (IS_NPC(fch)){
if (empty_char(fch))
act("$n spills some items on the ground.", fch, NULL, NULL, TO_ROOM);
if (fch->in_room != NULL)
act( "$n slowly disappears.",fch,NULL,NULL,TO_ROOM );
}
extract_char( fch, TRUE );
}
}
if ( fch->leader == ch && (remove || IS_NPC(fch)))
fch->leader = fch;
}
}
void die_follower_pc( CHAR_DATA *ch)
{
CHAR_DATA *fch, *fch_next;
if (IS_NPC(ch))
return;
if ( ch->master != NULL ){
stop_follower( ch );
}
for ( fch = char_list; fch != NULL; fch = fch_next )
{
fch_next = fch->next;
if (IS_NPC(fch))
continue;
if ( fch->master == ch )
stop_follower( fch );
if ( fch->leader == ch)
fch->leader = fch;
}
}
void do_order( CHAR_DATA *ch, char *argument )
{
int cmd;
char arg[MIL], arg2[MIL];
CHAR_DATA *victim, *och, *och_next;
bool found, fAll;
argument = one_argument( argument, arg );
one_argument(argument,arg2);
if (!str_cmp(arg2,"delete") || !str_cmp(arg2,"quit") || !str_cmp(arg2,"mp"))
{
send_to_char("That will NOT be done.\n\r",ch);
return;
}
if ( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "Order whom to do what?\n\r", ch );
return;
}
if ( IS_AFFECTED( ch, AFF_CHARM ) )
{
send_to_char( "You feel like taking, not giving, orders.\n\r", ch );
return;
}
if ( !str_cmp( arg, "all" ) )
{
fAll = TRUE;
victim = NULL;
}
else
{
fAll = FALSE;
if ( ( victim = get_char_room( ch, NULL, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "Aye aye, right away!\n\r", ch );
return;
}
if (!IS_AFFECTED(victim, AFF_CHARM) || victim->master != ch || (IS_IMMORTAL(victim) && victim->trust >= ch->trust))
{
send_to_char( "Do it yourself!\n\r", ch );
return;
}
}
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( arg2[0] == cmd_table[cmd].name[0]
&& !str_prefix( arg2, cmd_table[cmd].name ) )
break;
}
found = FALSE;
for ( och = ch->in_room->people; och != NULL; och = och_next )
{
och_next = och->next_in_room;
if ( IS_AFFECTED(och, AFF_CHARM) && och->master == ch && ( fAll || och == victim ))
{
found = TRUE;
if (!can_see(ch,och))
{
send_to_char("You must see your target to order them around.\n\r", ch);
continue;
}
sendf( och, "%s orders you to '%s'.\n\r", PERS(ch,och), argument );
if ( cmd_table[cmd].order == 0 )
break;
/* check for pc charm effect weakeaning */
{
AFFECT_DATA* paf = affect_find(och->affected, gen_pc_charm);
if (paf != NULL){
if (number_percent() < 10 * paf->modifier){
affect_strip(och, gen_pc_charm);
continue;
}
paf->modifier ++;
}
/* end of pc charm check */
}
interpret( och, argument );
}
}
if ( found )
send_to_char( "Ok.\n\r", ch );
else
send_to_char( "You have no followers here.\n\r", ch );
}
void do_group( CHAR_DATA *ch, char *argument )
{
char arg[MIL];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
CHAR_DATA *gch;
CHAR_DATA *leader;
leader = (ch->leader != NULL) ? ch->leader : ch;
sendf( ch, "%s's group:\n\r", PERS(leader, ch) );
for ( gch = char_list; gch != NULL; gch = gch->next )
if ( is_same_group( gch, ch ) && !(!IS_NPC(gch) && IS_SET(gch->act2,PLR_NOWHO)))
{
if (gch->max_hit == 0)
gch->max_hit++;
if (gch->max_mana == 0)
gch->max_mana++;
if (gch->max_move == 0)
gch->max_move++;
sendf( ch,"[%2d %s] %-16s %4d%% hp %4d%% mana %4d%% mv %5ld xp\n\r",
gch->level,
(IS_NPC(gch) ? "Mob" : (IS_SET(gch->act2, PLR_MASQUERADE) && ch != gch ?
class_table[class_lookup("dark-knight")].who_name :
class_table[gch->class].who_name)),
capitalize( PERS(gch, ch) ),
gch->hit*100/gch->max_hit,
gch->mana*100/gch->max_mana,
gch->move*100/gch->max_move,
gch->exp);
}
return;
}
if ( ( victim = get_char_room( ch, NULL, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ch->master != NULL || ( ch->leader != NULL && ch->leader != ch ) )
{
send_to_char( "But you are following someone else!\n\r", ch );
return;
}
if ( victim->master != ch && ch != victim )
{
sendf(ch,"%s isn't following you.\n\r",PERS2(victim));
return;
}
if (IS_AFFECTED(victim,AFF_CHARM))
{
send_to_char("You can't remove charmed mobs from your group.\n\r",ch);
return;
}
if (IS_AFFECTED(ch,AFF_CHARM))
{
act_new("You like your master too much to leave $m!",ch,NULL,victim,TO_VICT,POS_SLEEPING);
return;
}
if ( is_same_group( victim, ch ) && ch != victim )
{
if (!IS_NPC(ch) && !IS_NPC(victim) && (ch->pcdata->guarding == victim || victim->pcdata->guarded_by == ch))
{
act("You stop guarding $N.", ch, NULL, victim, TO_CHAR);
act("$n stops guarding you.", ch, NULL, victim, TO_VICT);
act("$n stops guarding $N.", ch, NULL, victim, TO_NOTVICT);
victim->pcdata->guarded_by = NULL;
ch->pcdata->guarding = NULL;
}
victim->leader = NULL;
act_new("$n removes $N from $s group.",ch,NULL,victim,TO_NOTVICT,POS_RESTING);
act_new("$n removes you from $s group.",ch,NULL,victim,TO_VICT,POS_SLEEPING);
act_new("You remove $N from your group.",ch,NULL,victim,TO_CHAR,POS_SLEEPING);
if (IS_NPC(victim))
{
if (victim->in_room != NULL)
act( "$n slowly disappears.",victim,NULL,NULL,TO_ROOM );
extract_char( victim, TRUE );
}
if (!IS_NPC(victim) && !IS_NPC(ch) && victim->pcdata->guarded_by != NULL && !is_same_group(victim,victim->pcdata->guarded_by))
{
act("You stop guarding $N.",victim->pcdata->guarded_by,NULL,victim,TO_CHAR);
act("$n stops guarding you.",victim->pcdata->guarded_by,NULL,victim,TO_VICT);
act("$n stops guarding $N.",victim->pcdata->guarded_by,NULL,victim,TO_NOTVICT);
victim->pcdata->guarded_by->pcdata->guarding = NULL;
victim->pcdata->guarded_by = NULL;
}
return;
}
if ( ch->level - victim->level >= 9 && get_trust(ch) < LEVEL_IMMORTAL)
{
sendf(ch, "%s is too inexperienced for you.\n\r",PERS2(victim));
return;
}
else if ( victim->level - ch->level >= 9 )
{
sendf(ch, "%s is too experienced for you.\n\r",PERS2(victim));
return;
}
if ( (ch->alignment == 750 && victim->alignment == -750) || (ch->alignment == -750 && victim->alignment == 750) )
{
sendf(ch, "%s is too different from you.\n\r",PERS2(victim));
return;
}
victim->leader = ch;
act_new("$N joins $n's group.",ch,NULL,victim,TO_NOTVICT,POS_RESTING);
act_new("You join $n's group.",ch,NULL,victim,TO_VICT,POS_SLEEPING);
act_new("$N joins your group.",ch,NULL,victim,TO_CHAR,POS_SLEEPING);
}
void do_split( CHAR_DATA *ch, char *argument )
{
char arg[MIL];
CHAR_DATA *gch;
int members = 0, amount, share, extra;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Split how much?\n\r", ch );
return;
}
amount = atoi( arg );
if ( amount < 0 )
{
send_to_char( "Your group wouldn't like that.\n\r", ch );
return;
}
if ( amount == 0 )
{
send_to_char( "You hand out zero coins, but no one notices.\n\r", ch );
return;
}
if ( ch->gold < amount )
{
send_to_char( "You don't have that much gold.\n\r", ch );
return;
}
for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
if ( is_same_group( gch, ch ) && !IS_AFFECTED(gch,AFF_CHARM))
members++;
if ( members < 2 )
{
send_to_char( "Just keep it all.\n\r", ch );
return;
}
share = amount / members;
extra = amount % members;
if ( share == 0 )
{
send_to_char( "Don't even bother, cheapskate.\n\r", ch );
return;
}
ch->gold -= amount;
ch->gold += share + extra;
sendf( ch, "You split %d gold coins. Your share is %d gold coins.\n\r",amount, share + extra );
for ( gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room )
if ( gch != ch && is_same_group( gch, ch ) && !IS_AFFECTED(gch,AFF_CHARM))
{
sendf( gch, "%s splits %d gold coins. Your share is %d gold coins.\n\r", PERS2(ch), amount, share );
if (gch->class == class_lookup("monk") && (gch->gold + share) > 20000)
{
//int overflow = UMAX(0,gch->gold + share - 20000);
act("$N can't hold that much gold so keep it.",ch,NULL,gch,TO_CHAR);
send_to_char("You can't hold that much gold.\n\r",gch);
gch->gold = 20000;
}
else
gch->gold += share;
}
}
void do_gtell( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *gch;
char buf[MSL];
char arg_buf[MSL];
const int demon_cost = 30;
bool fDemon = IS_TELEPATH(ch);
if ( argument[0] == '\0' )
{
send_to_char( "Tell your group what?\n\r", ch );
return;
}
argument[0] = UPPER(argument[0]);
if ( !IS_NPC(ch) && IS_SET( ch->comm, COMM_NOTELL ) )
{
send_to_char( "Your message didn't get through!\n\r", ch );
return;
}
if ( IS_NPC(ch) && ch->master != NULL && (IS_SET( ch->master->comm, COMM_NOTELL ) || IS_AFFECTED2(ch->master, AFF_SILENCE) ))
return;
if (IS_AFFECTED2(ch, AFF_SILENCE) && !fDemon)
{
send_to_char("You work your mouth, but no sounds escape your lips.\n\r",ch);
return;
}
if (is_affected(ch, gsn_gag) && !fDemon)
{
send_to_char("You find difficultly talking.\n\r",ch);
return;
}
if (is_affected(ch, gsn_uppercut) && !fDemon)
{
send_to_char("Your jaws hurt too much to talk.\n\r",ch);
return;
}
strcpy(arg_buf, argument);
makedrunk(argument,ch);
if (fDemon)
{
if (can_demon_talk(ch, demon_cost))
sendf(ch, "You broadcast '`9%s``'\n\r",argument);
else
return;
}
else
sendf(ch, "You tell your group '`9%s``'\n\r",argument);
for ( gch = char_list; gch != NULL; gch = gch->next )
if ( is_same_group( gch, ch )
&& ((!is_affected(gch,gsn_silence)
&& !IS_AFFECTED2(gch, AFF_SILENCE))
|| fDemon)
)
{
if (fDemon)
{
sprintf(buf,"[`8%s``] '`9$t``'",PERS(ch,gch));
act_new( buf, ch, is_affected(gch, gsn_com_lan)? arg_buf : IS_IMMORTAL(gch) ? arg_buf : argument,
gch, TO_VICT, POS_DEAD);
}
else
{
sprintf(buf, "%s tells the group '`9$t``'", PERS(ch,gch));
act_new( buf, ch, is_affected(gch, gsn_com_lan)? arg_buf : IS_IMMORTAL(gch) ? arg_buf : argument,
gch, TO_VICT, POS_DEAD);
}
if (!IS_NPC(gch) && gch->pcdata->eavesdropped != NULL
&& is_affected(gch->pcdata->eavesdropped,gsn_eavesdrop)
&& gch != ch && gch->pcdata->eavesdropped != ch
&& !is_same_group(gch->pcdata->eavesdropped,gch)
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",gch->pcdata->eavesdropped);
sprintf(buf,"Someone tells the group '`9$t``'");
act_new(buf,gch->pcdata->eavesdropped,is_affected(gch->pcdata->eavesdropped, gsn_com_lan)? arg_buf : IS_IMMORTAL(gch->pcdata->eavesdropped) ? arg_buf : argument,
NULL,TO_CHAR, POS_DEAD);
}
}
if (!IS_NPC(ch) && ch->pcdata->eavesdropped != NULL
&& is_affected(ch->pcdata->eavesdropped,gsn_eavesdrop)
&& !fDemon)
{
send_to_char("A faint message transmits from the spies.\n\r",ch->pcdata->eavesdropped);
sprintf(buf,"%s tells the group '`9$t``'",PERS(ch,ch->pcdata->eavesdropped));
act_new(buf,ch->pcdata->eavesdropped,is_affected(ch->pcdata->eavesdropped, gsn_com_lan)? arg_buf : IS_IMMORTAL(ch->pcdata->eavesdropped) ? arg_buf : argument,
NULL,TO_CHAR, POS_DEAD);
}
}
/* It is very important that this be an equivalence relation: *
* (1) A ~ A *
* (2) if A ~ B then B ~ A *
* (3) if A ~ B and B ~ C, then A ~ C */
bool is_same_group( CHAR_DATA *ach, CHAR_DATA *bch )
{
if ( ach == NULL || bch == NULL)
return FALSE;
if ( ach->leader != NULL )
ach = ach->leader;
if ( bch->leader != NULL )
bch = bch->leader;
return ach == bch;
}
void do_release(CHAR_DATA *ch, char *argument)
{
char arg[MIL];
CHAR_DATA *victim;
one_argument( argument, arg );
if (IS_NPC(ch))
return;
if (arg[0] == '\0')
{
send_to_char("Release whom?\n\r",ch);
return;
}
if ((victim = get_char_room(ch, NULL, argument)) == NULL)
{
send_to_char("They're not here.\n\r",ch);
return;
}
if (!IS_NPC(victim))
{
send_to_char("You can't release another player.\n\r", ch);
return;
}
if (victim->master != ch || victim->leader != ch)
{
send_to_char("You have no power over that mob.\n\r", ch);
return;
}
act("$N is released by $n!", ch, NULL, victim, TO_NOTVICT);
act("You send $N back home.", ch, NULL, victim, TO_CHAR);
act("You've been released!", ch, NULL, victim, TO_VICT);
act("$N slowly fades away.",ch,NULL,victim,TO_ALL);
if (is_affected(ch,gsn_familiar_link) && ch->pcdata->familiar != NULL && ch->pcdata->familiar == victim)
{
AFFECT_DATA af;
send_to_char("Your energy drains out as you lose link with your familiar.\n\r",ch);
affect_strip(ch,gsn_familiar_link);
ch->pcdata->familiar=NULL;
af.type = gsn_drained;
af.level = ch->level;
af.duration = 12;
af.modifier = 0;
af.location = 0;
af.bitvector = 0;
affect_to_char(ch,&af);
}
extract_char(victim, TRUE);
}
/* converts the str to drunk talk */
void makedrunk (char *string, CHAR_DATA * ch){
struct struckdrunk drunk[] =
{
{3, 9, {"a", "a", "a", "A", "aa", "ah", "Ah", "ao", "aw", "ahh"}},
{8, 5, {"b", "b", "b", "B", "B", "vb"}},
{3, 5, {"c", "c", "C", "cj", "sj", "zj"}},
{5, 2, {"d", "d", "D"}},
{3, 4, {"e", "e", "eh", "E", "Eh"}},
{4, 4, {"f", "f", "F", "ff", "fF"}},
{8, 3, {"g", "g", "G", "gh"}},
{9, 5, {"h", "h", "H", "hh", "Hh", "hH"}},
{7, 6, {"i", "i", "I", "ii", "ii", "iI", "Ii"}},
{9, 5, {"j", "j", "J", "jj", "Jj", "jJ"}},
{7, 3, {"k", "k", "K", "ck"}},
{3, 2, {"l", "l", "L"}},
{5, 6, {"m", "m", "M", "mm", "mM", "mmm", "MmM"}},
{6, 6, {"n", "n", "N", "nn", "Nn", "nnn", "nNn"}},
{3, 6, {"o", "o", "O", "ao", "oo", "Oo", "oOo"}},
{3, 2, {"p", "p", "P"}},
{5, 4, {"q", "q", "Q", "qu", "ku"}},
{4, 2, {"r", "r", "R"}},
{2, 6, {"s", "ss", "sSs", "szs", "ZSs", "sSz", "Zsz"}},
{5, 2, {"t", "t", "T"}},
{3, 6, {"u", "u", "uh", "U", "Uh", "uhh", "uhH"}},
{4, 2, {"v", "v", "V"}},
{4, 2, {"w", "w", "W"}},
{5, 6, {"x", "x", "X", "xz", "kz", "kx", "iks"}},
{3, 2, {"y", "y", "Y"}},
{2, 7, {"z", "z", "Z", "zZ", "szz", "ZSz", "Zzz", "sZz"}}
};
char buf[MSL];
char* str;//current place in the string
char* point;//current place inthe buffer
int drunklevel, randomnum, count;
if (IS_TELEPATH(ch))
return;
/* ANNOY */
if (!IS_NPC(ch) && IS_SET(ch->act2,PLR_ANNOY)){
//make random characters in string capital
str = string;
while(*str != '\0')
{
if (number_bits(1) == 0)
*str= UPPER(*str);
str++;
}
}
if (is_affected(ch,gsn_garble) || (!IS_NPC(ch) && IS_SET(ch->act2,PLR_GARBLE))){
str = string;
while (*str != '\0'){
if ((*str >= 'A') && (*str <= 'Z'))
*str++ = 'A' + number_range (0,25);
else if ((*str >= 'a') && (*str <= 'z'))
*str++ = 'a' + number_range (0,25);
else if ((*str >= '0') && (*str <= '9'))
*str++ = '0' + number_range (0, 9);
else
str++;
}
}
/*Ogres talk drunk */
if (IS_NPC(ch))
drunklevel = 0;
else if (is_affected(ch,gsn_drunken)
|| is_affected(ch, gsn_brain_death)
|| ch->race == race_lookup("Ogre"))
drunklevel = UMAX(10,ch->pcdata->condition[COND_DRUNK]);
else
drunklevel = ch->pcdata->condition[COND_DRUNK];
if (drunklevel > 0){
if (drunklevel > 10)
drunklevel = 10 + (drunklevel-10)/2;
//begin converting string to drunk talk.
str = string;
point = buf;//we need buffer as the result might be longer then original.
while (*str != '\0'){
if (UPPER(*str) >= 'A' && UPPER(*str) <= 'Z'){
if (drunklevel > drunk[*str - 'A'].min_drunk_level){
randomnum = number_range (0, drunk[UPPER(*str) - 'A'].number_of_rep);
strcpy(point, drunk[UPPER(*str) - 'A'].replacement[randomnum]);
point += strlen(drunk[UPPER(*str) - 'A'].replacement[randomnum]);
}
else
*point++ = *str;
}
else if (*str == '.'){
randomnum = number_range(1,drunklevel/5);
for (count = 0; count < 3 && count < randomnum; count++)
*point++ = *str;
}
else if (*str == '%')
*point++ = *str;
else if (*str >= '0' && *str <= '9')
*point++ = '0' + number_range (0, 9);
else
*point++ = *str;
str++;
}//end while
*point = '\0';
strncpy(string, buf, MIL);
}//end if drunk
}
void do_lastname( CHAR_DATA *ch, char *argument)
{
char arg1[MSL], arg2[MSL];
smash_tilde(argument);
argument = one_argument_2(argument,arg1);
argument = one_argument_2(argument,arg2);
if (IS_NPC(ch))
return;
if (ch->pcdata->family[0] != '\0')
{
send_to_char("You must petition to the Gods for a last name change.\n\r",ch);
return;
}
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: lastname <lastname> <lastname>\n\r",ch);
return;
}
if (str_cmp_2(arg1,arg2))
{
send_to_char("Last name doesn't match.\n\r",ch);
return;
}
if ( strlen(arg1) > 12 )
{
send_to_char("Last name must be less than twelve characters long.\n\r",ch);
return;
}
if ( !check_parse_name( arg1 ) || check_exist_name(arg1) )
{
send_to_char( "Illegal last name, try another.\n\r",ch);
return;
}
free_string( ch->pcdata->family );
ch->pcdata->family = str_dup( arg1 );
sendf(ch, "Last name changed to %s.\n\r",ch->pcdata->family);
}
void do_immpass( CHAR_DATA *ch, char *argument)
{
char arg1[MSL], arg2[MSL];
char *argnew;
smash_tilde(argument);
argument = one_argument_2(argument,arg1);
argument = one_argument_2(argument,arg2);
if (IS_NPC(ch) || !IS_IMMORTAL(ch))
return;
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: immpass <password> <password>\n\r",ch);
return;
}
if (str_cmp_2(arg1,arg2))
{
send_to_char("Passwords doesn't match.\n\r",ch);
return;
}
if ( strlen(arg1) < 5 )
{
send_to_char("Password must be at least 5 characters long.\n\r",ch);
return;
}
free_string( ch->pcdata->pwdimm );
argnew = crypt( arg1, ch->name );
ch->pcdata->pwdimm = str_dup( argnew );
save_char_obj( ch );
send_to_char("Password set.\n\r",ch);
}
void do_delpass( CHAR_DATA *ch, char *argument)
{
char arg1[MSL], arg2[MSL];
char *pwdnew, *p;
smash_tilde(argument);
argument = one_argument_2(argument,arg1);
argument = one_argument_2(argument,arg2);
if (IS_NPC(ch))
return;
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: delpass <current password> <new password>\n\r",ch);
return;
}
if ( !IS_NULLSTR(ch->pcdata->pwddel)
&& strcmp( crypt( arg1, ch->name ), ch->pcdata->pwddel )
&& strcmp( crypt( arg1, ch->pcdata->pwddel ), ch->pcdata->pwddel ) )
{
WAIT_STATE( ch, 40 );
send_to_char( "Wrong password. Wait 10 seconds.\n\r", ch );
return;
}
if ( strlen(arg2) < 5 )
{
send_to_char("New password must be at least five characters long.\n\r", ch );
return;
}
pwdnew = crypt( arg2, ch->name );
for ( p = pwdnew; *p != '\0'; p++ )
if ( *p == '~' )
{
send_to_char("New password not acceptable, try again.\n\r", ch );
return;
}
free_string( ch->pcdata->pwddel );
ch->pcdata->pwddel = str_dup( pwdnew );
save_char_obj( ch );
send_to_char( "New password set.\n\r", ch );
}
bool check_exist_name( char *name )
{
struct stat *buf;
char path[MIL];
sprintf( path, "%s%s", PLAYER_DIR, capitalize( name ) );
init_malloc("check_exist_name");
buf=malloc(sizeof(struct stat));
if ( !(stat( path,buf )) )
{
free(buf);
end_malloc("check_exist_name");
return TRUE;
}
free(buf);
end_malloc("check_exist_name");
return FALSE;
}
void eq_purge( CHAR_DATA *ch )
{
OBJ_DATA *obj, *obj_next;
for ( obj = ch->carrying; obj != NULL; obj = obj_next )
{
obj_next = obj->next_content;
extract_obj(obj);
}
}
void deny_record( CHAR_DATA *ch ){
char strsave[MIL];
char nameread[MIL];
const int max_name = 512;
char names[max_name] [MIL];
int last_name = 0;
int top_name = 0;
FILE *fp;
if ( ch->desc != NULL && ch->desc->original != NULL )
ch = ch->desc->original;
fclose( fpReserve );
sprintf( strsave, "%s", ILLEGAL_NAME_FILE );
if ( (fp = fopen( strsave, "r" ) ) != NULL ){
/* read in the names, looping over to start if neccessary */
for ( ; ; ){
/* loop over if we are at max name */
if (last_name >= max_name)
last_name = 0;
fscanf (fp, "%s", nameread);
if ( !str_cmp( nameread, "END" ) )
break;
else{
strcpy(names[last_name++], nameread);
if (last_name > top_name)
top_name = last_name;
}
}
}
else
fp = fopen( NULL_FILE, "r" );
fclose( fp );
fp = fopen( strsave, "w" );
for ( last_name = 0; last_name < top_name; last_name++){
fprintf( fp, "%s\n", names[last_name] );
}
fprintf( fp, "%s\n", ch->name );
fprintf( fp, "END" );
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
}
/* REMOVE ME LATER */
extern AREA_QUEUE* generate_area_list( AREA_DATA *src, AREA_DATA *target);
void print_list( CHAR_DATA* ch, PATH_QUEUE* curr ){
if (curr == NULL)
return;
sendf( ch, "%-8.8s to %d name %s\n\r",
dir_name[(int)curr->from_dir],
curr->room->vnum,
curr->room->name);
print_list( ch, curr->next );
}
void do_test( CHAR_DATA *ch, char *argument){
/* FILE *fp;
OBJ_INDEX_DATA* pIndex;
char path[MIL];
int index;
int count = 0;
sprintf(path, "%s", "item_db.txt");
fclose( fpReserve );
if ( (fp = fopen( path, "w" )) == NULL){
fpReserve = fopen( NULL_FILE, "r" );
return;
}
for (index = 0; count < top_obj_index; index++){
if ( (pIndex = get_obj_index( index)) == NULL){
continue;
}
count++;
if (pIndex->item_type != ITEM_WEAPON)
continue;
dump_object( fp, pIndex );
}
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
*/
MOB_INDEX_DATA* pIndex;
int index;
int count = 0;
for (index = 0; count < top_mob_index; index++){
if ( (pIndex = get_mob_index( index)) == NULL)
continue;
count++;
if (IS_SET(pIndex->act, ACT_UNDEAD)
|| pIndex->level < 50
|| pIndex->level > 52
)
continue;
if (!IS_SET(pIndex->off_flags, OFF_BASH)
|| !IS_SET(pIndex->off_flags, OFF_TRIP)
|| !IS_SET(pIndex->off_flags, OFF_DISARM)
|| !IS_SET(pIndex->off_flags, OFF_KICK_DIRT)
)
continue;
/*
if (!IS_SET(pIndex->act, ACT_WARRIOR))
continue;
*/
sendf(ch, "[%-6d] Lvl%-2d %s\n\r",
pIndex->vnum,
pIndex->level,
pIndex->short_descr);
}
/*
OBJ_INDEX_DATA* pIndex;
AFFECT_DATA* paf;
FILE* fp;
//char buf[MIL];
int index;
int count = 0;
bool fFound = FALSE;
if ( (fp = fopen("dump.txt", "w")) == NULL)
return;
for (index = 0; count < top_obj_index; index++){
int hit = 0;
int dam = 0;
int mana = 0;
if ( (pIndex = get_obj_index( index)) == NULL)
continue;
count++;
if (pIndex->item_type != ITEM_WEAPON || !IS_WEAPON_STAT(pIndex, WEAPON_TWO_HANDS))
continue;
else if (pIndex->value[0] != WEAPON_POLEARM)
continue;
else if (attack_table[pIndex->value[3]].damage <= DAM_SLASH)
continue;
for (paf = pIndex->affected; paf; paf = paf->next){
if (paf->location == APPLY_HITROLL)
hit += paf->modifier;
if (paf->location == APPLY_DAMROLL)
dam += paf->modifier;
if (paf->location == APPLY_MANA)
mana += paf->modifier;
}
fFound = TRUE;
sendf(ch, "%-6d %-25.25s %-5d %-15.15s %s\n",
pIndex->vnum,
pIndex->short_descr,
mana,
flag_string( wear_flags, pIndex->wear_flags & ~ITEM_TAKE & ~ITEM_NO_SAC & ~ITEM_WEAR_SECONDARY & ~ITEM_RARE & ~ITEM_UNIQUE & ~ITEM_PARRY),
pIndex->area->name);
}
*/
/* OBJ_INDEX_DATA* pIndex;
OBJ_DATA* obj;
AFFECT_DATA* paf;
char buf[MIL];
int index;
int count = 0;
for (index = 0; count < top_obj_index; index++){
if ( (pIndex = get_obj_index( index)) == NULL)
continue;
count++;
if (pIndex->item_type != ITEM_HERB || pIndex->value[4] < 1)
continue;
sendf(ch, "[%-6d]\t%-20.20s\t%-20.20s\t(%s)\n\r",
pIndex->vnum,
skill_table[pIndex->value[4]].name,
pIndex->short_descr,
pIndex->area->name);
}
*/
/*
int i;
int min, max, bon, man;
for (i = 0; i < MAX_PC_RACE; i++){
if (!pc_race_table[i].can_pick)
continue;
bon = int_app[pc_race_table[i].max_stats[STAT_INT]].manap;
bon += wis_app[pc_race_table[i].max_stats[STAT_WIS]].manap;
min = 6 + bon;
max = 12 + bon;
man = 50 * (min + (max - min) / 2);
man += pc_race_table[i].mana;
//race, int, wis, min, max, bon, min, max, avg
sendf( ch, "%-15.15s %4d %4d %4d %4d %4d %4d %4d %4d\n\r",
pc_race_table[i].name,
pc_race_table[i].max_stats[STAT_INT],
pc_race_table[i].max_stats[STAT_WIS],
min,
max,
min + (max - min) / 2,
pc_race_table[i].mana + min * 50,
pc_race_table[i].mana + max * 50,
man);
}
*/
/*
MOB_INDEX_DATA* pIndex;
int index;
int count = 0;
for (index = 0; count < top_mob_index; index++){
if ( (pIndex = get_mob_index( index)) == NULL)
continue;
count++;
if (IS_SET(pIndex->act, ACT_UNDEAD) && IS_SET(pIndex->act, ACT_MOUNT) ){
sendf(ch, "[%-6d] Lvl%-2d %s\n\r",
pIndex->vnum,
pIndex->level,
pIndex->short_descr);
}
}
*/
}
bool lookup_history( CHAR_DATA *ch, char *argument )
{
char strsave[MIL], buf[MSL], *desc;
FILE *fp;
if ( argument[0] == '\0' )
return FALSE;
fclose( fpReserve );
sprintf( strsave, "%s%s", HISTORY_DIR, capitalize( argument ) );
if ( ( fp = fopen( strsave, "r" ) ) == NULL )
{
fp = fopen( NULL_FILE, "r" );
fclose (fp);
fpReserve = fopen( NULL_FILE, "r" );
return FALSE;
}
sprintf(buf,"You recite the history of %s:",capitalize( argument ));
act(buf,ch,NULL,NULL,TO_CHAR);
sprintf(buf,"$n recites the history of %s:",capitalize( argument ));
act(buf,ch,NULL,NULL,TO_ROOM);
for ( ; ; )
{
desc = feof( fp ) ? "END" : fread_string_eol( fp );
if ( !str_cmp( desc, "END" ) )
break;
sprintf(buf,"`#%s``",desc);
act(buf,ch,NULL,NULL,TO_ALL);
}
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
return TRUE;
}
void do_history( CHAR_DATA *ch, char *argument )
{
char arg[MIL];
one_argument (argument, arg);
if (!IS_IMMORTAL(ch))
{
send_to_char("You do not know anything of that sort.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Find information on who's history?\n\r", ch );
return;
}
if (!lookup_history(ch,arg))
{
send_to_char ("You cannot find any known history on that character.\n\r", ch);
return;
}
}
void list_history( CHAR_DATA *ch, char *argument )
{
char buf[MSL], command[MSL], *name;
FILE *fp;
if (argument[0] != '\0')
{
sprintf(command,"ls ~/ar/history/%s", argument);
sprintf(buf,"Here are a list of the '%s' people that I have information on:",argument);
}
else
{
sprintf(command,"ls ~/ar/history");
sprintf(buf,"Here are a list of all the information I have:");
}
do_say(ch,buf);
fp = popen( command, "r" );
for (;;)
{
name = feof( fp ) ? "ZZEND" : fread_word( fp );
if ( !str_cmp( name, "ZZEND" ) || name == NULL)
break;
sprintf(buf,"%s",name);
str_replace(buf,"/home/mudgroup/ar/history/","");
do_say(ch,buf);
}
pclose( fp );
}
//2001-02-18 Ath: Added do_bounties to show top-10 bounties
//2001-02-18 Ath: Added section to do_bounty to add to top-10 file
//2001-05-21 Ath: Added spectator sections (for room watching)