Module: Lich::Gemstone::Armaments::ShieldStats
- Defined in:
- documented/gemstone/armaments/shield_stats.rb
Overview
Static array of shield stats indexed by shield identifiers. Each shield entry contains metadata such as category, alternative names, size and evade modifiers, and base weight.
Constant Summary collapse
- @@shield_stats =
Static array of shield stats indexed by shield identifiers. Each shield entry contains metadata such as category, alternative names, size and evade modifiers, and base weight.
{ :small_shield => { :category => :small_shield, :base_name => "small shield", :all_names => ["buckler", "kidney shield", "small shield", "targe"], :size_modifier => -0.15, :evade_modifier => -0.22, :base_weight => 6, }, :medium_shield => { :category => :medium_shield, :base_name => "medium shield", :all_names => ["battle shield", "heater", "heater shield", "knight's shield", "krytze", "lantern shield", "medium shield", "parma", "target shield"], :size_modifier => 0.0, :evade_modifier => -0.30, :base_weight => 8, }, :large_shield => { :category => :large_shield, :base_name => "large shield", :all_names => ["aegis", "kite shield", "large shield", "pageant shield", "round shield", "scutum"], :size_modifier => 0.15, :evade_modifier => -0.38, :base_weight => 9, }, :tower_shield => { :category => :tower_shield, :base_name => "tower shield", :all_names => ["greatshield", "mantlet", "pavis", "tower shield", "wall shield"], :size_modifier => 0.30, :evade_modifier => -0.50, :base_weight => 12, }, }
Class Method Summary collapse
-
.aliases_for(name) ⇒ Array<String>
Returns all alternative names for a given shield.
-
.categories ⇒ Array<Symbol>
Returns a list of all shield categories.
-
.category_for(name) ⇒ Symbol?
Gets the category for a given shield name.
-
.compare(name1, name2) ⇒ Hash?
Compares two shields and returns their attributes.
-
.find(name) ⇒ Hash?
Finds shield information by name.
-
.find_by_category(category) ⇒ Hash?
Finds shield information by category.
-
.list_shields_by_evade_modifier(min:, max:) ⇒ Array<Hash>
Lists shields within a specified evade modifier range.
-
.names ⇒ Array<String>
Returns a unique list of all shield names.
-
.pretty(name) ⇒ String
Returns a formatted string representation of the shield’s information.
-
.pretty_long(name) ⇒ String
Returns a long formatted string representation of the shield’s information.
-
.search(filters = {}) ⇒ Array<Hash>
Searches for shields based on given filters.
-
.valid_name?(name) ⇒ Boolean
Checks if a given name is a valid shield name.
Class Method Details
.aliases_for(name) ⇒ Array<String>
Returns all alternative names for a given shield.
170 171 172 173 174 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 170 def self.aliases_for(name) name = name.downcase.strip shield = self.find(name) shield ? shield[:all_names] : [] end |
.categories ⇒ Array<Symbol>
Returns a list of all shield categories.
102 103 104 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 102 def self.categories @@shield_stats.keys end |
.category_for(name) ⇒ Symbol?
Gets the category for a given shield name.
112 113 114 115 116 117 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 112 def self.category_for(name) name = name.downcase.strip shield = self.find(name) shield ? shield[:category] : nil end |
.compare(name1, name2) ⇒ Hash?
Compares two shields and returns their attributes.
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 183 def self.compare(name1, name2) name1 = name1.downcase.strip name2 = name2.downcase.strip s1 = find(name1) s2 = find(name2) return nil unless s1 && s2 { name1: s1[:base_name], name2: s2[:base_name], size_modifier: [s1[:size_modifier], s2[:size_modifier]], evade_modifier: [s1[:evade_modifier], s2[:evade_modifier]], base_weight: [s1[:base_weight], s2[:base_weight]], category: [s1[:category], s2[:category]], aliases: [s1[:all_names], s2[:all_names]] } end |
.find(name) ⇒ Hash?
Finds shield information by name.
74 75 76 77 78 79 80 81 82 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 74 def self.find(name) name = name.downcase.strip @@shield_stats.each_value do |shield| return shield if shield[:all_names]&.map(&:downcase)&.include?(name) end nil end |
.find_by_category(category) ⇒ Hash?
Finds shield information by category.
54 55 56 57 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 54 def self.find_by_category(category) _, shield_info = @@shield_stats.find { |_, stats| stats[:category] == category } shield_info end |
.list_shields_by_evade_modifier(min:, max:) ⇒ Array<Hash>
Lists shields within a specified evade modifier range.
91 92 93 94 95 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 91 def self.list_shields_by_evade_modifier(min:, max:) @@shield_stats.map(&:last).select do |shield| shield[:evade_modifier].between?(min, max) end end |
.names ⇒ Array<String>
Returns a unique list of all shield names.
64 65 66 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 64 def self.names @@shield_stats.map { |_, s| s[:all_names] }.flatten.uniq end |
.pretty(name) ⇒ String
Returns a formatted string representation of the shield’s information.
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 125 def self.pretty(name) shield = self.find(name) return "\n(no data)\n" unless shield.is_a?(Hash) lines = [] lines << "" fields = { "Shield" => shield[:base_name], "Category" => shield[:category].to_s.gsub('_', ' ').capitalize, "Size Mod" => format('%.2f', shield[:size_modifier]), "Evade Mod" => format('%.2f', shield[:evade_modifier]), "Base Weight" => "#{shield[:base_weight]} lbs" } max_label = fields.keys.map(&:length).max fields.each do |label, value| lines << "%-#{max_label}s: %s" % [label, value] end if shield[:all_names]&.any? lines << "%-#{max_label}s: %s" % ["Alternate", shield[:all_names].join(", ")] end lines << "" lines.join("\n") end |
.pretty_long(name) ⇒ String
Returns a long formatted string representation of the shield’s information.
160 161 162 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 160 def self.pretty_long(name) pretty(name) end |
.search(filters = {}) ⇒ Array<Hash>
Searches for shields based on given filters.
208 209 210 211 212 213 214 215 216 217 218 219 220 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 208 def self.search(filters = {}) @@shield_stats.values.select do |shield| next if filters[:name] && !shield[:all_names].include?(filters[:name].downcase.strip) next if filters[:category] && shield[:category] != filters[:category] next if filters[:min_evade_modifier] && shield[:evade_modifier] < filters[:min_evade_modifier] next if filters[:max_evade_modifier] && shield[:evade_modifier] > filters[:max_evade_modifier] next if filters[:min_size_modifier] && shield[:size_modifier] < filters[:min_size_modifier] next if filters[:max_size_modifier] && shield[:size_modifier] > filters[:max_size_modifier] next if filters[:max_weight] && shield[:base_weight] > filters[:max_weight] true end end |
.valid_name?(name) ⇒ Boolean
Checks if a given name is a valid shield name.
228 229 230 231 |
# File 'documented/gemstone/armaments/shield_stats.rb', line 228 def self.valid_name?(name) name = name.downcase.strip self.names.include?(name) end |