summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/decks.cc
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-09 11:39:22 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-09 11:39:22 +0000
commit1202f9248def0a7f685700191d29e97c601c7500 (patch)
treec2833c8d4c574595bf178814fcf243a1a74ecd4e /crawl-ref/source/decks.cc
parent40101238e74b934e879e94e6ae5ec4a6ae86f337 (diff)
downloadcrawl-ref-1202f9248def0a7f685700191d29e97c601c7500.tar.gz
crawl-ref-1202f9248def0a7f685700191d29e97c601c7500.zip
Added an actual vector version of CrawlHashTable, and removed the code
for making a hash table imitate a vector. Since there's now more than just one type of savable/restorable container, hash.cc and hash.h have been renamed to store.cc and store.h ("store" for storage). Destroying/unlinking/deleting an item now clears out the item's props field. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2389 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/decks.cc')
-rw-r--r--crawl-ref/source/decks.cc116
1 files changed, 57 insertions, 59 deletions
diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc
index 1df11df893..5364ef2d44 100644
--- a/crawl-ref/source/decks.cc
+++ b/crawl-ref/source/decks.cc
@@ -144,7 +144,7 @@ static unsigned long cards_in_deck(const item_def &deck)
const CrawlHashTable &props = deck.props;
ASSERT(props.exists("cards"));
- return (unsigned long) props["cards"].get_table().size();
+ return (unsigned long) props["cards"].get_vector().size();
}
static void shuffle_deck(item_def &deck)
@@ -154,16 +154,14 @@ static void shuffle_deck(item_def &deck)
CrawlHashTable &props = deck.props;
ASSERT(props.exists("cards"));
- CrawlHashTable &cards = props["cards"];
+ CrawlVector &cards = props["cards"];
ASSERT(cards.size() > 1);
- CrawlHashTable &flags = props["card_flags"];
+ CrawlVector &flags = props["card_flags"];
ASSERT(flags.size() == cards.size());
// Don't use std::shuffle(), since we want to apply exactly the
// same shuffling to both the cards vector and the flags vector.
- // Also, the CrawlHashTable iterator doesn't provide the interface
- // required for using it with std::shuffle().
std::vector<long> pos;
for (unsigned long i = 0, size = cards.size(); i < size; i++)
pos.push_back(random2(size));
@@ -179,8 +177,8 @@ static card_type get_card_and_flags(const item_def& deck, int idx,
unsigned char& _flags)
{
const CrawlHashTable &props = deck.props;
- const CrawlHashTable &cards = props["cards"].get_table();
- const CrawlHashTable &flags = props["card_flags"].get_table();
+ const CrawlVector &cards = props["cards"].get_vector();
+ const CrawlVector &flags = props["card_flags"].get_vector();
if (idx == -1)
idx = (int) cards.size() - 1;
@@ -194,8 +192,8 @@ static void set_card_and_flags(item_def& deck, int idx, card_type card,
unsigned char _flags)
{
CrawlHashTable &props = deck.props;
- CrawlHashTable &cards = props["cards"];
- CrawlHashTable &flags = props["card_flags"];
+ CrawlVector &cards = props["cards"];
+ CrawlVector &flags = props["card_flags"];
if (idx == -1)
idx = (int) cards.size() - 1;
@@ -365,8 +363,8 @@ static card_type draw_top_card(item_def& deck, bool message,
unsigned char &_flags)
{
CrawlHashTable &props = deck.props;
- CrawlHashTable &cards = props["cards"].get_table();
- CrawlHashTable &flags = props["card_flags"].get_table();
+ CrawlVector &cards = props["cards"].get_vector();
+ CrawlVector &flags = props["card_flags"].get_vector();
int num_cards = cards.size();
int idx = num_cards - 1;
@@ -374,9 +372,8 @@ static card_type draw_top_card(item_def& deck, bool message,
ASSERT(num_cards > 0);
card_type card = get_card_and_flags(deck, idx, _flags);
-
- cards.erase(idx);
- flags.erase(idx);
+ cards.pop_back();
+ flags.pop_back();
retry_blank_card(card, deck, _flags);
@@ -397,13 +394,11 @@ static void push_top_card(item_def& deck, card_type card,
unsigned char _flags)
{
CrawlHashTable &props = deck.props;
- CrawlHashTable &cards = props["cards"].get_table();
- CrawlHashTable &flags = props["card_flags"].get_table();
-
- int idx = cards.size();
+ CrawlVector &cards = props["cards"].get_vector();
+ CrawlVector &flags = props["card_flags"].get_vector();
- cards[idx] = (char) card;
- flags[idx] = (char) _flags;
+ cards.push_back((char) card);
+ flags.push_back((char) _flags);
}
static bool wielding_deck()
@@ -425,33 +420,43 @@ static bool check_buggy_deck(item_def& deck)
CrawlHashTable &props = deck.props;
- if (!props.exists("cards") || cards_in_deck(deck) == 0)
+ if (!props.exists("cards")
+ || props["cards"].get_type() != SV_VEC
+ || props["cards"].get_vector().get_type() != SV_BYTE
+ || cards_in_deck(deck) == 0)
{
crawl_state.zero_turns_taken();
- std::string msg = "";
-
if (!props.exists("cards"))
- msg += "Seems this deck never had any cards in the first place!";
+ msg::stream << "Seems this deck never had any cards in the "
+ "first place!";
+ else if (props["cards"].get_type() != SV_VEC)
+ msg::stream << "'cards' property isn't a vector.";
else
{
- msg += "Strange, this deck is already empty.";
-
- int cards_left = 0;
- if (deck.plus2 >= 0)
- cards_left = deck.plus - deck.plus2;
- else
- cards_left = -deck.plus;
+ if (props["cards"].get_vector().get_type() != SV_BYTE)
+ msg::stream << "'cards' vector doesn't contain bytes. ";
- if (cards_left != 0)
+ if (cards_in_deck(deck) == 0)
{
- msg += " But there should be been ";
- msg += cards_left;
- msg += " cards left.";
+ msg::stream << "Strange, this deck is already empty.";
+
+ int cards_left = 0;
+ if (deck.plus2 >= 0)
+ cards_left = deck.plus - deck.plus2;
+ else
+ cards_left = -deck.plus;
+
+ if (cards_left != 0)
+ {
+ msg::stream << " But there should be been ";
+ msg::stream << cards_left;
+ msg::stream << " cards left.";
+ }
}
}
+ msg::stream << std::endl;
- mpr(msg.c_str());
mpr("A swarm of software bugs snatches the deck from you and "
"whisk it away.");
@@ -466,32 +471,29 @@ static bool check_buggy_deck(item_def& deck)
bool problems = false;
- CrawlHashTable &cards = props["cards"].get_table();
- CrawlHashTable &flags = props["card_flags"].get_table();
-
- problems = cards.fixup_indexed_array("the card stack");
- problems = flags.fixup_indexed_array("the flag stack");
+ CrawlVector &cards = props["cards"].get_vector();
+ CrawlVector &flags = props["card_flags"].get_vector();
unsigned long num_cards = cards.size();
unsigned long num_flags = flags.size();
unsigned int num_buggy = 0;
unsigned int num_marked = 0;
- unsigned int counted_cards = 0;
for (unsigned long i = 0; i < num_cards; i++)
{
- unsigned char card = (unsigned char) cards[i].get_byte();
- unsigned char _flags = (unsigned char) flags[i].get_byte();
+ unsigned char card = cards[i].get_byte();
+ unsigned char _flags = flags[i].get_byte();
if (card >= NUM_CARDS)
{
cards.erase(i);
flags.erase(i);
+ i--;
+ num_cards--;
num_buggy++;
}
else
{
- counted_cards++;
if (_flags & CFLAG_MARKED)
num_marked++;
}
@@ -501,8 +503,6 @@ static bool check_buggy_deck(item_def& deck)
{
mprf("%d buggy cards found in the deck, discarding them.",
num_buggy);
- cards.compact_indicies(0, num_cards - 1);
- flags.compact_indicies(0, num_flags - 1);
deck.plus2 += num_buggy;
@@ -512,7 +512,7 @@ static bool check_buggy_deck(item_def& deck)
problems = true;
}
- if (num_cards == 0)
+ if (num_cards <= 0)
{
crawl_state.zero_turns_taken();
@@ -567,7 +567,7 @@ static bool check_buggy_deck(item_def& deck)
problems = true;
}
- if (props["num_marked"].get_byte() > (char) counted_cards)
+ if (props["num_marked"].get_byte() > (char) num_cards)
{
mpr("More cards marked than in the deck?");
props["num_marked"] = (char) num_marked;
@@ -686,8 +686,8 @@ bool deck_peek()
return false;
}
- CrawlHashTable &cards = deck.props["cards"];
- int num_cards = cards.size();
+ CrawlVector &cards = deck.props["cards"];
+ int num_cards = cards.size();
card_type card1, card2, card3;
unsigned char flags1, flags2, flags3;
@@ -2141,8 +2141,6 @@ bool top_card_is_known(const item_def &deck)
if (!is_deck(deck))
return false;
- ASSERT(cards_in_deck(deck) > 0);
-
unsigned char flags;
get_card_and_flags(deck, -1, flags);
@@ -2154,8 +2152,6 @@ card_type top_card(const item_def &deck)
if (!is_deck(deck))
return NUM_CARDS;
- ASSERT(cards_in_deck(deck) > 0);
-
unsigned char flags;
card_type card = get_card_and_flags(deck, -1, flags);
@@ -2177,7 +2173,9 @@ bool bad_deck(const item_def &item)
return false;
return (!item.props.exists("cards")
- || item.props["cards"].get_table().get_type() != HV_BYTE);
+ || item.props["cards"].get_type() != SV_VEC
+ || item.props["cards"].get_vector().get_type() != SV_BYTE
+ || cards_in_deck(item) == 0);
}
deck_rarity_type deck_rarity(const item_def &item)
@@ -2221,10 +2219,10 @@ void init_deck(item_def &item)
ASSERT(item.special >= DECK_RARITY_COMMON
&& item.special <= DECK_RARITY_LEGENDARY);
- props.set_default_flags(HFLAG_CONST_TYPE);
+ props.set_default_flags(SFLAG_CONST_TYPE);
- props["cards"].new_table(HV_BYTE);
- props["card_flags"].new_table(HV_BYTE);
+ props["cards"].new_vector(SV_BYTE).resize(item.plus);
+ props["card_flags"].new_vector(SV_BYTE).resize(item.plus);
for (int i = 0; i < item.plus; i++)
{