git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4227 c06c8d41-db1a-0410-9941-cceddc491573
U6OTXM3JN7SGPVIGQ5F6NR2I7J5V7KOWFQ7AVNNRQQDNLBEDMYFQC
CQD3RU44235F3CYFDZBC3JRT2H3AE7PXJNVBBMCRF65Q5LPA3EHQC
ZEXKK2T26K2IMZRZCFGMD55TVH3XCV5BHZZV6WFOU5HCDR4W6U7QC
CZCG4FOXPQXXUCGKK4W2IHUJK2PXUZJ22IAA6UIZ2EU7WX7VLOBQC
ENI6P5WUO7DS4Y7EUDCYB4PSNT7CXH2L5JIB5BLZHNMWN4QDXMWQC
GL7TJGUGV4JPLZCDWH6QVST4RYW7UJV6IP7UAEWEKNBWJO2H2ZHAC
7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
FVT2J6IVMSQZYKQGUHQVGT4ADYM7AWUQ4U7766GBRRFMSR2WBMLAC
FS4MVTH4EEEECLEAO2FTNK5CLF2PHFYO2JZHC2YEOKYLWXRDRU6AC
UKN6HTZXDUUOWKNWNKWPHKGUGL474JIAQN5JU3DM3DU26WGMNP4AC
NQIXUYGUIQTKZUB2IQDII7BBDMZ4VN4NUUTGT2ARQBZTDJUMPKRQC
XVX7AVLLYZJIJUZA2LZ6T57PHULWPDRZOHELDF4JHZ35EMINFFZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
COLMJH3UIQFF4R5AV642OJK4HHGUIIPLNP5WGKLWWYNJV7ZGPI7AC
OWNMHNCGA5H3A6AULXXW473PKC7N6IINE3LJCB3KCFG2XA3TYCQQC
3VWSZUGYL36SO5AOZRASGK3VHFCFZUGGCGRT3R7BZB36IZPN7OSQC
NO2HRD7RZS42S55UG4FQ5EFQDY6WYWKGIXHUKYLWF36HHE3VZ7WAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
BDFIS53HAIHOCXQ5BE7WCO2MEOFCUQPFY4JGUWVLWY6JO3IFMEKQC
3GLHLYH34NUBL2C5HSECKNVAO4ZFAAYXCW3Q5VZ2PXDDZ4SDD7LQC
HSRRNAU5UAYC6B6IQWGJPFROMZBTJICPCH6DJVZDHDTAGOQ6IOYAC
TM35IHKZZNBCMR3ERBS4EYHGUK5IVCPUT2JUITMT74AYAIUZSYFQC
4MPLCIJZL4YNUWK2RTKNE6N4UWNBMO5WDRKW737ENVE3RKV5LCRAC
SEQIMAWXQYBD6UWTK5HYN4KGLLV53HFM3LLQRSG4N5ZVZTLPR22QC
QFM6WJTFHB4KCQYVROAQD4KRAYV2FZKDL5PJZQN5MS7WDYSLJBIAC
CWPA3Q5BG7KTTY6GX7CCS26PWC4UHJ47PUCMJX5BOJIP3FSTP2BQC
IXW2IM5ITYDCXDB3ORDDVAR5XUSPVQ3BWLP3Q6TRXNTIKGMZTHXAC
CYAVI4PYWMMKTPYT5N2B3MI4OSHZFLPKOZFSLFJUXRYAACYXWW3AC
7K5P2GRF6QUXTMERG2R3BB6DZFQYJQ6V2KNPMBPFDLOP36NQILPAC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
KQNIGKATHT4YSPJFPJGIGPD6VNR5B753SE2JN2LCXZZJNHCGY3DQC
TRZAZJJA5VQBJ65SO5H5DNSILIZEJHIZCBYEBHEATCT6ZSMWIFKQC
TP5EDQXPVPTKQYTAMN3VQYHM4WRT2RNIR4EDLWLDAV2OQGKSB6KAC
LZB2MLE66DKPQPG3BE6IU77HLHYMBQFJTKFJSPKEKZSOSXPXESJQC
mprf("%s %s covered in a thin film of poison.", old_desc,
(you.inv[ammo].quantity == 1) ? "is" : "are");
preserve_quiver_slots q;
const char *old_desc = you.inv[ammo].name(DESC_CAP_YOUR).c_str();
if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_POISONED ))
{
mprf("%s %s covered in a thin film of poison.", old_desc,
(you.inv[ammo].quantity == 1) ? "is" : "are");
you.quiver_change = true;
if (ammo == you.equip[EQ_WEAPON])
you.wield_change = true;
}
else
{
canned_msg(MSG_NOTHING_HAPPENS);
if (ammo == you.equip[EQ_WEAPON])
you.wield_change = true;
}
else
{
canned_msg(MSG_NOTHING_HAPPENS);
}
// Quiver tracks items, which in most cases is the Right Thing. But
// when a quivered item is identified, the quiver doesn't change to
// match. We would like the quiver to store the identified item.
//
// This class saves off the quiver item slots, and restores them when
// destroyed. The expected use is to create one of these around code
// that identifies items in inv.
class preserve_quiver_slots
{
public:
preserve_quiver_slots();
~preserve_quiver_slots();
private:
int m_last_used_of_type[NUM_AMMO];
};
// Return item that we would like to fire by default, and its inv slot
// (if there are any in inv). If the item is in inv, its count will
// be correct.
// Return:
// *slot_out filled in with the inv slot of the item we would like
// to fire by default. If -1, the inv doesn't contain our desired
// item.
//
// *item_out filled in with item we would like to fire by default.
// This can be returned even if the item is not in inv (although if
// it is in inv, a reference to the inv item, with accurate count,
// is returned)
//
static const short QUIVER_COOKIE = 0xb015;
void player_quiver::save(writer& outf) const
{
marshallShort(outf, QUIVER_COOKIE);
marshallItem(outf, m_last_weapon);
marshallLong(outf, m_last_used_type);
marshallLong(outf, ARRAYSIZE(m_last_used_of_type));
for (int i=0; i<ARRAYSIZE(m_last_used_of_type); i++)
{
marshallItem(outf, m_last_used_of_type[i]);
}
}
void player_quiver::load(reader& inf)
{
const short cooky = unmarshallShort(inf);
ASSERT(cooky == QUIVER_COOKIE); (void)cooky;
unmarshallItem(inf, m_last_weapon);
m_last_used_type = (ammo_t)unmarshallLong(inf);
ASSERT(m_last_used_type >= AMMO_INVALID && m_last_used_type < NUM_AMMO);
const long count = unmarshallLong(inf);
ASSERT(count <= ARRAYSIZE(m_last_used_of_type));
for (int i=0; i<count; i++)
{
unmarshallItem(inf, m_last_used_of_type[i]);
}
}
// ----------------------------------------------------------------------
// Identify helper
// ----------------------------------------------------------------------
preserve_quiver_slots::preserve_quiver_slots()
{
if (! you.m_quiver) return;
COMPILE_CHECK(ARRAYSIZE(m_last_used_of_type) ==
ARRAYSIZE(you.m_quiver->m_last_used_of_type), a);
for (int i=0; i<ARRAYSIZE(m_last_used_of_type); i++)
{
you.m_quiver->get_desired_item(NULL, &m_last_used_of_type[i]);
}
}
preserve_quiver_slots::~preserve_quiver_slots()
{
if (! you.m_quiver) return;
for (int i=0; i<ARRAYSIZE(m_last_used_of_type); i++)
{
const int slot = m_last_used_of_type[i];
if (slot != -1)
{
you.m_quiver->m_last_used_of_type[i] = you.inv[slot];
}
}
you.redraw_quiver = true;
}
// ----------------------------------------------------------------------