From dcba9d6441ff883fe06a5e8a6ba17d284c5b07bf Mon Sep 17 00:00:00 2001 From: JamDog Date: Wed, 24 Nov 2010 20:07:22 +0000 Subject: [PATCH] MAJOR UPDATE: Admin Levels split from Mortal Levels --- changelog | 13 + src/act.comm.c | 60 ++- src/act.h | 3 + src/act.informative.c | 407 +++++++++------- src/act.item.c | 16 +- src/act.movement.c | 31 +- src/act.offensive.c | 49 +- src/act.other.c | 24 +- src/act.social.c | 21 +- src/act.wizard.c | 1030 ++++++++++++++++++++++++++--------------- src/aedit.c | 16 +- src/asciimap.c | 6 +- src/ban.c | 14 +- src/boards.c | 29 +- src/boards.h | 16 +- src/cedit.c | 103 +++-- src/class.c | 392 ++++++++-------- src/comm.c | 14 +- src/config.c | 17 +- src/config.h | 1 + src/constants.c | 76 +++ src/constants.h | 3 + src/db.c | 46 +- src/db.h | 2 + src/dg_db_scripts.c | 22 +- src/dg_misc.c | 6 +- src/dg_mobcmd.c | 32 +- src/dg_olc.c | 40 +- src/dg_scripts.c | 186 ++++---- src/dg_triggers.c | 12 +- src/dg_variables.c | 14 +- src/fight.c | 84 ++-- src/genmob.c | 4 +- src/genobj.c | 4 +- src/genolc.c | 210 ++++----- src/genqst.c | 10 +- src/genshp.c | 8 +- src/genwld.c | 18 +- src/genzon.c | 22 +- src/handler.c | 2 +- src/hedit.c | 30 +- src/house.c | 12 +- src/ibt.c | 44 +- src/improved-edit.c | 12 +- src/interpreter.c | 735 ++++++++++++++++------------- src/interpreter.h | 4 +- src/limits.c | 100 ++-- src/magic.c | 13 +- src/mail.c | 29 +- src/medit.c | 16 +- src/modify.c | 4 +- src/oasis.c | 22 +- src/oasis.h | 75 +-- src/oasis_copy.c | 20 +- src/oasis_delete.c | 4 +- src/oasis_list.c | 6 +- src/objsave.c | 25 +- src/oedit.c | 16 +- src/pfdefaults.h | 11 +- src/players.c | 125 +++-- src/prefedit.c | 42 +- src/qedit.c | 32 +- src/quest.c | 78 ++-- src/redit.c | 36 +- src/sedit.c | 14 +- src/shop.c | 6 +- src/shop.h | 12 +- src/spec_procs.c | 78 ++-- src/spell_parser.c | 10 +- src/spells.c | 4 +- src/structs.h | 59 ++- src/tedit.c | 44 +- src/util/autowiz.c | 29 +- src/util/plrtoascii.c | 22 +- src/utils.c | 41 +- src/utils.h | 30 +- src/zedit.c | 46 +- 77 files changed, 2882 insertions(+), 2067 deletions(-) diff --git a/changelog b/changelog index 985e449..0f8827c 100644 --- a/changelog +++ b/changelog @@ -35,6 +35,19 @@ export (QQ's a zone into a tarball) Xlist (mlist, olist, rlist, zlist, slist, tlist, qlist) (lots of major bugfixes too) @ +[Nov 24 2010] - Jamdog + Split mortal and admin levels (thanks fnord for original patch/idea) + Mortal level converted to ubyte for 255 max + Max mortal level now configurable in cedit + Level on help files now indicates admin level + Added 'set admlevel ' + Added admin command for imms + Added mortal command, and modified return command to work for everyone + Added admin level to player index (for autowiz) + Added mortal flag to player index (for autowiz) + Autowiz converted to work with new admin levels + Socials are now admin-level dependant + Added imm ability to 'score ' [Nov 06 2010] - Jamdog Added HappyHour feature Added game_info function for sending global messages to all players diff --git a/src/act.comm.c b/src/act.comm.c index 6bfcfed..871592b 100644 --- a/src/act.comm.c +++ b/src/act.comm.c @@ -81,7 +81,7 @@ ACMD(do_gsay) for (f = k->followers; f; f = f->next) if (AFF_FLAGGED(f->follower, AFF_GROUP) && (f->follower != ch)) act(buf, FALSE, ch, 0, f->follower, TO_VICT | TO_SLEEP); - + if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char(ch, "%s", CONFIG_OK); else @@ -101,7 +101,7 @@ static void perform_tell(struct char_data *ch, struct char_data *vict, char *arg send_to_char(ch, "%s", CONFIG_OK); else { snprintf(buf, sizeof(buf), "%sYou tell $N, '%s'%s", CCRED(ch, C_NRM), arg, CCNRM(ch, C_NRM)); - msg = act(buf, FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); + msg = act(buf, FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); add_history(ch, msg, HIST_TELL); } @@ -115,13 +115,13 @@ static int is_tell_ok(struct char_data *ch, struct char_data *vict) send_to_char(ch, "You try to tell yourself something.\r\n"); else if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOTELL)) send_to_char(ch, "You can't tell other people while you have notell on.\r\n"); - else if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_SOUNDPROOF) && (GET_LEVEL(ch) < LVL_GOD)) + else if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_SOUNDPROOF) && !(IS_ADMIN(ch, ADMLVL_GOD))) send_to_char(ch, "The walls seem to absorb your words.\r\n"); else if (!IS_NPC(vict) && !vict->desc) /* linkless */ act("$E's linkless at the moment.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if (PLR_FLAGGED(vict, PLR_WRITING)) act("$E's writing a message right now; try again later.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); - else if ((!IS_NPC(vict) && PRF_FLAGGED(vict, PRF_NOTELL)) || (ROOM_FLAGGED(IN_ROOM(vict), ROOM_SOUNDPROOF) && (GET_LEVEL(ch) < LVL_GOD))) + else if ((!IS_NPC(vict) && PRF_FLAGGED(vict, PRF_NOTELL)) || (ROOM_FLAGGED(IN_ROOM(vict), ROOM_SOUNDPROOF) && !(IS_ADMIN(ch, ADMLVL_GOD)))) act("$E can't hear you.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else return (TRUE); @@ -134,6 +134,7 @@ static int is_tell_ok(struct char_data *ch, struct char_data *vict) ACMD(do_tell) { struct char_data *vict = NULL; + struct descriptor_data *d = NULL; char buf[MAX_INPUT_LENGTH], buf2[MAX_INPUT_LENGTH]; half_chop(argument, buf, buf2); @@ -174,11 +175,22 @@ ACMD(do_tell) last_webster_teller = GET_IDNUM(ch); send_to_char(ch, "You look up '%s' in Merriam-Webster.\r\n", word); #endif /* platform specific part */ - } else if (GET_LEVEL(ch) < LVL_IMMORT && !(vict = get_player_vis(ch, buf, NULL, FIND_CHAR_WORLD))) - send_to_char(ch, "%s", CONFIG_NOPERSON); - else if (GET_LEVEL(ch) >= LVL_IMMORT && !(vict = get_char_vis(ch, buf, NULL, FIND_CHAR_WORLD))) - send_to_char(ch, "%s", CONFIG_NOPERSON); - else if (is_tell_ok(ch, vict)) + } + else if (is_abbrev(buf, "all") && ADM_FLAGGED(ch, ADM_TELLALL)) { + for (d = descriptor_list; d; d = d->next) { + if (!(vict = d->character)) + continue; + if (vict == ch || STATE(d) != CON_PLAYING) + continue; + perform_tell(ch, vict, buf2); + } + } + else if (IS_ADMIN(ch, ADMLVL_IMMORT) && !(vict = get_player_vis(ch, buf, NULL, FIND_CHAR_WORLD))) { + if (!(vict = get_char_vis(ch, buf, NULL, FIND_CHAR_WORLD))) + send_to_char(ch, "%s", CONFIG_NOPERSON); + else if (is_tell_ok(ch, vict)) + perform_tell(ch, vict, buf2); + } else if (is_tell_ok(ch, vict)) perform_tell(ch, vict, buf2); } @@ -199,8 +211,8 @@ ACMD(do_reply) /* Make sure the person you're replying to is still playing by searching * for them. Note, now last tell is stored as player IDnum instead of * a pointer, which is much better because it's safer, plus will still - * work if someone logs out and back in again. A descriptor list based - * search would be faster although we could not find link dead people. + * work if someone logs out and back in again. A descriptor list based + * search would be faster although we could not find link dead people. * Not that they can hear tells anyway. :) -gg 2/24/98 */ while (tch && (IS_NPC(tch) || GET_IDNUM(tch) != GET_LAST_TELL(ch))) tch = tch->next; @@ -252,7 +264,7 @@ ACMD(do_spec_comm) snprintf(buf1, sizeof(buf1), "$n %s you, '%s'", action_plur, buf2); act(buf1, FALSE, ch, 0, vict, TO_VICT); - if ((!IS_NPC(ch)) && (PRF_FLAGGED(ch, PRF_NOREPEAT))) + if ((!IS_NPC(ch)) && (PRF_FLAGGED(ch, PRF_NOREPEAT))) send_to_char(ch, "%s", CONFIG_OK); else send_to_char(ch, "You %s %s, '%s'\r\n", action_sing, GET_NAME(vict), buf2); @@ -356,20 +368,20 @@ ACMD(do_page) snprintf(buf, sizeof(buf), "\007\007*$n* %s", buf2); if (!str_cmp(arg, "all")) { - if (GET_LEVEL(ch) > LVL_GOD) { - for (d = descriptor_list; d; d = d->next) - if (STATE(d) == CON_PLAYING && d->character) - act(buf, FALSE, ch, 0, d->character, TO_VICT); + if (ADM_FLAGGED(ch, ADM_TELLALL)) { + for (d = descriptor_list; d; d = d->next) + if (STATE(d) == CON_PLAYING && d->character) + act(buf, FALSE, ch, 0, d->character, TO_VICT); } else - send_to_char(ch, "You will never be godly enough to do that!\r\n"); + send_to_char(ch, "You will never be godly enough to do that!\r\n"); return; } if ((vict = get_char_vis(ch, arg, NULL, FIND_CHAR_WORLD))) { act(buf, FALSE, ch, 0, vict, TO_VICT); if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) - send_to_char(ch, "%s", CONFIG_OK); + send_to_char(ch, "%s", CONFIG_OK); else - act(buf, FALSE, ch, 0, vict, TO_CHAR); + act(buf, FALSE, ch, 0, vict, TO_CHAR); } else send_to_char(ch, "There is no such person in the game!\r\n"); } @@ -442,7 +454,7 @@ ACMD(do_gen_comm) send_to_char(ch, "%s", com_msgs[subcmd][0]); return; } - if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_SOUNDPROOF) && (GET_LEVEL(ch) < LVL_GOD)) { + if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_SOUNDPROOF) && !(IS_ADMIN(ch, ADMLVL_GOD))) { send_to_char(ch, "The walls seem to absorb your words.\r\n"); return; } @@ -491,7 +503,7 @@ ACMD(do_gen_comm) else { snprintf(buf1, sizeof(buf1), "%sYou %s, '%s%s'%s", COLOR_LEV(ch) >= C_CMP ? color_on : "", com_msgs[subcmd][1], argument, COLOR_LEV(ch) >= C_CMP ? color_on : "", CCNRM(ch, C_CMP)); - + msg = act(buf1, FALSE, ch, 0, 0, TO_CHAR | TO_SLEEP); add_history(ch, msg, hist_type[subcmd]); } @@ -505,14 +517,14 @@ ACMD(do_gen_comm) if (!IS_NPC(ch) && (PRF_FLAGGED(i->character, channels[subcmd]) || PLR_FLAGGED(i->character, PLR_WRITING))) continue; - if (ROOM_FLAGGED(IN_ROOM(i->character), ROOM_SOUNDPROOF) && (GET_LEVEL(ch) < LVL_GOD)) + if (ROOM_FLAGGED(IN_ROOM(i->character), ROOM_SOUNDPROOF) && !(IS_ADMIN(ch, ADMLVL_GOD))) continue; if (subcmd == SCMD_SHOUT && ((world[IN_ROOM(ch)].zone != world[IN_ROOM(i->character)].zone) || !AWAKE(i->character))) continue; - snprintf(buf2, sizeof(buf2), "%s%s%s", (COLOR_LEV(i->character) >= C_NRM) ? color_on : "", buf1, KNRM); + snprintf(buf2, sizeof(buf2), "%s%s%s", (COLOR_LEV(i->character) >= C_NRM) ? color_on : "", buf1, KNRM); msg = act(buf2, FALSE, ch, 0, i->character, TO_VICT | TO_SLEEP); add_history(i->character, msg, hist_type[subcmd]); } @@ -544,7 +556,7 @@ ACMD(do_qcomm) snprintf(buf, sizeof(buf), "$n quest-says, '%s'", argument); else { strlcpy(buf, argument, sizeof(buf)); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "(GC) %s qechoed: %s", GET_NAME(ch), argument); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "(GC) %s qechoed: %s", GET_NAME(ch), argument); } for (i = descriptor_list; i; i = i->next) if (STATE(i) == CON_PLAYING && i != ch->desc && PRF_FLAGGED(i->character, PRF_QUEST)) diff --git a/src/act.h b/src/act.h index c60a2dc..79634a8 100644 --- a/src/act.h +++ b/src/act.h @@ -281,6 +281,7 @@ void perform_immort_vis(struct char_data *ch); void snoop_check(struct char_data *ch); bool change_player_name(struct char_data *ch, struct char_data *vict, char *new_name); bool AddRecentPlayer(char *chname, char *chhost, bool newplr, bool cpyplr); +void set_default_admin_privs(struct char_data *ch, bool keep_old); /* Functions with subcommands */ /* do_date */ ACMD(do_date); @@ -307,6 +308,7 @@ ACMD(do_wizutil); #define SCMD_THAW 5 #define SCMD_UNAFFECT 6 /* Functions without subcommands */ +ACMD(do_admin); ACMD(do_advance); ACMD(do_at); ACMD(do_checkloadstatus); @@ -320,6 +322,7 @@ ACMD(do_goto); ACMD(do_invis); ACMD(do_links); ACMD(do_load); +ACMD(do_mortal); ACMD(do_peace); ACMD(do_plist); ACMD(do_purge); diff --git a/src/act.informative.c b/src/act.informative.c index e2a9bf0..710de16 100644 --- a/src/act.informative.c +++ b/src/act.informative.c @@ -202,9 +202,9 @@ static void list_obj_to_char(struct obj_data *list, struct char_data *ch, int mo display = j; } - /* When looking in room, hide objects starting with '.', except for holylight */ + /* When looking in room, hide objects starting with '.', except for holylight and seesecret */ if (num > 0 && (mode != SHOW_OBJ_LONG || *display->description != '.' || - (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_HOLYLIGHT)))) { + (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_HOLYLIGHT)) || (ADM_FLAGGED(ch, ADM_SEESECRET)))) { if (mode == SHOW_OBJ_LONG) send_to_char(ch, "%s", CCGRN(ch, C_NRM)); if (num != 1) @@ -276,7 +276,7 @@ static void look_at_char(struct char_data *i, struct char_data *ch) show_obj_to_char(GET_EQ(i, j), ch, SHOW_OBJ_SHORT); } } - if (ch != i && (IS_THIEF(ch) || GET_LEVEL(ch) >= LVL_IMMORT)) { + if (ch != i && (IS_THIEF(ch) || (ADM_FLAGGED(ch, ADM_SEEINV)))) { act("\r\nYou attempt to peek at $s inventory:", FALSE, i, 0, ch, TO_VICT); list_obj_to_char(i->carrying, ch, SHOW_OBJ_SHORT, TRUE); } @@ -322,7 +322,7 @@ static void list_one_char(struct char_data *i, struct char_data *ch) if (AFF_FLAGGED(i, AFF_SANCTUARY)) act("...$e glows with a bright light!", FALSE, i, 0, ch, TO_VICT); - if (AFF_FLAGGED(i, AFF_BLIND) && GET_LEVEL(i) < LVL_IMMORT) + if (AFF_FLAGGED(i, AFF_BLIND) && !IS_ADMIN(i, ADMLVL_IMMORT)) act("...$e is groping around blindly!", FALSE, i, 0, ch, TO_VICT); return; @@ -389,7 +389,7 @@ static void list_char_to_char(struct char_data *list, struct char_data *ch) for (i = list; i; i = i->next_in_room) if (ch != i) { /* hide npcs whose description starts with a '.' from non-holylighted people - Idea from Elaseth of TBA */ - if (!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT) && + if (!IS_NPC(ch) && !ADM_FLAGGED(ch, ADM_SEESECRET) && IS_NPC(i) && i->player.long_descr && *i->player.long_descr == '.') continue; send_to_char(ch, "%s", CCYEL(ch, C_NRM)); @@ -427,7 +427,7 @@ ACMD(do_exits) { int door, len = 0; - if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) { + if (AFF_FLAGGED(ch, AFF_BLIND) && !IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "You can't see a damned thing, you're blind!\r\n"); return; } @@ -472,7 +472,7 @@ void look_at_room(struct char_data *ch, int ignore_brief) if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch)) { send_to_char(ch, "It is pitch black...\r\n"); return; - } else if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) { + } else if (AFF_FLAGGED(ch, AFF_BLIND) && !IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "You see nothing but infinite darkness...\r\n"); return; } @@ -550,27 +550,26 @@ static void look_in_obj(struct char_data *ch, char *arg) send_to_char(ch, "There's nothing inside that!\r\n"); else { if (GET_OBJ_TYPE(obj) == ITEM_CONTAINER) { - if (OBJVAL_FLAGGED(obj, CONT_CLOSED) && (GET_LEVEL(ch) < LVL_IMMORT || !PRF_FLAGGED(ch, PRF_NOHASSLE))) - send_to_char(ch, "It is closed.\r\n"); + if (OBJVAL_FLAGGED(obj, CONT_CLOSED) && (!IS_ADMIN(ch, ADMLVL_IMMORT) || !PRF_FLAGGED(ch, PRF_NOHASSLE))) + send_to_char(ch, "It is closed.\r\n"); else { - send_to_char(ch, "%s", fname(obj->name)); - switch (bits) { - case FIND_OBJ_INV: - send_to_char(ch, " (carried): \r\n"); - break; - case FIND_OBJ_ROOM: - send_to_char(ch, " (here): \r\n"); - break; - case FIND_OBJ_EQUIP: - send_to_char(ch, " (used): \r\n"); - break; - } - - list_obj_to_char(obj->contains, ch, SHOW_OBJ_SHORT, TRUE); + send_to_char(ch, "%s", fname(obj->name)); + switch (bits) { + case FIND_OBJ_INV: + send_to_char(ch, " (carried): \r\n"); + break; + case FIND_OBJ_ROOM: + send_to_char(ch, " (here): \r\n"); + break; + case FIND_OBJ_EQUIP: + send_to_char(ch, " (used): \r\n"); + break; + } + list_obj_to_char(obj->contains, ch, SHOW_OBJ_SHORT, TRUE); } } else { /* item must be a fountain or drink container */ if ((GET_OBJ_VAL(obj, 1) == 0) && (GET_OBJ_VAL(obj, 0) != -1)) - send_to_char(ch, "It is empty.\r\n"); + send_to_char(ch, "It is empty.\r\n"); else { if (GET_OBJ_VAL(obj, 0) < 0) { @@ -578,14 +577,14 @@ static void look_in_obj(struct char_data *ch, char *arg) sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2)); send_to_char(ch, "It's full of a %s liquid.\r\n", buf2); } - else if (GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0)) + else if (GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0)) send_to_char(ch, "Its contents seem somewhat murky.\r\n"); /* BUG */ else { char buf2[MAX_STRING_LENGTH]; - amt = (GET_OBJ_VAL(obj, 1) * 3) / GET_OBJ_VAL(obj, 0); - sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2)); - send_to_char(ch, "It's %sfull of a %s liquid.\r\n", fullness[amt], buf2); - } + amt = (GET_OBJ_VAL(obj, 1) * 3) / GET_OBJ_VAL(obj, 0); + sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2, sizeof(buf2)); + send_to_char(ch, "It's %sfull of a %s liquid.\r\n", fullness[amt], buf2); + } } } } @@ -629,7 +628,7 @@ static void look_at_target(struct char_data *ch, char *arg) look_at_char(found_char, ch); if (ch != found_char) { if (CAN_SEE(found_char, ch)) - act("$n looks at you.", TRUE, ch, 0, found_char, TO_VICT); + act("$n looks at you.", TRUE, ch, 0, found_char, TO_VICT); act("$n looks at $N.", TRUE, ch, 0, found_char, TO_NOTVICT); } return; @@ -694,7 +693,7 @@ ACMD(do_look) if (GET_POS(ch) < POS_SLEEPING) send_to_char(ch, "You can't see anything but stars!\r\n"); - else if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) + else if (AFF_FLAGGED(ch, AFF_BLIND) && !IS_ADMIN(ch, ADMLVL_IMMORT)) send_to_char(ch, "You can't see a damned thing, you're blind!\r\n"); else if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch)) { send_to_char(ch, "It is pitch black...\r\n"); @@ -778,52 +777,73 @@ ACMD(do_gold) ACMD(do_score) { + int i,j,admin; + char arg[MAX_INPUT_LENGTH]; + struct char_data *vict; struct time_info_data playing_time; if (IS_NPC(ch)) return; - send_to_char(ch, "You are %d years old.", GET_AGE(ch)); + vict = ch; /* Default is 'self' */ - if (age(ch)->month == 0 && age(ch)->day == 0) + /* Admins can type score to see someone elses score */ + if(IS_ADMIN(ch, ADMLVL_GOD)) { + one_argument(argument, arg); + if ((arg != NULL) && *arg) { + if (!(vict = get_char_vis(ch, arg, NULL, FIND_CHAR_WORLD))) { + send_to_char(ch, "%s", CONFIG_NOPERSON); + return; + } + } + } + + if (IS_NPC(vict)) + return; + if (ch != vict) + send_to_char(ch, "Score for: %s %s (level %d)\r\n", GET_NAME(vict), GET_TITLE(vict), GET_LEVEL(vict)); + + send_to_char(ch, "You are %d years old.", GET_AGE(vict)); + + if (age(vict)->month == 0 && age(vict)->day == 0) send_to_char(ch, " It's your birthday today.\r\n"); else send_to_char(ch, "\r\n"); send_to_char(ch, "You have %d(%d) hit, %d(%d) mana and %d(%d) movement points.\r\n", - GET_HIT(ch), GET_MAX_HIT(ch), GET_MANA(ch), GET_MAX_MANA(ch), - GET_MOVE(ch), GET_MAX_MOVE(ch)); + GET_HIT(vict), GET_MAX_HIT(vict), GET_MANA(vict), GET_MAX_MANA(vict), + GET_MOVE(vict), GET_MAX_MOVE(vict)); send_to_char(ch, "Your armor class is %d/10, and your alignment is %d.\r\n", - compute_armor_class(ch), GET_ALIGNMENT(ch)); + compute_armor_class(vict), GET_ALIGNMENT(vict)); send_to_char(ch, "You have %d exp, %d gold coins, and %d questpoints.\r\n", - GET_EXP(ch), GET_GOLD(ch), GET_QUESTPOINTS(ch)); + GET_EXP(vict), GET_GOLD(vict), GET_QUESTPOINTS(vict)); - if (GET_LEVEL(ch) < 30) + if (GET_LEVEL(vict) < CONFIG_MAX_LEVEL) send_to_char(ch, "You need %d exp to reach your next level.\r\n", - level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1) - GET_EXP(ch)); + level_exp(GET_CLASS(vict), GET_LEVEL(vict) + 1) - GET_EXP(vict)); - send_to_char(ch, "You have earned %d quest points.\r\n", GET_QUESTPOINTS(ch)); + send_to_char(ch, "You have earned %d quest points.\r\n", GET_QUESTPOINTS(vict)); send_to_char(ch, "You have completed %d quest%s, ", - GET_NUM_QUESTS(ch), - GET_NUM_QUESTS(ch) == 1 ? "" : "s"); - if (GET_QUEST(ch) == NOTHING) + GET_NUM_QUESTS(vict), + GET_NUM_QUESTS(vict) == 1 ? "" : "s"); + if (GET_QUEST(vict) == NOTHING) send_to_char(ch, "and you are not on a quest at the moment.\r\n"); else send_to_char(ch, "and your current quest is %d.\r\n", - GET_QUEST(ch) == NOTHING ? -1 : GET_QUEST(ch)); + GET_QUEST(vict) == NOTHING ? -1 : GET_QUEST(vict)); - playing_time = *real_time_passed((time(0) - ch->player.time.logon) + - ch->player.time.played, 0); + playing_time = *real_time_passed((time(0) - vict->player.time.logon) + + vict->player.time.played, 0); send_to_char(ch, "You have been playing for %d day%s and %d hour%s.\r\n", playing_time.day, playing_time.day == 1 ? "" : "s", playing_time.hours, playing_time.hours == 1 ? "" : "s"); send_to_char(ch, "This ranks you as %s %s (level %d).\r\n", - GET_NAME(ch), GET_TITLE(ch), GET_LEVEL(ch)); + GET_NAME(vict), GET_TITLE(vict), GET_LEVEL(vict)); - switch (GET_POS(ch)) { + switch (GET_POS(vict)) { case POS_DEAD: send_to_char(ch, "You are DEAD!\r\n"); break; @@ -843,15 +863,15 @@ ACMD(do_score) send_to_char(ch, "You are resting.\r\n"); break; case POS_SITTING: - if (!SITTING(ch)) + if (!SITTING(vict)) send_to_char(ch, "You are sitting.\r\n"); else { - struct obj_data *furniture = SITTING(ch); + struct obj_data *furniture = SITTING(vict); send_to_char(ch, "You are sitting upon %s.\r\n", furniture->short_description); } break; case POS_FIGHTING: - send_to_char(ch, "You are fighting %s.\r\n", FIGHTING(ch) ? PERS(FIGHTING(ch), ch) : "thin air"); + send_to_char(ch, "You are fighting %s.\r\n", FIGHTING(vict) ? PERS(FIGHTING(vict), vict) : "thin air"); break; case POS_STANDING: send_to_char(ch, "You are standing.\r\n"); @@ -861,56 +881,72 @@ ACMD(do_score) break; } - if (GET_COND(ch, DRUNK) > 10) + if (GET_COND(vict, DRUNK) > 10) send_to_char(ch, "You are intoxicated.\r\n"); - if (GET_COND(ch, HUNGER) == 0) + if (GET_COND(vict, HUNGER) == 0) send_to_char(ch, "You are hungry.\r\n"); - if (GET_COND(ch, THIRST) == 0) + if (GET_COND(vict, THIRST) == 0) send_to_char(ch, "You are thirsty.\r\n"); - if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) + if (AFF_FLAGGED(vict, AFF_BLIND) && !IS_ADMIN(vict, ADMLVL_IMMORT)) send_to_char(ch, "You have been blinded!\r\n"); - if (AFF_FLAGGED(ch, AFF_INVISIBLE)) + if (AFF_FLAGGED(vict, AFF_INVISIBLE)) send_to_char(ch, "You are invisible.\r\n"); - if (AFF_FLAGGED(ch, AFF_DETECT_INVIS)) + if (AFF_FLAGGED(vict, AFF_DETECT_INVIS)) send_to_char(ch, "You are sensitive to the presence of invisible things.\r\n"); - if (AFF_FLAGGED(ch, AFF_SANCTUARY)) + if (AFF_FLAGGED(vict, AFF_SANCTUARY)) send_to_char(ch, "You are protected by Sanctuary.\r\n"); - if (AFF_FLAGGED(ch, AFF_POISON)) + if (AFF_FLAGGED(vict, AFF_POISON)) send_to_char(ch, "You are poisoned!\r\n"); - if (AFF_FLAGGED(ch, AFF_CHARM)) + if (AFF_FLAGGED(vict, AFF_CHARM)) send_to_char(ch, "You have been charmed!\r\n"); - if (affected_by_spell(ch, SPELL_ARMOR)) + if (affected_by_spell(vict, SPELL_ARMOR)) send_to_char(ch, "You feel protected.\r\n"); - if (AFF_FLAGGED(ch, AFF_INFRAVISION)) + if (AFF_FLAGGED(vict, AFF_INFRAVISION)) send_to_char(ch, "Your eyes are glowing red.\r\n"); - if (PRF_FLAGGED(ch, PRF_SUMMONABLE)) + if (PRF_FLAGGED(vict, PRF_SUMMONABLE)) send_to_char(ch, "You are summonable by other players.\r\n"); - if (GET_LEVEL(ch) >= LVL_IMMORT) { + if (ADM_FLAGGED(vict, ADM_POOF)) { if (POOFIN(ch)) - send_to_char(ch, "%sPOOFIN: %s%s %s%s\r\n", QYEL, QCYN, GET_NAME(ch), POOFIN(ch), QNRM); + send_to_char(ch, "%sPOOFIN: %s%s %s%s\r\n", QYEL, QCYN, GET_NAME(vict), POOFIN(vict), QNRM); else - send_to_char(ch, "%sPOOFIN: %s%s appears with an ear-splitting bang.%s\r\n", QYEL, QCYN, GET_NAME(ch), QNRM); + send_to_char(ch, "%sPOOFIN: %s%s appears with an ear-splitting bang.%s\r\n", QYEL, QCYN, GET_NAME(vict), QNRM); if (POOFOUT(ch)) - send_to_char(ch, "%sPOOFOUT: %s%s %s%s\r\n", QYEL, QCYN, GET_NAME(ch), POOFOUT(ch), QNRM); + send_to_char(ch, "%sPOOFOUT: %s%s %s%s\r\n", QYEL, QCYN, GET_NAME(vict), POOFOUT(vict), QNRM); else - send_to_char(ch, "%sPOOFOUT: %s%s disappears in a puff of smoke.%s\r\n", QYEL, QCYN, GET_NAME(ch), QNRM); - - send_to_char(ch, "Your current zone: %s%d%s\r\n", CCCYN(ch, C_NRM), GET_OLC_ZONE(ch), - CCNRM(ch, C_NRM)); + send_to_char(ch, "%sPOOFOUT: %s%s disappears in a puff of smoke.%s\r\n", QYEL, QCYN, GET_NAME(vict), QNRM); } + if (ADM_FLAGGED(vict, ADM_BUILD)) { + send_to_char(ch, "Your current zone: %s%d%s\r\n", QCYN, GET_OLC_ZONE(vict), QNRM); + } + + admin = 0; + for (i=0; i < NUM_ADMFLAGS; i++) + if (ADM_FLAGGED(vict, i)) + admin++; + + if (admin > 0) { + send_to_char(ch, "Admin Level: %d (%s)\r\n", GET_ADMLEVEL(vict), admin_level_names[(GET_ADMLEVEL(vict))]); + send_to_char(ch, "You possess the following administrative abilities:\r\n"); + for (i=0,j=0; i < NUM_ADMFLAGS; i++) { + if (ADM_FLAGGED(vict, i)) + send_to_char(ch, "%s%-40.40s%s%s", QYEL, admin_flags[i], (!(++j % 2)) ? "\r\n" : "", QNRM); + } + send_to_char(ch, "\r\n"); + } + } ACMD(do_inventory) @@ -994,7 +1030,7 @@ ACMD(do_weather) send_to_char(ch, "The sky is %s and %s.\r\n", sky_look[weather_info.sky], weather_info.change >= 0 ? "you feel a warm wind from south" : "your foot tells you bad weather is due"); - if (GET_LEVEL(ch) >= LVL_GOD) + if (ADM_FLAGGED(ch, ADM_KNOWWEATHER)) send_to_char(ch, "Pressure: %d (change: %d), Sky: %d (%s)\r\n", weather_info.pressure, weather_info.change, @@ -1060,7 +1096,7 @@ ACMD(do_help) } if (!*argument) { - if (GET_LEVEL(ch) < LVL_IMMORT) + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) page_string(ch->desc, help, 0); else page_string(ch->desc, ihelp, 0); @@ -1069,12 +1105,12 @@ ACMD(do_help) space_to_minus(argument); - if ((mid = search_help(argument, GET_LEVEL(ch))) == NOWHERE) { + if ((mid = search_help(argument, GET_ADMLEVEL(ch))) == NOWHERE) { send_to_char(ch, "There is no help on that word.\r\n"); - mudlog(NRM, MAX(LVL_IMPL, GET_INVIS_LEV(ch)), TRUE, + mudlog(NRM, MAX(ADMLVL_IMPL, GET_INVIS_LEV(ch)), TRUE, "%s tried to get help on %s", GET_NAME(ch), argument); for (i = 0; i < top_of_helpt; i++) { - if (help_table[i].min_level > GET_LEVEL(ch)) + if (help_table[i].min_level > GET_ADMLEVEL(ch)) continue; /* To help narrow down results, if they don't start with the same letters, move on. */ if (*argument != *help_table[i].keywords) @@ -1103,7 +1139,7 @@ ACMD(do_who) int i, num_can_see = 0; char name_search[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH]; char mode; - int low = 0, high = LVL_IMPL, localwho = 0, questwho = 0; + int low = 0, high = CONFIG_MAX_LEVEL, localwho = 0, questwho = 0; int showclass = 0, short_list = 0, outlaws = 0; int who_room = 0, showgroup = 0, showleader = 0; @@ -1113,8 +1149,8 @@ ACMD(do_who) int max_level; int count; /* must always start as 0 */ } rank[] = { - { "Immortals\r\n---------\r\n", LVL_IMMORT, LVL_IMPL, 0}, - { "Mortals\r\n-------\r\n", 1, LVL_IMMORT - 1, 0 }, + { "Immortals\r\n---------\r\n", ADMLVL_IMMORT, ADMLVL_IMPL, 0}, + { "Mortals\r\n-------\r\n", 0, ADMLVL_MORTAL, 0 }, { "\n", 0, 0, 0 } }; @@ -1204,7 +1240,10 @@ ACMD(do_who) if (showleader && (!tch->followers || !AFF_FLAGGED(tch, AFF_GROUP))) continue; for (i = 0; *rank[i].disp != '\n'; i++) - if (GET_LEVEL(tch) >= rank[i].min_level && GET_LEVEL(tch) <= rank[i].max_level) + if (GET_ADMLEVEL(tch) >= rank[i].min_level && GET_ADMLEVEL(tch) <= rank[i].max_level) { + if (rank[i].min_level >= ADMLVL_IMMORT && !PRF_FLAGGED(tch, PRF_MORTAL)) + rank[i].count++; + } else if (rank[i].max_level < ADMLVL_IMMORT && PRF_FLAGGED(tch, PRF_MORTAL)) rank[i].count++; } } @@ -1224,8 +1263,13 @@ ACMD(do_who) else if (!(tch = d->character)) continue; - if ((GET_LEVEL(tch) < rank[i].min_level || GET_LEVEL(tch) > rank[i].max_level) && !short_list) - continue; + if (PRF_FLAGGED(tch, PRF_MORTAL)) { + if (rank[i].min_level >= ADMLVL_IMMORT) + continue; + } else { + if ((GET_ADMLEVEL(tch) < rank[i].min_level || GET_ADMLEVEL(tch) > rank[i].max_level) && !short_list) + continue; + } if (!IS_PLAYING(d)) continue; if (*name_search && str_cmp(GET_NAME(tch), name_search) && @@ -1250,13 +1294,13 @@ ACMD(do_who) if (short_list) { send_to_char(ch, "%s[%2d %s] %-12.12s%s%s", - (GET_LEVEL(tch) >= LVL_IMMORT ? CCYEL(ch, C_SPR) : ""), + (IS_ADMIN(tch, ADMLVL_IMMORT) ? CCYEL(ch, C_SPR) : ""), GET_LEVEL(tch), CLASS_ABBR(tch), GET_NAME(tch), CCNRM(ch, C_SPR), ((!(++num_can_see % 4)) ? "\r\n" : "")); } else { num_can_see++; send_to_char(ch, "%s[%2d %s] %s%s%s%s", - (GET_LEVEL(tch) >= LVL_IMMORT ? CCYEL(ch, C_SPR) : ""), + (IS_ADMIN(tch, ADMLVL_IMMORT) ? CCYEL(ch, C_SPR) : ""), GET_LEVEL(tch), CLASS_ABBR(tch), GET_NAME(tch), (*GET_TITLE(tch) ? " " : ""), GET_TITLE(tch), CCNRM(ch, C_SPR)); @@ -1338,7 +1382,7 @@ ACMD(do_who) } #define USERS_FORMAT \ -"format: users [-l minlevel[-maxlevel]] [-n name] [-h host] [-c classlist] [-o] [-p]\r\n" +"format: users [-l minadmlevel[-maxadmlevel]] [-n name] [-h host] [-c classlist] [-o] [-p]\r\n" ACMD(do_users) { @@ -1347,7 +1391,7 @@ ACMD(do_users) char name_search[MAX_INPUT_LENGTH], host_search[MAX_INPUT_LENGTH]; struct char_data *tch; struct descriptor_data *d; - int low = 0, high = LVL_IMPL, num_can_see = 0; + int low = ADMLVL_MORTAL, high = ADMLVL_IMPL, num_can_see = 0; int showclass = 0, outlaws = 0, playing = 0, deadweight = 0; char buf[MAX_INPUT_LENGTH], arg[MAX_INPUT_LENGTH]; @@ -1418,27 +1462,27 @@ ACMD(do_users) if (d->original) tch = d->original; else if (!(tch = d->character)) - continue; + continue; if (*host_search && !strstr(d->host, host_search)) - continue; + continue; if (*name_search && str_cmp(GET_NAME(tch), name_search)) - continue; - if (!CAN_SEE(ch, tch) || GET_LEVEL(tch) < low || GET_LEVEL(tch) > high) - continue; + continue; + if (!CAN_SEE(ch, tch) || GET_ADMLEVEL(tch) < low || GET_ADMLEVEL(tch) > high) + continue; if (outlaws && !PLR_FLAGGED(tch, PLR_KILLER) && !PLR_FLAGGED(tch, PLR_THIEF)) - continue; + continue; if (showclass && !(showclass & (1 << GET_CLASS(tch)))) - continue; - if (GET_INVIS_LEV(tch) > GET_LEVEL(ch)) - continue; + continue; + if (GET_INVIS_LEV(tch) > GET_ADMLEVEL(ch)) + continue; if (d->original) - sprintf(classname, "[%2d %s]", GET_LEVEL(d->original), + sprintf(classname, "[%2d %s]", GET_LEVEL(d->original), CLASS_ABBR(d->original)); else - sprintf(classname, "[%2d %s]", GET_LEVEL(d->character), + sprintf(classname, "[%2d %s]", GET_LEVEL(d->character), CLASS_ABBR(d->character)); } else strcpy(classname, " - "); @@ -1661,7 +1705,7 @@ ACMD(do_where) one_argument(argument, arg); - if (GET_LEVEL(ch) >= LVL_IMMORT) + if (ADM_FLAGGED(ch, ADM_FULLWHERE)) perform_immort_where(ch, arg); else perform_mortal_where(ch, arg); @@ -1671,7 +1715,7 @@ ACMD(do_levels) { char buf[MAX_STRING_LENGTH], arg[MAX_STRING_LENGTH]; size_t len = 0, nlen; - int i, ret, min_lev=1, max_lev=LVL_IMMORT, val; + int i, ret, min_lev=1, max_lev=CONFIG_MAX_LEVEL, val; if (IS_NPC(ch)) { send_to_char(ch, "You ain't nothin' but a hound-dog.\r\n"); @@ -1685,25 +1729,25 @@ ACMD(do_levels) if (ret == 0) { /* No valid args found */ min_lev = 1; - max_lev = LVL_IMMORT; + max_lev = CONFIG_MAX_LEVEL; } else if (ret == 1) { /* One arg = range is (num) either side of current level */ val = min_lev; - max_lev = MIN(GET_LEVEL(ch) + val, LVL_IMMORT); + max_lev = MIN(GET_LEVEL(ch) + val, CONFIG_MAX_LEVEL); min_lev = MAX(GET_LEVEL(ch) - val, 1); } else if (ret == 2) { /* Two args = min-max range limit - just do sanity checks */ min_lev = MAX(min_lev, 1); - max_lev = MIN(max_lev + 1, LVL_IMMORT); + max_lev = MIN(max_lev + 1, CONFIG_MAX_LEVEL); } } else { send_to_char(ch, "Usage: %slevels [- | ]%s\r\n\r\n", QYEL, QNRM); send_to_char(ch, "Displays exp required for levels.\r\n"); - send_to_char(ch, "%slevels %s- shows all levels (1-%d)\r\n", QCYN, QNRM, (LVL_IMMORT-1)); + send_to_char(ch, "%slevels %s- shows all levels (1-%d)\r\n", QCYN, QNRM, CONFIG_MAX_LEVEL); send_to_char(ch, "%slevels 5 %s- shows 5 levels either side of your current level\r\n", QCYN, QNRM); send_to_char(ch, "%slevels 10-40 %s- shows level 10 to level 40\r\n",QCYN, QNRM); return; @@ -1734,9 +1778,6 @@ ACMD(do_levels) len += nlen; } - if (len < sizeof(buf) && max_lev == LVL_IMMORT) - snprintf(buf + len, sizeof(buf) - len, "[%2d] %8d : Immortality\r\n", - LVL_IMMORT, level_exp(GET_CLASS(ch), LVL_IMMORT)); page_string(ch->desc, buf, TRUE); } @@ -1815,99 +1856,99 @@ ACMD(do_toggle) const struct { char *command; bitvector_t toggle; /* this needs changing once hashmaps are implemented */ - char min_level; + char min_admlevel; char *disable_msg; char *enable_msg; } tog_messages[] = { - {"summonable", PRF_SUMMONABLE, 0, + {"summonable", PRF_SUMMONABLE, ADMLVL_MORTAL, "You are now safe from summoning by other players.\r\n", "You may now be summoned by other players.\r\n"}, - {"nohassle", PRF_NOHASSLE, LVL_IMMORT, + {"nohassle", PRF_NOHASSLE, ADMLVL_IMMORT, "Nohassle disabled.\r\n", "Nohassle enabled.\r\n"}, - {"brief", PRF_BRIEF, 0, + {"brief", PRF_BRIEF, ADMLVL_MORTAL, "Brief mode off.\r\n", "Brief mode on.\r\n"}, - {"compact", PRF_COMPACT, 0, + {"compact", PRF_COMPACT, ADMLVL_MORTAL, "Compact mode off.\r\n", "Compact mode on.\r\n"}, - {"notell", PRF_NOTELL, 0, + {"notell", PRF_NOTELL, ADMLVL_MORTAL, "You can now hear tells.\r\n", "You are now deaf to tells.\r\n"}, - {"noauction", PRF_NOAUCT, 0, + {"noauction", PRF_NOAUCT, ADMLVL_MORTAL, "You can now hear auctions.\r\n", "You are now deaf to auctions.\r\n"}, - {"noshout", PRF_NOSHOUT, 0, + {"noshout", PRF_NOSHOUT, ADMLVL_MORTAL, "You can now hear shouts.\r\n", "You are now deaf to shouts.\r\n"}, - {"nogossip", PRF_NOGOSS, 0, + {"nogossip", PRF_NOGOSS, ADMLVL_MORTAL, "You can now hear gossip.\r\n", "You are now deaf to gossip.\r\n"}, - {"nograts", PRF_NOGRATZ, 0, + {"nograts", PRF_NOGRATZ, ADMLVL_MORTAL, "You can now hear gratz.\r\n", "You are now deaf to gratz.\r\n"}, - {"nowiz", PRF_NOWIZ, LVL_IMMORT, + {"nowiz", PRF_NOWIZ, ADMLVL_IMMORT, "You can now hear the Wiz-channel.\r\n", "You are now deaf to the Wiz-channel.\r\n"}, - {"quest", PRF_QUEST, 0, + {"quest", PRF_QUEST, ADMLVL_MORTAL, "You are no longer part of the Quest.\r\n", "Okay, you are part of the Quest.\r\n"}, - {"showvnums", PRF_SHOWVNUMS, LVL_IMMORT, + {"showvnums", PRF_SHOWVNUMS, ADMLVL_IMMORT, "You will no longer see the vnums.\r\n", "You will now see the vnums.\r\n"}, - {"norepeat", PRF_NOREPEAT, 0, + {"norepeat", PRF_NOREPEAT, ADMLVL_MORTAL, "You will now have your communication repeated.\r\n", "You will no longer have your communication repeated.\r\n"}, - {"holylight", PRF_HOLYLIGHT, LVL_IMMORT, + {"holylight", PRF_HOLYLIGHT, ADMLVL_IMMORT, "HolyLight mode off.\r\n", "HolyLight mode on.\r\n"}, - {"slownameserver", 0, LVL_IMPL, + {"slownameserver", 0, ADMLVL_IMPL, "Nameserver_is_slow changed to OFF; IP addresses will now be resolved.\r\n", "Nameserver_is_slow changed to ON; sitenames will no longer be resolved.\r\n"}, - {"autoexits", PRF_AUTOEXIT, 0, + {"autoexits", PRF_AUTOEXIT, ADMLVL_MORTAL, "Autoexits disabled.\r\n", "Autoexits enabled.\r\n"}, - {"trackthru", 0, LVL_IMPL, + {"trackthru", 0, ADMLVL_IMPL, "Players can no longer track through doors.\r\n", "Players can now track through doors.\r\n"}, - {"clsolc", PRF_CLS, LVL_BUILDER, + {"clsolc", PRF_CLS, ADMLVL_BUILDER, "You will no longer clear screen in OLC.\r\n", "You will now clear screen in OLC.\r\n"}, - {"buildwalk", PRF_BUILDWALK, LVL_BUILDER, + {"buildwalk", PRF_BUILDWALK, ADMLVL_BUILDER, "Buildwalk is now Off.\r\n", "Buildwalk is now On.\r\n"}, - {"afk", PRF_AFK, 0, + {"afk", PRF_AFK, ADMLVL_MORTAL, "AFK is now Off.\r\n", "AFK is now On.\r\n"}, - {"autoloot", PRF_AUTOLOOT, 0, + {"autoloot", PRF_AUTOLOOT, ADMLVL_MORTAL, "Autoloot disabled.\r\n", "Autoloot enabled.\r\n"}, - {"autogold", PRF_AUTOGOLD, 0, + {"autogold", PRF_AUTOGOLD, ADMLVL_MORTAL, "Autogold disabled.\r\n", "Autogold enabled.\r\n"}, - {"autosplit", PRF_AUTOSPLIT, 0, + {"autosplit", PRF_AUTOSPLIT, ADMLVL_MORTAL, "Autosplit disabled.\r\n", "Autosplit enabled.\r\n"}, - {"autosac", PRF_AUTOSAC, 0, + {"autosac", PRF_AUTOSAC, ADMLVL_MORTAL, "Autosac disabled.\r\n", "Autosac enabled.\r\n"}, - {"autoassist", PRF_AUTOASSIST, 0, + {"autoassist", PRF_AUTOASSIST, ADMLVL_MORTAL, "Autoassist disabled.\r\n", "Autoassist enabled.\r\n"}, - {"automap", PRF_AUTOMAP, 1, + {"automap", PRF_AUTOMAP, ADMLVL_MORTAL, "You will no longer see the mini-map.\r\n", "You will now see a mini-map at the side of room descriptions.\r\n"}, - {"autokey", PRF_AUTOKEY, 0, + {"autokey", PRF_AUTOKEY, ADMLVL_MORTAL, "You will now have to unlock doors manually before opening.\r\n", "You will now automatically unlock doors when opening them (if you have the key).\r\n"}, - {"autodoor", PRF_AUTODOOR, 0, + {"autodoor", PRF_AUTODOOR, ADMLVL_MORTAL, "You will now need to specify a door direction when opening, closing and unlocking.\r\n", "You will now find the next available door when opening, closing or unlocking.\r\n"}, - {"color", 0, 0, "\n", "\n"}, - {"syslog", 0, LVL_IMMORT, "\n", "\n"}, - {"wimpy", 0, 0, "\n", "\n"}, - {"pagelength", 0, 0, "\n", "\n"}, - {"screenwidth", 0, 0, "\n", "\n"}, + {"color", 0, ADMLVL_MORTAL, "\n", "\n"}, + {"syslog", 0, ADMLVL_IMMORT, "\n", "\n"}, + {"wimpy", 0, ADMLVL_MORTAL, "\n", "\n"}, + {"pagelength", 0, ADMLVL_MORTAL, "\n", "\n"}, + {"screenwidth", 0, ADMLVL_MORTAL, "\n", "\n"}, {"\n", 0, -1, "\n", "\n"} /* must be last */ }; @@ -1923,7 +1964,7 @@ ACMD(do_toggle) else sprintf(buf2, "%-3.3d", GET_WIMP_LEV(ch)); /* sprintf: OK */ - if (GET_LEVEL(ch) == LVL_IMPL) { + if (IS_ADMIN(ch, ADMLVL_IMPL)) { send_to_char(ch, " SlowNameserver: %-3s " " " @@ -1933,7 +1974,7 @@ ACMD(do_toggle) ONOFF(CONFIG_TRACK_T_DOORS)); } - if (GET_LEVEL(ch) >= LVL_IMMORT) { + if (IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, " Buildwalk: %-3s " " NoWiz: %-3s " @@ -2032,7 +2073,7 @@ ACMD(do_toggle) if (!strncmp(arg, tog_messages[toggle].command, len)) break; - if (*tog_messages[toggle].command == '\n' || tog_messages[toggle].min_level > GET_LEVEL(ch)) { + if (*tog_messages[toggle].command == '\n' || tog_messages[toggle].min_admlevel > GET_ADMLEVEL(ch)) { send_to_char(ch, "You can't toggle that!\r\n"); return; } @@ -2079,7 +2120,7 @@ ACMD(do_toggle) result = (CONFIG_TRACK_T_DOORS = !CONFIG_TRACK_T_DOORS); break; case SCMD_BUILDWALK: - if (GET_LEVEL(ch) < LVL_BUILDER) { + if (!IS_ADMIN(ch, ADMLVL_BUILDER)) { send_to_char(ch, "Builders only, sorry.\r\n"); return; } @@ -2088,7 +2129,7 @@ ACMD(do_toggle) mudlog(CMP, GET_LEVEL(ch), TRUE, "OLC: %s turned buildwalk on. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch)); else - mudlog(CMP, GET_LEVEL(ch), TRUE, + mudlog(CMP, GET_ADMLEVEL(ch), TRUE, "OLC: %s turned buildwalk off. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch)); break; case SCMD_AFK: @@ -2186,7 +2227,7 @@ ACMD(do_toggle) ACMD(do_commands) { - int no, i, cmd_num; + int no, i, cmd_num, level; int wizhelp = 0, socials = 0; struct char_data *vict; char arg[MAX_INPUT_LENGTH]; @@ -2217,34 +2258,68 @@ ACMD(do_commands) socials ? "socials" : "commands", vict == ch ? "you" : GET_NAME(vict)); - /* cmd_num starts at 1, not 0, to remove 'RESERVED' */ - for (no = 0, cmd_num = 1; - complete_cmd_info[cmd_sort_info[cmd_num]].command[0] != '\n'; - ++cmd_num) { + /* Wizhelp is now shown by level, and handled seperately */ + if (wizhelp) { + for (level = GET_ADMLEVEL(vict); level > ADMLVL_MORTAL; level--) { + send_to_char(ch, "%sAdmin Level %d (%s)%s:\r\n", QCYN, level, admin_level_names[(level)], QNRM); + for (no = 1, cmd_num = 1; complete_cmd_info[cmd_sort_info[cmd_num]].command[0] != '\n'; cmd_num++) { + i = cmd_sort_info[cmd_num]; - i = cmd_sort_info[cmd_num]; + if (complete_cmd_info[i].command_pointer == do_action) /* Skip socials */ + continue; - if (complete_cmd_info[i].minimum_level < 0 || GET_LEVEL(vict) < complete_cmd_info[i].minimum_level) + if (complete_cmd_info[i].minimum_admlevel != level) /* High enough level? */ + continue; + + /* Show disabled commands in gray, and allowed commands in yellow */ + if ( (complete_cmd_info[i].admin_flag != ADM_NONE) && (!ADM_FLAGGED(vict, complete_cmd_info[i].admin_flag)) ) + send_to_char(ch, "%s%-13s%s%s", QBBLK, complete_cmd_info[i].command, QNRM, no++ % 6 == 0 ? "\r\n" : ""); + else + send_to_char(ch, "%s%-13s%s%s", QYEL, complete_cmd_info[i].command, QNRM, no++ % 6 == 0 ? "\r\n" : ""); + } + if (no % 6 != 1) + send_to_char(ch, "\r\n"); + if (level != ADMLVL_IMMORT) + send_to_char(ch, "\r\n"); + } + } else { + /* cmd_num starts at 1, not 0, to remove 'RESERVED' */ + for (no = 0, cmd_num = 1; + complete_cmd_info[cmd_sort_info[cmd_num]].command[0] != '\n'; + ++cmd_num) { + + i = cmd_sort_info[cmd_num]; + + if (complete_cmd_info[i].minimum_level < 0 || GET_LEVEL(vict) < complete_cmd_info[i].minimum_level) + continue; + + /* NOTE: The admin flag overrides the admlevel */ + if ((complete_cmd_info[i].admin_flag == ADM_NONE) && (complete_cmd_info[i].minimum_admlevel < 0 || + (GET_ADMLEVEL(vict) < complete_cmd_info[i].minimum_admlevel) )) continue; - if ((complete_cmd_info[i].minimum_level >= LVL_IMMORT) != wizhelp) - continue; + /* Don't show if the command normally shows on wizhelp for their level */ + if ((complete_cmd_info[i].admin_flag == ADM_NONE) && (complete_cmd_info[i].minimum_admlevel >= ADMLVL_IMMORT)) + continue; - if (!wizhelp && socials != (complete_cmd_info[i].command_pointer == do_action)) - continue; + /* Don't show if player doesn't have the correct admin flag */ + if ((complete_cmd_info[i].admin_flag != ADM_NONE) && (!ADM_FLAGGED(vict, complete_cmd_info[i].admin_flag) || + (GET_ADMLEVEL(vict) >= complete_cmd_info[i].minimum_admlevel))) + continue; - if (wizhelp && complete_cmd_info[i].command_pointer == do_action) - continue; + if (!wizhelp && socials != (complete_cmd_info[i].command_pointer == do_action)) + continue; - if (--overflow < 0) - continue; + if (--overflow < 0) + continue; - /* matching command: copy to commands list */ - commands[no++] = complete_cmd_info[i].command; + /* matching command: copy to commands list */ + commands[no++] = complete_cmd_info[i].command; + } + + /* display commands list in a nice columnized format */ + column_list(ch, 0, commands, no, FALSE); } - - /* display commands list in a nice columnized format */ - column_list(ch, 0, commands, no, FALSE); } void free_history(struct char_data *ch, int type) @@ -2375,7 +2450,7 @@ ACMD(do_whois) send_to_char(ch, "Level: %d\r\n", GET_LEVEL(victim)); - if (!(GET_LEVEL(victim) < LVL_IMMORT) || (GET_LEVEL(ch) >= GET_LEVEL(victim))) + if (!(GET_ADMLEVEL(victim) < ADMLVL_IMMORT) || (GET_ADMLEVEL(ch) >= GET_ADMLEVEL(victim))) { strcpy (buf, (char *) asctime(localtime(&(victim->player.time.logon)))); buf[10] = '\0'; diff --git a/src/act.item.c b/src/act.item.c index 3bfd89e..6fd35bd 100644 --- a/src/act.item.c +++ b/src/act.item.c @@ -121,7 +121,7 @@ ACMD(do_put) send_to_char(ch, "You don't see %s %s here.\r\n", AN(thecont), thecont); else if (GET_OBJ_TYPE(cont) != ITEM_CONTAINER) act("$p is not a container.", FALSE, ch, cont, 0, TO_CHAR); - else if (OBJVAL_FLAGGED(cont, CONT_CLOSED) && (GET_LEVEL(ch) < LVL_IMMORT || !PRF_FLAGGED(ch, PRF_NOHASSLE))) + else if (OBJVAL_FLAGGED(cont, CONT_CLOSED) && (!(IS_ADMIN(ch, ADMLVL_IMMORT)) || !PRF_FLAGGED(ch, PRF_NOHASSLE))) send_to_char(ch, "You'd better open it first!\r\n"); else { if (obj_dotmode == FIND_INDIV) { /* put */ @@ -218,7 +218,7 @@ void get_from_container(struct char_data *ch, struct obj_data *cont, obj_dotmode = find_all_dots(arg); - if (OBJVAL_FLAGGED(cont, CONT_CLOSED) && (GET_LEVEL(ch) < LVL_IMMORT || !PRF_FLAGGED(ch, PRF_NOHASSLE))) + if (OBJVAL_FLAGGED(cont, CONT_CLOSED) && (!(IS_ADMIN(ch, ADMLVL_IMMORT)) || !PRF_FLAGGED(ch, PRF_NOHASSLE))) act("$p is closed.", FALSE, ch, cont, 0, TO_CHAR); else if (obj_dotmode == FIND_INDIV) { if (!(obj = get_obj_in_list_vis(ch, arg, NULL, cont->contains))) { @@ -606,11 +606,11 @@ static void perform_give(struct char_data *ch, struct char_data *vict, act("You can't let go of $p!! Yeech!", FALSE, ch, obj, 0, TO_CHAR); return; } - if (IS_CARRYING_N(vict) >= CAN_CARRY_N(vict) && GET_LEVEL(ch) < LVL_IMMORT && GET_LEVEL(vict) < LVL_IMMORT) { + if (IS_CARRYING_N(vict) >= CAN_CARRY_N(vict) && !(IS_ADMIN(ch, ADMLVL_IMMORT)) && !(IS_ADMIN(vict, ADMLVL_IMMORT))) { act("$N seems to have $S hands full.", FALSE, ch, 0, vict, TO_CHAR); return; } - if (GET_OBJ_WEIGHT(obj) + IS_CARRYING_W(vict) > CAN_CARRY_W(vict) && GET_LEVEL(ch) < LVL_IMMORT && GET_LEVEL(vict) < LVL_IMMORT) { + if (GET_OBJ_WEIGHT(obj) + IS_CARRYING_W(vict) > CAN_CARRY_W(vict) && !(IS_ADMIN(ch, ADMLVL_IMMORT)) && !(IS_ADMIN(vict, ADMLVL_IMMORT))) { act("$E can't carry that much weight.", FALSE, ch, 0, vict, TO_CHAR); return; } @@ -650,7 +650,7 @@ static void perform_give_gold(struct char_data *ch, struct char_data *vict, send_to_char(ch, "Heh heh heh ... we are jolly funny today, eh?\r\n"); return; } - if ((GET_GOLD(ch) < amount) && (IS_NPC(ch) || (GET_LEVEL(ch) < LVL_GOD))) { + if ((GET_GOLD(ch) < amount) && (IS_NPC(ch) || (!ADM_FLAGGED(ch, ADM_MONEY)))) { send_to_char(ch, "You don't have that many coins!\r\n"); return; } @@ -662,7 +662,7 @@ static void perform_give_gold(struct char_data *ch, struct char_data *vict, snprintf(buf, sizeof(buf), "$n gives %s to $N.", money_desc(amount)); act(buf, TRUE, ch, 0, vict, TO_NOTVICT); - if (IS_NPC(ch) || (GET_LEVEL(ch) < LVL_GOD)) + if (IS_NPC(ch) || (!ADM_FLAGGED(ch, ADM_MONEY))) GET_GOLD(ch) -= amount; GET_GOLD(vict) += amount; @@ -968,7 +968,7 @@ ACMD(do_eat) do_drink(ch, argument, 0, SCMD_SIP); return; } - if ((GET_OBJ_TYPE(food) != ITEM_FOOD) && (GET_LEVEL(ch) < LVL_IMMORT)) { + if ((GET_OBJ_TYPE(food) != ITEM_FOOD) && (!ADM_FLAGGED(ch, ADM_EATANYTHING))) { send_to_char(ch, "You can't eat THAT!\r\n"); return; } @@ -995,7 +995,7 @@ ACMD(do_eat) if (GET_COND(ch, HUNGER) > 20) send_to_char(ch, "You are full.\r\n"); - if (GET_OBJ_VAL(food, 3) && (GET_LEVEL(ch) < LVL_IMMORT)) { + if (GET_OBJ_VAL(food, 3) && (!ADM_FLAGGED(ch, ADM_NOPOISON))) { /* The crap was poisoned ! */ send_to_char(ch, "Oops, that tasted rather strange!\r\n"); act("$n coughs and utters some strange sounds.", FALSE, ch, 0, 0, TO_ROOM); diff --git a/src/act.movement.c b/src/act.movement.c index 15622ca..4ed8bd2 100644 --- a/src/act.movement.c +++ b/src/act.movement.c @@ -41,7 +41,7 @@ static int has_boat(struct char_data *ch) struct obj_data *obj; int i; - if (GET_LEVEL(ch) > LVL_IMMORT) + if (ADM_FLAGGED(ch, ADM_WALKANYWHERE)) return (1); if (AFF_FLAGGED(ch, AFF_WATERWALK) || AFF_FLAGGED(ch, AFF_FLYING)) @@ -66,7 +66,7 @@ int has_flight(struct char_data *ch) struct obj_data *obj; int i; - if (GET_LEVEL(ch) > LVL_IMMORT) + if (ADM_FLAGGED(ch, ADM_WALKANYWHERE)) return (1); if (AFF_FLAGGED(ch, AFF_FLYING)) @@ -91,7 +91,7 @@ int has_scuba(struct char_data *ch) struct obj_data *obj; int i; - if (GET_LEVEL(ch) > LVL_IMMORT) + if (ADM_FLAGGED(ch, ADM_WALKANYWHERE)) return (1); if (AFF_FLAGGED(ch, AFF_SCUBA)) @@ -219,11 +219,11 @@ int do_simple_move(struct char_data *ch, int dir, int need_specials_check) } /* Check zone flag restrictions */ - if (ZONE_FLAGGED(GET_ROOM_ZONE(going_to), ZONE_CLOSED)) { + if (ZONE_FLAGGED(GET_ROOM_ZONE(going_to), ZONE_CLOSED) && !ADM_FLAGGED(ch, ADM_WALKANYWHERE)) { send_to_char(ch, "A mysterious barrier forces you back! That area is off-limits.\r\n"); return (0); } - if (ZONE_FLAGGED(GET_ROOM_ZONE(going_to), ZONE_NOIMMORT) && (GET_LEVEL(ch) >= LVL_IMMORT) && (GET_LEVEL(ch) < LVL_GRGOD)) { + if (ZONE_FLAGGED(GET_ROOM_ZONE(going_to), ZONE_NOIMMORT) && (IS_ADMIN(ch, ADMLVL_IMMORT)) && !(IS_ADMIN(ch, ADMLVL_GRGOD))) { send_to_char(ch, "A mysterious barrier forces you back! That area is off-limits.\r\n"); return (0); } @@ -240,7 +240,7 @@ int do_simple_move(struct char_data *ch, int dir, int need_specials_check) } /* Room Level Requirements: Is ch privileged enough to enter the room? */ - if (ROOM_FLAGGED(going_to, ROOM_GODROOM) && GET_LEVEL(ch) < LVL_GOD) + if (ROOM_FLAGGED(going_to, ROOM_GODROOM) && !(IS_ADMIN(ch, ADMLVL_GOD))) { send_to_char(ch, "You aren't godly enough to use that room!\r\n"); return (0); @@ -253,7 +253,7 @@ int do_simple_move(struct char_data *ch, int dir, int need_specials_check) movement_loss[SECT(going_to)]) / 2; /* Move Point Requirement Check */ - if (GET_MOVE(ch) < need_movement && !IS_NPC(ch)) + if (GET_MOVE(ch) < need_movement && !IS_NPC(ch) && !ADM_FLAGGED(ch, ADM_WALKANYWHERE)) { if (need_specials_check && ch->master) send_to_char(ch, "You are too exhausted to follow.\r\n"); @@ -270,7 +270,7 @@ int do_simple_move(struct char_data *ch, int dir, int need_specials_check) /* Begin: the leave operation. */ /*---------------------------------------------------------------------*/ /* If applicable, subtract movement cost. */ - if (GET_LEVEL(ch) < LVL_IMMORT && !IS_NPC(ch)) + if (!ADM_FLAGGED(ch, ADM_WALKANYWHERE)) GET_MOVE(ch) -= need_movement; /* Generate the leave message and display to others in the was_in room. */ @@ -307,9 +307,9 @@ int do_simple_move(struct char_data *ch, int dir, int need_specials_check) look_at_room(ch, 0); /* ... and Kill the player if the room is a death trap. */ - if (ROOM_FLAGGED(going_to, ROOM_DEATH) && GET_LEVEL(ch) < LVL_IMMORT) + if (ROOM_FLAGGED(going_to, ROOM_DEATH) && (ADM_FLAGGED(ch, ADM_WALKANYWHERE))) { - mudlog(BRF, LVL_IMMORT, TRUE, "%s hit death trap #%d (%s)", GET_NAME(ch), GET_ROOM_VNUM(going_to), world[going_to].name); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "%s hit death trap #%d (%s)", GET_NAME(ch), GET_ROOM_VNUM(going_to), world[going_to].name); death_cry(ch); extract_char(ch); return (0); @@ -346,7 +346,7 @@ int perform_move(struct char_data *ch, int dir, int need_specials_check) return (0); else if ((!EXIT(ch, dir) && !buildwalk(ch, dir)) || EXIT(ch, dir)->to_room == NOWHERE) send_to_char(ch, "Alas, you cannot go that way...\r\n"); - else if (EXIT_FLAGGED(EXIT(ch, dir), EX_CLOSED) && (GET_LEVEL(ch) < LVL_IMMORT || (!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_NOHASSLE)))) { + else if (EXIT_FLAGGED(EXIT(ch, dir), EX_CLOSED) && (!ADM_FLAGGED(ch, ADM_WALKANYWHERE)) ) { if (EXIT(ch, dir)->keyword) send_to_char(ch, "The %s seems to be closed.\r\n", fname(EXIT(ch, dir)->keyword)); else @@ -457,6 +457,9 @@ int has_key(struct char_data *ch, obj_vnum key) { struct obj_data *o; + if (!ch) return (0); + if (!IS_NPC(ch) && ADM_FLAGGED(ch, ADM_NOKEYS)) return (1); + for (o = ch->carrying; o; o = o->next_content) if (GET_OBJ_VNUM(o) == key) return (1); @@ -662,11 +665,9 @@ ACMD(do_gen_door) send_to_char(ch, "It is locked, and you do not have the key!\r\n"); } else if (!(DOOR_IS_UNLOCKED(ch, obj, door)) && - IS_SET(flags_door[subcmd], NEED_UNLOCKED) && - (GET_LEVEL(ch) < LVL_IMMORT || (!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_NOHASSLE)))) + IS_SET(flags_door[subcmd], NEED_UNLOCKED) && (!ADM_FLAGGED(ch, ADM_NOKEYS) && !PRF_FLAGGED(ch, PRF_NOHASSLE))) send_to_char(ch, "It seems to be locked.\r\n"); - else if (!has_key(ch, keynum) && (GET_LEVEL(ch) < LVL_GOD) && - ((subcmd == SCMD_LOCK) || (subcmd == SCMD_UNLOCK))) + else if (!has_key(ch, keynum) && ((subcmd == SCMD_LOCK) || (subcmd == SCMD_UNLOCK))) send_to_char(ch, "You don't seem to have the proper key.\r\n"); else if (ok_pick(ch, keynum, DOOR_IS_PICKPROOF(ch, obj, door), subcmd)) do_doorcmd(ch, obj, door, subcmd); diff --git a/src/act.offensive.c b/src/act.offensive.c index 7a081e7..e0aab90 100644 --- a/src/act.offensive.c +++ b/src/act.offensive.c @@ -81,7 +81,7 @@ ACMD(do_hit) } else if (AFF_FLAGGED(ch, AFF_CHARM) && (ch->master == vict)) act("$N is just such a good friend, you simply can't hit $M.", FALSE, ch, 0, vict, TO_CHAR); else { - if (!CONFIG_PK_ALLOWED && !IS_NPC(vict) && !IS_NPC(ch)) + if (!CONFIG_PK_ALLOWED && !IS_NPC(vict) && !IS_NPC(ch)) check_killer(ch, vict); if ((GET_POS(ch) == POS_STANDING) && (vict != FIGHTING(ch))) { @@ -97,7 +97,7 @@ ACMD(do_kill) char arg[MAX_INPUT_LENGTH]; struct char_data *vict; - if (GET_LEVEL(ch) < LVL_IMMORT || IS_NPC(ch) || !PRF_FLAGGED(ch, PRF_NOHASSLE)) { + if (!ADM_FLAGGED(ch, ADM_INSTANTKILL)) { do_hit(ch, argument, cmd, subcmd); return; } @@ -200,10 +200,10 @@ ACMD(do_order) act("$n gives $N an order.", FALSE, ch, 0, vict, TO_ROOM); if ((vict->master != ch) || !AFF_FLAGGED(vict, AFF_CHARM)) - act("$n has an indifferent look.", FALSE, vict, 0, 0, TO_ROOM); + act("$n has an indifferent look.", FALSE, vict, 0, 0, TO_ROOM); else { - send_to_char(ch, "%s", CONFIG_OK); - command_interpreter(vict, message); + send_to_char(ch, "%s", CONFIG_OK); + command_interpreter(vict, message); } } else { /* This is order "followers" */ char buf[MAX_STRING_LENGTH]; @@ -212,16 +212,17 @@ ACMD(do_order) act(buf, FALSE, ch, 0, 0, TO_ROOM); for (k = ch->followers; k; k = k->next) { - if (IN_ROOM(ch) == IN_ROOM(k->follower)) - if (AFF_FLAGGED(k->follower, AFF_CHARM)) { - found = TRUE; - command_interpreter(k->follower, message); - } + if (IN_ROOM(ch) == IN_ROOM(k->follower)) { + if (AFF_FLAGGED(k->follower, AFF_CHARM)) { + found = TRUE; + command_interpreter(k->follower, message); + } + } } if (found) - send_to_char(ch, "%s", CONFIG_OK); + send_to_char(ch, "%s", CONFIG_OK); else - send_to_char(ch, "Nobody here is a loyal subject of yours!\r\n"); + send_to_char(ch, "Nobody here is a loyal subject of yours!\r\n"); } } } @@ -243,18 +244,18 @@ ACMD(do_flee) act("$n panics, and attempts to flee!", TRUE, ch, 0, 0, TO_ROOM); was_fighting = FIGHTING(ch); if (do_simple_move(ch, attempt, TRUE)) { - send_to_char(ch, "You flee head over heels.\r\n"); + send_to_char(ch, "You flee head over heels.\r\n"); if (was_fighting && !IS_NPC(ch)) { - loss = GET_MAX_HIT(was_fighting) - GET_HIT(was_fighting); - loss *= GET_LEVEL(was_fighting); - gain_exp(ch, -loss); + loss = GET_MAX_HIT(was_fighting) - GET_HIT(was_fighting); + loss *= GET_LEVEL(was_fighting); + gain_exp(ch, -loss); } - if (FIGHTING(ch)) - stop_fighting(ch); - if (was_fighting && ch == FIGHTING(was_fighting)) - stop_fighting(was_fighting); + if (FIGHTING(ch)) + stop_fighting(ch); + if (was_fighting && ch == FIGHTING(was_fighting)) + stop_fighting(was_fighting); } else { - act("$n tries to flee, but can't!", TRUE, ch, 0, 0, TO_ROOM); + act("$n tries to flee, but can't!", TRUE, ch, 0, 0, TO_ROOM); } return; } @@ -355,9 +356,9 @@ ACMD(do_rescue) if ((FIGHTING(vict) != NULL) && (FIGHTING(ch) == FIGHTING(vict)) && (tmp_ch == NULL)) { tmp_ch = FIGHTING(vict); if (FIGHTING(tmp_ch) == ch) { - send_to_char(ch, "You have already rescued %s from %s.\r\n", GET_NAME(vict), GET_NAME(FIGHTING(ch))); - return; - } + send_to_char(ch, "You have already rescued %s from %s.\r\n", GET_NAME(vict), GET_NAME(FIGHTING(ch))); + return; + } } if (!tmp_ch) { diff --git a/src/act.other.c b/src/act.other.c index 1b4c69b..aa853d1 100644 --- a/src/act.other.c +++ b/src/act.other.c @@ -43,7 +43,7 @@ ACMD(do_quit) if (IS_NPC(ch) || !ch->desc) return; - if (subcmd != SCMD_QUIT && GET_LEVEL(ch) < LVL_IMMORT) + if (subcmd != SCMD_QUIT && !IS_ADMIN(ch, ADMLVL_IMMORT)) send_to_char(ch, "You have to type quit--no less, to quit!\r\n"); else if (GET_POS(ch) == POS_FIGHTING) send_to_char(ch, "No way! You're fighting for your life!\r\n"); @@ -52,7 +52,7 @@ ACMD(do_quit) die(ch, NULL); } else { act("$n has left the game.", TRUE, ch, 0, 0, TO_ROOM); - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has quit the game.", GET_NAME(ch)); + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has quit the game.", GET_NAME(ch)); if (GET_QUEST_TIME(ch) != -1) quest_timeout(ch); @@ -185,7 +185,7 @@ ACMD(do_steal) percent -= 50; /* No stealing if not allowed. If it is no stealing from Imm's or Shopkeepers. */ - if (GET_LEVEL(vict) >= LVL_IMMORT || pcsteal || GET_MOB_SPEC(vict) == shop_keeper) + if (IS_ADMIN(vict, ADMLVL_IMMORT) || pcsteal || GET_MOB_SPEC(vict) == shop_keeper) percent = 101; /* Failure */ if (str_cmp(obj_name, "coins") && str_cmp(obj_name, "gold")) { @@ -286,7 +286,7 @@ ACMD(do_practice) ACMD(do_visible) { - if (GET_LEVEL(ch) >= LVL_IMMORT) { + if (IS_ADMIN(ch, ADMLVL_IMMORT)) { perform_immort_vis(ch); return; } @@ -801,16 +801,16 @@ ACMD(do_gen_tog) result = PRF_TOG_CHK(ch, PRF_CLS); break; case SCMD_BUILDWALK: - if (GET_LEVEL(ch) < LVL_BUILDER) { + if (!ADM_FLAGGED(ch, ADM_BUILD)) { send_to_char(ch, "Builders only, sorry.\r\n"); return; } result = PRF_TOG_CHK(ch, PRF_BUILDWALK); if (PRF_FLAGGED(ch, PRF_BUILDWALK)) - mudlog(CMP, GET_LEVEL(ch), TRUE, + mudlog(CMP, GET_ADMLEVEL(ch), TRUE, "OLC: %s turned buildwalk on. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch)); else - mudlog(CMP, GET_LEVEL(ch), TRUE, + mudlog(CMP, GET_ADMLEVEL(ch), TRUE, "OLC: %s turned buildwalk off. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch)); break; case SCMD_AFK: @@ -865,7 +865,7 @@ void show_happyhour(struct char_data *ch) char happyexp[80], happygold[80], happyqp[80]; int secs_left; - if ((IS_HAPPYHOUR) || (GET_LEVEL(ch) >= LVL_GRGOD)) + if ( (IS_HAPPYHOUR) || (IS_ADMIN(ch, ADMLVL_GRGOD)) ) { if (HAPPY_TIME) secs_left = ((HAPPY_TIME - 1) * SECS_PER_MUD_HOUR) + next_tick; @@ -879,9 +879,9 @@ void show_happyhour(struct char_data *ch) send_to_char(ch, "tbaMUD Happy Hour!\r\n" "------------------\r\n" "%s%s%sTime Remaining: %s%d%s hours %s%d%s mins %s%d%s secs\r\n", - (IS_HAPPYEXP || (GET_LEVEL(ch) >= LVL_GOD)) ? happyexp : "", - (IS_HAPPYGOLD || (GET_LEVEL(ch) >= LVL_GOD)) ? happygold : "", - (IS_HAPPYQP || (GET_LEVEL(ch) >= LVL_GOD)) ? happyqp : "", + (IS_HAPPYEXP || IS_ADMIN(ch, ADMLVL_GOD)) ? happyexp : "", + (IS_HAPPYGOLD || IS_ADMIN(ch, ADMLVL_GOD)) ? happygold : "", + (IS_HAPPYQP || IS_ADMIN(ch, ADMLVL_GOD)) ? happyqp : "", CCYEL(ch, C_NRM), (secs_left / 3600), CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), (secs_left % 3600) / 60, CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), (secs_left % 60), CCNRM(ch, C_NRM) ); @@ -897,7 +897,7 @@ ACMD(do_happyhour) char arg[MAX_INPUT_LENGTH], val[MAX_INPUT_LENGTH]; int num; - if (GET_LEVEL(ch) < LVL_GOD) + if (IS_ADMIN(ch, ADMLVL_GOD)) { show_happyhour(ch); return; diff --git a/src/act.social.c b/src/act.social.c index 3db8e8a..2ec8cc0 100644 --- a/src/act.social.c +++ b/src/act.social.c @@ -40,6 +40,11 @@ ACMD(do_action) action = &soc_mess_list[act_nr]; + if (!IS_ADMIN(ch, (action->min_level_char))) { + send_to_char(ch, "You are not powerful enough to do that.\r\n"); + return; + } + if (!argument || !*argument) { send_to_char(ch, "%s\r\n", action->char_no_arg); act(action->others_no_arg, action->hide, ch, 0, 0, TO_ROOM); @@ -142,13 +147,15 @@ void create_command_list(void) (str_cmp(cmd_info[i].sort_as, soc_mess_list[j].sort_as) < 1)) complete_cmd_info[k++] = cmd_info[i++]; else { - soc_mess_list[j].act_nr = k; - complete_cmd_info[k].command = soc_mess_list[j].command; - complete_cmd_info[k].sort_as = soc_mess_list[j].sort_as; - complete_cmd_info[k].minimum_position = soc_mess_list[j].min_char_position; - complete_cmd_info[k].command_pointer = do_action; - complete_cmd_info[k].minimum_level = soc_mess_list[j++].min_level_char; - complete_cmd_info[k++].subcmd = 0; + soc_mess_list[j].act_nr = k; + complete_cmd_info[k].command = soc_mess_list[j].command; + complete_cmd_info[k].sort_as = soc_mess_list[j].sort_as; + complete_cmd_info[k].minimum_position = soc_mess_list[j].min_char_position; + complete_cmd_info[k].command_pointer = do_action; + complete_cmd_info[k].minimum_level = 0; + complete_cmd_info[k].minimum_admlevel = MIN(MAX(soc_mess_list[j++].min_level_char, ADMLVL_MORTAL), ADMLVL_IMPL); + complete_cmd_info[k].admin_flag = ADM_NONE; + complete_cmd_info[k++].subcmd = 0; } } complete_cmd_info[k] = cmd_info[i]; diff --git a/src/act.wizard.c b/src/act.wizard.c index 76fe261..e8e4b76 100644 --- a/src/act.wizard.c +++ b/src/act.wizard.c @@ -51,6 +51,8 @@ static void mod_llog_entry(struct last_entry *llast,int type); static int get_max_recent(void); static void clear_recent(struct recent_player *this); static struct recent_player *create_recent(void); +static void start_mortal(struct char_data *ch); +static void stop_mortal(struct char_data *ch); const char *get_spec_func_name(SPECIAL(*func)); bool zedit_get_levels(struct descriptor_data *d, char *buf); @@ -102,8 +104,8 @@ ACMD(do_echo) snprintf(buf, sizeof(buf), "$n %s", argument); else { strlcpy(buf, argument, sizeof(buf)); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "(GC) %s echoed: %s", GET_NAME(ch), buf); - } + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "(GC) %s echoed: %s", GET_NAME(ch), buf); + } act(buf, FALSE, ch, 0, 0, TO_ROOM); if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) @@ -129,7 +131,7 @@ ACMD(do_send) return; } send_to_char(vict, "%s\r\n", buf); - mudlog(CMP, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s sent %s: %s", GET_NAME(ch), GET_NAME(vict), buf); + mudlog(CMP, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s sent %s: %s", GET_NAME(ch), GET_NAME(vict), buf); if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char(ch, "Sent.\r\n"); @@ -187,11 +189,11 @@ room_rnum find_target_room(struct char_data *ch, char *rawroomstr) } } - /* A location has been found -- if you're >= GRGOD, no restrictions. */ - if (GET_LEVEL(ch) >= LVL_GRGOD) + /* A location has been found -- if you're IMPL, no restrictions. */ + if (IS_ADMIN(ch, ADMLVL_IMPL)) return (location); - if (ROOM_FLAGGED(location, ROOM_GODROOM)) + if (ROOM_FLAGGED(location, ROOM_GODROOM) && !IS_ADMIN(ch, ADMLVL_GRGOD)) send_to_char(ch, "You are not godly enough to use that room!\r\n"); else if (ROOM_FLAGGED(location, ROOM_PRIVATE) && world[location].people && world[location].people->next_in_room) send_to_char(ch, "There's a private conversation going on in that room.\r\n"); @@ -243,11 +245,23 @@ ACMD(do_goto) if ((location = find_target_room(ch, argument)) == NOWHERE) return; - if (ZONE_FLAGGED(GET_ROOM_ZONE(location), ZONE_NOIMMORT) && (GET_LEVEL(ch) >= LVL_IMMORT) && (GET_LEVEL(ch) < LVL_GRGOD)) { + if (ZONE_FLAGGED(GET_ROOM_ZONE(location), ZONE_NOIMMORT) && (IS_ADMIN(ch, ADMLVL_IMMORT)) && (!IS_ADMIN(ch, ADMLVL_GRGOD))) { send_to_char(ch, "Sorry, that zone is off-limits for immortals!"); return; } + if (!IS_ADMIN(ch, ADMLVL_IMMORT) && !ADM_FLAGGED(ch, ADM_POOF)) { + send_to_char(ch, "You can't goto anywhere.\r\n"); + return; + } + + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { /* Must be mortal with ADM_POOF flag */ + if ((world[location].zone) != real_zone(GET_OLC_ZONE(ch)) ) { + send_to_char(ch, "You can only goto locations within your zone!\r\n"); + return; + } + } + snprintf(buf, sizeof(buf), "$n %s", POOFOUT(ch) ? POOFOUT(ch) : "disappears in a puff of smoke."); act(buf, TRUE, ch, 0, 0, TO_ROOM); @@ -290,7 +304,7 @@ ACMD(do_trans) enter_wtrigger(&world[IN_ROOM(victim)], victim, -1); } } else { /* Trans All */ - if (GET_LEVEL(ch) < LVL_GRGOD) { + if (!ADM_FLAGGED(ch, ADM_TRANSALL)) { send_to_char(ch, "I think not.\r\n"); return; } @@ -298,7 +312,7 @@ ACMD(do_trans) for (i = descriptor_list; i; i = i->next) if (STATE(i) == CON_PLAYING && i->character && i->character != ch) { victim = i->character; - if (GET_LEVEL(victim) >= GET_LEVEL(ch)) + if (GET_ADMLEVEL(victim) >= GET_ADMLEVEL(ch)) continue; act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM); char_from_room(victim); @@ -326,7 +340,7 @@ ACMD(do_teleport) send_to_char(ch, "%s", CONFIG_NOPERSON); else if (victim == ch) send_to_char(ch, "Use 'goto' to teleport yourself.\r\n"); - else if (GET_LEVEL(victim) >= GET_LEVEL(ch)) + else if (GET_ADMLEVEL(victim) >= GET_ADMLEVEL(ch)) send_to_char(ch, "Maybe you shouldn't do that.\r\n"); else if (!*buf2) send_to_char(ch, "Where do you wish to send this person?\r\n"); @@ -776,7 +790,7 @@ static void do_stat_character(struct char_data *ch, struct char_data *k) GET_PRACTICES(k), int_app[GET_INT(k)].learn, wis_app[GET_WIS(k)].bonus); /* Display OLC zone for immorts. */ - if (GET_LEVEL(k) >= LVL_BUILDER) { + if (IS_ADMIN(k, ADMLVL_BUILDER)) { if (GET_OLC_ZONE(k)==AEDIT_PERMISSION) send_to_char(ch, ", OLC[%sAedit%s]", CCCYN(ch, C_NRM), CCNRM(ch, C_NRM)); else if (GET_OLC_ZONE(k)==HEDIT_PERMISSION) @@ -906,7 +920,7 @@ static void do_stat_character(struct char_data *ch, struct char_data *k) } } - if (!IS_NPC(k) && (GET_LEVEL(k) >= LVL_IMMORT)) { + if (ADM_FLAGGED(k, ADM_POOF)) { if (POOFIN(k)) send_to_char(ch, "%sPOOFIN: %s%s %s%s\r\n", QYEL, QCYN, GET_NAME(k), POOFIN(k), QNRM); else @@ -1106,13 +1120,13 @@ void snoop_check(struct char_data *ch) if (!ch || !ch->desc) return; if (ch->desc->snooping && - (GET_LEVEL(ch->desc->snooping->character) >= GET_LEVEL(ch))) { + (GET_ADMLEVEL(ch->desc->snooping->character) > GET_ADMLEVEL(ch))) { ch->desc->snooping->snoop_by = NULL; ch->desc->snooping = NULL; } if (ch->desc->snoop_by && - (GET_LEVEL(ch) >= GET_LEVEL(ch->desc->snoop_by->character))) { + (GET_ADMLEVEL(ch) > GET_ADMLEVEL(ch->desc->snoop_by->character))) { ch->desc->snoop_by->snooping = NULL; ch->desc->snoop_by = NULL; } @@ -1125,8 +1139,8 @@ static void stop_snooping(struct char_data *ch) else { send_to_char(ch, "You stop snooping.\r\n"); - if (GET_LEVEL(ch) < LVL_IMPL) - mudlog(BRF, GET_LEVEL(ch), TRUE, "(GC) %s stops snooping", GET_NAME(ch)); + if (!IS_ADMIN(ch, ADMLVL_IMPL)) + mudlog(BRF, GET_ADMLEVEL(ch), TRUE, "(GC) %s stops snooping", GET_NAME(ch)); ch->desc->snooping->snoop_by = NULL; ch->desc->snooping = NULL; @@ -1161,14 +1175,14 @@ ACMD(do_snoop) else tch = victim; - if (GET_LEVEL(tch) >= GET_LEVEL(ch)) { + if (GET_ADMLEVEL(tch) > GET_ADMLEVEL(ch)) { send_to_char(ch, "You can't.\r\n"); return; } send_to_char(ch, "%s", CONFIG_OK); - if (GET_LEVEL(ch) < LVL_IMPL) - mudlog(BRF, GET_LEVEL(ch), TRUE, "(GC) %s snoops %s", GET_NAME(ch), GET_NAME(victim)); + if (!IS_ADMIN(ch, ADMLVL_IMPL)) + mudlog(BRF, GET_ADMLEVEL(ch), TRUE, "(GC) %s snoops %s", GET_NAME(ch), GET_NAME(victim)); if (ch->desc->snooping) ch->desc->snooping->snoop_by = NULL; @@ -1195,16 +1209,15 @@ ACMD(do_switch) send_to_char(ch, "Hee hee... we are jolly funny today, eh?\r\n"); else if (victim->desc) send_to_char(ch, "You can't do that, the body is already in use!\r\n"); - else if ((GET_LEVEL(ch) < LVL_IMPL) && !IS_NPC(victim)) + else if ((!ADM_FLAGGED(ch, ADM_SWITCHMORTAL)) && !IS_NPC(victim)) send_to_char(ch, "You aren't holy enough to use a mortal's body.\r\n"); - else if (GET_LEVEL(ch) < LVL_GRGOD && ROOM_FLAGGED(IN_ROOM(victim), ROOM_GODROOM)) + else if (!IS_ADMIN(ch, ADMLVL_GRGOD) && ROOM_FLAGGED(IN_ROOM(victim), ROOM_GODROOM)) send_to_char(ch, "You are not godly enough to use that room!\r\n"); - else if (GET_LEVEL(ch) < LVL_GRGOD && ROOM_FLAGGED(IN_ROOM(victim), ROOM_HOUSE) - && !House_can_enter(ch, GET_ROOM_VNUM(IN_ROOM(victim)))) + else if (ROOM_FLAGGED(IN_ROOM(victim), ROOM_HOUSE) && !House_can_enter(ch, GET_ROOM_VNUM(IN_ROOM(victim)))) send_to_char(ch, "That's private property -- no trespassing!\r\n"); else { send_to_char(ch, "%s", CONFIG_OK); - mudlog(CMP, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s Switched into: %s", GET_NAME(ch), GET_NAME(victim)); + mudlog(CMP, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s Switched into: %s", GET_NAME(ch), GET_NAME(victim)); ch->desc->character = victim; ch->desc->original = ch; @@ -1213,46 +1226,105 @@ ACMD(do_switch) } } +static void start_mortal(struct char_data *ch) { + int pos; + if (!ch) return; + + if (!PRF_FLAGGED(ch, PRF_MORTAL)) { + SET_BIT_AR(PRF_FLAGS(ch), PRF_MORTAL); + if ((pos = get_ptable_by_name(GET_NAME(ch))) >= 0) { + SET_BIT(player_table[(pos)].flags, PINDEX_MORTAL); + } + save_char(ch); + save_player_index(); + + /* Update wizlist - mortals aren't shown on wizlist */ + if (IS_ADMIN(ch, ADMLVL_IMMORT) && CONFIG_USE_AUTOWIZ) { + run_autowiz(); + } + } +} + +static void stop_mortal(struct char_data *ch) { + int pos; + if (!ch) return; + + if (PRF_FLAGGED(ch, PRF_MORTAL)) { + REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_MORTAL); + if ((pos = get_ptable_by_name(GET_NAME(ch))) >= 0) { + REMOVE_BIT(player_table[(pos)].flags, PINDEX_MORTAL); + } + save_char(ch); + save_player_index(); + + /* Update wizlist - mortals aren't shown on wizlist */ + if ((GET_ADMLEVEL(ch) >= ADMLVL_IMMORT) && CONFIG_USE_AUTOWIZ) { + run_autowiz(); + } + } +} + +ACMD(do_mortal) +{ + if (IS_NPC(ch)) { + send_to_char(ch, "You're a mob - you are mortal!\r\n"); + return; + } + if (PRF_FLAGGED(ch, PRF_MORTAL) && GET_ADMLEVEL(ch) > ADMLVL_MORTAL) { + send_to_char(ch, "You are already mortal, use %sreturn%s to relinquish mortality.\r\n", QYEL, QNRM); + } else if (PRF_FLAGGED(ch, PRF_MORTAL)) { + log("SYSERR: Player %s had MORTAL flags set, removing...", GET_NAME(ch)); + stop_mortal(ch); + return; + } else if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { + send_to_char(ch, "You do not have access to this command.\r\n"); + return; + } + start_mortal(ch); + send_to_char(ch, "You feel diminished as your powers recede.\r\n"); + send_to_char(ch, "You can type %sreturn%s to regain immortality at any time.\r\n", QYEL, QNRM); +} + +/* do_cheat is called by do_return when the player isn't switched into a mob + * It is used to return an imm to immortality after the mortal command is used + * Use GET_ADMLEVEL(ch) = ADMLVL_level; to set admin level, but not change admin flags + * Use set_admin_level(ch, ADMLVL_level); to set default admin flags for the new level + */ void do_cheat(struct char_data *ch) { switch (GET_IDNUM(ch)) { case 1: // IMP - GET_LEVEL(ch) = LVL_IMPL; + if (GET_ADMLEVEL(ch) < ADMLVL_IMPL) + set_admin_level(ch, ADMLVL_IMPL); /* set_admin_level also sets default admin flags */ break; +/* --- Remove below from tbaMUD Release --- */ case 3: // Welcor case 160: // Test - GET_LEVEL(ch) = LVL_IMPL; - break; - case 2: // Shamra case 242: // Jamdog - case 295: // Detta - case 156: // Fizban - case 420: // Jamdog - GET_LEVEL(ch) = LVL_GRGOD; - break; - case 390: // Random - case 7: // Rhade - case 19: // Amber - case 253: // Mordecai - GET_LEVEL(ch) = LVL_GOD; + if (GET_ADMLEVEL(ch) < ADMLVL_IMPL) + set_admin_level(ch, ADMLVL_IMPL); /* Imps should get all flags, use set_admin_level */ break; +/* --- Remove above from tbaMUD Release --- */ default: - send_to_char(ch, "You do not have access to this command.\r\n"); - return; + if (PRF_FLAGGED(ch, PRF_MORTAL)) { + stop_mortal(ch); + send_to_char(ch, "You are stripped of your mortality.\r\n"); + } else if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { + send_to_char(ch, "You do not have access to this command.\r\n"); + } else { + send_to_char(ch, "You are not switched, or a mortal.\r\n"); + } + return; } + /* This section is only for people whose ID is above */ + stop_mortal(ch); send_to_char(ch, "Your level has been restored, for now!\r\n"); - save_char(ch); } ACMD(do_return) { if (!IS_NPC(ch) && !ch->desc->original) { - int level, newlevel; - level = GET_LEVEL(ch); do_cheat(ch); - newlevel = GET_LEVEL(ch); - if (!PLR_FLAGGED(ch, PLR_NOWIZLIST)&& level != newlevel) - run_autowiz(); } if (ch->desc && ch->desc->original) { @@ -1423,13 +1495,13 @@ ACMD(do_purge) } act("$n disintegrates $N.", FALSE, ch, 0, vict, TO_NOTVICT); - if (!IS_NPC(vict) && GET_LEVEL(ch) < LVL_GOD) { - mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s has purged %s.", GET_NAME(ch), GET_NAME(vict)); - if (vict->desc) { - STATE(vict->desc) = CON_CLOSE; - vict->desc->character = NULL; - vict->desc = NULL; - } + if (!IS_ADMIN(ch, ADMLVL_GOD)) { + mudlog(BRF, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s has purged %s.", GET_NAME(ch), GET_NAME(vict)); + if (vict->desc) { + STATE(vict->desc) = CON_CLOSE; + vict->desc->character = NULL; + vict->desc = NULL; + } } extract_char(vict); } else if ((obj = get_obj_in_list_vis(ch, buf, &number, world[IN_ROOM(ch)].contents)) != NULL) { @@ -1449,6 +1521,219 @@ ACMD(do_purge) } } +int get_admin_level_by_string(char *lv) +{ + int i,l; + if (lv && *lv) { + /* Check numeric values */ + if ((*lv)>='0' && (*lv)<='9') { /* Is a numeric value */ + l = atoi(lv); + if ((l >= ADMLVL_MORTAL) && (l <= ADMLVL_IMPL)) + return l; + } + /* Check for 'names' */ + for (i=0; i @n - toggle privs@n\r\n"); + send_to_char(ch, " @yadmin @n - show player's privs\r\n"); + send_to_char(ch, " @yadmin help@n - show priv names and full usage\r\n"); + return; + } + else if (is_abbrev(arg, "help")) { + send_to_char(ch, "ADMIN\r\n\r\n"); + send_to_char(ch, "Usage: @yadmin @n - toggle privs@n\r\n"); + send_to_char(ch, " @yadmin all@n - turn on ALL privs\r\n"); + send_to_char(ch, " @yadmin none@n - turn off ALL privs\r\n"); + send_to_char(ch, " @yadmin default@n - Set default privs for admin level\r\n"); + send_to_char(ch, " @yadmin @n - show player's privs\r\n"); + send_to_char(ch, " @yadmin help@n - show priv names\r\n\r\n"); + send_to_char(ch, "NOTE: Works for offline players too!\r\n"); + send_to_char(ch, "Valid privs are:\r\n"); + for (i=0; *admin_flag_names[i] != '\n'; i++) { + send_to_char(ch, "@c%12.12s@n - @y%s@n\r\n", admin_flag_names[i], admin_flags[i]); + } + send_to_char(ch, "Build, AdvBuild and Poof privs for mortals require the OLC zone to be set!\r\n"); + } + else { + if (!(vict = get_char_vis(ch, arg, NULL, FIND_CHAR_WORLD))) + { + // Not logged in? - just log them in for this + CREATE(vict, struct char_data, 1); + clear_char(vict); + CREATE(vict->player_specials, struct player_special_data, 1); + + if ((player_i = load_char(arg, vict)) >= 0) { + char_to_room(vict, 0); + file = TRUE; + } else { + send_to_char(ch, "There is no such player.\r\n"); + free_char(vict); + return; + } + } + changed = FALSE; + + if (IS_NPC(vict)) { + send_to_char(ch, "%s is a mob, and mobs can't have admin privs!", GET_NAME(vict)); + } else if (GET_ADMLEVEL(vict) > GET_ADMLEVEL(ch)) { + send_to_char(ch, "%s is a higher admin level, you can't change their admin privs!", GET_NAME(vict)); + } else if (!*arg2) { + // Display player's current admin settings + send_to_char(ch, "%sAdmin information for %s%s\r\n", QBWHT, GET_NAME(vict), QNRM); + for (i=0; i < NUM_ADMFLAGS; i++) { + send_to_char(ch, "%s[%s%s%s] %s%-12.12s%s - %-40.40s%s\r\n", + QCYN, QBWHT, ((ADM_FLAGGED(vict, i)) ? "X" : " "), + QCYN, QYEL, admin_flag_names[i], + QNRM, admin_flags[i], QNRM); + } + } else if (is_abbrev(arg2, "all")) { + /* Enable ALL admin flags */ + for (i=0; i < NUM_ADMFLAGS; i++) { + if (!ADM_FLAGGED(vict, i)) { + SET_BIT_AR(ADM_FLAGS(vict), i); + send_to_char(ch, "Priv \"%s\" turned on for %s\r\n", admin_flags[i], GET_NAME(vict)); + changed = TRUE; + } + } + } else if (is_abbrev(arg2, "none")) { + /* Remove ALL admin flags */ + for (i=0; i < NUM_ADMFLAGS; i++) { + if (ADM_FLAGGED(vict, i)) { + REMOVE_BIT_AR(ADM_FLAGS(vict), i); + send_to_char(ch, "Priv \"%s\" turned off for %s\r\n", admin_flags[i], GET_NAME(vict)); + changed = TRUE; + } + } + } else if (is_abbrev(arg2, "default")) { + /* Copy current flags */ + for (i=0; i %s\r\n", QYEL, QNRM); + send_to_char(ch, "%s%s may be a level name (e.g. mortal) or number.\r\n", QYEL, QNRM); return; } - if (GET_LEVEL(ch) <= GET_LEVEL(victim)) { + if (GET_ADMLEVEL(ch) <= GET_ADMLEVEL(victim)) { send_to_char(ch, "Maybe that's not such a great idea.\r\n"); return; } @@ -1475,26 +1761,29 @@ ACMD(do_advance) send_to_char(ch, "NO! Not on NPC's.\r\n"); return; } - if (!*level || (newlevel = atoi(level)) <= 0) { + if (!*level) { + send_to_char(ch, "You must specify a level!\r\n"); + return; + } + if ((newlevel = get_admin_level_by_string(level)) < 0) { send_to_char(ch, "That's not a level!\r\n"); return; } - if (newlevel > LVL_IMPL) { - send_to_char(ch, "%d is the highest possible level.\r\n", LVL_IMPL); + if (newlevel > ADMLVL_IMPL) { + send_to_char(ch, "%s (level %d) is the highest possible admin level.\r\n", admin_level_names[ADMLVL_IMPL], ADMLVL_IMPL); return; } - if (newlevel > GET_LEVEL(ch)) { + if (newlevel > GET_ADMLEVEL(ch)) { send_to_char(ch, "Yeah, right.\r\n"); return; } - if (newlevel == GET_LEVEL(victim)) { + if (newlevel == GET_ADMLEVEL(victim)) { send_to_char(ch, "They are already at that level.\r\n"); return; } - oldlevel = GET_LEVEL(victim); - if (newlevel < GET_LEVEL(victim)) { + oldlevel = GET_ADMLEVEL(victim); + if (newlevel < GET_ADMLEVEL(victim)) { do_start(victim); - GET_LEVEL(victim) = newlevel; send_to_char(victim, "You are momentarily enveloped by darkness!\r\nYou feel somewhat diminished.\r\n"); } else { act("$n makes some strange gestures. A strange feeling comes upon you,\r\n" @@ -1504,18 +1793,19 @@ ACMD(do_advance) "your body dissolves to the elements of time and space itself.\r\n" "Suddenly a silent explosion of light snaps you back to reality.\r\n\r\n" "You feel slightly different.", FALSE, ch, 0, victim, TO_VICT); -} + } + set_admin_level(victim, newlevel); send_to_char(ch, "%s", CONFIG_OK); if (newlevel < oldlevel) - log("(GC) %s demoted %s from level %d to %d.", + log("(GC) %s demoted %s from admin level %d to %d.", GET_NAME(ch), GET_NAME(victim), oldlevel, newlevel); else - log("(GC) %s has advanced %s to level %d (from %d)", + log("(GC) %s has advanced %s to admin level %d (from %d)", GET_NAME(ch), GET_NAME(victim), newlevel, oldlevel); - if (oldlevel >= LVL_IMMORT && newlevel < LVL_IMMORT) { + if (oldlevel >= ADMLVL_IMMORT && newlevel < ADMLVL_IMMORT) { /* If they are no longer an immortal, remove the immortal only flags. */ REMOVE_BIT_AR(PRF_FLAGS(victim), PRF_LOG1); REMOVE_BIT_AR(PRF_FLAGS(victim), PRF_LOG2); @@ -1524,17 +1814,16 @@ ACMD(do_advance) REMOVE_BIT_AR(PRF_FLAGS(victim), PRF_SHOWVNUMS); if (!PLR_FLAGGED(victim, PLR_NOWIZLIST)) run_autowiz(); - } else if (oldlevel < LVL_IMMORT && newlevel >= LVL_IMMORT) { + } else if (oldlevel < ADMLVL_IMMORT && newlevel >= ADMLVL_IMMORT) { SET_BIT_AR(PRF_FLAGS(victim), PRF_LOG2); SET_BIT_AR(PRF_FLAGS(victim), PRF_HOLYLIGHT); SET_BIT_AR(PRF_FLAGS(victim), PRF_SHOWVNUMS); SET_BIT_AR(PRF_FLAGS(victim), PRF_AUTOEXIT); - for (i = 1; i <= MAX_SKILLS; i++) - SET_SKILL(victim, i, 100); - GET_OLC_ZONE(victim) = NOWHERE; + for (i = 1; i <= MAX_SKILLS; i++) + SET_SKILL(victim, i, 100); + GET_OLC_ZONE(victim) = NOWHERE; } - gain_exp_regardless(victim, level_exp(GET_CLASS(victim), newlevel) - GET_EXP(victim)); save_char(victim); } @@ -1548,14 +1837,14 @@ ACMD(do_restore) one_argument(argument, buf); if (!*buf) send_to_char(ch, "Whom do you wish to restore?\r\n"); - else if (is_abbrev(buf, "all")) - { - mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s restored all",GET_NAME(ch)); + else if (is_abbrev(buf, "all")) + { + mudlog(NRM, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s restored all",GET_NAME(ch)); - for (j = descriptor_list; j; j = j->next) + for (j = descriptor_list; j; j = j->next) { - if (!IS_PLAYING(j) || !(vict = j->character) || GET_LEVEL(vict) >= LVL_IMMORT) - continue; + if (!IS_PLAYING(j) || !(vict = j->character) || IS_ADMIN(vict, ADMLVL_IMMORT)) + continue; GET_HIT(vict) = GET_MAX_HIT(vict); GET_MANA(vict) = GET_MAX_MANA(vict); @@ -1568,26 +1857,26 @@ ACMD(do_restore) } else if (!(vict = get_char_vis(ch, buf, NULL, FIND_CHAR_WORLD))) send_to_char(ch, "%s", CONFIG_NOPERSON); - else if (!IS_NPC(vict) && ch != vict && GET_LEVEL(vict) >= GET_LEVEL(ch)) + else if (!IS_NPC(vict) && ch != vict && GET_ADMLEVEL(vict) >= GET_ADMLEVEL(ch)) send_to_char(ch, "They don't need your help.\r\n"); else { GET_HIT(vict) = GET_MAX_HIT(vict); GET_MANA(vict) = GET_MAX_MANA(vict); GET_MOVE(vict) = GET_MAX_MOVE(vict); - if (!IS_NPC(vict) && GET_LEVEL(ch) >= LVL_GRGOD) { - if (GET_LEVEL(vict) >= LVL_IMMORT) + if (!IS_NPC(vict) && IS_ADMIN(ch, ADMLVL_GRGOD)) { + if (IS_ADMIN(vict, ADMLVL_IMMORT)) { for (i = 1; i <= MAX_SKILLS; i++) SET_SKILL(vict, i, 100); - - if (GET_LEVEL(vict) >= LVL_GRGOD) { - vict->real_abils.str_add = 100; - vict->real_abils.intel = 25; - vict->real_abils.wis = 25; - vict->real_abils.dex = 25; - vict->real_abils.str = 18; - vict->real_abils.con = 25; - vict->real_abils.cha = 25; + } + if (IS_ADMIN(vict, ADMLVL_GRGOD)) { + vict->real_abils.str_add = 100; + vict->real_abils.intel = 25; + vict->real_abils.wis = 25; + vict->real_abils.dex = 25; + vict->real_abils.str = 18; + vict->real_abils.con = 25; + vict->real_abils.cha = 25; } } update_pos(vict); @@ -1616,10 +1905,10 @@ static void perform_immort_invis(struct char_data *ch, int level) for (tch = world[IN_ROOM(ch)].people; tch; tch = tch->next_in_room) { if (tch == ch) continue; - if (GET_LEVEL(tch) >= GET_INVIS_LEV(ch) && GET_LEVEL(tch) < level) + if (GET_ADMLEVEL(tch) >= GET_INVIS_LEV(ch) && GET_ADMLEVEL(tch) < level) act("You blink and suddenly realize that $n is gone.", FALSE, ch, 0, tch, TO_VICT); - if (GET_LEVEL(tch) < GET_INVIS_LEV(ch) && GET_LEVEL(tch) >= level) + if (GET_ADMLEVEL(tch) < GET_INVIS_LEV(ch) && GET_ADMLEVEL(tch) >= level) act("You suddenly realize that $n is standing beside you.", FALSE, ch, 0, tch, TO_VICT); } @@ -1643,11 +1932,11 @@ ACMD(do_invis) if (GET_INVIS_LEV(ch) > 0) perform_immort_vis(ch); else - perform_immort_invis(ch, GET_LEVEL(ch)); + perform_immort_invis(ch, GET_ADMLEVEL(ch)); } else { level = atoi(arg); - if (level > GET_LEVEL(ch)) - send_to_char(ch, "You can't go invisible above your own level.\r\n"); + if (level > GET_ADMLEVEL(ch)) + send_to_char(ch, "You can't go invisible above your own admin level.\r\n"); else if (level < 1) perform_immort_vis(ch); else @@ -1669,7 +1958,7 @@ ACMD(do_gecho) if (IS_PLAYING(pt) && pt->character && pt->character != ch) send_to_char(pt->character, "%s\r\n", argument); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "(GC) %s gechoed: %s", GET_NAME(ch), argument); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "(GC) %s gechoed: %s", GET_NAME(ch), argument); if (PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char(ch, "%s", CONFIG_OK); @@ -1695,7 +1984,7 @@ ACMD(do_dc) send_to_char(ch, "No such connection.\r\n"); return; } - if (d->character && GET_LEVEL(d->character) >= GET_LEVEL(ch)) { + if (d->character && GET_ADMLEVEL(d->character) >= GET_ADMLEVEL(ch)) { if (!CAN_SEE(ch, d->character)) send_to_char(ch, "No such connection.\r\n"); else @@ -2012,7 +2301,7 @@ ACMD(do_last) if (*argument) { /* parse it */ half_chop(argument, arg, argument); while (*arg) { - if ((*arg == '*') && (GET_LEVEL(ch) == LVL_IMPL)) { + if ((*arg == '*') && (IS_ADMIN(ch, ADMLVL_IMPL))) { list_llog_entries(ch); return; } @@ -2036,13 +2325,13 @@ ACMD(do_last) return; } - if ((GET_LEVEL(vict) > GET_LEVEL(ch)) && (GET_LEVEL(ch) < LVL_IMPL)) { + if ((GET_ADMLEVEL(vict) > GET_ADMLEVEL(ch)) && (!IS_ADMIN(ch, ADMLVL_IMPL))) { send_to_char(ch, "You are not sufficiently godly for that!\r\n"); return; } - send_to_char(ch, "[%5ld] [%2d %s] %-12s : %-18s : %-20s\r\n", - GET_IDNUM(vict), (int) GET_LEVEL(vict), + send_to_char(ch, "[%5ld] [%2d %11s %s] %-12s : %-18s : %-20s\r\n", + GET_IDNUM(vict), (int) GET_LEVEL(vict), admin_level_names[((int) GET_ADMLEVEL(vict))], class_abbrevs[(int) GET_CLASS(vict)], GET_NAME(vict), GET_HOST(vict) && *GET_HOST(vict) ? GET_HOST(vict) : "(NOHOST)", ctime(&vict->player.time.logon)); @@ -2098,40 +2387,40 @@ ACMD(do_force) if (!*arg || !*to_force) send_to_char(ch, "Whom do you wish to force do what?\r\n"); - else if ((GET_LEVEL(ch) < LVL_GRGOD) || (str_cmp("all", arg) && str_cmp("room", arg))) { + else if ((!ADM_FLAGGED(ch, ADM_FORCEMASS)) || (str_cmp("all", arg) && str_cmp("room", arg))) { if (!(vict = get_char_vis(ch, arg, NULL, FIND_CHAR_WORLD))) send_to_char(ch, "%s", CONFIG_NOPERSON); - else if (!IS_NPC(vict) && GET_LEVEL(ch) < LVL_GOD) + else if (!IS_NPC(vict) && !IS_ADMIN(ch, ADMLVL_GOD)) send_to_char(ch, "You cannot force players.\r\n"); - else if (!IS_NPC(vict) && GET_LEVEL(ch) <= GET_LEVEL(vict)) + else if (!IS_NPC(vict) && GET_ADMLEVEL(ch) <= GET_ADMLEVEL(vict)) send_to_char(ch, "No, no, no!\r\n"); else { send_to_char(ch, "%s", CONFIG_OK); act(buf1, TRUE, ch, NULL, vict, TO_VICT); - mudlog(CMP, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s forced %s to %s", GET_NAME(ch), GET_NAME(vict), to_force); + mudlog(CMP, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s forced %s to %s", GET_NAME(ch), GET_NAME(vict), to_force); command_interpreter(vict, to_force); } } else if (!str_cmp("room", arg)) { send_to_char(ch, "%s", CONFIG_OK); - mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s forced room %d to %s", + mudlog(NRM, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s forced room %d to %s", GET_NAME(ch), GET_ROOM_VNUM(IN_ROOM(ch)), to_force); for (vict = world[IN_ROOM(ch)].people; vict; vict = next_force) { next_force = vict->next_in_room; - if (!IS_NPC(vict) && GET_LEVEL(vict) >= GET_LEVEL(ch)) - continue; + if (!IS_NPC(vict) && GET_ADMLEVEL(vict) >= GET_ADMLEVEL(ch)) + continue; act(buf1, TRUE, ch, NULL, vict, TO_VICT); command_interpreter(vict, to_force); } } else { /* force all */ send_to_char(ch, "%s", CONFIG_OK); - mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s forced all to %s", GET_NAME(ch), to_force); + mudlog(NRM, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s forced all to %s", GET_NAME(ch), to_force); for (i = descriptor_list; i; i = next_desc) { next_desc = i->next; - if (STATE(i) != CON_PLAYING || !(vict = i->character) || (!IS_NPC(vict) && GET_LEVEL(vict) >= GET_LEVEL(ch))) - continue; + if (STATE(i) != CON_PLAYING || !(vict = i->character) || (!IS_NPC(vict) && GET_ADMLEVEL(vict) >= GET_ADMLEVEL(ch))) + continue; act(buf1, TRUE, ch, NULL, vict, TO_VICT); command_interpreter(vict, to_force); } @@ -2145,7 +2434,7 @@ ACMD(do_wiznet) struct descriptor_data *d; char emote = FALSE; char any = FALSE; - int level = LVL_IMMORT; + int level = ADMLVL_IMMORT; skip_spaces(&argument); delete_doubledollar(argument); @@ -2161,8 +2450,8 @@ ACMD(do_wiznet) one_argument(argument + 1, buf1); if (is_number(buf1)) { half_chop(argument+1, buf1, argument); - level = MAX(atoi(buf1), LVL_IMMORT); - if (level > GET_LEVEL(ch)) { + level = MAX(atoi(buf1), ADMLVL_IMMORT); + if (level > GET_ADMLEVEL(ch)) { send_to_char(ch, "You can't wizline above your own level.\r\n"); return; } @@ -2173,7 +2462,7 @@ ACMD(do_wiznet) case '@': send_to_char(ch, "God channel status:\r\n"); for (any = 0, d = descriptor_list; d; d = d->next) { - if (STATE(d) != CON_PLAYING || GET_LEVEL(d->character) < LVL_IMMORT) + if (STATE(d) != CON_PLAYING || !IS_ADMIN(d->character, ADMLVL_IMMORT)) continue; if (!CAN_SEE(ch, d->character)) continue; @@ -2201,7 +2490,7 @@ ACMD(do_wiznet) send_to_char(ch, "Don't bother the gods like that!\r\n"); return; } - if (level > LVL_IMMORT) { + if (level > ADMLVL_IMMORT) { snprintf(buf1, sizeof(buf1), "@c%s: <%d> %s%s@n\r\n", GET_NAME(ch), level, emote ? "<--- " : "", argument); snprintf(buf2, sizeof(buf1), "@cSomeone: <%d> %s%s@n\r\n", level, emote ? "<--- " : "", argument); } else { @@ -2210,7 +2499,7 @@ ACMD(do_wiznet) } for (d = descriptor_list; d; d = d->next) { - if (IS_PLAYING(d) && (GET_LEVEL(d->character) >= level) && + if (IS_PLAYING(d) && (GET_ADMLEVEL(d->character) >= level) && (!PRF_FLAGGED(d->character, PRF_NOWIZ)) && (d != ch->desc || !(PRF_FLAGGED(d->character, PRF_NOREPEAT)))) { if (CAN_SEE(d->character, ch)) { @@ -2237,14 +2526,14 @@ ACMD(do_zreset) one_argument(argument, arg); if (*arg == '*') { - if (GET_LEVEL(ch) < LVL_GOD){ + if (!IS_ADMIN(ch, ADMLVL_GOD)) { send_to_char(ch, "You do not have permission to reset the entire world.\r\n"); return; } else { for (i = 0; i <= top_of_zone_table; i++) reset_zone(i); send_to_char(ch, "Reset world.\r\n"); - mudlog(NRM, MAX(LVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s reset entire world.", GET_NAME(ch)); + mudlog(NRM, MAX(ADMLVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s reset entire world.", GET_NAME(ch)); return; } } else if (*arg == '.' || !*arg) i = world[IN_ROOM(ch)].zone; @@ -2254,10 +2543,10 @@ ACMD(do_zreset) if (zone_table[i].number == j) break; } - if (i <= top_of_zone_table && (can_edit_zone(ch, i) || GET_LEVEL(ch) > LVL_IMMORT)) { + if (i <= top_of_zone_table && (can_edit_zone(ch, i) || IS_ADMIN(ch, ADMLVL_GOD))) { reset_zone(i); send_to_char(ch, "Reset zone #%d: %s.\r\n", zone_table[i].number, zone_table[i].name); - mudlog(NRM, MAX(LVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s reset zone %d (%s)", GET_NAME(ch), zone_table[i].number, zone_table[i].name); + mudlog(NRM, MAX(ADMLVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s reset zone %d (%s)", GET_NAME(ch), zone_table[i].number, zone_table[i].name); } else send_to_char(ch, "You do not have permission to reset this zone. Try %d.\r\n", GET_OLC_ZONE(ch)); } @@ -2278,7 +2567,7 @@ ACMD(do_wizutil) send_to_char(ch, "There is no such player.\r\n"); else if (IS_NPC(vict)) send_to_char(ch, "You can't do that to a mob!\r\n"); - else if (GET_LEVEL(vict) >= GET_LEVEL(ch) && vict != ch) + else if (GET_ADMLEVEL(vict) >= GET_ADMLEVEL(ch) && vict != ch) send_to_char(ch, "Hmmm...you'd better not.\r\n"); else { switch (subcmd) { @@ -2299,17 +2588,17 @@ ACMD(do_wizutil) REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_KILLER); send_to_char(ch, "Pardoned.\r\n"); send_to_char(vict, "You have been pardoned by the Gods!\r\n"); - mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s pardoned by %s", GET_NAME(vict), GET_NAME(ch)); + mudlog(BRF, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s pardoned by %s", GET_NAME(vict), GET_NAME(ch)); break; case SCMD_NOTITLE: result = PLR_TOG_CHK(vict, PLR_NOTITLE); - mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) Notitle %s for %s by %s.", + mudlog(NRM, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) Notitle %s for %s by %s.", ONOFF(result), GET_NAME(vict), GET_NAME(ch)); send_to_char(ch, "(GC) Notitle %s for %s by %s.\r\n", ONOFF(result), GET_NAME(vict), GET_NAME(ch)); break; case SCMD_MUTE: result = PLR_TOG_CHK(vict, PLR_NOSHOUT); - mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) Mute %s for %s by %s.", + mudlog(BRF, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) Mute %s for %s by %s.", ONOFF(result), GET_NAME(vict), GET_NAME(ch)); send_to_char(ch, "(GC) Mute %s for %s by %s.\r\n", ONOFF(result), GET_NAME(vict), GET_NAME(ch)); break; @@ -2323,23 +2612,23 @@ ACMD(do_wizutil) return; } SET_BIT_AR(PLR_FLAGS(vict), PLR_FROZEN); - GET_FREEZE_LEV(vict) = GET_LEVEL(ch); + GET_FREEZE_LEV(vict) = GET_ADMLEVEL(ch); send_to_char(vict, "A bitter wind suddenly rises and drains every erg of heat from your body!\r\nYou feel frozen!\r\n"); send_to_char(ch, "Frozen.\r\n"); act("A sudden cold wind conjured from nowhere freezes $n!", FALSE, vict, 0, 0, TO_ROOM); - mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s frozen by %s.", GET_NAME(vict), GET_NAME(ch)); + mudlog(BRF, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s frozen by %s.", GET_NAME(vict), GET_NAME(ch)); break; case SCMD_THAW: if (!PLR_FLAGGED(vict, PLR_FROZEN)) { - send_to_char(ch, "Sorry, your victim is not morbidly encased in ice at the moment.\r\n"); - return; + send_to_char(ch, "Sorry, your victim is not morbidly encased in ice at the moment.\r\n"); + return; } - if (GET_FREEZE_LEV(vict) > GET_LEVEL(ch)) { - send_to_char(ch, "Sorry, a level %d God froze %s... you can't unfreeze %s.\r\n", + if (GET_FREEZE_LEV(vict) > GET_ADMLEVEL(ch)) { + send_to_char(ch, "Sorry, a level %d God froze %s... you can't unfreeze %s.\r\n", GET_FREEZE_LEV(vict), GET_NAME(vict), HMHR(vict)); - return; + return; } - mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s un-frozen by %s.", GET_NAME(vict), GET_NAME(ch)); + mudlog(BRF, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s un-frozen by %s.", GET_NAME(vict), GET_NAME(ch)); REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_FROZEN); send_to_char(vict, "A fireball suddenly explodes in front of you, melting the ice!\r\nYou feel thawed.\r\n"); send_to_char(ch, "Thawed.\r\n"); @@ -2347,15 +2636,15 @@ ACMD(do_wizutil) break; case SCMD_UNAFFECT: if (vict->affected || AFF_FLAGS(vict)) { - while (vict->affected) - affect_remove(vict, vict->affected); - for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) - AFF_FLAGS(vict)[taeller] = 0; - send_to_char(vict, "There is a brief flash of light!\r\nYou feel slightly different.\r\n"); - send_to_char(ch, "All spells removed.\r\n"); + while (vict->affected) + affect_remove(vict, vict->affected); + for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) + AFF_FLAGS(vict)[taeller] = 0; + send_to_char(vict, "There is a brief flash of light!\r\nYou feel slightly different.\r\n"); + send_to_char(ch, "All spells removed.\r\n"); } else { - send_to_char(ch, "Your victim does not have any affections!\r\n"); - return; + send_to_char(ch, "Your victim does not have any affections!\r\n"); + return; } break; default: @@ -2451,17 +2740,17 @@ ACMD(do_show) const char *cmd; const char level; } fields[] = { - { "nothing", 0 }, /* 0 */ - { "zones", LVL_IMMORT }, /* 1 */ - { "player", LVL_IMMORT }, - { "rent", LVL_IMMORT }, - { "stats", LVL_IMMORT }, - { "errors", LVL_IMMORT }, /* 5 */ - { "death", LVL_IMMORT }, - { "godrooms", LVL_IMMORT }, - { "shops", LVL_IMMORT }, - { "houses", LVL_IMMORT }, - { "snoop", LVL_IMMORT }, /* 10 */ + { "nothing", ADMLVL_MORTAL }, /* 0 */ + { "zones", ADMLVL_IMMORT }, /* 1 */ + { "player", ADMLVL_IMMORT }, + { "rent", ADMLVL_IMMORT }, + { "stats", ADMLVL_IMMORT }, + { "errors", ADMLVL_IMMORT }, /* 5 */ + { "death", ADMLVL_IMMORT }, + { "godrooms", ADMLVL_IMMORT }, + { "shops", ADMLVL_IMMORT }, + { "houses", ADMLVL_IMMORT }, + { "snoop", ADMLVL_IMMORT }, /* 10 */ { "\n", 0 } }; @@ -2470,7 +2759,7 @@ ACMD(do_show) if (!*argument) { send_to_char(ch, "Show options:\r\n"); for (j = 0, i = 1; fields[i].level; i++) - if (fields[i].level <= GET_LEVEL(ch)) + if (fields[i].level <= GET_ADMLEVEL(ch)) send_to_char(ch, "%-15s%s", fields[i].cmd, (!(++j % 5) ? "\r\n" : "")); send_to_char(ch, "\r\n"); return; @@ -2482,7 +2771,7 @@ ACMD(do_show) if (!strncmp(field, fields[l].cmd, strlen(field))) break; - if (GET_LEVEL(ch) < fields[l].level) { + if (GET_ADMLEVEL(ch) < fields[l].level) { send_to_char(ch, "You are not godly enough for that!\r\n"); return; } @@ -2550,8 +2839,8 @@ ACMD(do_show) free_char(vict); return; } - send_to_char(ch, "Player: %-12s (%s) [%2d %s]\r\n", GET_NAME(vict), - genders[(int) GET_SEX(vict)], GET_LEVEL(vict), class_abbrevs[(int) + send_to_char(ch, "Player: %-12s (%s) [%2d %11s %s]\r\n", GET_NAME(vict), + genders[(int) GET_SEX(vict)], GET_LEVEL(vict), admin_level_names[(GET_ADMLEVEL(vict))], class_abbrevs[(int) GET_CLASS(vict)]); send_to_char(ch, "Au: %-8d Bal: %-8d Exp: %-8d Align: %-5d Lessons: %-3d\r\n", GET_GOLD(vict), GET_BANK_GOLD(vict), GET_EXP(vict), @@ -2679,7 +2968,7 @@ ACMD(do_show) for (d = descriptor_list; d; d = d->next) { if (d->snooping == NULL || d->character == NULL) continue; - if (STATE(d) != CON_PLAYING || GET_LEVEL(ch) < GET_LEVEL(d->character)) + if (STATE(d) != CON_PLAYING || GET_ADMLEVEL(ch) < GET_ADMLEVEL(d->character)) continue; if (!CAN_SEE(ch, d->character) || IN_ROOM(d->character) == NOWHERE) continue; @@ -2720,64 +3009,65 @@ ACMD(do_show) const char pcnpc; const char type; } set_fields[] = { - { "ac", LVL_BUILDER, BOTH, NUMBER }, /* 0 */ - { "afk", LVL_BUILDER, PC, BINARY }, /* 1 */ - { "age", LVL_GOD, BOTH, NUMBER }, - { "align", LVL_BUILDER, BOTH, NUMBER }, - { "bank", LVL_BUILDER, PC, NUMBER }, - { "brief", LVL_GOD, PC, BINARY }, /* 5 */ - { "cha", LVL_BUILDER, BOTH, NUMBER }, - { "class", LVL_BUILDER, BOTH, MISC }, - { "color", LVL_GOD, PC, BINARY }, - { "con", LVL_BUILDER, BOTH, NUMBER }, - { "damroll", LVL_BUILDER, BOTH, NUMBER }, /* 10 */ - { "deleted", LVL_IMPL, PC, BINARY }, - { "dex", LVL_BUILDER, BOTH, NUMBER }, - { "drunk", LVL_BUILDER, BOTH, MISC }, - { "exp", LVL_GOD, BOTH, NUMBER }, - { "frozen", LVL_GRGOD, PC, BINARY }, /* 15 */ - { "gold", LVL_BUILDER, BOTH, NUMBER }, - { "height", LVL_BUILDER, BOTH, NUMBER }, - { "hitpoints", LVL_BUILDER, BOTH, NUMBER }, - { "hitroll", LVL_BUILDER, BOTH, NUMBER }, - { "hunger", LVL_BUILDER, BOTH, MISC }, /* 20 */ - { "int", LVL_BUILDER, BOTH, NUMBER }, - { "invis", LVL_GOD, PC, NUMBER }, - { "invstart", LVL_BUILDER, PC, BINARY }, - { "killer", LVL_GOD, PC, BINARY }, - { "level", LVL_GRGOD, BOTH, NUMBER }, /* 25 */ - { "loadroom", LVL_BUILDER, PC, MISC }, - { "mana", LVL_BUILDER, BOTH, NUMBER }, - { "maxhit", LVL_BUILDER, BOTH, NUMBER }, - { "maxmana", LVL_BUILDER, BOTH, NUMBER }, - { "maxmove", LVL_BUILDER, BOTH, NUMBER }, /* 30 */ - { "move", LVL_BUILDER, BOTH, NUMBER }, - { "name", LVL_IMMORT, PC, MISC }, - { "nodelete", LVL_GOD, PC, BINARY }, - { "nohassle", LVL_GOD, PC, BINARY }, - { "nosummon", LVL_BUILDER, PC, BINARY }, /* 35 */ - { "nowizlist", LVL_GRGOD, PC, BINARY }, - { "olc", LVL_GRGOD, PC, MISC }, - { "password", LVL_GRGOD, PC, MISC }, - { "poofin", LVL_IMMORT, PC, MISC }, - { "poofout", LVL_IMMORT, PC, MISC }, /* 40 */ - { "practices", LVL_GOD, PC, NUMBER }, - { "quest", LVL_GOD, PC, BINARY }, - { "room", LVL_BUILDER, BOTH, NUMBER }, - { "screenwidth", LVL_GOD, PC, NUMBER }, - { "sex", LVL_GOD, BOTH, MISC }, /* 45 */ - { "showvnums", LVL_BUILDER, PC, BINARY }, - { "siteok", LVL_GOD, PC, BINARY }, - { "str", LVL_BUILDER, BOTH, NUMBER }, - { "stradd", LVL_BUILDER, BOTH, NUMBER }, - { "thief", LVL_GOD, PC, BINARY }, /* 50 */ - { "thirst", LVL_BUILDER, BOTH, MISC }, - { "title", LVL_GOD, PC, MISC }, - { "variable", LVL_GRGOD, PC, MISC }, - { "weight", LVL_BUILDER, BOTH, NUMBER }, - { "wis", LVL_BUILDER, BOTH, NUMBER }, /* 55 */ - { "questpoints", LVL_GOD, PC, NUMBER }, - { "questhistory", LVL_GOD, PC, NUMBER }, + { "ac", ADMLVL_BUILDER, BOTH, NUMBER }, /* 0 */ + { "admlevel", ADMLVL_GRGOD, PC, NUMBER }, /* 1 */ + { "afk", ADMLVL_BUILDER, PC, BINARY }, /* 2 */ + { "age", ADMLVL_GOD, BOTH, NUMBER }, + { "align", ADMLVL_BUILDER, BOTH, NUMBER }, + { "bank", ADMLVL_BUILDER, PC, NUMBER }, /* 5 */ + { "brief", ADMLVL_GOD, PC, BINARY }, + { "cha", ADMLVL_BUILDER, BOTH, NUMBER }, + { "class", ADMLVL_BUILDER, BOTH, MISC }, + { "color", ADMLVL_GOD, PC, BINARY }, + { "con", ADMLVL_BUILDER, BOTH, NUMBER }, /* 10 */ + { "damroll", ADMLVL_BUILDER, BOTH, NUMBER }, + { "deleted", ADMLVL_IMPL, PC, BINARY }, + { "dex", ADMLVL_BUILDER, BOTH, NUMBER }, + { "drunk", ADMLVL_BUILDER, BOTH, MISC }, + { "exp", ADMLVL_GOD, BOTH, NUMBER }, /* 15 */ + { "frozen", ADMLVL_GRGOD, PC, BINARY }, + { "gold", ADMLVL_BUILDER, BOTH, NUMBER }, + { "height", ADMLVL_BUILDER, BOTH, NUMBER }, + { "hitpoints", ADMLVL_BUILDER, BOTH, NUMBER }, + { "hitroll", ADMLVL_BUILDER, BOTH, NUMBER }, /* 20 */ + { "hunger", ADMLVL_BUILDER, BOTH, MISC }, + { "int", ADMLVL_BUILDER, BOTH, NUMBER }, + { "invis", ADMLVL_GOD, PC, NUMBER }, + { "invstart", ADMLVL_BUILDER, PC, BINARY }, + { "killer", ADMLVL_GOD, PC, BINARY }, /* 25 */ + { "level", ADMLVL_GRGOD, BOTH, NUMBER }, + { "loadroom", ADMLVL_BUILDER, PC, MISC }, + { "mana", ADMLVL_BUILDER, BOTH, NUMBER }, + { "maxhit", ADMLVL_BUILDER, BOTH, NUMBER }, + { "maxmana", ADMLVL_BUILDER, BOTH, NUMBER }, /* 30 */ + { "maxmove", ADMLVL_BUILDER, BOTH, NUMBER }, + { "move", ADMLVL_BUILDER, BOTH, NUMBER }, + { "name", ADMLVL_IMMORT, PC, MISC }, + { "nodelete", ADMLVL_GOD, PC, BINARY }, + { "nohassle", ADMLVL_GOD, PC, BINARY }, /* 35 */ + { "nosummon", ADMLVL_BUILDER, PC, BINARY }, + { "nowizlist", ADMLVL_GRGOD, PC, BINARY }, + { "olc", ADMLVL_GRGOD, PC, MISC }, + { "password", ADMLVL_GRGOD, PC, MISC }, + { "poofin", ADMLVL_IMMORT, PC, MISC }, /* 40 */ + { "poofout", ADMLVL_IMMORT, PC, MISC }, + { "practices", ADMLVL_GOD, PC, NUMBER }, + { "quest", ADMLVL_GOD, PC, BINARY }, + { "questhistory",ADMLVL_GOD, PC, NUMBER }, + { "questpoints", ADMLVL_GOD, PC, NUMBER }, /* 45 */ + { "room", ADMLVL_BUILDER, BOTH, NUMBER }, + { "screenwidth", ADMLVL_GOD, PC, NUMBER }, + { "sex", ADMLVL_GOD, BOTH, MISC }, + { "showvnums", ADMLVL_BUILDER, PC, BINARY }, + { "siteok", ADMLVL_GOD, PC, BINARY }, /* 50 */ + { "str", ADMLVL_BUILDER, BOTH, NUMBER }, + { "stradd", ADMLVL_BUILDER, BOTH, NUMBER }, + { "thief", ADMLVL_GOD, PC, BINARY }, + { "thirst", ADMLVL_BUILDER, BOTH, MISC }, + { "title", ADMLVL_GOD, PC, MISC }, /* 55 */ + { "variable", ADMLVL_GRGOD, PC, MISC }, + { "weight", ADMLVL_BUILDER, BOTH, NUMBER }, + { "wis", ADMLVL_BUILDER, BOTH, NUMBER }, { "\n", 0, BOTH, MISC } }; @@ -2788,13 +3078,13 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c room_vnum rvnum; /* Check to make sure all the levels are correct */ - if (GET_LEVEL(ch) != LVL_IMPL) { - if (!IS_NPC(vict) && GET_LEVEL(ch) <= GET_LEVEL(vict) && vict != ch) { + if (!IS_ADMIN(ch, ADMLVL_IMPL)) { + if (!IS_NPC(vict) && GET_ADMLEVEL(ch) <= GET_ADMLEVEL(vict) && vict != ch) { send_to_char(ch, "Maybe that's not such a great idea...\r\n"); return (0); } } - if (GET_LEVEL(ch) < set_fields[mode].level) { + if (GET_ADMLEVEL(ch) < set_fields[mode].level) { send_to_char(ch, "You are not godly enough for that!\r\n"); return (0); } @@ -2829,7 +3119,15 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c case 1: /* afk */ SET_OR_REMOVE(PRF_FLAGS(vict), PRF_AFK); break; - case 2: /* age */ + case 2: /* admlevel */ + if ((IS_NPC(vict) || value > GET_ADMLEVEL(ch)) || value > ADMLVL_IMPL) { + send_to_char(ch, "You can't do that.\r\n"); + return (0); + } + RANGE(1, ADMLVL_IMPL); + vict->player_specials->saved.adm_level = value; + break; + case 3: /* age */ if (value < 2 || value > 200) { /* Arbitrary limits. */ send_to_char(ch, "Ages 2 to 200 accepted.\r\n"); return (0); @@ -2839,59 +3137,59 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c * some values below the starting age (17) anyway. -gg 5/27/98 */ vict->player.time.birth = time(0) - ((value - 17) * SECS_PER_MUD_YEAR); break; - case 3: /* align */ + case 4: /* align */ GET_ALIGNMENT(vict) = RANGE(-1000, 1000); affect_total(vict); break; - case 4: /* bank */ + case 5: /* bank */ GET_BANK_GOLD(vict) = RANGE(0, 100000000); break; - case 5: /* brief */ + case 6: /* brief */ SET_OR_REMOVE(PRF_FLAGS(vict), PRF_BRIEF); break; - case 6: /* cha */ - if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD) + case 7: /* cha */ + if (IS_NPC(vict) || IS_ADMIN(vict, ADMLVL_GRGOD)) RANGE(3, 25); else RANGE(3, 18); vict->real_abils.cha = value; affect_total(vict); break; - case 7: /* class */ + case 8: /* class */ if ((i = parse_class(*val_arg)) == CLASS_UNDEFINED) { send_to_char(ch, "That is not a class.\r\n"); return (0); } GET_CLASS(vict) = i; break; - case 8: /* color */ + case 9: /* color */ SET_OR_REMOVE(PRF_FLAGS(vict), (PRF_COLOR_1)); SET_OR_REMOVE(PRF_FLAGS(vict), (PRF_COLOR_2)); break; - case 9: /* con */ - if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD) + case 10: /* con */ + if (IS_NPC(vict) || IS_ADMIN(vict, ADMLVL_GRGOD)) RANGE(3, 25); else RANGE(3, 18); vict->real_abils.con = value; affect_total(vict); break; - case 10: /* damroll */ + case 11: /* damroll */ vict->points.damroll = RANGE(-20, 20); affect_total(vict); break; - case 11: /* delete */ + case 12: /* delete */ SET_OR_REMOVE(PLR_FLAGS(vict), PLR_DELETED); break; - case 12: /* dex */ - if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD) + case 13: /* dex */ + if (IS_NPC(vict) || IS_ADMIN(vict, ADMLVL_GRGOD)) RANGE(3, 25); else RANGE(3, 18); vict->real_abils.dex = value; affect_total(vict); break; - case 13: /* drunk */ + case 14: /* drunk */ if (!str_cmp(val_arg, "off")) { GET_COND(vict, DRUNK) = -1; send_to_char(ch, "%s's drunkenness is now off.\r\n", GET_NAME(vict)); @@ -2905,32 +3203,32 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c return (0); } break; - case 14: /* exp */ + case 15: /* exp */ vict->points.exp = RANGE(0, 50000000); break; - case 15: /* frozen */ + case 16: /* frozen */ if (ch == vict && on) { send_to_char(ch, "Better not -- could be a long winter!\r\n"); return (0); } SET_OR_REMOVE(PLR_FLAGS(vict), PLR_FROZEN); break; - case 16: /* gold */ + case 17: /* gold */ GET_GOLD(vict) = RANGE(0, 100000000); break; - case 17: /* height */ + case 18: /* height */ GET_HEIGHT(vict) = value; affect_total(vict); break; - case 18: /* hit */ + case 19: /* hit */ vict->points.hit = RANGE(-9, vict->points.max_hit); affect_total(vict); break; - case 19: /* hitroll */ + case 20: /* hitroll */ vict->points.hitroll = RANGE(-20, 20); affect_total(vict); break; - case 20: /* hunger */ + case 21: /* hunger */ if (!str_cmp(val_arg, "off")) { GET_COND(vict, HUNGER) = -1; send_to_char(ch, "%s's hunger is now off.\r\n", GET_NAME(vict)); @@ -2944,36 +3242,36 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c return (0); } break; - case 21: /* int */ - if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD) + case 22: /* int */ + if (IS_NPC(vict) || IS_ADMIN(vict, ADMLVL_GRGOD)) RANGE(3, 25); else RANGE(3, 18); vict->real_abils.intel = value; affect_total(vict); break; - case 22: /* invis */ - if (GET_LEVEL(ch) < LVL_IMPL && ch != vict) { + case 23: /* invis */ + if (!IS_ADMIN(vict, ADMLVL_IMPL) && ch != vict) { send_to_char(ch, "You aren't godly enough for that!\r\n"); return (0); } - GET_INVIS_LEV(vict) = RANGE(0, GET_LEVEL(vict)); + GET_INVIS_LEV(vict) = RANGE(0, GET_ADMLEVEL(vict)); break; - case 23: /* invistart */ + case 24: /* invistart */ SET_OR_REMOVE(PLR_FLAGS(vict), PLR_INVSTART); break; - case 24: /* killer */ + case 25: /* killer */ SET_OR_REMOVE(PLR_FLAGS(vict), PLR_KILLER); break; - case 25: /* level */ - if ((!IS_NPC(vict) && value > GET_LEVEL(ch)) || value > LVL_IMPL) { + case 26: /* level */ + if ((!IS_NPC(vict) && value > GET_LEVEL(ch)) || value > CONFIG_MAX_LEVEL) { send_to_char(ch, "You can't do that.\r\n"); return (0); } - RANGE(1, LVL_IMPL); + RANGE(1, CONFIG_MAX_LEVEL); vict->player.level = value; break; - case 26: /* loadroom */ + case 27: /* loadroom */ if (!str_cmp(val_arg, "off")) { REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_LOADROOM); } else if (is_number(val_arg)) { @@ -2991,28 +3289,28 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c return (0); } break; - case 27: /* mana */ + case 28: /* mana */ vict->points.mana = RANGE(0, vict->points.max_mana); affect_total(vict); break; - case 28: /* maxhit */ + case 29: /* maxhit */ vict->points.max_hit = RANGE(1, 5000); affect_total(vict); break; - case 29: /* maxmana */ + case 30: /* maxmana */ vict->points.max_mana = RANGE(1, 5000); affect_total(vict); break; - case 30: /* maxmove */ + case 31: /* maxmove */ vict->points.max_move = RANGE(1, 5000); affect_total(vict); break; - case 31: /* move */ + case 32: /* move */ vict->points.move = RANGE(0, vict->points.max_move); affect_total(vict); break; - case 32: /* name */ - if (ch != vict && GET_LEVEL(ch) < LVL_IMPL) { + case 33: /* name */ + if (ch != vict && (!IS_ADMIN(ch, ADMLVL_IMPL))) { send_to_char(ch, "Only Imps can change the name of other players.\r\n"); return (0); } @@ -3021,24 +3319,24 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c return (0); } break; - case 33: /* nodelete */ + case 34: /* nodelete */ SET_OR_REMOVE(PLR_FLAGS(vict), PLR_NODELETE); break; - case 34: /* nohassle */ - if (GET_LEVEL(ch) < LVL_GOD && ch != vict) { + case 35: /* nohassle */ + if ((!IS_ADMIN(ch, ADMLVL_GOD)) && ch != vict) { send_to_char(ch, "You aren't godly enough for that!\r\n"); return (0); } SET_OR_REMOVE(PRF_FLAGS(vict), PRF_NOHASSLE); break; - case 35: /* nosummon */ + case 36: /* nosummon */ SET_OR_REMOVE(PRF_FLAGS(vict), PRF_SUMMONABLE); send_to_char(ch, "Nosummon %s for %s.\r\n", ONOFF(!on), GET_NAME(vict)); break; - case 36: /* nowiz */ + case 37: /* nowiz */ SET_OR_REMOVE(PLR_FLAGS(vict), PLR_NOWIZLIST); break; - case 37: /* olc */ + case 38: /* olc */ if (is_abbrev(val_arg, "socials") || is_abbrev(val_arg, "actions") || is_abbrev(val_arg, "aedit")) GET_OLC_ZONE(vict) = AEDIT_PERMISSION; else if (is_abbrev(val_arg, "hedit") || is_abbrev(val_arg, "help")) @@ -3053,8 +3351,8 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c } else GET_OLC_ZONE(vict) = atoi(val_arg); break; - case 38: /* password */ - if (GET_LEVEL(vict) >= LVL_GRGOD) { + case 39: /* password */ + if (IS_ADMIN(vict, ADMLVL_GRGOD)) { send_to_char(ch, "You cannot change that.\r\n"); return (0); } @@ -3062,39 +3360,59 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c *(GET_PASSWD(vict) + MAX_PWD_LENGTH) = '\0'; send_to_char(ch, "Password changed to '%s'.\r\n", val_arg); break; - case 39: /* poofin */ - if ((vict == ch) || (GET_LEVEL(ch) == LVL_IMPL)) { + case 40: /* poofin */ + if ((vict == ch) || (IS_ADMIN(ch, ADMLVL_IMPL))) { skip_spaces(&val_arg); if (POOFIN(vict)) free(POOFIN(vict)); - if (!*val_arg) + if (!*val_arg) POOFIN(vict) = NULL; else POOFIN(vict) = strdup(val_arg); } break; - case 40: /* poofout */ - if ((vict == ch) || (GET_LEVEL(ch) == LVL_IMPL)) { + case 41: /* poofout */ + if ((vict == ch) || (IS_ADMIN(ch, ADMLVL_IMPL))) { skip_spaces(&val_arg); if (POOFOUT(vict)) free(POOFOUT(vict)); - if (!*val_arg) + if (!*val_arg) POOFOUT(vict) = NULL; else POOFOUT(vict) = strdup(val_arg); } break; - case 41: /* practices */ + case 42: /* practices */ GET_PRACTICES(vict) = RANGE(0, 100); break; - case 42: /* quest */ + case 43: /* quest */ SET_OR_REMOVE(PRF_FLAGS(vict), PRF_QUEST); break; - case 43: /* room */ + case 44: /* questpoints */ + GET_QUESTPOINTS(vict) = RANGE(0, 100000000); + break; + case 45: /* questhistory */ + qvnum = atoi(val_arg); + if (real_quest(qvnum) == NOTHING) { + send_to_char(ch, "That quest doesn't exist.\r\n"); + return FALSE; + } else { + if (is_complete(vict, qvnum)) { + remove_completed_quest(vict, qvnum); + send_to_char(ch, "Quest %d removed from history for player %s.\r\n", + qvnum, GET_NAME(vict)); + } else { + add_completed_quest(vict, qvnum); + send_to_char(ch, "Quest %d added to history for player %s.\r\n", + qvnum, GET_NAME(vict)); + } + } + break; + case 46: /* room */ if ((rnum = real_room(value)) == NOWHERE) { send_to_char(ch, "No room exists with that number.\r\n"); return (0); @@ -3103,24 +3421,24 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c char_from_room(vict); char_to_room(vict, rnum); break; - case 44: /* screenwidth */ + case 47: /* screenwidth */ GET_SCREEN_WIDTH(vict) = RANGE(40, 200); break; - case 45: /* sex */ + case 48: /* sex */ if ((i = search_block(val_arg, genders, FALSE)) < 0) { send_to_char(ch, "Must be 'male', 'female', or 'neutral'.\r\n"); return (0); } GET_SEX(vict) = i; break; - case 46: /* showvnums */ + case 49: /* showvnums */ SET_OR_REMOVE(PRF_FLAGS(vict), PRF_SHOWVNUMS); break; - case 47: /* siteok */ + case 50: /* siteok */ SET_OR_REMOVE(PLR_FLAGS(vict), PLR_SITEOK); break; - case 48: /* str */ - if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD) + case 51: /* str */ + if (IS_NPC(vict) || IS_ADMIN(vict, ADMLVL_GRGOD)) RANGE(3, 25); else RANGE(3, 18); @@ -3128,16 +3446,16 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c vict->real_abils.str_add = 0; affect_total(vict); break; - case 49: /* stradd */ + case 52: /* stradd */ vict->real_abils.str_add = RANGE(0, 100); if (value > 0) vict->real_abils.str = 18; affect_total(vict); break; - case 50: /* thief */ + case 53: /* thief */ SET_OR_REMOVE(PLR_FLAGS(vict), PLR_THIEF); break; - case 51: /* thirst */ + case 54: /* thirst */ if (!str_cmp(val_arg, "off")) { GET_COND(vict, THIRST) = -1; send_to_char(ch, "%s's thirst is now off.\r\n", GET_NAME(vict)); @@ -3151,45 +3469,25 @@ static int perform_set(struct char_data *ch, struct char_data *vict, int mode, c return (0); } break; - case 52: /* title */ + case 55: /* title */ set_title(vict, val_arg); send_to_char(ch, "%s's title is now: %s\r\n", GET_NAME(vict), GET_TITLE(vict)); break; - case 53: /* variable */ + case 56: /* variable */ return perform_set_dg_var(ch, vict, val_arg); break; - case 54: /* weight */ + case 57: /* weight */ GET_WEIGHT(vict) = value; affect_total(vict); break; - case 55: /* wis */ - if (IS_NPC(vict) || GET_LEVEL(vict) >= LVL_GRGOD) + case 58: /* wis */ + if (IS_NPC(vict) || IS_ADMIN(vict, ADMLVL_GRGOD)) RANGE(3, 25); else RANGE(3, 18); vict->real_abils.wis = value; affect_total(vict); break; - case 56: /* questpoints */ - GET_QUESTPOINTS(vict) = RANGE(0, 100000000); - break; - case 57: /* questhistory */ - qvnum = atoi(val_arg); - if (real_quest(qvnum) == NOTHING) { - send_to_char(ch, "That quest doesn't exist.\r\n"); - return FALSE; - } else { - if (is_complete(vict, qvnum)) { - remove_completed_quest(vict, qvnum); - send_to_char(ch, "Quest %d removed from history for player %s.\r\n", - qvnum, GET_NAME(vict)); - } else { - add_completed_quest(vict, qvnum); - send_to_char(ch, "Quest %d added to history for player %s.\r\n", - qvnum, GET_NAME(vict)); - } - break; - } default: send_to_char(ch, "Can't set that!\r\n"); return (0); @@ -3215,9 +3513,9 @@ void show_set_help(struct char_data *ch) len = snprintf(buf, sizeof(buf), "%sCommand Lvl Who? Type%s\r\n", CCCYN(ch, C_NRM), CCNRM(ch, C_NRM)); for (i = 0; *(set_fields[i].cmd) != '\n'; i++) { - if (set_fields[i].level <= GET_LEVEL(ch)) { + if (set_fields[i].level <= GET_ADMLEVEL(ch)) { add_len = snprintf(buf+len, sizeof(buf)-len, "%-20s%-5s %-4s %-6s\r\n", set_fields[i].cmd, - set_levels[((int)(set_fields[i].level) - LVL_IMMORT)], + set_levels[((int)(set_fields[i].level) - ADMLVL_IMMORT)], set_targets[(int)(set_fields[i].pcnpc)-1], set_types[(int)(set_fields[i].type)]); len += add_len; @@ -3318,7 +3616,7 @@ ACMD(do_set) ACMD(do_saveall) { - if (GET_LEVEL(ch) < LVL_BUILDER) + if (!IS_ADMIN(ch, ADMLVL_BUILDER)) send_to_char (ch, "You are not holy enough to use this privelege.\n\r"); else { save_all(); @@ -3378,7 +3676,7 @@ ACMD(do_links) #define MAX_HITROLL_ALLOWED MAX(GET_LEVEL(mob)/3, 1) #define MAX_MOB_GOLD_ALLOWED GET_LEVEL(mob)*3000 #define MAX_EXP_ALLOWED GET_LEVEL(mob)*GET_LEVEL(mob) * 120 -#define MAX_LEVEL_ALLOWED LVL_IMPL +#define MAX_LEVEL_ALLOWED CONFIG_MAX_LEVEL #define GET_OBJ_AVG_DAM(obj) (((GET_OBJ_VAL(obj, 2) + 1) / 2.0) * GET_OBJ_VAL(obj, 1)) /* arbitrary limit for per round dam */ #define MAX_MOB_DAM_ALLOWED 500 @@ -3653,10 +3951,10 @@ ACMD (do_zcheck) GET_OBJ_COST(obj), MAX_OBJ_COST); } - if (GET_OBJ_LEVEL(obj) > LVL_IMMORT-1 && (found=1)) + if (GET_OBJ_LEVEL(obj) > CONFIG_MAX_LEVEL && (found=1)) len += snprintf(buf + len, sizeof(buf) - len, "- has min level set to %d (max %d).\r\n", - GET_OBJ_LEVEL(obj), LVL_IMMORT-1); + GET_OBJ_LEVEL(obj), CONFIG_MAX_LEVEL); if (obj->action_description && *obj->action_description && GET_OBJ_TYPE(obj) != ITEM_STAFF && @@ -4153,7 +4451,7 @@ ACMD(do_zpurge) send_to_char(ch, "That isn't a valid zone number!\r\n"); return; } - if (GET_LEVEL(ch) < LVL_GOD && !can_edit_zone(ch, zone)) { + if (!IS_ADMIN(ch, ADMLVL_GOD) && !can_edit_zone(ch, zone)) { send_to_char(ch, "You can only purge your own zone!\r\n"); return; } @@ -4162,14 +4460,14 @@ ACMD(do_zpurge) purge_room(real_room(vroom)); } send_to_char(ch, "Purged zone #%d: %s.\r\n", zone_table[zone].number, zone_table[zone].name); - mudlog(NRM, MAX(LVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s purged zone %d (%s)", GET_NAME(ch), zone_table[zone].number, zone_table[zone].name); + mudlog(NRM, MAX(ADMLVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s purged zone %d (%s)", GET_NAME(ch), zone_table[zone].number, zone_table[zone].name); } else { for (room = 0; room <= top_of_world; room++) { purge_room(room); } send_to_char(ch, "Purged world.\r\n"); - mudlog(NRM, MAX(LVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s purged entire world.", GET_NAME(ch)); + mudlog(NRM, MAX(ADMLVL_GRGOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s purged entire world.", GET_NAME(ch)); } } @@ -4205,23 +4503,23 @@ ACMD(do_file) char *file; /* The file location, relative to the working dir. */ int read_backwards; /* Should the file be read backwards by default? */ } fields[] = { - { "xnames", LVL_GOD, XNAME_FILE, TRUE}, - { "levels", LVL_GOD, LEVELS_LOGFILE, TRUE}, - { "rip", LVL_GOD, RIP_LOGFILE, TRUE}, - { "players", LVL_GOD, NEWPLAYERS_LOGFILE, TRUE}, - { "rentgone", LVL_GOD, RENTGONE_LOGFILE, TRUE}, - { "errors", LVL_GOD, ERRORS_LOGFILE, TRUE}, - { "godcmds", LVL_GOD, GODCMDS_LOGFILE, TRUE}, - { "syslog", LVL_GOD, SYSLOG_LOGFILE, TRUE}, - { "crash", LVL_GOD, CRASH_LOGFILE, TRUE}, - { "help", LVL_GOD, HELP_LOGFILE, TRUE}, - { "changelog", LVL_GOD, CHANGE_LOG_FILE, FALSE}, - { "deletes", LVL_GOD, DELETES_LOGFILE, TRUE}, - { "restarts", LVL_GOD, RESTARTS_LOGFILE, TRUE}, - { "usage", LVL_GOD, USAGE_LOGFILE, TRUE}, - { "badpws", LVL_GOD, BADPWS_LOGFILE, TRUE}, - { "olc", LVL_GOD, OLC_LOGFILE, TRUE}, - { "trigger", LVL_GOD, TRIGGER_LOGFILE, TRUE}, + { "xnames", ADMLVL_GOD, XNAME_FILE, TRUE}, + { "levels", ADMLVL_GOD, LEVELS_LOGFILE, TRUE}, + { "rip", ADMLVL_GOD, RIP_LOGFILE, TRUE}, + { "players", ADMLVL_GOD, NEWPLAYERS_LOGFILE, TRUE}, + { "rentgone", ADMLVL_GOD, RENTGONE_LOGFILE, TRUE}, + { "errors", ADMLVL_GOD, ERRORS_LOGFILE, TRUE}, + { "godcmds", ADMLVL_GOD, GODCMDS_LOGFILE, TRUE}, + { "syslog", ADMLVL_GOD, SYSLOG_LOGFILE, TRUE}, + { "crash", ADMLVL_GOD, CRASH_LOGFILE, TRUE}, + { "help", ADMLVL_GOD, HELP_LOGFILE, TRUE}, + { "changelog", ADMLVL_GOD, CHANGE_LOG_FILE, FALSE}, + { "deletes", ADMLVL_GOD, DELETES_LOGFILE, TRUE}, + { "restarts", ADMLVL_GOD, RESTARTS_LOGFILE, TRUE}, + { "usage", ADMLVL_GOD, USAGE_LOGFILE, TRUE}, + { "badpws", ADMLVL_GOD, BADPWS_LOGFILE, TRUE}, + { "olc", ADMLVL_GOD, OLC_LOGFILE, TRUE}, + { "trigger", ADMLVL_GOD, TRIGGER_LOGFILE, TRUE}, { "\n", 0, "\n", FALSE } /* This must be the last entry */ }; @@ -4237,7 +4535,7 @@ ACMD(do_file) if (!*argument) { send_to_char(ch, "USAGE: file \r\n\r\nFile options:\r\n"); for (j = 0, i = 0; fields[i].level; i++) - if (fields[i].level <= GET_LEVEL(ch)) + if (fields[i].level <= GET_ADMLEVEL(ch)) send_to_char(ch, "%-15s%s\r\n", fields[i].cmd, fields[i].file); return; } @@ -4258,7 +4556,7 @@ ACMD(do_file) return; } - if (GET_LEVEL(ch) < fields[l].level) { + if (GET_ADMLEVEL(ch) < fields[l].level) { send_to_char(ch, "You have not achieved a high enough level to view '%s'.\r\n", fields[l].cmd); return; @@ -4284,7 +4582,7 @@ ACMD(do_file) /* Must be able to access the file on disk. */ if (!(req_file=fopen(fields[l].file,"r"))) { send_to_char(ch, "The file %s can not be opened.\r\n", fields[l].file); - mudlog(BRF, LVL_IMPL, TRUE, + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: Error opening file %s using 'file' command.", fields[l].file); return; @@ -4360,19 +4658,19 @@ ACMD(do_changelog) sprintf(buf, "%s.bak", CHANGE_LOG_FILE); if (rename(CHANGE_LOG_FILE, buf)) { - mudlog(BRF, LVL_IMPL, TRUE, + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: Error making backup changelog file (%s)", buf); return; } if (!(fl = fopen(buf, "r"))) { - mudlog(BRF, LVL_IMPL, TRUE, + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: Error opening backup changelog file (%s)", buf); return; } if (!(new = fopen(CHANGE_LOG_FILE, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: Error opening new changelog file (%s)", CHANGE_LOG_FILE); return; } @@ -4413,7 +4711,8 @@ ACMD(do_plist) int i, len = 0, count = 0; char mode, buf[MAX_STRING_LENGTH * 20], name_search[MAX_NAME_LENGTH], time_str[MAX_STRING_LENGTH]; struct time_info_data time_away; - int low = 0, high = LVL_IMPL, low_day = 0, high_day = 10000, low_hr = 0, high_hr = 24; + int low = 0, high = CONFIG_MAX_LEVEL, low_day = 0, high_day = 10000, low_hr = 0, high_hr = 24; + bool imm_only = FALSE, mort_only = FALSE; skip_spaces(&argument); strcpy(buf, argument); /* strcpy: OK (sizeof: argument == buf) */ @@ -4439,11 +4738,11 @@ ACMD(do_plist) break; case 'i': strcpy(buf, buf1); - low = LVL_IMMORT; + imm_only = TRUE; break; case 'm': strcpy(buf, buf1); - high = LVL_IMMORT - 1; + mort_only = TRUE; break; case 'd': half_chop(buf1, arg, buf); @@ -4466,14 +4765,21 @@ ACMD(do_plist) } len = 0; - len += snprintf(buf + len, sizeof(buf) - len, "@W[ Id] (Lv) Name Last@n\r\n" - "%s-------------------------------------%s\r\n", CCCYN(ch, C_NRM), - CCNRM(ch, C_NRM)); + len += snprintf(buf + len, sizeof(buf) - len, + "%s[ Id] (Lv Admin-Level) Name Last\r\n" + "%s-------------------------------------------------%s\r\n", + QBWHT, QCYN, QNRM); for (i = 0; i <= top_of_p_table; i++) { if (player_table[i].level < low || player_table[i].level > high) continue; + if (imm_only && player_table[i].admlevel < ADMLVL_IMMORT) + continue; + + if (mort_only && player_table[i].admlevel >= ADMLVL_IMMORT) + continue; + time_away = *real_time_passed(time(0), player_table[i].last); if (*name_search && str_cmp(name_search, player_table[i].name)) @@ -4487,13 +4793,13 @@ ACMD(do_plist) strcpy(time_str, asctime(localtime(&player_table[i].last))); time_str[strlen(time_str) - 1] = '\0'; - len += snprintf(buf + len, sizeof(buf) - len, "[%3ld] (%2d) %c%-15s %s\r\n", - player_table[i].id, player_table[i].level, + len += snprintf(buf + len, sizeof(buf) - len, "[%3ld] (%2d %11s) %c%-15s %s\r\n", + player_table[i].id, player_table[i].level, admin_level_names[(player_table[i].admlevel)], UPPER(*player_table[i].name), player_table[i].name + 1, time_str); count++; } - snprintf(buf + len, sizeof(buf) - len, "%s-------------------------------------%s\r\n" - "%d players listed.\r\n", CCCYN(ch, C_NRM), CCNRM(ch, C_NRM), count); + snprintf(buf + len, sizeof(buf) - len, "%s-------------------------------------------------%s\r\n" + "%d players listed.\r\n", QCYN, QNRM, count); page_string(ch->desc, buf, TRUE); } @@ -4586,7 +4892,7 @@ bool change_player_name(struct char_data *ch, struct char_data *vict, char *new_ /* Save the changed player index - the pfile is saved by perform_set */ save_player_index(); - mudlog(BRF, LVL_IMMORT, TRUE, "(GC) %s changed the name of %s to %s", GET_NAME(ch), old_name, new_name); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "(GC) %s changed the name of %s to %s", GET_NAME(ch), old_name, new_name); if (vict->desc) /* Descriptor is set if the victim is logged in */ send_to_char(vict, "Your login name has changed from %s%s%s to %s%s%s.\r\n", CCYEL(vict, C_NRM), old_name, CCNRM(vict, C_NRM), @@ -4615,7 +4921,7 @@ ACMD(do_zlock) return; } if (is_abbrev(arg, "all")) { - if (GET_LEVEL(ch) < LVL_GRGOD) { + if (!IS_ADMIN(ch, ADMLVL_GRGOD)) { send_to_char(ch, "You do not have sufficient access to lock all zones.\r\n"); return; } @@ -4653,7 +4959,7 @@ ACMD(do_zlock) return; } send_to_char(ch, "%d zones have now been locked.\r\n", counter); - mudlog(BRF, LVL_GOD, TRUE, "(GC) %s has locked ALL zones!", GET_NAME(ch)); + mudlog(BRF, ADMLVL_GOD, TRUE, "(GC) %s has locked ALL zones!", GET_NAME(ch)); return; } if (is_abbrev(arg, "list")) { @@ -4684,7 +4990,7 @@ ACMD(do_zlock) } /* Check the builder list */ - if (GET_LEVEL(ch) < LVL_GRGOD && !is_name(GET_NAME(ch), zone_table[zn].builders) && GET_OLC_ZONE(ch) != znvnum) { + if (!IS_ADMIN(ch, ADMLVL_GRGOD) && !is_name(GET_NAME(ch), zone_table[zn].builders) && GET_OLC_ZONE(ch) != znvnum) { send_to_char(ch, "You do not have sufficient access to lock that zone!\r\n"); return; } @@ -4696,7 +5002,7 @@ ACMD(do_zlock) } SET_BIT_AR(ZONE_FLAGS(zn), ZONE_NOBUILD); if (save_zone(zn)) { - mudlog(NRM, LVL_GRGOD, TRUE, "(GC) %s has locked zone %d", GET_NAME(ch), znvnum); + mudlog(NRM, ADMLVL_GRGOD, TRUE, "(GC) %s has locked zone %d", GET_NAME(ch), znvnum); } else { @@ -4723,7 +5029,7 @@ ACMD(do_zunlock) return; } if (is_abbrev(arg, "all")) { - if (GET_LEVEL(ch) < LVL_GRGOD) { + if (!IS_ADMIN(ch, ADMLVL_GRGOD)) { send_to_char(ch, "You do not have sufficient access to lock zones.\r\n"); return; } @@ -4747,7 +5053,7 @@ ACMD(do_zunlock) return; } send_to_char(ch, "%d zones have now been unlocked.\r\n", counter); - mudlog(BRF, LVL_GOD, TRUE, "(GC) %s has unlocked ALL zones!", GET_NAME(ch)); + mudlog(BRF, ADMLVL_GOD, TRUE, "(GC) %s has unlocked ALL zones!", GET_NAME(ch)); return; } if (is_abbrev(arg, "list")) { @@ -4778,7 +5084,7 @@ ACMD(do_zunlock) } /* Check the builder list */ - if (GET_LEVEL(ch) < LVL_GRGOD && !is_name(GET_NAME(ch), zone_table[zn].builders) && GET_OLC_ZONE(ch) != znvnum) { + if (!IS_ADMIN(ch, ADMLVL_GRGOD) && !is_name(GET_NAME(ch), zone_table[zn].builders) && GET_OLC_ZONE(ch) != znvnum) { send_to_char(ch, "You do not have sufficient access to unlock that zone!\r\n"); return; } @@ -4790,7 +5096,7 @@ ACMD(do_zunlock) } REMOVE_BIT_AR(ZONE_FLAGS(zn), ZONE_NOBUILD); if (save_zone(zn)) { - mudlog(NRM, LVL_GRGOD, TRUE, "(GC) %s has unlocked zone %d", GET_NAME(ch), znvnum); + mudlog(NRM, ADMLVL_GRGOD, TRUE, "(GC) %s has unlocked zone %d", GET_NAME(ch), znvnum); } else { @@ -4879,7 +5185,7 @@ ACMD(do_recent) limit = atoi(arg); } - if (GET_LEVEL(ch) >= LVL_GRGOD) { /* If High-Level Imm, then show Host IP */ + if (IS_ADMIN(ch, ADMLVL_GRGOD)) { /* If High-Level Imm, then show Host IP */ send_to_char(ch, " ID | DATE/TIME | HOST IP | Player Name\r\n"); } else { send_to_char(ch, " ID | DATE/TIME | Player Name\r\n"); @@ -4899,7 +5205,7 @@ ACMD(do_recent) if ((limit == 0) || (count < limit)) { - if (GET_LEVEL(ch) >= LVL_GRGOD) /* If High-Level Imm, then show Host IP */ + if (IS_ADMIN(ch, ADMLVL_GRGOD)) /* If High-Level Imm, then show Host IP */ { if (this->new_player == TRUE) { send_to_char(ch, "%3d | %-19.19s | %s%-37s%s | %s %s(New Player)%s\r\n", this->vnum, tmstr, loc ? QRED : "", this->host, QNRM, this->name, QYEL, QNRM); diff --git a/src/aedit.c b/src/aedit.c index cdd5cb7..7fa1bf5 100644 --- a/src/aedit.c +++ b/src/aedit.c @@ -41,7 +41,7 @@ ACMD(do_oasis_aedit) /* No building as a mob or while being forced. */ if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING) return; - + if (CONFIG_NEW_SOCIALS == 0) { send_to_char(ch, "Socials cannot be edited at the moment.\r\n"); return; @@ -68,7 +68,7 @@ ACMD(do_oasis_aedit) d = ch->desc; if (!str_cmp("save", arg)) { - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves socials.", GET_NAME(ch)); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves socials.", GET_NAME(ch)); send_to_char(ch, "Writing social file.\r\n"); aedit_save_to_disk(d); send_to_char(ch, "Done.\r\n"); @@ -77,7 +77,7 @@ ACMD(do_oasis_aedit) /* Give descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_oasis: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis: Player already had olc structure."); free(d->olc); } CREATE(d->olc, struct oasis_olc_data, 1); @@ -104,7 +104,7 @@ ACMD(do_oasis_aedit) STATE(d) = CON_AEDIT; act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s starts editing actions.", GET_NAME(ch)); + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing actions.", GET_NAME(ch)); } static void aedit_setup_new(struct descriptor_data *d) { @@ -253,7 +253,7 @@ static void aedit_disp_menu(struct descriptor_data * d) { "%s-- Action editor\r\n" "%sn%s) Command : %s%-15.15s%s %s1%s) Sort as Command : %s%-15.15s%s\r\n" "%s2%s) Min Position[CH]: %s%-8.8s %s3%s) Min Position [VT]: %s%-8.8s\r\n" - "%s4%s) Min Level [CH]: %s%-3d %s5%s) Show if Invisible: %s%s\r\n" + "%s4%s) Min AdmLevel[CH]: %s%-3d %s5%s) Show if Invisible: %s%s\r\n" "%sa%s) Char [NO ARG]: %s%s\r\n" "%sb%s) Others [NO ARG]: %s%s\r\n" "%sc%s) Char [NOT FOUND]: %s%s\r\n" @@ -321,7 +321,7 @@ void aedit_parse(struct descriptor_data * d, char *arg) { switch (*arg) { case 'y': case 'Y': aedit_save_internally(d); - mudlog (CMP, LVL_IMPL, TRUE, "OLC: %s edits action %s", + mudlog (CMP, ADMLVL_IMPL, TRUE, "OLC: %s edits action %s", GET_NAME(d->character), OLC_ACTION(d)->command); /* do not free the strings.. just the structure */ @@ -425,7 +425,7 @@ void aedit_parse(struct descriptor_data * d, char *arg) { OLC_MODE(d) = AEDIT_MIN_VICT_POS; return; case '4': - write_to_output(d, "Enter new minimum level for social: "); + write_to_output(d, "Enter new minimum admin level for social: "); OLC_MODE(d) = AEDIT_MIN_CHAR_LEVEL; return; case '5': @@ -586,7 +586,7 @@ void aedit_parse(struct descriptor_data * d, char *arg) { return; } i = atoi(arg); - if ((i < 0) && (i > LVL_IMPL)) { + if ((i < ADMLVL_MORTAL) && (i > ADMLVL_IMPL)) { aedit_disp_menu(d); return; } diff --git a/src/asciimap.c b/src/asciimap.c index b2b625a..8341b85 100644 --- a/src/asciimap.c +++ b/src/asciimap.c @@ -191,7 +191,7 @@ bool can_see_map(struct char_data *ch) { /* Is the map funcionality disabled? */ if (CONFIG_MAP == MAP_OFF) return FALSE; - else if ((CONFIG_MAP == MAP_IMM_ONLY) && (GET_LEVEL(ch) < LVL_IMMORT)) + else if ((CONFIG_MAP == MAP_IMM_ONLY) && (!IS_ADMIN(ch, ADMLVL_IMMORT))) return FALSE; return TRUE; @@ -514,7 +514,7 @@ void str_and_map(char *str, struct char_data *ch, room_vnum target_room ) { map[x][y]= (!(y%2) && !worldmap) ? DOOR_NONE : SECT_EMPTY; /* starts the mapping with the center room */ -MapArea(target_room, ch, centre, centre, min, max, ns_size/2, ew_size/2, worldmap ); +MapArea(target_room, ch, centre, centre, min, max, ns_size/2, ew_size/2, worldmap ); map[centre][centre] = SECT_HERE; /* char_size = rooms + doors + padding */ @@ -538,7 +538,7 @@ ACMD(do_map) { if (IS_DARK(IN_ROOM(ch)) && !CAN_SEE_IN_DARK(ch)) { send_to_char(ch, "It is too dark to see the map.\r\n"); return; - } else if (AFF_FLAGGED(ch, AFF_BLIND) && GET_LEVEL(ch) < LVL_IMMORT) { + } else if (AFF_FLAGGED(ch, AFF_BLIND) && !IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "You can't see the map while blind!\r\n"); return; } diff --git a/src/ban.c b/src/ban.c index a69e622..c6ea2a5 100644 --- a/src/ban.c +++ b/src/ban.c @@ -186,7 +186,7 @@ ACMD(do_ban) ban_node->next = ban_list; ban_list = ban_node; - mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "%s has banned %s for %s players.", + mudlog(NRM, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "%s has banned %s for %s players.", GET_NAME(ch), site, ban_types[ban_node->type]); send_to_char(ch, "Site banned.\r\n"); write_ban_list(); @@ -218,7 +218,7 @@ ACMD(do_unban) } REMOVE_FROM_LIST(ban_node, ban_list, next); send_to_char(ch, "Site unbanned.\r\n"); - mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "%s removed the %s-player ban on %s.", + mudlog(NRM, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "%s removed the %s-player ban on %s.", GET_NAME(ch), ban_types[ban_node->type], ban_node->site); free(ban_node); @@ -234,12 +234,12 @@ int valid_name(char *newname) struct descriptor_data *dt; char tempname[MAX_INPUT_LENGTH]; - /* Make sure someone isn't trying to create this same name. We want to do a + /* Make sure someone isn't trying to create this same name. We want to do a * 'str_cmp' so people can't do 'Bob' and 'BoB'. The creating login will not - * have a character name yet and other people sitting at the prompt won't - * have characters yet. New, unindexed characters (i.e., characters who are - * in the process of creating) will have an idnum of -1, set by clear_char() - * in db.c. If someone is creating a character by the same name as the one + * have a character name yet and other people sitting at the prompt won't + * have characters yet. New, unindexed characters (i.e., characters who are + * in the process of creating) will have an idnum of -1, set by clear_char() + * in db.c. If someone is creating a character by the same name as the one * we are checking, then the name is invalid, to prevent character duping. * THIS SHOULD FIX THE 'invalid name' if disconnected from OLC-bug - Welcor */ for (dt = descriptor_list; dt; dt = dt->next) diff --git a/src/boards.c b/src/boards.c index 9fb5674..8a2aedb 100644 --- a/src/boards.c +++ b/src/boards.c @@ -45,16 +45,17 @@ /* Board appearance order. */ #define NEWEST_AT_TOP FALSE -/* Format: vnum, read lvl, write lvl, remove lvl, filename, 0 at end. Be sure +/* Format: vnum, read lvl, write lvl, remove lvl, filename, 0 at end. Be sure * to also change NUM_OF_BOARDS in board.h*/ struct board_info_type board_info[NUM_OF_BOARDS] = { - {3099, 0, 0, LVL_GOD, LIB_ETC "board.mortal", 0}, - {3098, LVL_IMMORT, LVL_IMMORT, LVL_GRGOD, LIB_ETC "board.immortal", 0}, - {3097, LVL_IMMORT, LVL_GRGOD, LVL_IMPL, LIB_ETC "board.freeze", 0}, - {3096, 0, 0, LVL_IMMORT, LIB_ETC "board.social", 0}, - {1226, 0, 0, LVL_IMPL, LIB_ETC "board.builder", 0}, - {1227, 0, 0, LVL_IMPL, LIB_ETC "board.staff", 0}, - {1228, 0, 0, LVL_IMPL, LIB_ETC "board.advertising", 0}, +/* VNUM Read Level Write Level Remove Level Filename Zero */ + {3099, ADMLVL_MORTAL, ADMLVL_MORTAL, ADMLVL_GOD, LIB_ETC "board.mortal", 0}, + {3098, ADMLVL_IMMORT, ADMLVL_IMMORT, ADMLVL_GRGOD, LIB_ETC "board.immortal", 0}, + {3097, ADMLVL_IMMORT, ADMLVL_GRGOD, ADMLVL_IMPL, LIB_ETC "board.freeze", 0}, + {3096, ADMLVL_MORTAL, ADMLVL_MORTAL, ADMLVL_IMMORT, LIB_ETC "board.social", 0}, + {1226, ADMLVL_MORTAL, ADMLVL_MORTAL, ADMLVL_IMPL, LIB_ETC "board.builder", 0}, + {1227, ADMLVL_MORTAL, ADMLVL_MORTAL, ADMLVL_IMPL, LIB_ETC "board.staff", 0}, + {1228, ADMLVL_MORTAL, ADMLVL_MORTAL, ADMLVL_IMPL, LIB_ETC "board.advertising", 0}, }; /* local (file scope) global variables */ @@ -93,7 +94,7 @@ static int find_board(struct char_data *ch) if (BOARD_RNUM(i) == GET_OBJ_RNUM(obj)) return (i); - if (GET_LEVEL(ch) >= LVL_IMMORT) + if (IS_ADMIN(ch, ADMLVL_IMMORT)) for (obj = ch->carrying; obj; obj = obj->next_content) for (i = 0; i < NUM_OF_BOARDS; i++) if (BOARD_RNUM(i) == GET_OBJ_RNUM(obj)) @@ -137,7 +138,7 @@ SPECIAL(gen_board) /* These were originally globals for some unknown reason. */ int ACMD_READ, ACMD_LOOK, ACMD_EXAMINE, ACMD_WRITE, ACMD_REMOVE; - + if (!loaded) { init_boards(); loaded = 1; @@ -176,7 +177,7 @@ int board_write_message(int board_type, struct char_data *ch, char *arg, struct time_t ct; char buf[MAX_INPUT_LENGTH], buf2[MAX_NAME_LENGTH + 3], tmstr[MAX_STRING_LENGTH]; - if (GET_LEVEL(ch) < WRITE_LVL(board_type)) { + if (!IS_ADMIN(ch, WRITE_LVL(board_type))) { send_to_char(ch, "You are not holy enough to write on this board.\r\n"); return (1); } @@ -232,7 +233,7 @@ int board_show_board(int board_type, struct char_data *ch, char *arg, struct obj if (!*tmp || !isname(tmp, board->name)) return (0); - if (GET_LEVEL(ch) < READ_LVL(board_type)) { + if (!IS_ADMIN(ch, READ_LVL(board_type))) { send_to_char(ch, "You try but fail to understand the holy words.\r\n"); return (1); } @@ -295,7 +296,7 @@ int board_display_msg(int board_type, struct char_data *ch, char *arg, struct ob if (!(msg = atoi(number))) return (0); - if (GET_LEVEL(ch) < READ_LVL(board_type)) { + if (!IS_ADMIN(ch, READ_LVL(board_type))) { send_to_char(ch, "You try but fail to understand the holy words.\r\n"); return (1); } @@ -366,7 +367,7 @@ int board_remove_msg(int board_type, struct char_data *ch, char *arg, struct obj return (1); } snprintf(buf, sizeof(buf), "(%s)", GET_NAME(ch)); - if (GET_LEVEL(ch) < REMOVE_LVL(board_type) && + if (!IS_ADMIN(ch, REMOVE_LVL(board_type)) && !(strstr(MSG_HEADING(board_type, ind), buf))) { send_to_char(ch, "You are not holy enough to remove other people's messages.\r\n"); return (1); diff --git a/src/boards.h b/src/boards.h index 8394621..22ee41f 100644 --- a/src/boards.h +++ b/src/boards.h @@ -1,13 +1,13 @@ /** * @file boards.h * Header file for the bulletin board system (boards.c). -* +* * Part of the core tbaMUD source code distribution, which is a derivative * of, and continuation of, CircleMUD. -* -* All rights reserved. See license for complete information. -* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University -* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. +* +* All rights reserved. See license for complete information. +* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University +* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * */ #ifndef _BOARDS_H_ @@ -31,9 +31,9 @@ struct board_msginfo { struct board_info_type { obj_vnum vnum; /* vnum of this board */ - int read_lvl; /* min level to read messages on this board */ - int write_lvl; /* min level to write messages on this board */ - int remove_lvl; /* min level to remove messages from this board */ + int read_lvl; /* min admin level to read messages on this board */ + int write_lvl; /* min admin level to write messages on this board */ + int remove_lvl; /* min admin level to remove messages from this board */ char filename[50]; /* file to save this board to */ obj_rnum rnum; /* rnum of this board */ }; diff --git a/src/cedit.c b/src/cedit.c index cee9aab..165cc61 100644 --- a/src/cedit.c +++ b/src/cedit.c @@ -46,7 +46,7 @@ ACMD(do_oasis_cedit) /* Parse any arguments. */ one_argument(argument, buf1); - if (GET_LEVEL(ch) < LVL_IMPL) { + if (!ADM_FLAGGED(ch, ADM_CEDIT)) { send_to_char(ch, "You can't modify the game configuration.\r\n"); return; } @@ -61,7 +61,7 @@ ACMD(do_oasis_cedit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing the game configuration.", GET_NAME(ch)); return; } else if (str_cmp("save", buf1) != 0) { @@ -70,7 +70,7 @@ ACMD(do_oasis_cedit) } send_to_char(ch, "Saving the game configuration.\r\n"); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves the game configuration.", GET_NAME(ch)); cedit_save_to_disk(); @@ -92,6 +92,7 @@ static void cedit_setup(struct descriptor_data *d) OLC_CONFIG(d)->play.max_exp_loss = CONFIG_MAX_EXP_LOSS; OLC_CONFIG(d)->play.max_npc_corpse_time = CONFIG_MAX_NPC_CORPSE_TIME; OLC_CONFIG(d)->play.max_pc_corpse_time = CONFIG_MAX_PC_CORPSE_TIME; + OLC_CONFIG(d)->play.max_mortal_level = CONFIG_MAX_LEVEL; OLC_CONFIG(d)->play.idle_void = CONFIG_IDLE_VOID; OLC_CONFIG(d)->play.idle_rent_time = CONFIG_IDLE_RENT_TIME; OLC_CONFIG(d)->play.idle_max_level = CONFIG_IDLE_MAX_LEVEL; @@ -190,6 +191,7 @@ static void cedit_save_internally(struct descriptor_data *d) CONFIG_MAX_EXP_LOSS = OLC_CONFIG(d)->play.max_exp_loss; CONFIG_MAX_NPC_CORPSE_TIME = OLC_CONFIG(d)->play.max_npc_corpse_time; CONFIG_MAX_PC_CORPSE_TIME = OLC_CONFIG(d)->play.max_pc_corpse_time; + CONFIG_MAX_LEVEL = OLC_CONFIG(d)->play.max_mortal_level; CONFIG_IDLE_VOID = OLC_CONFIG(d)->play.idle_void; CONFIG_IDLE_RENT_TIME = OLC_CONFIG(d)->play.idle_rent_time; CONFIG_IDLE_MAX_LEVEL = OLC_CONFIG(d)->play.idle_max_level; @@ -345,11 +347,13 @@ int save_config( IDXTYPE nowhere ) "max_npc_corpse_time = %d\n\n", CONFIG_MAX_NPC_CORPSE_TIME); fprintf(fl, "* Number of tics before PC corpses decompose.\n" "max_pc_corpse_time = %d\n\n", CONFIG_MAX_PC_CORPSE_TIME); + fprintf(fl, "* The maximum mortal level.\n" + "max_mortal_level = %d\n\n", CONFIG_MAX_LEVEL); fprintf(fl, "* Number of tics before a PC is sent to the void.\n" "idle_void = %d\n\n", CONFIG_IDLE_VOID); fprintf(fl, "* Number of tics before a PC is autorented.\n" "idle_rent_time = %d\n\n", CONFIG_IDLE_RENT_TIME); - fprintf(fl, "* Level and above of players whom are immune to idle penalties.\n" + fprintf(fl, "* Admin Level and above of players whom are immune to idle penalties.\n" "idle_max_level = %d\n\n", CONFIG_IDLE_MAX_LEVEL); fprintf(fl, "* Should the items in death traps be junked automatically?\n" "dts_are_dumps = %d\n\n", CONFIG_DTS_ARE_DUMPS); @@ -530,7 +534,7 @@ int save_config( IDXTYPE nowhere ) "use_autowiz = %d\n\n", CONFIG_USE_AUTOWIZ); - fprintf(fl, "* If yes, what is the lowest level which should be on the wizlist?\n" + fprintf(fl, "* If yes, what is the lowest admin level which should be on the wizlist?\n" "min_wizlist_lev = %d\n\n", CONFIG_MIN_WIZLIST_LEV); @@ -591,14 +595,15 @@ static void cedit_disp_game_play_options(struct descriptor_data *d) "%sG%s) Maximum Experience Loss : %s%d\r\n" "%sH%s) Max Time for NPC Corpse : %s%d\r\n" "%sI%s) Max Time for PC Corpse : %s%d\r\n" - "%sJ%s) Tics before PC sent to void : %s%d\r\n" - "%sK%s) Tics before PC is autosaved : %s%d\r\n" - "%sL%s) Level Immune To IDLE : %s%d\r\n" - "%sM%s) Death Traps Junk Items : %s%s\r\n" - "%sN%s) Objects Load Into Inventory : %s%s\r\n" - "%sO%s) Track Through Doors : %s%s\r\n" - "%sP%s) Display Closed Doors : %s%s\r\n" - "%sR%s) Mortals Level To Immortal : %s%s\r\n" + "%sJ%s) Max Mortal Level : %s%d\r\n" + "%sK%s) Tics before PC sent to void : %s%d\r\n" + "%sL%s) Tics before PC is autosaved : %s%d\r\n" + "%sM%s) Imm Level Immune To IDLE : %s%d\r\n" + "%sN%s) Death Traps Junk Items : %s%s\r\n" + "%sO%s) Objects Load Into Inventory : %s%s\r\n" + "%sP%s) Track Through Doors : %s%s\r\n" + "%sR%s) Display Closed Doors : %s%s\r\n" + "%sS%s) Mortals Level To Immortal : %s%s\r\n" "%s1%s) OK Message Text : %s%s" "%s2%s) NOPERSON Message Text : %s%s" "%s3%s) NOEFFECT Message Text : %s%s" @@ -617,6 +622,7 @@ static void cedit_disp_game_play_options(struct descriptor_data *d) grn, nrm, cyn, OLC_CONFIG(d)->play.max_exp_loss, grn, nrm, cyn, OLC_CONFIG(d)->play.max_npc_corpse_time, grn, nrm, cyn, OLC_CONFIG(d)->play.max_pc_corpse_time, + grn, nrm, cyn, OLC_CONFIG(d)->play.max_mortal_level, grn, nrm, cyn, OLC_CONFIG(d)->play.idle_void, grn, nrm, cyn, OLC_CONFIG(d)->play.idle_rent_time, @@ -695,6 +701,18 @@ static void cedit_disp_room_numbers(struct descriptor_data *d) OLC_MODE(d) = CEDIT_ROOM_NUMBERS_MENU; } +static void cedit_disp_admin_levels(struct descriptor_data *d) +{ + int i; + get_char_colors(d->character); + clear_screen(d); + + write_to_output(d, "\r\n\r\n"); + for (i=ADMLVL_IMMORT; i<=ADMLVL_IMPL; i++) { + write_to_output(d, "%sd%s) %s%s%s\r\n", grn, nrm, cyn, admin_level_names[i], nrm); + } +} + static void cedit_disp_operation_options(struct descriptor_data *d) { get_char_colors(d->character); @@ -768,7 +786,7 @@ void cedit_parse(struct descriptor_data *d, char *arg) case 'y': case 'Y': cedit_save_internally(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s modifies the game configuration.", GET_NAME(d->character)); cleanup_olc(d, CLEANUP_CONFIG); if (CONFIG_AUTO_SAVE) { @@ -889,45 +907,52 @@ void cedit_parse(struct descriptor_data *d, char *arg) case 'j': case 'J': - write_to_output(d, "Enter the number of tics before PC's are sent to the void (idle) : "); - OLC_MODE(d) = CEDIT_IDLE_VOID; + write_to_output(d, "Enter the highest possible mortal level (0-254) : "); + OLC_MODE(d) = CEDIT_MAX_LEVEL; return; case 'k': case 'K': - write_to_output(d, "Enter the number of tics before PC's are automatically rented and forced to quit : "); - OLC_MODE(d) = CEDIT_IDLE_RENT_TIME; + write_to_output(d, "Enter the number of tics before PC's are sent to the void (idle) : "); + OLC_MODE(d) = CEDIT_IDLE_VOID; return; case 'l': case 'L': - write_to_output(d, "Enter the level a player must be to become immune to IDLE : "); - OLC_MODE(d) = CEDIT_IDLE_MAX_LEVEL; + write_to_output(d, "Enter the number of tics before PC's are automatically rented and forced to quit : "); + OLC_MODE(d) = CEDIT_IDLE_RENT_TIME; return; case 'm': case 'M': - TOGGLE_VAR(OLC_CONFIG(d)->play.dts_are_dumps); - break; + cedit_disp_admin_levels(d); + write_to_output(d, "Enter the admin level a player must be to become immune to IDLE : "); + OLC_MODE(d) = CEDIT_IDLE_MAX_LEVEL; + return; case 'n': case 'N': - TOGGLE_VAR(OLC_CONFIG(d)->play.load_into_inventory); + TOGGLE_VAR(OLC_CONFIG(d)->play.dts_are_dumps); break; case 'o': case 'O': - TOGGLE_VAR(OLC_CONFIG(d)->play.track_through_doors); + TOGGLE_VAR(OLC_CONFIG(d)->play.load_into_inventory); break; case 'p': case 'P': - TOGGLE_VAR(OLC_CONFIG(d)->play.disp_closed_doors); + TOGGLE_VAR(OLC_CONFIG(d)->play.track_through_doors); break; case 'r': case 'R': - TOGGLE_VAR(OLC_CONFIG(d)->play.no_mort_to_immort); + TOGGLE_VAR(OLC_CONFIG(d)->play.disp_closed_doors); + break; + + case 's': + case 'S': + TOGGLE_VAR(OLC_CONFIG(d)->play.no_mort_to_immort); break; case '1': @@ -1217,7 +1242,8 @@ void cedit_parse(struct descriptor_data *d, char *arg) case 'b': case 'B': - write_to_output(d, "Enter the minimum level for players to appear on the wizlist : "); + cedit_disp_admin_levels(d); + write_to_output(d, "\r\nEnter the minimum admin level for players to appear on the wizlist : "); OLC_MODE(d) = CEDIT_MIN_WIZLIST_LEV; return; @@ -1302,6 +1328,15 @@ void cedit_parse(struct descriptor_data *d, char *arg) } break; + case CEDIT_MAX_LEVEL: + /* Note: Some things, such as spell_info, use (CONFIG_MAX_LEVEL + 1) */ + /* Do not use the max possible for the variable type */ + if (*arg) + OLC_CONFIG(d)->play.max_mortal_level = MIN(MAX(atoi(arg),0),254); + + cedit_disp_game_play_options(d); + break; + case CEDIT_IDLE_VOID: if (!*arg) { write_to_output(d, @@ -1326,9 +1361,12 @@ void cedit_parse(struct descriptor_data *d, char *arg) case CEDIT_IDLE_MAX_LEVEL: if (!*arg) { + write_to_output(d, "Value not changed!\r\n"); + cedit_disp_game_play_options(d); + } else if ((atoi(arg) < ADMLVL_MORTAL) || (atoi(arg) > ADMLVL_IMPL)) { write_to_output(d, "That is an invalid choice!\r\n" - "Enter the level a player must be to become immune to IDLE : "); + "Enter the admin level a player must be to become immune to IDLE : "); } else { OLC_CONFIG(d)->play.idle_max_level = atoi(arg); cedit_disp_game_play_options(d); @@ -1570,10 +1608,13 @@ void cedit_parse(struct descriptor_data *d, char *arg) break; case CEDIT_MIN_WIZLIST_LEV: - if (atoi(arg) > LVL_IMPL) { + if (!*arg) { + write_to_output(d, "Value not changed.\r\n"); + cedit_disp_autowiz_options(d); + } else if ((atoi(arg) < ADMLVL_IMMORT) || (atoi(arg) > ADMLVL_IMPL)) { write_to_output(d, "The minimum wizlist level can't be greater than %d.\r\n" - "Enter the minimum level for players to appear on the wizlist : ", LVL_IMPL); + "Enter the minimum admin level for players to appear on the wizlist : ", ADMLVL_IMPL); } else { OLC_CONFIG(d)->autowiz.min_wizlist_lev = atoi(arg); cedit_disp_autowiz_options(d); @@ -1616,7 +1657,7 @@ void cedit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here, but just in case... */ cleanup_olc(d, CLEANUP_CONFIG); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: cedit_parse(): Reached default case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: cedit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; } diff --git a/src/class.c b/src/class.c index 75e9223..5bd5722 100644 --- a/src/class.c +++ b/src/class.c @@ -179,16 +179,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 32; case 29: return 30; case 30: return 28; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 25; + case 32: return 23; + case 33: return 21; + case 34: return 18; + case 35: return 15; + case 36: return 12; + case 37: return 10; + case 38: return 7; + case 39: return 5; + case 40: return 3; default: log("SYSERR: Missing level for mage paralyzation saving throw."); break; @@ -226,16 +226,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 11; case 29: return 10; case 30: return 9; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 8; + case 32: return 8; + case 33: return 7; + case 34: return 6; + case 35: return 5; + case 36: return 5; + case 37: return 4; + case 38: return 3; + case 39: return 2; + case 40: return 1; default: log("SYSERR: Missing level for mage rod saving throw."); break; @@ -273,16 +273,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 17; case 29: return 15; case 30: return 13; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 12; + case 32: return 11; + case 33: return 10; + case 34: return 9; + case 35: return 7; + case 36: return 6; + case 37: return 5; + case 38: return 4; + case 39: return 3; + case 40: return 3; default: log("SYSERR: Missing level for mage petrification saving throw."); break; @@ -320,16 +320,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 27; case 29: return 25; case 30: return 23; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 22; + case 32: return 20; + case 33: return 19; + case 34: return 18; + case 35: return 17; + case 36: return 16; + case 37: return 15; + case 38: return 14; + case 39: return 13; + case 40: return 12; default: log("SYSERR: Missing level for mage breath saving throw."); break; @@ -367,16 +367,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 12; case 29: return 10; case 30: return 8; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 7; + case 32: return 6; + case 33: return 6; + case 34: return 5; + case 35: return 4; + case 36: return 4; + case 37: return 3; + case 38: return 2; + case 39: return 1; + case 40: return 1; default: log("SYSERR: Missing level for mage spell saving throw."); break; @@ -421,15 +421,15 @@ byte saving_throws(int class_num, int type, int level) case 28: return 9; case 29: return 8; case 30: return 7; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; + case 31: return 6; + case 32: return 6; + case 33: return 5; + case 34: return 4; + case 35: return 3; + case 36: return 3; + case 37: return 2; + case 38: return 2; + case 39: return 1; case 40: return 0; default: log("SYSERR: Missing level for cleric paralyzation saving throw."); @@ -468,16 +468,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 29; case 29: return 28; case 30: return 27; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 26; + case 32: return 25; + case 33: return 24; + case 34: return 23; + case 35: return 22; + case 36: return 21; + case 37: return 20; + case 38: return 19; + case 39: return 18; + case 40: return 17; default: log("SYSERR: Missing level for cleric rod saving throw."); break; @@ -515,16 +515,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 24; case 29: return 23; case 30: return 22; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 21; + case 32: return 20; + case 33: return 19; + case 34: return 18; + case 35: return 17; + case 36: return 16; + case 37: return 15; + case 38: return 14; + case 39: return 13; + case 40: return 13; default: log("SYSERR: Missing level for cleric petrification saving throw."); break; @@ -562,16 +562,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 39; case 29: return 38; case 30: return 37; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 35; + case 32: return 34; + case 33: return 33; + case 34: return 32; + case 35: return 31; + case 36: return 31; + case 37: return 30; + case 38: return 29; + case 39: return 29; + case 40: return 28; default: log("SYSERR: Missing level for cleric breath saving throw."); break; @@ -609,16 +609,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 34; case 29: return 33; case 30: return 32; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 31; + case 32: return 30; + case 33: return 29; + case 34: return 28; + case 35: return 27; + case 36: return 26; + case 37: return 26; + case 38: return 25; + case 39: return 24; + case 40: return 23; default: log("SYSERR: Missing level for cleric spell saving throw."); break; @@ -663,16 +663,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 38; case 29: return 37; case 30: return 36; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 35; + case 32: return 34; + case 33: return 33; + case 34: return 32; + case 35: return 31; + case 36: return 31; + case 37: return 30; + case 38: return 29; + case 39: return 29; + case 40: return 28; default: log("SYSERR: Missing level for thief paralyzation saving throw."); break; @@ -710,16 +710,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 16; case 29: return 14; case 30: return 13; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 12; + case 32: return 11; + case 33: return 10; + case 34: return 9; + case 35: return 8; + case 36: return 7; + case 37: return 6; + case 38: return 5; + case 39: return 4; + case 40: return 4; default: log("SYSERR: Missing level for thief rod saving throw."); break; @@ -757,16 +757,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 33; case 29: return 32; case 30: return 31; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 30; + case 32: return 29; + case 33: return 28; + case 34: return 27; + case 35: return 26; + case 36: return 25; + case 37: return 24; + case 38: return 23; + case 39: return 23; + case 40: return 22; default: log("SYSERR: Missing level for thief petrification saving throw."); break; @@ -804,16 +804,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 53; case 29: return 52; case 30: return 51; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 50; + case 32: return 49; + case 33: return 48; + case 34: return 48; + case 35: return 47; + case 36: return 46; + case 37: return 45; + case 38: return 44; + case 39: return 43; + case 40: return 42; default: log("SYSERR: Missing level for thief breath saving throw."); break; @@ -851,16 +851,16 @@ byte saving_throws(int class_num, int type, int level) case 28: return 21; case 29: return 19; case 30: return 17; - case 31: return 0; - case 32: return 0; - case 33: return 0; - case 34: return 0; - case 35: return 0; - case 36: return 0; - case 37: return 0; - case 38: return 0; - case 39: return 0; - case 40: return 0; + case 31: return 16; + case 32: return 15; + case 33: return 14; + case 34: return 13; + case 35: return 12; + case 36: return 11; + case 37: return 10; + case 38: return 9; + case 39: return 8; + case 40: return 7; default: log("SYSERR: Missing level for thief spell saving throw."); break; @@ -915,8 +915,8 @@ byte saving_throws(int class_num, int type, int level) case 38: return 4; case 39: return 3; case 40: return 2; - case 41: return 1; /* Some mobiles. */ - case 42: return 0; + case 41: return 1; + case 42: return 1; case 43: return 0; case 44: return 0; case 45: return 0; @@ -1211,6 +1211,12 @@ int thaco(int class_num, int level) case 32: return 10; case 33: return 10; case 34: return 9; + case 35: return 9; + case 36: return 9; + case 37: return 8; + case 38: return 8; + case 39: return 8; + case 40: return 8; default: log("SYSERR: Missing level for mage thac0."); } @@ -1251,6 +1257,12 @@ int thaco(int class_num, int level) case 32: return 1; case 33: return 1; case 34: return 1; + case 35: return 1; + case 36: return 0; + case 37: return 0; + case 38: return 0; + case 39: return 0; + case 40: return 0; default: log("SYSERR: Missing level for cleric thac0."); } @@ -1291,6 +1303,12 @@ int thaco(int class_num, int level) case 32: return 5; case 33: return 4; case 34: return 4; + case 35: return 4; + case 36: return 3; + case 37: return 3; + case 38: return 3; + case 39: return 2; + case 40: return 2; default: log("SYSERR: Missing level for thief thac0."); } @@ -1331,6 +1349,12 @@ int thaco(int class_num, int level) case 32: return 1; case 33: return 1; case 34: return 1; + case 35: return 1; + case 36: return 0; + case 37: return 0; + case 38: return 0; + case 39: return 0; + case 40: return 0; default: log("SYSERR: Missing level for warrior thac0."); } @@ -1510,7 +1534,9 @@ void advance_level(struct char_data *ch) else GET_PRACTICES(ch) += MIN(2, MAX(1, wis_app[GET_WIS(ch)].bonus)); - if (GET_LEVEL(ch) >= LVL_IMMORT) { + /* Auto-advance to immortality? */ + if (!CONFIG_NO_MORT_TO_IMMORT && GET_LEVEL(ch) >= CONFIG_MAX_LEVEL && !IS_ADMIN(ch, ADMLVL_IMMORT)) { + set_admin_level(ch, ADMLVL_IMMORT); /* Increase admin level and set default admin flags */ for (i = 0; i < 3; i++) GET_COND(ch, i) = (char) -1; SET_BIT_AR(PRF_FLAGS(ch), PRF_HOLYLIGHT); @@ -1534,10 +1560,8 @@ int backstab_mult(int level) return 4; /* level 14 - 20 */ else if (level <= 28) return 5; /* level 21 - 28 */ - else if (level < LVL_IMMORT) - return 6; /* all remaining mortal levels */ else - return 20; /* immortals */ + return 6; /* all remaining mortal levels */ } /* invalid_class is used by handler.c to determine if a piece of equipment is @@ -1645,17 +1669,11 @@ void init_spell_levels(void) /* Function to return the exp required for each class/level */ int level_exp(int chclass, int level) { - if (level > LVL_IMPL || level < 0) { - log("SYSERR: Requesting exp for invalid level %d!", level); + if (level > CONFIG_MAX_LEVEL || level < 0) { + log("SYSERR: Requesting exp for invalid mortal level %d!", level); return 0; } - /* Gods have exp close to EXP_MAX. This statement should never have to - * changed, regardless of how many mortal or immortal levels exist. */ - if (level > LVL_IMMORT) { - return EXP_MAX - ((LVL_IMPL - level) * 1000); - } - /* Exp required for normal mortals is below */ switch (chclass) { @@ -1693,7 +1711,9 @@ int level_exp(int chclass, int level) case 29: return 6850000; case 30: return 7400000; /* add new levels here */ - case LVL_IMMORT: return 8000000; + default: + log("SYSERR: Magic User XP tables not set up correctly in level_exp in class.c!"); + return 123456; } break; @@ -1731,7 +1751,9 @@ int level_exp(int chclass, int level) case 29: return 6000000; case 30: return 6400000; /* add new levels here */ - case LVL_IMMORT: return 7000000; + default: + log("SYSERR: Cleric XP tables not set up correctly in level_exp in class.c!"); + return 123456; } break; @@ -1769,7 +1791,9 @@ int level_exp(int chclass, int level) case 29: return 6300000; case 30: return 6650000; /* add new levels here */ - case LVL_IMMORT: return 7000000; + default: + log("SYSERR: Thief XP tables not set up correctly in level_exp in class.c!"); + return 123456; } break; @@ -1807,7 +1831,9 @@ int level_exp(int chclass, int level) case 29: return 6850000; case 30: return 7400000; /* add new levels here */ - case LVL_IMMORT: return 8000000; + default: + log("SYSERR: Warrior XP tables not set up correctly in level_exp in class.c!"); + return 123456; } break; } @@ -1822,10 +1848,8 @@ int level_exp(int chclass, int level) /* Default titles of male characters. */ const char *title_male(int chclass, int level) { - if (level <= 0 || level > LVL_IMPL) + if (level <= 0 || level > CONFIG_MAX_LEVEL) return "the Man"; - if (level == LVL_IMPL) - return "the Implementor"; switch (chclass) { @@ -1861,9 +1885,6 @@ const char *title_male(int chclass, int level) case 28: return "the Shaman"; case 29: return "the Keeper of Talismans"; case 30: return "the Archmage"; - case LVL_IMMORT: return "the Immortal Warlock"; - case LVL_GOD: return "the Avatar of Magic"; - case LVL_GRGOD: return "the God of Magic"; default: return "the Mage"; } break; @@ -1891,9 +1912,6 @@ const char *title_male(int chclass, int level) case 19: return "the Arch Bishop"; case 20: return "the Patriarch"; /* no one ever thought up these titles 21-30 */ - case LVL_IMMORT: return "the Immortal Cardinal"; - case LVL_GOD: return "the Inquisitor"; - case LVL_GRGOD: return "the God of Good and Evil"; default: return "the Cleric"; } break; @@ -1921,9 +1939,6 @@ const char *title_male(int chclass, int level) case 19: return "the Brigand"; case 20: return "the Cut-Throat"; /* no one ever thought up these titles 21-30 */ - case LVL_IMMORT: return "the Immortal Assassin"; - case LVL_GOD: return "the Demi God of Thieves"; - case LVL_GRGOD: return "the God of Thieves and Tradesmen"; default: return "the Thief"; } break; @@ -1951,9 +1966,6 @@ const char *title_male(int chclass, int level) case 19: return "the Cavalier"; case 20: return "the Knight"; /* no one ever thought up these titles 21-30 */ - case LVL_IMMORT: return "the Immortal Warlord"; - case LVL_GOD: return "the Extirpator"; - case LVL_GRGOD: return "the God of War"; default: return "the Warrior"; } break; @@ -1966,10 +1978,8 @@ const char *title_male(int chclass, int level) /* Default titles of female characters. */ const char *title_female(int chclass, int level) { - if (level <= 0 || level > LVL_IMPL) + if (level <= 0 || level > CONFIG_MAX_LEVEL) return "the Woman"; - if (level == LVL_IMPL) - return "the Implementress"; switch (chclass) { @@ -2005,9 +2015,6 @@ const char *title_female(int chclass, int level) case 28: return "Shaman"; case 29: return "the Keeper of Talismans"; case 30: return "Archwitch"; - case LVL_IMMORT: return "the Immortal Enchantress"; - case LVL_GOD: return "the Empress of Magic"; - case LVL_GRGOD: return "the Goddess of Magic"; default: return "the Witch"; } break; @@ -2035,9 +2042,6 @@ const char *title_female(int chclass, int level) case 19: return "the Arch Lady of the Church"; case 20: return "the Matriarch"; /* no one ever thought up these titles 21-30 */ - case LVL_IMMORT: return "the Immortal Priestess"; - case LVL_GOD: return "the Inquisitress"; - case LVL_GRGOD: return "the Goddess of Good and Evil"; default: return "the Cleric"; } break; @@ -2065,9 +2069,6 @@ const char *title_female(int chclass, int level) case 19: return "the Brigand"; case 20: return "the Cut-Throat"; /* no one ever thought up these titles 21-30 */ - case LVL_IMMORT: return "the Immortal Assassin"; - case LVL_GOD: return "the Demi Goddess of Thieves"; - case LVL_GRGOD: return "the Goddess of Thieves and Tradesmen"; default: return "the Thief"; } break; @@ -2095,9 +2096,6 @@ const char *title_female(int chclass, int level) case 19: return "the Cavalier"; case 20: return "the Lady Knight"; /* no one ever thought up these titles 21-30 */ - case LVL_IMMORT: return "the Immortal Lady of War"; - case LVL_GOD: return "the Queen of Destruction"; - case LVL_GRGOD: return "the Goddess of War"; default: return "the Warrior"; } break; diff --git a/src/comm.c b/src/comm.c index b23dcca..fa908ec 100644 --- a/src/comm.c +++ b/src/comm.c @@ -466,7 +466,7 @@ void copyover_recover() /* Add to the list of 'recent' players (since last reboot) with copyover flag */ if (AddRecentPlayer(GET_NAME(d->character), d->host, FALSE, TRUE) == FALSE) { - mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "Failure to AddRecentPlayer (returned FALSE)."); + mudlog(BRF, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "Failure to AddRecentPlayer (returned FALSE)."); } } } @@ -916,13 +916,13 @@ void game_loop(socket_t local_mother_desc) /* Check for any signals we may have received. */ if (reread_wizlist) { reread_wizlist = FALSE; - mudlog(CMP, LVL_IMMORT, TRUE, "Signal received - rereading wizlists."); + mudlog(CMP, ADMLVL_IMMORT, TRUE, "Signal received - rereading wizlists."); reboot_wizlists(); } /* Orphaned right now as signal trapping is used for Webster lookup if (emergency_unban) { emergency_unban = FALSE; - mudlog(BRF, LVL_IMMORT, TRUE, "Received SIGUSR2 - completely unrestricting game (emergent)"); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "Received SIGUSR2 - completely unrestricting game (emergent)"); ban_list = NULL; circle_restrict = 0; num_invalid = 0; @@ -1557,7 +1557,7 @@ static int new_descriptor(socket_t s) /* determine if the site is banned */ if (isbanned(newd->host) == BAN_ALL) { CLOSE_SOCKET(desc); - mudlog(CMP, LVL_GOD, TRUE, "Connection attempt denied from [%s]", newd->host); + mudlog(CMP, ADMLVL_GOD, TRUE, "Connection attempt denied from [%s]", newd->host); free(newd); return (0); } @@ -2096,13 +2096,13 @@ void close_socket(struct descriptor_data *d) /* We are guaranteed to have a person. */ act("$n has lost $s link.", TRUE, link_challenged, 0, 0, TO_ROOM); save_char(link_challenged); - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(link_challenged)), TRUE, "Closing link to: %s.", GET_NAME(link_challenged)); + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(link_challenged)), TRUE, "Closing link to: %s.", GET_NAME(link_challenged)); } else { - mudlog(CMP, LVL_IMMORT, TRUE, "Losing player: %s.", GET_NAME(d->character) ? GET_NAME(d->character) : ""); + mudlog(CMP, ADMLVL_IMMORT, TRUE, "Losing player: %s.", GET_NAME(d->character) ? GET_NAME(d->character) : ""); free_char(d->character); } } else - mudlog(CMP, LVL_IMMORT, TRUE, "Losing descriptor without char."); + mudlog(CMP, ADMLVL_IMMORT, TRUE, "Losing descriptor without char."); /* JE 2/22/95 -- part of my unending quest to make switch stable */ if (d->original && d->original->desc) diff --git a/src/config.c b/src/config.c index f90277e..979ca56 100644 --- a/src/config.c +++ b/src/config.c @@ -69,12 +69,15 @@ int max_exp_loss = 500000; /* max losable per death */ int max_npc_corpse_time = 5; int max_pc_corpse_time = 10; +/* The maximum mortal level that can be obtained */ +int max_mortal_level = 30; + /* How many ticks before a player is sent to the void or idle-rented. */ int idle_void = 8; int idle_rent_time = 48; -/* This level and up is immune to idling, LVL_IMPL+1 will disable it. */ -int idle_max_level = LVL_GOD; +/* This admin level and up is immune to idling, LVL_IMPL+1 will disable it. */ +int idle_max_level = ADMLVL_GOD; /* Should items in death traps automatically be junked? */ int dts_are_dumps = YES; @@ -147,9 +150,8 @@ int auto_pwipe = NO; * Element 3, level 4, days 7: Players level 2 through 4 are wiped if they haven't logged on in the past 7 days. * Element 4, level 10, days 30: Players level 5-10 get 30 days. - * Element 5, level LVL_IMMORT - 1, days 60: All other mortals get 60 days. - * Element 6, level LVL_IMPL, days 90: Immortals get 90 days. - * Element 7: Because -2 is less than LVL_IMPL, this is assumed to be the end + * Element 5, level CONFIG_MAX_LEVEL, days 60: All other mortals get 60 days. + * Element 6: Because -2 is less than CONFIG_MAX_LEVEL, this is assumed to be the end of the criteria. The days entry is not used in this case. */ struct pclean_criteria_data pclean_criteria[] = { /* LEVEL DAYS */ @@ -157,8 +159,7 @@ struct pclean_criteria_data pclean_criteria[] = { { 1 ,4 }, { 4 ,7 }, { 10 ,30 }, - { LVL_IMMORT - 1 ,60 }, /* highest mortal */ - { LVL_IMPL ,90 }, /* all immortals */ + { 30 ,60 }, /* highest mortal - NOTE: Should be CONFIG_MAX_LEVEL */ { -1 ,0 } /* no more level checks */ }; @@ -287,7 +288,7 @@ int use_autowiz = YES; /* If yes, what is the lowest level which should be on the wizlist? (All immort * levels below the level you specify will go on the immlist instead.) */ -int min_wizlist_lev = LVL_GOD; +int min_wizlist_lev = ADMLVL_GOD; /* To mimic stock behavior set to NO. To allow mortals to see doors in exits * set to YES. */ diff --git a/src/config.h b/src/config.h index 03bc156..d600f1c 100644 --- a/src/config.h +++ b/src/config.h @@ -25,6 +25,7 @@ extern int max_exp_gain; extern int max_exp_loss; extern int max_npc_corpse_time; extern int max_pc_corpse_time; +extern int max_mortal_level; extern int idle_void; extern int idle_rent_time; extern int idle_max_level; diff --git a/src/constants.c b/src/constants.c index 9060ab5..bc7d3ff 100644 --- a/src/constants.c +++ b/src/constants.c @@ -43,6 +43,82 @@ const char *dirs[] = "\n" }; +/** Administrative level names + * @pre Must be in the same order as the ADMLVL_ defines. + * Must end array with a single newline. */ +const char *admin_level_names[ADMLVL_IMPL + 2] = { + "Mortal", // ADMLVL_NONE + "Immortal", // ADMLVL_IMMORTAL + "God", // ADMLVL_GOD + "Great God", // ADMLVL_GRGOD + "Implementor", // ADMLVL_IMPL + "\n", +}; + +/** Administrative flag short names + * @pre Must be in the same order as the ADMIN_ defines. + * Must end array with a single newline. */ +const char *admin_flag_names[] = { + "TellAll", + "SeeInventory", + "SeeSecret", + "KnowWeather", + "FullWhere", + "Money", + "EatAnything", + "NoPoison", + "WalkAnywhere", + "NoKeys", + "InstantKill", + "NoSteal", + "TransAll", + "SwitchMortal", + "ForceMass", + "AllHouses", + "NoDamage", + "AllShops", + "CEDIT", + "Build", + "AdvBuild", + "Poof", + "Admin", + "SetQP", + "AdvancedIBT", + "\n" +}; + +/** Administrative flag descriptions + * @pre Must be in the same order as the ADMIN_ defines. + * Must end array with a single newline. */ +const char *admin_flags[] = { + "You may use 'page all'", + "You can see other players inventories", + "You may see secret doors", + "You may know weather data", + "You know fully where things are", + "You do not require money", + "You can eat anything", + "You cannot be poisoned", + "You can walk anywhere", + "You do not require keys", + "You have the touch of death", + "You cannot be stolen from", + "You may use 'trans all'", + "You can use 'switch'", + "You may use 'force all'", + "You may enter any house", + "You do not take damage", + "You may use any shop", + "You may use cedit", + "You may use basic OLC tools", + "You may use advanced OLC tools", + "You may use goto and set poofs", + "You may set admin privs", + "You can give and remove qp", + "You can use advanced IBT commands", + "\n" +}; + /** Room flag descriptions. * @pre Must be in the same order as the defines. * Must end array with a single newline. */ diff --git a/src/constants.h b/src/constants.h index 350857a..5344601 100644 --- a/src/constants.h +++ b/src/constants.h @@ -14,6 +14,9 @@ extern const char *tbamud_version; extern const char *dirs[]; +extern const char *admin_level_names[]; +extern const char *admin_flag_names[]; +extern const char *admin_flags[]; extern const char *room_bits[]; extern const char *zone_bits[]; extern const char *exit_bits[]; diff --git a/src/db.c b/src/db.c index 86fdd1f..8f7e196 100644 --- a/src/db.c +++ b/src/db.c @@ -2455,7 +2455,7 @@ void zone_update(void) if (zone_table[update_u->zone_to_reset].reset_mode == 2 || is_empty(update_u->zone_to_reset)) { reset_zone(update_u->zone_to_reset); - mudlog(CMP, LVL_IMPL, FALSE, "Auto zone reset: %s (Zone %d)", + mudlog(CMP, ADMLVL_IMPL, FALSE, "Auto zone reset: %s (Zone %d)", zone_table[update_u->zone_to_reset].name, zone_table[update_u->zone_to_reset].number); /* dequeue */ if (update_u == reset_q.head) @@ -2477,8 +2477,8 @@ void zone_update(void) static void log_zone_error(zone_rnum zone, int cmd_no, const char *message) { - mudlog(NRM, LVL_GOD, TRUE, "SYSERR: zone file: %s", message); - mudlog(NRM, LVL_GOD, TRUE, "SYSERR: ...offending cmd: '%c' cmd in zone #%d, line %d", + mudlog(NRM, ADMLVL_GOD, TRUE, "SYSERR: zone file: %s", message); + mudlog(NRM, ADMLVL_GOD, TRUE, "SYSERR: ...offending cmd: '%c' cmd in zone #%d, line %d", ZCMD.command, zone_table[zone].number, ZCMD.line); } @@ -2732,7 +2732,7 @@ int is_empty(zone_rnum zone_nr) continue; /* If an immortal has nohassle off, he counts as present. Added for testing * zone reset triggers -Welcor */ - if ((!IS_NPC(i->character)) && (GET_LEVEL(i->character) >= LVL_IMMORT) && (PRF_FLAGGED(i->character, PRF_NOHASSLE))) + if ((!IS_NPC(i->character)) && (IS_ADMIN(i->character, ADMLVL_IMMORT)) && (PRF_FLAGGED(i->character, PRF_NOHASSLE))) continue; return (0); @@ -3367,7 +3367,8 @@ void init_char(struct char_data *ch) /* If this is our first player make him IMPL. */ if (top_of_p_table == 0) { - GET_LEVEL(ch) = LVL_IMPL; + GET_LEVEL(ch) = CONFIG_MAX_LEVEL; + set_admin_level(ch, ADMLVL_IMPL); /* Set IMP level and IMP flags */ GET_EXP(ch) = 7000000; /* The implementor never goes through do_start(). */ @@ -3412,7 +3413,7 @@ void init_char(struct char_data *ch) log("SYSERR: init_char: Character '%s' not found in player table.", GET_NAME(ch)); for (i = 1; i <= MAX_SKILLS; i++) { - if (GET_LEVEL(ch) < LVL_IMPL) + if (!IS_ADMIN(ch, ADMLVL_IMPL)) SET_SKILL(ch, i, 0); else SET_SKILL(ch, i, 100); @@ -3433,7 +3434,7 @@ void init_char(struct char_data *ch) ch->real_abils.cha = 25; for (i = 0; i < 3; i++) - GET_COND(ch, i) = (GET_LEVEL(ch) == LVL_IMPL ? -1 : 24); + GET_COND(ch, i) = (IS_ADMIN(ch, ADMLVL_IMPL) ? -1 : 24); GET_LOADROOM(ch) = NOWHERE; GET_SCREEN_WIDTH(ch) = PAGE_WIDTH; @@ -3658,7 +3659,7 @@ static int check_object_level(struct obj_data *obj, int val) { int error = FALSE; - if ((GET_OBJ_VAL(obj, val) < 0 || GET_OBJ_VAL(obj, val) > LVL_IMPL) && (error = TRUE)) + if ((GET_OBJ_VAL(obj, val) < 0 || GET_OBJ_VAL(obj, val) > CONFIG_MAX_LEVEL) && (error = TRUE)) log("SYSERR: Object #%d (%s) has out of range level #%d.", GET_OBJ_VNUM(obj), obj->short_description, GET_OBJ_VAL(obj, val)); @@ -3690,23 +3691,24 @@ static void load_default_config( void ) /* Game play options. */ CONFIG_PK_ALLOWED = pk_allowed; CONFIG_PT_ALLOWED = pt_allowed; - CONFIG_LEVEL_CAN_SHOUT = level_can_shout; - CONFIG_HOLLER_MOVE_COST = holler_move_cost; - CONFIG_TUNNEL_SIZE = tunnel_size; - CONFIG_MAX_EXP_GAIN = max_exp_gain; - CONFIG_MAX_EXP_LOSS = max_exp_loss; + CONFIG_LEVEL_CAN_SHOUT = level_can_shout; + CONFIG_HOLLER_MOVE_COST = holler_move_cost; + CONFIG_TUNNEL_SIZE = tunnel_size; + CONFIG_MAX_EXP_GAIN = max_exp_gain; + CONFIG_MAX_EXP_LOSS = max_exp_loss; CONFIG_MAX_NPC_CORPSE_TIME = max_npc_corpse_time; - CONFIG_MAX_PC_CORPSE_TIME = max_pc_corpse_time; - CONFIG_IDLE_VOID = idle_void; - CONFIG_IDLE_RENT_TIME = idle_rent_time; - CONFIG_IDLE_MAX_LEVEL = idle_max_level; - CONFIG_DTS_ARE_DUMPS = dts_are_dumps; + CONFIG_MAX_PC_CORPSE_TIME = max_pc_corpse_time; + CONFIG_MAX_LEVEL = max_mortal_level; + CONFIG_IDLE_VOID = idle_void; + CONFIG_IDLE_RENT_TIME = idle_rent_time; + CONFIG_IDLE_MAX_LEVEL = idle_max_level; + CONFIG_DTS_ARE_DUMPS = dts_are_dumps; CONFIG_LOAD_INVENTORY = load_into_inventory; - CONFIG_OK = strdup(OK); - CONFIG_NOPERSON = strdup(NOPERSON); - CONFIG_NOEFFECT = strdup(NOEFFECT); + CONFIG_OK = strdup(OK); + CONFIG_NOPERSON = strdup(NOPERSON); + CONFIG_NOEFFECT = strdup(NOEFFECT); CONFIG_TRACK_T_DOORS = track_through_doors; - CONFIG_NO_MORT_TO_IMMORT = no_mort_to_immort; + CONFIG_NO_MORT_TO_IMMORT = no_mort_to_immort; CONFIG_DISP_CLOSED_DOORS = display_closed_doors; CONFIG_MAP = map_option; CONFIG_MAP_SIZE = default_map_size; diff --git a/src/db.h b/src/db.h index 42c1992..5582760 100644 --- a/src/db.h +++ b/src/db.h @@ -143,6 +143,7 @@ #define PINDEX_NODELETE (1 << 1) /* protected player */ #define PINDEX_SELFDELETE (1 << 2) /* player is selfdeleting*/ #define PINDEX_NOWIZLIST (1 << 3) /* Player shouldn't be on wizlist*/ +#define PINDEX_MORTAL (1 << 4) /* Player is currently mortal (shouldn't be on wizlist) */ #define REAL 0 #define VIRTUAL 1 @@ -213,6 +214,7 @@ struct player_index_element { char *name; long id; int level; + int admlevel; int flags; time_t last; }; diff --git a/src/dg_db_scripts.c b/src/dg_db_scripts.c index 54b61d2..9499803 100644 --- a/src/dg_db_scripts.c +++ b/src/dg_db_scripts.c @@ -142,7 +142,7 @@ void dg_read_trigger(FILE *fp, void *proto, int type) count = sscanf(line,"%7s %d",junk,&vnum); if (count != 2) { - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Error assigning trigger! - Line was\n %s", line); return; } @@ -151,17 +151,17 @@ void dg_read_trigger(FILE *fp, void *proto, int type) if (rnum == NOTHING) { switch(type) { case MOB_TRIGGER: - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: dg_read_trigger: Trigger vnum #%d asked for but non-existant! (mob: %s - %d)", vnum, GET_NAME((char_data *)proto), GET_MOB_VNUM((char_data *)proto)); break; case WLD_TRIGGER: - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: dg_read_trigger: Trigger vnum #%d asked for but non-existant! (room:%d)", vnum, GET_ROOM_VNUM( ((room_data *)proto)->number )); break; default: - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: dg_read_trigger: Trigger vnum #%d asked for but non-existant! (?)", vnum); break; } @@ -203,13 +203,13 @@ void dg_read_trigger(FILE *fp, void *proto, int type) CREATE(room->script, struct script_data, 1); add_trigger(SCRIPT(room), read_trigger(rnum), -1); } else { - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: non-existant trigger #%d assigned to room #%d", vnum, room->number); } break; default: - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Trigger vnum #%d assigned to non-mob/obj/room", vnum); } } @@ -223,14 +223,14 @@ void dg_obj_trigger(char *line, struct obj_data *obj) count = sscanf(line,"%s %d",junk,&vnum); if (count != 2) { - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: dg_obj_trigger() : Error assigning trigger! - Line was:\n %s", line); return; } rnum = real_trigger(vnum); if (rnum==NOTHING) { - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Trigger vnum #%d asked for but non-existant! (Object: %s - %d)", vnum, obj->short_description, GET_OBJ_VNUM(obj)); return; @@ -265,7 +265,7 @@ void assign_triggers(void *i, int type) while (trg_proto) { rnum = real_trigger(trg_proto->vnum); if (rnum==NOTHING) { - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: trigger #%d non-existant, for mob #%d", trg_proto->vnum, mob_index[mob->nr].vnum); } else { @@ -298,7 +298,7 @@ void assign_triggers(void *i, int type) while (trg_proto) { rnum = real_trigger(trg_proto->vnum); if (rnum==NOTHING) { - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: trigger #%d non-existant, for room #%d", trg_proto->vnum, room->number); } else { @@ -310,7 +310,7 @@ void assign_triggers(void *i, int type) } break; default: - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: unknown type for assign_triggers()"); break; } diff --git a/src/dg_misc.c b/src/dg_misc.c index c1524ec..80ff023 100644 --- a/src/dg_misc.c +++ b/src/dg_misc.c @@ -278,10 +278,10 @@ int valid_dg_target(struct char_data *ch, int bitvector) return TRUE; /* all npcs are allowed as targets */ else if (ch->desc && (STATE(ch->desc) != CON_PLAYING)) return FALSE; /* Only PC's who are playing can be targetted */ - else if (GET_LEVEL(ch) < LVL_IMMORT) + else if (!IS_ADMIN(ch, ADMLVL_IMMORT)) return TRUE; /* as well as all mortals */ else if (!IS_SET(bitvector, DG_ALLOW_GODS) && - GET_LEVEL(ch) >= LVL_GRGOD) /* LVL_GOD has the advance command. Can't allow them to be forced. */ + IS_ADMIN(ch, ADMLVL_GOD)) /* ADMLVL_GOD has the advance command. Can't allow them to be forced. */ return FALSE; /* but not always the highest gods */ else if (!PRF_FLAGGED(ch, PRF_NOHASSLE)) return TRUE; /* the ones in between as allowed as long as they have no-hassle off. */ @@ -291,7 +291,7 @@ int valid_dg_target(struct char_data *ch, int bitvector) void script_damage(struct char_data *vict, int dam) { - if (GET_LEVEL(vict)>=LVL_IMMORT && (dam > 0)) { + if (IS_ADMIN(vict, ADMLVL_IMMORT) && (dam > 0)) { send_to_char(vict, "Being the cool immortal you are, you sidestep a trap, " "obviously placed to kill you.\r\n"); return; diff --git a/src/dg_mobcmd.c b/src/dg_mobcmd.c index 89cab0a..5b83d64 100644 --- a/src/dg_mobcmd.c +++ b/src/dg_mobcmd.c @@ -44,7 +44,7 @@ static void mob_log(char_data *mob, const char *format, ...) /* Macro to determine if a mob is permitted to use these commands. */ #define MOB_OR_IMPL(ch) \ - ((IS_NPC(ch) && (!(ch)->desc || GET_LEVEL((ch)->desc->original) >= LVL_IMPL)) || (SCRIPT(ch) && TRIGGERS(SCRIPT(ch)))) + ((IS_NPC(ch) && (!(ch)->desc || GET_ADMLEVEL((ch)->desc->original) >= ADMLVL_IMPL)) || (SCRIPT(ch) && TRIGGERS(SCRIPT(ch)))) #define MOB_OR_PLAYER(ch) (GET_LEVEL(ch) > 0) /* mob commands */ @@ -137,8 +137,8 @@ ACMD(do_mkill) return; } -/* Lets the mobile destroy an object in its inventory it can also destroy a - * worn object and it can destroy items using all.xxxxx or just plain all of +/* Lets the mobile destroy an object in its inventory it can also destroy a + * worn object and it can destroy items using all.xxxxx or just plain all of * them. */ ACMD(do_mjunk) { @@ -287,7 +287,7 @@ ACMD(do_mzoneecho) { int zone; char room_number[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH], *msg; - + if (!MOB_OR_IMPL(ch)) { send_to_char(ch, "Huh?!?\r\n"); @@ -308,7 +308,7 @@ ACMD(do_mzoneecho) } } -/* Lets the mobile load an item or mobile. All items are loaded into +/* Lets the mobile load an item or mobile. All items are loaded into * inventory, unless it is NO-TAKE. */ ACMD(do_mload) { @@ -329,7 +329,7 @@ ACMD(do_mload) if (AFF_FLAGGED(ch, AFF_CHARM)) return; - if( ch->desc && GET_LEVEL(ch->desc->original) < LVL_IMPL) + if (ch->desc && (!IS_ADMIN(ch->desc->original, ADMLVL_IMPL))) return; target = two_arguments(argument, arg1, arg2); @@ -413,8 +413,8 @@ ACMD(do_mload) mob_log(ch, "mload: bad type"); } -/* Lets the mobile purge all objects and other npcs in the room, or purge a - * specified object or mob in the room. It can purge itself, but this will +/* Lets the mobile purge all objects and other npcs in the room, or purge a + * specified object or mob in the room. It can purge itself, but this will * be the last command it does. */ ACMD(do_mpurge) { @@ -430,7 +430,7 @@ ACMD(do_mpurge) if (AFF_FLAGGED(ch, AFF_CHARM)) return; - if (ch->desc && (GET_LEVEL(ch->desc->original) < LVL_IMPL)) + if( ch->desc && !IS_ADMIN(ch->desc->original, ADMLVL_IMPL)) return; one_argument(argument, arg); @@ -555,7 +555,7 @@ ACMD(do_mat) } } -/* Lets the mobile transfer people. The all argument transfers everyone in the +/* Lets the mobile transfer people. The all argument transfers everyone in the * current room to the specified location. */ ACMD(do_mteleport) { @@ -653,7 +653,7 @@ ACMD(do_mdamage) { script_damage(vict, dam); } -/* Lets the mobile force someone to do something. must be mortal level and the +/* Lets the mobile force someone to do something. must be mortal level and the * all argument only affects those in the room with the mobile. */ ACMD(do_mforce) { @@ -667,7 +667,7 @@ ACMD(do_mforce) if (AFF_FLAGGED(ch, AFF_CHARM)) return; - if (ch->desc && (GET_LEVEL(ch->desc->original) < LVL_IMPL)) + if (ch->desc && (!IS_ADMIN(ch->desc->original, ADMLVL_IMPL))) return; argument = one_argument(argument, arg); @@ -728,7 +728,7 @@ ACMD(do_mhunt) if (AFF_FLAGGED(ch, AFF_CHARM)) return; - if (ch->desc && (GET_LEVEL(ch->desc->original) < LVL_IMPL)) + if (ch->desc && (!IS_ADMIN(ch->desc->original, ADMLVL_IMPL))) return; one_argument(argument, arg); @@ -770,7 +770,7 @@ ACMD(do_mremember) if (AFF_FLAGGED(ch, AFF_CHARM)) return; - if (ch->desc && (GET_LEVEL(ch->desc->original) < LVL_IMPL)) + if (ch->desc && (!IS_ADMIN(ch->desc->original, ADMLVL_IMPL))) return; argument = one_argument(argument, arg); @@ -821,7 +821,7 @@ ACMD(do_mforget) if (AFF_FLAGGED(ch, AFF_CHARM)) return; - if (ch->desc && (GET_LEVEL(ch->desc->original) < LVL_IMPL)) + if (ch->desc && (!IS_ADMIN(ch->desc->original, ADMLVL_IMPL))) return; one_argument(argument, arg); @@ -1136,7 +1136,7 @@ ACMD(do_mfollow) leader->followers = k; } -/* Prints the message to everyone in the range of numbers. Thanks to Jamie +/* Prints the message to everyone in the range of numbers. Thanks to Jamie * Nelson of 4D for this contribution */ ACMD(do_mrecho) { diff --git a/src/dg_olc.c b/src/dg_olc.c index 902e71b..ccc063c 100644 --- a/src/dg_olc.c +++ b/src/dg_olc.c @@ -62,7 +62,7 @@ ACMD(do_oasis_trigedit) d = ch->desc; /* Give descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_trigedit: Player already had olc structure."); free(d->olc); } @@ -86,7 +86,7 @@ ACMD(do_oasis_trigedit) } OLC_NUM(d) = number; - /* If this is a new trigger, setup a new one, otherwise, setup the a copy of + /* If this is a new trigger, setup a new one, otherwise, setup the a copy of * the existing trigger. */ if ((real_num = real_trigger(number)) == NOTHING) trigedit_setup_new(d); @@ -99,11 +99,11 @@ ACMD(do_oasis_trigedit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE,"OLC: %s starts editing zone %d [trigger](allowed zone %d)", + mudlog(CMP, ADMLVL_IMMORT, TRUE,"OLC: %s starts editing zone %d [trigger](allowed zone %d)", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); } -/* Called when a mob or object is being saved to disk, so its script can be +/* Called when a mob or object is being saved to disk, so its script can be * saved. */ void script_save_to_disk(FILE *fp, void *item, int type) { @@ -170,7 +170,7 @@ void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num) strcat(OLC_STORAGE(d), "\r\n"); c = c->next; } - /* Now trig->cmdlist is something to pass to the text editor it will be + /* Now trig->cmdlist is something to pass to the text editor it will be * converted back to a real cmdlist_element list later. */ OLC_TRIG(d) = trig; @@ -321,7 +321,7 @@ void trigedit_parse(struct descriptor_data *d, char *arg) switch(tolower(*arg)) { case 'y': trigedit_save(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits trigger %d", GET_NAME(d->character), OLC_NUM(d)); /* fall through */ @@ -565,9 +565,9 @@ void trigedit_save(struct descriptor_data *d) } /* now write the trigger out to disk, along with the rest of the triggers for - * this zone. We write this to disk NOW instead of letting the builder have - * control because if we lose this after having assigned a new trigger to an - * item, we will get SYSERR's upton reboot that could make things hard to + * this zone. We write this to disk NOW instead of letting the builder have + * control because if we lose this after having assigned a new trigger to an + * item, we will get SYSERR's upton reboot that could make things hard to * debug. */ zone = zone_table[OLC_ZNUM(d)].number; top = zone_table[OLC_ZNUM(d)].top; @@ -579,7 +579,7 @@ void trigedit_save(struct descriptor_data *d) #endif if (!(trig_file = fopen(fname, "w"))) { - mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(d->character)), TRUE, + mudlog(BRF, MAX(ADMLVL_GOD, GET_INVIS_LEV(d->character)), TRUE, "SYSERR: OLC: Can't open trig file \"%s\"", fname); return; } @@ -589,7 +589,7 @@ void trigedit_save(struct descriptor_data *d) trig = trig_index[rnum]->proto; if (fprintf(trig_file, "#%d\n", i) < 0) { - mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(d->character)), TRUE, + mudlog(BRF, MAX(ADMLVL_GOD, GET_INVIS_LEV(d->character)), TRUE, "SYSERR: OLC: Can't write trig file!"); fclose(trig_file); return; @@ -647,10 +647,10 @@ static void trigedit_create_index(int znum, char *type) snprintf(new_name, sizeof(new_name), "%s/newindex", prefix); if (!(oldfile = fopen(old_name, "r"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: DG_OLC: Failed to open %s", old_name); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: DG_OLC: Failed to open %s", old_name); return; } else if (!(newfile = fopen(new_name, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: DG_OLC: Failed to open %s", new_name); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: DG_OLC: Failed to open %s", new_name); return; } @@ -752,20 +752,20 @@ int dg_script_edit_parse(struct descriptor_data *d, char *arg) switch(tolower(*arg)) { case 'q': /* This was buggy. First we created a copy of a thing, but maintained - * pointers to scripts, then if we altered the scripts, we freed the + * pointers to scripts, then if we altered the scripts, we freed the * pointers and added new ones to the OLC_THING. If we then choose NOT - * to save the changes, the pointers in the original pointed to + * to save the changes, the pointers in the original pointed to * garbage. If we saved changes the pointers were updated correctly. - * Solution: Here we just point the working copies to the new - * proto_scripts. We only update the original when choosing to save + * Solution: Here we just point the working copies to the new + * proto_scripts. We only update the original when choosing to save * internally, then free the unused memory there. -Welcor * Thanks to Jeremy Stanley and Torgny Bjers for the bug report. * After updating to OasisOLC 2.0.3 I discovered some malfunctions - * in this code, so I restructured it a bit. Now things work like - * this: OLC_SCRIPT(d) is assigned a copy of the edited things' + * in this code, so I restructured it a bit. Now things work like + * this: OLC_SCRIPT(d) is assigned a copy of the edited things' * proto_script. OLC_OBJ(d), etc.. are initalized with proto_script = * NULL; On save, the saved copy is updated with OLC_SCRIPT(d) as new - * proto_script (freeing the old one). On quit/nosave, OLC_SCRIPT is + * proto_script (freeing the old one). On quit/nosave, OLC_SCRIPT is * free()'d, and the prototype not touched. */ return 0; case 'n': diff --git a/src/dg_scripts.c b/src/dg_scripts.c index 7238fba..b189f8d 100644 --- a/src/dg_scripts.c +++ b/src/dg_scripts.c @@ -1,15 +1,15 @@ /** * @file dg_scripts.c * Contains the main script driver interface. -* +* * Part of the core tbaMUD source code distribution, which is a derivative * of, and continuation of, CircleMUD. -* +* * This source code, which was not part of the CircleMUD legacy code, -* was created by the following people: -* $Author: Mark A. Heilpern/egreen/Welcor $ -* $Date: 2004/10/11 12:07:00$ -* $Revision: 1.0.14 $ +* was created by the following people: +* $Author: Mark A. Heilpern/egreen/Welcor $ +* $Date: 2004/10/11 12:07:00$ +* $Revision: 1.0.14 $ */ #include "conf.h" @@ -76,8 +76,8 @@ static struct obj_data *find_obj_by_uid_in_lookup_table(long uid); static EVENTFUNC(trig_wait_event); -/* Return pointer to first occurrence of string ct in cs, or NULL if not - * present. Case insensitive. All of ct must be found in cs for it to be +/* Return pointer to first occurrence of string ct in cs, or NULL if not + * present. Case insensitive. All of ct must be found in cs for it to be * a match. * @todo Move this function to string util library. * @param cs The string to search. @@ -117,7 +117,7 @@ char *str_str(char *cs, char *ct) * @param vnum The virtual number of a room. * @retval int Returns -1 if the room does not exist, or the total number of * PCs and NPCs in the room. */ -int trgvar_in_room(room_vnum vnum) +int trgvar_in_room(room_vnum vnum) { room_rnum rnum = real_room(vnum); int i = 0; @@ -139,8 +139,8 @@ int trgvar_in_room(room_vnum vnum) * @param name Either the unique id of an object or a string identifying the * object. Note the unique id must be prefixed with UID_CHAR. * @param list The list of objects to look through. - * @retval obj_data * Pointer to the object if it is found in the list of - * objects, NULL if the object is not found in the list. + * @retval obj_data * Pointer to the object if it is found in the list of + * objects, NULL if the object is not found in the list. */ obj_data *get_obj_in_list(char *name, obj_data *list) { @@ -153,7 +153,7 @@ obj_data *get_obj_in_list(char *name, obj_data *list) for (i = list; i; i = i->next_content) if (id == GET_ID(i)) return i; - + } else { for (i = list; i; i = i->next_content) if (isname(name, i->name)) @@ -207,8 +207,8 @@ obj_data *get_object_in_equip(char_data * ch, char *name) } /** Figures out if the argument is a valid location to 'wear' equipment. - * Handles 'held', 'light' and 'wield' positions - Welcor. After idea from - * Byron Ellacott. + * Handles 'held', 'light' and 'wield' positions - Welcor. After idea from + * Byron Ellacott. * @param arg Either the name of the position, or the number of a wear * location definition to check for. * @retval int If arg is not a valid wear location name or number, return @@ -330,8 +330,8 @@ static room_data *find_room(long n) } /* Generic searches based only on name. */ -/** Search the entire world for an NPC or PC by name. - * @param name String describing the name or the unique id of the char. +/** Search the entire world for an NPC or PC by name. + * @param name String describing the name or the unique id of the char. * Note the unique id must be prefixed with UID_CHAR. * @retval char_data * Pointer to the char or NULL if char is not found. */ char_data *get_char(char *name) @@ -355,11 +355,11 @@ char_data *get_char(char *name) /** Find a character by name in the same room as a known object. * @todo Should this function not be constrained to the same room as an object - * if 'name' is a unique id? + * if 'name' is a unique id? * @param obj An object that will constrain the search to the location that * the object is in *if* the name argument is not a unique id. * @param name Character name keyword to search for, or unique ID. Unique - * id must be prefixed with UID_CHAR. + * id must be prefixed with UID_CHAR. * @retval char_data * Pointer to the the char if found, NULL if not. Will * only find god characters if DG_ALLOW_GODS is on. */ char_data *get_char_near_obj(obj_data *obj, char *name) @@ -384,12 +384,12 @@ char_data *get_char_near_obj(obj_data *obj, char *name) } /** Find a character by name in a specific room. - * @todo Should this function not be constrained to the room - * if 'name' is a unique id? - * @param room A room that will constrain the search to that location + * @todo Should this function not be constrained to the room + * if 'name' is a unique id? + * @param room A room that will constrain the search to that location * *if* the name argument is not a unique id. * @param name Character name keyword to search for, or unique ID. Unique - * id must be prefixed with UID_CHAR. + * id must be prefixed with UID_CHAR. * @retval char_data * Pointer to the the char if found, NULL if not. Will * only find god characters if DG_ALLOW_GODS is on. */ char_data *get_char_in_room(room_data *room, char *name) @@ -491,7 +491,7 @@ room_data *get_room(char *name) return &world[nr]; } -/* Returns a pointer to the first character in world by name name, or NULL if +/* Returns a pointer to the first character in world by name name, or NULL if * none found. Starts searching with the person owing the object. */ char_data *get_char_by_obj(obj_data *obj, char *name) { @@ -522,7 +522,7 @@ char_data *get_char_by_obj(obj_data *obj, char *name) return NULL; } -/* Returns a pointer to the first character in world by name name, or NULL if +/* Returns a pointer to the first character in world by name name, or NULL if * none found. Starts searching in room room first. */ char_data *get_char_by_room(room_data *room, char *name) { @@ -548,7 +548,7 @@ char_data *get_char_by_room(room_data *room, char *name) return NULL; } -/* Returns the object in the world with name name, or NULL if not found search +/* Returns the object in the world with name name, or NULL if not found search * based on obj. */ obj_data *get_obj_by_obj(obj_data *obj, char *name) { @@ -909,7 +909,7 @@ void do_sstat_character(char_data *ch, char_data *k) script_stat(ch, SCRIPT(k)); } -/* Adds the trigger t to script sc in in location loc. loc = -1 means add to +/* Adds the trigger t to script sc in in location loc. loc = -1 means add to * the end, loc = 0 means add before all other triggers. */ void add_trigger(struct script_data *sc, trig_data *t, int loc) { @@ -991,8 +991,8 @@ ACMD(do_attach) if (IS_NPC(victim)) send_to_char(ch, "Trigger %d (%s) attached to %s [%d].\r\n", tn, GET_TRIG_NAME(trig), GET_SHORT(victim), GET_MOB_VNUM(victim)); - else - send_to_char(ch, "Trigger %d (%s) attached to player named %s.\r\n", + else + send_to_char(ch, "Trigger %d (%s) attached to player named %s.\r\n", tn, GET_TRIG_NAME(trig), GET_NAME(victim)); } @@ -1076,10 +1076,10 @@ ACMD(do_attach) } /* Removes the trigger specified by name, and the script of o if it removes the - * last trigger. name can either be a number, or a 'silly' name for the + * last trigger. name can either be a number, or a 'silly' name for the * trigger, including things like 2.beggar-death. Returns 0 if did not find the - * trigger, otherwise 1. If it matters, you might need to check to see if all - * the triggers were removed after this function returns, in order to remove + * trigger, otherwise 1. If it matters, you might need to check to see if all + * the triggers were removed after this function returns, in order to remove * the script. */ static int remove_trigger(struct script_data *sc, char *name) { @@ -1108,7 +1108,7 @@ static int remove_trigger(struct script_data *sc, char *name) break; } - /* This isn't clean. A numeric value will match if it's position OR vnum + /* This isn't clean. A numeric value will match if it's position OR vnum * is found. originally the number was position-only. */ else if (++n >= num) break; @@ -1244,8 +1244,8 @@ ACMD(do_detach) return; } - if (!SCRIPT(victim)) - send_to_char(ch, "That %s doesn't have any triggers.\r\n", IS_NPC(victim) ? "mob" : "player"); + if (!SCRIPT(victim)) + send_to_char(ch, "That %s doesn't have any triggers.\r\n", IS_NPC(victim) ? "mob" : "player"); else if (!can_edit_zone(ch, real_zone_by_thing(GET_MOB_VNUM(victim))) && IS_NPC(victim)) { send_to_char(ch, "You can only detach triggers in your own zone\r\n"); return; @@ -1290,31 +1290,31 @@ ACMD(do_detach) } } -/* Logs any errors caused by scripts to the system log. Will eventually allow +/* Logs any errors caused by scripts to the system log. Will eventually allow * on-line view of script errors. */ void script_vlog(const char *format, va_list args) { char output[MAX_STRING_LENGTH]; struct descriptor_data *i; - /* parse the args, making the error message */ - vsnprintf(output, sizeof(output) - 2, format, args); + /* parse the args, making the error message */ + vsnprintf(output, sizeof(output) - 2, format, args); - /* Save to the syslog file */ - basic_mud_log("SCRIPT ERROR: %s", output); + /* Save to the syslog file */ + basic_mud_log("SCRIPT ERROR: %s", output); - /* And send to imms */ - for (i = descriptor_list; i; i = i->next) { - if (STATE(i) != CON_PLAYING || IS_NPC(i->character)) /* switch */ - continue; - if (GET_LEVEL(i->character) < LVL_BUILDER) - continue; - if (PLR_FLAGGED(i->character, PLR_WRITING)) - continue; - if (NRM > (PRF_FLAGGED(i->character, PRF_LOG1) ? 1 : 0) + (PRF_FLAGGED(i->character, PRF_LOG2) ? 2 : 0)) - continue; + /* And send to imms */ + for (i = descriptor_list; i; i = i->next) { + if (STATE(i) != CON_PLAYING || IS_NPC(i->character)) /* switch */ + continue; + if (!IS_ADMIN((i->character), ADMLVL_BUILDER)) + continue; + if (PLR_FLAGGED(i->character, PLR_WRITING)) + continue; + if (NRM > (PRF_FLAGGED(i->character, PRF_LOG1) ? 1 : 0) + (PRF_FLAGGED(i->character, PRF_LOG2) ? 2 : 0)) + continue; - send_to_char(i->character, "%s[ %s ]%s\r\n", CCGRN(i->character, C_NRM), output, CCNRM(i->character, C_NRM)); + send_to_char(i->character, "%s[ %s ]%s\r\n", CCGRN(i->character, C_NRM), output, CCNRM(i->character, C_NRM)); } } @@ -1327,7 +1327,7 @@ void script_log(const char *format, ...) va_end(args); } -/* Returns 1 if string is all digits, else 0. Bugfixed - would have returned +/* Returns 1 if string is all digits, else 0. Bugfixed - would have returned * true on num="------". */ static int is_num(char *arg) { @@ -1445,7 +1445,7 @@ static void eval_op(char *op, char *lhs, char *rhs, char *result, void *go, } } -/* p points to the first quote, returns the matching end quote, or the last +/* p points to the first quote, returns the matching end quote, or the last * non-null char in p.*/ char *matching_quote(char *p) { @@ -1460,7 +1460,7 @@ char *matching_quote(char *p) return p; } -/* p points to the first paren. returns a pointer to the matching closing +/* p points to the first paren. returns a pointer to the matching closing * paren, or the last non-null char in p. */ static char *matching_paren(char *p) { @@ -1533,7 +1533,7 @@ static int eval_lhs_op_rhs(char *expr, char *result, void *go, struct script_dat p = strcpy(line, expr); - /* Initialize tokens, an array of pointers to locations in line where the + /* Initialize tokens, an array of pointers to locations in line where the * ops could possibly occur. */ for (j = 0; *p; j++) { tokens[j] = p; @@ -1613,7 +1613,7 @@ static struct cmdlist_element *find_end(trig_data *trig, struct cmdlist_element return c; } -/* Searches for valid elseif, else, or end to continue execution at. Returns +/* Searches for valid elseif, else, or end to continue execution at. Returns * line of elseif, else, or end if found, or last line of trigger. */ static struct cmdlist_element *find_else_end(trig_data *trig, struct cmdlist_element *cl, void *go, struct script_data *sc, int type) @@ -2034,7 +2034,7 @@ static void makeuid_var(void *go, struct script_data *sc, trig_data *trig, add_var(&GET_TRIG_VARS(trig), varname, uid, sc ? sc->context : 0); } -/* Processes a script return command. Returns the new value for the script to +/* Processes a script return command. Returns the new value for the script to * return. */ static int process_return(trig_data *trig, char *cmd) { @@ -2052,7 +2052,7 @@ static int process_return(trig_data *trig, char *cmd) return atoi(arg2); } -/* Removes a variable from the global vars of sc, or the local vars of trig if +/* Removes a variable from the global vars of sc, or the local vars of trig if * not found in global list. */ static void process_unset(struct script_data *sc, trig_data *trig, char *cmd) { @@ -2123,7 +2123,7 @@ static void process_remote(struct script_data *sc, trig_data *trig, char *cmd) return; } - /* For all but PC's, context comes from the existing context. For PC's, + /* For all but PC's, context comes from the existing context. For PC's, * context is 0 (global) */ context = vd->context; @@ -2145,7 +2145,7 @@ static void process_remote(struct script_data *sc, trig_data *trig, char *cmd) add_var(&(sc_remote->global_vars), vd->name, vd->value, context); } -/* Command-line interface to rdelete. Named vdelete so people didn't think it +/* Command-line interface to rdelete. Named vdelete so people didn't think it * was to delete rooms. */ ACMD(do_vdelete) { @@ -2234,7 +2234,7 @@ ACMD(do_vdelete) send_to_char(ch, "Deleted.\r\n"); } -/* Called from do_set - return 0 for failure, 1 for success. ch and vict are +/* Called from do_set - return 0 for failure, 1 for success. ch and vict are * verified. */ int perform_set_dg_var(struct char_data *ch, struct char_data *vict, char *val_arg) { @@ -2398,7 +2398,7 @@ static void extract_value(struct script_data *sc, trig_data *trig, char *cmd) /* Thanks to Jamie Nelson for 4 dimensions for this addition. * Syntax : - * dg_letter . + * dg_letter . * set string L337-String * dg_letter var1 4 %string% * dg_letter var2 11 %string% @@ -2441,7 +2441,7 @@ static void dg_letter_value(struct script_data *sc, trig_data *trig, char *cmd) /* This is the core driver for scripts. * Arguments: * void *go_adress - * A pointer to a pointer to the entity running the script. The reason for + * A pointer to a pointer to the entity running the script. The reason for * this approcah is that we want to be able to see from the calling function, * if the entity has been free'd. * @@ -2502,9 +2502,9 @@ int script_driver(void *go_adress, trig_data *trig, int type, int mode) extract_script(go, type); - /* extract_script() works on rooms, but on mobiles and objects, it will be - * called again if the caller is load_mtrigger or load_otrigger if it is - * one of these, we must make sure the script is not just reloaded on the + /* extract_script() works on rooms, but on mobiles and objects, it will be + * called again if the caller is load_mtrigger or load_otrigger if it is + * one of these, we must make sure the script is not just reloaded on the * next mob. We make the calling code decide how to handle it, so it does * not get totally removed unless it's a load_xtrigger(). */ return SCRIPT_ERROR_CODE; @@ -2736,7 +2736,7 @@ ACMD(do_tstat) send_to_char(ch, "Usage: tstat \r\n"); } -/* Scans for a case/default instance. Returns the line containg the correct +/* Scans for a case/default instance. Returns the line containg the correct * case instance, or the last line of the trigger if not found. */ static struct cmdlist_element * find_case(struct trig_data *trig, struct cmdlist_element *cl, @@ -2772,8 +2772,8 @@ find_case(struct trig_data *trig, struct cmdlist_element *cl, return c; } -/* Scans for end of while/switch-blocks. Returns the line containg 'end', or - * the last line of the trigger if not found. Malformed scripts may cause NULL +/* Scans for end of while/switch-blocks. Returns the line containg 'end', or + * the last line of the trigger if not found. Malformed scripts may cause NULL * to be returned. */ static struct cmdlist_element *find_done(struct cmdlist_element *cl) { @@ -2806,13 +2806,13 @@ void read_saved_vars(struct char_data *ch) char varname[32]; char context_str[16]; - /* If getting to the menu from inside the game, the vars aren't removed. So + /* If getting to the menu from inside the game, the vars aren't removed. So * let's not allocate them again. */ if (SCRIPT(ch)) return; /* Create the space for the script structure which holds the vars. We need to - * do this first, because later calls to 'remote' will need. A script already + * do this first, because later calls to 'remote' will need. A script already * assigned. */ CREATE(SCRIPT(ch), struct script_data, 1); @@ -2850,7 +2850,7 @@ void save_char_vars(struct char_data *ch) char fn[127]; struct trig_var_data *vars; - /* Immediate return if no script (and therefore no variables) structure has + /* Immediate return if no script (and therefore no variables) structure has * been created. this will happen when the player is logging in */ if (SCRIPT(ch) == NULL) return; @@ -2866,12 +2866,12 @@ void save_char_vars(struct char_data *ch) file = fopen(fn,"wt"); if (!file) { - mudlog( NRM, LVL_GOD, TRUE, + mudlog( NRM, ADMLVL_GOD, TRUE, "SYSERR: Could not open player variable file %s for writing.:%s", fn, strerror(errno)); return; } - /* Note that currently, context will always be zero. This may change in the + /* Note that currently, context will always be zero. This may change in the * future. */ while (vars) { if (*vars->name != '-') /* don't save if it begins with - */ @@ -2891,7 +2891,7 @@ void read_saved_vars_ascii(FILE *file, struct char_data *ch, int count) char context_str[READ_SIZE]; int i; - /* If getting to the menu from inside the game, the vars aren't removed. So + /* If getting to the menu from inside the game, the vars aren't removed. So * let's not allocate them again. */ if (SCRIPT(ch)) return; @@ -2922,7 +2922,7 @@ void save_char_vars_ascii(FILE *file, struct char_data *ch) { struct trig_var_data *vars; int count = 0; - /* Immediate return if no script (and therefore no variables) structure has + /* Immediate return if no script (and therefore no variables) structure has * been created. this will happen when the player is logging in */ if (SCRIPT(ch) == NULL) return; @@ -2932,7 +2932,7 @@ void save_char_vars_ascii(FILE *file, struct char_data *ch) /* make sure this char has global variables to save */ if (ch->script->global_vars == NULL) return; - /* Note that currently, context will always be zero. This may change in the + /* Note that currently, context will always be zero. This may change in the * future */ for (vars = ch->script->global_vars;vars;vars = vars->next) if (*vars->name != '-') @@ -3019,7 +3019,7 @@ void remove_from_lookup_table(long uid) int bucket = (int) (uid & (BUCKET_COUNT - 1)); struct lookup_table_t *lt = &lookup_table[bucket], *flt = NULL; - /* This is not supposed to happen. UID 0 is not used. However, while I'm + /* This is not supposed to happen. UID 0 is not used. However, while I'm * debugging the issue, let's just return right away. - Welcor */ if (uid == 0) return; @@ -3039,29 +3039,29 @@ void remove_from_lookup_table(long uid) log("remove_from_lookup. UID %ld not found.", uid); } -bool check_flags_by_name_ar(int *array, int numflags, char *search, const char *namelist[]) -{ - int i, item=-1; +bool check_flags_by_name_ar(int *array, int numflags, char *search, const char *namelist[]) +{ + int i, item=-1; - for (i=0; inext) - if (GET_TRIG_VNUM(t) == trig_num) - return 1; + for (t = TRIGGERS(sc); t; t = t->next) + if (GET_TRIG_VNUM(t) == trig_num) + return 1; - return 0; + return 0; } diff --git a/src/dg_triggers.c b/src/dg_triggers.c index 467f50c..30ec9f4 100644 --- a/src/dg_triggers.c +++ b/src/dg_triggers.c @@ -310,7 +310,7 @@ int command_mtrigger(char_data *actor, char *cmd, char *argument) continue; if (!GET_TRIG_ARG(t) || !*GET_TRIG_ARG(t)) { - mudlog(NRM, LVL_BUILDER, TRUE, "SYSERR: Command Trigger #%d has no text argument!", + mudlog(NRM, ADMLVL_BUILDER, TRUE, "SYSERR: Command Trigger #%d has no text argument!", GET_TRIG_VNUM(t)); continue; } @@ -350,7 +350,7 @@ void speech_mtrigger(char_data *actor, char *str) continue; if (!GET_TRIG_ARG(t) || !*GET_TRIG_ARG(t)) { - mudlog(NRM, LVL_BUILDER, TRUE, "SYSERR: Speech Trigger #%d has no text argument!", + mudlog(NRM, ADMLVL_BUILDER, TRUE, "SYSERR: Speech Trigger #%d has no text argument!", GET_TRIG_VNUM(t)); continue; } @@ -380,7 +380,7 @@ void act_mtrigger(const char_data *ch, char *str, char_data *actor, continue; if (!GET_TRIG_ARG(t) || !*GET_TRIG_ARG(t)) { - mudlog(NRM, LVL_BUILDER, TRUE, "SYSERR: Act Trigger #%d has no text argument!", + mudlog(NRM, ADMLVL_BUILDER, TRUE, "SYSERR: Act Trigger #%d has no text argument!", GET_TRIG_VNUM(t)); continue; } @@ -700,7 +700,7 @@ int cmd_otrig(obj_data *obj, char_data *actor, char *cmd, if (IS_SET(GET_TRIG_NARG(t), type) && (!GET_TRIG_ARG(t) || !*GET_TRIG_ARG(t))) { - mudlog(NRM, LVL_BUILDER, TRUE, "SYSERR: O-Command Trigger #%d has no text argument!", + mudlog(NRM, ADMLVL_BUILDER, TRUE, "SYSERR: O-Command Trigger #%d has no text argument!", GET_TRIG_VNUM(t)); continue; } @@ -1060,7 +1060,7 @@ int command_wtrigger(char_data *actor, char *cmd, char *argument) continue; if (!GET_TRIG_ARG(t) || !*GET_TRIG_ARG(t)) { - mudlog(NRM, LVL_BUILDER, TRUE, "SYSERR: W-Command Trigger #%d has no text argument!", + mudlog(NRM, ADMLVL_BUILDER, TRUE, "SYSERR: W-Command Trigger #%d has no text argument!", GET_TRIG_VNUM(t)); continue; } @@ -1095,7 +1095,7 @@ void speech_wtrigger(char_data *actor, char *str) continue; if (!GET_TRIG_ARG(t) || !*GET_TRIG_ARG(t)) { - mudlog(NRM, LVL_BUILDER, TRUE, "SYSERR: W-Speech Trigger #%d has no text argument!", + mudlog(NRM, ADMLVL_BUILDER, TRUE, "SYSERR: W-Speech Trigger #%d has no text argument!", GET_TRIG_VNUM(t)); continue; } diff --git a/src/dg_variables.c b/src/dg_variables.c index ec9720f..3a59ef9 100644 --- a/src/dg_variables.c +++ b/src/dg_variables.c @@ -574,7 +574,7 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig, else if (!str_cmp(field, "cha")) { if (subfield && *subfield) { int addition = atoi(subfield); - int max = (IS_NPC(c) || GET_LEVEL(c) >= LVL_GRGOD) ? 25 : 18; + int max = (IS_NPC(c) || IS_ADMIN(c, ADMLVL_GRGOD)) ? 25 : 18; GET_CHA(c) += addition; if (GET_CHA(c) > max) GET_CHA(c) = max; if (GET_CHA(c) < 3) GET_CHA(c) = 3; @@ -596,7 +596,7 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig, else if (!str_cmp(field, "con")) { if (subfield && *subfield) { int addition = atoi(subfield); - int max = (IS_NPC(c) || GET_LEVEL(c) >= LVL_GRGOD) ? 25 : 18; + int max = (IS_NPC(c) || IS_ADMIN(c, ADMLVL_GRGOD)) ? 25 : 18; GET_CON(c) += addition; if (GET_CON(c) > max) GET_CON(c) = max; if (GET_CON(c) < 3) GET_CON(c) = 3; @@ -608,7 +608,7 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig, if (!str_cmp(field, "dex")) { if (subfield && *subfield) { int addition = atoi(subfield); - int max = (IS_NPC(c) || GET_LEVEL(c) >= LVL_GRGOD) ? 25 : 18; + int max = (IS_NPC(c) || IS_ADMIN(c, ADMLVL_GRGOD)) ? 25 : 18; GET_DEX(c) += addition; if (GET_DEX(c) > max) GET_DEX(c) = max; if (GET_DEX(c) < 3) GET_DEX(c) = 3; @@ -725,7 +725,7 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig, else if (!str_cmp(field, "int")) { if (subfield && *subfield) { int addition = atoi(subfield); - int max = (IS_NPC(c) || GET_LEVEL(c) >= LVL_GRGOD) ? 25 : 18; + int max = (IS_NPC(c) || IS_ADMIN(c, ADMLVL_GRGOD)) ? 25 : 18; GET_INT(c) += addition; if (GET_INT(c) > max) GET_INT(c) = max; if (GET_INT(c) < 3) GET_INT(c) = 3; @@ -779,7 +779,7 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig, if (!str_cmp(field, "level")) { if (subfield && *subfield) { int lev = atoi(subfield); - GET_LEVEL(c) = MIN(MAX(lev, 0), LVL_IMMORT-1); + GET_LEVEL(c) = MIN(MAX(lev, 1), CONFIG_MAX_LEVEL); } else snprintf(str, slen, "%d", GET_LEVEL(c)); } @@ -970,7 +970,7 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig, else if (!str_cmp(field, "str")) { if (subfield && *subfield) { int addition = atoi(subfield); - int max = (IS_NPC(c) || GET_LEVEL(c) >= LVL_GRGOD) ? 25 : 18; + int max = (IS_NPC(c) || IS_ADMIN(c, ADMLVL_GRGOD)) ? 25 : 18; GET_STR(c) += addition; if (GET_STR(c) > max) GET_STR(c) = max; if (GET_STR(c) < 3) GET_STR(c) = 3; @@ -1038,7 +1038,7 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig, else if (!str_cmp(field, "wis")) { if (subfield && *subfield) { int addition = atoi(subfield); - int max = (IS_NPC(c) || GET_LEVEL(c) >= LVL_GRGOD) ? 25 : 18; + int max = (IS_NPC(c) || IS_ADMIN(c, ADMLVL_GRGOD)) ? 25 : 18; GET_WIS(c) += addition; if (GET_WIS(c) > max) GET_WIS(c) = max; if (GET_WIS(c) < 3) GET_WIS(c) = 3; diff --git a/src/fight.c b/src/fight.c index 0003eef..1c54fb0 100644 --- a/src/fight.c +++ b/src/fight.c @@ -78,7 +78,7 @@ void appear(struct char_data *ch) REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_INVISIBLE); REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_HIDE); - if (GET_LEVEL(ch) < LVL_IMMORT) + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) act("$n slowly fades into existence.", FALSE, ch, 0, 0, TO_ROOM); else act("You feel a strange presence as $n appears, seemingly from nowhere.", @@ -203,7 +203,7 @@ void check_killer(struct char_data *ch, struct char_data *vict) SET_BIT_AR(PLR_FLAGS(ch), PLR_KILLER); send_to_char(ch, "If you want to be a PLAYER KILLER, so be it...\r\n"); - mudlog(BRF, LVL_IMMORT, TRUE, "PC Killer bit set on %s for initiating attack on %s at %s.", + mudlog(BRF, ADMLVL_IMMORT, TRUE, "PC Killer bit set on %s for initiating attack on %s at %s.", GET_NAME(ch), GET_NAME(vict), world[IN_ROOM(vict)].name); } @@ -579,7 +579,7 @@ static void dam_message(int dam, struct char_data *ch, struct char_data *victim, act(buf, FALSE, ch, NULL, victim, TO_NOTVICT); /* damage message to damager */ - if (GET_LEVEL(ch) >= LVL_IMMORT) + if (IS_ADMIN(ch, ADMLVL_IMMORT)) send_to_char(ch, "(%d) ", dam); buf = replace_string(dam_weapons[msgnum].to_char, attack_hit_text[w_type].singular, attack_hit_text[w_type].plural); @@ -587,7 +587,7 @@ static void dam_message(int dam, struct char_data *ch, struct char_data *victim, send_to_char(ch, CCNRM(ch, C_CMP)); /* damage message to damagee */ - if (GET_LEVEL(victim) >= LVL_IMMORT) + if (IS_ADMIN(victim, ADMLVL_IMMORT)) send_to_char(victim, "@R(%d)", dam); buf = replace_string(dam_weapons[msgnum].to_victim, attack_hit_text[w_type].singular, attack_hit_text[w_type].plural); @@ -609,54 +609,54 @@ int skill_message(int dam, struct char_data *ch, struct char_data *vict, if (fight_messages[i].a_type == attacktype) { nr = dice(1, fight_messages[i].number_of_attacks); for (j = 1, msg = fight_messages[i].msg; (j < nr) && msg; j++) - msg = msg->next; + msg = msg->next; - if (!IS_NPC(vict) && (GET_LEVEL(vict) >= LVL_IMPL)) { - act(msg->god_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); - act(msg->god_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT); - act(msg->god_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); + if (IS_ADMIN(vict, ADMLVL_IMPL)) { + act(msg->god_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); + act(msg->god_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT); + act(msg->god_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); } else if (dam != 0) { /* * Don't send redundant color codes for TYPE_SUFFERING & other types * of damage without attacker_msg. */ - if (GET_POS(vict) == POS_DEAD) { + if (GET_POS(vict) == POS_DEAD) { if (msg->die_msg.attacker_msg) { send_to_char(ch, CCYEL(ch, C_CMP)); act(msg->die_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); send_to_char(ch, CCNRM(ch, C_CMP)); } - send_to_char(vict, CCRED(vict, C_CMP)); - act(msg->die_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); - send_to_char(vict, CCNRM(vict, C_CMP)); + send_to_char(vict, CCRED(vict, C_CMP)); + act(msg->die_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); + send_to_char(vict, CCNRM(vict, C_CMP)); - act(msg->die_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); - } else { + act(msg->die_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); + } else { if (msg->hit_msg.attacker_msg) { - send_to_char(ch, CCYEL(ch, C_CMP)); - act(msg->hit_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); - send_to_char(ch, CCNRM(ch, C_CMP)); + send_to_char(ch, CCYEL(ch, C_CMP)); + act(msg->hit_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); + send_to_char(ch, CCNRM(ch, C_CMP)); } - send_to_char(vict, CCRED(vict, C_CMP)); - act(msg->hit_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); - send_to_char(vict, CCNRM(vict, C_CMP)); + send_to_char(vict, CCRED(vict, C_CMP)); + act(msg->hit_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); + send_to_char(vict, CCNRM(vict, C_CMP)); - act(msg->hit_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); - } + act(msg->hit_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); + } } else if (ch != vict) { /* Dam == 0 */ if (msg->miss_msg.attacker_msg) { - send_to_char(ch, CCYEL(ch, C_CMP)); - act(msg->miss_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); - send_to_char(ch, CCNRM(ch, C_CMP)); + send_to_char(ch, CCYEL(ch, C_CMP)); + act(msg->miss_msg.attacker_msg, FALSE, ch, weap, vict, TO_CHAR); + send_to_char(ch, CCNRM(ch, C_CMP)); } - send_to_char(vict, CCRED(vict, C_CMP)); - act(msg->miss_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); - send_to_char(vict, CCNRM(vict, C_CMP)); + send_to_char(vict, CCRED(vict, C_CMP)); + act(msg->miss_msg.victim_msg, FALSE, ch, weap, vict, TO_VICT | TO_SLEEP); + send_to_char(vict, CCNRM(vict, C_CMP)); - act(msg->miss_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); + act(msg->miss_msg.room_msg, FALSE, ch, weap, vict, TO_NOTVICT); } return (1); } @@ -700,7 +700,7 @@ int damage(struct char_data *ch, struct char_data *victim, int dam, int attackty } /* You can't damage an immortal! */ - if (!IS_NPC(victim) && ((GET_LEVEL(victim) >= LVL_IMMORT) && PRF_FLAGGED(victim, PRF_NOHASSLE))) + if (!IS_NPC(victim) && (IS_ADMIN(victim, ADMLVL_IMPL) || ADM_FLAGGED(victim, ADM_NODAMAGE)) ) dam = 0; if (victim != ch) { @@ -712,7 +712,7 @@ int damage(struct char_data *ch, struct char_data *victim, int dam, int attackty if (GET_POS(victim) > POS_STUNNED && (FIGHTING(victim) == NULL)) { set_fighting(victim, ch); if (MOB_FLAGGED(victim, MOB_MEMORY) && !IS_NPC(ch)) - remember(victim, ch); + remember(victim, ch); } } @@ -792,7 +792,7 @@ int damage(struct char_data *ch, struct char_data *victim, int dam, int attackty send_to_char(victim, "%sYou wish that your wounds would stop BLEEDING so much!%s\r\n", CCRED(victim, C_SPR), CCNRM(victim, C_SPR)); if (ch != victim && MOB_FLAGGED(victim, MOB_WIMPY)) - do_flee(victim, NULL, 0, 0); + do_flee(victim, NULL, 0, 0); } if (!IS_NPC(victim) && GET_WIMP_LEV(victim) && (victim != ch) && GET_HIT(victim) < GET_WIMP_LEV(victim) && GET_HIT(victim) > 0) { @@ -821,15 +821,15 @@ int damage(struct char_data *ch, struct char_data *victim, int dam, int attackty if (GET_POS(victim) == POS_DEAD) { if (ch != victim && (IS_NPC(victim) || victim->desc)) { if (AFF_FLAGGED(ch, AFF_GROUP)) - group_gain(ch, victim); + group_gain(ch, victim); else solo_gain(ch, victim); } if (!IS_NPC(victim)) { - mudlog(BRF, LVL_IMMORT, TRUE, "%s killed by %s at %s", GET_NAME(victim), GET_NAME(ch), world[IN_ROOM(victim)].name); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "%s killed by %s at %s", GET_NAME(victim), GET_NAME(ch), world[IN_ROOM(victim)].name); if (MOB_FLAGGED(ch, MOB_MEMORY)) - forget(ch, victim); + forget(ch, victim); } /* Cant determine GET_GOLD on corpse, so do now and store */ if (IS_NPC(victim)) { @@ -949,9 +949,9 @@ void hit(struct char_data *ch, struct char_data *victim, int type) } else { /* If no weapon, add bare hand damage instead */ if (IS_NPC(ch)) - dam += dice(ch->mob_specials.damnodice, ch->mob_specials.damsizedice); + dam += dice(ch->mob_specials.damnodice, ch->mob_specials.damsizedice); else - dam += rand_number(0, 2); /* Max 2 bare hand damage for players */ + dam += rand_number(0, 2); /* Max 2 bare hand damage for players */ } /* Include a damage multiplier if victim isn't ready to fight: @@ -995,13 +995,13 @@ void perform_violence(void) if (IS_NPC(ch)) { if (GET_MOB_WAIT(ch) > 0) { - GET_MOB_WAIT(ch) -= PULSE_VIOLENCE; - continue; + GET_MOB_WAIT(ch) -= PULSE_VIOLENCE; + continue; } GET_MOB_WAIT(ch) = 0; if (GET_POS(ch) < POS_FIGHTING) { - GET_POS(ch) = POS_FIGHTING; - act("$n scrambles to $s feet!", TRUE, ch, 0, 0, TO_ROOM); + GET_POS(ch) = POS_FIGHTING; + act("$n scrambles to $s feet!", TRUE, ch, 0, 0, TO_ROOM); } } diff --git a/src/genmob.c b/src/genmob.c index ba74661..f39b472 100644 --- a/src/genmob.c +++ b/src/genmob.c @@ -269,7 +269,7 @@ int save_mobiles(zone_rnum rznum) vznum = zone_table[rznum].number; snprintf(mobfname, sizeof(mobfname), "%s%d.new", MOB_PREFIX, vznum); if ((mobfd = fopen(mobfname, "w")) == NULL) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: GenOLC: Cannot open mob file for writing."); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: GenOLC: Cannot open mob file for writing."); return FALSE; } @@ -392,7 +392,7 @@ void check_mobile_string(mob_vnum i, char **string, const char *desc) if (*string == NULL || **string == '\0') { char smbuf[128]; sprintf(smbuf, "GenOLC: Mob #%d has an invalid %s.", i, desc); - mudlog(BRF, LVL_GOD, TRUE, "%s", smbuf); + mudlog(BRF, ADMLVL_GOD, TRUE, "%s", smbuf); if (*string) free(*string); *string = strdup("An undefined string.\n"); diff --git a/src/genobj.c b/src/genobj.c index 1187e66..7409fe0 100644 --- a/src/genobj.c +++ b/src/genobj.c @@ -196,7 +196,7 @@ int save_objects(zone_rnum zone_num) snprintf(filename, sizeof(filename), "%s/%d.new", OBJ_PREFIX, zone_table[zone_num].number); if (!(fp = fopen(filename, "w+"))) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: Cannot open objects file %s!", filename); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: OLC: Cannot open objects file %s!", filename); return FALSE; } /* Start running through all objects in this zone. */ @@ -256,7 +256,7 @@ int save_objects(zone_rnum zone_num) for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /* Sanity check to prevent nasty protection faults. */ if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!"); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!"); continue; } strncpy(buf, ex_desc->description, sizeof(buf) - 1); diff --git a/src/genolc.c b/src/genolc.c index 601ae65..a80cf4b 100644 --- a/src/genolc.c +++ b/src/genolc.c @@ -277,111 +277,111 @@ int sprintascii(char *out, bitvector_t bits) return j; } -/* converts illegal filename chars into appropriate equivalents */ -char *fix_filename(char *str) -{ - static char good_file_name[MAX_STRING_LENGTH]; - char *cindex = good_file_name; - - while(*str) { - switch(*str) { - case ' ': *cindex = '_'; cindex++; break; - case '(': *cindex = '{'; cindex++; break; - case ')': *cindex = '}'; cindex++; break; - - /* skip the following */ - case '\'': break; - case '"': break; - - /* Legal character */ - default: *cindex = *str; cindex++;break; - } - str++; - } - *cindex = '\0'; - - return good_file_name; +/* converts illegal filename chars into appropriate equivalents */ +char *fix_filename(char *str) +{ + static char good_file_name[MAX_STRING_LENGTH]; + char *cindex = good_file_name; + + while(*str) { + switch(*str) { + case ' ': *cindex = '_'; cindex++; break; + case '(': *cindex = '{'; cindex++; break; + case ')': *cindex = '}'; cindex++; break; + + /* skip the following */ + case '\'': break; + case '"': break; + + /* Legal character */ + default: *cindex = *str; cindex++;break; + } + str++; + } + *cindex = '\0'; + + return good_file_name; } -/* Export command by Kyle */ -ACMD(do_export_zone) -{ - zone_rnum zrnum; - zone_vnum zvnum; - char sysbuf[MAX_INPUT_LENGTH]; - char zone_name[MAX_INPUT_LENGTH], *f; - int success, i; +/* Export command by Kyle */ +ACMD(do_export_zone) +{ + zone_rnum zrnum; + zone_vnum zvnum; + char sysbuf[MAX_INPUT_LENGTH]; + char zone_name[MAX_INPUT_LENGTH], *f; + int success, i; - /* system command locations are relative to - * where the binary IS, not where it was run - * from, thus we act like we are in the bin - * folder, because we are*/ - char *path = "../lib/world/export/"; + /* system command locations are relative to + * where the binary IS, not where it was run + * from, thus we act like we are in the bin + * folder, because we are*/ + char *path = "../lib/world/export/"; - if (IS_NPC(ch) || GET_LEVEL(ch) < LVL_IMPL) - return; + if (!IS_ADMIN(ch, ADMLVL_IMPL)) + return; - skip_spaces(&argument); - if (!*argument){ - send_to_char(ch, "Syntax: export "); - return; - } - - zvnum = atoi(argument); - zrnum = real_zone(zvnum); - - if (zrnum == NOWHERE) { - send_to_char(ch, "Export which zone?\r\n"); - return; - } - - /* If we fail, it might just be because the - * directory didn't exist. Can't hurt to try - * again. Do it silently though ( no logs ). */ - if (!export_info_file(zrnum)) { - sprintf(sysbuf, "mkdir %s", path); - i = system(sysbuf); - } - - if (!(success = export_info_file(zrnum))) - send_to_char(ch, "Info file not saved!\r\n"); - if (!(success = export_save_shops(zrnum))) - send_to_char(ch, "Shops not saved!\r\n"); - if (!(success = export_save_mobiles(zrnum))) - send_to_char(ch, "Mobiles not saved!\r\n"); - if (!(success = export_save_objects(zrnum))) - send_to_char(ch, "Objects not saved!\r\n"); - if (!(success = export_save_zone(zrnum))) - send_to_char(ch, "Zone info not saved!\r\n"); - if (!(success = export_save_rooms(zrnum))) - send_to_char(ch, "Rooms not saved!\r\n"); - if (!(success = export_save_triggers(zrnum))) - send_to_char(ch, "Triggers not saved!\r\n"); - - /* If anything went wrong, don't try to tar the files. */ - if (success) { - send_to_char(ch, "Individual files saved to /lib/world/export.\r\n"); - snprintf(zone_name, sizeof(zone_name), "%s", zone_table[zrnum].name); - } else { - send_to_char(ch, "Ran into problems writing to files.\r\n"); - return; + skip_spaces(&argument); + if (!*argument){ + send_to_char(ch, "Syntax: export "); + return; } - /* Make sure the name of the zone doesn't make the filename illegal. */ - f = fix_filename(zone_name); - /* Remove the old copy. */ - sprintf(sysbuf, "rm %s%s.tar.gz", path, f); - i = system(sysbuf); + zvnum = atoi(argument); + zrnum = real_zone(zvnum); - /* Tar the new copy. */ + if (zrnum == NOWHERE) { + send_to_char(ch, "Export which zone?\r\n"); + return; + } + + /* If we fail, it might just be because the + * directory didn't exist. Can't hurt to try + * again. Do it silently though ( no logs ). */ + if (!export_info_file(zrnum)) { + sprintf(sysbuf, "mkdir %s", path); + i = system(sysbuf); + } + + if (!(success = export_info_file(zrnum))) + send_to_char(ch, "Info file not saved!\r\n"); + if (!(success = export_save_shops(zrnum))) + send_to_char(ch, "Shops not saved!\r\n"); + if (!(success = export_save_mobiles(zrnum))) + send_to_char(ch, "Mobiles not saved!\r\n"); + if (!(success = export_save_objects(zrnum))) + send_to_char(ch, "Objects not saved!\r\n"); + if (!(success = export_save_zone(zrnum))) + send_to_char(ch, "Zone info not saved!\r\n"); + if (!(success = export_save_rooms(zrnum))) + send_to_char(ch, "Rooms not saved!\r\n"); + if (!(success = export_save_triggers(zrnum))) + send_to_char(ch, "Triggers not saved!\r\n"); + + /* If anything went wrong, don't try to tar the files. */ + if (success) { + send_to_char(ch, "Individual files saved to /lib/world/export.\r\n"); + snprintf(zone_name, sizeof(zone_name), "%s", zone_table[zrnum].name); + } else { + send_to_char(ch, "Ran into problems writing to files.\r\n"); + return; + } + /* Make sure the name of the zone doesn't make the filename illegal. */ + f = fix_filename(zone_name); + + /* Remove the old copy. */ + sprintf(sysbuf, "rm %s%s.tar.gz", path, f); + i = system(sysbuf); + + /* Tar the new copy. */ sprintf(sysbuf, "tar -cf %s%s.tar %sqq.info %sqq.wld %sqq.zon %sqq.mob %sqq.obj %sqq.trg %sqq.shp", path, f, path, path, path, path, path, path, path); - i = system(sysbuf); + i = system(sysbuf); - /* Gzip it. */ - sprintf(sysbuf, "gzip %s%s.tar", path, f); - i = system(sysbuf); + /* Gzip it. */ + sprintf(sysbuf, "gzip %s%s.tar", path, f); + i = system(sysbuf); - send_to_char(ch, "Files tar'ed to \"%s%s.tar.gz\"\r\n", path, f); + send_to_char(ch, "Files tar'ed to \"%s%s.tar.gz\"\r\n", path, f); } static int export_info_file(zone_rnum zrnum) @@ -390,10 +390,10 @@ static int export_info_file(zone_rnum zrnum) FILE *info_file; if (!(info_file = fopen("world/export/qq.info", "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_info_file : Cannot open file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_info_file : Cannot open file!"); return FALSE; } else if (fprintf(info_file, "tbaMUD Area file.\n") < 0) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_info_file: Cannot write to file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_info_file: Cannot write to file!"); fclose(info_file); return FALSE; } @@ -463,10 +463,10 @@ static int export_save_shops(zone_rnum zrnum) struct shop_data *shop; if (!(shop_file = fopen("world/export/qq.shp", "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_save_shops : Cannot open shop file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_save_shops : Cannot open shop file!"); return FALSE; } else if (fprintf(shop_file, "CircleMUD v3.0 Shop File~\n") < 0) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_save_shops: Cannot write to shop file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_save_shops: Cannot write to shop file!"); fclose(shop_file); return FALSE; } @@ -553,7 +553,7 @@ static int export_save_mobiles(zone_rnum rznum) mob_rnum rmob; if (!(mob_file = fopen("world/export/qq.mob", "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_save_mobiles : Cannot open file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_save_mobiles : Cannot open file!"); return FALSE; } @@ -624,7 +624,7 @@ static int export_save_zone(zone_rnum zrnum) FILE *zone_file; if (!(zone_file = fopen("world/export/qq.zon", "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_save_zone : Cannot open file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_save_zone : Cannot open file!"); return FALSE; } @@ -735,7 +735,7 @@ static int export_save_zone(zone_rnum zrnum) /* Invalid commands are replaced with '*' - Ignore them. */ continue; default: - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: export_save_zone(): Unknown cmd '%c' - NOT saving", ZCMD(zrnum, subcmd).command); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: export_save_zone(): Unknown cmd '%c' - NOT saving", ZCMD(zrnum, subcmd).command); continue; } } @@ -759,7 +759,7 @@ static int export_save_objects(zone_rnum zrnum) struct extra_descr_data *ex_desc; if (!(obj_file = fopen("world/export/qq.obj", "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_save_objects : Cannot open file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_save_objects : Cannot open file!"); return FALSE; } /* Start running through all objects in this zone. */ @@ -829,7 +829,7 @@ static int export_save_objects(zone_rnum zrnum) for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /* Sanity check to prevent nasty protection faults. */ if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: export_save_objects: Corrupt ex_desc!"); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: OLC: export_save_objects: Corrupt ex_desc!"); continue; } strncpy(buf, ex_desc->description, sizeof(buf) - 1); @@ -865,7 +865,7 @@ static int export_save_rooms(zone_rnum zrnum) char buf1[MAX_STRING_LENGTH]; if (!(room_file = fopen("world/export/qq.wld", "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_save_rooms : Cannot open file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_save_rooms : Cannot open file!"); return FALSE; } @@ -1003,7 +1003,7 @@ static int export_save_triggers(zone_rnum zrnum) char bitBuf[MAX_INPUT_LENGTH]; if (!(trig_file = fopen("world/export/qq.trg", "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: export_save_triggers : Cannot open file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: export_save_triggers : Cannot open file!"); return FALSE; } diff --git a/src/genqst.c b/src/genqst.c index 865a446..2708bf0 100644 --- a/src/genqst.c +++ b/src/genqst.c @@ -111,14 +111,14 @@ int add_quest(struct aq_data *nqst) if (qmrnum != NOBODY && mob_index[qmrnum].func && mob_index[qmrnum].func != questmaster) QST_FUNC(rnum) = mob_index[qmrnum].func; - if(qmrnum != NOBODY) + if(qmrnum != NOBODY) mob_index[qmrnum].func = questmaster; /* And make sure we save the updated quest information to disk */ if (rznum != NOWHERE) add_to_save_list(zone_table[rznum].number, SL_QST); else - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: GenOLC: Cannot determine quest zone."); return rnum; @@ -136,7 +136,7 @@ int delete_quest(qst_rnum rnum) if (rnum >= total_quests) return FALSE; - rznum = real_zone_by_thing(QST_NUM(rnum)); + rznum = real_zone_by_thing(QST_NUM(rnum)); log("GenOLC: delete_quest: Deleting quest #%d (%s).", QST_NUM(rnum), QST_NAME(rnum)); /* make a note of the quest master's secondary spec proc */ @@ -152,12 +152,12 @@ int delete_quest(qst_rnum rnum) RECREATE(aquest_table, struct aq_data, total_quests); else { free(aquest_table); - aquest_table = NULL; + aquest_table = NULL; } if (rznum != NOWHERE) add_to_save_list(zone_table[rznum].number, SL_QST); else - mudlog(BRF, LVL_BUILDER, TRUE, + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: GenOLC: Cannot determine quest zone."); /* does the questmaster mob have any quests left? */ if (qm != NOBODY) { diff --git a/src/genshp.c b/src/genshp.c index ef38b1f..97bb04f 100644 --- a/src/genshp.c +++ b/src/genshp.c @@ -302,7 +302,7 @@ int add_shop(struct shop_data *nshp) if (rznum != NOWHERE) add_to_save_list(zone_table[rznum].number, SL_SHP); else - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: GenOLC: Cannot determine shop zone."); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: GenOLC: Cannot determine shop zone."); return rshop; } @@ -336,7 +336,7 @@ int add_shop(struct shop_data *nshp) if (rznum != NOWHERE) add_to_save_list(zone_table[rznum].number, SL_SHP); else - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: GenOLC: Cannot determine shop zone."); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: GenOLC: Cannot determine shop zone."); return rshop; } @@ -359,10 +359,10 @@ int save_shops(zone_rnum zone_num) snprintf(fname, sizeof(fname), "%s/%d.new", SHP_PREFIX, zone_table[zone_num].number); if (!(shop_file = fopen(fname, "w"))) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: OLC: Cannot open shop file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: OLC: Cannot open shop file!"); return FALSE; } else if (fprintf(shop_file, "CircleMUD v3.0 Shop File~\n") < 0) { - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: OLC: Cannot write to shop file!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: OLC: Cannot write to shop file!"); fclose(shop_file); return FALSE; } diff --git a/src/genwld.c b/src/genwld.c index 1ba7eeb..27e38d8 100644 --- a/src/genwld.c +++ b/src/genwld.c @@ -19,7 +19,7 @@ #include "dg_olc.h" -/* This function will copy the strings so be sure you free your own copies of +/* This function will copy the strings so be sure you free your own copies of * the description, title, and such. */ room_rnum add_room(struct room_data *room) { @@ -95,7 +95,7 @@ room_rnum add_room(struct room_data *room) /* Known zone entries we don't care about. */ break; default: - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: GenOLC: add_room: Unknown zone entry found!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: GenOLC: add_room: Unknown zone entry found!"); } /* Update the loadroom table. Adds 1 or 0. */ @@ -149,7 +149,7 @@ int delete_room(room_rnum rnum) r_frozen_start_room = 0; /* The Void */ } - /* Dump the contents of this room into the Void. We could also just extract + /* Dump the contents of this room into the Void. We could also just extract * the people, mobs, and objects here. */ for (obj = world[rnum].contents; obj; obj = next_obj) { next_obj = obj->next_content; @@ -167,7 +167,7 @@ int delete_room(room_rnum rnum) extract_script(room, WLD_TRIGGER); free_proto_script(room, WLD_TRIGGER); - /* Change any exit going to this room to go the void. Also fix all the exits + /* Change any exit going to this room to go the void. Also fix all the exits * pointing to rooms above this. */ i = top_of_world + 1; do { @@ -221,7 +221,7 @@ int delete_room(room_rnum rnum) /* Known zone entries we don't care about. */ break; default: - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: GenOLC: delete_room: Unknown zone entry found!"); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: GenOLC: delete_room: Unknown zone entry found!"); } /* Remove this room from all shop lists. */ @@ -296,8 +296,8 @@ int save_rooms(zone_rnum rzone) room->number, room->name ? room->name : "Untitled", STRING_TERMINATOR, buf, STRING_TERMINATOR, - zone_table[room->zone].number, room->room_flags[0], room->room_flags[1], room->room_flags[2], - room->room_flags[3], room->sector_type + zone_table[room->zone].number, room->room_flags[0], room->room_flags[1], room->room_flags[2], + room->room_flags[3], room->sector_type ); /* Now you write out the exits for the room. */ @@ -379,8 +379,8 @@ int copy_room(struct room_data *to, struct room_data *from) return TRUE; } -/* Copy strings over so bad things don't happen. We do not free the existing - * strings here because copy_room() did a shallow copy previously and we'd be +/* Copy strings over so bad things don't happen. We do not free the existing + * strings here because copy_room() did a shallow copy previously and we'd be * freeing the very strings we're copying. If this function is used elsewhere, * be sure to free_room_strings() the 'dest' room first. */ int copy_room_strings(struct room_data *dest, struct room_data *source) diff --git a/src/genzon.c b/src/genzon.c index 6d361dc..62638e6 100644 --- a/src/genzon.c +++ b/src/genzon.c @@ -85,7 +85,7 @@ zone_rnum create_new_zone(zone_vnum vzone_num, room_vnum bottom, room_vnum top, /* Create the zone file. */ snprintf(buf, sizeof(buf), "%s/%d.zon", ZON_PREFIX, vzone_num); if (!(fp = fopen(buf, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Can't write new zone file."); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Can't write new zone file."); *error = "Could not write zone file.\r\n"; return NOWHERE; } @@ -95,7 +95,7 @@ zone_rnum create_new_zone(zone_vnum vzone_num, room_vnum bottom, room_vnum top, /* Create the room file. */ snprintf(buf, sizeof(buf), "%s/%d.wld", WLD_PREFIX, vzone_num); if (!(fp = fopen(buf, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Can't write new world file."); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Can't write new world file."); *error = "Could not write world file.\r\n"; return NOWHERE; } @@ -105,7 +105,7 @@ zone_rnum create_new_zone(zone_vnum vzone_num, room_vnum bottom, room_vnum top, /* Create the mobile file. */ snprintf(buf, sizeof(buf), "%s/%d.mob", MOB_PREFIX, vzone_num); if (!(fp = fopen(buf, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Can't write new mob file."); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Can't write new mob file."); *error = "Could not write mobile file.\r\n"; return NOWHERE; } @@ -115,7 +115,7 @@ zone_rnum create_new_zone(zone_vnum vzone_num, room_vnum bottom, room_vnum top, /* Create the object file. */ snprintf(buf, sizeof(buf), "%s/%d.obj", OBJ_PREFIX, vzone_num); if (!(fp = fopen(buf, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Can't write new obj file."); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Can't write new obj file."); *error = "Could not write object file.\r\n"; return NOWHERE; } @@ -125,7 +125,7 @@ zone_rnum create_new_zone(zone_vnum vzone_num, room_vnum bottom, room_vnum top, /* Create the shop file. */ snprintf(buf, sizeof(buf), "%s/%d.shp", SHP_PREFIX, vzone_num); if (!(fp = fopen(buf, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Can't write new shop file."); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Can't write new shop file."); *error = "Could not write shop file.\r\n"; return NOWHERE; } @@ -135,7 +135,7 @@ zone_rnum create_new_zone(zone_vnum vzone_num, room_vnum bottom, room_vnum top, /* Create the quests file */ snprintf(buf, sizeof(buf), "%s/%d.qst", QST_PREFIX, vzone_num); if (!(fp = fopen(buf, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Can't write new quest file"); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Can't write new quest file"); *error = "Could not write quest file.\r\n"; return NOWHERE; } @@ -145,7 +145,7 @@ zone_rnum create_new_zone(zone_vnum vzone_num, room_vnum bottom, room_vnum top, /* Create the trigger file. */ snprintf(buf, sizeof(buf), "%s/%d.trg", TRG_PREFIX, vzone_num); if (!(fp = fopen(buf, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Can't write new trigger file"); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Can't write new trigger file"); *error = "Could not write trigger file.\r\n"; return NOWHERE; } @@ -248,10 +248,10 @@ void create_world_index(int znum, const char *type) snprintf(new_name, sizeof(new_name), "%s/newindex", prefix); if (!(oldfile = fopen(old_name, "r"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Failed to open %s.", old_name); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Failed to open %s.", old_name); return; } else if (!(newfile = fopen(new_name, "w"))) { - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: OLC: Failed to open %s.", new_name); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: OLC: Failed to open %s.", new_name); fclose(oldfile); return; } @@ -338,7 +338,7 @@ int save_zone(zone_rnum zone_num) snprintf(fname, sizeof(fname), "%s/%d.new", ZON_PREFIX, zone_table[zone_num].number); if (!(zfile = fopen(fname, "w"))) { - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: save_zones: Can't write zone %d.", zone_table[zone_num].number); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: save_zones: Can't write zone %d.", zone_table[zone_num].number); return FALSE; } @@ -463,7 +463,7 @@ int save_zone(zone_rnum zone_num) /* Invalid commands are replaced with '*' - Ignore them. */ continue; default: - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: z_save_to_disk(): Unknown cmd '%c' - NOT saving", ZCMD(zone_num, subcmd).command); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: z_save_to_disk(): Unknown cmd '%c' - NOT saving", ZCMD(zone_num, subcmd).command); continue; } if (ZCMD(zone_num, subcmd).command != 'V') diff --git a/src/handler.c b/src/handler.c index b380554..de708c6 100644 --- a/src/handler.c +++ b/src/handler.c @@ -254,7 +254,7 @@ void affect_total(struct char_data *ch) affect_modify_ar(ch, af->location, af->modifier, af->bitvector, TRUE); /* Make certain values are between 0..25, not < 0 and not > 25! */ - i = (IS_NPC(ch) || GET_LEVEL(ch) >= LVL_GRGOD) ? 25 : 18; + i = (IS_NPC(ch) || IS_ADMIN(ch, ADMLVL_GRGOD)) ? 25 : 18; GET_DEX(ch) = MAX(0, MIN(GET_DEX(ch), i)); GET_INT(ch) = MAX(0, MIN(GET_INT(ch), i)); diff --git a/src/hedit.c b/src/hedit.c index 24b0b50..66cda09 100644 --- a/src/hedit.c +++ b/src/hedit.c @@ -64,7 +64,7 @@ ACMD(do_oasis_hedit) d = ch->desc; if (!str_cmp("save", argument)) { - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves help files.", + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves help files.", GET_NAME(ch)); hedit_save_to_disk(d); send_to_char(ch, "Saving help files.\r\n"); @@ -73,14 +73,14 @@ ACMD(do_oasis_hedit) /* Give descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_oasis: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis: Player already had olc structure."); free(d->olc); } CREATE(d->olc, struct oasis_olc_data, 1); OLC_NUM(d) = 0; OLC_STORAGE(d) = strdup(arg); - OLC_ZNUM(d) = search_help(OLC_STORAGE(d), LVL_IMPL); + OLC_ZNUM(d) = search_help(OLC_STORAGE(d), ADMLVL_IMPL); if (OLC_ZNUM(d) == NOWHERE) { send_to_char(ch, "Do you wish to add the '%s' help file? ", OLC_STORAGE(d)); @@ -93,7 +93,7 @@ ACMD(do_oasis_hedit) STATE(d) = CON_HEDIT; act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s starts editing help files.", GET_NAME(d->character)); + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing help files.", GET_NAME(d->character)); } static void hedit_setup_new(struct descriptor_data *d) @@ -170,7 +170,7 @@ static void hedit_save_to_disk(struct descriptor_data *d) remove_from_save_list(HEDIT_PERMISSION, SL_HLP); /* Reboot the help files. */ - free_help_table(); + free_help_table(); index_boot(DB_BOOT_HLP); } @@ -206,7 +206,7 @@ void hedit_parse(struct descriptor_data *d, char *arg) case 'Y': snprintf(buf, sizeof(buf), "OLC: %s edits help for %s.", GET_NAME(d->character), OLC_HELP(d)->keywords); - mudlog(TRUE, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), CMP, "%s", buf); + mudlog(TRUE, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), CMP, "%s", buf); write_to_output(d, "Help saved to disk.\r\n"); hedit_save_internally(d); @@ -229,9 +229,9 @@ void hedit_parse(struct descriptor_data *d, char *arg) case 'y': case 'Y': hedit_setup_existing(d, OLC_ZNUM(d)); break; - case 'q': case 'Q': + case 'q': case 'Q': cleanup_olc(d, CLEANUP_ALL); - break; + break; case 'n': case 'N': OLC_ZNUM(d)++; for (; OLC_ZNUM(d) < top_of_helpt; OLC_ZNUM(d)++) @@ -248,7 +248,7 @@ void hedit_parse(struct descriptor_data *d, char *arg) write_to_output(d, "Do you wish to edit the '%s' help file? ", help_table[OLC_ZNUM(d)].keywords); OLC_MODE(d) = HEDIT_CONFIRM_EDIT; - } + } break; default: write_to_output(d, "Invalid choice!\r\n" @@ -300,7 +300,7 @@ void hedit_parse(struct descriptor_data *d, char *arg) OLC_VAL(d) = 1; break; case '2': - write_to_output(d, "Enter min level : "); + write_to_output(d, "Enter min admin level : "); OLC_MODE(d) = HEDIT_MIN_LEVEL; break; default: @@ -321,13 +321,13 @@ void hedit_parse(struct descriptor_data *d, char *arg) case HEDIT_ENTRY: /* We will NEVER get here, we hope. */ - mudlog(TRUE, LVL_BUILDER, BRF, "SYSERR: Reached HEDIT_ENTRY case in parse_hedit"); + mudlog(TRUE, ADMLVL_BUILDER, BRF, "SYSERR: Reached HEDIT_ENTRY case in parse_hedit"); break; case HEDIT_MIN_LEVEL: number = atoi(arg); - if ((number < 0) || (number > LVL_IMPL)) - write_to_output(d, "That is not a valid choice!\r\nEnter min level:-\r\n] "); + if ((number < ADMLVL_MORTAL) || (number > ADMLVL_IMPL)) + write_to_output(d, "That is not a valid choice!\r\nEnter min admin level:-\r\n] "); else { OLC_HELP(d)->min_level = number; break; @@ -336,7 +336,7 @@ void hedit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here. */ - mudlog(TRUE, LVL_BUILDER, BRF, "SYSERR: Reached default case in parse_hedit"); + mudlog(TRUE, ADMLVL_BUILDER, BRF, "SYSERR: Reached default case in parse_hedit"); break; } @@ -365,7 +365,7 @@ ACMD(do_helpcheck) for (i = 1; *(complete_cmd_info[i].command) != '\n'; i++) { if (complete_cmd_info[i].command_pointer != do_action && complete_cmd_info[i].minimum_level >= 0) { - if (search_help(complete_cmd_info[i].command, LVL_IMPL) == NOWHERE) { + if (search_help(complete_cmd_info[i].command, ADMLVL_IMPL) == NOWHERE) { nlen = snprintf(buf + len, sizeof(buf) - len, "%-20.20s%s", complete_cmd_info[i].command, (++count % 3 ? "" : "\r\n")); if (len + nlen >= sizeof(buf)) diff --git a/src/house.c b/src/house.c index 19c6006..401b4ad 100644 --- a/src/house.c +++ b/src/house.c @@ -86,7 +86,7 @@ static int House_load(room_vnum vnum) return (1); } -/* Save all objects for a house (recursive; initial call must be followed by a +/* Save all objects for a house (recursive; initial call must be followed by a * call to House_restore_weight) Assumes file is open already. */ int House_save(struct obj_data *obj, FILE *fp) { @@ -225,7 +225,7 @@ static void House_save_control(void) fclose(fl); } -/* Call from boot_db - will load control recs, load objs, set atrium bits. +/* Call from boot_db - will load control recs, load objs, set atrium bits. * Should do sanity checks on vnums & remove invalid records. */ void House_boot(void) { @@ -464,7 +464,7 @@ static void hcontrol_destroy_house(struct char_data *ch, char *arg) send_to_char(ch, "House deleted.\r\n"); House_save_control(); - /* Now, reset the ROOM_ATRIUM flag on all existing houses' atriums, just in + /* Now, reset the ROOM_ATRIUM flag on all existing houses' atriums, just in * case the house we just deleted shared an atrium with another house. -JE */ for (i = 0; i < num_of_houses; i++) if ((real_atrium = real_room(house_control[i].atrium)) != NOWHERE) @@ -480,7 +480,7 @@ static void hcontrol_pay_house(struct char_data *ch, char *arg) else if ((i = find_house(atoi(arg))) == NOWHERE) send_to_char(ch, "Unknown house.\r\n"); else { - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "Payment for house %s collected by %s.", arg, GET_NAME(ch)); + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "Payment for house %s collected by %s.", arg, GET_NAME(ch)); house_control[i].last_payment = time(0); House_save_control(); @@ -570,7 +570,7 @@ int House_can_enter(struct char_data *ch, room_vnum house) { int i, j; - if (GET_LEVEL(ch) >= LVL_GRGOD || (i = find_house(house)) == NOWHERE) + if (ADM_FLAGGED(ch, ADM_ALLHOUSES) || (i = find_house(house)) == NOWHERE) return (1); switch (house_control[i].mode) { @@ -628,7 +628,7 @@ static void hcontrol_convert_houses(struct char_data *ch) { int i; - if (GET_LEVEL(ch) < LVL_IMPL) + if (!IS_ADMIN(ch, ADMLVL_IMPL)) { send_to_char(ch, "Sorry, but you are not powerful enough to do that.\r\n"); return; diff --git a/src/ibt.c b/src/ibt.c index 4f32389..adee7b7 100755 --- a/src/ibt.c +++ b/src/ibt.c @@ -454,7 +454,7 @@ ACMD(do_ibt) last_ibt = get_last_ibt(subcmd); if ((!*arg)){ - if (GET_LEVEL(ch) >= LVL_GRGOD){ + if (ADM_FLAGGED(ch, ADM_ADVIBT)) { send_to_char(ch, "Usage: %s%s submit
%s\r\n" " %s%s list%s\r\n" " %s%s show %s\r\n" @@ -468,7 +468,7 @@ ACMD(do_ibt) QYEL, CMD_NAME, QNRM, QYEL, CMD_NAME, QNRM); return; - } else if (GET_LEVEL(ch) >= LVL_IMMORT) { + } else if (IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "Usage: %s%s submit
%s\r\n" " %s%s list%s\r\n" " %s%s show %s\r\n", @@ -499,12 +499,12 @@ ACMD(do_ibt) send_to_char(ch, "That %s doesn't exist.\r\n", CMD_NAME); return; } else { - if ((GET_LEVEL(ch) < LVL_IMMORT) && (!is_ibt_logger(ibtData, ch))) { + if ((!IS_ADMIN(ch, ADMLVL_IMMORT)) && (!is_ibt_logger(ibtData, ch))) { send_to_char(ch, "Sorry but you may only view %ss you have posted yourself.\n\r", ibt_types[subcmd]); } else { send_to_char(ch, "%s%s by %s%s\r\n",QCYN, ibt_types[subcmd], QYEL, ibtData->name); - if (GET_LEVEL(ch) >= LVL_IMMORT) { + if (IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "%sLevel: %s%d\r\n",QCYN, QYEL, ibtData->level); send_to_char(ch, "%sRoom : %s%d\r\n",QCYN, QYEL, ibtData->room); } @@ -527,7 +527,7 @@ ACMD(do_ibt) if (first_ibt) { - if (GET_LEVEL(ch) < LVL_IMMORT) { + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch,"%s No %s|%s Description\r\n", QCYN, QGRN, QCYN); send_to_char(ch,"%s ---|--------------------------------------------------%s\r\n", QGRN, QNRM); } else { @@ -539,7 +539,7 @@ ACMD(do_ibt) i++; /* For mortals, skip IBT's that they didn't log */ - if ((GET_LEVEL(ch) < LVL_IMMORT) && !is_ibt_logger(ibtData,ch)) + if ((!IS_ADMIN(ch, ADMLVL_IMMORT)) && !is_ibt_logger(ibtData,ch)) continue; /* Set up the 'important' flag */ @@ -549,7 +549,7 @@ ACMD(do_ibt) sprintf(imp, "%c", ' '); if (IBT_FLAGGED(ibtData, IBT_RESOLVED)) { - if (GET_LEVEL(ch) < LVL_IMMORT) { + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "%s%s%3d|%s%s\r\n", imp, QGRN, i, ibtData->text, QNRM); } else { @@ -562,7 +562,7 @@ ACMD(do_ibt) } num_res++; } else if (IBT_FLAGGED(ibtData, IBT_INPROGRESS)) { - if (GET_LEVEL(ch) < LVL_IMMORT) { + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "%s%s%3d%s|%s%s%s\r\n", imp, QYEL, i, QGRN, QYEL, ibtData->text, QNRM); @@ -576,7 +576,7 @@ ACMD(do_ibt) } num_unres++; } else { - if (GET_LEVEL(ch) < LVL_IMMORT) { + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { send_to_char(ch, "%s%s%3d%s|%s%s%s\r\n", imp, QRED, i, QGRN, QRED, ibtData->text, QNRM); @@ -599,7 +599,7 @@ ACMD(do_ibt) } else { send_to_char(ch,"No %ss have been found that were reported by you!\r\n", CMD_NAME); } - if (GET_LEVEL(ch) >= LVL_GRGOD) { + if (ADM_FLAGGED(ch, ADM_ADVIBT)) { send_to_char(ch,"%sYou may use %s remove, resolve or edit to change the list..%s\r\n", QCYN, CMD_NAME, QNRM); } send_to_char(ch,"%sYou may use %s%s show %s to see more indepth about the %s.%s\r\n", QCYN, QYEL, CMD_NAME, QCYN, CMD_NAME, QNRM); @@ -649,12 +649,12 @@ ACMD(do_ibt) case SCMD_TYPO: LINK( ibtData, first_typo, last_typo, next, prev ); break; } - mudlog(NRM,LVL_IMMORT, FALSE, "%s has posted %s %s!", GET_NAME(ch), TANA(CMD_NAME), CMD_NAME); + mudlog(NRM,ADMLVL_IMMORT, FALSE, "%s has posted %s %s!", GET_NAME(ch), TANA(CMD_NAME), CMD_NAME); return; } else if (is_abbrev(arg,"resolve")) { - if (GET_LEVEL(ch) < LVL_GRGOD){ + if (!ADM_FLAGGED(ch, ADM_ADVIBT)) { send_to_char(ch, "%s what?\r\n", ibt_types[subcmd]); return; } @@ -678,7 +678,7 @@ ACMD(do_ibt) } return; } else if (is_abbrev(arg,"remove")) { - if (GET_LEVEL(ch) < LVL_GRGOD){ + if (!ADM_FLAGGED(ch, ADM_ADVIBT)) { send_to_char(ch, "%s what?\r\n", ibt_types[subcmd]); return; } @@ -701,21 +701,21 @@ ACMD(do_ibt) } return; } else if (is_abbrev(arg,"save")) { - if (GET_LEVEL(ch) < LVL_GRGOD){ + if (!ADM_FLAGGED(ch, ADM_ADVIBT)) { send_to_char(ch, "%s what?\r\n", ibt_types[subcmd]); return; } save_ibt_file(subcmd); send_to_char(ch,"%s list saved.\r\n", ibt_types[subcmd]); } else if (is_abbrev(arg,"edit")) { - if (GET_LEVEL(ch) < LVL_GRGOD){ + if (!ADM_FLAGGED(ch, ADM_ADVIBT)) { send_to_char(ch, "%s what?\r\n", ibt_types[subcmd]); return; } /* Pass control to the OLC without the 'edit' arg */ do_oasis_ibtedit(ch, arg_text, cmd, subcmd); } else { - if (GET_LEVEL(ch) < LVL_GRGOD){ + if (!ADM_FLAGGED(ch, ADM_ADVIBT)) { send_to_char(ch, "%s what?\r\n", ibt_types[subcmd]); send_to_char(ch, "Usage: %s submit \r\n", ibt_types[subcmd]); return; @@ -776,7 +776,7 @@ ACMD(do_oasis_ibtedit) /* Give descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_oasis_ibtedit: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_ibtedit: Player already had olc structure."); free(d->olc); } @@ -799,7 +799,7 @@ ACMD(do_oasis_ibtedit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE,"OLC: %s starts editing %s %d", + mudlog(CMP, ADMLVL_IMMORT, TRUE,"OLC: %s starts editing %s %d", GET_NAME(ch), IBT_TYPE, OLC_NUM(d)); } @@ -942,7 +942,7 @@ void ibtedit_parse(struct descriptor_data *d, char *arg) case 'Y': /* Save the IBT in memory and to disk. */ ibtedit_save(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits %s %d", GET_NAME(d->character), IBT_TYPE, OLC_NUM(d)); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits %s %d", GET_NAME(d->character), IBT_TYPE, OLC_NUM(d)); cleanup_olc(d, CLEANUP_ALL); return; case 'n': @@ -1057,21 +1057,21 @@ void ibtedit_parse(struct descriptor_data *d, char *arg) case IBTEDIT_BODY: /* We should never get here, modify.c throws user through ibtedit_string_cleanup. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: ibtedit_parse(): Reached BODY case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: ibtedit_parse(): Reached BODY case!"); write_to_output(d, "Oops...\r\n"); break; case IBTEDIT_NOTES: /* We should never get here, modify.c throws user through ibtedit_string_cleanup. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: ibtedit_parse(): Reached NOTES case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: ibtedit_parse(): Reached NOTES case!"); write_to_output(d, "Oops...\r\n"); break; default: /* We should never get here. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: ibtedit_parse(): Reached default case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: ibtedit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; } diff --git a/src/improved-edit.c b/src/improved-edit.c index a0831d8..2615d36 100644 --- a/src/improved-edit.c +++ b/src/improved-edit.c @@ -446,7 +446,7 @@ void parse_edit_action(int command, char *string, struct descriptor_data *d) strcat(buf, buf2); if ((s = strchr(s, '\n')) != NULL) { /* This means that we are at the END of the line, we want out of there, - * but we want s to point to the beginning of the line. AFTER the line + * but we want s to point to the beginning of the line. AFTER the line * we want edited. */ s++; /* Now put the last 'good' half of buffer into storage. */ @@ -468,12 +468,12 @@ void parse_edit_action(int command, char *string, struct descriptor_data *d) break; default: write_to_output(d, "Invalid option.\r\n"); - mudlog(BRF, LVL_IMPL, TRUE, "SYSERR: invalid command passed to parse_edit_action"); + mudlog(BRF, ADMLVL_IMPL, TRUE, "SYSERR: invalid command passed to parse_edit_action"); return; } } -/* Re-formats message type formatted char *. (for strings edited with d->str) +/* Re-formats message type formatted char *. (for strings edited with d->str) * (mostly olc and mail). */ int format_text(char **ptr_string, int mode, struct descriptor_data *d, unsigned int maxlen, int low, int high) { @@ -540,7 +540,7 @@ int format_text(char **ptr_string, int mode, struct descriptor_data *d, unsigned cap_next = TRUE; } - /* This is so that if we stopped on a sentence, we move off the sentence + /* This is so that if we stopped on a sentence, we move off the sentence * delimiter. */ while (strchr(".!?", *flow)) { cap_next_next = TRUE; @@ -549,8 +549,8 @@ int format_text(char **ptr_string, int mode, struct descriptor_data *d, unsigned /* Special case: if we're at the end of the last line, and the last * character is a delimiter, the flow++ above will have *flow pointing - * to the \r (or \n) character after the delimiter. Thus *flow will be - * non-null, and an extra (blank) line might be added erroneously. We + * to the \r (or \n) character after the delimiter. Thus *flow will be + * non-null, and an extra (blank) line might be added erroneously. We * fix it by skipping the newline characters in between. - Welcor */ if (strchr("\n\r", *flow)) { *flow = '\0'; /* terminate 'start' string */ diff --git a/src/interpreter.c b/src/interpreter.c index 29e42ea..b5a9e35 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -60,298 +60,314 @@ struct command_info *complete_cmd_info; * commands such as "at" should have high priority; infrequently used and * dangerously destructive commands should have low priority. */ +/* The new command list has 8 columns, which are: + * command - The full command typed by players + * sort by - Ensure a command is sorted before a similar social + * min pos - Minimum position for player to use the command + * ACMD func - The handler function called when commmand is used + * Min Level - The minimum mortal level for this command + * Min Admin - Min. Admin level - over-rides mortal level unless ADMLVL_MORTAL + * Admin Flag - Required admin flag - over-rides admin level unless ADM_NONE + * Subcommand - Subcommand passed to handler function + * + * If Admin flag is set, admin level should be what would normally be set for the command, even + * though it's not used. This then shows in wizhelp or commands. +*/ cpp_extern const struct command_info cmd_info[] = { - { "RESERVED", "", 0, 0, 0, 0 }, /* this must be first -- for specprocs */ + { "RESERVED", "", 0, 0, 0, 0, 0, 0 }, /* this must be first -- for specprocs */ /* directions must come before other commands but after RESERVED */ - { "north" , "n" , POS_STANDING, do_move , 0, SCMD_NORTH }, - { "east" , "e" , POS_STANDING, do_move , 0, SCMD_EAST }, - { "south" , "s" , POS_STANDING, do_move , 0, SCMD_SOUTH }, - { "west" , "w" , POS_STANDING, do_move , 0, SCMD_WEST }, - { "up" , "u" , POS_STANDING, do_move , 0, SCMD_UP }, - { "down" , "d" , POS_STANDING, do_move , 0, SCMD_DOWN }, + { "north" , "n" , POS_STANDING, do_move , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_NORTH }, + { "east" , "e" , POS_STANDING, do_move , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_EAST }, + { "south" , "s" , POS_STANDING, do_move , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_SOUTH }, + { "west" , "w" , POS_STANDING, do_move , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_WEST }, + { "up" , "u" , POS_STANDING, do_move , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_UP }, + { "down" , "d" , POS_STANDING, do_move , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_DOWN }, /* now, the main list */ - { "at" , "at" , POS_DEAD , do_at , LVL_IMMORT, 0 }, - { "advance" , "adv" , POS_DEAD , do_advance , LVL_GOD, 0 }, - { "aedit" , "aed" , POS_DEAD , do_oasis_aedit, LVL_GOD, 0 }, - { "alias" , "ali" , POS_DEAD , do_alias , 0, 0 }, - { "afk" , "afk" , POS_DEAD , do_gen_tog , 0, SCMD_AFK }, - { "areas" , "are" , POS_DEAD , do_areas , 0, 0 }, - { "assist" , "as" , POS_FIGHTING, do_assist , 1, 0 }, - { "ask" , "ask" , POS_RESTING , do_spec_comm, 0, SCMD_ASK }, - { "astat" , "ast" , POS_DEAD , do_astat , 0, 0 }, - { "attach" , "attach" , POS_DEAD , do_attach , LVL_BUILDER, 0 }, - { "auction" , "auc" , POS_SLEEPING, do_gen_comm , 0, SCMD_AUCTION }, - { "autoexits" , "autoex" , POS_DEAD , do_gen_tog , 0, SCMD_AUTOEXIT }, - { "autoassist","autoass" , POS_DEAD , do_gen_tog , 0, SCMD_AUTOASSIST }, - { "autodoor" , "autodoor", POS_DEAD , do_gen_tog , 0, SCMD_AUTODOOR }, - { "autogold" , "autogold", POS_DEAD , do_gen_tog , 0, SCMD_AUTOGOLD }, - { "autokey" , "autokey" , POS_DEAD , do_gen_tog , 0, SCMD_AUTOKEY }, - { "autoloot" , "autoloot", POS_DEAD , do_gen_tog , 0, SCMD_AUTOLOOT }, - { "automap" , "automap" , POS_DEAD , do_gen_tog , 0, SCMD_AUTOMAP }, - { "autosac" , "autosac" , POS_DEAD , do_gen_tog , 0, SCMD_AUTOSAC }, - { "autosplit", "autospl" , POS_DEAD , do_gen_tog , 0, SCMD_AUTOSPLIT }, + { "at" , "at" , POS_DEAD , do_at , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "admin" , "adm" , POS_DEAD , do_admin , 0, ADMLVL_IMPL, ADM_ADMIN, 0 }, + { "advance" , "adv" , POS_DEAD , do_advance , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "aedit" , "aed" , POS_DEAD , do_oasis_aedit,0, ADMLVL_GOD, ADM_NONE, 0 }, + { "alias" , "ali" , POS_DEAD , do_alias , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "afk" , "afk" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AFK }, + { "areas" , "are" , POS_DEAD , do_areas , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "assist" , "as" , POS_FIGHTING, do_assist , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "ask" , "ask" , POS_RESTING , do_spec_comm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_ASK }, + { "astat" , "ast" , POS_DEAD , do_astat , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "attach" , "attach" , POS_DEAD , do_attach , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "auction" , "auc" , POS_SLEEPING, do_gen_comm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUCTION }, + { "autoexits" , "autoex" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOEXIT }, + { "autoassist","autoass" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOASSIST }, + { "autodoor" , "autodoor", POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTODOOR }, + { "autogold" , "autogold", POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOGOLD }, + { "autokey" , "autokey" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOKEY }, + { "autoloot" , "autoloot", POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOLOOT }, + { "automap" , "automap" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOMAP }, + { "autosac" , "autosac" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOSAC }, + { "autosplit", "autospl" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_AUTOSPLIT }, - { "backstab" , "ba" , POS_STANDING, do_backstab , 1, 0 }, - { "ban" , "ban" , POS_DEAD , do_ban , LVL_GRGOD, 0 }, - { "balance" , "bal" , POS_STANDING, do_not_here , 1, 0 }, - { "bash" , "bas" , POS_FIGHTING, do_bash , 1, 0 }, - { "brief" , "br" , POS_DEAD , do_gen_tog , 0, SCMD_BRIEF }, - { "buildwalk", "buildwalk", POS_STANDING, do_gen_tog , LVL_BUILDER, SCMD_BUILDWALK }, - { "buy" , "bu" , POS_STANDING, do_not_here , 0, 0 }, - { "bug" , "bug" , POS_DEAD , do_ibt , 0, SCMD_BUG }, + { "backstab" , "ba" , POS_STANDING, do_backstab , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "ban" , "ban" , POS_DEAD , do_ban , 0, ADMLVL_GRGOD, ADM_NONE, 0 }, + { "balance" , "bal" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "bash" , "bas" , POS_FIGHTING, do_bash , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "brief" , "br" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_BRIEF }, + { "buildwalk", "buildwalk",POS_STANDING, do_gen_tog , 0, ADMLVL_BUILDER, ADM_NONE, SCMD_BUILDWALK }, + { "buy" , "bu" , POS_STANDING, do_not_here , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "bug" , "bug" , POS_DEAD , do_ibt , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_BUG }, - { "cast" , "c" , POS_SITTING , do_cast , 1, 0 }, - { "cedit" , "cedit" , POS_DEAD , do_oasis_cedit, LVL_IMPL, 0 }, - { "changelog", "cha" , POS_DEAD , do_changelog, LVL_IMPL, 0 }, - { "check" , "ch" , POS_STANDING, do_not_here , 1, 0 }, - { "checkload", "checkl" , POS_DEAD , do_checkloadstatus, LVL_GOD, 0 }, - { "close" , "cl" , POS_SITTING , do_gen_door , 0, SCMD_CLOSE }, - { "clear" , "cle" , POS_DEAD , do_gen_ps , 0, SCMD_CLEAR }, - { "cls" , "cls" , POS_DEAD , do_gen_ps , 0, SCMD_CLEAR }, - { "consider" , "con" , POS_RESTING , do_consider , 0, 0 }, - { "commands" , "com" , POS_DEAD , do_commands , 0, SCMD_COMMANDS }, - { "compact" , "comp" , POS_DEAD , do_gen_tog , 0, SCMD_COMPACT }, - { "copyover" , "copyover", POS_DEAD , do_copyover , LVL_GRGOD, 0 }, - { "credits" , "cred" , POS_DEAD , do_gen_ps , 0, SCMD_CREDITS }, + { "cast" , "c" , POS_SITTING , do_cast , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "cedit" , "cedit" , POS_DEAD , do_oasis_cedit,0, ADMLVL_IMPL, ADM_CEDIT, 0 }, + { "changelog", "cha" , POS_DEAD , do_changelog , 0, ADMLVL_IMPL, ADM_NONE, 0 }, + { "check" , "ch" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "checkload", "checkl" , POS_DEAD , do_checkloadstatus,0, ADMLVL_GOD, ADM_ADVBUILD, 0 }, + { "close" , "cl" , POS_SITTING , do_gen_door , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_CLOSE }, + { "clear" , "cle" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_CLEAR }, + { "cls" , "cls" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_CLEAR }, + { "cmdinfo" , "cmd" , POS_DEAD , do_cmdinfo , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "consider" , "con" , POS_RESTING , do_consider , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "commands" , "com" , POS_DEAD , do_commands , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_COMMANDS }, + { "compact" , "comp" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_COMPACT }, + { "copyover" , "copyover", POS_DEAD , do_copyover , 0, ADMLVL_GRGOD, ADM_NONE, 0 }, + { "credits" , "cred" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_CREDITS }, - { "date" , "da" , POS_DEAD , do_date , LVL_IMMORT, SCMD_DATE }, - { "dc" , "dc" , POS_DEAD , do_dc , LVL_GOD, 0 }, - { "deposit" , "depo" , POS_STANDING, do_not_here , 1, 0 }, - { "detach" , "detach" , POS_DEAD , do_detach , LVL_BUILDER, 0 }, - { "diagnose" , "diag" , POS_RESTING , do_diagnose , 0, 0 }, - { "dig" , "dig" , POS_DEAD , do_dig , LVL_BUILDER, 0 }, - { "display" , "disp" , POS_DEAD , do_display , 0, 0 }, - { "donate" , "don" , POS_RESTING , do_drop , 0, SCMD_DONATE }, - { "drink" , "dri" , POS_RESTING , do_drink , 0, SCMD_DRINK }, - { "drop" , "dro" , POS_RESTING , do_drop , 0, SCMD_DROP }, + { "date" , "da" , POS_DEAD , do_date , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_DATE }, + { "dc" , "dc" , POS_DEAD , do_dc , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "deposit" , "depo" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "detach" , "detach" , POS_DEAD , do_detach , 0, ADMLVL_BUILDER, ADM_ADVBUILD, 0 }, + { "diagnose" , "diag" , POS_RESTING , do_diagnose , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "dig" , "dig" , POS_DEAD , do_dig , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "display" , "disp" , POS_DEAD , do_display , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "donate" , "don" , POS_RESTING , do_drop , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_DONATE }, + { "drink" , "dri" , POS_RESTING , do_drink , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_DRINK }, + { "drop" , "dro" , POS_RESTING , do_drop , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_DROP }, - { "eat" , "ea" , POS_RESTING , do_eat , 0, SCMD_EAT }, - { "echo" , "ec" , POS_SLEEPING, do_echo , LVL_IMMORT, SCMD_ECHO }, - { "emote" , "em" , POS_RESTING , do_echo , 0, SCMD_EMOTE }, - { ":" , ":" , POS_RESTING, do_echo , 1, SCMD_EMOTE }, - { "enter" , "ent" , POS_STANDING, do_enter , 0, 0 }, - { "equipment", "eq" , POS_SLEEPING, do_equipment, 0, 0 }, - { "exits" , "ex" , POS_RESTING , do_exits , 0, 0 }, - { "examine" , "exa" , POS_SITTING , do_examine , 0, 0 }, - { "export" , "export" , POS_DEAD , do_export_zone, LVL_IMPL, 0 }, + { "eat" , "ea" , POS_RESTING , do_eat , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_EAT }, + { "echo" , "ec" , POS_SLEEPING, do_echo , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_ECHO }, + { "emote" , "em" , POS_RESTING , do_echo , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_EMOTE }, + { ":" , ":" , POS_RESTING, do_echo , 1, ADMLVL_MORTAL, ADM_NONE, SCMD_EMOTE }, + { "enter" , "ent" , POS_STANDING, do_enter , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "equipment", "eq" , POS_SLEEPING, do_equipment , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "exits" , "ex" , POS_RESTING , do_exits , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "examine" , "exa" , POS_SITTING , do_examine , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "export" , "export" , POS_DEAD , do_export_zone,0, ADMLVL_IMPL, ADM_NONE, 0 }, - { "force" , "force" , POS_SLEEPING, do_force , LVL_GOD, 0 }, - { "fill" , "fil" , POS_STANDING, do_pour , 0, SCMD_FILL }, - { "file" , "file" , POS_SLEEPING, do_file , LVL_GOD, 0 }, - { "flee" , "fl" , POS_FIGHTING, do_flee , 1, 0 }, - { "follow" , "fol" , POS_RESTING , do_follow , 0, 0 }, - { "freeze" , "freeze" , POS_DEAD , do_wizutil , LVL_GRGOD, SCMD_FREEZE }, + { "force" , "force" , POS_SLEEPING, do_force , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "fill" , "fil" , POS_STANDING, do_pour , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_FILL }, + { "file" , "file" , POS_SLEEPING, do_file , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "flee" , "fl" , POS_FIGHTING, do_flee , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "follow" , "fol" , POS_RESTING , do_follow , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "freeze" , "freeze" , POS_DEAD , do_wizutil , 0, ADMLVL_GRGOD, ADM_NONE, SCMD_FREEZE }, - { "get" , "g" , POS_RESTING , do_get , 0, 0 }, - { "gecho" , "gecho" , POS_DEAD , do_gecho , LVL_GOD, 0 }, - { "gemote" , "gem" , POS_SLEEPING, do_gen_comm , 0, SCMD_GEMOTE }, - { "give" , "giv" , POS_RESTING , do_give , 0, 0 }, - { "goto" , "go" , POS_SLEEPING, do_goto , LVL_IMMORT, 0 }, - { "gold" , "gol" , POS_RESTING , do_gold , 0, 0 }, - { "gossip" , "gos" , POS_SLEEPING, do_gen_comm , 0, SCMD_GOSSIP }, - { "group" , "gr" , POS_RESTING , do_group , 1, 0 }, - { "grab" , "grab" , POS_RESTING , do_grab , 0, 0 }, - { "grats" , "grat" , POS_SLEEPING, do_gen_comm , 0, SCMD_GRATZ }, - { "gsay" , "gsay" , POS_SLEEPING, do_gsay , 0, 0 }, - { "gtell" , "gt" , POS_SLEEPING, do_gsay , 0, 0 }, + { "get" , "g" , POS_RESTING , do_get , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "gecho" , "gecho" , POS_DEAD , do_gecho , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "gemote" , "gem" , POS_SLEEPING, do_gen_comm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_GEMOTE }, + { "give" , "giv" , POS_RESTING , do_give , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "goto" , "go" , POS_SLEEPING, do_goto , 0, ADMLVL_MORTAL, ADM_POOF, 0 }, + { "gold" , "gol" , POS_RESTING , do_gold , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "gossip" , "gos" , POS_SLEEPING, do_gen_comm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_GOSSIP }, + { "group" , "gr" , POS_RESTING , do_group , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "grab" , "grab" , POS_RESTING , do_grab , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "grats" , "grat" , POS_SLEEPING, do_gen_comm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_GRATZ }, + { "gsay" , "gsay" , POS_SLEEPING, do_gsay , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "gtell" , "gt" , POS_SLEEPING, do_gsay , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, - { "help" , "h" , POS_DEAD , do_help , 0, 0 }, - { "happyhour", "ha" , POS_DEAD , do_happyhour, 0, 0 }, - { "hedit" , "hedit" , POS_DEAD , do_oasis_hedit, LVL_GOD , 0 }, - { "helpcheck", "helpch" , POS_DEAD , do_helpcheck, LVL_GOD, 0 }, - { "hide" , "hi" , POS_RESTING , do_hide , 1, 0 }, - { "hindex" , "hind" , POS_DEAD , do_hindex , 0, 0 }, - { "handbook" , "handb" , POS_DEAD , do_gen_ps , LVL_IMMORT, SCMD_HANDBOOK }, - { "hcontrol" , "hcontrol", POS_DEAD , do_hcontrol , LVL_GRGOD, 0 }, - { "history" , "history" , POS_DEAD , do_history, 0, 0}, - { "hit" , "hit" , POS_FIGHTING, do_hit , 0, SCMD_HIT }, - { "hold" , "hold" , POS_RESTING , do_grab , 1, 0 }, - { "holler" , "holler" , POS_RESTING , do_gen_comm , 1, SCMD_HOLLER }, - { "holylight", "holy" , POS_DEAD , do_gen_tog , LVL_IMMORT, SCMD_HOLYLIGHT }, - { "house" , "house" , POS_RESTING , do_house , 0, 0 }, + { "help" , "h" , POS_DEAD , do_help , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "happyhour", "ha" , POS_DEAD , do_happyhour , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "hedit" , "hedit" , POS_DEAD , do_oasis_hedit,0, ADMLVL_GOD, ADM_ADVBUILD, 0 }, + { "hindex" , "hind" , POS_DEAD , do_hindex , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "helpcheck", "helpch" , POS_DEAD , do_helpcheck , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "hide" , "hi" , POS_RESTING , do_hide , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "handbook" , "handb" , POS_DEAD , do_gen_ps , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_HANDBOOK }, + { "hcontrol" , "hcontrol", POS_DEAD , do_hcontrol , 0, ADMLVL_GRGOD, ADM_NONE, 0 }, + { "history" , "history" , POS_DEAD , do_history , 0, ADMLVL_MORTAL, ADM_NONE, 0}, + { "hit" , "hit" , POS_FIGHTING, do_hit , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_HIT }, + { "hold" , "hold" , POS_RESTING , do_grab , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "holler" , "holler" , POS_RESTING , do_gen_comm , 1, ADMLVL_MORTAL, ADM_NONE, SCMD_HOLLER }, + { "holylight", "holy" , POS_DEAD , do_gen_tog , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_HOLYLIGHT }, + { "house" , "house" , POS_RESTING , do_house , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, - { "inventory", "i" , POS_DEAD , do_inventory, 0, 0 }, - { "identify" , "id" , POS_STANDING, do_not_here , 1, 0 }, - { "idea" , "ide" , POS_DEAD , do_ibt , 0, SCMD_IDEA }, - { "imotd" , "imo" , POS_DEAD , do_gen_ps , LVL_IMMORT, SCMD_IMOTD }, - { "immlist" , "imm" , POS_DEAD , do_gen_ps , 0, SCMD_IMMLIST }, - { "info" , "info" , POS_SLEEPING, do_gen_ps , 0, SCMD_INFO }, - { "invis" , "invi" , POS_DEAD , do_invis , LVL_IMMORT, 0 }, + { "inventory", "i" , POS_DEAD , do_inventory , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "identify" , "id" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "idea" , "ide" , POS_DEAD , do_ibt , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_IDEA }, + { "imotd" , "imo" , POS_DEAD , do_gen_ps , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_IMOTD }, + { "immlist" , "imm" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_IMMLIST }, + { "info" , "info" , POS_SLEEPING, do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_INFO }, + { "invis" , "invi" , POS_DEAD , do_invis , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, - { "junk" , "j" , POS_RESTING , do_drop , 0, SCMD_JUNK }, + { "junk" , "j" , POS_RESTING , do_drop , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_JUNK }, - { "kill" , "k" , POS_FIGHTING, do_kill , 0, 0 }, - { "kick" , "ki" , POS_FIGHTING, do_kick , 1, 0 }, + { "kill" , "k" , POS_FIGHTING, do_kill , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "kick" , "ki" , POS_FIGHTING, do_kick , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, - { "look" , "l" , POS_RESTING , do_look , 0, SCMD_LOOK }, - { "last" , "last" , POS_DEAD , do_last , LVL_GOD, 0 }, - { "leave" , "lea" , POS_STANDING, do_leave , 0, 0 }, - { "levels" , "lev" , POS_DEAD , do_levels , 0, 0 }, - { "list" , "lis" , POS_STANDING, do_not_here , 0, 0 }, - { "links" , "lin" , POS_STANDING, do_links , LVL_GOD, 0 }, - { "lock" , "loc" , POS_SITTING , do_gen_door , 0, SCMD_LOCK }, - { "load" , "load" , POS_DEAD , do_load , LVL_BUILDER, 0 }, + { "look" , "l" , POS_RESTING , do_look , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_LOOK }, + { "last" , "last" , POS_DEAD , do_last , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "leave" , "lea" , POS_STANDING, do_leave , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "levels" , "lev" , POS_DEAD , do_levels , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "list" , "lis" , POS_STANDING, do_not_here , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "links" , "lin" , POS_STANDING, do_links , 0, ADMLVL_GOD, ADM_ADVBUILD, 0 }, + { "lock" , "loc" , POS_SITTING , do_gen_door , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_LOCK }, + { "load" , "load" , POS_DEAD , do_load , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, - { "motd" , "motd" , POS_DEAD , do_gen_ps , 0, SCMD_MOTD }, - { "mail" , "mail" , POS_STANDING, do_not_here , 1, 0 }, - { "map" , "map" , POS_STANDING, do_map , 1, 0 }, - { "medit" , "med" , POS_DEAD , do_oasis_medit, LVL_BUILDER, 0 }, - { "mlist" , "mlist" , POS_DEAD , do_oasis_list, LVL_BUILDER, SCMD_OASIS_MLIST }, - { "mcopy" , "mcopy" , POS_DEAD , do_oasis_copy, LVL_GOD, CON_MEDIT }, - { "mute" , "mute" , POS_DEAD , do_wizutil , LVL_GOD, SCMD_MUTE }, + { "motd" , "motd" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_MOTD }, + { "mortal" , "mort" , POS_DEAD , do_mortal , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "mail" , "mail" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "map" , "map" , POS_STANDING, do_map , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "medit" , "med" , POS_DEAD , do_oasis_medit,0, ADMLVL_BUILDER, ADM_NONE, 0 }, + { "mlist" , "mlist" , POS_DEAD , do_oasis_list, 0, ADMLVL_BUILDER, ADM_BUILD, SCMD_OASIS_MLIST }, + { "mcopy" , "mcopy" , POS_DEAD , do_oasis_copy, 0, ADMLVL_GOD, ADM_ADVBUILD, CON_MEDIT }, + { "mute" , "mute" , POS_DEAD , do_wizutil , 0, ADMLVL_GOD, ADM_NONE, SCMD_MUTE }, - { "news" , "news" , POS_SLEEPING, do_gen_ps , 0, SCMD_NEWS }, - { "noauction", "noauction",POS_DEAD , do_gen_tog , 0, SCMD_NOAUCTION }, - { "nogossip" , "nogossip", POS_DEAD , do_gen_tog , 0, SCMD_NOGOSSIP }, - { "nograts" , "nograts" , POS_DEAD , do_gen_tog , 0, SCMD_NOGRATZ }, - { "nohassle" , "nohassle", POS_DEAD , do_gen_tog , LVL_IMMORT, SCMD_NOHASSLE }, - { "norepeat" , "norepeat", POS_DEAD , do_gen_tog , 0, SCMD_NOREPEAT }, - { "noshout" , "noshout" , POS_SLEEPING, do_gen_tog , 1, SCMD_NOSHOUT }, - { "nosummon" , "nosummon", POS_DEAD , do_gen_tog , 1, SCMD_NOSUMMON }, - { "notell" , "notell" , POS_DEAD , do_gen_tog , 1, SCMD_NOTELL }, - { "notitle" , "notitle" , POS_DEAD , do_wizutil , LVL_GOD, SCMD_NOTITLE }, - { "nowiz" , "nowiz" , POS_DEAD , do_gen_tog , LVL_IMMORT, SCMD_NOWIZ }, + { "news" , "news" , POS_SLEEPING, do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_NEWS }, + { "noauction", "noauction",POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_NOAUCTION }, + { "nogossip" , "nogossip", POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_NOGOSSIP }, + { "nograts" , "nograts" , POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_NOGRATZ }, + { "nohassle" , "nohassle", POS_DEAD , do_gen_tog , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_NOHASSLE }, + { "norepeat" , "norepeat", POS_DEAD , do_gen_tog , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_NOREPEAT }, + { "noshout" , "noshout" , POS_SLEEPING, do_gen_tog , 1, ADMLVL_MORTAL, ADM_NONE, SCMD_NOSHOUT }, + { "nosummon" , "nosummon", POS_DEAD , do_gen_tog , 1, ADMLVL_MORTAL, ADM_NONE, SCMD_NOSUMMON }, + { "notell" , "notell" , POS_DEAD , do_gen_tog , 1, ADMLVL_MORTAL, ADM_NONE, SCMD_NOTELL }, + { "notitle" , "notitle" , POS_DEAD , do_wizutil , 0, ADMLVL_GOD, ADM_NONE, SCMD_NOTITLE }, + { "nowiz" , "nowiz" , POS_DEAD , do_gen_tog , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_NOWIZ }, - { "open" , "o" , POS_SITTING , do_gen_door , 0, SCMD_OPEN }, - { "order" , "ord" , POS_RESTING , do_order , 1, 0 }, - { "offer" , "off" , POS_STANDING, do_not_here , 1, 0 }, - { "olc" , "olc" , POS_DEAD , do_show_save_list, LVL_BUILDER, 0 }, - { "olist" , "olist" , POS_DEAD , do_oasis_list, LVL_BUILDER, SCMD_OASIS_OLIST }, - { "oedit" , "oedit" , POS_DEAD , do_oasis_oedit, LVL_BUILDER, 0 }, - { "ocopy" , "ocopy" , POS_DEAD , do_oasis_copy, LVL_GOD, CON_OEDIT }, + { "open" , "o" , POS_SITTING , do_gen_door , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_OPEN }, + { "order" , "ord" , POS_RESTING , do_order , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "offer" , "off" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "olc" , "olc" , POS_DEAD , do_show_save_list,0,ADMLVL_BUILDER,ADM_BUILD,0 }, + { "olist" , "olist" , POS_DEAD , do_oasis_list, 0, ADMLVL_BUILDER, ADM_BUILD, SCMD_OASIS_OLIST }, + { "oedit" , "oedit" , POS_DEAD , do_oasis_oedit,0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "ocopy" , "ocopy" , POS_DEAD , do_oasis_copy, 0, ADMLVL_GOD, ADM_ADVBUILD, CON_OEDIT }, - { "put" , "p" , POS_RESTING , do_put , 0, 0 }, - { "peace" , "pe" , POS_DEAD , do_peace , LVL_BUILDER, 0 }, - { "pick" , "pi" , POS_STANDING, do_gen_door , 1, SCMD_PICK }, - { "practice" , "pr" , POS_RESTING , do_practice , 1, 0 }, - { "page" , "pag" , POS_DEAD , do_page , 1, 0 }, - { "pardon" , "pardon" , POS_DEAD , do_wizutil , LVL_GOD, SCMD_PARDON }, - { "plist" , "plist" , POS_DEAD , do_plist , LVL_GOD, 0 }, - { "policy" , "pol" , POS_DEAD , do_gen_ps , 0, SCMD_POLICIES }, - { "pour" , "pour" , POS_STANDING, do_pour , 0, SCMD_POUR }, - { "prompt" , "pro" , POS_DEAD , do_display , 0, 0 }, - { "prefedit" , "pre" , POS_DEAD , do_oasis_prefedit , 0, 0 }, - { "purge" , "purge" , POS_DEAD , do_purge , LVL_BUILDER, 0 }, + { "put" , "p" , POS_RESTING , do_put , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "peace" , "pe" , POS_DEAD , do_peace , 0, ADMLVL_BUILDER, ADM_NONE, 0 }, + { "pick" , "pi" , POS_STANDING, do_gen_door , 1, ADMLVL_MORTAL, ADM_NONE, SCMD_PICK }, + { "practice" , "pr" , POS_RESTING , do_practice , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "page" , "pag" , POS_DEAD , do_page , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "pardon" , "pardon" , POS_DEAD , do_wizutil , 0, ADMLVL_GOD, ADM_NONE, SCMD_PARDON }, + { "plist" , "plist" , POS_DEAD , do_plist , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "policy" , "pol" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_POLICIES }, + { "pour" , "pour" , POS_STANDING, do_pour , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_POUR }, + { "prompt" , "pro" , POS_DEAD , do_display , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "prefedit" , "pre" , POS_DEAD , do_oasis_prefedit,0,ADMLVL_MORTAL,ADM_NONE, 0 }, + { "purge" , "purge" , POS_DEAD , do_purge , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, - { "qedit" , "qedit" , POS_DEAD , do_oasis_qedit, LVL_BUILDER, 0 }, - { "qlist" , "qlist" , POS_DEAD , do_oasis_list, LVL_BUILDER, SCMD_OASIS_QLIST }, - { "quaff" , "qua" , POS_RESTING , do_use , 0, SCMD_QUAFF }, - { "qecho" , "qec" , POS_DEAD , do_qcomm , LVL_GOD, SCMD_QECHO }, - { "quest" , "que" , POS_DEAD , do_quest , 0, 0 }, - { "qui" , "qui" , POS_DEAD , do_quit , 0, 0 }, - { "quit" , "quit" , POS_DEAD , do_quit , 0, SCMD_QUIT }, - { "qsay" , "qsay" , POS_RESTING , do_qcomm , 0, SCMD_QSAY }, + { "qedit" , "qedit" , POS_DEAD , do_oasis_qedit,0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "qlist" , "qlist" , POS_DEAD , do_oasis_list, 0, ADMLVL_BUILDER, ADM_BUILD, SCMD_OASIS_QLIST }, + { "quaff" , "qua" , POS_RESTING , do_use , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_QUAFF }, + { "qecho" , "qec" , POS_DEAD , do_qcomm , 0, ADMLVL_GOD, ADM_NONE, SCMD_QECHO }, + { "quest" , "que" , POS_DEAD , do_quest , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "qui" , "qui" , POS_DEAD , do_quit , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "quit" , "quit" , POS_DEAD , do_quit , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_QUIT }, + { "qsay" , "qsay" , POS_RESTING , do_qcomm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_QSAY }, - { "reply" , "r" , POS_SLEEPING, do_reply , 0, 0 }, - { "rest" , "res" , POS_RESTING , do_rest , 0, 0 }, - { "read" , "rea" , POS_RESTING , do_look , 0, SCMD_READ }, - { "reload" , "reload" , POS_DEAD , do_reboot , LVL_IMPL, 0 }, - { "recite" , "reci" , POS_RESTING , do_use , 0, SCMD_RECITE }, - { "receive" , "rece" , POS_STANDING, do_not_here , 1, 0 }, - { "recent" , "recent" , POS_DEAD , do_recent , LVL_IMMORT, 0 }, - { "remove" , "rem" , POS_RESTING , do_remove , 0, 0 }, - { "rent" , "rent" , POS_STANDING, do_not_here , 1, 0 }, - { "report" , "repo" , POS_RESTING , do_report , 0, 0 }, - { "reroll" , "rero" , POS_DEAD , do_wizutil , LVL_GRGOD, SCMD_REROLL }, - { "rescue" , "resc" , POS_FIGHTING, do_rescue , 1, 0 }, - { "restore" , "resto" , POS_DEAD , do_restore , LVL_GOD, 0 }, - { "return" , "retu" , POS_DEAD , do_return , 0, 0 }, - { "redit" , "redit" , POS_DEAD , do_oasis_redit, LVL_BUILDER, 0 }, - { "rlist" , "rlist" , POS_DEAD , do_oasis_list, LVL_BUILDER, SCMD_OASIS_RLIST }, - { "rcopy" , "rcopy" , POS_DEAD , do_oasis_copy, LVL_GOD, CON_REDIT }, - { "roomflags", "roomflags", POS_DEAD , do_gen_tog , LVL_IMMORT, SCMD_SHOWVNUMS }, + { "reply" , "r" , POS_SLEEPING, do_reply , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "rest" , "res" , POS_RESTING , do_rest , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "read" , "rea" , POS_RESTING , do_look , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_READ }, + { "reload" , "reload" , POS_DEAD , do_reboot , 0, ADMLVL_IMPL, ADM_NONE, 0 }, + { "recite" , "reci" , POS_RESTING , do_use , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_RECITE }, + { "receive" , "rece" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "recent" , "recent" , POS_DEAD , do_recent , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "remove" , "rem" , POS_RESTING , do_remove , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "rent" , "rent" , POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "report" , "repo" , POS_RESTING , do_report , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "reroll" , "rero" , POS_DEAD , do_wizutil , 0, ADMLVL_GRGOD, ADM_NONE, SCMD_REROLL }, + { "rescue" , "resc" , POS_FIGHTING, do_rescue , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "restore" , "resto" , POS_DEAD , do_restore , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "return" , "retu" , POS_DEAD , do_return , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "redit" , "redit" , POS_DEAD , do_oasis_redit,0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "rlist" , "rlist" , POS_DEAD , do_oasis_list, 0, ADMLVL_BUILDER, ADM_BUILD, SCMD_OASIS_RLIST }, + { "rcopy" , "rcopy" , POS_DEAD , do_oasis_copy, 0, ADMLVL_GOD, ADM_ADVBUILD, CON_REDIT }, + { "roomflags", "roomflags", POS_DEAD , do_gen_tog , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_SHOWVNUMS }, - { "sacrifice", "sac" , POS_RESTING , do_sac , 0, 0 }, - { "say" , "s" , POS_RESTING , do_say , 0, 0 }, - { "score" , "sc" , POS_DEAD , do_score , 0, 0 }, - { "scan" , "sca" , POS_RESTING , do_scan , 0, 0 }, - { "scopy" , "scopy" , POS_DEAD , do_oasis_copy, LVL_GOD, CON_SEDIT }, - { "sit" , "si" , POS_RESTING , do_sit , 0, 0 }, - { "'" , "'" , POS_RESTING , do_say , 0, 0 }, - { "save" , "sav" , POS_SLEEPING, do_save , 0, 0 }, - { "saveall" , "saveall" , POS_DEAD , do_saveall , LVL_BUILDER, 0}, - { "sell" , "sell" , POS_STANDING, do_not_here , 0, 0 }, - { "sedit" , "sedit" , POS_DEAD , do_oasis_sedit, LVL_BUILDER, 0 }, - { "send" , "send" , POS_SLEEPING, do_send , LVL_GOD, 0 }, - { "set" , "set" , POS_DEAD , do_set , LVL_IMMORT, 0 }, - { "shout" , "sho" , POS_RESTING , do_gen_comm , 0, SCMD_SHOUT }, - { "show" , "show" , POS_DEAD , do_show , LVL_IMMORT, 0 }, - { "shutdow" , "shutdow" , POS_DEAD , do_shutdown , LVL_IMPL, 0 }, - { "shutdown" , "shutdown", POS_DEAD , do_shutdown , LVL_IMPL, SCMD_SHUTDOWN }, - { "sip" , "sip" , POS_RESTING , do_drink , 0, SCMD_SIP }, - { "skillset" , "skillset", POS_SLEEPING, do_skillset , LVL_GRGOD, 0 }, - { "sleep" , "sl" , POS_SLEEPING, do_sleep , 0, 0 }, - { "slist" , "slist" , POS_SLEEPING, do_oasis_list, LVL_BUILDER, SCMD_OASIS_SLIST }, - { "sneak" , "sneak" , POS_STANDING, do_sneak , 1, 0 }, - { "snoop" , "snoop" , POS_DEAD , do_snoop , LVL_GOD, 0 }, - { "socials" , "socials" , POS_DEAD , do_commands , 0, SCMD_SOCIALS }, - { "split" , "split" , POS_SITTING , do_split , 1, 0 }, - { "stand" , "st" , POS_RESTING , do_stand , 0, 0 }, - { "stat" , "stat" , POS_DEAD , do_stat , LVL_IMMORT, 0 }, - { "steal" , "ste" , POS_STANDING, do_steal , 1, 0 }, - { "switch" , "switch" , POS_DEAD , do_switch , LVL_GOD, 0 }, + { "say" , "s" , POS_RESTING , do_say , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "sacrifice", "sac" , POS_RESTING , do_sac , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "score" , "sc" , POS_DEAD , do_score , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "scan" , "sca" , POS_RESTING , do_scan , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "scopy" , "scopy" , POS_DEAD , do_oasis_copy, 0, ADMLVL_GOD, ADM_ADVBUILD, CON_SEDIT }, + { "sit" , "si" , POS_RESTING , do_sit , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "'" , "'" , POS_RESTING , do_say , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "save" , "sav" , POS_SLEEPING, do_save , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "saveall" , "saveall" , POS_DEAD , do_saveall , 0, ADMLVL_BUILDER, ADM_BUILD, 0}, + { "sell" , "sell" , POS_STANDING, do_not_here , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "sedit" , "sedit" , POS_DEAD , do_oasis_sedit,0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "send" , "send" , POS_SLEEPING, do_send , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "set" , "set" , POS_DEAD , do_set , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "shout" , "sho" , POS_RESTING , do_gen_comm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_SHOUT }, + { "show" , "show" , POS_DEAD , do_show , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "shutdow" , "shutdow" , POS_DEAD , do_shutdown , 0, ADMLVL_IMPL, ADM_NONE, 0 }, + { "shutdown" , "shutdown", POS_DEAD , do_shutdown , 0, ADMLVL_IMPL, ADM_NONE, SCMD_SHUTDOWN }, + { "sip" , "sip" , POS_RESTING , do_drink , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_SIP }, + { "skillset" , "skillset", POS_SLEEPING, do_skillset , 0, ADMLVL_GRGOD, ADM_NONE, 0 }, + { "sleep" , "sl" , POS_SLEEPING, do_sleep , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "slist" , "slist" , POS_SLEEPING, do_oasis_list, 0, ADMLVL_BUILDER, ADM_BUILD, SCMD_OASIS_SLIST }, + { "sneak" , "sneak" , POS_STANDING, do_sneak , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "snoop" , "snoop" , POS_DEAD , do_snoop , 0, ADMLVL_GOD, ADM_NONE, 0 }, + { "socials" , "socials" , POS_DEAD , do_commands , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_SOCIALS }, + { "split" , "split" , POS_SITTING , do_split , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "stand" , "st" , POS_RESTING , do_stand , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "stat" , "stat" , POS_DEAD , do_stat , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "steal" , "ste" , POS_STANDING, do_steal , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "switch" , "switch" , POS_DEAD , do_switch , 0, ADMLVL_GOD, ADM_NONE, 0 }, - { "tell" , "t" , POS_DEAD , do_tell , 0, 0 }, - { "take" , "ta" , POS_RESTING , do_get , 0, 0 }, - { "taste" , "tas" , POS_RESTING , do_eat , 0, SCMD_TASTE }, - { "teleport" , "tele" , POS_DEAD , do_teleport , LVL_BUILDER, 0 }, - { "tedit" , "tedit" , POS_DEAD , do_tedit , LVL_GOD, 0 }, /* XXX: Oasisify */ - { "thaw" , "thaw" , POS_DEAD , do_wizutil , LVL_GRGOD, SCMD_THAW }, - { "title" , "title" , POS_DEAD , do_title , 0, 0 }, - { "time" , "time" , POS_DEAD , do_time , 0, 0 }, - { "toggle" , "toggle" , POS_DEAD , do_toggle , 0, 0 }, - { "track" , "track" , POS_STANDING, do_track , 0, 0 }, - { "transfer" , "transfer", POS_SLEEPING, do_trans , LVL_GOD, 0 }, - { "trigedit" , "trigedit", POS_DEAD , do_oasis_trigedit, LVL_BUILDER, 0 }, - { "typo" , "typo" , POS_DEAD , do_ibt , 0, SCMD_TYPO }, - { "tlist" , "tlist" , POS_DEAD , do_oasis_list, LVL_BUILDER, SCMD_OASIS_TLIST }, - { "tcopy" , "tcopy" , POS_DEAD , do_oasis_copy, LVL_GOD, CON_TRIGEDIT }, - { "tstat" , "tstat" , POS_DEAD , do_tstat , LVL_BUILDER, 0 }, + { "tell" , "t" , POS_DEAD , do_tell , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "take" , "ta" , POS_RESTING , do_get , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "taste" , "tas" , POS_RESTING , do_eat , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_TASTE }, + { "teleport" , "tele" , POS_DEAD , do_teleport , 0, ADMLVL_BUILDER, ADM_POOF, 0 }, + { "tedit" , "tedit" , POS_DEAD , do_tedit , 0, ADMLVL_GOD, ADM_ADVBUILD, 0 }, /* XXX: Oasisify */ + { "thaw" , "thaw" , POS_DEAD , do_wizutil , 0, ADMLVL_GRGOD, ADM_NONE, SCMD_THAW }, + { "title" , "title" , POS_DEAD , do_title , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "time" , "time" , POS_DEAD , do_time , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "toggle" , "toggle" , POS_DEAD , do_toggle , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "track" , "track" , POS_STANDING, do_track , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "transfer" , "transfer", POS_SLEEPING, do_trans , 0, ADMLVL_GOD, ADM_POOF, 0 }, + { "trigedit" , "trigedit", POS_DEAD , do_oasis_trigedit,0,ADMLVL_BUILDER,ADM_BUILD,0 }, + { "typo" , "typo" , POS_DEAD , do_ibt , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_TYPO }, + { "tlist" , "tlist" , POS_DEAD , do_oasis_list, 0, ADMLVL_BUILDER, ADM_BUILD, SCMD_OASIS_TLIST }, + { "tcopy" , "tcopy" , POS_DEAD , do_oasis_copy, 0, ADMLVL_GOD, ADM_ADVBUILD, CON_TRIGEDIT }, + { "tstat" , "tstat" , POS_DEAD , do_tstat , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, - { "unlock" , "unlock" , POS_SITTING , do_gen_door , 0, SCMD_UNLOCK }, - { "ungroup" , "ungroup" , POS_DEAD , do_ungroup , 0, 0 }, - { "unban" , "unban" , POS_DEAD , do_unban , LVL_GRGOD, 0 }, - { "unaffect" , "unaffect", POS_DEAD , do_wizutil , LVL_GOD, SCMD_UNAFFECT }, - { "uptime" , "uptime" , POS_DEAD , do_date , LVL_GOD, SCMD_UPTIME }, - { "use" , "use" , POS_SITTING , do_use , 1, SCMD_USE }, - { "users" , "users" , POS_DEAD , do_users , LVL_GOD, 0 }, + { "unlock" , "unlock" , POS_SITTING , do_gen_door , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_UNLOCK }, + { "ungroup" , "ungroup" , POS_DEAD , do_ungroup , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "unban" , "unban" , POS_DEAD , do_unban , 0, ADMLVL_GRGOD, ADM_NONE, 0 }, + { "unaffect" , "unaffect", POS_DEAD , do_wizutil , 0, ADMLVL_GOD, ADM_NONE, SCMD_UNAFFECT }, + { "uptime" , "uptime" , POS_DEAD , do_date , 0, ADMLVL_GOD, ADM_NONE, SCMD_UPTIME }, + { "use" , "use" , POS_SITTING , do_use , 1, ADMLVL_MORTAL, ADM_NONE, SCMD_USE }, + { "users" , "users" , POS_DEAD , do_users , 0, ADMLVL_GOD, ADM_NONE, 0 }, - { "value" , "val" , POS_STANDING, do_not_here , 0, 0 }, - { "version" , "ver" , POS_DEAD , do_gen_ps , 0, SCMD_VERSION }, - { "visible" , "vis" , POS_RESTING , do_visible , 1, 0 }, - { "vnum" , "vnum" , POS_DEAD , do_vnum , LVL_IMMORT, 0 }, - { "vstat" , "vstat" , POS_DEAD , do_vstat , LVL_IMMORT, 0 }, - { "vdelete" , "vdelete" , POS_DEAD , do_vdelete , LVL_BUILDER, 0 }, + { "value" , "val" , POS_STANDING, do_not_here , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "version" , "ver" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_VERSION }, + { "visible" , "vis" , POS_RESTING , do_visible , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "vnum" , "vnum" , POS_DEAD , do_vnum , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "vstat" , "vstat" , POS_DEAD , do_vstat , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "vdelete" , "vdelete" , POS_DEAD , do_vdelete , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, - { "wake" , "wake" , POS_SLEEPING, do_wake , 0, 0 }, - { "wear" , "wea" , POS_RESTING , do_wear , 0, 0 }, - { "weather" , "weather" , POS_RESTING , do_weather , 0, 0 }, - { "who" , "wh" , POS_DEAD , do_who , 0, 0 }, - { "whois" , "whoi" , POS_DEAD , do_whois , 0, 0 }, - { "whoami" , "whoami" , POS_DEAD , do_gen_ps , 0, SCMD_WHOAMI }, - { "where" , "where" , POS_RESTING , do_where , 1, 0 }, - { "whisper" , "whisper" , POS_RESTING , do_spec_comm, 0, SCMD_WHISPER }, - { "wield" , "wie" , POS_RESTING , do_wield , 0, 0 }, - { "withdraw" , "withdraw", POS_STANDING, do_not_here , 1, 0 }, - { "wiznet" , "wiz" , POS_DEAD , do_wiznet , LVL_IMMORT, 0 }, - { ";" , ";" , POS_DEAD , do_wiznet , LVL_IMMORT, 0 }, - { "wizhelp" , "wizhelp" , POS_SLEEPING, do_commands , LVL_IMMORT, SCMD_WIZHELP }, - { "wizlist" , "wizlist" , POS_DEAD , do_gen_ps , 0, SCMD_WIZLIST }, - { "wizupdate", "wizupde" , POS_DEAD , do_wizupdate, LVL_GRGOD, 0 }, - { "wizlock" , "wizlock" , POS_DEAD , do_wizlock , LVL_IMPL, 0 }, - { "write" , "write" , POS_STANDING, do_write , 1, 0 }, + { "wake" , "wake" , POS_SLEEPING, do_wake , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "wear" , "wea" , POS_RESTING , do_wear , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "weather" , "weather" , POS_RESTING , do_weather , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "who" , "wh" , POS_DEAD , do_who , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "whois" , "whoi" , POS_DEAD , do_whois , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "whoami" , "whoami" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_WHOAMI }, + { "where" , "where" , POS_RESTING , do_where , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "whisper" , "whisper" , POS_RESTING , do_spec_comm , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_WHISPER }, + { "wield" , "wie" , POS_RESTING , do_wield , 0, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "withdraw" , "withdraw", POS_STANDING, do_not_here , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, + { "wiznet" , "wiz" , POS_DEAD , do_wiznet , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { ";" , ";" , POS_DEAD , do_wiznet , 0, ADMLVL_IMMORT, ADM_NONE, 0 }, + { "wizhelp" , "wizhelp" , POS_SLEEPING, do_commands , 0, ADMLVL_IMMORT, ADM_NONE, SCMD_WIZHELP }, + { "wizlist" , "wizlist" , POS_DEAD , do_gen_ps , 0, ADMLVL_MORTAL, ADM_NONE, SCMD_WIZLIST }, + { "wizupdate", "wizupde" , POS_DEAD , do_wizupdate , 0, ADMLVL_GRGOD, ADM_NONE, 0 }, + { "wizlock" , "wizlock" , POS_DEAD , do_wizlock , 0, ADMLVL_IMPL, ADM_NONE, 0 }, + { "write" , "write" , POS_STANDING, do_write , 1, ADMLVL_MORTAL, ADM_NONE, 0 }, - { "zreset" , "zreset" , POS_DEAD , do_zreset , LVL_BUILDER, 0 }, - { "zedit" , "zedit" , POS_DEAD , do_oasis_zedit, LVL_BUILDER, 0 }, - { "zlist" , "zlist" , POS_DEAD , do_oasis_list, LVL_BUILDER, SCMD_OASIS_ZLIST }, - { "zlock" , "zlock" , POS_DEAD , do_zlock , LVL_GOD, 0 }, - { "zunlock" , "zunlock" , POS_DEAD , do_zunlock , LVL_GOD, 0 }, - { "zcheck" , "zcheck" , POS_DEAD , do_zcheck , LVL_BUILDER, 0 }, - { "zpurge" , "zpurge" , POS_DEAD , do_zpurge , LVL_BUILDER, 0 }, + { "zreset" , "zreset" , POS_DEAD , do_zreset , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "zedit" , "zedit" , POS_DEAD , do_oasis_zedit,0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "zlist" , "zlist" , POS_DEAD , do_oasis_list, 0, ADMLVL_BUILDER, ADM_BUILD, SCMD_OASIS_ZLIST }, + { "zlock" , "zlock" , POS_DEAD , do_zlock , 0, ADMLVL_GOD, ADM_ADVBUILD, 0 }, + { "zunlock" , "zunlock" , POS_DEAD , do_zunlock , 0, ADMLVL_GOD, ADM_ADVBUILD, 0 }, + { "zcheck" , "zcheck" , POS_DEAD , do_zcheck , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, + { "zpurge" , "zpurge" , POS_DEAD , do_zpurge , 0, ADMLVL_BUILDER, ADM_BUILD, 0 }, - { "\n", "zzzzzzz", 0, 0, 0, 0 } }; /* this must be last */ + { "\n", "zzzzzzz", 0, 0, 0, 0, 0, 0 } }; /* this must be last */ /* Thanks to Melzaren for this change to allow DG Scripts to be attachable @@ -494,25 +510,39 @@ void command_interpreter(struct char_data *ch, char *argument) } /* Allow IMPLs to switch into mobs to test the commands. */ - if (IS_NPC(ch) && ch->desc && GET_LEVEL(ch->desc->original) >= LVL_IMPL) { + if (IS_NPC(ch) && ch->desc && IS_ADMIN(ch->desc->original, ADMLVL_IMPL)) { if (script_command_interpreter(ch, argument)) return; } for (length = strlen(arg), cmd = 0; *complete_cmd_info[cmd].command != '\n'; cmd++) if(complete_cmd_info[cmd].command_pointer != do_action && - !strncmp(complete_cmd_info[cmd].command, arg, length)) - if (GET_LEVEL(ch) >= complete_cmd_info[cmd].minimum_level) + !strncmp(complete_cmd_info[cmd].command, arg, length)) { + if (complete_cmd_info[cmd].admin_flag == ADM_NONE && + complete_cmd_info[cmd].minimum_admlevel == ADMLVL_MORTAL && + GET_LEVEL(ch) >= complete_cmd_info[cmd].minimum_level) break; + if (complete_cmd_info[cmd].admin_flag == ADM_NONE && GET_ADMLEVEL(ch) >= complete_cmd_info[cmd].minimum_admlevel) + break; + if (complete_cmd_info[cmd].admin_flag != ADM_NONE && ADM_FLAGGED(ch, complete_cmd_info[cmd].admin_flag)) + break; + } /* it's not a 'real' command, so it's a social */ if(*complete_cmd_info[cmd].command == '\n') for (length = strlen(arg), cmd = 0; *complete_cmd_info[cmd].command != '\n'; cmd++) if (complete_cmd_info[cmd].command_pointer == do_action && - !strncmp(complete_cmd_info[cmd].command, arg, length)) - if (GET_LEVEL(ch) >= complete_cmd_info[cmd].minimum_level) + !strncmp(complete_cmd_info[cmd].command, arg, length)) { + if (complete_cmd_info[cmd].admin_flag == ADM_NONE && + complete_cmd_info[cmd].minimum_admlevel == ADMLVL_MORTAL && + GET_LEVEL(ch) >= complete_cmd_info[cmd].minimum_level) break; + if (complete_cmd_info[cmd].admin_flag == ADM_NONE && GET_ADMLEVEL(ch) >= complete_cmd_info[cmd].minimum_admlevel) + break; + if (complete_cmd_info[cmd].admin_flag != ADM_NONE && ADM_FLAGGED(ch, complete_cmd_info[cmd].admin_flag)) + break; + } if (*complete_cmd_info[cmd].command == '\n') { int found = 0; @@ -536,11 +566,11 @@ void command_interpreter(struct char_data *ch, char *argument) } } } - else if (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_FROZEN) && GET_LEVEL(ch) < LVL_IMPL) + else if (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_FROZEN) && !IS_ADMIN(ch, ADMLVL_IMPL)) send_to_char(ch, "You try, but the mind-numbing cold prevents you...\r\n"); else if (complete_cmd_info[cmd].command_pointer == NULL) send_to_char(ch, "Sorry, that command hasn't been implemented yet.\r\n"); - else if (IS_NPC(ch) && complete_cmd_info[cmd].minimum_level >= LVL_IMMORT) + else if (IS_NPC(ch) && complete_cmd_info[cmd].minimum_admlevel >= ADMLVL_IMMORT) send_to_char(ch, "You can't use immortal commands while switched.\r\n"); else if (GET_POS(ch) < complete_cmd_info[cmd].minimum_position) switch (GET_POS(ch)) { @@ -1134,7 +1164,7 @@ static int perform_dupe_check(struct descriptor_data *d) case RECON: write_to_output(d, "Reconnecting.\r\n"); act("$n has reconnected.", TRUE, d->character, 0, 0, TO_ROOM); - mudlog(NRM, MAX(0, GET_INVIS_LEV(d->character)), TRUE, "%s [%s] has reconnected.", GET_NAME(d->character), d->host); + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s [%s] has reconnected.", GET_NAME(d->character), d->host); if (has_mail(GET_IDNUM(d->character))) write_to_output(d, "You have mail waiting.\r\n"); break; @@ -1143,12 +1173,12 @@ static int perform_dupe_check(struct descriptor_data *d) act("$n suddenly keels over in pain, surrounded by a white aura...\r\n" "$n's body has been taken over by a new spirit!", TRUE, d->character, 0, 0, TO_ROOM); - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s has re-logged in ... disconnecting old socket.", GET_NAME(d->character)); break; case UNSWITCH: write_to_output(d, "Reconnecting to unswitched char."); - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s [%s] has reconnected.", GET_NAME(d->character), d->host); + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s [%s] has reconnected.", GET_NAME(d->character), d->host); break; } @@ -1164,7 +1194,7 @@ int enter_player_game (struct descriptor_data *d) reset_char(d->character); if (PLR_FLAGGED(d->character, PLR_INVSTART)) - GET_INVIS_LEV(d->character) = GET_LEVEL(d->character); + GET_INVIS_LEV(d->character) = GET_ADMLEVEL(d->character); /* We have to place the character in a room before equipping them * or equip_char() will gripe about the person in NOWHERE. */ @@ -1173,7 +1203,7 @@ int enter_player_game (struct descriptor_data *d) /* If char was saved with NOWHERE, or real_room above failed... */ if (load_room == NOWHERE) { - if (GET_LEVEL(d->character) >= LVL_IMMORT) + if (IS_ADMIN(d->character, ADMLVL_IMMORT)) load_room = r_immort_start_room; else load_room = r_mortal_start_room; @@ -1324,14 +1354,14 @@ void nanny(struct descriptor_data *d, char *arg) case CON_NAME_CNFRM: /* wait for conf. of new name */ if (UPPER(*arg) == 'Y') { if (isbanned(d->host) >= BAN_NEW) { - mudlog(NRM, LVL_GOD, TRUE, "Request for new char %s denied from [%s] (siteban)", GET_PC_NAME(d->character), d->host); + mudlog(NRM, ADMLVL_GOD, TRUE, "Request for new char %s denied from [%s] (siteban)", GET_PC_NAME(d->character), d->host); write_to_output(d, "Sorry, new characters are not allowed from your site!\r\n"); STATE(d) = CON_CLOSE; return; } if (circle_restrict) { write_to_output(d, "Sorry, new players can't be created at the moment.\r\n"); - mudlog(NRM, LVL_GOD, TRUE, "Request for new char %s denied from [%s] (wizlock)", GET_PC_NAME(d->character), d->host); + mudlog(NRM, ADMLVL_GOD, TRUE, "Request for new char %s denied from [%s] (wizlock)", GET_PC_NAME(d->character), d->host); STATE(d) = CON_CLOSE; return; } @@ -1365,17 +1395,17 @@ void nanny(struct descriptor_data *d, char *arg) STATE(d) = CON_CLOSE; else { if (strncmp(CRYPT(arg, GET_PASSWD(d->character)), GET_PASSWD(d->character), MAX_PWD_LENGTH)) { - mudlog(BRF, LVL_GOD, TRUE, "Bad PW: %s [%s]", GET_NAME(d->character), d->host); - GET_BAD_PWS(d->character)++; - save_char(d->character); - if (++(d->bad_pws) >= CONFIG_MAX_BAD_PWS) { /* 3 strikes and you're out. */ - write_to_output(d, "Wrong password... disconnecting.\r\n"); - STATE(d) = CON_CLOSE; - } else { - write_to_output(d, "Wrong password.\r\nPassword: "); - echo_off(d); - } - return; + mudlog(BRF, ADMLVL_GOD, TRUE, "Bad PW: %s [%s]", GET_NAME(d->character), d->host); + GET_BAD_PWS(d->character)++; + save_char(d->character); + if (++(d->bad_pws) >= CONFIG_MAX_BAD_PWS) { /* 3 strikes and you're out. */ + write_to_output(d, "Wrong password... disconnecting.\r\n"); + STATE(d) = CON_CLOSE; + } else { + write_to_output(d, "Wrong password.\r\nPassword: "); + echo_off(d); + } + return; } /* Password was correct. */ @@ -1385,35 +1415,35 @@ void nanny(struct descriptor_data *d, char *arg) if (isbanned(d->host) == BAN_SELECT && !PLR_FLAGGED(d->character, PLR_SITEOK)) { - write_to_output(d, "Sorry, this char has not been cleared for login from your site!\r\n"); - STATE(d) = CON_CLOSE; - mudlog(NRM, LVL_GOD, TRUE, "Connection attempt for %s denied from %s", GET_NAME(d->character), d->host); - return; + write_to_output(d, "Sorry, this char has not been cleared for login from your site!\r\n"); + STATE(d) = CON_CLOSE; + mudlog(NRM, ADMLVL_GOD, TRUE, "Connection attempt for %s denied from %s", GET_NAME(d->character), d->host); + return; } if (GET_LEVEL(d->character) < circle_restrict) { - write_to_output(d, "The game is temporarily restricted.. try again later.\r\n"); - STATE(d) = CON_CLOSE; - mudlog(NRM, LVL_GOD, TRUE, "Request for login denied for %s [%s] (wizlock)", GET_NAME(d->character), d->host); - return; + write_to_output(d, "The game is temporarily restricted.. try again later.\r\n"); + STATE(d) = CON_CLOSE; + mudlog(NRM, ADMLVL_GOD, TRUE, "Request for login denied for %s [%s] (wizlock)", GET_NAME(d->character), d->host); + return; } /* check and make sure no other copies of this player are logged in */ if (perform_dupe_check(d)) - return; + return; - if (GET_LEVEL(d->character) >= LVL_IMMORT) - write_to_output(d, "%s", imotd); + if (IS_ADMIN(d->character, ADMLVL_IMMORT)) + write_to_output(d, "%s", imotd); else - write_to_output(d, "%s", motd); + write_to_output(d, "%s", motd); if (GET_INVIS_LEV(d->character)) - mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s has connected. (invis %d)", GET_NAME(d->character), GET_INVIS_LEV(d->character)); + mudlog(BRF, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "%s has connected. (invis %d)", GET_NAME(d->character), GET_INVIS_LEV(d->character)); else - mudlog(BRF, LVL_IMMORT, TRUE, "%s has connected.", GET_NAME(d->character)); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "%s has connected.", GET_NAME(d->character)); /* Add to the list of 'recent' players (since last reboot) */ if (AddRecentPlayer(GET_NAME(d->character), d->host, FALSE, FALSE) == FALSE) { - mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "Failure to AddRecentPlayer (returned FALSE)."); + mudlog(BRF, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "Failure to AddRecentPlayer (returned FALSE)."); } if (load_result) { @@ -1421,7 +1451,7 @@ void nanny(struct descriptor_data *d, char *arg) "%s%d LOGIN FAILURE%s SINCE LAST SUCCESSFUL LOGIN.%s\r\n", CCRED(d->character, C_SPR), load_result, (load_result > 1) ? "S" : "", CCNRM(d->character, C_SPR)); - GET_BAD_PWS(d->character) = 0; + GET_BAD_PWS(d->character) = 0; } write_to_output(d, "\r\n*** PRESS RETURN: "); STATE(d) = CON_RMOTD; @@ -1512,12 +1542,12 @@ void nanny(struct descriptor_data *d, char *arg) GET_PREF(d->character)= rand_number(1, 128000); GET_HOST(d->character)= strdup(d->host); - mudlog(NRM, LVL_GOD, TRUE, "%s [%s] new player.", GET_NAME(d->character), d->host); + mudlog(NRM, ADMLVL_GOD, TRUE, "%s [%s] new player.", GET_NAME(d->character), d->host); /* Add to the list of 'recent' players (since last reboot) */ if (AddRecentPlayer(GET_NAME(d->character), d->host, TRUE, FALSE) == FALSE) { - mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "Failure to AddRecentPlayer (returned FALSE)."); + mudlog(BRF, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE, "Failure to AddRecentPlayer (returned FALSE)."); } break; @@ -1557,14 +1587,14 @@ void nanny(struct descriptor_data *d, char *arg) STATE(d) = CON_PLAYING; if (GET_LEVEL(d->character) == 0) { - do_start(d->character); - send_to_char(d->character, "%s", CONFIG_START_MESSG); + do_start(d->character); + send_to_char(d->character, "%s", CONFIG_START_MESSG); } look_at_room(d->character, 0); if (has_mail(GET_IDNUM(d->character))) - send_to_char(d->character, "You have mail waiting.\r\n"); + send_to_char(d->character, "You have mail waiting.\r\n"); if (load_result == 2) { /* rented items lost */ - send_to_char(d->character, "\r\n\007You could not afford your rent!\r\n" + send_to_char(d->character, "\r\n\007You could not afford your rent!\r\n" "Your possesions have been donated to the Salvation Army!\r\n"); } d->has_prompt = 0; @@ -1574,10 +1604,10 @@ void nanny(struct descriptor_data *d, char *arg) case '2': if (d->character->player.description) { - write_to_output(d, "Current description:\r\n%s", d->character->player.description); - /* Don't free this now... so that the old description gets loaded as the - * current buffer in the editor. Do setup the ABORT buffer here, however. */ - d->backstr = strdup(d->character->player.description); + write_to_output(d, "Current description:\r\n%s", d->character->player.description); + /* Don't free this now... so that the old description gets loaded as the + * current buffer in the editor. Do setup the ABORT buffer here, however. */ + d->backstr = strdup(d->character->player.description); } write_to_output(d, "Enter the new text you'd like others to see when they look at you.\r\n"); send_editor_help(d); @@ -1637,13 +1667,13 @@ void nanny(struct descriptor_data *d, char *arg) case CON_DELCNF2: if (!strcmp(arg, "yes") || !strcmp(arg, "YES")) { if (PLR_FLAGGED(d->character, PLR_FROZEN)) { - write_to_output(d, "You try to kill yourself, but the ice stops you.\r\n" + write_to_output(d, "You try to kill yourself, but the ice stops you.\r\n" "Character not deleted.\r\n\r\n"); - STATE(d) = CON_CLOSE; - return; + STATE(d) = CON_CLOSE; + return; } - if (GET_LEVEL(d->character) < LVL_GRGOD) - SET_BIT_AR(PLR_FLAGS(d->character), PLR_DELETED); + if (!IS_ADMIN(d->character, ADMLVL_GRGOD)) + SET_BIT_AR(PLR_FLAGS(d->character), PLR_DELETED); save_char(d->character); Crash_delete_file(GET_NAME(d->character)); /* If the selfdelete_fastwipe flag is set (in config.c), remove all the @@ -1656,7 +1686,7 @@ void nanny(struct descriptor_data *d, char *arg) delete_variables(GET_NAME(d->character)); write_to_output(d, "Character '%s' deleted! Goodbye.\r\n", GET_NAME(d->character)); - mudlog(NRM, LVL_GOD, TRUE, "%s (lev %d) has self-deleted.", GET_NAME(d->character), GET_LEVEL(d->character)); + mudlog(NRM, ADMLVL_GOD, TRUE, "%s (lev %d) has self-deleted.", GET_NAME(d->character), GET_LEVEL(d->character)); STATE(d) = CON_CLOSE; return; } else { @@ -1677,3 +1707,68 @@ void nanny(struct descriptor_data *d, char *arg) break; } } + +/* Command Info (here for convenience with command list) */ +ACMD(do_cmdinfo) +{ + char arg[MAX_INPUT_LENGTH]; + int i, c, length; + bool first=TRUE; + + one_argument(argument, arg); + + for (length = strlen(arg), c = 0; *complete_cmd_info[c].command != '\n'; c++) { + if(!strncmp(complete_cmd_info[c].command, arg, length)) + break; + } + + if ( *complete_cmd_info[c].command == '\n' ) { + send_to_char(ch, "Unrecognised command: %s\r\n", arg); + return; + } + + /* Found a match */ + send_to_char(ch, "Full Command : %s%s%s\r\n", QCYN, complete_cmd_info[c].command, QNRM); + + if (complete_cmd_info[c].command_pointer == do_action) { + if (complete_cmd_info[c].minimum_admlevel >= ADMLVL_MORTAL) { + send_to_char(ch, "Command Type : %sAdmin-only Social%s\r\n", QRED, QNRM); + } else { + send_to_char(ch, "Command Type : %sSocial%s\r\n", QYEL, QNRM); + } + } else if (complete_cmd_info[c].admin_flag != ADM_NONE) { + if (complete_cmd_info[c].minimum_admlevel >= ADMLVL_MORTAL) { + send_to_char(ch, "Command Type : %sAdmin Permission Required (not for mortals)%s\r\n", QYEL, QNRM); + } else { + send_to_char(ch, "Command Type : %sAdmin Permission Required%s\r\n", QYEL, QNRM); + } + } else if (complete_cmd_info[c].minimum_admlevel != ADMLVL_MORTAL) { + send_to_char(ch, "Command Type : %sAdmin/Imm-Only%s\r\n", QYEL, QNRM); + } else { + send_to_char(ch, "Command Type : %sPlayer Command%s\r\n", QYEL, QNRM); + } + + if (complete_cmd_info[c].admin_flag != ADM_NONE) { + send_to_char(ch, "Permission Required: %s%s%s\r\n", QCYN, admin_flag_names[(complete_cmd_info[c].admin_flag)], QNRM); + } + + send_to_char(ch, "Admin Level : %s%d%s (%s%s%s)\r\n", + ((complete_cmd_info[c].admin_flag == ADM_NONE) ? QYEL : QBLK), + complete_cmd_info[c].minimum_admlevel, QNRM, + ((complete_cmd_info[c].admin_flag == ADM_NONE) ? QCYN : QBLK), + admin_level_names[(complete_cmd_info[c].minimum_admlevel)], QNRM); + + if (complete_cmd_info[c].minimum_level == 0) { + send_to_char(ch, "Min Level : %s%s\r\n", QYEL, QNRM); + } else { + send_to_char(ch, "Min Level : %s%d%s\r\n", QYEL, complete_cmd_info[c].minimum_level, QNRM); + } + + send_to_char(ch, "Allowed Positions : %s", QCYN ); + for (i=complete_cmd_info[c].minimum_position; i unsigned conversion to avoid '-1' check. */ if (res < sizeof(buf)) { - mudlog(CMP, LVL_IMMORT, FALSE, "Initiating autowiz."); + mudlog(CMP, ADMLVL_IMMORT, FALSE, "Initiating autowiz."); i = system(buf); reboot_wizlists(); } else @@ -222,7 +222,7 @@ void gain_exp(struct char_data *ch, int gain) int is_altered = FALSE; int num_levels = 0; - if (!IS_NPC(ch) && ((GET_LEVEL(ch) < 1 || GET_LEVEL(ch) >= LVL_IMMORT))) + if (!IS_NPC(ch) && ((GET_LEVEL(ch) < 1 || GET_LEVEL(ch) >= CONFIG_MAX_LEVEL))) return; if (IS_NPC(ch)) { @@ -235,7 +235,7 @@ void gain_exp(struct char_data *ch, int gain) gain = MIN(CONFIG_MAX_EXP_GAIN, gain); /* put a cap on the max gain per kill */ GET_EXP(ch) += gain; - while (GET_LEVEL(ch) < LVL_IMMORT - CONFIG_NO_MORT_TO_IMMORT && + while (GET_LEVEL(ch) < CONFIG_MAX_LEVEL && GET_EXP(ch) >= level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1)) { GET_LEVEL(ch) += 1; num_levels++; @@ -244,15 +244,20 @@ void gain_exp(struct char_data *ch, int gain) } if (is_altered) { - mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s advanced %d level%s to level %d.", + mudlog(BRF, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s advanced %d level%s to level %d.", GET_NAME(ch), num_levels, num_levels == 1 ? "" : "s", GET_LEVEL(ch)); if (num_levels == 1) send_to_char(ch, "You rise a level!\r\n"); else - send_to_char(ch, "You rise %d levels!\r\n", num_levels); + send_to_char(ch, "You rise %d levels!\r\n", num_levels); set_title(ch, NULL); - if (GET_LEVEL(ch) >= LVL_IMMORT && !PLR_FLAGGED(ch, PLR_NOWIZLIST)) - run_autowiz(); + if (GET_LEVEL(ch) >= CONFIG_MAX_LEVEL) { + if (!IS_ADMIN(ch, ADMLVL_IMMORT) && !CONFIG_NO_MORT_TO_IMMORT) { + set_admin_level(ch, ADMLVL_IMMORT); + send_to_char(ch, "You have reached the maximum level and become immortal!\r\n"); + mudlog(NRM, ADMLVL_GOD, TRUE, "%s advanced to Immortal!", GET_NAME(ch)); + } + } } } else if (gain < 0) { gain = MAX(-CONFIG_MAX_EXP_LOSS, gain); /* Cap max exp lost per death */ @@ -260,9 +265,7 @@ void gain_exp(struct char_data *ch, int gain) if (GET_EXP(ch) < 0) GET_EXP(ch) = 0; } - if (GET_LEVEL(ch) >= LVL_IMMORT && !PLR_FLAGGED(ch, PLR_NOWIZLIST)) - run_autowiz(); - } +} void gain_exp_regardless(struct char_data *ch, int gain) { @@ -277,7 +280,7 @@ void gain_exp_regardless(struct char_data *ch, int gain) GET_EXP(ch) = 0; if (!IS_NPC(ch)) { - while (GET_LEVEL(ch) < LVL_IMPL && + while (!IS_ADMIN(ch, ADMLVL_IMPL) && GET_EXP(ch) >= level_exp(GET_CLASS(ch), GET_LEVEL(ch) + 1)) { GET_LEVEL(ch) += 1; num_levels++; @@ -286,17 +289,22 @@ void gain_exp_regardless(struct char_data *ch, int gain) } if (is_altered) { - mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s advanced %d level%s to level %d.", + mudlog(BRF, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s advanced %d level%s to level %d.", GET_NAME(ch), num_levels, num_levels == 1 ? "" : "s", GET_LEVEL(ch)); if (num_levels == 1) send_to_char(ch, "You rise a level!\r\n"); else - send_to_char(ch, "You rise %d levels!\r\n", num_levels); + send_to_char(ch, "You rise %d levels!\r\n", num_levels); set_title(ch, NULL); + if (GET_LEVEL(ch) >= CONFIG_MAX_LEVEL) { + if (!IS_ADMIN(ch, ADMLVL_IMMORT) && !CONFIG_NO_MORT_TO_IMMORT) { + set_admin_level(ch, ADMLVL_IMMORT); + send_to_char(ch, "You have reached the maximum level and become immortal!\r\n"); + mudlog(NRM, ADMLVL_GOD, TRUE, "%s advanced to Immortal!", GET_NAME(ch)); + } + } } } - if (GET_LEVEL(ch) >= LVL_IMMORT && !PLR_FLAGGED(ch, PLR_NOWIZLIST)) - run_autowiz(); } void gain_condition(struct char_data *ch, int condition, int value) @@ -365,7 +373,7 @@ static void check_idling(struct char_data *ch) Crash_rentsave(ch, 0); else Crash_idlesave(ch); - mudlog(CMP, LVL_GOD, TRUE, "%s force-rented and extracted (idle).", GET_NAME(ch)); + mudlog(CMP, ADMLVL_GOD, TRUE, "%s force-rented and extracted (idle).", GET_NAME(ch)); add_llog_entry(ch, LAST_IDLEOUT); extract_char(ch); } @@ -394,19 +402,19 @@ void point_update(void) if (damage(i, i, 2, SPELL_POISON) == -1) continue; /* Oops, they died. -gg 6/24/98 */ if (GET_POS(i) <= POS_STUNNED) - update_pos(i); + update_pos(i); } else if (GET_POS(i) == POS_INCAP) { if (damage(i, i, 1, TYPE_SUFFERING) == -1) - continue; + continue; } else if (GET_POS(i) == POS_MORTALLYW) { if (damage(i, i, 2, TYPE_SUFFERING) == -1) - continue; + continue; } if (!IS_NPC(i)) { update_char_objects(i); (i->char_specials.timer)++; - if (GET_LEVEL(i) < CONFIG_IDLE_MAX_LEVEL) - check_idling(i); + if (GET_ADMLEVEL(i) < CONFIG_IDLE_MAX_LEVEL) + check_idling(i); } } @@ -418,32 +426,32 @@ void point_update(void) if (IS_CORPSE(j)) { /* timer count down */ if (GET_OBJ_TIMER(j) > 0) - GET_OBJ_TIMER(j)--; + GET_OBJ_TIMER(j)--; if (!GET_OBJ_TIMER(j)) { - if (j->carried_by) - act("$p decays in your hands.", FALSE, j->carried_by, j, 0, TO_CHAR); - else if ((IN_ROOM(j) != NOWHERE) && (world[IN_ROOM(j)].people)) { - act("A quivering horde of maggots consumes $p.", - TRUE, world[IN_ROOM(j)].people, j, 0, TO_ROOM); - act("A quivering horde of maggots consumes $p.", - TRUE, world[IN_ROOM(j)].people, j, 0, TO_CHAR); - } - for (jj = j->contains; jj; jj = next_thing2) { - next_thing2 = jj->next_content; /* Next in inventory */ - obj_from_obj(jj); + if (j->carried_by) + act("$p decays in your hands.", FALSE, j->carried_by, j, 0, TO_CHAR); + else if ((IN_ROOM(j) != NOWHERE) && (world[IN_ROOM(j)].people)) { + act("A quivering horde of maggots consumes $p.", + TRUE, world[IN_ROOM(j)].people, j, 0, TO_ROOM); + act("A quivering horde of maggots consumes $p.", + TRUE, world[IN_ROOM(j)].people, j, 0, TO_CHAR); + } + for (jj = j->contains; jj; jj = next_thing2) { + next_thing2 = jj->next_content; /* Next in inventory */ + obj_from_obj(jj); - if (j->in_obj) - obj_to_obj(jj, j->in_obj); - else if (j->carried_by) - obj_to_room(jj, IN_ROOM(j->carried_by)); - else if (IN_ROOM(j) != NOWHERE) - obj_to_room(jj, IN_ROOM(j)); - else - core_dump(); - } - extract_obj(j); + if (j->in_obj) + obj_to_obj(jj, j->in_obj); + else if (j->carried_by) + obj_to_room(jj, IN_ROOM(j->carried_by)); + else if (IN_ROOM(j) != NOWHERE) + obj_to_room(jj, IN_ROOM(j)); + else + core_dump(); + } + extract_obj(j); } } /* If the timer is set, count it down and at 0, try the trigger @@ -463,6 +471,6 @@ void point_update(void) HAPPY_EXP = 0; HAPPY_GOLD = 0; HAPPY_TIME = 0; - game_info("Happy hour has ended!"); + game_info("Happy hour has ended!"); } } diff --git a/src/magic.c b/src/magic.c index 477f46b..2a4c62b 100644 --- a/src/magic.c +++ b/src/magic.c @@ -199,6 +199,11 @@ int mag_damage(int level, struct char_data *ch, struct char_data *victim, if (victim == NULL || ch == NULL) return (0); + if (ADM_FLAGGED(victim, ADM_NODAMAGE)) { + send_to_char(ch, "Your spell is harmless to %s.\r\n", GET_NAME(victim)); + return 0; + } + switch (spellnum) { /* Mostly mages */ case SPELL_MAGIC_MISSILE: @@ -351,7 +356,7 @@ void mag_affects(int level, struct char_data *ch, struct char_data *victim, break; case SPELL_BLINDNESS: - if (MOB_FLAGGED(victim, MOB_NOBLIND) || GET_LEVEL(victim) >= LVL_IMMORT || mag_savingthrow(victim, savetype, 0)) { + if (MOB_FLAGGED(victim, MOB_NOBLIND) || IS_ADMIN(victim, ADMLVL_IMMORT) || mag_savingthrow(victim, savetype, 0)) { send_to_char(ch, "You fail.\r\n"); return; } @@ -442,7 +447,7 @@ void mag_affects(int level, struct char_data *ch, struct char_data *victim, break; case SPELL_POISON: - if (mag_savingthrow(victim, savetype, 0)) { + if (mag_savingthrow(victim, savetype, 0) || ADM_FLAGGED(victim, ADM_NOPOISON)) { send_to_char(ch, "%s", CONFIG_NOEFFECT); return; } @@ -656,7 +661,9 @@ void mag_areas(int level, struct char_data *ch, int spellnum, int savetype) * 5: other players in the same group (if the spell is 'violent') */ if (tch == ch) continue; - if (!IS_NPC(tch) && GET_LEVEL(tch) >= LVL_IMMORT) + if (IS_ADMIN(tch, ADMLVL_IMMORT)) + continue; + if (ADM_FLAGGED(tch, ADM_NODAMAGE)) continue; if (!CONFIG_PK_ALLOWED && !IS_NPC(ch) && !IS_NPC(tch)) continue; diff --git a/src/mail.c b/src/mail.c index eb843f7..a81c8f0 100644 --- a/src/mail.c +++ b/src/mail.c @@ -288,7 +288,7 @@ static void postmaster_send_mail(struct char_data *ch, struct char_data *mailman FALSE, mailman, 0, ch, TO_VICT); return; } - if (GET_GOLD(ch) < STAMP_PRICE && GET_LEVEL(ch) < LVL_IMMORT) { + if (GET_GOLD(ch) < STAMP_PRICE && !ADM_FLAGGED(ch, ADM_MONEY)) { snprintf(buf, sizeof(buf), "$n tells you, 'A stamp costs %d coin%s.'\r\n" "$n tells you, '...which I see you can't afford.'", STAMP_PRICE, STAMP_PRICE == 1 ? "" : "s"); @@ -301,13 +301,18 @@ static void postmaster_send_mail(struct char_data *ch, struct char_data *mailman return; } act("$n starts to write some mail.", TRUE, ch, 0, 0, TO_ROOM); - snprintf(buf, sizeof(buf), "$n tells you, 'I'll take %d coins for the stamp.'\r\n" + + if (ADM_FLAGGED(ch, ADM_MONEY)) + snprintf(buf, sizeof(buf), "$n tells you, 'Your mail is free.'\r\n" + "$n tells you, 'Write your message. (/s saves /h for help).'"); + else + snprintf(buf, sizeof(buf), "$n tells you, 'I'll take %d coins for the stamp.'\r\n" "$n tells you, 'Write your message. (/s saves /h for help).'", STAMP_PRICE); act(buf, FALSE, mailman, 0, ch, TO_VICT); - if (GET_LEVEL(ch) < LVL_IMMORT) + if (!ADM_FLAGGED(ch, ADM_MONEY)) GET_GOLD(ch) -= STAMP_PRICE; SET_BIT_AR(PLR_FLAGS(ch), PLR_MAILING); /* string_write() sets writing. */ @@ -339,8 +344,8 @@ static void postmaster_receive_mail(struct char_data *ch, struct char_data *mail return; } while (has_mail(GET_IDNUM(ch))) { - obj = create_obj(); - obj->item_number = 1; + obj = create_obj(); + obj->item_number = 1; obj->name = strdup("mail paper letter"); obj->short_description = strdup("a piece of mail"); obj->description = strdup("Someone has left a piece of mail here."); @@ -365,11 +370,11 @@ static void postmaster_receive_mail(struct char_data *ch, struct char_data *mail } } -void notify_if_playing(struct char_data *from, int recipient_id) -{ - struct descriptor_data *d; +void notify_if_playing(struct char_data *from, int recipient_id) +{ + struct descriptor_data *d; - for (d = descriptor_list; d; d = d->next) - if ((IS_PLAYING(d)) && (GET_IDNUM(d->character) == recipient_id) && (has_mail(GET_IDNUM(d->character)))) - send_to_char(d->character, "You have new mudmail from %s.\r\n", GET_NAME(from)); -} + for (d = descriptor_list; d; d = d->next) + if ((IS_PLAYING(d)) && (GET_IDNUM(d->character) == recipient_id) && (has_mail(GET_IDNUM(d->character)))) + send_to_char(d->character, "You have new mudmail from %s.\r\n", GET_NAME(from)); +} diff --git a/src/medit.c b/src/medit.c index 976cdca..ad7e835 100644 --- a/src/medit.c +++ b/src/medit.c @@ -103,7 +103,7 @@ ACMD(do_oasis_medit) /* Give descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_medit: Player already had olc structure."); free(d->olc); } @@ -132,7 +132,7 @@ ACMD(do_oasis_medit) if (save) { send_to_char(ch, "Saving all mobiles in zone %d.\r\n", zone_table[OLC_ZNUM(d)].number); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves mobile info for zone %d.", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number); @@ -162,7 +162,7 @@ ACMD(do_oasis_medit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE,"OLC: %s starts editing zone %d allowed zone %d", + mudlog(CMP, ADMLVL_IMMORT, TRUE,"OLC: %s starts editing zone %d allowed zone %d", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); } @@ -545,7 +545,7 @@ void medit_parse(struct descriptor_data *d, char *arg) case 'Y': /* Save the mob in memory and to disk. */ medit_save_internally(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits mob %d", GET_NAME(d->character), OLC_NUM(d)); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits mob %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { medit_save_to_disk(zone_table[real_zone_by_thing(OLC_NUM(d))].number); write_to_output(d, "Mobile saved to disk.\r\n"); @@ -875,7 +875,7 @@ void medit_parse(struct descriptor_data *d, char *arg) * We should never get here. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: medit_parse(): Reached D_DESC case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: medit_parse(): Reached D_DESC case!"); write_to_output(d, "Oops...\r\n"); break; @@ -1051,7 +1051,7 @@ void medit_parse(struct descriptor_data *d, char *arg) break; case MEDIT_LEVEL: - GET_LEVEL(OLC_MOB(d)) = LIMIT(i, 1, LVL_IMPL); + GET_LEVEL(OLC_MOB(d)) = LIMIT(i, 1, CONFIG_MAX_LEVEL); OLC_VAL(d) = TRUE; medit_disp_stats_menu(d); return; @@ -1088,7 +1088,7 @@ void medit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: medit_parse(): Reached default case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: medit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; } @@ -1116,7 +1116,7 @@ void medit_autoroll_stats(struct descriptor_data *d) int mob_lev; mob_lev = GET_LEVEL(OLC_MOB(d)); - mob_lev = GET_LEVEL(OLC_MOB(d)) = LIMIT(mob_lev, 1, LVL_IMPL); + mob_lev = GET_LEVEL(OLC_MOB(d)) = LIMIT(mob_lev, 1, CONFIG_MAX_LEVEL); GET_MOVE(OLC_MOB(d)) = mob_lev*10; /* hit point bonus (mobs don't use movement points */ GET_HIT(OLC_MOB(d)) = mob_lev/5; /* number of hitpoint dice */ diff --git a/src/modify.c b/src/modify.c index d99a1fb..4c69a78 100644 --- a/src/modify.c +++ b/src/modify.c @@ -350,7 +350,7 @@ ACMD(do_skillset) send_to_char(ch, "You can't set NPC skills.\r\n"); return; } - if ((spell_info[skill].min_level[(pc)] >= LVL_IMMORT) && (pl < LVL_IMMORT)) { + if ((spell_info[skill].min_level[(pc)] > CONFIG_MAX_LEVEL) && (!IS_ADMIN(vict, ADMLVL_IMMORT))) { send_to_char(ch, "%s cannot be learned by mortals.\r\n", spell_info[skill].name); return; } else if (spell_info[skill].min_level[(pc)] > pl) { @@ -361,7 +361,7 @@ ACMD(do_skillset) /* find_skill_num() guarantees a valid spell_info[] index, or -1, and we * checked for the -1 above so we are safe here. */ SET_SKILL(vict, skill, value); - mudlog(BRF, LVL_IMMORT, TRUE, "%s changed %s's %s to %d.", GET_NAME(ch), GET_NAME(vict), spell_info[skill].name, value); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "%s changed %s's %s to %d.", GET_NAME(ch), GET_NAME(vict), spell_info[skill].name, value); send_to_char(ch, "You change %s's %s to %d.\r\n", GET_NAME(vict), spell_info[skill].name, value); } diff --git a/src/oasis.c b/src/oasis.c index bb387a9..f6d5b9a 100644 --- a/src/oasis.c +++ b/src/oasis.c @@ -205,13 +205,13 @@ void cleanup_olc(struct descriptor_data *d, byte cleanup_type) act("$n stops using OLC.", TRUE, d->character, NULL, NULL, TO_ROOM); if (cleanup_type == CLEANUP_CONFIG) - mudlog(BRF, LVL_IMMORT, TRUE, "OLC: %s stops editing the game configuration", GET_NAME(d->character)); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing the game configuration", GET_NAME(d->character)); else if (STATE(d) == CON_TEDIT) - mudlog(BRF, LVL_IMMORT, TRUE, "OLC: %s stops editing text files.", GET_NAME(d->character)); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing text files.", GET_NAME(d->character)); else if (STATE(d) == CON_HEDIT) - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s stops editing help files.", GET_NAME(d->character)); + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing help files.", GET_NAME(d->character)); else - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s stops editing zone %d allowed zone %d", GET_NAME(d->character), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(d->character)); + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing zone %d allowed zone %d", GET_NAME(d->character), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(d->character)); STATE(d) = CON_PLAYING; } @@ -275,8 +275,8 @@ int can_edit_zone(struct char_data *ch, zone_rnum rnum) if (GET_OLC_ZONE(ch) == AEDIT_PERMISSION && rnum == AEDIT_PERMISSION) return TRUE; - /* always access if ch is high enough level */ - if (GET_LEVEL(ch) >= LVL_GRGOD) + /* always access if ch is high enough level (Imps don't need ADM_BUILD) */ + if (IS_ADMIN(ch, ADMLVL_IMPL)) return (TRUE); /* always access if a player helped build the zone in the first place */ @@ -289,9 +289,11 @@ int can_edit_zone(struct char_data *ch, zone_rnum rnum) return FALSE; } - /* no access if you're not at least LVL_BUILDER */ - if (GET_LEVEL(ch) < LVL_BUILDER) - return FALSE; + /* no access if you're not at least LVL_BUILDER, or don't have any builder privs */ + if (GET_ADMLEVEL(ch) < ADMLVL_BUILDER) { + if (!ADM_FLAGGED(ch, ADM_BUILD) && !ADM_FLAGGED(ch, ADM_ADVBUILD)) + return FALSE; + } /* always access if you're assigned to this zone */ if (real_zone(GET_OLC_ZONE(ch)) == rnum) @@ -311,6 +313,6 @@ void send_cannot_edit(struct char_data *ch, zone_vnum zone) send_to_char(ch, "You do not have permission to edit zone %d.\r\n", zone); sprintf(buf, "OLC: %s tried to edit zone %d.", GET_NAME(ch), zone); } - mudlog(BRF, LVL_IMPL, TRUE, "%s", buf); + mudlog(BRF, ADMLVL_IMPL, TRUE, "%s", buf); } diff --git a/src/oasis.h b/src/oasis.h index be8487b..666c43b 100644 --- a/src/oasis.h +++ b/src/oasis.h @@ -333,43 +333,44 @@ extern const char *nrm, *grn, *cyn, *yel; #define CEDIT_START_MESSG 16 /* Numerical responses. */ -#define CEDIT_NUMERICAL_RESPONSE 20 -#define CEDIT_LEVEL_CAN_SHOUT 21 -#define CEDIT_HOLLER_MOVE_COST 22 -#define CEDIT_TUNNEL_SIZE 23 -#define CEDIT_MAX_EXP_GAIN 24 -#define CEDIT_MAX_EXP_LOSS 25 -#define CEDIT_MAX_NPC_CORPSE_TIME 26 -#define CEDIT_MAX_PC_CORPSE_TIME 27 -#define CEDIT_IDLE_VOID 28 -#define CEDIT_IDLE_RENT_TIME 29 -#define CEDIT_IDLE_MAX_LEVEL 30 -#define CEDIT_DTS_ARE_DUMPS 31 -#define CEDIT_LOAD_INTO_INVENTORY 32 -#define CEDIT_TRACK_THROUGH_DOORS 33 -#define CEDIT_NO_MORT_TO_IMMORT 34 -#define CEDIT_MAX_OBJ_SAVE 35 -#define CEDIT_MIN_RENT_COST 36 -#define CEDIT_AUTOSAVE_TIME 37 -#define CEDIT_CRASH_FILE_TIMEOUT 38 -#define CEDIT_RENT_FILE_TIMEOUT 39 -#define CEDIT_MORTAL_START_ROOM 40 -#define CEDIT_IMMORT_START_ROOM 41 -#define CEDIT_FROZEN_START_ROOM 42 -#define CEDIT_DONATION_ROOM_1 43 -#define CEDIT_DONATION_ROOM_2 44 -#define CEDIT_DONATION_ROOM_3 45 -#define CEDIT_DFLT_PORT 46 -#define CEDIT_MAX_PLAYING 47 -#define CEDIT_MAX_FILESIZE 48 -#define CEDIT_MAX_BAD_PWS 49 -#define CEDIT_SITEOK_EVERYONE 50 -#define CEDIT_NAMESERVER_IS_SLOW 51 -#define CEDIT_USE_AUTOWIZ 52 -#define CEDIT_MIN_WIZLIST_LEV 53 -#define CEDIT_MAP_OPTION 54 -#define CEDIT_MAP_SIZE 55 -#define CEDIT_MINIMAP_SIZE 56 +#define CEDIT_NUMERICAL_RESPONSE 20 +#define CEDIT_LEVEL_CAN_SHOUT 21 +#define CEDIT_HOLLER_MOVE_COST 22 +#define CEDIT_TUNNEL_SIZE 23 +#define CEDIT_MAX_EXP_GAIN 24 +#define CEDIT_MAX_EXP_LOSS 25 +#define CEDIT_MAX_NPC_CORPSE_TIME 26 +#define CEDIT_MAX_PC_CORPSE_TIME 27 +#define CEDIT_MAX_LEVEL 28 +#define CEDIT_IDLE_VOID 29 +#define CEDIT_IDLE_RENT_TIME 30 +#define CEDIT_IDLE_MAX_LEVEL 31 +#define CEDIT_DTS_ARE_DUMPS 32 +#define CEDIT_LOAD_INTO_INVENTORY 33 +#define CEDIT_TRACK_THROUGH_DOORS 34 +#define CEDIT_NO_MORT_TO_IMMORT 35 +#define CEDIT_MAX_OBJ_SAVE 36 +#define CEDIT_MIN_RENT_COST 37 +#define CEDIT_AUTOSAVE_TIME 38 +#define CEDIT_CRASH_FILE_TIMEOUT 39 +#define CEDIT_RENT_FILE_TIMEOUT 40 +#define CEDIT_MORTAL_START_ROOM 41 +#define CEDIT_IMMORT_START_ROOM 42 +#define CEDIT_FROZEN_START_ROOM 43 +#define CEDIT_DONATION_ROOM_1 44 +#define CEDIT_DONATION_ROOM_2 45 +#define CEDIT_DONATION_ROOM_3 46 +#define CEDIT_DFLT_PORT 47 +#define CEDIT_MAX_PLAYING 48 +#define CEDIT_MAX_FILESIZE 49 +#define CEDIT_MAX_BAD_PWS 50 +#define CEDIT_SITEOK_EVERYONE 51 +#define CEDIT_NAMESERVER_IS_SLOW 52 +#define CEDIT_USE_AUTOWIZ 53 +#define CEDIT_MIN_WIZLIST_LEV 54 +#define CEDIT_MAP_OPTION 55 +#define CEDIT_MAP_SIZE 56 +#define CEDIT_MINIMAP_SIZE 57 /* Hedit Submodes of connectedness. */ #define HEDIT_CONFIRM_SAVESTRING 0 diff --git a/src/oasis_copy.c b/src/oasis_copy.c index 751c68e..44200c9 100644 --- a/src/oasis_copy.c +++ b/src/oasis_copy.c @@ -67,7 +67,7 @@ ACMD(do_oasis_copy) return; /* No copying as a mob or while being forced. */ - if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING) + if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING) return; /* We need two arguments. */ @@ -112,7 +112,7 @@ ACMD(do_oasis_copy) /* Give the descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_oasis_copy: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_copy: Player already had olc structure."); free(d->olc); } @@ -187,7 +187,7 @@ ACMD(do_dig) send_to_char(ch, "You do not have permission to edit this zone.\r\n"); return; } - /* Lets not allow digging to limbo. After all, it'd just get us more errors + /* Lets not allow digging to limbo. After all, it'd just get us more errors * on 'show errors.' */ if (rvnum == 0) { send_to_char(ch, "The target exists, but you can't dig to limbo!\r\n"); @@ -230,10 +230,10 @@ ACMD(do_dig) /* Now we know the builder is allowed to make the link. */ /* If the room doesn't exist, create it.*/ if (rrnum == NOWHERE) { - /* Give the descriptor an olc struct. This way we can let + /* Give the descriptor an olc struct. This way we can let * redit_save_internally handle the room adding. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_dig: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_dig: Player already had olc structure."); free(d->olc); } CREATE(d->olc, struct oasis_olc_data, 1); @@ -253,7 +253,7 @@ ACMD(do_dig) OLC_ROOM(d)->zone = OLC_ZNUM(d); OLC_ROOM(d)->number = NOWHERE; - /* Save the new room to memory. redit_save_internally handles adding the + /* Save the new room to memory. redit_save_internally handles adding the * room in the right place, etc. */ redit_save_internally(d); OLC_VAL(d) = 0; @@ -315,7 +315,7 @@ int buildwalk(struct char_data *ch, int dir) room_rnum rnum; if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_BUILDWALK) && - GET_LEVEL(ch) >= LVL_BUILDER) { + ADM_FLAGGED(ch, ADM_BUILD)) { get_char_colors(ch); @@ -325,10 +325,10 @@ int buildwalk(struct char_data *ch, int dir) send_to_char(ch, "No free vnums are available in this zone!\r\n"); } else { struct descriptor_data *d = ch->desc; - /* Give the descriptor an olc struct. This way we can let + /* Give the descriptor an olc struct. This way we can let * redit_save_internally handle the room adding. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: buildwalk(): Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: buildwalk(): Player already had olc structure."); free(d->olc); } CREATE(d->olc, struct oasis_olc_data, 1); @@ -343,7 +343,7 @@ int buildwalk(struct char_data *ch, int dir) OLC_ROOM(d)->zone = OLC_ZNUM(d); OLC_ROOM(d)->number = NOWHERE; - /* Save the new room to memory. redit_save_internally handles adding the + /* Save the new room to memory. redit_save_internally handles adding the * room in the right place, etc. */ redit_save_internally(d); OLC_VAL(d) = 0; diff --git a/src/oasis_delete.c b/src/oasis_delete.c index 1dc3b14..2e90a31 100644 --- a/src/oasis_delete.c +++ b/src/oasis_delete.c @@ -19,7 +19,7 @@ #include "improved-edit.h" /* Free's strings from any object, room, mobiles, or player. TRUE if successful, - * otherwise, it returns FALSE. Type - The OLC type constant relating to the + * otherwise, it returns FALSE. Type - The OLC type constant relating to the * data type of data. */ int free_strings(void *data, int type) { @@ -101,7 +101,7 @@ int free_strings(void *data, int type) return (TRUE); default: - mudlog(BRF, LVL_GOD, TRUE, "SYSERR: oasis_delete.c: free_strings: Invalid type handled (Type %d).", type); + mudlog(BRF, ADMLVL_GOD, TRUE, "SYSERR: oasis_delete.c: free_strings: Invalid type handled (Type %d).", type); return (FALSE); } } diff --git a/src/oasis_list.c b/src/oasis_list.c index ab60a70..6dde1f0 100644 --- a/src/oasis_list.c +++ b/src/oasis_list.c @@ -167,7 +167,7 @@ ACMD(do_oasis_list) break; default: send_to_char(ch, "You can't list that!\r\n"); - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_list: Unknown list option: %d", subcmd); } } @@ -521,8 +521,8 @@ void print_zone(struct char_data *ch, zone_vnum vnum) QGRN, QCYN, zone_table[rnum].top, QGRN, QCYN, zone_table[rnum].reset_mode ? ((zone_table[rnum].reset_mode == 1) ? "Reset when no players are in zone." : "Normal reset.") : "Never reset", - QGRN, QCYN, buf, - QGRN, QCYN, zone_table[rnum].min_level, + QGRN, QCYN, buf, + QGRN, QCYN, zone_table[rnum].min_level, QGRN, QCYN, zone_table[rnum].max_level, QGRN, QGRN, QCYN, size_rooms, diff --git a/src/objsave.c b/src/objsave.c index a191e68..483bc9c 100644 --- a/src/objsave.c +++ b/src/objsave.c @@ -22,6 +22,7 @@ #include "config.h" #include "modify.h" #include "genolc.h" /* for strip_cr and sprintascii */ +#include "constants.h" /* these factors should be unique integers */ #define RENT_FACTOR 1 @@ -248,7 +249,7 @@ static void auto_equip(struct char_data *ch, struct obj_data *obj, int location) else equip_char(ch, obj, j); } else { /* Oops, saved a player with double equipment? */ - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: autoeq: '%s' already equipped in position %d.", GET_NAME(ch), location); location = LOC_INVENTORY; } @@ -927,7 +928,7 @@ static int gen_receptionist(struct char_data *ch, struct char_data *recep, int c if (mode == RENT_FACTOR) { act("$n stores your belongings and helps you into your private chamber.", FALSE, recep, 0, ch, TO_VICT); Crash_rentsave(ch, cost); - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has rented (%d/day, %d tot.)", + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has rented (%d/day, %d tot.)", GET_NAME(ch), cost, GET_GOLD(ch) + GET_BANK_GOLD(ch)); } else { /* cryo */ act("$n stores your belongings and helps you into your private chamber.\r\n" @@ -935,7 +936,7 @@ static int gen_receptionist(struct char_data *ch, struct char_data *recep, int c "You begin to lose consciousness...", FALSE, recep, 0, ch, TO_VICT); Crash_cryosave(ch, cost); - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has cryo-rented.", GET_NAME(ch)); + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has cryo-rented.", GET_NAME(ch)); SET_BIT_AR(PLR_FLAGS(ch), PLR_CRYO); } @@ -1189,7 +1190,7 @@ static int Crash_load_objs(struct char_data *ch) { "There was a problem loading your objects from disk.\r\n" "Contact a God for assistance.\r\n"); } - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s entering game with no equipment.", GET_NAME(ch)); + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s entering game with no equipment.", GET_NAME(ch)); return 1; } if (get_line(fl, line)) @@ -1202,7 +1203,7 @@ static int Crash_load_objs(struct char_data *ch) { cost = (unsigned int) (netcost * num_of_days); if (cost > (unsigned int)GET_GOLD(ch) + (unsigned int)GET_BANK_GOLD(ch)) { fclose(fl); - mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, + mudlog(BRF, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s entering game, rented equipment lost (no $).", GET_NAME(ch)); Crash_crashsave(ch); return 2; @@ -1214,25 +1215,25 @@ static int Crash_load_objs(struct char_data *ch) { } switch (orig_rent_code = rentcode) { case RENT_RENTED: - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s un-renting and entering game.", GET_NAME(ch)); break; case RENT_CRASH: - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s retrieving crash-saved items and entering game.", GET_NAME(ch)); break; case RENT_CRYO: - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s un-cryo'ing and entering game.", GET_NAME(ch)); break; case RENT_FORCED: case RENT_TIMEDOUT: - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s retrieving force-saved items and entering game.", GET_NAME(ch)); break; default: - mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, + mudlog(NRM, MAX(ADMLVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "WARNING: %s entering game with undefined rent code.", GET_NAME(ch)); break; } @@ -1250,8 +1251,8 @@ static int Crash_load_objs(struct char_data *ch) { } /* Little hoarding check. -gg 3/1/98 */ - mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "%s (level %d) has %d %s (max %d).", - GET_NAME(ch), GET_LEVEL(ch), num_objs, num_objs > 1 ? "objects" : "object", CONFIG_MAX_OBJ_SAVE); + mudlog(NRM, MAX(ADMLVL_GOD, GET_INVIS_LEV(ch)), TRUE, "%s (level %d %s) has %d %s (max %d).", + GET_NAME(ch), GET_LEVEL(ch), admin_level_names[(GET_ADMLEVEL(ch))], num_objs, num_objs > 1 ? "objects" : "object", CONFIG_MAX_OBJ_SAVE); fclose(fl); diff --git a/src/oedit.c b/src/oedit.c index 51ca14c..92a90dc 100644 --- a/src/oedit.c +++ b/src/oedit.c @@ -113,7 +113,7 @@ ACMD(do_oasis_oedit) /* Give the descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis: Player already had olc structure."); free(d->olc); } @@ -144,7 +144,7 @@ ACMD(do_oasis_oedit) if (save) { send_to_char(ch, "Saving all objects in zone %d.\r\n", zone_table[OLC_ZNUM(d)].number); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves object info for zone %d.", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number); @@ -173,7 +173,7 @@ ACMD(do_oasis_oedit) SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); /* Log the OLC message. */ - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); } @@ -448,7 +448,7 @@ static void oedit_disp_val1_menu(struct descriptor_data *d) oedit_disp_menu(d); break; default: - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: Reached default case in oedit_disp_val1_menu()!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: Reached default case in oedit_disp_val1_menu()!"); break; } } @@ -695,7 +695,7 @@ void oedit_parse(struct descriptor_data *d, char *arg) case 'y': case 'Y': oedit_save_internally(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits obj %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { oedit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); @@ -924,7 +924,7 @@ void oedit_parse(struct descriptor_data *d, char *arg) break; case OEDIT_LEVEL: - GET_OBJ_LEVEL(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, LVL_IMPL); + GET_OBJ_LEVEL(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, CONFIG_MAX_LEVEL); break; case OEDIT_PERM: @@ -1091,7 +1091,7 @@ void oedit_parse(struct descriptor_data *d, char *arg) int counter; /* add in check here if already applied.. deny builders another */ - if (GET_LEVEL(d->character) < LVL_IMPL) { + if (!IS_ADMIN(d->character, ADMLVL_IMPL)) { for (counter = 0; counter < MAX_OBJ_AFFECT; counter++) { if (OLC_OBJ(d)->affected[counter].location == number) { write_to_output(d, "Object already has that apply."); @@ -1197,7 +1197,7 @@ void oedit_parse(struct descriptor_data *d, char *arg) write_to_output(d, "Please answer 'Y' or 'N': "); return; default: - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: Reached default case in oedit_parse()!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: Reached default case in oedit_parse()!"); write_to_output(d, "Oops...\r\n"); break; } diff --git a/src/pfdefaults.h b/src/pfdefaults.h index c0eba7e..e442841 100644 --- a/src/pfdefaults.h +++ b/src/pfdefaults.h @@ -1,7 +1,7 @@ /** * @file pfdefaults.h * ASCII player file defaults. -* +* * Part of the core tbaMUD source code distribution, which is a derivative * of, and continuation of, CircleMUD. * @@ -10,12 +10,13 @@ #ifndef _PFDEFAULTS_H_ #define _PFDEFAULTS_H_ -/* WARNING: Do not change the values below if you have existing ascii player +/* WARNING: Do not change the values below if you have existing ascii player * files you don't want to screw up. */ #define PFDEF_SEX 0 #define PFDEF_CLASS 0 #define PFDEF_LEVEL 0 +#define PFDEF_ADMLEVEL ADMLVL_MORTAL #define PFDEF_HEIGHT 0 #define PFDEF_WEIGHT 0 #define PFDEF_ALIGNMENT 0 @@ -52,14 +53,14 @@ #define PFDEF_HUNGER 0 #define PFDEF_THIRST 0 #define PFDEF_DRUNK 0 -#define PFDEF_OLC NOWHERE +#define PFDEF_OLC NOWHERE #define PFDEF_PAGELENGTH 22 #define PFDEF_SCREENWIDTH 80 #define PFDEF_QUESTPOINTS 0 #define PFDEF_QUESTCOUNT 0 #define PFDEF_COMPQUESTS 0 #define PFDEF_CURRQUEST NOTHING -#define PFDEF_LASTMOTD 0 -#define PFDEF_LASTNEWS 0 +#define PFDEF_LASTMOTD 0 +#define PFDEF_LASTNEWS 0 #endif /* _PFDEFAULTS_H_ */ diff --git a/src/players.c b/src/players.c index 246a6e0..739db35 100644 --- a/src/players.c +++ b/src/players.c @@ -28,11 +28,12 @@ #define LOAD_MOVE 2 #define LOAD_STRENGTH 3 -#define PT_PNAME(i) (player_table[(i)].name) -#define PT_IDNUM(i) (player_table[(i)].id) -#define PT_LEVEL(i) (player_table[(i)].level) -#define PT_FLAGS(i) (player_table[(i)].flags) -#define PT_LLAST(i) (player_table[(i)].last) +#define PT_PNAME(i) (player_table[(i)].name) +#define PT_IDNUM(i) (player_table[(i)].id) +#define PT_LEVEL(i) (player_table[(i)].level) +#define PT_ADMLEVEL(i) (player_table[(i)].admlevel) +#define PT_FLAGS(i) (player_table[(i)].flags) +#define PT_LLAST(i) (player_table[(i)].last) /* 'global' vars defined here and used externally */ /** @deprecated Since this file really is basically a functional extension @@ -83,11 +84,20 @@ void build_player_index(void) CREATE(player_table, struct player_index_element, rec_count); for (i = 0; i < rec_count; i++) { get_line(plr_index, line); - sscanf(line, "%ld %s %d %s %ld", &player_table[i].id, arg2, - &player_table[i].level, bits, (long *)&player_table[i].last); + /* Load both old-style (5 vars) or new style with admin level (6 vars) */ + if (sscanf(line, "%ld %s %d %d %s %ld", &PT_IDNUM(i), arg2, + &PT_LEVEL(i), &PT_ADMLEVEL(i), bits, (long *)&PT_LLAST(i)) != 6) { + if (sscanf(line, "%ld %s %d %s %ld", &PT_IDNUM(i), arg2, + &PT_LEVEL(i), bits, (long *)&PT_LLAST(i)) != 5) { + log("SYSERR: Invalid line in player index (%s, line %d)", index_name, (i+1)); + } + /* Convert old level to new seperate admin and mortal levels */ + PT_ADMLEVEL(i) = (PT_LEVEL(i) > CONFIG_MAX_LEVEL) ? MIN((PT_LEVEL(i) - CONFIG_MAX_LEVEL), ADMLVL_IMPL) : ADMLVL_MORTAL; + PT_LEVEL(i) = MIN(PT_LEVEL(i), CONFIG_MAX_LEVEL); + } CREATE(player_table[i].name, char, strlen(arg2) + 1); strcpy(player_table[i].name, arg2); - player_table[i].flags = asciiflag_conv(bits); + PT_FLAGS(i) = asciiflag_conv(bits); top_idnum = MAX(top_idnum, player_table[i].id); } @@ -119,7 +129,7 @@ int create_entry(char *name) /* Nothing */; /* clear the bitflag in case we have garbage data */ - player_table[pos].flags = 0; + PT_FLAGS(pos) = 0; return (pos); } @@ -142,6 +152,7 @@ void remove_player_from_index(int pos) PT_PNAME(i-1) = PT_PNAME(i); PT_IDNUM(i-1) = PT_IDNUM(i); PT_LEVEL(i-1) = PT_LEVEL(i); + PT_ADMLEVEL(i-1) = PT_ADMLEVEL(i); PT_FLAGS(i-1) = PT_FLAGS(i); PT_LLAST(i-1) = PT_LLAST(i); } @@ -174,10 +185,9 @@ void save_player_index(void) for (i = 0; i <= top_of_p_table; i++) if (*player_table[i].name) { - sprintascii(bits, player_table[i].flags); - fprintf(index_file, "%ld %s %d %s %ld\n", player_table[i].id, - player_table[i].name, player_table[i].level, *bits ? bits : "0", - (long)player_table[i].last); + sprintascii(bits, PT_FLAGS(i)); + fprintf(index_file, "%ld %s %d %d %s %ld\n", PT_IDNUM(i), PT_PNAME(i), + PT_LEVEL(i), PT_ADMLEVEL(i), *bits ? bits : "0", (long)PT_LLAST(i)); } fprintf(index_file, "~\n"); @@ -192,8 +202,8 @@ void free_player_index(void) return; for (tp = 0; tp <= top_of_p_table; tp++) - if (player_table[tp].name) - free(player_table[tp].name); + if (PT_PNAME(tp)) + free(PT_PNAME(tp)); free(player_table); player_table = NULL; @@ -249,10 +259,10 @@ int load_char(const char *name, struct char_data *ch) if ((id = get_ptable_by_name(name)) < 0) return (-1); else { - if (!get_filename(filename, sizeof(filename), PLR_FILE, player_table[id].name)) + if (!get_filename(filename, sizeof(filename), PLR_FILE, PT_PNAME(id))) return (-1); if (!(fl = fopen(filename, "r"))) { - mudlog(NRM, LVL_GOD, TRUE, "SYSERR: Couldn't open player file %s", filename); + mudlog(NRM, ADMLVL_GOD, TRUE, "SYSERR: Couldn't open player file %s", filename); return (-1); } @@ -263,6 +273,7 @@ int load_char(const char *name, struct char_data *ch) GET_SEX(ch) = PFDEF_SEX; GET_CLASS(ch) = PFDEF_CLASS; GET_LEVEL(ch) = PFDEF_LEVEL; + GET_ADMLEVEL(ch) = PFDEF_ADMLEVEL; GET_HEIGHT(ch) = PFDEF_HEIGHT; GET_WEIGHT(ch) = PFDEF_WEIGHT; GET_ALIGNMENT(ch) = PFDEF_ALIGNMENT; @@ -321,16 +332,17 @@ int load_char(const char *name, struct char_data *ch) switch (*tag) { case 'A': - if (!strcmp(tag, "Ac ")) GET_AC(ch) = atoi(line); - else if (!strcmp(tag, "Act ")) { - if (sscanf(line, "%s %s %s %s", f1, f2, f3, f4) == 4) { - PLR_FLAGS(ch)[0] = asciiflag_conv(f1); - PLR_FLAGS(ch)[1] = asciiflag_conv(f2); - PLR_FLAGS(ch)[2] = asciiflag_conv(f3); - PLR_FLAGS(ch)[3] = asciiflag_conv(f4); - } else - PLR_FLAGS(ch)[0] = asciiflag_conv(line); - } else if (!strcmp(tag, "Aff ")) { + if (!strcmp(tag, "Ac ")) GET_AC(ch) = atoi(line); + else if (!strcmp(tag, "Act ")) { + if (sscanf(line, "%s %s %s %s", f1, f2, f3, f4) == 4) { + PLR_FLAGS(ch)[0] = asciiflag_conv(f1); + PLR_FLAGS(ch)[1] = asciiflag_conv(f2); + PLR_FLAGS(ch)[2] = asciiflag_conv(f3); + PLR_FLAGS(ch)[3] = asciiflag_conv(f4); + } else + PLR_FLAGS(ch)[0] = asciiflag_conv(line); + } + else if (!strcmp(tag, "Aff ")) { if (sscanf(line, "%s %s %s %s", f1, f2, f3, f4) == 4) { AFF_FLAGS(ch)[0] = asciiflag_conv(f1); AFF_FLAGS(ch)[1] = asciiflag_conv(f2); @@ -339,9 +351,19 @@ int load_char(const char *name, struct char_data *ch) } else AFF_FLAGS(ch)[0] = asciiflag_conv(line); } - if (!strcmp(tag, "Affs")) load_affects(fl, ch); - else if (!strcmp(tag, "Alin")) GET_ALIGNMENT(ch) = atoi(line); + else if (!strcmp(tag, "Affs")) load_affects(fl, ch); + else if (!strcmp(tag, "Alin")) GET_ALIGNMENT(ch) = atoi(line); else if (!strcmp(tag, "Alis")) read_aliases_ascii(fl, ch, atoi(line)); + else if (!strcmp(tag, "Admn")) GET_ADMLEVEL(ch) = atoi(line); + else if (!strcmp(tag, "Admf")) { + if (sscanf(line, "%s %s %s %s", f1, f2, f3, f4) == 4) { + ADM_FLAGS(ch)[0] = asciiflag_conv(f1); + ADM_FLAGS(ch)[1] = asciiflag_conv(f2); + ADM_FLAGS(ch)[2] = asciiflag_conv(f3); + ADM_FLAGS(ch)[3] = asciiflag_conv(f4); + } else + ADM_FLAGS(ch)[0] = asciiflag_conv(f1); + } break; case 'B': @@ -486,8 +508,15 @@ int load_char(const char *name, struct char_data *ch) affect_total(ch); + /* Sort old-style admin levels (one-time only code for codebase upgrades to tbaMUD 4.0) */ + if (GET_LEVEL(ch) > CONFIG_MAX_LEVEL) { + /* For no converson to new admin levels, skip next line */ + GET_ADMLEVEL(ch) = MIN((GET_LEVEL(ch) - CONFIG_MAX_LEVEL), ADMLVL_IMPL); + GET_LEVEL(ch) = CONFIG_MAX_LEVEL; + } + /* initialization for imms */ - if (GET_LEVEL(ch) >= LVL_IMMORT) { + if (IS_ADMIN(ch, ADMLVL_IMMORT)) { for (i = 1; i <= MAX_SKILLS; i++) GET_SKILL(ch, i) = 100; GET_COND(ch, HUNGER) = -1; @@ -533,7 +562,7 @@ void save_char(struct char_data * ch) if (!get_filename(filename, sizeof(filename), PLR_FILE, GET_NAME(ch))) return; if (!(fl = fopen(filename, "w"))) { - mudlog(NRM, LVL_GOD, TRUE, "SYSERR: Couldn't open player file %s for write", filename); + mudlog(NRM, ADMLVL_GOD, TRUE, "SYSERR: Couldn't open player file %s for write", filename); return; } @@ -587,6 +616,7 @@ void save_char(struct char_data * ch) if (GET_SEX(ch) != PFDEF_SEX) fprintf(fl, "Sex : %d\n", GET_SEX(ch)); if (GET_CLASS(ch) != PFDEF_CLASS) fprintf(fl, "Clas: %d\n", GET_CLASS(ch)); if (GET_LEVEL(ch) != PFDEF_LEVEL) fprintf(fl, "Levl: %d\n", GET_LEVEL(ch)); + if (GET_ADMLEVEL(ch) != PFDEF_ADMLEVEL) fprintf(fl, "Admn: %d\n", GET_ADMLEVEL(ch)); fprintf(fl, "Id : %ld\n", GET_IDNUM(ch)); fprintf(fl, "Brth: %ld\n", (long)ch->player.time.birth); @@ -622,7 +652,13 @@ void save_char(struct char_data * ch) sprintascii(bits4, PRF_FLAGS(ch)[3]); fprintf(fl, "Pref: %s %s %s %s\n", bits, bits2, bits3, bits4); - if (GET_SAVE(ch, 0) != PFDEF_SAVETHROW) fprintf(fl, "Thr1: %d\n", GET_SAVE(ch, 0)); + sprintascii(bits, ADM_FLAGS(ch)[0]); + sprintascii(bits2, ADM_FLAGS(ch)[1]); + sprintascii(bits3, ADM_FLAGS(ch)[2]); + sprintascii(bits4, ADM_FLAGS(ch)[3]); + fprintf(fl, "Admf: %s %s %s %s\n", bits, bits2, bits3, bits4); + + if (GET_SAVE(ch, 0) != PFDEF_SAVETHROW) fprintf(fl, "Thr1: %d\n", GET_SAVE(ch, 0)); if (GET_SAVE(ch, 1) != PFDEF_SAVETHROW) fprintf(fl, "Thr2: %d\n", GET_SAVE(ch, 1)); if (GET_SAVE(ch, 2) != PFDEF_SAVETHROW) fprintf(fl, "Thr3: %d\n", GET_SAVE(ch, 2)); if (GET_SAVE(ch, 3) != PFDEF_SAVETHROW) fprintf(fl, "Thr4: %d\n", GET_SAVE(ch, 3)); @@ -636,9 +672,9 @@ void save_char(struct char_data * ch) if (GET_BAD_PWS(ch) != PFDEF_BADPWS) fprintf(fl, "Badp: %d\n", GET_BAD_PWS(ch)); if (GET_PRACTICES(ch) != PFDEF_PRACTICES) fprintf(fl, "Lern: %d\n", GET_PRACTICES(ch)); - if (GET_COND(ch, HUNGER) != PFDEF_HUNGER && GET_LEVEL(ch) < LVL_IMMORT) fprintf(fl, "Hung: %d\n", GET_COND(ch, HUNGER)); - if (GET_COND(ch, THIRST) != PFDEF_THIRST && GET_LEVEL(ch) < LVL_IMMORT) fprintf(fl, "Thir: %d\n", GET_COND(ch, THIRST)); - if (GET_COND(ch, DRUNK) != PFDEF_DRUNK && GET_LEVEL(ch) < LVL_IMMORT) fprintf(fl, "Drnk: %d\n", GET_COND(ch, DRUNK)); + if (GET_COND(ch, HUNGER) != PFDEF_HUNGER && !IS_ADMIN(ch, ADMLVL_IMMORT)) fprintf(fl, "Hung: %d\n", GET_COND(ch, HUNGER)); + if (GET_COND(ch, THIRST) != PFDEF_THIRST && !IS_ADMIN(ch, ADMLVL_IMMORT)) fprintf(fl, "Thir: %d\n", GET_COND(ch, THIRST)); + if (GET_COND(ch, DRUNK) != PFDEF_DRUNK && !IS_ADMIN(ch, ADMLVL_IMMORT)) fprintf(fl, "Drnk: %d\n", GET_COND(ch, DRUNK)); if (GET_HIT(ch) != PFDEF_HIT || GET_MAX_HIT(ch) != PFDEF_MAXHIT) fprintf(fl, "Hit : %d/%d\n", GET_HIT(ch), GET_MAX_HIT(ch)); if (GET_MANA(ch) != PFDEF_MANA || GET_MAX_MANA(ch) != PFDEF_MAXMANA) fprintf(fl, "Mana: %d/%d\n", GET_MANA(ch), GET_MAX_MANA(ch)); @@ -678,7 +714,7 @@ void save_char(struct char_data * ch) } /* Save skills */ - if (GET_LEVEL(ch) < LVL_IMMORT) { + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) { fprintf(fl, "Skil:\n"); for (i = 1; i <= MAX_SKILLS; i++) { if (GET_SKILL(ch, i)) @@ -731,6 +767,10 @@ void save_char(struct char_data * ch) save_index = TRUE; player_table[id].level = GET_LEVEL(ch); } + if (player_table[id].admlevel != GET_ADMLEVEL(ch)) { + save_index = TRUE; + player_table[id].admlevel = GET_ADMLEVEL(ch); + } if (player_table[id].last != ch->player.time.logon) { save_index = TRUE; player_table[id].last = ch->player.time.logon; @@ -740,6 +780,7 @@ void save_char(struct char_data * ch) SET_BIT(player_table[id].flags, PINDEX_DELETED); else REMOVE_BIT(player_table[id].flags, PINDEX_DELETED); + if (PLR_FLAGGED(ch, PLR_NODELETE) || PLR_FLAGGED(ch, PLR_CRYO)) SET_BIT(player_table[id].flags, PINDEX_NODELETE); else @@ -750,6 +791,11 @@ void save_char(struct char_data * ch) else REMOVE_BIT(player_table[id].flags, PINDEX_NOWIZLIST); + if (PRF_FLAGGED(ch, PRF_MORTAL)) + SET_BIT(player_table[id].flags, PINDEX_MORTAL); + else + REMOVE_BIT(player_table[id].flags, PINDEX_MORTAL); + if (player_table[id].flags != i || save_index) save_player_index(); } @@ -790,8 +836,9 @@ void remove_player(int pfilepos) unlink(filename); } - log("PCLEAN: %s Lev: %d Last: %s", + log("PCLEAN: %s Lev: %d AdmLev: %d Last: %s", player_table[pfilepos].name, player_table[pfilepos].level, + player_table[pfilepos].admlevel, asctime(localtime(&player_table[pfilepos].last))); player_table[pfilepos].name[0] = '\0'; @@ -806,6 +853,10 @@ void clean_pfiles(void) int i, ci; for (i = 0; i <= top_of_p_table; i++) { + /* Skip Imms */ + if (PT_ADMLEVEL(i) > ADMLVL_IMMORT) + continue; + /* We only want to go further if the player isn't protected from deletion * and hasn't already been deleted. */ if (!IS_SET(player_table[i].flags, PINDEX_NODELETE) && diff --git a/src/prefedit.c b/src/prefedit.c index 13691ca..9b979a9 100755 --- a/src/prefedit.c +++ b/src/prefedit.c @@ -79,16 +79,16 @@ static void prefedit_save_to_char(struct descriptor_data *d) else { if (!vict) { - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (no vict)"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (no vict)"); send_to_char(d->character, "Unable to save toggles (no vict)"); } else if (!vict->desc) { - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (no vict descriptor)"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (no vict descriptor)"); send_to_char(d->character, "Unable to save toggles (no vict descriptor)"); } else if (!IS_PLAYING(vict->desc)) { - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (vict not playing)"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (vict not playing)"); send_to_char(d->character, "Unable to save toggles (vict not playing)"); } else { - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (unknown reason)"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Unable to save toggles (unknown reason)"); send_to_char(d->character, "Unable to save toggles (unknown reason)"); } } @@ -138,7 +138,7 @@ static void prefedit_disp_main_menu(struct descriptor_data *d) CBYEL(d->character, C_NRM), CCNRM(d->character, C_NRM) ); /* Imm Prefs */ - if (GET_LEVEL(PREFEDIT_GET_CHAR) >= LVL_IMMORT) + if (IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_IMMORT)) { sprintf(syslog_string, "%s", multi_types[((PREFEDIT_FLAGGED(PRF_LOG1) ? 1 : 0)+ (PREFEDIT_FLAGGED(PRF_LOG2) ? 2 : 0))] ); @@ -334,7 +334,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) case 'y': case 'Y': prefedit_save_to_char(d); - mudlog(CMP, LVL_BUILDER, TRUE, "OLC: %s edits toggles for %s", GET_NAME(d->character), GET_NAME(OLC_PREFS(d)->ch)); + mudlog(CMP, ADMLVL_BUILDER, TRUE, "OLC: %s edits toggles for %s", GET_NAME(d->character), GET_NAME(OLC_PREFS(d)->ch)); /*. No strings to save - cleanup all .*/ cleanup_olc(d, CLEANUP_ALL); break; @@ -402,7 +402,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) /* Below this point are Imm-only toggles */ case '1': - if (GET_LEVEL(PREFEDIT_GET_CHAR) < LVL_IMMORT) + if (!IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_IMMORT)) { send_to_char(d->character, "%sInvalid choice!%s\r\n", CBRED(d->character, C_NRM), CCNRM(d->character, C_NRM)); prefedit_disp_main_menu(d); @@ -415,7 +415,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) break; case '2': - if (GET_LEVEL(PREFEDIT_GET_CHAR) < LVL_IMMORT) + if (!IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_IMMORT)) { send_to_char(d->character, "%sInvalid choice!%s\r\n", CBRED(d->character, C_NRM), CCNRM(d->character, C_NRM)); prefedit_disp_main_menu(d); @@ -427,7 +427,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) break; case '3': - if (GET_LEVEL(PREFEDIT_GET_CHAR) < LVL_IMMORT) + if (!IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_IMMORT)) { send_to_char(d->character, "%sInvalid choice!%s\r\n", CBRED(d->character, C_NRM), CCNRM(d->character, C_NRM)); prefedit_disp_main_menu(d); @@ -439,7 +439,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) break; case '4': - if (GET_LEVEL(PREFEDIT_GET_CHAR) < LVL_IMMORT) + if (!IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_IMMORT)) { send_to_char(d->character, "%sInvalid choice!%s\r\n", CBRED(d->character, C_NRM), CCNRM(d->character, C_NRM)); prefedit_disp_main_menu(d); @@ -451,7 +451,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) break; case '5': - if (GET_LEVEL(PREFEDIT_GET_CHAR) < LVL_IMMORT) + if (!IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_IMMORT)) { send_to_char(d->character, "%sInvalid choice!%s\r\n", CBRED(d->character, C_NRM), CCNRM(d->character, C_NRM)); prefedit_disp_main_menu(d); @@ -463,7 +463,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) break; case '6': - if (GET_LEVEL(PREFEDIT_GET_CHAR) < LVL_IMMORT) + if (!IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_IMMORT)) { send_to_char(d->character, "%sInvalid choice!%s\r\n", CBRED(d->character, C_NRM), CCNRM(d->character, C_NRM)); prefedit_disp_main_menu(d); @@ -671,7 +671,7 @@ void prefedit_parse(struct descriptor_data * d, char *arg) default: /* we should never get here */ - mudlog(BRF,LVL_BUILDER,TRUE,"SYSERR: Reached default case in parse_prefedit"); + mudlog(BRF,ADMLVL_BUILDER,TRUE,"SYSERR: Reached default case in parse_prefedit"); break; } /*. If we get this far, something has be changed .*/ @@ -715,7 +715,7 @@ void prefedit_Restore_Defaults(struct descriptor_data *d) SET_BIT_AR(PREFEDIT_GET_FLAGS, PRF_AUTOEXIT); /* PRF_NOHASSLE - On for Imms */ - if (!PREFEDIT_FLAGGED(PRF_NOHASSLE) && GET_LEVEL(PREFEDIT_GET_CHAR) > LVL_IMMORT) + if (!PREFEDIT_FLAGGED(PRF_NOHASSLE) && IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_BUILDER)) SET_BIT_AR(PREFEDIT_GET_FLAGS, PRF_NOHASSLE); else REMOVE_BIT_AR(PREFEDIT_GET_FLAGS, PRF_NOHASSLE); @@ -733,7 +733,7 @@ void prefedit_Restore_Defaults(struct descriptor_data *d) REMOVE_BIT_AR(PREFEDIT_GET_FLAGS, PRF_NOREPEAT); /* PRF_HOLYLIGHT - On for Imms */ - if (!PREFEDIT_FLAGGED(PRF_HOLYLIGHT) && GET_LEVEL(PREFEDIT_GET_CHAR) > LVL_IMMORT) + if (!PREFEDIT_FLAGGED(PRF_HOLYLIGHT) && IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_BUILDER)) SET_BIT_AR(PREFEDIT_GET_FLAGS, PRF_HOLYLIGHT); else REMOVE_BIT_AR(PREFEDIT_GET_FLAGS, PRF_HOLYLIGHT); @@ -769,7 +769,7 @@ void prefedit_Restore_Defaults(struct descriptor_data *d) REMOVE_BIT_AR(PREFEDIT_GET_FLAGS, PRF_NOGRATZ); /* PRF_SHOWVNUMS - On for Imms */ - if (!PREFEDIT_FLAGGED(PRF_SHOWVNUMS) && GET_LEVEL(PREFEDIT_GET_CHAR) > LVL_IMMORT) + if (!PREFEDIT_FLAGGED(PRF_SHOWVNUMS) && IS_ADMIN(PREFEDIT_GET_CHAR, ADMLVL_BUILDER)) SET_BIT_AR(PREFEDIT_GET_FLAGS, PRF_SHOWVNUMS); else REMOVE_BIT_AR(PREFEDIT_GET_FLAGS, PRF_SHOWVNUMS); @@ -807,15 +807,15 @@ void prefedit_Restore_Defaults(struct descriptor_data *d) REMOVE_BIT_AR(PREFEDIT_GET_FLAGS, PRF_AUTOASSIST); /* PRF_AUTOMAP - On */ - if (PREFEDIT_FLAGGED(PRF_AUTOMAP)) + if (!PREFEDIT_FLAGGED(PRF_AUTOMAP)) SET_BIT_AR(PREFEDIT_GET_FLAGS, PRF_AUTOMAP); /* PRF_AUTOKEY - On */ - if (PREFEDIT_FLAGGED(PRF_AUTOKEY)) + if (!PREFEDIT_FLAGGED(PRF_AUTOKEY)) SET_BIT_AR(PREFEDIT_GET_FLAGS, PRF_AUTOKEY); /* PRF_AUTODOOR - On */ - if (PREFEDIT_FLAGGED(PRF_AUTODOOR)) + if (!PREFEDIT_FLAGGED(PRF_AUTODOOR)) SET_BIT_AR(PREFEDIT_GET_FLAGS, PRF_AUTODOOR); /* Other (non-toggle) options */ @@ -844,7 +844,7 @@ ACMD(do_oasis_prefedit) if (!*buf1) { vict = ch; } - else if (GET_LEVEL(ch) >= LVL_IMPL) + else if (IS_ADMIN(ch, ADMLVL_IMPL)) { if ((vict = get_player_vis(ch, buf1, NULL, FIND_CHAR_WORLD)) == NULL) { @@ -888,7 +888,7 @@ ACMD(do_oasis_prefedit) /** Give the descriptor an OLC structure. **/ /****************************************************************************/ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_oasis_prefedit: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_prefedit: Player already had olc structure."); free(d->olc); } diff --git a/src/qedit.c b/src/qedit.c index 8436488..4392e56 100644 --- a/src/qedit.c +++ b/src/qedit.c @@ -121,7 +121,7 @@ ACMD(do_oasis_qedit) /** Give the descriptor an OLC structure. **/ /****************************************************************************/ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_quest: Player already had olc structure."); free(d->olc); } @@ -155,7 +155,7 @@ ACMD(do_oasis_qedit) if (save) { send_to_char(ch, "Saving all quests in zone %d.\r\n", zone_table[OLC_ZNUM(d)].number); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves quest info for zone %d.", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number); @@ -184,7 +184,7 @@ ACMD(do_oasis_qedit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); } @@ -205,7 +205,7 @@ static void qedit_setup_new(struct descriptor_data *d) quest->value[0] = 0; /* Points for completing */ quest->value[1] = 0; /* Points for abandoning */ quest->value[2] = 0; /* Minimum level */ - quest->value[3] = LVL_IMPL; /* Maximim level */ + quest->value[3] = CONFIG_MAX_LEVEL;/*Maximim level */ quest->value[4] = -1; /* Time limit */ quest->value[5] = NOBODY; /* Mob to return object */ quest->value[6] = 1; /* Quantity of targets */ @@ -385,7 +385,7 @@ void qedit_parse(struct descriptor_data *d, char *arg) case 'Y': send_to_char(d->character, "Saving Quest to memory.\r\n"); qedit_save_internally(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits quest %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { qedit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); @@ -645,26 +645,26 @@ void qedit_parse(struct descriptor_data *d, char *arg) OLC_QUEST(d)->prereq = number; break; case QEDIT_LEVELMIN: - if (number < 0 || number > LVL_IMPL) { - write_to_output(d, "Level must be between 0 and %d!\r\n", LVL_IMPL); - write_to_output(d, "Enter minimum level to accept the quest : " ); + if (number < 0 || number > CONFIG_MAX_LEVEL) { + write_to_output(d, "Level must be between 0 and %d!\r\n", CONFIG_MAX_LEVEL); + write_to_output(d, "Enter minimum level to accept the quest : " ); return; } else if (number > OLC_QUEST(d)->value[3]) { - write_to_output(d, "Minimum level can't be above maximum level!\r\n"); - write_to_output(d, "Enter minimum level to accept the quest : " ); + write_to_output(d, "Minimum level can't be above maximum level!\r\n"); + write_to_output(d, "Enter minimum level to accept the quest : " ); return; } else { OLC_QUEST(d)->value[2] = number; break; } case QEDIT_LEVELMAX: - if (number < 0 || number > LVL_IMPL) { - write_to_output(d, "Level must be between 0 and %d!\r\n", LVL_IMPL); - write_to_output(d, "Enter maximum level to accept the quest : " ); + if (number < 0 || number > CONFIG_MAX_LEVEL) { + write_to_output(d, "Level must be between 0 and %d!\r\n", CONFIG_MAX_LEVEL); + write_to_output(d, "Enter maximum level to accept the quest : " ); return; } else if (number < OLC_QUEST(d)->value[2]) { - write_to_output(d, "Maximum level can't be below minimum level!\r\n"); - write_to_output(d, "Enter maximum level to accept the quest : " ); + write_to_output(d, "Maximum level can't be below minimum level!\r\n"); + write_to_output(d, "Enter maximum level to accept the quest : " ); return; } else { OLC_QUEST(d)->value[3] = number; @@ -719,7 +719,7 @@ void qedit_parse(struct descriptor_data *d, char *arg) default: /*. We should never get here . */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: qedit_parse(): " + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: qedit_parse(): " "Reached default case!"); write_to_output(d, "Oops...\r\n"); break; diff --git a/src/quest.c b/src/quest.c index 1afd72a..b1c50ef 100644 --- a/src/quest.c +++ b/src/quest.c @@ -658,7 +658,7 @@ void quest_stat(struct char_data *ch, char argument[MAX_STRING_LENGTH]) char buf[MAX_STRING_LENGTH]; char targetname[MAX_STRING_LENGTH]; - if (GET_LEVEL(ch) < LVL_IMMORT) + if (!ADM_FLAGGED(ch, ADM_BUILD)) send_to_char(ch, "Huh!?!\r\n"); else if (!*argument) send_to_char(ch, "%s\r\n", quest_imm_usage); @@ -697,43 +697,41 @@ void quest_stat(struct char_data *ch, char argument[MAX_STRING_LENGTH]) send_to_char(ch, "VNum : [@y%5d@n], RNum: [@y%5d@n] -- Questmaster: [@y%5d@n] @y%s@n\r\n" "Name : @y%s@n\r\n" - "Desc : @y%s@n\r\n" - "Accept Message:\r\n@c%s@n" - "Completion Message:\r\n@c%s@n" - "Quit Message:\r\n@c%s@n" - "Type : @y%s@n\r\n" + "Desc : @y%s@n\r\n" + "Accept Message:\r\n@c%s@n" + "Completion Message:\r\n@c%s@n" + "Quit Message:\r\n@c%s@n" + "Type : @y%s@n\r\n" "Target: @y%d@n @y%s@n, Quantity: @y%d@n\r\n" - "Value : @y%d@n, Penalty: @y%d@n, Min Level: @y%2d@n, Max Level: @y%2d@n\r\n" - "Flags : @c%s@n\r\n", - QST_NUM(rnum), rnum, - QST_MASTER(rnum) == NOBODY ? -1 : QST_MASTER(rnum), - (qmrnum == NOBODY) ? "(Invalid vnum)" : GET_NAME(&mob_proto[(qmrnum)]), - QST_NAME(rnum), QST_DESC(rnum), - QST_INFO(rnum), QST_DONE(rnum), - (QST_QUIT(rnum) && - (str_cmp(QST_QUIT(rnum), "undefined") != 0) - ? QST_QUIT(rnum) : "Nothing\r\n"), - quest_types[QST_TYPE(rnum)], - QST_TARGET(rnum) == NOBODY ? -1 : QST_TARGET(rnum), - targetname, - QST_QUANTITY(rnum), - QST_POINTS(rnum), QST_PENALTY(rnum), QST_MINLEVEL(rnum), - QST_MAXLEVEL(rnum), buf); + "Value : @y%d@n, Penalty: @y%d@n, Min Level: @y%2d@n, Max Level: @y%2d@n\r\n" + "Flags : @c%s@n\r\n", + QST_NUM(rnum), rnum, + QST_MASTER(rnum) == NOBODY ? -1 : QST_MASTER(rnum), + (qmrnum == NOBODY) ? "(Invalid vnum)" : GET_NAME(&mob_proto[(qmrnum)]), + QST_NAME(rnum), QST_DESC(rnum), + QST_INFO(rnum), QST_DONE(rnum), + (QST_QUIT(rnum) && (str_cmp(QST_QUIT(rnum), "undefined") != 0) ? QST_QUIT(rnum) : "Nothing\r\n"), + quest_types[QST_TYPE(rnum)], + QST_TARGET(rnum) == NOBODY ? -1 : QST_TARGET(rnum), + targetname, + QST_QUANTITY(rnum), + QST_POINTS(rnum), QST_PENALTY(rnum), QST_MINLEVEL(rnum), + QST_MAXLEVEL(rnum), buf); if (QST_PREREQ(rnum) != NOTHING) send_to_char(ch, "Preq : [@y%5d@n] @y%s@n\r\n", QST_PREREQ(rnum) == NOTHING ? -1 : QST_PREREQ(rnum), QST_PREREQ(rnum) == NOTHING ? "" : - real_object(QST_PREREQ(rnum)) == NOTHING ? "an unknown object" : - obj_proto[real_object(QST_PREREQ(rnum))].short_description); + real_object(QST_PREREQ(rnum)) == NOTHING ? "an unknown object" : + obj_proto[real_object(QST_PREREQ(rnum))].short_description); if (QST_TYPE(rnum) == AQ_OBJ_RETURN) send_to_char(ch, "Mob : [@y%5d@n] @y%s@n\r\n", QST_RETURNMOB(rnum), - real_mobile(QST_RETURNMOB(rnum)) == NOBODY ? "an unknown mob" : - mob_proto[real_mobile(QST_RETURNMOB(rnum))].player.short_descr); + real_mobile(QST_RETURNMOB(rnum)) == NOBODY ? "an unknown mob" : + mob_proto[real_mobile(QST_RETURNMOB(rnum))].player.short_descr); if (QST_TIME(rnum) != -1) send_to_char(ch, "Limit : There is a time limit of %d turn%s to complete.\r\n", - QST_TIME(rnum), - QST_TIME(rnum) == 1 ? "" : "s"); + QST_TIME(rnum), + QST_TIME(rnum) == 1 ? "" : "s"); else send_to_char(ch, "Limit : There is no time limit on this quest.\r\n"); send_to_char(ch, "Prior :"); @@ -762,11 +760,11 @@ ACMD(do_quest) two_arguments(argument, arg1, arg2); if (!*arg1) - send_to_char(ch, "%s\r\n", GET_LEVEL(ch) < LVL_IMMORT ? - quest_mort_usage : quest_imm_usage); + send_to_char(ch, "%s\r\n", IS_ADMIN(ch, ADMLVL_IMMORT) ? + quest_imm_usage : quest_mort_usage); else if (((tp = search_block(arg1, quest_cmd, FALSE)) == -1)) - send_to_char(ch, "%s\r\n", GET_LEVEL(ch) < LVL_IMMORT ? - quest_mort_usage : quest_imm_usage); + send_to_char(ch, "%s\r\n", IS_ADMIN(ch, ADMLVL_IMMORT) ? + quest_imm_usage : quest_mort_usage); else { switch (tp) { case SCMD_QUEST_LIST: @@ -781,18 +779,18 @@ ACMD(do_quest) quest_quit(ch); break; case SCMD_QUEST_PROGRESS: - quest_progress(ch); - break; + quest_progress(ch); + break; case SCMD_QUEST_STATUS: - if (GET_LEVEL(ch) < LVL_IMMORT) + if (!IS_ADMIN(ch, ADMLVL_IMMORT)) send_to_char(ch, "%s\r\n", quest_mort_usage); else quest_stat(ch, arg2); break; default: /* Whe should never get here, but... */ - send_to_char(ch, "%s\r\n", GET_LEVEL(ch) < LVL_IMMORT ? - quest_mort_usage : quest_imm_usage); - break; + send_to_char(ch, "%s\r\n", IS_ADMIN(ch, ADMLVL_IMMORT) ? + quest_imm_usage : quest_mort_usage); + break; } /* switch on subcmd number */ } } @@ -823,13 +821,13 @@ SPECIAL(questmaster) if (!*arg2) quest_show(ch, GET_MOB_VNUM(qm)); else - quest_list(ch, qm, arg2); + quest_list(ch, qm, arg2); break; case SCMD_QUEST_JOIN: quest_join(ch, qm, arg2); break; default: - return FALSE; /* fall through to the do_quest command processor */ + return FALSE; /* fall through to the do_quest command processor */ } /* switch on subcmd number */ return TRUE; } diff --git a/src/redit.c b/src/redit.c index ee7b28d..dc4f49f 100644 --- a/src/redit.c +++ b/src/redit.c @@ -94,7 +94,7 @@ ACMD(do_oasis_redit) /* Give the descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_oasis_redit: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_redit: Player already had olc structure."); free(d->olc); } @@ -121,7 +121,7 @@ ACMD(do_oasis_redit) if (save) { send_to_char(ch, "Saving all rooms in zone %d.\r\n", zone_table[OLC_ZNUM(d)].number); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves room info for zone %d.", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves room info for zone %d.", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number); /* Save the rooms. */ save_rooms(OLC_ZNUM(d)); @@ -144,7 +144,7 @@ ACMD(do_oasis_redit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); } @@ -170,12 +170,12 @@ void redit_setup_existing(struct descriptor_data *d, int real_num) CREATE(room, struct room_data, 1); *room = world[real_num]; - - /* Make new room people list be empty. */ - /* Fixes bug where copying a room from within that room creates */ - /* an infinite loop when you next act() in the new room (goto?) */ - /* and you are your next_in_room -- anderyu (10-05-22) */ - room->people = NULL; + + /* Make new room people list be empty. */ + /* Fixes bug where copying a room from within that room creates */ + /* an infinite loop when you next act() in the new room (goto?) */ + /* and you are your next_in_room -- anderyu (10-05-22) */ + room->people = NULL; /* Allocate space for all strings. */ room->name = str_udup(world[real_num].name); @@ -232,7 +232,7 @@ void redit_save_internally(struct descriptor_data *d) if (OLC_ROOM(d)->number == NOWHERE) new_room = TRUE; - OLC_ROOM(d)->number = OLC_NUM(d); + OLC_ROOM(d)->number = OLC_NUM(d); /* FIXME: Why is this not set elsewhere? */ OLC_ROOM(d)->zone = OLC_ZNUM(d); @@ -476,7 +476,7 @@ void redit_parse(struct descriptor_data *d, char *arg) case 'y': case 'Y': redit_save_internally(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits room %d.", GET_NAME(d->character), OLC_NUM(d)); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits room %d.", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { redit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); write_to_output(d, "Room saved to disk.\r\n"); @@ -487,8 +487,8 @@ void redit_parse(struct descriptor_data *d, char *arg) break; case 'n': case 'N': - /* If not saving, we must free the script_proto list. We do so by - * assigning it to the edited room and letting free_room in + /* If not saving, we must free the script_proto list. We do so by + * assigning it to the edited room and letting free_room in * cleanup_olc handle it. */ OLC_ROOM(d)->proto_script = OLC_SCRIPT(d); cleanup_olc(d, CLEANUP_ALL); @@ -605,7 +605,7 @@ void redit_parse(struct descriptor_data *d, char *arg) case REDIT_DESC: /* We will NEVER get here, we hope. */ - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: Reached REDIT_DESC case in parse_redit()."); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Reached REDIT_DESC case in parse_redit()."); write_to_output(d, "Oops, in REDIT_DESC.\r\n"); break; @@ -693,7 +693,7 @@ void redit_parse(struct descriptor_data *d, char *arg) case REDIT_EXIT_DESCRIPTION: /* We should NEVER get here, hopefully. */ - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: Reached REDIT_EXIT_DESC case in parse_redit"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Reached REDIT_EXIT_DESC case in parse_redit"); write_to_output(d, "Oops, in REDIT_EXIT_DESCRIPTION.\r\n"); break; @@ -740,7 +740,7 @@ void redit_parse(struct descriptor_data *d, char *arg) case REDIT_EXTRADESC_MENU: switch ((number = atoi(arg))) { case 0: - /* If something got left out, delete the extra description when backing + /* If something got left out, delete the extra description when backing out to the menu. */ if (OLC_DESC(d)->keyword == NULL || OLC_DESC(d)->description == NULL) { struct extra_descr_data *temp; @@ -795,7 +795,7 @@ void redit_parse(struct descriptor_data *d, char *arg) } else write_to_output(d, "That room does not exist.\r\n"); break; - + case REDIT_DELETE: if (*arg == 'y' || *arg == 'Y') { if (delete_room(real_room(OLC_ROOM(d)->number))) @@ -816,7 +816,7 @@ void redit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here. */ - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: Reached default case in parse_redit"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: Reached default case in parse_redit"); break; } /* If we get this far, something has been changed. */ diff --git a/src/sedit.c b/src/sedit.c index dce5be0..e14d7ae 100644 --- a/src/sedit.c +++ b/src/sedit.c @@ -57,7 +57,7 @@ ACMD(do_oasis_sedit) /* No building as a mob or while being forced. */ if (IS_NPC(ch) || !ch->desc || STATE(ch->desc) != CON_PLAYING) return; - + /* Parse any arguments. */ buf3 = two_arguments(argument, buf1, buf2); @@ -109,7 +109,7 @@ ACMD(do_oasis_sedit) /* Give the descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_sedit: Player already had olc structure."); free(d->olc); } @@ -137,7 +137,7 @@ ACMD(do_oasis_sedit) if (save) { send_to_char(ch, "Saving all shops in zone %d.\r\n", zone_table[OLC_ZNUM(d)].number); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves shop info for zone %d.", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number); @@ -163,7 +163,7 @@ ACMD(do_oasis_sedit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); } @@ -445,7 +445,7 @@ void sedit_parse(struct descriptor_data *d, char *arg) case 'y': case 'Y': sedit_save_internally(d); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits shop %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { @@ -772,12 +772,12 @@ void sedit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: sedit_parse(): Reached default case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: sedit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; } -/* If we get here, we have probably changed something, and now want to return +/* If we get here, we have probably changed something, and now want to return to main menu. Use OLC_VAL as a 'has changed' flag. */ OLC_VAL(d) = 1; sedit_disp_menu(d); diff --git a/src/shop.c b/src/shop.c index 4af3d25..3d0eb5d 100644 --- a/src/shop.c +++ b/src/shop.c @@ -513,7 +513,7 @@ static void shopping_buy(char *arg, struct char_data *ch, struct char_data *keep return; } } else { /*has the player got enough gold? */ - if (buy_price(obj, shop_nr, keeper, ch) > GET_GOLD(ch) && !IS_GOD(ch)) { + if (buy_price(obj, shop_nr, keeper, ch) > GET_GOLD(ch) && !ADM_FLAGGED(ch, ADM_MONEY)) { char actbuf[MAX_INPUT_LENGTH]; snprintf(actbuf, sizeof(actbuf), shop_index[shop_nr].missing_cash2, GET_NAME(ch)); @@ -565,7 +565,7 @@ static void shopping_buy(char *arg, struct char_data *ch, struct char_data *keep break; } } else { - while (obj && (GET_GOLD(ch) >= buy_price(obj, shop_nr, keeper, ch) || IS_GOD(ch)) + while (obj && (GET_GOLD(ch) >= buy_price(obj, shop_nr, keeper, ch) || ADM_FLAGGED(ch, ADM_MONEY)) && IS_CARRYING_N(ch) < CAN_CARRY_N(ch) && bought < buynum && IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj) <= CAN_CARRY_W(ch)) { int charged; @@ -582,7 +582,7 @@ static void shopping_buy(char *arg, struct char_data *ch, struct char_data *keep charged = buy_price(obj, shop_nr, keeper, ch); goldamt += charged; - if (!IS_GOD(ch)) + if (!ADM_FLAGGED(ch, ADM_MONEY)) GET_GOLD(ch) -= charged; last_obj = obj; diff --git a/src/shop.h b/src/shop.h index 50ed8a7..10bcede 100644 --- a/src/shop.h +++ b/src/shop.h @@ -1,13 +1,13 @@ /** * @file shop.h * Shop file definitions, structures, constants. -* +* * Part of the core tbaMUD source code distribution, which is a derivative * of, and continuation of, CircleMUD. -* -* All rights reserved. See license for complete information. -* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University -* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. +* +* All rights reserved. See license for complete information. +* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University +* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. */ #ifndef _SHOP_H_ #define _SHOP_H_ @@ -59,7 +59,7 @@ struct shop_data { #define MAX_SHOP_OBJ 100 /* "Soft" maximum for list maximums */ /* Pretty general macros that could be used elsewhere */ -#define IS_GOD(ch) (!IS_NPC(ch) && (GET_LEVEL(ch) >= LVL_GOD)) +#define IS_GOD(ch) (IS_ADMIN(ch, ADMLVL_GOD)) #define END_OF(buffer) ((buffer) + strlen((buffer))) /* Possible states for objects trying to be sold */ diff --git a/src/spec_procs.c b/src/spec_procs.c index 67fa0e8..5f2dfef 100644 --- a/src/spec_procs.c +++ b/src/spec_procs.c @@ -8,7 +8,7 @@ * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * **************************************************************************/ -/* For more examples: +/* For more examples: * ftp://ftp.circlemud.org/pub/CircleMUD/contrib/snippets/specials */ #include "conf.h" @@ -299,7 +299,7 @@ static void npc_steal(struct char_data *ch, struct char_data *victim) if (IS_NPC(victim)) return; - if (GET_LEVEL(victim) >= LVL_IMMORT) + if (ADM_FLAGGED(victim, ADM_NOSTEAL)) return; if (!CAN_SEE(ch, victim)) return; @@ -340,7 +340,7 @@ SPECIAL(thief) return (FALSE); for (cons = world[IN_ROOM(ch)].people; cons; cons = cons->next_in_room) - if (!IS_NPC(cons) && GET_LEVEL(cons) < LVL_IMMORT && !rand_number(0, 4)) { + if (!ADM_FLAGGED(cons, ADM_NOSTEAL) && !rand_number(0, 4)) { npc_steal(ch, cons); return (TRUE); } @@ -419,43 +419,43 @@ SPECIAL(magic_user) } /* Special procedures for mobiles. */ -SPECIAL(guild_guard) -{ - int i, direction; - struct char_data *guard = (struct char_data *)me; - const char *buf = "The guard humiliates you, and blocks your way.\r\n"; - const char *buf2 = "The guard humiliates $n, and blocks $s way."; +SPECIAL(guild_guard) +{ + int i, direction; + struct char_data *guard = (struct char_data *)me; + const char *buf = "The guard humiliates you, and blocks your way.\r\n"; + const char *buf2 = "The guard humiliates $n, and blocks $s way."; - if (!IS_MOVE(cmd) || AFF_FLAGGED(guard, AFF_BLIND)) - return (FALSE); - - if (GET_LEVEL(ch) >= LVL_IMMORT) - return (FALSE); - - /* find out what direction they are trying to go */ - for (direction = 0; direction < NUM_OF_DIRS; direction++) - if (!strcmp(cmd_info[cmd].command, dirs[direction])) - break; + if (!IS_MOVE(cmd) || AFF_FLAGGED(guard, AFF_BLIND)) + return (FALSE); - for (i = 0; guild_info[i].guild_room != NOWHERE; i++) { - /* Wrong guild. */ - if (GET_ROOM_VNUM(IN_ROOM(ch)) != guild_info[i].guild_room) - continue; + if (ADM_FLAGGED(ch, ADM_WALKANYWHERE)) + return (FALSE); - /* Wrong direction. */ - if (direction != guild_info[i].direction) - continue; + /* find out what direction they are trying to go */ + for (direction = 0; direction < NUM_OF_DIRS; direction++) + if (!strcmp(cmd_info[cmd].command, dirs[direction])) + break; - /* Allow the people of the guild through. */ - if (!IS_NPC(ch) && GET_CLASS(ch) == guild_info[i].pc_class) - continue; - - send_to_char(ch, "%s", buf); - act(buf2, FALSE, ch, 0, 0, TO_ROOM); - return (TRUE); - } - return (FALSE); -} + for (i = 0; guild_info[i].guild_room != NOWHERE; i++) { + /* Wrong guild. */ + if (GET_ROOM_VNUM(IN_ROOM(ch)) != guild_info[i].guild_room) + continue; + + /* Wrong direction. */ + if (direction != guild_info[i].direction) + continue; + + /* Allow the people of the guild through. */ + if (!IS_NPC(ch) && GET_CLASS(ch) == guild_info[i].pc_class) + continue; + + send_to_char(ch, "%s", buf); + act(buf2, FALSE, ch, 0, 0, TO_ROOM); + return (TRUE); + } + return (FALSE); +} SPECIAL(puff) { @@ -542,13 +542,15 @@ SPECIAL(cityguard) continue; if (!IS_NPC(tch) && PLR_FLAGGED(tch, PLR_KILLER)) { act("$n screams 'HEY!!! You're one of those PLAYER KILLERS!!!!!!'", FALSE, ch, 0, 0, TO_ROOM); - hit(ch, tch, TYPE_UNDEFINED); + if (!ADM_FLAGGED(tch, ADM_NODAMAGE)) + hit(ch, tch, TYPE_UNDEFINED); return (TRUE); } if (!IS_NPC(tch) && PLR_FLAGGED(tch, PLR_THIEF)) { act("$n screams 'HEY!!! You're one of those PLAYER THIEVES!!!!!!'", FALSE, ch, 0, 0, TO_ROOM); - hit(ch, tch, TYPE_UNDEFINED); + if (!ADM_FLAGGED(tch, ADM_NODAMAGE)) + hit(ch, tch, TYPE_UNDEFINED); return (TRUE); } diff --git a/src/spell_parser.c b/src/spell_parser.c index 9e42297..5da8b03 100644 --- a/src/spell_parser.c +++ b/src/spell_parser.c @@ -604,7 +604,7 @@ ACMD(do_cast) return; } mana = mag_manacost(ch, spellnum); - if ((mana > 0) && (GET_MANA(ch) < mana) && (GET_LEVEL(ch) < LVL_IMMORT)) { + if ((mana > 0) && (GET_MANA(ch) < mana) && (!IS_ADMIN(ch, ADMLVL_IMMORT))) { send_to_char(ch, "You haven't the energy to cast that spell!\r\n"); return; } @@ -642,9 +642,9 @@ void spell_level(int spell, int chclass, int level) bad = 1; } - if (level < 1 || level > LVL_IMPL) { + if (level < 1 || level > CONFIG_MAX_LEVEL) { log("SYSERR: assigning '%s' to illegal level %d/%d.", skill_name(spell), - level, LVL_IMPL); + level, CONFIG_MAX_LEVEL); bad = 1; } @@ -660,7 +660,7 @@ static void spello(int spl, const char *name, int max_mana, int min_mana, int i; for (i = 0; i < NUM_CLASSES; i++) - spell_info[spl].min_level[i] = LVL_IMMORT; + spell_info[spl].min_level[i] = (CONFIG_MAX_LEVEL + 1); spell_info[spl].mana_max = max_mana; spell_info[spl].mana_min = min_mana; spell_info[spl].mana_change = mana_change; @@ -677,7 +677,7 @@ void unused_spell(int spl) int i; for (i = 0; i < NUM_CLASSES; i++) - spell_info[spl].min_level[i] = LVL_IMPL + 1; + spell_info[spl].min_level[i] = (CONFIG_MAX_LEVEL + 1); spell_info[spl].mana_max = 0; spell_info[spl].mana_min = 0; spell_info[spl].mana_change = 0; diff --git a/src/spells.c b/src/spells.c index 2d2b5bd..26aa033 100644 --- a/src/spells.c +++ b/src/spells.c @@ -109,7 +109,7 @@ ASPELL(spell_summon) if (ch == NULL || victim == NULL) return; - if (GET_LEVEL(victim) > MIN(LVL_IMMORT - 1, level + 3)) { + if (GET_LEVEL(victim) > MIN(CONFIG_MAX_LEVEL, level + 3)) { send_to_char(ch, "%s", SUMMON_FAIL); return; } @@ -137,7 +137,7 @@ ASPELL(spell_summon) (ch->player.sex == SEX_MALE) ? "He" : "She"); send_to_char(ch, "You failed because %s has summon protection on.\r\n", GET_NAME(victim)); - mudlog(BRF, LVL_IMMORT, TRUE, "%s failed summoning %s to %s.", GET_NAME(ch), GET_NAME(victim), world[IN_ROOM(ch)].name); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "%s failed summoning %s to %s.", GET_NAME(ch), GET_NAME(victim), world[IN_ROOM(ch)].name); return; } } diff --git a/src/structs.h b/src/structs.h index 9e017a1..2259024 100644 --- a/src/structs.h +++ b/src/structs.h @@ -106,6 +106,7 @@ #define EX_CLOSED (1 << 1) /**< The door is closed */ #define EX_LOCKED (1 << 2) /**< The door is locked */ #define EX_PICKPROOF (1 << 3) /**< Lock can't be picked */ +#define EX_HIDDEN (1 << 4) /**< Exit is hidden */ /* Sector types: used in room_data.sector_type */ #define SECT_INSIDE 0 /**< Indoors, connected to SECT macro. */ @@ -256,8 +257,9 @@ #define PRF_AUTOMAP 31 /**< Show map at the side of room descs */ #define PRF_AUTOKEY 32 /**< Automatically unlock locked doors when opening */ #define PRF_AUTODOOR 33 /**< Use the next available door */ +#define PRF_MORTAL 34 /**< Mortal flag turns off all imm powers */ /** Total number of available PRF flags */ -#define NUM_PRF_FLAGS 34 +#define NUM_PRF_FLAGS 35 /* Affect bits: used in char_data.char_specials.saved.affected_by */ /* WARNING: In the world files, NEVER set the bits marked "R" ("Reserved") */ @@ -287,6 +289,38 @@ /** Total number of affect flags not including the don't use flag. */ #define NUM_AFF_FLAGS 22 +/* + * ADM flags - define admin privs for chars. Comments show default admin level. + */ +#define ADM_NONE -1 /* Special case used in command list MORTAL */ +#define ADM_TELLALL 0 /* Can use 'tell all' to broadcast GOD */ +#define ADM_SEEINV 1 /* Sees other chars inventory IMM */ +#define ADM_SEESECRET 2 /* Sees secret objects, mobs and doors IMM */ +#define ADM_KNOWWEATHER 3 /* Knows details of weather GOD */ +#define ADM_FULLWHERE 4 /* Full output of 'where' command IMM */ +#define ADM_MONEY 5 /* Char has a bottomless wallet GOD */ +#define ADM_EATANYTHING 6 /* Char can eat anything GOD */ +#define ADM_NOPOISON 7 /* Char can't be poisoned IMM */ +#define ADM_WALKANYWHERE 8 /* Char has unrestricted walking IMM */ +#define ADM_NOKEYS 9 /* Char needs no keys for locks GOD */ +#define ADM_INSTANTKILL 10 /* "kill" command is instant IMPL */ +#define ADM_NOSTEAL 11 /* Char cannot be stolen from IMM */ +#define ADM_TRANSALL 12 /* Can use 'trans all' GRGOD */ +#define ADM_SWITCHMORTAL 13 /* Can 'switch' to a PC's linkless body IMPL */ +#define ADM_FORCEMASS 14 /* Can force rooms or all GRGOD */ +#define ADM_ALLHOUSES 15 /* Can enter any house GRGOD */ +#define ADM_NODAMAGE 16 /* Cannot be damaged IMM */ +#define ADM_ALLSHOPS 17 /* Can use all shops GOD */ +#define ADM_CEDIT 18 /* Can use cedit IMPL */ +#define ADM_BUILD 19 /* Can use basic building tools BUILDER */ +#define ADM_ADVBUILD 20 /* Can use advanced building tools BUILDER */ +#define ADM_POOF 21 /* Can use goto and set poof messages IMM */ +#define ADM_ADMIN 22 /* Can use the admin command to set privs IMPL */ +#define ADM_SETQP 23 /* Can 'set' a player's questpoints GRGOD */ +#define ADM_ADVIBT 24 /* Advanced IBT (ideas, bugs, typos) control GRGOD */ + +#define NUM_ADMFLAGS 25 + /* Modes of connectedness: used by descriptor_data.state */ #define CON_PLAYING 0 /**< Playing - Nominal state */ #define CON_CLOSE 1 /**< User disconnect, remove character. */ @@ -512,6 +546,7 @@ #define TW_ARRAY_MAX 4 /**< # Bytes in Bit vector - Obj Wear Locations */ #define EF_ARRAY_MAX 4 /**< # Bytes in Bit vector - Obj Extra Flags */ #define ZN_ARRAY_MAX 4 /**< # Bytes in Bit vector - Zone Flags */ +#define AD_ARRAY_MAX 4 /**< # Bytes in Bit vector - Admin Priv Flags */ /* other #defined constants */ /* **DO**NOT** blindly change the number of levels in your MUD merely by @@ -519,15 +554,16 @@ * Other changes throughout the code are required. See coding.doc for details. * * LVL_IMPL should always be the HIGHEST possible immortal level, and - * LVL_IMMORT should always be the LOWEST immortal level. The number of - * mortal levels will always be LVL_IMMORT - 1. */ -#define LVL_IMPL 34 /**< Level of Implementors */ -#define LVL_GRGOD 33 /**< Level of Greater Gods */ -#define LVL_GOD 32 /**< Level of Gods */ -#define LVL_IMMORT 31 /**< Level of Immortals */ + * LVL_IMMORT should always be the LOWEST immortal level. The only + * mortal level will always be zero, or LVL_IMMORT - 1. */ +#define ADMLVL_IMPL 4 /**< Level of Implementors */ +#define ADMLVL_GRGOD 3 /**< Level of Greater Gods */ +#define ADMLVL_GOD 2 /**< Level of Gods */ +#define ADMLVL_IMMORT 1 /**< Level of Immortals */ +#define ADMLVL_MORTAL 0 /**< Level of Mortals */ /** Minimum level to build and to run the saveall command */ -#define LVL_BUILDER LVL_IMMORT +#define ADMLVL_BUILDER ADMLVL_IMMORT /** Arbitrary number that won't be in a string */ #define MAGIC_NUMBER (0x06) @@ -841,7 +877,7 @@ struct char_player_data char *title; /**< PC / NPC title */ byte sex; /**< PC / NPC sex */ byte chclass; /**< PC / NPC class */ - byte level; /**< PC / NPC level */ + ubyte level; /**< PC / NPC level */ struct time_data time; /**< PC AGE in days */ ubyte weight; /**< PC / NPC weight */ ubyte height; /**< PC / NPC height */ @@ -916,7 +952,9 @@ struct char_special_data /** Data only needed by PCs, and needs to be saved to disk. */ struct player_special_data_saved { - byte skills[MAX_SKILLS+1]; /**< Character skills. */ + byte adm_level; /**< PC Admin level */ + int admflags[AD_ARRAY_MAX]; /**< Admin Priv flags */ + byte skills[MAX_SKILLS+1]; /**< Character skills. */ int wimp_level; /**< Below this # of hit points, flee! */ byte freeze_level; /**< Level of god who froze char, if any */ sh_int invis_level; /**< level of invisibility */ @@ -1267,6 +1305,7 @@ struct game_data int max_exp_loss; /**< Maximum experience losable per death.*/ int max_npc_corpse_time; /**< Num tics before NPC corpses decompose*/ int max_pc_corpse_time; /**< Num tics before PC corpse decomposes.*/ + int max_mortal_level; /**< Maximum level that a mortal can obtain.*/ int idle_void; /**< Num tics before PC sent to void(idle)*/ int idle_rent_time; /**< Num tics before PC is autorented. */ int idle_max_level; /**< Level of players immune to idle. */ diff --git a/src/tedit.c b/src/tedit.c index e3fdc01..3ccb331 100644 --- a/src/tedit.c +++ b/src/tedit.c @@ -31,14 +31,14 @@ void tedit_string_cleanup(struct descriptor_data *d, int terminator) switch (terminator) { case STRINGADD_SAVE: if (!(fl = fopen(storage, "w"))) - mudlog(CMP, LVL_IMPL, TRUE, "SYSERR: Can't write file '%s'.", storage); + mudlog(CMP, ADMLVL_IMPL, TRUE, "SYSERR: Can't write file '%s'.", storage); else { if (*d->str) { strip_cr(*d->str); fputs(*d->str, fl); } fclose(fl); - mudlog(CMP, LVL_GOD, TRUE, "OLC: %s saves '%s'.", GET_NAME(d->character), storage); + mudlog(CMP, ADMLVL_GOD, TRUE, "OLC: %s saves '%s'.", GET_NAME(d->character), storage); write_to_output(d, "Saved.\r\n"); if (!strcmp(storage, NEWS_FILE)) newsmod = time(0); @@ -74,20 +74,20 @@ ACMD(do_tedit) char *filename; } fields[] = { /* edit the lvls to your own needs */ - { "credits", LVL_IMPL, &credits, 2400, CREDITS_FILE}, - { "news", LVL_GRGOD, &news, 8192, NEWS_FILE}, - { "motd", LVL_GRGOD, &motd, 2400, MOTD_FILE}, - { "imotd", LVL_IMPL, &imotd, 2400, IMOTD_FILE}, - { "greetings", LVL_IMPL, &GREETINGS, 2400, GREETINGS_FILE}, - { "help", LVL_GRGOD, &help, 2400, HELP_PAGE_FILE}, - { "ihelp", LVL_GRGOD, &ihelp, 2400, IHELP_PAGE_FILE}, - { "info", LVL_GRGOD, &info, 8192, INFO_FILE}, - { "background", LVL_IMPL, &background, 8192, BACKGROUND_FILE}, - { "handbook", LVL_IMPL, &handbook, 8192, HANDBOOK_FILE}, - { "policies", LVL_IMPL, &policies, 8192, POLICIES_FILE}, - { "wizlist", LVL_IMPL, &wizlist, 2400, WIZLIST_FILE}, - { "immlist", LVL_GRGOD, &immlist, 2400, IMMLIST_FILE}, - { "\n", 0, NULL, 0, NULL } + { "credits", ADMLVL_IMPL, &credits, 2400, CREDITS_FILE}, + { "news", ADMLVL_GRGOD, &news, 8192, NEWS_FILE}, + { "motd", ADMLVL_GRGOD, &motd, 2400, MOTD_FILE}, + { "imotd", ADMLVL_IMPL, &imotd, 2400, IMOTD_FILE}, + { "greetings", ADMLVL_IMPL, &GREETINGS, 2400, GREETINGS_FILE}, + { "help", ADMLVL_GRGOD, &help, 2400, HELP_PAGE_FILE}, + { "ihelp", ADMLVL_GRGOD, &ihelp, 2400, IHELP_PAGE_FILE}, + { "info", ADMLVL_GRGOD, &info, 8192, INFO_FILE}, + { "background", ADMLVL_IMPL, &background, 8192, BACKGROUND_FILE}, + { "handbook", ADMLVL_IMPL, &handbook, 8192, HANDBOOK_FILE}, + { "policies", ADMLVL_IMPL, &policies, 8192, POLICIES_FILE}, + { "wizlist", ADMLVL_IMPL, &wizlist, 2400, WIZLIST_FILE}, + { "immlist", ADMLVL_GRGOD, &immlist, 2400, IMMLIST_FILE}, + { "\n", ADMLVL_MORTAL, NULL, 0, NULL } }; if (ch->desc == NULL) @@ -98,10 +98,10 @@ ACMD(do_tedit) if (!*field) { send_to_char(ch, "Files available to be edited:\r\n"); for (l = 0; *fields[l].cmd != '\n'; l++) { - if (GET_LEVEL(ch) >= fields[l].level) { - send_to_char(ch, "%-11.11s ", fields[l].cmd); - if (!(++i % 7)) - send_to_char(ch, "\r\n"); + if (GET_ADMLEVEL(ch) >= fields[l].level) { + send_to_char(ch, "%-11.11s ", fields[l].cmd); + if (!(++i % 7)) + send_to_char(ch, "\r\n"); } } if (i % 7) @@ -119,7 +119,7 @@ ACMD(do_tedit) return; } - if (GET_LEVEL(ch) < fields[l].level) { + if (GET_ADMLEVEL(ch) < fields[l].level) { send_to_char(ch, "You are not godly enough for that!\r\n"); return; } @@ -130,7 +130,7 @@ ACMD(do_tedit) send_to_char(ch, "Edit file below:\r\n\r\n"); if (ch->desc->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_tedit: Player already had olc structure."); + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_tedit: Player already had olc structure."); free(ch->desc->olc); } CREATE(ch->desc->olc, struct oasis_olc_data, 1); diff --git a/src/util/autowiz.c b/src/util/autowiz.c index f5f0209..9c84e74 100755 --- a/src/util/autowiz.c +++ b/src/util/autowiz.c @@ -16,10 +16,10 @@ #define IMM_LMARG " " #define IMM_NSIZE 16 #define LINE_LEN 64 -#define MIN_LEVEL LVL_IMMORT +#define MIN_LEVEL ADMLVL_IMMORT /* max level that should be in columns instead of centered */ -#define COL_LEVEL LVL_IMMORT +#define COL_LEVEL ADMLVL_IMMORT struct name_rec { char name[25]; @@ -39,10 +39,10 @@ struct level_rec { struct control_rec level_params[] = { - {LVL_IMMORT, "Immortals"}, - {LVL_GOD, "Gods"}, - {LVL_GRGOD, "Greater Gods"}, - {LVL_IMPL, "Implementors"}, + {ADMLVL_IMMORT, "Immortals"}, + {ADMLVL_GOD , "Gods"}, + {ADMLVL_GRGOD , "Greater Gods"}, + {ADMLVL_IMPL , "Implementors"}, {0, ""} }; @@ -70,7 +70,7 @@ void read_file(void) bitvector_t asciiflag_conv(char *flag); FILE *fl; - int recs, i, last = 0, level = 0, flags = 0; + int recs, i, last = 0, level = 0, flags = 0, admlevel = 0; char index_name[40], line[256], bits[64]; char name[MAX_NAME_LENGTH]; long id = 0; @@ -89,13 +89,14 @@ void read_file(void) for (i = 0; i < recs; i++) { get_line(fl, line); - sscanf(line, "%ld %s %d %s %d", &id, name, &level, bits, &last); + sscanf(line, "%ld %s %d %d %s %d", &id, name, &level, &admlevel, bits, &last); CAP(name); flags = asciiflag_conv(bits); if (level >= MIN_LEVEL && !(IS_SET(flags, PINDEX_NOWIZLIST)) && - !(IS_SET(flags, PINDEX_DELETED))) - add_name(level, name); + !(IS_SET(flags, PINDEX_DELETED)) && + !(IS_SET(flags, PINDEX_MORTAL)) ) + add_name(admlevel, name); } fclose(fl); } @@ -232,7 +233,7 @@ int main(int argc, char **argv) sort_names(); fl = fopen(argv[2], "w"); - write_wizlist(fl, wizlevel, LVL_IMPL); + write_wizlist(fl, wizlevel, ADMLVL_IMPL); fclose(fl); fl = fopen(argv[4], "w"); @@ -253,9 +254,9 @@ char *CAP(char *txt) return (txt); } -/* get_line reads the next non-blank line off of the input stream. The newline - * character is removed from the input. Lines which begin with '*' are - * considered to be comments. Returns the number of lines advanced in the +/* get_line reads the next non-blank line off of the input stream. The newline + * character is removed from the input. Lines which begin with '*' are + * considered to be comments. Returns the number of lines advanced in the * file. */ int get_line(FILE * fl, char *buf) { diff --git a/src/util/plrtoascii.c b/src/util/plrtoascii.c index 87a354f..eb9043e 100755 --- a/src/util/plrtoascii.c +++ b/src/util/plrtoascii.c @@ -23,6 +23,8 @@ #define MAX_SKILLS 200 /* Used in char_file_u *DO*NOT*CHANGE* */ #define MAX_AFFECT 32 /* Used in char_file_u *DO*NOT*CHANGE* */ +#define MAX_LEVEL 30 /* Same as CONFIG_MAX_LEVEL */ + /* Char's abilities. Used in char_file_u *DO*NOT*CHANGE* */ struct char_ability_data_plrtoascii { sbyte str; @@ -54,7 +56,7 @@ struct char_point_data_plrtoascii { }; -/* +/* * char_special_data_saved: specials which both a PC and an NPC have in * common, but which must be saved to the playerfile for PC's. * @@ -186,7 +188,7 @@ void convert(char *filename) exit(1); printf("writing: %s\n", outname); - fprintf(index_file, "%ld %s %d 0 %ld\n", + fprintf(index_file, "%ld %s %d 0 %ld\n", player.char_specials_saved.idnum, bits, player.level, (long)player.last_logon); @@ -205,11 +207,13 @@ void convert(char *filename) if (player.description && *player.description) fprintf(outfile, "Desc:\n%s~\n", player.description); if (player.sex != PFDEF_SEX) - fprintf(outfile, "Sex : %d\n", (int)player.sex); + fprintf(outfile, "Sex : %d\n", (int)player.sex); if (player.chclass != PFDEF_CLASS) - fprintf(outfile, "Clas: %d\n", (int)player.chclass); + fprintf(outfile, "Clas: %d\n", (int)player.chclass); if (player.level != PFDEF_LEVEL) - fprintf(outfile, "Levl: %d\n", (int)player.level); + fprintf(outfile, "Levl: %d\n", (int)player.level); + if (player.level > MAX_LEVEL) + fprintf(outfile, "Admn: %d\n", (int)(player.level-MAX_LEVEL)); fprintf(outfile, "Brth: %d\n", (int)player.birth); fprintf(outfile, "Plyd: %d\n", (int)player.played); fprintf(outfile, "Last: %d\n", (int)player.last_logon); @@ -243,7 +247,7 @@ void convert(char *filename) /* player_special_data_saved */ psds = &(player.player_specials_saved); - if (player.level < LVL_IMMORT) { + if (player.level < (ADMLVL_IMMORT+MAX_LEVEL)) { fprintf(outfile, "Skil:\n"); for (i = 1; i <= MAX_SKILLS; i++) { if (psds->skills[i]) @@ -263,13 +267,13 @@ void convert(char *filename) sprintascii(bits, psds->pref); fprintf(outfile, "Pref: %s\n", bits); } - if (psds->conditions[HUNGER] && player.level < LVL_IMMORT && + if (psds->conditions[HUNGER] && player.level < (ADMLVL_IMMORT+MAX_LEVEL) && psds->conditions[HUNGER] != PFDEF_HUNGER) fprintf(outfile, "Hung: %d\n", (int)psds->conditions[0]); - if (psds->conditions[THIRST] && player.level < LVL_IMMORT && + if (psds->conditions[THIRST] && player.level < (ADMLVL_IMMORT+MAX_LEVEL) && psds->conditions[THIRST] != PFDEF_THIRST) fprintf(outfile, "Thir: %d\n", (int)psds->conditions[1]); - if (psds->conditions[2] && player.level < LVL_IMMORT && + if (psds->conditions[2] && player.level < (ADMLVL_IMMORT+MAX_LEVEL) && psds->conditions[DRUNK] != PFDEF_DRUNK) fprintf(outfile, "Drnk: %d\n", (int)psds->conditions[2]); if (psds->spells_to_learn != PFDEF_PRACTICES) diff --git a/src/utils.c b/src/utils.c index 3c7bc2c..578e2cf 100644 --- a/src/utils.c +++ b/src/utils.c @@ -22,7 +22,7 @@ #include "handler.h" #include "interpreter.h" #include "class.h" - +#include "act.h" /** Aportable random number function. * @param from The lower bounds of the random number. @@ -286,7 +286,7 @@ void mudlog(int type, int level, int file, const char *str, ...) for (i = descriptor_list; i; i = i->next) { if (STATE(i) != CON_PLAYING || IS_NPC(i->character)) /* switch */ continue; - if (GET_LEVEL(i->character) < level) + if (GET_ADMLEVEL(i->character) < level) continue; if (PLR_FLAGGED(i->character, PLR_WRITING)) continue; @@ -1480,4 +1480,39 @@ int get_class_by_name(char *classname) if (is_abbrev(classname, pc_class_types[i])) return(i); return (-1); -} \ No newline at end of file +} + +bool set_admin_level(struct char_data *ch, int admlvl) +{ + int old_lvl, i; + + /* Validate the data */ + if (!ch || IS_NPC(ch)) return FALSE; + if ((admlvl < ADMLVL_MORTAL) || (admlvl > ADMLVL_IMPL)) return FALSE; + + /* Grab the old level */ + old_lvl = GET_ADMLEVEL(ch); + + /* Set player data */ + ch->player_specials->saved.adm_level = admlvl; + + /* Set default privs for the new level */ + set_default_admin_privs(ch, FALSE); + + /* Set player index */ + for (i = 0; i <= top_of_p_table; i++) { + if (player_table[i].id == GET_IDNUM(ch)) { + player_table[i].admlevel = admlvl; + } + } + + /* Save all the data */ + save_char(ch); + save_player_index(); + + if (!PLR_FLAGGED(ch, PLR_NOWIZLIST) && old_lvl != admlvl) { + run_autowiz(); + } + + return TRUE; +} diff --git a/src/utils.h b/src/utils.h index 1c51dcb..d63b52e 100644 --- a/src/utils.h +++ b/src/utils.h @@ -68,6 +68,7 @@ char *strfrmt(char *str, int w, int h, int justify, int hpad, int vpad); char *strpaste(char *str1, char *str2, char *joiner); void new_affect(struct affected_type *af); int get_class_by_name(char *classname); +bool set_admin_level(struct char_data *ch, int admlvl); /* Public functions made available form weather.c */ void weather_and_time(int mode); @@ -362,6 +363,8 @@ do \ #define PRF_FLAGS(ch) CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.pref)) /** Affect flags on the NPC or PC. */ #define AFF_FLAGS(ch) ((ch)->char_specials.saved.affected_by) +/** Admin Priv flags on a player (not to be used on mobs). */ +#define ADM_FLAGS(ch) CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.admflags)) /** Room flags. * @param loc The real room number. */ #define ROOM_FLAGS(loc) (world[(loc)].room_flags) @@ -396,6 +399,9 @@ do \ #define AFF_FLAGGED(ch, flag) (IS_SET_AR(AFF_FLAGS(ch), (flag))) /** 1 if flag is set in the preferences bitarray, 0 if not. */ #define PRF_FLAGGED(ch, flag) (IS_SET_AR(PRF_FLAGS(ch), (flag))) +/** 1 if flag is set in the admin privs bitarray, 0 if not. */ +#define ADM_FLAGGED(ch, flag) (!IS_NPC(ch) && (!PRF_FLAGGED((ch), PRF_MORTAL)) && \ + (IS_SET_AR(ADM_FLAGS(ch), (flag))) ) /** 1 if flag is set in the room of loc, 0 if not. */ #define ROOM_FLAGGED(loc, flag) (IS_SET_AR(ROOM_FLAGS(loc), (flag))) /** 1 if flag is set in the zone of rnum, 0 if not. */ @@ -417,6 +423,10 @@ do \ /** IS_AFFECTED for backwards compatibility */ #define IS_AFFECTED(ch, skill) (AFF_FLAGGED((ch), (skill))) +/** IS_ADMIN checks admin level and mortal flag */ +#define IS_ADMIN(ch, lvl) (!IS_NPC(ch) && (!PRF_FLAGGED((ch), PRF_MORTAL)) && \ + (GET_ADMLEVEL(ch) >= (lvl))) + /** Toggle flag in ch PLR_FLAGS' turns on if off, or off if on. */ #define PLR_TOG_CHK(ch,flag) ((TOGGLE_BIT_AR(PLR_FLAGS(ch), (flag))) & Q_BIT(flag)) /** Toggle flag in ch PRF_FLAGS; turns on if off, or off if on. */ @@ -464,19 +474,27 @@ do \ (ch)->player.short_descr : GET_PC_NAME(ch)) /** Title of PC */ #define GET_TITLE(ch) ((ch)->player.title) -/** Level of PC or NPC. */ +/** Mortal Level of PC or NPC. */ #define GET_LEVEL(ch) ((ch)->player.level) +/** Admin Level of PC. */ +#define GET_ADMLEVEL(ch) CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.adm_level)) /** Password of PC. */ #define GET_PASSWD(ch) ((ch)->player.passwd) /** The player file position of PC. */ #define GET_PFILEPOS(ch)((ch)->pfilepos) -/** Gets the level of a player even if the player is switched. +/** Gets the mortal level of a player even if the player is switched. * @todo Make this the definition of GET_LEVEL. */ #define GET_REAL_LEVEL(ch) \ (ch->desc && ch->desc->original ? GET_LEVEL(ch->desc->original) : \ GET_LEVEL(ch)) +/** Gets the admin level of a player even if the player is switched. + * @todo Make this the definition of GET_LEVEL. */ +#define GET_REAL_ADMLEVEL(ch) \ + (ch->desc && ch->desc->original ? GET_ADMLEVEL(ch->desc->original) : \ + (IS_NPC(ch) ? ADMLVL_MORTAL : GET_ADMLEVEL(ch))) + /** Class of ch. */ #define GET_CLASS(ch) ((ch)->player.chclass) /** Height of ch. */ @@ -753,7 +771,7 @@ do \ /** Defines if there is enough light for sub to see in. */ #define LIGHT_OK(sub) (!AFF_FLAGGED(sub, AFF_BLIND) && \ (IS_LIGHT(IN_ROOM(sub)) || AFF_FLAGGED((sub), AFF_INFRAVISION) || \ - GET_LEVEL(sub) >= LVL_IMMORT)) + IS_ADMIN(sub, ADMLVL_IMMORT))) /** Defines if sub character can see the invisible obj character. */ #define INVIS_OK(sub, obj) \ @@ -774,7 +792,7 @@ do \ /** Can sub character see obj character? */ #define CAN_SEE(sub, obj) (SELF(sub, obj) || \ - ((GET_REAL_LEVEL(sub) >= (IS_NPC(obj) ? 0 : GET_INVIS_LEV(obj))) && \ + ((GET_REAL_ADMLEVEL(sub) >= (IS_NPC(obj) ? 0 : GET_INVIS_LEV(obj))) && \ IMM_CAN_SEE(sub, obj))) /* End of CAN_SEE */ @@ -806,7 +824,7 @@ do \ CAN_SEE_OBJ((ch),(obj))) /** If vict can see ch, return ch name, else return "someone". */ -#define PERS(ch, vict) (CAN_SEE(vict, ch) ? GET_NAME(ch) : (GET_LEVEL(ch) > LVL_IMMORT ? "an immortal" : "someone")) +#define PERS(ch, vict) (CAN_SEE(vict, ch) ? GET_NAME(ch) : (GET_ADMLEVEL(ch) > ADMLVL_IMMORT ? "an immortal" : "someone")) /** If vict can see obj, return obj short description, else return * "something". */ @@ -934,6 +952,8 @@ do \ #define CONFIG_MAX_NPC_CORPSE_TIME config_info.play.max_npc_corpse_time /** How long will pc corpses last before decomposing? */ #define CONFIG_MAX_PC_CORPSE_TIME config_info.play.max_pc_corpse_time +/** What is the highest level a mortal can obtain? */ +#define CONFIG_MAX_LEVEL config_info.play.max_mortal_level /** How long can a pc be idled before being pulled into the void? */ #define CONFIG_IDLE_VOID config_info.play.idle_void /** How long until the idle pc is force rented? */ diff --git a/src/zedit.c b/src/zedit.c index 3983e30..ec804e1 100644 --- a/src/zedit.c +++ b/src/zedit.c @@ -74,7 +74,7 @@ ACMD(do_oasis_zedit) send_to_char(ch, "Save which zone?\r\n"); return; } - } else if (GET_LEVEL(ch) >= LVL_IMPL) { + } else if (IS_ADMIN(ch, ADMLVL_IMPL)) { if (str_cmp("new", buf1) || !stop || !*stop) send_to_char(ch, "Format: zedit new " "\r\n"); @@ -122,7 +122,7 @@ ACMD(do_oasis_zedit) /* Give the builder's descriptor an OLC structure. */ if (d->olc) { - mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: do_oasis_zedit: Player already " + mudlog(BRF, ADMLVL_IMMORT, TRUE, "SYSERR: do_oasis_zedit: Player already " "had olc structure."); free(d->olc); } @@ -153,7 +153,7 @@ ACMD(do_oasis_zedit) if (save) { send_to_char(ch, "Saving all zone information for zone %d.\r\n", zone_table[OLC_ZNUM(d)].number); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s saves zone information for zone %d.", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number); @@ -183,7 +183,7 @@ ACMD(do_oasis_zedit) act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING); - mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", + mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch)); } @@ -279,7 +279,7 @@ static void zedit_new_zone(struct char_data *ch, zone_vnum vzone_num, room_vnum zedit_save_to_disk(result); /* save to disk .. */ - mudlog(BRF, MAX(LVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s creates new zone #%d", GET_NAME(ch), vzone_num); + mudlog(BRF, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(ch)), TRUE, "OLC: %s creates new zone #%d", GET_NAME(ch), vzone_num); write_to_output(ch->desc, "Zone created successfully.\r\n"); } @@ -601,7 +601,7 @@ static void zedit_disp_arg1(struct descriptor_data *d) default: /* We should never get here. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: zedit_disp_arg1(): Help!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: zedit_disp_arg1(): Help!"); write_to_output(d, "Oops...\r\n"); return; } @@ -641,7 +641,7 @@ static void zedit_disp_arg2(struct descriptor_data *d) default: /* We should never get here, but just in case. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: zedit_disp_arg2(): Help!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: zedit_disp_arg2(): Help!"); write_to_output(d, "Oops...\r\n"); return; } @@ -678,7 +678,7 @@ static void zedit_disp_arg3(struct descriptor_data *d) default: /* We should never get here, just in case. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: zedit_disp_arg3(): Help!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: zedit_disp_arg3(): Help!"); write_to_output(d, "Oops...\r\n"); return; } @@ -728,7 +728,7 @@ void zedit_parse(struct descriptor_data *d, char *arg) } else write_to_output(d, "Saving zone info in memory.\r\n"); - mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits zone info for room %d.", GET_NAME(d->character), OLC_NUM(d)); + mudlog(CMP, MAX(ADMLVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits zone info for room %d.", GET_NAME(d->character), OLC_NUM(d)); /* FALL THROUGH */ case 'n': case 'N': @@ -794,21 +794,21 @@ void zedit_parse(struct descriptor_data *d, char *arg) case 'b': case 'B': /* Edit bottom of zone. */ - if (GET_LEVEL(d->character) < LVL_IMPL) - zedit_disp_menu(d); + if (!IS_ADMIN(d->character, ADMLVL_IMPL)) + zedit_disp_menu(d); else { - write_to_output(d, "Enter new bottom of zone : "); - OLC_MODE(d) = ZEDIT_ZONE_BOT; + write_to_output(d, "Enter new bottom of zone : "); + OLC_MODE(d) = ZEDIT_ZONE_BOT; } break; case 't': case 'T': /* Edit top of zone. */ - if (GET_LEVEL(d->character) < LVL_IMPL) - zedit_disp_menu(d); + if (!IS_ADMIN(d->character, ADMLVL_IMPL)) + zedit_disp_menu(d); else { - write_to_output(d, "Enter new top of zone : "); - OLC_MODE(d) = ZEDIT_ZONE_TOP; + write_to_output(d, "Enter new top of zone : "); + OLC_MODE(d) = ZEDIT_ZONE_TOP; } break; case 'l': @@ -846,11 +846,11 @@ void zedit_parse(struct descriptor_data *d, char *arg) /*-------------------------------------------------------------------*/ case ZEDIT_LEVELS: switch (*arg) { - case '1': write_to_output(d, "Enter the min level for this zone (0-%d, -1 = none): ", (LVL_IMMORT-1)); + case '1': write_to_output(d, "Enter the min level for this zone (0-%d, -1 = none): ", (CONFIG_MAX_LEVEL)); OLC_MODE(d) = ZEDIT_LEV_MIN; break; - case '2': write_to_output(d, "Enter the max level for this zone (0-%d, -1 = none): ", (LVL_IMMORT-1)); + case '2': write_to_output(d, "Enter the max level for this zone (0-%d, -1 = none): ", (CONFIG_MAX_LEVEL)); OLC_MODE(d) = ZEDIT_LEV_MAX; break; @@ -1009,7 +1009,7 @@ void zedit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): case ARG1: Ack!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): case ARG1: Ack!"); write_to_output(d, "Oops...\r\n"); break; } @@ -1072,7 +1072,7 @@ void zedit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here, but just in case. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): case ARG2: Ack!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): case ARG2: Ack!"); write_to_output(d, "Oops...\r\n"); break; } @@ -1121,7 +1121,7 @@ void zedit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here, but just in case. */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): case ARG3: Ack!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): case ARG3: Ack!"); write_to_output(d, "Oops...\r\n"); break; } @@ -1245,7 +1245,7 @@ void zedit_parse(struct descriptor_data *d, char *arg) default: /* We should never get here, but just in case... */ cleanup_olc(d, CLEANUP_ALL); - mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): Reached default case!"); + mudlog(BRF, ADMLVL_BUILDER, TRUE, "SYSERR: OLC: zedit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; }