wileymud-1.187b/
wileymud-1.187b/attic/
wileymud-1.187b/attic/bin/
wileymud-1.187b/attic/lib/
wileymud-1.187b/attic/lib/adm/
wileymud-1.187b/attic/lib/man/
wileymud-1.187b/attic/lib/new-wld/
wileymud-1.187b/attic/lib/new-wld/default/
wileymud-1.187b/attic/lib/old/
wileymud-1.187b/attic/lib/wld/
wileymud-1.187b/attic/public_html/
wileymud-1.187b/attic/public_html/gfx/
wileymud-1.187b/attic/src/bin/
wileymud-1.187b/attic/src/etc/
wileymud-1.187b/attic/src/libauth-4.0-p5/
wileymud-1.187b/attic/src/sedna/
wileymud-1.187b/backups/
wileymud-1.187b/bin/
wileymud-1.187b/docs/
wileymud-1.187b/etc/
wileymud-1.187b/lib/
wileymud-1.187b/lib/adm/
wileymud-1.187b/lib/boards/
wileymud-1.187b/lib/log/
wileymud-1.187b/lib/man/
wileymud-1.187b/lib/ply/
wileymud-1.187b/lib/ply/a/
wileymud-1.187b/lib/ply/b/
wileymud-1.187b/lib/ply/c/
wileymud-1.187b/lib/ply/d/
wileymud-1.187b/lib/ply/g/
wileymud-1.187b/lib/ply/k/
wileymud-1.187b/lib/ply/m/
wileymud-1.187b/lib/ply/s/
wileymud-1.187b/lib/ply/t/
wileymud-1.187b/public_html/gfx/
wileymud-1.187b/src/bin/
wileymud-1.187b/src/convert/attic/
wileymud-1.187b/src/convert/obj/
wileymud-1.187b/src/convert/perl/
wileymud-1.187b/src/convert/perl/MudConvert/
wileymud-1.187b/src/convert/perl/MudConvert/DUMP/
wileymud-1.187b/src/convert/perl/MudConvert/Report/
wileymud-1.187b/src/convert/perl/MudConvert/WileyMUD/
wileymud-1.187b/src/convert/perl/output/
wileymud-1.187b/src/convert/perl/output/DUMP/
wileymud-1.187b/src/convert/perl/output/Report/
wileymud-1.187b/src/convert/perl/output/WileyMUD/
wileymud-1.187b/src/etc/
wileymud-1.187b/src/etc/init.d/
wileymud-1.187b/src/etc/rc.d/
wileymud-1.187b/src/etc/rc.d/init.d/
wileymud-1.187b/src/lib/
wileymud-1.187b/src/lib/adm/
wileymud-1.187b/src/lib/boards/
wileymud-1.187b/src/lib/log/
wileymud-1.187b/src/lib/man/
wileymud-1.187b/src/lib/ply/
wileymud-1.187b/src/lib/ply/a/
wileymud-1.187b/src/lib/ply/b/
wileymud-1.187b/src/lib/ply/c/
wileymud-1.187b/src/lib/ply/d/
wileymud-1.187b/src/lib/ply/e/
wileymud-1.187b/src/lib/ply/f/
wileymud-1.187b/src/lib/ply/g/
wileymud-1.187b/src/lib/ply/h/
wileymud-1.187b/src/lib/ply/i/
wileymud-1.187b/src/lib/ply/j/
wileymud-1.187b/src/lib/ply/k/
wileymud-1.187b/src/lib/ply/l/
wileymud-1.187b/src/lib/ply/m/
wileymud-1.187b/src/lib/ply/n/
wileymud-1.187b/src/lib/ply/o/
wileymud-1.187b/src/lib/ply/p/
wileymud-1.187b/src/lib/ply/q/
wileymud-1.187b/src/lib/ply/r/
wileymud-1.187b/src/lib/ply/s/
wileymud-1.187b/src/lib/ply/t/
wileymud-1.187b/src/lib/ply/u/
wileymud-1.187b/src/lib/ply/v/
wileymud-1.187b/src/lib/ply/w/
wileymud-1.187b/src/lib/ply/x/
wileymud-1.187b/src/lib/ply/y/
wileymud-1.187b/src/lib/ply/z/
wileymud-1.187b/src/obj/
wileymud-1.187b/src/utils/
wileymud-1.187b/src/utils/mobmaker/
/*
 * file: act.comm.c , Implementation of commands.         Part of DIKUMUD
 * Usage : Communication.
 * Copyright (C) 1990, 1991 - see 'license.doc' for complete information.
 */

