Class: MtgCardMaker::ManaCost

Inherits:
Object
  • Object
show all
Defined in:
lib/mtg_card_maker/mana_cost.rb

Overview

Mana cost class that generates SVG for the mana cost of a card. This class parses mana cost strings (e.g., "2UR", "XG") and generates SVG circles with appropriate colors and icons for each mana symbol.

rubocop:disable Metrics/ClassLength

Examples:

mana_cost = MtgCardMaker::ManaCost.new("2UR")
svg = mana_cost.to_svg
mana_cost = MtgCardMaker::ManaCost.new("XG", icon_set: :custom)
svg = mana_cost.to_svg

Since:

  • 0.1.0

Constant Summary collapse

COLOR_MAP =

Mapping of letters to colors

Since:

  • 0.1.0

{
  'B' => :black, 'S' => :black,
  'U' => :blue,  'I' => :blue,
  'G' => :green, 'F' => :green,
  'W' => :white, 'P' => :white,
  'R' => :red,   'M' => :red,
  'C' => :colorless
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mana_string = nil, icon_set = :default) ⇒ ManaCost

Initialize a new mana cost parser

Since:

  • 0.1.0



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/mtg_card_maker/mana_cost.rb', line 42

def initialize(mana_string = nil, icon_set = :default) # rubocop:disable Metrics/MethodLength
  @elements = []
  @origins = [] # :numeric, :C, or color symbol
  @int_val = nil
  @original_string = mana_string
  @icon_service = IconService.new(icon_set)

  return if mana_string.nil? || mana_string.empty?

  # Convert to uppercase for consistency
  mana_string = mana_string.to_s.upcase

  # Parse the mana string
  parse_mana_string(mana_string)

  # Limit to maximum circles
  layer_config = LayerConfig.default
  max_circles = layer_config.mana_cost_config[:max_circles]
  @elements = @elements.first(max_circles)
  @origins = @origins.first(max_circles)
end

Instance Attribute Details

#elementsArray<Symbol> (readonly)

Returns the parsed mana elements.

Since:

  • 0.1.0



33
34
35
# File 'lib/mtg_card_maker/mana_cost.rb', line 33

def elements
  @elements
end

#int_valInteger? (readonly)

Returns the integer value for generic mana.

Since:

  • 0.1.0



36
37
38
# File 'lib/mtg_card_maker/mana_cost.rb', line 36

def int_val
  @int_val
end

Instance Method Details

#to_svgString

Returns SVG string for the mana cost circles with drop shadow

Since:

  • 0.1.0



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/mtg_card_maker/mana_cost.rb', line 67

def to_svg
  layer_config = LayerConfig.default
  circle_spacing = layer_config.mana_cost_config[:circle_spacing]

  # Build mana cost circles SVG
  mana_circles = @elements.each_with_index.map do |color, i|
    x = i * circle_spacing
    y = 0
    mana_element_svg(x, y, color, @origins[i])
  end.join

  "    \#{drop_shadow_filter}\n    <g filter=\"url(#mana-cost-drop-shadow)\">\n    \#{mana_circles}\n    </g>\n  SVG\nend\n".delete("\n")