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

Provides static weapon statistics for two-handed weapons.

This module contains a collection of weapon stats indexed by weapon identifiers, including metadata such as category, base name, damage types, and more.

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 hash containing weapon statistics for blunt weapons. Each entry includes details such as category, base name, all names, damage types, damage factors, armor avoidance by armor size group, base roundtime, and minimum roundtime.

{
  # Weapon statistics for the ball and chain.
  #
  # @param category [Symbol] The category of the weapon (e.g., :blunt)
  # @param base_name [String] The primary name of the weapon
  # @param all_names [Array<String>] An array of all names for the weapon
  # @param damage_types [Hash] A hash of damage type percentages
  # @param damage_factor [Array<Float>] An array of damage factors against armor types
  # @param avd_by_asg [Array<Integer, nil>] An array of armor avoidance values by ASG
  # @param base_rt [Integer] The base roundtime for the weapon
  # @param min_rt [Integer] The minimum roundtime for the weapon
  :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,
  },
  # Weapon statistics for the crowbill.
  #
  # @param category [Symbol] The category of the weapon (e.g., :blunt)
  # @param base_name [String] The primary name of the weapon
  # @param all_names [Array<String>] An array of all names for the weapon
  # @param damage_types [Hash] A hash of damage type percentages
  # @param damage_factor [Array<Float>] An array of damage factors against armor types
  # @param avd_by_asg [Array<Integer, nil>] An array of armor avoidance values by ASG
  # @param base_rt [Integer] The base roundtime for the weapon
  # @param min_rt [Integer] The minimum roundtime for the weapon
  :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
  },
  # Weapon statistics for the cudgel.
  #
  # @param category [Symbol] The category of the weapon (e.g., :blunt)
  # @param base_name [String] The primary name of the weapon
  # @param all_names [Array<String>] An array of all names for the weapon
  # @param damage_types [Hash] A hash of damage type percentages
  # @param damage_factor [Array<Float>] An array of damage factors against armor types
  # @param avd_by_asg [Array<Integer, nil>] An array of armor avoidance values by ASG
  # @param base_rt [Integer] The base roundtime for the weapon
  # @param min_rt [Integer] The minimum roundtime for the weapon
  :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,
  },
  # Weapon statistics for the leather whip.
  #
  # @param category [Symbol] The category of the weapon (e.g., :blunt)
  # @param base_name [String] The primary name of the weapon
  # @param all_names [Array<String>] An array of all names for the weapon
  # @param damage_types [Hash] A hash of damage type percentages
  # @param damage_factor [Array<Float>] An array of damage factors against armor types
  # @param avd_by_asg [Array<Integer, nil>] An array of armor avoidance values by ASG
  # @param base_rt [Integer] The base roundtime for the weapon
  # @param min_rt [Integer] The minimum roundtime for the weapon
  :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,
  },
  # Weapon statistics for the mace.
  #
  # @param category [Symbol] The category of the weapon (e.g., :blunt)
  # @param base_name [String] The primary name of the weapon
  # @param all_names [Array<String>] An array of all names for the weapon
  # @param damage_types [Hash] A hash of damage type percentages
  # @param damage_factor [Array<Float>] An array of damage factors against armor types
  # @param avd_by_asg [Array<Integer, nil>] An array of armor avoidance values by ASG
  # @param base_rt [Integer] The base roundtime for the weapon
  # @param min_rt [Integer] The minimum roundtime for the weapon
  :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,
  },
  # Weapon statistics for the morning star.
  #
  # @param category [Symbol] The category of the weapon (e.g., :blunt)
  # @param base_name [String] The primary name of the weapon
  # @param all_names [Array<String>] An array of all names for the weapon
  # @param damage_types [Hash] A hash of damage type percentages
  # @param damage_factor [Array<Float>] An array of damage factors against armor types
  # @param avd_by_asg [Array<Integer, nil>] An array of armor avoidance values by ASG
  # @param base_rt [Integer] The base roundtime for the weapon
  # @param min_rt [Integer] The minimum roundtime for the weapon
  :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,
  },
  # Weapon statistics for the war hammer.
  #
  # @param category [Symbol] The category of the weapon (e.g., :blunt)
  # @param base_name [String] The primary name of the weapon
  # @param all_names [Array<String>] An array of all names for the weapon
  # @param damage_types [Hash] A hash of damage type percentages
  # @param damage_factor [Array<Float>] An array of damage factors against armor types
  # @param avd_by_asg [Array<Integer, nil>] An array of armor avoidance values by ASG
  # @param base_rt [Integer] The base roundtime for the weapon
  # @param min_rt [Integer] The minimum roundtime for the weapon
  :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 =