#include <stdio.h>
#include <stdlib.h>
/* #include <unistd.h> */
#include <sys/types.h>
#include <string.h>

#include "global.h"
#include "bug.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "spells.h"
#include "constants.h"
#include "mudlimits.h"
#include "multiclass.h"
#include "board.h"
#define _ACT_COMM_C
#include "act_comm.h"

void do_say(struct char_data *ch, const char *argument, int cmd)
{
    int                                     i = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    for (i = 0; *(argument + i) == ' '; i++);		       /* skip leading spaces */

    if (!*(argument + i))
	cprintf(ch, "usage: say <mesg>.\r\n");
    else {
	switch (argument[strlen(argument) - 1]) {
	    case '!':
		act("\x1b[0;32m$n exclaims '%s'\x1b[0m", FALSE, ch, 0, 0, TO_ROOM,
		    argument + i);
		if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
		    cprintf(ch, "\x1b[0;32mYou exclaim '%s'\x1b[0m\r\n", argument + i);
		}
		break;
	    case '?':
		act("\x1b[0;32m$n asks '%s'\x1b[0m", FALSE, ch, 0, 0, TO_ROOM, argument + i);
		if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
		    cprintf(ch, "\x1b[0;32mYou ask '%s'\x1b[0m\r\n", argument + i);
		}
		break;
	    default:
		act("\x1b[0;32m$n says '%s'\x1b[0m", FALSE, ch, 0, 0, TO_ROOM, argument + i);
		if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
		    cprintf(ch, "\x1b[0;32mYou say '%s'\x1b[0m\r\n", argument + i);
		}
		break;
	}
    }
}

