Module: Lich::Gemstone::Armaments::WeaponStats

Defined in:
documented/gemstone/armaments/weapon_stats.rb,
documented/gemstone/armaments/weapon_stats_blunt.rb,
documented/gemstone/armaments/weapon_stats_edged.rb,
documented/gemstone/armaments/weapon_stats_hybrid.rb,
documented/gemstone/armaments/weapon_stats_ranged.rb,
documented/gemstone/armaments/weapon_stats_thrown.rb,
documented/gemstone/armaments/weapon_stats_natural.rb,
documented/gemstone/armaments/weapon_stats_polearm.rb,
documented/gemstone/armaments/weapon_stats_unarmed.rb,
documented/gemstone/armaments/weapon_stats_brawling.rb,
documented/gemstone/armaments/weapon_stats_runestave.rb,
documented/gemstone/armaments/weapon_stats_two_handed.rb

Overview

Static array of weapon stats indexed by weapon identifiers. Each weapon entry contains metadata such as category, base name, alternative names, damage types, damage factors, armor avoidance by armor size group (ASG), base roundtime (RT), and minimum RT.

damage_types: Hash of damage type percentages or values.

:slash    => % of slash damage (Float or nil)
:crush    => % of crush damage (Float or nil)
:puncture => % of puncture damage (Float or nil)
:special  => Array of special damage types (or empty array)

damage factor array:

[0] = nil (none)    [1] = Cloth    [2] = Leather    [3] = Scale    [4] = Chain    [5] = Plate

avd_by_asg array:

Cloth:   [1] ASG 1    [2] ASG 2      [3] nil      [4] nil
Leather: [5] ASG 5    [6] ASG 6    [7] ASG 7    [8] ASG 8
Scale:   [9] ASG 9    [10] ASG 10  [11] ASG 11  [12] ASG 12
Chain:   [13] ASG 13  [14] ASG 14  [15] ASG 15  [16] ASG 16
Plate:   [17] ASG 17  [18] ASG 18  [19] ASG 19  [20] ASG 20

Constant Summary collapse

@@weapon_stats =

Static array of weapon stats indexed by weapon identifiers. Each weapon entry contains metadata such as category, base name, alternative names, damage types, damage factors, armor avoidance by armor size group (ASG), base roundtime (RT), and minimum RT.

damage_types: Hash of damage type percentages or values.

:slash    => % of slash damage (Float or nil)
:crush    => % of crush damage (Float or nil)
:puncture => % of puncture damage (Float or nil)
:special  => Array of special damage types (or nil)

damage factor array:

[0] = nil (none)    [1] = Cloth    [2] = Leather    [3] = Scale    [4] = Chain    [5] = Plate

avd_by_asg array:

Cloth:   [1] ASG 1    [2] ASG 2      [3] nil      [4] nil
Leather: [5] ASG 5    [6] ASG 6    [7] ASG 7    [8] ASG 8
Scale:   [9] ASG 9    [10] ASG 10  [11] ASG 11  [12] ASG 12
Chain:   [13] ASG 13  [14] ASG 14  [15] ASG 15  [16] ASG 16
Plate:   [17] ASG 17  [18] ASG 18  [19] ASG 19  [20] ASG 20
{
  brawling: @@weapon_stats_brawling,
  hybrid: @@weapon_stats_hybrid,
  missile: @@weapon_stats_ranged,
  blunt: @@weapon_stats_blunt,
  edged: @@weapon_stats_edged,
  natural: @@weapon_stats_natural,
  polearm: @@weapon_stats_polearm,
  runestave: @@weapon_stats_runestave,
  thrown: @@weapon_stats_thrown,
  two_handed: @@weapon_stats_two_handed,
  unarmed: @@weapon_stats_unarmed,
}
@@weapon_stats_blunt =

Static array of weapon stats for blunt weapons. Each entry contains metadata such as category, base name, alternative names, damage types, damage factors, armor avoidance by armor size group (ASG), base roundtime (RT), and minimum RT.

{
  :ball_and_chain => {
    :category      => :blunt,
    :base_name     => "ball and chain",
    :all_names     => ["ball and chain", "binnol", "goupillon", "mace and chain"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.400, 0.300, 0.230, 0.260, 0.180],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 15, 15, nil, nil, 20, 19, 18, 17, 27, 25, 23, 21, 35, 31, 27, 23, 30, 24, 18, 12],
    :base_rt       => 6,
    :min_rt        => 4,
  },
  :crowbill       => {
    :category      => :blunt,
    :base_name     => "crowbill",
    :all_names     => ["crowbill", "hakapik", "skull-piercer"],
    :damage_types  => { slash: 0.0, crush: 50.0, puncture: 50.0, special: [] },
    :damage_factor => [nil, 0.350, 0.250, 0.200, 0.150, 0.125],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 36, 35, 34, 33, 30, 28, 26, 24, 30, 26, 22, 18, 20, 14, 8, 2],
    :base_rt       => 3,
    :min_rt        => 3
  },
  :cudgel         => {
    :category      => :blunt,
    :base_name     => "cudgel",
    :all_names     => ["cudgel", "aklys", "baculus", "club", "jo stick", "lisan", "periperiu", "shillelagh", "tambara", "truncheon", "waihaka", "war club"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.350, 0.275, 0.200, 0.225, 0.150],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 20, 20, nil, nil, 20, 19, 18, 17, 25, 23, 21, 19, 25, 21, 17, 13, 30, 24, 18, 12],
    :base_rt       => 4,
    :min_rt        => 4,
  },
  :leather_whip   => {
    :category      => :blunt,
    :base_name     => "leather whip",
    :all_names     => ["leather whip", "bullwhip", "cat o' nine tails", "signal whip", "single-tail whip", "training whip", "whip"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.275, 0.150, 0.090, 0.100, 0.035],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 25, 24, 23, 22, 20, 18, 16, 14, 25, 21, 17, 13, 15, 9, 3, -3],
    :base_rt       => 2,
    :min_rt        => 3,
  },
  :mace           => {
    :category      => :blunt,
    :base_name     => "mace",
    :all_names     => ["mace", "bulawa", "dhara", "flanged mace", "knee-breaker", "massuelle", "mattina", "nifa otti", "ox mace", "pernat", "quadrelle", "ridgemace", "studded mace"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.400, 0.300, 0.225, 0.250, 0.175],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 31, 31, nil, nil, 32, 31, 30, 29, 35, 33, 31, 29, 42, 38, 34, 30, 36, 30, 24, 18],
    :base_rt       => 4,
    :min_rt        => 4,
  },
  :morning_star   => {
    :category      => :blunt,
    :base_name     => "morning star",
    :all_names     => ["morning star", "spiked mace", "holy water sprinkler", "spikestar"],
    :damage_types  => { slash: 0.0, crush: 66.7, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.425, 0.325, 0.275, 0.300, 0.225],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 33, 33, nil, nil, 35, 34, 33, 32, 34, 32, 30, 28, 42, 38, 34, 30, 37, 31, 25, 19],
    :base_rt       => 5,
    :min_rt        => 4,
  },
  :war_hammer     => {
    :category      => :blunt,
    :base_name     => "war hammer",
    :all_names     => ["war hammer", "fang", "hammerbeak", "hoolurge", "horseman's hammer", "skull-crusher", "taavish"],
    :damage_types  => { slash: 0.0, crush: 66.7, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.410, 0.290, 0.250, 0.275, 0.200],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 30, 29, 28, 27, 32, 30, 28, 26, 41, 37, 33, 29, 37, 31, 25, 19],
    :base_rt       => 4,
    :min_rt        => 4,
  },
}
@@weapon_stats_edged =

A collection of edged weapon statistics indexed by weapon identifiers. Each weapon’s stats include category, base name, all names, damage types, damage factors, armor avoidance by armor size group, base roundtime, and minimum roundtime.

Examples:

Accessing weapon stats

