/* New hidden Exits */ ------------------------------- Open structs.h search for: #define EX_PICKPROOF Right below add: #define EX_HIDDEN (1 << 4) /* Exit is hidden */ *NOTE* change the last number if needed. Now search for: #define PRF_ROOMFLAGS after the last in your PRF_XXXXXXX flags add: #define PRF_DISPEXP (1 << 23) #define PRF_DISPEXITS (1 << 24) #define PRF_DISPGOLD (1 << 25) *NOTE* change the last number if needed. Now search for: #define MAX_PROMPT_LENGTH Change that line to: #define MAX_PROMPT_LENGTH 256 Save and close structs.h ------------------------------- Open comm.c What we're doing here is changing the prompt towards, showing and hiding exits depending on their states. In the includes at the top the file, around line 60, make sure you add: #include "screen.h" #include "constants.h" If not allready there. Now search for: char *make_prompt(struct descriptor_data *d) replace the entire function with this, and it's a big one: char *make_prompt(struct descriptor_data *d) { static char prompt[MAX_PROMPT_LENGTH -1]; int door; int percent; bool closed = FALSE; /* Note, prompt is truncated at MAX_PROMPT_LENGTH chars (structs.h )*/ if (d->showstr_count) { sprintf(prompt, "\r[ Return to continue, (q)uit, (r)efresh, (b)ack, or page number (%d/%d) ]", d->showstr_page, d->showstr_count); } else if (d->str) strcpy(prompt, "] "); else if (STATE(d) == CON_PLAYING && !IS_NPC(d->character)) { int count = 0; *prompt = '\0'; if (GET_INVIS_LEV(d->character)) count += sprintf(prompt + count, "i%d ", GET_INVIS_LEV(d->character)); if (PRF_FLAGGED(d->character, PRF_DISPHP)) { if (COLOR_LEV(d->character) >= C_CMP) { if (GET_MAX_HIT(d->character) > 0) percent = (100 * GET_HIT(d->character)) / GET_MAX_HIT(d->character); else percent = -1; if (percent >= 100) count += sprintf(prompt + count, "\x1B[0;32m%dH\x1B[0;0m ", GET_HIT(d->character)); else if (percent >= 90) count += sprintf(prompt + count, "\x1B[0;32m%dH\x1B[0;0m ", GET_HIT(d->character)); else if (percent >= 75) count += sprintf(prompt + count, "\x1B[0;32m%dH\x1B[0;0m ", GET_HIT(d->character)); else if (percent >= 50) count += sprintf(prompt + count, "\x1B[1;33m%dH\x1B[0;0m ", GET_HIT(d->character)); else if (percent >= 30) count += sprintf(prompt + count, "\x1B[1;33m%dH\x1B[0;0m ", GET_HIT(d->character)); else if (percent >= 15) count += sprintf(prompt + count, "\x1B[0;31m%dH\x1B[0;0m ", GET_HIT(d->character)); else if (percent >= 0) count += sprintf(prompt + count, "\x1B[0;31m%dH\x1B[0;0m ", GET_HIT(d->character)); else count += sprintf(prompt + count, "\x1B[0;31m%dH\x1B[0;0m ", GET_HIT(d->character)); } else count += sprintf(prompt + count, "%dH ", GET_HIT(d->character)); } if (PRF_FLAGGED(d->character, PRF_DISPMOVE)) { if (COLOR_LEV(d->character) >= C_CMP) { if (GET_MAX_MOVE(d->character) > 0) percent = (100 * GET_MOVE(d->character)) / GET_MAX_MOVE(d->character); else percent = -1; if (percent >= 100) count += sprintf(prompt + count, "\x1B[0;32m%dV\x1B[0;0m ", GET_MOVE(d->character)); else if (percent >= 90) count += sprintf(prompt + count, "\x1B[0;32m%dV\x1B[0;0m ", GET_MOVE(d->character)); else if (percent >= 75) count += sprintf(prompt + count, "\x1B[0;32m%dV\x1B[0;0m ", GET_MOVE(d->character)); else if (percent >= 50) count += sprintf(prompt + count, "\x1B[1;33m%dV\x1B[0;0m ", GET_MOVE(d->character)); else if (percent >= 30) count += sprintf(prompt + count, "\x1B[1;33m%dV\x1B[0;0m ", GET_MOVE(d->character)); else if (percent >= 15) count += sprintf(prompt + count, "\x1B[0;31m%dV\x1B[0;0m ", GET_MOVE(d->character)); else if (percent >= 0) count += sprintf(prompt + count, "\x1B[0;31m%dV\x1B[0;0m ", GET_MOVE(d->character)); else count += sprintf(prompt + count, "\x1B[0;31m%dV\x1B[0;0m ", GET_MOVE(d->character)); } else count += sprintf(prompt + count, "%dV ", GET_MOVE(d->character)); } if (PRF_FLAGGED(d->character, PRF_DISPMANA)) { if (COLOR_LEV(d->character) >= C_CMP) { if (GET_MAX_MANA(d->character) > 0) percent = (100 * GET_MANA(d->character)) / GET_MAX_MANA(d->character); else percent = -1; if (percent >= 100) count += sprintf(prompt + count, "\x1B[0;32m%dM\x1B[0;0m ", GET_MANA(d->character)); else if (percent >= 90) count += sprintf(prompt + count, "\x1B[0;32m%dM\x1B[0;0m ", GET_MANA(d->character)); else if (percent >= 75) count += sprintf(prompt + count, "\x1B[0;32m%dM\x1B[0;0m ", GET_MANA(d->character)); else if (percent >= 50) count += sprintf(prompt + count, "\x1B[1;33m%dM\x1B[0;0m ", GET_MANA(d->character)); else if (percent >= 30) count += sprintf(prompt + count, "\x1B[1;33m%dM\x1B[0;0m ", GET_MANA(d->character)); else if (percent >= 15) count += sprintf(prompt + count, "\x1B[0;31m%dM\x1B[0;0m ", GET_MANA(d->character)); else if (percent >= 0) count += sprintf(prompt + count, "\x1B[0;31m%dM\x1B[0;0m ", GET_MANA(d->character)); else count += sprintf(prompt + count, "\x1B[0;31m%dM\x1B[0;0m ", GET_MANA(d->character)); } else count += sprintf(prompt + count, "%dM ", GET_MANA(d->character)); } count += sprintf(prompt + count, "%dC ", GET_GOLD(d->character)); if (GET_LEVEL(d->character) < LVL_IMMORT -1) { if (COLOR_LEV(d->character) >= C_CMP) { if (PRF_FLAGGED(d->character, PRF_DISPEXP)) count += sprintf(prompt + count, "%dX ", level_exp(GET_CLASS(d->character), GET_LEVEL(d->character) + 1) - GET_EXP(d->character)); } else { count += sprintf(prompt + count, "%dX ", level_exp(GET_CLASS(d->character), GET_LEVEL(d->character) + 1) - GET_EXP(d->character)); }} if (GET_LEVEL(d->character) >= LVL_IMMORT -1) { if (COLOR_LEV(d->character) >= C_CMP) { if (PRF_FLAGGED(d->character, PRF_DISPEXP)) count += sprintf(prompt + count, "0X "); } else { count += sprintf(prompt + count, "0X "); }} if (PRF_FLAGGED(d->character, PRF_DISPEXITS)) { count += sprintf(prompt + count, "Exits:"); for (door = 0; door < NUM_OF_DIRS; door++) if (EXIT(d->character, door) && EXIT(d->character, door)->to_room != NOWHERE && EXIT_FLAGGED(EXIT(d->character, door), EX_HIDDEN) && !EXIT_FLAGGED(EXIT(d->character, door), EX_ISDOOR)) count += sprintf(prompt + count, ""); else if (EXIT(d->character, door) && EXIT(d->character, door)->to_room != NOWHERE && EXIT_FLAGGED(EXIT(d->character, door), EX_HIDDEN) && EXIT_FLAGGED(EXIT(d->character, door), EX_CLOSED)) count += sprintf(prompt + count, ""); else if (EXIT(d->character, door) && EXIT(d->character, door)->to_room != NOWHERE && !EXIT_FLAGGED(EXIT(d->character, door), EX_CLOSED)) count += sprintf(prompt + count, "%c", UPPER(*dirs[door])); else if (EXIT(d->character, door) && EXIT(d->character, door)->to_room != NOWHERE && EXIT_FLAGGED(EXIT(d->character, door), EX_CLOSED)) count += sprintf(prompt + count, "(%c)", UPPER(*dirs[door])); } if (FIGHTING(d->character)) { if (COLOR_LEV(d->character) >= C_CMP) { sprintf(prompt + strlen(prompt), " [\x1B[1;37m%s:\x1B[0;0m", GET_NAME(d->character)); } else { sprintf(prompt + strlen(prompt), " [%s:", GET_NAME(d->character)); } if (COLOR_LEV(d->character) >= C_CMP) { if (GET_MAX_HIT(d->character) > 0) percent = (100 * GET_HIT(d->character)) / GET_MAX_HIT(d->character); else percent = -1; if (percent >= 100) sprintf(prompt + strlen(prompt), "\x1B[0;32mPerfect\x1B[0;0m] "); else if (percent >= 90) sprintf(prompt + strlen(prompt), "\x1B[0;32mV.Good\x1B[0;0m] "); else if (percent >= 75) sprintf(prompt + strlen(prompt), "\x1B[0;32mGood\x1B[0;0m] "); else if (percent >= 50) sprintf(prompt + strlen(prompt), "\x1B[0;0mFair\x1B[0;0m] "); else if (percent >= 30) sprintf(prompt + strlen(prompt), "\x1B[0;0mBad\x1B[0;0m] "); else if (percent >= 15) sprintf(prompt + strlen(prompt), "\x1B[1;31mV.Bad\x1B[0;0m] "); else if (percent >= 0) sprintf(prompt + strlen(prompt), "\x1B[1;31mAwful\x1B[0;0m] "); else sprintf(prompt + strlen(prompt), "\x1B[1;31mDying\x1B[0;0m] "); } else { if (GET_MAX_HIT(d->character) > 0) percent = (100 * GET_HIT(d->character)) / GET_MAX_HIT(d->character); else percent = -1; if (percent >= 100) sprintf(prompt + strlen(prompt), "Perfect] "); else if (percent >= 90) sprintf(prompt + strlen(prompt), "V.Good] "); else if (percent >= 75) sprintf(prompt + strlen(prompt), "Good] "); else if (percent >= 50) sprintf(prompt + strlen(prompt), "Fair] "); else if (percent >= 30) sprintf(prompt + strlen(prompt), "Bad] "); else if (percent >= 15) sprintf(prompt + strlen(prompt), "V.Bad] "); else if (percent >= 0) sprintf(prompt + strlen(prompt), "Awful] "); else sprintf(prompt + strlen(prompt), "Dying] "); } } if (FIGHTING(d->character)) { if (COLOR_LEV(d->character) >= C_CMP) { if (CAN_SEE(d->character, FIGHTING(d->character))) sprintf(prompt + strlen(prompt), "[\x1B[1;37m%s:\x1B[0;0m", GET_NAME(FIGHTING(d->character))); if (!CAN_SEE(d->character, FIGHTING(d->character))) sprintf(prompt + strlen(prompt), "[\x1B[1;37mSomeone:\x1B[0;0m"); } else { if (CAN_SEE(d->character, FIGHTING(d->character))) sprintf(prompt + strlen(prompt), "[%s:", GET_NAME(FIGHTING(d->character))); if (!CAN_SEE(d->character, FIGHTING(d->character))) sprintf(prompt + strlen(prompt), "[\x1B[1;37mSomeone:\x1B[0;0m"); } if (COLOR_LEV(d->character) >= C_CMP) { if (GET_MAX_HIT(FIGHTING(d->character)) > 0) percent = (100 * GET_HIT(FIGHTING(d->character))) / GET_MAX_HIT(FIGHTING(d->character)); else percent = -1; if (percent >= 100) sprintf(prompt + strlen(prompt), "\x1B[0;32mPerfect\x1B[0;0m] "); else if (percent >= 90) sprintf(prompt + strlen(prompt), "\x1B[0;32mV.Good\x1B[0;0m] "); else if (percent >= 75) sprintf(prompt + strlen(prompt), "\x1B[0;32mGood\x1B[0;0m] "); else if (percent >= 50) sprintf(prompt + strlen(prompt), "\x1B[0;0mFair\x1B[0;0m] "); else if (percent >= 30) sprintf(prompt + strlen(prompt), "\x1B[0;0mBad\x1B[0;0m] "); else if (percent >= 15) sprintf(prompt + strlen(prompt), "\x1B[1;31mV.Bad\x1B[0;0m] "); else if (percent >= 0) sprintf(prompt + strlen(prompt), "\x1B[1;31mAwful\x1B[0;0m] "); else sprintf(prompt + strlen(prompt), "\x1B[1;31mDying\x1B[0;0m] "); } else { if (GET_MAX_HIT(FIGHTING(d->character)) > 0) percent = (100 * GET_HIT(FIGHTING(d->character))) / GET_MAX_HIT(FIGHTING(d->character)); else percent = -1; if (percent >= 100) sprintf(prompt + strlen(prompt), "Perfect] "); else if (percent >= 90) sprintf(prompt + strlen(prompt), "V.Good] "); else if (percent >= 75) sprintf(prompt + strlen(prompt), "Good] "); else if (percent >= 50) sprintf(prompt + strlen(prompt), "Fair] "); else if (percent >= 30) sprintf(prompt + strlen(prompt), "Bad] "); else if (percent >= 15) sprintf(prompt + strlen(prompt), "V.Bad] "); else if (percent >= 0) sprintf(prompt + strlen(prompt), "Awful] "); else sprintf(prompt + strlen(prompt), "Dying] "); }} strcat(prompt, ">\x1B[0;0m "); } else if (STATE(d) == CON_PLAYING && IS_NPC(d->character)) sprintf(prompt, "%s> ", GET_NAME(d->character)); else *prompt = '\0'; return (prompt); } Save and close comm.c ------------------------------------------ Open act.informative.c What needs to be done here is edit the do_exits command to show or conceal the exits flagged, EX_HIDDEN, depending on their states. In ACMD(do_exits) find this if sentence: if (EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE && !EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)) { Replace it with: if (EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE && !EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED) && !EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN) || EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE && !EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED) && EXIT_FLAGGED(EXIT(ch, door), EX_ISDOOR) && EXIT_FLAGGED(EXIT(ch, door), EX_HIDDEN)) { Save and close act.informative.c ------------------------------------------ Open act.other.c Search for: ACMD(do_display) Replace the entire function with this: ACMD(do_display) { size_t i; if (IS_NPC(ch)) { send_to_char("Mosters don't need prompts. Go away.\r\n", ch); return; } skip_spaces(&argument); if (!*argument) { send_to_char("Usage: prompt { H | M | V | G | X | E } | all | none }\r\n", ch); return; } if (!str_cmp(argument, "on") || !str_cmp(argument, "all")) SET_BIT(PRF_FLAGS(ch), PRF_DISPHP | PRF_DISPMANA | PRF_DISPMOVE | PRF_DISPEXP | PRF_DISPEXITS | PRF_DISPGOLD); else if (!str_cmp(argument, "off") || !str_cmp(argument, "none")) REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPHP | PRF_DISPMANA | PRF_DISPMOVE | PRF_DISPEXP | PRF_DISPEXITS | PRF_DISPGOLD); else { for (i = 0; i < strlen(argument); i++) { switch (LOWER(argument[i])) { case 'h': if (PRF_FLAGGED(ch, PRF_DISPHP)) REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPHP); else SET_BIT(PRF_FLAGS(ch), PRF_DISPHP); break; case 'm': if (PRF_FLAGGED(ch, PRF_DISPMANA)) REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPMANA); else SET_BIT(PRF_FLAGS(ch), PRF_DISPMANA); break; case 'v': if (PRF_FLAGGED(ch, PRF_DISPMOVE)) REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPMOVE); else SET_BIT(PRF_FLAGS(ch), PRF_DISPMOVE); break; case 'g': if (PRF_FLAGGED(ch, PRF_DISPGOLD)) REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPGOLD); else SET_BIT(PRF_FLAGS(ch), PRF_DISPGOLD); break; case 'x': if (PRF_FLAGGED(ch, PRF_DISPEXP)) REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPEXP); else SET_BIT(PRF_FLAGS(ch), PRF_DISPEXP); break; case 'e': if (PRF_FLAGGED(ch, PRF_DISPEXITS)) REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPEXITS); else SET_BIT(PRF_FLAGS(ch), PRF_DISPEXITS); break; default: send_to_char("Usage: prompt { H | M | V | G | X | E } | all | none }\r\n", ch); return; } } send_to_char(OK, ch); } } Save and close act.other.c --------------------------------------------------- open db.c search for: world[room].dir_option[dir]->exit_info = EX_ISDOOR | EX_PICKPROOF; Right below that line before the else insert this: else if (t[0] == 3) world[room].dir_option[dir]->exit_info = EX_HIDDEN; else if (t[0] == 4) world[room].dir_option[dir]->exit_info = EX_ISDOOR | EX_HIDDEN; else if (t[0] == 5) world[room].dir_option[dir]->exit_info = EX_ISDOOR | EX_HIDDEN | EX_PICKPROOF; Save and close db.c --------------------------------------------------- *NOTE* For thoose that don't have OLC this is all you need to do. Open genwld.c in the int save_rooms(zone_rnum rzone) function find this part in the function: /* * Figure out door flag. */ if (IS_SET(R_EXIT(room, j)->exit_info, EX_ISDOOR)) { if (IS_SET(R_EXIT(room, j)->exit_info, EX_PICKPROOF)) dflag = 2; else dflag = 1; } else dflag = 0; if (R_EXIT(room, j)->keyword) strcpy(buf1, R_EXIT(room, j)->keyword); else *buf1 = '\0'; replace the whole thing with this: /* * Figure out door flag. */ if (IS_SET(R_EXIT(room, j)->exit_info, EX_HIDDEN)) dflag = 3; if (IS_SET(R_EXIT(room, j)->exit_info, EX_ISDOOR)) { dflag = 1; if (IS_SET(R_EXIT(room, j)->exit_info, EX_PICKPROOF) && !IS_SET(R_EXIT(room, j)->exit_info, EX_HIDDEN)) dflag = 2; if (IS_SET(R_EXIT(room, j)->exit_info, EX_HIDDEN) && !IS_SET(R_EXIT(room, j)->exit_info, EX_PICKPROOF)) dflag = 4; if (IS_SET(R_EXIT(room, j)->exit_info, EX_HIDDEN) && IS_SET(R_EXIT(room, j)->exit_info, EX_PICKPROOF)) dflag = 5; } else if (!IS_SET(R_EXIT(room, j)->exit_info, EX_HIDDEN)) dflag = 0; if (R_EXIT(room, j)->keyword) strcpy(buf1, R_EXIT(room, j)->keyword); else *buf1 = '\0'; Save and close genwld.c -------------------------------------------- Open redit.c search for: void redit_disp_exit_menu(struct descriptor_data *d) replace the whole function with: void redit_disp_exit_menu(struct descriptor_data *d) { /* * if exit doesn't exist, alloc/create it */ if (OLC_EXIT(d) == NULL) CREATE(OLC_EXIT(d), struct room_direction_data, 1); /* * Weird door handling! */ if (IS_SET(OLC_EXIT(d)->exit_info, EX_ISDOOR) && !IS_SET(OLC_EXIT(d)->exit_info, EX_HIDDEN)) { if (IS_SET(OLC_EXIT(d)->exit_info, EX_PICKPROOF)) strcpy(buf2, "Pickproof"); else strcpy(buf2, "Is a door"); } else if (IS_SET(OLC_EXIT(d)->exit_info, EX_HIDDEN) && !IS_SET(OLC_EXIT(d)->exit_info, EX_ISDOOR)) strcpy(buf2, "Hidden exit"); else if (IS_SET(OLC_EXIT(d)->exit_info, EX_ISDOOR) && !IS_SET(OLC_EXIT(d)->exit_info, EX_PICKPROOF)) strcpy(buf2, "Hidden door"); else if (IS_SET(OLC_EXIT(d)->exit_info, EX_PICKPROOF)) strcpy(buf2, "Hidden pickproof door"); else strcpy(buf2, "No door"); get_char_colors(d->character); clear_screen(d); sprintf(buf, "%s1%s) Exit to : %s%d\r\n" "%s2%s) Description :-\r\n%s%s\r\n" "%s3%s) Door name : %s%s\r\n" "%s4%s) Key : %s%d\r\n" "%s5%s) Door flags : %s%s\r\n" "%s6%s) Purge exit.\r\n" "Enter choice, 0 to quit : ", grn, nrm, cyn, OLC_EXIT(d)->to_room != -1 ? world[OLC_EXIT(d)->to_room].number : -1, grn, nrm, yel, OLC_EXIT(d)->general_description ? OLC_EXIT(d)->general_description : "", grn, nrm, yel, OLC_EXIT(d)->keyword ? OLC_EXIT(d)->keyword : "", grn, nrm, cyn, OLC_EXIT(d)->key, grn, nrm, cyn, buf2, grn, nrm ); SEND_TO_Q(buf, d); OLC_MODE(d) = REDIT_EXIT_MENU; } This should be right below the former, but if not search for: void redit_disp_exit_flag_menu(struct descriptor_data *d) replace the whole function with this: void redit_disp_exit_flag_menu(struct descriptor_data *d) { get_char_colors(d->character); sprintf(buf, "%s0%s) No door\r\n" "%s1%s) Closeable door\r\n" "%s2%s) Pickproof\r\n" "%s3%s) Hidden exit\r\n" "%s4%s) Hidden door\r\n" "%s5%s) Hidden pickproof door\r\n" "Enter choice : ", grn, nrm, grn, nrm, grn, nrm, grn, nrm, grn, nrm, grn, nrm); SEND_TO_Q(buf, d); } now search for: case REDIT_EXIT_DOORFLAGS: Replace the whole case REDIT_EXIT_DOORFLAGS: with this: case REDIT_EXIT_DOORFLAGS: number = atoi(arg); if (number < 0 || number > 5) { SEND_TO_Q("That's not a valid choice!\r\n", d); redit_disp_exit_flag_menu(d); } else { /* * Doors are a bit idiotic, don't you think? :) -- I agree. -gg */ OLC_EXIT(d)->exit_info = (number == 0 ? 0 : (number == 1 ? EX_ISDOOR : (number == 2 ? EX_ISDOOR | EX_PICKPROOF : (number == 3 ? EX_HIDDEN : (number == 4 ? EX_ISDOOR | EX_HIDDEN : (number == 5 ? EX_ISDOOR | EX_HIDDEN | EX_PICKPROOF : 0)))))); /* * Jump back to the menu system. */ redit_disp_exit_menu(d); } return; Close and save redit.c ----------------------------------- Now say your prayers and recompile P.S: I recommend that you take out the autoexits function for the players, but i'll leave that up for you to decide. Christian chr-ejlertsen@mail1.stofanet.dk