void do_doorcmd(struct char_data *ch, struct obj_data *obj, int door, int scmd) { struct obj_data *o; char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH]; size_t len; room_rnum other_room = NOWHERE; struct room_direction_data *back = NULL; if (!door_mtrigger(ch, scmd, door)) return; if (!door_wtrigger(ch, scmd, door)) return; len = snprintf(buf, sizeof(buf), "$n %ss ", cmd_door[scmd]); if (!obj && ((other_room = EXIT(ch, door)->to_room) != NOWHERE)) if ((back = world[other_room].dir_option[rev_dir[door]]) != NULL) if (back->to_room != IN_ROOM(ch)) back = NULL; switch (scmd) { case SCMD_OPEN: OPEN_DOOR(IN_ROOM(ch), obj, door); if (back) OPEN_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "%s", OK); break; case SCMD_CLOSE: CLOSE_DOOR(IN_ROOM(ch), obj, door); if (back) CLOSE_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "%s", OK); break; case SCMD_LOCK: LOCK_DOOR(IN_ROOM(ch), obj, door); if (back) LOCK_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "*Click*\r\n"); break; case SCMD_UNLOCK: // Rewrote Apr 2012 if (GET_LEVEL(ch) >= LVL_GOD) { // LEVEL GOD + can unlock all doors UNLOCK_DOOR(IN_ROOM(ch), obj, door); if (back) UNLOCK_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "*Click*\r\n"); return; } if ((o = has_key(ch, DOOR_KEY(ch, obj, door)))) { // Assign o to the key, if ch has it UNLOCK_DOOR(IN_ROOM(ch), obj, door); if (back) UNLOCK_DOOR(other_room, o, rev_dir[door]); // this unlocks the door in the other direction send_to_char(ch, "*Click*\r\n"); if ((GET_OBJ_VAL(o, 0) != 9999) && (GET_OBJ_VAL(o, 0) > 0)) // Check for key charges GET_OBJ_VAL(o, 0)--; // take a charge from the key if (GET_OBJ_VAL(o, 0) <= 0) { extract_obj(o); // take key if the last charge is used snprintf(buf2, sizeof(buf), "%s suddenly vanishes from sight!", o->short_description); act(buf2, FALSE, ch, 0, 0, TO_CHAR); } } break; case SCMD_PICK: TOGGLE_LOCK(IN_ROOM(ch), obj, door); if (back) TOGGLE_LOCK(other_room, obj, rev_dir[door]); send_to_char(ch, "The lock quickly yields to your skills.\r\n"); len = strlcpy(buf, "$n skillfully picks the lock on ", sizeof(buf)); break; default: break; } /* Notify the room. */ if (len < sizeof(buf)) snprintf(buf + len, sizeof(buf) - len, "%s%s.", obj ? "" : "the ", obj ? "$p" : EXIT(ch, door)->keyword ? "$F" : "door"); if (!obj || IN_ROOM(obj) != NOWHERE) act(buf, FALSE, ch, obj, obj ? 0 : EXIT(ch, door)->keyword, TO_ROOM); /* Notify the other room */ if (back && (scmd == SCMD_OPEN || scmd == SCMD_CLOSE)) send_to_room(EXIT(ch, door)->to_room, "The %s is %s%s from the other side.", back->keyword ? fname(back->keyword) : "door", cmd_door[scmd], scmd == SCMD_CLOSE ? "d" : "ed"); }
static void do_doorcmd(struct char_data *ch, struct obj_data *obj, int door, int scmd) { char buf[MAX_STRING_LENGTH]; size_t len; room_rnum other_room = NOWHERE; struct room_direction_data *back = NULL; if (!door_mtrigger(ch, scmd, door)) return; if (!door_wtrigger(ch, scmd, door)) return; len = snprintf(buf, sizeof(buf), "$n %ss ", cmd_door[scmd]); if (!obj && ((other_room = EXIT(ch, door)->to_room) != NOWHERE)) if ((back = world[other_room].dir_option[rev_dir[door]]) != NULL) if (back->to_room != IN_ROOM(ch)) back = NULL; switch (scmd) { case SCMD_OPEN: OPEN_DOOR(IN_ROOM(ch), obj, door); if (back) OPEN_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "%s", CONFIG_OK); break; case SCMD_CLOSE: CLOSE_DOOR(IN_ROOM(ch), obj, door); if (back) CLOSE_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "%s", CONFIG_OK); break; case SCMD_LOCK: LOCK_DOOR(IN_ROOM(ch), obj, door); if (back) LOCK_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "*Click*\r\n"); break; case SCMD_UNLOCK: UNLOCK_DOOR(IN_ROOM(ch), obj, door); if (back) UNLOCK_DOOR(other_room, obj, rev_dir[door]); send_to_char(ch, "*Click*\r\n"); break; case SCMD_PICK: TOGGLE_LOCK(IN_ROOM(ch), obj, door); if (back) TOGGLE_LOCK(other_room, obj, rev_dir[door]); send_to_char(ch, "The lock quickly yields to your skills.\r\n"); len = strlcpy(buf, "$n skillfully picks the lock on ", sizeof(buf)); break; } /* Notify the room. */ if (len < sizeof(buf)) snprintf(buf + len, sizeof(buf) - len, "%s%s.", obj ? "" : "the ", obj ? "$p" : EXIT(ch, door)->keyword ? "$F" : "door"); if (!obj || IN_ROOM(obj) != NOWHERE) act(buf, FALSE, ch, obj, obj ? 0 : EXIT(ch, door)->keyword, TO_ROOM); /* Notify the other room */ if (back && (scmd == SCMD_OPEN || scmd == SCMD_CLOSE)) send_to_room(EXIT(ch, door)->to_room, "The %s is %s%s from the other side.\r\n", back->keyword ? fname(back->keyword) : "door", cmd_door[scmd], scmd == SCMD_CLOSE ? "d" : "ed"); }