void do_shout(struct char_data *ch, const char *argument, int cmd)
{
    struct descriptor_data                 *i = NULL;
    struct room_data                       *rp = NULL;
    struct room_data                       *mrp = NULL;

#ifdef RADIUS_SHOUT
    struct room_direction_data             *exitp = NULL;
    struct char_data                       *v = NULL;
    int                                     x = 0;
#endif

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_SET(ch->specials.act, PLR_NOSHOUT)) {
	cprintf(ch, "You can't shout!!\r\n");
	return;
    }
    for (; *argument == ' '; argument++);		       /* skip leading spaces */

    if (ch->master && IS_AFFECTED(ch, AFF_CHARM)) {
	cprintf(ch->master, "You pet is trying to shout....");
	return;
    }
    if (!(*argument)) {
	cprintf(ch, "usage: shout <mesg>.\r\n");
	return;
    }

    if (IS_IMMORTAL(ch) || IS_NPC(ch)) {
	cprintf(ch, "\x1b[1;32mYou shout '%s'\x1b[0m\r\n", argument);
	for (i = descriptor_list; i; i = i->next)
	    if (i->character != ch && !i->connected &&
		!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
		!IS_SET(i->character->specials.act, PLR_DEAF) &&
		(rp = real_roomp(i->character->in_room)) &&
		(!FindBoardInRoom(i->character->in_room)))
		act("\x1b[1;32m$n shouts '%s'\x1b[0m", 0, ch, 0, i->character, TO_VICT,
		    argument);
    } else {
#ifdef OLD_SHOUT
	if (GET_MOVE(ch) < (GET_MAX_MOVE(ch) / 10)) {
	    cprintf(ch, "You are just too tired to shout anything.\r\n");
	    return;
	}
	if (GET_MANA(ch) < (GET_MAX_MANA(ch) / 15)) {
	    cprintf(ch, "You can't seem to summon the energy to shout.\r\n");
	    return;
	}
	if (GET_COND(ch, THIRST) < 4) {
	    cprintf(ch, "Your throat is too dry to shout anything!\r\n");
	    return;
	}
	GET_MOVE(ch) -= (GET_MAX_MOVE(ch) / 10);
	GET_MANA(ch) -= (GET_MAX_MANA(ch) / 15);
	GET_COND(ch, THIRST) -= 4;
	if (IS_SET(ch->specials.act, PLR_ECHO))
	    cprintf(ch, "\x1b[1;32mYou shout '%s'\x1b[0m\r\n", argument);
	for (i = descriptor_list; i; i = i->next)
	    if (i->character != ch && !i->connected &&
		!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
		!IS_SET(i->character->specials.act, PLR_DEAF) &&
		(rp = real_roomp(i->character->in_room)) && (mrp = real_roomp(ch->in_room)) &&
		(!FindBoardInRoom(i->character->in_room)))
		act("\x1b[1;32m$n shouts '%s'\x1b[0m", 0, ch, 0, i->character, TO_VICT,
		    argument);
#endif
#ifdef ZONE_SHOUT
	if (GET_MOVE(ch) < (GET_MAX_MOVE(ch) / 10)) {
	    cprintf(ch, "You are just too tired to shout anything.\r\n");
	    return;
	}
	if (GET_MANA(ch) < (GET_MAX_MANA(ch) / 15)) {
	    cprintf(ch, "You can't seem to summon the energy to shout.\r\n");
	    return;
	}
	if (GET_COND(ch, THIRST) < 4) {
	    cprintf(ch, "Your throat is too dry to shout anything!\r\n");
	    return;
	}
	GET_MOVE(ch) -= (GET_MAX_MOVE(ch) / 10);
	GET_MANA(ch) -= (GET_MAX_MANA(ch) / 15);
	GET_COND(ch, THIRST) -= 4;
	if (IS_SET(ch->specials.act, PLR_ECHO))
	    cprintf(ch, "\x1b[1;32mYou shout '%s'\x1b[0m\r\n", argument);
	for (i = descriptor_list; i; i = i->next)
	    if (i->character != ch && !i->connected &&
		!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
		!IS_SET(i->character->specials.act, PLR_DEAF) &&
		(rp = real_roomp(i->character->in_room)) &&
		(mrp = real_roomp(ch->in_room)) && (rp->zone == mrp->zone) &&
		(!FindBoardInRoom(i->character->in_room)))
		act("\x1b[1;32m$n shouts '%s'\x1b[0m", 0, ch, 0, i->character, TO_VICT,
		    argument);
#endif
#ifdef RADIUS_SHOUT
/* This is a buggy... it corrupts memory someplace */
	if (!(mrp = real_roomp(ch->in_room))) {
	    cprintf(ch, "You are not in reality... this is bad.\r\n");
	    return;
	}
	for (v = mrp->people; v; v = v->next_in_room)
	    if (v != ch && v->desc &&
		!IS_SET(v->specials.act, PLR_NOSHOUT) && !IS_SET(v->specials.act, PLR_DEAF))
		act("\x1b[1;32m$n shouts '%s'\x1b[0m", 0, ch, 0, v, TO_VICT, argument);
	for (x = 0; x < MAX_NUM_EXITS; x++)
	    if ((exitp = EXIT(ch, x)) && exit_ok(exitp, mrp))
		if ((rp = real_roomp(exitp->to_room)) && (rp != mrp)
		    && (!FindBoardInRoom(v->in_room))) {
		    for (v = rp->people; v; v = v->next_in_room)
			if (v != ch && v->desc && !IS_SET(v->specials.act, PLR_NOSHOUT)
			    && !IS_SET(v->specials.act, PLR_DEAF))
			    act("\x1b[1;32m$n shouts %s '%s'\x1b[0m", 0, ch, 0, v, TO_VICT,
				dir_from[rev_dir[x]], argument);
		}
#endif
    }
}

void do_commune(struct char_data *ch, const char *argument, int cmd)
{
    struct descriptor_data                 *i = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    for (; *argument == ' '; argument++);		       /* skip leading spaces */

    if (!(*argument))
	cprintf(ch, "Communing among the gods is fine, but WHAT?\r\n");
    else {
	if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO)) {
	    cprintf(ch, "You wiz : '%s'\r\n", argument);       /* part of wiznet */
	}
	for (i = descriptor_list; i; i = i->next)
	    if (i->character != ch && !i->connected &&
		!IS_SET(i->character->specials.act, PLR_NOSHOUT) &&
		(GetMaxLevel(i->character) >= LOW_IMMORTAL))
		act("$n : '%s'", 0, ch, 0, i->character, TO_VICT, argument);
    }
}

