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.other.c , Implementation of commands.        Part of DIKUMUD
 * Usage : Other commands.
 * 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 <ctype.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 "mudlimits.h"
#include "constants.h"
#include "spell_parser.h"
#include "reception.h"
#include "multiclass.h"
#include "fight.h"
#include "spec_procs.h"
#include "act_skills.h"
#include "act_comm.h"
#include "modify.h"
#define _ACT_OTHER_C
#include "act_other.h"

void do_gain(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);

    return;
}

void do_guard(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_NPC(ch) || IS_SET(ch->specials.act, ACT_POLYSELF)) {
	cprintf(ch, "Sorry. you can't just put your brain on autopilot!\r\n");
	return;
    }
    if (IS_SET(ch->specials.act, ACT_GUARDIAN)) {
	act("$n relaxes.", FALSE, ch, 0, 0, TO_ROOM);
	cprintf(ch, "You relax.\r\n");
	REMOVE_BIT(ch->specials.act, ACT_GUARDIAN);
    } else {
	SET_BIT(ch->specials.act, ACT_GUARDIAN);
	act("$n alertly watches you.", FALSE, ch, 0, 0, TO_ROOM);
	cprintf(ch, "You snap to attention\r\n");
    }
    return;
}

void do_junk(struct char_data *ch, const char *argument, int cmd)
{
    char                                    arg[100] = "\0\0\0\0\0\0\0";
    char                                    newarg[100] = "\0\0\0\0\0\0\0";
    struct obj_data                        *tmp_object = NULL;

    /*
     * struct obj_data *old_object = NULL; 
     */
    int                                     num = 0;
    int                                     p = 0;
    int                                     count = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);
/*
 *   get object name & verify
 */

    only_argument(argument, arg);
    if (*arg) {
	if (getall(arg, newarg) != FALSE) {
	    num = -1;
	    strcpy(arg, newarg);
	} else if ((p = getabunch(arg, newarg)) != FALSE) {
	    num = p;
	    strcpy(arg, newarg);
	} else {
	    num = 1;
	}

	count = 0;
	while (num != 0) {
	    tmp_object = get_obj_in_list_vis(ch, arg, ch->carrying);
	    if (tmp_object) {
		/*
		 * old_object = tmp_object; 
		 */
		obj_from_char(tmp_object);
		extract_obj(tmp_object);
		if (num > 0)
		    num--;
		count++;
	    } else {
		if (count > 1) {
		    act("You junk %s (%d).\r\n", 1, ch, 0, 0, TO_CHAR, arg, count);
		    act("$n junks %s.\r\n", 1, ch, 0, 0, TO_ROOM, arg);
		} else if (count == 1) {
		    act("You junk %s \r\n", 1, ch, 0, 0, TO_CHAR, arg);
		    act("$n junks %s.\r\n", 1, ch, 0, 0, TO_ROOM, arg);
		} else {
		    cprintf(ch, "You don't have anything like that\r\n");
		}
		return;
	    }
	}
    } else {
	cprintf(ch, "Junk what?");
	return;
    }
}

void do_qui(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);

    cprintf(ch, "You have to write quit - no less, to quit!\r\n");
    return;
}

void do_title(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_NPC(ch) || !ch->desc)
	return;

    for (; isspace(*argument); argument++);

    if (*argument) {
	cprintf(ch, "Your title has been set to : <%s>\r\n", argument);
	ch->player.title = strdup(argument);
    }
}

void do_quit(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_NPC(ch) || !ch->desc)
	return;

    if (GET_POS(ch) == POSITION_FIGHTING) {
	cprintf(ch, "No way! You are fighting.\r\n");
	return;
    }
    if (GET_POS(ch) < POSITION_STUNNED) {
	cprintf(ch, "You die before your time!\r\n");
	die(ch);
	return;
    }
    if (MOUNTED(ch)) {
	Dismount(ch, MOUNTED(ch), POSITION_STANDING);
    }
    act("Goodbye, friend.. Come back soon!", FALSE, ch, 0, 0, TO_CHAR);
    act("$n has left the game.", TRUE, ch, 0, 0, TO_ROOM);
    GET_HOME(ch) = 3008;
    zero_rent(ch);
    extract_char(ch);					       /* Char is saved in extract char */
}

void do_save(struct char_data *ch, const char *argument, int cmd)
{
    struct obj_cost                         cost;

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

    if (IS_NPC(ch))
	return;

    cprintf(ch, "Saving %s.\r\n", GET_NAME(ch));
    recep_offer(ch, NULL, &cost);
    new_save_equipment(ch, &cost, FALSE);
    save_obj(ch, &cost, FALSE);
    save_char(ch, NOWHERE);
}