weapon_stats = Lich::Gemstone::Armaments::WeaponStats.class_variable_get(:@@weapon_stats_edged)
{
  # Weapon statistics for the arrow.
  # @return [Hash] A hash containing the weapon's stats.
  :arrow         => { # when swung, not when fired
    :category      => :edged,
    :base_name     => "arrow",
    :all_names     => ["arrow", "sitka"],
    :damage_types  => { slash: 33.3, crush: 0.0, puncture: 66.7, special: [] },
    :damage_factor => [nil, 0.200, 0.100, 0.080, 0.100, 0.040],
    #                       /Cloth            / Leather       / Scale      / Chain       / Plate
    :avd_by_asg    => [nil, 20, 20, nil, nil, 18, 17, 16, 15, 10, 8, 6, 4, 5, 1, -3, -7, -5, -11, -17, -23],
    :base_rt       => 5,
    :min_rt        => 4,
  },
  # Weapon statistics for the backsword.
  # @return [Hash] A hash containing the weapon's stats.
  :backsword     => {
    :category      => :edged,
    :base_name     => "backsword",
    :all_names     => ["backsword", "mortuary sword", "riding sword", "sidesword"],
    :damage_types  => { slash: 50.0, crush: 16.7, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.310, 0.225, 0.240, 0.125, 0.150],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 38, 38, nil, nil, 38, 37, 36, 35, 34, 32, 30, 28, 38, 34, 30, 26, 34, 28, 22, 16],
    :base_rt       => 5,
    :min_rt        => 4,
  },
  # Weapon statistics for the bastard sword.
  # @return [Hash] A hash containing the weapon's stats.
  :bastard_sword => {
    :category      => :edged,
    :base_name     => "bastard sword",
    :all_names     => ["bastard sword", "cresset sword", "espadon", "war sword"],
    :damage_types  => { slash: 66.7, crush: 33.3, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.450, 0.325, 0.275, 0.250, 0.180],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 31, 30, 29, 28, 31, 29, 27, 25, 32, 28, 24, 20, 31, 25, 19, 13],
    :base_rt       => 6,
    :min_rt        => 4,
    :grippable?    => true,
  },
  # Weapon statistics for the broadsword.
  # @return [Hash] A hash containing the weapon's stats.
  :broadsword    => {
    :category      => :edged,
    :base_name     => "broadsword",
    :all_names     => ["broadsword", "carp's tongue", "carp's-tongue", "flyssa", "goliah", "katzbalger", "kurzsax", "machera", "palache", "schiavona", "seax", "spadroon", "spatha", "talon sword", "xiphos"],
    :damage_types  => { slash: 50.0, crush: 16.7, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.450, 0.300, 0.250, 0.225, 0.200],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 36, 36, nil, nil, 36, 35, 34, 33, 36, 34, 32, 30, 37, 33, 29, 25, 36, 30, 24, 18],
    :base_rt       => 5,
    :min_rt        => 4,
  },
  # Weapon statistics for the dagger.
  # @return [Hash] A hash containing the weapon's stats.
  :dagger        => {
    :category      => :edged,
    :base_name     => "dagger",
    :all_names     => ["alfange", "basilard", "bodice dagger", "bodkin", "boot dagger", "bracelet dagger", "butcher knife", "cinquedea", "crescent dagger", "dagger", "dirk", "fantail dagger", "forked dagger", "gimlet knife", "kaiken", "kidney dagger", "knife", "kozuka", "krizta", "kubikiri", "misericord", "parazonium", "pavade", "poignard", "pugio", "push dagger", "scramasax", "sgian achlais", "sgian dubh", "sidearm-of-Onar", "spike", "stiletto", "tanto", "trail knife", "trailknife", "zirah bouk"],
    :damage_types  => { slash: 33.3, crush: 0.0, puncture: 66.7, special: [] },
    :damage_factor => [nil, 0.250, 0.200, 0.100, 0.125, 0.075],
    #                       /Cloth            / Leather       / Scale        / Chain       / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 23, 22, 21, 20, 15, 13, 11, 9, 10, 6, 2, -2, 0, -6, -12, -18],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  # Weapon statistics for the estoc.
  # @return [Hash] A hash containing the weapon's stats.
  :estoc         => {
    :category      => :edged,
    :base_name     => "estoc",
    :all_names     => ["estoc", "koncerz"],
    :damage_types  => { slash: 33.3, crush: 0.0, puncture: 66.7, special: [] },
    :damage_factor => [nil, 0.425, 0.300, 0.200, 0.200, 0.150],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 36, 36, nil, nil, 38, 37, 36, 35, 35, 33, 31, 29, 40, 36, 32, 28, 30, 24, 18, 12],
    :base_rt       => 4,
    :min_rt        => 4,
  },
  # Weapon statistics for the falchion.
  # @return [Hash] A hash containing the weapon's stats.
  :falchion      => {
    :category      => :edged,
    :base_name     => "falchion",
    :all_names     => ["falchion", "badelaire", "craquemarte", "falcata", "kiss-of-ivas", "khopesh", "kopis", "machete", "takouba", "warblade"],
    :damage_types  => { slash: 66.7, crush: 33.3, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.450, 0.325, 0.250, 0.250, 0.175],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 37, 36, 35, 34, 38, 36, 34, 32, 39, 35, 31, 27, 39, 33, 27, 21],
    :base_rt       => 5,
    :min_rt        => 4,
  },
  # Weapon statistics for the handaxe.
  # @return [Hash] A hash containing the weapon's stats.
  :handaxe       => {
    :category      => :edged,
    :base_name     => "handaxe",
    :all_names     => ["handaxe", "balta", "boarding axe", "broad axe", "cleaver", "crescent axe", "double-bit axe", "field-axe", "francisca", "hatchet", "hunting axe", "hunting hatchet", "ice axe", "limb-cleaver", "logging axe", "meat cleaver", "miner's axe", "moon axe", "ono", "raiding axe", "sparte", "splitting axe", "throwing axe", "taper", "tomahawk", "toporok", "waraxe"],
    :damage_types  => { slash: 33.3, crush: 66.7, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.420, 0.300, 0.270, 0.240, 0.210],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 32, 31, 30, 29, 38, 36, 34, 32, 41, 37, 33, 29, 41, 35, 29, 23],
    :base_rt       => 5,
    :min_rt        => 4,
  },
  # Weapon statistics for the katana.
  # @return [Hash] A hash containing the weapon's stats.
  :katana        => {
    :category         => :edged,
    :base_name        => "katana",
    :all_names        => ["katana"],
    :damage_types     => { slash: 100.0, crush: 0.0, puncture: 0.0, special: [] },
    :damage_factor    => [nil, 0.450, 0.325, 0.275, 0.225, 0.175],
    #                       /Cloth               / Leather       / Scale         / Chain         / Plate
    :avd_by_asg       => [nil, 38, 38, nil, nil, 36, 35, 34, 33, 36, 34, 32, 30, 37, 33, 29, 25, 35, 29, 23, 17],
    :base_rt          => 5,
    :min_rt           => 4,
    :weighting_type   => :critical,
    :weighting_amount => 10,
    :grippable?       => true,
  },
  # Weapon statistics for the longsword.
  # @return [Hash] A hash containing the weapon's stats.
  :longsword     => {
    :category      => :edged,
    :base_name     => "longsword",
    :all_names     => ["longsword", "arming sword", "kaskara", "langsax", "langseax", "mekya t'rhet", "sheering sword", "tachi"],
    :damage_types  => { slash: 50.0, crush: 16.7, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.425, 0.275, 0.225, 0.200, 0.175],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 41, 41, nil, nil, 42, 41, 40, 39, 43, 41, 39, 37, 37, 33, 29, 25, 35, 29, 23, 17],
    :base_rt       => 4,
    :min_rt        => 4,
  },
  # Weapon statistics for the main gauche.
  # @return [Hash] A hash containing the weapon's stats.
  :main_gauche   => {
    :category      => :edged,
    :base_name     => "main gauche",
    :all_names     => ["parrying dagger", "main gauche", "shield-sword", "sword-breaker"],
    :damage_types  => { slash: 33.3, crush: 0.0, puncture: 66.7, special: [] },
    :damage_factor => [nil, 0.275, 0.210, 0.110, 0.125, 0.075],
    #                       /Cloth            / Leather       / Scale         / Chain        / Plate
    :avd_by_asg    => [nil, 27, 27, nil, nil, 25, 24, 23, 22, 20, 18, 16, 14, 20, 16, 12, 8, 20, 14, 8, 2],
    :base_rt       => 2,
    :min_rt        => 3,
  },
  # Weapon statistics for the rapier.
  # @return [Hash] A hash containing the weapon's stats.
  :rapier        => {
    :category      => :edged,
    :base_name     => "rapier",
    :all_names     => ["bilbo", "colichemarde", "epee", "fleuret", "foil", "rapier", "schlager", "tizona", "tock", "tocke", "tuck", "verdun"],
    :damage_types  => { slash: 33.3, crush: 0.0, puncture: 66.7, special: [] },
    :damage_factor => [nil, 0.325, 0.225, 0.125, 0.125, 0.075],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 45, 45, nil, nil, 40, 39, 38, 37, 30, 28, 26, 24, 35, 31, 27, 23, 15, 9, 3, -3],
    :base_rt       => 2,
    :min_rt        => 3,
  },
  # Weapon statistics for the scimitar.
  # @return [Hash] A hash containing the weapon's stats.
  :scimitar      => {
    :category      => :edged,
    :base_name     => "scimitar",
    :all_names     => ["scimitar", "charl's-tail", "cutlass", "disackn", "kilij", "palache", "sabre", "sapara", "shamshir", "yataghan"],
    :damage_types  => { slash: 50.0, crush: 16.7, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.375, 0.260, 0.210, 0.200, 0.165],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 31, 30, 29, 28, 30, 28, 26, 24, 30, 26, 22, 18, 30, 24, 18, 12],
    :base_rt       => 4,
    :min_rt        => 4,
  },
  # Weapon statistics for the short sword.
  # @return [Hash] A hash containing the weapon's stats.
  :short_sword   => {
    :category      => :edged,
    :base_name     => "short sword",
    :all_names     => ["acinaces", "antler sword", "backslasher", "braquemar", "baselard", "chereb", "coustille", "gladius", "gladius graecus", "kris", "kukri", "Niima's-embrace", "sica", "wakizashi", "short sword", "shortsword", "short-sword"],
    :damage_types  => { slash: 33.3, crush: 33.3, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.350, 0.240, 0.200, 0.150, 0.125],
    #                       /Cloth             / Leather      / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 36, 35, 34, 33, 30, 28, 26, 24, 25, 21, 17, 13, 25, 19, 13, 7],
    :base_rt       => 3,
    :min_rt        => 3,
  },
  # Weapon statistics for the whip-blade.
  # @return [Hash] A hash containing the weapon's stats.
  :whip_blade    => {
    :category      => :edged,
    :base_name     => "whip-blade",
    :all_names     => ["whip-blade", "whipblade"],
    :damage_types  => { slash: 100.0, crush: 0.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.333, 0.225, 0.125, 0.115, 0.065],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 45, 45, nil, nil, 40, 39, 38, 37, 30, 28, 26, 24, 35, 31, 27, 23, 15, 9, 3, -3],
    :base_rt       => 2,
    :min_rt        => 3,
  },
}
@@weapon_stats_hybrid =

