Class: Card::Set::Pattern::Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/card/set_pattern.rb

Direct Known Subclasses

All, AllPlus, Right, Rstar, Self, Star, Type, TypePlusRight

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(card) ⇒ Abstract

Instance methods



85
86
87
88
89
90
91
92
93
94
95
# File 'lib/card/set_pattern.rb', line 85

def initialize card
  unless self.class.anchorless?
    @anchor_name = self.class.anchor_name(card).to_name
    @anchor_id = if self.class.respond_to? :anchor_id
                   self.class.anchor_id card
                 else
                   Card.fetch_id @anchor_name
                 end
  end
  self
end

Class Attribute Details

.anchor_parts_countObject

Returns the value of attribute anchor_parts_count.



44
45
46
# File 'lib/card/set_pattern.rb', line 44

def anchor_parts_count
  @anchor_parts_count
end

.anchorlessObject

Returns the value of attribute anchorless.



44
45
46
# File 'lib/card/set_pattern.rb', line 44

def anchorless
  @anchorless
end

.assigns_typeObject

Returns the value of attribute assigns_type.



44
45
46
# File 'lib/card/set_pattern.rb', line 44

def assigns_type
  @assigns_type
end

.junction_onlyObject

Returns the value of attribute junction_only.



44
45
46
# File 'lib/card/set_pattern.rb', line 44

def junction_only
  @junction_only
end

.pattern_codeObject

Returns the value of attribute pattern_code.



44
45
46
# File 'lib/card/set_pattern.rb', line 44

def pattern_code
  @pattern_code
end

.pattern_idObject

Returns the value of attribute pattern_id.



44
45
46
# File 'lib/card/set_pattern.rb', line 44

def pattern_id
  @pattern_id
end

Class Method Details

.anchorless?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/card/set_pattern.rb', line 66

def anchorless?
  !!anchorless
end

.junction_only?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/card/set_pattern.rb', line 62

def junction_only?
  junction_only == true
end

.new(card) ⇒ Object



47
48
49
# File 'lib/card/set_pattern.rb', line 47

def new card
  super if pattern_applies? card
end

.patternObject



70
71
72
# File 'lib/card/set_pattern.rb', line 70

def pattern
  Card.fetch(pattern_id, skip_modules: true).cardname
end

.pattern_applies?(card) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/card/set_pattern.rb', line 74

def pattern_applies? card
  junction_only? ? card.cardname.junction? : true
end

.register(pattern_code, opts = {}) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/card/set_pattern.rb', line 51

def register pattern_code, opts={}
  if (self.pattern_id = Card::Codename[pattern_code])
    self.pattern_code = pattern_code
    Card.set_patterns.insert opts.delete(:index).to_i, self
    self.anchorless = !respond_to?(:anchor_name)
    opts.each { |key, val| send "#{key}=", val }
  else
    warn "no codename for pattern_code #{pattern_code}"
  end
end

Instance Method Details

#anchor_codenamesObject



127
128
129
130
131
132
# File 'lib/card/set_pattern.rb', line 127

def anchor_codenames
  anchor_parts.map do |part|
    part_id = Card.fetch_id part
    part_id && Card::Codename[part_id.to_i] || (return nil)
  end
end

#anchor_partsObject



134
135
136
137
138
139
140
141
142
143
# File 'lib/card/set_pattern.rb', line 134

def anchor_parts
  return [@anchor_name] unless anchor_parts_count > 1
  parts = @anchor_name.parts
  if parts.size <= anchor_parts_count
    parts
  else
    # handles cases where anchor is a compound card, eg A+B+*self
    [@anchor_name[0..-anchor_parts_count]] + parts[(-anchor_parts_count + 1)..-1]
  end
end

#anchor_parts_countObject



145
146
147
# File 'lib/card/set_pattern.rb', line 145

def anchor_parts_count
  self.class.anchor_parts_count
end

#format_module_list(klass) ⇒ Object



122
123
124
125
# File 'lib/card/set_pattern.rb', line 122

def format_module_list klass
  hash = Card::Set.modules[:nonbase_format][klass]
  hash && lookup_module_list(hash)
end

#inspectObject



157
158
159
# File 'lib/card/set_pattern.rb', line 157

def inspect
  "<#{self.class} #{to_s.to_name.inspect}>"
end

#lookup_module_list(modules_hash) ⇒ Object



114
115
116
# File 'lib/card/set_pattern.rb', line 114

def lookup_module_list modules_hash
  module_key && modules_hash[module_key]
end

#module_keyObject



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/card/set_pattern.rb', line 97

def module_key
  if defined? @module_key
    @module_key
  else
    @module_key = begin
      # binding.pry if to_s == "*input+*right+*options+*self"
      if self.class.anchorless?
        self.class.pattern_code.camelize
      elsif anchor_codenames
        codenames = [self.class.pattern_code] +
                    anchor_codenames.map(&:to_s)
        codenames.map(&:camelize).join "::"
      end
    end
  end
end

#module_listObject



118
119
120
# File 'lib/card/set_pattern.rb', line 118

def module_list
  lookup_module_list Card::Set.modules[:nonbase]
end

#patternObject



149
150
151
# File 'lib/card/set_pattern.rb', line 149

def pattern
  @pattern ||= self.class.pattern
end

#rule_set_keyObject



170
171
172
173
174
175
176
# File 'lib/card/set_pattern.rb', line 170

def rule_set_key
  if self.class.anchorless?
    self.class.pattern_code
  elsif @anchor_id
    "#{@anchor_id}+#{self.class.pattern_code}"
  end
end

#safe_keyObject



161
162
163
164
165
166
167
168
# File 'lib/card/set_pattern.rb', line 161

def safe_key
  caps_part = self.class.pattern_code.tr(" ", "_").upcase
  if self.class.anchorless?
    caps_part
  else
    "#{caps_part}-#{@anchor_name.safe_key}"
  end
end

#to_sObject



153
154
155
# File 'lib/card/set_pattern.rb', line 153

def to_s
  self.class.anchorless? ? pattern.s : "#{@anchor_name}+#{pattern}"
end