void do_not_here(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);

    cprintf(ch, "Sorry, but you cannot do that here!\r\n");
}

void do_sneak(struct char_data *ch, const char *argument, int cmd)
{
    int                                     percent_chance = 0;
    struct affected_type                    af;

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

    if (IS_AFFECTED(ch, AFF_SNEAK)) {
	affect_from_char(ch, SKILL_SNEAK);
	if (IS_AFFECTED(ch, AFF_HIDE))
	    REMOVE_BIT(ch->specials.affected_by, AFF_HIDE);
	cprintf(ch, "You are no longer sneaky.\r\n");
	return;
    }
    cprintf(ch, "Ok, you'll try to move silently for a while.\r\n");
    cprintf(ch, "And you attempt to hide yourself.\r\n");

    percent_chance = number(1, 101);			       /* 101% is a complete failure */

    if (percent_chance >
	ch->skills[SKILL_SNEAK].learned + dex_app_skill[(int)GET_DEX(ch)].sneak)
	return;

    if (ch->skills[SKILL_SNEAK].learned < 50)
	ch->skills[SKILL_SNEAK].learned += 2;

    SET_BIT(ch->specials.affected_by, AFF_HIDE);
    af.type = SKILL_SNEAK;
    af.duration = GET_LEVEL(ch, BestThiefClass(ch));
    af.modifier = 0;
    af.location = APPLY_NONE;
    af.bitvector = AFF_SNEAK;
    affect_to_char(ch, &af);
}

void do_hide(struct char_data *ch, const char *argument, int cmd)
{
    int                                     percent_chance = 0;
    struct affected_type                    af;

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

    cprintf(ch, "Ok, you crawl into a dark corner and lurk.\r\n");

    if (IS_AFFECTED(ch, AFF_SNEAK))
	affect_from_char(ch, SKILL_SNEAK);
    if (IS_AFFECTED(ch, AFF_HIDE))
	REMOVE_BIT(ch->specials.affected_by, AFF_HIDE);

    percent_chance = number(1, 101);			       /* 101% is a complete failure */

    if (percent_chance >
	ch->skills[SKILL_SNEAK].learned + dex_app_skill[(int)GET_DEX(ch)].sneak)
	return;
    if (ch->skills[SKILL_SNEAK].learned < 50)
	ch->skills[SKILL_SNEAK].learned += 2;

    SET_BIT(ch->specials.affected_by, AFF_HIDE);
    af.type = SKILL_SNEAK;
    af.duration = GET_LEVEL(ch, BestThiefClass(ch));
    af.modifier = 0;
    af.location = APPLY_NONE;
    af.bitvector = AFF_SNEAK;
    affect_to_char(ch, &af);
}