Hybrid Weapons

Returns:

  • (Hash)

    A hash containing weapon stats for hybrid weapons.

{
  # Hybrid Weapons
  :katar => {
    :category      => :hybrid,
    :hybrid_skills => [:OHE, :BRAWL],
    :base_name     => "katar",
    :all_names     => ["katar", "gauntlet-sword", "kunai", "manople", "paiscush", "pata", "slasher", "tvekre"],
    :damage_types  => { slash: 33.3, crush: 0.0, puncture: 66.7, special: [] },
    :damage_factor => [nil, 0.325, 0.250, 0.225, 0.200, 0.175],
    #                       /Cloth             / Leather       / Scale      / Chain       / Plate
    :avd_by_asg    => [nil, 30, nil, nil, nil, 32, 31, 30, 29, 40, 38, 36, 34, 45, 41, 37, 33, 40, 34, 28, 22],
    :base_rt       => 3,
    :min_rt        => 3,
  },
}
@@weapon_stats_ranged =

A hash containing ranged weapon statistics indexed by weapon identifiers. Each entry includes details such as category, base name, all names, damage types, damage factors, armor avoidance by armor size group (ASG), base roundtime (RT), minimum RT, and weapon class.

Examples:

Accessing weapon stats

stats = Lich::Gemstone::Armaments::WeaponStats.weapon_stats_ranged[:composite_bow]
{
  :composite_bow  => {
    :category      => :ranged,
    :base_name     => "composite bow",
    :all_names     => ["composite bow", "composite recurve bow", "lutk'azi"],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, 0.350, 0.300, 0.325, 0.275, 0.150],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 35, 34, 33, 32, 30, 28, 26, 24, 42, 38, 34, 30, 36, 30, 24, 18],
    :base_rt       => 6,
    :min_rt        => 3,
    :weapon_class  => :bow
  },
  :hand_crossbow  => {
    :category      => :ranged,
    :base_name     => "hand crossbow",
    :all_names     => ["hand crossbow"],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, 0.275, 0.225, 0.250, 0.190, 0.135],
    :avd_by_asg    => [nil, 20, 20, nil, nil, 26, 25, 24, 23, 20, 18, 16, 14, 34, 30, 26, 22, 27, 21, 15, 9],
    :base_rt       => 4,
    :min_rt        => 4,
    :weapon_class  => :crossbow
  },
  :heavy_crossbow => {
    :category      => :ranged,
    :base_name     => "heavy crossbow",
    :all_names     => ["heavy crossbow", "heavy arbalest", "kut'ziko", "repeating crossbow", "siege crossbow"],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, 0.425, 0.325, 0.375, 0.285, 0.175],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 36, 35, 34, 33, 31, 29, 27, 25, 46, 42, 38, 34, 40, 34, 28, 22],
    :base_rt       => 7,
    :min_rt        => 5,
    :weapon_class  => :crossbow
  },
  :light_crossbow => {
    :category      => :ranged,
    :base_name     => "light crossbow",
    :all_names     => ["light crossbow", "kut'zikokra", "light arbalest"],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, 0.350, 0.300, 0.325, 0.275, 0.150],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 31, 30, 29, 28, 25, 23, 21, 19, 39, 35, 31, 27, 32, 26, 20, 14],
    :base_rt       => 6,
    :min_rt        => 4,
    :weapon_class  => :crossbow
  },
  :long_bow       => {
    :category      => :ranged,
    :base_name     => "long bow",
    :all_names     => ["long bow", "long recurve bow", "longbow", "lutk'quoab", "yumi"],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, 0.400, 0.325, 0.350, 0.300, 0.175],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 33, 32, 31, 30, 29, 27, 25, 23, 42, 38, 34, 30, 38, 32, 26, 20],
    :base_rt       => 7,
    :min_rt        => 3,
    :weapon_class  => :bow
  },
  :short_bow      => {
    :category      => :ranged,
    :base_name     => "short bow",
    :all_names     => ["short bow", "short recurve bow"],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, 0.325, 0.225, 0.275, 0.250, 0.100],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 20, 20, nil, nil, 27, 26, 25, 24, 20, 18, 16, 14, 31, 27, 23, 19, 27, 21, 15, 9],
    :base_rt       => 5,
    :min_rt        => 3,
    :weapon_class  => :bow
  },
  :broadhead      => {
    :category      => :ranged,
    :base_name     => "broadhead",
    :all_names     => ["broadhead", "default", ""],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, 0.0, 0.0, 0.0, 0.0, 0.0], # for ammunition, these are modifiers
    #                       /Cloth          / Leather   / Scale     / Chain     / Plate
    :avd_by_asg    => [nil, 0, 0, nil, nil, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # for ammunition, these are modifiers
    :base_rt       => 0, # for ammunition, this is a modifier, not a base RT
    :min_rt        => 0, # for ammunition, this is a modifier, not a minimum RT
    :weapon_class  => :ammunition
  },
  :blunt          => {
    :category      => :ranged,
    :base_name     => "blunt",
    :all_names     => ["blunt"],
    :damage_types  => { slash: 0.0, crush: 0.0, puncture: 0.0, special: [:unbalance] },
    :damage_factor => [nil, -0.050, -0.050, -0.050, -0.050, -0.050], # for ammunition, these are modifiers
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 10, 10, nil, nil, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], # for ammunition, these are modifiers
    :base_rt       => 0, # for ammunition, this is a modifier, not a base RT
    :min_rt        => 0, # for ammunition, this is a modifier, not a minimum RT
    :weapon_class  => :ammunition,
  },
  :bodkin_point   => {
    :category      => :ranged,
    :base_name     => "bodkin point",
    :all_names     => ["bodkin point"],
    :damage_types  => { slash: 66.6, crush: 0.0, puncture: 33.7, special: [] },
    :damage_factor => [nil, -0.050, -0.025, -0.010, 0.025, 0.015], # for ammunition, these are modifiers
    #                       /Cloth          / Leather   / Scale     / Chain     / Plate
    :avd_by_asg    => [nil, 0, 0, nil, nil, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5], # for ammunition, these are modifiers
    :base_rt       => 0, # for ammunition, this is a modifier, not a base RT
    :min_rt        => 0, # for ammunition, this is a modifier, not a minimum RT
    :weapon_class  => :ammunition
  },
  :crescent       => {
    :category      => :ranged,
    :base_name     => "crescent",
    :all_names     => ["crescent"],
    :damage_types  => { slash: 83.6, crush: 0.0, puncture: 16.7, special: [] },
    :damage_factor => [nil, 0.0, 0.0, 0.0, 0.0, 0.0], # for ammunition, these are modifiers
    #                       /Cloth          / Leather   / Scale     / Chain     / Plate
    :avd_by_asg    => [nil, 0, 0, nil, nil, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # for ammunition, these are modifiers
    :base_rt       => 0, # for ammunition, this is a modifier, not a base RT
    :min_rt        => 0, # for ammunition, this is a modifier, not a minimum RT
    :weapon_class  => :ammunition
  },
}
@@weapon_stats_thrown =

Static array of weapon stats for thrown weapons. Each entry contains metadata about the weapon’s category, base name, alternative names, damage types, damage factors, armor avoidance, base roundtime, and minimum roundtime.

{
  :bola         => {
    :category      => :thrown,
    :base_name     => "bola",
    :all_names     => ["bola", "bolas", "boleadoras", "kurutai", "weighted-cord"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.310, 0.225, 0.240, 0.125, 0.150],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 20, 19, 18, 17, 30, 28, 26, 24, 25, 21, 17, 13, 35, 29, 23, 17],
    :base_rt       => 5,
    :min_rt        => 2,
  },
  :dart         => {
    :category      => :thrown,
    :base_name     => "dart",
    :all_names     => ["dart", "nagyka"],
    :damage_types  => { slash: 0.0, crush: 0.0, puncture: 100.0, special: [] },
    :damage_factor => [nil, 0.125, 0.100, 0.075, 0.055, 0.050],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 30, 29, 28, 27, 25, 23, 21, 19, 20, 16, 12, 8, 10, 4, -2, -8],
    :base_rt       => 2,
    :min_rt        => 3,
  },
  :discus       => {
    :category      => :thrown,
    :base_name     => "discus",
    :all_names     => ["discus", "throwing disc", "disc"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.255, 0.230, 0.155, 0.110, 0.057],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 35, 34, 33, 32, 30, 28, 26, 24, 25, 21, 17, 13, 30, 24, 18, 12],
    :base_rt       => 5,
    :min_rt        => 2,
  },
  :javelin      => {
    :category      => :thrown,
    :base_name     => "javelin",
    :all_names     => ["javelin", "contus", "jaculum", "knopkierie", "lancea", "nage-yari", "pelta", "shail", "spiculum"],
    :damage_types  => { slash: 0.0, crush: 0.0, puncture: 100.0, special: [] },
    :damage_factor => [nil, 0.400, 0.300, 0.250, 0.250, 0.100],
    #                       /Cloth  / Leather / Scale   / Chain   / Plate
    :avd_by_asg    => [nil, 27, 27, nil, nil, 28, 27, 25, 25, 26, 24, 22, 20, 29, 25, 21, 17, 20, 14, 8, 2],
    :base_rt       => 4,
    :min_rt        => 3,
  },
  :throwing_net => {
    :category      => :thrown,
    :base_name     => "throwing net",
    :all_names     => ["throwing net"],
    :damage_types  => { slash: 0.0, crush: 0.0, puncture: 0.0, special: [:unbalance] },
    :damage_factor => [nil, 0.050, 0.050, 0.030, 0.030, 0.010],
    #                       /Cloth             / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 25, 24, 23, 22, 30, 28, 26, 24, 40, 36, 32, 28, 50, 44, 38, 32],
    :base_rt       => 7,
    :min_rt        => 3,
  },
  :quoit        => {
    :category      => :thrown,
    :base_name     => "quoit",
    :all_names     => ["quoit", "bladed-ring", "bladed-disc", "bladed wheel", "battle-quoit", "chakram", "war-quoit"],
    :damage_types  => { slash: 100.0, crush: 0.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.255, 0.230, 0.155, 0.110, 0.057],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 35, 34, 33, 32, 30, 28, 26, 24, 25, 21, 17, 13, 30, 24, 18, 12],
    :base_rt       => 5,
    :min_rt        => 3,
  },
  :handaxe      => {
    :category      => :edged,
    :base_name     => "handaxe",
    :all_names     => ["handaxe", "balta", "boarding axe", "broad axe", "cleaver", "crescent axe", "double-bit axe", "field-axe", "francisca", "hatchet", "hunting axe", "hunting hatchet", "ice axe", "limb-cleaver", "logging axe", "meat cleaver", "miner's axe", "moon axe", "ono", "raiding axe", "sparte", "splitting axe", "throwing axe", "taper", "tomahawk", "toporok", "waraxe"],
    :damage_types  => { slash: 33.3, crush: 66.7, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.420, 0.300, 0.270, 0.240, 0.210],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 32, 31, 30, 29, 38, 36, 34, 32, 41, 37, 33, 29, 41, 35, 29, 23],
    :base_rt       => 5,
    :min_rt        => 4,
  },
}
@@weapon_stats_natural =

