/** * Throw an object from the quiver, pack or floor. */ void do_cmd_throw(cmd_code code, cmd_arg args[]) { int item = args[0].item; int dir = args[1].direction; int shots = 1; object_type *o_ptr = object_from_item_idx(item); int weight = MAX(o_ptr->weight, 10); int str = adj_str_blow[p_ptr->state.stat_ind[A_STR]]; int range = MIN(((str + 20) * 10) / weight, 10); ranged_attack attack = make_ranged_throw; /* Make sure the player isn't throwing wielded items */ if (item >= INVEN_WIELD && item < QUIVER_START) { msg("You have cannot throw wielded items."); return; } /* Check the item being thrown is usable by the player. */ if (!item_is_available(item, NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR))) { msg("That item is not within your reach."); return; } ranged_helper(item, dir, range, shots, attack); }
/** * Fire an object from the quiver, pack or floor at a target. */ void do_cmd_fire(cmd_code code, cmd_arg args[]) { int item = args[0].item; int dir = args[1].direction; int range = 6 + 2 * p_ptr->state.ammo_mult; int shots = p_ptr->state.num_shots; ranged_attack attack = make_ranged_shot; object_type *j_ptr = &p_ptr->inventory[INVEN_BOW]; object_type *o_ptr = object_from_item_idx(item); /* Require a usable launcher */ if (!j_ptr->tval || !p_ptr->state.ammo_tval) { msg("You have nothing to fire with."); return; } /* Check the item being fired is usable by the player. */ if (!item_is_available(item, NULL, USE_EQUIP | USE_INVEN | USE_FLOOR)) { msg("That item is not within your reach."); return; } /* Check the ammo can be used with the launcher */ if (o_ptr->tval != p_ptr->state.ammo_tval) { msg("That ammo cannot be fired by your current weapon."); return; } ranged_helper(item, dir, range, shots, attack); }
/** * Fire an object from the quiver, pack or floor at a target. */ void do_cmd_fire(struct command *cmd) { int dir; int range = MIN(6 + 2 * player->state.ammo_mult, z_info->max_range); int shots = player->state.num_shots; ranged_attack attack = make_ranged_shot; struct object *bow = equipped_item_by_slot_name(player, "shooting"); struct object *obj; /* Get arguments */ if (cmd_get_item(cmd, "item", &obj, /* Prompt */ "Fire which ammunition?", /* Error */ "You have no ammunition to fire.", /* Filter */ obj_can_fire, /* Choice */ USE_INVEN | USE_QUIVER | USE_FLOOR | QUIVER_TAGS) != CMD_OK) return; if (cmd_get_target(cmd, "target", &dir) == CMD_OK) player_confuse_dir(player, &dir, FALSE); else return; /* Require a usable launcher */ if (!bow || !player->state.ammo_tval) { msg("You have nothing to fire with."); return; } /* Check the item being fired is usable by the player. */ if (!item_is_available(obj, NULL, USE_QUIVER | USE_INVEN | USE_FLOOR)) { msg("That item is not within your reach."); return; } /* Check the ammo can be used with the launcher */ if (obj->tval != player->state.ammo_tval) { msg("That ammo cannot be fired by your current weapon."); return; } ranged_helper(obj, dir, range, shots, attack); }
/** * Throw an object from the quiver, pack or floor. */ void do_cmd_throw(struct command *cmd) { int dir; int shots = 1; int str = adj_str_blow[player->state.stat_ind[STAT_STR]]; ranged_attack attack = make_ranged_throw; int weight; int range; struct object *obj; /* Get arguments */ if (cmd_get_item(cmd, "item", &obj, /* Prompt */ "Throw which item?", /* Error */ "You have nothing to throw.", /* Filter */ NULL, /* Choice */ USE_QUIVER | USE_INVEN | USE_FLOOR | QUIVER_TAGS) != CMD_OK) return; if (cmd_get_target(cmd, "target", &dir) == CMD_OK) player_confuse_dir(player, &dir, FALSE); else return; weight = MAX(obj->weight, 10); range = MIN(((str + 20) * 10) / weight, 10); /* Make sure the player isn't throwing wielded items */ if (object_is_equipped(player->body, obj)) { msg("You have cannot throw wielded items."); return; } ranged_helper(obj, dir, range, shots, attack); }