void do_steal(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *victim = NULL;
    struct obj_data                        *obj = NULL;
    char                                    victim_name[240] = "\0\0\0\0\0\0\0";
    char                                    obj_name[240] = "\0\0\0\0\0\0\0";
    char                                    buf[240] = "\0\0\0\0\0\0\0";
    int                                     percent_chance = 0;
    int                                     gold = 0;
    int                                     eq_pos = 0;
    char                                    ohoh = FALSE;
    struct room_data                       *rp = NULL;

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

    if (check_peaceful(ch, "What if he caught you?\r\n"))
	return;

    argument = one_argument(argument, obj_name);
    only_argument(argument, victim_name);

    if (!(victim = get_char_room_vis(ch, victim_name))) {
	cprintf(ch, "Steal what from who?\r\n");
	return;
    } else if (victim == ch) {
	cprintf(ch, "Come on now, that's rather stupid!\r\n");
	return;
    }
    if (!CheckKill(ch, victim))
	return;

    if ((!victim->desc) && (IS_PC(victim)))
	return;

    /*
     * 101% is a complete failure 
     */
    percent_chance = number(1, 101) - dex_app_skill[(int)GET_DEX(ch)].p_pocket;

    if (GET_POS(victim) < POSITION_SLEEPING)
	percent_chance = -1;				       /* ALWAYS SUCCESS */

    percent_chance += GetTotLevel(victim);
    if (GetMaxLevel(victim) > MAX_MORT)
	percent_chance = 101;				       /* Failure */

    if (str_cmp(obj_name, "coins") && str_cmp(obj_name, "gold")) {
	if (!(obj = get_obj_in_list_vis(victim, obj_name, victim->carrying))) {
	    for (eq_pos = 0; (eq_pos < MAX_WEAR); eq_pos++)
		if (victim->equipment[eq_pos] &&
		    (isname(obj_name, victim->equipment[eq_pos]->name)) &&
		    CAN_SEE_OBJ(ch, victim->equipment[eq_pos])) {
		    obj = victim->equipment[eq_pos];
		    break;
		}
	    if (!obj) {
		act("$E has not got that item.", FALSE, ch, 0, victim, TO_CHAR);
		return;
	    } else {					       /* It is equipment */
		if ((GET_POS(victim) > POSITION_STUNNED)) {
		    cprintf(ch, "Steal the equipment now? Impossible!\r\n");
		    return;
		} else {
		    act("You unequip $p and steal it.", FALSE, ch, obj, 0, TO_CHAR);
		    act("$n steals $p from $N.", FALSE, ch, obj, victim, TO_NOTVICT);
		    obj_to_char(unequip_char(victim, eq_pos), ch);
		}
	    }
	} else {					       /* obj found in inventory */
	    percent_chance += GET_OBJ_WEIGHT(obj);	       /* Make heavy harder */
	    rp = real_roomp(ch->in_room);
	    if (IS_SET(rp->room_flags, NO_STEAL)) {
		percent_chance = 101;
	    }
	    if (AWAKE(victim) && (percent_chance > ch->skills[SKILL_STEAL].learned)) {
		ohoh = TRUE;
		act("Oops..", FALSE, ch, 0, 0, TO_CHAR);
		act("$n tried to steal something from you!", FALSE, ch, 0, victim, TO_VICT);
		act("$n tries to steal something from $N.", TRUE, ch, 0, victim, TO_NOTVICT);
	    } else {					       /* Steal the item */
		if ((IS_CARRYING_N(ch) + 1 < CAN_CARRY_N(ch))) {
		    if ((IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj)) < CAN_CARRY_W(ch)) {
			obj_from_char(obj);
			obj_to_char(obj, ch);
			cprintf(ch, "Got it!\r\n");
			if (ch->skills[SKILL_STEAL].learned < 50)
			    ch->skills[SKILL_STEAL].learned += 1;
		    }
		} else
		    cprintf(ch, "You cannot carry that much.\r\n");
	    }
	}
    } else {						       /* Steal some coins */
	if (AWAKE(victim) && (percent_chance > ch->skills[SKILL_STEAL].learned)) {
	    ohoh = TRUE;
	    act("Oops..", FALSE, ch, 0, 0, TO_CHAR);
	    act("You discover that $n has $s hands in your wallet.", FALSE, ch, 0, victim,
		TO_VICT);
	    act("$n tries to steal gold from $N.", TRUE, ch, 0, victim, TO_NOTVICT);
	} else {
	    /*
	     * Steal some gold coins 
	     */
	    gold = (int)((GET_GOLD(victim) * number(1, 10)) / 100);
	    gold = MIN(100, gold);
	    if (gold > 0) {
		GET_GOLD(ch) += gold;
		GET_GOLD(victim) -= gold;
		cprintf(ch, "Bingo! You got %d gold coins.\r\n", gold);
	    } else {
		cprintf(ch, "You couldn't get any gold...\r\n");
	    }
	}
    }

    if (ohoh && IS_NPC(victim) && AWAKE(victim)) {
	if (IS_SET(victim->specials.act, ACT_NICE_THIEF)) {
	    sprintf(buf, "%s is a damn thief!", GET_NAME(ch));
	    do_shout(victim, buf, 0);
	    log_info("%s", buf);
	    cprintf(ch, "Don't you ever do that again!\r\n");
	} else {
	    hit(victim, ch, TYPE_UNDEFINED);
	}
    }
}