Static array of weapon stats for natural weapons. Each entry contains metadata such as category, base name, alternative names, damage types, damage factors, armor avoidance by armor size group (ASG), base roundtime (RT), and minimum RT.

{
  :bite       => {
    :category      => :natural,
    :base_name     => "bite",
    :all_names     => ["bite"],
    :damage_types  => { slash: nil, crush: nil, puncture: nil, special: [] },
    :damage_factor => [nil, 0.400, 0.375, 0.375, 0.325, 0.300],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 39, 39, nil, nil, 39, 35, 34, 33, 32, 30, 28, 26, 24, 32, 28, 24, 20, 25, 19, 13, 7],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :charge     => {
    :category      => :natural,
    :base_name     => "charge",
    :all_names     => ["charge"],
    :damage_types  => { slash: 0.0, crush: nil, puncture: 0.0, special: [:unbalance] },
    :damage_factor => [nil, 0.175, 0.175, 0.150, 0.175, 0.150],
    #                        /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 26, 26, nil, nil, 32, 31, 30, 29, 41, 39, 37, 35, 37, 33, 29, 25, 49, 43, 37, 31],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :claw       => {
    :category      => :natural,
    :base_name     => "claw",
    :all_names     => ["claw"],
    :damage_types  => { slash: nil, crush: nil, puncture: nil, special: [] },
    :damage_factor => [nil, 0.225, 0.200, 0.200, 0.175, 0.175],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 41, 41, nil, nil, 38, 37, 36, 35, 29, 27, 25, 23, 31, 27, 23, 19, 25, 19, 13, 7],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :ensnare    => {
    :category      => :natural,
    :base_name     => "ensnare",
    :all_names     => ["ensnare"],
    :damage_types  => { slash: nil, crush: nil, puncture: nil, special: [:grapple] },
    :damage_factor => [nil, 0.275, 0.225, 0.200, 0.175, 0.150],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 31, 30, 29, 28, 40, 38, 36, 34, 38, 34, 30, 26, 50, 44, 38, 32],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :impale     => {
    :category      => :natural,
    :base_name     => "impale",
    :all_names     => ["impale"],
    :damage_types  => { slash: 0.0, crush: nil, puncture: nil, special: [:unbalance] },
    :damage_factor => [nil, 0.350, 0.325, 0.315, 0.300, 0.285],
    #                       /Cloth             / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 37, 37, nil, nil, 43, 42, 41, 40, 33, 31, 29, 27, 35, 31, 27, 23, 31, 25, 19, 13],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :nip        => {
    :category      => :natural,
    :base_name     => "nip",
    :all_names     => ["nip"],
    :damage_types  => { slash: 0.0, crush: 0.0, puncture: nil, special: [] },
    :damage_factor => [nil, 0.125, 0.105, 0.090, 0.090, 0.100],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 40, 39, 38, 37, 25, 23, 21, 19, 28, 24, 20, 16, 20, 14, 8, 2],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :pincer     => {
    :category      => :natural,
    :base_name     => "pincer",
    :all_names     => ["pincer"],
    :damage_types  => { slash: nil, crush: nil, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.300, 0.300, 0.225, 0.225, 0.225],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 37, 37, nil, nil, 35, 34, 33, 32, 30, 28, 26, 24, 34, 30, 26, 22, 30, 24, 18, 12],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :pound      => {
    :category      => :natural,
    :base_name     => "pound",
    :all_names     => ["pound"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.425, 0.350, 0.325, 0.325, 0.275],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 38, 38, nil, nil, 45, 44, 43, 42, 46, 44, 42, 40, 50, 46, 42, 38, 50, 44, 38, 32],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :stinger    => {
    :category      => :natural,
    :base_name     => "stinger",
    :all_names     => ["stinger"],
    :damage_types  => { slash: 0.0, crush: 0.0, puncture: 100.0, special: [] },
    :damage_factor => [nil, 0.110, 0.100, 0.100, 0.090, 0.085],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 43, 43, nil, nil, 30, 29, 28, 27, 25, 23, 21, 19, 28, 24, 20, 16, 20, 14, 8, 2],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :stomp      => {
    :category      => :natural,
    :base_name     => "stomp",
    :all_names     => ["stomp"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.325, 0.325, 0.250, 0.225, 0.225],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 39, 39, nil, nil, 45, 44, 43, 42, 35, 33, 31, 29, 45, 41, 37, 33, 33, 27, 21, 15],
    :base_rt       => 5,
    :min_rt        => 5,
  },
  :tail_swing => {
    :category      => :natural,
    :base_name     => "tail swing",
    :all_names     => ["tail swing"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.400, 0.300, 0.225, 0.250, 0.175],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 31, 31, nil, nil, 32, 31, 30, 29, 35, 33, 31, 29, 42, 38, 34, 30, 36, 30, 24, 18],
    :base_rt       => 5,
    :min_rt        => 5,
  },
}
@@weapon_stats_polearm =

Static array of weapon stats for polearm weapons. Each entry contains detailed information about the weapon’s characteristics.

