/* Movement routines (north, south, go, etc.) */ #include "kernel.h" #include "parse.h" #include "objects.h" #include "mobiles.h" #include "locations.h" #include "lflags.h" #include "levels.h" #include "mflags.h" #include "sendsys.h" #include "move.h" static char *exittxt[] = { "north", "east", "south", "west", "up", "down", "n", "e", "s", "w", "u", "d", 0 }; static int exitnum[] = { 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6 }; int dodirn(int vb) { char block[SETIN_MAX], ms[SETIN_MAX]; int i, pc, n; int newch, drnum, droff; 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_BLIZZARD_SLIME_PIT) != 0) { bprintf("That doesn't look like a very good idea!\n"); return -1; } newch = LOC_BLIZZARD_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 (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_BLIZZARD_LAVA_PATH2) { if (!iswornby(OBJ_BLIZZARD_SHIELD1, mynum) && !iswornby(OBJ_BLIZZARD_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_WIZARD) { 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_WIZARD) { 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==0)||(n==1)||(n==2)||(n==5)) { if ((i = alive((max_players + MOB_EFOREST_ASMADEUS))) != -1 && plev(mynum) < LVL_WIZARD && 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_WIZARD) { bprintf("\001p%s\003 refuses to let you go Down!\n", pname(i)); return -1; } } 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_WIZARD) { 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_BLIZZARD_FIGURE))) != mynum && i != -1 && ploc(i) == ploc(mynum) && !iswornby(OBJ_BLIZZARD_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_WIZARD) { bprintf("\001p%s\003 holds you back!\n", pname(i)); return -1; } } 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; } 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_WIZARD) { 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_WIZARD && !carries_boat(mynum)) { bprintf("You need a boat to go to sea!\n"); return -1; } } if (ltstflg(newch, LFL_IN_WATER)) { if (plev(mynum) < LVL_WIZARD) { bprintf("You'd surely drown!\n"); return -1; } } 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_WIZARD,pvis(mynum)), LVL_MAX, mynum, NOBODY, "%s\n", build_setin(block, cur_player -> setout, pname(mynum), exittxt[n])); send_msg(newch, 0, max(LVL_WIZARD,pvis(mynum)), LVL_MAX, mynum, NOBODY, "%s\n", build_setin(block, cur_player -> setin, pname(mynum), NULL )); if ( pvis(mynum) < LVL_WIZARD ) { send_msg(ploc(mynum), 0, pvis(mynum), LVL_WIZARD, NOBODY, NOBODY, "%s has gone %s.\n", pname(mynum), exittxt[n]); send_msg(newch, 0, pvis(mynum), LVL_WIZARD, 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); trapch(newch); 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); }