:Name => { :category => :unarmed, :base_name => "Name", :all_names => ["Name", "Alt", "Alt", "Alt"], :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, },

{
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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,
  },
  :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 =

:Name => { :category => :unarmed, :base_name => "Name", :all_names => ["Name", "Alt", "Alt", "Alt"], :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, },

{
  # 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 =

:Name => { :category => :unarmed, :base_name => "Name", :all_names => ["Name", "Alt", "Alt", "Alt"], :damage_types => 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, },

{
  :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 =

:Name => { :category => :unarmed, :base_name => "Name", :all_names => ["Name", "Alt", "Alt", "Alt"], :damage_types => { slash: 50.0, crush: 16.7, puncture: 33.3, special: [:unbalance] }, :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, },

{
  :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 =

A collection of weapon stats for natural weapons. Each entry includes various attributes related to the weapon's performance and characteristics.

Examples:

Example of a weapon stat entry:

@@weapon_stats_natural[:bite]
# => {:category=>:natural, :base_name=>"bite", ...}
{
  :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 =

:Name => { :category => :unarmed, :base_name => "Name", :all_names => ["Name", "Alt", "Alt", "Alt"], :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, },

{
  :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 =

A hash containing weapon statistics for unarmed combat. Each key is a weapon identifier, and the value is a hash of attributes related to that weapon.

Returns:

  • (Hash)

    a hash of weapon statistics indexed by weapon identifiers.

{
  :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 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.

{
  # Weapon statistics for the closed fist.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the blackjack.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the cestus.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the fist-scythe.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the hook-knife.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the jackblade.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the paingrip.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the sai.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the knuckle-blade.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the knuckle-duster.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the razorpaw.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the tiger-claw.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the troll-claw.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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,
  },
  # Weapon statistics for the yierka-spur.
  #
  # @return [Hash] weapon statistics including category, base name,
  # alternative names, damage types, damage factors, armor avoidance,
  # base roundtime, and minimum roundtime.
  :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 =

A hash containing weapon stats for various weapons. Each weapon's stats include category, base name, all names, damage types, damage factors, armor avoidance by ASG, base roundtime, and minimum roundtime.

{
  # Weapon stats for the runestave.
  #
  # @return [Hash] weapon stats including category, base name,
  #   all names, damage types, damage factors, armor avoidance,
  #   base roundtime, and minimum roundtime.
  :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 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.

{
  # Weapon statistics for the bastard sword.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the battle axe.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the claidmore.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the flail.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the flamberge.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the katana.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the maul.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the military pick.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the quarterstaff.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the two-handed sword.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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 statistics for the war mattock.
  #
  # @return [Hash] weapon stats including category, base name, damage types, and more.
  :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>

Retrieves all aliases for a specified weapon name.

Examples:

Get aliases for a weapon

aliases = Lich::Gemstone::Armaments::WeaponStats.aliases_for("sword")

Parameters:

  • name (String)

    the name of the weapon

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

    the category of the weapon (optional)

Returns:

  • (Array<String>)

    an array of aliases for the weapon



152
153
154
155
156
157
# File 'documented/gemstone/armaments/weapon_stats.rb', line 152

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 available.

Examples:

Get weapon categories

categories = Lich::Gemstone::Armaments::WeaponStats.categories

Returns:

  • (Array<Symbol>)

    an array of weapon category symbols



117
118
119
# File 'documented/gemstone/armaments/weapon_stats.rb', line 117

def self.categories
  @@weapon_stats.keys
end

.category_for(name) ⇒ String?

Retrieves the category for a specified weapon name.

Examples:

Get the category for a weapon

category = Lich::Gemstone::Armaments::WeaponStats.category_for("sword")

Parameters:

  • name (String)

    the name of the weapon

Returns:

  • (String, nil)

    the category of the weapon or nil if not found



297
298
299
300
301
302
# File 'documented/gemstone/armaments/weapon_stats.rb', line 297

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 statistics.

Examples:

Compare two weapons

comparison = Lich::Gemstone::Armaments::WeaponStats.compare("sword", "axe")

Parameters:

  • name1 (String)

    the name of the first weapon

  • name2 (String)

    the name of the second weapon

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

    the category of the first weapon (optional)

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

    the category of the second weapon (optional)

Returns:

  • (Hash, nil)

    a hash containing comparison data or nil if either weapon is not found



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'documented/gemstone/armaments/weapon_stats.rb', line 169

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 specified weapon.

Examples:

Get damage summary for a weapon

summary = Lich::Gemstone::Armaments::WeaponStats.damage_summary("sword")

Parameters:

  • name (String)

    the name of the weapon

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

    the category of the weapon (optional)

Returns:

  • (Hash, nil)

    a hash containing damage type information or nil if not found



129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'documented/gemstone/armaments/weapon_stats.rb', line 129

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 its name and optional category.

Examples:

Find a weapon by name

weapon = Lich::Gemstone::Armaments::WeaponStats.find("sword")

Parameters:

  • name (String)

    the name of the weapon to find

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

    the category of the weapon (optional)

Returns:

  • (Hash, nil)

    the weapon information or nil if not found



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

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 by its name.

Examples:

Check if a weapon is grippable

grippable = Lich::Gemstone::Armaments::WeaponStats.is_grippable?("sword")

Parameters:

  • name (String)

    the name of the weapon

Returns:

  • (Boolean)

    true if the weapon is grippable, false otherwise



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

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 the specified category or all weapons if no category is given.

Examples:

List all weapons

weapons = Lich::Gemstone::Armaments::WeaponStats.list

Parameters:

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

    the category of weapons to list (optional)

Returns:

  • (Array<Hash>)

    an array of weapon information hashes



99
100
101
102
103
104
105
106
107
108
109
# File 'documented/gemstone/armaments/weapon_stats.rb', line 99

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 unique list of all weapon names and aliases.

Examples:

Get all weapon names

all_names = Lich::Gemstone::Armaments::WeaponStats.names

Returns:

  • (Array<String>)

    an array of unique weapon names and aliases



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

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's stats.

Examples:

Get concise weapon information

info = Lich::Gemstone::Armaments::WeaponStats.pretty("sword")

Parameters:

  • name (String)

    the name of the weapon

Returns:

  • (String)

    a formatted string with concise weapon information



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
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
# File 'documented/gemstone/armaments/weapon_stats.rb', line 381

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's stats.

Examples:

Get detailed weapon information

details = Lich::Gemstone::Armaments::WeaponStats.pretty_long("sword")

Parameters:

  • name (String)

    the name of the weapon

Returns:

  • (String)

    a formatted string with detailed weapon information



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
359
360
361
362
363
364
365
366
367
368
369
370
371
372
# File 'documented/gemstone/armaments/weapon_stats.rb', line 311

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 specified filters.

Examples:

Search for weapons with specific damage type

results = Lich::Gemstone::Armaments::WeaponStats.search(damage_type: :slash)

Parameters:

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

    a hash of filters to apply to the search

Returns:

  • (Array<Hash>)

    an array of weapons matching the filters



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
239
240
241
242
243
244
245
246
247
# File 'documented/gemstone/armaments/weapon_stats.rb', line 197

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:

Check if a name is valid

valid = Lich::Gemstone::Armaments::WeaponStats.valid_name?("sword")

Parameters:

  • name (String)

    the name to validate

Returns:

  • (Boolean)

    true if the name is valid, false otherwise



437
438
439
440
441
442
# File 'documented/gemstone/armaments/weapon_stats.rb', line 437

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>

Retrieves all weapons in a specified category.

Examples:

Get weapons in the "blunt" category

blunt_weapons = Lich::Gemstone::Armaments::WeaponStats.weapons_in_category("blunt")

Parameters:

  • category (String)

    the category of weapons to retrieve

Returns:

  • (Array<Hash>)

    an array of weapons in the specified category



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

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

  @@weapon_stats[category].values
end