Class: RuneterraCards::CardSet

Inherits:
Object
  • Object
show all
Defined in:
lib/runeterra_cards/card_set.rb

Overview

TODO:

The API to this class is very unstable and will change a lot in a coming release.

TODO:

add #== !

Represents a collection of cards.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cards) ⇒ CardSet

Returns a new instance of CardSet.

Parameters:

  • cards (Hash{String => Number}, Enumerable{String => Number})

    A Hash of card codes mapping to card counts



20
21
22
# File 'lib/runeterra_cards/card_set.rb', line 20

def initialize(cards)
  @cards = cards
end

Instance Attribute Details

#cardsHash{String => Number} (readonly)

Deprecated.

Returns:

  • (Hash{String => Number})


17
18
19
# File 'lib/runeterra_cards/card_set.rb', line 17

def cards
  @cards
end

Class Method Details

.from_deck_code(deck_code) ⇒ CardSet

Parse a Deck Code.

Parameters:

  • deck_code (String)

Returns:

Raises:



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/runeterra_cards/card_set.rb', line 65

def self.from_deck_code(deck_code)
  binary_data = decode_base32(deck_code)
  format, version = decode_format_and_version(binary_data[0])

  raise UnrecognizedVersionError.new(SUPPORTED_VERSION, version) unless version <= SUPPORTED_VERSION

  raise unless format.eql? 1

  int_array = unpack_big_endian_varint(binary_data[1..])
  cards = assemble_card_list(int_array)

  new(cards.to_h)
end

Instance Method Details

#-(other) ⇒ CardSet

Subtract another CardSet from this one. Items with count 0 are not represented in the returned CardSet, they are removed altogether.

Parameters:

Returns:



28
29
30
31
32
33
34
35
36
# File 'lib/runeterra_cards/card_set.rb', line 28

def -(other)
  remaining_cards =
    cards.each_with_object({}) do |(code, count), result|
      new_count = count - other.count_for_card_code(code)
      result[code] = new_count unless new_count.eql?(0)
    end

  CardSet.new(remaining_cards)
end

#as_card_codesEnumerable<String => Number>

Return all cards in the card set as a map of card codes to counts.

Examples:

set.as_card_codes #=> { '01DE044' => 1, '02NX003' => 2 }

Returns:

  • (Enumerable<String => Number>)


47
48
49
# File 'lib/runeterra_cards/card_set.rb', line 47

def as_card_codes
  cards
end

#as_cardsEnumerable<Card => Number>

Returns:

  • (Enumerable<Card => Number>)


39
40
41
# File 'lib/runeterra_cards/card_set.rb', line 39

def as_cards
  cards.transform_keys { |code| Card.new(code: code) }
end

#count_for_card_code(code) ⇒ Integer

Returns how many of the given card are in this CardSet.

Parameters:

  • code (String)

    Card code, e.g. “01DE031”

Returns:

  • (Integer)

    How many of the card are in this CardSet, or 0 if it isn’t present.



54
55
56
# File 'lib/runeterra_cards/card_set.rb', line 54

def count_for_card_code(code)
  cards[code] || 0
end