#include "kernel.h" #include "objects.h" #include "mobiles.h" #include "locations.h" #include "stdinc.h" static char *exittxt[] = { "north", "east", "south", "west", "up", "down", "northeast", "southeast", "southwest", "northwest", "n", "e", "s", "w", "u", "d", "ne", "se", "sw", "nw", 0 }; static int exitnum[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int dodirn (int vb) { char block[SETIN_MAX]; int i, pc, n; int save_mynum, save_real_mynum, myloc; int newch, drnum, droff; /*** if (cur_player->aliased || cur_player->polymorphed != -1) { bprintf("I'm sorry, but you can't move while aliased.\n"); return 0; } *****/ if (pfighting (mynum) >= 0) { bprintf ("You can't just stroll out of a fight!\n"); bprintf ("If you wish to leave, you must FLEE in a direction.\n"); return -1; } if (iscarrby (OBJ_CATACOMB_CUPSERAPH, mynum) && (i = alive ((max_players + MOB_CATACOMB_SERAPH))) != -1 && ploc (i) == ploc (mynum)) { bprintf ("The Seraph says 'I cannot allow you to leave this place " "with the Holy Relic.'\n"); return -1; } if (iscarrby (OBJ_CASTLE_RUNESWORD, mynum) && ploc ((max_players + MOB_CASTLE_GOLEM)) == ploc (mynum) && !EMPTY (pname ((max_players + MOB_CASTLE_GOLEM)))) { bprintf ("\001cThe Golem\003 bars the doorway!\n"); return -1; } n = vb - 2; /* Since VERB_NORTH = 2 etc....stupid */ if (chkcrip () || chksitting ()) return -1; switch (newch = getexit (ploc (mynum), n)) { case EX_DOWN_SLIME: if (state (OBJ_WINDOW_SLIME_PIT) != 0) { bprintf ("That doesn't look like a very good idea!\n"); return -1; } newch = LOC_WINDOW_SLIME; break; case EX_DEFENDER: newch = LOC_CATACOMB_HALL; break; case EX_GET_STUFF: newch = LOC_CATACOMB_CHAMBER; break; default: if (newch >= DOOR && newch < EDOOR) { drnum = newch - DOOR; droff = /*drnum ^ 1 */ olinked (drnum); /* other door side */ if (state (drnum)) { if (!EQ (oname (drnum), "door") || isdark () || EMPTY (olongt (drnum, state (drnum)))) bprintf ("You can't go that way.\n"); else bprintf ("The door is closed.\n"); return -1; } newch = /*oloc(droff) */ obj_loc (droff); } break; } if (!exists (newch)) { bprintf ("You can't go that way.\n"); return -1; } if (!checklevel(mynum, newch)) return -1; #ifdef LOCMIN_HEAVEN switch (newch) { case LOC_HEAVEN_36: case LOC_HEAVEN_27: case LOC_HEAVEN_16: case LOC_HEAVEN_17: case LOC_HEAVEN_18: case LOC_HEAVEN_14: case LOC_HEAVEN_15: newch = LOC_VILLAGE_HOSPITAL; bprintf ("You faintly hear voices, then feel an irresistable tugging.\n"); setploc (mynum, LOC_VILLAGE_HOSPITAL); lookin (ploc (mynum), 0); bprintf ("A nurse tells you they almost didn't pull you through.\n"); return 0; default:; } #endif #ifdef LOCMIN_PIRATE if ((!ststflg (mynum, SFL_DEAF)) && (alive (MOB_PIRATE_MERMAID + max_players) != -1)) { if ((ploc (mynum) == LOC_PIRATE_PIRATE27) && (n != 3)) /* ignore west */ { bprintf ("The Mermaid's song draws you west!\n"); newch = LOC_PIRATE_PIRATE28; } else if ((ploc (mynum) == LOC_PIRATE_PIRATE28) && (n != 2)) /* South */ { bprintf ("You try to leave but the Mermaid's song draws you back.\n"); return -1; } } #endif /* PIRATE.ZONE */ #ifdef LOCMIN_MITHDAN if (n == EX_NORTH) { if ((ploc(mynum) == LOC_MITHDAN_30) && (newch == LOC_MITHDAN_29)) { bprintf("You slip on the ice and slide uncontrolably down the side of\n"); bprintf("mountain, landing in a soft pile of snow.\n"); setploc(mynum, LOC_MITHDAN_19); lookin(ploc(mynum), 0); return 0; } } #endif #ifdef LOCMIN_NARNIA if (alive (MOB_NARNIA_FEN + max_players) != -1) { if (ploc(mynum) == LOC_NARNIA_CAST7) { bprintf("You have awakened Fenris Ulf!\n"); bprintf("Fenris gets to his feet and growls at you.\n"); bprintf("Suddenly he lunges at you, hurting you badly!\n"); setpstr(mynum, (pstr(mynum) - ((pstr(mynum)*20)/100))); bprintf("Fenris takes off into the courtyard.\n"); setpstr((MOB_NARNIA_FEN + max_players), -1); setploc((MOB_NARNIA_FEN + max_players), LOC_DEAD_DEAD); setploc((MOB_NARNIA_FENRIS + max_players), LOC_NARNIA_TABLE); return 0; } } if ((ploc(mynum) == LOC_NARNIA_CAIR6) && (n == EX_DOWN)) { bprintf("You feel your body being pulled and twisted in many different ways\n"); bprintf("at once by the darkness. Just as you begin to wonder what you've done\n"); bprintf("you find yourself safely in the company of coats. You find your feet\n"); bprintf("and begin to run, hurling yourself against the front door of the wardrobe.\n"); bprintf("Under your weight and speed the door flies open and you stumble into...\n\n\n"); setploc(mynum, LOC_NARNIA_WARDROBE); lookin(ploc(mynum), 0); return 0; } #endif #ifdef LOCMIN_ORCHOLD if (n == EX_NORTH) { if (ploc(mynum) == LOC_ORCHOLD_DAMP) { bprintf("You fall through a trap door, plummeting to the ground below!\n"); bprintf("Dazed, you pick yourself up from the floor to find yourself...\n"); setploc(mynum, LOC_ORCHOLD_TRAP); lookin(ploc(mynum), 0); return 0; } } #endif if (n == EX_WEST) { if (ploc(mynum) == LOC_BLIZZARD_GATE) if (plev(mynum) > 6) { bprintf("You are too mighty a warrior to enter here.\n"); return -1; } } if (ltstflg (newch, LFL_PRIVATE) || ltstflg (newch, LFL_ONE_PERSON)) { pc = 0; for (i = 0; i < max_players; i++) if (!EMPTY (pname (i)) && ploc (i) == newch) pc++; if (pc > (ltstflg (newch, LFL_PRIVATE) ? 1 : 0)) { bprintf ("I'm sorry, that room is currently full.\n"); return -1; } } if (newch == LOC_WINDOW_LAVA_PATH2) { if (!iswornby(OBJ_WINDOW_SHIELD1, mynum) && !iswornby (OBJ_WINDOW_SHIELD2, mynum) && !iswornby (OBJ_TREEHOUSE_SHIELD, mynum) && !iswornby (OBJ_CATACOMB_SHIELD, mynum) && !iswornby (OBJ_EFOREST_SHIELD, mynum)) { bprintf ("The intense heat drives you back.\n"); return -1; } bprintf ("The shield protects you from the worst of the lava's heat.\n"); } if (n == EX_NORTH) { for (i = max_players; (!mtstflg (i, MFL_BAR_N) || ploc (i) != ploc (mynum) || alive (i) == -1) && i < numchars; i++); if (mtstflg (i, MFL_BAR_N) && alive (i) != -1 && ploc (i) == ploc (mynum) && plev (mynum) < LVL_APPREN) { bprintf ("\001p%s\003 says 'None shall pass!'\n", pname (i)); if (i == (max_players + MOB_CATACOMB_DEFENDER)) { #if 0 woundmn (i, 0); #endif } return -1; } if (iscarrby (OBJ_EFOREST_HOPE, mynum) && ploc (mynum) == LOC_EFOREST_STONE) { bprintf ("A mysterious force prevents you from going that way.\n"); return -1; } } if (n == EX_WEST) { for (i = max_players; (!mtstflg (i, MFL_BAR_W) || ploc (i) != ploc (mynum) || alive (i) == -1) && i < numchars; i++); if (mtstflg (i, MFL_BAR_W) && alive (i) != -1 && ploc (i) == ploc (mynum) && plev (mynum) < LVL_APPREN) { bprintf ("\001p%s\003 gives a warning growl.\n", pname (i)); bprintf ("\001p%s\003 won't let you go West!\n", pname (i)); return -1; } } if ((n == EX_NORTH) || (n == EX_EAST ) || (n == EX_SOUTH) || (n == EX_DOWN)) { if ((i = alive ((max_players + MOB_EFOREST_ASMADEUS))) != -1 && plev (mynum) < LVL_APPREN && ploc (i) == ploc (mynum)) { bprintf ("\001pAsmadeus\003 refuses to let you enter his museum.\n"); return -1; } } if (n == EX_DOWN) { /* can't go down unless empty-handed */ if ((ploc (mynum) == LOC_CATACOMB_BEGGAR || ploc (mynum) == LOC_VALLEY_FALLS) && gotanything (mynum)) if (ploc (mynum) == LOC_CATACOMB_BEGGAR) { bprintf ("A mysterious force blocks your passage.\n"); if (ploc ((max_players + MOB_CATACOMB_BEGGAR)) == ploc (mynum)) sendf (ploc (mynum), "%s says 'To continue on, you must forego all worldly " "possessions.'\n", pname (max_players + MOB_CATACOMB_BEGGAR)); return -1; } else { bprintf ("The steep and slippery sides of the pool make it " "impossible to climb down\nwithout dropping everything " "first.\n"); return -1; } for (i = max_players; (!mtstflg (i, MFL_BAR_D) || ploc (i) != ploc (mynum) || alive (i) == -1) && i < numchars; i++); if (mtstflg (i, MFL_BAR_D) && alive (i) != -1 && ploc (i) == ploc (mynum) && plev (mynum) < LVL_APPREN) { bprintf ("\001p%s\003 refuses to let you go Down!\n", pname (i)); return -1; } #ifdef LOCMIN_NIBELUNG /* Stop going down unless drink potion */ if (ploc(mynum) == LOC_NIBELUNG_84) { if ((oloc(OBJ_NIBELUNG_POTION) != mynum) || (!otstbit(OBJ_NIBELUNG_POTION, OFL_DESTROYED))) { bprintf("You are overcome by a forboding feeling of darkness!!\n"); return 0; } } #endif #ifdef LOCMIN_KASTLE if (newch == LOC_KASTLE_11 && ploc(mynum) == LOC_KASTLE_10) if (!iswornby(OBJ_KASTLE_SKIS, mynum)) { teletrap(LOC_KASTLE_24); return 0; } else { bprintf("You shuss down the glacier like an expert on your skis.\n"); questsdone[Q_SKI] = True; if (!qtstflg(mynum, Q_SKI)) { qsetflg(mynum, Q_SKI); send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX, NOBODY, NOBODY, "[%s solved the SkiLesson Quest]\n", pname(mynum)); bprintf("You have successfully completed your Skiing lesson!\n"); } } #endif } if (n == EX_UP) { for (i = max_players; (!mtstflg (i, MFL_BAR_U) || ploc (i) != ploc (mynum) || alive (i) == -1) && i < numchars; i++); if (mtstflg (i, MFL_BAR_U) && alive (i) != -1 && ploc (i) == ploc (mynum) && plev (mynum) < LVL_APPREN) { bprintf ("\001p%s\003 blocks your way up!\n", pname (i)); return -1; } #ifdef LOCMIN_ANCIENT if ((i = ploc (mynum)) == ploc ((max_players + MOB_ANCIENT_RATTLESNAKE)) && alive ((max_players + MOB_ANCIENT_RATTLESNAKE)) != -1 && (!ishere (OBJ_ANCIENT_CHAIN) || !ishere (OBJ_ANCIENT_RBLOCK) || !ishere (OBJ_ANCIENT_RCOINS) || !ishere (OBJ_ANCIENT_RPLATE))) { hit_player (max_players + MOB_ANCIENT_RATTLESNAKE, mynum, -1); return -1; } #endif } if (n == EX_SOUTH) { if ((i = alive ((max_players + MOB_WINDOW_FIGURE))) != mynum && i != -1 && ploc (i) == ploc (mynum) && !iswornby (OBJ_WINDOW_BLACKROBE, mynum)) { bprintf ("\001pThe Figure\003 holds you back!\n"); bprintf ("\001pThe Figure\003 says 'Only true sorcerors may pass.'\n"); return -1; } for (i = max_players; (!mtstflg (i, MFL_BAR_S) || ploc (i) != ploc (mynum) || alive (i) == -1) && i < numchars; i++); if (mtstflg (i, MFL_BAR_S) && alive (i) != -1 && ploc (i) == ploc (mynum) && plev (mynum) < LVL_APPREN) { bprintf ("\001p%s\003 holds you back!\n", pname (i)); return -1; } #ifdef LOCMIN_KASTLE if (newch == LOC_KASTLE_11 && ploc(mynum) == LOC_KASTLE_10) if (!iswornby(OBJ_KASTLE_SKIS, mynum)) { teletrap (LOC_KASTLE_24); return 0; } else { bprintf("You shuss down the glacier like an expert on your skis.\n"); questsdone[Q_SKI] = True; if (!qtstflg(mynum, Q_SKI)) { qsetflg(mynum, Q_SKI); send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX, NOBODY, NOBODY, "[%s solved the SkiLesson Quest]\n", pname(mynum)); bprintf("You have successfully completed your Skiing lesson!\n"); } } #endif } if (n == EX_EAST) { if ((i = alive ((max_players + MOB_OAKTREE_VIOLA))) != mynum && i != -1 && ploc (i) == ploc (mynum) && carries_obj_type (i, OBJ_OAKTREE_FAN) == -1) { bprintf ("\001pViola\003 says 'How dare you come to our land! " "Leave at once!'\n"); return -1; } #ifdef LOCMIN_OAKTREE if ((alive(max_players + MOB_OAKTREE_ENT) != -1) && (ploc(max_players + MOB_OAKTREE_ENT) == ploc(mynum)) && (strcmp(pname(max_players + MOB_OAKTREE_ENT), "") != 0)) { bprintf("The Ent pushes its branches in your way, preventing you from moving east.\n"); return -1; } #endif for (i = max_players; (!mtstflg (i, MFL_BAR_E) || ploc (i) != ploc (mynum) || alive (i) == -1) && i < numchars; i++); if (mtstflg (i, MFL_BAR_E) && alive (i) != -1 && ploc (i) == ploc (mynum) && plev (mynum) < LVL_APPREN) { bprintf ("\001p%s\003 won't let you go East!\n", pname (i)); return -1; } } if (ltstflg (newch, LFL_ON_WATER)) { if (plev (mynum) < LVL_APPREN && (!carries_boat (mynum) && !ststflg(mynum, SFL_GHOST))) { bprintf ("You need a boat to go to sea!\n"); return -1; } } if (ltstflg (newch, LFL_IN_WATER)) { if (plev (mynum) < LVL_APPREN) { if ((!iswornby(OBJ_TREEHOUSE_AMULET, mynum)) && (!iswornby(OBJ_BLIZZARD_TALISMAN, mynum))) { bprintf ("You'd surely drown!\n"); return -1; } else { bprintf("You see bubbles rising as you exhale under water.\n"); } } } if (n == EX_DOWN && ploc (mynum) == LOC_OAKTREE_LANDING) { bprintf ("You slide down the banister. Wheee!\n"); send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s slides down the banister shouting 'Yippeee...'\n", pname (mynum)); send_msg (newch, 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s slides down the banister and lands at your feet.\n", pname (mynum)); if (oloc (OBJ_OAKTREE_MARBLEBUST) == newch) { bprintf ("On your way down, you smash a valuable bust.\n"); send_msg (newch, 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s smashed a valuable bust on %s way down.\n", pname (mynum), his_or_her (mynum)); destroy (OBJ_OAKTREE_MARBLEBUST); create (OBJ_OAKTREE_BUSTBROKEN); } } else if (mynum < max_players && cur_player->asmortal > 0) { send_msg (ploc (mynum), 0, max (LVL_APPREN, pvis (mynum)), LVL_MAX, mynum, NOBODY, "%s\n", build_setin (block, cur_player->setout, pname (mynum), exittxt[n])); send_msg (newch, 0, max (LVL_APPREN, pvis (mynum)), LVL_MAX, mynum, NOBODY, "%s\n", build_setin (block, cur_player->setin, pname (mynum), NULL)); if (pvis (mynum) < LVL_APPREN) { send_msg (ploc (mynum), 0, pvis (mynum), LVL_APPREN, NOBODY, NOBODY, "%s has gone %s.\n", pname (mynum), exittxt[n]); send_msg (newch, 0, pvis (mynum), LVL_APPREN, NOBODY, NOBODY, "%s has arrived.\n", pname (mynum)); } } else { send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s\n", build_setin (block, cur_player->setout, pname (mynum), exittxt[n])); send_msg (newch, 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s\n", build_setin (block, cur_player->setin, pname (mynum), NULL)); } setpfighting (mynum, -1); myloc = ploc(mynum); trapch(newch); save_mynum = mynum; save_real_mynum = real_mynum; for (i=0; i<max_players; i++) if (players[i].iamon && (players[i].i_follow == save_mynum) && (ploc(i) == myloc)) { setup_globals(i); dodirn(vb); } setup_globals(save_real_mynum); return 0; } int dogocom () { int a = (brkword () == -1) ? get_rand_exit_dir (ploc (mynum)) : chklist (wordbuf, exittxt, exitnum) - 1; if (a < 0 || a >= NEXITS) { bprintf ("Go where?\n"); return -1; } return dodirn (a + 2); }