Open Source Adventures: Episode 49: BATTLETECH Full Damage Per Ton Weapon Ranking
Tags: gamedev, ruby
Published: 2022-04-30 18:35:20

It's time to complete the project, and get the full weapon ranking. All we need to do is add ammo weight. I'm assuming that you'll get enough ammo to last you 10 rounds of shooting, and not doing any rounding (even though you can't really get like 0.6 ton of ammo).

In this analysis I'm also assuming you want to get enough heat sinks to get rid of all the excess heat, under normal conditions. This is generally not the right way to build, as you won't be shooting all the time, so 100% heat siking is just a waste.

As a bonus I also reran this script assuming you have access to double heat sinks instead of single heat sinks. This could alternatively be taken to be a 50% heat sinking build, which would be a bit too low.

I'm sort of wondering about turning this into interactive visualization, where you can change your assumptions to get different rankings based on your choices, like how much ammo you want, enemy cover (20% does not actualyl mean 20% due to how game rounding works), any heat exchangers, how much you value crit bonus or stability damage etc. But for now I think I'll just stop here.

### Script

```ruby
#!/usr/bin/env ruby

require "json"
require "memoist"
require "pathname"
require "pry"

class AmmoBox
  extend Memoist
  attr_reader :data, :path

  def initialize(path)
    @path = path
    @data = JSON.parse(path.read)
  end

  memoize def id
    @data["AmmoID"].sub(/\AAmmunition_/, "")
  end

  def tonnage
    @data["Tonnage"]
  end

  def capacity
    @data["Capacity"]
  end
end

class Weapon
  extend Memoist
  attr_reader :game, :data, :path

  def initialize(game, path)
    @game = game
    @path = path
    @data = JSON.parse(path.read)
  end

  memoize def name
    bonuses = [bonus_a, bonus_b].compact
    if bonuses.empty?
      base_name
    else
      "#{base_name} (#{bonuses.join(", ")})"
    end
  end

  memoize def base_name
    [
      data["Description"]["Name"],
      data["Description"]["UIName"],
    ].compact.last.gsub(" +", "+")
  end

  memoize def bonus_a
    data["BonusValueA"] == "" ? nil : data["BonusValueA"].gsub(/[a-z]\K\./, "")
  end

  memoize def bonus_b
    data["BonusValueB"] == "" ? nil : data["BonusValueB"].gsub(/[a-z]\K\./, "")
  end

  def category
    @data["Category"]
  end

  def subtype
    @data["WeaponSubType"]
  end

  def tonnage
    @data["Tonnage"]
  end

  def damage
    shots * base_damage
  end

  def base_damage
    @data["Damage"]
  end

  def shots
    @data["ShotsWhenFired"]
  end

  def heat
    @data["HeatGenerated"]
  end

  def ammo_per_shot
    @data["ShotsWhenFired"] * data["ProjectilesPerShot"]
  end

  def heat_tonnage
    heat / 3.0
  end

  # 10 rounds of shootnig at target
  def ammo_tonnage
    @game.ammo_weights.fetch(ammo_category) * ammo_per_shot * 10
  end

  def total_tonnage
    tonnage + heat_tonnage + ammo_tonnage
  end

  def ammo_category
    @data["ammoCategoryID"] || @data["AmmoCategory"]
  end

  def purchasable?
    @data["Description"]["Purchasable"]
  end

  def weapon_effect
    @data["WeaponEffectID"]
  end

  def ignore?
    [
      category == "Melee",
      name == "AI Laser",
      subtype == "TAG",
      subtype == "Narc",
      subtype =~ /\ACOIL/,
      weapon_effect == "WeaponEffect-Artillery_MechMortar",
      weapon_effect == "WeaponEffect-Artillery_Thumper",
    ].any?
  end

  def score
    [damage.to_f / total_tonnage, damage, name]
  end
end

class BattleTechGame
  extend Memoist

  def initialize(game_root, *dlc_roots)
    @game_root = Pathname(game_root)
    @dlc_roots = dlc_roots.map{|path| Pathname(path)}
  end

  memoize def data_root
    @game_root + "BattleTech_Data/StreamingAssets/data"
  end

  def roots
    [data_root, *@dlc_roots]
  end

  memoize def weapon_files
    roots
      .flat_map{|root| root.glob("weapon/*.json")}
      .select{|n| n.basename.to_s != "WeaponTemplate.json"}
  end

  memoize def weapons
    weapon_files.map{|path| Weapon.new(self, path)}
  end

  memoize def ammobox_files
    roots
      .flat_map{|root| root.glob("ammunitionBox/*.json")}
      .select{|n| n.basename.to_s != "AmmoBoxTemplate.json"}
  end

  memoize def ammoboxes
    ammobox_files.map{|path| AmmoBox.new(path)}
  end

  memoize def ammo_weights
    # MG box occurs twice, but with same ratio
    ammoboxes.to_h{|a| [a.id, a.tonnage.to_f/a.capacity]}.merge("NotSet" => 0.0)
  end

  def inspect
    "BattechGame"
  end

  def print_weapons_report
    weapons
      .reject(&:ignore?)
      .sort_by(&:score)
      .reverse
      .each{|w|
        subtonage = [
          w.tonnage > 0 ? "#{w.tonnage}B" : nil,
          w.heat_tonnage > 0 ? "#{w.heat_tonnage.round(2)}H" : nil,
          w.ammo_tonnage > 0 ? "#{w.ammo_tonnage.round(2)}A" : nil,
        ].compact.join(" + ")
        puts "* #{w.name}: #{w.damage} / #{w.total_tonnage.round(2)} [#{subtonage}]"
      }
  end
end

game = BattleTechGame.new(*ARGV)
game.print_weapons_report
```

### Ranking - single heat sinks

