-+-+-+-+-+-+-+-+ START OF PART 63 -+-+-+-+-+-+-+-+ X`09`09`09`09 if (m_ptr->ml) X`09`09`09`09 c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C=harm_type; X`09`09`09`09`7D X`09`09`09 else if (weapon_type & r_ptr->spells) X`09`09`09`09`7B X`09`09`09`09 dam = dam / 4; X`09`09`09`09 if (m_ptr->ml) X`09`09`09`09 c_recall`5Bm_ptr->mptr`5D.r_spells `7C=weapon_type; X`09`09`09`09`7D X`09`09`09 dam = (dam/(distance(i, j, y, x)+1)); X`09`09`09 k = mon_take_hit((int)c_ptr->cptr, dam); X`09`09`09 if (k >= 0) X`09`09`09`09tkill++; X`09`09`09 c_ptr->pl = tmp; X`09`09`09 `7D X`09`09`09 else if (panel_contains(i, j) &&(py.flags.blind < 1)) X`09`09`09 print('*', i, j); X`09`09`09`7D X`09`09 `7D X`09 /* show ball of whatever */ X`09 put_qio(); X X`09 for (i = (y - 2); i <= (y + 2); i++) X`09`09for (j = (x - 2); j <= (x + 2); j++) X`09`09 if (in_bounds(i, j) && panel_contains(i, j) && X`09`09 (distance(y, x, i, j) <= max_dis)) X`09`09 lite_spot(i, j); X X`09 /* End explosion.`09`09 */ X`09 if (thit == 1) X`09`09`7B X`09`09 (void) sprintf(out_val, X`09`09`09`09 "The %s envelops a creature!", X`09`09`09`09 descrip); X`09`09 msg_print(out_val); X`09`09`7D X`09 else if (thit > 1) X`09`09`7B X`09`09 (void) sprintf(out_val, X`09`09`09`09 "The %s envelops several creatures!", X`09`09`09`09 descrip); X`09`09 msg_print(out_val); X`09`09`7D X`09 if (tkill == 1) X`09`09msg_print("There is a scream of agony!"); X`09 else if (tkill > 1) X`09`09msg_print("There are several screams of agony!"); X`09 if (tkill >= 0) X`09`09prt_experience(); X`09 /* End ball hitting.`09`09 */ X`09 `7D X`09 else if (panel_contains(y, x) && (py.flags.blind < 1)) X`09 `7B X`09 print('*', y, x); X`09 /* show bolt */ X`09 put_qio(); X`09 `7D X`09 oldy = y; X`09 oldx = x; X`09`7D X `7D X while (!flag); X`7D X X X/* Breath weapon works like a fire_ball, but affects the player. */ X/* Note the area affect.`09`09`09 -RAK- */ Xvoid breath(typ, y, x, dam_hp, ddesc, monptr) Xint typ, y, x, dam_hp; Xchar *ddesc; Xint monptr; X`7B X register int i, j; X int dam, max_dis, harm_type; X int32u weapon_type; X int32u tmp, treas; X int (*destroy)(); X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X#ifdef ATARIST_MWC X int32u holder; X#endif X X max_dis = 2; X get_flags(typ, &weapon_type, &harm_type, &destroy); X for (i = y-2; i <= y+2; i++) X for (j = x-2; j <= x+2; j++) X if (in_bounds(i, j) && (distance(y, x, i, j) <= max_dis) X`09 && los(y, x, i, j)) X`09`7B X`09 c_ptr = &cave`5Bi`5D`5Bj`5D; X`09 if ((c_ptr->tptr != 0) && X`09 (*destroy)(&t_list`5Bc_ptr->tptr`5D)) X`09 (void) delete_object(i, j); X`09 if (c_ptr->fval <= MAX_OPEN_SPACE) X`09 `7B X`09 /* must test status bit, not py.flags.blind here, flag could have X`09`09 been set by a previous monster, but the breath should still X`09`09 be visible until the blindness takes effect */ X`09 if (panel_contains(i, j) && !(py.flags.status & PY_BLIND)) X`09`09print('*', i, j); X`09 if (c_ptr->cptr > 1) X`09`09`7B X`09`09 m_ptr = &m_list`5Bc_ptr->cptr`5D; X`09`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09`09 dam = dam_hp; X`09`09 if (harm_type & r_ptr->cdefense) X`09`09 dam = dam*2; X`09`09 else if (weapon_type & r_ptr->spells) X`09`09 dam = (dam / 4); X`09`09 dam = (dam/(distance(i, j, y, x)+1)); X`09`09 /* can not call mon_take_hit here, since player does not X`09`09 get experience for kill */ X`09`09 m_ptr->hp = m_ptr->hp - dam; X`09`09 m_ptr->csleep = 0; X`09`09 if (m_ptr->hp < 0) X`09`09 `7B X`09`09 treas = monster_death((int)m_ptr->fy, (int)m_ptr->fx, X`09`09`09`09`09 r_ptr->cmove); X`09`09 if (m_ptr->ml) X`09`09`09`7B X#ifdef ATARIST_MWC X`09`09`09 holder = CM_TREASURE; X`09`09`09 tmp = (c_recall`5Bm_ptr->mptr`5D.r_cmove & holder) X`09`09`09 >> CM_TR_SHIFT; X`09`09`09 if (tmp > ((treas & holder) >> CM_TR_SHIFT)) X`09`09`09 treas = (treas & `7Eholder)`7C(tmp << CM_TR_SHIFT); X`09`09`09 c_recall`5Bm_ptr->mptr`5D.r_cmove = treas `7C X`09`09`09 (c_recall`5Bm_ptr->mptr`5D.r_cmove & `7Eholder); X#else X`09`09`09 tmp = (c_recall`5Bm_ptr->mptr`5D.r_cmove & CM_TREASURE) X`09`09`09 >> CM_TR_SHIFT; X`09`09`09 if (tmp > ((treas & CM_TREASURE) >> CM_TR_SHIFT)) X`09`09`09 treas = (treas & `7ECM_TREASURE)`7C(tmp<mptr`5D.r_cmove = treas `7C X`09`09`09 (c_recall`5Bm_ptr->mptr`5D.r_cmove & `7ECM_TREASURE); X#endif X`09`09`09`7D X X`09`09 /* It ate an already processed monster.Handle normally.*/ X`09`09 if (monptr < c_ptr->cptr) X`09`09`09delete_monster((int) c_ptr->cptr); X`09`09 /* If it eats this monster, an already processed monster X`09`09`09 will take its place, causing all kinds of havoc. X`09`09`09 Delay the kill a bit. */ X`09`09 else X`09`09`09fix1_delete_monster((int) c_ptr->cptr); X`09`09 `7D X`09`09`7D X`09 else if (c_ptr->cptr == 1) X`09`09`7B X`09`09 dam = (dam_hp/(distance(i, j, y, x)+1)); X`09`09 /* let's do at least one point of damage */ X`09`09 /* prevents randint(0) problem with poison_gas, also */ X`09`09 if (dam == 0) X`09`09 dam = 1; X`09`09 switch(typ) X`09`09 `7B X`09`09 case GF_LIGHTNING: light_dam(dam, ddesc); break; X`09`09 case GF_POISON_GAS: poison_gas(dam, ddesc); break; X`09`09 case GF_ACID: acid_dam(dam, ddesc); break; X`09`09 case GF_FROST: cold_dam(dam, ddesc); break; X`09`09 case GF_FIRE: fire_dam(dam, ddesc); break; X`09`09 `7D X`09`09`7D X`09 `7D X`09`7D X /* show the ball of gas */ X put_qio(); X X for (i = (y - 2); i <= (y + 2); i++) X for (j = (x - 2); j <= (x + 2); j++) X if (in_bounds(i, j) && panel_contains(i, j) && X`09 (distance(y, x, i, j) <= max_dis)) X`09lite_spot(i, j); X`7D X X X/* Recharge a wand, staff, or rod. Sometimes the item breaks. -RAK-*/ Xint recharge(num) Xregister int num; X`7B X int i, j, item_val; X register int res; X register inven_type *i_ptr; X X res = FALSE; X if (!find_range(TV_STAFF, TV_WAND, &i, &j)) X msg_print("You have nothing to recharge."); X else if (get_item(&item_val, "Recharge which item?", i, j, CNIL, CNIL)) X `7B X i_ptr = &inventory`5Bitem_val`5D; X res = TRUE; X /* recharge I = recharge(20) = 1/6 failure for empty 10th level wand * V/ X /* recharge II = recharge(60) = 1/10 failure for empty 10th level wand V*/ X /* make it harder to recharge high level, and highly charged wands, no Vte X`09 that i can be negative, so check its value before trying to call X`09 randint(). */ X i = num + 50 - (int)i_ptr->level - i_ptr->p1; X if (i < 19) X`09i = 1;`09/* Automatic failure. */ X else X`09i = randint (i/10); X X if (i == 1) X`09`7B X`09 msg_print("There is a bright flash of light."); X`09 inven_destroy(item_val); X`09`7D X else X`09`7B X`09 num = (num/(i_ptr->level+2)) + 1; X`09 i_ptr->p1 += 2 + randint(num); X`09 if (known2_p(i_ptr)) X`09 clear_known2(i_ptr); X`09 clear_empty(i_ptr); X`09`7D X `7D X return(res); X`7D X X X/* Increase or decrease a creatures hit points`09`09-RAK-`09*/ Xint hp_monster(dir, y, x, dam) Xint dir, y, x, dam; X`7B X register int i; X int flag, dist, monster; X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X monster = 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 flag = TRUE; X`09 m_ptr = &m_list`5Bc_ptr->cptr`5D; X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09 monster_name (m_name, m_ptr, r_ptr); X`09 monster = TRUE; X`09 i = mon_take_hit((int)c_ptr->cptr, dam); X`09 if (i >= 0) X`09 `7B X`09 (void) sprintf(out_val, "%s dies in a fit of agony.", m_name); X`09 msg_print(out_val); X`09 prt_experience(); X`09 `7D X`09 else if (dam > 0) X`09 `7B X`09 (void) sprintf(out_val, "%s screams in agony.", m_name); X`09 msg_print(out_val); X`09 `7D X`09`7D X `7D X while (!flag); X return(monster); X`7D X X X/* Drains life; note it must be living.`09`09-RAK-`09*/ Xint drain_life(dir, y, x) Xint dir, y, x; X`7B X register int i; X int flag, dist, drain; X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X drain = 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 flag = TRUE; X`09 m_ptr = &m_list`5Bc_ptr->cptr`5D; X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09 if ((r_ptr->cdefense & CD_UNDEAD) == 0) X`09 `7B X`09 drain = TRUE; X`09 monster_name (m_name, m_ptr, r_ptr); X`09 i = mon_take_hit((int)c_ptr->cptr, 75); X`09 if (i >= 0) X`09`09`7B X`09`09 (void) sprintf(out_val, "%s dies in a fit of agony.",m_name); X`09`09 msg_print(out_val); X`09`09 prt_experience(); X`09`09`7D X`09 else X`09`09`7B X`09`09 (void) sprintf(out_val, "%s screams in agony.", m_name); X`09`09 msg_print(out_val); X`09`09`7D X`09 `7D X`09 else X`09 c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_UNDEAD; X`09`7D X `7D X while (!flag); X return(drain); X`7D X X X/* Increase or decrease a creatures speed`09`09-RAK-`09*/ X/* NOTE: cannot slow a winning creature (BALROG)`09`09 */ Xint speed_monster(dir, y, x, spd) Xint dir, y, x, spd; X`7B X int flag, dist, speed; X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X speed = 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 flag = TRUE; X`09 m_ptr = &m_list`5Bc_ptr->cptr`5D; X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09 monster_name (m_name, m_ptr, r_ptr); X`09 if (spd > 0) X`09 `7B X`09 m_ptr->cspeed += spd; X`09 m_ptr->csleep = 0; X`09 (void) sprintf (out_val, "%s starts moving faster.", m_name); X`09 msg_print (out_val); X`09 speed = TRUE; X`09 `7D X`09 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 (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 else 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`09`7D X `7D X while (!flag); X return(speed); X`7D X X X/* Confuse a creature`09`09`09`09`09-RAK-`09*/ Xint confuse_monster(dir, y, x) Xint dir, y, x; X`7B X int flag, dist, confuse; X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X confuse = 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 monster_name (m_name, m_ptr, r_ptr); X`09 flag = TRUE; X`09 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 && (r_ptr->cdefense & CD_NO_SLEEP)) X`09`09c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_NO_SLEEP; X`09 /* Monsters which resisted the attack should wake up. X`09`09 Monsters with inane resistence ignore the attack. */ X`09 if (! (CD_NO_SLEEP & r_ptr->cdefense)) X`09`09m_ptr->csleep = 0; X`09 (void) sprintf(out_val, "%s is unaffected.", m_name); X`09 msg_print(out_val); X`09 `7D X`09 else X`09 `7B X`09 m_ptr->confused = TRUE; X`09 confuse = TRUE; X`09 m_ptr->csleep = 0; X`09 (void) sprintf(out_val, "%s appears confused.", m_name); X`09 msg_print(out_val); X`09 `7D X`09`7D X `7D X while (!flag); X return(confuse); X`7D X X X/* Sleep a creature.`09`09`09`09`09-RAK-`09*/ Xint sleep_monster(dir, y, x) Xint dir, y, x; X`7B X int flag, dist, sleep; X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X sleep = 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 flag = TRUE; X`09 monster_name (m_name, m_ptr, r_ptr); X`09 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 && (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 else X`09 `7B X`09 m_ptr->csleep = 500; X`09 sleep = TRUE; X`09 (void) sprintf(out_val, "%s falls asleep.", m_name); X`09 msg_print(out_val); X`09 `7D X`09`7D X `7D X while (!flag); X return(sleep); X`7D X X X/* Turn stone to mud, delete wall.`09`09`09-RAK-`09*/ Xint wall_to_mud(dir, y, x) Xint dir, y, x; X`7B X int i, wall, dist; X bigvtype out_val, tmp_str; X register int flag; X register cave_type *c_ptr; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype m_name; X X wall = FALSE; X flag = FALSE; X dist = 0; X do X `7B +-+-+-+-+-+-+-+- END OF PART 63 +-+-+-+-+-+-+-+-