/* ************************************************************************
* File: act.wizard2.c Part of CircleMUD *
* Usage: Player-level god commands and other goodies *
* *
* All rights reserved. See license.doc for complete information. *
* *
* Copyright (C) 1993 by the Trustees of the Johns Hopkins University *
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
************************************************************************ */
/* Archipelago changes by Alastair J. Neil Copyright (C) 1993, 94, 95, 96 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "spells.h"
#include "limits.h"
#include "screen.h"
#include "shop.h"
/* external vars */
extern struct time_info_data time_info; /* In db.c */
extern FILE *player_fl;
extern struct room_data *world;
extern struct char_data *character_list;
extern struct obj_data *object_list;
extern struct descriptor_data *descriptor_list;
extern struct index_data *mob_index;
extern struct index_data *obj_index;
extern struct int_app_type int_app[36];
extern struct wis_app_type wis_app[36];
extern struct zone_data *zone_table;
extern struct player_index_element *player_table;
extern struct obj_limit_list_type *obj_limit_table;
extern struct obj_data *obj_proto;
extern struct char_data *mob_proto;
extern struct shop_data *shop_index;
extern struct event_type *events[];
extern int number_of_shops;
extern int top_of_zone_table;
extern int restrict;
extern int top_of_world;
extern int top_of_mobt;
extern int top_of_objt;
extern int top_of_p_table;
extern int top_of_ol_table;
/* for objects */
extern char *item_types[];
extern char *wear_bits[];
extern char *extra_bits[];
extern char *drinks[];
/* for rooms */
extern char *dirs[];
extern char *room_bits[];
extern char *exit_bits[];
extern char *sector_types[];
/* for chars */
extern char *spells[];
extern char *equipment_types[];
extern char *affected_bits[];
extern char *apply_types[];
extern char *pc_race_types[];
extern char *npc_class_types[];
extern char *action_bits[];
extern char *player_bits[];
extern char *preference_bits[];
extern char *position_types[];
extern char *connected_types[];
extern char *where[];
/* external functs */
void reset_zone(int zone);
void parse_text(struct char_data *c,struct char_data *vict, int mode, char *text);
void do_stat_room(struct char_data *ch);
void do_stat_character(struct char_data *ch, struct char_data *vict);
void do_stat_object(struct char_data *ch, struct obj_data *vict);
void do_stat_shop(struct char_data *ch, struct shop_data *shop);
int report_money_weight(int amount);
int save_zone(int zone);
int save_mobiles(int zone);
int save_objects(int zone);
int save_rooms(int zone);
bool is_maxed(int num, int mode);
void drop_excess_gold(struct char_data *ch, int amount);
int load_char_bynum(int player_i, struct char_file_u *char_element);
ACMD(do_look);
int is_goditem(struct obj_data *j);
ACMD(do_stat)
{
struct char_data *victim = 0;
struct obj_data *object = 0;
struct char_file_u tmp_store;
int num = -1;
if (IS_NPC(ch))
return;
half_chop(argument, buf1, buf2);
if (!*buf1) {
send_to_char("Stats on who or what?\r\n", ch);
return;
} else if (is_abbrev(buf1, "room")) {
do_stat_room(ch);
}
else if (is_abbrev(buf1, "mob")) {
if (!*buf2) {
send_to_char("Stats on which mobile?\r\n", ch);
} else {
if ((victim = get_char_vis(ch, buf2)))
do_stat_character(ch, victim);
else
send_to_char("No such mobile around.\r\n", ch);
}
}
else if (is_abbrev(buf1, "player")) {
if (!*buf2) {
send_to_char("Stats on which player?\r\n", ch);
} else {
if ((victim = get_player_vis(ch, buf2)))
do_stat_character(ch, victim);
else
send_to_char("No such player around.\r\n", ch);
}
} else if (is_abbrev(buf1, "file")) {
if (!*buf2) {
send_to_char("Stats on which player?\r\n", ch);
} else {
CREATE(victim, struct char_data, 1);
clear_char(victim);
if (is_number(buf)){
num = atoi(buf2);
load_char_bynum(num, &tmp_store);
}
else
num = load_char(buf2, &tmp_store);
if(num > -1) {
store_to_char(&tmp_store, victim);
if (GET_LEVEL(victim) > GET_LEVEL(ch))
send_to_char("Sorry, you can't do that.\r\n", ch);
else
do_stat_character(ch, victim);
if (GET_LEVEL(ch) >= LEVEL_IMPL) {
sprintf(buf, "Encrypted Password: %s\r\n", tmp_store.pwd);
send_to_char(buf,ch);
}
free_char(victim);
} else {
send_to_char("There is no such player.\r\n", ch);
free(victim);
}
}
} else if (is_abbrev(buf1, "object")) {
if (!*buf2) {
send_to_char("Stats on which object?\r\n", ch);
} else {
if ((object = get_obj_vis(ch, buf2)))
do_stat_object(ch, object);
else
send_to_char("No such object around.\r\n", ch);
}
} else {
if ((victim = get_char_vis(ch, buf1)))
do_stat_character(ch, victim);
else if ((object = get_obj_vis(ch, buf1)))
do_stat_object(ch, object);
else
send_to_char("Nothing around by that name.\r\n", ch);
}
}
ACMD(do_shutdown)
{
extern int circle_shutdown, circle_reboot;
int time;
int i;
struct event_type *tmp;
if (IS_NPC(ch))
return;
if (subcmd != SCMD_SHUTDOWN) {
send_to_char("If you want to shut something down, say so!\r\n", ch);
return;
}
half_chop(argument, arg, buf1);
if ((time = atoi(buf1)) <= 0)
time = 1;
if (!*arg) {
sprintf(buf, "\007\007(GC) Shutdown by %s in %d %s.", GET_NAME(ch), time, ((time == 1) ? "minute" : "minutes"));
send_to_all(buf);
logg(buf);
add_event(250, EVENT_REBOOT, time, 0,0,0,"",ch,0);
}
else if (!str_cmp(arg, "reboot")) {
sprintf(buf, "\007\007(GC) Reboot by %s in %d %s.", GET_NAME(ch), time,
((time == 1) ? "minute" : "minutes"));
send_to_all(buf);
logg(buf);
add_event(250, EVENT_REBOOT, time, 1,0,0,"",ch,0);
system("touch ../.fastboot");
}
else if (!str_cmp(arg, "die")) {
sprintf(buf, "\007\007(GC) Shutdown by %s in %d %s.", GET_NAME(ch), time,
((time == 1) ? "minute" : "minutes"));
send_to_all(buf);
logg(buf);
add_event(250, EVENT_REBOOT, time, 0,0,0,"",ch,0);
system("touch ../.killscript");
}
else if (!str_cmp(arg, "pause")) {
sprintf(buf, "\007\007(GC) Shutdown by %s in %d %s.", GET_NAME(ch), time,((time == 1) ? "minute" : "minutes"));
send_to_all(buf);
logg(buf);
system("touch ../pause");
add_event(250, EVENT_REBOOT, time, 0,0,0,"",ch,0);
}
else if (!str_cmp(arg, "cancel")) {
sprintf(buf, "\007\007(GC) Shutdown cancelled by %s.", GET_NAME(ch));
send_to_all(buf);
logg(buf);
for (i=0;i< 300; i++)
if ((tmp = events[i]) != NULL)
while(tmp){
if(tmp->event == EVENT_REBOOT)
tmp->event = EVENT_IGNORE;
tmp = tmp->next;
}
}
else
send_to_char("Unknown shutdown option.\r\n", ch);
}
ACMD(do_snoop)
{
struct char_data *victim;
if (!ch->desc)
return;
one_argument(argument, arg);
if (!*arg) {
send_to_char("Snoop who?\r\n", ch);
return;
}
if (!(victim = get_char_vis(ch, arg))) {
send_to_char("No such person around.\r\n", ch);
return;
}
if (!victim->desc) {
send_to_char("There's no link.. nothing to snoop.\r\n", ch);
return;
}
if (victim == ch) {
send_to_char("Ok, you just snoop yourself.\r\n", ch);
if (ch->desc->snoop.snooping) {
if (ch->desc->snoop.snooping->desc)
ch->desc->snoop.snooping->desc->snoop.snoop_by = 0;
ch->desc->snoop.snooping = 0;
}
return;
}
if (victim->desc->snoop.snoop_by) {
send_to_char("Busy already. \r\n", ch);
return;
}
if (GET_LEVEL(victim) >= GET_LEVEL(ch)) {
send_to_char("You failed.\r\n", ch);
return;
}
send_to_char("Ok. \r\n", ch);
if (ch->desc->snoop.snooping)
ch->desc->snoop.snooping->desc->snoop.snoop_by = 0;
ch->desc->snoop.snooping = victim;
victim->desc->snoop.snoop_by = ch;
if (GET_LEVEL(ch) < LEVEL_IMPL){
sprintf(buf, "(GC) %s started snooping %s",GET_NAME(ch),GET_NAME(victim));
mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE);
}
return;
}
ACMD(do_switch)
{
struct char_data *victim;
/* if (IS_NPC(ch))
return; */
one_argument(argument, arg);
if (!*arg) {
send_to_char("Switch with who?\r\n", ch);
} else {
if (!(victim = get_char(arg)))
send_to_char("They aren't here.\r\n", ch);
else {
if (ch == victim) {
send_to_char("He he he... We are jolly funny today, eh?\r\n", ch);
return;
}
if (GET_LEVEL(ch) <= GET_LEVEL(victim)){
send_to_char("He he he... Nice try!\r\n",ch);
return;}
if (!ch->desc || ch->desc->snoop.snoop_by || ch->desc->snoop.snooping) {
send_to_char("Mixing snoop & switch is bad for your health.\r\n", ch);
return;
}
if (victim->desc) {
send_to_char("You can't do that, the body is already in use!\r\n", ch);
} else {
send_to_char("Ok.\r\n", ch);
ch->desc->character = victim;
ch->desc->original = ch;
victim->desc = ch->desc;
ch->desc = 0;
if(GET_LEVEL(ch) < LEVEL_IMPL && GET_LEVEL(victim) < LEVEL_BUILDER){
sprintf(buf, "(GC) %s switched into %s", GET_NAME(ch),GET_NAME(victim));
mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE);
}
}
}
}
}
ACMD(do_return)
{
if (!ch->desc)
return;
if (!ch->desc->original) {
send_to_char("Yeah, right...\r\n", ch);
return;
} else {
send_to_char("You return to your original body.\r\n", ch);
ch->desc->character = ch->desc->original;
ch->desc->original = 0;
ch->desc->character->desc = ch->desc;
ch->desc = 0;
}
}
ACMD(do_load)
{
struct char_data *mob;
struct obj_data *obj;
int number, r_num;
if (IS_NPC(ch))
return;
argument_interpreter(argument, buf, buf2);
if (!*buf || !*buf2 || !isdigit(*buf2)) {
send_to_char("Usage: load { obj | mob } <number>\r\n", ch);
return;
}
if ((number = atoi(buf2)) < 0) {
send_to_char("A NEGATIVE number??\r\n", ch);
return;
}
if (is_abbrev(buf, "mob")) {
if ((r_num = real_mobile(number)) < 0) {
send_to_char("There is no monster with that number.\r\n", ch);
return;
}
mob = read_mobile(r_num, REAL);
char_to_room(mob, ch->in_room, FALSE);
act("$n makes a quaint, magical gesture with one hand.", TRUE, ch,
0, 0, TO_ROOM);
act("$n has created $N!", FALSE, ch, 0, mob, TO_ROOM);
act("You create $N.", FALSE, ch, 0, mob, TO_CHAR);
} else if (is_abbrev(buf, "obj")) {
if ((r_num = real_object(number)) < 0) {
send_to_char("There is no object with that number.\r\n", ch);
return;
}
obj = read_object(r_num, REAL, GET_LEVEL(ch) == LEVEL_IMPL);
if ((GET_LEVEL(ch) != LEVEL_IMPL) && (obj->obj_flags.value[6] > 0) &&
is_maxed(r_num, REAL)){
extract_obj(obj,1);
send_to_char("Sorry That object is maxed\r\n",ch);
return;}
if ((GET_LEVEL(ch) < LEVEL_GOD)
&& ((!IS_SET(obj->obj_flags.extra_flags, ITEM_TEST_ONLY))))
SET_BIT(obj->obj_flags.extra_flags, ITEM_TEST_ONLY);
obj_to_char(obj, ch, 0);
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 create $p.", FALSE, ch, obj, 0, TO_CHAR);
} else
send_to_char("That'll have to be either 'obj' or 'mob'.\r\n", ch);
}
ACMD(do_vstat)
{
struct char_data *mob;
struct obj_data *obj;
int number, r_num, i;
if (IS_NPC(ch))
return;
argument_interpreter(argument, buf, buf2);
if (!*buf || !*buf2 || !isdigit(*buf2)) {
send_to_char("Usage: vstat { obj | mob } <number>\r\n", ch);
return;
}
if ((number = atoi(buf2)) < 0) {
send_to_char("A NEGATIVE number??\r\n", ch);
return;
}
if (is_abbrev(buf, "mob")) {
if ((r_num = real_mobile(number)) < 0) {
send_to_char("There is no monster with that number.\r\n", ch);
return;
}
mob = read_mobile(r_num, REAL);
do_stat_character(ch, mob);
char_to_room(mob,0, FALSE);
extract_char(mob,FALSE);
}
else if (is_abbrev(buf, "obj")) {
if ((r_num = real_object(number)) < 0) {
send_to_char("There is no object with that number.\r\n", ch);
return;
}
obj = read_object(r_num, REAL,0);
do_stat_object(ch, obj);
extract_obj(obj,0);
}
else if (is_abbrev(buf, "shop")) {
if ((r_num = real_shop(number)) < 0) {
send_to_char("There is no shop with that number.\r\n", ch);
return;
}
do_stat_shop(ch, &shop_index[r_num]);
}
else
send_to_char("That'll have to be either 'obj' or 'mob' or 'shop'.\r\n", ch);
}
/* clean a room of all mobiles and objects */
ACMD(do_purge)
{
struct char_data *vict, *next_v;
struct obj_data *obj, *next_o;
if (IS_NPC(ch))
return;
one_argument(argument, buf);
if (*buf) /* argument supplied. destroy single object or char */ {
if ((vict = get_char_room_vis(ch, buf))) {
if (!IS_NPC(vict) && (GET_LEVEL(ch) <= GET_LEVEL(vict))) {
send_to_char("Fuuuuuuuuu!\r\n", ch);
return;
}
act("$n disintegrates $N.", FALSE, ch, 0, vict, TO_NOTVICT);
act("You disintegrate $N.", FALSE, ch, 0, vict, TO_CHAR);
if (IS_NPC(vict)) {
extract_char(vict, FALSE);
} else {
sprintf(buf, "(GC) %s has purged %s.", GET_NAME(ch), GET_NAME(vict));
mudlog(buf, BRF, LEVEL_GOD, TRUE);
if (vict->desc) {
close_socket(vict->desc);
vict->desc = 0;
}
extract_char(vict, TRUE);
}
} else if ((obj = get_obj_in_list_vis(ch, buf, world[ch->in_room].contents))) {
act("$n destroys $p.", FALSE, ch, obj, 0, TO_ROOM);
act("You destroy $p.", FALSE, ch, obj, 0, TO_CHAR);
extract_obj(obj,0);
} else {
send_to_char("I don't know anyone or anything by that name.\r\n", ch);
return;
}
} else { /* no argument. clean out the room */
if (IS_NPC(ch)) {
send_to_char("Don't... You would only kill yourself..\r\n", ch);
return;
}
act("$n gestures... You are surrounded by scorching flames!",
FALSE, ch, 0, 0, TO_ROOM);
send_to_room("The world seems a little cleaner.\r\n", ch->in_room, FALSE);
for (vict = world[ch->in_room].people; vict; vict = next_v) {
next_v = vict->next_in_room;
if (IS_NPC(vict))
extract_char(vict, FALSE);
}
for (obj = world[ch->in_room].contents; obj; obj = next_o) {
next_o = obj->next_content;
extract_obj(obj,0);
}
}
}
void do_start(struct char_data *ch)
{
void advance_level(struct char_data *ch);
struct obj_data *obj, *scabb;
int rnum;
GET_LEVEL(ch) = 1;
GET_SUB_LEVEL(ch) = 0;
GET_EXP(ch) = 750;
set_title(ch);
ch->points.max_hit = (2*GET_STR(ch) + 6*GET_CON(ch))/10;
ch->points.max_hit += 15;
ch->points.max_move = (GET_STR(ch) + GET_DEX(ch) + GET_CON(ch))*10/5;
SPELLS_TO_LEARN(ch) = (number(1, GET_RAW_LUC(ch))*(number(1,3)));
advance_level(ch);
ch->specials2.edit_zone = -1;
GET_HIT(ch) = GET_MAX_HIT(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);
/* give him/her some equipment */
if (!ch->equipment[WEAR_BODY]){
rnum = real_object(2036); /* jacket */
obj = read_object(rnum, REAL,0);
obj->obj_flags.value[5] = GET_SIZE(ch);
equip_char(ch, obj, WEAR_BODY);
}
if (!ch->equipment[WEAR_HEAD]){
rnum = real_object(2037); /* cap */
obj = read_object(rnum, REAL,0);
obj->obj_flags.value[5] = GET_SIZE(ch);
equip_char(ch, obj, WEAR_HEAD);
}
if (!ch->equipment[WEAR_SHIELD]){
rnum = real_object(2038); /* shield */
obj = read_object(rnum, REAL,0);
obj->obj_flags.value[5] = GET_SIZE(ch);
equip_char(ch, obj, WEAR_SHIELD);
}
if (!ch->equipment[WEAR_SCABBARD]){
rnum = real_object(2029); /* scabbard */
obj = read_object(rnum, REAL,0);
scabb = obj;
obj->obj_flags.value[5] = GET_SIZE(ch);
rnum = real_object(2017); /* sword */
obj = read_object(rnum, REAL,0);
obj->obj_flags.value[5] = GET_SIZE(ch);
obj_to_obj(obj,scabb);
equip_char(ch, scabb, WEAR_SCABBARD);
}
rnum = real_object(2013); /* bread */
obj = read_object(rnum, REAL,0);
obj_to_char(obj,ch,1);
obj = read_object(rnum, REAL,0);
obj_to_char(obj,ch,1);
}
ACMD(do_advance)
{
struct char_data *victim;
char name[100], level[100];
int adv,newlevel;
void gain_exp(struct char_data *ch, int gain,int mode);
if (IS_NPC(ch))
return;
half_chop(argument, name, buf);
one_argument(buf, level);
if (*name) {
if (!(victim = get_char_vis(ch, name))) {
send_to_char("That player is not here.\r\n", ch);
return;
}
} else {
send_to_char("Advance who?\r\n", ch);
return;
}
if (ch == victim) {
send_to_char("Maybe that's not such a great idea.\r\n", ch);
return;
}
if (IS_NPC(victim)) {
send_to_char("NO! Not on NPC's.\r\n", ch);
return;
}
if (GET_LEVEL(victim) == 0)
adv = 1;
else if (!*level) {
send_to_char("You must supply a level number.\r\n", ch);
return;
} else {
if (!isdigit(*level)) {
send_to_char("Second argument must be a positive integer.\r\n", ch);
return;
}
if ((newlevel = atoi(level)) <= 3) {
do_start(victim);
GET_LEVEL(victim) = newlevel;
}
adv = newlevel - GET_LEVEL(victim);
}
if (((adv + GET_LEVEL(victim)) > 1) && (GET_LEVEL(ch) < LEVEL_ASS_IMPL)) {
send_to_char("Thou art not godly enough.\r\n", ch);
return;
}
if ((adv + GET_LEVEL(victim)) > LEVEL_IMPL) {
send_to_char("227 is the highest possible level.\r\n", ch);
return;
}
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 colored lights from inside.\r\nYo"
"ur head seems to be filled with demons\r\nfrom another plane as your"
" body dissolves\r\nto 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);
send_to_char("Ok.\r\n", ch);
if (GET_LEVEL(victim) == 0) {
do_start(victim);
}
else {
if (GET_LEVEL(victim) < LEVEL_IMPL) {
sprintf(buf, "(GC) %s has advanced %s to level %d (from %d)",
GET_NAME(ch), GET_NAME(victim), newlevel, GET_LEVEL(victim));
logg(buf);
gain_exp_regardless(victim, (levels_table[GET_LEVEL(victim) + adv]) - GET_EXP(victim),0);
save_char(victim, NOWHERE);
}
else {
send_to_char("Some idiot just tried to advance your level.\r\n", victim);
send_to_char("IMPOSSIBLE! IDIOTIC!\r\n", ch);
}
}
}
ACMD(do_restore)
{
struct char_data *victim;
int i;
void update_pos( struct char_data *victim );
if (IS_NPC(ch))
return;
one_argument(argument, buf);
if (!*buf)
send_to_char("Whom do you wish to restore?\r\n", ch);
else if (!(victim = get_char(buf)))
send_to_char("No-one by that name in the world.\r\n", ch);
else {
GET_HIT(victim) = GET_MAX_HIT(victim);
GET_MOVE(victim) = GET_MAX_MOVE(victim);
if ((GET_LEVEL(ch) >= LEVEL_GRGOD) && (GET_LEVEL(victim) >= LEVEL_BUILDER)) {
for (i = 0; i < MAX_SKILLS; i++)
SET_SKILL(victim, i, 30);
if (GET_LEVEL(victim) >= LEVEL_GRGOD) {
victim->abilities.str = 30;
victim->abilities.intel = 30;
victim->abilities.wis = 30;
victim->abilities.dex = 30;
victim->abilities.str = 30;
victim->abilities.con = 30;
victim->abilities.chr = 30;
victim->abilities.per = 30;
victim->abilities.gui = 30;
victim->abilities.foc = 30;
victim->abilities.dev = 30;
victim->abilities.luc = 30;
}
victim->tmpabilities = victim->abilities;
}
update_pos(victim);
send_to_char("Done.\r\n", ch);
act("You have been fully healed by $N!", FALSE, victim, 0, ch, TO_CHAR);
}
}
ACMD(do_invis)
{
int level;
if (IS_NPC(ch)) {
send_to_char("Yeah.. like a mob knows how to bend light.\r\n", ch);
return;
}
one_argument (argument, arg);
if (!*arg) {
if (GET_INVIS_LEV(ch) > 0) {
GET_INVIS_LEV(ch) = 0;
sprintf(buf, "You are now fully visible.\r\n");
} else {
GET_INVIS_LEV(ch) = GET_LEVEL(ch);
sprintf(buf, "Your invisibility level is %d.\r\n", GET_LEVEL(ch));
}
} else {
level = atoi(arg);
if (level > GET_LEVEL(ch)) {
send_to_char("You can't go invisible above your own level.\r\n", ch);
return;
} else if (level < 1) {
GET_INVIS_LEV(ch) = 0;
sprintf(buf, "You are now fully visible.\r\n");
} else {
GET_INVIS_LEV(ch) = level;
sprintf(buf, "Your invisibility level is now %d.\r\n", level);
}
}
send_to_char(buf, ch);
}
ACMD(do_gecho)
{
int i;
struct descriptor_data *pt;
if (IS_NPC(ch))
return;
for (i = 0; *(argument + i) == ' '; i++)
;
if (!*(argument + i))
send_to_char("That must be a mistake...\r\n", ch);
else {
sprintf(buf, "%s\r\n", argument + i);
for (pt = descriptor_list; pt; pt = pt->next)
if (!pt->connected && pt->character && pt->character != ch)
act(buf, FALSE, ch, 0, pt->character, TO_VICT);
if (PRF_FLAGGED(ch, PRF_NOREPEAT))
send_to_char("Ok.\r\n", ch);
else
send_to_char(buf, ch);
if(GET_LEVEL(ch) < LEVEL_IMPL){
sprintf(buf,"(GC) %s echoed %s in %d",GET_NAME(ch),argument + i, world[ch->in_room].number);
mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE);
}
}
}
ACMD(do_poofset)
{
char **msg;
int i;
switch (subcmd) {
case SCMD_POOFIN : msg = &(ch->specials.poofIn); break;
case SCMD_POOFOUT: msg = &(ch->specials.poofOut); break;
default: return; break;
}
for (i = 0; *(argument + i) == ' '; i++)
;
if (*msg)
free(*msg);
if (!*(argument + i))
*msg = NULL;
else
*msg = str_dup(argument + i);
send_to_char("Ok.\r\n", ch);
}
ACMD(do_dc)
{
struct descriptor_data *d;
int num_to_dc;
if (IS_NPC(ch)) {
send_to_char("Monsters can't cut connections... leave me alone.\r\n", ch);
return;
}
if (!(num_to_dc = atoi(argument))) {
send_to_char("Usage: DC <connection number> (type USERS for a list)\r\n", ch);
return;
}
for (d = descriptor_list; d && d->desc_num != num_to_dc; d = d->next)
;
if (!d) {
send_to_char("No such connection.\r\n", ch);
return;
}
if (d->character && GET_LEVEL(d->character) >= GET_LEVEL(ch)) {
send_to_char("Umm.. maybe that's not such a good idea...\r\n", ch);
return;
}
close_socket(d);
sprintf(buf, "Connection #%d closed.\r\n", num_to_dc);
send_to_char(buf, ch);
sprintf(buf, "(GC) Connection closed by %s.", GET_NAME(ch));
logg(buf);
}
ACMD(do_wizlock)
{
int value;
char *when;
one_argument(argument, arg);
if (*arg) {
value = atoi(arg);
if (value < 0 || value > LEVEL_IMPL) {
send_to_char("Invalid wizlock value.\r\n", ch);
return;
}
restrict = value;
when = "now";
} else
when = "currently";
switch (restrict) {
case 0 :
sprintf(buf, "The game is %s completely open.\r\n", when);
break;
case 1 :
sprintf(buf, "The game is %s closed to new players.\r\n", when);
break;
default :
sprintf(buf, "Only level %d and above may enter the game %s.\r\n",
restrict, when);
break;
}
send_to_char(buf, ch);
}
ACMD(do_date)
{
long ct;
char *tmstr;
if (IS_NPC(ch))
return;
ct = time(0);
tmstr = (char *)asctime(localtime(&ct));
*(tmstr + strlen(tmstr) - 1) = '\0';
sprintf(buf, "Current machine time: %s\r\n", tmstr);
send_to_char(buf, ch);
}
ACMD(do_uptime)
{
char *tmstr;
long uptime;
int d, h, m;
extern long boot_time;
if (IS_NPC(ch))
return;
tmstr = (char *)asctime(localtime(&boot_time));
*(tmstr + strlen(tmstr) - 1) = '\0';
uptime = time(0) - boot_time;
d = uptime / 86400;
h = (uptime / 3600) % 24;
m = (uptime / 60) % 60;
sprintf(buf, "Up since %s: %d day%s, %d:%02d\r\n", tmstr, d,
((d == 1) ? "" : "s"), h, m);
send_to_char(buf, ch);
}
ACMD(do_last)
{
struct char_file_u chdata;
extern char *race_abbrevs[];
if (IS_NPC(ch))
return;
if (!*argument) {
send_to_char("For whom do you wish to search?\r\n", ch);
return;
}
one_argument(argument, arg);
if (load_char(arg, &chdata) < 0) {
send_to_char("There is no such player.\r\n", ch);
return;
}
if ((chdata.level > GET_LEVEL(ch)) && (GET_LEVEL(ch) < LEVEL_GRGOD)) {
send_to_char("You are not sufficiently godly for that!\r\n", ch);
return;
}
sprintf(buf, "[%5ld] [%2d %s] %-12s : %-18s : %-20s\r\n",
chdata.specials2.idnum, chdata.level, race_abbrevs[(int)chdata.race],
chdata.name, chdata.host, ctime(&chdata.last_logon));
send_to_char(buf, ch);
}
ACMD(do_force)
{
struct descriptor_data *i;
struct char_data *vict;
char name[100], to_force[MAX_INPUT_LENGTH+2];
if (IS_NPC(ch)) {
send_to_char("Umm.... no.\r\n", ch );
return;
}
half_chop(argument, name, to_force);
sprintf(buf1, "%s has forced you to %s.\r\n", GET_NAME(ch), to_force);
sprintf(buf2, "Someone has forced you to %s.\r\n", to_force);
if (!*name || !*to_force)
send_to_char("Whom do you wish to force do what?\r\n", ch);
else if (str_cmp("all", name) && str_cmp("room", name)) {
if (!(vict = get_char_vis(ch, name)) || !CAN_SEE(ch, vict))
send_to_char("No-one by that name here...\r\n", ch);
else {
if (GET_LEVEL(ch) > GET_LEVEL(vict)) {
send_to_char("Ok.\r\n", ch);
if (CAN_SEE(vict, ch) && GET_LEVEL(ch) < LEVEL_IMPL)
send_to_char(buf1, vict);
else if (GET_LEVEL(ch) < LEVEL_IMPL) {
send_to_char(buf2, vict);
}
if (GET_LEVEL(ch) < LEVEL_IMPL) {
sprintf(buf, "(GC) %s forced %s to %s", GET_NAME(ch), name, to_force);
logg(buf);
/*added to syslog, 1/10/95 -Soraya*/
mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE);
}
command_interpreter(vict, to_force);
} else
send_to_char("No, no, no!\r\n", ch);
}
} else if (str_cmp("room", name)) {
send_to_char("Okay.\r\n", ch);
if (GET_LEVEL(ch) < LEVEL_IMPL) {
sprintf(buf, "(GC) %s forced %s to %s", GET_NAME(ch), name, to_force);
logg(buf);
/*added to syslog, 1/10/95 -Soraya*/
mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE);
}
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected) {
vict = i->character;
if (GET_LEVEL(ch) > GET_LEVEL(vict)) {
if (CAN_SEE(vict, ch) && GET_LEVEL(ch) < LEVEL_IMPL)
send_to_char(buf1, vict);
else if (GET_LEVEL(ch) < LEVEL_IMPL)
send_to_char(buf2, vict);
command_interpreter(vict, to_force);
}
}
} else {
send_to_char("Okay.\r\n", ch);
if (GET_LEVEL(ch) < LEVEL_IMPL) {
sprintf(buf, "(GC) %s forced %s to %s", GET_NAME(ch), name, to_force);
logg(buf);
/*added to syslog, 1/10/95 -Soraya*/
mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE);
}
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected &&
i->character->in_room == ch->in_room) {
vict = i->character;
if (GET_LEVEL(ch) > GET_LEVEL(vict)) {
if (CAN_SEE(vict, ch) && GET_LEVEL(ch) < LEVEL_IMPL)
send_to_char(buf1, vict);
else if (GET_LEVEL(ch) < LEVEL_IMPL)
send_to_char(buf2, vict);
command_interpreter(vict, to_force);
}
}
}
}
ACMD(do_wiznet)
{
struct descriptor_data *d;
char any = FALSE;
int level = LEVEL_BUILDER;
/* if (IS_NPC(ch)) {
send_to_char("Yeah - like the Gods are interested in listening to mobs.\r\n", ch);
return;
}
*/
for ( ; *argument == ' '; argument++)
;
if (!*argument) {
send_to_char("Usage: wiznet [<text>|#<level> <text>|@|-|+]\r\n", ch);
return;
}
switch (*argument) {
/* patched 9-24-94 by Scarrow -- removed dull * case and fixed bad */
/* pointer incrementing */
case '#':
one_argument(argument, buf1);
if (is_number(buf1 + 1)) {
half_chop(argument, buf1, argument);
level = MAX(atoi(buf1 + 1), LEVEL_BUILDER);
if (level > GET_LEVEL(ch)) {
send_to_char("You can't wizline above your own level.\r\n", ch);
return;
}
}
break;
case '@':
for (d = descriptor_list; d; d = d->next) {
if (!d->connected && GET_LEVEL(d->character) >= LEVEL_BUILDER &&
!PRF_FLAGGED(d->character, PRF_NOWIZ) &&
(CAN_SEE(ch, d->character) || GET_LEVEL(ch) == LEVEL_IMPL) ) {
if (!any) {
sprintf(buf1, "Gods online:\r\n");
any = TRUE;
}
sprintf(buf1, "%s %s", buf1, GET_NAME(d->character));
if (PLR_FLAGGED(d->character, PLR_WRITING))
sprintf(buf1, "%s (Writing)\r\n", buf1);
else if (PLR_FLAGGED(d->character, PLR_MAILING))
sprintf(buf1, "%s (Writing mail)\r\n", buf1);
else
sprintf(buf1, "%s\r\n", buf1);
}
}
any = FALSE;
for (d = descriptor_list; d; d = d->next) {
if (!d->connected && GET_LEVEL(d->character) >= LEVEL_BUILDER &&
PRF_FLAGGED(d->character, PRF_NOWIZ) &&
CAN_SEE(ch, d->character) ) {
if (!any) {
sprintf(buf1, "%sGods offline:\r\n", buf1);
any = TRUE;
}
sprintf(buf1, "%s %s\r\n", buf1, GET_NAME(d->character));
}
}
send_to_char(buf1, ch);
return;
break;
case '-':
if (PRF_FLAGGED(ch, PRF_NOWIZ))
send_to_char("You are already offline!\r\n", ch);
else {
send_to_char("You will no longer hear the wizline.\r\n", ch);
SET_BIT(PRF_FLAGS(ch), PRF_NOWIZ);
}
return;
break;
case '+':
if (!PRF_FLAGGED(ch, PRF_NOWIZ))
send_to_char("You are already online!\r\n", ch);
else {
send_to_char("You can now hear the wizline again.\r\n", ch);
REMOVE_BIT(PRF_FLAGS(ch), PRF_NOWIZ);
}
return;
break;
case '\\':
++argument;
break;
default:
break;
}
if (PRF_FLAGGED(ch, PRF_NOWIZ)) {
send_to_char("You are offline!\r\n", ch);
return;
}
for ( ; *argument == ' '; argument++)
;
if (!*argument) {
send_to_char("Don't bother the gods like that!\r\n", ch);
return;
}
if (level > LEVEL_BUILDER)
sprintf(buf1, "<%d> %s\r\n", level, argument);
else
sprintf(buf1, "%s\r\n", argument);
for (d = descriptor_list; d; d = d->next) {
if ( (!d->connected) && (GET_LEVEL(d->character) >= level) &&
(!PRF_FLAGGED(d->character, PRF_NOWIZ)) &&
(!PLR_FLAGGED(d->character, PLR_WRITING | PLR_MAILING))
&& (d != ch->desc || !(PRF_FLAGGED(d->character, PRF_NOREPEAT)))) {
sprintf(buf2,"%s%s:%s ",CCBGRN(d->character, C_NRM),((CAN_SEE(d->character, ch)) ? GET_NAME(ch):"Someone"), CCGRN(d->character, C_NRM));
send_to_char(buf2, d->character);
send_to_char(buf1, d->character);
send_to_char(CCNRM(d->character, C_NRM), d->character);
}
}
if (PRF_FLAGGED(ch, PRF_NOREPEAT))
send_to_char("Ok.\r\n", ch);
}
ACMD(do_zreset)
{
int i, j;
if IS_NPC(ch) {
send_to_char("Homie don't play that!\r\n", ch);
return;
}
if (!*argument) {
send_to_char("You must specify a zone.\r\n", ch);
return;
}
one_argument(argument, arg);
if (*arg == '*') {
for (i = 0; i <= top_of_zone_table; i++)
reset_zone(i);
send_to_char("Reset world.\r\n", ch);
return;
} else if (*arg == '.')
i = world[ch->in_room].zone;
else {
j = atoi(arg);
for (i = 0; i <= top_of_zone_table; i++)
if (zone_table[i].number == j)
break;
}
if (i >= 0 && i <= top_of_zone_table) {
reset_zone(i);
sprintf(buf, "Reset zone %d: %s.\r\n", i, zone_table[i].name);
send_to_char(buf, ch);
sprintf(buf, "(GC) %s reset zone %d (%s)", GET_NAME(ch), i, zone_table[i].name);
mudlog(buf, NRM, MAX(LEVEL_GRGOD, GET_INVIS_LEV(ch)), TRUE);
} else
send_to_char("Invalid zone number.\r\n", ch);
}
/*
General fn for wizcommands of the sort: cmd <player>
*/
ACMD(do_wizutil)
{
struct char_data *vict;
char name[40];
long result;
if (IS_NPC(ch)) {
send_to_char("You're just an unfrozen caveman NPC.\r\n", ch);
return;
}
one_argument(argument, name);
if (!*name) {
send_to_char("Yes, but for whom?!?\r\n", ch);
return;
}
if (!(vict = get_char_vis(ch, name))) {
send_to_char("There is no such player.\r\n", ch);
return;
}
if (IS_NPC(vict)) {
send_to_char("You can't do that to a mob!\r\n", ch);
return;
}
if (GET_LEVEL(vict) > GET_LEVEL(ch)) {
send_to_char("Hmmm...you'd better not.\r\n", ch);
return;
}
switch (subcmd) {
case SCMD_PARDON:
if (!PLR_FLAGGED(vict, PLR_THIEF | PLR_KILLER)) {
send_to_char("Your victim is not flagged.\r\n", ch);
return;
}
REMOVE_BIT(PLR_FLAGS(vict), PLR_THIEF | PLR_KILLER);
send_to_char("Pardoned.\r\n", ch);
send_to_char("You have been pardoned by the Gods!\r\n", vict);
sprintf(buf, "(GC) %s pardoned by %s", GET_NAME(vict), GET_NAME(ch));
mudlog(buf, BRF, MAX(LEVEL_GOD, GET_INVIS_LEV(ch)), TRUE);
break;
case SCMD_NOTITLE:
result = PLR_TOG_CHK(vict, PLR_NOTITLE);
sprintf(buf, "(GC) Notitle %s for %s by %s.", ONOFF(result),
GET_NAME(vict), GET_NAME(ch));
mudlog(buf, NRM, MAX(LEVEL_GOD, GET_INVIS_LEV(ch)), TRUE);
strcat(buf, "\r\n");
send_to_char(buf, ch);
break;
case SCMD_SQUELCH:
result = PLR_TOG_CHK(vict, PLR_NOSHOUT);
sprintf(buf, "(GC) Squelch %s for %s by %s.", ONOFF(result),
GET_NAME(vict), GET_NAME(ch));
mudlog(buf, BRF, MAX(LEVEL_GOD, GET_INVIS_LEV(ch)), TRUE);
strcat(buf, "\r\n");
send_to_char(buf, ch);
break;
case SCMD_FREEZE:
if (ch == vict) {
send_to_char("Oh, yeah, THAT'S real smart...\r\n", ch);
return;
}
if (PLR_FLAGGED(vict, PLR_FROZEN)) {
send_to_char("Your victim is already pretty cold.\r\n", ch);
return;
}
SET_BIT(PLR_FLAGS(vict), PLR_FROZEN);
vict->specials2.freeze_level = GET_LEVEL(ch);
send_to_char("A bitter wind suddenly rises and drains every erg of heat from your body!\r\nYou feel frozen!\r\n",
vict);
send_to_char("Frozen.\r\n", ch);
act("A sudden cold wind conjured from nowhere freezes $n!", FALSE, vict, 0, 0, TO_ROOM);
sprintf(buf, "(GC) %s frozen by %s.", GET_NAME(vict), GET_NAME(ch));
mudlog(buf, BRF, MAX(LEVEL_GOD, GET_INVIS_LEV(ch)), TRUE);
break;
case SCMD_THAW:
if (!PLR_FLAGGED(vict, PLR_FROZEN)) {
send_to_char("Sorry, your victim is not morbidly encased in ice at the moment.\r\n", ch);
return;
}
if (vict->specials2.freeze_level > GET_LEVEL(ch)) {
sprintf(buf, "Sorry, a level %d God froze %s... you can't unfreeze %s.\r\n",
vict->specials2.freeze_level,
GET_NAME(vict),
HMHR(vict));
send_to_char(buf, ch);
return;
}
sprintf(buf, "(GC) %s un-frozen by %s.", GET_NAME(vict), GET_NAME(ch));
mudlog(buf, BRF, MAX(LEVEL_GOD, GET_INVIS_LEV(ch)), TRUE);
REMOVE_BIT(PLR_FLAGS(vict), PLR_FROZEN);
send_to_char("A fireball suddenly explodes in front of you, melting the ice!\r\nYou feel thawed.\r\n", vict);
send_to_char("Thawed.\r\n", ch);
act("A sudden fireball conjured from nowhere thaws $n!", FALSE, vict, 0, 0, TO_ROOM);
break;
case SCMD_UNAFFECT:
if (vict->affected) {
while (vict->affected)
affect_remove(vict, vict->affected);
send_to_char("All spells removed.\r\n", ch);
send_to_char("There is a brief flash of light!\r\n"
"You feel slightly different.\r\n", vict);
} else {
send_to_char("Your victim does not have any affections!\r\n", ch);
return;
}
break;
case SCMD_REROLL:
send_to_char("disabled...\r\n", ch);
break;
}
save_char(vict, NOWHERE);
}
/* single zone printing fn used by "show zone" so it's not repeated in the
code 3 times ... -je, 4/6/93 */
void print_zone_to_buf(char *bufptr, int zone)
{
sprintf(bufptr, "%3d %-30.30s Age: %3d Reset: %3d (%1d) Top: %5d %s\r\n",
zone_table[zone].number, zone_table[zone].name,
zone_table[zone].age, zone_table[zone].lifespan,
zone_table[zone].reset_mode, zone_table[zone].top,
((zone_table[zone].open) ? "Open":"Closed"));
}
#define ZCMD zone_table[zone].cmd[cmd_no]
ACMD(do_show)
{
struct char_file_u vbuf;
char bufa[40],bufb[40];
char *bffzm=0;
int zone, cmd_no,next_zone;
int i, jj, j=-1, k, l, con, room=-1,rroom=-1;
char *tmstr;
long uptime;
int d, h, m, iloc= -1, ibot=0, itop=10000;
char self = 0, mode=0;
struct zone_obj_list *zol;
struct char_data *vict;
struct obj_data *obj;
char field[40], value[40], birth[80];
extern char *race_abbrevs[];
extern char *genders[];
extern int buf_switches, buf_largecount, buf_overflows;
extern long boot_time;
bool twinkie = FALSE, all=FALSE, last_cmd=FALSE;
struct show_struct {
char *cmd;
sh_int level;
} fields[] = {
{ "nothing", 0 },
{ "zone", LEVEL_BUILDER },
{ "players", LEVEL_GOD },
{ "rent", LEVEL_GOD },
{ "stats", 1 },
{ "limited", LEVEL_BUILDER },
{ "death", LEVEL_BUILDER },
{ "godrooms", LEVEL_GOD },
{ "player", LEVEL_GOD},
{ "zones", 1},
{ "rooms", LEVEL_BUILDER},
{ "mobs", LEVEL_BUILDER},
{ "objs", LEVEL_BUILDER},
{ "teleports", LEVEL_BUILDER},
{ "goditems", LEVEL_BUILDER},
{ "shops", LEVEL_MBUILDER},
{ "noformat", LEVEL_BUILDER},
{ "\n", 0 }
};
if IS_NPC(ch) {
send_to_char("Oh no! None of that stuff!\r\n", ch);
return;
}
if (!*argument) {
strcpy(buf, "Show options:\r\n");
for (j = 0, i = 1; fields[i].level; i++)
if (fields[i].level <= GET_LEVEL(ch))
sprintf(buf, "%s%-15s%s", buf, fields[i].cmd, (!(++j % 5) ? "\r\n" : ""));
strcat(buf, "\r\n");
send_to_char(buf, ch);
return;
}
half_chop(argument, field, arg);
half_chop(arg, value, arg);
for (l = 0; *(fields[l].cmd) != '\n'; l++)
if (!strncmp(field, fields[l].cmd, strlen(field)))
break;
if (GET_LEVEL(ch) < fields[l].level) {
send_to_char("You are not godly enough for that!\r\n", ch);
return;
}
if (!strcmp(value, "."))
self = 1;
buf[0] = '\0';
if (l == 16) {
mode = 1;
l = 6;
}
switch (l) {
case 1: /* zone */
rroom = ch->in_room;
j = ch->specials2.edit_zone;
if (*value && is_number(value))
j = atoi(value);
else{
sprintf(buf,"%s %s",value, arg);
sprintf(arg,"%s",buf);
}
if (*arg){
half_chop(arg, buf1, buf2);
if (!strcmp("all", buf1)){
sprintf(arg,"%s",buf2);
all = TRUE;
}
else if (!strcmp("at", buf1)){
room = atoi(buf2);
if ((rroom = real_room(room)) < 0 ){
send_to_char("No such room.\r\n",ch);
return;
}
}
else
sprintf(arg,"%s %s",buf1, buf2);
half_chop(arg, buf1, buf2);
if (!strcmp("about", buf1)){
iloc = atoi(buf2);
if (iloc < 0){
send_to_char("Illegal reset number.\r\n",ch);
return;}
}
else if (!strcmp("from", buf1)){
ibot = atoi(buf2);
iloc = -1;
if (ibot < 0){
send_to_char("Illegal reset number.\r\n",ch);
return;}
}
}
for (zone = 0; zone_table[zone].number != j && zone <= top_of_zone_table; zone++)
;
if (zone > top_of_zone_table)
{
send_to_char("Illegal zone number.\r\n",ch);
return;
}
for (cmd_no = 0; ;cmd_no++) {
if (ZCMD.command == 'S')
break;}
if (iloc >= 0 ){
if (iloc > cmd_no)
iloc = cmd_no;
ibot = MAX(iloc - 10, 0);
itop = iloc + 10;}
else{
if (ibot > cmd_no)
ibot = MAX(cmd_no - 20, 0);
}
print_zone_to_buf(buf, zone);
send_to_char(buf,ch);
send_to_char("\r\n",ch);
if (!all){
sprintf(buf, "Resets for room: %s%s%s, %s#%d%s.\r\n",
CCBBLU(ch, C_NRM), world[rroom].name, CCNRM(ch, C_NRM),
CCGRN(ch, C_NRM),world[rroom].number, CCNRM(ch, C_NRM));
send_to_char(buf,ch);
}
*buf2 = 0;
for (cmd_no = ibot; cmd_no <= itop;cmd_no++){
if (ZCMD.command == 'S')
break;
else if (ZCMD.command == 'M' || ZCMD.command == 'm' ){
if (!all && ZCMD.arg3 != rroom){
last_cmd = FALSE;
continue;
}
else
last_cmd = TRUE;
if (ZCMD.arg1 > top_of_mobt)
printf("error in Zone: %d at reset: %d, %d > top of mob table\n",zone, cmd, ZCMD.arg1);
else{
sprintf(bufa,"%sM%d %s",CCRED(ch,C_NRM),mob_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(bufb,"%s %d %s",CCRED(ch,C_NRM),ZCMD.arg1,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] M: %-25.25s in %-25.25s %2d %2d %3d\r\n"
,cmd_no
,((mob_proto[ZCMD.arg1].player.short_descr) ? mob_proto[ZCMD.arg1].player.short_descr : bufa)
,((world[ZCMD.arg3].name) ? world[ZCMD.arg3].name : bufb)
,ZCMD.arg2, ZCMD.num, ZCMD.percent);}
}
else if (ZCMD.command == 'F' || ZCMD.command == 'f' ){
if (!all && !last_cmd)
continue;
if (ZCMD.arg1 > top_of_mobt)
printf("error in Zone: %d at reset: %d, %d > top of mob table\n",zone, cmd, ZCMD.arg1);
else{
sprintf(bufa,"%sF%d %s",CCRED(ch,C_NRM),mob_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(bufb,"%s %d %s",CCRED(ch,C_NRM),ZCMD.arg1,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] F: %-25.25s %-28.28s %2d %2d %3d\r\n"
,cmd_no
,((mob_proto[ZCMD.arg1].player.name) ? mob_proto[ZCMD.arg1].player.short_descr : bufa)
,"",ZCMD.arg2, ZCMD.num, ZCMD.percent);}
}
else if (ZCMD.command == 'R' || ZCMD.command == 'r'){
if (!all && !last_cmd)
continue;
if (ZCMD.arg1 > top_of_mobt)
printf("error in Zone: %d at reset: %d, %d > top of mob table\n",zone, cmd, ZCMD.arg1);
else{
sprintf(bufa,"%sR%d %s",CCRED(ch,C_NRM),mob_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(bufb,"%s %d %s",CCRED(ch,C_NRM),ZCMD.arg1,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] Mt: %-23.23s %2d %2d %3d\r\n"
,cmd_no
,((mob_proto[ZCMD.arg1].player.name) ? mob_proto[ZCMD.arg1].player.short_descr : bufa)
,ZCMD.arg2, ZCMD.num, ZCMD.percent);}
}
else if (ZCMD.command == 'C' || ZCMD.command == 'c'){
if (!all && !last_cmd)
continue;
if (ZCMD.arg1 > top_of_mobt)
printf("error in Zone: %d at reset: %d, %d > top of mob table\n",zone, cmd, ZCMD.arg1);
else{
sprintf(bufa,"%sC%d %s",CCRED(ch,C_NRM),mob_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(bufb,"%s %d %s",CCRED(ch,C_NRM),ZCMD.arg1,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] Cy: %-23.23s %2d %2d %3d\r\n"
,cmd_no
,((mob_proto[ZCMD.arg1].player.name) ? mob_proto[ZCMD.arg1].player.short_descr : bufa)
,ZCMD.arg2, ZCMD.num, ZCMD.percent);}
}
else if (ZCMD.command == 'O' || ZCMD.command == 'o'){
if (!all && ZCMD.arg3 != rroom){
last_cmd = FALSE;
continue;
}
else
last_cmd = TRUE;
if (ZCMD.arg1 > top_of_objt)
printf("error in Zone: %d at reset: %d, %d > top of obj table\n",zone, cmd, ZCMD.arg1);
else{
sprintf(bufa,"%sO%d %s",CCRED(ch,C_NRM),obj_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(bufb,"%s %d %s",CCRED(ch,C_NRM),ZCMD.arg1,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] O: %-25.25s in %-25.25s %2d %2d %3d\r\n"
,cmd_no
,((obj_proto[ZCMD.arg1].short_description) ? obj_proto[ZCMD.arg1].short_description : bufa)
,((world[ZCMD.arg3].name) ? world[ZCMD.arg3].name : bufb)
,ZCMD.arg2, ZCMD.num, ZCMD.percent);
}
}
else if (ZCMD.command == 'P' || ZCMD.command == 'p'){
if (!all && !last_cmd)
continue;
if (ZCMD.arg1 > top_of_objt)
printf("error in Zone: %d at reset: %d, %d > top of obj_table\n",zone, cmd, ZCMD.arg1);
else if (ZCMD.arg3 > top_of_objt)
printf("error in Zone: %d at reset: %d, %d > top of obj_table\n",zone, cmd, ZCMD.arg3);
else{
sprintf(bufa,"%s %d %s",CCRED(ch,C_NRM),obj_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(bufb,"%s %d %s",CCRED(ch,C_NRM),obj_index[ZCMD.arg3].virtual,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] P: %-25.25s in %-25.25s %2d %2d %3d\r\n"
,cmd_no
,((obj_proto[ZCMD.arg1].short_description) ? obj_proto[ZCMD.arg1].short_description : bufa)
,((obj_proto[ZCMD.arg3].short_description) ? obj_proto[ZCMD.arg3].short_description : bufb)
,ZCMD.arg2, ZCMD.num, ZCMD.percent);
}
}
else if (ZCMD.command == 'G' || ZCMD.command == 'g'){
if (!all && !last_cmd)
continue;
sprintf(bufa,"%s %d %s",CCRED(ch,C_NRM),obj_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] G: %-25.25s %-25.25s %2d %2d %3d\r\n",
cmd_no,
((obj_proto[ZCMD.arg1].short_description) ? obj_proto[ZCMD.arg1].short_description : bufa)
,"",ZCMD.arg2, ZCMD.num, ZCMD.percent);}
else if (ZCMD.command == 'H' || ZCMD.command == 'h'){
if (!all && !last_cmd)
continue;
sprintf(bufa,"%s %d %s",CCRED(ch,C_NRM),mob_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] C: %-25.25s %-25.25s %2d %2d %3d\r\n",
cmd_no,
((mob_proto[ZCMD.arg1].player.name) ? mob_proto[ZCMD.arg1].player.short_descr : bufa)
,"",ZCMD.arg2, ZCMD.num, ZCMD.percent);}
else if (ZCMD.command == 'E' || ZCMD.command == 'e'){
if (!all && !last_cmd)
continue;
sprintf(bufa,"%s %d %s",CCRED(ch,C_NRM),obj_index[ZCMD.arg1].virtual,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] E: %-25.25s %-25.25s %2d %2d %3d \r\n",
cmd_no,
((obj_proto[ZCMD.arg1].short_description) ? obj_proto[ZCMD.arg1].short_description : bufa)
,where[ZCMD.arg3], ZCMD.arg2, ZCMD.num, ZCMD.percent);}
else if (ZCMD.command == 'D' || ZCMD.command == 'd'){
if (!all && ZCMD.arg1 != rroom){
last_cmd = FALSE;
continue;
}
else
last_cmd = FALSE;
sprintf(bufb,"%s %d %s",CCRED(ch,C_NRM),ZCMD.arg1,CCNRM(ch,C_NRM));
sprintf(buf,"[%3d] D: %-25.25s in %-23.23s %-7.7s %3d\r\n",cmd_no, dirs[ZCMD.arg2],((world[ZCMD.arg1].name) ? world[ZCMD.arg1].name : bufb) ,exit_bits[ZCMD.arg3], ZCMD.percent);
}
else
*buf = '\0';
if (strlen(buf2) + strlen(buf) +1 < MAX_STRING_LENGTH)
strcat(buf2,buf);
else{
send_to_char("Too many Zone resets to display at once!\r\n",ch);
send_to_char("Use show zone # ( from # | about #).\r\n",ch);
break;
}
}
if (buf2)
page_string(ch->desc,buf2,1);
break;
case 2: /* players */
*buf = 0;
*buf2 = 0;
if (!*value){
for (i=0;i <= top_of_p_table;i++){
sprintf(buf," Player#%4d: %s%-11s%s%s"
,i,CCGRN(ch,C_NRM),(player_table +i)->name
,CCNRM(ch,C_NRM)
,((!((i+1)%3) && i) ? "\r\n" : ""));
if (strlen(buf2) + strlen(buf) +1 < MAX_STRING_LENGTH)
strcat(buf2,buf);
else{
send_to_char("Too many players to list at once!\r\n",ch);
break;
}
}
}
else{
if (!*arg || (!is_abbrev(value, "from") && !is_abbrev(value,"about"))){
send_to_char("Usage: show players [from|about #]\r\n", ch);
return;
}
if (is_abbrev(value, "from")){
ibot = atoi(arg);
itop = top_of_p_table;
if (ibot < 0)
ibot = 0;
if (ibot >= top_of_p_table)
ibot = top_of_p_table - 62;
itop = top_of_p_table;
}
else if (is_abbrev(value,"about")){
ibot = atoi(arg) -31;
if (ibot < 0)
ibot = 0;
if (ibot >= top_of_p_table)
ibot = top_of_p_table - 62;
itop = ibot + 62;
}
for (i=ibot;i <= itop ;i++){
sprintf(buf," Player#%4d: %s%-11s%s%s"
,i,CCGRN(ch,C_NRM),(player_table +i)->name
,CCNRM(ch,C_NRM)
,((!((i+1)%3) && i) ? "\r\n" : ""));
if (strlen(buf2) + strlen(buf) +1 < MAX_STRING_LENGTH)
strcat(buf2,buf);
else{
send_to_char("Too many players to list at once!\r\n",ch);
break;
}
}
}
if (buf2)
page_string(ch->desc,buf2,1);
return;
break;
case 3:
Crash_listrent(ch, value);
break;
case 4:
tmstr = (char *)asctime(localtime(&boot_time));
*(tmstr + strlen(tmstr) - 1) = '\0';
uptime = time(0) - boot_time;
d = uptime / 86400;
h = (uptime / 3600) % 24;
m = (uptime / 60) % 60;
i = 0;
j = 0;
k = 0;
con = 0;
for (vict = character_list; vict; vict = vict->next) {
if (IS_NPC(vict))
j++;
else if (CAN_SEE(ch, vict)) {
i++;
if (vict->desc)
con++;
}
}
for (obj = object_list; obj; obj = obj->next)
k++;
jj = 0;
for (l=0;l<=top_of_world;l++)
if (IS_SET(world[l].room_flags, UNFINISHED))
jj++;
sprintf(buf, "Current stats:\r\n");
sprintf(buf, "%sUp since %s: %d day%s, %d:%02d\r\n",buf, tmstr, d,
((d == 1) ? "" : "s"), h, m);
sprintf(buf, "%s %5d players in game %5d connected\r\n", buf, i, con);
sprintf(buf, "%s %5d registered\r\n", buf, top_of_p_table + 1);
sprintf(buf, "%s %5d mobiles %5d prototypes\r\n",
buf, j, top_of_mobt + 1);
sprintf(buf, "%s %5d objects %5d prototypes\r\n",
buf, k, top_of_objt + 1);
sprintf(buf, "%s %5d rooms %5d zones\r\n",
buf, top_of_world + 1, top_of_zone_table + 1);
sprintf(buf, "%s %s %5d %sunfinished rooms\r\n",
buf, CCBRED(ch, C_NRM),jj,CCNRM(ch,C_NRM));
sprintf(buf, "%s %5d large bufs\r\n", buf, buf_largecount);
sprintf(buf, "%s %5d buf switches %5d overflows\r\n", buf,
buf_switches, buf_overflows);
send_to_char(buf, ch);
break;
case 5:
strcpy(buf,"Limited Items\r\n-------------\r\n");
send_to_char(buf,ch);
for ( i = 0 ; i <= top_of_ol_table ; i++ ) {
j = real_object(obj_limit_table[i].obj_num);
if (j > 0)
sprintf(buf,"%s%-35s%s, Vnum: %5d, Max: %3d, In Rent: %3d\r\n"
,CCCYN(ch,C_NRM),obj_proto[j].short_description,CCNRM(ch,C_NRM)
,obj_limit_table[i].obj_num
,obj_proto[j].obj_flags.value[6]
,obj_limit_table[i].no_stored);
if (bffzm){
RECREATE(bffzm, char, (strlen(bffzm) + strlen(buf) +1));
strcat(bffzm,buf);}
else{
CREATE(bffzm,char,strlen(buf) +1);
strcpy(bffzm,buf);}
}
if (bffzm)
page_string(ch->desc,bffzm,1);
free(bffzm);
break;
case 6:
if (!*value && ch->specials2.edit_zone != -1)
jj = ch->specials2.edit_zone;
else if ( is_number(value))
jj = atoi(value);
else
jj = -1;
if (*value && jj < 0)
if (strcmp(value,"all")){
if (!mode)
send_to_char("Usage: show death [ zone# | all ]\r\n",ch);
else
send_to_char("Usage: show noformat [ zone# | all ]\r\n",ch);
return;}
if (jj > -1){
for (zone = 0; zone_table[zone].number != jj && zone <= top_of_zone_table; zone++)
;
if (zone > top_of_zone_table)
{
send_to_char("Illegal zone number - type show zones.\r\n",ch);
return;
}
}
if (jj >-1 && zone <= top_of_zone_table)
{
sprintf(buf,"%s for Zone: %3d\r\n-------------------------\r\n",
((!mode) ? "Death Traps":"No-Format Rooms"),jj);
send_to_char(buf,ch);
for (i = 0, j = 0; i < top_of_world; i++)
if (world[i].zone == zone)
if ((IS_SET(world[i].room_flags,DEATH) && !(mode)) ||
(IS_SET(world[i].room_flags,NO_AUTOFORMAT) && mode)){
sprintf(buf, "%3d: [%5d] %s\r\n", ++j,
world[i].number, world[i].name);
if (bffzm){
RECREATE(bffzm, char, (strlen(bffzm) + strlen(buf) +1));
strcat(bffzm,buf);}
else{
CREATE(bffzm,char,strlen(buf) +1);
strcpy(bffzm,buf);}
}
}
else
{
if (!mode)
send_to_char("Death Traps\r\n-----------\r\n",ch);
else
send_to_char("No-Format Rooms\r\n-----------\r\n",ch);
for (i = 0, j = 0; i < top_of_world; i++)
if ((IS_SET(world[i].room_flags, DEATH) && !mode) ||
(IS_SET(world[i].room_flags, NO_AUTOFORMAT) && mode)){
sprintf(buf, "%4d: [%5d] %s\r\n", ++j,
world[i].number, world[i].name);
if (bffzm){
RECREATE(bffzm, char, (strlen(bffzm) + strlen(buf) +1));
strcat(bffzm,buf);}
else{
CREATE(bffzm,char,strlen(buf) +1);
strcpy(bffzm,buf);}
}
}
if (bffzm)
page_string(ch->desc,bffzm,1);
free(bffzm);
break;
case 7:
#define GOD_ROOMS_ZONE 2
send_to_char("Godrooms\r\n---------\r\n",ch);
for (i = 0, j = 0; i < top_of_world; i++)
if (world[i].zone == GOD_ROOMS_ZONE){
sprintf(buf, "%2d: [%5d] %s\r\n", j++, world[i].number,
world[i].name);
if (bffzm){
RECREATE(bffzm, char, (strlen(bffzm) + strlen(buf) +1));
strcat(bffzm,buf);}
else{
CREATE(bffzm,char,strlen(buf) +1);
strcpy(bffzm,buf);}
}
if (bffzm)
page_string(ch->desc,bffzm,1);
free(bffzm);
break;
case 8: /* player */
if (load_char(value, &vbuf) < 0) {
send_to_char("There is no such player.\r\n", ch);
return;
}
sprintf(buf, "Player: %-12s (%s) [%2d %s]\r\n", vbuf.name,
genders[(int)vbuf.sex], vbuf.level, race_abbrevs[(int)vbuf.race]);
sprintf(buf,
"%sAu: %-8d Bal: %-8d Exp: %-8d Align: %-5d Lessons: %-3d\r\n",
buf, vbuf.points.gold, vbuf.points.bank_gold, vbuf.points.exp,
vbuf.specials2.alignment, vbuf.specials2.spells_to_learn);
strcpy(birth, ctime(&vbuf.birth));
sprintf(buf,
"%sStarted: %-20.16s Last: %-20.16s Played: %3dh %2dm\r\n",
buf, birth, ctime(&vbuf.last_logon), (int)(vbuf.played / 3600),
(int)(vbuf.played / 60 % 60));
send_to_char(buf, ch);
break;
case 9: /* show zone */
if (GET_LEVEL(ch) >= LEVEL_BUILDER) {
if (self)
print_zone_to_buf(buf, world[ch->in_room].zone);
else if (is_number(value)) {
for (j = atoi(value), i = 0;
zone_table[i].number != j && i <= top_of_zone_table;
i++)
;
if (i <= top_of_zone_table){
print_zone_to_buf(buf, i);
send_to_char(buf, ch);
return;}
else {
send_to_char("That is not a valid zone.\r\n", ch);
return;
}
} else
for (i = 0; i <= top_of_zone_table; i++){
print_zone_to_buf(buf, i);
if (bffzm){
RECREATE(bffzm, char, (strlen(bffzm) + strlen(buf) +1));
strcat(bffzm,buf);}
else{
CREATE(bffzm,char,strlen(buf) +1);
strcpy(bffzm,buf);}
}
if (bffzm)
page_string(ch->desc,bffzm,1);
free(bffzm);
}
else { /* mortal version */
j = 1;
sprintf(buf,"Open Zones:\r\n");
for (i = 0; i <= top_of_zone_table; i++){
if (zone_table[i].open) {
sprintf(buf,"%s[%2d] %-30.30s%s",buf,j,zone_table[i].name,
(!(j%2) ? "\r\n":" "));
j++;
}
}
page_string(ch->desc,buf,1);
}
break;
case 10: /* show rooms */
ibot = 0;
itop = top_of_world;
iloc = -1;
j = ch->specials2.edit_zone;
if (*value && is_number(value))
j = atoi(value);
else{
sprintf(buf,"%s %s",value, arg);
sprintf(arg,"%s",buf);
}
if (*arg){
half_chop(arg, buf1, buf2);
if (!strcmp("about", buf1)){
iloc = atoi(buf2);
if (iloc < 0){
send_to_char("Illegal room number.\r\n",ch);
return;}
}
else if (!strcmp("from", buf1)){
ibot = atoi(buf2);
iloc = -1;
if (ibot < 0){
send_to_char("Illegal room number.\r\n",ch);
return;}
}
}
for (zone = 0; zone_table[zone].number != j && zone <= top_of_zone_table; zone++)
;
if (zone > top_of_zone_table)
{
send_to_char("Illegal zone number.\r\n",ch);
return;
}
for (i = 0,j=0; world[i].zone != zone && i <= top_of_world; i++)
j++;
for (i=j ; world[i].zone == zone && i <= top_of_world; i++)
;
if (iloc >= 0 ){
if (iloc > i-j)
iloc = i-j;
ibot = MAX(iloc - 10, 0);
itop = MIN(top_of_world,iloc + 10 + j);}
else{
if (ibot > i-j)
ibot = MAX(i-j - 21,0) ;
}
*buf2 = '\0';
for (i=ibot + j ; world[i].zone == zone && i <= itop; i++)
{
if (IS_SET(world[i].room_flags, UNFINISHED))
sprintf (buf,"[%3d] Number: %5d %s*%s%-30.30s \r\n"
,i-j,world[i].number,
CCBRED(ch, C_NRM),CCNRM(ch, C_NRM),world[i].name);
else
sprintf (buf,"[%3d] Number: %5d %-30.30s \r\n"
,i-j,world[i].number,
world[i].name);
if (strlen(buf2) + strlen(buf) +1 < MAX_STRING_LENGTH)
strcat(buf2,buf);
else{
send_to_char("Too many rooms to list at once!\r\n",ch);
send_to_char("Use the from or about keywords.\r\n",ch);
break;
}
}
if (*buf2)
page_string(ch->desc,buf2,1);
else
send_to_char("0 rooms in this zone.\r\n",ch);
break;
case 11:
ibot = 0;
itop = top_of_mobt;
iloc = -1;
j = ch->specials2.edit_zone;
if (*value && is_number(value))
j = atoi(value);
else{
sprintf(buf,"%s %s",value, arg);
sprintf(arg,"%s",buf);
}
if (*arg){
half_chop(arg, buf1, buf2);
if (!strcmp("about", buf1)){
iloc = atoi(buf2);
if (iloc < 0){
send_to_char("Illegal mob number.\r\n",ch);
return;}
}
else if (!strcmp("from", buf1)){
ibot = atoi(buf2);
iloc = -1;
if (ibot < 0){
send_to_char("Illegal mob number.\r\n",ch);
return;}
}
}
for (zone = 0; zone_table[zone].number != j && zone <= top_of_zone_table; zone++)
;
/* if (zone +1 <= top_of_zone_table)
next_zone = zone_table[zone+1].number;
else
next_zone = zone_table[zone].number +10; */
next_zone = (zone_table[zone].top +1)/100;
if (zone > top_of_zone_table)
{
send_to_char("Illegal zone number.\r\n",ch);
return;
}
for (i = 0,jj=0; mob_index[i].virtual < j*100 && i <= top_of_mobt; i++)
jj++;
for (i = jj; mob_index[i].virtual < next_zone*100 && i <= top_of_mobt; i++)
;
if (iloc >=0){
if (iloc > i - jj)
iloc = i-jj;
ibot = MAX(iloc - 10, 0);
itop = MIN(top_of_mobt, iloc + 10 + jj);
}
else{
if (ibot > i-jj)
ibot = MAX(i-j-21,0);
}
*buf2 = '\0';
for (i=ibot +jj
; ((mob_index[i].virtual < next_zone*100) && (i <= itop))
; i++)
{
sprintf (buf,"[%3d] Number: %5d %-30.30s #loaded: %3d\r\n"
,i,mob_index[i].virtual,
mob_proto[i].player.short_descr,
mob_index[i].number);
if (strlen(buf2) + strlen(buf) +1 < MAX_STRING_LENGTH)
strcat(buf2,buf);
else{
send_to_char("Too many mobs to list at once!\r\n",ch);
send_to_char("Use the from or about keywords.\r\n",ch);
break;
}
}
if (*buf2)
page_string(ch->desc,buf2,1);
else
send_to_char("0 rooms in this zone.\r\n",ch);
break;
case 12: /* show objects */
ibot = 0;
itop = top_of_objt;
iloc = -1;
j = ch->specials2.edit_zone;
if (*value && is_number(value))
j = atoi(value);
else{
sprintf(buf,"%s %s",value, arg);
sprintf(arg,"%s",buf);
}
if (*arg){
half_chop(arg, buf1, buf2);
if (!strcmp("about", buf1)){
iloc = atoi(buf2);
if (iloc < 0){
send_to_char("Illegal object number.\r\n",ch);
return;}
}
else if (!strcmp("from", buf1)){
ibot = atoi(buf2);
iloc = -1;
if (ibot < 0){
send_to_char("Illegal object number.\r\n",ch);
return;}
}
}
for (zone = 0; zone_table[zone].number != j && zone <= top_of_zone_table; zone++)
;
next_zone = (zone_table[zone].top +1) / 100;
if (zone > top_of_zone_table)
{
send_to_char("Illegal zone number.\r\n",ch);
return;
}
for (jj=0,zol = zone_table[zone].list;zol;zol = zol->next)
jj++;
sprintf(buf,"%d objects in this zone.\r\n",jj);
send_to_char(buf,ch);
if (iloc > 0){
if (iloc > jj)
iloc = jj;
ibot = MAX( iloc - 10, 0);
itop = MIN(jj, iloc + 10);
}
else
if (ibot > jj){
ibot = MAX(jj - 21, 0);
itop = jj;
}
*buf2 = 0;
jj = 0;
for (zol = zone_table[zone].list;zol && (jj < ibot) ;zol = zol->next)
jj++;
for(i=0; zol && ( i <= itop); i++, zol = zol->next){
{
jj++;
if (!zol->obj)
continue;
if (IS_SET(zol->obj->obj_flags.extra_flags, ITEM_GODONLY))
sprintf (buf,"[%3d] Number: %5d %s*%s%-30.30s #loaded: %3d\r\n"
,i,zol->vnum,
CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM),
zol->obj->short_description,
obj_index[real_object(zol->vnum)].number);
else
sprintf (buf,"[%3d] Number: %5d %-30.30s #loaded: %3d\r\n"
,i,zol->vnum,
zol->obj->short_description,
obj_index[real_object(zol->vnum)].number);
if (strlen(buf2) + strlen(buf) +1 < MAX_STRING_LENGTH)
strcat(buf2,buf);
else{
send_to_char("Too many objects to list at once!\r\n",ch);
send_to_char("Use the from or about keywords.\r\n",ch);
break;
}
}
}
if (buf2)
page_string(ch->desc,buf2,1);
break;
case 13:
if (!*value && ch->specials2.edit_zone != -1)
j = ch->specials2.edit_zone;
else if (!is_number(value)){
send_to_char("Illegal zone number.\r\n",ch);
return;}
else
j = atoi(value);
for (zone = 0; zone_table[zone].number != j && zone <= top_of_zone_table; zone++)
;
if (zone > top_of_zone_table)
{
send_to_char("Illegal zone number.\r\n",ch);
return;
}
for (i = 0,j=0; world[i].zone != zone && i <= top_of_world; i++)
j++;
sprintf(buf,"\r\nTeleports for zone:%3d\r\n----------------------\r\n",zone);
send_to_char(buf,ch);
for (i=j ; world[i].zone == zone && i <= top_of_world; i++)
{
if (world[i].tele_delay >= 0){
sprintf (buf,"From: %5d %-22.22s to: %5d %-22.22s Delay: %3d\r\n"
,world[i].number,
world[i].name,world[real_room(world[i].tele_to_room)].number,
world[real_room(world[i].tele_to_room)].name,world[i].tele_delay);
if (strlen(buf2) + strlen(buf) +1 < MAX_STRING_LENGTH)
strcat(buf2,buf);
else{
send_to_char("Too many teleports to list at once!\r\n",ch);
send_to_char("Use the from or about keywords.\r\n",ch);
break;
}
}
}
if (buf2)
page_string(ch->desc,buf2,1);
break;
case 14: /* show GOD objects*/
if (!*value && ch->specials2.edit_zone != -1)
j = ch->specials2.edit_zone;
else if (!is_number(value)){
send_to_char("Illegal zone number.\r\n",ch);
return;}
else
j = atoi(value);
for (zone = 0; zone_table[zone].number != j && zone <= top_of_zone_table; zone++)
;
if (zone +1 <= top_of_zone_table)
next_zone = zone_table[zone+1].number;
else
next_zone = zone_table[zone].number +10;
if (zone > top_of_zone_table)
{
send_to_char("Illegal zone number.\r\n",ch);
return;
}
for(i = 0; i <= top_of_objt; i++){
if((obj_index[i].virtual >= j * 100) && (obj_index[i].virtual < next_zone * 100) && is_goditem(obj_proto + i)){
sprintf (buf,"[%3d] Number: %5d %-30.30s #loaded: %3d\r\n"
,i,obj_index[i].virtual,
obj_proto[i].short_description,
obj_index[i].number);
if (bffzm){
RECREATE(bffzm, char, (strlen(bffzm) + strlen(buf) +1));
strcat(bffzm,buf);}
else{
CREATE(bffzm,char,strlen(buf) +1);
strcpy(bffzm,buf);}
}
}
if (bffzm)
page_string(ch->desc,bffzm,1);
free(bffzm);
break;
case 15: /* show shops */
if (!*value && ch->specials2.edit_zone != -1)
j = ch->specials2.edit_zone;
else if (!is_number(value)) {
send_to_char("Illegal zone number.\r\n",ch);
return;
}
else
j = atoi(value);
*buf2 = '\0';
for(i=0;i<= number_of_shops;i++) {
if (shop_index[i].virtual/100 == j) {
if (shop_index[i].in_room) {
sprintf(buf, "[%3d] Number: %5d in room: %5d %-30.30s \r\n"
,i,shop_index[i].virtual,shop_index[i].in_room,
((shop_index[i].keeper > 0) ?
mob_proto[shop_index[i].keeper].player.short_descr :
"None set"));
strcat(buf2,buf);
}
else {
sprintf(buf, "[%3d] Number: %5d in room: Wander %-30.30s \r\n"
,i,shop_index[i].virtual,
((shop_index[i].keeper > 0) ?
mob_proto[shop_index[i].keeper].player.short_descr :
"None set"));
strcat(buf2,buf);
}
}
}
if (*buf2)
page_string(ch->desc, buf2,1);
else
send_to_char("0 shops in this zone.\r\n",ch);
break;
default:
send_to_char("Sorry, I don't understand that.\r\n", ch);
break;
}
}
#define PC 1
#define NPC 2
#define BOTH 3
#define NEITHER 0
#define MISC 0
#define BINARY 1
#define NUMBER 2
#define SET_OR_REMOVE(flagset, flags) { \
if (on) SET_BIT(flagset, flags); \
else if (off) REMOVE_BIT(flagset, flags); }
#define RANGE(low, high) (value = MAX((low), MIN((high), (value))))
ACMD(do_link_load)
{
struct char_data *cbuf;
struct char_file_u tmp_store;
int player_i, load_result;
char name[100];
one_argument(argument,name);
CREATE(cbuf, struct char_data,1);
clear_char(cbuf);
if ((player_i = load_char(name, &tmp_store)) > -1)
store_to_char(&tmp_store,cbuf);
else {
free_char(cbuf);
send_to_char("There is no such player.\r\n", ch);
return;
}
reset_char(cbuf);
cbuf->next = character_list;
character_list = cbuf;
load_result = Crash_load(cbuf);
char_to_room(cbuf,ch->in_room, FALSE);
sprintf(buf,"%s link loaded by %s. load_result = %d",GET_NAME(cbuf),GET_NAME(ch), load_result);
mudlog(buf, CMP, LEVEL_IMPL, TRUE);
act("$n slowly materialises.",FALSE,cbuf,0,0,TO_ROOM);
}
ACMD(do_rentchar)
{
int j;
struct char_data *vict;
char name[100];
void Crash_extract_objs(struct obj_data *obj);
one_argument(argument,name);
if (!(vict = get_char_vis(ch,name))){
send_to_char("No such player\r\n",ch);
return;
}
else{
if (GET_LEVEL(vict) > GET_LEVEL(ch)){
send_to_char("Uh Uh...\r\n",ch);
return;}
if (vict->in_room != NOWHERE)
char_from_room(vict);
char_to_room(vict,3, FALSE);
if (vict->desc)
close_socket(vict->desc);
vict->desc = 0;
save_char(vict,NOWHERE);
Crash_crashsave(vict);
for (j = 0; j < MAX_WEAR; j++)
if (vict->equipment[j])
obj_to_char(unequip_char(vict, j), vict, 1);
Crash_extract_objs(vict->inventory);
sprintf(buf,"%s force rented by %s.",GET_NAME(vict),GET_NAME(ch));
mudlog(buf, CMP, LEVEL_IMPL, TRUE);
extract_char(vict, FALSE);
}
}
ACMD(do_set)
{
int i,ii, l, amount;
struct char_data *vict;
struct char_data *cbuf;
struct char_file_u tmp_store;
char field[MAX_INPUT_LENGTH], name[MAX_INPUT_LENGTH],
val_arg[MAX_INPUT_LENGTH], orig_name[MAX_NAME_LENGTH + 10];
int on = 0, off = 0, value = 0;
char is_file = 0, is_mob = 0, is_player = 0;
int player_i = -1;
char *pc_races[] = {
"UNDEFINED",
"human",
"elf",
"halfling",
"giant",
"gnome",
"halfelf",
"ogier",
"dwarf",
"selkie",
"pixie",
"amarya",
"troll",
"\n"
};
struct set_struct {
char *cmd;
int level;
char pcnpc;
char type;
} fields[] =
{
{ "brief", LEVEL_GOD, PC, BINARY },
{ "invstart", LEVEL_GOD, PC, BINARY },
{ "title", LEVEL_GOD, PC, MISC },
{ "nosummon", LEVEL_GRGOD, PC, BINARY },
{ "maxhit", LEVEL_GRGOD, BOTH, NUMBER },
{ "maxmana", LEVEL_GRGOD, BOTH, NUMBER },
{ "maxmove", LEVEL_GRGOD, BOTH, NUMBER },
{ "hit", LEVEL_ASS_IMPL, BOTH, NUMBER },
{ "mana", LEVEL_GRGOD, BOTH, NUMBER },
{ "move", LEVEL_ASS_IMPL, BOTH, NUMBER },
{ "align", LEVEL_GOD, BOTH, NUMBER },
{ "str", LEVEL_GRGOD, BOTH, NUMBER },
{ "stradd", LEVEL_GRGOD, BOTH, NUMBER },
{ "int", LEVEL_GRGOD, BOTH, NUMBER },
{ "wis", LEVEL_GRGOD, BOTH, NUMBER },
{ "dex", LEVEL_GRGOD, BOTH, NUMBER },
{ "con", LEVEL_GRGOD, BOTH, NUMBER },
{ "sex", LEVEL_GRGOD, BOTH, MISC },
{ "ac", LEVEL_GRGOD, BOTH, NUMBER },
{ "gold", LEVEL_GOD, BOTH, NUMBER },
{ "bank", LEVEL_GOD, PC, NUMBER },
{ "exp", LEVEL_ASS_IMPL, BOTH, NUMBER },
{ "hitroll", LEVEL_GRGOD, BOTH, NUMBER },
{ "damroll", LEVEL_GRGOD, BOTH, NUMBER },
{ "invis", LEVEL_IMPL, PC, NUMBER },
{ "nohassle", LEVEL_GRGOD, PC, BINARY },
{ "frozen", LEVEL_FREEZE, PC, BINARY },
{ "practices", LEVEL_ASS_IMPL, PC, NUMBER },
{ "lessons", LEVEL_ASS_IMPL, PC, NUMBER },
{ "drunk", LEVEL_GOD, BOTH, MISC },
{ "hunger", LEVEL_GOD, BOTH, MISC },
{ "thirst", LEVEL_GOD, BOTH, MISC },
{ "killer", LEVEL_GOD, PC, BINARY },
{ "thief", LEVEL_GOD, PC, BINARY },
{ "level", LEVEL_ASS_IMPL, BOTH, NUMBER },
{ "roomflag", LEVEL_GRGOD, PC, BINARY },
{ "room", LEVEL_IMPL, BOTH, NUMBER },
{ "siteok", LEVEL_IMPL, PC, BINARY },
{ "deleted", LEVEL_IMPL, PC, BINARY },
{ "race", LEVEL_IMPL, BOTH, MISC },
{ "nowizlist", LEVEL_GOD, PC, BINARY },
{ "quest", LEVEL_GOD, PC, BINARY },
{ "loadroom", LEVEL_GRGOD, PC, MISC },
{ "color", LEVEL_GOD, PC, BINARY },
{ "idnum", LEVEL_IMPL, PC, NUMBER },
{ "passwd", LEVEL_IMPL, PC, MISC },
{ "nodelete", LEVEL_GOD, PC, BINARY },
{ "chr", LEVEL_ASS_IMPL, BOTH, NUMBER},
{ "per", LEVEL_ASS_IMPL, BOTH, NUMBER},
{ "gui", LEVEL_ASS_IMPL, BOTH, NUMBER},
{ "luc", LEVEL_ASS_IMPL, BOTH, NUMBER},
{ "maxpower", LEVEL_GRGOD, BOTH, NUMBER },
{ "power", LEVEL_GRGOD, BOTH, NUMBER },
{ "height", LEVEL_GRGOD, BOTH, NUMBER },
{ "weight", LEVEL_GRGOD, BOTH, NUMBER },
{ "foc", LEVEL_ASS_IMPL, BOTH, NUMBER},
{ "dev", LEVEL_IMPL, BOTH, NUMBER},
{ "zone", LEVEL_ASS_IMPL, BOTH, NUMBER},
{ "stopping", LEVEL_ASS_IMPL, BOTH, NUMBER},
{ "zone2", LEVEL_ASS_IMPL, PC, NUMBER},
{ "zone3", LEVEL_ASS_IMPL, PC, NUMBER},
{ "debug", LEVEL_ASS_IMPL, PC, BINARY},
{ "idle", LEVEL_IMPL, PC, NUMBER},
{ "name", LEVEL_IMPL, PC, MISC},
{ "time", LEVEL_IMPL, BOTH, NUMBER},
{ "holylight", LEVEL_IMPL, PC, BINARY},
{ "\n", 0, NEITHER, MISC }
};
if (!*argument)
{
sprintf(buf, "The following set commands are available to you:\r\n");
buf2[0] = '\0';
for (ii=0,i=0;*(fields[i].cmd) != '\n';i++)
if (fields[i].level <= GET_LEVEL(ch)){
sprintf(buf2,"%s%-15s%s",buf2,fields[i].cmd, (!(++ii % 5) ? "\r\n": ""));
}
page_string(ch->desc, buf2, 1);
return;
}
sprintf(buf2,"%s", argument);
half_chop(argument, name, buf);
if (!strcmp(name, "file")) {
is_file = 1;
half_chop(buf, name, buf);
} else if (!str_cmp(name, "player")) {
is_player = 1;
half_chop(buf, name, buf);
} else if (!str_cmp(name, "mob")) {
is_mob = 1;
half_chop(buf, name, buf);
}
half_chop(buf, field, buf);
strcpy(val_arg, buf);
if (!*name || !*field) {
send_to_char("Usage: set <victim> <field> <value>\r\n", ch);
return;
}
if (IS_NPC(ch)) {
send_to_char("None of that!\r\n", ch);
return;
}
for (l = 0; *(fields[l].cmd) != '\n'; l++)
if (!strncmp(field, fields[l].cmd, strlen(field)))
break;
if (!is_file) {
if (is_player) {
if (!(vict = get_player_vis(ch, name))) {
send_to_char("There is no such player.\r\n", ch);
return;
}
} else {
if (!(vict = get_char_vis(ch, name)) && fields[l].pcnpc != NEITHER) {
send_to_char("There is no such creature.\r\n", ch);
return;
}
else if (fields[l].pcnpc != NEITHER)
vict == ch;
}
}
else if (is_file) {
CREATE(cbuf, struct char_data, 1);
clear_char(cbuf);
if (is_number(name)){
player_i = atoi(name);
load_char_bynum(player_i, &tmp_store);
}
else
player_i= load_char(name, &tmp_store);
if(player_i > -1) {
store_to_char(&tmp_store, cbuf);
if (GET_LEVEL(cbuf) >= GET_LEVEL(ch)){
free_char(cbuf);
send_to_char("Sorry, you can't do that.\r\n", ch);
return;
}
vict = cbuf;
}
else {
free(cbuf);
send_to_char("There is no such player.\r\n", ch);
return;
}
}
if (GET_LEVEL(ch) != LEVEL_IMPL && (fields[l].pcnpc != NEITHER)) {
if (!IS_NPC(vict) && GET_LEVEL(ch) <= GET_LEVEL(vict) && vict != ch) {
send_to_char("Maybe that's not such a great idea...\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
}
if (GET_LEVEL(ch) < fields[l].level) {
send_to_char("You are not godly enough for that!\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
if (IS_NPC(vict) && (fields[l].pcnpc != NEITHER)
&& (!fields[l].pcnpc && NPC)) {
send_to_char("You can't do that to a beast!\r\n", ch);
if (is_file)
free_char(cbuf);
return;
} else if (!IS_NPC(vict) && (fields[l].pcnpc != NEITHER)
&& (!fields[l].pcnpc && PC)) {
send_to_char("That can only be done to a beast!\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
if (fields[l].type == BINARY) {
if (!strcmp(val_arg, "on") || !strcmp(val_arg, "yes"))
on = 1;
else if (!strcmp(val_arg, "off") || !strcmp(val_arg, "no"))
off = 1;
if (!(on || off)) {
send_to_char("Value must be on or off.\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
} else if (fields[l].type == NUMBER) {
value = atoi(val_arg);
}
strcpy(buf, "Okay.");
if (!IS_NPC(vict)){
sprintf(buf,"(GC) %s set %s.",GET_NAME(ch),buf2);
mudlog(buf, CMP,GET_LEVEL(ch), TRUE);
}
switch (l) {
case 0:
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_BRIEF);
break;
case 1:
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_INVSTART);
break;
case 2:
if (GET_TITLE(vict))
RECREATE(GET_TITLE(vict), char, strlen(val_arg) + 1);
else
CREATE(GET_TITLE(vict), char, strlen(val_arg) + 1);
strcpy(GET_TITLE(vict), val_arg);
parse_text(vict,ch,0,buf2);
sprintf(buf, "%s is now: %s", GET_NAME(vict), buf2);
break;
case 3:
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_SUMMONABLE);
on = !on; /* so output will be correct */
break;
case 4:
vict->points.max_hit = RANGE(1, 5000);
affect_total(vict);
break;
case 5:
break;
case 6:
vict->points.max_move = RANGE(1, 5000);
affect_total(vict);
break;
case 7:
vict->points.hit = RANGE(-9, vict->points.max_hit);
affect_total(vict);
break;
case 8:
affect_total(vict);
break;
case 9:
vict->points.move = RANGE(0, vict->points.max_move);
affect_total(vict);
break;
case 10:
GET_ALIGNMENT(vict) = RANGE(-1000, 1000);
affect_total(vict);
break;
case 11:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.str = value;
vict->abilities.str_add = 0;
affect_total(vict);
break;
case 12:
vict->abilities.str_add = RANGE(0, 100);
/* if (value > 0)
vict->abilities.str = 18; */
affect_total(vict);
break;
case 13:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.intel = value;
affect_total(vict);
break;
case 14:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.wis = value;
affect_total(vict);
break;
case 15:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.dex = value;
affect_total(vict);
break;
case 16:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.con = value;
affect_total(vict);
break;
case 17:
if (!str_cmp(val_arg, "male"))
vict->player.sex = SEX_MALE;
else if (!str_cmp(val_arg, "female"))
vict->player.sex = SEX_FEMALE;
else if (!str_cmp(val_arg, "neutral"))
vict->player.sex = SEX_NEUTRAL;
else {
send_to_char("Must be 'male', 'female', or 'neutral'.\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
break;
case 18:
vict->points.armor[0] = RANGE(-100, 100);
vict->points.armor[1] = RANGE(-100, 100);
vict->points.armor[2] = RANGE(-100, 100);
vict->points.armor[3] = RANGE(-100, 100);
affect_total(vict);
break;
case 19:
amount = -1*GET_GOLD(vict);
change_gold(vict, amount);
drop_excess_gold(vict,RANGE(0, 100000));
break;
case 20:
GET_BANK_GOLD(vict) = RANGE(0, 100000);
break;
case 21:
vict->points.exp = RANGE(0, 500000000);
break;
case 22:
vict->points.hitroll = RANGE(-100, 100);
affect_total(vict);
break;
case 23:
vict->points.damroll = RANGE(-200, 200);
affect_total(vict);
break;
case 24:
if (GET_LEVEL(ch) < LEVEL_IMPL && ch != vict) {
send_to_char("You aren't godly enough for that!\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
GET_INVIS_LEV(vict) = RANGE(0, GET_LEVEL(vict));
break;
case 25:
if (GET_LEVEL(ch) < LEVEL_IMPL && ch != vict) {
send_to_char("You aren't godly enough for that!\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_NOHASSLE);
break;
case 26:
if (ch == vict) {
send_to_char("Better not -- could be a long winter!\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_FROZEN);
break;
case 27:
case 28:
SPELLS_TO_LEARN(vict) = value;
break;
case 29:
case 30:
case 31:
if (!str_cmp(val_arg, "off")) {
GET_COND(vict, (l - 29)) = (char) -1;
sprintf(buf, "%s's %s now off.", GET_NAME(vict),
fields[l].cmd);
} else if (is_number(val_arg)) {
value = atoi(val_arg);
RANGE(0, 24);
GET_COND(vict, (l - 29)) = (char) value;
sprintf(buf, "%s's %s set to %d.", GET_NAME(vict),
fields[l].cmd, value);
} else {
send_to_char("Must be 'off' or a value from 0 to 24.\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
break;
case 32:
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_KILLER);
break;
case 33:
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_THIEF);
break;
case 34:
if ((GET_LEVEL(ch) < LEVEL_IMPL || value > GET_LEVEL(ch))) {
send_to_char("You cannot raise someone above your own level!\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
if (value > LEVEL_IMPL +1){
if (is_file)
free_char(cbuf);
return;
}
vict->player.level = (int) value;
break;
case 35:
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_ROOMFLAGS);
break;
case 36:
if ((i = real_room(value)) < 0) {
send_to_char("No room exists with that number.\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
char_from_room(vict);
char_to_room(vict, i, FALSE);
break;
case 37:
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_SITEOK);
break;
case 38:
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_DELETED);
break;
case 39:
if ((value = search_block(val_arg,pc_races, FALSE)))
vict->player.race = value;
else{
send_to_char("Hmm don't know about that race sorry.\r\n",ch);
if (is_file)
free_char(cbuf);
return;
}
break;
case 40:
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_NOWIZLIST);
break;
case 41:
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_QUEST);
break;
case 42:
if (!str_cmp(val_arg, "on"))
SET_BIT(PLR_FLAGS(vict), PLR_LOADROOM);
else if (!str_cmp(val_arg, "off"))
REMOVE_BIT(PLR_FLAGS(vict), PLR_LOADROOM);
else {
if (real_room(i = atoi(val_arg)) > -1) {
GET_LOADROOM(vict) = i;
sprintf(buf, "%s will enter at %d.", GET_NAME(vict),
GET_LOADROOM(vict));
} else
sprintf(buf, "That room does not exist!");
}
break;
case 43:
SET_OR_REMOVE(PRF_FLAGS(vict), (PRF_COLOR_1 | PRF_COLOR_2));
break;
case 44:
if (!IS_NPC(vict))
if (is_file)
free_char(cbuf);
return;
vict->specials2.idnum = value;
break;
case 45:
if (!is_file)
return;
if (GET_LEVEL(vict) > GET_LEVEL(ch)) {
send_to_char("You cannot change that.\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
strncpy(tmp_store.pwd, CRYPT(val_arg, tmp_store.name), MAX_PWD_LENGTH);
tmp_store.pwd[MAX_PWD_LENGTH] = '\0';
sprintf(buf, "Password changed to '%s'.", val_arg);
break;
case 46:
SET_OR_REMOVE(PLR_FLAGS(vict), PLR_NODELETE);
break;
case 47:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.chr = value;
affect_total(vict);
break;
case 48:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.per = value;
affect_total(vict);
break;
case 49:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.gui = value;
affect_total(vict);
break;
case 50:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.luc = value;
affect_total(vict);
break;
case 51:
break;
case 52:
break;
case 53:
vict->player.height = RANGE(15,300);
affect_total(vict);
break;
case 54:
vict->player.weight = RANGE(150,4000);
affect_total(vict);
break;
case 55:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.foc = value;
affect_total(vict);
break;
case 56:
if (IS_NPC(vict) || GET_LEVEL(vict) >= LEVEL_GRGOD)
RANGE(3, 30);
else
RANGE(3, 30);
vict->abilities.dev = value;
affect_total(vict);
break;
case 57:
if (GET_LEVEL(vict) >= LEVEL_BUILDER)
RANGE(-1, 999);
else{
if (is_file)
free_char(cbuf);
return;
}
if (IS_SET(ch->specials2.builder_flag,BUILD_ZONE) && ch->specials2.edit_zone > 0){
i = save_zone(ch->specials2.edit_zone);
sprintf(buf,"(%s) Autosaving %d zone resets for zone: %ld",
GET_NAME(ch),i,ch->specials2.edit_zone);
mudlog(buf, NRM, MAX(LEVEL_BUILDER, GET_INVIS_LEV(ch)), TRUE);
REMOVE_BIT(ch->specials2.builder_flag,BUILD_ZONE);
}
if (IS_SET(ch->specials2.builder_flag,BUILD_SHOPS) && ch->specials2.edit_zone > 0){
i = save_shops(ch->specials2.edit_zone);
sprintf(buf,"(%s) Autosaving %d shops for zone: %ld",
GET_NAME(ch),i,ch->specials2.edit_zone);
mudlog(buf, NRM, MAX(LEVEL_BUILDER, GET_INVIS_LEV(ch)), TRUE);
REMOVE_BIT(ch->specials2.builder_flag,BUILD_SHOPS);
}
if (IS_SET(ch->specials2.builder_flag,BUILD_MOBS) && ch->specials2.edit_zone > 0){
i = save_mobiles(ch->specials2.edit_zone);
sprintf(buf,"(%s) Autosaving %d mobiles for zone: %ld",
GET_NAME(ch),i,ch->specials2.edit_zone);
mudlog(buf, NRM, MAX(LEVEL_BUILDER, GET_INVIS_LEV(ch)), TRUE);
REMOVE_BIT(ch->specials2.builder_flag,BUILD_MOBS);
}
if (IS_SET(ch->specials2.builder_flag,BUILD_ROOMS) && ch->specials2.edit_zone > 0){
i = save_rooms(ch->specials2.edit_zone);
sprintf(buf,"(%s) Autosaving %d rooms for zone: %ld",
GET_NAME(ch),i,ch->specials2.edit_zone);
mudlog(buf, NRM, MAX(LEVEL_BUILDER, GET_INVIS_LEV(ch)), TRUE);
REMOVE_BIT(ch->specials2.builder_flag,BUILD_ROOMS);
}
sprintf(buf,"(%s) Setting zone for %s to: %ld",GET_NAME(ch),
GET_NAME(vict), value);
mudlog(buf, NRM, MAX(LEVEL_BUILDER, GET_INVIS_LEV(ch)), TRUE);
vict->specials2.edit_zone = value;
break;
case 58:
vict->points.stopping[0] = RANGE(0, 20);
vict->points.stopping[1] = RANGE(0, 20);
vict->points.stopping[2] = RANGE(0, 20);
vict->points.stopping[3] = RANGE(0, 20);
affect_total(vict);
break;
case 59:
if (GET_LEVEL(vict) >= LEVEL_BUILDER)
RANGE(-1, 999);
else{
if (is_file)
free_char(cbuf);
return;
}
sprintf(buf,"(%s) Setting zone2 for %s to: %ld",GET_NAME(ch),
GET_NAME(vict), value);
mudlog(buf, NRM, MAX(LEVEL_BUILDER, GET_INVIS_LEV(ch)), TRUE);
vict->specials2.edit_zone2 = value;
break;
case 60:
if (GET_LEVEL(vict) >= LEVEL_BUILDER)
RANGE(-1, 999);
else{
if (is_file)
free_char(cbuf);
return;
}
sprintf(buf,"(%s) Setting zone3 for %s to: %ld",GET_NAME(ch),
GET_NAME(vict), value);
mudlog(buf, NRM, MAX(LEVEL_BUILDER, GET_INVIS_LEV(ch)), TRUE);
vict->specials2.edit_zone3 = value;
break;
case 61:
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_DEBUG);
break;
case 62:
vict->specials.timer = value;
break;
case 63:
if (GET_LEVEL(ch) < LEVEL_IMPL) {
send_to_char("You cannot change that.\r\n", ch);
if (is_file)
free_char(cbuf);
return;
}
strcpy(orig_name, vict->player.name);
for (i=0;i <= top_of_p_table;i++)
if (!str_cmp((player_table + i)->name, orig_name))
break;
RECREATE((player_table + i)->name, char, strlen(val_arg) +1);
RECREATE(vict->player.name, char, strlen(val_arg) +1);
strcpy(vict->player.name, val_arg);
strcpy(orig_name, val_arg);
for (ii=0;(*(val_arg +ii) = LOWER(*(orig_name +ii))); ii++)
;
strcpy((player_table +i)->name, val_arg);
sprintf(buf, "Name changed to '%s'.", val_arg);
break;
case 64:
if (value > 23 || value < 0) {
send_to_char("Time out of range...\r\n",ch);
if (is_file)
free_char(cbuf);
return;
}
time_info.hours = value;
break;
case 65:
SET_OR_REMOVE(PRF_FLAGS(vict), PRF_HOLYLIGHT);
break;
default:
sprintf(buf, "Can't set that!");
break;
}
if (fields[l].type == BINARY) {
sprintf(buf, "%s %s for %s.\r\n", fields[l].cmd, ONOFF(on),
GET_NAME(vict));
CAP(buf);
} else if (fields[l].type == NUMBER) {
sprintf(buf, "%s's %s set to %d.\r\n", GET_NAME(vict),
fields[l].cmd, value);
} else
strcat(buf, "\r\n");
send_to_char(buf, ch);
if (!is_file && !IS_NPC(vict) && (fields[l].pcnpc != NEITHER))
save_char(vict, NOWHERE);
if (is_file) {
char_to_store(vict, &tmp_store);
fseek(player_fl, (player_i) * sizeof(struct char_file_u), SEEK_SET);
fwrite(&tmp_store, sizeof(struct char_file_u), 1, player_fl);
free_char(cbuf);
send_to_char("Saved in file.\r\n", ch);
}
if((GET_LEVEL(ch) < LEVEL_IMPL)){
sprintf(buf,"(GC) %s set %s",GET_NAME(ch), argument);
mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE);
}
}