* MG++ (+ 5 Shots, - 0.5 Ton): 30 / 0.5 [0.5A]
* MG++ (+ 50% Crit, - 0.5 Ton): 15 / 0.25 [0.25A]
* MG+ (+ 5 Shots): 30 / 1.0 [0.5B + 0.5A]
* MG+ (+ 25% Crit): 15 / 0.75 [0.5B + 0.25A]
* MG: 15 / 0.75 [0.5B + 0.25A]
* S Laser+++ (+ 10 Dmg, + 50% Crit): 30 / 2.5 [0.5B + 2.0H]
* S Laser++ (+ 10 Dmg): 30 / 2.5 [0.5B + 2.0H]
* LB 2-X++ (+ 2 Dmg, + 50% Crit): 72 / 6.07 [5B + 0.67H + 0.4A]
* ER S Laser++ (+ 10 Dmg): 40 / 3.83 [0.5B + 3.33H]
* S Pulse++ (+ 10 Dmg, - 2 Heat): 45 / 4.33 [1B + 3.33H]
* S Laser++ (+ 5 Dmg, + 25% Crit): 25 / 2.5 [0.5B + 2.0H]
* S Laser+ (+ 5 Dmg): 25 / 2.5 [0.5B + 2.0H]
* LB 2-X+ (+ 1 Dmg, + 25% Crit): 60 / 6.07 [5B + 0.67H + 0.4A]
* SRM6+++ (+ 4 Dmg, + 2 StbDmg): 72 / 7.6 [3B + 4.0H + 0.6A]
* SRM6++ (+ 4 Dmg): 72 / 7.6 [3B + 4.0H + 0.6A]
* SRM4+++ (+ 4 Dmg, + 2 StbDmg): 48 / 5.07 [2B + 2.67H + 0.4A]
* SRM4++ (+ 4 Dmg): 48 / 5.07 [2B + 2.67H + 0.4A]
* SRM2+++ (+ 4 Dmg, + 2 StbDmg): 24 / 2.53 [1B + 1.33H + 0.2A]
* SRM2++ (+ 4 Dmg): 24 / 2.53 [1B + 1.33H + 0.2A]
* ER S Laser+ (+ 5 Dmg): 35 / 3.83 [0.5B + 3.33H]
* S Pulse+ (+ 5 Dmg, - 1 Heat): 40 / 4.67 [1B + 3.67H]
* S Laser++ (+ 50% Crit): 20 / 2.5 [0.5B + 2.0H]
* S Laser++ (+ 3 Acc): 20 / 2.5 [0.5B + 2.0H]
* S Laser+ (+ 25% Crit): 20 / 2.5 [0.5B + 2.0H]
* S Laser+ (+ 1 Acc): 20 / 2.5 [0.5B + 2.0H]
* S Laser: 20 / 2.5 [0.5B + 2.0H]
* LB 2-X: 48 / 6.07 [5B + 0.67H + 0.4A]
* SRM6++ (+ 2 Dmg, + 1 StbDmg): 60 / 7.6 [3B + 4.0H + 0.6A]
* SRM6+ (+ 2 Dmg): 60 / 7.6 [3B + 4.0H + 0.6A]
* SRM4++ (+ 2 Dmg, + 1 StbDmg): 40 / 5.07 [2B + 2.67H + 0.4A]
* SRM4+ (+ 2 Dmg): 40 / 5.07 [2B + 2.67H + 0.4A]
* SRM2++ (+ 2 Dmg, + 1 StbDmg): 20 / 2.53 [1B + 1.33H + 0.2A]
* SRM2+ (+ 2 Dmg): 20 / 2.53 [1B + 1.33H + 0.2A]
* ER S Laser: 30 / 3.83 [0.5B + 3.33H]
* UAC/20++ (+ 20 Dmg, - 3 Tons): 240 / 32.0 [12B + 16.0H + 4.0A]
* Snub PPC++ (+ 10 Dmg): 125 / 17.67 [6B + 11.67H]
* S Pulse: 35 / 5.0 [1B + 4.0H]
* M Laser++ (+ 10 Dmg): 35 / 5.0 [1B + 4.0H]
* LRM15++ (+ 2 Dmg): 90 / 12.92 [7B + 4.67H + 1.25A]
* UAC/2++ (+ 10 Dmg, - 2 Tons): 70 / 10.07 [5B + 2.67H + 2.4A]
* M Pulse++ (- 4 Heat, + 1 Acc): 50 / 7.33 [2B + 5.33H]
* LRM20++ (+ 2 Dmg): 120 / 17.67 [10B + 6.0H + 1.67A]
* LRM5++ (+ 2 Dmg): 30 / 4.42 [2B + 2.0H + 0.42A]
* LB 10-X++ (+ 2 Dmg, - 1 Ton): 96 / 14.58 [10B + 3.33H + 1.25A]
* UAC/20+ (+ 10 Dmg, - 1.5 Tons): 220 / 33.5 [13.5B + 16.0H + 4.0A]
* LRM10++ (+ 2 Dmg): 60 / 9.17 [5B + 3.33H + 0.83A]
* SRM6++ (+ 50% Crit): 48 / 7.6 [3B + 4.0H + 0.6A]
* SRM6+ (+ 25% Crit): 48 / 7.6 [3B + 4.0H + 0.6A]
* SRM6: 48 / 7.6 [3B + 4.0H + 0.6A]
* SRM4++ (+ 50% Crit): 32 / 5.07 [2B + 2.67H + 0.4A]
* SRM4+ (+ 25% Crit): 32 / 5.07 [2B + 2.67H + 0.4A]
* SRM4: 32 / 5.07 [2B + 2.67H + 0.4A]
* SRM2++ (+ 50% Crit): 16 / 2.53 [1B + 1.33H + 0.2A]
* SRM2+ (+ 25% Crit): 16 / 2.53 [1B + 1.33H + 0.2A]
* SRM2: 16 / 2.53 [1B + 1.33H + 0.2A]
* LB 5-X++ (+ 4 StbDmg, - 1 Ton): 60 / 9.67 [7B + 2.0H + 0.67A]
* UAC/5++ (- 2 Recoil, - 2 Tons): 90 / 15.0 [7B + 5.33H + 2.67A]
* M Laser+ (+ 5 Dmg): 30 / 5.0 [1B + 4.0H]
* LB 5-X+ (+ 2 StbDmg, - 0.5 Ton): 60 / 10.17 [7.5B + 2.0H + 0.67A]
* ER M Laser++ (+ 10 Dmg): 45 / 7.67 [1B + 6.67H]
* UAC/10++ (+ 10 StbDmg, - 3 Tons): 120 / 20.5 [10B + 8.0H + 2.5A]
* LB 10-X+ (+ 1 Dmg, - 0.5 Ton): 88 / 15.08 [10.5B + 3.33H + 1.25A]
* LB 20-X++ (+ 4 StbDmg, - 2 Tons): 120 / 20.67 [12B + 6.67H + 2.0A]
* LRM15+ (+ 1 Dmg): 75 / 12.92 [7B + 4.67H + 1.25A]
* UAC/20: 200 / 35.0 [15B + 16.0H + 4.0A]
* Snub PPC+ (+ 5 Dmg): 100 / 17.67 [6B + 11.67H]
* LRM20+ (+ 1 Dmg): 100 / 17.67 [10B + 6.0H + 1.67A]
* LRM5+ (+ 1 Dmg): 25 / 4.42 [2B + 2.0H + 0.42A]
* UAC/5+ (- 1 Recoil, - 1 Ton): 90 / 16.0 [8B + 5.33H + 2.67A]
* LB 5-X: 60 / 10.67 [8B + 2.0H + 0.67A]
* M Pulse+ (- 2 Heat): 45 / 8.0 [2B + 6.0H]
* LB 20-X+ (+ 2 StbDmg, - 1 Ton): 120 / 21.67 [13B + 6.67H + 2.0A]
* UAC/10+ (+ 5 StbDmg, - 1.5 Tons): 120 / 22.0 [11.5B + 8.0H + 2.5A]
* LRM10+ (+ 1 Dmg): 50 / 9.17 [5B + 3.33H + 0.83A]
* UAC/2+ (+ 5 Dmg, - 1 Ton): 60 / 11.07 [6B + 2.67H + 2.4A]
* LB 20-X: 120 / 22.67 [14B + 6.67H + 2.0A]
* UAC/5: 90 / 17.0 [9B + 5.33H + 2.67A]
* Snub PPC++ (- 10 Heat): 75 / 14.33 [6B + 8.33H]
* ER M Laser+ (+ 5 Dmg): 40 / 7.67 [1B + 6.67H]
* LB 10-X: 80 / 15.58 [11B + 3.33H + 1.25A]
* UAC/10: 120 / 23.5 [13B + 8.0H + 2.5A]
* M Laser+++ (+ 3 Acc, + 50% Crit): 25 / 5.0 [1B + 4.0H]
* M Laser++ (+3 Acc): 25 / 5.0 [1B + 4.0H]
* M Laser++ (+ 50% Crit): 25 / 5.0 [1B + 4.0H]
* M Laser++ (+ 1 Acc, + 25% Crit): 25 / 5.0 [1B + 4.0H]
* M Laser+ (+1 Acc): 25 / 5.0 [1B + 4.0H]
* M Laser+ (+ 25% Crit): 25 / 5.0 [1B + 4.0H]
* M Laser: 25 / 5.0 [1B + 4.0H]
* Gauss Rifle++ (- 2 Tons, - 1 Slot): 75 / 15.92 [13B + 1.67H + 1.25A]
* Gauss Rifle+ (- 2 Tons): 75 / 15.92 [13B + 1.67H + 1.25A]
* Snub PPC+ (- 5 Heat): 75 / 16.0 [6B + 10.0H]
* LRM15+++ (+ 50% Crit, + 2 StbDmg): 60 / 12.92 [7B + 4.67H + 1.25A]
* LRM15++ (+ 50% Crit): 60 / 12.92 [7B + 4.67H + 1.25A]
* LRM15++ (+ 25% Crit, + 1 StbDmg): 60 / 12.92 [7B + 4.67H + 1.25A]
* LRM15++ (+ 2 StbDmg): 60 / 12.92 [7B + 4.67H + 1.25A]
* LRM15+ (+ 25% Crit): 60 / 12.92 [7B + 4.67H + 1.25A]
* LRM15+ (+ 1 StbDmg): 60 / 12.92 [7B + 4.67H + 1.25A]
* LRM15: 60 / 12.92 [7B + 4.67H + 1.25A]
* M Pulse: 40 / 8.67 [2B + 6.67H]
* ER M Laser: 35 / 7.67 [1B + 6.67H]
* L Laser+++ (+ 10 Dmg, + 3 Acc): 50 / 11.0 [5B + 6.0H]
* L Laser++ (+ 10 Dmg): 50 / 11.0 [5B + 6.0H]
* LRM20+++ (+ 50% Crit, + 2 StbDmg): 80 / 17.67 [10B + 6.0H + 1.67A]
* LRM20++ (+ 50% Crit): 80 / 17.67 [10B + 6.0H + 1.67A]
* LRM20++ (+ 25% Crit, + 1 StbDmg): 80 / 17.67 [10B + 6.0H + 1.67A]
* LRM20++ (+ 2 StbDmg): 80 / 17.67 [10B + 6.0H + 1.67A]
* LRM20+ (+ 25% Crit): 80 / 17.67 [10B + 6.0H + 1.67A]
* LRM20+ (+ 1 StbDmg): 80 / 17.67 [10B + 6.0H + 1.67A]
* LRM20: 80 / 17.67 [10B + 6.0H + 1.67A]
* LRM5+++ (+ 50% Crit, + 2 StbDmg): 20 / 4.42 [2B + 2.0H + 0.42A]
* LRM5++ (+ 50% Crit): 20 / 4.42 [2B + 2.0H + 0.42A]
* LRM5++ (+ 25% Crit, + 1 StbDmg): 20 / 4.42 [2B + 2.0H + 0.42A]
* LRM5++ (+ 2 StbDmg): 20 / 4.42 [2B + 2.0H + 0.42A]
* LRM5+ (+ 25% Crit): 20 / 4.42 [2B + 2.0H + 0.42A]
* LRM5+ (+ 1 StbDmg): 20 / 4.42 [2B + 2.0H + 0.42A]
* LRM5: 20 / 4.42 [2B + 2.0H + 0.42A]
* LRM10+++ (+ 50% Crit, + 2 StbDmg): 40 / 9.17 [5B + 3.33H + 0.83A]
* LRM10++ (+ 50% Crit): 40 / 9.17 [5B + 3.33H + 0.83A]
* LRM10++ (+ 25% Crit, + 1 StbDmg): 40 / 9.17 [5B + 3.33H + 0.83A]
* LRM10++ (+ 2 StbDmg): 40 / 9.17 [5B + 3.33H + 0.83A]
* LRM10+ (+ 25% Crit): 40 / 9.17 [5B + 3.33H + 0.83A]
* LRM10+ (+ 1 StbDmg): 40 / 9.17 [5B + 3.33H + 0.83A]
* LRM10: 40 / 9.17 [5B + 3.33H + 0.83A]
* AC/20+++ (+ 20 Dmg, + 20 StbDmg): 120 / 28.0 [14B + 8.0H + 6.0A]
* AC/20++ (+ 20 Dmg): 120 / 28.0 [14B + 8.0H + 6.0A]
* Snub PPC++ (+ 10 StbDmg): 75 / 17.67 [6B + 11.67H]
* Snub PPC+ (+ 5 StbDmg): 75 / 17.67 [6B + 11.67H]
* Snub PPC: 75 / 17.67 [6B + 11.67H]
* AC/20++ (+ 10 Dmg, + 10 StbDmg): 110 / 26.0 [14B + 8.0H + 4.0A]
* AC/20+ (+ 10 Dmg): 110 / 26.0 [14B + 8.0H + 4.0A]
* Gauss Rifle: 75 / 17.92 [15B + 1.67H + 1.25A]
* AC/20+++ : 100 / 24.0 [14B + 8.0H + 2.0A]
* AC/20++ (+ 50% Crit): 100 / 24.0 [14B + 8.0H + 2.0A]
* AC/20++ (+ 4 Acc): 100 / 24.0 [14B + 8.0H + 2.0A]
* AC/20+ (+ 25% Crit): 100 / 24.0 [14B + 8.0H + 2.0A]
* AC/20+ (+ 2 Acc): 100 / 24.0 [14B + 8.0H + 2.0A]
* AC/20: 100 / 24.0 [14B + 8.0H + 2.0A]
* UAC/2: 50 / 12.07 [7B + 2.67H + 2.4A]
* AC/5++ (+ 10 Dmg): 55 / 13.33 [8B + 2.67H + 2.67A]
* L Laser++ (+ 5 Dmg, + 1 Acc): 45 / 11.0 [5B + 6.0H]
* L Laser+ (+ 5 Dmg): 45 / 11.0 [5B + 6.0H]
* L Pulse++ (+ 10 Dmg, - 1 Ton): 65 / 16.0 [6B + 10.0H]
* ER L Laser++ (+ 5 Dmg, - 1 Ton): 50 / 12.33 [4B + 8.33H]
* AC/5+ (+ 5 Dmg): 50 / 12.67 [8B + 2.67H + 2.0A]
* AC/20+ (+ 10 StbDmg): 100 / 26.0 [14B + 8.0H + 4.0A]
* AC/2++ (+ 10 Dmg): 35 / 9.33 [6B + 1.33H + 2.0A]
* L Pulse+ (+ 5 Dmg, - 1 Ton): 60 / 16.0 [6B + 10.0H]
* ER L Laser+ (+ 5 Dmg): 50 / 13.33 [5B + 8.33H]
* AC/5++ (+ 50% Crit): 45 / 12.0 [8B + 2.67H + 1.33A]
* AC/5++ (+ 4 Acc): 45 / 12.0 [8B + 2.67H + 1.33A]
* AC/5+ (+ 25% Crit): 45 / 12.0 [8B + 2.67H + 1.33A]
* AC/5+ (+ 2 Acc): 45 / 12.0 [8B + 2.67H + 1.33A]
* AC/5: 45 / 12.0 [8B + 2.67H + 1.33A]
* L Laser++ (+ 50% Crit): 40 / 11.0 [5B + 6.0H]
* L Laser++ (+ 3 Acc): 40 / 11.0 [5B + 6.0H]
* L Laser+ (+ 25% Crit): 40 / 11.0 [5B + 6.0H]
* L Laser+ (+ 1 Acc): 40 / 11.0 [5B + 6.0H]
* L Laser: 40 / 11.0 [5B + 6.0H]
* AC/20++ (+ 20 StbDmg): 100 / 28.0 [14B + 8.0H + 6.0A]
* AC/10++ (+ 10 Dmg): 70 / 19.75 [12B + 4.0H + 3.75A]
* AC/10+ (+ 5 Dmg): 65 / 18.5 [12B + 4.0H + 2.5A]
* AC/10++ (+ 50% Crit): 60 / 17.25 [12B + 4.0H + 1.25A]
* AC/10++ (+ 4 Acc): 60 / 17.25 [12B + 4.0H + 1.25A]
* AC/10+ (+ 25% Crit): 60 / 17.25 [12B + 4.0H + 1.25A]
* AC/10+ (+ 2 Acc): 60 / 17.25 [12B + 4.0H + 1.25A]
* AC/10: 60 / 17.25 [12B + 4.0H + 1.25A]
* AC/5++ (+ 2 Acc, + 10 StbDmg): 45 / 13.33 [8B + 2.67H + 2.67A]
* AC/5+ (+ 10 StbDmg): 45 / 13.33 [8B + 2.67H + 2.67A]
* ER L Laser: 45 / 13.33 [5B + 8.33H]
* AC/2+ (+ 5 Dmg): 30 / 8.93 [6B + 1.33H + 1.6A]
* ER PPC++ (+ 10 Dmg, - 1 Ton): 70 / 21.0 [6B + 15.0H]
* AC/10++ (+ 25% Crit, + 10 StbDmg): 60 / 18.5 [12B + 4.0H + 2.5A]
* AC/10+ (+ 10 StbDmg): 60 / 18.5 [12B + 4.0H + 2.5A]
* L Pulse: 55 / 17.0 [7B + 10.0H]
* PPC++ (+ 10 Dmg): 60 / 18.67 [7B + 11.67H]
* ER PPC+ (+ 5 Dmg, - 1 Ton): 65 / 21.0 [6B + 15.0H]
* AC/5+++ (+ 4 Acc, + 20 StbDmg): 45 / 14.67 [8B + 2.67H + 4.0A]
* AC/5++ (+ 20 StbDmg): 45 / 14.67 [8B + 2.67H + 4.0A]
* AC/10+++ (+ 50% Crit, + 20 StbDmg): 60 / 19.75 [12B + 4.0H + 3.75A]
* AC/10++ (+ 20 StbDmg): 60 / 19.75 [12B + 4.0H + 3.75A]
* PPC+ (+ 5 Dmg): 55 / 18.67 [7B + 11.67H]
* AC/2+++ (+ 4 Acc, + 50% Crit): 25 / 8.53 [6B + 1.33H + 1.2A]
* AC/2++ (+ 50% Crit): 25 / 8.53 [6B + 1.33H + 1.2A]
* AC/2++ (+ 4 Acc): 25 / 8.53 [6B + 1.33H + 1.2A]
* AC/2++ (+ 2 Acc, + 25% Crit): 25 / 8.53 [6B + 1.33H + 1.2A]
* AC/2+ (+ 25% Crit): 25 / 8.53 [6B + 1.33H + 1.2A]
* AC/2+ (+ 2 Acc): 25 / 8.53 [6B + 1.33H + 1.2A]
* AC/2: 25 / 8.53 [6B + 1.33H + 1.2A]
* ER PPC: 60 / 22.0 [7B + 15.0H]
* PPC++ (+ 4 Acc): 50 / 18.67 [7B + 11.67H]
* PPC++ (+ 30 StbDmg): 50 / 18.67 [7B + 11.67H]
* PPC+ (+ 2 Acc): 50 / 18.67 [7B + 11.67H]
* PPC+ (+ 15 StbDmg): 50 / 18.67 [7B + 11.67H]
* PPC: 50 / 18.67 [7B + 11.67H]
* AC/2+ (+ 10 StbDmg): 25 / 9.33 [6B + 1.33H + 2.0A]
* AC/2++ (+ 20 StbDmg): 25 / 10.13 [6B + 1.33H + 2.8A]
* Flamer+ (* 4 Ammo, + 5 Dmg): 10 / 11.0 [1B + 10.0A]
* Infernos++ (* 8 Volleys, + 10 Dmg (H)): 4 / 5.25 [3B + 1.0H + 1.25A]
* Infernos+ (* 8 Volleys, + 5 Dmg (H)): 4 / 5.25 [3B + 1.0H + 1.25A]
* Infernos (* 8 Volleys): 4 / 5.25 [3B + 1.0H + 1.25A]
* Flamer+++ (* 40 Ammo): 5 / 11.0 [1B + 10.0A]
* Flamer++ (* 4 Ammo, + 5 Dmg (H)): 5 / 11.0 [1B + 10.0A]
* Flamer (* 4 Ammo): 5 / 11.0 [1B + 10.0A]

