#include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" /* climb any item of type ITEM_CLIMBABLE Some of this code was borrowed from the previous mud code */ void do_climb (CHAR_DATA * ch, char *argy) { CHAR_DATA *fch, *fch_next; SINGLE_OBJECT *obj; ROOM_DATA *to_room; ROOM_DATA *in_room; I_CLIMBABLE *c; char *arg; char buf[SML_LENGTH]; char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; int dir; DEFINE_COMMAND ("climb", do_climb, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to climb up <object> or climb down <object>.") arg = one_argy (argy, arg2); one_argy (arg, arg1); if (arg1[0] == '\0') { send_to_char ("Climb what?\n\r", ch); return; } if ((obj = get_obj_here (ch, arg1, SEARCH_ROOM_FIRST)) == NULL) { send_to_char ("There's nothing here to climb.\n\r", ch); return; } if (obj->pIndexData->item_type == ITEM_SCALABLE) { if (get_item_held (ch, ITEM_SCALE_DEV) == NULL) { send_to_char ("You need something to scale it with.\n\r", ch); return; } } else if (obj->pIndexData->item_type != ITEM_CLIMBABLE) { send_to_char ("You can't climb that!\n\r", ch); return; } c = (I_CLIMBABLE *) obj->more; if (RIDING (ch) != NULL) { send_to_char ("You're mounted; you can't climb!\n\r", ch); return; } if (MOUNTED_BY (ch) != NULL) { send_to_char ("You can't climb while mounted.\n\r", ch); return; } dir = c->up_down; if (arg2[0] == '\0' && dir == 2) { send_to_char ("Which way? Up or down?\n\r", ch); return; } in_room = ch->in_room; switch (arg2[0]) { case 'U': case 'u': if (dir == 0) { send_to_char ("It doesn't lead anywhere.\n\r", ch); return; } else { if ((to_room = get_room_index (c->above)) == NULL) { send_to_char ("It doesn't lead anywhere.\n\r", ch); bug ("Do_climb: bad vnum up %d.", c->above); return; } dir = 1; } break; case 'D': case 'd': if (dir == 1) { send_to_char ("It doesn't lead anywhere.\n\r", ch); return; } else { if ((to_room = get_room_index (c->below)) == NULL) { send_to_char ("It doesn't lead anywhere.\n\r", ch); bug ("Do_climb: bad vnum down %d.", c->below); return; } dir = 0; } break; default: if (dir == 0) { if ((to_room = get_room_index (c->below)) == NULL) { send_to_char ("It doesn't lead anywhere.\n\r", ch); bug ("Do_climb: bad vnum down %d.", c->below); return; } } else { if ((to_room = get_room_index (c->above)) == NULL) { send_to_char ("It doesn't lead anywhere.\n\r", ch); bug ("Do_climb: bad vnum up %d.", c->above); return; } dir = 1; } break; } if (IS_PLAYER (ch)) { int move = 0; move -= ch->pcdata->carry_number - get_curr_str (ch); if (move < 2) move = 2; if (ch->move < move) { send_to_char ("You are too exhausted.\n\r", ch); return; } WAIT_STATE (ch, 1); SUBMOVE(ch,move); } if (MOUNTED_BY (ch) != NULL) sprintf (buf, "You climb %s %s, rode by %s.", (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr, PERS (MOUNTED_BY (ch), ch)); else if (IS_AFFECTED (ch, AFF_SNEAK)) sprintf (buf, "You sneak %s %s.", (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr); else if (IS_AFFECTED (ch, AFF_FLYING)) sprintf (buf, "You fly %s %s.", (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr); else sprintf (buf, "You climb %s %s.", (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr); buf[0] = UPPER (buf[0]); send_to_char (buf, ch); send_to_char ("\n\r", ch); check_room_more (in_room); for (fch = in_room->more->people; fch != NULL; fch = fch_next) { fch_next = fch->next_in_room; if (ch == fch || MOUNTED_BY (ch) == fch) continue; if (!can_see (fch, ch)) continue; if (MOUNTED_BY (ch) != NULL) break; else if (IS_AFFECTED (ch, AFF_SNEAK)) { if (IS_SET (fch->act, PLR_HOLYLIGHT)) sprintf (buf, "%s sneaks %s %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr); else buf[0] = '\0'; } else if (IS_MOB (ch) && IS_SET (ch->act, ACT_SCRAMBLE)) sprintf (buf, "%s rushes %s %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr); else if (IS_AFFECTED (ch, AFF_FLYING)) sprintf (buf, "%s flies %s %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr); else sprintf (buf, "%s climbs %s %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), obj->pIndexData->short_descr); buf[0] = UPPER (buf[0]); send_to_char (buf, fch); if (buf[0] != '\0') send_to_char ("\n\r", fch); } char_from_room (ch); char_to_room (ch, to_room); if (MOUNTED_BY (ch) != NULL && ch->in_room != MOUNTED_BY (ch)->in_room) { do_climb (MOUNTED_BY (ch), argy); } check_room_more (in_room); for (fch = to_room->more->people; fch != NULL; fch = fch_next) { fch_next = fch->next_in_room; if (ch == fch || MOUNTED_BY (ch) == fch) continue; if (!can_see (fch, ch)) continue; if (MOUNTED_BY (ch) != NULL) break; else if (IS_AFFECTED (ch, AFF_SNEAK)) { if (IS_SET (fch->act, PLR_HOLYLIGHT)) sprintf (buf, "%s sneakily climbs %s from %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), (dir == 0 ? "above" : "below")); else buf[0] = '\0'; } else if (IS_MOB (ch) && IS_SET (ch->act, ACT_SCRAMBLE)) sprintf (buf, "%s rushes %s from %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), (dir == 0 ? "above" : "below")); else if (IS_AFFECTED (ch, AFF_FLYING)) sprintf (buf, "%s flies %s from %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), (dir == 0 ? "above" : "below")); else sprintf (buf, "%s climbs %s from %s.", PERS (ch, fch), (dir == 0 ? "down" : "up"), (dir == 0 ? "above" : "below")); buf[0] = UPPER (buf[0]); if (IS_AWAKE (fch)) send_to_char (buf, fch); if (buf[0] != '\0') send_to_char ("\n\r", fch); } do_look (ch, "auto"); do_silentscan(ch, 0); if (HUNTING (ch) != NULL) do_track (ch, "continue"); if (PHUNTING (ch) !=NULL) do_ptrack (ch, "continue"); check_room_more (in_room); for (fch = in_room->more->people; fch != NULL; fch = fch_next) { fch_next = fch->next_in_room; if (MASTER (fch) == ch && fch->position >= POSITION_STANDING) { act ("You follow $N $t.", fch, (dir == 0 ? "down" : "up"), ch, TO_CHAR); do_climb (fch, argy); } } return; }