#pragma strict_types
#pragma save_types
#pragma combine_strings
#include <mudlib.h>
#include <linewrap.h>
inherit LIVING;
inherit ACTIONS;
#include <player.cfg>
#include <player.spc>
#include <levels.h>
#include <ansi.h>
#include <restore.h>
#include <bad_file.h>
#define HELP_FN "function/help"
#define description long_desc
#define invis_name alt_name
#define plan extra_info
#ifdef PARTY_DAEMON
string party; /* the name of the party u are in */
#endif /* PARTY_DAEMON */
#ifdef PING_PONG
object pinger;
#endif
#ifdef PURGE
status purge; /* for funny things to happen if we get open! */
#endif /* PURGE */
string lastname; /* last name of the player's character */
string spouse; /* person we are married to */
string realname; /* persons real name */
string email; /* Email address of player */
int last_login_time; /* int time */
string last_login; /* ctime() */
string called_from_ip; /* IP number was used last time */
string enter_room; /* optional room to log into - for guilds */
int security_level; /* access privileges */
static object i_initiated_attack; /* who made an attack */
string pretitle; /* our rank - lady, lord, king etc. */
string title; /* Our official title. Wiz's can change it. */
string al_title; /* alignment title 'good','bad' etc. */
string password; /* crypted password. */
int savings; /* money in bank */
int total_exp; /* All the exp a player has ever earned */
int intoxicated; /* How many ticks to stay intoxicated. */
int stuffed; /* How many ticks to stay stuffed */
int soaked; /* How many ticks to stay soaked */
int scar; /* Number of scars */
int tot_value; /* Saved values of this player. */
string guild_string; /* guild string */
string *alias_commands; /* list of alias commands a player can use */
mixed *autoload; /* list of autoloaded abjects */
#ifdef SAVE_OBJECTS_ON_QUIT
mixed *saved_items;
#endif /* SAVE_OBJECTS_ON_QUIT */
status ansi_on; /* 1 == don't filter ansi characters */
#ifdef QUEST_ROOM
int quest_points; /* points achieved doing quests */
string *quests; /* quests completed */
string current_quest; /* quest that must be completed before next */
#endif /* QUEST_ROOM */
/* logon stuff */
static int password_check; /* Gives you 3 tried if you forget your password*/
static object other_copy; /* other me when logging in */
/* describe & chfn & plan & suicide */
static string new_text;
static int line;
static int time_to_save; /* Time to autosave. */
static status do_cmd_on; /* stops loops between aliases & 'do' cmds */
static int headache; /* should work something better */
static int max_headache;
static status entering; /* Tests whether move into room was an enter to mud */
string *channels; /* this no only includes standard mud chat lines, but
also can include intermud if/when it is installed */
/************************************************************************/
/* these should be put in /include/fn_specs/player_fn.spc */
status ansi_on();
/************************************************************************/
/* Normal commands for players and wizards alike 8) */
void add_standard_commands() {
add_action ( "chfn", "chfn" );
add_action( "toggle_hp", "hp" ); /*tamsyn*/
add_action ( "finger", "finger", 6);
add_action ( "change_plan", "plan" );
add_action ( "fix_it", "fix" );
add_action ( "email", "email" );
add_action ( "give_object", "give" );
add_action ( "emote", ":", 1 );
add_action ( "emote", "emote" );
add_action ( "score", "score" );
add_action ( "score", "?" );
add_action ( "skills", "skills" );
add_action ( "save_character", "save" );
add_action ( "quit", "quit" );
add_action ( "Quit", "Quit" );
add_action ( "kill", "kill" );
add_action ( "communicate", "say" );
add_action ( "communicate", "'", 1 );
add_action ( "change_language", "speak" );
add_action ( "shout_to_all", "shout" );
/* Note that these are still used for putting/giving money */
add_action ( "put", "put" );
add_action ( "pick_up", "get" );
add_action ( "pick_up", "take" );
add_action ( "drop_thing", "drop" );
add_action ( "inventory", "i" );
add_action ( "inventory", "inventory");
add_action ( "look", "look" );
add_action ( "look", "l" );
add_action ( "cls", "cls" );
add_action ( "toggle_channel", "channel" );
#ifdef PARTY_DAEMON
add_action ( "start_party", "party" );
#endif /* PARTY_DAEMON */
add_action ( "examine", "examine" );
add_action ( "examine", "exa" );
add_action ( "help", "help" );
add_action ( "manual", "man" );
add_action ( "whisper", "whisper" );
if(secure(SEC1))
add_action ( "tell", "tell" );
add_action ( "change_password", "password");
add_action ( "toggle_brief", "brief" );
add_action ( "wimpy", "wimpy" );
add_action ( "who", "who", 3);
add_action ( "describe", "describe");
add_action ( "lastname", "lastname");
add_action ( "hp", "ss" );
add_action ( "do_cmd", "do" );
add_action ( "add_alias", "alias" );
add_action ( "toggle_ansi", "ansi" );
add_action ( "command_centre", "",1);
#ifdef PING_PONG
add_action ( "ping", "ping" );
add_action ( "pong", "pong" );
#endif
if(level < 2) {
add_action ("church", "church");
add_action ("church", "square");
}
else {
add_action ( "suicide", "suicide" );
}
}
/****************************************************************************/
/* reset */
#ifdef NATIVE_MODE
/**********************************************************************/
/* restrict command() usage */
status init_command(string str) {
if(this_object() != this_player() && this_player()) {
if((int)this_player()->query_security_level()
< (int)this_object()->query_security_level()) {
return 0;
}
}
return command(str,this_object());
}
void create() {
string fname;
int i;
::create();
#else /* COMPAT_MODE */
void reset(status arg) {
string fname;
int i;
::reset(arg);
if(arg) return;
#endif /* NATIVE_MODE */
if(name) return;
level = -1;
name = "logon";
channels = ({ "OOC", });
lastname = "";
title = "the Utter Newbie";
description = "";
plan = "";
guild_string = "No";
pretitle = "";
al_title = "(Wandering)";
right_wc = WEAPON_CLASS_OF_HANDS;
alias_commands = ({});
#ifdef QUEST_ROOM
quests = ({});
#endif /* QUEST_ROOM */
if(!sscanf(file_name(this_object()),"%s#%d", fname,i)) return;
if(!(fname == PLAYER || fname == WIZARD)) {
illegal_patch("Inherited "+file_name(this_object()));
destruct(this_object());
return;
}
if(previous_object()) {
if((previous_object() == this_player() || secure(SEC5))
&& query_ip_number(this_player()) && query_ip_number(previous_object())){
if((other_copy = (object)previous_object()->query_other_copy())) {
name = (string)previous_object()->query_name(1);
exec(this_object(),previous_object());
logon9_throw_out_other_copy("y");
return;
}
}
}
if(creator(this_object())) {
illegal_patch("Cloned "+file_name(this_object()));
destruct(this_object());
return;
}
}
/*************************************************************************/
/* IDENTIFY the player */
status id(string str) {
if(str == "PLAYER") return 1;
if(this_player() != this_object())
if(query_invis()) {
if(this_player()) {
if((int)this_player()->query_security_level() < security_level) {
return 0;
}
else if(!this_player()->query_security_level()
&& random((int)this_player()->query_intelligence())
< random(query_invis()+1)){
return 0;
}
}
}
return str == query_name(1)
|| str == query_name()
|| str == lower_case(query_name());
}
/**************************************************************************/
/* short */
string short(status wiz) {
string str;
str = "";
if(query_invis() && this_player() != this_object()) {
if((int)this_player()->query_security_level() < query_security_level()) {
return 0;
}
else if(sizeof(compare("intelligence","invis",({ this_object(),})))) {
return 0;
}
str += "#";
}
str += (pretitle != "") ? " "+ pretitle : "";
str += " "+ query_name();
if(query_disguise_on()
&& !sizeof(compare("intelligence","disguise",({ this_object(),})))) {
str += "??";
}
if(!query_security_level() && !query_disguise_on()) {
str += " "+query_lastname();
}
else {
str += (this_object()->query_edit())
? " "+ (string)this_object()->query_edtitle()
: " "+ title + (query_security_level() ? " "+ al_title : "" );
}
if(!query_ip_number(this_object())) str = " A statue of"+ str;
return str;
}
/*************************************************************************/
/* sets */
string set_name(string n) { return ""; /* disable */ }
string set_id(string n) { return ""; /* disable */ }
string set_short(string n) { return ""; /* disable */ }
string set_long(string n) { return ""; /* disable */ }
string set_title(string t) { return title = (t) ? t : ""; }
string set_pretitle(string t) { return pretitle = (t) ? t : ""; }
string set_al_title(string t) { return al_title = (t) ? t : ""; }
string set_spouse(string t) { return spouse = (t) ? t : 0; }
string set_lastname(string l) { return lastname = (l) ? l : ""; }
#ifdef PARTY_DAEMON
string set_party(string s) { return party = (s) ? s : 0; }
#endif /* PARTY_DAEMON */
string set_enter_room(string str) {
return enter_room = (!str) ? 0 : ((FILE_SIZE(str+".c") > 0) ? str : 0);
}
int set_intoxicated(int i) { return intoxicated = i; }
int set_stuffed(int i) { return stuffed = i; }
int set_soaked(int i) { return soaked = i; }
int set_headache(int i) { return headache = i; }
int set_scar(int i) { return scar = i; }
string set_guild_string(string s) { return guild_string = (s) ? s : "No"; }
string set_email(string s) { return email = (s) ? s : "none"; }
string set_description(string s) { return description = (s) ? s : ""; }
string set_plan(string s) { return plan = (s) ? s : ""; }
int set_time_to_save(int i) { return time_to_save = i; }
status set_start() {
if(set_enter_room(file_name(environment()))) {
write("You will now enter "+ MUD_NAME +" into this room.\n");
}
else {
write("Cannot set enter to this room.\n");
}
return 1;
}
/***************************************************************************/
/* querys */
string query_realname() { return realname; }
string query_lastname() { return lastname; }
string query_last_login() { return ctime(last_login_time); }
string query_enter_room() { return enter_room; }
#ifdef PARTY_DAEMON
string query_party() { return party; }
#endif /* PARTY_DAEMON */
#ifdef NO_SHADOWS
nomask status query_prevent_shadow() { return 1; }
#endif
string query_email() { return email; }
string query_al_title() { return al_title; }
string query_title() { return title; }
string query_desc() { return description; }
string query_spouse() { return spouse; }
int query_total_exp() { return total_exp; }
int query_savings() { return savings; }
int query_intoxication() { return intoxicated; }
int query_stuffed() { return stuffed; }
int query_soaked() { return soaked; }
string query_guild_string() { return guild_string; }
object query_other_copy() { return other_copy; }
object query_i_initiated_attack() { return i_initiated_attack; }
object set_i_initiated_attack(object ob) { return i_initiated_attack = ob; }
/*************************************************************************/
/* heart beat */
static void heart_beat() {
int i;
age += 1;
if(ghost) return;
dead = ghost;
if(age > time_to_save) {
if(!secure(SEC1)) {
if(!brief) write("Autosave.\n");
save_me(1);
}
time_to_save = age + SAVE_TIME;
}
if(!query_ip_number(this_object())) {
say(query_name()+" gives a sudden cry as "+ query_pronoun() +
" turns to stone!\n");
set_heart_beat(0);
call_out("quit",3600,1);
return;
}
if(!secure(SEC1)) {
if(query_idle(this_object())/60 >= 30) {
tell_object(this_object(),"You have been idle too long.\n"+
"You have left the world.\n");
say(query_name()+ " is struck by a lightning bolt and vanishes!\n");
quit(1);
return;
}
}
if(intoxicated && !random(40)) {
int n;
n = random(7);
if(n == 0) {
say(query_name() + " hiccups.\n");
write("You hiccup.\n");
}
else if(n == 1) {
say(query_name() + " almost falls, but takes a step and recovers.\n");
write("You stumble.\n");
}
else if(n == 3) {
write("You feel drunk.\n");
say(query_name() + " looks drunk.\n");
}
else if(n == 5) {
say(query_name() + " burps.\n");
write("You burp.\n");
}
}
if(!random(HEAL_HP_PERIOD)) {
if(hp < max_hp) {
hp += (1 + constitution/6);
if (intoxicated) hp += 2;
if (soaked) hp += 1;
if (stuffed) hp += 1;
if(hp > max_hp) hp = max_hp;
}
if(headache) {
headache -= 1;
if(!headache)
tell_object(this_object(),"You no longer have a headache.\n");
}
if(intoxicated) {
intoxicated -= 1;
if(!intoxicated) {
headache = max_headache;
max_headache = 0;
tell_object(this_object(),
"You suddenly without reason get a bad headache.\n");
if((hp -= 3) < 0) hp = 0;
}
}
if(stuffed) {
stuffed -= 1;
if(!stuffed) tell_object(this_object(),"You start to feel hungry.\n");
}
if(soaked) {
soaked -= 1;
if(!soaked) tell_object(this_object(),"You begin to feel thirsty.\n");
}
}
for(i = sizeof(classes); i--; ) {
call_other(this_object(),"heal_"+ classes[i]);
}
if(!(dead || ghost)) attack();
if(primary_attack && present(primary_attack,environment()) && hp < whimpy){
random_move();
}
}
/**************************************************************************/
/* used by help function to validate access to help data */
#define NO_ACCESS ({ "creator", })
status valid_help(string *subtopics) {
int i;
if(security_level > SEC0) return 1;
for(i = 0; i < sizeof(NO_ACCESS); i++) {
if(member_array(NO_ACCESS[i], subtopics) != -1) return 0;
}
return 1;
}
nomask varargs string valid_write(string path,string call_fun) {
object caller;
if(path[0] != '/') {
path = (string)this_object()->make_path(path);
}
#ifdef 312MASTER
caller = (previous_object()) ? previous_object() : this_object();
if(file_name(caller) == SIMUL_EFUN
|| file_name(caller) == SPARE_SIMUL_EFUN_FILE) {
return extract(path,1);
}
#endif
return (string)MASTER->valid_write(path,0,call_fun,caller);
}
nomask varargs string valid_read(string path,string call_fun) {
object caller;
if(path[0] != '/') {
path = (string)this_object()->make_path(path);
}
#ifdef 312MASTER
caller = (previous_object()) ? previous_object() : this_object();
if(file_name(caller) == SIMUL_EFUN
|| file_name(caller) == SPARE_SIMUL_EFUN_FILE) {
return extract(path,1);
}
#endif
return (string)MASTER->valid_read(path,0,call_fun,caller);
}
/***************************************************************************/
/* Player Actions */
/***************************************************************************/
/* brief */
static status toggle_brief(status silently){
if((brief = !brief)) {
if(!silently)
tell_object(this_object(),
"Brief mode. BEWARNED that there are many features\n"+
" and room warnings that you will miss in this mode.\n");
}
else {
if(!silently) tell_object(this_object(),"Verbose mode.\n");
}
return 1;
}
/* hp display */
status toggle_hp(string str) {
if(str) return 0;
hp_displ = !hp_displ;
write("Hit point display " + ( hp_displ ? "on" : "off" ) +".\n");
return 1;
}
/***********************************************************************/
/* ansi filters on communication stuff */
status ansi_on() { return ansi_on; }
/**************************************************************************/
/* wimpy */
status wimpy(string str) {
int i;
if(no_wimpy) {
write("You cannot use wimpy mode.\n");
return 1;
}
if(!str || str == "0") {
write("You begin to feel a little more brave.\n");
whimpy = 0;
return 1;
}
if(str == "direction") {
write("You decide to flee in any direction when running from battle.\n");
custom = 0;
return 1;
}
if(!sscanf(str,"%d",i)) {
if(sscanf(str,"direction %s",custom)) {
write("You will try to run "+custom+" when fleeing from battle.\n");
return 1;
}
write("Usage: wimpy <hit points>\n"+
" wimpy direction <direction>\n");
return 1;
}
if (i < 0) {
write("Now don't be silly.\n");
return 1;
}
whimpy = i;
if(level < 6) {
if(whimpy > max_hp/2) whimpy = max_hp/2;
}
else {
if(whimpy > wisdom * 5) whimpy = wisdom * 5;
}
tell_object(this_object(),"Whimpy is set to "+whimpy+" hit points.\n");
return 1;
}
#ifdef PARTY_DAEMON
/**************************************************************************/
/* Party Stuff - Angel, April 1994 */
status start_party(string str) {
object obj;
if(!str) {
write("Usage: party <party name>\n");
return 1;
}
if(party) {
write("You already belong to a party!\n");
return 1;
}
if(call_other(PARTY_DAEMON, "query_party", str)) {
write("There is already a party called '"+str+"'.\n");
return 1;
}
if(party) {
write("You already belong to the '"+party+"' party.\n");
return 1;
}
party = str;
obj = clone_object(PARTY_OBJECT);
obj -> set_party(str);
obj -> set_founder(query_name(1));
obj -> set_leader(query_name(1));
#ifdef NATIVE_MODE
obj->move(this_object());
#else
move_object(obj, this_object());
#endif /* NATIVE_MODE */
write("You now lead the '"+str+"' party!\n");
return 1;
}
#endif /* PARTY_DAEMON */
/***************************************************************************/
/* change password */
static status change_password() {
if(password) {
write("Old Password > ");
input_to("change_password1",1);
return 1;
}
change_password1("");
return 1;
}
static void change_password1(string str) {
if(password && password != crypt(str, password)) {
write("\nWrong old password.\n");
return;
}
password = 0;
input_to("change_password2", 1);
write("New password > ");
return;
}
static void change_password2(string str){
if(!str || str == "") {
change_password1("");
return;
}
if(!password) {
password = str;
input_to("change_password2", 1);
write("Again > ");
return;
}
if(password != str) {
write("\nStart Again!!\n");
password = 0;
change_password1("");
return;
}
password = crypt(password, 0); /* Generate new seed */
write("\nPassword change Successfull.\n");
save_me(1);
}
/***************************************************************************/
/* suicide */
static status suicide() {
if(level < 2) return 0;
tell_object(this_object(),
"The suicide command removes your character, and Banishes \n"+
"you name. No one, not even yourself, will be able to use \n"+
"that name again.\n");
write("To continue enter password> ");
input_to("pass1",1);
return 1;
}
static void pass1(string str) {
int old_sec_level;
if(password != crypt(str, password)) {
write("\nWrong password.\n");
return;
}
line = 1;
new_text = "";
input_to ("suicide_note");
write ("\nEnter your Suicide Note. End with '**', abort with '~q'.\n");
write ("1] ");
return;
}
static void suicide_note(string arg) {
if(arg == "~q") {
write ("Suicide aborted.\n");
return;
}
if(arg == "**") {
write("Suicide Note:\n"+ new_text+"\n");
do_suicide(new_text);
return;
}
new_text = new_text+arg+"\n";
write (++line+"] ");
input_to ("suicide_note");
}
static void do_suicide(string note) {
string txt;
int old_level;
save_object("banish/"+query_name(1));
write("Suiciding......\n");
set_heart_beat(0);
MASTER->master_remove_file("/"+SAVE_PLAYER+query_name(1)+".o");
MASTER->master_remove_file("/"+SAVE_WIZARD+query_name(1)+".o");
# ifdef LOG_SUICIDE
log(LOG_SUICIDE,note,0);
# endif
shout(query_cap_name()+" has just Suicided.\nMay "+
query_possessive()+" Rest in Peace.\n");
write("You Die!\n");
destruct(this_object());
}
/**********************************************************************/
/* church */
status church() {
move_player("X#"+ DEFAULT_ENTER);
return 1;
}
/***************************************************************************/
/* describe */
static status describe() {
object editor;
if(ghost) {
write ("You are in an immaterial state with no description.\n");
return 1;
}
#ifdef EDITOR
write("Enter your character's description.\n");
editor = clone_object(EDITOR);
#ifdef NATIVE_MODE
editor->move(this_object());
#else
move_object(editor, this_object());
#endif /* NATIVE_MODE */
editor->edit("set_description", description);
return 1;
}
#else
line = 1;
new_text = "";
input_to ("get_desc");
write ("Enter your description. End with '**', abort with '~q'.\n");
write ("1] ");
return 1;
}
static void get_desc(string arg) {
if(arg == "~q") {
write ("Description aborted.\n");
return;
}
if(arg == "**") {
description = new_text;
write("New description:\n"+((description == "") ? "Cleared" : description));
return;
}
new_text = new_text+arg+"\n";
write (++line+"] ");
input_to ("get_desc");
}
#endif /* EDITOR */
status lastname() {
if(query_level() < 10) {
write("You are not of high enough level to have earned a last name!\n");
return 1;
}
if(strlen(lastname)) {
write("You already have a family name.\n");
return 1;
}
write("A last name is as much a title as it is an identifier of your \n"+
"roleplaying activities in the mud. Some characters who enjoy \n"+
"slaying goblins have known to use the name 'goblinbane', and \n"+
"for a paladin's heart was as strong as the metal it was named \n"+
"for, Maddison 'Steel'.\n\n"+
"Choosing a last name is an important step within the mud. To \n"+
"continue, enter your choice for your last name. To quit, enter\n"+
"'~q' and it will not be set. > ");
input_to("lastname2");
return 1;
}
status lastname2(string str) {
if(!str || str == "" || str == "~q") {
write("Lastname aborted.\n");
return 1;
}
write("Your family name/last name has been set to '"+str+"'.\n");
lastname = capitalize(str);
return 1;
}
/***************************************************************************/
/* skills */
status skills(string str) {
if(!str) {
write("Usage: skills 'class'\n");
return 1;
}
str = lower_case(str);
if(query_class(str) || str == "general" || str == "primary") {
call_other(this_object(), "query_"+str+"_stats");
write("\nType 'help "+str+"' for further information.\n");
return 1;
}
write("You are not in the class of "+ capitalize(str) +".\n");
return 1;
}
/**************************************************************************/
/* score */
status score() {
string tmp;
string money_str;
string *weap;
int *skills, ii;
if(ghost) {
write("You are in an immaterial state with no scores.\n");
return 1;
}
if(!query_security_level())
write("\nYou are: "+short(0)+". Alignment: "+al_title+".\n");
else
write("\nYou are: "+short(0)+"\n");
if(title) write("Your level title is: "+title+"\n");
if(guild_string && lower_case(guild_string) != "no")
write("You belong to "+capitalize(guild_string) +"\n\n");
tmp = "Exp to spend: "+ experience +" ";
tmp = extract(tmp,0,35);
tmp += "Total experience points: "+ total_exp +" ";
tmp = extract(tmp,0,70);
write(tmp+"\n");
tmp = "Player Level: "+ level +" ";
tmp = extract(tmp,0,35);
tmp += "Hit Points: "+ hp +"("+ max_hp +") ";
tmp = extract(tmp,0,70);
write(tmp+"\n");
query_primary_stats();
tmp = "-------------------------------------------------------------------";
write(tmp+"\n");
money_str = "no";
if(money) {
if(!(money_str = (string)call_other(MONEY, "convert", money))) {
money_str = money +"";
}
}
tmp = "You are carrying "+ money_str +" coins, and have ";
money_str = "no";
if(savings) {
if(!(money_str = (string)call_other(MONEY, "convert", savings))) {
money_str = savings +"";
}
}
tmp += money_str +" coins in the bank.";
writelw(tmp+"\n");
tmp = (intoxicated && stuffed && soaked)
? "You are intoxicated, have a full stomach, "+
"and are certainly not thirsty.\n"
: (intoxicated && stuffed)
? "You are intoxicated, and have a full stomach.\n"
: (intoxicated && soaked)
? "You are intoxicated, and are not thirsty.\n"
: (intoxicated)
? "You are intoxicated.\n"
: (stuffed && soaked)
? "You have a full stomach, and are certainly not thirsty.\n"
: (stuffed)
? "You have a full stomach.\n"
: (soaked)
? "You are certainly not thirsty.\n"
: "You have not eaten, or drank anything lately.\n";
write(tmp);
if(!whimpy)
write("You are feeling very brave!\n");
else {
write("You are ready to run at "+ whimpy +" hit points - ");
write(((whimpy*100)/query_max_hp()) +"%\n");
}
show_age(0);
tmp = "You have skills in "+implode(classes, ", ") +".\n";
writelw(tmp);
tmp = "-------------------------------------------------------------------";
write(tmp+"\n");
if(level_drained)
write("\nYou have been level drained "+ level_drained +" times.\n");
if(!pointerp(languages_known)) languages_known = ({});
if(sizeof(languages_known)) {
tmp = "Languages known: ";
tmp += implode(languages_known, ", ");
writelw(tmp+"\n");
}
if(m_sizeof(weapon_prof)) {
weap = m_indices(weapon_prof);
skills = m_values(weapon_prof);
tmp = "Weapon Proficiencies: ";
for(ii=0; ii<sizeof(skills); ii++) {
tmp += capitalize(weap[ii])+": "+skills[ii]+", ";
}
tmp += "\n";
writelw(tmp);
}
tmp = "Type 'ss' for short score. ";
tmp = extract(tmp,0,30);
tmp += "Type 'skills <class>' for list of skills. ";
tmp = extract(tmp,0,70);
writelw(tmp+"\n");
return 1;
}
/********************************************************************/
/* hp */
status hp() {
write ("-*- HP: "+ hp +" ("+ max_hp +") EXP: "+ experience +" -*-\n");
return 1;
}
/**************************************************************************/
/* email */
status email(string str) {
write("New Email Address: "+set_email(str)+"\n");
return 1;
}
/***************************************************************************/
/* chfn */
static status chfn() {
write("What is your real name? [Old: "+realname+"]\nNew Name: ");
input_to("chfn2");
return 1;
}
static void chfn2(string str) {
if(!str || str == "") {
write("Real name not changed.\n");
return;
}
write("Real Name changed: "+(realname = str)+"\n");
write("What is your email address? [Old: "+email+"]\nNew Address: ");
input_to("chfn3");
}
static void chfn3(string str, status plan_only) {
object editor;
if(!plan_only) {
if(!str || str == "") {
write("Email address not changed.\n");
return;
}
write("Email address changed: "+(email = str)+"\n");
}
#ifdef EDITOR
editor = clone_object(EDITOR);
#ifdef NATIVE_MODE
editor->move(this_object());
#else
move_object(editor, this_object());
#endif /* NATIVE_MODE */
editor->edit("set_plan",plan);
}
/* editor quit */
void editor_quit(string arg) {
switch(arg) {
case "set_plan":
write("Plan unchanged.\n");
break;
}
}
#else
write("Your Old Plan:\n"+plan);
line = 1;
new_text = "";
input_to ("chfn4");
write ("Enter your plan. End with '**', abort with '~q'.\n");
write ("1] ");
}
static void chfn4(string arg) {
if(arg == "~q") {
write ("Plan aborted.\n");
return;
}
if(arg == "**") {
plan = new_text;
write("New Plan:\n"+((plan == "") ? "Cleared" : plan));
return;
}
new_text = new_text+arg+"\n";
write (++line+"] ");
input_to("chfn4");
}
#endif /* EDITOR */
/************************************************************************/
/* change plan */
static status change_plan() {
chfn3(0,1);
return 1;
}
/************************************************************************/
/* fix */
static status fix_it(string str) {
string reason;
if(!str || !sscanf(str,"%s %s",str,reason)) {
write("Usage: fix <carry|armour|weapon|heart> <reason>\n\n"+
" Give reason so bugs can be traced.\n");
return 1;
}
if(str=="carry" || str=="weight") {
write("Fixing your carry problems.....\n");
recalc_carry();
write("Your carry has been fixed.....\n");
#ifdef LOG_FIX
log(LOG_FIX,"Carry: "+reason,0);
#endif /* LOG_FIX */
}
else if(str=="armor" || str=="armour" || str=="ac") {
write("Fixing your armor class........\n");
recalc_ac();
write("Your armor class has been fixed.....\n");
#ifdef LOG_FIX
log(LOG_FIX,"Armour: "+reason,0);
#endif /* LOG_FIX */
}
else if(str=="wc" || str=="weapon") {
write("Fixing your weapon class.....\n");
recalc_wc();
write("Your weapon class has been fixed.....\n");
#ifdef LOG_FIX
log(LOG_FIX,"Weapon: "+reason,0);
#endif /* LOG_FIX */
}
else if(str=="h" || str=="heart" || str=="heartbeat") {
cpr();
#ifdef LOG_FIX
log(LOG_FIX,"Heartbeat: "+reason,0);
#endif /* LOG_FIX */
}
else {
write("This is your character fixing function.\n");
write("You may fix the following:\n");
write("Armour, Weapon, Carry, Heart.\n");
write("\nIf you are having other problems contact a creator.\n");
}
return 1;
}
/*************************************************************************/
/* inventory */
status inventory() {
if(set_light(0) < 1) {
write("It's too dark to see what you're carrying.\n");
return 1;
}
show_inventory();
return 1;
}
/***************************************************************************/
/* cls */
status cls(status arg) {
int i;
for (i = 35; i--;) write ("\n");
return 1;
}
/***************************************************************************/
/* exa */
status examine(string str) {
if(!str) {
write("Examine what?\n");
return 1;
}
look("at "+str,1);
return 1;
}
/**************************************************************************/
/* look */
status look(string str, status extra) {
object ob;
object special;
string item;
string extra_str;
status wiz;
int wt;
wiz = secure(SEC1);
if(query_real_light() < 1) {
write("It's too dark.\n");
return 1;
}
if(!str) {
ob = environment(this_player());
}
else {
sscanf(str, "at %s", str);
sscanf(str, "in %s", str);
if(environment()->look_at(str)) return 1;
sscanf(str, "%s on %s", item, str);
sscanf(str, "%s in %s", item, str);
str = lower_case(str);
if(!(ob = present(str, this_player()))) {
if(!(ob=present(str,environment()))) {
write("There is no " + str + " here.\n");
return 1;
}
}
if(item) {
if(!ob->look_at(item)) write("There is no "+ item +".\n");
return 1;
}
}
if(extra)
ob->extra_info(wiz);
else
ob->long(wiz);
if (living(ob)) {
special = first_inventory(ob);
while(special) {
extra_str = (string)special->extra_look();
if (extra_str) write(extra_str + ".\n");
special = next_inventory(special);
}
}
if(ob == environment() || living(ob) || ob->can_put_and_get()) {
if(!living(ob) && !extra) {
wt = (int)ob->query_weight();
if(wt >= 5)
write("It looks very heavy.\n");
else if (wt >= 3)
write("It looks heavy.\n");
}
show_inventory(ob);
}
else if(!living(ob)) {
wt = (int)ob->query_weight();
if(wt >= 5)
write("It looks very heavy.\n");
else if (wt >= 3)
write("It looks heavy.\n");
}
return 1;
}
/**************************************************************************/
/* help/manual */
status manual(string what) {
string tmp1, tmp2;
string pre,rest;
if(!what
|| sscanf(what,"%s/%s",pre,rest)
|| sscanf(what,"%s.%s",pre,rest)) {
help("manuals");
return 1;
}
if(file_size("/manuals/"+ what +".man") > 0) {
more("/manuals/"+ what +".man");
}
else if(secure(SEC1) && file_size("/manuals/"+ what +".wiz") > 0) {
more("/manuals/"+ what +".wiz");
}
else {
write("No Manual Available.\n");
}
return 1;
}
status help(string str) {
return (status)call_other(HELP_FN,"help",str);
}
/***************************************************************************/
/* kill */
static status kill(string str) {
object ob;
if(ghost) return 0;
if(!str) {
write("Kill what ?\n");
return 1;
}
if(!(ob = present(lower_case(str), environment()))) {
write("No " + str + " here !\n");
return 1;
}
if(!living(ob)) {
write(ob->short() + " is not a living thing !\n");
say(query_name() + " tries foolishly to attack " + str + ".\n");
return 1;
}
if(ob == this_object()) {
write("What ? Attack yourself ?\n");
return 1;
}
if(environment(this_object())->query_no_fight()) {
write("Fighting is not allowed here.\n");
return 1;
}
if(primary_attack == ob) {
write("Yes, yes !!\n");
return 1;
}
if(!add_secondary_attacker(ob)) {
write("The law prevents you from attacking "+ ob->query_name() + ".\n");
say(query_name() +" attempts to kill "+ ob->query_name() +"!\n", ob);
tell_object(ob,query_name() +" tries to kill you!\n");
return 1;
}
if(primary_attack && present(primary_attack, environment())) {
write("You turn to attack "+(string)ob->query_name()+".\n");
}
primary_attack = ob;
return 1;
}
/*************************************************************************/
/* change disguise */
status change_disguise(string str) {
string tmp;
if(str) {
str = lower_case(str);
if(!bad_file(str, ({ "-", "_", ".", }))
&& !(FILE_SIZE("/"+SAVE_FIRST+str+".o") > 0
|| FILE_SIZE("/"+SAVE_PLAYER+str+".o") > 0
|| FILE_SIZE("/"+SAVE_WIZARD+str+".o") > 0
|| FILE_SIZE("/"+SAVE_NO_BANISH+str+".o") > 0
|| FILE_SIZE("/banish/"+str+".o") > 0)) {
if(primary_attack && present(primary_attack,environment())) {
write("You cannot disguise yourself when you are fighting.\n");
return 1;
}
write("You disguise yourself as "+capitalize(str)+".\n");
set_alias_name(capitalize(str));
disguise_on = 1;
}
else {
write("You cannot disguise yourself as "+capitalize(str)+".\n");
}
}
else {
if(primary_attack && present(primary_attack,environment())) {
write("You cannot disguise yourself while attacking.\n");
disguise_on = 0;
}
else {
toggle_disguise(0);
}
}
return 1;
}
/**************************************************************************/
/* command centre */
status command_centre(string str) {
string channel, emote, mud;
string verb, tmp1, tmp2;
string prep;
int i, num;
mixed *items;
object ob1, ob2;
verb = query_verb();
if(sscanf(verb,"%s@%s", tmp1, tmp2) == 2) {
if(!bad_file(tmp1,({ ".", "/", })) && !bad_file(tmp2, ({ ".", "/", }))) {
if(member_array(tmp1, classes) != -1) {
if(FILE_SIZE("/skills/"+ tmp1 +"/"+ tmp2 +".c") > 0) {
if(call_other("skills/"+ tmp1 +"/"+ tmp2, tmp2, str)) return 1;
}
}
}
}
if(!bad_file(verb, ({ ".", "/", }))) {
for(i = 0; i < sizeof(classes); i++) {
if(FILE_SIZE("/skills/"+ classes[i] +"/"+ verb +".c") > 0) {
if(call_other("skills/"+ classes[i] +"/"+ verb, verb, str)) return 1;
}
}
}
#ifdef ENABLE_PARSE_COMMAND
ob1 = environment(this_player());
if(parse_command(verb+" "+str, ob1,
" 'get' / 'take' %i %p %o ", items, prep, ob2)) {
return parse_pick_up(items, prep, ob2);
}
else if(parse_command(verb+" "+str, ob1, " 'get' / 'take' %i", items)) {
return parse_pick_up(items, 0, 0);
}
if(parse_command(verb+" "+str, ob1,
" 'put' / 'drop' %i %p %o", items, prep, ob2)) {
return parse_put(items, prep, ob2);
}
else if(parse_command(verb+" "+str, ob1, " 'put' / 'drop' %i", items)) {
return parse_put(items, 0, 0);
}
if(parse_command(verb+" "+str, ob1, " 'give' %i %p %o", items, prep, ob2)) {
return parse_put(items, prep, ob2);
}
else if(parse_command(verb+" "+str, ob1, " 'give' %i", items)) {
return parse_put(items, 0, 0);
}
#endif ENABLE_PARSE_COMMAND
if(query_channel(verb)) {
if(verb == "ooc") verb = "OOC";
return chat_channel(verb, str);
}
#ifdef INTERMUD
/* intermud hook */
#if (INTERMUD)
if(secure(SEC1)) {
#endif /* wizards only */
if(!sscanf(verb, "%s:%s", channel, emote)) channel = verb;
sscanf(channel, "%s@%s", channel, mud);
if(channel == "intermud" || member_array(channel, channels) != -1) {
call_other(this_object(),
"intermud",
channel,
((emote) ? "emote "+ emote +" "+ str : str),
mud);
return 1;
}
#if (INTERMUD)
}
#endif /* wizards only */
#endif /* INTERMUD */
switch(verb) {
case "typo": case "idea": case "soul": case "bug":
case "comment":
log_for_players(capitalize(verb),str);
return 1;
break;
case "stealth":
if(!query_stealth()) return 0;
toggle_stealth(0);
return 1;
break;
case "disguise":
if(!query_disguise()) return 0;
change_disguise(str);
return 1;
break;
}
if((i = get_alias_index(verb)) != -1) {
if(!do_cmd_on && i < sizeof(alias_commands)) {
str = alias_commands[i]+((str) ? " "+ str : "");
command(str, this_object());
}
else
write("Error: Do command cannot call aliases.\n");
return 1;
}
return 0;
}
/*************************************************************************/
/* do cmd */
static void wait(int time, string cmd) {
time += find_call_out("do_cmd");
remove_call_out("do_cmd");
call_out("do_cmd",time, cmd);
}
status do_cmd(string str) {
string cmd, rest;
int i, len, time;
if(!str || str == "") {
write("Usage: do command1, command2, etc, etc\n\n"+
"Notes: Do has a special wait status (0-30 seconds).\n"+
" Eg. do north,east,wait 5,south\n");
return 1;
}
if((time = find_call_out("do_cmd")) != -1) {
write("Do command Wait status: "+ time +" seconds.\n");
return 1;
}
if(do_cmd_on) {
write("Do command cannot call 'do'.\n");
return 1;
}
do_cmd_on = 1; /* flag on == alias cannot be called-stops possible loops */
while(str != "") {
if(sscanf(str,"%s,%s",cmd,rest)) {
str = rest;
}
else {
cmd = str;
str = "";
}
if(!(len = strlen(cmd))) continue;
for(i = 0; i < len && cmd[i] == ' '; i++);
if(i == len) continue;
cmd = extract(cmd,i);
if(sscanf(cmd,"wait %d",time)) {
if(time < 30 && time > 0) {
write("Wait "+time+" seconds to 'do "+ str +"'\n");
do_cmd_on = 0;
wait(time,str);
return 1;
}
}
write(cmd +"\n");
if(!command(cmd)) {
write("Do command \""+cmd+"\" Failed.\n");
do_cmd_on = 0;
return 1;
}
}
write("Do command line Done.\n");
do_cmd_on = 0;
return 1;
}
/*************************************************************************/
/* alias commands */
int get_alias_index(string str) {
int i;
if((i = member_array(str, alias_commands)) != -1) {
if(i%2) return -1;
return i+1;
}
return -1;
}
status add_alias(string str) {
string com, tmp1, tmp2;
int i;
if(!str) {
write("Aliases: ");
for(i = 0; i < sizeof(alias_commands); i += 2) {
if(i) write(" ");
write(alias_commands[i]+": "+alias_commands[i+1]+"\n");
}
if(!sizeof(alias_commands)) write("None.\n");
return 1;
}
if(!sscanf(str,"%s %s",str,com)) {
remove_alias(str);
write("Alias: "+str+" removed.\n");
return 1;
}
if(!sscanf(com,"%s %s",tmp1,tmp2)) {
tmp1 = com;
}
if(str == tmp1) {
write("Error: Tautological alias.\n");
return 1;
}
if(!(member_array(tmp1,alias_commands)%2)) {
write("Error: Cannot have an alias calling an alias.\n");
return 1;
}
if(!((i = member_array(str,alias_commands))%2)) {
alias_commands[i+1] = com;
}
else {
if(sizeof(alias_commands) >= MAX_ALIAS_COMMANDS * 2) {
write("You can only have "+MAX_ALIAS_COMMANDS+" aliases.\n");
return 1;
}
alias_commands += ({ str, com, });
}
write("New Alias: "+str+" -> "+com+"\n");
return 1;
}
void remove_alias(string str) {
int i;
if((i = member_array(str,alias_commands)) != -1) {
if(i%2) {
write("Error in Removing Alias.\nAttempting Fix....\n");
remove_alias(alias_commands[i-1]);
return;
}
alias_commands = alias_commands[0..i-1]
+ alias_commands[i+2..sizeof(alias_commands)-1];
}
}
/***************************************************************************/
/* player logs */
status log_for_players(string file, string str){
string room_file, domain, creator_name, tmp;
if(!file) return 0;
if(!str) {
write("Give an argument.\n");
return 1;
}
room_file = file_name(environment());
log_file(file,"\n"+ query_name() +" ("+ room_file +"):\n");
log_file(file, str + "\n");
if(file == "Idea")
write("Please use the board in the council office for "+
"major game ideas.\n");
if((creator_name = creator(environment()))) {
write_file("/log/reports/"+ creator_name +".rep",
"Report Type: "+ file +" Room: "+ room_file +"\nTime: "+
ctime(time()) +"\n"+ pad_str("REPORT: ",str,75) +"\n");
}
write(file +" logged.\n");
return 1;
}
/***************************************************************************/
/* who */
status finger(string str) {
string who, mud, verb;
#ifdef INTERMUD
verb = query_verb();
if(sscanf(verb,"%s@%s", verb, mud)) {
call_other(UDP_CMD_DIR+"ping","ping",mud);
return 1;
}
#endif /* INTERMUD */
if(!str) {
write("Usage: finger <who>\n");
return 1;
}
#ifdef INTERMUD
#if (INTERMUD)
if(secure(SEC1))
#endif /* wizards only */
if(sscanf(str,"%s@%s",who,mud)) {
call_other(UDP_CMD_DIR+"finger","finger",who,mud);
return 1;
}
#endif /* INTERMUD */
call_other("/function/finger", "finger", str);
return 1;
}
string who() {
object *who;
int i, num_wiz;
string verb, mud;
string pn;
string str, new_str;
string sh;
status inetd_call;
#ifdef INTERMUD
if(previous_object() &&
file_name(previous_object()) == UDP_CMD_DIR+"who") {
inetd_call = 1;
}
else {
verb = query_verb();
#if (INTERMUD)
if(secure(SEC1))
#endif /* wizards only */
if(sscanf(verb,"%s@%s",verb,mud)) {
call_other(UDP_CMD_DIR +"who", "who", mud);
return "";
}
}
if(inetd_call)
str = "---- "+ MUD_NAME +" -------------------------------------------";
else
#endif /* INTERMUD */
str = "---- Welcome "+query_name()+" to "+ MUD_NAME +" ";
str += "---------------------------------------------------------------";
str = extract(str,0,75);
new_str = str +"\n";
who = filter_array(users(),"filter_users",this_object());
who = sort_array(who, "by_sec_level", this_object());
/* who list */
for(i = 0; i < sizeof(who); i++) {
if(!who[i]->query_security_level())
str = "[ "+ (string)who[i]->query_level() +" ]";
#ifdef QC
else if(member_array((string)who[i] -> query_name(1),QC) != -1)
str = "[ QC ]";
#endif /* QC */
else if((int)who[i] -> query_security_level() >= SEC9)
str = "[ADMIN]";
else if((int)who[i] -> query_security_level() >= SEC8)
str = "[ARCH]";
else if((int)who[i] -> query_security_level() >= SEC7)
str = "[ELDER]";
else if((int)who[i] -> query_security_level() >= SEC6)
str = "[SENIOR]";
else if((int)who[i] -> query_security_level() >= SEC5)
str = "[LORD]";
else if((int)who[i] -> query_security_level() >= SEC4)
str = "[SAGE]";
else if((int)who[i] -> query_security_level() >= SEC3)
str = "[CREATOR]";
else if((int)who[i] -> query_security_level() >= SEC2)
str = "[APPREN]";
else
str = "[ASPIR]";
str += ".................";
str = extract(str,0,10);
if(who[i]->query_invis()) {
str = "#"+ str;
}
if(who[i]->query_security_level()) {
str += (string)who[i]->short();
}
else {
str += " "+(string)who[i]->query_name() +" ";
if(!who[i]->query_disguise_on())
str += (string)who[i]->query_lastname()+" ";
if(who[i]->query_security_level())
str += " "+who[i]->query_al_title()+" ";
else
str += " ";
}
#ifdef PARTY_DAEMON
if(present("party_object", who[i])) {
if((string)present("party_object",who[i])->query_leader()
== (string)who[i]->query_name(1))
str += " (Leader: ";
else
str += " (Member: ";
str += ((string)who[i]->query_party())+")";
}
#endif /* PARTY_DAEMON */
str = extract(str,0,75);
if(!ansi_on || inetd_call)
str = filter_ansi(str);
else
str = str+OFF;
new_str += str +"\n";
}
/* Bottom line */
who = filter_array(who,"filter_wizards",this_object());
num_wiz = sizeof(who);
if(!i) {
str = "---- There are no players ";
}
if(i == 1) {
if(inetd_call)
str = "---- There is 1 player ";
else
str = "---- You are all alone ";
}
else {
if(i - num_wiz == 1) {
str = "---- There is 1 player ";
}
else {
str = "---- There are "+ (i-num_wiz) +" players ";
}
if(num_wiz == 1)
str += "and 1 creator ";
else
str += "and "+ num_wiz +" creators ";
}
str += "-------------------------------------------------------------";
str = extract(str,0,75);
new_str += str +"\n";
if(!inetd_call) {
#ifdef PAGER
object pager;
pager = clone_object(PAGER);
#ifdef NATIVE_MODE
pager->move(this_object());
#else
move_object(pager, this_object());
#endif /* NATIVE_MODE */
pager->page(new_str);
#else
write(new_str);
#endif /* PAGER */
}
return new_str;
}
/***********************************************************************/
/* emote */
status emote(string str) {
string verb;
verb = query_verb();
if(!str) str = "";
if(verb[0] == ":"[0]) str = extract(verb, 1) + " " + str;
if(str == "" || str == " ") {
write("Usage: emote <msg>\n");
return 1;
}
str = filter_ansi(str); /* always filtered */
write("You emote: " + query_name() +" "+ str +"\n");
if(security_level)
say(query_name() +" "+ str +"\n");
else
say("::"+query_name() +" "+ str +"\n");
return 1;
}
/************************************************************************
* tell
* Note that due to psionics the 'tell' command is no longer valid for
* standard communications
*/
static status tell(string str){
object ob;
string who, msg, mud;
if(ghost) {
write("Your ethereal vocal chords fail you...\n");
return 1;
}
if(!secure(SEC1)) {
write("Tell is only used for intermud chat.\n");
return 1;
}
#ifdef INTERMUD
#if (INTERMUD)
if(secure(SEC1))
#endif
if(sscanf(who,"%s@%s", who, mud) == 2) {
call_other(UDP_CMD_DIR+"tell","tell",who,mud,msg);
return 1;
}
#endif /* INTERMUD */
write("Tell is for use with Intermud only.\n");
#ifdef INTERMUD
write("Intermud is currently enabled.\n");
#else
write("Intermud is not currently enabled.\n");
#endif /* INTERMUD */
write("Usage: tell <who>@<mudname> <message>\n");
return 1;
}
/****************************************************************************/
/* whisper */
static status whisper(string str){
object ob;
string who, msg;
if(ghost) {
write("Your ethereal voice fails you..\n");
return 1;
}
if(!str || !sscanf(str, "%s %s", who, msg)) {
write("Usage: whisper <who> <msg>\n");
return 1;
}
ob = find_living(lower_case(who));
if(!ob || !present(ob, environment())) {
write("There is no "+who+" here.\n");
return 1;
}
if(!ob->ansi_on())
msg = filter_ansi(msg);
else
msg += OFF; /* turn ansi off */
tell_object(ob, query_name() +" whispers to you: "+ msg +" \n");
write("You whisper: "+msg+"\n");
say(query_name() +" whispers something to "+ capitalize(who) +".\n", ob);
return 1;
}
/**************************************************************************/
/* shout */
static status shout_to_all(string str) {
string str1, str2, char;
int i;
if(!str) {
write("You shout.... nothing.\n");
return 1;
}
if(query_name(1) == "guest") {
write("I'm sure you don't have anything to shout about yet...\n");
return 1;
}
if(age < 30 * 60) {
write("A youngster like you, shouting?\n");
return 1;
}
if(ghost) {
write("Your ethereal vocal chords arn't strong enough...\n");
return 1;
}
if(!speak_language) speak_language = "common";
/* the ansi code [0m switches off ansi graphics */
if(speak_language == "common") {
check_shout(query_name()+" shouts from "+
lower_case((string)environment()->short()) +
": "+str+"\n");
write("You shout: "+ str +"\n");
}
else {
check_shout(query_name() +" shouts in "+speak_language+
": "+ str +" \n",speak_language);
write("You shout in "+speak_language+": "+ str +"\n");
}
return 1;
}
/***************************************************************************/
status save_character() {
save_me(1);
write("Saving...\n");
return 1;
}
/**************************************************************************/
/* Mud Logon - calls logon() first */
/**************************************************************************/
static void time_out() {
write("Time out\n");
destruct(this_object());
}
static status logon() {
cat(WELCOME);
write("Using HEAVEN7 "+ MUD_VERSION +" Mudlib. ");
write("Running on a "+ version() +" Driver.\n");
if((sizeof(users()) == 1))
write("You are the first to logon!\n");
else if(sizeof(users()) == 2)
write("There is 1 person currently connected.\n");
else
write("There are "+(sizeof(users()) -1)+" people currently connected!\n");
write("Valid commands are: [1] Create New Character \n"+
" [2] Logon as existing Character \n"+
" > ");
input_to("logon1");
call_out("time_out", 90);
return 1;
}
#ifdef LOCK_OUT
void destruct_lock_out() {
destruct(this_object());
}
#endif /* LOCK_OUT */
static void logon1(string str) {
int i;
sscanf(str, "%d", i);
if(i == 1) {
cat(INTRO);
write("Enter a name for your new character > ");
input_to("logon2");
return;
}
if(i == 2) {
write("Enter your name > ");
input_to("logon2");
return;
}
write("Invalid Command.\n"+
"Commands are: [1] Create new character.\n"+
" [2] Enter as existing character.\n"+
" > ");
input_to("logon1");
return;
}
static void logon2(string str) {
int i, length;
if(!str || str == "") {
remove_call_out("time_out");
destruct(this_object());
return;
}
str = lower_case(str);
if(str == "logon") {
write("Invalid name.\n");
remove_call_out("time_out");
logon1(0);
return;
}
if((length = strlen(str)) > MAX_CHAR_NAME) {
write("Name is too long (max. "+MAX_CHAR_NAME+" characters).\n");
remove_call_out("time_out");
logon1(0);
return;
}
for(i = 0; i < length; i++) {
if(str[i] < 'a' || str[i] > 'z') {
write("Invalid characters in name.\n");
remove_call_out("time_out");
logon1(0);
return;
}
}
if(restore_object("banish/" + str)
&& !restore_object(SAVE_NO_BANISH+ str)) {
write("Sorry, but that name is banned from play.\n");
remove_call_out("time_out");
logon1(0);
return;
}
name = str;
if(!restore_me() && name != "guest") {
write("\nCreating new character...\n"+
"Welcome "+ capitalize(name) +" !!\n");
level = -1; /* so we know you've just logged in! */
}
if(sizeof(users()) >=
MAX_USERS+sizeof(filter_array(users(),"filter_wizards",this_object()))) {
if(!secure(SEC1)) {
write("Sorry, "+ MUD_NAME +" is currently full.\n"+
"Perhaps someone might log out soon?\n");
remove_call_out("time_out");
destruct(this_object());
return;
}
else {
write(MUD_NAME +" is at Maximum Players.\nCreators accepted.\n");
}
}
#ifdef LOCK_OUT
if(security_level < LOCK_OUT && security_level < SEC9) {
write(
MUD_NAME +" is temporarily closed.\n"+
"We appologise for any inconvenience.\n\n");
remove_call_out("time_out");
call_out("destruct_lock_out",5);
return;
}
else {
write("We are in Player Lock Out. Creator name accepted.\n");
}
#endif /* LOCK_OUT */
if(name == "guest") {
int guest_num;
for(i = 0; i < sizeof(users()); i++) {
if((string)users()[i]->query_name(1) == "guest") guest_num += 1;
}
if(guest_num > MAX_NUM_GUESTS) {
write("Sorry, there are too many Guests.\n");
remove_call_out("time_out");
destruct(this_object());
return;
}
dead = 0;
ghost = 0;
remove_call_out("time_out");
logon7();
return;
}
if(level != -1)
write("Please enter your password > ");
else
write("Please enter a password for your character of atleast 6 characters.\n"+
" > ");
input_to("check_password", 1);
return;
}
static void check_password(string p) {
write("\n");
if(++password_check >= PASSWORD_CHECK) {
write("\nThat was your last try!\n");
remove_call_out("time_out");
destruct(this_object());
return;
}
if(!p || p == "") {
write("Please enter a unique password > ");
input_to("check_password",1);
return;
}
if(!password) {
new_password(p);
return;
}
if(crypt(p, password) != password) {
write("\nWrong password!"+
" (You have "+(PASSWORD_CHECK-password_check)+" attempts left) > ");
input_to("check_password",1);
return;
}
remove_call_out("time_out");
# ifdef LOG_ENTER
log(LOG_ENTER, "Exit:"+ name +", Exp: "+ experience+
" Lvl: "+ level +
" Gld: "+ money,0);
# endif /* LOG_ENTER */
logon3();
}
static void new_password(string p){
write("\n");
if(!p || p == "") {
write("Please enter unique password > ");
input_to("check_password",1);
return;
}
if(strlen(p) < 6) {
write("The password must have at least 6 characters.\n");
input_to("new_password", 1);
write("Please enter password > ");
return;
}
if(!password) {
password = p;
input_to("new_password", 1);
write("Password (again to confirm) > ");
return;
}
remove_call_out("time_out");
if(password != p) {
write("You changed !\n");
destruct(this_object());
return;
}
password = crypt(password,0); /* Generate new seed. */
save_me(0);
logon3();
}
static void logon3() {
if(!email || email == "") {
write(
"You must enter a valid Email address so that the administration \n"+
"can keep track of you. \n"+
"> ");
input_to("logon4");
return;
}
logon5();
}
static void logon4(string maddr) {
string tmp1, tmp2;
if(!maddr || maddr == "" ||
!sscanf(maddr, "%s@%s", tmp1, tmp2)) {
write("You must enter a valid email address!\n");
destruct(this_object());
return;
}
email = maddr;
save_me(0);
logon5();
}
static void logon5() {
if(!(gender == 1 || gender == 2)) {
write("Is your character Male or Female? > ");
input_to("logon6");
return;
}
logon7();
}
static void logon6(string gender_str) {
gender_str = lower_case(gender_str);
if(gender_str[0] == 'm') {
write("Welcome, Sir!\n");
gender = 1;
}
else if (gender_str[0] == 'f') {
write("Welcome, Madam!\n");
gender = 2;
}
else {
write("Sorry, but thats too weird for this place!\n");
write("Are you, Male or Female? (type m or f) > ");
input_to("logon5");
return;
}
save_me(0);
logon7();
}
static void logon7(){
if(name == "guest") {
gender = random(2) + 1; /* random male or female */
race = 0;
}
if(!race) {
write("What race do you wish to be? (Type '~h' for help) \n"+
"Dwarf, Elf, Half Giant, Halfling, Human, Minotaur, Gnome, or Orc?\n"+
"> ");
input_to("logon8");
return;
}
logon8_describe_me();
}
static void logon8(string str) {
if(str == "~h") {
cat(RACE_INFO);
logon7();
return;
}
if(lower_case(str) == "elf") {
write("There are several elvish races.\n"+
"High Elf, Grey Elf, Dark Elf, Wood Elf, Wild Elf, Half Elf > ");
input_to("logon8_validate_race");
return;
}
else if(lower_case(str) == "gnome") {
write("There are several gnomish races.\n"+
"Forest Gnome, Rock Gnome, Deep Gnome (also known as Svirfneblin) > ");
input_to("logon8_validate_race");
return;
}
else if(lower_case(str) == "dwarf") {
write("There are several dwarvish races.\n"+
"Mountain Dwarf, Hill Dwarf > ");
input_to("logon8_validate_race");
return;
}
else
logon8_validate_race(str);
}
static void logon8_validate_race(string str) {
if(!str || str == "") {
logon7();
return;
}
str = lower_case(str);
if(member_array(str,VALID_RACES) == -1) {
write("Sorry, that race is too wierd for this game.\n");
logon7();
return;
}
set_race(str);
save_me(0);
logon8_describe_me();
}
static void logon8_describe_me() {
if(!strlen(description)) {
line = 1;
new_text = "";
write ("Enter the description of you character. \n"+
"When you are finished, type '**', or abort with '~q'.\n");
write ("1] ");
input_to ("logon8_get_desc");
return;
}
logon9_log_wizard();
return;
}
static void logon8_get_desc(string arg) {
if(arg == "~q") {
write ("Description aborted.\n");
logon9_log_wizard();
return;
}
if(arg == "**") {
description = new_text;
write("New description:\n"+((description == "") ? "Cleared" : description));
logon9_log_wizard();
return;
}
new_text = new_text+arg+"\n";
write (++line+"] ");
input_to ("logon8_get_desc");
}
static void logon9_log_wizard() {
if(secure(SEC1)) {
other_copy = this_object();
clone_object(WIZARD);
return;
}
logon9(0);
}
status query_entering() { return entering; }
static void move_enter(object where) {
int in_prison;
entering = 1;
if(objectp(where)) {
tell_room(where,"The statue of "+ query_name() +" starts to move!\n");
move_object(this_object(),where);
entering = 0;
look(0,0);
return;
}
else if(enter_room) {
move_player("X#"+enter_room);
if(!secure(SEC1)) enter_room = 0; /* reset enter room */
}
else if (!secure(SEC1))
move_player("X#"+DEFAULT_ENTER);
else
move_player("X#"+DEFAULT_WIZ_ENTER);
entering = 0;
}
/* It is CRITICAL that nothing fails in logon9?() functions, and if
* they do they still allow loading of the wizard object!!
* So CATCH() any clones, moves, and call_others.
*
* Zilanthius.
*/
static void logon9(object where) {
object ob;
string tmp_name;
status new_mail_flag;
int k;
tmp_name = name;
name = 0;
other_copy = find_player(tmp_name);
name = tmp_name;
if(other_copy && name != "guest") {
write("Your character seems to already be in the game !\n");
write("Do you still wish to log back in ? (y/n) > ");
input_to("logon9_throw_out_other_copy");
return;
}
enable_commands();
set_living_name(lower_case(name));
time_to_save = age + SAVE_TIME; /* set time before starting heart */
set_heart_beat(1);
if(!alias_name) alias_name = capitalize(name);
add_standard_commands();
if(tot_value && !where) {
write("You find " + tot_value + " coins of your lost money!\n");
money += tot_value;
tot_value = 0;
}
if(lower_case(name) != "tester")
if(!where) { /* We don't want to see it if we */
#if defined(AMYLAAR) || defined(MUDOS_DR)
cat(NEWS);
if(secure(SEC1)) {
cat(WIZNEWS);
}
#else
cat(NEWS);
if(secure(SEC1)) cat(WIZNEWS);
#endif /* AMYLAAR */
}
if(catch(move_enter(where))) {
write("Entry Room Failure!\n");
move_object(this_object(),"room/void");
}
entering = 0; /* failsafe */
if(!where) load_auto_obj();
if(is_invis && !secure(SEC2)) is_invis = 0;
if(!is_invis) {
if(!where) check_shout(capitalize(name)+" enters the world.\n");
}
else {
write("\nYOU ARE INVISIBLE !\n\n");
}
if(query_ip_number() != called_from_ip && called_from_ip)
write("Your last login was from " + called_from_ip + "\n");
if(last_login_time && !where) {
last_login = ctime(time());
write("Your last login was on "+ ctime(last_login_time) +".\n");
}
last_login_time = time();
called_from_ip = query_ip_number();
if(level == -1) { /* new player */
level = 1;
money = 250;
heal_self(200);
#ifdef PURGE
purge = 1;
#endif /* PURGE */
}
recalc_carry();
recalc_ac();
recalc_wc();
save_me(0);
#ifdef SOUL
#ifdef NATIVE_MODE
if(catch(clone_object(SOUL)->move(this_object()))) {
#else
if(catch(move_object(clone_object(SOUL),this_object()))) {
#endif /* NATIVE_MODE */
write("Error in loading Soul.\n");
}
#endif /* SOUL */
#ifdef MAILER
if(catch((new_mail_flag = (status)call_other(MAILER,"new_mail",name)))) {
write("Error in querying Mail.\n");
}
if(new_mail_flag > 0) {
write("You have New mail.\n");
}
#ifdef MAIL_FIELD_LOADER /* for default mailing fields, admin, arch etc */
catch(call_other(MAIL_FIELD_LOADER,"add_to_mail_field",name,security_level));
#endif /* MAIL_FIELD_LOADER */
#endif /* MAILER */
#ifdef PURGE
if(!purge) {
weapon_prof = ({});
if(level > 3) {
if(catch(call_other(PURGE, "purge"))) {
write("Error in purging character.\n");
}
heal_self(200);
savings = 0;
}
}
purge = 1;
#endif /* PURGE */
#ifdef PARTY_DAEMON
if(party) {
if(catch(call_other(PARTY_DAEMON, "???"))) {
write("Error in party object.\n");
party = 0;
return;
}
if(!call_other(PARTY_DAEMON, "query_party", party)) {
write("The '"+party+"' party has been disbanded!\n");
party = 0;
return;
}
if(!call_other(PARTY_DAEMON, "get_party_object", party)) {
write("You are no longer a member of the '"+party+"' party!\n");
party = 0;
}
}
#endif /* PARTY_DAEMON */
#ifdef SAVE_OBJECTS_ON_QUIT
for(k=0; k<sizeof(saved_items); k++) {
ob = clone_object(saved_items[k][0]);
move_object(ob, this_object());
ob -> set_all_info(saved_items[k][1]);
ob -> init();
}
/* well... it looks nice 8) */
saved_items = ({ });
#endif /* SAVE_OBJECTS_ON_QUIT */
}
/* used by monster.c */
static void logon9_throw_out_other_copy(string str) {
string fname1, fname2;
object *inv, where;
int i, j;
if(str == "" || (str[0] != 'y' && str[0] != 'Y')) {
write("Welcome another time then !!\n");
destruct(this_object());
return;
}
if(other_copy) {
enable_commands();
sscanf(file_name(this_object()),"%s#%d",fname1,i);
sscanf(file_name(other_copy),"%s#%d",fname2,i);
inv = all_inventory(other_copy);
if((j=sizeof(inv)) > 30)
write("Warning: Only transferring first thirty items from other copy\n");
for(i = j; i--;) { /* so same order as old copy */
int wt;
if(inv[i]->id("soul")) continue;
inv[i]->drop();
if(!inv[i]) continue;
wt = (int)inv[i]->query_weight();
if(add_weight(wt)) {
#ifdef NATIVE_MODE
if(inv[i]) inv[i]->move(this_object());
#else
if(inv[i]) move_object(inv[i], this_object());
#endif /* NATIVE_MODE */
}
}
where = environment(other_copy);
if(fname1 == fname2) {
other_copy->save_me(0);
}
destruct(other_copy); /* force the issue */
}
if(restore_me() && fname1 == fname2) {
write("Attempting to restore points from other copy...\n");
}
else {
if(security_level) {
write("Granting Creator Powers.\n");
}
}
logon9(where);
}
/***************************************************************************/
/* Fn's called by various actions */
/***************************************************************************/
/* save_me() - all players saves are thru' this fn */
void save_me(status value_items) {
if(value_items) {
if(money > level * MONEY_PER_LEVEL) {
tell_object(this_object(),
"You feel you have a hole in your money pouch...\n");
money = level * MONEY_PER_LEVEL;
}
tot_value = compute_values(this_object());
}
else {
tot_value = 0;
}
compute_auto_str();
if((int)MASTER->master_file_size(SAVE_NO_BANISH+ query_name(1) +".o") > 0) {
save_object(SAVE_NO_BANISH+ query_name(1));
}
else if(security_level) {
save_object(SAVE_WIZARD+lower_case(name));
if(SAVE_WIZARD != SAVE_FIRST) {
MASTER->master_remove_file("/"+SAVE_FIRST+query_name(1)+".o");
}
if(SAVE_WIZARD != SAVE_PLAYER) {
MASTER->master_remove_file("/"+SAVE_PLAYER+query_name(1)+".o");
}
}
else if(level < 2) {
save_object(SAVE_FIRST+lower_case(name));
if(SAVE_FIRST != SAVE_PLAYER) {
MASTER->master_remove_file("/"+SAVE_PLAYER+query_name(1)+".o");
}
}
else {
save_object(SAVE_PLAYER+lower_case(name));
if(SAVE_PLAYER != SAVE_FIRST) {
MASTER->master_remove_file("/"+SAVE_FIRST+query_name(1)+".o");
}
}
}
/*************************************************************************/
/* restore_me() - all player restores are thru' this fn */
status restore_me() {
if(restore_object(SAVE_NO_BANISH + lower_case(name))) return 1;
if(restore_object(SAVE_WIZARD+lower_case(name))) return 1;
if(restore_object(SAVE_PLAYER+lower_case(name))) return 1;
if(restore_object(SAVE_FIRST+lower_case(name))) return 1;
if(restore_object("usr/"+lower_case(name))) return 1;
return 0; /* New player */
}
/****************************************************************************/
/* The reverse of loggin on */
status quit(mixed arg) {
if(stringp(arg)) arg = 0;
remove_call_out("quit");
if(name == "guest") {
destruct(this_object());
return 1;
}
set_heart_beat(0); /* kill heart beat */
#ifdef LOG_SNOOPERS
if(query_snoop(this_object())) log(LOG_SNOOPERS,"Quit broke snoop",0);
#endif /* LOG_SNOOPERS */
#ifdef LOG_QUITS
if(previous_object()) log(LOG_QUITS,"Quit called externally",0);
#endif /* LOG_QUITS */
#ifdef LOG_ENTER
log(LOG_ENTER, "Exit:- Exp: "+ experience+
" Lvl: "+ level +
" Gld: "+ money,0);
#endif /* LOG_ENTER */
if(!secure(SEC1)) is_invis = 0;
if(!is_invis) {
check_shout(query_name() + " left the world.\n");
}
write("Saving....\n");
#ifdef DESTRUCT_INV_ON_QUIT
save_me(1);
destruct_all_inventory(this_object());
#else
save_me(arg);
if(secure(SEC1)) {
destruct_all_inventory(this_object());
write("Destructing excess equipment on quit for creator...\n");
}
move_or_destruct_inventory(this_object());
#endif
rm(PASTE);
destruct(this_object());
return 1;
}
status Quit() {
object *inv;
int i, j, k;
saved_items = ({ }); /* initialise the array */
if(environment()) {
string file;
file = (string)query_current_room();
if(sscanf(file,"%s#%d",file,i) == 2
|| environment()->query_no_summon() || environment()->query_no_teleport()){
write("A magical instability prevents you from returning to here!\n");
}
else {
write("You will return to this location.\n");
enter_room = file;
#ifdef SAVE_OBJECTS_ON_QUIT
inv = all_inventory(this_object());
for(i=0; i<sizeof(inv); i++) {
if(!inv[i]->short()) continue;
if(inv[i]->id("spell")) continue;
if(inv[i]->query_auto_load()) continue;
sscanf(file_name(inv[i]), "%s#%d", file, k);
if((string)inv[i]->query_object_type() == "Container")
inv += all_inventory(inv[i]);
saved_items += ({
({ file, (mapping)inv[i]->query_all_info(), }),
});
destruct(inv[i]);
}
#endif /* SAVE_OBJECTS_ON_SAVE */
}
}
quit(0);
return 1;
}
/**************************************************************************/
/* compute monetry value of inventory */
int compute_values(object ob) {
int total_value;
object *inv;
int i;
if(!ob) ob = this_object();
inv = all_inventory(ob);
for(i =0; i < sizeof(inv); i++) {
if(inv[i]) {
total_value += compute_values(inv[i]);
total_value += (int)inv[i]->query_value()/2;
}
}
return total_value;
}
/***************************************************************************/
/* move or destruct inventory to environment */
static void move_or_destruct_inventory(object ob) {
int i, wt;
object *inv, env;
if(!(env = environment(ob))) {
destruct_all_inventory(ob);
return;
}
inv = all_inventory(ob);
for(i = sizeof(inv); i--; ) {
if(inv[i]) {
if(inv[i]->drop(1)) {
if(inv[i]) destruct(inv[i]);
}
else {
if(inv[i]) {
wt = (int)inv[i]->query_weight();
ob->add_weight(wt*(-1));
#ifdef NATIVE_MODE
inv[i]->move(env);
#else
move_object(inv[i], env);
#endif /* NATIVE_MODE */
env->add_weight(wt);
}
}
}
}
}
/***************************************************************************/
/* destruct inventory */
static void destruct_all_inventory(object ob) {
int i, size;
object *inv;
inv = all_inventory(ob);
for(i = 0, size = sizeof(inv); i < size; i++) {
if(inv[i]) destruct_all_inventory(inv[i]);
if(inv[i]) destruct(inv[i]);
}
}
/****************************************************************************/
/* renews player object */
void get_new_player_object() {
int i;
string fname;
save_me(0);
sscanf(file_name(this_object()),"%s#%d",fname,i);
if(!(fname == WIZARD || fname == PLAYER)) return;
other_copy = this_object();
#ifdef LOG_RENEWALS
log(LOG_RENEWALS, fname, ((security_level) ? WIZARD : PLAYER));
#endif LOG_RENEWALS
if(security_level)
clone_object(WIZARD);
else
clone_object(PLAYER);
}
/**********************************************************************/
/* make_path - for players */
string make_path(string file) {
string tmp1, tmp2;
string *path_split;
int i;
if(sscanf(file,"%s..%s", tmp1, tmp2)) {
#ifdef OLD_EXPLODE
path_split = explode(file+"/","/");
#else
path_split = explode(file,"/");
#endif /* OLD_EXPLODE */
while((i = member_array("..",path_split)) != -1) {
path_split = path_split[0..i-2]+path_split[i+1..sizeof(path_split)-1];
}
file = "/" +implode(path_split,"/");
while(sscanf(file, "%s//%s", tmp1, tmp2)) file = tmp1 + "/" + tmp2;
}
return file;
}
/*****************************************************************************/
/* A NO valid_read() restricted file_size */
static int FILE_SIZE(string file) {
return (int)MASTER->master_file_size(file);
}
/**************************************************************************/
/* shout_tell - called from check_shout() */
varargs void shout_tell(string str, string lang) {
if(!environment()) return;
if(this_object()->query_edit()
&& security_level >= (int)this_player()->query_security_level()) {
return;
}
if(!ansi_on)
str = filter_ansi(str);
else
str += OFF; /* turn ansi off */
if(!lang || query_language(lang)) tell_object(this_object(),str);
}
/***************************************************************************/
/* illegal patch */
void illegal_patch(string what) {
write("You are struck by a mental bolt from the interior of the world.\n");
#ifdef LOG_ILLEGAL
log(LOG_ILLEGAL,"Illegal: "+what,0);
#endif /* LOG_ILLEGAL */
}
/**************************************************************************/
/* filter_users - removes invis, and players logging in */
static status filter_users(object ob) {
int sec, lvl;
if(!environment(ob)) return 0;
sec = (int)ob->query_security_level();
lvl = (int)ob->query_level();
if(sec) {
if((ob->query_invis() && sec <= security_level) || !ob->query_invis()) {
return 1;
}
}
else {
if((ob->query_invis() && (lvl <= level || security_level))
|| !ob->query_invis()) {
return 1;
}
}
return 0;
}
status filter_wizards(object ob) {
return (ob->query_security_level()) ? 1 : 0;
}
/***************************************************************************/
/* sort by security level */
static status by_sec_level(object a, object b) {
if((int)a->query_security_level() == (int)b->query_security_level()
&& (int)a->query_level() < (int)b->query_level()) return 1;
return
((int)a->query_security_level() < (int)b->query_security_level()) ? 1 : 0;
}
/****************************************************************************/
/* autoload */
void load_auto_obj() {
object ob;
mixed *load;
int i;
load = autoload;
if(!load) return;
for(i = 0; i < sizeof(load); i++) {
if(catch((ob = clone_object(load[i][0])))) {
write("Error: Cannot load file.\n");
continue;
}
ob->init_arg(load[i][1]);
#ifdef NATIVE_MODE
ob->move(this_object());
#else
move_object(ob, this_object());
#endif /* NATIVE_MODE */
/*
#ifdef LOG_PLAYER_AUTO
if(!secure(SEC1)) log(LOG_PLAYER_AUTO,"Autoloaded: "+autoload[i][0],0);
#endif
*/
}
}
void compute_auto_str() {
object *ob;
int i, iarg;
mixed auto_load_arg, arg;
string fname;
if(name == "guest") return; /* no autoload stuff for guests */
ob = all_inventory();
autoload = ({});
for(i = 0; i < sizeof(ob); i++) {
if((auto_load_arg = (mixed)ob[i]->query_auto_load())) {
if(intp(auto_load_arg)) { /* simple: return 1; */
sscanf(file_name(ob[i]),"%s#%d", fname, iarg);
arg = 0;
}
else if(stringp(auto_load_arg)) { /* old way */
if(sscanf(auto_load_arg,"%s:%s",fname,arg) != 2) {
tell_object(this_object(),
"Invalid auto load string! Object "+ file_name(ob[i]) +"\n" +
"Please report this!\n");
}
else {
sscanf(fname,"/%s",fname);
sscanf(fname,"%s.c",fname);
}
}
else if(pointerp(auto_load_arg)) { /* new way */
if(sizeof(auto_load_arg) == 2) {
fname = auto_load_arg[0];
arg = auto_load_arg[1];
}
}
autoload += ({ ({ fname, arg, }), });
}
}
}
/**************************************************************************/
/* more */
static status more(string file) {
object ob, ob2;
ob = clone_object(MORE_OB);
#ifdef NATIVE_MODE
ob->move(this_object());
#else
move_object(ob, this_object());
#endif /* NATIVE_MODE */
ob->more(file);
return 1;
}
/************************************************************************/
/* cat */
status cat_file(string path){
if(!path) return 0;
path = make_path(path);
if(!cat(path)) return 0;
return 1;
}
/**************************************************************************/
/* invis */
status toggle_invis(){
if(is_invis = !is_invis) {
is_invis = level;
say(query_name() +" "+ query_mmsgout() +".\n", this_object());
tell_object(this_object(), "You are now invisible.\n");
}
else {
tell_object(this_object(), "You are now visible.\n");
say(query_name() +" "+ query_mmsgin() +".\n", this_object());
}
return 1;
}
/**************************************************************************/
/* ansi */
status toggle_ansi(){
if(ansi_on = !ansi_on) {
tell_object(this_object(), "Ansi graphics Characters are not filtered.\n");
}
else {
tell_object(this_object(), "Ansi graphics Characters are filtered "+
"on shouts and tells.\n");
}
return 1;
}
/****************************************************************************/
/* no wimpy */
status toggle_no_wimpy() {
return no_wimpy = !no_wimpy;
}
/**************************************************************************/
/* ghost */
status toggle_ghost() {
if(!ghost) {
msgin = "drifts around";
msgout = "drifts";
ghost = 1;
}
else {
tell_object(this_object(),
"You feel a very strong force pulling your body back to reality...\n"+
"Your body solidifies in a more solid form!\n");
say(query_name() + "'s body begins to solidify...\n"+
query_name()+" appears whole once more!\n");
ghost = 0;
dead = 0;
msgin = "arrives";
msgout = "leaves";
}
save_me(1);
return 1;
}
/****************************************************************************/
/* security level routines */
nomask status security(int sec_level){
if(!query_ip_number(this_player())) return 0;
return ((int)this_player()->query_security() >= sec_level
|| this_player() == this_object()) ? 1 : 0;
}
nomask status secure(int sec_level) {
object user;
#ifdef AMYLAAR
if(!(user = (this_interactive()) ? this_interactive() : this_player())) {
return 0;
}
#else /* 3.1.2 or mudos */
if(!(user = (this_player(1)) ? this_player(1) : this_player())) {
return 0;
}
#endif
if(!query_ip_number(user)) return 0;
return ((int)user->query_security() >= sec_level) ? 1 : 0;
}
nomask int query_security() {
return security_level;
}
nomask int query_security_level() {
return security_level;
}
nomask int set_security_level(int new_level) {
string str;
int old_level;
object wiz_creator;
old_level = security_level;
if(!this_player() || !interactive(this_player())
|| previous_object() != this_player()) {
write("Use the 'promote' command.\n");
return 0;
}
if(secure(SEC9)) {
if(security_level < SEC9 || new_level > security_level) {
security_level = new_level;
} /* demotion of admin is done by hand */
}
else if((secure(SEC8) && new_level < SEC8) /* arches make elders */
|| (secure(SEC7) && new_level < SEC6) /* elders make lords */
|| (secure(SEC5) && new_level < SEC4)) { /* lords make creators */
security_level = new_level;
}
if(old_level == security_level) {
write("It is not possible for you to promote "+ query_cap_name()
+" to a higher security level.\n");
return security_level;
}
str = (security_level >= SEC9)
? "an Administator"
: (security_level >= SEC8)
? "an Arch"
: (security_level >= SEC7)
? "an Elder"
: (security_level >= SEC6)
? "a Senior"
: (security_level >= SEC5)
? "a Lord"
: (security_level >= SEC4)
? "a Sage"
: (security_level >= SEC3)
? "a Creator"
: (security_level >= SEC2)
? "an Apprentice Creator"
: "an Aspirant Creator";
tell_object(this_object(),"You have become "+str+".\n");
#ifdef WIZ_SCROLL
if(security_level <= SEC1) {
object scroll;
scroll = clone_object(WIZ_SCROLL);
#ifdef NATIVE_MODE
scroll->move(this_object());
#else
move_object(scroll, this_object());
#endif /* NATIVE_MODE */
write(
"You have been given a scroll containing valuable information.\n"+
"Read it, and the docs that it outlines, now!\n\n"+
"Don't seek an Elder for further advancement UNTIL you have read it\n");
}
#endif
/* Note: master.c has been changed for create_wizard() */
create_wizard(query_name(1));
save_character();
write("You have promoted "+ query_name(1) +" to "+ str +".\n");
write("Security Level: "+ security_level +"\n");
#ifdef LOG_SPONSER
log(LOG_SPONSER,"Lvl: "+ level +", Sec Lvl: "+ old_level,
"Sec Level: "+ security_level);
#endif
if(old_level < SEC3) {
tell_object(this_object(),"Adding Wizard Commands....\n");
get_new_player_object();
}
return security_level;
}
/**********************************************************************/
/* adds */
void set_savings(int s) { savings = s; }
int add_savings(int s) {
return savings += s;
}
int add_exp(int e) {
if(e > level*MAX_XP_PER_LVL) e = level*MAX_XP_PER_LVL;
e = (e * (max_hp - whimpy))/max_hp; /* wimpy reduces exp */
if(e > 0) total_exp += e;
return ::add_exp(e);
}
int add_intoxication(int i) {
return intoxicated = (intoxicated + i < 0) ? intoxicated + i : 0;
}
int add_stuffed(int i) {
return stuffed = (stuffed + i < 0) ? stuffed + i : 0;
}
int add_soaked(int i) {
return soaked = (soaked + i < 0) ? soaked + i : 0;
}
void add_alignment(int a) { /* This happens when you kill something! */
if(secure(SEC1)) return;
if(!intp(a)) return;
if(!intp(alignment)) alignment = 0;
alignment = a + (alignment * 9)/10;
al_title = (alignment > NEUTRAL_AL * 100)
? "(Lawful Good)"
: (alignment > NEUTRAL_AL * 20)
? "(Lawful Neutral)"
: (alignment > NEUTRAL_AL * 4)
? "(Neutral Good)"
: (alignment > - NEUTRAL_AL * 4)
? "(True Neutral)"
: (alignment > - NEUTRAL_AL * 20)
? "(Chaotic Neutral)"
: (alignment > - NEUTRAL_AL * 100)
? "(Neutral Evil)"
: "(Chaotic Evil)";
}
/************************************************************************/
/* scars */
static void make_scar() {
if (level < 10) return;
scar |= 1 << random(MAX_SCAR);
}
void remove_scar() {
scar = 0;
}
void show_scar() {
int i, j, first, old_value;
string *scar_desc;
scar_desc = ({
"left leg", "right leg", "nose", "left arm", "right arm",
"left hand", "right hand", "forhead", "left cheek",
"right cheek",
});
old_value = scar;
for(j = 1,first = 1; i < MAX_SCAR;j *= 2,i++) {
if(scar & j) {
old_value &= ~j;
if(first) {
write(query_name() +" has a scar on "+ query_possessive() +
" " + scar_desc[i]);
first = 0;
}
else if(old_value) {
write(", " + query_possessive() + " " + scar_desc[i]);
}
else {
write(" and " + query_possessive() + " " + scar_desc[i]);
}
}
}
if(!first) write(".\n");
}
/**************************************************************************/
/* second_life */
status second_life() {
object death_mark;
int i;
if(security_level) {
tell_object(this_object()," YOU DIE....luckily\n");
tell_object(this_object(),"Your arcane powers protect you from death.\n");
dead = 0;
return 1;
}
if(secure(SEC1)) {
illegal_patch("second_life");
}
make_scar();
toggle_ghost();
if(this_player()->query_npc()) {
level -= (level < 2) ? 0 : 1;
strength -= (strength < 2) ? 0 : 1;
constitution -= (constitution < 2) ? 0 : 1;
dexterity -= (dexterity < 2) ? 0 : 1;
intelligence -= (intelligence < 2) ? 0 : 1;
wisdom -= (wisdom < 2) ? 0 : 1;
combat -= (combat < 2) ? 0 : 1;
charisma -= (charisma < 2) ? 0 : 1;
adj_constitution(0);
for(i = sizeof(classes); i--; ) {
call_other(this_object(),"second_life_"+ classes[i]);
}
}
msgin = "drifts around";
msgout = "drifts";
headache = 0;
intoxicated = 0;
stuffed = 0;
soaked = 0;
log_file("KILLS", name+"("+level+")"+", exp "+experience+
", killed by "+(string)this_player()->query_name(1)+
", Prev. Ob: "+ file_name(previous_object()) +
", creator: "+creator(this_player()) + "\n");
primary_attack = 0;
secondary_attacks = ({});
tell_object(this_object(),
"\n You slump to the ground in agony! \n"+
"\n YOU DIE... \n"+
" Your soul begins to leave your body... \n"+
"You have a strange feeling as you look on \n"+
" your own dead form from above. \n\n");
#ifdef DEATH_MARK
death_mark = clone_object(DEATH_MARK);
#ifdef NATIVE_MODE
death_mark->move(this_object());
#else
move_object(death_mark, this_object());
#endif /* NATIVE_MODE */
#endif /* DEATH_MARK */
save_me(0);
return 1;
}
/******************************************************************************/
/* drink alco */
int drink_alcohol(int drink_strength) {
string tmp1, tmp2;
int drink_bonus;
if(sscanf(race, "%sdwarf", tmp1)) drink_bonus = 2*(1+(constitution/5));
if(intoxicated + drink_strength - drink_bonus > constitution * 3) {
tell_object(this_object(),"You fail to reach the drink with your mouth.\n");
return 0;
}
intoxicated += drink_strength/2;
if(intoxicated < 0) intoxicated = 0;
if(!intoxicated && previous_object()
&& (string)previous_object()->query_object_type() != "Potion") {
tell_object(this_object(),"You are completely sober.\n");
}
else if(headache) {
headache = 0;
tell_object(this_object(), "Your headache disappears.\n");
}
if(intoxicated > max_headache) max_headache = intoxicated;
if (max_headache > 8) max_headache = 8;
return 1;
}
/**************************************************************************/
/* drink soft */
status drink_soft(int drink_strength) {
if(soaked + drink_strength > constitution * 8) {
tell_object(this_object(),
"You can't possibly drink that much right now!\n" +
"You feel crosslegged enough as it is.\n");
return 0;
}
soaked += drink_strength * 2;
if(soaked < 0) soaked = 0;
if(!soaked && previous_object()
&& (string)previous_object()->query_object_type() != "Potion") {
tell_object(this_object(),"You feel a bit thirsty.\n");
}
return 1;
}
/**************************************************************************/
/* eat food */
status eat_food(int food_strength) {
if(stuffed + food_strength > constitution * 8) {
tell_object(this_object(),
"This is much too rich for you right now! Perhaps something lighter?\n");
return 0;
}
stuffed += food_strength * 2;
if(stuffed < 0) stuffed = 0;
if(!stuffed)
tell_object(this_object(),"Your stomach makes a rumbling sound.\n");
return 1;
}
/***********************************************************************/
/* Channel stuff. Not to be confused with intermud */
string *query_channels() { return channels; }
status query_channel(string channel) {
if(channel == "ooc") channel = "OOC";
if(channel == party) return 1;
return (member_array(channel, channels) != -1) ? 1 : 0;
}
status toggle_channel(string str) {
string *arr, tmp;
arr = (string *)CHANNEL_D->valid_channel(0);
tmp = implode(arr, " ");
if(!str) {
write("Usage: channel <valid channel>.\n");
write("Valid channels are: "+tmp+"\n");
return 1;
}
if(str == "ooc") str = "OOC";
if(query_channel(str)) {
write("Turning "+str+" off.\n");
chat_channel(str, ":leaves this channel.\n");
remove_channel(str);
return 1;
}
if(!(status)CHANNEL_D->valid_channel(str)) {
write("That is not a valid channel.\n");
write("Valid channels are: "+tmp+".\n");
return 1;
}
write("You start to listen to the "+str+" channel.\n");
add_channel(str);
chat_channel(str, ":joins the channel.\n");
return 1;
}
status chat_channel(string channel, string message) {
string verb;
status em;
object *arr;
int i;
if(message == "who") {
arr = users();
write(" Players on the "+capitalize(channel)+" channel\n");
write("-----------------------------------------------\n");
for(i=0; i<sizeof(arr); i++) {
if((status)arr[i]->query_channel(channel))
write(arr[i]->short()+"\n");
}
write("-----------------------------------------------\n");
return 1;
}
message = filter_ansi(message);
if(message[0] == ":"[0])
message = query_name()+" "+extract(message, 1);
else
message = query_name()+": "+message;
return (status)CHANNEL_D->chat_channel(channel, message);
}
void add_channel(string channel) {
if(channel == "ooc") channel = "OOC";
if(!query_channel(channel) && channel) channels += ({ channel, });
}
void remove_channel(string channel) {
int i;
if((i = member_array(channel,channels)) != -1) {
channels = channels[0..i-1]+channels[i+1..sizeof(channels)-1];
}
}
status valid_channel(string str) {
return (status)CHANNEL_D->valid_channel(str);
}
#ifdef INTERMUD
status intermud(string send_channel, string str, string mud) {
int i;
string verb, msg;
string cmd;
#if (INTERMUD)
if(!secure(SEC1)) return 0;
#endif /* WIZ_ONLY */
if(!str) {
write(" <channel> emote <msg> - do an emote on <channel>\n"+
" <channel> list - get list of channel users\n"+
" <channel> <msg> - send msg on <channel>\n"+
" intermud channel <channel> - toggle <channel> on|off\n"+
" intermud off - stop listening all channels\n"+
" <channel@mud> - send channel to only mudname\n\n");
write(pad_str("Currently Known Channels: ",
(string)call_other(UDP_CMD_DIR+"channel","known_channels") +".",75));
if(!(i = sizeof(channels))) {
write("No channels are currently open.\n");
}
else {
write(pad_str("You have "+i+" channel"+((i == 1) ? "" : "s")+" open: ",
implode(channels, ", ") +".", 75));
}
return 1;
}
if(str == "off") {
write("You stop listening to all channels.\n");
channels = ({});
return 1;
}
if(str == "list") cmd = "list";
if(sscanf(str,"emote %s",str) || sscanf(str,":%s",str)) cmd = "emote";
if(str == "channel") str += " "+ send_channel;
if(sscanf(str,"channel %s",str)) {
if(query_channel(str)) {
write("You stop listening to channel "+str+".\n");
remove_channel(str);
}
else {
write("You start listening to channel "+str+".\n");
add_channel(str);
}
return 1;
}
if(!sizeof(channels)) channels = ({ "intermud", });
call_other(UDP_CMD_DIR+"channel","channel", send_channel, str, cmd, mud);
return 1;
}
#endif /* INTERMUD */
/********************************************************************/
/* time for various time zones */
status show_time(string arg) {
int n;
n = time();
switch(arg) {
case "uk":
n = n-36000;
break;
case "usa":
n = n -54000;
break;
default:
arg = "aust";
break;
}
write("Time/date @" + arg + " is " + ctime(n) + ".\n");
return 1;
}
#ifdef AMYLAAR /* this is slightly better */
varargs
status move_player(string dir_dest,mixed optional_dest_ob,status safe) {
set_this_player(this_object());
return ::move_player(dir_dest,optional_dest_ob,safe);
}
#endif /* AMYLAAR */
/************************************************************************/
/* racial bargaining bonus */
int bargain_bonus() {
string tmp1, tmp2;
int bonus;
if(race) {
if(sscanf(race,"%self%s", tmp1, tmp2))
bonus -= 2;
else if(sscanf(race,"%sdwarf%s", tmp1, tmp2))
bonus -= 1;
else if(sscanf(race,"%sminotaur%s", tmp1, tmp2))
bonus -= 2;
else if(sscanf(race,"%sorc%s", tmp1, tmp2))
bonus -= 2;
else if(sscanf(race,"%sgiant%s", tmp1, tmp2))
bonus += 2;
else if(sscanf(race,"%shalfling%s", tmp1, tmp2))
bonus += 3;
else if(sscanf(race,"%skender%s", tmp1, tmp2))
bonus += 1;
else if(sscanf(race,"%spixie%s", tmp1, tmp2))
bonus += 2;
else if(sscanf(race,"%snixie%s", tmp1, tmp2))
bonus += 1;
else if(sscanf(race,"%skobold%s", tmp1, tmp2))
bonus -= 1;
else if(sscanf(race,"%sgoblin%s", tmp1, tmp2))
bonus -= 1;
else if(sscanf(race,"%ssprite%s", tmp1, tmp2))
bonus += 1;
}
return bonus + random((int)this_object()->query_appraisal());
}
#ifdef QUEST_ROOM
/* Player's Quest Stuff. v1.01 Ramses, November 1993
* v1.02 revised by Angel, March 1994.
*/
status query_quests(string what) {
if(!quests || !pointerp(quests)) quests = ({});
return (member_array(what, quests) == -1) ? 0 : 1;
}
string *query_done_quests() {
if(!quests) quests = ({});
return quests;
}
string assign_quest(string quest_id) {
string temp;
if(!quest_id) {
if(temp = (string)QUEST_ROOM->get_new_quest(this_object())) {
if(query_quests(temp)) return 0;
log_file("QUEST.INFO", name+": current quest "+temp+", assigned "+
ctime(time())+"\n");
current_quest = temp;
}
}
else if(interactive(this_player()) &&
(this_player()->query_security_level() > SEC6)) {
temp = quest_id;
current_quest = temp;
log_file("QUEST.INFO", name+": current quest "+temp+", set at "+
ctime(time())+", by "+(string)this_player()->query_name(1)+"\n");
}
return temp;
}
status finish_quest(string quest_id) {
object called_by;
int qp;
if(quest_id == current_quest) {
called_by = previous_object();
if(qp = (int)QUEST_ROOM->finish_quest(quest_id, called_by, this_object())){
quests += ({ quest_id, });
quest_points += qp;
log_file("QUEST.DONE", name+": finished quest "+current_quest+" at "+
ctime(time())+"\n");
current_quest = 0;
return 1; /* success! quest is now finished! */
}
}
return 0; /* failure to finish quest */
}
void quest_hint() {
string hint;
hint = (string)QUEST_ROOM->get_quest_hint(current_quest);
if(hint)
write(hint);
else
write("You do not currently have a quest.\n");
}
int query_quest_points() { return quest_points; }
int add_quest_points(int i) { return quest_points += i; }
int add_qpoints(int i) { return quest_points += i; }
string *query_all_quests() { return quests; }
string query_current_quest() { return current_quest; }
string query_curr_quest() { return current_quest; }
#endif /* QUEST_ROOM */
#ifdef ENABLE_PARSE_COMMAND
/* put & drop */
status parse_put(mixed *items, string prep, object container) {
int i, counter, num;
object *ob;
ob = ({ });
num = items[0];
for(i=1; i<sizeof(items); i++) {
/* get a counting of items */
if(num > 0) {
if(!present(items[i], this_player())) continue;
/* dont want to drop items we dont have */
if(++counter > num) break;
ob += ({ items[i], });
}
/* get the counter'th item */
else if(num < 0) {
if(!present(items[i], this_player()))
counter--;
if(counter == num) {
ob += ({ items[i], });
break;
}
}
else {
if(container)
if(!present(ob[i], container)) continue;
ob += ({ items[i], });
}
}
return (status)ACTIONS_BIN->drop_things(ob, prep, container);
}
status parse_pick_up(mixed *items, string prep, object container) {
int i, counter, num;
object *ob;
ob = ({ });
num = items[0];
for(i=1; i<sizeof(items); i++) {
/* get a counting of items */
if(num > 0) {
if(container)
if(!present(items[i], container)) continue;
if(++counter > num) break;
ob += ({ items[i], });
}
/* get the counter'th item */
else if(num < 0) {
if(container)
if(!present(items[i], container)) continue;
counter--;
if(counter == num) {
ob += ({ items[i], });
break;
}
}
else {
if(container)
if(!present(items[i], container)) continue; /* dont get it */
ob += ({ items[i], });
}
}
return (status)ACTIONS_BIN->get_things(ob, prep, container);
}
#else
status pick_up(string str) {
return actions::pick_up(str);
}
#endif /* ENABLE_PARSE_COMMAND */
#ifdef PING_PONG
status ping(string who) {
object ob;
if (!who) {
write("Ping whom?\n");
return 1;
}
ob = find_living(who);
if (!ob) {
write("No player with that name.\n");
return 1;
}
if (!(ob->catch_ping())) {
write("Can't ping "+ capitalize(who) +".\n");
return 1;
}
write("You ping "+ capitalize(who) +".\n");
return 1;
}
status catch_ping() {
string who;
int i;
if(this_object()->query_edit()
&& (int)this_player()->query_security_level()
< (int)this_object()->query_security_level()) {
return 0;
}
pinger = this_player();
who = (string)pinger->query_name(1);
if (!who) return pinger = 0;
tell_object(this_object(), capitalize(who) +" pings you.\n");
#if defined(AMYLAAR) || defined(MUDOS_DR)
for(i = 3; i--;) {
tell_object(this_object(), sprintf("%c",7));
}
#endif
return 1;
}
status pong() {
string who;
int i;
if (pinger) who = (string)pinger->query_name(1);
if (!(pinger && who)) {
pinger = 0;
write("No one has pinged you.\n");
return 1;
}
tell_object(pinger, (string)this_object()->query_name() + " pongs back.\n");
#if defined(AMYLAAR) || defined(MUDOS_DR)
for(i = 3; i--; ) {
tell_object(pinger, sprintf("%c",7));
}
#endif
pinger = 0;
write("You pong back to " + capitalize(who) + ".\n");
return 1;
}
#endif PING_PONG