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

Class Method Details

.aliases_for(name) ⇒ Array<String>

Returns all alternative names for a given shield.

Examples:

Getting aliases for a shield

aliases = ShieldStats.aliases_for("small shield")

Parameters:

  • name (String)

    The name of the shield.

Returns:

  • (Array<String>)

    An array of alternative names.



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

.categoriesArray<Symbol>

Returns a list of all shield categories.

Examples:

Getting all shield categories

categories = ShieldStats.categories

Returns:

  • (Array<Symbol>)

    An array of 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.

Examples:

Getting the category for a shield

category = ShieldStats.category_for("small shield")

Parameters:

  • name (String)

    The name of the shield.

Returns:

  • (Symbol, nil)

    The category of the shield if found, otherwise nil.



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.

Examples:

Comparing two shields

comparison = ShieldStats.compare("small shield", "medium shield")

Parameters:

  • name1 (String)

    The name of the first shield.

  • name2 (String)

    The name of the second shield.

Returns:

  • (Hash, nil)

    A hash containing the comparison data if both shields are found, otherwise nil.



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.

Examples:

Finding a shield by name

shield_info = ShieldStats.find("small shield")

Parameters:

  • name (String)

    The name of the shield to find.

Returns:

  • (Hash, nil)

    The shield information if found, otherwise nil.



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.

Examples:

Finding a shield by category

shield_info = ShieldStats.find_by_category(:small_shield)

Parameters:

  • category (Symbol)

    The category of the shield to find.

Returns:

  • (Hash, nil)

    The shield information if found, otherwise nil.



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.

Examples:

Listing shields by evade modifier

shields = ShieldStats.list_shields_by_evade_modifier(min: -0.3, max: -0.2)

Parameters:

  • min (Float)

    The minimum evade modifier.

  • max (Float)

    The maximum evade modifier.

Returns:

  • (Array<Hash>)

    An array of shields that match the criteria.



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

.namesArray<String>

Returns a unique list of all shield names.

Examples:

Getting all shield names

all_names = ShieldStats.names

Returns:

  • (Array<String>)

    An array of unique 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.

Examples:

Pretty printing a shield

output = ShieldStats.pretty("small shield")

Parameters:

  • name (String)

    The name of the shield to format.

Returns:

  • (String)

    A formatted string with shield details.



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.

Examples:

Pretty long printing a shield

output = ShieldStats.pretty_long("small shield")

Parameters:

  • name (String)

    The name of the shield to format.

Returns:

  • (String)

    A formatted string with shield details.



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.

Examples:

Searching for shields

results = ShieldStats.search(name: "small shield", category: :small_shield)

Parameters:

  • filters (Hash) (defaults to: {})

    A hash of filters to apply to the search.

Returns:

  • (Array<Hash>)

    An array of shields that match the 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.

Examples:

Validating a shield name

is_valid = ShieldStats.valid_name?("small shield")

Parameters:

  • name (String)

    The name to validate.

Returns:

  • (Boolean)

    True if the name is valid, otherwise false.



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