{
  :awl_pike      => {
    :category      => :polearm,
    :base_name     => "awl-pike",
    :all_names     => ["awl-pike", "ahlspiess", "breach pike", "chest-ripper", "korseke", "military fork", "ranseur", "runka", "scaling fork", "spetum"],
    :damage_types  => { slash: 0.0, crush: 13.0, puncture: 87.0, special: [] },
    :damage_factor => [nil, 0.600, 0.550, 0.575, 0.450, 0.350],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 15, 15, nil, nil, 20, 19, 18, 17, 35, 33, 21, 29, 45, 41, 37, 33, 50, 44, 38, 32],
    :base_rt       => 9,
    :min_rt        => 4,
  },
  :halberd       => {
    :category      => :polearm,
    :base_name     => "halberd",
    :all_names     => ["halberd", "atgeir", "bardiche", "bill", "brandestoc", "croc", "falcastra", "fauchard", "glaive", "godendag", "guisarme", "half moon", "half-moon", "hippe", "kerambit", "pole axe", "pole-axe", "scorpion", "scythe"],
    :damage_types  => { slash: 33.3, crush: 33.3, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.550, 0.400, 0.400, 0.300, 0.200],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 30, 29, 28, 17, 31, 29, 27, 25, 32, 28, 24, 20, 32, 26, 20, 14],
    :base_rt       => 6,
    :min_rt        => 4,
  },
  :hammer_of_kai => {
    :category      => :polearm,
    :base_name     => "Hammer of Kai",
    :all_names     => ["Hammer of Kai", "bovai", "longhammer", "polehammer", "spiked-hammer"],
    :damage_types  => { slash: 0.0, crush: nil, puncture: nil, special: [] }, # data missing from wiki
    :damage_factor => [nil, 0.550, 0.425, 0.450, 0.350, 0.250],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 20, 20, nil, nil, 25, 24, 23, 22, 35, 33, 31, 29, 40, 36, 32, 28, 40, 34, 28, 22],
    :base_rt       => 7,
    :min_rt        => 4,
  },
  :jeddart_axe   => {
    :category      => :polearm,
    :base_name     => "jeddart-axe",
    :all_names     => ["jeddart-axe", "beaked axe", "nagimaki", "poleaxe", "voulge"],
    :damage_types  => { slash: 50.0, crush: 50.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.550, 0.425, 0.425, 0.325, 0.250],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 32, 31, 30, 29, 30, 28, 26, 24, 40, 36, 32, 28, 30, 24, 18, 12],
    :base_rt       => 7,
    :min_rt        => 4,
  },
  :javelin       => {
    :category      => :polearm,
    :base_name     => "javelin",
    :all_names     => ["javelin", "contus", "jaculum", "knopkierie", "lancea", "nage-yari", "pelta", "shail", "spiculum"],
    :damage_types  => { slash: 17.0, crush: 0.0, puncture: 83.0, special: [] },
    :damage_factor => [nil, 0.402, 0.304, 0.254, 0.254, 0.102],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 27, 27, nil, nil, 28, 27, 25, 25, 26, 24, 22, 20, 29, 25, 21, 17, 20, 14, 8, 2],
    :base_rt       => 4,
    :min_rt        => 5,
  },
  :lance         => {
    :category      => :polearm,
    :base_name     => "lance",
    :all_names     => ["lance", "framea", "pike", "sarissa", "sudis", "warlance", "warpike"],
    :damage_types  => { slash: 0.0, crush: 33.0, puncture: 67.0, special: [] },
    :damage_factor => [nil, 0.725, 0.525, 0.559, 0.475, 0.350],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 38, 37, 36, 35, 39, 37, 35, 33, 53, 49, 45, 31, 50, 44, 38, 32],
    :base_rt       => 9,
    :min_rt        => 4,
  },
  :naginata      => {
    :category      => :polearm,
    :base_name     => "naginata",
    :all_names     => ["naginata", "swordstaff", "bladestaff"],
    :damage_types  => { slash: 33.3, crush: 33.3, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.550, 0.400, 0.400, 0.300, 0.200],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 50, 50, nil, nil, 50, 49, 48, 27, 51, 49, 47, 45, 52, 48, 44, 40, 52, 46, 40, 34],
    :base_rt       => 6,
    :min_rt        => 4,
  },
  :pilum         => {
    :category      => :polearm,
    :base_name     => "pilum",
    :all_names     => ["pilum"],
    :damage_types  => { slash: 17.0, crush: 0.0, puncture: 83.0, special: [] },
    :damage_factor => [nil, 0.350, 0.250, 0.225, 0.175, 0.060],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 27, 26, 25, 24, 22, 20, 18, 16, 23, 19, 15, 11, 15, 9, 3, -3],
    :base_rt       => 3,
    :min_rt        => 3,
  },
  :spear         => {
    :category      => :polearm,
    :base_name     => "spear",
    :all_names     => ["angon", "atlatl", "boar spear", "cateia", "dory", "falarica", "gaesum", "gaizaz", "harpoon", "hasta", "partisan", "partizan", "pill spear", "spontoon", "verutum", "yari"],
    :damage_types  => { slash: 17.0, crush: 0.0, puncture: 83.0, special: [] },
    # spear can be used 1 or 2 handed, using the same skill, arrays returned for data below are 0 = one handed, and 1 = two handed
    :damage_factor => [[nil, 0.425, 0.325, 0.250, 0.250, 0.160], [nil, 0.550, 0.225, 0.240, 0.125, 0.150]],
    #                        /Cloth            / Leather       / Scale         / Chain         / Plate               /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [[nil, 27, 27, nil, nil, 29, 28, 27, 26, 27, 25, 23, 21, 30, 26, 22, 18, 25, 19, 13, 7], [nil, 33, 33, nil, nil, 32, 31, 30, 29, 34, 32, 30, 28, 36, 32, 28, 24, 33, 27, 21, 15]],
    :base_rt       => [5, 6],
    :min_rt        => 4,
    :grippable?    => true,
  },
  :trident       => {
    :category      => :polearm,
    :base_name     => "trident",
    :all_names     => ["trident", "fuscina", "magari-yari", "pitch fork", "pitchfork", "zinnor"],
    :damage_types  => { slash: 33.0, crush: 0.0, puncture: 67.0, special: [] },
    # trident can be used 1 or 2 handed, using the same skill, arrays returned for data below are 0 = one handed, and 1 = two handed
    :damage_factor => [[nil, 0.425, 0.350, 0.260, 0.230, 0.150], [nil, 0.600, 0.425, 0.375, 0.300, 0.185]],
    #                        /Cloth            / Leather       / Scale         / Chain         / Plate                /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [[nil, 31, 31, nil, nil, 31, 30, 29, 28, 34, 32, 30, 28, 42, 38, 34, 30, 29, 23, 17, 11], [nil, 29, 29, nil, nil, 30, 29, 28, 27, 30, 28, 26, 24, 37, 33, 29, 25, 25, 19, 13, 7]],
    :base_rt       => [5, 6],
    :min_rt        => 4,
    :grippable?    => true,
  },
}
@@weapon_stats_unarmed =

Static weapon stats for unarmed combat.

Examples:

Accessing weapon stats

Lich::Gemstone::Armaments::WeaponStats.weapon_stats_unarmed[:cestus]
{
  :cestus         => {
    :category                => :unarmed,
    :base_name               => "cestus",
    :all_names               => ["cestus"],
    :damage_factor_modifier  => 0.25,
    :ucs_multiplier_modifier => -5,
    :both_hands?             => true, # may hold two for additional bonuses
    :both_hands_modifier     => 2, # multiplies the modifiers by 2
    :held_or_worn            => :held,
  },
  :footwraps      => {
    :category                => :unarmed,
    :base_name               => "footwraps",
    :all_names               => ["footwraps", "boots"], # additional names could exist, there is no list on the wiki of allowable nouns
    :damage_factor_modifier  => 0.0,
    :ucs_multiplier_modifier => 0,
    :both_hands?             => nil, # does not apply
    :both_hands_modifier     => nil, # does not apply
    :held_or_worn            => :worn,
  },
  :handwraps      => {
    :category                => :unarmed,
    :base_name               => "handwraps",
    :all_names               => ["handwraps", "gloves", "gauntlet"], # additional names could exist, there is no list on the wiki of allowable nouns
    :damage_factor_modifier  => 0.0,
    :ucs_multiplier_modifier => 0,
    :both_hands?             => nil, # does not apply
    :both_hands_modifier     => nil, # does not apply
    :held_or_worn            => :worn,
  },
  :knuckle_blade  => {
    :category                => :unarmed,
    :base_name               => "knuckle-blade",
    :all_names               => ["knuckle-blade", "slash-fist"],
    :damage_factor_modifier  => 0.50,
    :ucs_multiplier_modifier => -10,
    :both_hands?             => true, # may hold two for additional bonuses
    :both_hands_modifier     => 2, # multiplies the modifiers by 2
    :held_or_worn            => :held,
  },
  :knuckle_duster => {
    :category                => :unarmed,
    :base_name               => "knuckle-duster",
    :all_names               => ["knuckle-duster", "knuckle-guard", "knuckles"],
    :damage_factor_modifier  => 0.50,
    :ucs_multiplier_modifier => -10,
    :both_hands?             => true, # may hold two for additional bonuses
    :both_hands_modifier     => 2, # multiplies the modifiers by 2
    :held_or_worn            => :held,
  },
  :paingrip       => {
    :category                => :unarmed,
    :base_name               => "paingrip",
    :all_names               => ["paingrip", "grab-stabber"],
    :damage_factor_modifier  => 0.25,
    :ucs_multiplier_modifier => -5,
    :both_hands?             => true, # may hold two for additional bonuses
    :both_hands_modifier     => 2, # multiplies the modifiers by 2
    :held_or_worn            => :held,
  },
  :razorpaw       => {
    :category                => :unarmed,
    :base_name               => "razorpaw",
    :all_names               => ["razorpaw", "slap-slasher"],
    :damage_factor_modifier  => 0.25,
    :ucs_multiplier_modifier => -5,
    :both_hands?             => true, # may hold two for additional bonuses
    :both_hands_modifier     => 2, # multiplies the modifiers by 2
    :held_or_worn            => :held,
  },
  :tiger_claw     => {
    :category                => :unarmed,
    :base_name               => "tiger-claw",
    :all_names               => ["tiger-claw", "thrak-bite", "barbed claw"],
    :damage_factor_modifier  => 0.75,
    :ucs_multiplier_modifier => -15,
    :both_hands?             => true, # may hold two for additional bonuses
    :both_hands_modifier     => 2, # multiplies the modifiers by 2
    :held_or_worn            => :held,
  },
  :yierka_spur    => {
    :category                => :unarmed,
    :base_name               => "yierka-spur",
    :all_names               => ["yierka-spur", "spike-fist"],
    :damage_factor_modifier  => 0.75,
    :ucs_multiplier_modifier => -15,
    :both_hands?             => true, # may hold two for additional bonuses
    :both_hands_modifier     => 2, # multiplies the modifiers by 2
    :held_or_worn            => :held,
  },
}
@@weapon_stats_brawling =

Static array of weapon stats for brawling weapons.

Examples:

Example of brawling weapon stats

