static void _cyber_move_player(void) { /* Cyberdemons move erratically (cf get_rep_dir()) and make a lot of noise */ if (one_in_(66)) { int i; cmsg_print(TERM_RED, "The dungeon trembles!"); if (disturb_minor) disturb(0, 0); for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; if (!m_ptr->r_idx) continue; if (m_ptr->cdis < MAX_SIGHT * 2 && MON_CSLEEP(m_ptr)) (void)set_monster_csleep(i, 0); } } }
bool duelist_issue_challenge(void) { bool result = FALSE; int m_idx = 0; if (target_set(TARGET_MARK)) { msg_flag = FALSE; /* Bug ... we get an extra -more- prompt after target_set() ... */ if (target_who > 0) m_idx = target_who; else m_idx = cave[target_row][target_col].m_idx; } if (m_idx) { if (m_idx == p_ptr->duelist_target_idx) msg_format("%^s has already been challenged.", duelist_current_challenge()); else { /* of course, we must first set the target index before duelist_current_challenge() will return the correct text */ p_ptr->duelist_target_idx = m_idx; msg_format("You challenge %s to a duel!", duelist_current_challenge()); set_monster_csleep(m_idx, 0); set_hostile(&m_list[m_idx]); result = TRUE; } } else if (p_ptr->duelist_target_idx) { p_ptr->duelist_target_idx = 0; msg_print("You cancel your current challenge!"); } p_ptr->redraw |= PR_STATUS; return result; }
/**************************************************************** * Spells ****************************************************************/ static void _kiss_spell(int cmd, variant *res) { switch (cmd) { case SPELL_NAME: var_set_string(res, "Kiss"); break; case SPELL_DESC: var_set_string(res, "Attempt to charm an adjacent monster."); break; case SPELL_COST_EXTRA: var_set_int(res, p_ptr->lev * 2); break; case SPELL_CAST: { int y, x, dir = 0, m_idx; var_set_bool(res, FALSE); if (!get_rep_dir2(&dir)) return; if (dir == 5) return; y = py + ddy[dir]; x = px + ddx[dir]; m_idx = cave[y][x].m_idx; if (m_idx) { monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; char desc[MAX_NLEN]; monster_desc(desc, m_ptr, 0); if ((r_ptr->flags1 & RF1_UNIQUE) || mon_save_p(m_ptr->r_idx, A_CHR)) { set_monster_csleep(m_idx, 0); if (is_hostile(m_ptr)) { switch (randint1(10)) { case 1: msg_format("%^s says 'Impudent Strumpet!'", desc); break; case 2: msg_format("%^s says 'Ewwww! Gross!!'", desc); break; case 3: msg_format("%^s says 'You ain't my type!'", desc); break; default: msg_format("%^s resists your charms.", desc); } if (allow_ticked_off(r_ptr)) { m_ptr->anger_ct++; } } else msg_format("%^s ignores you.", desc); } else { if (is_pet(m_ptr)) msg_format("%^s slobbers on you affectionately.", desc); else if (is_friendly(m_ptr)) { set_pet(m_ptr); msg_format("%^s is charmed!", desc); } else { set_friendly(m_ptr); msg_format("%^s suddenly becomes friendly.", desc); } } var_set_bool(res, TRUE); } else { msg_print("There is no monster."); } break; } default: default_spell(cmd, res); break; } }
_rush_result _rush_attack(int rng, _rush_type type) { _rush_result result = _rush_cancelled; int tx, ty; int tm_idx = 0; u16b path_g[32]; int path_n, i; bool moved = FALSE; int flg = 0; int dis = 0; if (type == _rush_normal) flg = PROJECT_STOP | PROJECT_KILL; else if (type == _rush_acrobatic) flg = PROJECT_THRU | PROJECT_KILL; else flg = PROJECT_DISI | PROJECT_THRU; if (!p_ptr->duelist_target_idx) { msg_print("You need to select a foe first (Mark Target)."); return result; } tm_idx = p_ptr->duelist_target_idx; tx = m_list[tm_idx].fx; ty = m_list[tm_idx].fy; dis = distance(ty, tx, py, px); /* Foe must be visible. For all charges except the phase charge, the foe must also be in your line of sight */ if (!m_list[p_ptr->duelist_target_idx].ml || (type != _rush_phase && !los(ty, tx, py, px))) { msg_format("%^s is not in your line of sight.", duelist_current_challenge()); return result; } if (dis > rng) { msg_format("Your foe is out of range (%d vs %d).", dis, rng); if (!get_check("Charge anyway? ")) return result; } project_length = rng; path_n = project_path(path_g, project_length, py, px, ty, tx, flg); project_length = 0; if (!path_n) return result; result = _rush_failed; /* Use ty and tx as to-move point */ ty = py; tx = px; /* Scrolling the cave would invalidate our path! */ if (!dun_level && !p_ptr->wild_mode && !p_ptr->inside_arena && !p_ptr->inside_battle) wilderness_scroll_lock = TRUE; /* Project along the path */ for (i = 0; i < path_n; i++) { monster_type *m_ptr; cave_type *c_ptr; bool can_enter = FALSE; bool old_pass_wall = p_ptr->pass_wall; int ny = GRID_Y(path_g[i]); int nx = GRID_X(path_g[i]); c_ptr = &cave[ny][nx]; switch (type) { case _rush_normal: can_enter = cave_empty_bold(ny, nx) && player_can_enter(c_ptr->feat, 0); break; case _rush_acrobatic: can_enter = !c_ptr->m_idx && player_can_enter(c_ptr->feat, 0); break; case _rush_phase: p_ptr->pass_wall = TRUE; can_enter = !c_ptr->m_idx && player_can_enter(c_ptr->feat, 0); p_ptr->pass_wall = old_pass_wall; break; } if (can_enter) { ty = ny; tx = nx; continue; } if (!c_ptr->m_idx) { msg_print("Failed!"); break; } /* Move player before updating the monster */ if (!player_bold(ty, tx)) move_player_effect(ty, tx, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP); moved = TRUE; /* Update the monster */ update_mon(c_ptr->m_idx, TRUE); /* Found a monster */ m_ptr = &m_list[c_ptr->m_idx]; /* But it is not the monster we seek! */ if (tm_idx != c_ptr->m_idx) { /* Acrobatic Charge attempts to displace monsters on route */ if (type == _rush_acrobatic) { /* Swap position of player and monster */ set_monster_csleep(c_ptr->m_idx, 0); move_player_effect(ny, nx, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP); ty = ny; tx = nx; continue; } /* Normal Charge just attacks first monster on route */ else msg_format("There is %s in the way!", m_ptr->ml ? (tm_idx ? "another monster" : "a monster") : "someone"); } /* Attack the monster */ if (tm_idx == p_ptr->duelist_target_idx) result = _rush_succeeded; py_attack(ny, nx, 0); break; } if (!moved && !player_bold(ty, tx)) move_player_effect(ty, tx, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP); if (!dun_level && !p_ptr->wild_mode && !p_ptr->inside_arena && !p_ptr->inside_battle) { wilderness_scroll_lock = FALSE; wilderness_move_player(px, py); } return result; }