a stack without all that o = mitm[o].link stuff. Redid Ely's destroy weapons power to use it.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5875 c06c8d41-db1a-0410-9941-cceddc491573
GF5VGZLKKWIATLVLTUJR4LVEQZAKR7CWMLNFMJXA67WLHP7JNUUAC
MDFQRJ6QZNFUBVSFWLXUJ6EBXOU47T3CVDI2XKBGNNRF4DXDKESQC
VJDLV4PF2ZJ46NERO4LZUX5JE2CD5XBOBQCYYPTFWTHLUEYDUOYAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
XOHNTNE5EAPQ5QLVQADLZARXQUQ2FAFCX7PHKKS6WOGIZGSNZDNQC
WZNB427K3EUNV3FMVXLQTM4UIHER4FIKQXWLUUXRNQC3OQ33VQYAC
ABLV37FMURRJPEZV2VRKOUYAKEMLI7E6RA4PDAII2EJ5L7WBHKZQC
V4F3SDV2H4HBH6G6W5M3REN3BDSSE4IDF2RNM7PJMKRW3IDJ7PNAC
2SU35FKBXMKAYJY76OXAC55R6JWTSHQSHBNBR3ICWUQREJME2ZSAC
SQFABNVS6OSVRBMJAIV6KIIZW2TYIOQ5BZGLPYJ6BPFD2HMRH4MAC
UFMLS3XTVA5IUYWNJUHXCR67X5QI26PRFKGWBM6CGWSE2VUPBBJQC
// stack_iterator guarantees validity so long as you don't manually
// mess with item_def.link: i.e., you can kill the item you're
// examining but you can't kill the item linked to it.
class stack_iterator : public std::iterator<std::forward_iterator_tag,
item_def>
{
public:
stack_iterator( const coord_def& pos );
stack_iterator( int start_link );
operator bool() const;
item_def& operator *() const;
int link() const;
const stack_iterator& operator ++ ();
stack_iterator operator ++ (int);
private:
int cur_link;
int next_link;
};
stack_iterator::stack_iterator(const coord_def& pos)
{
cur_link = igrd(pos);
if ( cur_link != NON_ITEM )
next_link = mitm[cur_link].link;
else
next_link = NON_ITEM;
}
stack_iterator::stack_iterator(int start_link)
{
cur_link = start_link;
if ( cur_link != NON_ITEM )
next_link = mitm[cur_link].link;
else
next_link = NON_ITEM;
}
stack_iterator::operator bool() const
{
return ( cur_link != NON_ITEM );
}
item_def& stack_iterator::operator*() const
{
ASSERT( cur_link != NON_ITEM );
return mitm[cur_link];
}
int stack_iterator::link() const
{
return cur_link;
}
const stack_iterator& stack_iterator::operator ++ ()
{
cur_link = next_link;
if ( cur_link != NON_ITEM )
next_link = mitm[cur_link].link;
return *this;
}
stack_iterator stack_iterator::operator++(int dummy)
{
const stack_iterator copy = *this;
++(*this);
return copy;
}
const int next = mitm[i].link; // In case we can't get it later.
if (mitm[i].base_type != OBJ_WEAPONS
&& mitm[i].base_type != OBJ_MISSILES
|| item_is_stationary(mitm[i])) // Held in a net?
item_def& item(*si);
if ( (item.base_type != OBJ_WEAPONS
&& item.base_type != OBJ_MISSILES)
|| item_is_stationary(item)) // Held in a net?