void do_tell(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    char                                    name[100] = "\0\0\0\0\0\0\0";
    char                                    message[MAX_INPUT_LENGTH + 20] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    half_chop(argument, name, message);

    if (!*name || !*message) {
	cprintf(ch, "usage: tell <who> <mesg>.\r\n");
	return;
    }
    if (!(vict = get_char_vis(ch, name))) {
	cprintf(ch, "No-one by that name here..\r\n");
	return;
    }
    if (ch == vict) {
	cprintf(ch, "You try to tell yourself something.\r\n");
	return;
    }
    if (GET_POS(vict) == POSITION_SLEEPING) {
	act("$E is asleep, shhh.", FALSE, ch, 0, vict, TO_CHAR);
	return;
    }
    if (IS_NPC(vict) && !(vict->desc)) {
	cprintf(ch, "No-one by that name here..\r\n");
	return;
    }
    if (!vict->desc) {
	cprintf(ch, "They can't hear you, link dead.\r\n");
	return;
    }
    if (IS_SET(vict->specials.new_act, NEW_PLR_NOTELL) && IS_MORTAL(ch)) {
	cprintf(ch, "They are not recieving tells at the moment.\r\n");
	return;
    }
    switch (message[strlen(message) - 1]) {
	case '!':
	    cprintf(vict, "\x1b[1;33m%s exclaims to you '%s'\x1b[0m\r\n", NAME(ch), message);
	    if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO))
		cprintf(ch, "\x1b[1;33mYou exclaim to %s '%s'\x1b[0m\r\n", NAME(vict), message);
	    break;
	case '?':
	    cprintf(vict, "\x1b[1;33m%s asks you '%s'\x1b[0m\r\n", NAME(ch), message);
	    if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO))
		cprintf(ch, "\x1b[1;33mYou ask %s '%s'\x1b[0m\r\n", NAME(vict), message);
	    break;
	default:
	    cprintf(vict, "\x1b[1;33m%s tells you '%s'\x1b[0m\r\n", NAME(ch), message);
	    if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO))
		cprintf(ch, "\x1b[1;33mYou tell %s '%s'\x1b[0m\r\n", NAME(vict), message);
	    break;
    }
}

void do_whisper(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    char                                    name[100] = "\0\0\0\0\0\0\0";
    char                                    message[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    half_chop(argument, name, message);

    if (!*name || !*message)
	cprintf(ch, "Who do you want to whisper to.. and what??\r\n");
    else if (!(vict = get_char_room_vis(ch, name)))
	cprintf(ch, "No-one by that name here..\r\n");
    else if (vict == ch) {
	act("$n whispers quietly to $mself.", FALSE, ch, 0, 0, TO_ROOM);
	cprintf(ch, "You can't seem to get your mouth close enough to your ear...\r\n");
    } else {
	act("\x1b[35m$n whispers to you, '%s'\x1b[0m", FALSE, ch, 0, vict, TO_VICT, message);
	if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
	    cprintf(ch, "\x1b[35mYou whisper to %s, '%s'\x1b[0m\r\n",
		    (IS_NPC(vict) ? vict->player.name : GET_NAME(vict)), message);
	}
	act("\x1b[35m$n whispers something to $N.\x1b[0m", FALSE, ch, 0, vict, TO_NOTVICT);
    }
}

void do_ask(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    char                                    name[100] = "\0\0\0\0\0\0\0";
    char                                    message[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    half_chop(argument, name, message);

    if (!*name || !*message)
	cprintf(ch, "Who do you want to ask something.. and what??\r\n");
    else if (!(vict = get_char_room_vis(ch, name)))
	cprintf(ch, "No-one by that name here..\r\n");
    else if (vict == ch) {
	act("$n quietly asks $mself a question.", FALSE, ch, 0, 0, TO_ROOM);
	cprintf(ch, "You think about it for a while...\r\n");
    } else {
	act("$n asks you '%s'", FALSE, ch, 0, vict, TO_VICT, message);

	if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
	    cprintf(ch, "You ask %s, '%s'\r\n",
		    (IS_NPC(vict) ? vict->player.name : GET_NAME(vict)), message);
	}
	act("$n asks $N a question.", FALSE, ch, 0, vict, TO_NOTVICT);
    }
}