### Ranking - double heat sinks (or 50% heat sinking)

* MG++ (+ 5 Shots, - 0.5 Ton): 30 / 0.5 [0.5A]
* MG++ (+ 50% Crit, - 0.5 Ton): 15 / 0.25 [0.25A]
* MG+ (+ 5 Shots): 30 / 1.0 [0.5B + 0.5A]
* S Laser+++ (+ 10 Dmg, + 50% Crit): 30 / 1.5 [0.5B + 1.0H]
* S Laser++ (+ 10 Dmg): 30 / 1.5 [0.5B + 1.0H]
* MG+ (+ 25% Crit): 15 / 0.75 [0.5B + 0.25A]
* MG: 15 / 0.75 [0.5B + 0.25A]
* ER S Laser++ (+ 10 Dmg): 40 / 2.17 [0.5B + 1.67H]
* S Pulse++ (+ 10 Dmg, - 2 Heat): 45 / 2.67 [1B + 1.67H]
* S Laser++ (+ 5 Dmg, + 25% Crit): 25 / 1.5 [0.5B + 1.0H]
* S Laser+ (+ 5 Dmg): 25 / 1.5 [0.5B + 1.0H]
* ER S Laser+ (+ 5 Dmg): 35 / 2.17 [0.5B + 1.67H]
* S Pulse+ (+ 5 Dmg, - 1 Heat): 40 / 2.83 [1B + 1.83H]
* ER S Laser: 30 / 2.17 [0.5B + 1.67H]
* S Laser++ (+ 50% Crit): 20 / 1.5 [0.5B + 1.0H]
* S Laser++ (+ 3 Acc): 20 / 1.5 [0.5B + 1.0H]
* S Laser+ (+ 25% Crit): 20 / 1.5 [0.5B + 1.0H]
* S Laser+ (+ 1 Acc): 20 / 1.5 [0.5B + 1.0H]
* S Laser: 20 / 1.5 [0.5B + 1.0H]
* SRM6+++ (+ 4 Dmg, + 2 StbDmg): 72 / 5.6 [3B + 2.0H + 0.6A]
* SRM6++ (+ 4 Dmg): 72 / 5.6 [3B + 2.0H + 0.6A]
* SRM4+++ (+ 4 Dmg, + 2 StbDmg): 48 / 3.73 [2B + 1.33H + 0.4A]
* SRM4++ (+ 4 Dmg): 48 / 3.73 [2B + 1.33H + 0.4A]
* SRM2+++ (+ 4 Dmg, + 2 StbDmg): 24 / 1.87 [1B + 0.67H + 0.2A]
* SRM2++ (+ 4 Dmg): 24 / 1.87 [1B + 0.67H + 0.2A]
* LB 2-X++ (+ 2 Dmg, + 50% Crit): 72 / 5.73 [5B + 0.33H + 0.4A]
* S Pulse: 35 / 3.0 [1B + 2.0H]
* M Laser++ (+ 10 Dmg): 35 / 3.0 [1B + 2.0H]
* SRM6++ (+ 2 Dmg, + 1 StbDmg): 60 / 5.6 [3B + 2.0H + 0.6A]
* SRM6+ (+ 2 Dmg): 60 / 5.6 [3B + 2.0H + 0.6A]
* M Pulse++ (- 4 Heat, + 1 Acc): 50 / 4.67 [2B + 2.67H]
* SRM4++ (+ 2 Dmg, + 1 StbDmg): 40 / 3.73 [2B + 1.33H + 0.4A]
* SRM4+ (+ 2 Dmg): 40 / 3.73 [2B + 1.33H + 0.4A]
* SRM2++ (+ 2 Dmg, + 1 StbDmg): 20 / 1.87 [1B + 0.67H + 0.2A]
* SRM2+ (+ 2 Dmg): 20 / 1.87 [1B + 0.67H + 0.2A]
* Snub PPC++ (+ 10 Dmg): 125 / 11.83 [6B + 5.83H]
* LB 2-X+ (+ 1 Dmg, + 25% Crit): 60 / 5.73 [5B + 0.33H + 0.4A]
* ER M Laser++ (+ 10 Dmg): 45 / 4.33 [1B + 3.33H]
* UAC/20++ (+ 20 Dmg, - 3 Tons): 240 / 24.0 [12B + 8.0H + 4.0A]
* M Laser+ (+ 5 Dmg): 30 / 3.0 [1B + 2.0H]
* ER M Laser+ (+ 5 Dmg): 40 / 4.33 [1B + 3.33H]
* M Pulse+ (- 2 Heat): 45 / 5.0 [2B + 3.0H]
* LRM5++ (+ 2 Dmg): 30 / 3.42 [2B + 1.0H + 0.42A]
* UAC/20+ (+ 10 Dmg, - 1.5 Tons): 220 / 25.5 [13.5B + 8.0H + 4.0A]
* SRM4++ (+ 50% Crit): 32 / 3.73 [2B + 1.33H + 0.4A]
* SRM4+ (+ 25% Crit): 32 / 3.73 [2B + 1.33H + 0.4A]
* SRM4: 32 / 3.73 [2B + 1.33H + 0.4A]
* SRM2++ (+ 50% Crit): 16 / 1.87 [1B + 0.67H + 0.2A]
* SRM2+ (+ 25% Crit): 16 / 1.87 [1B + 0.67H + 0.2A]
* SRM2: 16 / 1.87 [1B + 0.67H + 0.2A]
* SRM6++ (+ 50% Crit): 48 / 5.6 [3B + 2.0H + 0.6A]
* SRM6+ (+ 25% Crit): 48 / 5.6 [3B + 2.0H + 0.6A]
* SRM6: 48 / 5.6 [3B + 2.0H + 0.6A]
* LRM15++ (+ 2 Dmg): 90 / 10.58 [7B + 2.33H + 1.25A]
* Snub PPC+ (+ 5 Dmg): 100 / 11.83 [6B + 5.83H]
* LB 2-X: 48 / 5.73 [5B + 0.33H + 0.4A]
* M Laser+++ (+ 3 Acc, + 50% Crit): 25 / 3.0 [1B + 2.0H]
* M Laser++ (+3 Acc): 25 / 3.0 [1B + 2.0H]
* M Laser++ (+ 50% Crit): 25 / 3.0 [1B + 2.0H]
* M Laser++ (+ 1 Acc, + 25% Crit): 25 / 3.0 [1B + 2.0H]
* M Laser+ (+1 Acc): 25 / 3.0 [1B + 2.0H]
* M Laser+ (+ 25% Crit): 25 / 3.0 [1B + 2.0H]
* M Laser: 25 / 3.0 [1B + 2.0H]
* LRM20++ (+ 2 Dmg): 120 / 14.67 [10B + 3.0H + 1.67A]
* ER M Laser: 35 / 4.33 [1B + 3.33H]
* UAC/2++ (+ 10 Dmg, - 2 Tons): 70 / 8.73 [5B + 1.33H + 2.4A]
* LRM10++ (+ 2 Dmg): 60 / 7.5 [5B + 1.67H + 0.83A]
* M Pulse: 40 / 5.33 [2B + 3.33H]
* LB 10-X++ (+ 2 Dmg, - 1 Ton): 96 / 12.92 [10B + 1.67H + 1.25A]
* UAC/20: 200 / 27.0 [15B + 8.0H + 4.0A]
* Snub PPC++ (- 10 Heat): 75 / 10.17 [6B + 4.17H]
* LRM5+ (+ 1 Dmg): 25 / 3.42 [2B + 1.0H + 0.42A]
* UAC/5++ (- 2 Recoil, - 2 Tons): 90 / 12.33 [7B + 2.67H + 2.67A]
* UAC/10++ (+ 10 StbDmg, - 3 Tons): 120 / 16.5 [10B + 4.0H + 2.5A]
* LRM15+ (+ 1 Dmg): 75 / 10.58 [7B + 2.33H + 1.25A]
* LB 5-X++ (+ 4 StbDmg, - 1 Ton): 60 / 8.67 [7B + 1.0H + 0.67A]
* LB 20-X++ (+ 4 StbDmg, - 2 Tons): 120 / 17.33 [12B + 3.33H + 2.0A]
* LRM20+ (+ 1 Dmg): 100 / 14.67 [10B + 3.0H + 1.67A]
* Snub PPC+ (- 5 Heat): 75 / 11.0 [6B + 5.0H]
* UAC/5+ (- 1 Recoil, - 1 Ton): 90 / 13.33 [8B + 2.67H + 2.67A]
* UAC/10+ (+ 5 StbDmg, - 1.5 Tons): 120 / 18.0 [11.5B + 4.0H + 2.5A]
* LRM10+ (+ 1 Dmg): 50 / 7.5 [5B + 1.67H + 0.83A]
* LB 10-X+ (+ 1 Dmg, - 0.5 Ton): 88 / 13.42 [10.5B + 1.67H + 1.25A]
* LB 20-X+ (+ 2 StbDmg, - 1 Ton): 120 / 18.33 [13B + 3.33H + 2.0A]
* LB 5-X+ (+ 2 StbDmg, - 0.5 Ton): 60 / 9.17 [7.5B + 1.0H + 0.67A]
* Snub PPC++ (+ 10 StbDmg): 75 / 11.83 [6B + 5.83H]
* Snub PPC+ (+ 5 StbDmg): 75 / 11.83 [6B + 5.83H]
* Snub PPC: 75 / 11.83 [6B + 5.83H]
* UAC/5: 90 / 14.33 [9B + 2.67H + 2.67A]
* L Laser+++ (+ 10 Dmg, + 3 Acc): 50 / 8.0 [5B + 3.0H]
* L Laser++ (+ 10 Dmg): 50 / 8.0 [5B + 3.0H]
* LB 20-X: 120 / 19.33 [14B + 3.33H + 2.0A]
* LB 5-X: 60 / 9.67 [8B + 1.0H + 0.67A]
* UAC/2+ (+ 5 Dmg, - 1 Ton): 60 / 9.73 [6B + 1.33H + 2.4A]
* UAC/10: 120 / 19.5 [13B + 4.0H + 2.5A]
* ER L Laser++ (+ 5 Dmg, - 1 Ton): 50 / 8.17 [4B + 4.17H]
* L Pulse++ (+ 10 Dmg, - 1 Ton): 65 / 11.0 [6B + 5.0H]
* LRM5+++ (+ 50% Crit, + 2 StbDmg): 20 / 3.42 [2B + 1.0H + 0.42A]
* LRM5++ (+ 50% Crit): 20 / 3.42 [2B + 1.0H + 0.42A]
* LRM5++ (+ 25% Crit, + 1 StbDmg): 20 / 3.42 [2B + 1.0H + 0.42A]
* LRM5++ (+ 2 StbDmg): 20 / 3.42 [2B + 1.0H + 0.42A]
* LRM5+ (+ 25% Crit): 20 / 3.42 [2B + 1.0H + 0.42A]
* LRM5+ (+ 1 StbDmg): 20 / 3.42 [2B + 1.0H + 0.42A]
* LRM5: 20 / 3.42 [2B + 1.0H + 0.42A]
* LB 10-X: 80 / 13.92 [11B + 1.67H + 1.25A]
* LRM15+++ (+ 50% Crit, + 2 StbDmg): 60 / 10.58 [7B + 2.33H + 1.25A]
* LRM15++ (+ 50% Crit): 60 / 10.58 [7B + 2.33H + 1.25A]
* LRM15++ (+ 25% Crit, + 1 StbDmg): 60 / 10.58 [7B + 2.33H + 1.25A]
* LRM15++ (+ 2 StbDmg): 60 / 10.58 [7B + 2.33H + 1.25A]
* LRM15+ (+ 25% Crit): 60 / 10.58 [7B + 2.33H + 1.25A]
* LRM15+ (+ 1 StbDmg): 60 / 10.58 [7B + 2.33H + 1.25A]
* LRM15: 60 / 10.58 [7B + 2.33H + 1.25A]
* L Laser++ (+ 5 Dmg, + 1 Acc): 45 / 8.0 [5B + 3.0H]
* L Laser+ (+ 5 Dmg): 45 / 8.0 [5B + 3.0H]
* LRM20+++ (+ 50% Crit, + 2 StbDmg): 80 / 14.67 [10B + 3.0H + 1.67A]
* LRM20++ (+ 50% Crit): 80 / 14.67 [10B + 3.0H + 1.67A]
* LRM20++ (+ 25% Crit, + 1 StbDmg): 80 / 14.67 [10B + 3.0H + 1.67A]
* LRM20++ (+ 2 StbDmg): 80 / 14.67 [10B + 3.0H + 1.67A]
* LRM20+ (+ 25% Crit): 80 / 14.67 [10B + 3.0H + 1.67A]
* LRM20+ (+ 1 StbDmg): 80 / 14.67 [10B + 3.0H + 1.67A]
* LRM20: 80 / 14.67 [10B + 3.0H + 1.67A]
* L Pulse+ (+ 5 Dmg, - 1 Ton): 60 / 11.0 [6B + 5.0H]
* ER L Laser+ (+ 5 Dmg): 50 / 9.17 [5B + 4.17H]
* LRM10+++ (+ 50% Crit, + 2 StbDmg): 40 / 7.5 [5B + 1.67H + 0.83A]
* LRM10++ (+ 50% Crit): 40 / 7.5 [5B + 1.67H + 0.83A]
* LRM10++ (+ 25% Crit, + 1 StbDmg): 40 / 7.5 [5B + 1.67H + 0.83A]
* LRM10++ (+ 2 StbDmg): 40 / 7.5 [5B + 1.67H + 0.83A]
* LRM10+ (+ 25% Crit): 40 / 7.5 [5B + 1.67H + 0.83A]
* LRM10+ (+ 1 StbDmg): 40 / 7.5 [5B + 1.67H + 0.83A]
* LRM10: 40 / 7.5 [5B + 1.67H + 0.83A]
* ER PPC++ (+ 10 Dmg, - 1 Ton): 70 / 13.5 [6B + 7.5H]
* AC/20+++ (+ 20 Dmg, + 20 StbDmg): 120 / 24.0 [14B + 4.0H + 6.0A]
* AC/20++ (+ 20 Dmg): 120 / 24.0 [14B + 4.0H + 6.0A]
* AC/20++ (+ 10 Dmg, + 10 StbDmg): 110 / 22.0 [14B + 4.0H + 4.0A]
* AC/20+ (+ 10 Dmg): 110 / 22.0 [14B + 4.0H + 4.0A]
* AC/20+++ : 100 / 20.0 [14B + 4.0H + 2.0A]
* AC/20++ (+ 50% Crit): 100 / 20.0 [14B + 4.0H + 2.0A]
* AC/20++ (+ 4 Acc): 100 / 20.0 [14B + 4.0H + 2.0A]
* AC/20+ (+ 25% Crit): 100 / 20.0 [14B + 4.0H + 2.0A]
* AC/20+ (+ 2 Acc): 100 / 20.0 [14B + 4.0H + 2.0A]
* AC/20: 100 / 20.0 [14B + 4.0H + 2.0A]
* L Laser++ (+ 50% Crit): 40 / 8.0 [5B + 3.0H]
* L Laser++ (+ 3 Acc): 40 / 8.0 [5B + 3.0H]
* L Laser+ (+ 25% Crit): 40 / 8.0 [5B + 3.0H]
* L Laser+ (+ 1 Acc): 40 / 8.0 [5B + 3.0H]
* L Laser: 40 / 8.0 [5B + 3.0H]
* Gauss Rifle++ (- 2 Tons, - 1 Slot): 75 / 15.08 [13B + 0.83H + 1.25A]
* Gauss Rifle+ (- 2 Tons): 75 / 15.08 [13B + 0.83H + 1.25A]
* ER L Laser: 45 / 9.17 [5B + 4.17H]
* ER PPC+ (+ 5 Dmg, - 1 Ton): 65 / 13.5 [6B + 7.5H]
* PPC++ (+ 10 Dmg): 60 / 12.83 [7B + 5.83H]
* UAC/2: 50 / 10.73 [7B + 1.33H + 2.4A]
* L Pulse: 55 / 12.0 [7B + 5.0H]
* AC/5++ (+ 10 Dmg): 55 / 12.0 [8B + 1.33H + 2.67A]
* AC/20+ (+ 10 StbDmg): 100 / 22.0 [14B + 4.0H + 4.0A]
* AC/5+ (+ 5 Dmg): 50 / 11.33 [8B + 1.33H + 2.0A]
* Gauss Rifle: 75 / 17.08 [15B + 0.83H + 1.25A]
* PPC+ (+ 5 Dmg): 55 / 12.83 [7B + 5.83H]
* AC/5++ (+ 50% Crit): 45 / 10.67 [8B + 1.33H + 1.33A]
* AC/5++ (+ 4 Acc): 45 / 10.67 [8B + 1.33H + 1.33A]
* AC/5+ (+ 25% Crit): 45 / 10.67 [8B + 1.33H + 1.33A]
* AC/5+ (+ 2 Acc): 45 / 10.67 [8B + 1.33H + 1.33A]
* AC/5: 45 / 10.67 [8B + 1.33H + 1.33A]
* AC/20++ (+ 20 StbDmg): 100 / 24.0 [14B + 4.0H + 6.0A]
* ER PPC: 60 / 14.5 [7B + 7.5H]
* AC/2++ (+ 10 Dmg): 35 / 8.67 [6B + 0.67H + 2.0A]
* AC/10++ (+ 10 Dmg): 70 / 17.75 [12B + 2.0H + 3.75A]
* AC/10+ (+ 5 Dmg): 65 / 16.5 [12B + 2.0H + 2.5A]
* AC/10++ (+ 50% Crit): 60 / 15.25 [12B + 2.0H + 1.25A]
* AC/10++ (+ 4 Acc): 60 / 15.25 [12B + 2.0H + 1.25A]
* AC/10+ (+ 25% Crit): 60 / 15.25 [12B + 2.0H + 1.25A]
* AC/10+ (+ 2 Acc): 60 / 15.25 [12B + 2.0H + 1.25A]
* AC/10: 60 / 15.25 [12B + 2.0H + 1.25A]
* PPC++ (+ 4 Acc): 50 / 12.83 [7B + 5.83H]
* PPC++ (+ 30 StbDmg): 50 / 12.83 [7B + 5.83H]
* PPC+ (+ 2 Acc): 50 / 12.83 [7B + 5.83H]
* PPC+ (+ 15 StbDmg): 50 / 12.83 [7B + 5.83H]
* PPC: 50 / 12.83 [7B + 5.83H]
* AC/5++ (+ 2 Acc, + 10 StbDmg): 45 / 12.0 [8B + 1.33H + 2.67A]
* AC/5+ (+ 10 StbDmg): 45 / 12.0 [8B + 1.33H + 2.67A]
* AC/10++ (+ 25% Crit, + 10 StbDmg): 60 / 16.5 [12B + 2.0H + 2.5A]
* AC/10+ (+ 10 StbDmg): 60 / 16.5 [12B + 2.0H + 2.5A]
* AC/2+ (+ 5 Dmg): 30 / 8.27 [6B + 0.67H + 1.6A]
* AC/10+++ (+ 50% Crit, + 20 StbDmg): 60 / 17.75 [12B + 2.0H + 3.75A]
* AC/10++ (+ 20 StbDmg): 60 / 17.75 [12B + 2.0H + 3.75A]
* AC/5+++ (+ 4 Acc, + 20 StbDmg): 45 / 13.33 [8B + 1.33H + 4.0A]
* AC/5++ (+ 20 StbDmg): 45 / 13.33 [8B + 1.33H + 4.0A]
* AC/2+++ (+ 4 Acc, + 50% Crit): 25 / 7.87 [6B + 0.67H + 1.2A]
* AC/2++ (+ 50% Crit): 25 / 7.87 [6B + 0.67H + 1.2A]
* AC/2++ (+ 4 Acc): 25 / 7.87 [6B + 0.67H + 1.2A]
* AC/2++ (+ 2 Acc, + 25% Crit): 25 / 7.87 [6B + 0.67H + 1.2A]
* AC/2+ (+ 25% Crit): 25 / 7.87 [6B + 0.67H + 1.2A]
* AC/2+ (+ 2 Acc): 25 / 7.87 [6B + 0.67H + 1.2A]
* AC/2: 25 / 7.87 [6B + 0.67H + 1.2A]
* AC/2+ (+ 10 StbDmg): 25 / 8.67 [6B + 0.67H + 2.0A]
* AC/2++ (+ 20 StbDmg): 25 / 9.47 [6B + 0.67H + 2.8A]
* Flamer+ (* 4 Ammo, + 5 Dmg): 10 / 11.0 [1B + 10.0A]
* Infernos++ (* 8 Volleys, + 10 Dmg (H)): 4 / 4.75 [3B + 0.5H + 1.25A]
* Infernos+ (* 8 Volleys, + 5 Dmg (H)): 4 / 4.75 [3B + 0.5H + 1.25A]
* Infernos (* 8 Volleys): 4 / 4.75 [3B + 0.5H + 1.25A]
* Flamer+++ (* 40 Ammo): 5 / 11.0 [1B + 10.0A]
* Flamer++ (* 4 Ammo, + 5 Dmg (H)): 5 / 11.0 [1B + 10.0A]
* Flamer (* 4 Ammo): 5 / 11.0 [1B + 10.0A]

### Conclusions

These are long lists, but here's what we can tell from these rankings:

* support weapons (MGs and SLs) are really good, but they have very low range, so they only go on specific builds
* SRMs, MLs, LBXs, and UACs are good
* LRMs are medium in the ranking, but they have very high range and indirect fire, so in
* Snub PPCs and LLs are medium
* ACs, PPCs, Gauss Rifles are quite poor

I think that's pretty much in line with what I expected, as my builds are already SRMs, MLs, LRMs, with occasional UAC, LBX, or LL. I guess I expected Gauss Rifles to be better.

So in the end I'm not sure I learned much from this.

### Story so far

[All the code is on GitHub](https://github.com/taw/open-source-adventures).