@@weapon_stats_brawling = {
  :closed_fist    => {
    :category      => :brawling,
    :base_name     => "closed fist",
    :all_names     => ["closed fist"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.100, 0.075, 0.040, 0.036, 0.032],
    :avd_by_asg    => [nil, 25, 25, nil, nil, 20, 19, 18, 17, 10, 8, 6, 4, 5, 1, -3, -7, -5, -11, -17, -23],
    :base_rt       => 1,
    :min_rt        => 2,
  },
{
  :closed_fist    => {
    :category      => :brawling,
    :base_name     => "closed fist",
    :all_names     => ["closed fist"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.100, 0.075, 0.040, 0.036, 0.032],
    #                       /Cloth            / Leather       / Scale      / Chain       / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 20, 19, 18, 17, 10, 8, 6, 4, 5, 1, -3, -7, -5, -11, -17, -23],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :blackjack      => {
    :category      => :brawling,
    :base_name     => "blackjack",
    :all_names     => ["blackjack", "bludgeon", "sap"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.250, 0.140, 0.090, 0.110, 0.075],
    #                       /Cloth            / Leather       / Scale         / Chain       / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 35, 34, 33, 32, 25, 23, 21, 19, 15, 11, 7, 3, 0, -6, -12, -18],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :cestus         => {
    :category      => :brawling,
    :base_name     => "cestus",
    :all_names     => ["cestus"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.250, 0.175, 0.150, 0.075, 0.035],
    #                       /Cloth            / Leather       / Scale         / Chain       / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 30, 29, 28, 27, 20, 18, 16, 14, 10, 6, 2, -2, -25, -31, -37, -43],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :fist_scythe    => {
    :category      => :brawling,
    :base_name     => "fist-scythe",
    :all_names     => ["fist-scythe", "hand-hook", "hook", "hook-claw", "kama", "sickle"],
    :damage_types  => { slash: 66.7, crush: 16.7, puncture: 16.6, special: [] },
    :damage_factor => [nil, 0.350, 0.225, 0.200, 0.175, 0.125],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 45, 45, nil, nil, 40, 39, 38, 37, 30, 28, 26, 24, 37, 33, 29, 25, 20, 14, 8, 2],
    :base_rt       => 3,
    :min_rt        => 3,
  },
  :hook_knife     => {
    :category      => :brawling,
    :base_name     => "hook-knife",
    :all_names     => ["hook-knife", "pit-knife", "sabiet"],
    :damage_types  => { slash: nil, crush: 0.0, puncture: nil, special: [] }, # Missing Data on Wiki
    :damage_factor => [nil, 0.250, 0.175, 0.125, 0.070, 0.035],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 30, 29, 28, 27, 18, 16, 13, 12, 10, 6, 2, -2, -15, -21, -27, -33],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :jackblade      => {
    :category      => :brawling,
    :base_name     => "jackblade",
    :all_names     => ["jackblade", "slash-jack"],
    :damage_types  => { slash: nil, crush: nil, puncture: 0.0, special: [] }, # Missing Data on Wiki
    :damage_factor => [nil, 0.250, 0.175, 0.150, 0.150, 0.110],
    #                       /Cloth            / Leather       / Scale         / Chain        / Plate
    :avd_by_asg    => [nil, 45, 45, nil, nil, 35, 34, 33, 32, 25, 23, 21, 19, 20, 16, 12, 8, 10, 4, -2, -8],
    :base_rt       => 2,
    :min_rt        => 3,
  },
  :paingrip       => {
    :category      => :brawling,
    :base_name     => "paingrip",
    :all_names     => ["paingrip", "grab-stabber"],
    :damage_types  => { slash: nil, crush: nil, puncture: nil, special: [] }, # Missing Data on Wiki
    :damage_factor => [nil, 0.225, 0.200, 0.125, 0.075, 0.030],
    #                       /Cloth            / Leather       / Scale        / Chain       / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 20, 19, 18, 17, 15, 13, 11, 9, 15, 11, 7, 3, -25, -31, -37, -43],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :sai            => {
    :category      => :brawling,
    :base_name     => "sai",
    :all_names     => ["sai", "jitte"],
    :damage_types  => { slash: 0.0, crush: 0.0, puncture: 100.0, special: [] },
    :damage_factor => [nil, 0.250, 0.200, 0.110, 0.150, 0.040],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 30, 30, nil, nil, 31, 30, 29, 28, 25, 23, 21, 19, 33, 29, 25, 21, 6, 0, -6, -12],
    :base_rt       => 2,
    :min_rt        => 3,
  },
  :knuckle_blade  => {
    :category      => :brawling,
    :base_name     => "knuckle-blade",
    :all_names     => ["knuckle-blade", "slash-fist"],
    :damage_types  => { slash: 66.7, crush: 33.3, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.250, 0.150, 0.100, 0.075, 0.075],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 45, 45, nil, nil, 40, 39, 38, 37, 25, 23, 21, 19, 25, 21, 17, 13, 0, -6, -12, -18],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :knuckle_duster => {
    :category      => :brawling,
    :base_name     => "knuckle-duster",
    :all_names     => ["knuckle-duster", "knuckle-guard", "knuckles"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.250, 0.175, 0.125, 0.100, 0.040],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 32, 31, 30, 29, 25, 23, 21, 19, 18, 14, 10, 6, 0, -6, -12, -18],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :razorpaw       => {
    :category      => :brawling,
    :base_name     => "razorpaw",
    :all_names     => ["razorpaw", "slap-slasher"],
    :damage_types  => { slash: 100.0, crush: 0.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.275, 0.200, 0.125, 0.050, 0.030],
    #                       /Cloth            / Leather       / Scale      / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 20, 19, 18, 17, 10, 8, 6, 4, 0, -4, -8, -12, -25, -31, -37, -43],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :tiger_claw     => {
    :category      => :brawling,
    :base_name     => "tiger-claw",
    :all_names     => ["tiger-claw", "thrak-bite", "barbed claw"],
    :damage_types  => { slash: nil, crush: nil, puncture: 0.0, special: [] }, # Missing Data on Wiki
    :damage_factor => [nil, 0.275, 0.200, 0.150, 0.100, 0.035],
    #                       /Cloth            / Leather       / Scale        / Chain       / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 25, 24, 23, 22, 15, 13, 11, 9, 5, 1, -3, -7, -25, -31, -37, -43],
    :base_rt       => 1,
    :min_rt        => 2,
  },
  :troll_claw     => {
    :category      => :brawling,
    :base_name     => "troll-claw",
    :all_names     => ["troll-claw", "bladed claw", "kumade", "wight-claw"],
    :damage_types  => { slash: nil, crush: nil, puncture: 0.0, special: [] }, # Missing Data on Wiki
    :damage_factor => [nil, 0.325, 0.175, 0.140, 0.120, 0.090],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 46, 46, nil, nil, 35, 34, 33, 32, 25, 23, 21, 19, 25, 21, 17, 13, 15, 9, 3, -3],
    :base_rt       => 2,
    :min_rt        => 3,
  },
  :yierka_spur    => {
    :category      => :brawling,
    :base_name     => "yierka-spur",
    :all_names     => ["yierka-spur", "spike-fist"],
    :damage_types  => { slash: nil, crush: nil, puncture: nil, special: [] }, # Missing Data on Wiki
    :damage_factor => [nil, 0.250, 0.150, 0.125, 0.125, 0.075],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 35, 34, 33, 32, 25, 23, 21, 19, 30, 26, 22, 18, 0, -6, -12, -18],
    :base_rt       => 1,
    :min_rt        => 2,
  },
}
@@weapon_stats_runestave =

Static array of weapon stats for runestave.

Examples:

Accessing weapon stats

stats = Lich::Gemstone::Armaments::WeaponStats::@@weapon_stats_runestave[:runestave]
{
  :runestave => {
    :category      => :runestave,
    :base_name     => "runestave",
    :all_names     => ["runestave", "asaya", "crook", "crosier", "pastoral staff", "rune staff", "runestaff", "scepter", "scepter-of-Lumnis", "staff", "staff-of-lumnis", "walking stick"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.250, 0.200, 0.150, 0.150, 0.075],
    #                       /Cloth            / Leather       / Scale      / Chain       / Plate
    :avd_by_asg    => [nil, 10, 10, nil, nil, 15, 14, 13, 12, 10, 8, 6, 4, 15, 11, 7, 3, 10, 4, -2, -8],
    :base_rt       => 6,
    :min_rt        => 4,
  },
}
@@weapon_stats_two_handed =

Static array of two-handed weapon stats indexed by weapon identifiers.