void do_write(struct char_data *ch, const char *argument, int cmd)
{
    struct obj_data                        *paper = NULL;
    struct obj_data                        *pen = NULL;
    char                                    papername[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    penname[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    argument_interpreter(argument, papername, penname);

    if (!ch->desc)
	return;

    if (!*papername) {					       /* nothing was delivered */
	cprintf(ch, "write (on) papername (with) penname.\r\n");
	return;
    }
    if (!*penname) {
	cprintf(ch, "write (on) papername (with) penname.\r\n");
	return;
    }
    if (!(paper = get_obj_in_list_vis(ch, papername, ch->carrying))) {
	cprintf(ch, "You have no %s.\r\n", papername);
	return;
    }
    if (!(pen = get_obj_in_list_vis(ch, penname, ch->carrying))) {
	cprintf(ch, "You have no %s.\r\n", penname);
	return;
    }
    /*
     * ok.. now let's see what kind of stuff we've found 
     */
    if (pen->obj_flags.type_flag != ITEM_PEN) {
	act("$p is no good for writing with.", FALSE, ch, pen, 0, TO_CHAR);
    } else if (paper->obj_flags.type_flag != ITEM_NOTE) {
	act("You can't write on $p.", FALSE, ch, paper, 0, TO_CHAR);
    } else if (paper->action_description) {
	cprintf(ch, "There's something written on it already.\r\n");
	return;
    } else {
	/*
	 * we can write - hooray! 
	 */
	cprintf(ch, "Ok.. go ahead and write.. end the note with a @.\r\n");
	act("$n begins to jot down a note.", TRUE, ch, 0, 0, TO_ROOM);
	ch->desc->str = &paper->action_description;
	ch->desc->max_str = MAX_NOTE_LENGTH;
    }
}

void do_group_tell(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *k = NULL;
    struct char_data                       *vict = NULL;
    struct follow_type                     *f = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (!*argument) {
	cprintf(ch, "usage: gtell <mesg>.\r\n");
	return;
    }
    if (!IS_AFFECTED(ch, AFF_GROUP)) {
	cprintf(ch, "But you are a member of no group?!\r\n");
	return;
    }
    if (GET_POS(ch) == POSITION_SLEEPING) {
	cprintf(ch, "You are to tired to do this....\r\n");
	return;
    }
    if (!ch->master)
	k = ch;
    else {
	/*
	 * tell the leader of the group 
	 */

	k = ch->master;
	if (IS_AFFECTED(k, AFF_GROUP))
	    if ((GET_POS(k) != POSITION_SLEEPING) && (k->desc) && (k != ch))
		cprintf(k, "\x1b[0;33m%s tells the group '%s'\x1b[0m\r\n",
			(IS_NPC(ch) ? ch->player.short_descr : GET_NAME(ch)), argument);
    }

    /*
     * tell the followers of the group and exclude ourselfs 
     */

    for (f = k->followers; f; f = f->next) {
	vict = f->follower;
	if (IS_AFFECTED(vict, AFF_GROUP))
	    if ((GET_POS(vict) != POSITION_SLEEPING) && (vict->desc) && (vict != ch))
		cprintf(vict, "\x1b[0;33m%s tells the group '%s'\x1b[0m\r\n",
			(IS_NPC(ch) ? ch->player.short_descr : GET_NAME(ch)), argument);
    }

    if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO))
	cprintf(ch, "\x1b[0;33mYou tell the group '%s'\x1b[0m\r\n", argument);
}