void do_practice(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     i = 0;
    char                                    first_arg[100] = "\0\0\0\0\0\0\0";
    char                                    sec_arg[100] = "\0\0\0\0\0\0\0";
    int                                     flag = FALSE;

    struct skill_struct {
	char                                    skill_name[40];
	int                                     skill_numb;
    };

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

    if (cmd != CMD_practice)
	return;

    for (; isspace(*argument); argument++);
    half_chop(argument, first_arg, sec_arg);

    if (!*first_arg) {
	cprintf(ch, "You need to supply a class for that.");
	return;
    }
    switch (*first_arg) {
	case 'w':
	case 'W':
	case 'f':
	case 'F':
	    {
		if (!HasClass(ch, CLASS_WARRIOR)) {
		    cprintf(ch, "I bet you wish you were a warrior.\r\n");
		    return;
		}
		sprintf(buf, "You can practise any of these MANLY skills:\r\n");
		for (i = 0; i < MAX_SKILLS; i++) {
		    if (CanUseClass(ch, i, WARRIOR_LEVEL_IND))
			sprintf(buf + strlen(buf), "%s%s\r\n", spell_info[i].name,
				how_good(ch->skills[i].learned));
		}
		page_string(ch->desc, buf, 1);
		return;
	    }
	    break;
	case 'r':
	case 'R':
	    {
		if (!HasClass(ch, CLASS_RANGER)) {
		    cprintf(ch, "I wish I was a Ranger too!\r\n");
		    return;
		}
		sprintf(buf, "You can practise any of these outdoor skills:\r\n");
		for (i = 0; i < MAX_SKILLS; i++) {
		    if (CanUseClass(ch, i, RANGER_LEVEL_IND))
			sprintf(buf + strlen(buf), "%s%s\r\n", spell_info[i].name,
				how_good(ch->skills[i].learned));
		}
		sprintf(buf + strlen(buf), "Or these leaf-and-twig charms:\r\n");
		for (i = 0; i < MAX_SKILLS; i++) {
		    if (CanCastClass(ch, i, RANGER_LEVEL_IND))
			sprintf(buf + strlen(buf), "%s%s\r\n", spell_info[i].name,
				how_good(ch->skills[i].learned));
		}
		page_string(ch->desc, buf, 1);
		return;
	    }
	    break;
	case 't':
	case 'T':
	    {
		if (!HasClass(ch, CLASS_THIEF)) {
		    cprintf(ch, "A voice whispers, 'You are not a thief.'\r\n");
		    return;
		}
		sprintf(buf, "You can practice any of these sneaky skills:\r\n");
		for (i = 0; i < MAX_SKILLS; i++) {
		    if (CanUseClass(ch, i, THIEF_LEVEL_IND))
			sprintf(buf + strlen(buf), "%s%s\r\n", spell_info[i].name,
				how_good(ch->skills[i].learned));
		}
		page_string(ch->desc, buf, 1);
		return;
	    }
	    break;
	case 'M':
	case 'm':
	    {
		if (!HasClass(ch, CLASS_MAGIC_USER)) {
		    cprintf(ch, "You pretend to be a magic-user, 'Gooble-dah!'\r\n");
		    return;
		}
		flag = 0;
		if (is_abbrev(sec_arg, "known"))
		    flag = 1;
		sprintf(buf, "Your heavy spellbook contains these spells:\r\n");
		for (i = 0; i < MAX_SKILLS; i++)
		    if (CanCastClass(ch, i, MAGE_LEVEL_IND)) {
			if (!flag) {
			    sprintf(buf + strlen(buf), "[%2d] %s%s\r\n",
				    spell_info[i].min_level[MAGE_LEVEL_IND],
				    spell_info[i].name, how_good(ch->skills[i].learned));
			} else {
			    if (ch->skills[i].learned > 0) {
				sprintf(buf + strlen(buf), "[%2d] %s%s\r\n",
					spell_info[i].min_level[MAGE_LEVEL_IND],
					spell_info[i].name, how_good(ch->skills[i].learned));
			    }
			}
		    }
		page_string(ch->desc, buf, 1);
		return;
	    }
	    break;
	case 'C':
	case 'c':
	case 'P':
	case 'p':
	    {
		if (!HasClass(ch, CLASS_CLERIC)) {
		    cprintf(ch, "You feel that impersonating a cleric might be bad.\r\n");
		    return;
		}
		sprintf(buf, "You can pray for any of these miracles:\r\n");
		flag = 0;
		if (is_abbrev(sec_arg, "known"))
		    flag = 1;
		for (i = 0; i < MAX_SKILLS; i++)
		    if (CanCastClass(ch, i, CLERIC_LEVEL_IND)) {
			if (!flag) {
			    sprintf(buf + strlen(buf), "[%2d] %s%s\r\n",
				    spell_info[i].min_level[CLERIC_LEVEL_IND],
				    spell_info[i].name, how_good(ch->skills[i].learned));
			} else {
			    if (ch->skills[i].learned > 0) {
				sprintf(buf + strlen(buf), "[%2d] %s%s\r\n",
					spell_info[i].min_level[CLERIC_LEVEL_IND],
					spell_info[i].name, how_good(ch->skills[i].learned));
			    }
			}
		    }
		page_string(ch->desc, buf, 1);
		return;
	    }
	    break;
	default:
	    cprintf(ch, "Ah, but practice which class???\r\n");
    }
}

