// $Id: command5.cc,v 1.28.2.27 2000/05/13 19:42:56 greear Exp $ // $Revision: 1.28.2.27 $ $Author: greear $ $Date: 2000/05/13 19:42:56 $ // //ScryMUD Server Code //Copyright (C) 1998 Ben Greear // //This program is free software; you can redistribute it and/or //modify it under the terms of the GNU General Public License //as published by the Free Software Foundation; either version 2 //of the License, or (at your option) any later version. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // //You should have received a copy of the GNU General Public License //along with this program; if not, write to the Free Software //Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // To contact the Author, Ben Greear: greear@cyberhighway.net, (preferred) // greearb@agcs.com // ///********************** command5.cc ******************************/// #include "commands.h" #include "command2.h" #include "command3.h" #include "command4.h" #include "command5.h" #include "misc.h" #include "misc2.h" #include <stdio.h> #include "classes.h" #include "battle.h" #include "spec_prc.h" #include "spells.h" #include "skills.h" #include <fstream.h> #include "batl_prc.h" #include <PtrArray.h> #include <unistd.h> #include "load_wld.h" #include "SkillSpell.h" #include "script.h" #include "olc.h" #include "BuildInfo.h" #include "clients.h" int update_cur_in_game(critter& pc) { if (pc.isImmort() && (pc.IMM_LEVEL >= 9)) { //first, clear em all out! int i = 0; for (i = 0; i<NUMBER_OF_MOBS; i++) { if (mob_list[i].isInUse()) { mob_list[i].setCurInGame(0); }//if }//for for (i = 0; i<NUMBER_OF_ITEMS; i++) { if (obj_list[i].isInUse()) { obj_list[i].setCurInGame(0); }//if }//for init_loads(); pc.show("All done!\n"); }//if else { pc.show("Eh??"); } return 0; }//update_cur_in_game int page_break(int lines, critter& pc) { if (pc.isPc()) { pc.setLinesOnPage(bound(8, 10000, lines)); pc.show("Page break set.\n"); if (!pc.PC_FLAGS.get(22)) { pc.show("You are not using page breaks currently, use the toggle\n"); pc.show("command (toggle 'page breaks') to turn them on.\n"); }//if }//if else { pc.show("Eh?\n"); } return 0; }//page_break const String* getColorName(const char* ansi_code) { if (strcmp(ansi_code, ANSI_BLACK) == 0) return &ANSI_BLACK_S; else if (strcmp(ansi_code, ANSI_RED) == 0) return &ANSI_RED_S; else if (strcmp(ansi_code, ANSI_BLUE) == 0) return &ANSI_BLUE_S; else if (strcmp(ansi_code, ANSI_GREEN) == 0) return &ANSI_GREEN_S; else if (strcmp(ansi_code, ANSI_YELLOW) == 0) return &ANSI_YELLOW_S; else if (strcmp(ansi_code, ANSI_BLUE) == 0) return &ANSI_BLUE_S; else if (strcmp(ansi_code, ANSI_MAGENTA) == 0) return &ANSI_MAGENTA_S; else if (strcmp(ansi_code, ANSI_CYAN) == 0) return &ANSI_CYAN_S; else if (strcmp(ansi_code, ANSI_WHITE) == 0) return &ANSI_WHITE_S; //background colors now else if (strcmp(ansi_code, ANSI_BBLACK) == 0) return &ANSI_BBLACK_S; else if (strcmp(ansi_code, ANSI_BRED) == 0) return &ANSI_BRED_S; else if (strcmp(ansi_code, ANSI_BBLUE) == 0) return &ANSI_BBLUE_S; else if (strcmp(ansi_code, ANSI_BGREEN) == 0) return &ANSI_BGREEN_S; else if (strcmp(ansi_code, ANSI_BYELLOW) == 0) return &ANSI_BYELLOW_S; else if (strcmp(ansi_code, ANSI_BBLUE) == 0) return &ANSI_BBLUE_S; else if (strcmp(ansi_code, ANSI_BMAGENTA) == 0) return &ANSI_BMAGENTA_S; else if (strcmp(ansi_code, ANSI_BCYAN) == 0) return &ANSI_BCYAN_S; else if (strcmp(ansi_code, ANSI_BWHITE) == 0) return &ANSI_BWHITE_S; // else, unknown else return &NULL_STRING; }//getColorName int isValidColor(const char* color) { return ((strcasecmp(color, ANSI_BLACK_S) == 0) || (strcasecmp(color, ANSI_RED_S) == 0) || (strcasecmp(color, ANSI_GREEN_S) == 0) || (strcasecmp(color, ANSI_YELLOW_S) == 0) || (strcasecmp(color, ANSI_BLUE_S) == 0) || (strcasecmp(color, ANSI_MAGENTA_S) == 0) || (strcasecmp(color, ANSI_CYAN_S) == 0) || (strcasecmp(color, ANSI_WHITE_S) == 0) || (strcasecmp(color, ANSI_BBLACK_S) == 0) || (strcasecmp(color, ANSI_BRED_S) == 0) || (strcasecmp(color, ANSI_BGREEN_S) == 0) || (strcasecmp(color, ANSI_BYELLOW_S) == 0) || (strcasecmp(color, ANSI_BBLUE_S) == 0) || (strcasecmp(color, ANSI_BMAGENTA_S) == 0) || (strcasecmp(color, ANSI_BCYAN_S) == 0) || (strcasecmp(color, ANSI_BWHITE_S) == 0)); }//isValidColor const char* colorToAnsiCode(const char* color_name) { if (strcasecmp(color_name, ANSI_BLACK_S) == 0) return ANSI_BLACK; if (strcasecmp(color_name, ANSI_RED_S) == 0) return ANSI_RED; if (strcasecmp(color_name, ANSI_GREEN_S) == 0) return ANSI_GREEN; if (strcasecmp(color_name, ANSI_YELLOW_S) == 0) return ANSI_YELLOW; if (strcasecmp(color_name, ANSI_BLUE_S) == 0) return ANSI_BLUE; if (strcasecmp(color_name, ANSI_MAGENTA_S) == 0) return ANSI_MAGENTA; if (strcasecmp(color_name, ANSI_CYAN_S) == 0) return ANSI_CYAN; if (strcasecmp(color_name, ANSI_WHITE_S) == 0) return ANSI_WHITE; if (strcasecmp(color_name, ANSI_BBLACK_S) == 0) return ANSI_BBLACK; if (strcasecmp(color_name, ANSI_BRED_S) == 0) return ANSI_BRED; if (strcasecmp(color_name, ANSI_BGREEN_S) == 0) return ANSI_BGREEN; if (strcasecmp(color_name, ANSI_BYELLOW_S) == 0) return ANSI_BYELLOW; if (strcasecmp(color_name, ANSI_BBLUE_S) == 0) return ANSI_BBLUE; if (strcasecmp(color_name, ANSI_BMAGENTA_S) == 0) return ANSI_BMAGENTA; if (strcasecmp(color_name, ANSI_BCYAN_S) == 0) return ANSI_BCYAN; if (strcasecmp(color_name, ANSI_BWHITE_S) == 0) return ANSI_BWHITE; return ""; }//colorToAnsiCode int color(String& var, String& val_rough, critter& pc) { String val; String buf(100); int ln; const char* usage = "USAGE: color [text_type] [color] See 'help color' for more information.\n"; if (pc.isPc()) { ln = max(var.Strlen(), 3); if (var.Strlen() == 0) { Sprintf(buf, "Say: %P18 %S %P35 Yell: %P53 %S\n", getColorName(pc.pc->say_str), getColorName(pc.pc->yell_str)); pc.show(buf); Sprintf(buf, "Gossip: %P18 %S %P35 Tell: %P53 %S\n", getColorName(pc.pc->gos_str), getColorName(pc.pc->tell_str)); pc.show(buf); Sprintf(buf, "Desc: %P18 %S %P35 Objects: %P53 %S\n", getColorName(pc.pc->desc_str), getColorName(pc.pc->obj_list_str)); pc.show(buf); Sprintf(buf, "Critters: %P18 %S %P35 Default: %P53 %S\n", getColorName(pc.pc->mob_list_str), getColorName(pc.pc->dflt_str)); pc.show(buf); Sprintf(buf, "Battle: %P18 %S %P35 Background: %P53 %S\n", getColorName(pc.pc->battle_str), getColorName(pc.pc->bk_str)); pc.show(buf); }//if else if (strncasecmp("OFF", var, 3) == 0) { pc.PC_FLAGS.turn_off(26); //stop using them pc.show(ANSI_NORMAL); //pc.show(ANSI_BWHITE); pc.show("Turning off color mode. Use the toggle command, or\n"); pc.show("color ON to re-enable it.\n"); } else if (strncasecmp("NORMAL", var, 3) == 0) { // set to defaults pc.pc->gos_str = ANSI_NORMAL; pc.pc->say_str = ANSI_NORMAL; pc.pc->yell_str = ANSI_NORMAL; pc.pc->tell_str = ANSI_NORMAL; pc.pc->desc_str = ANSI_NORMAL; pc.pc->obj_list_str = ANSI_NORMAL; pc.pc->mob_list_str = ANSI_NORMAL; pc.pc->dflt_str = ANSI_NORMAL; pc.pc->bk_str = ANSI_NORMAL; pc.pc->battle_str = ANSI_NORMAL; pc.pc->user1_str = ANSI_NORMAL; pc.pc->user2_str = ANSI_NORMAL; pc.pc->user3_str = ANSI_NORMAL; pc.show(ANSI_NORMAL); pc.show(ANSI_NORMAL); pc.PC_FLAGS.turn_on(26); //start using them pc.show("Setting ansi colors to defaults.\n"); } else if ((strncasecmp("SUGGESTED", var, ln) == 0) || (strcasecmp("ON", var) == 0)) { pc.pc->gos_str = ANSI_CYAN; pc.pc->say_str = ANSI_MAGENTA; pc.pc->yell_str = ANSI_RED; pc.pc->tell_str = ANSI_GREEN; pc.pc->desc_str = ANSI_YELLOW; pc.pc->obj_list_str = ANSI_MAGENTA; pc.pc->mob_list_str = ANSI_RED; pc.pc->dflt_str = ANSI_WHITE; pc.pc->bk_str = ANSI_BBLACK; pc.pc->battle_str = ANSI_RED; pc.pc->user1_str = ANSI_WHITE; pc.pc->user2_str = ANSI_WHITE; pc.pc->user3_str = ANSI_WHITE; pc.show(ANSI_WHITE); pc.show(ANSI_BBLACK); pc.PC_FLAGS.turn_on(26); //start using them pc.PC_FLAGS.turn_on(25); //save colors pc.show("Changed to a personal favorite of mine.\n"); } else if (isValidColor(val_rough)) { val = colorToAnsiCode(val_rough); pc.PC_FLAGS.turn_on(25); //save colors if (strncasecmp(var, "Say", ln) == 0) { pc.pc->say_str = val; } else if (strncasecmp(var, "gossip", ln) == 0) { pc.pc->gos_str = val; } else if (strncasecmp(var, "yell", ln) == 0) { pc.pc->yell_str = val; } else if (strncasecmp(var, "tell", ln) == 0) { pc.pc->tell_str = val; } else if (strncasecmp(var, "description", ln) == 0) { pc.pc->desc_str = val; } else if (strncasecmp(var, "object list", ln) == 0) { pc.pc->obj_list_str = val; } else if (strncasecmp(var, "critter list", ln) == 0) { pc.pc->mob_list_str = val; } else if (strncasecmp(var, "default", ln) == 0) { pc.pc->dflt_str = val; pc.show(val); //set the background color immediately } else if (strncasecmp(var, "background", ln) == 0) { pc.pc->bk_str = val; pc.show(val); //set the background color immediately } else if (strncasecmp(var, "battle", ln) == 0) { pc.pc->battle_str = val; } else { pc.show(usage); return -1; } pc.show("Color set.\n"); }//if else { pc.show(usage); return -1; } }//if is a pc else { pc.show("You are not a PC!!\n"); return -1; } return 0; }//color int pause(int rounds, critter& pc) { if (pc.isMob()) return -1; //no MOB's allowed!! if (!pc.mob) { //SMOB only return -1; }//if if (rounds < 0) return 0; if (rounds > 300) rounds = 300; pc.PAUSE += rounds; return 0; }//pause int list_scripts(int mob_num, critter& pc) { if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (!check_l_range(mob_num, 1, NUMBER_OF_MOBS, pc, TRUE)) return -1; if (!mob_list[mob_num].isInUse()) { show("That mob does not exist.", pc); return -1; } pc.show("These scripts are defined for this mob, the actual scripts may be seen by using the stat_script [mob_num] [script_index] command.\n\n"); return do_list_scripts(mob_list[mob_num], pc); } int do_list_scripts(critter& targ, critter& pc) { if (!targ.mob) return -1; String buf(500); String tmp(100); int found_one = FALSE; Cell<MobScript*> cll(targ.mob->mob_proc_scripts); MobScript* ptr; int idx = 0; while ((ptr = cll.next())) { found_one = TRUE; tmp = ptr->toStringBrief(FALSE, 0, ENTITY_CRITTER, idx); Sprintf(buf, "[%i] %S\n", idx, &(tmp)); pc.show(buf); idx++; } if (!found_one) { buf.Append("No scripts defined for this mob.\n"); show(buf, pc); return -1; } return 0; }//list_scripts int list_room_scripts(int rm_num, critter& pc) { if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (rm_num == 1) { // Use current room, if player didn't enter anything rm_num = ROOM.getIdNum(); } if (!check_l_range(rm_num, 1, NUMBER_OF_ROOMS, pc, TRUE)) return -1; if (!room_list[rm_num].isInUse()) { show("That Room does not exist.", pc); return -1; } room_list[rm_num].listScripts(pc); return 0; }//list_room_scripts int list_obj_scripts(int obj_num, critter& pc) { if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (!check_l_range(obj_num, 1, NUMBER_OF_ITEMS, pc, TRUE)) return -1; if (!obj_list[obj_num].isInUse()) { show("That Object does not exist.", pc); return -1; } obj_list[obj_num].listScripts(pc); return 0; }//list_obj_scripts int stat_script(int mob_num, int script_idx, critter& pc) { if (mudlog.ofLevel(DBG)) { mudlog << "In stat_script: mob_num: " << mob_num << " script_idx: " << script_idx << endl; } if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (!check_l_range(mob_num, 1, NUMBER_OF_MOBS, pc, TRUE)) return -1; if (!mob_list[mob_num].isInUse()) { show("That mob does not exist.", pc); return -1; } String buf(500); MobScript* ptr = mob_list[mob_num].mob->mob_proc_scripts.elementAt(script_idx); if (ptr) { buf.Append(ptr->toStringBrief(pc.USING_CLIENT, mob_num, ENTITY_CRITTER, script_idx)); if (pc.USING_CLIENT) buf.Append("\n<SCRIPT_DATA>"); else buf.Append("\n"); buf.Append(ptr->getScript()); if (pc.USING_CLIENT) buf.Append("</SCRIPT_DATA>\nCompiled Script:\n"); else buf.Append("\nCompiled Script:\n"); buf.Append(ptr->getCompiledScript()); show(buf, pc); return 0; }//if Sprintf(buf, "Mob: %S does not have a script of index: %i", mob_list[mob_num].getName(), script_idx); show(buf, pc); return -1; }//stat_script int stat_room_script(int rm_num, int script_idx, critter& pc) { if (mudlog.ofLevel(DBG)) { mudlog << "In stat_room_script: rm_num: " << rm_num << " script_idx: " << script_idx << endl; } if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (!check_l_range(rm_num, 1, NUMBER_OF_ROOMS, pc, TRUE)) return -1; if (!room_list[rm_num].isInUse()) { show("That room does not exist.", pc); return -1; } String buf(500); RoomScript* ptr = room_list[rm_num].getScriptAt(script_idx); if (ptr) { buf.Append(ptr->toStringBrief(pc.USING_CLIENT, rm_num, ENTITY_ROOM, script_idx)); if (pc.isUsingClient()) buf.Append("\n<SCRIPT_DATA>"); else buf.Append("\n"); buf.Append(ptr->getScript()); if (pc.USING_CLIENT) buf.Append("</SCRIPT_DATA>\nCompiled Script:\n"); else buf.Append("\nCompiled Script:\n"); buf.Append(ptr->getCompiledScript()); show(buf, pc); return 0; }//if Sprintf(buf, "Room: %i does not have a script of index: %i", rm_num, script_idx); show(buf, pc); return -1; }//stat_room_script int stat_obj_script(int obj_num, int script_idx, critter& pc) { if (mudlog.ofLevel(DBG)) { mudlog << "In stat_obj_script: obj_num: " << obj_num << " script_idx: " << script_idx << endl; } if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (!check_l_range(obj_num, 1, NUMBER_OF_ITEMS, pc, TRUE)) return -1; if (!obj_list[obj_num].isInUse()) { show("That object does not exist.", pc); return -1; } String buf(500); ObjectScript* ptr = obj_list[obj_num].getScriptAt(script_idx); if (ptr) { buf.Append(ptr->toStringBrief(pc.USING_CLIENT, obj_num, ENTITY_OBJECT, script_idx)); if (pc.isUsingClient()) buf.Append("\n<SCRIPT_DATA>"); else buf.Append("\n"); buf.Append(ptr->getScript()); if (pc.USING_CLIENT) buf.Append("</SCRIPT_DATA>\nCompiled Script:\n"); else buf.Append("\nCompiled Script:\n"); buf.Append(ptr->getCompiledScript()); show(buf, pc); return 0; }//if Sprintf(buf, "Object: %i does not have a script of index: %i", obj_num, script_idx); show(buf, pc); return -1; }//stat_obj_script int rem_script(int mob_num, String& trigger, int i_th, critter& pc) { if (mudlog.ofLevel(DBG)) { mudlog << "In rem_script: mob_num: " << mob_num << " trigger: " << trigger << " i_th: " << i_th << endl; } if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (trigger.Strlen() == 0) { show("Which trigger do you want to stat??\n", pc); return -1; } if (!check_l_range(mob_num, 1, NUMBER_OF_MOBS, pc, TRUE)) return -1; if (!mob_list[mob_num].isInUse()) { show("That mob does not exist.\n", pc); return -1; } if (!pc.doesOwnCritter(mob_list[mob_num])) { show("You don't own that mob...\n", pc); return -1; } int sofar = 1; String buf(500); Cell<MobScript*> cll(mob_list[mob_num].mob->mob_proc_scripts); MobScript* ptr; ptr = cll.next(); while (ptr) { if (strcasecmp(*(ptr->getTrigger()), trigger) == 0) { if (sofar == i_th) { delete ptr; ptr = mob_list[mob_num].mob->mob_proc_scripts.lose(cll); show("Deleted it...\n", pc); return 0; }//if else { ptr = cll.next(); } sofar++; }//if else { ptr = cll.next(); } }//while show("Didn't find that script..\n", pc); return -1; }//rem_script int rem_room_script(int rm_num, String& trigger, int i_th, critter& pc) { if (mudlog.ofLevel(DBG)) { mudlog << "In rem_room_script: rm_num: " << rm_num << " trigger: " << trigger << " i_th: " << i_th << endl; } if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (trigger.Strlen() == 0) { show("Which trigger do you want to remove??\n", pc); return -1; } if (rm_num == 1) { rm_num = ROOM.getIdNum(); } if (!check_l_range(rm_num, 1, NUMBER_OF_ROOMS, pc, TRUE)) return -1; if (!room_list[rm_num].isInUse()) { show("That room does not exist.\n", pc); return -1; } if (!pc.doesOwnRoom(room_list[rm_num])) { show("You don't own that room...\n", pc); return -1; } room_list[rm_num].removeScript(trigger, i_th, pc); return 0; }//rem_room_script int rem_obj_script(int obj_num, String& trigger, int i_th, critter& pc) { if (mudlog.ofLevel(DBG)) { mudlog << "In rem_obj_script: obj_num: " << obj_num << " trigger: " << trigger << " i_th: " << i_th << endl; } if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (trigger.Strlen() == 0) { show("Which trigger do you want to remove??\n", pc); return -1; } if (!check_l_range(obj_num, 1, NUMBER_OF_ITEMS, pc, TRUE)) return -1; if (!obj_list[obj_num].isInUse()) { show("That object does not exist.\n", pc); return -1; } if (!pc.doesOwnObject(obj_list[obj_num])) { show("You don't own that object...\n", pc); return -1; } obj_list[obj_num].removeScript(trigger, i_th, pc); return 0; }//rem_obj_script int teach(int i_th, const String* name, int prcnt, const String* skill, critter& pc) { int skill_num; if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.IMM_LEVEL < 5) { show("Eh?\n", pc); return -1; }//if prcnt = bound(1, 100, prcnt); critter* ptr = have_crit_named(pc_list, i_th, name, pc.SEE_BIT, ROOM); if (!ptr) { show("That person is not logged on.\n", pc); return -1; }//if skill_num = SSCollection::instance().getNumForName(*skill); if (skill_num < 0) { show("That skill is unknown.\n", pc); return -1; }//if if (get_percent_lrnd(skill_num, pc) <= 0) { //then add it ptr->SKILLS_KNOWN.Insert(skill_num, prcnt); update_skill(skill_num, pc); show("Ok, your teachings were heard!.\n", pc); show("You learn of a new skill.\n", *ptr); }//if else { show("They evidently already know that skill, updating percentage.\n", pc); ptr->SKILLS_KNOWN.Insert(skill_num, prcnt); //make sure its at 100 update_skill(skill_num, pc); }//else return 0; }//teach int add_perm_inv(int obj_num, int i_th, const String* name, critter& pc) { String buf(100); critter* ptr; if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (!check_l_range(obj_num, 2, NUMBER_OF_ITEMS, pc, TRUE)) return -1; if (!obj_list[obj_num].OBJ_FLAGS.get(10)) { show("That object doesn't exist.\n", pc); return -1; }//if if (*name == "DB") { if (check_l_range(i_th, 2, NUMBER_OF_MOBS, pc, TRUE)) { ptr = &(mob_list[i_th]); } else { return -1; } }//if else { ptr = ROOM.haveCritNamed(i_th, name, pc.SEE_BIT); pc.show("You may want to use the [VNUM].DB method. See help.\n"); } if (ptr) { if (ptr->mob && ptr->mob->proc_data && ptr->mob->proc_data->sh_data) { /* is a shopkeeper */ ptr->PERM_INV.append(&(obj_list[obj_num])); Sprintf(buf, "%S added to %S's permanent (shop) inventory.\n", long_name_of_obj(obj_list[obj_num], ~0), name_of_crit(*ptr, ~0)); show(buf, pc); return 0; }//if else { ptr->gainInv(&(obj_list[obj_num])); Sprintf(buf, "%S added to %S's regular inventory.\n", long_name_of_obj(obj_list[obj_num], ~0), name_of_crit(*ptr, ~0)); show(buf, pc); return 0; }//else }//if a mob ptr found else { object* optr = ROOM.haveObjNamed(i_th, name, pc.SEE_BIT); if (!optr) { optr = have_obj_named(pc.inv, i_th, name, pc.SEE_BIT, ROOM); }//if if (optr) { if (optr->bag) { optr->gainInv(&(obj_list[obj_num])); Sprintf(buf, "%S added to %S's inventory.\n", long_name_of_obj(obj_list[obj_num], ~0), long_name_of_obj(*optr, ~0)); show(buf, pc); return 0; }//if else { show("It isn't a bag!\n", pc); return -1; }//else }//if show("You don't see that object or critter here.\n", pc); return -1; }//else maybe its an object? return -1; }//add_perm_inv int rem_perm_inv(int j_th, const String* obj_name, int i_th, const String* targ, critter& pc) { String buf(100); critter* ptr; if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (*targ == "DB") { if (check_l_range(i_th, 2, NUMBER_OF_MOBS, pc, TRUE)) { ptr = &(mob_list[i_th]); } else { return -1; } }//if else { ptr = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); pc.show("You may want to use the [VNUM].DB method. See help.\n"); } object* inv_obj = NULL; if (ptr) { if (ptr->mob && ptr->mob->proc_data && ptr->mob->proc_data->sh_data) { /* is a shopkeeper */ if ((inv_obj = have_obj_named(ptr->PERM_INV, j_th, obj_name, pc.SEE_BIT, ROOM))) { ptr->PERM_INV.loseData(inv_obj); Sprintf(buf, "%S [%d] deleted from %S's permanent (shop) inventory.\n", long_name_of_obj(*inv_obj, ~0), inv_obj->getIdNum(), name_of_crit(*ptr, ~0)); show(buf, pc); if (inv_obj->IN_LIST) delete inv_obj; return 0; }//if else { show("That object is not in its permanent inventory.\n", pc); return -1; }//else }//if else { if ((inv_obj = have_obj_named(ptr->inv, j_th, obj_name, pc.SEE_BIT, ROOM))) { ptr->loseInv(inv_obj); Sprintf(buf, "%S deleted from %S's inventory.\n", long_name_of_obj(*inv_obj, ~0), name_of_crit(*ptr, ~0)); show(buf, pc); if (inv_obj->IN_LIST) delete inv_obj; return 0; }//if else { show("That object is not in its inventory.\n", pc); return -1; }//else }//else }//if a mob ptr found else { object* optr = ROOM.haveObjNamed(i_th, targ, pc.SEE_BIT); if (!optr) { optr = have_obj_named(pc.inv, i_th, targ, pc.SEE_BIT, ROOM); }//if if (optr) { if ((inv_obj = have_obj_named(optr->inv, j_th, obj_name, pc.SEE_BIT, ROOM))) { optr->gainInv(inv_obj); Sprintf(buf, "%S deleted from %S's inventory.\n", long_name_of_obj(*inv_obj, ~0), name_of_obj(*optr, ~0)); show(buf, pc); if (inv_obj->IN_LIST) delete inv_obj; return 0; }//if else { show("That object is not in its permanent inventory.\n", pc); return -1; }//else }//if }//else maybe its an object? show("You don't see that object or critter here.\n", pc); return -1; }//rem_perm_inv int beep(int i_th, const String* name, critter& pc) { char buf[20]; String buf2(100); if (!ok_to_do_action(NULL, "mFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* ptr = ROOM.haveCritNamed(i_th, name, pc); if (!ptr) { ptr = have_crit_named(pc_list, i_th, name, pc.getSeeBit(), ROOM); } if (!ptr) { show("That person is not logged on.\n", pc); return -1; }//if if (!ptr->canBeBeeped()) { pc.show("That person cannot be beeped.\n"); return -1; } if (ptr->MODE == MODE_NORMAL) { if (ptr->isUsingClient()) { ptr->show(CTAG_BEEP(ptr->whichClient())); //client tag } else { buf[0] = 7; //beep buf[1] = 7; buf[2] = 7; buf[3] = 0; //terminate it show(buf, *ptr); } Sprintf(buf2, "%S beeps you.\n", name_of_crit(pc, ptr->SEE_BIT)); ptr->show(buf2); ptr->PAUSE += 1; //slow down spammers.... show("Done...\n", pc); return 0; } else { pc.show("That person is not able to be beeped right now.\n"); return -1; } }//beep int opurge(int i_th, const String* name, critter& pc) { object* obj; if (!ok_to_do_action(NULL, "IFPR", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } obj = ROOM.haveObjNamed(i_th, name, pc.SEE_BIT); if (!obj) { show("You don't see that here.\n", pc); }//if else { ROOM.purgeObj(obj, &pc, TRUE); return 0; }//else return -1; }//opurge int do_transport(critter& targ, critter& pc, room& dest) { /* assume targ AND pc are SMOB's or PC's */ String buf(100); show("The world tilts and angles bend!\n", targ); emote("shrinks impossibly and disappears.", targ, room_list[targ.getCurRoomNum()], TRUE); Sprintf(buf, "You transport %S.\n", name_of_crit(targ, pc.SEE_BIT)); show(buf, pc); int is_dead; targ.doGoToRoom(dest.getRoomNum(), NULL, NULL, is_dead, targ.getCurRoomNum(), 1); if (!is_dead) { // look(1, &NULL_STRING, targ, TRUE); emote("blinks into existence.", targ, dest, TRUE); } return 0; }//do_transport /* Toggle client usage to TRUE */ bool using_client(critter& pc) { if (pc.pc) { pc.PC_FLAGS.turn_on(5); return true; } return false; } int itrans(int i_th, const String* targ, int rm_num, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* ptr = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!ptr) { ptr = have_crit_named(pc_list, i_th, targ, pc.SEE_BIT, ROOM); }//if if (!ptr) { show("Who would you like to transport?\n", pc); return -1; }//if if (ptr->isMob()) { ptr = mob_to_smob(*ptr, pc.getCurRoomNum(), TRUE, i_th, targ, pc.SEE_BIT); }//if else if (ptr->pc && ptr->pc->imm_data && (ptr->IMM_LEVEL >= pc.IMM_LEVEL)) { show("Whoa, you can't itrans one so powerful.\n", pc); return -1; }//if if (ptr->getLevel() == 0) { pc.show("That thing has a level of zero, which looks buggy.\n"); pc.show("Not allowing you to itrans it.\n"); return -1; } if (rm_num == 1) { rm_num = pc.getCurRoomNum(); //default is to trans him TO the player's own room }//if if (check_l_range(rm_num, 0, NUMBER_OF_ROOMS, pc, TRUE)) { return do_transport(*ptr, pc, room_list[rm_num]); }// return -1; }//itrans int discuss(const String* topic, int i_th, const String* targ, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mrFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* ptr = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!ptr) { show("With whom would you like to discuss?\n", pc); }//if else if (topic->Strlen() == 0) { show("What would you like to discuss?\n", pc); }//if else if (pc.POS > POS_REST) { show("You are too relaxed.\n", pc); }//if else if (!IsEmpty(pc.IS_FIGHTING)) { show("You find it hard to have a decent conversation while fighting!\n", pc); }//if else { //looks like we're good to go if (ptr->mob && !ptr->pc) { if (ptr->mob->proc_data) { if (!IsEmpty(ptr->mob->proc_data->topics)) { //then do it if (ptr->isMob()) { ptr = mob_to_smob(*ptr, pc.getCurRoomNum(), TRUE, i_th, targ, pc.SEE_BIT); }//if return do_domob_say_proc(*ptr, pc, *topic); }//if }//if }//if if (ptr->pc) { Sprintf(buf, "%S wishes to discuss %S with you.\n", name_of_crit(pc, ptr->SEE_BIT), topic); show(buf, *ptr); }//if String cmd = "discuss"; String arg = *topic; ROOM.checkForProc(cmd, arg, pc, ptr->MOB_NUM); }//else return -1; }//discuss int suicide(const String* passwd, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mrBFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (!pc.isPc()) { return -1; } if (pc.pc->password != crypt(*passwd, "bg")) { show("In order to FOREVER kill your character, you must enter your \n", pc); show("password too.\n", pc); return -1; }//if pc.doSuicide(); return 0; }//suicide /* this is a 'give' for money basically */ int pay(int amount, int i_th, const String* targ, critter& pc) { String buf(100); if (mudlog.ofLevel(DBG)) { mudlog << "In Pay, amount: " << amount << " i_th: " << i_th << " targ: " << targ << endl; } if (!ok_to_do_action(NULL, "mrFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* ptr = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!ptr) { show("Pay who??\n", pc); return -1; }//if if (amount <= 0) { pc.show("The amount needs to be greater than zero!\n"); return -1; } if (amount > pc.GOLD) { show("You don't have that much!\n", pc); return -1; }//if if (ptr->isMob()) { ptr = mob_to_smob(*ptr, pc.getCurRoomNum(), TRUE, i_th, targ, pc.SEE_BIT); }//if ptr->GOLD += amount; pc.GOLD -= amount; Sprintf(buf, "You are pleasantly suprised as %S pays you %i.\n", name_of_crit(pc, ptr->SEE_BIT), amount); show(buf, *ptr); Sprintf(buf, "You give %S %i coins.\n", name_of_crit(*ptr, pc.SEE_BIT), amount); show(buf, pc); String cmd = "pay"; String amt; amt.Append(amount); ROOM.checkForProc(cmd, amt, pc, ptr->MOB_NUM); return 0; }//pay int mvnum(int i_th, const String* name, critter& pc) { int i; String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (i_th < 0) i_th = 0; for (i = i_th; i<NUMBER_OF_MOBS; i++) { if (mob_is_named(mob_list[i], *name)) { Sprintf(buf, "[%i] %S\n", i, &(mob_list[i].short_desc)); show(buf, pc); }//if }//for show("ok\n", pc); return 0; }//mvnum int ovnum(int i_th, const String* name, critter& pc) { int i; String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (i_th < 0) i_th = 0; for (i = i_th; i<NUMBER_OF_ITEMS; i++) { if (obj_is_named(obj_list[i], *name)) { Sprintf(buf, "[%i] %S\n", i, &(obj_list[i].short_desc)); show(buf, pc); }//if }//for show("ok\n", pc); return 0; }//ovnum int dvnum(int i_th, const String* name, critter& pc) { int i; String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (i_th < 0) i_th = 0; for (i = i_th; i<NUMBER_OF_DOORS; i++) { if (door_is_named(door_list[i], *name)) { Sprintf(buf, "[%i] %S\n", i, &(door_list[i].long_desc)); show(buf, pc); }//if }//for show("ok\n", pc); return 0; }//dvnum int arlist(int zone, int how_many, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if ((zone == 1) && (how_many == 1)) { zone = ROOM.getZoneNum(); how_many = 100; //all }//if else if ((zone != 1) && (how_many == 1)) { how_many = 100; } if (!check_l_range(zone, 0, NUMBER_OF_ZONES, pc, FALSE)) { show("Zone is out of range.\n", pc); return -1; }//if Sprintf(buf, "Here are all rooms defined for zone# %i.\n", zone); show(buf, pc); int count = 0; for (int i = ZoneCollection::instance().elementAt(zone).getBeginRoomNum(); ((i <= ZoneCollection::instance().elementAt(zone).getEndRoomNum()) && (count < how_many)); i++) { if (room_list[i].isInUse()) { Sprintf(buf, "[%i]\t%S\n", i, &(room_list[i].short_desc)); count++; show(buf, pc); }//if }//for return 0; }//arlist int slist(int begin, const String& name, int how_many, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } int end; if (name.Strlen() > 0) { how_many = 1; begin = SSCollection::instance().getNumForName(name); if (begin < 0) { pc.show("Can't find that spell or skill.\n"); return -1; }//if end = begin + 1; }//if specified a spell else { if (how_many == 1) how_many = 20; if ((begin == 1) && (how_many == 1)) { begin = 0; }//if if ((begin >= NUMBER_OF_SKILL_SPELLS) || (begin < 0)) begin = 0; end = begin + how_many; if ((end > NUMBER_OF_SKILL_SPELLS) || (end < 0)) end = NUMBER_OF_SKILL_SPELLS; }//else show("Here is the spell list you requested:\n", pc); int did_one = FALSE; for (int i = begin; i < end; i++) { if (SSCollection::instance().getSS(i).isInUse()) { did_one = TRUE; pc.show(SSCollection::instance().getSS(i).toString()); } else { //Sprintf(buf, "Skill/Spell [%i] is NOT IN USE.\n", i); //pc.show(buf); }//else }//for if (!did_one) { pc.show("You did not specify any skill/spell that actually exists.\n"); } return 0; }//slist int aolist(int zone, int how_many, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (zone == 1) { // default to current zone zone = ROOM.getZoneNum(); }//if if (how_many == 1) { //default to 100 (probably all) how_many = 100; //all }//if if (!check_l_range(zone, 0, NUMBER_OF_ZONES, pc, FALSE)) { show("Zone is out of range.\n", pc); return -1; }//if Sprintf(buf, "Here are all objects defined for zone# %i.\n", zone); show(buf, pc); int count = 0; for (int i = 0; (i < NUMBER_OF_ITEMS && count < how_many); i++) { if (obj_list[i].OBJ_FLAGS.get(10)) { if (obj_list[i].OBJ_IN_ZONE == zone) { Sprintf(buf, "[%i]\t%S\n", i, &(obj_list[i].short_desc)); count++; show(buf, pc); }//if }//if }//for return 0; }//aolist int aosave(int zone, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (zone == 1) { zone = ROOM.getZoneNum(); }//if if (!check_l_range(zone, 0, NUMBER_OF_ZONES, pc, FALSE)) { show("Zone is out of range.\n", pc); return -1; }//if if (!ZoneCollection::instance().elementAt(zone).isOwnedBy(pc)) { show("You do not own that zone. Only owners can aosave a zone.\n", pc); return -1; }//if if (!ZoneCollection::instance().elementAt(zone).canWriteObjects()) { show("All builders of your zone must finish their objects before\n", pc); show("you can write them to disk.\n", pc); return -1; }//if Sprintf(buf, "Re-writing the objects for zone# %i.\n", zone); show(buf, pc); return do_aosave(zone); }//aosave int do_aosave(int zone) { String buf(100); Sprintf(buf, "./World/objects_%i", zone); ofstream ofile(buf); if (!ofile) { mudlog.log(ERROR, "ERROR: ofile is NULL, aosave.\n"); return -1; }//if for (int i = 0; i < NUMBER_OF_ITEMS; i++) { if (obj_list[i].OBJ_FLAGS.get(10)) { //in use if (obj_list[i].OBJ_IN_ZONE == zone) { ofile << i << "\t Start of Object\n"; obj_list[i].Write(ofile); ofile << endl; }//if }//if }//for ofile << endl << "-1 END OF FILE" << endl; return 0; }//do_aosave //Writes every zone, if players are not currently editing the zones. int write_world(critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.getImmLevel() != 10) { pc.show("You must be a level 10 immort to write the entire world!\n"); return -1; } show("Writing the entire WORLD...\n", pc); ZoneCollection::instance().writeWorld(pc); return 0; }//write_world int amsave(int zone, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (zone == 1) { zone = ROOM.getZoneNum(); }//if if (!check_l_range(zone, 0, NUMBER_OF_ZONES, pc, FALSE)) { show("Zone is out of range.\n", pc); return -1; }//if if (!ZoneCollection::instance().elementAt(zone).isOwnedBy(pc)) { show("You do not own that zone. Only owners can amsave a zone.\n", pc); return -1; }//if if (!ZoneCollection::instance().elementAt(zone).canWriteMobs()) { //if locked (no write) show("All builders of your zone must finish their mobiles before\n", pc); show("you can write it to disk.\n", pc); return -1; }//if Sprintf(buf, "Re-writing the mobs for zone# %i.\n", zone); show(buf, pc); return do_amsave(zone); }//amsave int do_amsave(int zone) { String buf(100); Sprintf(buf, "./World/critters_%i", zone); ofstream ofile(buf); if (!ofile) { mudlog.log(ERROR, "ERROR: ofile is NULL, amsave.\n"); return -1; }//if for (int i = 0; i < NUMBER_OF_MOBS; i++) { if (mob_list[i].mob) { if (mob_list[i].isInUse()) { if (mob_list[i].getNativeZoneNum() == zone) { ofile << i << "\tStart of Mob\n"; mob_list[i].Write(ofile); ofile << endl; }//if }//if }//if }//for ofile << endl << "-1 END OF MOB FILE" << endl; return 0; }//do_amsave int adsave(int zone, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (zone == 1) { zone = ROOM.getZoneNum(); }//if if (!check_l_range(zone, 0, NUMBER_OF_ZONES, pc, FALSE)) { show("Zone is out of range.\n", pc); return -1; }//if if (!ZoneCollection::instance().elementAt(zone).isOwnedBy(pc)) { show("You do not own that zone. Only owners can adsave a zone.\n", pc); return -1; }//if if (!ZoneCollection::instance().elementAt(zone).canWriteDoors()) { //if locked (no write) show("All builders of your zone must finish their doors before\n", pc); show("you can write them to disk.\n", pc); return -1; }//if Sprintf(buf, "Re-writing the doors for zone# %i.\n", zone); show(buf, pc); return do_adsave(zone); }//adsave int do_adsave(int zone) { String buf(100); Sprintf(buf, "./World/doors_%i", zone); ofstream ofile(buf); if (!ofile) { mudlog.log(ERROR, "ERROR: ofile is NULL, adsave.\n"); return -1; }//if for (int i = 0; i < NUMBER_OF_DOORS; i++) { if (door_list[i].door_data_flags.get(10)) { //if in use if (door_list[i].in_zone == zone) { ofile << i << "\tStart of Door Data\n"; door_list[i].Write(ofile); ofile << endl; }//if }//if }//for ofile << endl << "-1 END OF DOOR FILE" << endl; return 0; }//do_adsave int amlist(int zone, int how_many, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (zone == 1) { zone = ROOM.getZoneNum(); }//if if (how_many == 1) { how_many = 100; //all }//if if (!check_l_range(zone, 0, NUMBER_OF_ZONES, pc, FALSE)) { show("Zone is out of range.\n", pc); return -1; }//if Sprintf(buf, "Here are all mobs defined for zone# %i.\n", zone); show(buf, pc); int count = 0; for (int i = 0; (i<NUMBER_OF_MOBS && count < how_many); i++) { if (mob_list[i].getNativeZoneNum() == zone) { if (mob_list[i].isInUse()) { Sprintf(buf, "[%i]\t%S\n", i, &(mob_list[i].short_desc)); count++; show(buf, pc); }//if }//if }//for return 0; }//amlist /* only imms of level 9 and above can do this */ int make_builder(int i_th, const String* name, critter& pc) { if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.getImmLevel() < 9) { return -1; }//if critter* ptr = ROOM.haveCritNamed(i_th, name, pc.SEE_BIT); if (!ptr) { show("You don't see that person here.\n", pc); return -1; }//if if (!ptr->pc) { show("Only pc's can become builders!!\n", pc); return -1; }//if if (ptr->pc->imm_data) { ptr->PC_FLAGS.turn_on(11); // is builder }//if else { ptr->PC_FLAGS.turn_on(11); // is builder ptr->PC_FLAGS.turn_on(2); // has imm data ptr->pc->imm_data = new immort_data; /* IMM_LEVEL defaults to zero */ }//else show("You are now a builder. Remember: HELP is you friend, and\n", *ptr); show("be sure to see help on the 'theme' of the MUD.\n", *ptr); show("Done.\n", pc); return 0; }//make_builder int withdraw(int i_th, const String& coins, int j_th, const String& banker, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "SBFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (coins.Strlen() && (strncasecmp(coins, "coins", coins.Strlen()) != 0) && (strncasecmp(coins, "gold", coins.Strlen()) != 0)) { pc.show("You must withdraw 'gold' or 'coins'.\n"); return -1; } if (i_th < 0) { pc.show("Nice try, maybe you want to deposit??\n"); return -1; } critter* crit = ROOM.haveCritNamed(j_th, &banker, pc.SEE_BIT); if (!crit) { crit = ROOM.findFirstBanker(); }//if if (!crit) { pc.show("Looks like the banker is not around right now!\n"); return -1; } if (!crit->isBanker()) { Sprintf(buf, "%S is not a banker.\n", crit->getName()); buf.Cap(); pc.show(buf); return -1; }//if return pc.withdrawCoins(i_th, *crit); }//withdraw int balance(int i_th, const String* banker, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "SBFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = ROOM.haveCritNamed(i_th, banker, pc.SEE_BIT); if (!crit) { crit = ROOM.findFirstBanker(); }//if if (!crit) { pc.show("Looks like the banker is not around right now!\n"); return -1; } if (!crit->isBanker()) { Sprintf(buf, "%S is not a banker.\n", crit->getName()); buf.Cap(); pc.show(buf); return -1; }//if return pc.balanceCoins(*crit); }//balance int deposit(int i_th, const String* coins, int j_th, const String* banker, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "SBFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (coins->Strlen() && (strncasecmp(*coins, "coins", coins->Strlen()) != 0) && (strncasecmp(*coins, "gold", coins->Strlen()) != 0)) { pc.show("You must deposit 'gold' or 'coins'.\n"); return -1; } if (i_th < 0) { pc.show("Nice try, maybe you want to withdraw??\n"); return -1; } critter* crit = ROOM.haveCritNamed(j_th, banker, pc.SEE_BIT); if (!crit) { crit = ROOM.findFirstBanker(); }//if if (!crit) { pc.show("Looks like the banker is not around right now!\n"); return -1; } if (!crit->isBanker()) { Sprintf(buf, "%S is not a banker.\n", crit->getName()); buf.Cap(); pc.show(buf); return -1; }//if return pc.depositCoins(i_th, *crit); }//deposit int gag(int i_th, const String* targ, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = have_crit_named(pc_list, i_th, targ, pc.SEE_BIT, ROOM); if (!crit) { crit = have_crit_named(linkdead_list, i_th, targ, pc.SEE_BIT, ROOM); }//if if (!crit) { show("That person isn't logged on!\n", pc); return -1; }//if if (crit->pc->imm_data && (crit->IMM_LEVEL >= pc.IMM_LEVEL)) { show("Nice try, but you could NEVER gag one so powerful!!\n", pc); return -1; }//if Sprintf(buf, "%S has gagged you!!\n", name_of_crit(pc, ~0)); show(buf, *crit); emote("goes a-gagging!!", pc, ROOM, TRUE); emote("will speak no more!", *crit, room_list[crit->getCurRoomNum()], TRUE); crit->PC_FLAGS.turn_on(1); Sprintf(buf, "Successfully gagged %S.\n", crit->getName()); pc.show(buf); return 0; }//gag int freeze(int i_th, const String* targ, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = have_crit_named(pc_list, i_th, targ, pc.SEE_BIT, ROOM); if (!crit) { crit = have_crit_named(linkdead_list, i_th, targ, pc.SEE_BIT, ROOM); }//if if (!crit) { show("That person isn't logged on!\n", pc); return -1; }//if if (crit->pc->imm_data && (crit->IMM_LEVEL >= pc.IMM_LEVEL)) { show("Nice try, but you could NEVER freeze one so powerful!!\n", pc); return -1; }//if Sprintf(buf, "%S has frozen you!!\n", name_of_crit(pc, ~0)); show(buf, *crit); emote("gets out the freezer!!", pc, ROOM, TRUE); emote("will do no more!", *crit, room_list[crit->getCurRoomNum()], TRUE); crit->PC_FLAGS.turn_on(0); return 0; }//freeze int ungag(int i_th, const String* targ, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = have_crit_named(pc_list, i_th, targ, pc.SEE_BIT, ROOM); if (!crit) { crit = have_crit_named(linkdead_list, i_th, targ, pc.SEE_BIT, ROOM); }//if if (!crit) { show("That person isn't logged on!\n", pc); return -1; }//if if (crit->pc->imm_data && (crit->IMM_LEVEL >= pc.IMM_LEVEL)) { show("Nice try, but that gag was put on by one too powerful!!\n", pc); return -1; }//if Sprintf(buf, "%S has ungagged you!!\n", name_of_crit(pc, ~0)); show(buf, *crit); emote("removes a gag!!", pc, ROOM, TRUE); emote("can speak once more!", *crit, room_list[crit->getCurRoomNum()], TRUE); crit->PC_FLAGS.turn_off(1); Sprintf(buf, "Successfully un-gagged %S.\n", crit->getName()); pc.show(buf); return 0; }//ungag int thaw(int i_th, const String* targ, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = have_crit_named(pc_list, i_th, targ, pc.SEE_BIT, ROOM); if (!crit) { crit = have_crit_named(linkdead_list, i_th, targ, pc.SEE_BIT, ROOM); }//if if (!crit) { show("That person isn't logged on!\n", pc); return -1; }//if if (crit->pc->imm_data && (crit->IMM_LEVEL >= pc.IMM_LEVEL)) { show("Nice try, but that freeze was put on by one too powerful!!\n", pc); return -1; }//if Sprintf(buf, "%S has thawed you out!!\n", name_of_crit(pc, ~0)); show(buf, *crit); emote("thaws 'em out!!", pc, ROOM, TRUE); emote("is warm once more!", *crit, room_list[crit->getCurRoomNum()], TRUE); crit->PC_FLAGS.turn_off(0); return 0; }//thaw int value_set(int i_th, const String* targ, int val_idx, int sell_val, int buy_val, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mFPS", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!crit) { pc.show("Set value for which shopkeeper??\n"); return -1; }//if if (crit->isPlayerShopKeeper()) { if (crit->isManagedBy(pc)) { crit->valueSet(val_idx, sell_val, buy_val, pc); //will do msgs save_player_shop_owner(*crit); return 0; }//if else { pc.show("You are not the manager of this shopkeeper.\n"); } }//if else { pc.show("That is not a player-run shopkeeper.\n"); }//else return -1; }//value_set int value_list(int i_th, const String* targ, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mSFBP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!crit) { pc.show("List values for which shopkeeper??\n"); return -1; }//if if (crit->isPlayerShopKeeper()) { crit->valueList(i_th, targ, pc); return 0; }//if else { pc.show("That is not a player-run shopkeeper.\n"); }//else return -1; }//value_list int value_add(int i_th, const String* targ, int j_th, const String* obj, critter& pc) { String buf(100); object* obj_ptr; if (!ok_to_do_action(NULL, "mSBFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!crit) { pc.show("Add value for which shopkeeper??\n"); return -1; }//if obj_ptr = have_obj_named(pc.inv, j_th, obj, pc.SEE_BIT, ROOM); if (!obj_ptr) { pc.show("You don't have that object.\n"); return -1; }//if if (crit->isPlayerShopKeeper()) { if (crit->isManagedBy(pc)) { crit->valueAdd(*obj_ptr, pc); //will do msgs save_player_shop_owner(*crit); return 0; }//if else { pc.show("You are not the manager of this shopkeeper.\n"); } }//if else { pc.show("That is not a player-run shopkeeper.\n"); }//else return -1; }//value_add int adjust_register(int i_th, const String* targ, int new_balance, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mBSFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (new_balance < 0) { pc.show("That balance is a little too low!\n"); return -1; }//if critter* crit = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!crit) { pc.show("Balance the register for which shopkeeper??\n"); return -1; }//if if (crit->isPlayerShopKeeper()) { if (crit->isManagedBy(pc)) { if (new_balance == 1) { // just checking balance Sprintf(buf, "The shopkeeper holds %i coins.\n", crit->GOLD); pc.show(buf); return 0; }//if else { if (crit->GOLD > new_balance) { //gonna give some to the manager (pc) pc.GOLD += (crit->GOLD - new_balance); Sprintf(buf, "You take %i coins from the shopkeeper.", (crit->GOLD - new_balance)); // and take some from the shopkeeper crit->GOLD = new_balance; pc.show(buf); save_player_shop_owner(*crit); return 0; }//if else { // gonna give some to the shopkeeper if ((new_balance - crit->GOLD) > pc.GOLD) { pc.show("Nice try, but you don't have that much gold to give!\n"); return -1; } else { pc.GOLD -= (new_balance - crit->GOLD); Sprintf(buf, "Transferred %i coins to the shopkeeper.", (new_balance - crit->GOLD)); crit->GOLD = new_balance; pc.show(buf); save_player_shop_owner(*crit); return 0; }//else }//else }//else }//if else { pc.show("You are not the manager of this shopkeeper.\n"); } }//if else { pc.show("That is not a player-run shopkeeper.\n"); }//else return -1; }//adjust_register int value_rem(int i_th, const String* targ, int val_idx, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mSBFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!crit) { pc.show("Remove value for which shopkeeper??\n"); return -1; }//if if (crit->isPlayerShopKeeper()) { if (crit->isManagedBy(pc)) { crit->valueRem(val_idx, pc); //will do msgs save_player_shop_owner(*crit); return 0; }//if else { pc.show("You are not the manager of this shopkeeper.\n"); } }//if else { pc.show("That is not a player-run shopkeeper.\n"); }//else return -1; }//value_rem int consider(int i_th, const String* targ, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mSFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } critter* crit = ROOM.haveCritNamed(i_th, targ, pc.SEE_BIT); if (!crit) { pc.show("Consider who??\n"); return -1; }//if /* Level */ if ((pc.LEVEL - crit->LEVEL) > 5) { Sprintf(buf, "%s could never hope to match your prowess!\n", get_he_she(*crit)); } else if ((pc.LEVEL - crit->LEVEL) > 2) { Sprintf(buf, "%s looks a little wet behind the ears.\n", get_he_she(*crit)); } else if ((pc.LEVEL - crit->LEVEL) >= -3) { Sprintf(buf, "you are about matched in skill.\n"); } else if ((pc.LEVEL - crit->LEVEL) >= -6) { Sprintf(buf, "%s is quite a bit more skilled than you.\n", get_he_she(*crit)); } else { Sprintf(buf, "%s could probably teach you a thing or two!\n", get_he_she(*crit)); } buf.setCharAt(0, toupper(buf[0])); pc.show(buf); /* Weapons */ if (!crit->EQ[9] || (crit->EQ[9] && crit->EQ[9]->OBJ_FLAGS.get(40))) { Sprintf(buf, "%s is unarmed.\n", get_he_she(*crit)); } else if (!pc.EQ[9] || (pc.EQ[9] && pc.EQ[9]->OBJ_FLAGS.get(40))) { Sprintf(buf, "you are unarmed.\n"); } else { int diff = (pc.EQ[9]->getDiceCnt()*pc.EQ[9]->getDiceSides())/2 - (crit->EQ[9]->getDiceCnt()*crit->EQ[9]->getDiceSides())/2; if (diff > 10) { Sprintf(buf, "%s might as well be wielding a wooden sword.\n", get_he_she(*crit)); } else if (diff > 5) { Sprintf(buf, "%s wields a pitiful armament.\n", get_he_she(*crit)); } else if (diff > -6) { Sprintf(buf, "%s is roughly as well armed as you.\n", get_he_she(*crit)); } else if (diff > -11) { Sprintf(buf, "%s is better armed than you by far.\n", get_he_she(*crit)); } else { Sprintf(buf, "%s is armed to the teeth!\n", get_he_she(*crit)); } } buf.setCharAt(0, toupper(buf[0])); pc.show(buf); /* AC */ if ((pc.AC - crit->AC) > 10) { Sprintf(buf, "%s wears armor the likes of which you've never seen!\n", get_he_she(*crit)); } else if ((pc.AC - crit->AC) > 5) { Sprintf(buf, "%s is impressively well protected.\n", get_he_she(*crit)); } else if ((pc.AC - crit->AC) > -6) { Sprintf(buf, "%s has admirable taste in armor.\n", get_he_she(*crit)); } else if ((pc.AC - crit->AC) > -11) { Sprintf(buf, "%s defenses could use some work.\n", get_his_her(*crit)); } else { Sprintf(buf, "you barely recognize the scraps %s is wearing as armor!\n", get_he_she(*crit)); } buf.setCharAt(0, toupper(buf[0])); pc.show(buf); /* Dex */ if ((pc.DEX - crit->DEX) > 5) { Sprintf(buf, "%s couldn't even hit a statue of you!\n", get_he_she(*crit)); } else if ((pc.DEX - crit->DEX) > 2) { Sprintf(buf, "%s would have trouble avoiding even your clumsiest attack.\n", get_he_she(*crit)); } else if ((pc.DEX - crit->DEX) > -3) { Sprintf(buf, "%s could probably match you move for move.\n", get_he_she(*crit)); } else if ((pc.DEX - crit->DEX) > -6) { Sprintf(buf, "%s could dodge your attacks with ease.\n", get_he_she(*crit)); } else { Sprintf(buf, "%s is astoundingly more agile than you!\n", get_he_she(*crit)); } buf.setCharAt(0, toupper(buf[0])); pc.show(buf); /* Str */ if ((pc.STR - crit->STR) > 5) { Sprintf(buf, "%s is no match for your awesome might!\n", get_he_she(*crit)); } else if ((pc.STR - crit->STR) > 2) { Sprintf(buf, "%s is significantly weaker than you.\n", get_he_she(*crit)); } else if ((pc.STR - crit->STR) > -3) { Sprintf(buf, "you are of roughly equal strength.\n"); } else if ((pc.STR - crit->STR) > -6) { Sprintf(buf, "%s is significantly stronger than you.\n", get_he_she(*crit)); } else { Sprintf(buf, "%s could probably pop your head like a zit!\n", get_he_she(*crit)); } buf.setCharAt(0, toupper(buf[0])); pc.show(buf); /* HP */ if ((pc.HP - crit->HP) > 50) { Sprintf(buf, "%s is about as decrepit as they come!\n", get_he_she(*crit)); } else if ((pc.HP - crit->HP) > 25) { Sprintf(buf, "%s is looking a little frail.\n", get_he_she(*crit)); } else if ((pc.HP - crit->HP) > -26) { Sprintf(buf, "%s is looking well.\n", get_he_she(*crit)); } else if ((pc.HP - crit->HP) > -51) { Sprintf(buf, "%s in excellent health.\n", get_he_she(*crit)); } else { Sprintf(buf, "%s is looking hale and hearty!\n", get_he_she(*crit)); } buf.setCharAt(0, toupper(buf[0])); pc.show(buf); Sprintf(buf, "%S sizes you up, almost as if %s were considering battle!\n", pc.getName(crit->SEE_BIT), get_he_she(pc)); crit->show(buf); String cmd = "consider"; ROOM.checkForProc(cmd, NULL_STRING, pc, crit->MOB_NUM); return 0; }//consider int dsys(int i, const String& cmd, const String& arg1, critter& pc) { String buf(100); char cbuf[100]; if (!ok_to_do_action(NULL, "IF", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (strncasecmp(cmd, "dump_logs", max(cmd.Strlen(), 1)) == 0) { mudlog.flushToFile("./log/onDemand.log"); pc.show("Dumped to ./log/onDemand.log\n"); return 0; } if (strncasecmp(cmd, "debug_proc_action_mobs", max(cmd.Strlen(), 1)) == 0) { // Print out the proc_action_mobs Sprintf(buf, "proc_action_mobs info: cur_len: %i max_len: %i \n", proc_action_mobs.getCurLen(), proc_action_mobs.getMaxLen()); pc.show(buf); for (int i = 0; i<proc_action_mobs.getMaxLen(); i++) { sprintf(cbuf, "proc_action_mobs[%i] == %p\n", i, proc_action_mobs.elementAt(i)); pc.show(cbuf); } return 0; }//if if (strncasecmp(cmd, "flags", max(cmd.Strlen(), 1)) == 0) { int do_objs = FALSE; int do_crit = FALSE; int do_door = FALSE; int do_room = FALSE; int arg_len; if ((arg_len = arg1.Strlen()) == 0) { do_objs = do_crit = do_door = do_room = TRUE; } else if (strncasecmp(arg1, "objects", arg_len) == 0) { do_objs = TRUE; } else if (strncasecmp(arg1, "critters", arg_len) == 0) { do_crit = TRUE; } else if (strncasecmp(arg1, "doors", arg_len) == 0) { do_door = TRUE; } else if (strncasecmp(arg1, "rooms", arg_len) == 0) { do_room = TRUE; } else { pc.show("We only show flags for: objects, doors, rooms, and critters.\n"); return -1; } // Show all of our flags that we have FLAG_NAMES for pc.show("Flags defined currently:\n"); if (do_crit) { pc.show("----------------------->> CRITTER FLAGS <<---------------------\n"); CRIT_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); MOB_DATA_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); MOB_PROC_DATA_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); SHOP_DATA_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); TEACH_DATA_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); PC_DATA_FLAGS_NAMES.listNames(buf); pc.show(buf); } if (do_objs) { pc.show("\n----------------------->> OBJECT FLAGS <<---------------------\n"); OBJ_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); BAG_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); OBJ_SPEC_DATA_FLAGS_NAMES.listNames(buf); pc.show(buf); } if (do_door) { pc.show("\n----------------------->> DOOR FLAGS <<---------------------\n"); DOOR_DATA_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); } if (do_room) { pc.show("\n----------------------->> ROOM FLAGS <<---------------------\n"); ROOM_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); VEHICLE_FLAGS_NAMES.listNames(buf); pc.show(buf); pc.show("\n"); } return 0; } Sprintf(buf, "ScryMUD version: %s Built on: %s On Machine: %s By: %s\n\n", BuildInfo::getVersion(), BuildInfo::getBuildDate(), BuildInfo::getBuildMachine(), BuildInfo::getBuilder()); pc.show(buf); Sprintf(buf, "Listening on port: %i\n", config.port); pc.show(buf); pc.show("Number C++ object instances allocated and not deleted:\n"); Sprintf(buf, "[%i]%P10 object %P30[%i] %P42 door\n", object::getInstanceCount(), door::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 room %P30[%i] %P42 critter\n", room::getInstanceCount(), critter::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 String %P30[%i] %P42 String bytes total \n", String::string_cnt, String::total_bytes); pc.show(buf); Sprintf(buf, "[%i]%P10 List<> %P30[%i] %P42 List<> Node \n", pc.names.getListCnt(), pc.names.getNodeCnt()); pc.show(buf); Sprintf(buf, "[%i]%P10 ZoneList %P30[%i] %P42 List<> Cell\n", ZoneList::getInstanceCount(), pc.names.getCellCnt()); pc.show(buf); Sprintf(buf, "[%i]%P10 zone %P30[%i] %P42 stat_spell_cell\n", zone::getInstanceCount(), stat_spell_cell::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 PathCell %P30[%i] %P42 teacher_data.\n", PathCell::getInstanceCount(), teacher_data::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 temp_crit_data %P30[%i] %P42 immort_data\n", temp_crit_data::getInstanceCount(), immort_data::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 shop_data %P30[%i] %P42 temp_proc_data\n", shop_data::getInstanceCount(), temp_proc_data::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 say_proc_cell %P30[%i] %P42 action_proc_data\n", say_proc_cell::getInstanceCount(), action_proc_data::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 spec_data %P30[%i] %P42 mob_data\n", spec_data::getInstanceCount(), mob_data::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 pc_data %P30[%i] %P42 KeywordPair\n", pc_data::getInstanceCount(), KeywordPair::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 obj_construct_data %P30[%i] %P42 obj_spec_data\n", obj_construct_data::getInstanceCount(), obj_spec_data::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 bag_struct %P30[%i] %P42 BugEntry\n", bag_struct::getInstanceCount(), BugEntry::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 door_data %P30[%i] %P42 ScriptCmd\n", door_data::getInstanceCount(), ScriptCmd::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 GenScript %P30[%i] %P42 MobScript\n", GenScript::getInstanceCount(), MobScript::getInstanceCount()); pc.show(buf); Sprintf(buf, "[%i]%P10 RoomScript %P30[%i] %P42 BugCollection\n", RoomScript::getInstanceCount(), BugCollection::getInstanceCount()); pc.show(buf); Sprintf(buf, "\nSize (length) of:\n\tembattled_rooms: %i \t affected_doors: %i\n", embattled_rooms.size(), affected_doors.size()); pc.show(buf); Sprintf(buf, "\taffected_mobs: %i \t affected_rooms: %i\n", affected_mobs.size(), affected_rooms.size()); pc.show(buf); Sprintf(buf, "\taffected_rooms: %i, \t affected_objs: %i\n", affected_rooms.size(), affected_objects.size()); pc.show(buf); Sprintf(buf, "\tproc_action_mobs: %i \t NULL\n", proc_action_mobs.getCurLen()); pc.show(buf); Sprintf(buf, "\tpulsed_proc_rooms: %i \t pulsed_proc_objects: %i\n", pulsed_proc_rooms.size(), pulsed_proc_objects.size()); pc.show(buf); Sprintf(buf, "\tproc_action_rooms: %i \t proc_action_objs: %i\n", proc_action_rooms.getCurLen(), proc_action_objs.getCurLen()); pc.show(buf); return 0; }//dsys int handle_olc(critter& pc, int do_sub) { if (!pc.isImmort()) { pc.show("You are not cleared to build, talk to a god.\n"); return -1; } else if (pc.pc->imm_data->olc_counter > 0) { restart_olc(pc); return 0; } else { start_olc(pc); // This mostly just shows the prompt... --BLG return pc.processInput(pc.pc->input, do_sub, FALSE); }//else }//handleOLC /* this is the command called by the player, it parses and calls emote() */ int com_emote(const String* msg, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mrGFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (msg->Strlen() == 0) { show("What do you wish to emote?\n", pc); return -1; }//if emote(*msg, pc, ROOM, TRUE); //do it then Sprintf(buf, "%S %S\n", name_of_crit(pc, ~0), msg); buf.Cap(); show(buf, pc); return -1; }//com_emote /* Possessive Emote * this is the command called by the player, it parses and calls pemote() */ int com_pemote(const String* msg, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mrGFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (msg->Strlen() == 0) { show("What do you wish to emote?\n", pc); return -1; }//if pemote(*msg, pc, ROOM, TRUE); //do it then Sprintf(buf, "%S's %S\n", name_of_crit(pc, ~0), msg); buf.Cap(); show(buf, pc); return 0; }//com_pemote /* this is the command called by the player, it parses and calls gemote() */ int com_gemote(const String* msg, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mrGFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (msg->Strlen() == 0) { show("What do you wish to emote?\n", pc); return -1; }//if gemote(*msg, pc); //do it then return -1; }//com_gemote /* command called by pc as gecho() */ int com_gecho(const String* msg, critter& pc) { String buf2(100); if (!ok_to_do_action(NULL, "mrGFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.getImmLevel() < 5) { show("You haven't the power!\n", pc); return -1; }//if if (msg->Strlen() == 0) { show("What do you wish to gecho?\n", pc); return -1; }//if Cell<critter*> cll(pc_list); critter* ptr; while ((ptr = cll.next())) { if (ptr->isImmort() && (ptr->getImmLevel() >= pc.getImmLevel())) { Sprintf(buf2, "[%S] %S", pc.getName(), msg); show(buf2, *ptr); } else { show(*msg, *ptr); show("\n", *ptr); } }//while return 0; }//com_gecho /* command called by pc as recho(), room echo */ int com_recho(const String* msg, critter& pc) { String buf2(100); if ((pc.isImmort() && pc.IMM_LEVEL > 1) || ((pc.isSmob() && !pc.isCharmed()))) { if (!ok_to_do_action(NULL, "rGFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (msg->Strlen() == 0) { show("What do you wish to recho?\n", pc); return -1; }//if Cell<critter*> cll(ROOM.getCrits()); critter* ptr; while ((ptr = cll.next())) { if (ptr->isImmort() && (ptr->getImmLevel() >= pc.getImmLevel())) { Sprintf(buf2, "[%S] %S", pc.getName(), msg); show(buf2, *ptr); } else { show(*msg, *ptr); show("\n", *ptr); } }//while return 0; }//if else { show("You haven't the power!\n", pc); return -1; }//if }//com_gecho int com_pecho(int i_th, const String* targ, const String* msg, critter& pc) { String buf2(100); String buf(100); if ((pc.isImmort() && pc.IMM_LEVEL > 1) || ((pc.isSmob() && !pc.isCharmed()))) { if (!ok_to_do_action(NULL, "rGFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (msg->Strlen() == 0) { show("What do you wish to pecho?\n", pc); return -1; }//if critter* ptr; //targ ptr = have_crit_named(pc_list, i_th, targ, pc.SEE_BIT, ROOM); if (ptr) { if (ptr->isImmort() && (ptr->getImmLevel() >= pc.getImmLevel())) { Sprintf(buf2, "[%S] %S", pc.getName(), msg); show(buf2, *ptr); Sprintf(buf, "You echo -:%S:- to player: %S\n", &buf2, ptr->getName()); pc.show(buf); } else { show(*msg, *ptr); show("\n", *ptr); Sprintf(buf, "You echo -:%S:- to player: %S\n", msg, ptr->getName()); pc.show(buf); } return 0; }//if else { pc.show(CS_NO_FIND_THAT_PERSON); } }//if else { show("You haven't the power!\n", pc); }//if return -1; }//com_pecho /* command called by pc as zecho(), zone echo */ int com_zecho(const String* msg, critter& pc) { String buf2(100); if (!ok_to_do_action(NULL, "IGFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.IMM_LEVEL < 5) { show("You haven't the power!\n", pc); return -1; }//if if (msg->Strlen() == 0) { show("What do you wish to zecho?\n", pc); return -1; }//if Cell<critter*> cll(pc_list); critter* ptr; while ((ptr = cll.next())) { if (ptr->getCurZoneNum() == pc.getCurZoneNum()) { if (ptr->isImmort() && (ptr->getImmLevel() >= pc.getImmLevel())) { Sprintf(buf2, "[%S] %S", pc.getName(), msg); show(buf2, *ptr); } else { show(*msg, *ptr); show("\n", *ptr); } }//while }//if return 0; }//com_zecho int prone(critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "mBFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.POS == POS_PRONE) { show("You are already prone.\n", pc); return -1; }//if if (pc.POS == POS_STUN) { show("You can't seem to order your body into motion!\n", pc); return -1; }//if if (pc.POS == POS_SLEEP) { show("You are asleep!\n", pc); return -1; }//if emote("drops to the ground in a prone position.", pc, ROOM, TRUE); show("You drop to the prone position.\n", pc); pc.setPosn(POS_PRONE); String cmd = "prone"; ROOM.checkForProc(cmd, NULL_STRING, pc, -1); return 0; }//prone() /* ranged attack, pretty neat eh?? */ int shoot(int i_th, const String* dir, int j_th, const String* mob, critter& pc) { String buf(100); door* dptr; int dest; critter* targ; if (!ok_to_do_action(NULL, "SFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } /* check for exit */ dptr = door::findDoor(ROOM.DOORS, i_th, dir, pc.SEE_BIT, ROOM); if (!dptr) { show("You can't find an exit in that direction.\n", pc); return -1; }//if if (dptr->isClosed()) { show("That direction is closed.\n", pc); return -1; }//if /* have door, its open */ /* check for targ */ dest = abs(dptr->destination); targ = room_list[dest].haveCritNamed(j_th, mob, pc.SEE_BIT); if (ROOM.isNoRanged() || room_list[dest].isNoRanged()) { pc.show("You can't find your target.\n"); return -1; } if (!targ) { show("You can't find your target.\n", pc); return -1; }//if if (targ->isMob()) { //its a SMOB targ = mob_to_smob(*targ, dest, TRUE, j_th, mob, pc.SEE_BIT | room_list[dest].getVisBit()); }//if if (!(targ = check_for_diversions(*targ, "GSM", pc))) return -1; /* can't guard w/out being a NON-MOB (ie PC or SMOB */ return do_shoot(*targ, pc); }//shoot int do_shoot(critter& targ, critter& pc) { String buf(100); Cell<object*> cll; object* ammo = NULL; int targ_is_dead = FALSE; if ((targ.isMob()) || (pc.isMob())) { mudlog.log(ERROR, "ERROR: SMOB sent to do_shoot.\n"); return -1; }//if if (can_start_battle(targ, pc, TRUE)) { if (!pc.EQ[9] || !((pc.EQ[9]->OBJ_FLAGS.get(46)) || pc.EQ[9]->OBJ_FLAGS.get(47))) { show("You must be wielding a projectile weapon in order to shoot.\n", pc); return -1; }//if if (pc.EQ[9]->OBJ_FLAGS.get(45)) { //needs ammo to work if (pc.EQ[9]->OBJ_FLAGS.get(46)) { //needs darts pc.inv.head(cll); while ((ammo = cll.next())) { if (ammo->OBJ_FLAGS.get(48)) { //its a dart pc.inv.lose(cll); break; }//if }//while }//if dart thrower else { //bow pc.inv.head(cll); while ((ammo = cll.next())) { if (ammo->OBJ_FLAGS.get(49)) { //its an arrow pc.inv.lose(cll); break; }//if }//while }//else if (!ammo) { show("You are out of ammo.\n", pc); return -1; }//if }//if needs ammo /* we have ammo if we need it... */ String lproj_name("a projectile"); String sproj_name("projectile"); if (ammo) { lproj_name = *(ammo->getLongName()); sproj_name = *(ammo->getName()); }//if if (mudlog.ofLevel(DBG)) { mudlog << "Long Projectile name: " << lproj_name << endl << "Short Projectile name: " << sproj_name << endl; } Sprintf(buf, "readies %s %S.\n", get_his_her(pc), name_of_obj(*(pc.EQ[9]), ~0)); emote(buf, pc, ROOM, TRUE); if (!did_shot_hit(targ, pc)) { show("Your shot goes wide of your mark.\n", pc); emote("shoots and misses.", pc, ROOM, TRUE); Sprintf(buf, "%S comes whistling by your head!\n", &lproj_name); buf.Cap(); show_all(buf, room_list[targ.getCurRoomNum()]); String cmd = "shoot"; ROOM.checkForProc(cmd, NULL_STRING, pc, targ.MOB_NUM); do_shot_proc(targ, pc, FALSE, targ_is_dead); }//if else { int damage = d(pc.EQ[9]->extras[7], pc.EQ[9]->extras[6]); if (ammo) { damage += d(ammo->extras[7], ammo->extras[6]); }//if exact_raw_damage(damage, NORMAL, targ); if (targ.HP > 0) { //still alive Sprintf(buf, "You hit %S with %S.", name_of_crit(targ, pc.SEE_BIT), &lproj_name); show(buf, pc); Sprintf(buf, "%S wounds you with %S!\n", name_of_crit(pc, targ.SEE_BIT), &lproj_name); show(buf, targ); Sprintf(buf, "staggers as %S's %S hits %s!\n", name_of_crit(pc, ~0), &sproj_name, get_him_her(targ)); emote(buf, targ, room_list[targ.getCurRoomNum()], TRUE); String cmd = "shoot"; ROOM.checkForProc(cmd, NULL_STRING, pc, targ.MOB_NUM); do_shot_proc(targ, pc, TRUE, targ_is_dead); }//if hit but not fatal else { //fatality Sprintf(buf, "Your %S sinks deep into %S's chest!\n", &sproj_name, name_of_crit(targ, pc.SEE_BIT)); show(buf, pc); Sprintf(buf, "%S's %S sinks deep into %S's chest!\n", name_of_crit(pc, ~0), &sproj_name, name_of_crit(targ, ~0)); room_list[targ.getCurRoomNum()].showAllCept(buf, &targ); Sprintf(buf, "%S has slain you with %s %S!\n", name_of_crit(pc, targ.SEE_BIT), get_his_her(pc), &sproj_name); show(buf, targ); emote("twitches once and moves no more!", targ, room_list[targ.getCurRoomNum()], TRUE); alert_room_proc(targ.getCurRoomNum(), PROJECTILE_DEATH, targ, pc); agg_kills_vict(&pc, targ); }//else fatality }// else hit }// if can start battle if (ammo) { if (ammo->IN_LIST) { delete ammo; }//if }//if pc.setPause(pc.getPause() + 1); return 0; }//do_shoot int _throw(int i_th, const String* dir, int j_th, const String* mob, critter& pc) { String buf(100); door* dptr; int dest; critter* targ; if (!ok_to_do_action(NULL, "mSFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } /* check for exit */ dptr = door::findDoor(ROOM.DOORS, i_th, dir, pc.SEE_BIT, ROOM); if (!dptr) { show("You can't find an exit in that direction.\n", pc); return -1; }//if if (dptr->isClosed()) { show("That direction is closed.\n", pc); return -1; }//if /* have door, its open */ /* check for targ */ dest = abs(dptr->destination); targ = room_list[dest].haveCritNamed(j_th, mob, pc.SEE_BIT); if (ROOM.isNoRanged() || room_list[dest].isNoRanged()) { pc.show("You can't find your target.\n"); return -1; } if (!targ) { show("You can't find your target.\n", pc); return -1; }//if if (targ->isMob()) { //its a SMOB targ = mob_to_smob(*targ, dest, TRUE, j_th, mob, pc.SEE_BIT | room_list[dest].getVisBit()); }//if if (!(targ = check_for_diversions(*targ, "GSM", pc))) return -1; return do_throw(*targ, pc); }//throw int do_throw(critter& targ, critter& pc) { String buf(100); int posn; if ((targ.isMob()) || (pc.isMob())) { mudlog.log(ERROR, "ERROR: MOB sent to do_throw.\n"); return -1; }//if if (pc.EQ[10]) posn = 10; else if (pc.EQ[9]) posn = 9; else { show("You must be holding or wielding something to throw it!\n", pc); return -1; }//else if (!obj_drop_by(*(pc.EQ[posn]), pc)) {//should messages too return -1; }//if can't get rid of it if (pc.EQ[posn]->OBJ_FLAGS.get(57)) { //if its a weapon if (can_start_battle(targ, pc, TRUE)) { Sprintf(buf, "readies %s %S for throwing...", get_his_her(pc), name_of_obj(*(pc.EQ[posn]), ~0)); emote(buf, pc, ROOM, TRUE); if (!did_shot_hit(targ, pc, TRUE)) { Sprintf(buf, "Your %S just misses %S!\n", pc.EQ[posn]->getName(pc.SEE_BIT), name_of_crit(targ, pc.SEE_BIT)); show(buf, pc); emote("throws but misses.", pc, ROOM, TRUE); Sprintf(buf, "%S comes whistling by your head!\n", long_name_of_obj(*(pc.EQ[posn]), ~0)); buf.Cap(); show_all(buf, room_list[targ.getCurRoomNum()]); room_list[targ.getCurRoomNum()].gainInv(pc.EQ[posn]); String cmd = "throw"; ROOM.checkForProc(cmd, NULL_STRING, pc, targ.MOB_NUM); int is_dead = FALSE; do_shot_proc(targ, pc, FALSE, is_dead); //same response as being shot }//if else { //did hit int damage = d(pc.EQ[posn]->extras[7], pc.EQ[posn]->extras[6]); exact_raw_damage(damage, NORMAL, targ, pc); targ.gainInv(pc.EQ[posn]); //item is now (in) the target int deleted_obj; gain_eq_effects(*(pc.EQ[posn]), NULL, targ, -1, FALSE, deleted_obj); if (deleted_obj) { mudlog << "ERROR: deleted obj in do_throw." << endl; return 0; } if (targ.HP > 0) { //still alive Sprintf(buf, "You hit %S with your %S.", name_of_crit(targ, pc.SEE_BIT), name_of_obj(*(pc.EQ[posn]), pc.SEE_BIT)); show(buf, pc); Sprintf(buf, "%S wounds you with %s %S!\n", name_of_crit(pc, targ.SEE_BIT), get_his_her(pc), name_of_obj(*(pc.EQ[posn]), targ.SEE_BIT)); show(buf, targ); Sprintf(buf, "staggers as %S's %S hits %s!", name_of_crit(pc, ~0), name_of_obj(*(pc.EQ[posn]), targ.SEE_BIT), get_his_her(targ)); emote(buf, targ, room_list[targ.getCurRoomNum()], TRUE); int is_dead = FALSE; do_shot_proc(targ, pc, TRUE, is_dead); //same as being shot if (!is_dead) { String cmd = "throw"; ROOM.checkForProc(cmd, NULL_STRING, pc, targ.MOB_NUM); } }//if hit but not fatal else { //fatality Sprintf(buf, "Your %S sinks deep into %S's chest!\n", name_of_obj(*(pc.EQ[posn]), ~0), name_of_crit(targ, pc.SEE_BIT)); show(buf, pc); Sprintf(buf, "\b's %S sinks deep into %S's chest!\n", name_of_obj(*(pc.EQ[posn]), ~0), name_of_crit(targ, ~0)); emote(buf, pc, room_list[targ.getCurRoomNum()], TRUE); Sprintf(buf, "%S has slain you with %s %S!\n", name_of_crit(pc, targ.SEE_BIT), get_his_her(pc), name_of_obj(*(pc.EQ[posn]), ~0)); buf.Cap(); show(buf, targ); emote("twitches once and moves no more!", targ, room_list[targ.getCurRoomNum()], TRUE); alert_room_proc(targ.getCurRoomNum(), PROJECTILE_DEATH, targ, pc); agg_kills_vict(&pc, targ); }//else fatality }// else hit remove_eq_effects(*(pc.EQ[posn]), pc, FALSE, FALSE, posn); pc.EQ[posn] = NULL; //don't have it any more }// if can start battle }//if a weapon else { Sprintf(buf, "You throw %S at %S...it falls to the ground.\n", long_name_of_obj(*(pc.EQ[posn]), pc.SEE_BIT), name_of_crit(targ, pc.SEE_BIT)); show(buf, pc); Sprintf(buf, "%S drops at %S's feet.\n", name_of_obj(*(pc.EQ[posn]), ~0), name_of_crit(targ, ~0)); pemote(buf, pc, room_list[targ.getCurRoomNum()], TRUE, &targ); Sprintf(buf, "%S throws %s %S at your feet.\n", name_of_crit(pc, targ.SEE_BIT), get_his_her(pc), name_of_obj(*(pc.EQ[posn]), targ.SEE_BIT)); buf.Cap(); show(buf, targ); remove_eq_effects(*(pc.EQ[posn]), pc, FALSE, FALSE, posn); room_list[targ.getCurRoomNum()].gainInv(pc.EQ[posn]); pc.EQ[posn] = NULL; //don't have it any more }//else, not a weapon return 0; }//do_throw int did_shot_hit(critter& targ, critter& pc, int throwing = FALSE) { float pc_roll; float targ_roll; pc_roll = (3 * pc.DEX + 5 * pc.HIT + pc.LEVEL); if (targ.POS == POS_PRONE) pc_roll *= 0.25; if (room_list[targ.getCurRoomNum()].isSwamp()) {//TERRAIN TYPE SWAMP pc_roll *= 0.5; }//if if (throwing) { pc_roll = d(1, (int)(pc_roll) + get_percent_lrnd(THROWING_SKILL_NUM, pc)); }//if else { pc_roll = d(1, (int)(pc_roll) + get_percent_lrnd(ARCHERY_SKILL_NUM, pc)); }//else targ_roll = (4 * targ.DEX + 100); //the 100 offsets pc's percent lrnd if (targ.EQ[18] || is_affected_by(MAGIC_SHIELD_SKILL_NUM, targ)) targ_roll *= 2; targ_roll = d(1, (int)(targ_roll)); return (targ_roll < pc_roll); }//did_shot_hit int zcreate(int num_rooms, const String* name, int num_ticks, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.getImmLevel() < 9) { show("Eh?", pc); return -1; }//if if ((num_rooms == 1) || (name->Strlen() == 0)) { show("Usage: zcreate [num_rooms] [num_ticks] ['zone name'].\n", pc); return -1; }//if ZoneCollection::instance().createNewZone(pc, num_ticks, num_rooms, *name); return 0; }//zcreate int zenable(int znum, const String* char_name, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.getImmLevel() < 9) { show("Eh?\n", pc); return -1; }//if if (char_name->Strlen() == 0) { show("You need to specify a pc-name.\n", pc); return -1; }//if if (!check_l_range(znum, 0, NUMBER_OF_ZONES -1, pc, TRUE)) return -1; ZoneCollection::instance().elementAt(znum).addOwner(*char_name); Sprintf(buf, "You add '%S' to the owners of zone# %i.\n", char_name, znum); show(buf, pc); ZoneCollection::instance().writeSelf(); return 0; }//zenable int ch_zname(int znum, const String* new_name, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.getImmLevel() < 9) { show("Eh?\n", pc); return -1; }//if if (new_name->Strlen() == 0) { show("You need to specify a new name.\n", pc); return -1; }//if if (!check_l_range(znum, 0, NUMBER_OF_ZONES -1, pc, TRUE)) return -1; ZoneCollection::instance().elementAt(znum).setName(*new_name); Sprintf(buf, "You change zone %i's name to -:%S:-\n", znum, new_name); show(buf, pc); ZoneCollection::instance().writeSelf(); return 0; }//zenable int zdisable(int znum, const String* char_name, critter& pc) { String buf(100); if (!ok_to_do_action(NULL, "IFP", 0, pc, pc.getCurRoom(), NULL, TRUE)) { return -1; } if (pc.getImmLevel() < 9) { show("Eh?\n", pc); return -1; }//if if (char_name->Strlen() == 0) { show("You need to specify a pc-name.\n", pc); return -1; }//if if (!check_l_range(znum, 0, NUMBER_OF_ZONES -1, pc, TRUE)) return -1; if (ZoneCollection::instance().elementAt(znum).removeOwner(*char_name)) { Sprintf(buf, "You delete '%S' from the owners of zone# %i.\n", char_name, znum); show(buf, pc); ZoneCollection::instance().writeSelf(); return 0; }//if else { pc.show("Couldn't find that name in the list of owners.\n"); return -1; }//else }//zdisable int see_all(critter& pc) { if (pc.pc && pc.pc->imm_data) { pc.SEE_BIT |= 47; //all normal, and imm_invis1 if (pc.IMM_LEVEL >= 3) pc.SEE_BIT |= 16; if (pc.IMM_LEVEL >= 5) pc.SEE_BIT |= 64; if (pc.IMM_LEVEL >= 7) pc.SEE_BIT |= 128; if (pc.IMM_LEVEL >= 9) pc.SEE_BIT |= 256; if (pc.IMM_LEVEL >= 10) pc.SEE_BIT |= 512; show("You may now detect all but the most powerful beings!\n", pc); return 0; }//if else { show("Eh??\n", pc); return -1; }//else }//see_all int wizinvis(critter& pc) { if (pc.pc && pc.pc->imm_data) { pc.VIS_BIT |= 8; //imm_invis1 if (pc.IMM_LEVEL >= 3) pc.VIS_BIT |= 16; if (pc.IMM_LEVEL >= 5) pc.VIS_BIT |= 64; if (pc.IMM_LEVEL >= 7) pc.VIS_BIT |= 128; if (pc.IMM_LEVEL >= 9) pc.VIS_BIT |= 256; if (pc.IMM_LEVEL >= 10) pc.VIS_BIT |= 512; show("You are invisible to all but the most powerful beings!\n", pc); return 0; }//if else { show("Eh??\n", pc); return -1; }//else }//wizinvis /* make yourself visible, for gods only, it could be some sort of punishment for mortals to be invisible, they will have to find some other way of making themselves visible */ int visible(critter& pc) { if (pc.pc && pc.pc->imm_data) { pc.VIS_BIT = 0; emote("fades into sight.", pc, ROOM, TRUE); show("Your corporal form rejoins the living world.\n", pc); return 0; }//if else { show("Not that easy here...", pc); return -1; }//else }//visible int describe(critter& pc) { if (pc.isNpc()) { show("Eh??\n", pc); return -1; }//if show("Enter a new description for yourself.\n", pc); show("Use a solitary '~' on a line by itself to end.\n", pc); show("You may now paste descs up to 2k, ';' acts as a newline btw.\n", pc); pc.long_desc.Clear(); pc.setMode(MODE_CH_DESC); return 0; }//describe void client_command(const String* which, critter& pc) { if(which->Strlen()) { if(!strcasecmp(*which, "hegemon")) { using_client(pc); pc.setClient(HEGEMON); pc.show("Client set to: Hegemon\n"); } else if(!strcasecmp(*which, "none")) { pc.setNoClient(); pc.show("Client set to: none(telnet)\n"); } else pc.show("That client is not currently supported.\n"); return; } pc.show("\tUse 'client <client name>' to switch to that client. To turn off client support use 'client none'. To use plain telnet, turn off client support. If there is a client that you would like support added for, please contact an IMM, or use the 'idea' command.\n\nClients currently supported: Hegemon\n"); }