-+-+-+-+-+-+-+-+ START OF PART 64 -+-+-+-+-+-+-+-+ X (void) mmove(dir, &y, &x); X dist++; X c_ptr = &cave`5By`5D`5Bx`5D; X /* note, this ray can move through walls as it turns them to mud */ X if (dist == OBJ_BOLT_RANGE) X`09flag = TRUE; X if ((c_ptr->fval >= MIN_CAVE_WALL) && (c_ptr->fval != BOUNDARY_WALL)) X`09`7B X`09 flag = TRUE; X`09 (void) twall(y, x, 1, 0); X`09 if (test_light(y, x)) X`09 `7B X`09 msg_print("The wall turns into mud."); X`09 wall = TRUE; X`09 `7D X`09`7D X else if ((c_ptr->tptr != 0) && (c_ptr->fval >= MIN_CLOSED_SPACE)) X`09`7B X`09 flag = TRUE; X`09 if (panel_contains(y, x) && test_light(y, x)) X`09 `7B X`09 objdes(tmp_str, &t_list`5Bc_ptr->tptr`5D, FALSE); X`09 (void) sprintf(out_val, "The %s turns into mud.", tmp_str); X`09 msg_print(out_val); X`09 wall = TRUE; X`09 `7D X`09 (void) delete_object(y, x); X`09`7D X if (c_ptr->cptr > 1) X`09`7B X`09 m_ptr = &m_list`5Bc_ptr->cptr`5D; X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09 if (CD_STONE & r_ptr->cdefense) X`09 `7B X`09 monster_name (m_name, m_ptr, r_ptr); X`09 i = mon_take_hit((int)c_ptr->cptr, 100); X`09 /* Should get these messages even if the monster is not X`09`09 visible. */ X`09 if (i >= 0) X`09`09`7B X`09`09 c_recall`5Bi`5D.r_cdefense `7C= CD_STONE; X`09`09 (void) sprintf(out_val, "%s dissolves!", m_name); X`09`09 msg_print(out_val); X`09`09 prt_experience(); /* print msg before calling prt_exp */ X`09`09`7D X`09 else X`09`09`7B X`09`09 c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_STONE; X`09`09 (void) sprintf(out_val, "%s grunts in pain!",m_name); X`09`09 msg_print(out_val); X`09`09`7D X`09 flag = TRUE; X`09 `7D X`09`7D X `7D X while (!flag); X return(wall); X`7D X X X/* Destroy all traps and doors in a given direction`09-RAK-`09*/ Xint td_destroy2(dir, y, x) Xint dir, y, x; X`7B X register int destroy2, dist; X register cave_type *c_ptr; X register inven_type *t_ptr; X X destroy2 = FALSE; X dist= 0; X do X `7B X (void) mmove(dir, &y, &x); X dist++; X c_ptr = &cave`5By`5D`5Bx`5D; X /* must move into first closed spot, as it might be a secret door */ X if (c_ptr->tptr != 0) X`09`7B X`09 t_ptr = &t_list`5Bc_ptr->tptr`5D; X`09 if ((t_ptr->tval == TV_INVIS_TRAP) `7C`7C (t_ptr->tval == TV_CLOSED_DOO VR) X`09 `7C`7C (t_ptr->tval == TV_VIS_TRAP) `7C`7C (t_ptr->tval == TV_OPEN_ VDOOR) X`09 `7C`7C (t_ptr->tval == TV_SECRET_DOOR)) X`09 `7B X`09 if (delete_object(y, x)) X`09`09`7B X`09`09 msg_print("There is a bright flash of light!"); X`09`09 destroy2 = TRUE; X`09`09`7D X`09 `7D X`09 else if (t_ptr->tval == TV_CHEST) X`09 `7B X`09 msg_print("Click!"); X`09 t_ptr->flags &= `7E(CH_TRAPPED`7CCH_LOCKED); X`09 destroy2 = TRUE; X`09 t_ptr->name2 = SN_UNLOCKED; X`09 known2(t_ptr); X`09 `7D X`09`7D X `7D X while ((dist <= OBJ_BOLT_RANGE) `7C`7C c_ptr->fval <= MAX_OPEN_SPACE); X return(destroy2); X`7D X X X/* Polymorph a monster`09`09`09`09`09-RAK-`09*/ X/* NOTE: cannot polymorph a winning creature (BALROG)`09`09 */ Xint poly_monster(dir, y, x) Xint dir, y, x; X`7B X int dist, flag, poly; X register cave_type *c_ptr; X register creature_type *r_ptr; X register monster_type *m_ptr; X vtype out_val, m_name; X X poly = FALSE; X flag = FALSE; X dist = 0; X do X `7B X (void) mmove(dir, &y, &x); X dist++; X c_ptr = &cave`5By`5D`5Bx`5D; X if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE) X`09flag = TRUE; X else if (c_ptr->cptr > 1) X`09`7B X`09 m_ptr = &m_list`5Bc_ptr->cptr`5D; X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09 if (randint(MAX_MONS_LEVEL) > r_ptr->level) X`09 `7B X`09 flag = TRUE; X`09 delete_monster((int)c_ptr->cptr); X`09 /* Place_monster() should always return TRUE here. */ X`09 poly = place_monster(y, x, X`09`09`09`09 randint(m_level`5BMAX_MONS_LEVEL`5D-m_level`5B0`5D) X`09`09`09`09 - 1 + m_level`5B0`5D, FALSE); X`09 /* don't test c_ptr->fm here, only pl/tl */ X`09 if (poly && panel_contains(y, x) && (c_ptr->tl `7C`7C c_ptr->pl)) X`09`09poly = TRUE; X`09 `7D X`09 else X`09 `7B X`09 monster_name (m_name, m_ptr, r_ptr); X`09 (void) sprintf(out_val, "%s is unaffected.", m_name); X`09 msg_print(out_val); X`09 `7D X`09`7D X `7D X while (!flag); X return(poly); X`7D X X X/* Create a wall.`09`09`09`09`09-RAK-`09*/ Xint build_wall(dir, y, x) Xint dir, y, x; X`7B X register int i; X int build, damage, dist, flag; X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype m_name, out_val; X#ifdef ATARIST_MWC X int32u holder; X#endif X X build = FALSE; X dist = 0; X flag = FALSE; X do X `7B X (void) mmove(dir, &y, &x); X dist++; X c_ptr = &cave`5By`5D`5Bx`5D; X if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE) X`09flag = TRUE; X else X`09`7B X`09 if (c_ptr->tptr != 0) X`09 (void) delete_object(y, x); X`09 if (c_ptr->cptr > 1) X`09 `7B X`09 /* stop the wall building */ X`09 flag = TRUE; X`09 m_ptr = &m_list`5Bc_ptr->cptr`5D; X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X X#ifdef ATARIST_MWC X`09 if (!(r_ptr->cmove & (holder = CM_PHASE))) X#else X`09 if (!(r_ptr->cmove & CM_PHASE)) X#endif X`09`09`7B X`09`09 /* monster does not move, can't escape the wall */ X`09`09 if (r_ptr->cmove & CM_ATTACK_ONLY) X`09`09 damage = 3000; /* this will kill everything */ X`09`09 else X`09`09 damage = damroll (4, 8); X X`09`09 monster_name (m_name, m_ptr, r_ptr); X`09`09 (void) sprintf (out_val, "%s wails out in pain!", m_name); X`09`09 msg_print (out_val); X`09`09 i = mon_take_hit((int)c_ptr->cptr, damage); X`09`09 if (i >= 0) X`09`09 `7B X`09`09 (void) sprintf (out_val, "%s is embedded in the rock.", X`09`09`09`09 m_name); X`09`09 msg_print (out_val); X`09`09 prt_experience(); X`09`09 `7D X`09`09`7D X`09 else if (r_ptr->cchar == 'E' `7C`7C r_ptr->cchar == 'X') X`09`09`7B X`09`09 /* must be an earth elemental or an earth spirit, or a Xorn X`09`09 increase its hit points */ X`09`09 m_ptr->hp += damroll(4, 8); X`09`09`7D X`09 `7D X`09 c_ptr->fval = MAGMA_WALL; X`09 c_ptr->fm = FALSE; X`09 /* Permanently light this wall if it is lit by player's lamp. */ X`09 c_ptr->pl = (c_ptr->tl `7C`7C c_ptr->pl); X`09 lite_spot(y, x); X`09 i++; X`09 build = TRUE; X`09`7D X `7D X while (!flag); X return(build); X`7D X X X/* Replicate a creature`09`09`09`09`09-RAK-`09*/ Xint clone_monster(dir, y, x) Xint dir, y, x; X`7B X register cave_type *c_ptr; X register int dist, flag; X X dist = 0; X flag = FALSE; X do X `7B X (void) mmove(dir, &y, &x); X dist++; X c_ptr = &cave`5By`5D`5Bx`5D; X if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE) X`09flag = TRUE; X else if (c_ptr->cptr > 1) X`09`7B X`09 m_list`5Bc_ptr->cptr`5D.csleep = 0; X`09 /* monptr of 0 is safe here, since can't reach here from creatures */ X`09 return multiply_monster(y, x, (int)m_list`5Bc_ptr->cptr`5D.mptr, 0); X`09`7D X `7D X while (!flag); X return(FALSE); X`7D X X X/* Move the creature record to a new location`09`09-RAK-`09*/ Xvoid teleport_away(monptr, dis) Xint monptr, dis; X`7B X register int yn, xn, ctr; X register monster_type *m_ptr; X X m_ptr = &m_list`5Bmonptr`5D; X ctr = 0; X do X `7B X do X`09`7B X`09 yn = m_ptr->fy + (randint(2*dis+1) - (dis + 1)); X`09 xn = m_ptr->fx + (randint(2*dis+1) - (dis + 1)); X`09`7D X while (!in_bounds(yn, xn)); X ctr++; X if (ctr > 9) X`09`7B X`09 ctr = 0; X`09 dis += 5; X`09`7D X `7D X while ((cave`5Byn`5D`5Bxn`5D.fval >= MIN_CLOSED_SPACE) `7C`7C (cave`5Byn`5 VD`5Bxn`5D.cptr != 0)); X move_rec((int)m_ptr->fy, (int)m_ptr->fx, yn, xn); X lite_spot((int)m_ptr->fy, (int)m_ptr->fx); X m_ptr->fy = yn; X m_ptr->fx = xn; X /* this is necessary, because the creature is not currently visible X in its new position */ X m_ptr->ml = FALSE; X m_ptr->cdis = distance (char_row, char_col, yn, xn); X update_mon (monptr); X`7D X X X/* Teleport player to spell casting creature`09`09-RAK-`09*/ Xvoid teleport_to(ny, nx) Xint ny, nx; X`7B X int dis, ctr, y, x; X register int i, j; X register cave_type *c_ptr; X X dis = 1; X ctr = 0; X do X `7B X y = ny + (randint(2*dis+1) - (dis + 1)); X x = nx + (randint(2*dis+1) - (dis + 1)); X ctr++; X if (ctr > 9) X`09`7B X`09 ctr = 0; X`09 dis++; X`09`7D X `7D X while (!in_bounds(y, x) `7C`7C (cave`5By`5D`5Bx`5D.fval >= MIN_CLOSED_SPAC VE) X`09 `7C`7C (cave`5By`5D`5Bx`5D.cptr >= 2)); X move_rec(char_row, char_col, y, x); X for (i = char_row-1; i <= char_row+1; i++) X for (j = char_col-1; j <= char_col+1; j++) X `7B X`09c_ptr = &cave`5Bi`5D`5Bj`5D; X`09c_ptr->tl = FALSE; X`09lite_spot(i, j); X `7D X lite_spot(char_row, char_col); X char_row = y; X char_col = x; X check_view(); X /* light creatures */ X creatures(FALSE); X`7D X X X/* Teleport all creatures in a given direction away`09-RAK-`09*/ Xint teleport_monster(dir, y, x) Xint dir, y, x; X`7B X register int flag, result, dist; X register cave_type *c_ptr; X X flag = FALSE; X result = FALSE; X dist = 0; X do X `7B X (void) mmove(dir, &y, &x); X dist++; X c_ptr = &cave`5By`5D`5Bx`5D; X if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE) X`09flag = TRUE; X else if (c_ptr->cptr > 1) X`09`7B X`09 m_list`5Bc_ptr->cptr`5D.csleep = 0; /* wake it up */ X`09 teleport_away((int)c_ptr->cptr, MAX_SIGHT); X`09 result = TRUE; X`09`7D X `7D X while (!flag); X return(result); X`7D X X X/* Delete all creatures within max_sight distance`09-RAK-`09*/ X/* NOTE : Winning creatures cannot be genocided`09`09`09 */ Xint mass_genocide() X`7B X register int i, result; X register monster_type *m_ptr; X register creature_type *r_ptr; X#ifdef ATARIST_MWC X int32u holder; X#endif X X result = FALSE; X for (i = mfptr - 1; i >= MIN_MONIX; i--) X `7B X m_ptr = &m_list`5Bi`5D; X r_ptr = &c_list`5Bm_ptr->mptr`5D; X#ifdef ATARIST_MWC X if ((m_ptr->cdis <= MAX_SIGHT) && X`09 ((r_ptr->cmove & (holder = CM_WIN)) == 0)) X#else X if ((m_ptr->cdis <= MAX_SIGHT) && ((r_ptr->cmove & CM_WIN) == 0)) X#endif X`09`7B X`09 delete_monster(i); X`09 result = TRUE; X`09`7D X `7D X return(result); X`7D X X/* Delete all creatures of a given type from level.`09-RAK-`09*/ X/* This does not keep creatures of type from appearing later.`09 */ X/* NOTE : Winning creatures can not be genocided. */ Xint genocide() X`7B X register int i, killed; X char typ; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val; X#ifdef ATARIST_MWC X int32u holder; X#endif X X killed = FALSE; X if (get_com("Which type of creature do you wish exterminated?", &typ)) X for (i = mfptr - 1; i >= MIN_MONIX; i--) X `7B X`09m_ptr = &m_list`5Bi`5D; X`09r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09if (typ == c_list`5Bm_ptr->mptr`5D.cchar) X#ifdef ATARIST_MWC X`09 if ((r_ptr->cmove & (holder = CM_WIN)) == 0) X#else X`09 if ((r_ptr->cmove & CM_WIN) == 0) X#endif X`09 `7B X`09 delete_monster(i); X`09 killed = TRUE; X`09 `7D X`09 else X`09 `7B X`09 /* genocide is a powerful spell, so we will let the player X`09`09 know the names of the creatures he did not destroy, X`09`09 this message makes no sense otherwise */ X`09 (void) sprintf(out_val, "The %s is unaffected.", r_ptr->name); X`09 msg_print(out_val); X`09 `7D X `7D X return(killed); X`7D X X X/* Change speed of any creature .`09`09`09-RAK-`09*/ X/* NOTE: cannot slow a winning creature (BALROG)`09`09 */ Xint speed_monsters(spd) Xint spd; X`7B X register int i, speed; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X speed = FALSE; X for (i = mfptr - 1; i >= MIN_MONIX; i--) X `7B X m_ptr = &m_list`5Bi`5D; X r_ptr = &c_list`5Bm_ptr->mptr`5D; X monster_name (m_name, m_ptr, r_ptr); X X if ((m_ptr->cdis > MAX_SIGHT) `7C`7C X`09 !los(char_row, char_col, (int)m_ptr->fy, (int)m_ptr->fx)) X`09/* do nothing */ X`09; X else if (spd > 0) X`09`7B X`09 m_ptr->cspeed += spd; X`09 m_ptr->csleep = 0; X`09 if (m_ptr->ml) X`09 `7B X`09 speed = TRUE; X`09 (void) sprintf (out_val, "%s starts moving faster.", m_name); X`09 msg_print (out_val); X`09 `7D X`09`7D X else if (randint(MAX_MONS_LEVEL) > r_ptr->level) X`09`7B X`09 m_ptr->cspeed += spd; X`09 m_ptr->csleep = 0; X`09 if (m_ptr->ml) X`09 `7B X`09 (void) sprintf (out_val, "%s starts moving slower.", m_name); X`09 msg_print (out_val); X`09 speed = TRUE; X`09 `7D X`09`7D X else if (m_ptr->ml) X`09`7B X`09 m_ptr->csleep = 0; X`09 (void) sprintf(out_val, "%s is unaffected.", m_name); X`09 msg_print(out_val); X`09`7D X `7D X return(speed); X`7D X X X/* Sleep any creature .`09`09-RAK-`09*/ Xint sleep_monsters2() X`7B X register int i, sleep; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X sleep = FALSE; X for (i = mfptr - 1; i >= MIN_MONIX; i--) X `7B X m_ptr = &m_list`5Bi`5D; X r_ptr = &c_list`5Bm_ptr->mptr`5D; X monster_name (m_name, m_ptr, r_ptr); X if ((m_ptr->cdis > MAX_SIGHT) `7C`7C`20 X`09 !los(char_row, char_col, (int)m_ptr->fy, (int)m_ptr->fx)) X`09/* do nothing */ X`09; X else if ((randint(MAX_MONS_LEVEL) < r_ptr->level) `7C`7C X`09 (CD_NO_SLEEP & r_ptr->cdefense)) X`09`7B X`09 if (m_ptr->ml) X`09 `7B X`09 if (r_ptr->cdefense & CD_NO_SLEEP) X`09`09c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_NO_SLEEP; X`09 (void) sprintf(out_val, "%s is unaffected.", m_name); X`09 msg_print(out_val); X`09 `7D X`09`7D X else X`09`7B X`09 m_ptr->csleep = 500; X`09 if (m_ptr->ml) X`09 `7B X`09 (void) sprintf(out_val, "%s falls asleep.", m_name); X`09 msg_print(out_val); +-+-+-+-+-+-+-+- END OF PART 64 +-+-+-+-+-+-+-+-