void do_idea(struct char_data *ch, const char *argument, int cmd)
{
    FILE                                   *fl = NULL;
    char                                    str[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_NPC(ch)) {
	cprintf(ch, "Monsters can't have ideas - Go away.\r\n");
	return;
    }
    /*
     * skip whites 
     */
    for (; isspace(*argument); argument++);

    if (!*argument) {
	cprintf(ch, "That doesn't sound like a good idea to me.. Sorry.\r\n");
	return;
    }
    if (!(fl = fopen(IDEA_FILE, "a"))) {
	log_error("do_idea");
	cprintf(ch, "Could not open the idea-file.\r\n");
	return;
    }
    sprintf(str, "**%s: %s\n", GET_NAME(ch), argument);

    fputs(str, fl);
    FCLOSE(fl);
    cprintf(ch, "Woah!  That's pretty cool.  Thanks!\r\n");
}

void do_typo(struct char_data *ch, const char *argument, int cmd)
{
    FILE                                   *fl = NULL;
    char                                    str[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_NPC(ch)) {
	cprintf(ch, "Monsters can't spell - leave me alone.\r\n");
	return;
    }
    /*
     * skip whites 
     */
    for (; isspace(*argument); argument++);

    if (!*argument) {
	cprintf(ch, "I beg your pardon?\r\n");
	return;
    }
    if (!(fl = fopen(TYPO_FILE, "a"))) {
	log_error("do_typo");
	cprintf(ch, "Could not open the typo-file.\r\n");
	return;
    }
    sprintf(str, "**%s[%d]: %s\n", GET_NAME(ch), ch->in_room, argument);
    fputs(str, fl);
    FCLOSE(fl);
    cprintf(ch, "No problem.  We can send a whizzling to fix it.\r\n");
}

void do_bug(struct char_data *ch, const char *argument, int cmd)
{
    FILE                                   *fl = NULL;
    char                                    str[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_NPC(ch)) {
	cprintf(ch, "You are a monster! Bug off!\r\n");
	return;
    }
    /*
     * skip whites 
     */
    for (; isspace(*argument); argument++);

    if (!*argument) {
	cprintf(ch, "Pardon?\r\n");
	return;
    }
    if (!(fl = fopen(BUG_FILE, "a"))) {
	log_error("do_bug");
	cprintf(ch, "Could not open the bug-file.\r\n");
	return;
    }
    sprintf(str, "**%s[%d]: %s\n", GET_NAME(ch), ch->in_room, argument);
    fputs(str, fl);
    FCLOSE(fl);
    cprintf(ch, "Really?  Ok, we'll send someone to have a look.\r\n");
}

void do_brief(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_NPC(ch))
	return;

    if (IS_SET(ch->specials.act, PLR_BRIEF)) {
	cprintf(ch, "Brief mode off.\r\n");
	REMOVE_BIT(ch->specials.act, PLR_BRIEF);
    } else {
	cprintf(ch, "Brief mode on.\r\n");
	SET_BIT(ch->specials.act, PLR_BRIEF);
    }
}

void do_compact(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_NPC(ch))
	return;

    if (IS_SET(ch->specials.act, PLR_COMPACT)) {
	cprintf(ch, "You are now in the uncompacted mode.\r\n");
	REMOVE_BIT(ch->specials.act, PLR_COMPACT);
    } else {
	cprintf(ch, "You are now in compact mode.\r\n");
	SET_BIT(ch->specials.act, PLR_COMPACT);
    }
}

