/*
* file: actwiz.c , Implementation of commands. Part of DIKUMUD
* Usage : Wizard 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 <signal.h>
#include <string.h>
#include <ctype.h>
#include <time.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 "board.h"
#include "whod.h"
#include "reception.h"
#include "spec_procs.h"
#include "multiclass.h"
#include "act_skills.h"
#include "act_info.h"
#include "fight.h"
#include "hash.h"
#include "weather.h"
#include "modify.h"
#include "tracking.h"
#define _ACT_WIZ_C
#include "act_wiz.h"
void do_polymorph(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_highfive(struct char_data *ch, const char *argument, int cmd)
{
char buf[80] = "\0\0\0\0\0\0\0";
struct char_data *tch = NULL;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (argument) {
only_argument(argument, buf);
if ((tch = get_char_vis(ch, buf)) != 0) {
if ((GetMaxLevel(tch) >= DEMIGOD) && (!IS_NPC(tch))) {
allprintf("Time stops for a moment as %s and %s high five.\r\n",
ch->player.name, tch->player.name);
} else {
act("$n gives you a high five", TRUE, ch, 0, tch, TO_VICT);
act("You give a hearty high five to $N", TRUE, ch, 0, tch, TO_CHAR);
act("$n and $N do a high five.", TRUE, ch, 0, tch, TO_NOTVICT);
}
} else {
cprintf(ch, "I don't see anyone here like that.\r\n");
}
}
}
void do_rentmode(struct char_data *ch, const char *argument, int cmd)
{
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
double it = 0.0;
FILE *pfd = NULL;
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 cannot toggle rent costs.\r\n");
return;
}
if (argument && *argument) {
only_argument(argument, buf);
if (sscanf(buf, " %lf ", &it) == 1)
RENT_RATE = it;
sprintf(buf, "Rent now costs %f normal.", RENT_RATE);
cprintf(ch, "%s\r\n", buf);
log_info("%s", buf);
} else {
if (RENT_RATE != 0.0) {
cprintf(ch, "Rent is now free!\r\n");
log_info("Rent cost is now ZERO.");
RENT_RATE = 0.0;
} else {
cprintf(ch, "Rent is now normal.\r\n");
log_info("Rent cost is now normal.");
RENT_RATE = 1.0;
}
}
if (!(pfd = fopen(RENTCOST_FILE, "w"))) {
log_info("Cannot save rent cost!");
} else {
fprintf(pfd, "%f\n", RENT_RATE);
FCLOSE(pfd);
}
}
void do_wizlock(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)) {
cprintf(ch, "You cannot WizLock.\r\n");
return;
}
if (WizLock) {
cprintf(ch, "WizLock is now off\r\n");
log_info("Wizlock is now off.");
WizLock = FALSE;
} else {
cprintf(ch, "WizLock is now on\r\n");
log_info("WizLock is now on.");
WizLock = TRUE;
}
}
void do_emote(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);
if (IS_NPC(ch) && (cmd != 0) && (cmd != 214))
return;
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i))
cprintf(ch, "Yes.. But what?\r\n");
else {
act("$n %s", FALSE, ch, 0, 0, TO_ROOM, argument + i);
if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
cprintf(ch, "You emote: '%s'\r\n", argument + i);
}
}
}
void do_echo(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);
if (IS_NPC(ch))
return;
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i)) {
if (IS_SET(ch->specials.act, PLR_ECHO)) {
cprintf(ch, "echo off\r\n");
REMOVE_BIT(ch->specials.act, PLR_ECHO);
} else {
SET_BIT(ch->specials.act, PLR_ECHO);
cprintf(ch, "echo on\r\n");
}
} else {
if (IS_IMMORTAL(ch)) {
reprintf(ch->in_room, ch, "%s\r\n", argument + i);
cprintf(ch, "Ok.\r\n");
}
}
}
void do_system(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);
if (IS_NPC(ch))
return;
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i))
cprintf(ch, "That must be a mistake...\r\n");
else {
allprintf("\r\n%s\r\n", argument + i);
}
}
void do_trans(struct char_data *ch, const char *argument, int cmd)
{
struct descriptor_data *i = NULL;
struct char_data *victim = NULL;
char buf[100] = "\0\0\0\0\0\0\0";
short int target = 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)
cprintf(ch, "Who do you wich to transfer?\r\n");
else if (str_cmp("all", buf)) {
if (!(victim = get_char_vis_world(ch, buf, NULL)))
cprintf(ch, "No-one by that name around.\r\n");
else if (GetMaxLevel(victim) > GetMaxLevel(ch)) {
cprintf(ch, "You are not strong enough to force %s to appear.\r\n", NAME(victim));
cprintf(victim, "%s would like to transfer you.\r\n", NAME(ch));
} else {
act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM);
target = ch->in_room;
if (MOUNTED(victim)) {
char_from_room(victim);
char_from_room(MOUNTED(victim));
char_to_room(victim, target);
char_to_room(MOUNTED(victim), target);
} else {
char_from_room(victim);
char_to_room(victim, target);
}
act("$n arrives from a puff of smoke.", FALSE, victim, 0, 0, TO_ROOM);
act("$n has transferred you!", FALSE, ch, 0, victim, TO_VICT);
do_look(victim, "", 15);
cprintf(ch, "Ok.\r\n");
}
} else { /* Trans All */
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected) {
victim = i->character;
if (MOUNTED(victim))
Dismount(victim, MOUNTED(victim), POSITION_STANDING);
target = ch->in_room;
char_from_room(victim);
char_to_room(victim, target);
act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM);
act("$n arrives from a puff of smoke.", FALSE, victim, 0, 0, TO_ROOM);
act("$n has transferred you!", FALSE, ch, 0, victim, TO_VICT);
do_look(victim, "", 15);
}
cprintf(ch, "Ok.\r\n");
}
}
void do_at(struct char_data *ch, const char *argument, int cmd)
{
char command_str[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char loc_str[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int location = 0;
int original_loc = 0;
struct char_data *target_mob = NULL;
struct obj_data *target_obj = NULL;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (IS_NPC(ch))
return;
half_chop(argument, loc_str, command_str);
if (!*loc_str) {
cprintf(ch, "You must supply a room number or a name.\r\n");
return;
}
if (!(target_mob = get_char_room_vis(ch, loc_str))) {
if (!(target_mob = get_char(loc_str))) {
if (!(target_obj = get_obj_vis_world(ch, loc_str, NULL))) {
if (!(location = atoi(loc_str))) {
cprintf(ch, "I have no idea where \"%s\" is...\r\n", loc_str);
return;
} else if (!(real_roomp(location))) {
cprintf(ch, "That room exists only in your imagination.\r\n");
return;
}
} else {
if ((location = target_obj->in_room) == NOWHERE) {
cprintf(ch, "The object is not available.\r\n");
return;
}
}
} else {
if ((location = target_mob->in_room) == NOWHERE) {
cprintf(ch, "The target mobile is not available.\r\n");
return;
}
}
} else {
if ((location = target_mob->in_room) == NOWHERE) {
cprintf(ch, "The target mobile is not available.\r\n");
return;
}
}
/*
* a location has been found.
*/
original_loc = ch->in_room;
char_from_room(ch);
char_to_room(ch, location);
command_interpreter(ch, command_str);
/*
* check if the guy's still there
*/
for (target_mob = real_roomp(location)->people; target_mob; target_mob =
target_mob->next_in_room)
if (ch == target_mob) {
char_from_room(ch);
char_to_room(ch, original_loc);
}
}
void do_form(struct char_data *ch, const char *argument, int cmd)
{
char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int loc_nr = 0;
struct room_data *rp = NULL;
int zone = 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) {
cprintf(ch, "Usage: FORM virtual_number.\r\n");
return;
}
if (!(isdigit(*buf))) {
cprintf(ch, "Usage: FORM virtual_number.\r\n");
return;
}
loc_nr = atoi(buf);
if (real_roomp(loc_nr)) {
cprintf(ch, "A room exists with that Vnum!\r\n");
return;
} else if (loc_nr < 0) {
cprintf(ch, "You must use a positive Vnum!\r\n");
return;
}
cprintf(ch, "You have formed a room.\r\n");
allocate_room(loc_nr);
rp = real_roomp(loc_nr);
bzero(rp, sizeof(*rp));
rp->number = loc_nr;
if (top_of_zone_table >= 0) {
for (zone = 0; rp->number > zone_table[zone].top && zone <= top_of_zone_table; zone++);
if (zone > top_of_zone_table) {
log_info("Room %d is outside of any zone.\n", rp->number);
zone--;
}
rp->zone = zone;
}
sprintf(buf, "%d", loc_nr);
rp->name = (char *)strdup(buf);
rp->description = (char *)strdup("New Room\n");
}
void do_goto(struct char_data *ch, const char *argument, int cmd)
{
char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int loc_nr = 0;
int location = 0;
int i = 0;
struct char_data *target_mob = NULL;
struct char_data *pers = NULL;
struct char_data *v = NULL;
struct obj_data *target_obj = NULL;
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) {
cprintf(ch, "You must supply a room number or a name.\r\n");
return;
}
if (isdigit(*buf) && NULL == index(buf, '.')) {
loc_nr = atoi(buf);
if (NULL == real_roomp(loc_nr)) {
cprintf(ch, "No room exists with that number.\r\n");
return;
}
location = loc_nr;
} else if ((target_mob = get_char_vis_world(ch, buf, NULL)))
location = target_mob->in_room;
else if ((target_obj = get_obj_vis_world(ch, buf, NULL)))
if (target_obj->in_room != NOWHERE)
location = target_obj->in_room;
else {
cprintf(ch, "The object is not available.\r\n");
cprintf(ch, "Try where #.object to nail its room number.\r\n");
return;
} else {
cprintf(ch, "No such creature or object around.\r\n");
return;
}
/*
* a location has been found.
*/
if (!real_roomp(location)) {
log_error("Massive error in do_goto. Everyone Off NOW.");
return;
}
if (IS_SET(real_roomp(location)->room_flags, PRIVATE)) {
for (i = 0, pers = real_roomp(location)->people; pers; pers = pers->next_in_room, i++);
if (i > 1 && IS_MORTAL(ch)) {
cprintf(ch, "There's a private conversation going on in that room.\r\n");
return;
}
}
if (IS_SET(ch->specials.act, PLR_STEALTH)) {
for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
act("$n disappears into a cloud of mist.", FALSE, ch, 0, v, TO_VICT);
}
}
} else {
act("$n disappears into a cloud of mist.", FALSE, ch, 0, 0, TO_ROOM);
}
if (ch->specials.fighting)
stop_fighting(ch);
if (MOUNTED(ch)) {
char_from_room(ch);
char_to_room(ch, location);
char_from_room(MOUNTED(ch));
char_to_room(MOUNTED(ch), location);
} else {
char_from_room(ch);
char_to_room(ch, location);
}
if (IS_SET(ch->specials.act, PLR_STEALTH)) {
for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
act("$n appears from a cloud of mist.", FALSE, ch, 0, v, TO_VICT);
}
}
} else {
act("$n appears from a cloud of mist.", FALSE, ch, 0, 0, TO_ROOM);
}
do_look(ch, "", 15);
}
void do_home(struct char_data *ch, const char *argument, int cmd)
{
char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int location = 0;
struct char_data *v = NULL;
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) {
location = GET_HOME(ch);
} else {
cprintf(ch, "You can't just barge into someone else's home (yet)!\r\n");
location = GET_HOME(ch);
}
if (!real_roomp(location)) {
cprintf(ch, "Hmmmm... homeless, peniless, but surely not alone.\r\n");
return;
}
if (IS_SET(ch->specials.act, PLR_STEALTH)) {
for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
act("$n stretches sensually and elongates into a wisp of vapour.", FALSE, ch, 0,
v, TO_VICT);
}
}
} else {
act("$n stretches sensually and elongates into a wisp of vapour.", FALSE, ch, 0, 0,
TO_ROOM);
}
if (ch->specials.fighting)
stop_fighting(ch);
if (MOUNTED(ch)) {
char_from_room(ch);
char_to_room(ch, location);
char_from_room(MOUNTED(ch));
char_to_room(MOUNTED(ch), location);
} else {
char_from_room(ch);
char_to_room(ch, location);
}
if (IS_SET(ch->specials.act, PLR_STEALTH)) {
for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
act("$n arrives and immediately curls up in $s spot.", FALSE, ch, 0, v,
TO_VICT);
}
}
} else {
act("$n arrives and immediately curls up in $s spot.", FALSE, ch, 0, 0, TO_ROOM);
}
do_look(ch, "", 15);
}
void do_apraise(struct char_data *ch, const char *argument, int cmd)
{
char arg1[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
struct obj_data *j = NULL;
int i = 0;
int found_one = FALSE;
int chance = 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, arg1);
if (GET_MANA(ch) < 3) {
cprintf(ch, "You can't seem to concentrate enough at the moment.\r\n");
return;
}
chance = number(1, 101);
if (chance > ch->skills[SKILL_APRAISE].learned) {
cprintf(ch, "You are unable to apraise this item.\r\n");
GET_MANA(ch) -= 1;
return;
}
GET_MANA(ch) -= 3;
if (!*arg1) {
cprintf(ch, "apraise what?\r\n");
return;
} else {
if (ch->skills[SKILL_APRAISE].learned < 50)
ch->skills[SKILL_APRAISE].learned++;
/*
* apraise on object
*/
if ((j = (struct obj_data *)get_obj_in_list_vis(ch, arg1, ch->carrying))) {
cprintf(ch, "Object name: [%s]\r\nItem type: ", j->name);
sprinttype(GET_ITEM_TYPE(j), item_types, buf);
cprintf(ch, "%s\r\n", buf);
cprintf(ch, "Can be worn on :");
sprintbit(j->obj_flags.wear_flags, wear_bits, buf);
cprintf(ch, "%s\r\n", buf);
cprintf(ch, "Weight: %d, Value: %d, Cost/day: %d\r\n",
j->obj_flags.weight, j->obj_flags.cost, j->obj_flags.cost_per_day);
switch (j->obj_flags.type_flag) {
case ITEM_LIGHT:
cprintf(ch, "Light hours of Use : [%d]", j->obj_flags.value[2]);
break;
case ITEM_WEAPON:
sprintf(buf, "Weapon Class:");
switch (j->obj_flags.value[3]) {
case 0:
strcat(buf, "Smiting Class.\r\n");
break;
case 1:
strcat(buf, "Stabbing Class.\r\n");
break;
case 2:
strcat(buf, "Whipping Class.\r\n");
break;
case 3:
strcat(buf, "Slashing Class.\r\n");
break;
case 4:
strcat(buf, "Smashing Class.\r\n");
break;
case 5:
strcat(buf, "Cleaving Class.\r\n");
break;
case 6:
strcat(buf, "Crushing Class.\r\n");
break;
case 7:
strcat(buf, "Bludgeoning Class.\r\n");
break;
case 11:
strcat(buf, "Piercing Class.\r\n");
break;
default:
strcat(buf, "Foreign Class to you....\r\n");
break;
}
found_one = 0;
for (i = 0; i < MAX_OBJ_AFFECT; i++) {
if (j->affected[i].location == APPLY_HITROLL
|| j->affected[i].location == APPLY_HITNDAM) {
found_one = 1;
switch (j->affected[i].modifier) {
case 1:
strcat(buf, "It is well balanced.\r\n");
break;
case 2:
strcat(buf, "It is very well balanced.\r\n");
break;
case 3:
strcat(buf, "It is a superb weapon.\r\n");
break;
case 4:
strcat(buf, "It was forged by the gods.\r\n");
break;
case 5:
strcat(buf, "It should not be in your hands.\r\n");
break;
default:
strcat(buf, "It will crack with the next blow.\r\n");
break;
}
}
}
if (!found_one)
strcat(buf, "It is common in accuracy.\r\n");
found_one = 0;
for (i = 0; i < MAX_OBJ_AFFECT; i++) {
if (j->affected[i].location == APPLY_DAMROLL
|| j->affected[i].location == APPLY_HITNDAM) {
found_one = 1;
switch (j->affected[i].modifier) {
case 0:
strcat(buf, "It will surely damage its target.\r\n");
break;
case 1:
strcat(buf, "It looks to be made from a strong metal.\r\n");
break;
case 2:
strcat(buf, "This was forged from a mystical flame.\r\n");
break;
case 3:
strcat(buf, "It has definite magical charms.\r\n");
break;
case 4:
strcat(buf,
"This is definitately blessed by the gods.\r\n");
break;
case 5:
strcat(buf, "It is ready to lose its hilt.\r\n");
break;
default:
strcat(buf,
"It is checked badly and most likely will break.\r\n");
break;
}
}
}
if (!found_one)
strcat(buf, "It has a common strength to its making.\r\n");
cprintf(ch, "%s", buf);
break;
case ITEM_ARMOR:
sprintf(buf, "Effective AC points: [%d]\r\nWhen Repaired: [%d]",
j->obj_flags.value[0], j->obj_flags.value[1]);
if (j->obj_flags.value[0] != 0 && j->obj_flags.value[1] == 0) {
strcat(buf,
"\r\nYou should take it to be updated at the Blacksmith\r\n");
}
cprintf(ch, "%s", buf);
break;
}
} else {
cprintf(ch, "I don't see that here.\r\n");
}
}
}
void do_stat(struct char_data *ch, const char *argument, int cmd)
{
struct affected_type *aff = NULL;
struct room_data *rm = NULL;
struct char_data *k = NULL;
struct obj_data *j = NULL;
struct obj_data *j2 = NULL;
struct extra_descr_data *desc = NULL;
struct follow_type *fol = NULL;
struct room_data *rp = NULL;
char type[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
char num[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
char buf2[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
int i = 0;
int virtual = 0;
int i2 = 0;
int count = 0;
int found = FALSE;
int anumber = 0;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (IS_NPC(ch))
return;
argument = one_argument(argument, type);
only_argument(argument, num);
if (!*num)
anumber = -2;
else if (isdigit(*num))
anumber = atoi(num);
else
anumber = -1;
/*
* no argument
*/
if (!*type) {
cprintf(ch, "Usage: stat < pc|mob|obj|room > [ name|vnum ]\r\n");
return;
}
/*
* ROOM
*/
if (!str_cmp("room", type) || !str_cmp("here", type)) {
if (anumber < 0) {
if (anumber == -2)
anumber = ch->in_room;
else {
cprintf(ch, "Usage: stat room [vnum]\r\n");
return;
}
}
rm = real_roomp(anumber);
cprintf(ch,
"Room Description: ---------------------------------------------------------\r\n%s",
rm->description);
if ((desc = rm->ex_description)) {
cprintf(ch,
"---------------------------------------------------------------------------\r\n");
*buf = '\0';
for (; desc; desc = desc->next) {
strcat(buf, desc->keyword);
strcat(buf, " ");
}
cprintf(ch, "Extras: %s\r\n", buf);
}
cprintf(ch,
"---------------------------------------------------------------------------\r\n");
sprinttype(rm->sector_type, sector_types, buf2);
cprintf(ch, "%s [#%d], in Zone %s [#%d] is %s.\r\n",
rm->name, rm->number, zone_table[rm->zone].name, rm->zone, buf2);
if (rm->tele_targ > 0) { /* teleport room */
double ttime =
(double)rm->tele_time / (double)10.0;
rp = real_roomp(rm->tele_targ);
cprintf(ch, "Teleports to %s [#%d] every %3.1lf second%s",
rp ? rp->name : "Swirling CHAOS", rm->tele_targ,
ttime, (ttime != 1.0) ? "s.\r\n" : ".\r\n");
}
if ((rm->sector_type == SECT_WATER_SWIM) || (rm->sector_type == SECT_WATER_NOSWIM)) {
if (rm->river_dir != -1 && rm->dir_option[rm->river_dir]) {
double ttime =
(double)rm->river_speed / (double)10.0;
rp = real_roomp(rm->dir_option[rm->river_dir]->to_room);
cprintf(ch,
"A River flows %s into %s [#%d] every %3.1lf second%s",
dirs[rm->river_dir], rp ? rp->name : "Swirling CHAOS",
rp ? rp->number : -1, ttime, (ttime != 1.0) ? "s.\r\n" : ".\r\n");
}
}
if (rm->room_flags) {
sprintbit((long)rm->room_flags, room_bits, buf);
cprintf(ch, "Flags: %s\r\n", buf);
}
if (rm->room_flags & SOUND) {
cprintf(ch, "Sound: %s", rm->sound);
cprintf(ch, "Sound: %s", rm->distant_sound);
}
if (rm->funct) {
cprintf(ch, "Special Procedure: %s.\r\n",
name_special_proc(SPECIAL_ROOM, rm->number));
}
for (i = 0; i < MAX_NUM_EXITS; i++) {
if (rm->dir_option[i]) {
rp = real_roomp(rm->dir_option[i]->to_room);
cprintf(ch, "Exit %s to %s [#%d] is called %s.\r\n", dirs[i],
rp ? rp->name : "Swirling CHAOS", rp ? rp->number : -1,
rm->dir_option[i]->keyword ? rm->dir_option[i]->keyword : dirs[i]);
if (rm->dir_option[i]->general_description)
cprintf(ch, " %s", rm->dir_option[i]->general_description);
if (rm->dir_option[i]->exit_info) {
sprintbit(rm->dir_option[i]->exit_info, exit_bits, buf2);
cprintf(ch, " Flags: %s\r\n", buf2);
}
if (rm->dir_option[i]->key > 0) {
cprintf(ch, " Key: %s [#%d]\r\n",
obj_index[rm->dir_option[i]->key].name,
obj_index[rm->dir_option[i]->key].virtual);
}
}
}
if ((k = rm->people)) {
cprintf(ch, "Lifeforms present:\r\n");
for (; k; k = k->next_in_room) {
if (CAN_SEE(ch, k)) {
int v = 0;
sprintf(buf, "%s", GET_NAME(k));
if (!(v = MobVnum(k)))
strcat(buf, "(PC)");
else if (v < 0)
strcat(buf, "(NPC)");
else
sprintf(buf + strlen(buf), " [#%d]", v);
cprintf(ch, " %s\r\n", buf);
}
}
}
if ((j = rm->contents)) {
cprintf(ch, "Objects present:\r\n");
for (; j; j = j->next_content)
cprintf(ch, " %s [#%d]\r\n", j->name, ObjVnum(j));
}
return;
} else if (!str_cmp("mob", type) || !str_cmp("pc", type)) {
count = 1;
k = NULL;
if (anumber < 0) {
if (anumber == -2)
k = ch;
}
/*
* MOBILE in world
*/
if (anumber >= 0) {
if (!(k = get_char_num(anumber))) {
cprintf(ch, "Noone with that vnum exists, I shall load one!\r\n");
if (!(k = read_mobile(anumber, VIRTUAL))) {
cprintf(ch, "No such creature exists in Reality!\r\n");
return;
} else {
cprintf(ch, "%s appears for your inspection.\r\n", NAME(k));
char_to_room(k, ch->in_room);
}
}
} else if (!k) {
if (!str_cmp("me", num)) {
k = ch;
} else if (!(k = get_char_room_vis(ch, num))) {
if (!(k = get_char_vis_world(ch, num, &count))) {
int x = 0;
cprintf(ch, "No creature exists by that name, I shall make one!\r\n");
for (x = 0; x < top_of_mobt; x++) {
if (isname(num, mob_index[x].name)) {
if (!(k = read_mobile(x, REAL))) {
cprintf(ch, "No such creature exists in Reality!\r\n");
return;
} else {
cprintf(ch, "%s appears for your inspection.\r\n", NAME(k));
char_to_room(k, ch->in_room);
x = -1;
break;
}
}
}
if (x > -1) {
cprintf(ch, "No such creature exists in Reality!\r\n");
return;
}
}
}
}
cprintf(ch, "Name: %s : [R-Number %d] ", GET_NAME(k), k->nr);
if (IS_MOB(k))
cprintf(ch, "[Load Number %d]", mob_index[k->nr].virtual);
cprintf(ch, "\r\n");
cprintf(ch, "Location [%d]\r\n", k->in_room);
switch (k->player.sex) {
case SEX_NEUTRAL:
strcpy(buf, "Neutral-Sex");
break;
case SEX_MALE:
strcpy(buf, "Male");
break;
case SEX_FEMALE:
strcpy(buf, "Female");
break;
default:
strcpy(buf, "ILLEGAL-SEX!!");
break;
}
cprintf(ch, "Sex : %s - %s\r\n",
buf, (!IS_NPC(k) ? "Pc" : (!IS_MOB(k) ? "Npc" : "Mob")));
cprintf(ch, "Short description: %s\r\n",
(k->player.short_descr ? k->player.short_descr : "None"));
cprintf(ch, "Title: %s\r\n", (k->player.title ? k->player.title : "None"));
cprintf(ch, "Pre-Title: %s\r\n", (GET_PRETITLE(k) ? GET_PRETITLE(k) : "None"));
cprintf(ch, "Long description: %s\r\n",
(k->player.long_descr ? k->player.long_descr : "None"));
if (IS_NPC(k)) {
strcpy(buf, "Monster Class: ");
sprinttype(k->player.class, npc_class_types, buf2);
} else {
strcpy(buf, "Class: ");
sprintbit(k->player.class, pc_class_types, buf2);
}
strcat(buf, buf2);
sprintf(buf2, " : Level [%d/%d/%d/%d/%d] : Alignment[%d]\r\n",
k->player.level[0], k->player.level[1],
k->player.level[2], k->player.level[3], k->player.level[4], GET_ALIGNMENT(k));
strcat(buf, buf2);
cprintf(ch, "%s", buf);
if (IS_PC(k)) {
cprintf(ch, "Birth : [%ld] secs, Logon[%ld] secs, Played[%d] secs\r\n",
k->player.time.birth, k->player.time.logon, k->player.time.played);
cprintf(ch, "Age: [%d] Years, [%d] Months, [%d] Days, [%d] Hours\r\n",
age(k).year, age(k).month, age(k).day, age(k).hours);
}
cprintf(ch, "Height [%d]cm Weight [%d]pounds \r\n", GET_HEIGHT(k), GET_WEIGHT(k));
cprintf(ch, "+----------------------------+\r\n");
cprintf(ch, "Str:[%d/%d] Int:[%d] Wis:[%d] Dex:[%d] Con:[%d]\r\n",
GET_STR(k), GET_ADD(k), GET_INT(k), GET_WIS(k), GET_DEX(k), GET_CON(k));
cprintf(ch,
"Mana p.:[%d/%d+%d] Hit p.:[%d/%d+%d] Move p.:[%d/%d+%d]\r\n",
GET_MANA(k), mana_limit(k), mana_gain(k),
GET_HIT(k), hit_limit(k), hit_gain(k), GET_MOVE(k), move_limit(k),
move_gain(k));
cprintf(ch,
"AC:[%d/10], Coins: [%d], Exp: [%d], Hitroll: [%d], Damroll: [%d]\r\n",
GET_AC(k), GET_GOLD(k), GET_EXP(k), k->points.hitroll, k->points.damroll);
if (IS_NPC(k)) {
cprintf(ch, "Npc Bare Hand Damage %dd%d.\r\n",
k->specials.damnodice, k->specials.damsizedice);
}
if (IS_PC(k)) {
cprintf(ch, "\r\nTimer [%d] \r\n", k->specials.timer);
}
cprintf(ch, "+----------------------------+\r\n");
sprinttype(GET_POS(k), position_types, buf2);
sprintf(buf, "Position: %s : Fighting: %s", buf2,
((k->specials.fighting) ? GET_NAME(k->specials.fighting) : "Nobody"));
if (k->desc) {
sprinttype(k->desc->connected, connected_types, buf2);
strcat(buf, " : Connected: ");
strcat(buf, buf2);
}
cprintf(ch, "%s\r\n", buf);
strcpy(buf, "Default position: ");
sprinttype((k->specials.default_pos), position_types, buf2);
strcat(buf, buf2);
if (IS_NPC(k)) {
strcat(buf, "\r\nNPC flags: ");
sprintbit(k->specials.act, action_bits, buf2);
} else {
strcat(buf, ",PC flags: ");
sprintbit(k->specials.act, player_bits, buf2);
}
strcat(buf, buf2);
if (IS_MOB(k)) {
/*
* strcpy(buf, "\r\nMobile Special procedure : "); strcat(buf, (mob_index[k->nr].func ? "Exists\r\n" :
* "None\r\n")); cprintf(ch, buf);
*/
cprintf(ch, "\r\nMobile Special procedure : %s\r\n",
(mob_index[k->nr].func ? MobFunctionNameByFunc(mob_index[k->nr].func) :
"None"));
}
cprintf(ch, "Carried weight: %d Carried items: %d\r\n",
IS_CARRYING_W(k), IS_CARRYING_N(k));
for (i = 0, j = k->carrying; j; j = j->next_content, i++);
sprintf(buf, "Items in inventory: %d, ", i);
for (i = 0, i2 = 0; i < MAX_WEAR; i++)
if (k->equipment[i])
i2++;
sprintf(buf2, "Items in equipment: %d\r\n", i2);
strcat(buf, buf2);
cprintf(ch, "%s", buf);
cprintf(ch, "Apply saving throws: [%d] [%d] [%d] [%d] [%d]\r\n",
k->specials.apply_saving_throw[0],
k->specials.apply_saving_throw[1],
k->specials.apply_saving_throw[2],
k->specials.apply_saving_throw[3], k->specials.apply_saving_throw[4]);
if (IS_PC(k)) {
cprintf(ch, "Thirst: %d, Hunger: %d, Drunk: %d\r\n",
k->specials.conditions[THIRST],
k->specials.conditions[FULL], k->specials.conditions[DRUNK]);
}
cprintf(ch, "Master is '%s'\r\n", ((k->master) ? GET_NAME(k->master) : "NOBODY"));
cprintf(ch, "Followers are:\r\n");
for (fol = k->followers; fol; fol = fol->next)
if (CAN_SEE(ch, fol->follower))
act(" $N", FALSE, ch, 0, fol->follower, TO_CHAR);
/*
* immunities
*/
cprintf(ch, "Immune to:");
sprintbit(k->M_immune, immunity_names, buf);
cprintf(ch, "%s\r\n", buf);
/*
* resistances
*/
cprintf(ch, "Resistant to:");
sprintbit(k->immune, immunity_names, buf);
cprintf(ch, "%s\r\n", buf);
/*
* Susceptible
*/
cprintf(ch, "Susceptible to:");
sprintbit(k->susc, immunity_names, buf);
cprintf(ch, "%s\r\n", buf);
/*
* Showing the bitvector
*/
sprintbit(k->specials.affected_by, affected_bits, buf);
cprintf(ch, "Affected by: ");
cprintf(ch, "%s\r\n", buf);
/*
* Routine to show what spells a char is affected by
*/
if (k->affected) {
cprintf(ch, "\r\nAffecting Spells:\r\n--------------\r\n");
for (aff = k->affected; aff; aff = aff->next) {
cprintf(ch, "Spell : '%s'\r\n", spell_info[aff->type].name);
cprintf(ch, " Modifies %s by %d points\r\n",
apply_types[(int)aff->location], aff->modifier);
cprintf(ch, " Expires in %3d hours, Bits set ", aff->duration);
sprintbit(aff->bitvector, affected_bits, buf);
cprintf(ch, "%s\r\n", buf);
}
}
return;
} else if (!str_cmp("obj", type)) {
count = 1;
j = NULL;
if (anumber == -2) {
cprintf(ch, "Usage: stat obj <name|vnum>\r\n");
return;
}
/*
* OBJECT in world
*/
if (anumber >= 0) {
if (!(j = get_obj_num(anumber))) {
cprintf(ch, "Nothing with that vnum exists, I shall load one!\r\n");
if (!(j = read_object(anumber, VIRTUAL))) {
cprintf(ch, "No such object exists in Reality!\r\n");
return;
} else {
cprintf(ch, "A new %s appears for your inspection.\r\n",
j->short_description);
obj_to_room(j, ch->in_room);
}
}
} else if (!j) {
if (!(j = get_obj_vis(ch, num))) {
cprintf(ch, "No such object is visible in the Realm.\r\n");
return;
}
}
virtual = (j->item_number >= 0) ? obj_index[j->item_number].virtual : 0;
sprintf(buf, "Object name: [%s]\r\nR-number: [%d], Load Number: [%d]\r\nItem type: ",
j->name, j->item_number, virtual);
sprinttype(GET_ITEM_TYPE(j), item_types, buf2);
strcat(buf, buf2);
cprintf(ch, "%s\r\n", buf);
cprintf(ch, "Short description: %s\r\nLong description:\r\n%s\r\n",
((j->short_description) ? j->short_description : "None"),
((j->description) ? j->description : "None"));
if (j->ex_description) {
strcpy(buf, "Extra description keyword(s):\r\n----------\r\n");
for (desc = j->ex_description; desc; desc = desc->next) {
strcat(buf, desc->keyword);
strcat(buf, "\r\n");
}
strcat(buf, "----------\r\n");
cprintf(ch, "%s", buf);
} else {
strcpy(buf, "Extra description keyword(s): None\r\n");
cprintf(ch, "%s", buf);
}
cprintf(ch, "Can be worn on :");
sprintbit(j->obj_flags.wear_flags, wear_bits, buf);
cprintf(ch, "%s\r\n", buf);
cprintf(ch, "Set char bits :");
sprintbit(j->obj_flags.bitvector, affected_bits, buf);
cprintf(ch, "%s\r\n", buf);
cprintf(ch, "Extra flags: ");
sprintbit(j->obj_flags.extra_flags, extra_bits, buf);
cprintf(ch, "%s\r\n", buf);
cprintf(ch, "Weight: %d, Value: %d, Cost/day: %d, Timer: %d\r\n",
j->obj_flags.weight, j->obj_flags.cost,
j->obj_flags.cost_per_day, j->obj_flags.timer);
strcpy(buf, "In room: ");
if (j->in_room == NOWHERE)
strcat(buf, "Nowhere");
else {
sprintf(buf2, "%d", j->in_room);
strcat(buf, buf2);
}
strcat(buf, " ,In object: ");
strcat(buf, (!j->in_obj ? "None" : fname(j->in_obj->name)));
/*
* strcat(buf," ,Carried by:");
* if (j->carried_by)
* {
* if (GET_NAME(j->carried_by))
* {
* if (strlen(GET_NAME(j->carried_by)) > 0)
* {
* strcat(buf, (!j->carried_by) ? "Nobody" : GET_NAME(j->carried_by));
* }
* else
* {
* strcat(buf, "NonExistantPlayer");
* }
* }
* else
* {
* strcat(buf, "NonExistantPlayer");
* }
* }
* else
* {
* strcat(buf, "Nobody");
* }
* strcat(buf,"\r\n");
* cprintf(ch, buf);
*/
switch (j->obj_flags.type_flag) {
case ITEM_LIGHT:
sprintf(buf, "Colour : [%d]\r\nType : [%d]\r\nHours : [%d]",
j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[2]);
break;
case ITEM_SCROLL:
sprintf(buf, "Spells : %d, %d, %d, %d",
j->obj_flags.value[0],
j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
break;
case ITEM_WAND:
sprintf(buf, "Spell : %d\r\nMana : %d", j->obj_flags.value[0],
j->obj_flags.value[1]);
break;
case ITEM_STAFF:
sprintf(buf, "Spell : %d\r\nMana : %d", j->obj_flags.value[0],
j->obj_flags.value[1]);
break;
case ITEM_WEAPON:
sprintf(buf, "Tohit : %d\r\nTodam : %dD%d\r\nType : %d",
j->obj_flags.value[0],
j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
break;
case ITEM_FIREWEAPON:
sprintf(buf, "Tohit : %d\r\nTodam : %dD%d\r\nType : %d",
j->obj_flags.value[0],
j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
break;
case ITEM_MISSILE:
sprintf(buf, "Tohit : %d\r\nTodam : %d\r\nType : %d",
j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[3]);
break;
case ITEM_ARMOR:
sprintf(buf, "AC-apply : [%d]\r\nFull Strength : [%d]",
j->obj_flags.value[0], j->obj_flags.value[1]);
break;
case ITEM_POTION:
sprintf(buf, "Spells : %d, %d, %d, %d",
j->obj_flags.value[0],
j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
break;
case ITEM_TRAP:
sprintf(buf, "level: %d, att type: %d, damage class: %d, charges: %d",
j->obj_flags.value[0],
j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
break;
case ITEM_CONTAINER:
sprintf(buf, "Max-contains : %d\r\nLocktype : %d\r\nCorpse : %s",
j->obj_flags.value[0],
j->obj_flags.value[1], j->obj_flags.value[3] ? "Yes" : "No");
break;
case ITEM_DRINKCON:
sprinttype(j->obj_flags.value[2], drinks, buf2);
sprintf(buf,
"Max-contains : %d\r\nContains : %d\r\nPoisoned : %d\r\nLiquid : %s",
j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[3],
buf2);
break;
case ITEM_NOTE:
sprintf(buf, "Tounge : %d", j->obj_flags.value[0]);
break;
case ITEM_KEY:
sprintf(buf, "Keytype : %d", j->obj_flags.value[0]);
break;
case ITEM_FOOD:
sprintf(buf, "Makes full : %d\r\nPoisoned : %d",
j->obj_flags.value[0], j->obj_flags.value[3]);
break;
default:
sprintf(buf, "Values 0-3 : [%d] [%d] [%d] [%d]",
j->obj_flags.value[0],
j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
break;
}
cprintf(ch, "%s", buf);
strcpy(buf, "\r\nEquipment Status: ");
if (!j->carried_by)
strcat(buf, "NONE");
else {
found = FALSE;
for (i = 0; i < MAX_WEAR; i++) {
if (j->carried_by->equipment[i] == j) {
sprinttype(i, equipment_types, buf2);
strcat(buf, buf2);
found = TRUE;
}
}
if (!found)
strcat(buf, "Inventory");
}
cprintf(ch, "%s", buf);
strcpy(buf, "\r\nSpecial procedure : ");
if (j->item_number >= 0)
strcat(buf, (obj_index[j->item_number].func ? "exists\r\n" : "No\r\n"));
else
strcat(buf, "No\r\n");
cprintf(ch, "%s", buf);
strcpy(buf, "Contains :\r\n");
found = FALSE;
for (j2 = j->contains; j2; j2 = j2->next_content) {
strcat(buf, fname(j2->name));
strcat(buf, "\r\n");
found = TRUE;
}
if (!found)
strcpy(buf, "Contains : Nothing\r\n");
cprintf(ch, "%s", buf);
cprintf(ch, "Can affect char :\r\n");
for (i = 0; i < MAX_OBJ_AFFECT; i++) {
sprinttype(j->affected[i].location, apply_types, buf2);
cprintf(ch, " Affects : %s By %d\r\n", buf2, j->affected[i].modifier);
}
return;
} else {
cprintf(ch, "Usage: stat < pc|mob|obj|room > [ name|vnum ]\r\n");
return;
}
}
void do_pretitle(struct char_data *ch, const char *argument, int cmd)
{
char name[20] = "\0\0\0\0\0\0\0";
char pretitle[50] = "\0\0\0\0\0\0\0";
struct char_data *vict = NULL;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
argument = one_argument(argument, name);
if (*argument == ' ')
argument++;
strcpy(pretitle, argument);
if (!(vict = get_char_vis(ch, name))) {
cprintf(ch, "I don't see them here?\r\n");
return;
}
if (!strlen(pretitle)) {
GET_PRETITLE(vict) = NULL;
return;
}
CREATE(GET_PRETITLE(vict), char, strlen(pretitle) + 1);
strcpy(GET_PRETITLE(vict), pretitle);
}
void do_set(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *mob = NULL;
char field[20] = "\0\0\0\0\0\0\0";
char name[20] = "\0\0\0\0\0\0\0";
char parmstr[50] = "\0\0\0\0\0\0\0";
char tmp[80] = "\0\0\0\0\0\0\0";
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
int index_value = 0;
int parm = 0;
int i = 0;
int no = 0;
const char *pset_list[] = {
"align", "exp", "sex", "race", "tohit", "dmg",
"bank", "gold", "prac",
"str", "int", "wis", "dex", "con", "stradd",
"hit", "mhit", "mana", "mmana", "move", "mmove",
"mlvl", "clvl", "wlvl", "tlvl", "rlvl", "dlvl",
"aggr", "wander",
NULL
};
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (IS_NPC(ch))
return;
argument = one_argument(argument, name);
argument = one_argument(argument, field);
strncpy(tmp, argument, 79);
argument = one_argument(argument, parmstr);
if ((mob = get_char_vis(ch, name)) == NULL) {
cprintf(ch, "I don't see them here? \r\n\r\n");
*buf = '\0';
strcpy(buf, "Usage: pset <name> <attrib> <value>\r\n");
for (no = 1, i = 0; pset_list[i]; i++) {
sprintf(buf + strlen(buf), "%-10s", pset_list[i]);
if (!(no % 7))
strcat(buf, "\r\n");
no++;
}
cprintf(ch, "%s\r\n", buf);
return;
}
for (index_value = 0; pset_list[index_value]; index_value++)
if (!strcmp(field, pset_list[index_value])) {
int x;
x = sscanf(parmstr, "%d", &parm);
if (!x) {
cprintf(ch, "You must also supply a value\r\n");
return;
}
break;
}
if (IS_PC(mob) && mob != ch && GetMaxLevel(mob) >= GetMaxLevel(ch)) {
cprintf(ch, "You wish you could set %s's stats...\r\n", GET_NAME(mob));
return;
}
switch (index_value) {
case 0:
GET_ALIGNMENT(mob) = parm;
break;
case 1:
GET_EXP(mob) = parm;
break;
case 2:
GET_SEX(mob) = parm;
break;
case 3:
GET_RACE(mob) = parm;
break;
case 4:
GET_HITROLL(mob) = parm;
break;
case 5:
GET_DAMROLL(mob) = parm;
break;
case 6:
GET_BANK(mob) = parm;
break;
case 7:
GET_GOLD(mob) = parm;
break;
case 8:
mob->specials.pracs = parm;
break;
case 9:
if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
mob->abilities.str = parm;
mob->tmpabilities = mob->abilities;
break;
case 10:
if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
mob->abilities.intel = parm;
mob->tmpabilities = mob->abilities;
break;
case 11:
if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
mob->abilities.wis = parm;
mob->tmpabilities = mob->abilities;
break;
case 12:
if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
mob->abilities.dex = parm;
mob->tmpabilities = mob->abilities;
break;
case 13:
if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
mob->abilities.con = parm;
mob->tmpabilities = mob->abilities;
break;
case 14:
mob->abilities.str_add = parm;
mob->tmpabilities = mob->abilities;
break;
case 15:
GET_HIT(mob) = parm;
break;
case 16:
mob->points.max_hit = parm;
break;
case 17:
GET_MANA(mob) = parm;
break;
case 18:
mob->points.max_mana = parm;
break;
case 19:
GET_MOVE(mob) = parm;
break;
case 20:
mob->points.max_move = parm;
break;
case 21:
if (ch == mob && parm > GET_LEVEL(ch, MAGE_LEVEL_IND)) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
&& parm > GET_LEVEL(ch, MAGE_LEVEL_IND)) {
cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
return;
}
if (parm < 1) {
GET_CLASS(mob) &= ~CLASS_MAGIC_USER;
} else {
GET_CLASS(mob) |= CLASS_MAGIC_USER;
}
GET_LEVEL(mob, MAGE_LEVEL_IND) = parm;
break;
case 22:
if (ch == mob && parm > GET_LEVEL(ch, CLERIC_LEVEL_IND)) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
&& parm > GET_LEVEL(ch, CLERIC_LEVEL_IND)) {
cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
return;
}
if (parm < 1) {
GET_CLASS(mob) &= ~CLASS_CLERIC;
} else {
GET_CLASS(mob) |= CLASS_CLERIC;
}
GET_LEVEL(mob, CLERIC_LEVEL_IND) = parm;
break;
case 23:
if (ch == mob && parm > GET_LEVEL(ch, WARRIOR_LEVEL_IND)) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
&& parm > GET_LEVEL(ch, WARRIOR_LEVEL_IND)) {
cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
return;
}
if (parm < 1) {
GET_CLASS(mob) &= ~CLASS_WARRIOR;
} else {
GET_CLASS(mob) |= CLASS_WARRIOR;
}
GET_LEVEL(mob, WARRIOR_LEVEL_IND) = parm;
break;
case 24:
if (ch == mob && parm > GET_LEVEL(ch, THIEF_LEVEL_IND)) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
&& parm > GET_LEVEL(ch, THIEF_LEVEL_IND)) {
cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
return;
}
if (parm < 1) {
GET_CLASS(mob) &= ~CLASS_THIEF;
} else {
GET_CLASS(mob) |= CLASS_THIEF;
}
GET_LEVEL(mob, THIEF_LEVEL_IND) = parm;
break;
case 25:
if (ch == mob && parm > GET_LEVEL(ch, RANGER_LEVEL_IND)) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
&& parm > GET_LEVEL(ch, RANGER_LEVEL_IND)) {
cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
return;
}
if (parm < 1) {
GET_CLASS(mob) &= ~CLASS_RANGER;
} else {
GET_CLASS(mob) |= CLASS_RANGER;
}
GET_LEVEL(mob, RANGER_LEVEL_IND) = parm;
break;
case 26:
if (ch == mob && parm > GET_LEVEL(ch, DRUID_LEVEL_IND)) {
cprintf(ch, "Sure, we all want to be more powerful.\r\n");
return;
}
if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
&& parm > GET_LEVEL(ch, DRUID_LEVEL_IND)) {
cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
return;
}
if (parm < 1) {
GET_CLASS(mob) &= ~CLASS_DRUID;
} else {
GET_CLASS(mob) |= CLASS_DRUID;
}
GET_LEVEL(mob, DRUID_LEVEL_IND) = parm;
break;
case 27:
if (!IS_NPC(mob)) {
cprintf(ch, "You should tell %s to be more aggressive!\r\n", GET_NAME(mob));
return;
}
if (parm) {
if (!IS_SET(mob->specials.act, ACT_AGGRESSIVE)) {
SET_BIT(mob->specials.act, ACT_AGGRESSIVE);
cprintf(ch, "%s is now AGGRESSIVE!\r\n", NAME(mob));
}
} else {
if (IS_SET(mob->specials.act, ACT_AGGRESSIVE)) {
REMOVE_BIT(mob->specials.act, ACT_AGGRESSIVE);
cprintf(ch, "%s is now nice.\r\n", NAME(mob));
}
}
break;
case 28:
if (!IS_NPC(mob)) {
cprintf(ch, "You should tell %s to wander about more!\r\n", GET_NAME(mob));
return;
}
if (parm) {
if (IS_SET(mob->specials.act, ACT_SENTINEL)) {
REMOVE_BIT(mob->specials.act, ACT_SENTINEL);
cprintf(ch, "%s is now wandering!\r\n", NAME(mob));
}
} else {
if (!IS_SET(mob->specials.act, ACT_SENTINEL)) {
SET_BIT(mob->specials.act, ACT_SENTINEL);
cprintf(ch, "%s is now lazy.\r\n", NAME(mob));
}
}
break;
default:
*buf = '\0';
strcpy(buf, "Usage: pset <name> <attrib> <value>\r\n");
for (no = 1, i = 0; pset_list[i]; i++) {
sprintf(buf + strlen(buf), "%-10s", pset_list[i]);
if (!(no % 7))
strcat(buf, "\r\n");
no++;
}
cprintf(ch, "%s\r\n", buf);
}
}
void do_shutdow(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, "If you want to shut something down - say so!\r\n");
}
void do_shutdown(struct char_data *ch, const char *argument, int cmd)
{
time_t tc = (time_t) 0;
struct tm *t_info = NULL;
char *tmstr = NULL;
char arg[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;
tc = time(0);
t_info = localtime(&tc);
tmstr = asctime(t_info);
*(tmstr + strlen(tmstr) - 1) = '\0';
one_argument(argument, arg);
if (!*arg) {
log_boot("SHUTDOWN by %s at %d:%d", GET_NAME(ch), t_info->tm_hour + 1, t_info->tm_min);
allprintf("\x007\r\nBroadcast message from %s (tty0) %s...\r\n\r\n", GET_NAME(ch),
tmstr);
allprintf("\x007The system is going down NOW !!\r\n\x007\r\n");
diku_shutdown = 1;
update_time_and_weather();
} else if (!str_cmp(arg, "-k")) {
log_info("FAKE REBOOT by %s at %d:%d", GET_NAME(ch),
t_info->tm_hour + 1, t_info->tm_min);
allprintf("\x007\r\nBroadcast message from %s (tty0) %s...\r\n\r\n", GET_NAME(ch),
tmstr);
allprintf("\x007Rebooting. Come back in a few minutes!\r\n");
allprintf("\x007The system is going down NOW !!\r\n\r\n");
} else if (!str_cmp(arg, "-r")) {
log_boot("REBOOT by %s at %d:%d", GET_NAME(ch), t_info->tm_hour + 1, t_info->tm_min);
allprintf("\x007\r\nBroadcast message from %s (tty0) %s...\r\n\r\n", GET_NAME(ch),
tmstr);
allprintf("\x007Rebooting. Come back in a few minutes!\r\n");
allprintf("\x007The system is going down NOW !!\r\n\r\n");
diku_shutdown = diku_reboot = 1;
update_time_and_weather();
} else
cprintf(ch, "Go shut down someone your own size.\r\n");
}
void do_snoop(struct char_data *ch, const char *argument, int cmd)
{
static char arg[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
struct char_data *victim = NULL;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (!ch->desc)
return;
if (IS_NPC(ch))
return;
only_argument(argument, arg);
if (!*arg) {
cprintf(ch, "Snoop who ?\r\n");
return;
}
if (!(victim = get_char_vis(ch, arg))) {
cprintf(ch, "No such person around.\r\n");
return;
}
if (!victim->desc) {
cprintf(ch, "There's no link.. nothing to snoop.\r\n");
return;
}
if (victim == ch) {
cprintf(ch, "Ok, you just snoop yourself.\r\n");
if (ch->desc->snoop.snooping) {
if (ch->desc->snoop.snooping->desc)
ch->desc->snoop.snooping->desc->snoop.snoop_by = 0;
else
log_info("caught %s snooping %s who didn't have a descriptor!",
ch->player.name, ch->desc->snoop.snooping->player.name);
ch->desc->snoop.snooping = 0;
}
return;
}
if (victim->desc->snoop.snoop_by) {
cprintf(ch, "Busy already. \r\n");
return;
}
if (GetMaxLevel(victim) >= GetMaxLevel(ch)) {
cprintf(ch, "You failed.\r\n");
return;
}
cprintf(ch, "Ok. \r\n");
if (ch->desc->snoop.snooping)
if (ch->desc->snoop.snooping->desc)
ch->desc->snoop.snooping->desc->snoop.snoop_by = 0;
ch->desc->snoop.snooping = victim;
victim->desc->snoop.snoop_by = ch;
return;
}
void do_switch(struct char_data *ch, const char *argument, int cmd)
{
static char arg[80] = "\0\0\0\0\0\0\0";
struct char_data *victim = NULL;
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, arg);
if (!*arg) {
cprintf(ch, "Switch with who?\r\n");
} else {
if (!(victim = get_char_room_vis(ch, arg))) {
if (!(victim = get_char(arg))) {
cprintf(ch, "They aren't here.\r\n");
return;
}
}
{
if (ch == victim) {
cprintf(ch, "He he he... We are jolly funny today, eh?\r\n");
return;
}
if (!ch->desc || ch->desc->snoop.snoop_by || ch->desc->snoop.snooping) {
cprintf(ch, "Mixing snoop & switch is bad for your health.\r\n");
return;
}
if (victim->desc || (!IS_NPC(victim)) || IS_SET(victim->specials.act, ACT_SWITCH)) {
cprintf(ch, "You can't do that, the body is already in use!\r\n");
} else {
cprintf(ch, "Ok.\r\n");
ch->desc->character = victim;
ch->desc->original = ch;
SET_BIT(victim->specials.act, ACT_SWITCH);
victim->desc = ch->desc;
ch->desc = 0;
}
}
}
}
void do_return(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *mob = NULL;
struct char_data *per = NULL;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (!ch->desc)
return;
if (!ch->desc->original || (IS_NOT_SET(ch->specials.act, ACT_SWITCH) &&
IS_NOT_SET(ch->specials.act, ACT_POLYSELF) &&
IS_NOT_SET(ch->specials.act, ACT_POLYOTHER))) {
cprintf(ch, "Huh? Talk sense I can't understand you.\r\n");
return;
} else {
cprintf(ch, "You return to your original body.\r\n");
if ((IS_SET(ch->specials.act, ACT_POLYSELF) ||
IS_SET(ch->specials.act, ACT_POLYOTHER)) && cmd) {
mob = ch;
per = ch->desc->original;
act("$n turns liquid, and reforms as $N", TRUE, mob, 0, per, TO_ROOM);
char_from_room(per);
char_to_room(per, mob->in_room);
/*
* SwitchStuff(mob, per);
*/
}
if (IS_SET(ch->specials.act, ACT_SWITCH))
REMOVE_BIT(ch->specials.act, ACT_SWITCH);
ch->desc->character = ch->desc->original;
ch->desc->original = 0;
ch->desc->character->desc = ch->desc;
ch->desc = 0;
if ((IS_SET(ch->specials.act, ACT_POLYSELF) ||
IS_SET(ch->specials.act, ACT_POLYOTHER)) && cmd) {
extract_char(mob);
}
}
}
void do_force(struct char_data *ch, const char *argument, int cmd)
{
struct descriptor_data *i = NULL;
struct char_data *vict = NULL;
char name[100] = "\0\0\0\0\0\0\0";
char to_force[100] = "\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) && (cmd != 0))
return;
half_chop(argument, name, to_force);
if (!*name || !*to_force)
cprintf(ch, "Who do you wish to force to do what?\r\n");
else if (str_cmp("all", name)) {
if (!(vict = get_char_vis(ch, name)))
cprintf(ch, "No-one by that name here..\r\n");
else {
if ((GetMaxLevel(ch) <= GetMaxLevel(vict)) && (!IS_NPC(vict)))
cprintf(ch, "Oh no you don't!!\r\n");
else {
if (!IS_SET(ch->specials.act, PLR_STEALTH))
act("$n has forced you to '%s'.", FALSE, ch, 0, vict, TO_VICT, to_force);
cprintf(ch, "Ok.\r\n");
command_interpreter(vict, to_force);
}
}
} else { /* force all */
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected && i->character != board_kludge_char) {
vict = i->character;
if ((GetMaxLevel(ch) <= GetMaxLevel(vict)) && (!IS_NPC(vict)))
cprintf(ch, "Oh no you don't!!\r\n");
else {
if (!IS_SET(ch->specials.act, PLR_STEALTH))
act("$n has forced you to '%s'.", FALSE, ch, 0, vict, TO_VICT,
to_force);
command_interpreter(vict, to_force);
}
}
cprintf(ch, "Ok.\r\n");
}
}
void do_load(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *mob = NULL;
struct obj_data *obj = NULL;
char type[100] = "\0\0\0\0\0\0\0";
char num[100] = "\0\0\0\0\0\0\0";
int anumber = 0;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (IS_NPC(ch))
return;
argument = one_argument(argument, type);
only_argument(argument, num);
if (isdigit(*num))
anumber = atoi(num);
else
anumber = -1;
if (is_abbrev(type, "mobile")) {
if (anumber < 0) {
for (anumber = 0; anumber <= top_of_mobt; anumber++)
if (isname(num, mob_index[anumber].name))
break;
if (anumber > top_of_mobt)
anumber = -1;
} else {
anumber = real_mobile(anumber);
}
if (anumber < 0 || anumber > top_of_mobt) {
cprintf(ch, "There is no such monster.\r\n");
return;
}
mob = read_mobile(anumber, REAL);
char_to_room(mob, ch->in_room);
act("$n makes a quaint, magical gesture with one hand.", TRUE, ch, 0, 0, TO_ROOM);
act("$n has summoned $N from the ether!", FALSE, ch, 0, mob, TO_ROOM);
act("You bring forth $N from the the cosmic ether.", FALSE, ch, 0, mob, TO_CHAR);
} else if (is_abbrev(type, "object")) {
if (anumber < 0) {
for (anumber = 0; anumber <= top_of_objt; anumber++)
if (isname(num, obj_index[anumber].name))
break;
if (anumber > top_of_objt)
anumber = -1;
} else {
anumber = real_object(anumber);
}
if (anumber < 0 || anumber > top_of_objt) {
cprintf(ch, "There is no such object.\r\n");
return;
}
obj = read_object(anumber, REAL);
obj_to_char(obj, ch);
act("$n makes a strange magical gesture.", TRUE, ch, 0, 0, TO_ROOM);
act("$n has created $p!", FALSE, ch, obj, 0, TO_ROOM);
act("You now have $p.", FALSE, ch, obj, 0, TO_CHAR);
} else {
cprintf(ch, "Usage: load <object|mobile> <vnum|name>\r\n");
}
}
static void purge_one_room(int rnum, struct room_data *rp, int *range)
{
struct char_data *ch = NULL;
struct obj_data *obj = NULL;
if (DEBUG > 2)
log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
(size_t) range);
if (rnum == 0 || rnum < range[0] || rnum > range[1])
return;
while (rp->people) {
ch = rp->people;
cprintf(ch, "The gods strike down from the heavens making the");
cprintf(ch, "world tremble. All that's left is the Void.");
char_from_room(ch);
char_to_room(ch, 0); /* send character to the void */
do_look(ch, "", 15);
act("$n tumbles into the Void.", TRUE, ch, 0, 0, TO_ROOM);
}
while (rp->contents) {
obj = rp->contents;
obj_from_room(obj);
obj_to_room(obj, 0); /* send item to the void */
}
completely_cleanout_room(rp); /* clear out the pointers */
hash_remove(&room_db, rnum); /* remove it from the database */
}
/* clean a room of all mobiles and objects */
void do_purge(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *vict = NULL;
struct char_data *next_v = NULL;
struct obj_data *obj = NULL;
struct obj_data *next_o = NULL;
char name[100] = "\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, name);
if (*name) { /* argument supplied. destroy single object or char */
if ((vict = get_char_room_vis(ch, name))) {
if ((!IS_NPC(vict) || IS_SET(vict->specials.act, ACT_POLYSELF)) &&
(GetMaxLevel(ch) < IMPLEMENTOR)) {
cprintf(ch, "I'm sorry, Dave. I can't let you do that.\r\n");
return;
}
act("$n disintegrates $N.", FALSE, ch, 0, vict, TO_NOTVICT);
if (IS_NPC(vict) || (!IS_SET(ch->specials.act, ACT_POLYSELF))) {
extract_char(vict);
} else {
if (vict->desc) {
close_socket(vict->desc);
vict->desc = 0;
extract_char(vict);
} else {
extract_char(vict);
}
}
} else if ((obj = get_obj_in_list_vis(ch, name, real_roomp(ch->in_room)->contents))) {
act("$n destroys $p.", FALSE, ch, obj, 0, TO_ROOM);
extract_obj(obj);
} else {
argument = one_argument(argument, name);
if (0 == str_cmp("room", name)) {
int range[2];
if (GetMaxLevel(ch) < IMPLEMENTOR) {
cprintf(ch, "I'm sorry, Dave. I can't let you do that.\r\n");
return;
}
argument = one_argument(argument, name);
if (!isdigit(*name)) {
cprintf(ch, "purge room start [end]");
return;
}
range[0] = atoi(name);
argument = one_argument(argument, name);
if (isdigit(*name))
range[1] = atoi(name);
else
range[1] = range[0];
if (range[0] == 0 || range[1] == 0) {
cprintf(ch, "usage: purge room start [end]\r\n");
return;
}
hash_iterate(&room_db, (funcp)purge_one_room, range);
} else {
cprintf(ch, "I don't see that here.\r\n");
return;
}
}
cprintf(ch, "Ok.\r\n");
} else { /* no argument. clean out the room */
if (GetMaxLevel(ch) < DEMIGOD)
return;
if (IS_NPC(ch)) {
cprintf(ch, "You would only kill yourself..\r\n");
return;
}
act("$n gestures, the world erupts around you in flames!", FALSE, ch, 0, 0, TO_ROOM);
rprintf(ch->in_room, "The world seems a little cleaner.\r\n");
for (vict = real_roomp(ch->in_room)->people; vict; vict = next_v) {
next_v = vict->next_in_room;
if (IS_NPC(vict) && (!IS_SET(vict->specials.act, ACT_POLYSELF)))
extract_char(vict);
}
for (obj = real_roomp(ch->in_room)->contents; obj; obj = next_o) {
next_o = obj->next_content;
extract_obj(obj);
}
}
}
/* Give pointers to the five abilities */
void roll_abilities(struct char_data *ch)
{
int i = 0;
int j = 0;
int k = 0;
int temp = 0;
unsigned char table[5];
unsigned char rools[4];
if (DEBUG > 2)
log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch));
for (i = 0; i < 5; table[i++] = 0);
for (i = 0; i < 5; i++) {
for (j = 0; j < 4; j++)
rools[j] = number(1, 6);
temp = rools[0] + rools[1] + rools[2] + rools[3] -
MIN(rools[0], MIN(rools[1], MIN(rools[2], rools[3])));
for (k = 0; k < 5; k++)
if (table[k] < temp)
SWITCH(temp, table[k]);
}
ch->abilities.str_add = 0;
switch (ch->player.class) {
case CLASS_MAGIC_USER:{
ch->abilities.intel = table[0];
ch->abilities.wis = table[1];
ch->abilities.dex = table[2];
ch->abilities.str = table[3];
ch->abilities.con = table[4];
}
break;
case CLASS_DRUID:{
ch->abilities.wis = table[0];
ch->abilities.intel = table[1];
ch->abilities.str = table[2];
ch->abilities.dex = table[3];
ch->abilities.con = table[4];
}
break;
case CLASS_CLERIC:{
ch->abilities.wis = table[0];
ch->abilities.intel = table[1];
ch->abilities.str = table[2];
ch->abilities.dex = table[3];
ch->abilities.con = table[4];
}
break;
case CLASS_CLERIC + CLASS_MAGIC_USER:{
ch->abilities.wis = table[0];
ch->abilities.intel = table[1];
ch->abilities.dex = table[2];
ch->abilities.str = table[3];
ch->abilities.con = table[4];
}
break;
case CLASS_THIEF:{
ch->abilities.dex = table[0];
ch->abilities.intel = table[1];
ch->abilities.str = table[2];
ch->abilities.con = table[3];
ch->abilities.wis = table[4];
}
break;
case CLASS_THIEF + CLASS_MAGIC_USER:{
ch->abilities.intel = table[0];
ch->abilities.dex = table[1];
ch->abilities.str = table[2];
ch->abilities.con = table[3];
ch->abilities.wis = table[4];
}
break;
case CLASS_THIEF + CLASS_CLERIC:{
ch->abilities.wis = table[0];
ch->abilities.dex = table[1];
ch->abilities.intel = table[2];
ch->abilities.str = table[3];
ch->abilities.con = table[4];
}
break;
case CLASS_THIEF + CLASS_MAGIC_USER + CLASS_CLERIC:{
ch->abilities.wis = table[0];
ch->abilities.intel = table[1];
ch->abilities.dex = table[2];
ch->abilities.str = table[3];
ch->abilities.con = table[4];
}
break;
case CLASS_RANGER:{
ch->abilities.str = table[0];
ch->abilities.con = table[3];
ch->abilities.dex = table[2];
ch->abilities.wis = table[1];
ch->abilities.intel = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = number(0, 100);
}
break;
case CLASS_WARRIOR:{
ch->abilities.str = table[0];
ch->abilities.con = table[1];
ch->abilities.dex = table[2];
ch->abilities.wis = table[3];
ch->abilities.intel = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = number(0, 100);
}
break;
case CLASS_WARRIOR + CLASS_MAGIC_USER:{
ch->abilities.str = table[0];
ch->abilities.intel = table[1];
ch->abilities.con = table[2];
ch->abilities.dex = table[3];
ch->abilities.wis = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = 0;
}
break;
case CLASS_WARRIOR + CLASS_CLERIC:{
ch->abilities.wis = table[0];
ch->abilities.str = table[1];
ch->abilities.intel = table[2];
ch->abilities.con = table[3];
ch->abilities.dex = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = 0;
}
break;
case CLASS_WARRIOR + CLASS_THIEF:{
ch->abilities.str = table[0];
ch->abilities.dex = table[1];
ch->abilities.con = table[2];
ch->abilities.intel = table[3];
ch->abilities.wis = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = 0;
}
break;
case CLASS_WARRIOR + CLASS_MAGIC_USER + CLASS_CLERIC:{
ch->abilities.wis = table[0];
ch->abilities.str = table[1];
ch->abilities.intel = table[2];
ch->abilities.dex = table[3];
ch->abilities.con = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = 0;
}
break;
case CLASS_WARRIOR + CLASS_MAGIC_USER + CLASS_THIEF:{
ch->abilities.intel = table[0];
ch->abilities.str = table[1];
ch->abilities.dex = table[2];
ch->abilities.con = table[3];
ch->abilities.wis = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = 0;
}
break;
case CLASS_WARRIOR + CLASS_THIEF + CLASS_CLERIC:{
ch->abilities.str = table[0];
ch->abilities.wis = table[1];
ch->abilities.dex = table[2];
ch->abilities.intel = table[3];
ch->abilities.con = table[4];
if (ch->abilities.str == 18)
ch->abilities.str_add = 0;
}
break;
default:
log_error("Error on class");
}
switch (GET_RACE(ch)) {
case RACE_ELVEN:
ch->abilities.dex += 1;
ch->abilities.con -= 1;
break;
case RACE_DWARF:
ch->abilities.con += 1;
ch->abilities.intel -= 1;
break;
case RACE_HALFLING:
ch->abilities.dex += 1;
ch->abilities.str -= 1;
break;
case RACE_GNOME:
ch->abilities.intel += 1;
ch->abilities.wis -= 1;
break;
}
if (ch->abilities.str > 18)
ch->abilities.str = 18;
if (ch->abilities.dex > 18)
ch->abilities.dex = 18;
if (ch->abilities.intel > 18)
ch->abilities.intel = 18;
if (ch->abilities.wis > 18)
ch->abilities.wis = 18;
if (ch->abilities.con > 18)
ch->abilities.con = 18;
ch->tmpabilities = ch->abilities;
}
void start_character(struct char_data *ch)
{
struct obj_data *obj = NULL;
int r_num = 0;
if (DEBUG > 2)
log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch));
StartLevels(ch);
GET_EXP(ch) = 1;
set_title(ch);
roll_abilities(ch);
ch->points.max_hit = 20;
/* Heafty Bread */
if ((r_num = real_object(5016)) >= 0) {
obj = read_object(r_num, REAL);
obj_to_char(obj, ch); /* */
obj = read_object(r_num, REAL);
obj_to_char(obj, ch);
}
/* Bottle of Water */
if ((r_num = real_object(3003)) >= 0) {
obj = read_object(r_num, REAL);
obj_to_char(obj, ch);
obj = read_object(r_num, REAL);
obj_to_char(obj, ch);
}
/* Club */
if ((r_num = real_object(3048)) >= 0) {
obj = read_object(r_num, REAL);
obj_to_char(obj, ch);
}
/* Map of Shylar */
if ((r_num = real_object(3050)) >= 0) {
obj = read_object(r_num, REAL);
obj_to_char(obj, ch);
}
/* Newbie note: added 9-25-95 by Sedna */
if ((r_num = real_object(3105)) >= 0) {
obj = read_object(r_num, REAL);
obj_to_char(obj, ch);
}
/* Torch */
if ((r_num = real_object(3015)) >= 0) {
obj = read_object(r_num, REAL);
obj_to_char(obj, ch);
}
if (IS_SET(ch->player.class, CLASS_RANGER)) {
ch->skills[SKILL_TRACK].learned = 13;
ch->skills[SKILL_DISARM].learned = 7;
}
if (IS_SET(ch->player.class, CLASS_THIEF)) {
ch->skills[SKILL_SNEAK].learned = 1;
ch->skills[SKILL_HIDE].learned = 13;
ch->skills[SKILL_STEAL].learned = 7;
ch->skills[SKILL_BACKSTAB].learned = 1;
ch->skills[SKILL_PICK_LOCK].learned = 1;
}
GET_HIT(ch) = GET_MAX_HIT(ch);
GET_MANA(ch) = GET_MAX_MANA(ch);
ch->points.max_move = GET_MAX_MOVE(ch);
GET_MOVE(ch) = GET_MAX_MOVE(ch);
GET_COND(ch, THIRST) = 24;
GET_COND(ch, FULL) = 24;
GET_COND(ch, DRUNK) = 0;
ch->player.time.played = 0;
ch->player.time.logon = time(0);
}
void do_advance(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *victim = NULL;
char name[100] = "\0\0\0\0\0\0\0";
char level[100] = "\0\0\0\0\0\0\0";
char class[100] = "\0\0\0\0\0\0\0";
int adv = 0;
int newlevel = 0;
int lin_class = 0;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (IS_NPC(ch))
return;
argument = one_argument(argument, name);
if (*name) {
if (!(victim = get_char_room_vis(ch, name))) {
cprintf(ch, "That player is not here.\r\n");
return;
}
} else {
cprintf(ch, "Advance who?\r\n");
return;
}
if (IS_NPC(victim)) {
cprintf(ch, "NO! Not on NPC's.\r\n");
return;
}
if (IS_IMMORTAL(victim)) {
cprintf(ch, "But they are already as powerful as you can imagine!\r\n");
return;
}
argument = one_argument(argument, class);
if (!*class) {
cprintf(ch, "Classes you may suply: [ M C W T R ]\r\n");
return;
}
switch (*class) {
case 'M':
case 'm':
lin_class = MAGE_LEVEL_IND;
break;
case 'T':
case 't':
lin_class = THIEF_LEVEL_IND;
break;
case 'W':
case 'w':
case 'F':
case 'f':
lin_class = WARRIOR_LEVEL_IND;
break;
case 'C':
case 'c':
case 'P':
case 'p':
lin_class = CLERIC_LEVEL_IND;
break;
case 'R':
case 'r':
lin_class = RANGER_LEVEL_IND;
break;
case 'D':
case 'd':
lin_class = DRUID_LEVEL_IND;
break;
default:
cprintf(ch, "Classes you may use [ M C W T R ]\r\n");
return;
break;
}
argument = one_argument(argument, level);
if (GET_LEVEL(victim, lin_class) == 0)
adv = 1;
else if (!*level) {
cprintf(ch, "You must supply a level number.\r\n");
return;
} else {
if (!isdigit(*level)) {
cprintf(ch, "Third argument must be a positive integer.\r\n");
return;
}
if ((newlevel = atoi(level)) < GET_LEVEL(victim, lin_class)) {
int i;
if ((i = GET_LEVEL(victim, lin_class) - newlevel) < 1) {
cprintf(ch, "Sorry, must leave them at level 1 at least!\r\n");
return;
}
for (; i > 0; i--)
drop_level(victim, lin_class);
set_title(victim);
return;
}
adv = newlevel - GET_LEVEL(victim, lin_class);
}
if (((adv + GET_LEVEL(victim, lin_class)) > 1) && (GetMaxLevel(ch) < IMPLEMENTOR)) {
cprintf(ch, "Thou art not godly enough.\r\n");
return;
}
if ((adv + GET_LEVEL(victim, lin_class)) > IMPLEMENTOR) {
cprintf(ch, "Implementor is the highest possible level.\r\n");
return;
}
if (((adv + GET_LEVEL(victim, lin_class)) < 1)
&& ((adv + GET_LEVEL(victim, lin_class)) != 1)) {
cprintf(ch, "1 is the lowest possible level.\r\n");
return;
}
cprintf(ch, "You feel generous.\r\n");
act("$n makes some strange gestures.\r\nA strange feeling comes upon you,"
"\r\nLike a giant hand, light comes down from\r\nabove, grabbing your "
"body, that begins\r\nto pulse with coloured lights from inside.\r\nYo"
"ur head seems to be filled with daemons\r\nfrom another plane as your"
" body dissolves\r\ninto the elements of time and space itself.\r\nSudde"
"nly a silent explosion of light snaps\r\nyou back to reality. You fee"
"l slightly\r\ndifferent.", FALSE, ch, 0, victim, TO_VICT);
if (GET_LEVEL(victim, lin_class) == 0) {
start_character(victim);
} else {
if (GET_LEVEL(victim, lin_class) < IMPLEMENTOR) {
int amount_needed,
amount_have;
amount_needed = titles[lin_class][GET_LEVEL(victim, lin_class) + adv].exp + 1;
amount_have = GET_EXP(victim);
gain_exp_regardless(victim, amount_needed - amount_have, lin_class);
cprintf(ch, "Character is now advanced.\r\n");
} else {
cprintf(victim, "Some idiot just tried to advance your level.\r\n");
cprintf(ch, "IMPOSSIBLE! IDIOTIC!\r\n");
}
}
}
void do_reroll(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *victim = NULL;
char buf[100] = "\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;
if (IS_IMMORTAL(ch)) {
only_argument(argument, buf);
if (!*buf)
cprintf(ch, "Who do you wish to reroll?\r\n");
else if (!(victim = get_char(buf)))
cprintf(ch, "No-one by that name in the world.\r\n");
else {
cprintf(ch, "Rerolled...\r\n");
roll_abilities(victim);
}
} else {
cprintf(ch, "You feel... different!\r\n");
roll_abilities(ch);
}
}
void do_restore_all(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);
do_restore(ch, "all", 0);
}
void restore_one_victim(struct char_data *victim)
{
int i = 0;
if (DEBUG > 1)
log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(victim));
GET_MANA(victim) = GET_MAX_MANA(victim);
if (!affected_by_spell(victim, SPELL_AID)) {
GET_HIT(victim) = GET_MAX_HIT(victim);
} else {
if (GET_HIT(victim) < GET_MAX_HIT(victim))
GET_HIT(victim) = GET_MAX_HIT(victim);
}
GET_MOVE(victim) = GET_MAX_MOVE(victim);
if (IS_NPC(victim))
return;
if (GetMaxLevel(victim) < LOW_IMMORTAL) {
GET_COND(victim, THIRST) = 24;
GET_COND(victim, FULL) = 24;
} else {
GET_COND(victim, THIRST) = -1;
GET_COND(victim, FULL) = -1;
}
if (GetMaxLevel(victim) >= CREATOR) {
if (GetMaxLevel(victim) >= LOKI) {
for (i = 0; i < MAX_SKILLS; i++) {
victim->skills[i].learned = 100;
victim->skills[i].recognise = TRUE;
}
victim->abilities.str_add = 100;
victim->abilities.intel = 25;
victim->abilities.wis = 25;
victim->abilities.dex = 25;
victim->abilities.str = 25;
victim->abilities.con = 25;
victim->tmpabilities = victim->abilities;
} else
for (i = 0; i < MAX_SKILLS; i++) {
victim->skills[i].learned = number(50, 100);
victim->skills[i].recognise = TRUE;
}
if (GetMaxLevel(victim) >= LOKI) {
if ((strcasecmp(GET_NAME(victim), "Quixadhal"))) {
int x = 0;
cprintf(victim, "Fool! You DARE challenge the Dread Lord?\r\n");
for (x = 0; x < ABS_MAX_CLASS; x++)
if (HasClass(victim, 1 << x))
GET_LEVEL(victim, x) = LOW_IMMORTAL;
save_char(victim, NOWHERE);
}
}
}
update_pos(victim);
}
void do_restore(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *victim = NULL;
struct descriptor_data *i = NULL;
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);
only_argument(argument, buf);
if (!*buf) {
cprintf(ch, "Who do you wish to restore?\r\n");
} else if (!strcasecmp(buf, "all")) {
for (i = descriptor_list; i; i = i->next) {
if ( /* i->character != ch && */ !i->connected &&
i->character != board_kludge_char) {
victim = i->character;
restore_one_victim(victim);
if (INVIS_LEVEL(victim) < GetMaxLevel(ch))
cprintf(ch, "%s restored.\r\n", GET_NAME(victim));
act("You have been fully healed by $N!", FALSE, victim, 0, ch, TO_CHAR);
}
}
} else if (GetMaxLevel(ch) < GOD) {
cprintf(ch, "You have not the power to restore a single mortal!\r\n");
} else if (!(victim = get_char(buf))) {
cprintf(ch, "No-one by that name in the world.\r\n");
} else {
restore_one_victim(victim);
if (INVIS_LEVEL(victim) < GetMaxLevel(ch))
cprintf(ch, "%s restored.\r\n", GET_NAME(victim));
act("You have been fully healed by $N!", FALSE, victim, 0, ch, TO_CHAR);
}
}
void do_show_logs(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.act, PLR_LOGS)) {
cprintf(ch, "You will no longer recieve the logs to your screen.\r\n");
REMOVE_BIT(ch->specials.act, PLR_LOGS);
return;
} else {
cprintf(ch, "You WILL recieve the logs to your screen.\r\n");
SET_BIT(ch->specials.act, PLR_LOGS);
return;
}
}
void do_noshout(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *vict = NULL;
struct obj_data *dummy = NULL;
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 || IS_MORTAL(ch))
if (IS_SET(ch->specials.act, PLR_NOSHOUT)) {
cprintf(ch, "You can now hear shouts again.\r\n");
REMOVE_BIT(ch->specials.act, PLR_NOSHOUT);
} else {
cprintf(ch, "From now on, you won't hear shouts.\r\n");
SET_BIT(ch->specials.act, PLR_NOSHOUT);
} else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
cprintf(ch, "Couldn't find any such creature.\r\n");
else if (IS_NPC(vict))
cprintf(ch, "Can't do that to a beast.\r\n");
else if (GetMaxLevel(vict) >= GetMaxLevel(ch))
act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR);
else if (IS_SET(vict->specials.act, PLR_NOSHOUT) && (GetMaxLevel(ch) >= SAINT)) {
cprintf(vict, "You can shout again.\r\n");
cprintf(ch, "NOSHOUT removed.\r\n");
REMOVE_BIT(vict->specials.act, PLR_NOSHOUT);
} else if (GetMaxLevel(ch) >= SAINT) {
cprintf(vict, "The gods take away your ability to shout!\r\n");
cprintf(ch, "NOSHOUT set.\r\n");
SET_BIT(vict->specials.act, PLR_NOSHOUT);
} else {
cprintf(ch, "Sorry, you can't do that\r\n");
}
}
void do_pager(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.act, PLR_PAGER)) {
cprintf(ch, "You stop using the Wiley Pager.\r\n");
REMOVE_BIT(ch->specials.act, PLR_PAGER);
} else {
cprintf(ch, "You now USE the Wiley Pager.\r\n");
SET_BIT(ch->specials.act, PLR_PAGER);
}
}
void do_nohassle(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *vict = NULL;
struct obj_data *dummy = NULL;
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_NOHASSLE)) {
cprintf(ch, "You can now be hassled again.\r\n");
REMOVE_BIT(ch->specials.act, PLR_NOHASSLE);
} else {
cprintf(ch, "From now on, you won't be hassled.\r\n");
SET_BIT(ch->specials.act, PLR_NOHASSLE);
} else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
cprintf(ch, "Couldn't find any such creature.\r\n");
else if (IS_NPC(vict))
cprintf(ch, "Can't do that to a beast.\r\n");
else if (GetMaxLevel(vict) > GetMaxLevel(ch))
act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR);
else
cprintf(ch, "The implementor won't let you set this on mortals...\r\n");
}
void do_stealth(struct char_data *ch, const char *argument, int cmd)
{
struct char_data *vict = NULL;
struct obj_data *dummy = NULL;
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_STEALTH)) {
cprintf(ch, "STEALTH mode OFF.\r\n");
REMOVE_BIT(ch->specials.act, PLR_STEALTH);
} else {
cprintf(ch, "STEALTH mode ON.\r\n");
SET_BIT(ch->specials.act, PLR_STEALTH);
} else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
cprintf(ch, "Couldn't find any such creature.\r\n");
else if (IS_NPC(vict))
cprintf(ch, "Can't do that to a beast.\r\n");
else if (GetMaxLevel(vict) > GetMaxLevel(ch))
act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR);
else
cprintf(ch, "The implementor won't let you set this on mortals...\r\n");
}
static void print_room(int rnum, struct room_data *rp, struct string_block *sb)
{
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
int dink = 0;
int bits = 0;
int scan = 0;
if (DEBUG > 2)
log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
(size_t) sb);
sprintf(buf, "%5d %4d %-12s %s", rp->number, rnum, sector_types[rp->sector_type], rp->name);
strcat(buf, " [");
dink = 0;
for (bits = rp->room_flags, scan = 0; bits; scan++) {
if (bits & (1 << scan)) {
if (dink)
strcat(buf, " ");
strcat(buf, room_bits[scan]);
dink = 1;
bits ^= (1 << scan);
}
}
strcat(buf, "]\r\n");
append_to_string_block(sb, buf);
}
static void print_death_room(int rnum, struct room_data *rp, struct string_block *sb)
{
if (DEBUG > 2)
log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
(size_t) sb);
if (rp && rp->room_flags & DEATH)
print_room(rnum, rp, sb);
}
static void print_private_room(int rnum, struct room_data *rp, struct string_block *sb)
{
if (DEBUG > 2)
log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
(size_t) sb);
if (rp && rp->room_flags & PRIVATE)
print_room(rnum, rp, sb);
}
static void show_room_zone(int rnum, struct room_data *rp, struct show_room_zone_struct *srzs)
{
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
if (DEBUG > 2)
log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
(size_t) srzs);
if (!rp || rp->number < srzs->bottom || rp->number > srzs->top)
return; /* optimize later */
if (srzs->blank && (srzs->lastblank + 1 != rp->number)) {
sprintf(buf, "rooms %d-%d are blank\r\n", srzs->startblank, srzs->lastblank);
append_to_string_block(srzs->sb, buf);
srzs->blank = 0;
}
if (1 == sscanf(rp->name, "%d", &srzs->lastblank) && srzs->lastblank == rp->number) {
if (!srzs->blank) {
srzs->startblank = srzs->lastblank;
srzs->blank = 1;
}
return;
} else if (srzs->blank) {
sprintf(buf, "rooms %d-%d are blank\r\n", srzs->startblank, srzs->lastblank);
append_to_string_block(srzs->sb, buf);
srzs->blank = 0;
}
print_room(rnum, rp, srzs->sb);
}
void do_show(struct char_data *ch, const char *argument, int cmd)
{
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
char zonenum[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int zone = 0;
int bottom = 0;
int top = 0;
int topi = 0;
struct index_data *which_i = NULL;
struct string_block sb;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (IS_NPC(ch))
return;
argument = one_argument(argument, buf);
init_string_block(&sb);
if (is_abbrev(buf, "zones")) {
struct zone_data *zd = NULL;
int zone_bottom = 0;
sprintf(buf,
"# Zone name lifespan age rooms reset\r\n");
append_to_string_block(&sb, buf);
for (zone = 0; zone <= top_of_zone_table; zone++) {
const char *mode = NULL;
zd = zone_table + zone;
switch (zd->reset_mode) {
case 0:
mode = "never";
break;
case 1:
mode = "ifempty";
break;
case 2:
mode = "always";
break;
default:
mode = "!unknown!";
break;
}
sprintf(buf, "%4d %-40s %4dm %4dm %6d-%-6d %s\r\n", zone, zd->name,
zd->lifespan, zd->age, zone_bottom, zd->top, mode);
append_to_string_block(&sb, buf);
zone_bottom = zd->top + 1;
}
} else if ((is_abbrev(buf, "objects") &&
(which_i = obj_index, topi = top_of_objt)) ||
(is_abbrev(buf, "mobiles") && (which_i = mob_index, topi = top_of_mobt))) {
int objn;
struct index_data *oi;
only_argument(argument, zonenum);
zone = -1;
if (1 == sscanf(zonenum, "%i", &zone) && (zone < 0 || zone > top_of_zone_table)) {
sprintf(buf, "That is not a valid zone_number\r\n");
append_to_string_block(&sb, buf);
return;
}
if (zone >= 0) {
bottom = zone ? (zone_table[zone - 1].top + 1) : 0;
top = zone_table[zone].top;
}
sprintf(buf, "%5s %4s %5s %-40s %-16s %s\r\n", "VNUM", "rnum", "count", "names",
"distance", "room");
append_to_string_block(&sb, buf);
for (objn = 0; objn <= topi; objn++) {
struct char_data *target_mob = NULL;
struct room_data *target_room = NULL;
char tbuf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
oi = which_i + objn;
if ((zone >= 0 && (oi->virtual < bottom || oi->virtual > top)) ||
(zone < 0 && !isname(zonenum, oi->name)))
continue; /* optimize later */
target_mob = get_char_vis_world(ch, oi->name, NULL);
if (target_mob)
target_room = real_roomp(target_mob->in_room);
if (target_mob && target_room)
sprintf(tbuf, "[#%5d] %s", target_mob->in_room, target_room->name);
sprintf(buf, "%5d %4d %5d %-40s %-16s %s\r\n", oi->virtual, objn, oi->number,
oi->name, target_mob ? track_distance(ch, oi->name) : "",
target_room ? tbuf : "");
append_to_string_block(&sb, buf);
}
} else if (is_abbrev(buf, "rooms")) {
only_argument(argument, zonenum);
sprintf(buf, "VNUM rnum type name [BITS]\r\n");
append_to_string_block(&sb, buf);
if (is_abbrev(zonenum, "death")) {
hash_iterate(&room_db, (funcp)print_death_room, &sb);
} else if (is_abbrev(zonenum, "private")) {
hash_iterate(&room_db, (funcp)print_private_room, &sb);
} else if (1 != sscanf(zonenum, "%i", &zone) || zone < 0 || zone > top_of_zone_table) {
sprintf(buf, "I need a zone number with this command\r\n");
append_to_string_block(&sb, buf);
} else {
struct show_room_zone_struct srzs;
srzs.bottom = zone ? (zone_table[zone - 1].top + 1) : 0;
srzs.top = zone_table[zone].top;
srzs.blank = 0;
srzs.sb = &sb;
hash_iterate(&room_db, (funcp)show_room_zone, &srzs);
if (srzs.blank) {
sprintf(buf, "rooms %d-%d are blank\r\n", srzs.startblank, srzs.lastblank);
append_to_string_block(&sb, buf);
srzs.blank = 0;
}
}
} else {
sprintf(buf, "Usage:\r\n"
" show zones\r\n"
" show (objects|mobiles) (zone#|name)\r\n"
" show rooms (zone#|death|private)\r\n");
append_to_string_block(&sb, buf);
}
page_string_block(&sb, ch);
destroy_string_block(&sb);
}
void do_debug(struct char_data *ch, const char *argument, int cmd)
{
char arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int level = 0;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
one_argument(argument, arg);
if (!*arg) {
if (DEBUG) {
DEBUG = FALSE;
cprintf(ch, "Debug is now off.\r\n");
} else {
DEBUG = TRUE;
cprintf(ch, "Debug is now on.\r\n");
}
} else if (!strcasecmp(arg, "on")) {
DEBUG = TRUE;
cprintf(ch, "Debug is now on.\r\n");
} else if (!strcasecmp(arg, "off")) {
DEBUG = FALSE;
cprintf(ch, "Debug is now off.\r\n");
} else if (scan_number(arg, &level)) {
if (level <= 0) {
DEBUG = FALSE;
cprintf(ch, "Debug is now off.\r\n");
} else {
DEBUG = level;
cprintf(ch, "Debug set to %d\r\n", DEBUG);
}
} else {
cprintf(ch, "Usage: debug [on|off|<level>]\r\n");
}
return;
}
void do_invis(struct char_data *ch, const char *argument, int cmd)
{
int level = 0;
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
VNULL(argument), cmd);
if (scan_number(argument, &level)) {
if (level <= 0)
level = 0;
else {
if (level >= GetMaxLevel(ch)) {
cprintf(ch, "Sorry, you cant invis that high yet!\r\n");
return;
}
}
ch->invis_level = level;
cprintf(ch, "Invis level set to %d.\r\n", level);
} else {
if (ch->invis_level > 0) {
ch->invis_level = 0;
cprintf(ch, "You are now totally VISIBLE.\r\n");
} else {
ch->invis_level = GetMaxLevel(ch) - 1;
cprintf(ch, "You are now invisible to level %d.\r\n", GetMaxLevel(ch) - 1);
}
}
}
void do_reset(struct char_data *ch, const char *argument, int cmd)
{
int start = 0;
int finish = 0;
int i = 0;
struct room_data *rp = NULL;
char start_level[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char finish_level[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;
argument = one_argument(argument, start_level);
if (!strcasecmp(start_level, "all")) {
start = 0;
finish = top_of_zone_table;
} else if (*start_level) {
start = atoi(start_level);
if (start < 0)
start = 0;
if (start > top_of_zone_table)
start = top_of_zone_table;
argument = one_argument(argument, finish_level);
if (*finish_level) {
finish = atoi(finish_level);
if (finish < start)
finish = start;
if (finish > top_of_zone_table)
finish = top_of_zone_table;
} else {
finish = start;
}
} else {
if ((rp = real_roomp(ch->in_room))) {
start = finish = rp->zone;
} else {
return;
}
}
for (i = start; i <= finish; i++) {
if (zone_table[i].reset_mode) {
reset_zone(i);
}
}
if (start != finish) {
cprintf(ch, "You have reset Zones %d through %d.\r\n", start, finish);
log_reset("Reset of Zones [#%d] to [#%d] by %s.", start, finish, GET_NAME(ch));
} else {
cprintf(ch, "You have reset Zone %d.\r\n", start);
log_reset("Reset of Zone [#%d] by %s.", start, GET_NAME(ch));
}
}
static void zone_purge_effect(int rnum, struct room_data *rp, int *zones)
{
struct char_data *vict = NULL;
struct char_data *next_v = NULL;
struct obj_data *obj = NULL;
struct obj_data *next_o = NULL;
if (DEBUG > 2)
log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
(size_t) zones);
if (!rp || rp->zone < zones[0] || rp->zone > zones[1])
return;
rprintf(rnum, "Flames shoot skyward all around you, and it grows quiet.\r\n");
for (vict = rp->people; vict; vict = next_v) {
next_v = vict->next_in_room;
if (IS_NPC(vict) && (!IS_SET(vict->specials.act, ACT_POLYSELF)))
extract_char(vict);
}
for (obj = rp->contents; obj; obj = next_o) {
next_o = obj->next_content;
extract_obj(obj);
}
}
void do_zone_purge(struct char_data *ch, const char *argument, int cmd)
{
int zones[2];
struct room_data *rp = NULL;
char start_level[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char finish_level[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;
argument = one_argument(argument, start_level);
if (!strcasecmp(start_level, "all")) {
zones[0] = 0;
zones[1] = top_of_zone_table;
} else if (*start_level) {
zones[0] = atoi(start_level);
if (zones[0] < 0)
zones[0] = 0;
if (zones[0] > top_of_zone_table)
zones[0] = top_of_zone_table;
argument = one_argument(argument, finish_level);
if (*finish_level) {
zones[1] = atoi(finish_level);
if (zones[1] < zones[0])
zones[1] = zones[0];
if (zones[1] > top_of_zone_table)
zones[1] = top_of_zone_table;
} else {
zones[1] = zones[0];
}
} else {
if ((rp = real_roomp(ch->in_room))) {
zones[0] = zones[1] = rp->zone;
} else {
return;
}
}
hash_iterate(&room_db, (funcp)zone_purge_effect, zones);
if (zones[0] != zones[1]) {
cprintf(ch, "You have cleaned Zones %d through %d.\r\n", zones[0], zones[1]);
log_reset("Purge of Zones [#%d] to [#%d] by %s.", zones[0], zones[1], GET_NAME(ch));
} else {
cprintf(ch, "You have cleaned Zone %d.\r\n", zones[0]);
log_reset("Purge of Zone [#%d] by %s.", zones[0], GET_NAME(ch));
}
}
void do_not_yet_implemented(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, "This command is not yet implemented.\r\n");
}
void do_setreboot(struct char_data *ch, const char *argument, int cmd)
{
FILE *pfd = NULL;
int first = 0;
int second = 0;
char first_str[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char second_str[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;
argument = one_argument(argument, first_str);
if (*first_str) {
first = atoi(first_str);
if (first < 0)
first = 0;
argument = one_argument(argument, second_str);
if (*second_str) {
second = atoi(second_str);
if (second < 0)
second = 0;
if (second > 59)
second = 59;
} else {
second = first;
}
} else {
first = 23;
second = 0;
}
if (first > 0) {
REBOOT_HOUR = first;
REBOOT_MIN = second;
REBOOT_FREQ = (REBOOT_HOUR * 60 * 60 ) + (REBOOT_MIN * 60);
REBOOT_LASTCHECK = time(0);
REBOOT_LEFT = REBOOT_FREQ;
if (!(pfd = fopen(REBOOTTIME_FILE, "w"))) {
log_info("Cannot save reboot times!");
} else {
fprintf(pfd, "%d %d\n", REBOOT_HOUR, REBOOT_MIN);
FCLOSE(pfd);
}
cprintf(ch, "You have set the reboot frequency to %2d hours and %2d minutes.\r\n", REBOOT_HOUR, REBOOT_MIN);
log_info("Reboot frequency set to %2d hours and %2d minutes by %s.\r\n", REBOOT_HOUR, REBOOT_MIN, GET_NAME(ch));
} else {
if (!(pfd = fopen(REBOOTTIME_FILE, "w"))) {
log_info("Cannot save reboot times!");
} else {
fprintf(pfd, "%d %d\n", 0, 0);
FCLOSE(pfd);
}
}
}