(via (,) or i, or by the new quivering command). Ammo that just happens to come next in the fire order is not quivered anymore even if you continue firing. Add a new quiver command on Q, and while I was at it, restrict the items offered when firing (fi) or quivering to actual throwables. (This was a long outstanding FR.) I think that's it…
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6112 c06c8d41-db1a-0410-9941-cceddc491573
FEKRY3DYIDLWVBLAZN7W2WFNEKZPCAHABXOSM6K5RLTH5WY2NODQC
P4PEPGY7ATSFJK44EEU5GXRNYTE3T67FYIBR6S2CJRKFQYQWZGGQC
SBJWTFK2LCN7IIFREIZWTWV3U3LSZA2IPEOVXTN2ZZYHVEOHWBWQC
RTB6BWX5OPHNXFSRXCQ34G5THZO4F6QZCW4GQBAL6JHVEMEMSPOAC
NCHTJYDWTFLBWRQ3NS47O4ZAPT6RN7P2GNUT7G2PPVNURCLCWW6AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
KPU2SA6G7UECM5N6PNXOT5CCQAYFBN47K5JYBQMFBD25HL2A5GIAC
COLMJH3UIQFF4R5AV642OJK4HHGUIIPLNP5WGKLWWYNJV7ZGPI7AC
ENI6P5WUO7DS4Y7EUDCYB4PSNT7CXH2L5JIB5BLZHNMWN4QDXMWQC
U6OTXM3JN7SGPVIGQ5F6NR2I7J5V7KOWFQ7AVNNRQQDNLBEDMYFQC
4GYZYBY7FFORRNPIEFTV4ZM2C7Z6D2KTQOM537ZCC2YBXT2TNSHAC
LDBTCT5WIPLJPZWXS2RUQ26QKISCUUTLO77M464WOE6VSYSNPKYAC
QEEJFAETO6B2J4IWDIDCJ5UNIFNNHHG22IWF2CUJRTJJBNE47CWQC
3VWSZUGYL36SO5AOZRASGK3VHFCFZUGGCGRT3R7BZB36IZPN7OSQC
M63RVTL4D35UNHPGHV2Z5G7I3DW6VQSCWUTTLWBPHYNHB4CJ5LXQC
Q3DNEB5OOJ34P5ML4CMK3L6SCP7RLW7DDOZEG24KZBX3C7BJRQDAC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
T7CUIVICB74342RA32BR37T36FOX4RBSQIB5PNOHTGTGUYGDKSTQC
TZ2SH2SPO5TFSFL2OCV5A32P2X4CRHEKEK7ENUFCBVF3RKUWAD4AC
CE6FLTWU5PYFBSGVTIJXQXRMHOIHQ3VJCKHQVIMUUAIFHQ73X7NAC
HSRRNAU5UAYC6B6IQWGJPFROMZBTJICPCH6DJVZDHDTAGOQ6IOYAC
3GLHLYH34NUBL2C5HSECKNVAO4ZFAAYXCW3Q5VZ2PXDDZ4SDD7LQC
ACDPN464TK2LKLHSDN3YVRHAPF7WLSLLU3UHIYEXKFDEZPEU3XSQC
L57WEZMVIHTFRLWVIPWOIOWHCF2I53TVUVYJ2V6IZ64R56FVTZZAC
7GJR755MBM55KIOP3DGSZIIAEQ5E2PRBHLEXZOU2ZMXHHZ5JI3GQC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
7V6TZHBSKK7AKY3SCYSP27QR2HP5N7HI3FI7V2QL7Y44OKKNI6IAC
KNCEMOC5TMWHTKCWF7CMYNHLGCXOLGMTXLEIHMEFBGM5FR26GRXAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
KZIHM6RUX43HHKXG6HGJHVEEYUPVVNBFIWMT4SKPD2GAH5ZMA3KAC
MDAJYB6STTZPNHRQ2X66MMMSONMKXTESLHJSFPGN7H3D3TOVBAVAC
TFNFP2YQA4EOVE4VIXBEQSGACZSXHWIQ2T4TIPQ46R2MJW2C4B5AC
XS4OT3JJKMXJIOMIGSSHIE4IOV2EXKFFELHEU7J2C2B7PKAP4V4QC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
ENOQQ6DEA6ECRNTBGYYNK7G3DFEILMKQBNKP4SUQIZW2L6HWVR7QC
QGVAXJZXG2HUCLELWAN6LJJOBSP2BS6TIZMPJTDOAGI2E2SUCOCQC
P2YNOE2TUTZFAOBTHJOIVD6TCV7J7D2UKUX67LHZUL6QY44ZMENQC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
TJRYL3NXPW5IUGEV3YOC7JYWEXCZDBFPLT4AUG4P227WVKVB72ZAC
TPPJRQ2NTCV3GI2VRHEXQJREDERPJODCJWUG5WCOQGN4REPPPAMAC
YHSVOROKPYS33Y4RYZRVZTE3G5LXOFX52HEDNLV6HIXOJYNOKH3QC
BNTPYSO6ECZ76CHHLDP3ASSPDSEUH4Y3E3LETKNXVWAWJRFL3YEQC
void on_item_fired(const item_def&);
void on_item_fired_fi(const item_def&);
void set_quiver(const item_def &item, ammo_t ammo_type);
void on_item_fired(const item_def &item, bool explicitly_chosen = false);
void on_item_fired_fi(const item_def &item);
}
void player_quiver::set_quiver(const item_def &item, ammo_t ammo_type)
{
m_last_used_of_type[ammo_type] = item;
m_last_used_of_type[ammo_type].quantity = 1;
m_last_used_type = ammo_type;
you.redraw_quiver = true;
}
void choose_item_for_quiver()
{
int slot = prompt_invent_item( "Quiver which item? (* to show all)",
MT_INVLIST,
OSEL_THROWABLE, true, true, true, 0, NULL,
OPER_FIRE );
if (slot == PROMPT_ABORT)
{
canned_msg(MSG_OK);
return;
}
else if (slot == PROMPT_NOTHING)
return;
const item_def item = you.inv[slot];
if (!is_valid_item(item))
return;
ammo_t t = AMMO_THROW;
const item_def *weapon = you.weapon();
if (weapon && item.launched_by(*weapon))
t = _get_weapon_ammo_type(weapon);
you.m_quiver->set_quiver(you.inv[slot], t);
mprf("Quivering %s %s.", you.inv[slot].name(DESC_INVENTORY).c_str(),
t == AMMO_THROW ? "as throwing weapon" :
t == AMMO_BLOWGUN ? "for blowguns" :
t == AMMO_SLING ? "for slings" :
t == AMMO_BOW ? "for bows" :
t == AMMO_CROSSBOW ? "for crossbows"
: "for hand crossbows");
/*
const item_def* item;
you.m_quiver->get_desired_item(&item, &q);
if (item != NULL && is_valid_item(*item))
{
textcolor(item->colour);
cprintf("-) %s", item->name(DESC_PLAIN, true)
.substr(0, crawl_view.hudsz.x - 15).c_str());
textcolor(RED);
cprintf(" (empty)");
}
else
{
textcolor(LIGHTGREY);
cprintf("Nothing quivered");
}
*/
case '(':
case CONTROL('N'):
case ')':
case CONTROL('P'):
{
const int direction = (key == CONTROL('P') || key == ')') ? -1 : +1;
const int next = get_next_fire_item(m_slot, direction);
if (next != m_slot && next != -1)
{
m_slot = next;
selected_from_inventory = false;
}
// Do this stuff unconditionally to make the prompt redraw.
message_ammo_prompt();
need_prompt = true;
break;
}
case 'i':
{
std::string err;
const int selected = _fire_prompt_for_item(err);
if (selected >= 0 && _fire_validate_item(selected, err))
{
m_slot = selected;
selected_from_inventory = true;
}
message_ammo_prompt( err.length() ? &err : NULL );
need_prompt = true;
return (CMD_NO_CMD);
}
case '?':
show_targeting_help();
redraw_screen();
message_ammo_prompt();
need_prompt = true;
return (CMD_NO_CMD);
case '(':
case CONTROL('N'):
case ')':
case CONTROL('P'):
{
const int direction = (key == CONTROL('P') || key == ')') ? -1 : +1;
const int next = get_next_fire_item(m_slot, direction);
if (next != m_slot && next != -1)
{
m_slot = next;
selected_from_inventory = false;
chosen_ammo = true;
}
// Do this stuff unconditionally to make the prompt redraw.
message_ammo_prompt();
need_prompt = true;
break;
}
case 'i':
{
std::string err;
const int selected = _fire_prompt_for_item(err);
if (selected >= 0 && _fire_validate_item(selected, err))
{
m_slot = selected;
selected_from_inventory = true;
chosen_ammo = true;
}
message_ammo_prompt( err.length() ? &err : NULL );
need_prompt = true;
return (CMD_NO_CMD);
OSEL_ANY = -1,
OSEL_WIELD = -2,
OSEL_UNIDENT = -3,
OSEL_EQUIP = -4,
OSEL_MEMORISE = -5,
OSEL_RECHARGE = -6,
OSEL_ENCH_ARM = -7,
OSEL_VAMP_EAT = -8,
OSEL_DRAW_DECK = -9
OSEL_ANY = -1,
OSEL_WIELD = -2,
OSEL_UNIDENT = -3,
OSEL_EQUIP = -4,
OSEL_MEMORISE = -5,
OSEL_RECHARGE = -6,
OSEL_ENCH_ARM = -7,
OSEL_VAMP_EAT = -8,
OSEL_DRAW_DECK = -9,
OSEL_THROWABLE = -10