void do_group(struct char_data *ch, const char *argument, int cmd)
{
    char                                    name[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    struct char_data                       *victim = NULL;
    struct char_data                       *k = NULL;
    struct follow_type                     *f = NULL;
    int                                     found = FALSE;
    int                                     victlvl = 0;
    int                                     chlvl = 0;

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

    only_argument(argument, name);

    if (!*name) {
	if (!IS_AFFECTED(ch, AFF_GROUP)) {
	    cprintf(ch, "But you are a member of no group?!\r\n");
	} else {
	    cprintf(ch, "Your group consists of:\r\n");
	    if (ch->master)
		k = ch->master;
	    else
		k = ch;

	    if (IS_AFFECTED(k, AFF_GROUP))
		act("     $N (Head of group)", FALSE, ch, 0, k, TO_CHAR);

	    for (f = k->followers; f; f = f->next)
		if (IS_AFFECTED(f->follower, AFF_GROUP))
		    act("     $N", FALSE, ch, 0, f->follower, TO_CHAR);
	}
	return;
    }
    if (!(victim = get_char_room_vis(ch, name))) {
	cprintf(ch, "No one here by that name.\r\n");
    } else {
	if (ch->master) {
	    act("You can not enroll group members without being head of a group.",
		FALSE, ch, 0, 0, TO_CHAR);
	    return;
	}
	found = FALSE;

	if (victim == ch)
	    found = TRUE;
	else {
	    for (f = ch->followers; f; f = f->next) {
		if (f->follower == victim) {
		    found = TRUE;
		    break;
		}
	    }
	}

	if (found) {
	    if (IS_AFFECTED(victim, AFF_GROUP)) {
		if (victim != ch) {
		    act("$n has been kicked out of $N's group!", FALSE, victim, 0, ch, TO_ROOM);
		    act("You are no longer a member of $N's group!", FALSE, victim, 0, ch,
			TO_CHAR);
		} else {
		    act("You are no longer a group leader!", FALSE, victim, 0, ch, TO_CHAR);
		}
		REMOVE_BIT(victim->specials.affected_by, AFF_GROUP);
	    } else {
		if (IS_IMMORTAL(victim) && !IS_IMMORTAL(ch)) {
		    act("You really don't want $n in your group.", FALSE, victim, 0, 0,
			TO_CHAR);
		    return;
		}
/*
 *	if ((chlvl= GetMaxLevel(ch)) >= LOW_IMMORTAL) {
 *	  act("Now now.  That would be CHEATING!", FALSE, ch, 0, 0, TO_CHAR);
 *	  return;
 *	}
 */
		chlvl = GetMaxLevel(ch);
		victlvl = GetMaxLevel(victim);
		if (IS_PC(victim) && victim != ch) {
		    int                                     toolow,
		                                            toohigh;

		    /*
		     * newbies can mix with each other 
		     */
		    toolow = (chlvl <= 4) ? 0 : MAX(3, chlvl / 2);
		    /*
		     * but newbies and adults don't mix 
		     */
		    toohigh = (chlvl <= 4) ? 5 : (chlvl + chlvl / 2);
		    if (victlvl <= toolow) {
			act("It would be beneath you to lead the lowly $N into battle!",
			    FALSE, ch, 0, victim, TO_CHAR);
			act("$N is too mighty to pay any heed to the likes of you!",
			    FALSE, victim, 0, ch, TO_CHAR);
			act("$N tells $n to bugger off.", FALSE, victim, 0, ch, TO_ROOM);
			return;
		    }
		    if (victlvl >= toohigh) {
			act("You WISH $N would deign to join your group!", FALSE, ch, 0, victim,
			    TO_CHAR);
			act("$N BEGS you to help $M go kill the chickens.", FALSE, victim, 0,
			    ch, TO_CHAR);
			act("$N grovels and begs $n to join $S group.", FALSE, victim, 0, ch,
			    TO_ROOM);
			return;
		    }
		}
		if (victim != ch) {
		    act("$n joins the glorious cause of $N's group.", FALSE, victim, 0, ch,
			TO_ROOM);
		    act("You are now a member of $N's group.", FALSE, victim, 0, ch, TO_CHAR);
		} else {
		    act("You are now your own group leader.", FALSE, victim, 0, ch, TO_CHAR);
		}
		SET_BIT(victim->specials.affected_by, AFF_GROUP);
	    }
	} else {
	    act("$N must follow you, to enter the group", FALSE, ch, 0, victim, TO_CHAR);
	}
    }
}

void do_quaff(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[100] = "\0\0\0\0\0\0\0";
    struct obj_data                        *temp = NULL;
    int                                     i = 0;
    int                                     equipped = FALSE;

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

    only_argument(argument, buf);

    if (!(temp = get_obj_in_list_vis(ch, buf, ch->carrying))) {
	temp = ch->equipment[HOLD];
	equipped = TRUE;
	if ((temp == 0) || !isname(buf, temp->name)) {
	    act("You do not have that item.", FALSE, ch, 0, 0, TO_CHAR);
	    return;
	}
    }
    if (!IS_IMMORTAL(ch)) {
	if (GET_COND(ch, FULL) > 20) {
	    act("Your stomach can't contain anymore!", FALSE, ch, 0, 0, TO_CHAR);
	    return;
	} else {
	    GET_COND(ch, FULL) += 1;
	}
    }
    if (temp->obj_flags.type_flag != ITEM_POTION) {
	act("You can only quaff potions.", FALSE, ch, 0, 0, TO_CHAR);
	return;
    }
    act("$n quaffs $p.", TRUE, ch, temp, 0, TO_ROOM);
    act("You quaff $p which dissolves.", FALSE, ch, temp, 0, TO_CHAR);

    /*
     * my stuff 
     */
    if (ch->specials.fighting) {
	if (equipped) {
	    if (number(1, 20) > ch->abilities.dex) {
		act("$n is jolted and drops $p!  It shatters!", TRUE, ch, temp, 0, TO_ROOM);
		act("You arm is jolted and $p flies from your hand, *SMASH*",
		    TRUE, ch, temp, 0, TO_CHAR);
		if (equipped)
		    temp = unequip_char(ch, HOLD);
		extract_obj(temp);
		return;
	    }
	} else {
	    if (number(1, 20) > ch->abilities.dex - 4) {
		act("$n is jolted and drops $p!  It shatters!", TRUE, ch, temp, 0, TO_ROOM);
		act("You arm is jolted and $p flies from your hand, *SMASH*",
		    TRUE, ch, temp, 0, TO_CHAR);
		extract_obj(temp);
		return;
	    }
	}
    }
    for (i = 1; i < 4; i++)
	if (temp->obj_flags.value[i] >= 1)
	    ((*spell_info[temp->obj_flags.value[i]].spell_pointer)
	     ((char)temp->obj_flags.value[0], ch, "", SPELL_TYPE_POTION, ch, temp));

    if (equipped)
	temp = unequip_char(ch, HOLD);

    extract_obj(temp);

    WAIT_STATE(ch, PULSE_VIOLENCE);

}

void do_recite(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[100] = "\0\0\0\0\0\0\0";
    struct obj_data                        *scroll = NULL;
    struct obj_data                        *obj = NULL;
    struct char_data                       *victim = NULL;
    int                                     i = 0;
    int                                     bits = 0;
    int                                     equipped = FALSE;

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

    argument = one_argument(argument, buf);

    if (!(scroll = get_obj_in_list_vis(ch, buf, ch->carrying))) {
	scroll = ch->equipment[HOLD];
	equipped = TRUE;
	if ((scroll == 0) || !isname(buf, scroll->name)) {
	    act("You do not have that item.", FALSE, ch, 0, 0, TO_CHAR);
	    return;
	}
    }
    if (scroll->obj_flags.type_flag != ITEM_SCROLL) {
	act("Recite is normally used for scrolls.", FALSE, ch, 0, 0, TO_CHAR);
	return;
    }
    if (*argument) {
	bits = generic_find(argument, FIND_OBJ_INV | FIND_OBJ_ROOM |
			    FIND_OBJ_EQUIP | FIND_CHAR_ROOM, ch, &victim, &obj);
	if (bits == 0) {
	    cprintf(ch, "No such thing around to recite the scroll on.\r\n");
	    return;
	}
    } else {
	victim = ch;
    }

    if (ch->skills[SKILL_READ_MAGIC].learned < number(1, 101)) {
	if (scroll->obj_flags.value[1] != SPELL_WORD_OF_RECALL) {
	    cprintf(ch, "You can't understand this...\r\n");
	    return;
	}
    }
    act("$n recites $p.", TRUE, ch, scroll, 0, TO_ROOM);
    act("You recite $p which bursts into flame.", FALSE, ch, scroll, 0, TO_CHAR);

    for (i = 1; i < 4; i++)
	if (scroll->obj_flags.value[i] >= 1) {
	    if (IS_SET(spell_info[scroll->obj_flags.value[i]].targets, TAR_VIOLENT) &&
		check_peaceful(ch, "Impolite magic is banned here."))
		continue;
	    ((*spell_info[scroll->obj_flags.value[i]].spell_pointer)
	     ((char)scroll->obj_flags.value[0], ch, "", SPELL_TYPE_SCROLL, victim, obj));
	}
    if (equipped)
	scroll = unequip_char(ch, HOLD);
    extract_obj(scroll);
}

void do_use(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[100] = "\0\0\0\0\0\0\0";
    struct char_data                       *tmp_char = NULL;
    struct obj_data                        *tmp_object = NULL;
    struct obj_data                        *stick = NULL;
    int                                     bits = 0;

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

    argument = one_argument(argument, buf);

    if (ch->equipment[HOLD] == 0 || !isname(buf, ch->equipment[HOLD]->name)) {
	act("You do not hold that item in your hand.", FALSE, ch, 0, 0, TO_CHAR);
	return;
    }
    stick = ch->equipment[HOLD];

    if (stick->obj_flags.type_flag == ITEM_STAFF) {
	act("$n taps $p three times on the ground.", TRUE, ch, stick, 0, TO_ROOM);
	act("You tap $p three times on the ground.", FALSE, ch, stick, 0, TO_CHAR);
	if (stick->obj_flags.value[2] > 0) {		       /* Is there any charges left? */
	    stick->obj_flags.value[2]--;
	    ((*spell_info[stick->obj_flags.value[3]].spell_pointer)
	     ((char)stick->obj_flags.value[0], ch, "", SPELL_TYPE_STAFF, 0, 0));
	    WAIT_STATE(ch, PULSE_VIOLENCE);
	} else {
	    cprintf(ch, "The staff seems powerless.\r\n");
	}
    } else if (stick->obj_flags.type_flag == ITEM_WAND) {
	bits = generic_find(argument, FIND_CHAR_ROOM | FIND_OBJ_INV |
			    FIND_OBJ_ROOM | FIND_OBJ_EQUIP, ch, &tmp_char, &tmp_object);
	if (bits) {
	    struct spell_info_type                 *spellp;

	    spellp = spell_info + (stick->obj_flags.value[3]);

	    if (bits == FIND_CHAR_ROOM) {
		act("$n point $p at $N.", TRUE, ch, stick, tmp_char, TO_ROOM);
		act("You point $p at $N.", FALSE, ch, stick, tmp_char, TO_CHAR);
	    } else {
		act("$n point $p at $P.", TRUE, ch, stick, tmp_object, TO_ROOM);
		act("You point $p at $P.", FALSE, ch, stick, tmp_object, TO_CHAR);
	    }

	    if (IS_SET(spellp->targets, TAR_VIOLENT) &&
		check_peaceful(ch, "Impolite magic is banned here."))
		return;

	    if (stick->obj_flags.value[2] > 0) {	       /* Is there any charges left? */
		stick->obj_flags.value[2]--;
		((*spellp->spell_pointer)
		 ((char)stick->obj_flags.value[0], ch, "", SPELL_TYPE_WAND, tmp_char,
		  tmp_object));
		WAIT_STATE(ch, PULSE_VIOLENCE);
	    } else {
		cprintf(ch, "The wand seems powerless.\r\n");
	    }
	} else {
	    cprintf(ch, "What should the wand be pointed at?\r\n");
	}
    } else {
	cprintf(ch, "Use is normally only for wand's and staff's.\r\n");
    }
}

void do_plr_noshout(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[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_NPC(ch))
	return;

    only_argument(argument, buf);

    if (!*buf) {
	if (IS_SET(ch->specials.act, PLR_DEAF)) {
	    cprintf(ch, "You can now hear shouts again.\r\n");
	    REMOVE_BIT(ch->specials.act, PLR_DEAF);
	} else {
	    cprintf(ch, "From now on, you won't hear shouts.\r\n");
	    SET_BIT(ch->specials.act, PLR_DEAF);
	}
    } else {
	cprintf(ch, "Only the gods can shut up someone else. \r\n");
    }
}

void do_plr_notell(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[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_NPC(ch))
	return;
    only_argument(argument, buf);

    if (IS_SET(ch->specials.new_act, NEW_PLR_NOTELL)) {
	cprintf(ch, "You can now hear tells again.\r\n");
	REMOVE_BIT(ch->specials.new_act, NEW_PLR_NOTELL);
    } else {
	cprintf(ch, "From now on, you won't hear tells.\r\n");
	SET_BIT(ch->specials.new_act, NEW_PLR_NOTELL);
    }
}

void do_plr_nosummon(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_NPC(ch))
	return;

    if (IS_SET(ch->specials.new_act, NEW_PLR_KILLOK)) {
	cprintf(ch, "Sorry, registered servants of the Dread Lord cannot hide!\r\n");
	return;
    }
    if (IS_SET(ch->specials.new_act, NEW_PLR_SUMMON)) {
	cprintf(ch, "You can now be summoned.\r\n");
	REMOVE_BIT(ch->specials.new_act, NEW_PLR_SUMMON);
    } else {
	cprintf(ch, "From now on, you can't be summoned.\r\n");
	SET_BIT(ch->specials.new_act, NEW_PLR_SUMMON);
    }
}

void do_plr_noteleport(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_NPC(ch))
	return;

    if (IS_SET(ch->specials.new_act, NEW_PLR_KILLOK)) {
	cprintf(ch, "Sorry, registered servants of the Dread Lord cannot cower!\r\n");
	return;
    }
    if (IS_SET(ch->specials.new_act, NEW_PLR_TELEPORT)) {
	cprintf(ch, "You can now be teleported.\r\n");
	REMOVE_BIT(ch->specials.new_act, NEW_PLR_TELEPORT);
    } else {
	cprintf(ch, "From now on, you can't be teleported.\r\n");
	SET_BIT(ch->specials.new_act, NEW_PLR_TELEPORT);
    }
}