/* ************************************************************************
* 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 <string.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <malloc.h>
#include <stdlib.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"
/* external vars */
extern struct room_data *world;
extern struct char_data *character_list;
extern struct descriptor_data *descriptor_list;
extern struct index_data *mob_index;
extern struct index_data *obj_index;
extern int nokillflag,nostealflag,nonewplayers,noshoutflag,nonewconnect;
extern int maxpokerbet,hitchance,mischance,defaulthelper;
extern int top_of_world,mobdeaths,pcdeaths,boottime,momsreadflag;
extern int shutdownwarn,shutdowngame,droptotal,newsflashflag;
extern int bobflag,jokecount,grand_total,reboottime,melsnumber;
extern char *bobname;
extern struct char_data *character_list;
extern struct obj_data *object_list;
extern struct descriptor_data *descriptor_list;
extern dig_room, build_room, dig_vnum, build_vnum;
/* external functs */
void do_wiznet(struct char_data *ch, char *argument, int cmd);
void do_look(struct char_data *ch, char *argument, int cmd);
void set_title(struct char_data *ch);
int str_cmp(char *arg1, char *arg2);
struct time_info_data age(struct char_data *ch);
void sprinttype(int type, char *names[], char *result);
void sprintbit(long vektor, char *names[], char *result);
int mana_limit(struct char_data *ch);
int hit_limit(struct char_data *ch);
int move_limit(struct char_data *ch);
int mana_gain(struct char_data *ch);
int hit_gain(struct char_data *ch);
int move_gain(struct char_data *ch);
void to_long_long(char *s, long long n);
#ifdef NEEDS_STRDUP
char *strdup(char *s);
#endif
do_emote(struct char_data *ch, char *argument, int cmd)
{
int i;
static char buf[MAX_STRING_LENGTH];
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i))
send_to_char("Yes.. But what?\n\r", ch);
else {
sprintf(buf,"$n %s", argument + i);
act(buf,FALSE,ch,0,0,TO_ROOM);
if(!IS_NPC(ch) && IS_SET(ch->specials.act,PLR_REPEAT)) {
sprintf(buf,"%s %s\n\r",GET_NAME(ch),argument + i);
send_to_char(buf,ch);
}
else
send_to_char("Ok.\n\r", ch);
}
}
void do_echo(struct char_data *ch, char *argument, int cmd)
{
int i;
static char buf[MAX_STRING_LENGTH];
if(GET_LEVEL(ch) < IMO){
if(!IS_SET(ch->specials.act,PLR_ECHO)){
send_to_char("Huh?\n\r",ch);
return;
}
REMOVE_BIT(ch->specials.act,PLR_ECHO);
}
for (i = 0; *(argument + i) == ' '; i++);
if (!*(argument + i))
send_to_char("That must be a mistake...\n\r", ch);
else
{
sprintf(buf,"%s\n\r", argument + i);
send_to_room(buf, ch->in_room);
/* send_to_room_except(buf, ch->in_room, ch); */
send_to_char("Ok.\n\r", ch);
}
}
void do_trans(struct char_data *ch, char *argument, int cmd)
{
struct descriptor_data *i;
struct char_data *victim,*cons;
char buf[100];
sh_int target;
if (IS_NPC(ch))
return;
one_argument(argument,buf);
if (!*buf)
send_to_char("Who do you wich to transfer?\n\r",ch);
else if (str_cmp("all", buf)) {
if (!(victim = get_char_vis(ch,buf)))
send_to_char("No-one by that name around.\n\r",ch);
else {
if(GET_LEVEL(victim) > GET_LEVEL(ch)){
send_to_char("That might not be appreciated.\n\r",ch);
return;
}
act("$n disappears in a mushroom cloud.",FALSE,victim,0,0,TO_ROOM);
target = ch->in_room;
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);
send_to_char("Ok.\n\r",ch);
}
} else { /* Trans All */
if(ch->player.level >= IMO+999)
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected) {
target = ch->in_room;
victim = i->character;
if(GET_LEVEL(victim) >= GET_LEVEL(ch)) continue;
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);
}
send_to_char("Ok.\n\r",ch);
}
}
void do_at(struct char_data *ch, char *argument, int cmd)
{
char command[MAX_INPUT_LENGTH], loc_str[MAX_INPUT_LENGTH];
int loc_nr, location, original_loc;
struct char_data *target_mob;
struct obj_data *target_obj;
if (IS_NPC(ch))
return;
half_chop(argument, loc_str, command);
if (!*loc_str) {
send_to_char("You must supply a room number or a name.\n\r", ch);
return;
}
if (isdigit(*loc_str)) {
loc_nr = atoi(loc_str);
for (location = 0; location <= top_of_world; location++)
if (world[location].number == loc_nr)
break;
else if (location == top_of_world) {
send_to_char("No room exists with that number.\n\r", ch);
return;
}
} else if (target_mob = get_char_vis(ch, loc_str))
location = target_mob->in_room;
else if (target_obj = get_obj_vis(ch, loc_str))
if (target_obj->in_room != NOWHERE)
location = target_obj->in_room;
else {
send_to_char("The object is not available.\n\r", ch);
return;
} else {
send_to_char("No such creature or object around.\n\r", ch);
return;
}
/* a location has been found. */
original_loc = ch->in_room;
char_from_room(ch);
char_to_room(ch, location);
command_interpreter(ch, command);
/* check if the guy's still there */
for (target_mob = world[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);
}
}
int room_virtual_to_real(int vn)
{
int lo,hi,mid,n;
lo=0;
hi=top_of_world;
while(lo<=hi){
mid=(lo+hi)>>1;
n=world[mid].number;
if(vn == n)
return mid;
else if(vn < n)
hi=mid-1;
else
lo=mid+1;
}
return -1;
}
void do_goto(struct char_data *ch, char *argument, int cmd)
{
char buf[MAX_INPUT_LENGTH];
int loc_nr, location,i,flag;
struct char_data *target_mob, *pers;
struct obj_data *target_obj;
if(IS_NPC(ch) && (GET_LEVEL(ch) < IMO))
return;
one_argument(argument, buf);
if (!*buf) {
send_to_char("You must supply a room number or a name.\n\r", ch);
return;
}
if (isdigit(*buf)) {
loc_nr = atoi(buf);
location = room_virtual_to_real(loc_nr);
if(location < 0){
send_to_char("No room exists with that number.\n\r", ch);
return;
}
} else if (target_mob = get_char_vis(ch, buf))
location = target_mob->in_room;
else if (target_obj = get_obj_vis(ch, buf))
if (target_obj->in_room != NOWHERE)
location = target_obj->in_room;
else {
send_to_char("The object is not available.\n\r", ch);
return;
} else {
send_to_char("No such creature or object around.\n\r", ch);
return;
}
/* a location has been found. */
flag=((GET_LEVEL(ch)>IMO)&&
IS_SET(ch->specials.act,PLR_WIZINVIS));
if(!flag){
if(GET_LEVEL(ch) > 9000)
act("Your world is poorer, because $n has left!",FALSE,ch,0,0,TO_ROOM);
else
act("$n disappears in a puff of smoke.",FALSE,ch,0,0,TO_ROOM);
}
char_from_room(ch);
char_to_room(ch, location);
if(!flag){
if(GET_LEVEL(ch) > 9000)
act("Yippee! $n has appeared out of thin air!", FALSE,ch,0,0,TO_ROOM);
else
act("$n appears with an ear-splitting bang.", FALSE, ch, 0,0,TO_ROOM);
}
GET_POS(ch) = POSITION_STANDING;
do_look(ch,"",15);
}
void do_stat(struct char_data *ch, char *argument, int cmd)
{
extern char *spells[];
struct affected_type *aff;
char arg1[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
struct char_data *victim=0, *mnt;
struct room_data *rm=0;
struct char_data *k=0;
struct obj_data *j=0;
struct obj_data *j2=0;
struct extra_descr_data *desc;
struct follow_type *fol;
int i,i2,t,virtual;
bool found;
char bufshort[32];
/* 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 *equipment_types[];
extern char *affected_bits[];
extern char *apply_types[];
extern char *action_bits[];
extern char *player_bits[];
extern char *position_types[];
extern char *connected_types[];
struct char_data *get_specific_vis(struct char_data *ch,char *name,int type);
if (IS_NPC(ch))
return;
argument = one_argument(argument, arg1);
if (!*arg1) {
send_to_char("Stats on who or what?\n\r",ch);
return;
} else {
/* stats on room */
if((cmd != 232) && (cmd != 233) && (!str_cmp("room", arg1))) {
rm = &world[ch->in_room];
sprintf(buf,"Room: %s, Zone: %d. V-Num: %d, R-num: %d, Light: %d.\n\r",
rm->name, rm->zone, rm->number, ch->in_room, rm->light);
send_to_char(buf, ch);
sprinttype(rm->sector_type,sector_types,buf2);
sprintf(buf, "Sector type : %s, ", buf2);
send_to_char(buf, ch);
strcpy(buf,"Special procedure : ");
strcat(buf,(rm->funct) ? "Exists\n\r" : "No\n\r");
send_to_char(buf,ch);
sprintf(buf,"Room flags (%d): ",(long) rm->room_flags);
send_to_char(buf,ch);
sprintbit((long) rm->room_flags,room_bits,buf);
strcat(buf,"\n\r");
send_to_char(buf,ch);
send_to_char("Description:\n\r", ch);
send_to_char(rm->description, ch);
#ifdef VERBOSE_STAT
strcpy(buf, "Extra description keywords(s): ");
if(rm->ex_description) {
strcat(buf, "\n\r");
for (desc = rm->ex_description; desc; desc = desc->next) {
strcat(buf, desc->keyword);
strcat(buf, "\n\r");
}
strcat(buf, "\n\r");
send_to_char(buf, ch);
} else {
strcat(buf, "None\n\r");
send_to_char(buf, ch);
}
#endif
strcpy(buf, "Chars present:\n\r");
for (k = rm->people; k; k = k->next_in_room) {
if(!CAN_SEE(ch,k)) continue;
strcat(buf, GET_NAME(k));
strcat(buf,
(!IS_NPC(k) ? "(PC)\n\r" : (!IS_MOB(k) ? "(NPC)\n\r" : "(MOB)\n\r")));
}
strcat(buf, "\n\r");
send_to_char(buf, ch);
strcpy(buf, "Contents:\n\r");
for (j = rm->contents; j; j = j->next_content) {
strcat(buf, j->name);
strcat(buf, "\n\r");
}
strcat(buf, "\n\r");
send_to_char(buf, ch);
return;
}
if((cmd != 232) && (cmd != 233) && (j = get_obj_vis(ch, arg1))) {
virtual = (j->item_number >= 0) ? obj_index[j->item_number].virtual : 0;
sprintf(buf,"Object name: [%s], R-num: [%d], V-number: [%d] Item type: ",
j->name, j->item_number, virtual);
sprinttype(GET_ITEM_TYPE(j),item_types,buf2);
strcat(buf,buf2); strcat(buf,"\n\r");
send_to_char(buf, ch);
sprintf(buf, "Short desc: %s\n\rLong desc:\n\r%s\n\r",
((j->short_description) ? j->short_description : "None"),
((j->description) ? j->description : "None") );
send_to_char(buf, ch);
if(j->ex_description){
strcpy(buf, "Extra desc keyword(s):\n\r");
for (desc = j->ex_description; desc; desc = desc->next) {
strcat(buf, desc->keyword);
strcat(buf, "\n\r");
}
send_to_char(buf, ch);
}
sprintf(buf,"Worn (%d): ",j->obj_flags.wear_flags);
send_to_char(buf, ch);
sprintbit(j->obj_flags.wear_flags,wear_bits,buf);
strcat(buf,"\n\r");
send_to_char(buf, ch);
sprintf(buf,"Extra(%d): ",j->obj_flags.extra_flags);
send_to_char(buf, ch);
sprintbit(j->obj_flags.extra_flags,extra_bits,buf);
strcat(buf,"\n\r");
send_to_char(buf,ch);
sprintf(buf,"Wgt: %d, Val: %d, Rent: %d, Timer: %d, ID: %d\n\r",
j->obj_flags.weight,j->obj_flags.cost,j->obj_flags.rentlevel,
j->obj_flags.timer,j->oid);
send_to_char(buf, ch);
sprintf(buf,"Values 0-3 : [%d] [%d] [%d] [%d]\n\r",
j->obj_flags.value[0],
j->obj_flags.value[1],
j->obj_flags.value[2],
j->obj_flags.value[3]);
send_to_char(buf, ch);
for (i=0;i<MAX_OBJ_AFFECT;++i) {
sprinttype(j->affected[i].location,apply_types,buf2);
sprintf(buf,"Affects: %s by %d\n\r",buf2,j->affected[i].modifier);
send_to_char(buf, ch);
}
return;
}
if(cmd==233) k=get_specific_vis(ch,arg1,0);
else if(cmd==232) k=get_specific_vis(ch,arg1,1);
else k=get_char_vis(ch,arg1);
if(k){
sprintf(buf,"Sex: %d,",k->player.sex);
sprintf(buf2, " %s, Name: %s\n\r",
(!IS_NPC(k) ? "PC" : (!IS_MOB(k) ? "NPC" : "MOB")),
GET_NAME(k));
strcat(buf, buf2);
send_to_char(buf, ch);
if(IS_NPC(k)) {
sprintf(buf, "V-Number [%d]\n\r", mob_index[k->nr].virtual);
send_to_char(buf, ch);
strcpy(buf,"Short desc: ");
strcat(buf,(k->player.short_descr ? k->player.short_descr : "None"));
strcat(buf,"\n\r");
send_to_char(buf,ch);
}
if(k->player.title){
strcpy(buf,"Title: ");
strcat(buf, (k->player.title ? k->player.title : "None"));
strcat(buf,"\n\r");
send_to_char(buf,ch);
}
sprintf(buf,"Level = %d, Alignment = %d\n\r",k->player.level,
k->specials.alignment);
send_to_char(buf, ch);
strcpy(buf,"Birth: ");
t=k->player.time.birth;
strncat(buf,(char *)ctime((time_t *)&t),24);
strcat(buf,", Logon: ");
t=k->player.time.logon;
strncat(buf,(char *)ctime((time_t *)&t),24);
/* SLUG_CHANGE 11-17-96 add the logon time so that it updates */
t=k->player.time.played+time(0)-k->player.time.logon;
i=t%86400;
sprintf(buf2,"\n\rPlayed: %d days, %d:%02d:%02d\n\r",
t/86400,i/3600,(i%3600)/60,(i)%60);
strcat(buf,buf2);
send_to_char(buf, ch);
sprintf(buf,"Age: %d Y, %d M, %d D, %d H.\n\r",
age(k).year, age(k).month, age(k).day, age(k).hours);
send_to_char(buf,ch);
sprintf(buf,"Str:[%d] Int:[%d] Wis:[%d] Dex:[%d] Con:[%d]\n\r",
GET_STR(k), GET_INT(k),
GET_WIS(k), GET_DEX(k), GET_CON(k) );
send_to_char(buf,ch);
sprintf(buf,"Mana: %d/%d+%d, Hits: %d/%d+%d, Moves: %d/%d+%d\n\r",
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) );
send_to_char(buf,ch);
sprintf(buf,"MAG_RES = %d, Saving throws: ",k->specials.magres);
for(i=0;i<5;++i){
i2=k->specials.apply_saving_throw[i]+
GET_SAVING_THROW(GET_LEVEL(k));
sprintf(buf2,"%4d",i2);
strcat(buf,buf2);
}
strcat(buf,"\n\r");
send_to_char(buf,ch);
to_long_long(bufshort,k->points.bank);
sprintf(buf,
"AC=%d/10, Gold=%d, Xp=%d, Meta=%d, Hit=%d, Dam=%d, Bank=%s\n\r",
GET_AC(k), GET_GOLD(k), GET_EXP(k), GET_META(k),
k->points.hitroll, k->points.damroll, bufshort);
send_to_char(buf,ch);
if (IS_NPC(k)) {
strcpy(buf,"Special: ");
strcat(buf,(mob_index[k->nr].func ? "Exists\n\r" : "None\n\r"));
send_to_char(buf, ch);
sprintf(buf, "NPC Bare Hand Damage %dd%d.\n\r",
k->specials.damnodice, k->specials.damsizedice);
send_to_char(buf, ch);
} else {
sprintf(buf,"Kills: %d, Deaths: %d\n\r",
k->points.kills,k->points.deaths);
send_to_char(buf,ch);
}
#ifdef VERBOSE_STAT
sprintf(buf,"Carried weight: %d Carried items: %d\n\r",
IS_CARRYING_W(k),
IS_CARRYING_N(k) );
send_to_char(buf,ch);
for(i=0,j=k->carrying;j;j=j->next_content,i++);
sprintf(buf,"Items in inv: %d, ",i);
for(i=0,i2=0;i<MAX_WEAR;i++)
if (k->equipment[i]) i2++;
sprintf(buf2,"Items in equ: %d\n\r", i2);
strcat(buf,buf2);
send_to_char(buf, ch);
#endif
if(k->desc){
sprinttype(k->desc->connected,connected_types,buf2);
strcpy(buf,"Connected: ");
strcat(buf,buf2);
sprintf(buf2," %s (%d)\n\r",k->desc->host,k->desc->descriptor);
strcat(buf,buf2);
send_to_char(buf,ch);
}
if(IS_NPC(k)) {
sprintf(buf,"NPC flags (%d): ",k->specials.act);
sprintbit(k->specials.act,action_bits,buf2);
} else {
sprintf(buf,"PC flags (%d): ",k->specials.act);
sprintbit(k->specials.act,player_bits,buf2);
}
strcat(buf,buf2);
strcat(buf,"\n\r");
send_to_char(buf, ch);
if(!IS_NPC(k)){
sprintf(buf, "Thirst: %d, Hunger: %d, Drunk: %d\n\r",
k->specials.conditions[THIRST],
k->specials.conditions[FULL],
k->specials.conditions[DRUNK]);
sprintf(buf2,"Practices: %d\n\r",k->specials.spells_to_learn);
strcat(buf,buf2);
send_to_char(buf, ch);
}
sprintf(buf,"Master is '%s'\n\r",
((k->master) ? GET_NAME(k->master) : "NOBODY"));
send_to_char(buf, ch);
send_to_char("Followers are:\n\r", ch);
for(fol=k->followers; fol; fol = fol->next)
act(" $N", FALSE, ch, 0, fol->follower, TO_CHAR);
/* Showing the bitvector */
sprintbit(k->specials.affected_by,affected_bits,buf);
send_to_char("Affected by: ", ch);
strcat(buf,"\n\r");
send_to_char(buf, ch);
if (k->affected) {
send_to_char("Affecting Spells:\n\r", ch);
buf[0]=0;
for(aff = k->affected; aff; aff = aff->next) {
sprintf(buf2,"%s - %d ",spells[aff->type-1],aff->duration);
strcat(buf,buf2);
if(strlen(buf) > 60){
strcat(buf,"\n\r");
send_to_char(buf,ch);
buf[0]=0;
}
}
if(buf[0]){
strcat(buf,"\n\r");
send_to_char(buf, ch);
}
}
return;
} else {
send_to_char("No mobile or object by that name in the world\n\r", ch);
}
}
}
void do_shutdow(struct char_data *ch, char *argument, int cmd)
{
send_to_char("If you want to shut something down - say so!\n\r", ch);
}
void do_shutdown(struct char_data *ch, char *argument, int cmd)
{
char arg[MAX_INPUT_LENGTH];
char buf[128];
if (IS_NPC(ch))
return;
one_argument(argument, arg);
if (!*arg) {
send_to_all("Shutting down immediately.\n\r");
shutdowngame = 1;
} else {
if(isdigit(*arg)){
shutdownwarn = atoi(arg);
sprintf(buf,"Game will shutdown in %d tics.\n\r",shutdownwarn);
send_to_char(buf,ch);
} else {
send_to_char("Go shut down someone your own size.\n\r", ch);
}
}
}
void do_snoop(struct char_data *ch, char *argument, int cmd)
{
static char arg[MAX_STRING_LENGTH];
struct char_data *victim;
int diff;
if (!ch->desc)
return;
if (IS_NPC(ch))
return;
one_argument(argument, arg);
if(!*arg) {
send_to_char("Snoop who ?\n\r",ch);
return;
}
if(!(victim=get_char_vis(ch, arg))) {
send_to_char("No such person around.\n\r",ch);
return;
}
if(!victim->desc) {
send_to_char("There's no link.. nothing to snoop.\n\r",ch);
return;
}
if(victim == ch) {
send_to_char("Ok, you just snoop yourself.\n\r",ch);
if(ch->desc->snoop.snooping) {
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. \n\r",ch);
return;
}
diff=GET_LEVEL(victim)-GET_LEVEL(ch);
if(diff >= 0){
send_to_char("You failed.\n\r",ch);
return;
}
send_to_char("Ok. \n\r",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;
return;
}
void do_possess(struct char_data *ch, char *argument, int cmd)
{
static char arg[MAX_STRING_LENGTH];
char buf[70];
struct char_data *victim;
if (IS_NPC(ch))
return;
one_argument(argument, arg);
if (!*arg) {
send_to_char("Switch with who?\n\r", ch);
} else {
if (!(victim = get_char(arg)))
send_to_char("They aren't here.\n\r", ch);
else {
if (ch == victim) {
send_to_char("He he he... We are jolly funny today, eh?\n\r", ch);
return;
}
if (!ch->desc||ch->desc->snoop.snoop_by || ch->desc->snoop.snooping) {
send_to_char(
"You can't do that, the body is already in use.\n\r",ch);
return;
}
if(victim->desc || (!IS_NPC(victim))) {
if(GET_LEVEL(victim) > GET_LEVEL(ch))
send_to_char("They aren't here.\n\r", ch);
else
send_to_char(
"You can't do that, the body is already in use!\n\r",ch);
} else {
send_to_char("Ok.\n\r", ch);
ch->desc->character = victim;
ch->desc->original = ch;
victim->desc = ch->desc;
ch->desc = 0;
}
}
}
}
void do_return(struct char_data *ch, char *argument, int cmd)
{
static char arg[MAX_STRING_LENGTH];
char buf[70];
if(!ch->desc)
return;
if(!ch->desc->original)
{
send_to_char("Eh?\n\r", ch);
return;
}
else
{
send_to_char("You return to your original body.\n\r",ch);
ch->desc->character = ch->desc->original;
ch->desc->original = 0;
ch->desc->character->desc = ch->desc;
ch->desc = 0;
}
}
void do_force(struct char_data *ch, char *argument, int cmd)
{
struct descriptor_data *i;
struct char_data *vict,*next_vict;
char name[100], to_force[100],buf[100];
int diff;
if(IS_NPC(ch))
return;
half_chop(argument, name, to_force);
if (!*name || !*to_force)
send_to_char("Who do you wish to force to do what?\n\r", ch);
else if(!strcmp("room",name)){
if(GET_LEVEL(ch) < 9999)
return;
for(vict=world[ch->in_room].people; vict; vict = next_vict){
next_vict=vict->next_in_room;
if((vict != ch)&&(GET_LEVEL(vict) < GET_LEVEL(ch)))
command_interpreter(vict,to_force);
}
send_to_char("Ok.\n\r", ch);
} else if (str_cmp("all", name)) {
if (!(vict = get_char_vis(ch, name)))
send_to_char("No-one by that name here..\n\r", ch);
else {
diff=GET_LEVEL(ch)-GET_LEVEL(vict);
if ((!IS_NPC(vict)) && (diff <= 0)){
send_to_char("Oh no you don't!!\n\r", ch);
} else {
if(GET_LEVEL(ch) < (IMO+1))
sprintf(buf, "$n has forced you to '%s'.", to_force);
else
buf[0]=0;
act(buf, FALSE, ch, 0, vict, TO_VICT);
send_to_char("Ok.\n\r", ch);
command_interpreter(vict, to_force);
if(!IS_NPC(vict)){
sprintf(buf,"FORCE: %s %s %s.",GET_NAME(ch),GET_NAME(vict),to_force);
log(buf);
}
}
}
} else { /* force all */
if(GET_LEVEL(ch) < (IMO+2)){
send_to_char("Force all's are a bad idea these days.\n\r",ch);
return;
}
for (i = descriptor_list; i; i = i->next)
if (i->character != ch && !i->connected) {
vict = i->character;
if(GET_LEVEL(vict) >= GET_LEVEL(ch)) continue;
command_interpreter(vict, to_force);
}
send_to_char("Ok.\n\r", ch);
}
}
void do_load(struct char_data *ch, char *argument, int cmd)
{
struct char_data *mob;
struct obj_data *obj;
char type[100], num[100], buf[100];
int number, r_num;
extern int top_of_mobt;
extern int top_of_objt;
if(IS_NPC(ch) && (GET_LEVEL(ch) < 999))
return;
if(GET_LEVEL(ch) <= (IMO+1000)){
sprintf(buf," %s just tried LOAD %s",GET_NAME(ch),argument);
do_wiznet(ch,buf,0);
}
argument_interpreter(argument, type, num);
if (!*type || !*num || !isdigit(*num)) {
send_to_char("Syntax:\n\rload <'char' | 'obj'> <number>.\n\r", ch);
return;
}
if ((number = atoi(num)) < 0) {
send_to_char("A NEGATIVE number??\n\r", ch);
return;
}
if (is_abbrev(type, "char")) {
if ((r_num = real_mobile(number)) < 0) {
send_to_char("There is no monster with that number.\n\r", ch);
return;
}
mob = read_mobile(r_num, 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 created $N!", TRUE, ch, 0, mob, TO_ROOM);
send_to_char("Done.\n\r", ch);
#ifdef LOG_LOADS
sprintf(buf,"%s loaded char %d",ch->player.name,number);
log(buf);
#endif
}
else if (is_abbrev(type, "obj")) {
if((GET_LEVEL(ch) < 999)&&(number>17023)&&(number<17100)){
send_to_char("You may not load that object.\n\r", ch);
return;
}
if ((r_num = real_object(number)) < 0) {
send_to_char("There is no object with that number.\n\r", ch);
return;
}
obj = read_object(r_num, REAL);
if(GET_LEVEL(ch) < (IMO+1000))
if(IS_SET(obj->obj_flags.extra_flags,ITEM_PRIME)){
send_to_char("That item is not loadable.\n\r",ch);
extract_obj(obj);
sprintf(buf,"%s tried to load %d",ch->player.name,number);
log(buf);
return;
}
if(GET_LEVEL(ch) < (IMO+1000))
if(IS_SET(obj->obj_flags.extra_flags,ITEM_POOF)){
send_to_char("Do not load items that vanish.\n\r",ch);
extract_obj(obj);
sprintf(buf,"%s tried to load %d",ch->player.name,number);
log(buf);
return;
}
act("$n makes a strange magical gesture.", TRUE, ch, 0, 0, TO_ROOM);
act("$n has created $p!", TRUE, ch, obj, 0, TO_ROOM);
if(IS_SET(obj->obj_flags.wear_flags,ITEM_TAKE)){
obj_to_char(obj,ch);
act("$n snares $p!\n\r",TRUE,ch,obj,0,TO_ROOM);
} else
obj_to_room(obj, ch->in_room);
send_to_char("Ok.\n\r", ch);
#ifdef LOG_LOADS
sprintf(buf,"%s loaded object %d",ch->player.name,number);
log(buf);
#endif
} else
send_to_char("That'll have to be either 'char' or 'obj'.\n\r", ch);
}
purge_rent(struct char_data *vict)
{
int i;
stash_char(vict,0);
for(i=0;i<MAX_WEAR;i++)
if(vict->equipment[i]){
extract_obj(unequip_char(vict,i));
vict->equipment[i]=0;
}
wipe_obj(vict->carrying);
vict->carrying=0;
if(vict->desc)
close_socket(vict->desc);
extract_char(vict);
}
/* clean a room of all mobiles and objects */
void do_purge(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict, *next_v;
struct obj_data *obj, *next_o;
int i;
char name[100], buf[100];
if (IS_NPC(ch))
return;
one_argument(argument, name);
if((GET_LEVEL(ch) == 999) && (!strcmp(name,"all"))){
for(vict=world[ch->in_room].people;vict;vict=next_v){
next_v = vict->next_in_room;
if(!IS_NPC(vict) && (vict!=ch)){
purge_rent(vict);
}
}
send_to_char("As you wish.\n\r",ch);
return;
}
if (*name) {
if (vict = get_char_room_vis(ch, name)) {
if(!IS_NPC(vict)){
if(GET_LEVEL(ch) < GET_LEVEL(vict)){
sprintf(buf,"%s tried to purge you.\n\r",ch->player.name);
send_to_char(buf,vict);
return;
}
purge_rent(vict);
return;
}
act("$n disintegrates $N.", FALSE, ch, 0, vict, TO_NOTVICT);
if (IS_NPC(vict)) {
extract_char(vict);
}
} else if(obj=get_obj_in_list_vis(ch,name,world[ch->in_room].contents)) {
act("$n destroys $p.", FALSE, ch, obj, 0, TO_ROOM);
extract_obj(obj);
} else {
send_to_char("I don't know anyone or anything by that name.\n\r", ch);
return;
}
send_to_char("Ok.\n\r", ch);
}
else { /* no argument. clean out the room */
if (IS_NPC(ch)) {
send_to_char("Don't... You would only kill yourself..\n\r", 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.\n\r", ch->in_room);
for (vict = world[ch->in_room].people; vict; vict = next_v) {
next_v = vict->next_in_room;
if (IS_NPC(vict))
extract_char(vict);
}
for (obj = world[ch->in_room].contents; obj; obj = next_o) {
next_o = obj->next_content;
extract_obj(obj);
}
}
}
void roll_abilities(struct char_data *ch)
{
GET_INT(ch) = GET_WIS(ch) = GET_DEX(ch) = GET_STR(ch) = GET_CON(ch) = 7;
ch->abilities = ch->tmpabilities;
}
void do_start(struct char_data *ch)
{
int i, j;
byte table[5];
void advance_level(struct char_data *ch);
send_to_char("Welcome to MUD!\n\r", ch);
GET_LEVEL(ch) = 1;
GET_EXP(ch) = 1;
set_title(ch);
roll_abilities(ch);
ch->points.max_hit = 10;
ch->points.max_mana = 10;
ch->points.max_move = 50;
ch->specials.spells_to_learn = 4;
advance_level(ch);
GET_HIT(ch) = hit_limit(ch);
GET_MANA(ch) = mana_limit(ch);
GET_MOVE(ch) = move_limit(ch);
GET_COND(ch,THIRST) = -1;
GET_COND(ch,FULL) = -1;
GET_COND(ch,DRUNK) = 0;
ch->player.time.played = 0;
ch->player.time.logon = time(0);
ch->specials.connect_time = time(0); /* SLUG_CHANGE 11-17-96 */
}
void do_restore(struct char_data *ch, char *argument, int cmd)
{
struct char_data *victim;
char buf[256];
int i;
void update_pos( struct char_data *victim );
if(IS_NPC(ch) && (GET_LEVEL(ch) < IMO))
return;
one_argument(argument,buf);
if (!*buf)
send_to_char("Who do you wish to restore?\n\r",ch);
else
if(!(victim = get_char_vis(ch,buf)))
send_to_char("No-one by that name in the world.\n\r",ch);
else {
GET_MANA(victim) = GET_MAX_MANA(victim);
GET_HIT(victim) = GET_MAX_HIT(victim);
GET_MOVE(victim) = GET_MAX_MOVE(victim);
if (GET_LEVEL(victim) >= IMO) {
for (i = 0; i < MAX_SKILLS; i++) {
victim->skills[i].learned = 100;
victim->skills[i].used = 0;
}
if(GET_LEVEL(victim) > (IMO+IMO)) {
victim->abilities.intel = 9999;
victim->abilities.wis = 9999;
victim->abilities.dex = 9999;
victim->abilities.str = 9999;
victim->abilities.con = 9999;
}
victim->tmpabilities = victim->abilities;
}
update_pos( victim );
send_to_char("Done.\n\r", ch);
act("You have been fully healed by $N!", FALSE, victim, 0, ch, TO_CHAR);
sprintf(buf,"%s was restored by %s",GET_NAME(victim),GET_NAME(ch));
log(buf);
}
}
do_noshout(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
struct obj_data *dummy;
char buf[MAX_INPUT_LENGTH];
if (IS_NPC(ch))
return;
one_argument(argument, buf);
if (!*buf) {
if (IS_SET(ch->specials.act, PLR_EARMUFFS)) {
send_to_char("You can now hear shouts again.\n\r", ch);
REMOVE_BIT(ch->specials.act, PLR_EARMUFFS);
} else {
send_to_char("From now on, you won't hear shouts.\n\r", ch);
SET_BIT(ch->specials.act, PLR_EARMUFFS);
}
return;
}
if(GET_LEVEL(ch) < IMO)
return;
if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
send_to_char("Couldn't find any such creature.\n\r", ch);
else if (IS_NPC(vict))
send_to_char("Can't do that to a beast.\n\r", ch);
else if (GET_LEVEL(vict) > GET_LEVEL(ch))
act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR);
else if (IS_SET(vict->specials.act, PLR_NOSHOUT)) {
send_to_char("You can shout again.\n\r", vict);
send_to_char("NOSHOUT removed.\n\r", ch);
REMOVE_BIT(vict->specials.act, PLR_NOSHOUT);
} else {
send_to_char("The gods take away your ability to shout!\n\r", vict);
send_to_char("NOSHOUT set.\n\r", ch);
SET_BIT(vict->specials.act, PLR_NOSHOUT);
}
}
void do_wiznet(struct char_data *ch, char *argument, int cmd)
{
struct descriptor_data *i;
struct char_data *victim;
char buf1[MAX_STRING_LENGTH],buf2[MAX_STRING_LENGTH];
int f,j,k,n;
if(IS_NPC(ch))
return;
sprintf(buf1,"%s: %s\n\r",ch->player.name,argument);
sprintf(buf2,"Someone: %s\n\r",argument);
for (i = descriptor_list; i; i = i->next)
if (!i->connected) {
if(i->original) continue;
victim = i->character;
if(GET_LEVEL(victim) >= IMO){
if(CAN_SEE(victim,ch))
send_to_char(buf1,victim);
else
send_to_char(buf2,victim);
}
}
send_to_char("Ok.\n\r",ch);
}
void do_noaffect(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
struct obj_data *dummy;
struct affected_type *hjp;
char buf[MAX_INPUT_LENGTH];
if (IS_NPC(ch))
return;
one_argument(argument, buf);
if (!*buf){
send_to_char("Remove affects from whom?\n\r", ch);
return;
} else {
if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
send_to_char("Couldn't find any such creature.\n\r", ch);
else if (IS_NPC(vict))
send_to_char("Can't do that to a beast.\n\r", ch);
else if (GET_LEVEL(vict) > GET_LEVEL(ch))
act("$E might object to that.. better not.",0,ch,0,vict,TO_CHAR);
else{
send_to_char("You are normal again.\n\r", vict);
for(hjp = vict->affected; hjp; hjp = hjp->next)
affect_remove( vict, hjp );
}
}
send_to_char("Ok.\n\r",ch);
}
void do_wall(struct char_data *ch, char *argument, int cmd)
{
struct descriptor_data *i;
struct char_data *victim;
char buf[MAX_STRING_LENGTH];
if(IS_NPC(ch)||(! *argument))
return;
if(GET_LEVEL(ch) < (IMO+3))
sprintf(buf,"%s> %s\n\r",GET_NAME(ch),argument+1);
else
sprintf(buf,"%s\n\r",argument+1);
send_to_all(buf);
send_to_char("Ok.\n\r",ch);
}
void do_set(struct char_data *ch, char *argument, int cmd)
{
struct char_data *victim;
char mess[1024],buf[256],buf2[32],buf3[32],buf4[32];
int k;
extern struct command_info cmd_info[];
extern int freq_ct[300];
extern char *command[];
if (IS_NPC(ch))
return;
if((GET_LEVEL(ch) < 9000)&&(newsflashflag)){
if(*argument == ' ')
argument++;
sprintf(buf,"News Flash: %s just did SET %s.\n",GET_NAME(ch),argument);
send_to_all(buf);
}
half_chop(argument,buf,buf2);
if(!*buf){
sprintf(mess, " nokill= %d\n\r",nokillflag);
sprintf(mess+strlen(mess)," nosteal= %d\n\r",nostealflag);
sprintf(mess+strlen(mess),"new chars= %d\n\r",nonewplayers);
sprintf(mess+strlen(mess),"new conns= %d\n\r",nonewconnect);
sprintf(mess+strlen(mess)," noshout= %d\n\r",noshoutflag);
sprintf(mess+strlen(mess),"hitchance= %d\n\r",hitchance);
sprintf(mess+strlen(mess),"mischance= %d\n\r",mischance);
sprintf(mess+strlen(mess),"jokecount= %d\n\r",jokecount);
sprintf(mess+strlen(mess),"poker max= %d\n\r",maxpokerbet);
sprintf(mess+strlen(mess)," helper= %d\n\r",defaulthelper);
sprintf(mess+strlen(mess)," bobflag= %d\n\r",bobflag);
sprintf(mess+strlen(mess)," bobname= %s\n\r",bobname);
send_to_char(mess,ch);
return;
} else {
if(strcmp(buf,"momsreadflag")==0){
one_argument(buf2,buf3);
if(*buf3)
momsreadflag=atoi(buf3);
sprintf(mess,"Mom's read flag is %d.\n\r",momsreadflag);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"melsnumber")==0){
one_argument(buf2,buf3);
if(*buf3)
melsnumber=atoi(buf3);
sprintf(mess,"Mel's Number is %d.\n\r",melsnumber);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"newsflashflag")==0){
one_argument(buf2,buf3);
if(*buf3)
newsflashflag=atoi(buf3);
sprintf(mess,"News Flash flag is %d.\n\r",newsflashflag);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"jokecount")==0){
one_argument(buf2,buf3);
if(*buf3)
jokecount=atoi(buf3);
sprintf(mess,"Jokecount is %d.\n\r",jokecount);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"bobname")==0){
one_argument(buf2,buf3);
if(*buf3){
free(bobname);
bobname=strdup(buf3);
if(islower(bobname[0])) bobname[0]=toupper(bobname[0]);
}
sprintf(mess,"Bobname is %s.\n\r",bobname);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"bobflag")==0){
if(GET_LEVEL(ch) < (IMO+5)) return;
one_argument(buf2,buf3);
if(*buf3)
bobflag=atoi(buf3);
sprintf(mess,"Bobflag is %d.\n\r",bobflag);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"nokill")==0){
if(GET_LEVEL(ch) < (IMO+5)) return;
one_argument(buf2,buf3);
if(*buf3)
nokillflag=atoi(buf3);
sprintf(mess,"No-kill flag is %d.\n\r",nokillflag);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"nosteal")==0){
if(GET_LEVEL(ch) < (IMO+5)) return;
one_argument(buf2,buf3);
if(*buf3)
nostealflag=atoi(buf3);
sprintf(mess,"No-steal flag is %d.\n\r",nostealflag);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"freeze")==0){
one_argument(buf2,buf3);
if(*buf3)
nonewplayers=atoi(buf3);
sprintf(mess,"Freeze flag is %d.\n\r",nonewplayers);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"bigfreeze")==0){
if(GET_LEVEL(ch) < (IMO+5)) return;
one_argument(buf2,buf3);
if(*buf3)
nonewconnect=atoi(buf3);
sprintf(mess,"Big Freeze flag is %d.\n\r",nonewconnect);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"noshout")==0){
one_argument(buf2,buf3);
if(*buf3)
noshoutflag=atoi(buf3);
sprintf(mess,"NoShout flag is %d.\n\r",noshoutflag);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"hitchance")==0){
if(GET_LEVEL(ch) < (IMO+5)) return;
one_argument(buf2,buf3);
if(*buf3)
hitchance=atoi(buf3);
if(hitchance > 100) hitchance=100;
sprintf(mess,"Hit chance is %d.\n\r",hitchance);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"mischance")==0){
if(GET_LEVEL(ch) < (IMO+5)) return;
one_argument(buf2,buf3);
if(*buf3)
mischance=atoi(buf3);
if(mischance < 0) mischance=0;
sprintf(mess,"Miss chance is %d.\n\r",mischance);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"helper")==0){
if(GET_LEVEL(ch) < (IMO+5)) return;
one_argument(buf2,buf3);
if(*buf3)
defaulthelper=atoi(buf3);
sprintf(mess,"Default helper is %d.\n\r",defaulthelper);
send_to_char(mess,ch);
return;
}
if(strcmp(buf,"pokermax")==0){
one_argument(buf2,buf3);
if(*buf3)
maxpokerbet=atoi(buf3);
if(maxpokerbet < 100) maxpokerbet=100;
sprintf(mess,"Maximum poker bet is %d.\n\r",maxpokerbet);
send_to_char(mess,ch);
return;
}
if(!(victim = get_char(buf)))
send_to_char("No-one by that name in the world.\n\r",ch);
else {
half_chop(buf2,buf3,buf4);
k=atoi(buf4);
if(strcmp("host",buf3)==0){
strncpy(victim->desc->host,buf4,16);
return;
}
if(strcmp(buf3,"gut")==0)
GET_GUT(victim)=k;
else if(strcmp(buf3,"xxx")==0)
victim->specials.xxx=k;
else if(strcmp(buf3,"exp")==0)
victim->points.exp=k;
else if(strcmp("tit",buf3)==0)
victim->points.hit=k;
else if(strcmp("hit",buf3)==0)
victim->points.hit=victim->points.max_hit=k;
else if(strcmp("mana",buf3)==0)
victim->points.mana=victim->points.max_mana=k;
else if(strcmp("move",buf3)==0)
victim->points.move=victim->points.max_move=k;
else if(strcmp("meta",buf3)==0)
victim->points.metapts=k;
else if(strcmp("gold",buf3)==0)
victim->points.gold=k;
else if(strcmp("bank",buf3)==0)
victim->points.bank=(long long)k;
else if(strcmp("hitroll",buf3)==0)
victim->points.hitroll=k;
else if(strcmp("damroll",buf3)==0)
victim->points.damroll=k;
else if(strcmp("armor",buf3)==0)
victim->points.armor=k;
else if(strcmp("mr",buf3)==0)
victim->specials.magres=k;
else if(strcmp("lev",buf3)==0){
if((GET_LEVEL(ch) < 9999) ) return;
victim->player.level=k;
}
else if(strcmp("align",buf3)==0)
victim->specials.alignment=k;
else if(strcmp("str",buf3)==0)
victim->abilities.str=k;
else if(strcmp("dex",buf3)==0)
victim->abilities.dex=k;
else if(strcmp("wis",buf3)==0)
victim->abilities.wis=k;
else if(strcmp("con",buf3)==0)
victim->abilities.con=k;
else if(strcmp("int",buf3)==0)
victim->abilities.intel=k;
else if(strcmp("pra",buf3)==0)
victim->specials.spells_to_learn=k;
else if(strcmp("sex",buf3)==0)
victim->player.sex=k;
else if(strcmp("aff",buf3)==0)
victim->specials.affected_by=k;
else if(strcmp("act",buf3)==0){
if(!IS_NPC(victim)){
victim->specials.act=(k & (~ACT_ISNPC));
return;
}
victim->specials.act=(k | ACT_ISNPC);
} else
send_to_char("Huh?\n\r",ch);
victim->tmpabilities = victim->abilities;
}
}
}
void do_invis(struct char_data *ch, char *argument, int cmd)
{
if (IS_NPC(ch))
return;
if(IS_SET(ch->specials.act,PLR_WIZINVIS)){
REMOVE_BIT(ch->specials.act,PLR_WIZINVIS);
send_to_char("You are visible again.\n\r",ch);
} else {
SET_BIT(ch->specials.act,PLR_WIZINVIS);
send_to_char("You vanish.\n\r",ch);
}
send_to_char("Ok.\n\r",ch);
}
do_banish(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
struct obj_data *dummy;
char buf[MAX_INPUT_LENGTH];
int location;
one_argument(argument, buf);
if (!*buf)
send_to_char("Banish whom?\n\r", ch);
else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
send_to_char("Couldn't find any such creature.\n\r", ch);
else if (IS_NPC(vict))
send_to_char("Can't do that to a beast.\n\r", ch);
else if (GET_LEVEL(vict) >= IMO)
send_to_char("It's pointless to banish an immortal.\n\r",ch);
else if (IS_SET(vict->specials.act, PLR_BANISHED)) {
REMOVE_BIT(vict->specials.act, PLR_BANISHED);
send_to_char("You feel forgiven?\n\r", vict);
act("$N is forgiven.",FALSE,ch,0,vict,TO_CHAR);
} else {
SET_BIT(vict->specials.act, PLR_BANISHED);
for (location = 0; location <= top_of_world; location++)
if (world[location].number == 6999)
break;
if(location == top_of_world){
send_to_char("Death Room is gone?\n\r",ch);
} else {
act("$n disappears in a puff of smoke.",FALSE,vict,0,0,TO_ROOM);
char_from_room(vict);
char_to_room(vict,location);
act("$n appears with an ear-splitting bang.",FALSE,vict,0,0,TO_ROOM);
}
send_to_char("You smell fire and brimstone?\n\r", vict);
act("$N is banished.",FALSE,ch,0,vict,TO_CHAR);
}
send_to_char("OK.\n\r",ch);
}
do_flag(struct char_data *ch, char *argument, int cmd)
{
struct char_data *vict;
struct obj_data *dummy;
char buf[MAX_INPUT_LENGTH];
int f;
if (IS_NPC(ch))
return;
one_argument(argument, buf);
if (!*buf)
send_to_char("Flag whom?\n\r", ch);
else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
send_to_char("Couldn't find any such creature.\n\r", ch);
else if (IS_NPC(vict))
send_to_char("Can't do that to a beast.\n\r", ch);
else {
f= IS_SET(vict->specials.act, PLR_BUILDER) ;
if (f) {
REMOVE_BIT(vict->specials.act, PLR_BUILDER);
send_to_char("Flag removed.\n\r",ch);
} else {
SET_BIT(vict->specials.act, PLR_BUILDER);
send_to_char("Flag set.\n\r",ch);
}
}
}
void do_flick(struct char_data *ch, char *argument, int cmd)
{
struct char_data *victim;
struct obj_data *obj;
char victim_name[240];
char obj_name[240];
int eq_pos;
argument = one_argument(argument, obj_name);
one_argument(argument, victim_name);
if (!(victim = get_char_vis(ch, victim_name))) {
send_to_char("Who?\n\r", ch);
return;
} else if (victim == ch) {
send_to_char("Odd?\n\r", ch);
return;
} else if(GET_LEVEL(ch) <= GET_LEVEL(victim)){
send_to_char("Bad idea.\n\r",ch);
return;
}
if (!(obj = get_obj_in_list(obj_name, victim->carrying))) {
for (eq_pos = 0; (eq_pos < MAX_WEAR); eq_pos++)
if(victim->equipment[eq_pos] &&
(isname(obj_name, victim->equipment[eq_pos]->name))){
obj = victim->equipment[eq_pos];
break;
}
if (!obj) {
send_to_char("Can't find that item.\n\r",ch);
return;
} else { /* It is equipment */
obj_to_char(unequip_char(victim, eq_pos), ch);
send_to_char("Done.\n\r", ch);
}
} else { /* obj found in inventory */
obj_from_char(obj);
obj_to_char(obj, ch);
send_to_char("Done.\n\r", ch);
}
}
void do_sys(struct char_data *ch, char *argument, int cmd)
{
char buffer[256];
int t;
struct char_data *i;
struct obj_data *k;
struct descriptor_data *d;
static int nits=0,nics=0,nids=0;
static int timedone=0;
#ifdef RUSAGE
struct rusage xru;
if(GET_LEVEL(ch) > IMO){
getrusage(0,&xru);
sprintf(buffer,
"sys time: %d secs\n\rusr time: %d secs\n\rrun time: %d secs\n\r\n\r",
xru.ru_stime.tv_sec,xru.ru_utime.tv_sec,time(0)-boottime);
send_to_char(buffer,ch);
}
#endif
t=time(0);
if((GET_LEVEL(ch) > IMO)||((t-timedone) > 60)){
nits=0;
for (k=object_list;k;k=k->next) ++nits;
nics=0;
for (i=character_list;i;i=i->next) ++nics;
nids=0;
for (d=descriptor_list;d;d=d->next) ++nids;
timedone=t;
}
sprintf(buffer,
"%5d objects\n\r%5d chars\n\r%5d players\n\r%5d rooms\n\r",
nits,nics,nids,top_of_world);
send_to_char(buffer,ch);
sprintf(buffer,"%5d dead monsters\n\r%5d dead players\n\r",
mobdeaths,pcdeaths);
send_to_char(buffer,ch);
sprintf(buffer,"%d drops.\n\r",droptotal);
send_to_char(buffer,ch);
sprintf(buffer,"Total output = %d bytes (%d Bps)\n\r",
grand_total,grand_total/(time(0)-reboottime));
send_to_char(buffer,ch);
}
void do_oset(struct char_data *ch, char *argument, int cmd)
{
char buf[256],buf2[256],buf3[256],buf4[256];
int k;
struct obj_data *obj;
if (IS_NPC(ch))
return;
if((GET_LEVEL(ch) < 9000)&&(newsflashflag)){
if(*argument == ' ')
argument++;
sprintf(buf,"News Flash: %s just did OSET %s.\n",GET_NAME(ch),argument);
send_to_all(buf);
}
half_chop(argument,buf,buf2);
if(!*buf){
send_to_char("What?\n\r",ch);
return;
} else {
if(!(obj = get_obj_vis(ch,buf)))
send_to_char("Nothing with that name in the world.\n\r",ch);
else {
half_chop(buf2,buf3,buf4);
k=atoi(buf4);
if(strcmp(buf3,"v0")==0)
obj->obj_flags.value[0]=k;
else if(strcmp(buf3,"v1")==0)
obj->obj_flags.value[1]=k;
else if(strcmp(buf3,"v2")==0)
obj->obj_flags.value[2]=k;
else if(strcmp(buf3,"v3")==0)
obj->obj_flags.value[3]=k;
else if(strcmp(buf3,"type")==0)
obj->obj_flags.type_flag=k;
else if(strcmp(buf3,"wear")==0)
obj->obj_flags.wear_flags=k;
else if(strcmp(buf3,"rent")==0)
obj->obj_flags.rentlevel=k;
else if(strcmp(buf3,"extra")==0)
obj->obj_flags.extra_flags=k;
else if(strcmp(buf3,"weight")==0)
obj->obj_flags.weight=k;
else if(strcmp(buf3,"timer")==0)
obj->obj_flags.timer=k;
else if(strcmp(buf3,"a0l")==0)
obj->affected[0].location=k;
else if(strcmp(buf3,"a0m")==0)
obj->affected[0].modifier=k;
else if(strcmp(buf3,"a1l")==0)
obj->affected[1].location=k;
else if(strcmp(buf3,"a1m")==0)
obj->affected[1].modifier=k;
else if(strcmp(buf3,"a2l")==0)
obj->affected[2].location=k;
else if(strcmp(buf3,"a2m")==0)
obj->affected[2].modifier=k;
else
send_to_char("Huh?\n\r",ch);
}
}
}
void do_count(struct char_data *ch, char *argument, int cmd)
{
char name[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH];
struct char_data *i;
struct obj_data *k;
int n;
extern struct obj_data *object_list;
one_argument(argument, name);
n=0;
if (!*name) {
send_to_char("What are you looking for?\n\r", ch);
return;
}
for(i=character_list; i; i = i->next)
if(isname(name, i->player.name) && CAN_SEE(ch, i))
if(i->in_room != NOWHERE)
++n;
for (k=object_list;k;k=k->next)
if(isname(name, k->name))
++n;
sprintf(buf,"%d matches\n\r",n);
send_to_char(buf,ch);
}
void do_join(struct char_data *ch, char *argument, int cmd)
{
char buf[256],b1[256],b2[256];
int loc,dir,srm,vrm;
half_chop(argument,b1,buf);
one_argument(buf,b2);
dir=atoi(b1);
if(cmd==266){
srm=ch->in_room;
free(world[srm].dir_option[dir]);
world[srm].dir_option[dir] = 0;
return;
}
vrm=atoi(b2);
if(vrm==0){
send_to_char("To room 0?\n\r",ch);
return;
}
for (loc = 0; loc <= top_of_world; loc++)
if (world[loc].number == vrm)
break;
else if (loc == top_of_world) {
send_to_char("No room exists with that number.\n\r", ch);
return;
}
if(EXIT(ch,dir)){
send_to_char("There's already an exit in that direction.\n\r",ch);
return;
}
srm=ch->in_room;
CREATE(world[srm].dir_option[dir],struct room_direction_data,1);
world[srm].dir_option[dir]->general_description=0;
world[srm].dir_option[dir]->keyword=0;
world[srm].dir_option[dir]->exit_info=0;
world[srm].dir_option[dir]->key=(-1);
world[srm].dir_option[dir]->to_room=loc;
send_to_char("OK.\n\r",ch);
}
void do_joke(struct char_data *ch, char *argument, int cmd)
{
struct char_data *mob;
struct obj_data *obj;
char buf[256],buf2[256];
int i, v_num, r_num, aflag;
if (IS_NPC(ch) && (GET_LEVEL(ch) < 999))
return;
argument_interpreter(argument, buf, buf2);
v_num=atoi(buf);
if(isdigit(buf2[0])){
aflag=atoi(buf2);
} else if(isalpha(buf2[0])) {
if(islower(buf2[0]))
buf2[0]=toupper(buf2[0]);
aflag=(-1);
} else {
aflag=0;
}
if(v_num > 0){
if((r_num = real_mobile(v_num)) < 0) {
send_to_char("There is no monster with that number.\n\r", ch);
return;
}
for(i=0;i<jokecount;i++){
mob = read_mobile(r_num, REAL);
if(!mob){
send_to_char("Early exit.\n\r",ch);
}
char_to_room(mob,ch->in_room);
if(aflag >= 0){
mob->specials.act=(8|aflag);
} else if(aflag < 0) {
if(GET_NAME(mob))
free(GET_NAME(mob));
GET_NAME(mob)=strdup(buf2);
if(mob->player.short_descr)
free(mob->player.short_descr);
mob->player.short_descr=strdup(buf2);
sprintf(buf,"%s is standing here.\n\r",buf2);
if(mob->player.long_descr)
free(mob->player.long_descr);
mob->player.long_descr=strdup(buf);
if(mob->player.description)
free(mob->player.description);
mob->player.description=strdup("JEXGIT\n\r");
mob->specials.act=8;
}
do_stand(mob,0,0);
}
}
}
static char *loctype[]={
"EQ", "CA", "IO", "IR"
};
void do_data(struct char_data *ch, char *argument, int cmd)
{
extern char *command[];
extern int freq_ct[];
struct obj_data *o;
struct char_data *p;
struct descriptor_data *d;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
int i,j,k,n,flag;
extern struct zone_data *zone_table;
extern struct index_data *mob_index, *obj_index;
extern int top_of_zone_table, top_of_mobt, top_of_objt;
half_chop(argument,buf,buf2);
if(*buf == 'a'){
for (d = descriptor_list; d; d = d->next) {
if((p=d->character)&&(CAN_SEE(ch,p))){
sprintf(buf,"%-14s|%7d%7d%7d%|%5d%5d%5d%5d%5d|%4d%4d\n\r",
GET_NAME(p),GET_MAX_HIT(p),GET_MAX_MANA(p),GET_MAX_MOVE(p),
GET_STR(p),GET_INT(p),GET_WIS(p),GET_DEX(p),GET_CON(p),
GET_HITROLL(p),GET_DAMROLL(p));
send_to_char(buf,ch);
}
}
return;
} else if(*buf == 'c'){
k=atoi(buf2);
for(i=1;i<299;i++){
if(freq_ct[i] > k){
sprintf(buf,"%-12.12s %6d\n\r",
command[i-1],freq_ct[i]);
send_to_char(buf,ch);
}
}
return;
} else if(*buf == 'm'){
k=atoi(buf2);
for(i=0;i<=top_of_mobt;i++){
if(mob_index[i].total >= k){
sprintf(buf,"%5d %-17.17s %6d%6d\n\r",
mob_index[i].virtual,
mob_index[i].name ? mob_index[i].name : "???",
mob_index[i].number,mob_index[i].total);
send_to_char(buf,ch);
}
}
return;
} else if(*buf == 'o'){
k=atoi(buf2);
for(i=0;i<=top_of_objt;i++){
if(obj_index[i].number >= k){
sprintf(buf,"%5d %-17.17s %6d\n\r",
obj_index[i].virtual,
obj_index[i].name ? obj_index[i].name : "???",
obj_index[i].number);
send_to_char(buf,ch);
}
}
return;
} else {
send_to_char("data a,c,z,m,o\n\r",ch);
return;
}
i=0; n=atoi(buf);
for (o=object_list;o;o=o->next)
if(obj_index[o->item_number].virtual==n){
if(o->carried_by) {
flag=1;
} else if(o->in_obj) {
flag=2;
} else if(o->in_room != NOWHERE) {
flag=3;
} else {
flag=0;
}
sprintf(buf,"%2d: %s %3d%3d%3d%3d %s\n\r",
++i,
o->short_description,
o->obj_flags.value[0],
o->obj_flags.value[1],
o->obj_flags.value[2],
o->obj_flags.value[3],
loctype[flag]);
send_to_char(buf,ch);
}
send_to_char("OK.\n\r",ch);
}