/* * Tunnel through "walls" (including rubble and secret doors) * * Digging is very difficult without a "digger" weapon, but can be * accomplished by strong players using heavy weapons. */ void do_cmd_tunnel(cmd_code code, cmd_arg args[]) { int y, x, dir; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Oops */ if (!do_cmd_tunnel_test(y, x)) { /* Cancel repeat */ disturb(0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (confuse_dir(&dir)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave_m_idx[y][x] > 0) { if (mon_list[cave_m_idx[y][x]].align & (AL_PET_MASK)) { msg_print("There is a friendly monster in the way!"); } else { /* Message */ msg_print("There is a monster in the way!"); /* Attack */ py_attack(y, x); } } /* Walls */ else { /* Tunnel through walls */ more = do_cmd_tunnel_aux(y, x); } /* Cancel repetition unless we can continue */ if (!more) disturb(0, 0); }
/* * Tunnel through "walls" (including rubble and secret doors) * * Digging is very difficult without a "digger" weapon, but can be * accomplished by strong players using heavy weapons. */ void do_cmd_tunnel(cmd_code code, cmd_arg args[]) { int y, x, dir; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Oops */ if (!do_cmd_tunnel_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave->m_idx[y][x] > 0) { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Walls */ else { /* Tunnel through walls */ more = do_cmd_tunnel_aux(y, x); } /* Cancel repetition unless we can continue */ if (!more) disturb(p_ptr, 0, 0); }
/** * Tunnel through "walls" (including rubble and doors, secret or otherwise) * * Digging is very difficult without a "digger" weapon, but can be * accomplished by strong players using heavy weapons. */ void do_cmd_tunnel(struct command *cmd) { int y, x, dir; bool more = false; /* Get arguments */ if (cmd_get_direction(cmd, "direction", &dir, false)) return; /* Get location */ y = player->py + ddy[dir]; x = player->px + ddx[dir]; /* Oops */ if (!do_cmd_tunnel_test(y, x)) { /* Cancel repeat */ disturb(player, 0); return; } /* Take a turn */ player->upkeep->energy_use = z_info->move_energy; /* Apply confusion */ if (player_confuse_dir(player, &dir, false)) { /* Get location */ y = player->py + ddy[dir]; x = player->px + ddx[dir]; } /* Attack any monster we run into */ if (cave->squares[y][x].mon > 0) { msg("There is a monster in the way!"); py_attack(y, x); } else { /* Tunnel through walls */ more = do_cmd_tunnel_aux(y, x); } /* Cancel repetition unless we can continue */ if (!more) disturb(player, 0); }
/* * Manipulate an adjacent grid in some way * * Attack monsters, tunnel through walls, disarm traps, open doors. * * This command must always take energy, to prevent free detection * of invisible monsters. * * The "semantics" of this command must be chosen before the player * is confused, and it must be verified against the new grid. */ void do_cmd_alter_aux(int dir) { int y, x; bool more = FALSE; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Attack monsters */ if (cave->m_idx[y][x] > 0) py_attack(y, x); /* Tunnel through walls and rubble */ else if (cave_isdiggable(cave, y, x)) more = do_cmd_tunnel_aux(y, x); /* Open closed doors */ else if (cave_iscloseddoor(cave, y, x)) more = do_cmd_open_aux(y, x); /* Disarm traps */ else if (cave_isknowntrap(cave, y, x)) more = do_cmd_disarm_aux(y, x); /* Oops */ else msg("You spin around."); /* Cancel repetition unless we can continue */ if (!more) disturb(p_ptr, 0, 0); }
/** * Manipulate an adjacent grid in some way * * Attack monsters, tunnel through walls, disarm traps, open doors. * * This command must always take energy, to prevent free detection * of invisible monsters. * * The "semantics" of this command must be chosen before the player * is confused, and it must be verified against the new grid. */ void do_cmd_alter_aux(int dir) { int y, x; bool more = false; /* Get location */ y = player->py + ddy[dir]; x = player->px + ddx[dir]; /* Take a turn */ player->upkeep->energy_use = z_info->move_energy; /* Apply confusion */ if (player_confuse_dir(player, &dir, false)) { /* Get location */ y = player->py + ddy[dir]; x = player->px + ddx[dir]; } /* Action depends on what's there */ if (cave->squares[y][x].mon > 0) /* Attack monsters */ py_attack(y, x); else if (square_isdiggable(cave, y, x)) /* Tunnel through walls and rubble */ more = do_cmd_tunnel_aux(y, x); else if (square_iscloseddoor(cave, y, x)) /* Open closed doors */ more = do_cmd_open_aux(y, x); else if (square_isknowntrap(cave, y, x)) /* Disarm traps */ more = do_cmd_disarm_aux(y, x); else /* Oops */ msg("You spin around."); /* Cancel repetition unless we can continue */ if (!more) disturb(player, 0); }
/* * Manipulate an adjacent grid in some way * * Attack monsters, tunnel through walls, disarm traps, open doors. * * This command must always take energy, to prevent free detection * of invisible monsters. * * The "semantics" of this command must be chosen before the player * is confused, and it must be verified against the new grid. */ void do_cmd_alter_aux(int dir) { int y, x; int feat; bool more = FALSE; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Original feature */ feat = cave_feat[y][x]; /* Must have knowledge to know feature XXX XXX */ if (!(cave_info[y][x] & (CAVE_MARK))) feat = FEAT_NONE; /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (confuse_dir(&dir)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Attack monsters */ if (cave_m_idx[y][x] > 0) { if (mon_list[cave_m_idx[y][x]].align & (AL_PET_MASK)) { msg_print("There is a friendly monster in the way!"); } else { /* Attack */ py_attack(y, x); } } /* Tunnel through walls */ else if (feat >= FEAT_SECRET) { more = do_cmd_tunnel_aux(y, x); } #if 0 /* Bash jammed doors */ else if (feat >= FEAT_DOOR_HEAD + 0x08) { more = do_cmd_bash_aux(y, x); } #endif /* Open closed doors */ else if (feat >= FEAT_DOOR_HEAD) { more = do_cmd_open_aux(y, x); } /* Disarm traps */ else if (feat >= FEAT_TRAP_HEAD) { more = do_cmd_disarm_aux(y, x); } #if 0 /* Close open doors */ else if (feat == FEAT_OPEN) { more = do_cmd_close_aux(y, x); } #endif /* Oops */ else { msg_print("You spin around."); } /* Cancel repetition unless we can continue */ if (!more) disturb(0, 0); }
/* * Manipulate an adjacent grid in some way * * Attack monsters, tunnel through walls, disarm traps, open doors, * or, for rogues, set traps and steal money. * * This command must always take energy, to prevent free detection * of invisible monsters. * * The "semantics" of this command must be chosen before the player * is confused, and it must be verified against the new grid. */ void do_cmd_alter(void) { int py = p_ptr->py; int px = p_ptr->px; int y, x, dir; int feat; bool did_nothing = TRUE; bool more = FALSE; monster_type *m_ptr; /* Get a direction */ if (!get_rep_dir(&dir)) return; /* Get location */ y = py + ddy[dir]; x = px + ddx[dir]; /* Original feature */ feat = cave_feat[y][x]; /* Must have knowledge to know feature XXX XXX */ if (!(cave_info[y][x] & (CAVE_MARK))) feat = FEAT_NONE; /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (confuse_dir(&dir)) { /* Get location */ y = py + ddy[dir]; x = px + ddx[dir]; } /* Allow repeated command */ if (p_ptr->command_arg) { /* Set repeat count */ p_ptr->command_rep = p_ptr->command_arg - 1; /* Redraw the state */ p_ptr->redraw |= (PR_STATE); /* Cancel the arg */ p_ptr->command_arg = 0; } /* If a monster is present, and visible, Rogues may steal from it. * Otherwise, the player will simply attack. -LM- */ if (cave_m_idx[y][x] > 0) { if ((check_ability(SP_STEAL)) && (!SCHANGE)) { m_ptr = &m_list[cave_m_idx[y][x]]; if (m_ptr->ml) py_steal(y, x); else py_attack(y, x); } else py_attack(y, x); did_nothing = FALSE; } /* * Some players can set traps. Total number is checked in py_set_trap. */ else if ((check_ability(SP_TRAP)) && (cave_naked_bold(y, x))) { py_set_trap(y, x); did_nothing = FALSE; } /* Disarm advanced monster traps */ else if (feat > FEAT_MTRAP_HEAD) { /* Disarm */ more = do_cmd_disarm_aux(y, x); } /* Modify basic monster traps */ else if (feat == FEAT_MTRAP_HEAD) { /* Modify */ py_modify_trap(y, x); } /* Tunnel through walls */ else if (feat >= FEAT_SECRET) { /* Tunnel */ more = do_cmd_tunnel_aux(y, x); } /* Bash jammed doors */ else if (feat >= FEAT_DOOR_HEAD + 0x08) { /* Bash */ more = do_cmd_bash_aux(y, x); } /* Open closed doors */ else if (feat >= FEAT_DOOR_HEAD) { /* Close */ more = do_cmd_open_aux(y, x); } /* Disarm traps */ else if (feat >= FEAT_TRAP_HEAD) { /* Disarm */ more = do_cmd_disarm_aux(y, x); } /* Oops */ else if (did_nothing) { /* Oops */ msg_print("You spin around."); } /* Cancel repetition unless we can continue */ if (!more) disturb(0, 0); }
/* * Tunnel through "walls" (including rubble and secret doors) * * Digging is very difficult without a "digger" weapon, but can be * accomplished by strong players using heavy weapons. */ void do_cmd_tunnel(void) { int py = p_ptr->py; int px = p_ptr->px; int y, x, dir; bool more = FALSE; /* Get a direction (or abort) */ if (!get_rep_dir(&dir)) return; /* Get location */ y = py + ddy[dir]; x = px + ddx[dir]; /* Oops */ if (!do_cmd_tunnel_test(y, x)) return; /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (confuse_dir(&dir)) { /* Get location */ y = py + ddy[dir]; x = px + ddx[dir]; } /* Allow repeated command */ if (p_ptr->command_arg) { /* Set repeat count */ p_ptr->command_rep = p_ptr->command_arg - 1; /* Redraw the state */ p_ptr->redraw |= (PR_STATE); /* Cancel the arg */ p_ptr->command_arg = 0; } /* Monster */ if (cave_m_idx[y][x] > 0) { /* Message */ msg_print("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Walls */ else { /* Tunnel through walls */ more = do_cmd_tunnel_aux(y, x); } /* Cancel repetition unless we can continue */ if (!more) disturb(0, 0); }