void do_group_report(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *k = NULL;
    struct char_data                       *vict = NULL;
    struct follow_type                     *f = NULL;
    char                                    message[MAX_INPUT_LENGTH + 20] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (!IS_AFFECTED(ch, AFF_GROUP)) {
	cprintf(ch, "But you are a member of no group?!\r\n");
	return;
    }
    if (GET_POS(ch) == POSITION_SLEEPING) {
	cprintf(ch, "You are to tired to do this....\r\n");
	return;
    }
    sprintf(message,
	    "\r\nGroup Report from:Name:%s Hits:%d(%d) Mana:%d(%d) Move:%d(%d)",
	    GET_NAME(ch),
	    GET_HIT(ch),
	    GET_MAX_HIT(ch), GET_MANA(ch), GET_MAX_MANA(ch), GET_MOVE(ch), GET_MAX_MOVE(ch));

    if (!ch->master)
	k = ch;
    else {
	/*
	 * tell the leader of the group 
	 */

	k = ch->master;
	if (IS_AFFECTED(k, AFF_GROUP))
	    if ((GET_POS(k) != POSITION_SLEEPING) && (k->desc) && (k != ch))
		cprintf(k, "%s", message);
    }

    /*
     * tell the followers of the group and exclude ourselfs 
     */

    for (f = k->followers; f; f = f->next) {
	vict = f->follower;
	if (IS_AFFECTED(vict, AFF_GROUP))
	    if ((GET_POS(vict) != POSITION_SLEEPING) && (vict->desc) && (vict != ch))
		cprintf(vict, "%s", message);
    }

    if (IS_NPC(ch) || IS_SET(ch->specials.act, PLR_ECHO))
	cprintf(ch, "You tell the group your stats.\r\n");
}

void do_split(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    struct follow_type                     *f = NULL;
    int                                     amount = 0;
    int                                     count = 0;
    int                                     share = 0;
    char                                    blah[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (!IS_AFFECTED(ch, AFF_GROUP)) {
	cprintf(ch, "You are a member of no group!\r\n");
	return;
    }
    if (ch->master) {
	cprintf(ch, "You must be the leader of the group to use this.\r\n");
	return;
    }
    one_argument(argument, blah);

    if (!is_number(blah)) {
	cprintf(ch, "You must supply an integer amount.\r\n");
	return;
    }
    amount = atoi(blah);
    if (amount > GET_GOLD(ch)) {
	cprintf(ch, "You do not have that much gold.\r\n");
	return;
    }
    GET_GOLD(ch) -= amount;
    count = 1;

    for (f = ch->followers; f; f = f->next) {
	vict = f->follower;
	if (IS_AFFECTED(vict, AFF_GROUP)) {
	    if ((vict->desc) && (vict != ch))
		count++;
	}
    }

    share = amount / count;
    GET_GOLD(ch) += share;

    cprintf(ch, "You split the gold into shares of %d coin(s)\r\n", share);

    for (f = ch->followers; f; f = f->next) {
	vict = f->follower;
	if (IS_AFFECTED(vict, AFF_GROUP)) {
	    if ((vict->desc) && (vict != ch)) {
		cprintf(ch, "%s gives you %d coins.\r\n",
			(IS_NPC(ch) ? ch->player.short_descr : GET_NAME(ch)), share);
		GET_GOLD(vict) += share;
	    }
	}
    }
}

void do_land(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NOT_SET(ch->specials.affected_by, AFF_FLYING)) {
	cprintf(ch, "But you are not flying?\r\n");
	return;
    }
    act("$n slowly lands on the ground.", FALSE, ch, 0, 0, TO_ROOM);

    if (affected_by_spell(ch, SPELL_FLY))
	affect_from_char(ch, SPELL_FLY);
    if (IS_SET(ch->specials.affected_by, AFF_FLYING))
	REMOVE_BIT(ch->specials.affected_by, AFF_FLYING);

    cprintf(ch, "You feel the extreme pull of gravity...\r\n");
}

void do_invis_off(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (!IS_SET(ch->specials.affected_by, AFF_INVISIBLE)) {
	cprintf(ch, "But you are not invisible?\r\n");
	return;
    }
    act("$n slowly fades into existence.", FALSE, ch, 0, 0, TO_ROOM);
    act("You feel exposed.", FALSE, ch, 0, 0, TO_CHAR);

    if (affected_by_spell(ch, SPELL_INVISIBLE))
	affect_from_char(ch, SPELL_INVISIBLE);

    if (IS_SET(ch->specials.affected_by, AFF_INVISIBLE))
	REMOVE_BIT(ch->specials.affected_by, AFF_INVISIBLE);
}