/***************************************************************************
* Emud 2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem. *
* *
* MrMud 1.4 by David Bills and Dug Michael. *
* *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe. *
***************************************************************************/
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/resource.h>
#include "emud.h"
/*
Local functions.
*/
bool get_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *container, bool fDisplay ) );
bool is_quest args( ( unsigned char *pt ) );
void do_test( CHAR_DATA *ch, char *argument)
{
int cnt;
push_call("do_test(%p,%p)",ch,argument);
if (*argument == 'b')
{
char bla[] = { 255, 253, 0 };
char bli[] = { 255, 251, 0 };
write_to_descriptor(ch->desc, bli, 3);
write_to_descriptor(ch->desc, bla, 3);
}
if (*argument == 'e')
{
encrypt64(&argument[2]);
}
if (*argument == 'f')
{
char bla[] = { 255, 250, 39, 1, 3, 'U', 'S', 'E', 'R', 255, 240, 0 };
write_to_descriptor(ch->desc, bla, 0);
}
if (*argument == 'p')
{
SET_BIT(mud->flags, MUD_SKIPOUTPUT);
for (cnt = 0 ; cnt < MAX_PVNUM ; cnt++)
{
if (pvnum_index[cnt] == NULL)
{
continue;
}
if (get_player_world(ch, pvnum_index[cnt]->name) != NULL)
{
continue;
}
do_pload(ch, pvnum_index[cnt]->name);
if (argument[1] != 'q' && pvnum_index[cnt])
{
do_pquit(ch, pvnum_index[cnt]->name);
}
}
REMOVE_BIT(mud->flags, MUD_SKIPOUTPUT);
}
if (*argument == 'n')
{
write_to_descriptor(ch->desc, "\033[3h", 0);
}
if (*argument == 'o')
{
write_to_descriptor(ch->desc, "\033[?1h", 0);
}
pop_call();
return;
}
void do_wizhelp( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
int cmd, col, level;
push_call("do_wizhelp(%p,%p)",ch,argument);
for (level = 96, col = 0, buf[0] = '\0' ; level <= ch->level ; level++)
{
for (cmd = 0 ; cmd_table[cmd].name[0] != '\0' ; cmd++)
{
if (cmd_table[cmd].level == level && !IS_SET(cmd_table[cmd].flags, CMD_HIDE))
{
if (col % 5 == 0)
{
strcat(buf, get_color_string(ch, COLOR_TEXT, VT102_DIM));
}
cat_snprintf(buf, 16, "%d-%-13s", cmd_table[cmd].level, cmd_table[cmd].name);
if (++col % 5 == 0)
{
strcat(buf, "\n\r");
}
}
}
}
if (col % 5 != 0)
{
strcat(buf, "\n\r");
}
send_to_char(buf, ch);
pop_call();
return;
}
void do_rstat( CHAR_DATA *ch, char *argument )
{
int location;
OBJ_DATA *obj;
CHAR_DATA *rch;
char arg1[MAX_INPUT_LENGTH];
char buf1[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
char bld [10], dim [10];
int door;
push_call("do_rstat(%p,%p)",ch,argument);
one_argument(argument, arg1);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
location = (arg1[0] == '\0') ? ch->in_room->vnum : find_location(ch, arg1);
if (location == -1)
{
send_to_char( "No such location.\n\r", ch );
pop_call();
return;
}
if (!can_olc_modify(ch, location))
{
send_to_char("You can only stat rooms in your allocated range.\n\r", ch);
pop_call();
return;
}
ch_printf(ch, "%s Name:%s %s\n\r", dim, bld, room_index[location]->name);
ch_printf(ch, "%s Area:%s %s\n\r", dim, bld, room_index[location]->area->name);
ch_printf(ch, "%s Vnum:%s %u\n\r", dim, bld, room_index[location]->vnum);
ch_printf(ch, "%s Sector:%s %s\n\r", dim, bld, broken_bits(room_index[location]->sector_type, "SECT_", TRUE));
ch_printf(ch, "%s Light:%s %d\n\r", dim, bld, room_index[location]->light);
ch_printf(ch, "%s Room flags: %s%s\n\r", dim, bld, flag_string(room_index[location]->room_flags, r_flags));
if (room_index[location]->first_extradesc != NULL )
{
EXTRA_DESCR_DATA *ed;
sprintf(buf1, "%sExtra Descs:%s ", dim, bld);
sprintf(buf2, "%s,%s ", dim, bld);
for (ed = room_index[location]->first_extradesc ; ed ; ed = ed->next)
{
strcat(buf1, ed->keyword);
if (ed->next)
{
strcat(buf1, buf2);
}
}
ch_printf(ch, "%s\n\r", buf1);
}
sprintf( buf1, "%s Characters:%s ", dim, bld);
sprintf( buf2, "%s,%s ", dim, bld);
for (rch = room_index[location]->first_person ; rch ; rch = rch->next_in_room)
{
if (can_see(ch, rch))
{
one_argument_nolower(rch->name, buf3);
if (str_suffix(" ", buf1))
{
strcat(buf1, buf2);
}
strcat(buf1, buf3);
}
}
ch_printf(ch, "%s\n\r", buf1);
if (room_index[location]->first_content)
{
sprintf(buf1, "%s Objects:%s ", dim, bld);
sprintf(buf2, "%s,%s ", dim, bld);
for (obj = room_index[location]->first_content ; obj ; obj = obj->next_content)
{
if (can_see_obj(ch, obj))
{
if (strlen(buf1) > 33)
{
strcat(buf1, buf2);
}
one_argument_nolower(obj->name, buf3);
strcat(buf1, buf3);
}
}
ch_printf(ch, "%s\n\r", buf1);
}
for (door = 0 ; door <= 5 ; door++)
{
EXIT_DATA *pexit;
if ((pexit = room_index[location]->exit[door]) != NULL)
{
sprintf(buf1,"%s %5s:%s %5d", dim, capitalize(dir_name[door]), bld, pexit->to_room);
sprintf(buf2,"%s Key:%s %5d", dim, bld, pexit->key);
sprintf(buf3,"%s Flags:%s %s", dim, bld, flag_string(pexit->exit_info, exit_flags));
ch_printf(ch, "%s%s%s\n\r", buf1, buf2, buf3);
}
}
pop_call();
return;
}
void do_ostat( CHAR_DATA *ch, char *argument )
{
char buf [MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH], buf4[MAX_STRING_LENGTH];
char bld [10], dim [10];
char *owner;
AFFECT_DATA *paf;
OBJ_DATA *obj;
push_call("do_ostat(%p,%p)",ch,argument);
if (*argument == '\0')
{
send_to_char( "Syntax: stat obj <vnum|name>\n\r", ch );
pop_call();
return;
}
if (is_number(argument))
{
if ((obj = get_obj_vnum(ch, argument)) == NULL)
{
send_to_char( "No object loaded has that vnum.\n\r", ch );
pop_call();
return;
}
}
else
{
if ((obj = get_obj_world(ch, argument)) == NULL)
{
send_to_char( "No object loaded has that name.\n\r", ch );
pop_call();
return;
}
}
if (!can_olc_modify(ch, obj->pIndexData->vnum))
{
send_to_char("You can only stat objects in your allocated vnum range.\n\r", ch);
pop_call();
return;
}
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bld, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
ch_printf(ch, "%s Name:%s %s\n\r", dim, bld, obj->name);
ch_printf(ch, "%s Short:%s %s\n\r", dim, bld, obj->short_descr);
ch_printf(ch, "%s Long:%s %s\n\r", dim, bld, obj->long_descr);
if (obj->pIndexData->first_extradesc)
{
EXTRA_DESCR_DATA *ed;
sprintf(buf1, "%sKeywords:%s", dim, bld);
for (ed = obj->pIndexData->first_extradesc ; ed != NULL ; ed = ed->next)
{
strcat(buf1, " ");
strcat(buf1, ed->keyword);
}
ch_printf(ch, "%s\n\r", buf1);
}
if (obj->carried_by != NULL)
{
ch_printf(ch, "%s Carrier:%s %s\n\r", dim, bld, get_name(obj->carried_by));
}
sprintf(buf1, "%s Vnum:%s %10u", dim, bld, obj->pIndexData->vnum);
sprintf(buf2, "%s Index :%s %30lld", dim, bld, obj->obj_ref_key);
sprintf(buf3, "%s Total:%s %10d", dim, bld, obj->pIndexData->total_objects);
ch_printf(ch, "%s%s%s\n\r", buf1, buf2, buf3);
sprintf(buf , "%d/%d", obj->level, obj_level_estimate(obj->pIndexData));
sprintf(buf1, "%s Level:%s %10s", dim, bld, buf);
sprintf(buf2, "%s Cost:%s %10d", dim, bld, obj->cost);
sprintf(buf , "%d+%d", obj->weight, obj->content_weight);
sprintf(buf3, "%s Weight:%s %10s", dim, bld, buf);
sprintf(buf4, "%s Type:%s %10s", dim, bld, item_type_name(obj));
ch_printf(ch, "%s%s%s%s\n\r", buf1, buf2, buf3, buf4);
sprintf(buf1, "%s Room:%s %10u", dim, bld, obj->in_room ? obj->in_room->vnum : 0);
sprintf(buf2, "%s In obj:%s %10u", dim, bld, obj->in_obj ? obj->in_obj->pIndexData->vnum : 0);
sprintf(buf3, "%s Wearloc:%s %10d", dim, bld, obj->wear_loc);
sprintf(buf4, "%s In game:%s %10d", dim, bld, obj->pIndexData->total_objects);
ch_printf(ch, "%s%s%s%s\n\r", buf1, buf2, buf3, buf4);
sprintf(buf1, "%s Value0:%s %10d", dim, bld, obj->value[0]);
sprintf(buf2, "%s Value1:%s %10d", dim, bld, obj->value[1]);
sprintf(buf3, "%s Value2:%s %10d", dim, bld, obj->value[2]);
sprintf(buf4, "%s Value3:%s %10d", dim, bld, obj->value[3]);
ch_printf(ch, "%s%s%s%s\n\r", buf1, buf2, buf3, buf4);
sprintf(buf1, "%sEnhanced:%s %10s", dim, bld, obj->first_affect ? "true" : "false");
sprintf(buf2, "%s Altered:%s %10s", dim, bld, IS_SET(obj->extra_flags, ITEM_MODIFIED) ? "true" : "false");
sprintf(buf3, "%s Program:%s %10s", dim, bld, obj->pIndexData->first_prog ? "true" : "false");
if ((owner = get_name_pvnum(obj->owned_by)) != NULL)
{
sprintf(buf4, "%s Owner:%s %10s", dim, bld, owner);
}
else
{
sprintf(buf4, "%s Owner:%s %10d", dim, bld, obj->owned_by);
}
ch_printf(ch, "%s%s%s%s\n\r", buf1, buf2, buf3, buf4);
sprintf(buf1, "%sSactimer:%s %10d", dim, bld, obj->sac_timer);
sprintf(buf2, "%s Timer:%s %10d", dim, bld, obj->timer);
ch_printf(ch, "%s%s\n\r", buf1, buf2);
ch_printf(ch, "%sWearflag:%s %s\n\r", dim, bld, flag_string(obj->wear_flags, w_flags));
ch_printf(ch, "%sItemflag:%s %s\n\r", dim, bld, flag_string(obj->extra_flags, o_flags));
for (paf = obj->pIndexData->first_affect ; paf != NULL ; paf = paf->next)
{
ch_printf(ch, "%s Affects:%s %-22s%s modifies %s by %d for %d hours\n\r", dim, bld, skill_table[(int) paf->type].name, dim, affect_loc_name(paf->location), paf->modifier, paf->duration);
}
for (paf = obj->first_affect ; paf != NULL ; paf = paf->next)
{
ch_printf(ch, "%s Affects:%s %-22s%s modifies %s by %d for %d hours\n\r", dim, bld, skill_table[(int) paf->type].name, dim, affect_loc_name(paf->location), paf->modifier, paf->duration);
}
ch_printf(ch, "%s Quest:%s %-22s %s#%s\n\r", dim, bld, obj->pIndexData->area->name, dim, quest_bits_to_string(obj->obj_quest));
if (obj->reset != NULL && obj->reset->obj == obj)
{
RESET_DATA *pReset = obj->reset;
while (pReset != NULL)
{
ch_printf(ch, "%s Reset:%s %c %s %5d %4d %5d\n\r",
dim, bld, pReset->command, dim,
pReset->arg1, pReset->arg2, pReset->arg3);
pReset = pReset->container;
}
}
pop_call();
return;
}
void do_mstat( CHAR_DATA *ch, char *argument )
{
char tmp[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
char bold[10], dim[10];
unsigned long num;
AFFECT_DATA *paf;
CHAR_DATA *victim;
OBJ_DATA *wield;
AREA_DATA *pArea;
push_call("do_mstat(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
send_to_char("Syntax: stat mob <vnum|name>\n\r", ch);
pop_call();
return;
}
if (is_number_argument(argument))
{
if ((victim = get_mob_vnum(ch, argument)) == NULL)
{
send_to_char( "No mobile loaded with that vnum.\n\r", ch );
pop_call();
return;
}
}
else if ((victim = get_char_world(ch, argument)) == NULL)
{
send_to_char( "No mobile loaded with that name.\n\r", ch );
pop_call();
return;
}
if (IS_NPC(victim) && !can_olc_modify(ch, victim->pIndexData->vnum))
{
send_to_char("You can only stat mobiles in your allocated vnum range.\n\r", ch);
pop_call();
return;
}
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bold, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
tmp[0] = '\0';
if (IS_NPC(victim))
{
ch_printf(ch, "%s Name: %s%s\n\r" , dim, bold, victim->name);
ch_printf(ch, "%s Short: %s%s\n\r" , dim, bold, victim->short_descr);
ch_printf(ch, "%s Long: %s%s\n\r" , dim, bold, victim->long_descr);
sprintf(buf1, "%s Vnum: %s%11u " , dim, bold, victim->pIndexData->vnum);
sprintf(buf2, "%s Level: %s%11d " , dim, bold, victim->level);
sprintf(buf3, "%s Room: %s%11u\n\r", dim, bold, victim->in_room->vnum);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Alignment: %s%11d " , dim, bold, victim->alignment);
sprintf(buf2, "%s Armor Class: %s%11d " , dim, bold, 0 - (mob_armor(victim) + victim->level*4 - 100));
sprintf(buf3, "%s Gold: %s%11d\n\r", dim, bold, victim->gold);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Hitroll: %s%11d " , dim, bold, GET_HITROLL(victim));
sprintf(tmp, "%dd%d+%d", get_damnodice(victim), get_damsizedice(victim), GET_DAMROLL(victim) + victim->npcdata->damplus);
sprintf(buf2, "%s Damroll: %s%11s " , dim, bold, tmp);
if ((wield = get_eq_char(victim, WEAR_WIELD)) != NULL && wield->item_type == ITEM_WEAPON)
{
sprintf(tmp, "%dd%d", wield->value[1], wield->value[2]);
}
else
{
sprintf(tmp, "none");
}
sprintf(buf3, "%s Weapon: %s%11s\n\r", dim, bold, tmp);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(tmp, "%d/%d", victim->hit, victim->max_hit);
sprintf(buf1, "%s Hp: %s%11s " , dim, bold, tmp);
sprintf(tmp, "%d/%d", victim->mana, victim->max_mana);
sprintf(buf2, "%s Mana: %s%11s " , dim, bold, tmp);
sprintf(tmp, "%d/%d", victim->move, victim->max_move);
sprintf(buf3, "%s Move: %s%11s\n\r", dim, bold, tmp);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Race: %s%11s " , dim, bold, race_table[victim->race].race_name);
sprintf(buf2, "%s Sex: %s%11s " , dim, bold, victim->sex <= 0 ? "Neutral" : victim->sex <= 1 ? "Male" : "Female");
sprintf(buf3, "%s Position: %s%11s\n\r", dim, bold, victim->position == 8 ? "Standing" : victim->position == 7 ? "fighting" : victim->position == 6 ? "sitting" : victim->position == 5 ? "resting" : victim->position == 4 ? "sleeping" : "dying");
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%sCarry Number: %s%11d " , dim, bold, victim->carry_number);
sprintf(buf2, "%sCarry Weight: %s%11d " , dim, bold, victim->carry_weight);
sprintf(buf3, "%sSaving Spell: %s%11d\n\r", dim, bold, GET_SAVING_THROW(victim));
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s %9s: %s%s\n\r" , dim, IS_SET(victim->act, ACT_WIMPY) ? "Fearing" : "Hating", bold, *victim->npcdata->hate_fear ? victim->npcdata->hate_fear : "none");
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Master: %s%11s " , dim, bold, victim->master ? victim->master->name : "none");
sprintf(buf2, "%s Leader: %s%11s " , dim, bold, victim->leader ? victim->leader->name : "none");
sprintf(buf3, "%s Fighting: %s%11s\n\r", dim, bold, victim->fighting ? victim->fighting->who->name : "none");
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
if (victim->pIndexData->spec_fun != NULL)
{
ch_printf(ch, "%s Fun Spec: %s%s\n\r", dim, bold, spec_name_lookup(victim->pIndexData->spec_fun));
}
ch_printf(ch, "%sAction Flags: %s%s\n\r", dim, bold, flag_string(victim->act, act_flags));
ch_printf(ch, "%sAffect Flags: %s%s\n\r", dim, bold, affect_bit_name(victim->affected_by));
ch_printf(ch, "%sAffect Flags: %s%s\n\r", dim, bold, affect_bit_name(-victim->affected2_by));
for (paf = victim->first_affect ; paf != NULL ; paf = paf->next)
{
ch_printf(ch, "%s Spell: %s%-22s%s modifies %s by %d for %d hours\n\r", dim, bold, skill_table[(int) paf->type].name, dim, affect_loc_name(paf->location), paf->modifier, paf->duration);
}
ch_printf(ch, "%s Quest: %s%-22s%s #%s\n\r", dim, bold, victim->pIndexData->area->name, dim, quest_bits_to_string(victim->npcdata->mob_quest));
}
else
{
ch_printf(ch, "%s Name: %s%s\n\r" , dim, bold, victim->name);
ch_printf(ch, "%s Vnum: %s%11u %s Level: %s%11d %s Room: %s%11u\n\r",
dim, bold, victim->pcdata->pvnum,
dim, bold, victim->level,
dim, bold, victim->in_room->vnum);
ch_printf(ch, "%s Age: %s%11d %s Hours: %s%11d %s Reinc: %s%11d\n\r",
dim, bold, get_age(victim),
dim, bold, victim->pcdata->played/3600 + victim->pcdata->previous_hours,
dim, bold, victim->pcdata->reincarnation);
ch_printf(ch, "%s Class: %s%11s %s Experience: %s%11d %s Practices: %s%11d\n\r",
dim, bold, class_table[victim->class].who_name_long,
dim, bold, victim->pcdata->exp,
dim, bold, victim->pcdata->practice);
ch_printf(ch, "%s Race: %s%11s %s Sex: %s%11s %s Position: %s%11s\n\r",
dim, bold, race_table[victim->race].race_name,
dim, bold, victim->sex <= 0 ? "Neutral" : victim->sex == 1 ? "Male" : "Female",
dim, bold, victim->position == 8 ? "Standing" : victim->position == 7 ? "fighting" : victim->position == 6 ? "sitting" : victim->position == 5 ? "resting" : victim->position == 4 ? "sleeping" : "dying");
ch_printf(ch, "%s Thirst: %s%11d %s Full: %s%11d %s Drunk: %s%11d\n\r",
dim, bold, victim->pcdata->condition[COND_THIRST],
dim, bold, victim->pcdata->condition[COND_FULL],
dim, bold, victim->pcdata->condition[COND_DRUNK]);
ch_printf(ch, "%s Attributes: Str:%s %2d/%-2d %sInt:%s %2d/%-2d %sWis:%s %2d/%-2d %sDex:%s %2d/%-2d %sCon:%s %2d/%-2d\n\r",
dim, bold, get_curr_str(victim), victim->pcdata->perm_str,
dim, bold, get_curr_int(victim), victim->pcdata->perm_int,
dim, bold, get_curr_wis(victim), victim->pcdata->perm_wis,
dim, bold, get_curr_dex(victim), victim->pcdata->perm_dex,
dim, bold, get_curr_con(victim), victim->pcdata->perm_con);
ch_printf(ch, "%s Alignment: %s%11d %s Armor Class: %s%11d %s Gold: %s%11d\n\r",
dim, bold, victim->alignment,
dim, bold, GET_AC(victim),
dim, bold, victim->gold);
if ((wield = get_eq_char(victim, WEAR_WIELD)) != NULL && wield->item_type == ITEM_WEAPON)
{
sprintf(tmp, "%dd%d", wield->value[1], wield->value[2] );
}
else
{
sprintf(tmp, "%dd%d", get_damnodice(ch), get_damsizedice(ch));
}
ch_printf(ch, "%s Hitroll: %s%11d %s Damroll: %s%11d %s%s: %s%11s\n\r",
dim, bold, GET_HITROLL(victim),
dim, bold, GET_DAMROLL(victim),
dim, wield ? " Weapon" : " Barehanded", bold, tmp);
sprintf(buf1, "%s Aging Ac: %s%11d " , dim, bold, get_age_bonus(victim, RSPEC_AGE_AC));
sprintf(buf2, "%s Aging Hr: %s%11d " , dim, bold, get_age_bonus(victim, RSPEC_AGE_HR));
sprintf(buf3, "%s Aging Dr: %s%11d\n\r", dim, bold, get_age_bonus(victim, RSPEC_AGE_DR));
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%sCarry Number: %s%11d " , dim, bold, victim->carry_number);
sprintf(buf2, "%sCarry Weight: %s%11d " , dim, bold, victim->carry_weight);
sprintf(buf3, "%sSaving Spell: %s%11d\n\r", dim, bold, GET_SAVING_THROW(victim));
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(tmp, "%d/%d", victim->hit, victim->max_hit);
sprintf(buf1, "%s Hp: %s%11s " , dim, bold, tmp);
sprintf(tmp, "%d/%d", victim->mana, victim->max_mana);
sprintf(buf2, "%s Mana: %s%11s " , dim, bold, tmp);
sprintf(tmp, "%d/%d", victim->move, victim->max_move);
sprintf(buf3, "%s Move: %s%11s\n\r", dim, bold, tmp);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Wimpy: %s%11d " , dim, bold, victim->pcdata->wimpy);
sprintf(buf2, "%sCastle Entra: %s%11d " , dim, bold, victim->pcdata->castle ? victim->pcdata->castle->entrance : 0);
sprintf(buf3, "%s Castle Cost: %s%11d\n\r", dim, bold, victim->pcdata->castle ? victim->pcdata->castle->cost / 1000 : 0);
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
sprintf(buf1, "%s Master: %s%11s " , dim, bold, victim->master ? victim->master->name : "none");
sprintf(buf2, "%s Leader: %s%11s " , dim, bold, victim->leader ? victim->leader->name : "none");
sprintf(buf3, "%s Fighting: %s%11s\n\r", dim, bold, victim->fighting ? victim->fighting->who->name : "none");
ch_printf(ch, "%s%s%s", buf1, buf2, buf3);
ch_printf(ch, "%sAction Flags: %s%s\n\r", dim, bold, flag_string(victim->act, plr_flags));
ch_printf(ch, "%sAffect Flags: %s%s\n\r", dim, bold, affect_bit_name(victim->affected_by));
ch_printf(ch, "%sAffect Flags: %s%s\n\r", dim, bold, affect_bit_name(-victim->affected2_by));
for (paf = victim->first_affect ; paf != NULL ; paf = paf->next)
{
ch_printf(ch, "%s Spell: %s%-22s%s modifies %s by %d for %d hours\n\r", dim, bold, skill_table[(int) paf->type].name, dim, affect_loc_name(paf->location), paf->modifier, paf->duration);
}
for (pArea = mud->f_area ; pArea ; pArea = pArea->next)
{
num = pArea->low_r_vnum/100;
if (is_quest(victim->pcdata->quest[num]))
{
ch_printf(ch, "%s Quest: %s%-22s%s #%s\n\r", dim, bold, pArea->name, dim, quest_bits_to_string(victim->pcdata->quest[num]));
}
}
}
pop_call();
return;
}
int cnt_op_lines( AREA_DATA *area )
{
int cnt, vnum;
OBJ_PROG *oprog;
push_call("cnt_mp_lines(%p)",area);
for (cnt = 0, vnum = area->low_o_vnum ; vnum <= area->hi_o_vnum ; vnum++)
{
if (obj_index[vnum] == NULL)
{
continue;
}
for (oprog = obj_index[vnum]->first_prog ; oprog ; oprog = oprog->next)
{
cnt++;
}
}
pop_call();
return cnt;
}
int cnt_mp_lines( AREA_DATA *area )
{
int cnt, vnum;
MPROG_DATA *mprog;
NPC_TOKEN *token;
push_call("cnt_mp_lines(%p)",area);
for (cnt = 0, vnum = area->low_m_vnum ; vnum <= area->hi_m_vnum ; vnum++)
{
if (mob_index[vnum] == NULL)
{
continue;
}
for (mprog = mob_index[vnum]->first_prog ; mprog ; mprog = mprog->next)
{
for (token = mprog->first_token ; token ; token = token->next)
{
cnt++;
}
}
}
pop_call();
return cnt;
}
void do_astat( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
bool found;
push_call("do_astat(%p,%p)",ch,argument);
found = FALSE;
if (argument[0] != '\0')
{
for (pArea = mud->f_area ; pArea ; pArea = pArea->next)
{
if (!strcasecmp(pArea->filename, argument)
|| !str_prefix(argument, pArea->name))
{
found = TRUE;
break;
}
}
if (!found)
{
if (argument[0] != '\0' )
{
send_to_char( "Syntax: stat area [filename|areaname]\n\r", ch );
pop_call();
return;
}
}
}
else
{
pArea = ch->in_room->area;
}
if (!can_olc_modify(ch, pArea->low_r_vnum))
{
ch_printf(ch, "You can only stat areas in your allocated vnum range\n\r");
pop_call();
return;
}
ch_printf_color( ch, "{078} name: {178}%s\n\r", pArea->name);
ch_printf_color( ch, "{078} filename: {178}%-20s\n\r", pArea->filename);
ch_printf_color( ch, "{078} authors: {178}%s\n\r", pArea->authors);
ch_printf_color( ch, "{078} resetmsg: {178}%s\n\r", pArea->resetmsg);
ch_printf_color( ch, "{078}area flags: {178}%s\n\r", flag_string(pArea->flags, area_flags));
ch_printf_color( ch, "{078} Quest: {178}%s\n\r\n\r", quest_bits_to_string(pArea->area_quest));
ch_printf_color( ch, "{078} age: {178}%5d {078} players: {178}%5d\n\r", pArea->age, pArea->nplayer);
ch_printf_color( ch, "{078} level: {178}%5d {078} count: {178}%5d\n\r", pArea->average_level, pArea->count);
ch_printf_color( ch, "{078} mprogs: {178}%5d {078} oprogs: {178}%5d\n\r", cnt_mp_lines(pArea), cnt_op_lines(pArea));
ch_printf_color( ch, "{078} low_range: {178}%5d {078} hi_range: {178}%5d\n\r", pArea->olc_range_lo, pArea->olc_range_hi);
ch_printf_color( ch, "{078} low_room: {178}%5d {078} hi_room: {178}%5d\n\r", pArea->low_r_vnum, pArea->hi_r_vnum);
ch_printf_color( ch, "{078} low_obj: {178}%5d {078} hi_obj: {178}%5d\n\r", pArea->low_o_vnum, pArea->hi_o_vnum);
ch_printf_color( ch, "{078} low_mob: {178}%5d {078} hi_mob: {178}%5d\n\r", pArea->low_m_vnum, pArea->hi_m_vnum);
ch_printf_color( ch, "{078}soft range: {178}%2d-%2d {078} hard range: {178}%2d-%2d\n\r", pArea->low_soft_range, pArea->hi_soft_range, pArea->low_hard_range, pArea->hi_hard_range);
pop_call();
return;
}
void do_racestat( CHAR_DATA *ch, char *argument)
{
char buf[MAX_INPUT_LENGTH];
int race, i;
push_call("do_racestat(%p,%p)",ch,argument);
if ((race = lookup_race(argument)) == -1)
{
send_to_char("Syntax: stat race <name>\n\r", ch);
pop_call();
return;
}
ch_printf_color(ch, "{078} Vnum:{178} %d\n\r", race);
ch_printf_color(ch, "{078} Name:{178} %s\n\r", race_table[race].race_name);
ch_printf_color(ch, "{078} Stats:{178} STR %2d DEX %2d INT %2d WIS %2d CON : %2d\n\r",
race_table[race].race_mod[0],
race_table[race].race_mod[1],
race_table[race].race_mod[2],
race_table[race].race_mod[3],
race_table[race].race_mod[4]);
for (buf[0] = '\0', i = 0 ; i < MAX_CLASS ; i++)
{
if (race_table[race].race_class[i] == 0)
{
cat_sprintf(buf, "%s ", class_table[i].who_name);
}
}
ch_printf_color(ch, "{078} Classes:{178} %s\n\r", buf);
ch_printf_color(ch, "{078} Speed:{178} %s\n\r",
race_table[race].max_speed == 0 ? "walk" :
race_table[race].max_speed == 1 ? "normal" :
race_table[race].max_speed == 2 ? "jog" :
race_table[race].max_speed == 3 ? "run" :
race_table[race].max_speed == 4 ? "haste" :
race_table[race].max_speed == 5 ? "blaze" : "unknown");
ch_printf_color(ch, "{078}Move Rate:{178} %d\n\r", race_table[race].move_rate);
ch_printf_color(ch, "{078} Vision:{178} %s\n\r",
race_table[race].vision == 0 ? "normal" :
race_table[race].vision == 1 ? "night" :
race_table[race].vision == 2 ? "dark" : "unknown");
ch_printf_color(ch, "{078}Modifiers:{178} HP %d MANA %d MOVE %d\n\r",
race_table[race].hp_mod,
race_table[race].mana_mod,
race_table[race].move_mod);
ch_printf_color(ch, "{078} Reincs:{178} Enters at %d, Leaves at %d\n\r",
race_table[race].enter,
race_table[race].leave);
ch_printf_color(ch, "{078} Specs:{178} %s\n\r", flag_string(race_table[race].flags, race_specs));
pop_call();
return;
}
void do_classstat( CHAR_DATA *ch, char *argument)
{
char buf[MAX_STRING_LENGTH], temp[50];
int cnt;
push_call("do_classstat(%p,%p)",ch,argument);
for(cnt=0; cnt < MAX_CLASS; cnt++)
{
if (is_name_short(argument, (char *) class_table[cnt].who_name)
|| is_name_short(argument, (char *) class_table[cnt].who_name_long))
{
sprintf(buf,"Class name : %s\n\r",class_table[cnt].who_name_long);
send_to_char(buf, ch);
sprintf(buf,"Prime attr : %d (",class_table[cnt].attr_prime);
switch(class_table[cnt].attr_prime)
{
case APPLY_STR : strcat(buf,"str)");break;
case APPLY_DEX : strcat(buf,"dex)");break;
case APPLY_INT : strcat(buf,"int)");break;
case APPLY_WIS : strcat(buf,"wis)");break;
case APPLY_CON : strcat(buf,"con)");break;
default : strcat(buf," ? )");break;
}
strcat(buf,"\n\r");
send_to_char(buf, ch);
sprintf(buf, "First weapon : %d\n\r", class_table[cnt].weapon);
send_to_char(buf, ch);
sprintf(buf, "Vnum of guildroom : %d\n\r", class_table[cnt].guild);
send_to_char(buf, ch);
sprintf(buf, "Skill / spell adept : %d\n\r", class_table[cnt].skill_adept);
send_to_char(buf,ch);
sprintf(buf, "Thac0 : Level 0 : %d, Level 32 : %d\n\r", class_table[cnt].thac0_00, class_table[cnt].thac0_32);
send_to_char(buf,ch);
sprintf(buf, "Min hp on level : %d, Max hp on leveling : %d\n\r",class_table[cnt].hp_min, class_table[cnt].hp_max);
send_to_char(buf,ch);
sprintf(buf, "Min mana on level : %d, Max mana on level : %d\n\r",class_table[cnt].mana_min, class_table[cnt].mana_max);
send_to_char(buf,ch);
sprintf(buf, "Description : %s\n\r",class_table[cnt].desc);
send_to_char(buf,ch);
sprintf(buf, "Spec bits :\n\r");
if(class_table[cnt].spec == CSPEC_NONE)
strcat(buf," CSPEC_NONE");
else
{
if(class_table[cnt].spec & CSPEC_BAREHANDED )
strcat(buf,"BAREHANDED ");
if(class_table[cnt].spec & CSPEC_CANTRACK )
strcat(buf,"CANTRACK ");
if(class_table[cnt].spec & CSPEC_NOMANA )
strcat(buf,"NOMANA ");
if(class_table[cnt].spec & CSPEC_WIELD )
strcat(buf,"WIELD ");
if(class_table[cnt].spec & CSPEC_NOSLICE )
strcat(buf,"NOSLICE ");
if(class_table[cnt].spec & CSPEC_NOSTAB )
strcat(buf,"NOSTAB ");
if(class_table[cnt].spec & CSPEC_NOSLASH )
strcat(buf,"NOSLASH ");
if(class_table[cnt].spec & CSPEC_NOWHIP )
strcat(buf,"NOWHIP ");
if(class_table[cnt].spec & CSPEC_NOCLAW )
strcat(buf,"NOCLAW ");
if(class_table[cnt].spec & CSPEC_NOBLAST )
strcat(buf,"NOBLAST ");
if(class_table[cnt].spec & CSPEC_NOPOUND )
strcat(buf,"NOPOUND ");
if(class_table[cnt].spec & CSPEC_NOCRUSH )
strcat(buf,"NOCRUSH ");
if(class_table[cnt].spec & CSPEC_NOGREP )
strcat(buf,"NOGREP ");
if(class_table[cnt].spec & CSPEC_NOBITE )
strcat(buf,"NOBITE ");
if(class_table[cnt].spec & CSPEC_NOPIERCE )
strcat(buf,"NOPIERCE ");
if(class_table[cnt].spec & CSPEC_CAN_DUALWIELD)
strcat(buf,"CAN_DUALWIELD ");
if(class_table[cnt].spec & CSPEC_NO_PILLS )
strcat(buf,"NO_PILLS ");
if(class_table[cnt].spec & CSPEC_NO_QUAFF )
strcat(buf,"NO_QUAFF ");
if(class_table[cnt].spec & CSPEC_NO_RECITE )
strcat(buf,"NO_RECITE ");
if(class_table[cnt].spec & CSPEC_NO_BRANDISH )
strcat(buf,"NO_BRANDISH ");
if(class_table[cnt].spec & CSPEC_NO_ZAP )
strcat(buf,"NO_ZAP ");
if(class_table[cnt].spec & CSPEC_QUICK_FLEE )
strcat(buf,"QUICK_FLEE ");
if(class_table[cnt].spec & CSPEC_RANGECAST )
strcat(buf,"RANGECAST ");
if(class_table[cnt].spec > ((2 * CSPEC_MAXVALUE) -1))
{
sprintf(temp,"UNKNOWN %lld",class_table[cnt].spec);
strcat(buf,temp);
}
}
strcat(buf,"\n\r");
send_to_char(buf, ch);
pop_call();
return;
}
}
send_to_char("Syntax: stat class <name>\n\r",ch);
pop_call();
return;
}
void do_slookup( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
char bld[10], dim[10];
int sn;
push_call("do_slookup(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char( "Slookup what?\n\r", ch );
pop_call();
return;
}
strcpy(bld, ansi_translate_text(ch, "{178}"));
strcpy(dim, ansi_translate_text(ch, "{078}"));
if (!strcasecmp(arg, "all"))
{
for (buf[0] = '\0', sn = 0 ; sn < MAX_SKILL ; sn++)
{
if (skill_table[sn].name == NULL)
{
break;
}
cat_sprintf(buf, "%sSn:%s %3d %sSlot:%s %3d %s%s '%s%s%s'\n\r", dim, bld, sn, dim, bld, skill_table[sn].slot, dim, is_spell(sn) ? "Spell" : "Skill", bld, skill_table[sn].name, dim);
}
send_to_char(buf, ch);
}
else
{
if ((sn = skill_lookup(arg)) >= 0)
{
ch_printf_color(ch, "{078}Sn:{178} %3d {078}Slot:{178} %3d {078}%s '{178}%s{078}'\n\r", sn, skill_table[sn].slot, is_spell(sn) ? "Spell" : "Skill", skill_table[sn].name);
pop_call();
return;
}
send_to_char("No such skill or spell.\n\r", ch);
}
pop_call();
return;
}
void do_stat( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
push_call("do_stat(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (IS_NPC(ch))
{
log_printf("do_stat: used by mob");
dump_stack();
pop_call();
return;
}
if (!strcasecmp(arg, "mob"))
{
do_mstat(ch, argument);
}
else if (!strcasecmp(arg, "obj"))
{
do_ostat(ch, argument);
}
else if (!strcasecmp(arg, "room"))
{
do_rstat(ch, argument);
}
else if (!strcasecmp(arg, "area"))
{
do_astat(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "class"))
{
do_classstat(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "race"))
{
do_racestat(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "skill"))
{
do_slookup(ch, argument);
}
else
{
if (IS_GOD(ch))
{
send_to_char("Syntax: stat <mob|obj|room|class|race|area|skill> <argument>\n\r", ch);
}
else
{
send_to_char("Syntax: stat <mob|obj|room|area> <argument>\n\r", ch);
}
}
pop_call();
return;
}
void do_mpcommands(CHAR_DATA *ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
int cmd, col, level;
push_call("do_mpcommands(%p,%p)",ch,argument);
for (level = 96, col = 0, buf[0] = '\0' ; level <= MAX_LEVEL ; level++)
{
for (cmd = 0 ; cmd_table[cmd].name[0] != '\0'; cmd++)
{
if (cmd_table[cmd].level == level
&& !str_infix("mp", cmd_table[cmd].name)
&& IS_SET(cmd_table[cmd].flags, CMD_HIDE))
{
if (col %5 == 0)
{
strcat(buf, get_color_string(ch, COLOR_TEXT, VT102_DIM));
}
cat_sprintf(buf, "%d-%-13s", cmd_table[cmd].level, cmd_table[cmd].name);
if (++col % 5 == 0)
{
strcat(buf, "\n\r");
}
}
}
}
if (col % 5 != 0)
{
strcat(buf, "\n\r");
}
send_to_char(buf, ch);
pop_call();
return;
}
void do_hlist( CHAR_DATA *ch, char *argument )
{
HELP_DATA *help;
AREA_DATA *pArea;
push_call("do_hlist(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
pArea = ch->in_room->area;
}
else
{
pArea = lookup_area(argument);
}
if (pArea && !can_olc_modify(ch, pArea->low_r_vnum))
{
ch_printf(ch, "That area is not in your allocated range.\n\r");
pop_call();
return;
}
else if (pArea == NULL)
{
ch_printf(ch, "Syntax: show hlist [areaname]\n\r");
pop_call();
return;
}
for (help = pArea->first_help ; help ; help = help->next)
{
ch_printf_color(ch, "{178}[{078}%2d{178}] {168}%s\n\r",
help->level,
help->keyword);
}
pop_call();
return;
}
void do_rlist( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *pRoomIndex;
AREA_DATA *pArea;
int vnum;
push_call("do_rlist(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
pArea = ch->in_room->area;
}
else
{
pArea = lookup_area(argument);
}
if (pArea && !can_olc_modify(ch, pArea->low_r_vnum))
{
ch_printf(ch, "That area is not in your allocated range.\n\r");
pop_call();
return;
}
else if (pArea == NULL)
{
ch_printf(ch, "Syntax: show rlist [areaname]\n\r");
pop_call();
return;
}
memset(buf, 0, MAX_STRING_LENGTH);
for (vnum = pArea->low_r_vnum ; vnum <= pArea->hi_r_vnum ; vnum++)
{
if ((pRoomIndex = get_room_index(vnum)) != NULL)
{
if (pRoomIndex->area == pArea)
{
cat_sprintf(buf, "{178}[{078}%5u{178}] %s\n\r",
pRoomIndex->vnum,
pRoomIndex->name);
}
if (buf[MAX_STRING_LENGTH * 3 / 4] != '\0')
{
break;
}
}
}
send_to_char_color(buf, ch);
pop_call();
return;
}
void do_mlist( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH],t1[81];
MOB_INDEX_DATA *pMobIndex;
AREA_DATA *pArea;
int vnum;
bool fAll;
FILE *mobFile;
push_call("do_mlist(%p,%p)",ch,argument);
mobFile = NULL;
if (argument[0] == '\0')
{
pArea = ch->in_room->area;
}
else
{
pArea = lookup_area(argument);
}
if (pArea && !can_olc_modify(ch, pArea->low_r_vnum))
{
ch_printf(ch, "That area is not in your allocated range.\n\r");
pop_call();
return;
}
else if (pArea == NULL)
{
if (!IS_GOD(ch))
{
ch_printf(ch, "Syntax: show mlist [areaname]\n\r");
pop_call();
return;
}
else if (strcasecmp(argument, "all"))
{
ch_printf(ch, "Syntax: show mlist [areaname|all]\n\r");
pop_call();
return;
}
}
fAll = (!pArea && !strcasecmp(argument, "all"));
if (fAll)
{
close_reserve();
mobFile = my_fopen("mlist.all", "wt", FALSE);
}
for (vnum = 0 ; vnum < MAX_VNUM ; vnum++)
{
if ((pMobIndex = get_mob_index(vnum)) != NULL)
{
if (pMobIndex->area == pArea)
{
ch_printf_color(ch, "{178}[{078}%5u{178}] ({078}%3d{178}) {058}%-20s {078}%5d Hp %3d Dam %7d Gold {178}lvl {078}%3d\n\r",
pMobIndex->vnum,
pMobIndex->total_mobiles,
str_resize(pMobIndex->short_descr, t1, -20),
pMobIndex->hitplus + pMobIndex->hitnodice + (pMobIndex->hitnodice*pMobIndex->hitsizedice - pMobIndex->hitnodice) / 2,
pMobIndex->damplus + pMobIndex->damnodice + (pMobIndex->damnodice*pMobIndex->damsizedice - pMobIndex->damnodice) / 2,
pMobIndex->gold,
pMobIndex->level);
}
else if (fAll)
{
sprintf(buf, "[%5u] %-20s %5d Hp %3d Dam %7d Gold lvl %2d\n",
pMobIndex->vnum,
str_resize(capitalize(pMobIndex->player_name), t1, -20),
pMobIndex->hitplus + pMobIndex->hitnodice + (pMobIndex->hitnodice*pMobIndex->hitsizedice - pMobIndex->hitnodice) / 2,
pMobIndex->damplus + pMobIndex->damnodice + (pMobIndex->damnodice*pMobIndex->damsizedice - pMobIndex->damnodice) / 2,
pMobIndex->gold,
pMobIndex->level);
fprintf(mobFile, buf);
}
}
}
if (fAll)
{
my_fclose(mobFile);
open_reserve();
send_to_char("Written to file: mlist.all\n\r",ch);
}
pop_call();
return;
}
void do_olist( CHAR_DATA *ch, char *argument )
{
char buf [MAX_STRING_LENGTH];
char affectBuf [MAX_STRING_LENGTH];
char wearlocBuf [MAX_STRING_LENGTH];
char itemtypeBuf[MAX_STRING_LENGTH];
char t1[81], t2[81];
AFFECT_DATA *paf;
FILE *objFile;
OBJ_INDEX_DATA *pObjIndex;
AREA_DATA *pArea, *lArea;
int vnum, nMatch, level, lRange, hRange;
bool fAll, fSort, fBrief;
push_call("do_olist(%p,%p)",ch,argument);
lArea = NULL;
if (argument[0] == '\0')
{
pArea = ch->in_room->area;
}
else
{
pArea = lookup_area(argument);
}
if (pArea && !can_olc_modify(ch, pArea->low_r_vnum))
{
ch_printf(ch, "That area is not in your allocated range.\n\r");
pop_call();
return;
}
else if (pArea == NULL)
{
if (!IS_GOD(ch))
{
ch_printf(ch, "Syntax: show olist [areaname]\n\r");
pop_call();
return;
}
else
{
if (strcasecmp(argument, "all")
&& strcasecmp(argument, "sort")
&& strcasecmp(argument, "brief"))
{
ch_printf(ch, "Syntax: show olist [areaname|all|sort|brief]\n\r");
pop_call();
return;
}
}
}
fAll = (!pArea && !strcasecmp(argument, "all"));
fSort = (!pArea && !strcasecmp(argument, "sort"));
fBrief = (!pArea && !strcasecmp(argument, "brief"));
objFile = NULL;
if (fAll || fSort || fBrief)
{
close_reserve();
objFile = my_fopen("olist.all", "wt", FALSE );
}
nMatch = 0;
if( !fSort )
{
lRange=0;
hRange=1;
}
else
{
lRange = 0;
hRange = 115;
}
for (level = lRange ; level < hRange ; level++)
{
for (vnum = 0, nMatch = 0 ; nMatch < mud->top_obj_index ; vnum++)
{
if ((pObjIndex = get_obj_index(vnum)) != NULL)
{
nMatch++;
if ((fSort && level == pObjIndex->level) || fAll || fBrief || pObjIndex->area == pArea)
{
/* Add spot for area name - Chaos 1/17/96 */
if(fAll || fBrief)
{
if (lArea != pObjIndex->area)
{
if (fBrief)
{
lArea = pObjIndex->area;
fprintf(objFile,"\n%s\n\n", lArea->name);
}
else
{
lArea = pObjIndex->area;
fprintf(objFile,"\n[%5d] %s\n\n", lArea->low_r_vnum, lArea->name);
}
}
}
strcpy(affectBuf,"");
for (paf = pObjIndex->first_affect ; paf ; paf = paf->next)
{
sprintf(t2, "%4d %s", paf->modifier, str_resize(affect_loc_name(paf->location), t1, 3));
strcat(affectBuf, t2);
t1[0] = '\0';
}
strcpy(itemtypeBuf,"");
switch (pObjIndex->item_type)
{
case ITEM_LIGHT:
sprintf(t2, "%d hr", pObjIndex->value[2]);
strcpy(itemtypeBuf,t2);
break;
case ITEM_CONTAINER:
sprintf(t2, "%d lb", pObjIndex->value[0]);
strcpy(itemtypeBuf,t2);
break;
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
sprintf(t2, "%8s", str_resize(liq_table[pObjIndex->value[2]].liq_name,t1,8));
strcpy(itemtypeBuf,t2);
break;
case ITEM_FOOD:
sprintf(t2, "%2d hr",pObjIndex->value[0]);
strcpy(itemtypeBuf,t2);
break;
case ITEM_MONEY:
sprintf(t2, "%d $$",pObjIndex->cost);
strcpy(itemtypeBuf,t2);
break;
case ITEM_WEAPON:
sprintf(t2,"%2d av", (int)(pObjIndex->value[1]*(1+(pObjIndex->value[2]-1)/2.0)));
strcpy(itemtypeBuf,t2);
break;
case ITEM_ARMOR:
sprintf(t2, "%2d ac", pObjIndex->value[0] );
strcpy(itemtypeBuf,t2);
break;
case ITEM_AMMO:
sprintf(t2,"%d av",
(pObjIndex->value[1]*pObjIndex->value[3])/2);
strcpy(itemtypeBuf,t2);
break;
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
case ITEM_WAND:
case ITEM_STAFF:
case ITEM_TREASURE:
case ITEM_FURNITURE:
case ITEM_TRASH:
case ITEM_KEY:
case ITEM_BOAT:
case ITEM_CORPSE_NPC:
case ITEM_CORPSE_PC:
case ITEM_PORTAL:
case ITEM_ARTIFACT:
case ITEM_LOCKPICK:
case ITEM_TOTEM:
if (fBrief)
{
continue;
}
else
{
break;
}
}
if (fBrief || fSort)
{
strcpy(wearlocBuf,"");
if (!IS_SET(pObjIndex->wear_flags, ITEM_TAKE) && pObjIndex->item_type != ITEM_LIGHT)
{
continue;
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_FINGER ) )
{
strcpy( wearlocBuf, "Finger->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_NECK ) )
{
strcpy( wearlocBuf, "Neck--->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_BODY ) )
{
strcpy( wearlocBuf, "Body--->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_HEAD ) )
{
strcpy( wearlocBuf, "Head--->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_LEGS ) )
{
strcpy( wearlocBuf, "Legs--->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_FEET ) )
{
strcpy( wearlocBuf, "Feet--->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_HANDS ) )
{
strcpy( wearlocBuf, "Hands-->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_ARMS ) )
{
strcpy( wearlocBuf, "Arms--->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_SHIELD ) )
{
strcpy( wearlocBuf, "Shield->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_ABOUT ) )
{
strcpy( wearlocBuf, "About-->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_WAIST ) )
{
strcpy( wearlocBuf, "Waist-->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_WRIST ) )
{
strcpy( wearlocBuf, "Wrist-->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_WIELD ) )
{
strcpy( wearlocBuf, "Wield-->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_WEAR_HOLD ) )
{
strcpy( wearlocBuf, "Hold--->");
}
else if ( IS_SET( pObjIndex->wear_flags, ITEM_TAKE ) )
{
continue;
}
else
{
strcpy( wearlocBuf, "Unknown>");
}
}
if (fBrief || fSort)
{
sprintf(buf,"%s %s%25s %8s lvl %3d\n",
wearlocBuf,
capitalize( str_resize(pObjIndex->short_descr, t1, -35)),
affectBuf,
itemtypeBuf,
pObjIndex->level);
}
else if (fAll)
{
sprintf(buf,"[%5u] %s%23s %8s lvl %3d/%3d\n",
pObjIndex->vnum,
capitalize(str_resize(pObjIndex->short_descr, t1, -26)),
affectBuf,
itemtypeBuf,
pObjIndex->level,
obj_level_estimate(pObjIndex));
}
else
{
sprintf(buf,"{178}[{078}%5u{178}] ({078}%4d{178}) {128} %s{078}%24s %8s {178}lvl {078}%3d{178}/{078}%3d\n",
pObjIndex->vnum,
pObjIndex->total_objects,
str_resize(pObjIndex->short_descr, t1, -19),
affectBuf,
itemtypeBuf,
pObjIndex->level,
obj_level_estimate(pObjIndex));
}
if (!fAll && !fSort && !fBrief)
{
strcat( buf, "\r" );
send_to_char( ansi_translate_text(ch, buf), ch );
}
else
{
char dummy[4];
strcpy(dummy,"%s" ); /* to handle objects with %s in their names */
fprintf(objFile,buf,dummy,dummy,dummy);
}
}
}
}
}
if (fAll || fSort || fBrief)
{
my_fclose(objFile);
open_reserve();
send_to_char("Written to file: olist.all\n\r",ch);
}
pop_call();
return;
}
void do_owhere( CHAR_DATA *ch, char *argument )
{
char buf[MAX_INPUT_LENGTH];
char buf1[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
char buf3[MAX_INPUT_LENGTH];
char bold[10], dim[10], objc[10], mobc[10];
OBJ_DATA *obj;
OBJ_DATA *in_obj;
bool found, basic;
int count,item_vnum;
int total, total_room, total_npc, total_pc, total_cont, total_progs, total_non_basic;
int total_pc_cont, total_npc_cont, total_null;
push_call("do_owhere(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bold, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
strcpy(objc, get_color_string(ch, COLOR_OBJECTS, VT102_BOLD));
strcpy(mobc, get_color_string(ch, COLOR_MOBILES, VT102_DIM ));
if (*argument == '\0')
{
if (IS_GOD(ch))
{
send_to_char("Syntax: show owhere <basic|total|objVnum|objName>\n\r", ch);
}
else
{
send_to_char("Syntax: show owhere <objVnum|objName>\n\r", ch);
}
pop_call();
return;
}
basic = !strcasecmp(argument, "basic");
if (!strcasecmp(argument, "total"))
{
total = 0;
total_room = 0;
total_npc = 0;
total_pc = 0;
total_cont = 0;
total_pc_cont = 0;
total_npc_cont = 0;
total_progs = 0;
total_null = 0;
total_non_basic = 0;
for (obj = mud->f_obj ; obj ; obj = obj->next)
{
total++;
if (IS_SET(obj->extra_flags, ITEM_MODIFIED))
{
total_non_basic++;
}
if (obj->in_obj != NULL)
{
if (obj->in_obj->carried_by != NULL)
{
if (IS_NPC(obj->in_obj->carried_by))
{
total_npc_cont++;
}
else
{
total_pc_cont++;
}
}
else
{
total_cont++;
}
}
else if (obj->in_room != NULL)
{
total_room++;
}
else
{
if (obj->carried_by != NULL)
{
if (!IS_NPC(obj->carried_by))
{
total_pc++;
if (obj->pIndexData->first_prog != NULL)
{
total_progs++;
}
}
else
{
total_npc++;
}
}
else
{
total_null++;
}
}
}
ch_printf(ch, "\n\r");
ch_printf(ch, " %s Totalized list of objects \n\r", dim );
ch_printf(ch, " %s+----------------------------------+--------+\n\r", bold);
ch_printf(ch, " %s| %sObjects carried by players %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_pc, bold);
ch_printf(ch, " %s| %sObjects carried by mobs %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_npc, bold);
ch_printf(ch, " %s| %sObjects in containers in room %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_cont, bold);
ch_printf(ch, " %s| %sObjects in containers on players %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_pc_cont, bold);
ch_printf(ch, " %s| %sObjects in containers on mobs %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_npc_cont, bold);
ch_printf(ch, " %s| %sObjects in rooms %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_room, bold);
ch_printf(ch, " %s| %sObjects with active obj programs %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_progs, bold);
ch_printf(ch, " %s| %sObjects in NULL %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_null, bold);
ch_printf(ch, " %s| %sTotal Non Basic Objects %s| %s%6d %s|\n\r", bold, dim, bold, dim, total_non_basic,bold);
ch_printf(ch, " %s| %sTotal Objects %s| %s%6d %s|\n\r", bold, dim, bold, dim, total, bold);
ch_printf(ch, " %s+----------------------------------+--------+\n\r", bold);
pop_call();
return;
}
found = FALSE;
count = 0;
item_vnum = is_number(argument) ? atol(argument) : -1;
for (obj = mud->f_obj ; obj && count < 100 ; obj = obj->next)
{
if (item_vnum != obj->pIndexData->vnum
&& !is_name_short(argument, obj->name)
&& !basic)
{
continue;
}
if (!can_olc_modify(ch, obj->pIndexData->vnum))
{
continue;
}
if (basic && !IS_SET(obj->extra_flags, ITEM_MODIFIED))
{
continue;
}
found = TRUE;
count++;
for (in_obj = obj ; in_obj->in_obj != NULL && in_obj->in_obj != in_obj; in_obj = in_obj->in_obj)
{
;
}
sprintf (buf1, "%s[%s%5u%s]%s %s",
bold, dim, obj->pIndexData->vnum,
bold, objc, str_resize(obj->short_descr, buf, -21));
if (in_obj->carried_by != NULL)
{
sprintf (buf2, "%s[%s%5u%s]%s %s",
bold, dim, in_obj->carried_by->in_room->vnum,
bold, dim, str_resize(in_obj->carried_by->in_room->name, buf, -16));
sprintf (buf3, "%s[%s%5u%s]%s %s",
bold, dim, IS_NPC(in_obj->carried_by) ? in_obj->carried_by->pIndexData->vnum : in_obj->carried_by->pcdata->pvnum,
bold, mobc, IS_NPC(in_obj->carried_by) ? str_resize(in_obj->carried_by->short_descr, buf, -16) : in_obj->carried_by->name);
}
else if (in_obj->in_room == NULL)
{
sprintf (buf2, "%s[%s%5u%s]%s %s",
bold, dim, -1,
bold, dim, "NULL");
buf3[0] = '\0';
}
else
{
sprintf (buf2, "%s[%s%5u%s]%s %s",
bold, dim, in_obj->in_room->vnum,
bold, dim, str_resize(in_obj->in_room->name, buf, -16));
if (in_obj == obj)
{
buf3[0] = '\0';
}
else if (in_obj == NULL)
{
sprintf (buf3, "%s[%s%5d%s]%s %s",
bold, dim, -1,
bold, objc, "NULL");
}
else
{
sprintf (buf3, "%s[%s%5u%s]%s %s",
bold, dim, in_obj->pIndexData->vnum,
bold, objc, str_resize(in_obj->short_descr, buf, -16));
}
}
sprintf(buf, "%s %s %s\n\r", buf1, buf2, buf3);
send_to_char( buf, ch );
}
if ( !found )
{
send_to_char( "Nothing like that in hell, heaven or earth.\n\r", ch );
}
pop_call();
return;
}
void do_mwhere( CHAR_DATA *ch, char *argument )
{
char buf1[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
char bold[10], dim[10], mobc[10];
CHAR_DATA *victim;
int count, mob_vnum;
push_call("do_mwhere(%p,%p)",ch,argument);
strcpy(dim, get_color_string(ch, COLOR_PROMPT, VT102_DIM ));
strcpy(bold, get_color_string(ch, COLOR_PROMPT, VT102_BOLD));
strcpy(mobc, get_color_string(ch, COLOR_MOBILES, VT102_DIM ));
count = 0;
if (argument[0] == '\0')
{
send_to_char( "Syntax: show mwhere <mobVnum|mobName>\n\r", ch );
pop_call();
return;
}
mob_vnum = atol(argument);
for (victim = mud->f_char ; count < 100 && victim ; victim = victim->next)
{
if (IS_NPC(victim) && can_olc_modify(ch, victim->pIndexData->vnum))
{
if (mob_vnum)
{
if (victim->pIndexData->vnum != mob_vnum)
{
continue;
}
}
else
{
if (!is_name_short(argument, victim->name))
{
continue;
}
}
count++;
ch_printf(ch, "%s[%s%5u%s] %s%s %s[%s%5u%s] %s%s\n\r",
bold, dim, victim->pIndexData->vnum,
bold, mobc, str_resize(victim->short_descr, buf1, -31),
bold, dim, victim->in_room->vnum,
bold, dim, str_resize(victim->in_room->name, buf2, -31));
}
}
if (count == 0)
{
if (mob_vnum == 0)
{
act("You didn't find any $T.", ch, NULL, argument, TO_CHAR);
}
else
{
act("No mob loaded with vnum $T.", ch, NULL, argument, TO_CHAR);
}
}
pop_call();
return;
}
void do_alist( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
AREA_DATA *pArea;
int vnum;
push_call("do_alist(%p,%p)",ch,argument);
if (IS_NPC(ch) || !IS_GOD(ch))
{
ch_printf(ch, "Sorry, Gods only.\n\r");
pop_call();
return;
}
strcpy(buf, "{088}");
for (pArea = NULL, vnum = 1 ; vnum < MAX_VNUM ; vnum++)
{
if (room_index[vnum] && room_index[vnum]->area != pArea)
{
pArea = room_index[vnum]->area;
}
else if (mob_index[vnum] && mob_index[vnum]->area != pArea)
{
pArea = mob_index[vnum]->area;
}
else if (obj_index[vnum] && obj_index[vnum]->area != pArea)
{
pArea = obj_index[vnum]->area;
}
else
{
continue;
}
cat_sprintf(buf, "{828} [{878}%5u {828}- {878}%5u{828}] {878}%-30s %-25s\n\r",
UMIN(pArea->low_r_vnum, UMIN(pArea->low_m_vnum, pArea->low_o_vnum)),
UMAX(pArea->hi_r_vnum, UMAX(pArea->hi_m_vnum, pArea->hi_o_vnum)),
pArea->filename,
pArea->name);
}
send_to_char_color(buf, ch);
pop_call();
return;
}
typedef struct user_list_data USER_LIST_DATA;
struct user_list_data
{
USER_LIST_DATA * next;
USER_LIST_DATA * prev;
DESCRIPTOR_DATA * desc;
};
/*
This routine Returns which host is greatest by IP numbers for sorting
Chaos - 3/19/96
*/
int hostcmp( DESCRIPTOR_DATA *d1, DESCRIPTOR_DATA *d2 )
{
int cnt;
push_call("hostcmp(%p,%p)",d1,d2);
if (d1->host == NULL || d2->host == NULL)
{
pop_call();
return 0;
}
for (cnt = 0 ; d1->host[cnt] != '\0' ; cnt++)
{
if (d1->host[cnt] < d2->host[cnt])
{
pop_call();
return -1;
}
if (d1->host[cnt] > d2->host[cnt])
{
pop_call();
return 1;
}
}
pop_call();
return 0;
}
int count_connects( DESCRIPTOR_DATA *d)
{
DESCRIPTOR_DATA *dtemp;
int cnt = 0;
push_call("count_connects(%p)",d);
for (dtemp = mud->f_desc ; dtemp ; dtemp = dtemp->next)
{
if (d->host && dtemp->host && !strcmp(d->host, dtemp->host))
{
cnt++;
}
}
pop_call();
return cnt;
}
void do_users( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
int count, val;
USER_LIST_DATA *uld, *user_list, *first_uld, *last_uld;
push_call("do_users(%p,%p)",ch,argument);
/*
The complete descriptor list
*/
if (*argument != '\0')
{
for (count = 0 ; count < MAX_LINKPERPORT + 20 ; count++)
{
sprintf(buf, "%3d ", count);
if (getsockopt(count, SOL_SOCKET, SO_SNDBUF, (char *) &val, (unsigned int *) &val) < 0)
{
cat_sprintf(buf, "SN NA ");
}
else
{
cat_sprintf(buf, "SN %-5d ", val);
}
if (getsockopt(count, SOL_SOCKET, SO_RCVBUF, (char *) &val, (unsigned int *) &val) < 0)
{
cat_sprintf(buf, "RC NA ");
}
else
{
cat_sprintf(buf, "RC %-4d ", val);
}
if (getsockopt(count, SOL_SOCKET, SO_REUSEADDR, (char *) &val, (unsigned int *) &val) < 0)
{
cat_sprintf(buf, "RU N ");
}
else
{
cat_sprintf(buf, "RU %-1d ", val);
}
/*
if (getsockopt(count, SOL_SOCKET, SO_DEBUG, (char *) &val, (unsigned int *) &val) < 0)
{
cat_sprintf(buf, "DE N ");
}
else
{
cat_sprintf(buf, "DE %-1d ", val);
}
*/
if (getsockopt(count, SOL_SOCKET, SO_KEEPALIVE, (char *) &val, (unsigned int *) &val) < 0)
{
cat_sprintf(buf, "KE N ");
}
else
{
cat_sprintf(buf, "KE %-1d ", val);
}
if (getsockopt(count, SOL_SOCKET, SO_LINGER, (char *) &val, (unsigned int *) &val) < 0)
{
cat_sprintf(buf, "LG N ");
}
else
{
cat_sprintf(buf, "LG %-1d ", val);
}
if (getsockopt(count, SOL_SOCKET, SO_TYPE, (char *) &val, (unsigned int *) &val) < 0)
{
cat_sprintf(buf, "TY N ");
}
else
{
cat_sprintf(buf, "TY %-1d ", val);
}
cat_sprintf(buf, "OWN %-2d FLG %-5x ", fcntl(count, F_GETOWN), fcntl(count, F_GETFL) >= 0 ? fcntl(count, F_GETFL) : 0);
for (d = mud->f_desc ; d ; d = d->next)
{
if (d->character && is_desc_valid(d->character))
{
if (d->descriptor == count)
{
cat_sprintf(buf, "%-3d %s", d->connected, d->character->name);
break;
}
}
}
ch_printf(ch, "%s\n\r", buf);
}
pop_call();
return;
}
/*
Sorted by ip with test for multiplaying - Scandum 18-07-2002
*/
first_uld = last_uld = NULL;
for (d = mud->f_desc ; d ; d = d->next)
{
for (uld = first_uld ; uld ; uld = uld->next)
{
if (hostcmp(d, uld->desc) == -1)
{
ALLOCMEM(user_list, USER_LIST_DATA, 1);
user_list->desc = d;
INSERT_LEFT(user_list, uld, first_uld, next, prev);
break;
}
}
if (uld == NULL)
{
ALLOCMEM(user_list, USER_LIST_DATA, 1);
user_list->desc = d;
LINK(user_list, first_uld, last_uld, next, prev);
}
}
buf[0] = '\0';
for (uld = first_uld ; uld ; uld = uld->next)
{
cat_sprintf(buf, "{178}[{078}%3d %4d{178}] {178}%14s{078}@{178}%-17s {118}%3s {078}%-14s\n\r",
uld->desc->descriptor,
uld->desc->connected,
CH(uld->desc) ? CH(uld->desc)->name : "(none)",
uld->desc->host,
count_connects(uld->desc) > 5 ? "MP" : "",
uld->desc->terminal_type);
}
while ((uld = first_uld) != NULL)
{
UNLINK(uld, first_uld, last_uld, next, prev);
FREEMEM(uld);
}
send_to_char_color(buf, ch);
pop_call();
return;
}
void do_roomfragment( CHAR_DATA *ch, char *argument )
{
int cnt;
char buf[MAX_STRING_LENGTH];
push_call("do_roomfragment(%p,%p)",ch,argument);
strcpy( buf, "Room Fragmentation chart:\n\r");
strcat( buf, " 0 1 2 3 4 5 6 7 8 9\n\r" );
for (cnt = 0 ; cnt < MAX_VNUM/100 ; cnt++)
{
if (cnt % 10 == 0)
{
cat_sprintf(buf, "%2d ",cnt/10);
}
if (room_index[cnt*100+1] != NULL)
{
strcat(buf, "X ");
}
else
{
strcat(buf, " ");
}
if (cnt % 10 == 9)
{
strcat(buf, "\n\r");
}
}
send_to_char(buf, ch);
pop_call();
return;
}
void do_termlist (CHAR_DATA * ch, char *arg)
{
PLAYER_GAME *gpl;
char buf[MAX_STRING_LENGTH];
push_call("do_termlist(%p,%p)",ch,arg);
for (buf[0] = '\0', gpl = mud->f_player ; gpl ; gpl = gpl->next)
{
cat_sprintf(buf, "{078}%15s {188}[{078}%2d{188}] [{078}%3d{188}] ", gpl->ch->name, gpl->ch->pcdata->vt100_type % 100, gpl->ch->pcdata->vt100_type / 100);
cat_sprintf(buf, "{078}%s %s ", gpl->ch->pcdata->vt100 ? "VT102" : "VT100", gpl->ch->pcdata->ansi ? "ANSI" : "MONO");
if (gpl->ch->desc && gpl->ch->desc->mccp)
{
cat_sprintf(buf, "MCCP %4.1f%%", 100 - 100.0 * gpl->ch->desc->mccp->total_out / UMAX(1, gpl->ch->desc->mccp->total_in));
}
else
{
cat_sprintf(buf, " ");
}
cat_sprintf(buf, "%4d %s\n\r", gpl->ch->pcdata->idle, gpl->ch->desc ? gpl->ch->desc->terminal_type : "");
}
send_to_char_color(buf, ch);
pop_call();
return;
}
void do_file( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
CRIME_DATA *record;
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
char colG[10], colY[10], colC[10], colW[10];
int number, cnt;
bool loaded;
push_call("do_file(%p,%p)",ch,argument);
strcpy(colG, ansi_translate_text(ch, "{128}"));
strcpy(colY, ansi_translate_text(ch, "{138}"));
strcpy(colC, ansi_translate_text(ch, "{168}"));
strcpy(colW, ansi_translate_text(ch, "{178}"));
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (arg1[0] == '\0')
{
send_to_char("Usage : file <victim> [<record #>]\n\r", ch);
pop_call();
return;
}
if ((victim = lookup_char(arg1)) == NULL)
{
if ((victim = start_partial_load(ch, arg1)) == NULL)
{
pop_call();
return;
}
loaded = TRUE;
}
else
{
loaded = FALSE;
}
if (arg2[0] != '\0')
{
number = atoi(arg2);
}
else
{
number = -1;
}
if (victim->pcdata->first_record == NULL)
{
ch_printf(ch, "%s has no criminal record.\n\r", victim->name);
if (loaded)
{
clear_partial_load(victim);
}
pop_call();
return;
}
for (cnt = 0, buf[0] = '\0', record = victim->pcdata->first_record ; record ; record = record->next)
{
if (number == -1 || ++cnt == number)
{
cat_sprintf(buf, "%s%s %shas been arrested on %s%s %sby %s%s%s.\n\r", colY, victim->name, colW, colG, get_time_string(record->date), colW, colY, record->arrester, colW);
cat_sprintf(buf, "%s%s %shas been imprisoned for %s%d %sdays, %s%d %shours and %s%d %sminutes.\n\r",
colY, victim->name, colW,
colG, record->jailtime / 86400, colW,
colG, record->jailtime % 86400 / 3600, colW,
colG, record->jailtime % 86400 % 3600 / 60, colW);
if (record->released == TRUE)
{
cat_sprintf(buf, "%s%s %shas been released from this punishment by %s%s%s.\n\r",
colY, victim->name, colW,
colY, record->releaser, colW);
}
else
{
int time_left = victim->pcdata->jailtime - (mud->current_time - victim->pcdata->jaildate);
if (time_left > 0)
{
cat_sprintf(buf, "%s%s %swill be autoreleased in %s%d %sdays, %s%d %shours and %s%d %sminutes.\n\r",
colY, victim->name, colW,
colG, time_left / 86400, colW,
colG, time_left % 86400 / 3600, colW,
colG, time_left % 86400 % 3600 / 60, colW);
}
else
{
cat_sprintf(buf, "%s%s %sis waiting to be auto released by the system.\n\r",
colY, victim->name, colW);
}
}
cat_sprintf(buf, "%sFile information:%s\n\r%s\n\r",
colC, colW, record->crime_record);
}
}
if (number != -1 && number > cnt)
{
sprintf(buf, "%s hasn't committed that many crimes.\n\r", victim->name);
}
send_to_char(buf, ch);
if (loaded)
{
clear_partial_load(victim);
}
pop_call();
return;
}
void do_showcurve(CHAR_DATA *ch, char *argument)
{
int cnt, i, req_exp, dif_exp, prev_exp;
char buf[MAX_STRING_LENGTH];
push_call("do_showcurve(%p,%p)",ch,argument);
cnt = i = req_exp = dif_exp = prev_exp = 0;
if (argument[0] == '\0')
{
ch_printf(ch, "Show the learning curve of which class?\n\r");
pop_call();
return;
}
if (!strcasecmp(argument, "mon"))
{
for (i = 1 ; i <= 300 ; i++)
{
req_exp = exp_level(CLASS_MONSTER, i);
dif_exp = req_exp - prev_exp;
prev_exp = req_exp;
cat_sprintf(buf, "{078}Level {138}%3d{178}: {078}%12d {138}- {078}%12d exp\n\r", i, req_exp, dif_exp);
}
send_to_char_color(buf, ch);
pop_call();
return;
}
for (buf[0] = '\0', cnt = 0 ; cnt < MAX_CLASS ; cnt++)
{
if (is_name_short(argument, (char *) class_table[cnt].who_name))
{
for (i = 1 ; i <= 95 ; i++)
{
req_exp = exp_level(cnt, i);
dif_exp = req_exp - prev_exp;
prev_exp = req_exp;
cat_sprintf(buf, "{078}Level {138}%2d{178}: {078}%12d {138}- {078}%12d exp\n\r", i, req_exp, dif_exp);
}
break;
}
}
if (cnt == MAX_CLASS)
{
send_to_char("Syntax: show expcurve <war|gla|mar|nin|dru|sor|sha|wlc|mon>\n\r", ch);
}
else
{
send_to_char_color(buf, ch);
}
pop_call();
return;
}
void do_show( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
push_call("do_show(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (IS_NPC(ch))
{
log_printf("do_show: used by mob");
dump_stack();
pop_call();
return;
}
if (!strcasecmp(arg, "mpcommands"))
{
do_mpcommands(ch, argument);
}
else if (!strcasecmp(arg, "rlist"))
{
do_rlist(ch, argument);
}
else if (!strcasecmp(arg, "mlist"))
{
do_mlist(ch, argument);
}
else if (!strcasecmp(arg, "olist"))
{
do_olist(ch, argument);
}
else if (!strcasecmp(arg, "hlist"))
{
do_hlist(ch, argument);
}
else if (!strcasecmp(arg, "mwhere"))
{
do_mwhere(ch, argument);
}
else if (!strcasecmp(arg, "owhere"))
{
do_owhere(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "alist"))
{
do_alist(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "openfiles"))
{
do_openfiles(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "cpu"))
{
do_cpu(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg,"memory"))
{
do_memory(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "terms"))
{
do_termlist(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "users"))
{
do_users(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "log"))
{
do_llog(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "world"))
{
do_roomfragment(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "file"))
{
do_file(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "plist"))
{
do_lookup(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "attack"))
{
do_attack(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "exp"))
{
do_showcurve(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "stack"))
{
do_stack(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "hash"))
{
ch_printf_color(ch, "%s", str_hash_status(argument));
}
else
{
if (IS_GOD(ch))
{
send_to_char("Syntax: show <field> <argument>\n\r\n\r", ch);
send_to_char("Field being one of:\n\r", ch);
send_to_char(" world log users terms memory cpu hash openfiles file exp attack\n\r", ch);
send_to_char(" plist rlist alist mlist olist hlist mwhere owhere mpcommands stack\n\r", ch);
}
else
{
send_to_char("Syntax: show <rlist|mlist|olist|hlist|mwhere|owhere|mpcommands> <argument>\n\r", ch);
}
}
pop_call();
return;
}
void do_bamfin( CHAR_DATA *ch, char *argument )
{
push_call("do_bamfin(%p,%p)",ch,argument);
if (*argument == '\0')
{
send_to_char("Set poof in to what?\n\r", ch);
pop_call();
return;
}
if (!IS_NPC(ch))
{
smash_tilde(argument);
STRFREE(ch->pcdata->bamfin);
ch->pcdata->bamfin = STRALLOC(argument);
ch_printf_color(ch, "Poof in set to: %s\n\r", argument);
}
pop_call();
return;
}
void do_bamfout( CHAR_DATA *ch, char *argument )
{
push_call("do_bamfout(%p,%p)",ch,argument);
if (*argument == '\0')
{
send_to_char("Set poof out to what?\n\r", ch);
pop_call();
return;
}
if (!IS_NPC(ch))
{
smash_tilde( argument );
STRFREE(ch->pcdata->bamfout );
ch->pcdata->bamfout = STRALLOC( argument );
ch_printf_color(ch, "Poof out set to: %s\n\r", argument);
}
pop_call();
return;
}
void do_poof( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
push_call("do_poof(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (!strcasecmp(arg, "in"))
{
do_bamfin(ch, argument);
}
else if (!strcasecmp(arg, "out"))
{
do_bamfout(ch, argument);
}
else
{
ch_printf(ch, "Syntax: poof <in|out> <string>\n\r");
}
pop_call();
return;
}
void do_arrest( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int jailtime, multiplier, pvnum;
push_call("do_arrest(%p,%p)",ch,argument);
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (IS_NPC(ch))
{
pop_call();
return;
}
pvnum = 0;
if (ch->pcdata->editmode == MODE_NONE)
{
if (*arg1 == '\0')
{
sprintf(buf, "List of arrested players:\n\r\n\r");
for (pvnum = 0 ; pvnum < MAX_PVNUM ; pvnum++)
{
if (pvnum_index[pvnum] == NULL)
{
continue;
}
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_ARRESTED))
{
cat_sprintf(buf, "%-16s", pvnum_index[pvnum]->name);
}
}
ch_printf(ch, "%s\n\r", justify(buf, 80));
pop_call();
return;
}
if (*arg2 == '\0')
{
send_to_char("Usage: arrest <name> <number> <hours|days|months|years>\n\r\n\r", ch);
pop_call();
return;
}
if ((pvnum = get_pvnum_name(arg1)) == -1)
{
send_to_char("That player does not exists.\n\r", ch);
pop_call();
return;
}
if (pvnum < 100)
{
send_to_char("You cannot arrest that person.\n\r", ch);
pop_call();
return;
}
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_ARRESTED))
{
send_to_char("They've already been arrested.\n\r", ch);
pop_call();
return;
}
if ((jailtime = atoi(arg2)) <= 0)
{
send_to_char("You must enter a correct duration.\n\r", ch);
pop_call();
return;
}
switch (*argument)
{
case 'h': case 'H': multiplier = 3600; break;
case 'd': case 'D': multiplier = 86400; break;
case 'w': case 'W': multiplier = 604800; break;
case 'm': case 'M': multiplier = 2635200; break;
case 'y': case 'Y': multiplier = 31536000; break;
default:
send_to_char("You must specify 'years', 'months', 'weeks', 'hours' or 'days'.\n\r", ch);
pop_call();
return;
break;
}
if (multiplier * jailtime > 31536000)
{
send_to_char("The maximum sentence is 1 year.\n\r", ch);
pop_call();
return;
}
if (pvnum_index[pvnum]->ch == NULL)
{
do_pload(ch, pvnum_index[pvnum]->name);
}
if (pvnum_index[pvnum] == NULL || pvnum_index[pvnum]->ch == NULL)
{
send_to_char("Failed to find pvnum data.\n\r", ch);
pop_call();
return;
}
victim = pvnum_index[pvnum]->ch;
log_printf("%s has arrested %s", ch->name, victim->name);
if (victim->fighting != NULL)
{
stop_fighting( victim, TRUE );
}
char_to_room(victim, ROOM_VNUM_JAIL);
SET_BIT(pvnum_index[pvnum]->flags, PVNUM_ARRESTED);
victim->pcdata->jailtime = jailtime * multiplier;
victim->pcdata->jaildate = mud->current_time;
ch_printf(victim, "%s has arrested you.\n\r", get_name(ch));
ch_printf(ch, "%s has been arrested.\n\r", get_name(victim));
save_players();
}
switch (ch->pcdata->editmode)
{
default :
bug("do_arrest() : illegal editmode");
pop_call();
return;
case MODE_RESTRICTED :
send_to_char("You cannot arrest someone while editing something.\n\r",ch);
pop_call();
return;
case MODE_NONE :
ch->pcdata->edit_ptr = pvnum_index[pvnum];
ch->pcdata->editmode = MODE_CRIME_RECORD;
ch->pcdata->tempmode = MODE_NONE;
start_editing(ch, ch->pcdata->edit_buf);
pop_call();
return;
case MODE_CRIME_RECORD :
add_crime(ch, ch->pcdata->edit_ptr);
stop_editing(ch);
pop_call();
return;
}
pop_call();
return;
}
void add_crime (CHAR_DATA *ch, PVNUM_DATA *pvnum)
{
CHAR_DATA *victim;
CRIME_DATA *new_record;
push_call("add_crime(%p,%p)",ch,pvnum);
if (pvnum->ch == NULL)
{
do_pload(ch, pvnum->name);
}
victim = pvnum->ch;
ALLOCMEM(new_record, CRIME_DATA, 1);
new_record->crime_record = copy_buffer(ch);
new_record->arrester = STRALLOC(ch->name);
new_record->date = mud->current_time;
new_record->level = UMIN(ch->level, MAX_LEVEL);
new_record->jailtime = victim->pcdata->jailtime;
LINK(new_record, victim->pcdata->first_record, victim->pcdata->last_record, next, prev);
pop_call();
return;
}
void do_release( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CRIME_DATA *record;
push_call("do_release(%p,%p)",ch,argument);
if ((victim = get_player_world(ch, argument)) == NULL)
{
send_to_char("That character could not be found.\n\r", ch);
pop_call();
return;
}
if (!IS_SET(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_ARRESTED))
{
send_to_char("That player is not imprisoned.\n\r", ch);
pop_call();
return;
}
record = victim->pcdata->last_record;
if (record && record->level >= ch->level)
{
if (record->level == MAX_LEVEL && !strcasecmp(ch->name, record->arrester))
{
send_to_char("Overriding your own sentence!\n\r", ch);
}
else
{
ch_printf(ch, "You may not release %s", capitalize(victim->name));
pop_call();
return;
}
}
if (record)
{
record->released = TRUE;
STRFREE(record->releaser);
record->releaser = STRALLOC(ch->name);
}
act( "$n has been released.", victim, NULL, NULL, TO_ROOM );
char_from_room( victim );
char_to_room( victim, ROOM_VNUM_TEMPLE);
act( "$n has been released.", victim, NULL, NULL, TO_ROOM );
do_look( victim, "auto" );
act( "$n has released you.", ch, NULL, victim, TO_VICT );
REMOVE_BIT(pvnum_index[victim->pcdata->pvnum]->flags, PVNUM_ARRESTED);
victim->pcdata->jailtime = 0;
victim->pcdata->jaildate = 0;
ch_printf(ch, "%s has been released.\n\r", get_name(victim));
save_players();
pop_call();
return;
}
void auto_release( CHAR_DATA *ch )
{
CRIME_DATA *record;
push_call("auto_release(%p)",ch);
record = ch->pcdata->last_record;
if (record)
{
STRFREE(record->releaser);
record->released = TRUE;
record->releaser = STRALLOC("The System");
}
act( "$n has been released.", ch, NULL, NULL, TO_ROOM );
char_from_room( ch );
char_to_room( ch, ROOM_VNUM_TEMPLE);
act( "$n has been released.", ch, NULL, NULL, TO_ROOM );
do_look( ch, "auto" );
REMOVE_BIT(pvnum_index[ch->pcdata->pvnum]->flags, PVNUM_ARRESTED);
ch->pcdata->jailtime = 0;
ch->pcdata->jaildate = 0;
send_to_char("You have been released from the dungeons.\n\r", ch);
save_players();
pop_call();
return;
}
void do_deny( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
int pvnum;
push_call("do_deny(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
sprintf(buf, "List of denied players:\n\r\n\r");
for (pvnum = 0 ; pvnum < MAX_PVNUM ; pvnum++)
{
if (pvnum_index[pvnum] == NULL)
{
continue;
}
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_DENIED))
{
cat_sprintf(buf, "%-16s", pvnum_index[pvnum]->name);
}
}
ch_printf(ch, "%s\n\r", justify(buf, 80));
pop_call();
return;
}
if ((pvnum = get_pvnum_name(argument)) == -1)
{
send_to_char("That player does not exist.\n\r", ch);
pop_call();
return;
}
if (pvnum < 100)
{
send_to_char( "You failed.\n\r", ch );
pop_call();
return;
}
victim = get_char_pvnum(pvnum);
TOGGLE_BIT(pvnum_index[pvnum]->flags, PVNUM_DENIED);
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_DENIED))
{
send_to_char( "They have been denied access.\n\r", ch );
log_printf("%s has been denied by %s", pvnum_index[pvnum]->name, ch->name);
if (victim)
{
send_to_char("You have been denied access.\n\r", victim);
do_quit(victim, NULL);
}
}
else
{
send_to_char( "They are no longer denied.\n\r", ch );
log_printf("%s has been undenied by %s", pvnum_index[pvnum]->name, ch->name);
}
save_players();
pop_call();
return;
}
void do_disconnect( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
int port;
push_call("do_disconnect(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char( "Disconnect whom?\n\r", ch );
pop_call();
return;
}
if ((port = atol(arg)) == 0)
{
if ((victim = get_player_world(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (victim->desc == NULL)
{
act( "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
pop_call();
return;
}
for (d = mud->f_desc ; d ; d = d->next)
{
if (is_desc_valid(d->character) && d == victim->desc)
{
close_socket(d, TRUE);
send_to_char( "Ok.\n\r", ch );
pop_call();
return;
}
}
send_to_char( "Descriptor of that name not found!\n\r", ch );
pop_call();
return;
}
for (d = mud->f_desc ; d ; d = d->next)
{
if (d->descriptor == port)
{
close_socket(d, TRUE);
send_to_char( "Ok.\n\r", ch);
pop_call();
return;
}
}
send_to_char( "Descriptor of that number not found!\n\r", ch );
pop_call();
return;
}
void do_pardon( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
push_call("do_pardon(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char( "Syntax: pardon <player> <killer|thief|outcast>.\n\r", ch );
pop_call();
return;
}
if ((victim = get_player_world(ch, arg1)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (!strcasecmp(arg2, "killer"))
{
TOGGLE_BIT(victim->act, PLR_KILLER);
if (IS_SET(victim->act, PLR_KILLER))
{
victim->pcdata->killer_played = victim->pcdata->played;
send_to_char( "Killer flag added.\n\r", ch );
send_to_char( "You are now a KILLER!\n\r", victim );
}
else
{
send_to_char( "Killer flag removed.\n\r", ch );
send_to_char( "You are no longer a KILLER.\n\r", victim );
}
pop_call();
return;
}
if (!strcasecmp(arg2, "thief"))
{
TOGGLE_BIT(victim->act, PLR_THIEF);
if (IS_SET(victim->act, PLR_THIEF))
{
send_to_char( "Thief flag added.\n\r", ch );
send_to_char( "You are now a THIEF!\n\r", victim );
}
else
{
send_to_char( "Thief flag removed.\n\r", ch );
send_to_char( "You are no longer a THIEF.\n\r", victim );
}
pop_call();
return;
}
if (!strcasecmp(arg2, "outcast"))
{
TOGGLE_BIT(victim->act, PLR_OUTCAST);
if (IS_SET(victim->act, PLR_OUTCAST))
{
send_to_char( "Outcast flag added.\n\r", ch );
send_to_char( "You are now an OUTCAST!\n\r", victim );
}
else
{
send_to_char( "Outcast flag removed.\n\r", ch );
send_to_char( "You are no longer an OUTCAST.\n\r", victim );
}
pop_call();
return;
}
send_to_char( "Syntax: pardon <player> <killer|thief|outcast>.\n\r", ch );
pop_call();
return;
}
void do_echo( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
push_call("do_echo(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
if (ch != NULL)
{
send_to_char( "Echo what?\n\r", ch );
}
pop_call();
return;
}
for (d = mud->f_desc ; d ; d = d->next)
{
if (is_desc_valid(d->character) && (d->connected == CON_PLAYING || d->connected == CON_EDITING))
{
if ((!IS_NPC(d->character) && (d->character->level == MAX_LEVEL) && (ch != NULL)))
{
ch_printf_color(d->character, "{178}[{078}%s{178}]\n\r", ch->name);
}
ch_printf_color(d->character, "%s\n\r", ansi_justify(argument, get_page_width(d->character)));
}
}
pop_call();
return;
}
int find_location( CHAR_DATA *ch, char *arg )
{
CHAR_DATA *victim;
push_call("find_location(%p,%p)",ch,arg);
if (is_number(arg))
{
if (get_room_index(atol(arg)) == NULL)
{
pop_call();
return -1;
}
pop_call();
return atol(arg);
}
if ((victim = get_player_world(ch, arg)) != NULL)
{
pop_call();
return victim->in_room->vnum;
}
if ((victim = get_char_world(ch, arg)) != NULL)
{
pop_call();
return victim->in_room->vnum;
}
pop_call();
return -1;
}
void do_transfer( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int location;
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
push_call("do_transfer(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if (arg1[0] == '\0')
{
send_to_char( "Transfer whom (and where)?\n\r", ch );
pop_call();
return;
}
if (IS_NPC(ch))
{
log_printf("[%u] Mob using transfer", ch->pIndexData->vnum);
pop_call();
return;
}
if (!strcasecmp(arg1, "all") && IS_GOD(ch))
{
for (d = mud->f_desc ; d ; d = d->next)
{
if (d->connected >= CON_PLAYING
&& is_desc_valid(d->character)
&& d->character != ch
&& d->character->in_room != NULL
&& d->character->in_room != ch->in_room
&& can_see_world(ch, d->character))
{
char buf[MAX_STRING_LENGTH];
sprintf(buf, "%s %s", d->character->name, arg2);
do_transfer(ch, buf);
}
}
pop_call();
return;
}
/*
Thanks to Grodyn for the optional location parameter.
*/
if (arg2[0] == '\0')
{
location = ch->in_room->vnum;
}
else
{
if ((location = find_location(ch, arg2)) == -1)
{
send_to_char( "No such location.\n\r", ch );
pop_call();
return;
}
if (!can_olc_modify(ch, location))
{
send_to_char( "That location is not in your allocated vnum range.\n\r", ch);
pop_call();
return;
}
if (ch->level < LEVEL_IMMORTAL && room_is_private(room_index[location]))
{
send_to_char( "That room is private right now.\n\r", ch );
pop_call();
return;
}
}
if ((victim = get_char_world(ch, arg1)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (victim->in_room == NULL)
{
send_to_char( "They are in limbo.\n\r", ch );
pop_call();
return;
}
if (victim->fighting != NULL)
{
stop_fighting( victim, TRUE );
}
act( "$n disappears in a mushroom cloud.", victim, NULL, NULL, TO_ROOM );
char_from_room( victim );
char_to_room( victim, location );
act( "$n arrives from a puff of smoke.", victim, NULL, NULL, TO_ROOM );
if (ch != victim)
{
act( "$n has transferred you.", ch, NULL, victim, TO_VICT );
}
do_look( victim, "auto" );
pop_call();
return;
}
void do_at( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
int location, original;
CHAR_DATA *mount;
OBJ_DATA *furniture;
push_call("do_at(%p,%p)",ch,argument);
argument = one_argument( argument, arg );
if (IS_NPC(ch))
{
log_printf( "[%u] Mob using at: %s", ch->pIndexData->vnum, argument);
pop_call();
return;
}
if (arg[0] == '\0' || argument[0] == '\0')
{
send_to_char( "At where what?\n\r", ch );
pop_call();
return;
}
if ((location = find_location(ch, arg)) == -1)
{
send_to_char( "No such location.\n\r", ch );
pop_call();
return;
}
if (!can_olc_modify(ch, location))
{
send_to_char("That destination is not in your allocated vnum range.\n\r", ch);
pop_call();
return;
}
furniture = ch->furniture;
mount = ch->mounting;
original = ch->in_room->vnum;
char_from_room( ch );
char_to_room( ch, location);
interpret(ch, argument);
/*
See if 'ch' still exists before continuing!
Handles 'at XXXX quit' case.
*/
if (ch->in_room)
{
char_from_room(ch);
char_to_room(ch, original);
ch->furniture = furniture;
ch->mounting = mount;
}
pop_call();
return;
}
void do_mfind( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
MOB_INDEX_DATA *pMobIndex;
int nMatch, vnum;
push_call("do_mfind(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char( "mob find what?\n\r", ch );
pop_call();
return;
}
for (nMatch = 0, vnum = 0 ; vnum < MAX_VNUM ; vnum++)
{
if ((pMobIndex = get_mob_index(vnum)) != NULL)
{
if (!can_olc_modify(ch, pMobIndex->vnum))
{
continue;
}
if (is_name_list(arg, pMobIndex->player_name) && ++nMatch)
{
ch_printf_color(ch, "{178}[{078}%5u{178}] %s%s\n\r",
pMobIndex->vnum,
get_color_string(ch, COLOR_MOBILES, VT102_DIM),
capitalize(pMobIndex->short_descr));
}
}
}
if (nMatch)
{
ch_printf( ch, "Number of matches: %d\n", nMatch );
}
else
{
send_to_char( "Nothing like that in hell, heaven, or earth.\n\r", ch );
}
pop_call();
return;
}
void do_ofind( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
int nMatch, vnum;
push_call("do_ofind(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char( "Obj find what?\n\r", ch );
pop_call();
return;
}
for (nMatch = 0, vnum = 0 ; vnum < MAX_VNUM ; vnum++)
{
if ((pObjIndex = get_obj_index(vnum)) != NULL)
{
if (!can_olc_modify(ch, pObjIndex->vnum))
{
continue;
}
if (is_name_list(arg, pObjIndex->name) && ++nMatch)
{
ch_printf_color(ch, "{178}[{078}%5u{178}] %s%s\n\r",
pObjIndex->vnum,
get_color_string(ch, COLOR_OBJECTS, VT102_BOLD),
capitalize(pObjIndex->short_descr));
}
}
}
if (nMatch)
{
ch_printf(ch, "Number of matches: %d\n", nMatch);
}
else
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
}
pop_call();
return;
}
void do_find( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
push_call("do_find(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (!strcasecmp(arg, "mob"))
{
do_mfind(ch, argument);
}
else if (!strcasecmp(arg, "obj"))
{
do_ofind(ch, argument);
}
else
{
ch_printf(ch, "Syntax: find <mob|obj> <name>\n\r");
}
pop_call();
return;
}
void do_reboo( CHAR_DATA *ch, char *argument )
{
push_call("do_reboo(%p,%p)",ch,argument);
send_to_char( "If you want to REBOOT, spell it out.\n\r", ch );
pop_call();
return;
}
void do_reboot( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
PLAYER_GAME *pch, *pch_next;
push_call("do_reboot(%p,%p)",ch,argument);
if (argument[0] == 'S' || argument[0] == 's')
{
sprintf(buf, "Reboot scheduled after everyone is off the Realm.\n\rCompliments of %s\n\r", ch->name);
do_echo( ch, buf );
SET_BIT(mud->flags, MUD_EMUD_REBOOT);
pop_call();
return;
}
if (argument[0] == 'N' || argument[0] == 'n')
{
DESCRIPTOR_DATA *d;
DESCRIPTOR_DATA *d_next;
log_string("Saving Castles...");
do_savearea(NULL, "forreal");
log_string("Saving Clans...");
save_all_clans();
log_string("Saving Hiscores...");
save_hiscores();
log_string("Saving Timeinfo...");
save_timeinfo();
for (d = mud->f_desc; d ; d = d_next)
{
d_next = d->next;
if (!d->character || d->connected < 0)
{
write_to_descriptor (d, "\n\rSorry, Emud is Rebooting. Try again in one minute.\n\r", 0);
close_socket(d, TRUE);
}
}
log_string("Saving Players...");
for (pch = mud->f_player ; pch ; pch = pch_next)
{
pch_next = pch->next;
if (pch->ch != ch)
{
do_request(pch->ch, "V-");
send_to_char( "The game is now rebooting. Try again in 1 minute.\n\r", pch->ch );
do_quit(pch->ch, NULL);
}
}
do_quit(ch, NULL);
SET_BIT(mud->flags, MUD_EMUD_DOWN);
SET_BIT(mud->flags, MUD_EMUD_BOOTING);
pop_call();
return;
}
send_to_char( "You must specify 'now' or 'soon'.\n\r", ch);
pop_call();
return;
}
void do_shutdow( CHAR_DATA *ch, char *argument )
{
push_call("do_shutdow(%p,%p)",ch,argument);
send_to_char( "If you want to SHUTDOWN, spell it out.\n\r", ch );
pop_call();
return;
}
void do_shutdown( CHAR_DATA *ch, char *argument )
{
PLAYER_GAME *pch, *pch_next;
FILE *fp;
push_call("do_shutdown(%p,%p)",ch,argument);
if (IS_NPC(ch) || !IS_GOD(ch))
{
log_printf("%s tried to shutdown the mud.", get_name(ch));
dump_stack();
pop_call();
return;
}
if (tolower(argument[0]) != 'n')
{
send_to_char( "You must specify 'now' after the command.\n\r", ch);
pop_call();
return;
}
do_echo(NULL, "The game is shutting down now. Please try to connect in 15 minutes again.");
log_string("Saving Clans...");
save_all_clans();
log_string("Saving Castles...");
do_savearea(NULL, "forreal");
log_string("Saving Hiscores...");
save_hiscores();
log_string("Saving Timeinfo...");
save_timeinfo();
log_string("Saving Players...");
for (pch = mud->f_player ; pch ; pch = pch_next)
{
pch_next = pch->next;
if (pch->ch != ch)
{
send_to_char("The game is now shut down. Try again in 15 minutes.\n\r", pch->ch);
do_quit(pch->ch, NULL);
}
}
do_quit(ch, NULL);
my_fclose_all();
fp = my_fopen(SHUTDOWN_FILE, "w", FALSE);
fprintf(fp, "Shutdown by %s.\n", ch->name);
my_fclose(fp);
SET_BIT(mud->flags, MUD_EMUD_DOWN);
SET_BIT(mud->flags, MUD_EMUD_BOOTING);
pop_call();
return;
}
void do_snoop( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
bool notify;
push_call("do_snoop(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (arg[0] == '\0')
{
victim = ch;
}
else if ((victim = get_player_world(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (tolower(argument[0]) == 'n')
{
notify = TRUE;
}
else
{
notify = FALSE;
}
if (victim->desc == NULL)
{
send_to_char( "No descriptor to snoop.\n\r", ch );
pop_call();
return;
}
log_god_printf("%s: snoop %s %s", ch->name, arg, notify ? "(notified)" : "");
if (victim == ch)
{
send_to_char( "Cancelling all snoops.\n\r", ch );
for (d = mud->f_desc ; d ; d = d->next)
{
if (d->snoop_by == ch->desc)
{
d->snoop_by = NULL;
}
}
pop_call();
return;
}
if (victim->desc->snoop_by == ch->desc)
{
act( "Cancelling snoop of $N.", ch, NULL, victim, TO_CHAR );
if (notify)
{
ch_printf(victim, "%s is no longer snooping you.\n\r", get_name(ch));
}
victim->desc->snoop_by = NULL;
pop_call();
return;
}
if (victim->desc->snoop_by != NULL )
{
send_to_char( "Busy already.\n\r", ch );
pop_call();
return;
}
if (get_trust(victim) == MAX_LEVEL)
{
send_to_char( "You failed.\n\r", ch );
pop_call();
return;
}
if (ch->desc != NULL)
{
for (d = ch->desc->snoop_by ; d != NULL ; d = d->snoop_by)
{
if (d->character == victim || d->original == victim)
{
send_to_char( "No snoop loops.\n\r", ch );
pop_call();
return;
}
}
}
victim->desc->snoop_by = ch->desc;
act( "You are now snooping $N.", ch, NULL, victim, TO_CHAR );
if (notify)
{
ch_printf(victim, "%s is now snooping you.\n\r", get_name(ch));
}
pop_call();
return;
}
void do_switch( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
push_call("do_switch(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char( "Switch into whom?\n\r", ch );
pop_call();
return;
}
if (ch->desc == NULL)
{
pop_call();
return;
}
if (ch->desc->original != NULL)
{
send_to_char( "You are already switched.\n\r", ch );
pop_call();
return;
}
if ((victim = get_char_world(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (!IS_NPC(victim))
{
send_to_char( "You may not switch into a player's character.\n\r", ch );
pop_call();
return;
}
if (victim == ch)
{
send_to_char( "Ok.\n\r", ch );
pop_call();
return;
}
if (victim->desc != NULL)
{
send_to_char( "Character in use.\n\r", ch );
pop_call();
return;
}
ch->desc->character = victim;
ch->desc->original = ch;
victim->desc = ch->desc;
ch->desc = NULL;
ch->pcdata->switched = TRUE;
send_to_char( "Ok.\n\r", victim );
pop_call();
return;
}
void do_return( CHAR_DATA *ch, char *argument )
{
push_call("do_return(%p,%p)",ch,argument);
if (ch->desc == NULL)
{
pop_call();
return;
}
if (ch->desc->original == NULL)
{
if (argument != NULL)
{
send_to_char( "You are already yourself.\n\r", ch );
}
pop_call();
return;
}
if (argument != NULL)
{
send_to_char( "You return to your original body.\n\r", ch );
morph_update(ch, NULL);
}
ch->desc->character = ch->desc->original;
ch->desc->character->timer = 0;
ch->desc->character->pcdata->switched = FALSE;
ch->desc->original = NULL;
ch->desc->character->desc = ch->desc;
ch->desc = NULL;
/*
The time to die is at hand - Scandum 27-04-2002
*/
if (IS_NPC(ch))
{
raw_kill(ch);
}
pop_call();
return;
}
void do_mload( CHAR_DATA *ch, char *argument )
{
MOB_INDEX_DATA *pMobIndex;
CHAR_DATA *victim;
push_call("do_mload(%p,%p)",ch,argument);
if (!is_number(argument))
{
ch_printf(ch, "Syntax: load mob <vnum>\n\r");
}
else if (!can_olc_modify(ch, atoi(argument)))
{
ch_printf(ch, "Vnum: %d is not in your allocated range.\n\r", atoi(argument));
}
else if ((pMobIndex = get_mob_index(atol(argument))) == NULL)
{
ch_printf(ch, "No mob has that vnum.\n\r");
}
else
{
victim = create_mobile( pMobIndex );
char_to_room( victim, ch->in_room->vnum );
act( "$N takes shape in the center of the room.", ch, NULL, victim, TO_ROOM );
act( "$N takes shape in the center of the room.", ch, NULL, victim, TO_CHAR );
}
pop_call();
return;
}
void do_oload( CHAR_DATA *ch, char *argument )
{
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
push_call("do_oload(%p,%p)",ch,argument);
if (!is_number(argument))
{
ch_printf(ch, "Syntax: load obj <vnum>\n\r");
}
else if (!can_olc_modify(ch, atoi(argument)))
{
ch_printf(ch, "Vnum: %d is not in your allocated range.\n\r", atoi(argument));
}
else if ((pObjIndex = get_obj_index(atol(argument))) == NULL)
{
ch_printf(ch, "No obj has that vnum.\n\r");
}
else
{
obj = create_object( pObjIndex, 0);
obj_to_char(obj, ch);
act( "You create $p.", ch, obj, NULL, TO_CHAR );
}
pop_call();
return;
}
void do_load( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
push_call("do_load(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (argument[0] == '\0' || arg[0] == '\0')
{
ch_printf(ch, "Syntax: load <obj|mob> <vnum>\n\r");
pop_call();
return;
}
log_god_printf("(G) %s: load %s %s", ch->name, arg, argument);
if (!strcasecmp(arg, "mob"))
{
do_mload(ch, argument);
}
else if (!strcasecmp(arg, "obj"))
{
do_oload(ch, argument);
}
else
{
do_load(ch, "");
}
pop_call();
return;
}
void do_purge( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj;
int room, room_start;
bool quite;
push_call("do_purge(%p,%p)",ch,argument);
if (argument != NULL)
{
quite = FALSE;
one_argument( argument, arg );
}
else
{
quite = TRUE;
strcpy(arg, "");
}
if (!strcasecmp(arg, "area"))
{
arg[0] = '\0';
room_start = ch->in_room->vnum;
for (room = room_index[room_start]->area->low_r_vnum ; room <= room_index[room_start]->area->hi_r_vnum ; room++)
{
if (room_index[room] == NULL)
{
continue;
}
if (room_index[room]->area != room_index[room_start]->area)
{
break;
}
char_from_room(ch);
char_to_room(ch, room);
do_purge(ch, NULL);
}
char_from_room(ch);
char_to_room(ch, room_start);
send_to_char( "You have purged the Area.\n\r", ch);
pop_call();
return;
}
if (arg[0] == '\0' || arg == NULL)
{
CHAR_DATA *vnext;
OBJ_DATA *obj_next;
for (victim = ch->in_room->first_person ; victim != NULL ; victim = vnext)
{
vnext = victim->next_in_room;
if (IS_NPC(victim) && victim != ch)
{
junk_mob(victim);
}
}
for (obj = ch->in_room->first_content ; obj != NULL ; obj = obj_next)
{
obj_next = obj->next_content;
if (obj->item_type != ITEM_CORPSE_PC)
{
junk_obj( obj );
}
}
if (!quite)
{
act( "$n purges the room!", ch, NULL, NULL, TO_ROOM);
send_to_char( "Ok.\n\r", ch );
}
pop_call();
return;
}
if ((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (!IS_NPC(victim))
{
send_to_char( "Not on PC's.\n\r", ch );
pop_call();
return;
}
act( "$n purges $N.", ch, NULL, victim, TO_NOTVICT );
junk_mob(victim);
pop_call();
return;
}
void do_advance( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int level;
int iLevel;
push_call("do_advance(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if (arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: advance <char> <level>.\n\r", ch );
pop_call();
return;
}
if ((victim = get_char_room(ch, arg1)) == NULL)
{
send_to_char( "That player is not here.\n\r", ch);
pop_call();
return;
}
if (IS_NPC(ch))
{
log_printf("%s tried to advance %s.", ch->name, victim->name);
pop_call();
return;
}
if (IS_NPC(victim))
{
send_to_char( "Not on NPC's.\n\r", ch );
pop_call();
return;
}
if ((level = atol(arg2)) < 1 || level > MAX_LEVEL)
{
send_to_char( "Level must be 1 to 99.\n\r", ch );
pop_call();
return;
}
if (level > get_trust(ch))
{
send_to_char( "Limited to your trust level.\n\r", ch );
pop_call();
return;
}
if (!IS_GOD(ch))
{
send_to_char("You are not allowed to advance.\n\r",ch);
pop_call();
return;
}
if (level < victim->level)
{
int sn;
if (IS_GOD(victim))
{
send_to_char("You cannot lower the level of a God.\n\r", ch);
pop_call();
return;
}
send_to_char( "Lowering a player's level!\n\r", ch );
send_to_char( "**** OOOOHHHHHHHHHH NNNNOOOO ****\n\r", victim );
victim->level = 1;
victim->pcdata->exp = 0;
victim->max_hit = victim->pcdata->actual_max_hit = 20;
victim->max_mana = victim->pcdata->actual_max_mana = 100;
victim->max_move = victim->pcdata->actual_max_move = 100;
/*
Set stats to 15.0 - Scandum
*/
victim->pcdata->perm_str = 15 + race_table[victim->race].race_mod[0] + victim->pcdata->reincarnation;
victim->pcdata->perm_dex = 15 + race_table[victim->race].race_mod[1] + victim->pcdata->reincarnation;
victim->pcdata->perm_int = 15 + race_table[victim->race].race_mod[2] + victim->pcdata->reincarnation;
victim->pcdata->perm_wis = 15 + race_table[victim->race].race_mod[3] + victim->pcdata->reincarnation;
victim->pcdata->perm_con = 15 + race_table[victim->race].race_mod[4] + victim->pcdata->reincarnation;
for (sn = 0 ; sn < MAX_SKILL ; sn++)
{
victim->pcdata->learned[sn] = 0;
}
for (sn = 0 ; sn < MAX_CLASS ; sn++)
{
victim->pcdata->mclass[sn] = 0;
}
victim->pcdata->practice = 21;
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
victim->pcdata->mclass[victim->class] = 1;
}
else
{
send_to_char( "Raising a player's level!\n\r", ch );
send_to_char( "**** OOOOHHHHHHHHHH YYYYEEEESSS ****\n\r", victim );
}
for (iLevel = victim->level ; iLevel < level ; iLevel++)
{
if (iLevel%3 == 0) /* adding a language every three levels (Manwe 10/10/1999)*/
{
add_language(victim);
}
send_to_char( "You raise a level!! ", victim );
victim->level += 1;
victim->pcdata->mclass[victim->class] +=1;
advance_level( victim, FALSE );
}
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
sub_player (victim);
add_player (victim);
save_char_obj (victim, NORMAL_SAVE);
save_char_obj (victim, BACKUP_SAVE);
victim->pcdata->exp = exp_level(victim->class,victim->level-1)+1;
victim->trust = victim->level;
pop_call();
return;
}
void do_trust( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int level;
push_call("do_trust(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: trust <char> <level>.\n\r", ch );
pop_call();
return;
}
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "That player is not here.\n\r", ch);
pop_call();
return;
}
if ( ( level = atol( arg2 ) ) < 0 || level > MAX_LEVEL )
{
send_to_char( "Level must be 0 (reset) or 1 to 99.\n\r", ch );
pop_call();
return;
}
if ( level > get_trust( ch ) )
{
send_to_char( "Limited to your trust.\n\r", ch );
pop_call();
return;
}
victim->trust = level;
pop_call();
return;
}
void do_restore( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
push_call("do_restore(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
send_to_char( "Restore whom?\n\r", ch );
pop_call();
return;
}
if ((victim = get_char_room_even_blinded(ch, argument)) == NULL)
{
if (!IS_NPC(ch))
{
send_to_char( "They aren't here.\n\r", ch );
}
else
{
log_build_printf(ch->pIndexData->vnum, "do_restore: target not found: %s", argument);
}
pop_call();
return;
}
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
update_pos( victim );
act( "$n has restored you.", ch, NULL, victim, TO_VICT );
send_to_char( "Ok.\n\r", ch );
pop_call();
return;
}
void do_freeze( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
int pvnum;
push_call("do_freeze(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
sprintf(buf, "List of frozen players:\n\r\n\r");
for (pvnum = 0 ; pvnum < MAX_PVNUM ; pvnum++)
{
if (pvnum_index[pvnum] == NULL)
{
continue;
}
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_FROZEN))
{
cat_sprintf(buf, "%-16s", pvnum_index[pvnum]->name);
}
}
ch_printf(ch, "%s\n\r", justify(buf, 80));
pop_call();
return;
}
if ((pvnum = get_pvnum_name(argument)) == -1)
{
send_to_char("That player does not exists.\n\r", ch);
pop_call();
return;
}
if (pvnum < 100)
{
send_to_char( "You failed.\n\r", ch );
pop_call();
return;
}
victim = get_char_pvnum(pvnum);
TOGGLE_BIT(pvnum_index[pvnum]->flags, PVNUM_FROZEN);
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_FROZEN))
{
send_to_char( "They have been frozen.\n\r", ch );
log_printf("%s has been frozen by %s", get_name_pvnum(pvnum), ch->name);
if (victim)
{
send_to_char( "You have been frozen.\n\r", victim);
}
}
else
{
send_to_char("They are no longer frozen.\n\r", ch);
log_printf("%s has been un-frozen by %s", get_name_pvnum(pvnum), ch->name);
if (victim)
{
send_to_char( "You are no longer frozen.\n\r", victim);
}
}
save_players();
pop_call();
return;
}
void do_mute( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
int pvnum;
push_call("do_mute(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
sprintf(buf, "List of muted players:\n\r\n\r");
for (pvnum = 0 ; pvnum < MAX_PVNUM ; pvnum++)
{
if (pvnum_index[pvnum] == NULL)
{
continue;
}
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_MUTED))
{
cat_sprintf(buf, "%-16s", pvnum_index[pvnum]->name);
}
}
ch_printf(ch, "%s\n\r", justify(buf, 80));
pop_call();
return;
}
if ((pvnum = get_pvnum_name(argument)) == -1)
{
send_to_char("That player does not exists.\n\r", ch);
pop_call();
return;
}
if (pvnum < 100)
{
send_to_char( "You failed.\n\r", ch );
pop_call();
return;
}
TOGGLE_BIT(pvnum_index[pvnum]->flags, PVNUM_MUTED);
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_MUTED))
{
send_to_char( "They have been muted.\n\r", ch );
log_printf("%s has been muted by %s", get_name_pvnum(pvnum), ch->name);
}
else
{
send_to_char( "They are no longer muted.\n\r", ch );
log_printf("%s has been un-muted by %s", get_name_pvnum(pvnum), ch->name);
}
save_players();
pop_call();
return;
}
void do_log( CHAR_DATA *ch, char *argument )
{
char buf[MAX_INPUT_LENGTH];
int pvnum;
push_call("do_log(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
sprintf(buf, "List of logged players:\n\r\n\r");
for (pvnum = 0 ; pvnum < MAX_PVNUM ; pvnum++)
{
if (pvnum_index[pvnum] == NULL)
{
continue;
}
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_LOGGED))
{
cat_sprintf(buf, "%-16s", pvnum_index[pvnum]->name);
}
}
ch_printf(ch, "%s\n\r", justify(buf, 80));
pop_call();
return;
}
if ((pvnum = get_pvnum_name(argument)) == -1)
{
send_to_char("That player does not exists.\n\r", ch);
pop_call();
return;
}
TOGGLE_BIT(pvnum_index[pvnum]->flags, PVNUM_LOGGED);
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_LOGGED))
{
send_to_char( "They have been logged.\n\r", ch );
log_printf("%s has been logged by %s", get_name_pvnum(pvnum), ch->name);
}
else
{
send_to_char( "They are no longer logged.\n\r", ch );
log_printf("%s has been un-logged by %s", get_name_pvnum(pvnum), ch->name);
}
save_players();
pop_call();
return;
}
void do_silence( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
int pvnum;
push_call("do_silence(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
sprintf(buf, "List of silenced players:\n\r\n\r");
for (pvnum = 0 ; pvnum < MAX_PVNUM ; pvnum++)
{
if (pvnum_index[pvnum] == NULL)
{
continue;
}
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_SILENCED))
{
cat_sprintf(buf, "%-16s", pvnum_index[pvnum]->name);
}
}
ch_printf(ch, "%s\n\r", justify(buf, 80));
pop_call();
return;
}
if ((pvnum = get_pvnum_name(argument)) == -1)
{
send_to_char("That player does not exist.\n\r", ch);
pop_call();
return;
}
if (pvnum < 100)
{
send_to_char( "You failed.\n\r", ch );
pop_call();
return;
}
TOGGLE_BIT(pvnum_index[pvnum]->flags, PVNUM_SILENCED);
victim = get_char_pvnum(pvnum);
if (IS_SET(pvnum_index[pvnum]->flags, PVNUM_SILENCED))
{
send_to_char( "They have been silenced.\n\r", ch );
log_printf("%s has been silenced by %s", get_name_pvnum(pvnum), ch->name);
if (victim)
{
send_to_char("You have been silenced.\n\r", victim);
}
}
else
{
send_to_char( "They are no longer silenced.\n\r", ch );
log_printf("%s has been un-silenced by %s", get_name_pvnum(pvnum), ch->name);
if (victim)
{
send_to_char("You are no longer silenced.\n\r", victim);
}
}
save_players();
pop_call();
return;
}
void do_peace( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
push_call("do_peace(%p,%p)",ch,argument);
if (*argument != '\0')
{
if ((rch = get_char_room_even_blinded(ch, argument)) != NULL)
{
stop_fighting(rch, TRUE);
stop_hate_fear(rch);
}
pop_call();
return;
}
for (rch = ch->in_room->first_person ; rch ; rch = rch->next_in_room)
{
stop_fighting(rch, FALSE);
stop_hate_fear(rch);
}
if (!IS_NPC(ch))
{
act( "$n booms 'PEACE!'", ch, NULL, NULL, TO_ROOM );
send_to_char( "You boom 'PEACE!'\n\r", ch );
}
pop_call();
return;
}
void do_ban( CHAR_DATA *ch, char *argument )
{
BAN_DATA *pban;
char skp[80];
push_call("do_ban(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
if (argument[0] == '\0')
{
send_to_char("List of banned sites:\n\r", ch);
for (pban = mud->f_ban ; pban ; pban = pban->next)
{
ch_printf_color(ch, "{158}%15s {138}banned on {118}%s {138}by {128}%s\n\r",
pban->name,
str_resize(get_time_string(pban->date), skp, -24),
pban->banned_by);
}
pop_call();
return;
}
for (pban = mud->f_ban ; pban ; pban = pban->next)
{
if (!strcasecmp(argument, pban->name))
{
UNLINK(pban, mud->f_ban, mud->l_ban, next, prev);
STRFREE(pban->name);
STRFREE(pban->banned_by);
save_sites();
send_to_char("Siteban removed.\n\r", ch );
pop_call();
return;
}
}
ALLOCMEM(pban, BAN_DATA, 1);
pban->name = STRALLOC( argument );
pban->banned_by = STRALLOC( ch->name );
pban->date = mud->current_time;
LINK(pban, mud->f_ban, mud->l_ban, next, prev);
save_sites();
log_printf("The site: %s has been banned by %s", argument, ch->name);
send_to_char("Siteban set.\n\r", ch );
pop_call();
return;
}
void do_nban( CHAR_DATA *ch, char *argument )
{
BAN_DATA *pban;
char skp[80];
push_call("do_nban(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
if (argument[0] == '\0')
{
send_to_char("List of newbie banned sites:\n\r", ch);
for (pban = mud->f_nban ; pban ; pban = pban->next)
{
ch_printf_color(ch, "{158}%15s {138}banned on {118}%s {138}by {128}%s\n\r",
pban->name,
str_resize(get_time_string(pban->date), skp, -24),
pban->banned_by);
}
pop_call();
return;
}
for (pban = mud->f_nban ; pban ; pban = pban->next)
{
if (!strcasecmp(argument, pban->name))
{
UNLINK(pban, mud->f_nban, mud->l_nban, next, prev);
STRFREE(pban->name);
STRFREE(pban->banned_by);
save_nsites();
send_to_char("Newbie Siteban removed.\n\r", ch );
pop_call();
return;
}
}
ALLOCMEM(pban, BAN_DATA, 1);
pban->name = STRALLOC( argument );
pban->banned_by = STRALLOC( ch->name );
pban->date = mud->current_time;
LINK(pban, mud->f_nban, mud->l_nban, next, prev);
save_nsites();
log_printf("The site: %s has been banned by %s", argument, ch->name);
send_to_char("Siteban set.\n\r", ch );
pop_call();
return;
}
void do_wizlock( CHAR_DATA *ch, char *argument )
{
push_call("do_wizlock(%p,%p)",ch,argument);
TOGGLE_BIT(mud->flags, MUD_WIZLOCK);
if (IS_SET(mud->flags, MUD_WIZLOCK))
{
send_to_char( "Game wizlocked.\n\r", ch );
log_printf("do_wizlock(%s) *locked*", get_name(ch));
}
else
{
send_to_char( "Game un-wizlocked.\n\r", ch );
log_printf("do_wizlock(%s) *unlocked*", get_name(ch));
}
pop_call();
return;
}
/*
Thanks to Grodyn for pointing out bugs in this function.
*/
void do_force( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
push_call("do_force(%p,%p)",ch,argument);
argument = one_argument( argument, arg );
if (arg[0] == '\0' || argument[0] == '\0')
{
send_to_char( "Force whom to do what?\n\r", ch );
pop_call();
return;
}
str_cpy_max(buf, argument, 80);
if (!strcasecmp(arg, "all"))
{
PLAYER_GAME *vch, *vch_next;
for (vch = mud->f_player ; vch ; vch = vch_next)
{
vch_next = vch->next;
if (vch->ch != ch)
{
if (get_trust(vch->ch) < get_trust(ch))
{
act("$n forces you to '$t'.", ch, argument, vch->ch, TO_VICT);
interpret( vch->ch, buf );
}
}
}
}
else
{
CHAR_DATA *victim;
if ((victim = get_char_world(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
if (victim == ch)
{
send_to_char( "Aye aye, right away!\n\r", ch );
pop_call();
return;
}
if (IS_NPC(victim) && ch->level < MAX_LEVEL && !IS_SET(mud->flags, MUD_EMUD_REALGAME))
{
send_to_char( "You can't force a mobile.\n\r", ch );
pop_call();
return;
}
if (!IS_NPC(victim) && victim->level >= ch->level)
{
send_to_char( "Do it yourself!\n\r", ch );
pop_call();
return;
}
act( "$n forces you to '$t'.", ch, argument, victim, TO_VICT );
interpret( victim, buf );
}
send_to_char( "Ok.\n\r", ch );
pop_call();
return;
}
/*
New routines by Dionysos.
*/
void do_invis( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
PLAYER_GAME *gpl;
push_call("do_invis(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
if (ch->level < MAX_LEVEL || *argument == '\0')
{
victim = ch;
}
else if ((victim = get_player_world(ch, argument)) == NULL)
{
victim = ch;
}
if (IS_SET(victim->act, PLR_WIZINVIS) )
{
act( "$n slowly fades into existence.", victim, NULL, NULL, TO_ROOM );
send_to_char( "You slowly fade back into existence.\n\r", victim);
}
else
{
for (gpl = mud->f_player ; gpl ; gpl = gpl->next)
{
if (gpl->ch->pcdata->reply == victim)
{
gpl->ch->pcdata->reply = NULL;
}
}
act( "$n slowly fades into thin air.", victim, NULL, NULL, TO_ROOM );
send_to_char( "You slowly vanish into thin air.\n\r", victim );
}
TOGGLE_BIT(victim->act, PLR_WIZINVIS);
pop_call();
return;
}
void do_cloak( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
push_call("do_cloak(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
if (ch->level < MAX_LEVEL || *argument == '\0')
{
victim = ch;
}
else if ((victim = get_player_world(ch, argument)) == NULL)
{
victim = ch;
}
if (IS_SET(victim->act, PLR_WIZCLOAK))
{
act( "$n slowly fades into existence.", victim, NULL, NULL, TO_ROOM);
send_to_char( "You slowly fade back into existence.\n\r", victim);
}
else
{
act( "$n slowly fades into thin air.", victim, NULL, NULL, TO_ROOM );
send_to_char( "You slowly vanish into thin air.\n\r", victim );
}
TOGGLE_BIT(victim->act, PLR_WIZCLOAK);
pop_call();
return;
}
void do_buildlight( CHAR_DATA *ch, char *argument )
{
push_call("do_buildlight(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
if (IS_SET(ch->act, PLR_BUILDLIGHT))
{
send_to_char("Build light mode off.\n\r", ch);
}
else
{
send_to_char("Build light mode on.\n\r", ch);
}
TOGGLE_BIT(ch->act, PLR_BUILDLIGHT);
pop_call();
return;
}
void do_holylight( CHAR_DATA *ch, char *argument )
{
push_call("do_holylight(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
if (IS_SET(ch->act, PLR_HOLYLIGHT))
{
send_to_char( "Holy light mode off.\n\r", ch );
}
else
{
send_to_char( "Holy light mode on.\n\r", ch );
}
TOGGLE_BIT(ch->act, PLR_HOLYLIGHT);
pop_call();
return;
}
void do_hearlog( CHAR_DATA *ch, char *argument )
{
push_call("do_hearlog(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
if (IS_SET(ch->act, PLR_HEARLOG))
{
send_to_char( "No longer listening to log file.\n\r", ch );
}
else
{
send_to_char( "You are listening to the log file.\n\r", ch );
}
TOGGLE_BIT(ch->act, PLR_HEARLOG);
pop_call();
return;
}
void do_connect( CHAR_DATA *ch, char *argument )
{
int dest_vnum;
int door_num;
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
push_call("do_connect(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: connect <direction> <destination vnum> [both]\n\r", ch);
pop_call();
return;
}
if (!IS_NPC(ch) && !can_olc_modify(ch, ch->in_room->vnum))
{
send_to_char("This room is not in your allocated range.\n\r", ch);
pop_call();
return;
}
door_num = direction_door(arg1);
dest_vnum = atol( arg2 );
if (door_num < 0 || door_num > 5 )
{
if (IS_NPC(ch))
{
log_printf( "[%u] Invalid direction: <connect %s %s>", ch->pIndexData->vnum, arg1, arg2 );
}
send_to_char( "Invalid direction.\n\r",ch);
pop_call();
return;
}
if (get_room_index(dest_vnum) == NULL && dest_vnum != -1)
{
if (IS_NPC(ch))
{
log_printf( "[%u] Invalid destination vnum: <connect %s %s>", ch->pIndexData->vnum, arg1, arg2 );
}
send_to_char( "A room with that vnum does not exist.\n\r",ch);
pop_call();
return;
}
if (!IS_NPC(ch) && dest_vnum != -1 && !can_olc_modify(ch, dest_vnum))
{
ch_printf(ch, "That vnum is not in your allocated range.\n\r");
pop_call();
return;
}
set_exit(ch->in_room->vnum, door_num, dest_vnum);
if (arg3[0] == 'b' || arg3[0] == 'B')
{
set_exit( dest_vnum, rev_dir[door_num], ch->in_room->vnum);
}
pop_call();
return;
}
extern void ListCheck(void);
void do_test1( CHAR_DATA *ch, char *argument )
{
log_printf("do_test1(%p,%p)",ch,argument);
send_to_char( "Siteban saving.\n\r", ch );
save_sites();
}
void do_rescale( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *mch;
int vnum, scale, divisor;
int new_hitplus, new_hitnodice, new_hitsizedice;
long long int temp_gold;
push_call("do_rescale(%p,%p)",ch,argument);
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
/*
Added single mob rescale - Scandum 08/02/02
*/
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
send_to_char( "Syntax: rescale <mobVnum|mobName> <player> <percentage>\n\r", ch);
pop_call();
return;
}
if (is_number(arg1))
{
vnum = atol(arg1);
if (get_mob_index(vnum) == NULL)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad rescale vnum: %d", vnum);
}
send_to_char("Vnum out of bounds\n\r", ch);
pop_call();
return;
}
if ((victim = lookup_char(arg2)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
pop_call();
return;
}
if (IS_NPC(victim))
{
send_to_char("You can only rescale mobs on players.\n\r",ch);
pop_call();
return;
}
scale = atol(arg3) * victim->level;
divisor = 200 * (95-victim->level) + 10000;
for (mch = mob_index[vnum]->first_instance ; mch ; mch = mch->next_instance)
{
temp_gold = mch->pIndexData->gold;
mch->gold = temp_gold * scale / divisor;
mch->level = UMAX(1, mch->pIndexData->level * scale / 10000);
mch->npcdata->damnodice = 1;
mch->npcdata->damsizedice = mch->level;
mch->npcdata->damplus = 2 + mch->level * 0.005 * mch->level;
new_hitnodice = 1;
new_hitsizedice = mch->level * mch->level / 4;
new_hitplus = 10 + mch->level * mch->level * (0.40 + 0.0015 * mch->level);
mch->hit = new_hitplus + dice(new_hitnodice, new_hitsizedice);
mch->max_hit = mch->hit;
}
}
else
{
if ((mch = get_char_room(ch, arg1)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
pop_call();
return;
}
if (!IS_NPC(mch))
{
send_to_char("You can only rescale mobiles.\n\r",ch);
pop_call();
return;
}
if ((victim = get_player_world_even_blinded(ch, arg2)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
pop_call();
return;
}
if (IS_NPC(victim))
{
send_to_char("You can only rescale mobs on players.\n\r",ch);
pop_call();
return;
}
scale = atol(arg3) * victim->level;
divisor = 200 * (100-victim->level) + 10000;
temp_gold = mch->pIndexData->gold;
mch->gold = temp_gold * scale / divisor;
mch->level = UMAX(1, mch->pIndexData->level * scale / 10000);
mch->npcdata->damnodice = 1;
mch->npcdata->damsizedice = mch->level;
mch->npcdata->damplus = 2 + mch->level * 0.005 * mch->level;
new_hitnodice = 1;
new_hitsizedice = mch->level * mch->level / 4;
new_hitplus = 10 + mch->level * mch->level * (0.40 + 0.0015 * mch->level);
mch->hit = new_hitplus + dice(new_hitnodice, new_hitsizedice);
mch->max_hit = mch->hit;
}
pop_call();
return;
}
void do_door( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
int door;
EXIT_DATA *pexit;
push_call("do_door(%p,%p)",ch,argument);
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char( "Syntax: doorset <direction> <field> <argument>\n\r",ch );
send_to_char( "Field being one of: \n\r desc name flag key\n\r",ch );
pop_call();
return;
}
door = direction_door(arg1);
if (door < 0)
{
door = atol(arg1);
}
if (door < 0 || door > 5)
{
send_to_char ("Invalid exit direction.\n\r",ch);
pop_call();
return;
}
pexit=ch->in_room->exit[door];
if (pexit == NULL)
{
send_to_char( "There is no exit in that direction.\n\r", ch);
pop_call();
return;
}
if (!strcasecmp(arg2, "flag"))
{
pexit->exit_info = translate_bits(arg3);
}
else if (!strcasecmp(arg2, "name"))
{
pexit->keyword = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "desc"))
{
pexit->description = STRALLOC(arg3);
}
else if (!strcasecmp(arg2, "key"))
{
pexit->key = atol(arg3);
}
pop_call();
return;
}
void do_tick( CHAR_DATA *ch, char *argument)
{
int cnt, ticks;
push_call("do_tick(%p,%p)",ch,argument);
ticks = atol(argument);
for (cnt = 0 ; cnt < ticks * PULSE_TICK ; cnt++)
{
update_handler();
}
ch_printf(ch, "Time advances %d mud %s.\n\r", ticks, short_to_name("hour", ticks));
pop_call();
return;
}
char *broken_bits( long long number, char *vector, bool linear )
{
long long bit, cnt;
bool found;
static char broken_string[MAX_INPUT_LENGTH];
push_call("broken_bits(%p,%p,%p)",number,vector,linear);
if (IS_SET(mud->flags, MUD_STRAIGHTNUMBERS))
{
sprintf(broken_string, "%lld" , number);
pop_call();
return broken_string;
}
found = FALSE;
bit = 0;
broken_string[0] = '\0';
if (!linear)
{
while (bit <= number && number >= 0)
{
if (IS_SET(number, bit))
{
for (cnt = mud->bitvector_ref[*vector - 'A'] ; cnt < MAX_BITVECTOR ; cnt++)
{
if (bit == bitvector_table[cnt].value)
{
if (!str_prefix(vector, bitvector_table[cnt].name))
{
if (found)
{
strcat( broken_string, "|" );
}
strcat(broken_string, bitvector_table[cnt].name);
found = TRUE;
break;
}
}
}
if (cnt == MAX_BITVECTOR)
{
if (found)
{
strcat(broken_string, "|" );
}
log_printf("broken_bits: %s not found %lld", vector, bit);
cat_sprintf(broken_string, "%lld", bit);
found = TRUE;
}
}
if (bit != 0)
{
bit *= 2;
}
else
{
bit++;
}
}
}
else
{
for (cnt = mud->bitvector_ref[*vector - 'A'] ; cnt < MAX_BITVECTOR ; cnt++)
{
if (number == bitvector_table[cnt].value)
{
if (vector[0] == bitvector_table[cnt].name[0] && !str_prefix(vector, bitvector_table[cnt].name))
{
strcat(broken_string, bitvector_table[cnt].name);
found = TRUE;
break;
}
}
}
}
if (!found)
{
sprintf(broken_string, "%lld", number);
}
pop_call();
return( broken_string);
}
void do_destroy( CHAR_DATA *ch, char * arg )
{
char arg1[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
HISCORE_DATA *hiscore;
int cnt;
push_call("do_destroy(%p,%p)",ch,arg);
arg = one_argument(arg, arg1);
if (!IS_GOD(ch))
{
log_printf("security leak");
dump_stack();
pop_call();
return;
}
if (arg1[0] == '\0')
{
send_to_char("Syntax: destroy <castle|clan|player|hiscores> <name>\n\r", ch );
pop_call();
return;
}
if (!strcasecmp(arg1, "castle"))
{
if ((victim = get_player_world(ch, arg)) == NULL)
{
send_to_char( "Hmmm...can't find them.\n\r", ch );
pop_call();
return;
}
if (victim->pcdata->castle == NULL)
{
send_to_char( "They don't have a castle structure.\n\r", ch );
pop_call();
return;
}
del_castle(victim);
ch_printf(ch, "Deleted %s's castle.\n\r", get_name(victim));
}
if (!strcasecmp(arg1, "clan"))
{
CLAN_DATA *clan;
char buf[MAX_INPUT_LENGTH];
if ((clan = get_clan(arg)) == NULL)
{
send_to_char( "That clan does not exist!\n\r", ch );
pop_call();
return;
}
if (ch->level < MAX_LEVEL)
{
send_to_char( "You are not allowed to destroy clans.\n\r", ch );
pop_call();
return;
}
sprintf(buf, "The clan of %s has been disbanded by the gods!", clan->name);
do_echo(NULL, buf);
destroy_clan(clan);
pop_call();
return;
}
if (!strcasecmp(arg1, "player"))
{
if ((victim = get_player_world(ch, arg)) == NULL)
{
send_to_char("Hmmm...can't find them.\n\r", ch);
pop_call();
return;
}
if (IS_GOD(victim))
{
send_to_char( "You cannot destroy gods.\n\r", ch);
pop_call();
return;
}
sprintf(arg1, "%s has sent %s's soul to oblivion.", get_name(ch), victim->name);
do_echo(ch, arg1);
delete_player(victim);
pop_call();
return;
}
if (!strcasecmp(arg1, "hiscores"))
{
for (cnt = 0 ; cnt < MOST_MOST ; cnt++)
{
for (hiscore = mud->high_scores[cnt]->first ; hiscore ; hiscore = hiscore->next)
{
RESTRING(hiscore->player, "");
hiscore->vnum = 0;
hiscore->score = 0;
}
}
pop_call();
return;
}
do_destroy(ch, "");
pop_call();
return;
}
void describe_object_program( CHAR_DATA *ch, OBJ_PROG *prg )
{
push_call("describe_object_program(%p,%p)",ch,prg);
switch (prg->trigger)
{
case TRIG_COMMAND: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_COMMAND {178}%s\n\r", prg->index, prg->percentage, cmd_table[prg->cmd].name); break;
case TRIG_UNKNOWN: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_UNKNOWN {178}%s\n\r", prg->index, prg->percentage, prg->unknown); break;
case TRIG_TICK: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_TICK\n\r", prg->index, prg->percentage); break;
case TRIG_VOID: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}----{078}] {138}TRIG_VOID\n\r", prg->index); break;
case TRIG_HIT: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_HIT\n\r", prg->index, prg->percentage); break;
case TRIG_DAMAGE: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_DAMAGE\n\r", prg->index, prg->percentage); break;
case TRIG_WEAR: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_WEAR\n\r", prg->index, prg->percentage); break;
case TRIG_REMOVE: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_REMOVE\n\r", prg->index, prg->percentage); break;
case TRIG_ROOM_COMMAND: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_ROOM_COMMAND {178}%s\n\r", prg->index, prg->percentage, cmd_table[prg->cmd].name); break;
case TRIG_WEAR_COMMAND: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_WEAR_COMMAND {178}%s\n\r", prg->index, prg->percentage, cmd_table[prg->cmd].name); break;
case TRIG_ROOM_UNKNOWN: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_ROOM_UNKNOWN {178}%s\n\r", prg->index, prg->percentage, prg->unknown); break;
case TRIG_WEAR_UNKNOWN: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {138}TRIG_WEAR_UNKNOWN {178}%s\n\r", prg->index, prg->percentage, prg->unknown); break;
default: ch_printf_color(ch, "{078}<{178}%3d{078}> [{178}%3d%%{078}] {118}ERROR\n\r", prg->index, prg->percentage); break;
}
switch (prg->obj_command)
{
case OPROG_ECHO: ch_printf_color(ch, "{148}ECHO {178}%s\n\r", prg->argument ); break;
case OPROG_GOD_COMMAND: ch_printf_color(ch, "{158}GOD COMMAND {178}%s\n\r", prg->argument ); break;
case OPROG_GOD_ARGUMENT: ch_printf_color(ch, "{158}GOD ARGUMENT {178}%s\n\r", prg->argument ); break;
case OPROG_COMMAND: ch_printf_color(ch, "{158}COMMAND {178}%s\n\r", prg->argument ); break;
case OPROG_ARGUMENT: ch_printf_color(ch, "{158}ARGUMENT {178}%s\n\r", prg->argument ); break;
case OPROG_QUEST_SET: ch_printf_color(ch, "{168}SET QUEST {178}%d %d %d\n\r", prg->quest_offset, prg->quest_bits, prg->if_value ); break;
case OPROG_QUEST_ADD: ch_printf_color(ch, "{168}ADD QUEST {178}%d %d %d\n\r", prg->quest_offset, prg->quest_bits, prg->if_value ); break;
case OPROG_PLAYER_QUEST_IF: ch_printf_color(ch, "{128}IF P QUEST {178}%d %d %c %d {078}[{178}%d %d{078}]\n\r", prg->quest_offset, prg->quest_bits, prg->if_symbol, prg->if_value, prg->if_true, prg->if_false ); break;
case OPROG_OBJECT_QUEST_IF: ch_printf_color(ch, "{128}IF O QUEST {178}%d %d %c %d {078}[{178}%d %d{078}]\n\r", prg->quest_offset, prg->quest_bits, prg->if_symbol, prg->if_value, prg->if_true, prg->if_false ); break;
case OPROG_IF_HAS_OBJECT: ch_printf_color(ch, "{128}IF HAS OBJ {178}%d {078}[{178}%d %d{078}]\n\r", prg->if_value, prg->if_true, prg->if_false ); break;
case OPROG_IF: ch_printf_color(ch, "{128}IF CHECK {178}%s %c %d {078}[{178}%d %d{078}]\n\r", broken_bits(prg->if_check, "OIF_", TRUE), prg->if_symbol, prg->if_value, prg->if_true, prg->if_false); break;
case OPROG_APPLY: ch_printf_color(ch, "{148}APPLY TEMP {178}%s %d\n\r", broken_bits(prg->if_check, "OAPPLY_", TRUE), prg->if_value ); break;
case OPROG_JUNK: ch_printf_color(ch, "{118}JUNK ITEM\n\r"); break;
default: ch_printf_color(ch, "{118}ERROR\n\r"); break;
}
pop_call();
return;
}
void do_oprogram( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *obj;
OBJ_PROG *oprog;
push_call("do_oprogram(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char( "Syntax: oprog <name|vnum>\n\r", ch );
pop_call();
return;
}
if (is_number(arg) && get_obj_index(atoi(arg)) != NULL)
{
obj = get_obj_index(atoi(arg));
}
else
{
if (get_obj_world(ch, arg) == NULL)
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
pop_call();
return;
}
obj = get_obj_world(ch, arg)->pIndexData;
}
if (!can_olc_modify(ch, obj->vnum))
{
send_to_char("That object is not in your allocated vnum range.\n\r", ch);
pop_call();
return;
}
ch_printf_color(ch, "{078}[{178}%5u{078}] {128}%s\n\r", obj->vnum, obj->short_descr);
if (obj->first_prog == NULL)
{
ch_printf_color(ch, "{078}This object has no program.\n\r");
pop_call();
return;
}
oprog = obj->first_prog;
while (oprog != NULL)
{
describe_object_program(ch, oprog);
oprog = oprog->next;
}
pop_call();
return;
}
void do_mprogram( CHAR_DATA *ch, char *argument )
{
char buf[MAX_INPUT_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
MPROG_DATA *mprog;
MOB_INDEX_DATA *mind;
NPC_TOKEN *token;
int cnt;
push_call("do_mprogram(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char("Mprog whom?\n\r", ch );
pop_call();
return;
}
if (is_number(arg) && get_mob_index(atoi(arg)) != NULL)
{
mind = get_mob_index(atoi(arg));
}
else if ((victim = get_char_world(ch, arg)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
else if (!IS_NPC(victim))
{
send_to_char( "Players have no mobile programs.\n\r", ch);
pop_call();
return;
}
else
{
mind = victim->pIndexData;
}
if (!can_olc_modify(ch, mind->vnum))
{
send_to_char("That mobile is not in your allocated range.\n\r", ch);
pop_call();
return;
}
ch_printf_color(ch, "{078}[{178}%5u{078}] {058}%s\n\r", mind->vnum, mind->short_descr);
for (mprog = mind->first_prog ; mprog ; mprog = mprog->next)
{
ch_printf_color(ch, "{138}>%s %s~\n\r", mprog_type_to_name(mprog->type), mprog->arglist);
for (token = mprog->first_token ; token ; token = token->next)
{
for (cnt = 0 ; cnt < 2*token->level ; cnt++)
{
buf[cnt] = ' ';
}
buf[cnt] = '\0';
switch (token->type)
{
default: ch_printf_color(ch, "{118}%sunknown %s\n\r", buf, token->string); break;
case MPTOKEN_SOCIAL: ch_printf_color(ch, "{178}%s%s %s\n\r", buf, (char *) token->function, token->string); break;
case MPTOKEN_COMMAND: ch_printf_color(ch, "{178}%s%s %s\n\r", buf, cmd_table[token->value].name, token->string); break;
case MPTOKEN_IF: ch_printf_color(ch, "{128}%sif %s\n\r", buf, token->string); break;
case MPTOKEN_OR: ch_printf_color(ch, "{128}%sor %s\n\r", buf, token->string); break;
case MPTOKEN_IFNOT: ch_printf_color(ch, "{128}%sifnot %s\n\r", buf, token->string); break;
case MPTOKEN_ORNOT: ch_printf_color(ch, "{128}%sornot %s\n\r", buf, token->string); break;
case MPTOKEN_ELSE: ch_printf_color(ch, "{128}%selse\n\r", buf); break;
case MPTOKEN_ENDIF: ch_printf_color(ch, "{128}%sendif\n\r", buf); break;
case MPTOKEN_BREAK: ch_printf_color(ch, "{118}%sbreak\n\r", buf); break;
case MPTOKEN_SWITCH: ch_printf_color(ch, "{158}%sswitch %s\n\r", buf, token->string); break;
case MPTOKEN_CASE: ch_printf_color(ch, "{158}%scase %s\n\r", buf, token->string); break;
case MPTOKEN_DEFAULT: ch_printf_color(ch, "{158}%sdefault\n\r", buf); break;
case MPTOKEN_ENDSWITCH: ch_printf_color(ch, "{158}%sendswitch\n\r", buf); break;
}
}
}
pop_call();
return;
}
void do_shutoff( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *obj;
MOB_INDEX_DATA *mob;
push_call("do_shutoff(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (argument[0] == '\0' || arg[0] == '\0')
{
send_to_char( "Syntax: prog shutoff <mob|obj> <vnum>\n\r", ch );
pop_call();
return;
}
if (!can_olc_modify(ch, atoi(argument)))
{
ch_printf(ch, "That vnum is not in your allocated range.\n\r");
}
else if (!strcasecmp(arg, "obj"))
{
if ((obj = get_obj_index(atoi(argument))) != NULL)
{
ch_printf(ch, "Oprog index for obj %u erased.\n\r", obj->vnum);
obj->progtypes = 0;
}
else
{
ch_printf(ch, "There no such object.\n\r");
}
}
else if (!strcasecmp(arg, "mob"))
{
if ((mob = get_mob_index(atoi(argument))) != NULL)
{
ch_printf(ch, "Mprog index for mob %u erased.\n\r", mob->vnum);
mob->progtypes = 0;
}
else
{
ch_printf(ch, "There is no such mobile.\n\r");
}
}
else
{
do_shutoff(ch, "");
}
pop_call();
return;
}
void do_prog( CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
push_call("do_prog(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (!strcasecmp(arg, "mob"))
{
do_mprogram(ch, argument);
}
else if (!strcasecmp(arg, "obj"))
{
do_oprogram(ch, argument);
}
else if (!strcasecmp(arg, "shutoff"))
{
do_shutoff(ch, argument);
}
else
{
ch_printf(ch, "Syntax: prog <mob|obj|shutoff> <argument>\n\r");
}
pop_call();
return;
}
void do_pload( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *fch;
DESCRIPTOR_DATA *d;
bool exists;
push_call("do_pload(%p,%p)",ch,argument);
if (!check_parse_name(argument, FALSE))
{
send_to_char( "Either you chose a name with less than 3 characters, with a non-ascii character,\n\ror it was the name of a monster.\n\rIllegal name, try another.\n\r", ch );
pop_call();
return;
}
fch = lookup_char( argument );
if (fch != NULL)
{
send_to_char( "This character is already loaded.\n\r", ch );
pop_call();
return;
}
for (d = mud->f_desc ; d ; d = d->next)
{
if (is_desc_valid(d->character))
{
if (!strcasecmp(argument, d->character->name))
{
act("$E was in the process of logging on. You close $S session.", ch, NULL, d->character, TO_CHAR);
close_socket( d, TRUE);
}
}
}
ALLOCMEM(d, DESCRIPTOR_DATA, 1);
d->original = NULL;
d->descriptor = -998; /* Special case for pload loads */
exists = load_char_obj( d, argument );
fch = d->character;
if (!exists)
{
ch_printf(ch, "The character named '%s' cannot be found.\n\r", argument);
if (d != NULL)
{
d->character = NULL;
d->original = NULL;
}
if (fch != NULL)
{
fch->desc = NULL;
extract_char(fch);
}
if (d != NULL)
{
FREEMEM(d);
}
pop_call();
return;
}
d->connected = CON_PLAYING;
add_char(fch);
add_player(fch);
fch->desc = NULL;
if (fch->in_room != NULL)
{
char_to_room( fch, fch->in_room->vnum );
}
else
{
char_to_room( fch, ch->in_room->vnum );
}
send_to_char( "You load the character.\n\r", ch );
enter_game(fch);
d->character = NULL;
d->original = NULL;
FREEMEM(d);
pop_call();
return;
}
void do_pquit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
push_call("do_pquit(%p,%p)",ch,argument);
if ((victim = get_player_world(ch, argument)) == NULL)
{
send_to_char( "That player does not exist in the realm.\n\r", ch );
pop_call();
return;
}
if (IS_NPC(victim))
{
send_to_char( "You are trying to pquit a mobile!\n\r", ch);
pop_call();
return;
}
if (victim->level >= ch->level && is_desc_valid(victim))
{
send_to_char( "You cannot force that player to quit.\n\r", ch);
pop_call();
return;
}
ch_printf(ch, "You forced %s to quit.\n\r", victim->name);
do_quit(victim, NULL);
pop_call();
return;
}
void do_fixpass (CHAR_DATA* ch, char* argument)
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
push_call("do_fixpass(%p,%p)",ch,argument);
/*
one_argument smashes case, using one_argument_nolower - Scandum
*/
argument = one_argument_nolower(argument, arg1);
argument = one_argument_nolower(argument, arg2);
argument = one_argument_nolower(argument, arg3);
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
send_to_char("Syntax: fixpass <character> <new pass> <new pass>.\n\r", ch );
pop_call();
return;
}
if ((victim = get_player_world(ch, arg1)) == NULL)
{
send_to_char("They aren't here (better pload them).\n\r", ch );
pop_call();
return;
}
if (victim->level > ch->level && victim != ch)
{
send_to_char("You may not fix the password of higher level players.\n\r", ch );
pop_call();
return;
}
if (strcmp(arg2, arg3))
{
send_to_char("The new password does not verify. Please try again.\n\r", ch);
pop_call();
return;
}
if (!is_valid_password(arg2))
{
send_to_char("New password not acceptable, try again.\n\r", ch);
pop_call();
return;
}
victim->pcdata->password = encrypt64(arg2);
save_char_obj(victim, NORMAL_SAVE);
ch_printf(ch, "Ok. %s has had their password changed.\n\r", victim->name);
pop_call();
return;
}
void do_rename (CHAR_DATA* ch, char* argument)
{
char old_name[MAX_INPUT_LENGTH],
new_name[MAX_INPUT_LENGTH],
strsave [MAX_INPUT_LENGTH];
CHAR_DATA* victim;
FILE* file;
push_call("do_rename(%p,%p)",ch,argument);
argument = one_argument(argument, old_name);
argument = one_argument(argument, new_name);
if (old_name[0] == '\0')
{
send_to_char ("Rename who?\n\r",ch);
pop_call();
return;
}
if (new_name[0] == '\0')
{
send_to_char ("Rename them to what?\n\r",ch);
pop_call();
return;
}
if ((victim = get_player_world(ch, old_name)) == NULL)
{
send_to_char ("There is no such player online.\n\r",ch);
pop_call();
return;
}
if (victim->level >= ch->level && victim != ch)
{
send_to_char ("You failed.\n\r", ch);
pop_call();
return;
}
if (!check_parse_name(new_name, TRUE))
{
send_to_char ("The new name is illegal.\n\r",ch);
pop_call();
return;
}
sprintf(strsave, "%s/%c/%c/%s", PLAYER_DIR, tolower(new_name[0]), tolower(new_name[1]), capitalize_name(new_name));
close_reserve();
file = my_fopen(strsave, "r", TRUE);
if (file)
{
send_to_char ("A player with that name already exists!\n\r",ch);
my_fclose(file);
open_reserve();
pop_call();
return;
}
open_reserve();
if (get_player_world(ch, new_name))
{
send_to_char ("A player with that name is currently playing.\n\r",ch);
pop_call();
return;
}
save_char_obj(victim, BACKUP_SAVE);
sprintf(strsave, "%s/%c/%c/%s", PLAYER_DIR, tolower(victim->name[0]), tolower(victim->name[1]), capitalize_name(victim->name));
STRFREE(victim->name);
victim->name = STRALLOC(capitalize_name(new_name));
RESTRING(pvnum_index[victim->pcdata->pvnum]->name, victim->name);
save_char_obj(victim, NORMAL_SAVE);
unlink(strsave);
ch_printf(ch, "Character renamed to %s.\n\r", victim->name);
if (ch != victim)
{
ch_printf(victim, "%s has renamed you to %s.\n\r", get_name(ch), victim->name);
}
pop_call();
return;
}
int direction_door( char *txt )
{
push_call("direction_door(%p)",txt);
if (txt == NULL || *txt == '\0')
{
pop_call();
return -1;
}
if (is_number(txt))
{
if (atoi(txt) < 0 || atoi(txt) > 5)
{
pop_call();
return -1;
}
pop_call();
return atoi(txt);
}
if (!strcasecmp(txt, "n") || !strcasecmp(txt, "north"))
{
pop_call();
return 0;
}
if (!strcasecmp(txt, "e") || !strcasecmp(txt, "east"))
{
pop_call();
return 1;
}
if (!strcasecmp(txt, "s") || !strcasecmp(txt, "south"))
{
pop_call();
return 2;
}
if (!strcasecmp(txt, "w") || !strcasecmp(txt, "west"))
{
pop_call();
return 3;
}
if (!strcasecmp(txt, "u") || !strcasecmp(txt, "up"))
{
pop_call();
return 4;
}
if (!strcasecmp(txt, "d") || !strcasecmp(txt, "down"))
{
pop_call();
return 5;
}
pop_call();
return -1;
}
/* REVERT command. Restore a player's backup file. Presto 8/98 */
void do_revert(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char back_name[MAX_STRING_LENGTH], real_name[MAX_STRING_LENGTH];
char victimname[MAX_STRING_LENGTH];
int i, length;
CHAR_DATA *victim;
FILE *back_file, *real_file;
push_call("do_revert(%p,%p)",ch,argument);
if (ch->level < MAX_LEVEL)
{
send_to_char("You may not do that.\n\r", ch);
pop_call();
return;
}
argument = one_argument(argument, arg);
if (*arg == '\0')
{
send_to_char("Usage: revert <name>\n\r", ch);
pop_call();
return;
}
/* See if they're logged in. */
if ((victim = get_player_world(ch, arg)) == NULL)
{
/* They aren't logged in. */
}
else
{
if (victim == ch)
{
send_to_char("You may not revert yourself.\n\r", ch);
pop_call();
return;
}
if (IS_NPC(victim))
{
send_to_char("You may not revert a mob.\n\r", ch);
pop_call();
return;
}
char_from_room(victim);
char_to_room(victim, ROOM_VNUM_TEMPLE);
send_to_char("Your backup file is being restored. Quitting...\n\r", victim);
send_to_char("Logging out player...\n\r", ch);
strcpy(arg, victim->name);
do_quit(victim, NULL);
}
/* See if the backup pfile exists. */
strcpy(victimname, capitalize_name(arg));
length = strlen(victimname);
for (i = 1 ; i < length ; i++)
{
victimname[i] = tolower(victimname[i]);
}
sprintf(back_name, "%s/%c/%c/del/%s", PLAYER_DIR, tolower(victimname[0]), tolower(victimname[1]), victimname);
if ((back_file = my_fopen(back_name, "r", FALSE)) == NULL)
{
sprintf(back_name, "%s/%c/%c/bak/%s", PLAYER_DIR, tolower(victimname[0]), tolower(victimname[1]), victimname);
if ((back_file = my_fopen(back_name, "r", FALSE)) == NULL)
{
send_to_char("Could not open player's backup file.\n\r", ch);
pop_call();
return;
}
}
send_to_char("Player's backup file is open...\n\r", ch);
sprintf(real_name, "%s/%c/%c/%s", PLAYER_DIR, tolower(victimname[0]), tolower(victimname[1]), victimname);
if ((real_file = my_fopen(real_name, "w", FALSE)) == NULL)
{
send_to_char("Could not open player's real file.\n\r", ch);
my_fclose(back_file);
pop_call();
return;
}
else
{
send_to_char("Player's real file is open...\n\r", ch);
}
i = fgetc(back_file);
while (i != EOF)
{
fprintf(real_file, "%c", i);
i = fgetc(back_file);
}
my_fclose(real_file);
my_fclose(back_file);
remove(back_name);
send_to_char("Revert was successful.\n\r", ch);
pop_call();
return;
}
void set_quest_bits( unsigned char **pointer, unsigned int offset, unsigned int bits, unsigned int value )
{
unsigned int cnt;
unsigned int bytec, byteb, bitval, cbitval;
unsigned char *pt;
push_call("set_quest_bits(%p,%p,%p,%p)",pointer,offset,bits,value);
if (offset + bits >= 8 * MAX_QUEST_BYTES || bits > 32)
{
log_printf("set_quest_bits: invalid bit range: %u %u %u", offset, bits, value);
dump_stack();
pop_call();
return;
}
pt = (*pointer);
if (pt == NULL)
{
if (value == 0)
{
pop_call();
return;
}
ALLOCMEM(pt, bool, MAX_QUEST_BYTES);
*pointer = pt;
}
for (cnt = 0 ; cnt < bits ; cnt++, offset++)
{
bytec = offset / 8;
byteb = 1 << (offset % 8);
cbitval = (*(pt + bytec)) & byteb;
bitval = value % 2;
value /= 2;
if (bitval == 0)
{
if (cbitval != 0)
{
*(pt+bytec) -= byteb;
}
}
else
{
if (cbitval == 0)
{
*(pt+bytec) += byteb;
}
}
}
if (!is_quest(pt))
{
FREEMEM( pt );
*pointer = NULL;
}
pop_call();
return;
}
int get_quest_bits(unsigned char *pt, unsigned int offset, unsigned int bits)
{
unsigned int cnt, value, refer;
unsigned int bytec, byteb, cbitval;
push_call("get_quest_bits(%p,%p,%p)",pt,offset,bits);
if (pt == NULL)
{
pop_call();
return 0;
}
if (offset + bits >= 8 * MAX_QUEST_BYTES || bits > 32)
{
log_printf("get_quest_bits: invalid bit range: %u %u", offset, bits);
dump_stack();
pop_call();
return 0;
}
refer = 1;
value = 0;
for (cnt = 0 ; cnt < bits ; cnt++, offset++)
{
bytec = offset / 8;
byteb = 1 << (offset % 8);
cbitval = (*(pt+bytec)) & byteb;
if (cbitval > 0)
{
value += refer;
}
refer *= 2;
}
pop_call();
return(value);
}
char *quest_bits_to_string( unsigned char *pt)
{
static char quest_bit_buf[100];
sh_int cnt;
push_call("quest_bits_to_string(%p)",pt);
quest_bit_buf[0] = '\0';
for (cnt = MAX_QUEST_BYTES-1 ; cnt >= 0 ; cnt--)
{
if (pt != NULL)
{
cat_sprintf(quest_bit_buf, "%02X", *(pt+cnt));
}
else
{
strcat(quest_bit_buf, "00" );
}
if (cnt % 2 == 0 && cnt > 0)
{
strcat(quest_bit_buf, "-");
}
}
pop_call();
return( quest_bit_buf );
}
bool is_quest( register unsigned char *pt )
{
bool cnt;
push_call("is_quest(%p)",pt);
if (pt == NULL)
{
pop_call();
return( FALSE );
}
for (cnt = 0 ; cnt < MAX_QUEST_BYTES ; cnt++)
{
if (*(pt+cnt) != 0)
{
pop_call();
return( TRUE );
}
}
pop_call();
return( FALSE );
}
void do_setfunc(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
push_call("do_setfunc(%p,%p)",ch,argument);
argument = one_argument(argument,arg);
if (IS_NPC(ch) || !IS_GOD(ch))
{
send_to_char("You cannot do this.\n\r",ch);
pop_call();
return;
}
if (arg[0] == '\0' || argument[0] == '\0')
{
send_to_char("Syntax: set function <player> <function>.\n\r", ch);
send_to_char("Valid functions are:\n\r", ch);
send_to_char(" builder, cop, enforcer, god, tester, developer, secretagent.\n\r", ch);
pop_call();
return;
}
if ((victim = get_player_world(ch, arg)) == NULL)
{
send_to_char("That person is not logged on currently.\n\r",ch);
pop_call();
return;
}
if (!strcasecmp(argument, "builder"))
{
TOGGLE_BIT(victim->pcdata->functions, FUNCTION_AREA_CREATOR);
}
else if (!strcasecmp(argument, "cop"))
{
TOGGLE_BIT(victim->pcdata->functions, FUNCTION_COP);
}
else if (!strcasecmp(argument, "enforcer"))
{
TOGGLE_BIT(victim->pcdata->functions, FUNCTION_ENFORCER);
}
else if (!strcasecmp(argument, "god"))
{
TOGGLE_BIT(victim->pcdata->functions, FUNCTION_GOD);
}
else if (!strcasecmp(argument, "tester"))
{
TOGGLE_BIT(victim->pcdata->functions, FUNCTION_BETA_TESTER);
}
else if (!strcasecmp(argument, "developer"))
{
TOGGLE_BIT(victim->pcdata->functions, FUNCTION_DEVELOPER);
}
else if (!strcasecmp(argument, "secretagent"))
{
TOGGLE_BIT(victim->pcdata->functions, FUNCTION_SECRET_AGENT);
}
else
{
do_setfunc(ch, "");
}
ch_printf(ch, "Function toggled.\n\r");
pop_call();
return;
}
void do_oset( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
OBJ_DATA *obj;
int value;
push_call("do_oset(%p,%p)",ch,argument);
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
ch_printf(ch, "Syntax: set obj <field> <argument>\n\r");
ch_printf(ch, " Field being one of:\n\r");
ch_printf(ch, " v0 v1 v2 v3 name short long desc extra setextra clrextra\n\r");
ch_printf(ch, " wear level weight cost timer sactimer quest randquest \n\r");
pop_call();
return;
}
if ((obj = get_obj_here(ch, arg1)) == NULL)
{
ch_printf(ch, "Object not found.\n\r");
pop_call();
return;
}
value = atol(arg3);
if ( !strcasecmp( arg2, "value0" ) || !strcasecmp( arg2, "v0" ) )
{
obj->value[0] = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "value1" ) || !strcasecmp( arg2, "v1" ) )
{
obj->value[1] = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "value2" ) || !strcasecmp( arg2, "v2" ) )
{
obj->value[2] = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "value3" ) || !strcasecmp( arg2, "v3" ) )
{
obj->value[3] = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "extra" ) )
{
obj->extra_flags = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "setextra" ) )
{
obj->extra_flags=obj->extra_flags | value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "clrextra" ) )
{
obj->extra_flags=obj->extra_flags & NOT(value);
pop_call();
return;
}
if ( !strcasecmp( arg2, "wear" ) )
{
obj->wear_flags = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "level" ) )
{
obj->level = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "weight" ) )
{
obj->weight = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "cost" ) )
{
obj->cost = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "timer" ) )
{
SET_BIT(obj->extra_flags, ITEM_MODIFIED);
obj->timer = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "sactimer" ) )
{
obj->sac_timer = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "name" ) )
{
STRFREE (obj->name );
if( !strcasecmp( arg3, "null") )
{
obj->name = STRALLOC(obj->pIndexData->name);
}
else
{
obj->name = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "short" ) )
{
STRFREE (obj->short_descr );
if( !strcasecmp( arg3, "null") )
{
obj->short_descr = STRALLOC(obj->pIndexData->short_descr);
}
else
{
SET_BIT(obj->extra_flags, ITEM_MODIFIED);
obj->short_descr = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "long" ) )
{
STRFREE (obj->long_descr );
if (!strcasecmp( arg3, "null"))
{
obj->long_descr = STRALLOC(obj->pIndexData->long_descr);
}
else
{
obj->long_descr = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "desc" ) )
{
STRFREE (obj->description);
if (!strcasecmp( arg3, "null") )
{
obj->description = STRALLOC(obj->pIndexData->description);
}
else
{
obj->description = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "quest" ) )
{
int firstBit,len;
if (sscanf(arg3,"%d %d %d",&firstBit,&len,&value)!=3)
{
ch_printf(ch, "Bad parameters <set obj quest %s>", arg3);
pop_call();
return;
}
SET_BIT(obj->extra_flags, ITEM_MODIFIED);
set_quest_bits( &obj->obj_quest, firstBit, len, value);
pop_call();
return;
}
if ( !strcasecmp( arg2, "randquest" ) )
{
int firstBit,len;
if(sscanf(arg3,"%d %d",&firstBit,&len)!=2)
{
ch_printf(ch, "Bad parameters <set obj randquest %s>", arg3);
pop_call();
return;
}
SET_BIT(obj->extra_flags, ITEM_MODIFIED);
value = number_bits( len );
set_quest_bits( &obj->obj_quest, firstBit, len, value);
pop_call();
return;
}
do_oset(ch, "");
pop_call();
return;
}
void do_mset( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int value;
push_call("do_mpmset(%p,%p)",ch,argument);
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
ch_printf(ch, "Syntax: set mob <target> <field> <argument>\n\r");
ch_printf(ch, " Field being one of:\n\r");
ch_printf(ch, " quest questr randquest randquestr sex level exp gold align\n\r");
ch_printf(ch, " hp mana move thirst drunk full name short long desc\n\r");
pop_call();
return;
}
if ((victim = get_char_room(ch, arg1)) == NULL)
{
ch_printf(ch, "They aren't here.\n\r");
pop_call();
return;
}
value = is_number(arg3) ? atol(arg3) : -1;
if ( !strcasecmp( arg2, "quest" ) )
{
int firstBit,len;
if (sscanf(arg3,"%d %d %d",&firstBit,&len,&value) != 3)
{
ch_printf(ch, "Syntax: set mob <target> quest <offset> <numbits> <value>\n\r");
pop_call();
return;
}
if (IS_NPC(victim))
{
set_quest_bits( &victim->npcdata->mob_quest, firstBit, len, value );
}
else
{
if (IS_NPC(ch))
{
set_quest_bits( &victim->pcdata->quest[ch->pIndexData->area->low_r_vnum/100],firstBit,len, value);
}
else
{
set_quest_bits(&victim->pcdata->quest[victim->in_room->area->low_r_vnum/100], firstBit, len, value );
}
}
pop_call();
return;
}
if (!strcasecmp(arg2, "questr"))
{
int firstBit,len,vnum;
if (sscanf(arg3,"%d %d %d %d",&vnum, &firstBit,&len,&value)!=4)
{
ch_printf(ch, "Syntax: set mob <target> questr <vnum> <offset> <numbits> <value>\n\r");
pop_call();
return;
}
if (vnum < 0 || vnum >= MAX_VNUM || room_index[vnum]==NULL)
{
ch_printf(ch, "Room [%u] not found.\n\r", vnum);
pop_call();
return;
}
if (IS_NPC(victim))
{
set_quest_bits( &victim->npcdata->mob_quest, firstBit, len, value );
}
else
{
set_quest_bits(&victim->pcdata->quest[room_index[vnum]->area->low_r_vnum/100], firstBit, len, value );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "randquest" ) )
{
int firstBit,len;
if (sscanf(arg3,"%d %d",&firstBit,&len) !=2)
{
ch_printf(ch, "Syntax: randquest <offset> <numbits>\n\r");
pop_call();
return;
}
value = number_bits(len);
if (IS_NPC(victim))
{
set_quest_bits( &victim->npcdata->mob_quest, firstBit, len, value );
}
else
{
if (IS_NPC(ch))
{
set_quest_bits(&victim->pcdata->quest[ch->pIndexData->area->low_r_vnum/100], firstBit, len, value );
}
else
{
set_quest_bits(&victim->pcdata->quest[victim->in_room->area->low_r_vnum/100], firstBit, len, value );
}
}
pop_call();
return;
}
if (!strcasecmp( arg2, "randquestr"))
{
int firstBit,len,vnum;
if (sscanf(arg3,"%d %d %d",&vnum,&firstBit,&len)!=3)
{
ch_printf(ch, "Syntax: set mob <target> randquestr <vnum> <offset> <numbits>\n\r");
pop_call();
return;
}
if (vnum < 0 || vnum >= MAX_VNUM || room_index[vnum] == NULL)
{
ch_printf(ch, "Vnum [%u] not found.\n\r", vnum);
pop_call();
return;
}
value = number_bits(len);
if (IS_NPC(victim))
{
set_quest_bits( &victim->npcdata->mob_quest, firstBit, len, value );
}
else
{
set_quest_bits( &victim->pcdata->quest[room_index[vnum]->area->low_r_vnum/100], firstBit, len, value );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "sex" ) )
{
if ( value < 0 || value > 2 )
{
pop_call();
return;
}
victim->sex = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "level" ) )
{
if ( !IS_NPC(victim) )
{
pop_call();
return;
}
if (value < 0 || value > 150 )
{
pop_call();
return;
}
victim->level = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "exp" ) )
{
if ( value < 0 )
{
pop_call();
return;
}
if (!IS_NPC(victim))
{
victim->pcdata->exp = value;
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "gold" ) )
{
if ( value < 0 )
{
pop_call();
return;
}
victim->gold = value;
pop_call();
return;
}
if (!strcasecmp(arg2, "hp"))
{
if (!IS_NPC(victim))
{
value = URANGE(1, value, 99999);
victim->pcdata->actual_max_hit += value - victim->max_hit;
victim->max_hit = value;
}
pop_call();
return;
}
if (!strcasecmp(arg2, "mana"))
{
if (!IS_NPC(victim))
{
value = URANGE(1, value, 32000);
victim->pcdata->actual_max_mana += value - victim->max_mana;
victim->max_mana = value;
}
pop_call();
return;
}
if (!strcasecmp(arg2, "move"))
{
if (!IS_NPC(victim))
{
value = URANGE(1, value, 32000);
victim->pcdata->actual_max_move += value - victim->max_move;
victim->max_move = value;
}
pop_call();
return;
}
if (!strcasecmp(arg2, "align"))
{
if ( value < -1000 || value > 1000 )
{
pop_call();
return;
}
victim->alignment = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "thirst" ) )
{
if ( IS_NPC(victim) )
{
pop_call();
return;
}
if ( value < 0 || value > 100 )
{
pop_call();
return;
}
victim->pcdata->condition[COND_THIRST] = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "drunk" ) )
{
if ( IS_NPC(victim) )
{
pop_call();
return;
}
if ( value < 0 || value > 100 )
{
pop_call();
return;
}
victim->pcdata->condition[COND_DRUNK] = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "full" ) )
{
if ( IS_NPC(victim) )
{
pop_call();
return;
}
if ( value < 0 || value > 100 )
{
pop_call();
return;
}
victim->pcdata->condition[COND_FULL] = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "name" ) )
{
if ( !IS_NPC(victim) )
{
pop_call();
return;
}
STRFREE (victim->name );
if( !strcasecmp( arg3, "null") )
{
victim->name = STRALLOC(victim->pIndexData->player_name);
}
else
{
victim->name = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "short" ) )
{
STRFREE (victim->short_descr );
if( !strcasecmp( arg3, "null") )
{
if (IS_NPC(victim))
{
victim->short_descr = STRALLOC(victim->pIndexData->short_descr);
}
else
{
victim->short_descr = STRALLOC( "" );
}
}
else
{
victim->short_descr = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "long" ) )
{
STRFREE (victim->long_descr );
if( !strcasecmp( arg3, "null") )
{
if( IS_NPC( victim ) )
{
victim->long_descr = STRALLOC(victim->pIndexData->long_descr);
}
else
{
victim->long_descr = STRALLOC( "" );
}
}
else
{
victim->long_descr = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "desc" ) )
{
STRFREE (victim->description);
if( !strcasecmp( arg3, "null") )
{
if( IS_NPC(victim))
{
victim->description = STRALLOC(victim->pIndexData->description);
}
else
{
victim->description = STRALLOC( "" );
}
}
else
{
victim->description = STRALLOC( arg3 );
}
pop_call();
return;
}
if ( !strcasecmp( arg2, "title" ) )
{
if ( IS_NPC(victim) )
{
pop_call();
return;
}
set_title( victim, arg3 );
pop_call();
return;
}
if ( !strcasecmp( arg2, "spec" ) )
{
if ( !IS_NPC(victim) )
{
pop_call();
return;
}
if ( ( victim->pIndexData->spec_fun = spec_lookup( arg3 ) ) == 0 )
{
pop_call();
return;
}
pop_call();
return;
}
if (IS_NPC(ch))
{
log_printf("[%u] Unknown argument: <mpmset %s %s %s>", ch->pIndexData->vnum, arg1, arg2, arg3);
}
pop_call();
return;
}
void do_pset( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int value;
push_call("do_pset(%p,%p)",ch,argument);
if (IS_NPC(ch))
{
pop_call();
return;
}
smash_tilde( argument );
argument = one_argument(argument, arg);
if (arg[0] == '\0' || argument[0] == '\0')
{
ch_printf(ch, "Syntax: set player <player> <field> <argument>\n\r");
ch_printf(ch, " Field being one of:\n\r");
ch_printf(ch, " god class race wis con int dex str\n\r");
pop_call();
return;
}
if ((victim = get_char_room(ch, arg)) == NULL)
{
ch_printf(ch, "They aren't here.\n\r");
pop_call();
return;
}
argument = one_argument(argument, arg);
value = is_number(argument) ? atoi(argument) : -1;
if (IS_NPC(victim))
{
ch_printf(ch, "Not on mobs.\n\r");
pop_call();
return;
}
if (!strcasecmp(arg, "god"))
{
if (lookup_god(argument) == -1)
{
ch_printf(ch, "No such god.\n\r");
}
else
{
victim->pcdata->god = lookup_god(argument);
}
}
else if (!strcasecmp(arg, "class"))
{
if (lookup_class(argument) == -1)
{
ch_printf(ch, "No such class.\n\r");
}
else
{
victim->class = lookup_class(argument);
}
}
else if (!strcasecmp(arg, "race"))
{
if (lookup_race(argument) == -1)
{
ch_printf(ch, "No such race.\n\r");
}
else
{
victim->race = lookup_race(argument);
}
}
else if (!strcasecmp(arg, "str"))
{
if (value < 3 || value > 99)
{
send_to_char( "Strength range is 3 to 99.\n\r", ch );
}
else
{
victim->pcdata->perm_str = value;
}
}
else if (!strcasecmp(arg, "int"))
{
if (value < 3 || value > 99)
{
send_to_char( "Intelligence range is 3 to 99.\n\r", ch );
}
else
{
victim->pcdata->perm_int = value;
}
}
else if (!strcasecmp(arg, "wis"))
{
if (value < 3 || value > 99)
{
send_to_char( "Wisdom range is 3 to 99.\n\r", ch );
}
else
{
victim->pcdata->perm_wis = value;
}
}
else if (!strcasecmp(arg, "dex"))
{
if ( value < 3 || value > 99 )
{
send_to_char( "Dexterity range is 3 to 99.\n\r", ch );
}
else
{
victim->pcdata->perm_dex = value;
}
}
else if (!strcasecmp(arg, "con"))
{
if (value < 3 || value > 99)
{
send_to_char( "Constitution range is 3 to 99.\n\r", ch );
}
else
{
victim->pcdata->perm_con = value;
}
}
else
{
do_pset(ch, "");
}
pop_call();
return;
}
void do_sset( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int value;
int sn;
bool fAll;
push_call("do_sset(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
send_to_char("Syntax: set skill <player> <all|skill|spell> <value>\n\r", ch);
pop_call();
return;
}
if ((victim = get_player_world(ch, arg1)) == NULL)
{
send_to_char( "They aren't here.\n\r", ch );
pop_call();
return;
}
fAll = !strcasecmp(arg2, "all");
if (!fAll && skill_lookup(arg2) < 0)
{
send_to_char( "No such skill or spell.\n\r", ch );
pop_call();
return;
}
if (!is_number(arg3))
{
send_to_char( "Value must be numeric.\n\r", ch );
pop_call();
return;
}
value = atol(arg3);
if (value < 0 || value > 100)
{
send_to_char( "Value range is 0 to 100.\n\r", ch );
pop_call();
return;
}
if (fAll)
{
for (sn = 0 ; sn < MAX_SKILL; sn++ )
{
if (skill_table[sn].name != NULL)
{
victim->pcdata->learned[sn] = value;
}
}
}
else
{
victim->pcdata->learned[skill_lookup(arg2)] = value;
}
pop_call();
return;
}
void do_set( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
push_call("do_set(%p,%p)",ch,argument);
argument = one_argument(argument, arg);
if (IS_NPC(ch))
{
log_printf("do_set: used by mob");
dump_stack();
pop_call();
return;
}
log_god_printf("(G) Log %s: set %s %s", ch->name, arg, argument);
if (!strcasecmp(arg, "mob"))
{
do_mset(ch, argument);
}
else if (!strcasecmp(arg, "obj"))
{
do_oset(ch, argument);
}
else if (!strcasecmp(arg, "skill"))
{
do_sset(ch, argument);
}
else if (!strcasecmp(arg, "player"))
{
do_pset(ch, argument);
}
else if (IS_GOD(ch) && !strcasecmp(arg, "function"))
{
do_setfunc(ch, argument);
}
else
{
if (IS_GOD(ch))
{
send_to_char("Syntax: set <mob|obj|skill|function|player> <argument>\n\r", ch);
}
else
{
send_to_char("Syntax: stat <mob|obj|skill|player> <argument>\n\r", ch);
}
}
pop_call();
return;
}