{
  # Weapon stats for the bastard sword.
  :bastard_sword    => {
    :category      => :two_handed,
    :base_name     => "bastard sword",
    :all_names     => ["bastard sword", "cresset sword", "espadon", "war sword"],
    :damage_types  => { slash: 66.7, crush: 33.3, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.550, 0.400, 0.375, 0.300, 0.225],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 42, 42, nil, nil, 45, 44, 43, 42, 41, 39, 37, 35, 44, 40, 36, 32, 43, 37, 31, 25],
    :base_rt       => 6,
    :min_rt        => 4,
    :grippable?    => true,
  },
  # Weapon stats for the battle axe.
  :battle_axe       => {
    :category      => :two_handed,
    :base_name     => "battle axe",
    :all_names     => ["battle axe", "adze", "balestarius", "battle-axe", "bearded axe", "doloire", "executioner's axe", "greataxe", "hektov sket", "kheten", "roa'ter axe", "tabar", "woodsman's axe"],
    :damage_types  => { slash: 66.7, crush: 33.3, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.650, 0.475, 0.500, 0.375, 0.275],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 35, 35, nil, nil, 39, 38, 37, 36, 43, 41, 39, 37, 50, 46, 42, 38, 50, 44, 38, 32],
    :base_rt       => 8,
    :min_rt        => 4,
  },
  # Weapon stats for the claidmore.
  :claidhmore       => { # made a choice here to only account for new style claidmores, not the old ones
    :category         => :two_handed,
    :base_name        => "claidhmore",
    :all_names        => ["claidhmore"],
    :damage_types     => { slash: 50.0, crush: 50.0, puncture: 0.0, special: [] },
    :damage_factor    => [nil, 0.625, 0.475, 0.500, 0.350, 0.225],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg       => [nil, 31, 31, nil, nil, 35, 34, 33, 32, 34, 32, 30, 28, 38, 34, 30, 26, 37, 31, 25, 19],
    :base_rt          => 8,
    :min_rt           => 4,
    :weighting_type   => :critical,
    :weighting_amount => 40,
  },
  # Weapon stats for the flail.
  :flail            => {
    :category      => :two_handed,
    :base_name     => "flail",
    :all_names     => ["flail", "military flail", "spiked-staff"],
    :damage_types  => { slash: 0.0, crush: 66.7, puncture: 33.3, special: [] },
    :damage_factor => [nil, 0.575, 0.425, 0.400, 0.350, 0.250],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 40, 40, nil, nil, 45, 44, 43, 42, 46, 44, 42, 40, 51, 47, 43, 39, 52, 46, 40, 34],
    :base_rt       => 7,
    :min_rt        => 4,
  },
  # Weapon stats for the flamberge.
  :flamberge        => {
    :category      => :two_handed,
    :base_name     => "flamberge",
    :all_names     => ["flamberge", "reaver", "wave-bladed sword", "sword-of-Phoen"],
    :damage_types  => { slash: 50.0, crush: 50.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.600, 0.450, 0.475, 0.325, 0.225],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 39, 39, nil, nil, 43, 42, 41, 40, 48, 46, 44, 42, 50, 46, 42, 38, 44, 38, 32, 26],
    :base_rt       => 7,
    :min_rt        => 4,
  },
  # Weapon stats for the katana.
  :katana           => {
    :category         => :two_handed,
    :base_name        => "katana",
    :all_names        => ["katana"],
    :damage_types     => { slash: 100.0, crush: 0.0, puncture: 0.0, special: [] },
    :damage_factor    => [nil, 0.575, 0.425, 0.400, 0.325, 0.210],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg       => [nil, 39, 39, nil, nil, 41, 40, 39, 38, 40, 38, 36, 34, 41, 37, 33, 29, 39, 33, 27, 21],
    :base_rt          => 6,
    :min_rt           => 4,
    :weighting_type   => :critical,
    :weighting_amount => 10,
    :grippable?       => true,
  },
  # Weapon stats for the maul.
  :maul             => {
    :category      => :two_handed,
    :base_name     => "maul",
    :all_names     => ["maul", "battle hammer", "footman's hammer", "sledgehammer", "tetsubo"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.550, 0.425, 0.425, 0.375, 0.300],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 31, 31, nil, nil, 36, 35, 34, 33, 44, 42, 40, 38, 52, 48, 44, 40, 54, 48, 42, 36],
    :base_rt       => 7,
    :min_rt        => 4,
  },
  # Weapon stats for the military pick.
  :military_pick    => {
    :category      => :two_handed,
    :base_name     => "military pick",
    :all_names     => ["military pick", "bisacuta", "mining pick"],
    :damage_types  => { slash: 0.0, crush: 33.3, puncture: 66.7, special: [] },
    :damage_factor => [nil, 0.500, 0.375, 0.425, 0.375, 0.260],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 30, 29, 28, 27, 40, 38, 36, 34, 40, 36, 32, 28, 47, 41, 35, 29],
    :base_rt       => 7,
    :min_rt        => 4,
  },
  # Weapon stats for the quarterstaff.
  :quarterstaff     => {
    :category      => :two_handed,
    :base_name     => "quarterstaff",
    :all_names     => ["quarterstaff", "bo stick", "staff", "toyak", "walking staff", "warstaff", "yoribo"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.450, 0.350, 0.325, 0.175, 0.100],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 25, 25, nil, nil, 26, 25, 24, 23, 25, 23, 21, 19, 26, 22, 18, 14, 24, 18, 12, 6],
    :base_rt       => 3,
    :min_rt        => 3,
  },
  # Weapon stats for the two-handed sword.
  :two_handed_sword => {
    :category      => :two_handed,
    :base_name     => "two-handed sword",
    :all_names     => ["two-handed sword", "battlesword", "beheading sword", "bidenhander", "falx", "executioner's sword", "greatsword", "mekya ne'rutka", "no-dachi", "zweihander"],
    :damage_types  => { slash: 50.0, crush: 50.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.625, 0.500, 0.500, 0.350, 0.275],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 41, 41, nil, nil, 45, 44, 43, 42, 44, 42, 40, 38, 48, 44, 40, 36, 47, 41, 35, 29],
    :base_rt       => 8,
    :min_rt        => 4,
  },
  # Weapon stats for the war mattock.
  :war_mattock      => {
    :category      => :two_handed,
    :base_name     => "war mattock",
    :all_names     => ["war mattock", "mattock", "oncin", "pickaxe", "sabar"],
    :damage_types  => { slash: 0.0, crush: 100.0, puncture: 0.0, special: [] },
    :damage_factor => [nil, 0.550, 0.450, 0.425, 0.375, 0.275],
    #                       /Cloth            / Leather       / Scale         / Chain         / Plate
    :avd_by_asg    => [nil, 32, 32, nil, nil, 37, 36, 35, 34, 44, 42, 40, 38, 48, 44, 40, 36, 53, 47, 41, 35],
    :base_rt       => 7,
    :min_rt        => 4,
  },
}

Class Method Summary collapse

Class Method Details

.aliases_for(name, category = nil) ⇒ Array<String>

Returns all aliases for a given weapon name

Examples:

Getting aliases for a weapon

aliases = WeaponStats.aliases_for("sword")

Parameters:

  • name (String)

    The name of the weapon

  • category (Symbol, nil) (defaults to: nil)

    The category of the weapon (optional)

Returns:

  • (Array<String>)

    An array of aliases for the weapon



145
146
147
148
149
150
# File 'documented/gemstone/armaments/weapon_stats.rb', line 145

def self.aliases_for(name, category = nil)
  name = name.downcase.strip

  weapon = self.find(name, category)
  weapon ? weapon[:all_names] : []
end

.categoriesArray<Symbol>

Returns the list of weapon categories

Examples:

Getting weapon categories

categories = WeaponStats.categories

Returns:

  • (Array<Symbol>)

    An array of weapon category symbols



112
113
114
# File 'documented/gemstone/armaments/weapon_stats.rb', line 112

def self.categories
  @@weapon_stats.keys
end

.category_for(name) ⇒ Symbol?

Returns the category for a given weapon name

Examples:

Getting the category for a weapon

category = WeaponStats.category_for("sword")

Parameters:

  • name (String)

    The name of the weapon

Returns:

  • (Symbol, nil)

    The category of the weapon or nil if not found



284
285
286
287
288
289
# File 'documented/gemstone/armaments/weapon_stats.rb', line 284

def self.category_for(name)
  name = name.downcase.strip

  weapon = self.find(name)
  weapon ? weapon[:category] : nil
end

.compare(name1, name2, category1 = nil, category2 = nil) ⇒ Hash?

Compares two weapons and returns their stats

Examples:

Comparing two weapons

comparison = WeaponStats.compare("sword", "axe")

Parameters:

  • name1 (String)

    The name of the first weapon

  • name2 (String)

    The name of the second weapon

  • category1 (Symbol, nil) (defaults to: nil)

    The category of the first weapon (optional)

  • category2 (Symbol, nil) (defaults to: nil)

    The category of the second weapon (optional)

Returns:

  • (Hash, nil)

    A hash containing comparison data or nil if not found



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'documented/gemstone/armaments/weapon_stats.rb', line 161

def self.compare(name1, name2, category1 = nil, category2 = nil)
  name1 = name1.downcase.strip
  name2 = name2.downcase.strip

  return nil if name1 == name2 && category1 == category2

  w1 = self.find(name1, category1)
  w2 = self.find(name2, category2)
  return nil unless w1 && w2

  {
    name1: w1[:base_name],
    name2: w2[:base_name],
    damage_types: [w1[:damage_types], w2[:damage_types]],
    damage_factors: [w1[:damage_factor], w2[:damage_factor]],
    avd_by_asg: [w1[:avd_by_asg], w2[:avd_by_asg]],
    base_rt: [w1[:base_rt], w2[:base_rt]],
    min_rt: [w1[:min_rt], w2[:min_rt]]
  }
end

.damage_summary(name, category = nil) ⇒ Hash?

Provides a summary of damage types for a given weapon

Examples:

Getting damage summary

summary = WeaponStats.damage_summary("sword")

Parameters:

  • name (String)

    The name of the weapon

  • category (Symbol, nil) (defaults to: nil)

    The category of the weapon (optional)

Returns:

  • (Hash, nil)

    A hash containing damage summary or nil if not found



123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'documented/gemstone/armaments/weapon_stats.rb', line 123

def self.damage_summary(name, category = nil)
  name = name.downcase.strip

  weapon = self.find(name, category)
  return nil unless weapon

  {
    base_name: weapon[:base_name],
    slash: weapon[:damage_types][:slash],
    crush: weapon[:damage_types][:crush],
    puncture: weapon[:damage_types][:puncture],
    special: weapon[:damage_types][:special]
  }
end

.find(name, category = nil) ⇒ Hash?

Finds a weapon by name and category

Examples:

Finding a weapon

weapon = WeaponStats.find("sword")

Parameters:

  • name (String)

    The name of the weapon to find

  • category (Symbol, nil) (defaults to: nil)

    The category of the weapon (optional)

Returns:

  • (Hash, nil)

    The weapon information or nil if not found



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'documented/gemstone/armaments/weapon_stats.rb', line 69

def self.find(name, category = nil)
  name = name.downcase.strip

  unless category.nil?
    weapons = @@weapon_stats[category]
    return nil unless weapons

    weapons.each_value do |weapon_info|
      return weapon_info if weapon_info[:all_names]&.include?(name)
    end
  else
    @@weapon_stats.each_value do |weapons|
      weapons.each_value do |weapon_info|
        return weapon_info if weapon_info[:all_names]&.include?(name)
      end
    end
  end
  nil
end

.is_grippable?(name) ⇒ Boolean

Checks if a weapon is grippable

Examples:

Checking if a weapon is grippable

grippable = WeaponStats.is_grippable?("sword")

Parameters:

  • name (String)

    The name of the weapon

Returns:

  • (Boolean)

    True if the weapon is grippable, false otherwise



270
271
272
273
274
275
276
# File 'documented/gemstone/armaments/weapon_stats.rb', line 270

def self.is_grippable?(name)
  name = name.downcase.strip

  weapon = self.find(name)

  weapon && weapon[:grippable?] == true
end

.list(category = nil) ⇒ Array<Hash>

Lists all weapons in a given category or all weapons if no category is specified

Examples:

Listing all weapons

weapons = WeaponStats.list

Parameters:

  • category (Symbol, nil) (defaults to: nil)

    The category of weapons to list (optional)

Returns:

  • (Array<Hash>)

    An array of weapon information hashes



95
96
97
98
99
100
101
102
103
104
105
# File 'documented/gemstone/armaments/weapon_stats.rb', line 95

def self.list(category = nil)
  result = []
  if category
    result.concat(@@weapon_stats[category]&.values || [])
  else
    @@weapon_stats.each_value do |weapons|
      result.concat(weapons.values)
    end
  end
  result
end

.namesArray<String>

Returns a list of all weapon names

Examples:

Getting all weapon names

names = WeaponStats.names

Returns:

  • (Array<String>)

    An array of unique weapon names



258
259
260
261
262
# File 'documented/gemstone/armaments/weapon_stats.rb', line 258

def self.names
  @@weapon_stats.values.flat_map do |weapons|
    weapons.values.map { |w| w[:all_names] }
  end.flatten.compact.uniq
end

.pretty(name) ⇒ String

Returns a concise string representation of a weapon

Examples:

Getting a concise representation of a weapon

summary = WeaponStats.pretty("sword")

Parameters:

  • name (String)

    The name of the weapon

Returns:

  • (String)

    A formatted string with concise weapon information



366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
# File 'documented/gemstone/armaments/weapon_stats.rb', line 366

def self.pretty(name)
  weapon = self.find(name)
  return "\n(no data)\n" unless weapon.is_a?(Hash)

  lines = []
  lines << "" # leading blank

  [:category, :base_name, :all_names, :base_rt, :min_rt, :grippable?, :weighting_type, :weighting_amount].each do |key|
    next unless weapon.key?(key)
    val = weapon[key]
    str_val = val.is_a?(Array) ? val.join(", ") : val.to_s
    lines << "%-18s: %s" % [key.to_s, str_val]
  end

  # damage types inline (always show, hash style)
  if weapon[:damage_types].is_a?(Hash)
    damage_str = weapon[:damage_types].map do |type, val|
      if type == :special
        "special=[#{val.join(", ")}]"
      else
        "#{type}=#{val}"
      end
    end.join(", ")
    lines << "%-18s: %s" % ["damage_types", damage_str]
  end

  # damage_factor inline
  if weapon[:damage_factor].is_a?(Array)
    df = weapon[:damage_factor][1..] || []
    df_str = df.each_with_index.map { |v, i| "AG%-2d=%0.3f" % [i + 1, v] }.join("  ")
    lines << "%-18s: %s" % ["damage_factor", df_str]
  end

  # AVD in aligned two-line block
  if weapon[:avd_by_asg].is_a?(Array)
    avds = weapon[:avd_by_asg][1..] || []

    col_width = 4
    header = avds.each_index.map { |i| i + 1 }.map { |asg| asg.to_s.rjust(col_width) }.join
    values = avds.map { |v| v.nil? ? '--'.rjust(col_width) : v.to_s.rjust(col_width) }.join

    lines << "%-18s: %s" % ["avd_by_asg", header]
    lines << " " * 20 + values
  end

  lines << "" # trailing blank
  lines.join("\n")
end

.pretty_long(name) ⇒ String

Returns a detailed string representation of a weapon

Examples:

Getting a detailed representation of a weapon

details = WeaponStats.pretty_long("sword")

Parameters:

  • name (String)

    The name of the weapon

Returns:

  • (String)

    A formatted string with detailed weapon information



297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
# File 'documented/gemstone/armaments/weapon_stats.rb', line 297

def self.pretty_long(name)
  weapon = self.find(name)
  return "\n(no data)\n" unless weapon.is_a?(Hash)

  lines = []

  core_fields = [
    :category, :base_name, :all_names, :base_rt, :min_rt,
    :grippable?, :weighting_type, :weighting_amount
  ]

  # Field labels for max width calc
  top_labels = core_fields.map(&:to_s) + ["damage_types", "damage_factor", "avd_by_asg"]
  nested_labels = %w[slash crush puncture special] +
                  Armaments::AG_INDEX_TO_NAME.values +
                  Armaments::ASG_INDEX_TO_NAME.values

  indent = 2
  max_label_width = (top_labels + nested_labels.map { |s| " " * indent + s })
                    .map(&:length).max

  # Print top-level fields
  core_fields.each do |key|
    next unless weapon.key?(key)
    val = weapon[key]
    str_val = val.is_a?(Array) ? val.join(", ") : val.to_s
    lines << "%-#{max_label_width}s : %s" % [key.to_s, str_val]
  end

  # Damage Types
  if weapon[:damage_types].is_a?(Hash)
    lines << "%-#{max_label_width}s :" % "damage_types"
    sub_indent = 2
    sub_label_width = max_label_width - sub_indent
    weapon[:damage_types].each do |type, value|
      val_str = (type == :special) ? (value.empty? ? "(none)" : value.join(", ")) : value.to_s
      lines << "%s%-#{sub_label_width}s : %s" % [" " * sub_indent, type.to_s, val_str]
    end
  end

  # Damage Factor
  if weapon[:damage_factor].is_a?(Array)
    lines << "%-#{max_label_width}s :" % "damage_factor"
    weapon[:damage_factor][1..].each_with_index do |df, i|
      ag_index = i + 1
      label = Armaments::AG_INDEX_TO_NAME[ag_index] || "AG #{ag_index}"
      lines << "  %-#{max_label_width - indent}s : %s" % [label, df]
    end
  end

  # AvD by ASG
  if weapon[:avd_by_asg].is_a?(Array)
    lines << "%-#{max_label_width}s :" % "avd_by_asg"
    weapon[:avd_by_asg][1..].each_with_index do |avd, i|
      next unless avd
      label = Armaments::ASG_INDEX_TO_NAME[i + 1] || "ASG #{i + 1}"
      lines << "  %-#{max_label_width - indent}s : %s" % [label, avd]
    end
  end

  lines.join("\n")
end

.search(filters = {}) ⇒ Array<Hash>

Searches for weapons based on given filters

Examples:

Searching for weapons

results = WeaponStats.search(damage_type: :slash, max_base_rt: 5)

Parameters:

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

    A hash of filters to apply to the search

Returns:

  • (Array<Hash>)

    An array of weapons matching the filters



188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'documented/gemstone/armaments/weapon_stats.rb', line 188

def self.search(filters = {})
  results = []

  @@weapon_stats.each do |category, weapons|
    next if filters[:category] && filters[:category] != category

    weapons.each_value do |weapon|
      # Filter by damage type (including special)
      if filters[:damage_type]
        damage_types = weapon[:damage_types]
        next unless damage_types

        if filters[:damage_type] == :special
          specials = damage_types[:special]
          next if !specials || specials.empty? || specials.include?(:none)
        else
          value = damage_types[filters[:damage_type]] || 0.0
          next if value <= 0.0
        end
      end

      # Filter by base roundtime
      if filters[:max_base_rt]
        base_rt = weapon[:base_rt]
        next if base_rt.nil? || base_rt > filters[:max_base_rt]
      end

      # Filter by AVD value at a specific ASG
      if filters[:min_avd_by_asg]
        asg = filters[:min_avd_by_asg][:asg]
        min = filters[:min_avd_by_asg][:min]
        avd = weapon[:avd_by_asg]
        next unless avd && asg.between?(1, 20)
        next if avd[asg].nil? || avd[asg] < min
      end

      # Filter by DF against a given armor group
      if filters[:min_df_by_ag]
        ag = filters[:min_df_by_ag][:ag]
        min = filters[:min_df_by_ag][:min]
        df = weapon[:damage_factor]
        next unless df && ag.between?(1, 5)
        next if df[ag].nil? || df[ag] < min
      end

      results << weapon
    end
  end

  results
end

.valid_name?(name) ⇒ Boolean

Validates if a given name corresponds to a known weapon

Examples:

Validating a weapon name

is_valid = WeaponStats.valid_name?("sword")

Parameters:

  • name (String)

    The name of the weapon to validate

Returns:

  • (Boolean)

    True if the name is valid, false otherwise



421
422
423
424
425
426
# File 'documented/gemstone/armaments/weapon_stats.rb', line 421

def self.valid_name?(name)
  name = name.downcase.strip
  @@weapon_stats.values.any? do |weapons|
    weapons.values.any? { |w| w[:all_names].include?(name) }
  end
end

.weapons_in_category(category) ⇒ Array<Hash>

Returns all weapons in a specified category

Examples:

Getting weapons in a category

weapons = WeaponStats.weapons_in_category(:blunt)

Parameters:

  • category (Symbol)

    The category of weapons to retrieve

Returns:

  • (Array<Hash>)

    An array of weapons in the specified category



246
247
248
249
250
251
# File 'documented/gemstone/armaments/weapon_stats.rb', line 246

def self.weapons_in_category(category)
  category = category.to_sym
  return [] unless @@weapon_stats.key?(category)

  @@weapon_stats[category].values
end