Fractal Softworks Forum

Starsector => General Discussion => Topic started by: CapnHector on October 09, 2022, 02:34:41 AM

Title: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 09, 2022, 02:34:41 AM
The Conquest gets a lot of hate, but it's actually a great ship. Let's have a Conquest appreciation thread.

I just finished my second game of the new version, this one with Nex, Starfarer Mode, Free start. Explored, found AI cores, sold them to buy a Conquest, joined the Diktat, started waging war, conquered much of the sector and harvested all the Alpha Cores I could ever want from the [REDACTED] using nothing but these ships. They can take out literally everything in the game, are easy to get, available from the same place where you buy your fuel, and do not require an insane amount of player skill either. In my previous game I used them to defeat the [SUPER REDACTED] too, can't be bothered here since rewards not worth the effort. This screenshot has the Starship Legends mod, but the build works just as well without or possibly better (Starship Legends + Nex = occasionally massive enemy fleets with +15% range and +10% damage).

So, Conquest. I guess there are other ships in the game, but why even bother with them.

Spoiler
(https://i.ibb.co/2yWBSGX/best-ship.png)
[close]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: cytokine on October 09, 2022, 05:00:35 AM
WHAT HAVE YOU DONE TO MY DARLINGS
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 09, 2022, 05:11:48 AM
Well they do explode sometimes I have to admit but since the main goal is massive missile spam combined with decent firepower, the D-mods don't really matter that much anyway
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Tadas on October 09, 2022, 05:22:14 AM
Yeah conquests are cool, always happy to get one early game. I tend to put Mjolnirs on them, to get that all-rounder feel and I like the sound they make. I like their maximum burn speed, one of the reasons I usually don't take onslaughts/paragons in late game fleets.

Devastators on left side are tripping me out though.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: robepriority on October 09, 2022, 05:33:48 AM
I like to run gauss/maulers on the left + ion beam

Of course, I don't use it as a lineship either so /shrug
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 09, 2022, 06:10:11 AM
Devastators on left side are tripping me out though.

Why?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Tadas on October 09, 2022, 06:12:55 AM
I always put them on the right side, like god intended.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 09, 2022, 07:44:34 AM
I'm currently using two Conquests as Nav Relay capitals in my all Ballistic Mastery fleet, mostly by process of elimination. Onslaught is kind of a weird ship - and rather bad for the AI for multitude of reasons - while Legions are too vulnerable to Afflictors/Shades/Dooms. So if I want a ballistic capital I'm stuck with the Conquest... and it looks like the upcoming Retribution won't change anything either. No ITU, no BC.

I should point out that it's an officer fit, my character is relaxing in a Revenant.

Spoiler
(https://i.ibb.co/TkbnLVZ/screenshot064.jpg)
[close]

Yes, it's symmetrical. All my officers have Ordnance Expertise so it actually works out pretty well(i.e. compare this fit's flux stats with OP) One interesting thing I noticed about the AI Conquest is that its behaviour will change based on what you put in the medium energy slots. At first I used Ion Beams but then the AI was oddly conservative with the Mjolnirs. Once I changed it to something with shorter range it had no problems keeping the guns firing.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 09, 2022, 08:30:30 AM
I always put them on the right side, like god intended.

Putting the heavy guns on the right side means that you keep the enemy to your right, ie. in view of your left, logical hemisphere. Therefore it is the superior configuration and key to success with the Conquest.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Tadas on October 09, 2022, 10:47:46 AM
Augmented drive field, efficiency overhaul, locust. Damn, I am too much of a coward to use stuff that does not directly help in combat. I suppose locust does I just rarely use it and mostly on Apogees if I do.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Thaago on October 09, 2022, 12:17:53 PM
I like Locusts when I want to get "bang for buck" out of a large missile slot without spending many OP on it. Doesn't need ECCM or Missile Racks, only 18 OP, does its job well vs fighters and frigates. Pilum is kind of the same - its an effective EMP support/hull damage/battlespace clutter missile that needs no boosters and is only 7 OP.

Both of them pay for that with a low "ceiling" of effectiveness as they can't burst down shields or hull very effectively and don't really benefit from ECCM or racks, though there is some benefit to Pilum + ECCM for like a Thunder carrier to give faster LRM support from way beyond visible range.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Tadas on October 09, 2022, 12:29:42 PM
Interesting, never thought about it that way. I guess in my mind large missile slots are one of the strongest mount types in the game and I kind of want something with a bit of oomph there. I wonder how squall nerf will affect it next patch.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Grievous69 on October 09, 2022, 12:30:58 PM
I wonder how squall nerf will affect it next patch.
Spoiler alert: Not at all.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 09, 2022, 10:12:43 PM
The Squalls are the optimum choice per my experience when you are spamming Conquests. There is such a flood of missiles that no enemy can keep their shields up at all. The Hellbores do a good enough job of cracking armor so that low tech ships are still dealt with, and I have Harpoons for the medium missile slots which are necessary to finish off fleeing opponents.

My layout may not be playership optimal, but this is one that the AI plays very nicely with. In fact I can trust all but the most difficult fights to the AI without losses much of the time. In my experience other gun and missile configurations did worse (that is for the AI), possibly because of flux issues. The AI needs to be able to shield tank and win the flux war despite the Conquest having terrible shields is my theory. That is, when you are using Conquests as your line of battle ships and not just as artillery. In fact I found them more survivable for the AI than other capitals when kitted properly and used in this fleet configuration. Haven't tried Mjolnirs with Ordnance expertise and Flux distributors though. Probably should, it sounds like you are doing well with it. But I'm concerned about heavy armor.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Thaago on October 09, 2022, 10:43:01 PM
Oh yeah, re left vs right: I like putting the guns on the left so its the same as on an Odyssey in terms of flying.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 09, 2022, 11:20:09 PM
Oh yeah, re left vs right: I like putting the guns on the left so its the same as on an Odyssey in terms of flying.

This implies you are flying non-Conquest spaceships which is your first mistake.

"The missilespam"
(https://i.postimg.cc/pV3gSQRQ/Screenshot-2022-10-10-091734.png)
[close]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 09, 2022, 11:27:55 PM
Augmented drive field, efficiency overhaul, locust. Damn, I am too much of a coward to use stuff that does not directly help in combat. I suppose locust does I just rarely use it and mostly on Apogees if I do.

I actually prefer the Locust because if the AI is going to waste a salvo on every passing frigate - and it will - I want it to at least do something. Seeing an entire Squall salvo go nowhere gives me conniptions.

That said two Locusts is... a LOT of missiles. Gets into the "finishing off a cruiser" territory.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Candesce on October 10, 2022, 03:21:22 PM
That said two Locusts is... a LOT of missiles. Gets into the "finishing off a cruiser" territory.
I actually find myself using Locusts for their "intended" purpose fairly often: making fighter wings threatening my frigate wolfpacks go away.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Brainwright on October 10, 2022, 08:26:50 PM
That said two Locusts is... a LOT of missiles. Gets into the "finishing off a cruiser" territory.
I actually find myself using Locusts for their "intended" purpose fairly often: making fighter wings threatening my frigate wolfpacks go away.

Better range than my solution : one devastator on each side and dual squalls.  Leaves just about enough flux for one mjolnir.

Ever since I noticed Devastators were HE, they're popping up everywhere...
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 10, 2022, 09:59:10 PM
Considering Locust vs. Squall, we have this
SquallLocust
Range25001400
Ammo for2.62.2 minutes of continuous fire (no expanded missile racks)
1 volley is fired over19.4 seconds8.9 seconds
DPS vs shields512224.75
DPS vs armor128+EMP224.75
TrackingBadExcellent
I'm still going to go with the Squall for the range and combination with Hellbores, but now I'm really curious about which is objectively the superior choice. Anybody have any ideas how this could be tested empirically, like simulations of fleet combat?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Thaago on October 11, 2022, 12:05:59 AM
Be careful with that DPS vs armor... both get reduced a lot, but Squalls have 125 hit strength (in this version anyways) vs 50 for Locusts, so in practice do a lot more. Squalls missiles are almost as powerful as HVD rounds (275 kinetic damage for HVD vs 250 for Squall) so they will fairly quickly deal with destroyer grade armor.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 11, 2022, 03:12:10 AM
Oh true, I forgot. Let's do this right. Damage from a missile hit = damage*max(0.15,(damage)/(damage+(max0.05*armor,(armor-cumulative damage))). Let's assume we are fighting a dominator. Then apparently the effective armor is 9/15*1500+12/15*750 if I understand this cell thing right, if all missiles hit the same cell. So 1500 armor. Then apparently the total damage for k missiles doing x damage is given by Sum[x Max[0.15, x/(x + Max[1500 - x i, 0.05 1500])], {i, 0, k}] in Wolfram language. It's actually even more complicated than that. Here's some R code.
Spoiler
remainingarmor <- function(damage, armor, startingarmor) max(0.05*startingarmor,armor-damage)
armordamage <- function(damage, armor) damage*(max(0.15,damage/(damage+armor)))

totalarmordamage <- function(damage, startingarmor, salvo){
  armor <-startingarmor
  totaldamage <- 0
  for (i in 1:salvo){
  totaldamage <- totaldamage + armordamage(damage, armor)
  armor <- remainingarmor(armordamage(damage,armor), armor, startingarmor)
  }
  totaldamage
}

armorhpremaining <- function(missiledamage, multiplier, startingarmor, salvo) startingarmor - totalarmordamage(missiledamage*multiplier,startingarmor,salvo)

shieldhpremaining <- function(duration, dps, multiplier, startingshields, regenrate) startingshields-duration*dps*multiplier+duration*regenrate

hullhpremaining <- function(missiledamage, startinghull, salvo) startinghull-missiledamage*salvo
[close]

After one Squall salvo the Dominator will have 1125 armor remaining. Used in pairs, after two Squall salvos the Dominator will have 750 armor remaining. It will take a total of 4 salvos (65 missiles) to penetrate Dominator armor.

On the other hand, after one Locust salvo the Dominator will have 1200 armor remaining. Used in pairs, after two Locust salvos the Dominator will have 900 armor remaining. It will take a total of 5 salvos (186 missiles) to penetrate Dominator armor. So the Squall wins out despite lower DPS.

For the complete picture, let's factor in the dominator's shield which is 10 000 points of flux at 1 points of flux / damage and 500 points dissipation / second (base). With 1 Squall, after the salvo time of 19.4 seconds the Dominator will have 9767.2 points of shields left. With 2 Squalls, the Dominator will lose shields (-165.6 hp left). With Locusts, the shields can't be downed at all using just the missiles, since the regen rate is greater than the damage, even when used in pairs.

The Locusts will do 8000 hull damage per salvo, so once the armor is down they will eliminate the Dominator with 2 salvos. Meanwhile the Squalls will require 3 salvos to do so.

Apparently the reason the Squall spam strategy works is partly that when you have several Conquests worth of Squalls firing at a single target, it is enough to penetrate even cruiser/capital level armor in addition to devastating shields. Also, because of the range, you usually have several ships that can spam missiles at a single target. Of course, this is ignoring that you should also mount Harpoons to go with the Squalls.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Brainwright on October 11, 2022, 07:35:01 AM
Apparently the reason the Squall spam strategy works is partly that when you have several Conquests worth of Squalls firing at a single target, it is enough to penetrate even cruiser/capital level armor in addition to devastating shields. Also, because of the range, you usually have several ships that can spam missiles at a single target. Of course, this is ignoring that you should also mount Harpoons to go with the Squalls.

There's also a behavoral element to it as well.  Most ships won't close the distance if they're under steady fire.

I don't tend to use hellbores as anything I bear down on can dodge the rounds or flicker shields to catch each one, but I find they do keep ships from closing in too aggressively, where they wouldn't be able to dodge.

I also don't find HE that useful on capitals compared to EMP.  On a Conquest, a pair of Harpoon launchers will typically suffice for cracking armor while a mjolnir will crack every ship except low-tech in short order.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 11, 2022, 10:45:28 PM
Well, I enjoy statistics way too much to leave it at that. Let's find the actual optimum weapons layout for killing Dominators. The weapon data is from the game files this time. All weapons are assumed to hit the target immediately upon firing.

"R code for timeseries"
library(ggplot2)
library(ggthemes)

armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1.33,1.33,1.33)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")

weapon1 <- squall
weapon2 <- squall
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- dummy
weapon6 <- dummy

damageattimepoint <- function(weapon, timepoint) c(unlist(weapon[1])*unlist(weapon[3])[timepoint %% length(unlist(weapon[3]))], unlist(weapon[2]))

timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor){

   
    #flux dissipation - perfect shielduse
    if(hullhp > 0){
    shieldhp <- min(shieldhp+shieldregen, shieldmax)
    } else {shieldhp <- 0}
    #1. shields. if shieldhp is sufficient, use shield to block
    weapon1mult <- unlist(weapon1[2])
    if (shieldhp > damageattimepoint(weapon1, timepoint)[1]*weapon1mult){
      shieldhp <- shieldhp - damageattimepoint(weapon1, timepoint)[1]*weapon1mult
      shieldhp <- max(shieldhp, 0)
    } else {
    #2. armor
      if(armorhp > 0){
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      armorhp <- armorhp - armordamage(damageattimepoint(weapon1, timepoint)[1]*weapon1mult,armorhp,startingarmor)
      armorhp <- max(armorhp, 0)
    } else {
    #3. hull
      hulldmg <- damageattimepoint(weapon1, timepoint)[1]
      hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
      hullhp <- max(hullhp,0)
    }
    }
    #other weapons
    weapon2mult <- unlist(weapon2[2])
    if (shieldhp > damageattimepoint(weapon2, timepoint)[1]*weapon2mult){
      shieldhp <- shieldhp - damageattimepoint(weapon2, timepoint)[1]*weapon2mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon2, timepoint)[1]*weapon2mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon2, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > damageattimepoint(weapon3, timepoint)[1]*weapon3mult){
      shieldhp <- shieldhp - damageattimepoint(weapon3, timepoint)[1]*weapon3mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon3, timepoint)[1]*weapon3mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon3, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > damageattimepoint(weapon4, timepoint)[1]*weapon4mult){
      shieldhp <- shieldhp - damageattimepoint(weapon4, timepoint)[1]*weapon4mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon4, timepoint)[1]*weapon4mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon4, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > damageattimepoint(weapon5, timepoint)[1]*weapon5mult){
      shieldhp <- shieldhp - damageattimepoint(weapon5, timepoint)[1]*weapon5mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon5, timepoint)[1]*weapon5mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon5, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > damageattimepoint(weapon6, timepoint)[1]*weapon6mult){
      shieldhp <- shieldhp - damageattimepoint(weapon6, timepoint)[1]*weapon6mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon6, timepoint)[1]*weapon6mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon6, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    return(c(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor))
}

totaltime = 180

#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)

armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]

timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))

for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor)
  shieldhp <- state[2]
  armorhp <- state[3]
  hullhp <- state[4]
  flux <- shieldmax - shieldhp
  if(hullhp == 0){flux <- 0}
  timeseriesarray <- rbind(timeseriesarray , c(state[1], flux/shieldmax*100, state[3]/startingarmor*100, state[4]/ship[1]*100))
 
}

colnames(timeseriesarray) <-  c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))


ggplot(timeseriesarray, aes(x=Time)) + theme_tufte() +
  geom_line(aes(y = Flux, color = "Flux")) +
  geom_line(aes(y = Armor, color="Armor")) +
  geom_line(aes(y = Hull, color="Hull")) +
  scale_colour_manual("",
                      breaks = c("Flux", "Armor", "Hull"),
                      values = c("lightsteelblue", "red", "maroon")) +
  ylab("% max") +
  xlab("Time (s)") +
  labs(title=weaponstitle)

[close]

Testing manually, Squall Squall is the best large missile combo for killing Dominators. Here is what it does:

(https://iili.io/ZJdTAb.md.png)

Now let's tweak the code a bit and find the optimum weapons combo in the weapon space of weapon1, weapon2=Squall, Locust or Hurricane weapon3, weapon4 = Harpoon or Sabot weapon5,weapon6 = Gauss, Hephaestus, Mark IX, Mjolnir, Hellbore or Storm Needler. Change the code a little

"R code"
armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor)))) 

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1.33,1.33,1.33)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")

weapon1 <- squall
weapon2 <- squall
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- dummy
weapon6 <- dummy

weapon1choices <- list(squall, locust, hurricane, dummy)
weapon2choices <- list(squall, locust, hurricane, dummy)
weapon3choices <- list(harpoon, sabot, dummy)
weapon4choices <- list(harpoon, sabot, dummy)
weapon5choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler, dummy)
weapon6choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler, dummy)

timeseriesarray <- data.frame(matrix(ncol = 7,nrow=0))



timetokill=0

damageattimepoint <- function(weapon, timepoint) c(unlist(weapon[1])*unlist(weapon[3])[timepoint %% length(unlist(weapon[3]))], unlist(weapon[2]))



timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor){
   
    #flux dissipation - perfect shielduse
    if(hullhp > 0){
    shieldhp <- min(shieldhp+shieldregen, shieldmax)
    } else {shieldhp <- 0}
    #1. shields. if shieldhp is sufficient, use shield to block
    weapon1mult <- unlist(weapon1[2])
    if (shieldhp > damageattimepoint(weapon1, timepoint)[1]*weapon1mult){
      shieldhp <- shieldhp - damageattimepoint(weapon1, timepoint)[1]*weapon1mult
      shieldhp <- max(shieldhp, 0)
    } else {
    #2. armor
      if(armorhp > 0){
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      armorhp <- armorhp - armordamage(damageattimepoint(weapon1, timepoint)[1]*weapon1mult,armorhp,startingarmor)
      armorhp <- max(armorhp, 0)
    } else {
    #3. hull
      hulldmg <- damageattimepoint(weapon1, timepoint)[1]
      hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
      hullhp <- max(hullhp,0)
    }
    }
    #other weapons
    weapon2mult <- unlist(weapon2[2])
    if (shieldhp > damageattimepoint(weapon2, timepoint)[1]*weapon2mult){
      shieldhp <- shieldhp - damageattimepoint(weapon2, timepoint)[1]*weapon2mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon2, timepoint)[1]*weapon2mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon2, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > damageattimepoint(weapon3, timepoint)[1]*weapon3mult){
      shieldhp <- shieldhp - damageattimepoint(weapon3, timepoint)[1]*weapon3mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon3, timepoint)[1]*weapon3mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon3, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > damageattimepoint(weapon4, timepoint)[1]*weapon4mult){
      shieldhp <- shieldhp - damageattimepoint(weapon4, timepoint)[1]*weapon4mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon4, timepoint)[1]*weapon4mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon4, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > damageattimepoint(weapon5, timepoint)[1]*weapon5mult){
      shieldhp <- shieldhp - damageattimepoint(weapon5, timepoint)[1]*weapon5mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon5, timepoint)[1]*weapon5mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon5, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > damageattimepoint(weapon6, timepoint)[1]*weapon6mult){
      shieldhp <- shieldhp - damageattimepoint(weapon6, timepoint)[1]*weapon6mult
      shieldhp <- max(shieldhp, 0)
    } else {
      if(armorhp > 0){
        if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
        armorhp <- armorhp - armordamage(damageattimepoint(weapon6, timepoint)[1]*weapon6mult,armorhp,startingarmor)
        armorhp <- max(armorhp, 0)
      } else {
        hulldmg <- damageattimepoint(weapon6, timepoint)[1]
        hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
        hullhp <- max(hullhp,0)
      }
    }
    return(c(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor))
}

totaltime = 180

#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)



weapon1choices[[2]]

armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]

for (i in 1:length(weapon1choices)) {
  weapon1<-weapon1choices[]
  for (j in 1:length(weapon2choices)) {
    weapon2<-weapon2choices[[j]]
    for (k in 1:length(weapon3choices)) {
      weapon3<-weapon3choices[[k]]
      for (l in 1:length(weapon4choices)) {
        weapon4<-weapon4choices[[l]]
        for (m in 1:length(weapon5choices)) {
          weapon5<-weapon5choices[[m]]
          for (n in 1:length(weapon6choices)) {
            weapon6<-weapon6choices[[n]]
for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor)
  shieldhp <- state[2]
  armorhp <- state[3]
  hullhp <- state[4]
  flux <- shieldmax - shieldhp
  if(hullhp == 0){flux <- 0
    if (timetokill == 0){timetokill <- t}
  }
}
if (timetokill ==0){timetokill <- NA}

tobind <- c(timetokill,unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))
timeseriesarray <- rbind(timeseriesarray,tobind)

timetokill <- 0
armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
}
        }
      }
    }
  }
}
colnames(timeseriesarray) <-  c("Timetokill", "Weapon1", "Weapon2", "Weapon3", "Weapon4", "Weapon5", "Weapon6")


timeseriesarray

write.table(timeseriesarray, file = "optimizeweapons.tsv", row.names=FALSE, sep="\t")
timeseriesarray[,1]

sortbytime <- timeseriesarray[order(as.integer(timeseriesarray$Timetokill)),]
sortbytime

write.table(sortbytime, file = "optimizeweaponsbytime.txt", row.names=FALSE, sep="\t")
[close]

Results in next post due to limits.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 11, 2022, 11:50:07 PM
Results from running the above (truncated at 25 seconds)
Spoiler
"Timetokill"   "Weapon1"   "Weapon2"   "Weapon3"   "Weapon4"   "Weapon5"   "Weapon6"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   ""
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   ""   "Gauss"
"17"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"17"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"17"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"17"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"17"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"17"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"17"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"17"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"17"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"17"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"17"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"17"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"17"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"17"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"17"   "Hurricane"   "Hurricane"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"17"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"17"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"17"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"17"   "Hurricane"   "Hurricane"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"17"   "Hurricane"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   "Hurricane"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   "Hurricane"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   "Hurricane"   ""   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   "Hurricane"   ""   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   "Hurricane"   ""   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"17"   ""   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"17"   ""   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"17"   ""   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"17"   ""   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"17"   ""   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"17"   ""   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"19"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Hellbore"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"19"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Mark IX"
"19"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"19"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"19"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"19"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"19"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"19"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"19"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"19"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"19"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"19"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Gauss"
"19"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"19"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"19"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"19"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"19"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"19"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"19"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Mjolnir"
"19"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Gauss"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"19"   "Locust"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   "Locust"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Locust"   "Hurricane"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"19"   "Hurricane"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   "Hurricane"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Hurricane"   "Hurricane"   "Harpoon"   ""   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"19"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"19"   "Hurricane"   "Hurricane"   ""   "Harpoon"   "Mark IX"   "Mjolnir"
"19"   "Hurricane"   ""   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   ""   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"19"   "Hurricane"   ""   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   "Hurricane"   ""   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"19"   "Hurricane"   ""   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"19"   ""   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"19"   ""   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"19"   ""   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"19"   ""   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"19"   ""   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"20"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"20"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"20"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"20"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"20"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"20"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"20"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hephaestus"
"20"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Storm Needler"
"20"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   ""
"20"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mjolnir"
"20"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mjolnir"
"20"   "Locust"   "Locust"   "Harpoon"   "Sabot"   ""   "Mjolnir"
"20"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"20"   "Locust"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"20"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hephaestus"
"20"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Storm Needler"
"20"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   ""
"20"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mjolnir"
"20"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mjolnir"
"20"   "Locust"   "Locust"   "Sabot"   "Harpoon"   ""   "Mjolnir"
"20"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"20"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"20"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"20"   "Locust"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"20"   "Locust"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"20"   "Hurricane"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"21"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"21"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"21"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"21"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"21"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"21"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"21"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"21"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"21"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"21"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"21"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"21"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"21"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"21"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"21"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"21"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"21"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"21"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"21"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"21"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"21"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   ""
"21"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"21"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"21"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   ""   "Gauss"
"21"   "Squall"   "Hurricane"   "Harpoon"   ""   "Gauss"   "Gauss"
"21"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"21"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"21"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   ""
"21"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"21"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"21"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   ""   "Gauss"
"21"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"21"   "Squall"   "Hurricane"   ""   "Harpoon"   "Gauss"   "Gauss"
"21"   "Squall"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"21"   "Squall"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"21"   "Squall"   ""   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"21"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"21"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"21"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"21"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"21"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"21"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"21"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"21"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"21"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   ""
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   ""   "Gauss"
"21"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"21"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"21"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hephaestus"
"21"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Storm Needler"
"21"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   ""
"21"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mark IX"
"21"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mark IX"
"21"   "Locust"   "Locust"   "Harpoon"   "Sabot"   ""   "Mark IX"
"21"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Mark IX"
"21"   "Locust"   "Locust"   "Harpoon"   ""   "Mark IX"   "Mjolnir"
"21"   "Locust"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Mark IX"
"21"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"21"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hephaestus"
"21"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Storm Needler"
"21"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   ""
"21"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mark IX"
"21"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mark IX"
"21"   "Locust"   "Locust"   "Sabot"   "Harpoon"   ""   "Mark IX"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Hephaestus"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Storm Needler"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   ""
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Hephaestus"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Storm Needler"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   ""
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Gauss"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Mjolnir"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Gauss"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Mjolnir"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   ""   "Gauss"
"21"   "Locust"   "Locust"   "Sabot"   "Sabot"   ""   "Mjolnir"
"21"   "Locust"   "Locust"   "Sabot"   ""   "Gauss"   "Gauss"
"21"   "Locust"   "Locust"   "Sabot"   ""   "Gauss"   "Mjolnir"
"21"   "Locust"   "Locust"   "Sabot"   ""   "Mjolnir"   "Gauss"
"21"   "Locust"   "Locust"   "Sabot"   ""   "Mjolnir"   "Mjolnir"
"21"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Mark IX"
"21"   "Locust"   "Locust"   ""   "Harpoon"   "Mark IX"   "Mjolnir"
"21"   "Locust"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Mark IX"
"21"   "Locust"   "Locust"   ""   "Sabot"   "Gauss"   "Gauss"
"21"   "Locust"   "Locust"   ""   "Sabot"   "Gauss"   "Mjolnir"
"21"   "Locust"   "Locust"   ""   "Sabot"   "Mjolnir"   "Gauss"
"21"   "Locust"   "Locust"   ""   "Sabot"   "Mjolnir"   "Mjolnir"
"21"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"21"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"21"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   ""
"21"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"21"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"21"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Gauss"
"21"   "Locust"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"21"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"21"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"21"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"21"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   ""
"21"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"21"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"21"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   ""   "Gauss"
"21"   "Hurricane"   "Squall"   "Harpoon"   ""   "Gauss"   "Gauss"
"21"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"21"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"21"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   ""
"21"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"21"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"21"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   ""   "Gauss"
"21"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"21"   "Hurricane"   "Squall"   ""   "Harpoon"   "Gauss"   "Gauss"
"21"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"21"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"21"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   ""
"21"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"21"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"21"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   ""   "Gauss"
"21"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"21"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   ""
"21"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"21"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Gauss"
"21"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"21"   ""   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"21"   ""   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"21"   ""   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"21"   ""   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"22"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"22"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"22"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"22"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"22"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"22"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"22"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"22"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"22"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"22"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"22"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"22"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"22"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"22"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"22"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"22"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"22"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"22"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"22"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"22"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"22"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"22"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"22"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Hellbore"
"22"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"22"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"22"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Mark IX"
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"22"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"22"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"22"   "Squall"   ""   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   "Squall"   ""   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"22"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"22"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"22"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"22"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"22"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"22"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"22"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"22"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"22"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"22"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"22"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"22"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"22"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"22"   "Locust"   "Locust"   "Harpoon"   ""   "Mark IX"   "Gauss"
"22"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"22"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Hellbore"
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Hephaestus"
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Storm Needler"
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   ""
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Mark IX"
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Mark IX"
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Mark IX"
"22"   "Locust"   "Locust"   "Sabot"   "Sabot"   ""   "Mark IX"
"22"   "Locust"   "Locust"   "Sabot"   ""   "Gauss"   "Mark IX"
"22"   "Locust"   "Locust"   ""   "Harpoon"   "Mark IX"   "Gauss"
"22"   "Locust"   "Locust"   ""   "Sabot"   "Gauss"   "Mark IX"
"22"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"22"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"22"   "Locust"   "Hurricane"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"22"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"22"   "Locust"   "Hurricane"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"22"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"22"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"22"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"22"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"22"   "Hurricane"   "Locust"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"22"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"22"   "Hurricane"   "Locust"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"22"   "Hurricane"   "Hurricane"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"22"   "Hurricane"   ""   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"22"   "Hurricane"   ""   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"22"   "Hurricane"   ""   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"22"   "Hurricane"   ""   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"22"   ""   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"22"   ""   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"22"   ""   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"22"   ""   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"22"   ""   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"22"   ""   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"23"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Hellbore"
"23"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"23"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"23"   "Squall"   "Squall"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"23"   "Squall"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"23"   "Squall"   "Squall"   "Harpoon"   ""   "Hellbore"   "Gauss"
"23"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"23"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"23"   "Squall"   "Squall"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"23"   "Squall"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"23"   "Squall"   "Squall"   ""   "Harpoon"   "Hellbore"   "Gauss"
"23"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"23"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   ""
"23"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"23"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"23"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"23"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Gauss"
"23"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"23"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"23"   "Squall"   "Hurricane"   "Harpoon"   ""   "Gauss"   "Mark IX"
"23"   "Squall"   "Hurricane"   "Harpoon"   ""   "Mark IX"   "Gauss"
"23"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"23"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"23"   "Squall"   "Hurricane"   ""   "Harpoon"   "Gauss"   "Mark IX"
"23"   "Squall"   "Hurricane"   ""   "Harpoon"   "Mark IX"   "Gauss"
"23"   "Squall"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"23"   "Squall"   ""   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"23"   "Squall"   ""   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"23"   "Squall"   ""   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"23"   "Squall"   ""   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"23"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"23"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"23"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"23"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"23"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"23"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"23"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"23"   "Locust"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"23"   "Locust"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"23"   "Locust"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"23"   "Locust"   ""   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"23"   "Locust"   ""   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"23"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"23"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   ""
"23"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"23"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"23"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"23"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   ""   "Gauss"
"23"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"23"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"23"   "Hurricane"   "Squall"   "Harpoon"   ""   "Gauss"   "Mark IX"
"23"   "Hurricane"   "Squall"   "Harpoon"   ""   "Mark IX"   "Gauss"
"23"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"23"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"23"   "Hurricane"   "Squall"   ""   "Harpoon"   "Gauss"   "Mark IX"
"23"   "Hurricane"   "Squall"   ""   "Harpoon"   "Mark IX"   "Gauss"
"23"   "Hurricane"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"23"   "Hurricane"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"23"   "Hurricane"   "Hurricane"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"23"   "Hurricane"   "Hurricane"   "Sabot"   ""   "Gauss"   "Gauss"
"23"   "Hurricane"   "Hurricane"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"23"   "Hurricane"   "Hurricane"   ""   "Sabot"   "Gauss"   "Gauss"
"23"   "Hurricane"   ""   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"23"   "Hurricane"   ""   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"23"   ""   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"23"   ""   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"23"   ""   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"23"   ""   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"23"   ""   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"23"   ""   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"23"   ""   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"23"   ""   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"23"   ""   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"23"   ""   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"24"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"24"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"24"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"24"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"24"   "Squall"   "Squall"   "Harpoon"   ""   "Gauss"   "Hellbore"
"24"   "Squall"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Mjolnir"
"24"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"24"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"24"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"24"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Mjolnir"
"24"   "Squall"   "Squall"   "Sabot"   ""   "Gauss"   "Mjolnir"
"24"   "Squall"   "Squall"   "Sabot"   ""   "Mjolnir"   "Gauss"
"24"   "Squall"   "Squall"   ""   "Harpoon"   "Gauss"   "Hellbore"
"24"   "Squall"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Mjolnir"
"24"   "Squall"   "Squall"   ""   "Sabot"   "Gauss"   "Mjolnir"
"24"   "Squall"   "Squall"   ""   "Sabot"   "Mjolnir"   "Gauss"
"24"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"24"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"24"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"24"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"24"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"24"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"24"   "Squall"   "Locust"   "Sabot"   ""   "Mjolnir"   "Mjolnir"
"24"   "Squall"   "Locust"   ""   "Sabot"   "Mjolnir"   "Mjolnir"
"24"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"24"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"24"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"24"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"24"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"24"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"24"   "Squall"   "Hurricane"   "Sabot"   ""   "Mjolnir"   "Mjolnir"
"24"   "Squall"   "Hurricane"   ""   "Sabot"   "Mjolnir"   "Mjolnir"
"24"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"24"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"24"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"24"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"24"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"24"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"24"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"24"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"24"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"24"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"24"   "Hurricane"   "Squall"   "Sabot"   ""   "Mjolnir"   "Mjolnir"
"24"   "Hurricane"   "Squall"   ""   "Sabot"   "Mjolnir"   "Mjolnir"   
[close]

So the absolute most effective combo for killing Dominators is Hurricane-Hurricane-Harpoon-Harpoon-[Gauss or Mjolnir]x2
Squall-Squall-Harpoon-Harpoon is very slightly less effective (16 seconds time to kill vs 17 seconds time to kill) and you can use Gauss, Mjolnir and Hellbore with it provided you do not run 2 Hellbores.

Incidentally here are the top combos for killing Brilliants:
Spoiler
"Timetokill"   "Weapon1"   "Weapon2"   "Weapon3"   "Weapon4"   "Weapon5"   "Weapon6"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Hephaestus"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Storm Needler"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   ""
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hephaestus"   "Hellbore"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Storm Needler"   "Hellbore"
"10"   "Squall"   "Squall"   "Sabot"   "Sabot"   ""   "Hellbore"
"10"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"10"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"10"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"10"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"10"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"10"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"11"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Squall"   "Sabot"   ""   "Gauss"   "Hellbore"
"11"   "Squall"   "Squall"   ""   "Sabot"   "Gauss"   "Hellbore"
"11"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"11"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"11"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Hellbore"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   ""   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   ""   "Sabot"   "Gauss"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"15"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"15"   "Squall"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"15"   "Squall"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"15"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"15"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"15"   "Squall"   "Hurricane"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"15"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"15"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"15"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"15"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"15"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"15"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"15"   "Hurricane"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"15"   "Hurricane"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"15"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"15"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"15"   "Hurricane"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
[close]

Here, not unexpectedly, you want kinetics. 2 Squalls, or you can also use 1 Squall and 1 Locust for some combos with high anti shield damage in your other slots.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 12, 2022, 12:04:26 AM
I am surprised how many people use Hellbores, I always thought of them as large mount equivalent of the Heavy Mortar - something you get only because you lack flux/OP to get something better.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 12, 2022, 12:26:28 AM
I am surprised how many people use Hellbores, I always thought of them as large mount equivalent of the Heavy Mortar - something you get only because you lack flux/OP to get something better.

The simulation results bear this statement out. Squall Squall Harpoon Harpoon Mjolnir Mjolnir is one of the top combos for both the highly shielded and the highly armored targets, making it a "universal choice". Swapping one weapon out works - if you swap for Gauss (ie. Mjolnir Gauss) or to Hellbore vs. the highly armored target, Mark IX vs the highly shielded target. I'd assume Mjolnir Mjolnir is better against small targets than Mjolnir Gauss. So it's probably best to run Mjolnir Mjolnir rather than one of the other weapons (except Gauss Gauss) if you can afford the flux, apparently. Squall Squall Harpoon Harpoon Gauss Gauss is another top choice. The latter might even be the best one in practice due to increased range which matches the Squalls and Harpoons better.

Now just need to test in practice whether the increased flux buildup causes problems for the AI.

Some folks might be wondering if the Hellbore is worth it if you do not use Harpoons. The answer is no, at least not 2xHellbore. Vs Dominator:

Spoiler
"Timetokill"   "Weapon1"   "Weapon2"   "Weapon3"   "Weapon4"   "Weapon5"   "Weapon6"
"29"   "Squall"   "Squall"   ""   ""   "Gauss"   "Gauss"
"29"   "Squall"   "Locust"   ""   ""   "Gauss"   "Gauss"
"29"   "Locust"   "Locust"   ""   ""   "Mjolnir"   "Gauss"
"30"   "Squall"   "Squall"   ""   ""   "Gauss"   "Mjolnir"
"30"   "Squall"   "Squall"   ""   ""   "Mjolnir"   "Gauss"
"30"   "Squall"   "Squall"   ""   ""   "Mjolnir"   "Mjolnir"
"30"   "Locust"   "Locust"   ""   ""   "Gauss"   "Gauss"
"30"   "Locust"   "Locust"   ""   ""   "Gauss"   "Mjolnir"
"30"   "Locust"   "Locust"   ""   ""   "Mjolnir"   "Mjolnir"
"31"   "Squall"   "Squall"   ""   ""   "Gauss"   "Mark IX"
"31"   "Squall"   "Squall"   ""   ""   "Mark IX"   "Gauss"
"31"   "Squall"   "Squall"   ""   ""   "Mark IX"   "Hellbore"
"31"   "Squall"   "Squall"   ""   ""   "Hellbore"   "Mark IX"
"31"   "Squall"   "Locust"   ""   ""   "Gauss"   "Mjolnir"
"31"   "Squall"   "Locust"   ""   ""   "Mjolnir"   "Gauss"
"31"   "Squall"   "Hurricane"   ""   ""   "Gauss"   "Gauss"
"31"   "Squall"   "Hurricane"   ""   ""   "Gauss"   "Mark IX"
"31"   "Squall"   "Hurricane"   ""   ""   "Gauss"   "Hellbore"
"31"   "Squall"   "Hurricane"   ""   ""   "Mark IX"   "Gauss"
"31"   "Squall"   "Hurricane"   ""   ""   "Mjolnir"   "Mjolnir"
"31"   "Squall"   "Hurricane"   ""   ""   "Hellbore"   "Gauss"
"31"   "Locust"   "Locust"   ""   ""   "Hellbore"   "Gauss"
"31"   "Hurricane"   "Squall"   ""   ""   "Gauss"   "Gauss"
"31"   "Hurricane"   "Squall"   ""   ""   "Gauss"   "Mark IX"
"31"   "Hurricane"   "Squall"   ""   ""   "Gauss"   "Hellbore"
"31"   "Hurricane"   "Squall"   ""   ""   "Mark IX"   "Gauss"
"31"   "Hurricane"   "Squall"   ""   ""   "Mjolnir"   "Mjolnir"
"31"   "Hurricane"   "Squall"   ""   ""   "Hellbore"   "Gauss"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Gauss"   "Gauss"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Gauss"   "Mark IX"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Gauss"   "Mjolnir"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Gauss"   "Hellbore"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Gauss"   "Hephaestus"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Gauss"   "Storm Needler"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Gauss"   ""
"31"   "Hurricane"   "Hurricane"   ""   ""   "Mark IX"   "Gauss"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Mark IX"   "Mark IX"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Mark IX"   "Mjolnir"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Mjolnir"   "Gauss"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Mjolnir"   "Mark IX"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Hellbore"   "Gauss"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Hephaestus"   "Gauss"
"31"   "Hurricane"   "Hurricane"   ""   ""   "Storm Needler"   "Gauss"
"31"   "Hurricane"   "Hurricane"   ""   ""   ""   "Gauss"
"33"   "Locust"   "Locust"   ""   ""   "Gauss"   "Mark IX"
"33"   "Locust"   "Locust"   ""   ""   "Mark IX"   "Gauss"
"34"   "Squall"   "Locust"   ""   ""   "Mark IX"   "Mjolnir"
"34"   "Squall"   "Locust"   ""   ""   "Mjolnir"   "Mark IX"
"34"   "Squall"   "Hurricane"   ""   ""   "Mark IX"   "Mark IX"
"34"   "Squall"   "Hurricane"   ""   ""   "Mark IX"   "Mjolnir"
"34"   "Squall"   "Hurricane"   ""   ""   "Mjolnir"   "Mark IX"
"34"   "Locust"   "Locust"   ""   ""   "Mark IX"   "Mjolnir"
"34"   "Locust"   "Locust"   ""   ""   "Mjolnir"   "Mark IX"
"34"   "Hurricane"   "Squall"   ""   ""   "Mark IX"   "Mark IX"
"34"   "Hurricane"   "Squall"   ""   ""   "Mark IX"   "Mjolnir"
"34"   "Hurricane"   "Squall"   ""   ""   "Mjolnir"   "Mark IX"
"35"   "Squall"   "Locust"   ""   ""   "Mjolnir"   "Mjolnir"
"35"   "Squall"   "Hurricane"   ""   ""   "Gauss"   "Mjolnir"
"35"   "Squall"   "Hurricane"   ""   ""   "Mjolnir"   "Gauss"
"35"   "Locust"   "Squall"   ""   ""   "Gauss"   "Gauss"
"35"   "Locust"   "Hurricane"   ""   ""   "Gauss"   "Gauss"
"35"   "Hurricane"   "Squall"   ""   ""   "Gauss"   "Mjolnir"
"35"   "Hurricane"   "Squall"   ""   ""   "Mjolnir"   "Gauss"
"35"   "Hurricane"   "Locust"   ""   ""   "Gauss"   "Gauss"
"37"   "Squall"   "Squall"   ""   ""   "Mark IX"   "Mark IX"
"37"   "Squall"   "Squall"   ""   ""   "Mark IX"   "Mjolnir"
"37"   "Squall"   "Locust"   ""   ""   "Gauss"   "Mark IX"
"37"   "Squall"   "Locust"   ""   ""   "Mark IX"   "Gauss"
"37"   "Locust"   "Squall"   ""   ""   "Gauss"   "Mjolnir"
"37"   "Locust"   "Hurricane"   ""   ""   "Gauss"   "Mark IX"
"37"   "Locust"   "Hurricane"   ""   ""   "Mark IX"   "Gauss"
"37"   "Hurricane"   "Locust"   ""   ""   "Gauss"   "Mark IX"
"37"   "Hurricane"   "Locust"   ""   ""   "Mark IX"   "Gauss"
"38"   "Locust"   "Squall"   ""   ""   "Mjolnir"   "Mjolnir"
"38"   "Locust"   "Locust"   ""   ""   "Gauss"   "Hellbore"
"38"   "Hurricane"   "Hurricane"   ""   ""   "Mjolnir"   "Mjolnir"
"39"   "Hurricane"   ""   ""   ""   "Gauss"   "Gauss"
"39"   ""   "Hurricane"   ""   ""   "Gauss"   "Gauss"
"40"   "Squall"   "Squall"   ""   ""   "Mjolnir"   "Mark IX"
"40"   "Locust"   "Squall"   ""   ""   "Mjolnir"   "Gauss"
"40"   "Locust"   "Locust"   ""   ""   "Mark IX"   "Mark IX"
"40"   "Locust"   "Locust"   ""   ""   "Mark IX"   "Hellbore"
"40"   "Locust"   "Locust"   ""   ""   "Mjolnir"   "Hellbore"
"40"   "Locust"   "Locust"   ""   ""   "Hellbore"   "Mjolnir"
"40"   "Locust"   "Hurricane"   ""   ""   "Gauss"   "Mjolnir"
"40"   "Locust"   "Hurricane"   ""   ""   "Mark IX"   "Mark IX"
"40"   "Locust"   "Hurricane"   ""   ""   "Mjolnir"   "Mjolnir"
"40"   "Hurricane"   "Locust"   ""   ""   "Gauss"   "Mjolnir"
"40"   "Hurricane"   "Locust"   ""   ""   "Mark IX"   "Mark IX"
"40"   "Hurricane"   "Locust"   ""   ""   "Mjolnir"   "Mjolnir"
"41"   "Squall"   "Squall"   ""   ""   "Mjolnir"   "Hellbore"
"41"   "Squall"   "Squall"   ""   ""   "Hellbore"   "Mjolnir"
"41"   "Squall"   "Locust"   ""   ""   "Gauss"   "Hellbore"
"41"   "Squall"   "Locust"   ""   ""   "Hellbore"   "Gauss"
"41"   "Locust"   "Squall"   ""   ""   "Gauss"   "Mark IX"
"41"   "Locust"   "Squall"   ""   ""   "Mark IX"   "Gauss"
"41"   "Locust"   "Hurricane"   ""   ""   "Mjolnir"   "Gauss"
"41"   "Hurricane"   "Locust"   ""   ""   "Mjolnir"   "Gauss"
"42"   "Squall"   "Squall"   ""   ""   "Hellbore"   "Gauss"
"42"   "Squall"   "Locust"   ""   ""   "Mark IX"   "Mark IX"
"43"   "Squall"   "Squall"   ""   ""   "Gauss"   "Hellbore"
"43"   "Squall"   ""   ""   ""   "Gauss"   "Gauss"
"43"   "Locust"   "Squall"   ""   ""   "Mark IX"   "Mark IX"
"43"   "Locust"   "Squall"   ""   ""   "Mark IX"   "Mjolnir"
"43"   "Locust"   "Squall"   ""   ""   "Mjolnir"   "Mark IX"
"43"   ""   "Squall"   ""   ""   "Gauss"   "Gauss"
"44"   "Squall"   "Locust"   ""   ""   "Mjolnir"   "Hellbore"
"44"   "Squall"   "Locust"   ""   ""   "Hellbore"   "Mark IX"
"45"   "Squall"   "Locust"   ""   ""   "Hellbore"   "Mjolnir"
"45"   "Locust"   "Squall"   ""   ""   "Hellbore"   "Gauss"
"45"   "Hurricane"   ""   ""   ""   "Gauss"   "Mark IX"
"45"   "Hurricane"   ""   ""   ""   "Mark IX"   "Gauss"
"45"   ""   "Hurricane"   ""   ""   "Gauss"   "Mark IX"
"45"   ""   "Hurricane"   ""   ""   "Mark IX"   "Gauss"
"46"   "Squall"   "Locust"   ""   ""   "Mark IX"   "Hellbore"
"46"   "Squall"   "Hurricane"   ""   ""   "Gauss"   "Hephaestus"
"46"   "Squall"   "Hurricane"   ""   ""   "Gauss"   "Storm Needler"
"46"   "Squall"   "Hurricane"   ""   ""   "Gauss"   ""
"46"   "Squall"   "Hurricane"   ""   ""   "Mark IX"   "Hellbore"
"46"   "Squall"   "Hurricane"   ""   ""   "Mjolnir"   "Hellbore"
"46"   "Squall"   "Hurricane"   ""   ""   "Mjolnir"   "Hephaestus"
"46"   "Squall"   "Hurricane"   ""   ""   "Mjolnir"   "Storm Needler"
"46"   "Squall"   "Hurricane"   ""   ""   "Mjolnir"   ""
"46"   "Squall"   "Hurricane"   ""   ""   "Hellbore"   "Mark IX"
"46"   "Squall"   "Hurricane"   ""   ""   "Hellbore"   "Mjolnir"
"46"   "Squall"   "Hurricane"   ""   ""   "Hephaestus"   "Gauss"
"46"   "Squall"   "Hurricane"   ""   ""   "Hephaestus"   "Mjolnir"
"46"   "Squall"   "Hurricane"   ""   ""   "Storm Needler"   "Gauss"
"46"   "Squall"   "Hurricane"   ""   ""   "Storm Needler"   "Mjolnir"
"46"   "Squall"   "Hurricane"   ""   ""   ""   "Gauss"
"46"   "Squall"   "Hurricane"   ""   ""   ""   "Mjolnir"
"46"   "Squall"   ""   ""   ""   "Gauss"   "Mark IX"
"46"   "Squall"   ""   ""   ""   "Mark IX"   "Gauss"
"46"   "Squall"   ""   ""   ""   "Mjolnir"   "Mjolnir"
"46"   "Locust"   "Squall"   ""   ""   "Gauss"   "Hellbore"
"46"   "Locust"   "Locust"   ""   ""   "Hellbore"   "Mark IX"
"46"   "Locust"   "Hurricane"   ""   ""   "Gauss"   "Hellbore"
"46"   "Locust"   "Hurricane"   ""   ""   "Gauss"   "Storm Needler"
"46"   "Locust"   "Hurricane"   ""   ""   "Mark IX"   "Mjolnir"
"46"   "Locust"   "Hurricane"   ""   ""   "Mark IX"   "Hellbore"
"46"   "Locust"   "Hurricane"   ""   ""   "Mjolnir"   "Mark IX"
"46"   "Locust"   "Hurricane"   ""   ""   "Hellbore"   "Gauss"
"46"   "Locust"   "Hurricane"   ""   ""   "Storm Needler"   "Gauss"
"46"   "Hurricane"   "Squall"   ""   ""   "Gauss"   "Hephaestus"
"46"   "Hurricane"   "Squall"   ""   ""   "Gauss"   "Storm Needler"
"46"   "Hurricane"   "Squall"   ""   ""   "Gauss"   ""
"46"   "Hurricane"   "Squall"   ""   ""   "Mark IX"   "Hellbore"
"46"   "Hurricane"   "Squall"   ""   ""   "Mjolnir"   "Hellbore"
"46"   "Hurricane"   "Squall"   ""   ""   "Mjolnir"   "Hephaestus"
"46"   "Hurricane"   "Squall"   ""   ""   "Mjolnir"   "Storm Needler"
"46"   "Hurricane"   "Squall"   ""   ""   "Mjolnir"   ""
"46"   "Hurricane"   "Squall"   ""   ""   "Hellbore"   "Mark IX"
"46"   "Hurricane"   "Squall"   ""   ""   "Hellbore"   "Mjolnir"
"46"   "Hurricane"   "Squall"   ""   ""   "Hephaestus"   "Gauss"
"46"   "Hurricane"   "Squall"   ""   ""   "Hephaestus"   "Mjolnir"
"46"   "Hurricane"   "Squall"   ""   ""   "Storm Needler"   "Gauss"
"46"   "Hurricane"   "Squall"   ""   ""   "Storm Needler"   "Mjolnir"
"46"   "Hurricane"   "Squall"   ""   ""   ""   "Gauss"
"46"   "Hurricane"   "Squall"   ""   ""   ""   "Mjolnir"
"46"   "Hurricane"   "Locust"   ""   ""   "Gauss"   "Hellbore"
"46"   "Hurricane"   "Locust"   ""   ""   "Gauss"   "Storm Needler"
"46"   "Hurricane"   "Locust"   ""   ""   "Mark IX"   "Mjolnir"
"46"   "Hurricane"   "Locust"   ""   ""   "Mark IX"   "Hellbore"
"46"   "Hurricane"   "Locust"   ""   ""   "Mjolnir"   "Mark IX"
"46"   "Hurricane"   "Locust"   ""   ""   "Hellbore"   "Gauss"
"46"   "Hurricane"   "Locust"   ""   ""   "Storm Needler"   "Gauss"
"46"   "Hurricane"   "Hurricane"   ""   ""   "Mark IX"   "Hellbore"
"46"   "Hurricane"   "Hurricane"   ""   ""   "Hellbore"   "Mark IX"
"46"   "Hurricane"   ""   ""   ""   "Gauss"   "Mjolnir"
"46"   "Hurricane"   ""   ""   ""   "Mark IX"   "Mjolnir"
"46"   "Hurricane"   ""   ""   ""   "Mjolnir"   "Gauss"
"46"   ""   "Squall"   ""   ""   "Gauss"   "Mark IX"
"46"   ""   "Squall"   ""   ""   "Mark IX"   "Gauss"
"46"   ""   "Squall"   ""   ""   "Mjolnir"   "Mjolnir"
"46"   ""   "Hurricane"   ""   ""   "Gauss"   "Mjolnir"
"46"   ""   "Hurricane"   ""   ""   "Mark IX"   "Mjolnir"
"46"   ""   "Hurricane"   ""   ""   "Mjolnir"   "Gauss"
"47"   "Squall"   "Squall"   ""   ""   "Gauss"   "Hephaestus"
"47"   "Squall"   "Squall"   ""   ""   "Gauss"   "Storm Needler"
"47"   "Squall"   "Squall"   ""   ""   "Gauss"   ""
"47"   "Squall"   "Squall"   ""   ""   "Hephaestus"   "Gauss"
"47"   "Squall"   "Squall"   ""   ""   "Storm Needler"   "Gauss"
"47"   "Squall"   "Squall"   ""   ""   ""   "Gauss"
"47"   "Squall"   ""   ""   ""   "Gauss"   "Mjolnir"
"47"   "Locust"   "Squall"   ""   ""   "Mjolnir"   "Hellbore"
"47"   "Locust"   "Squall"   ""   ""   "Hellbore"   "Mjolnir"
"47"   "Locust"   "Hurricane"   ""   ""   "Gauss"   "Hephaestus"
"47"   "Locust"   "Hurricane"   ""   ""   "Gauss"   ""
"47"   "Locust"   "Hurricane"   ""   ""   "Hephaestus"   "Gauss"
"47"   "Locust"   "Hurricane"   ""   ""   ""   "Gauss"
"47"   "Hurricane"   "Locust"   ""   ""   "Gauss"   "Hephaestus"
"47"   "Hurricane"   "Locust"   ""   ""   "Gauss"   ""
"47"   "Hurricane"   "Locust"   ""   ""   "Hephaestus"   "Gauss"
"47"   "Hurricane"   "Locust"   ""   ""   ""   "Gauss"
"47"   ""   "Squall"   ""   ""   "Gauss"   "Mjolnir"
"48"   "Locust"   "Squall"   ""   ""   "Hellbore"   "Mark IX"
"49"   "Squall"   ""   ""   ""   "Gauss"   "Hellbore"
"49"   "Squall"   ""   ""   ""   "Mjolnir"   "Gauss"
"49"   "Squall"   ""   ""   ""   "Hellbore"   "Gauss"
"49"   "Locust"   "Squall"   ""   ""   "Mark IX"   "Hellbore"
"49"   "Locust"   "Locust"   ""   ""   "Gauss"   "Hephaestus"
"49"   "Locust"   "Locust"   ""   ""   "Gauss"   ""
"49"   "Locust"   "Locust"   ""   ""   "Hephaestus"   "Gauss"
"49"   "Locust"   "Locust"   ""   ""   ""   "Gauss"
"49"   "Locust"   "Hurricane"   ""   ""   "Hellbore"   "Mark IX"
"49"   "Hurricane"   "Locust"   ""   ""   "Hellbore"   "Mark IX"
"49"   ""   "Squall"   ""   ""   "Gauss"   "Hellbore"
"49"   ""   "Squall"   ""   ""   "Mjolnir"   "Gauss"
"49"   ""   "Squall"   ""   ""   "Hellbore"   "Gauss"
"50"   "Squall"   "Squall"   ""   ""   "Mjolnir"   "Storm Needler"
"50"   "Squall"   "Squall"   ""   ""   "Storm Needler"   "Mjolnir"
"50"   "Squall"   "Locust"   ""   ""   "Gauss"   "Hephaestus"
"50"   "Squall"   "Locust"   ""   ""   "Gauss"   "Storm Needler"
"50"   "Squall"   "Locust"   ""   ""   "Gauss"   ""
"50"   "Squall"   "Locust"   ""   ""   "Hephaestus"   "Gauss"
"50"   "Squall"   "Locust"   ""   ""   "Storm Needler"   "Gauss"
"50"   "Squall"   "Locust"   ""   ""   ""   "Gauss"
"52"   "Squall"   ""   ""   ""   "Mark IX"   "Mark IX"
"52"   "Squall"   ""   ""   ""   "Mark IX"   "Mjolnir"
"52"   ""   "Squall"   ""   ""   "Mark IX"   "Mark IX"
"52"   ""   "Squall"   ""   ""   "Mark IX"   "Mjolnir"
"53"   "Locust"   ""   ""   ""   "Gauss"   "Gauss"
"53"   ""   "Locust"   ""   ""   "Gauss"   "Gauss"
"55"   "Locust"   "Locust"   ""   ""   "Gauss"   "Storm Needler"
"55"   "Locust"   "Locust"   ""   ""   "Storm Needler"   "Gauss"
"57"   "Locust"   "Locust"   ""   ""   "Mark IX"   "Hephaestus"
"57"   "Locust"   "Locust"   ""   ""   "Mark IX"   "Storm Needler"
"57"   "Locust"   "Locust"   ""   ""   "Mark IX"   ""
"57"   "Locust"   "Locust"   ""   ""   "Hephaestus"   "Mark IX"
"57"   "Locust"   "Locust"   ""   ""   "Storm Needler"   "Mark IX"
"57"   "Locust"   "Locust"   ""   ""   ""   "Mark IX"
[close]

By the way, I forgot to subtract shield upkeep from the Dominator, so assume the Dominator has 20 flux vents (not unreasonable) rather than 0 for the above calculations to be exactly correct.

As a result of these analyses, upgraded my fleet to Squall-Squall-Harpoon-Harpoon-Gauss-Gauss or -Mjolnir-Mjolnir. Very satisfied with results.
Spoiler
(https://i.postimg.cc/sfhHFqVT/badpiloting.jpg)
[close]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 12, 2022, 11:04:09 AM
Oh yeah, re left vs right: I like putting the guns on the left so its the same as on an Odyssey in terms of flying.

For AI Conquests, I tend to make sure there are an even number of right-facing and left-facing ones.

Since the Odyssey's guns are on the left, it tends to drift toward the right part of the map as my fleet advances on the enemy fleet. So when there are multiple ones, they tend to all clump up together and then block each other's line of fire (plus, the ones in the back prevent the ones in the front from backing off to vent). Two is about the maximum you can have before they clump up and start blocking each other, so the marginal value of that 3rd Odyssey is pretty low.

So if I have multiple Conquests, I'll make sure some face the right, and some face the left, so that they naturally drift toward opposite sides of the battlefield as my fleet advances.

For player-piloted Conquest, I prefer guns on the right, because...chances are my fleet has an AI Odyssey with its guns pointing to the left :)

I'm still going to go with the Squall for the range and combination with Hellbores, but now I'm really curious about which is objectively the superior choice. Anybody have any ideas how this could be tested empirically, like simulations of fleet combat?

Best thing to do is to use the Detailed Combat Results (https://fractalsoftworks.com/forum/index.php?topic=11551.0) mod which is invaluable for looking at real-world damage numbers. I have different saves for this purpose, against a standard single Ordos, against a standard double Ordos, and against a standard triple Ordos. Those standard Ordos fleets were chosen for how closely their ship compositions matched the average Ordos fleet, and these saves allow me to test out different fleet compositions and weapon loadouts to evaluate how well they work. I also use the Additional Search Commands (https://fractalsoftworks.com/forum/index.php?topic=23024.0) mod, in particular its "cloneship" command, to quickly make multiple copies of a given ship configuration to test with. For me personally Ordos fleets are what matter and hence I base my fleet compositions around them, it's up to the individual player to decide what they want to test against.

After one Squall salvo the Dominator will have 1125 armor remaining. Used in pairs, after two Squall salvos the Dominator will have 750 armor remaining. It will take a total of 4 salvos (65 missiles) to penetrate Dominator armor.

Yes and no. First remember that it's unlikely that every single missile (or any weapon) will hit, much less hit in the exact same spot. Also, the inner/outer armor cell mechanic is more complicated, because the outer cells only have half of their armor value count, but they also only have half of the damage applied to them. So 60% of the damage gets applied to the 9 inner cells, while 40% of the damage gets applied to the 12 outer cells. Thus, after the first Squall salvo, yes the Squalls will have done a total of 375 damage to armor. But only half of that 40% of damage that was applied to the outer cells will count toward the armor value that the missile shots "see". So after the first salvo, it will look like the Dominator still had 1200 armor, i.e. 300 damage done. In fact until the weapon starts breaking through armor (which happens on the inner cells first) and starts hitting hull, this "80% of damage" assumption is mathematically valid.

For a weapon (Squall) doing 250 damage per shot, 250 hit strength, kinetic damage, against a target (Dominator) with 1500 armor, it starts hitting hull on the 73rd shot, and armor is fully stripped away on the 101st shot, at which point it'll display 2100 cumulative armor damage, 1903 cumulative hull damage. It then does 156.25 damage to hull per shot, so it takes an additional 78 shots to remove the rest of the Dominator's 14k hull, for a total of 179 shots needed after shields. At 61.5 shots per minute, that's around 175 seconds to kill after shields.

For a weapon (Locust) doing 200 damage per shot, 200 hit strength, frag damage, against a target (Dominator) with 1500 armor, it starts hitting hull on the 200th shot, and armor is fully stripped away on the 325th shot, at which point it'll display 2100 cumulative armor damage, 3613 cumulative hull damage. It then does 80 damage to hull per shot, so it takes an additional 130 shots to remove the rest of the Dominator's 14k hull, for a total of 455 shots needed after shields. At 270 shots per minute, that's around 101 seconds to kill after shields.

The biggest problem though is accounting for the shields. Targets won't really recover much flux when shields are up, since this is all hard flux, so it's really more like, when they drop shields to take damage on armor/hull is when they're recovering their flux, then they raise it again at low health until they overload, then they die. So that complicates the "clean room" simulation. Obviously Squalls will dominate on shields.

In practice Squalls virtually always come out ahead because of their anti-shield damage, at least versus Ordos (which are very shield-heavy), so in practice I'll virtually always mount Squalls over Hurricanes or Locusts.

Also, in practice, high damage per shot weapons such as Gauss or Mjolnir are still decent against armor and hull even though they don't specialize in them. The problem with mounting something like the Hellbore is that it's only good for one thing but takes up a weapon slot that could've been used toward something else. So in practice, Gauss or Mjolnir works out well. My general go-to is Mjolnir. If I'm manually piloting, I'll sometimes use Hephaestus Assault Gun on manual control if I have enough anti-shield, only firing on ships at high flux, so that I can overflux my ship a bit more for higher damage output.

Another consideration that works well for the Gauss is that if you're able to keep the enemy far away, then it's a long range fight so you don't have to spend as much flux defending yourself, so that helps with your overall flux efficiency.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 12, 2022, 11:54:21 AM
Huh. I'm pretty sure I can add armor cells to the simulation. But first I need to understand the math. How exactly does it work? What is the exact proportion of damage going to hull?

In general if you have n cells contributing 1/n armor and each cell takes 1/n damage, and additionally m cells contributing 1/m armor and each cell takes 1/m damage, then if the first set of cells takes a damage and the second set takes b damage, the sum of damage to the first set of cells is just a/n*n=a and the reduction in armor is a/n*(a/n)/(1/n+a/n) = a/n*(a/(1+a)) so the total reduction across cells is n*(a/n)*etc. And you can perform the same calculations for b, so the total damage is still a+b and the armor behaves like a homogeneous block IF all weapons hit the exact same spot.

So it appears the above is incorrect though. But where? Apparently at least there is some hull damage going through even at incomplete penetration?

For shields, I just assumed they can be instantly flicked on and off, in which case hard and soft flux are equivalent, and that the ship won't overload itself. The results seem reasonable enough (see graph) even though the model is rough.

-Con't. Ok, I think I get it. Thanks for the excellent post. Found some more information in https://fractalsoftworks.com/forum/index.php?topic=22331.0. So let's instead assume the impacts are spread over 6 adjacent cells of armor in a line. The weapons target the middle cell, but also hit other cells with a normal distribution such that one SD is the width of one cell. Then the distribution of the damage is given by
R code to generate distribution
a <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.021,0.136,0.341,0.341,0.136,0.021)
for (i in 1:6) {
a[,i:(i+4)] <- a[,i:(i+4)]+b*normaldistpoints
}
[close]
Distribution
      [,1]        [,2]        [,3]       [,4]       [,5]       [,6]       [,7]        [,8]        [,9] [,10]
[1,] 0e+00 0.000700000 0.005233333 0.01660000 0.02726667 0.02726667 0.01660000 0.005233333 0.000700000 0e+00
[2,] 7e-04 0.005933333 0.021833333 0.04456667 0.05976667 0.05976667 0.04456667 0.021833333 0.005933333 7e-04
[3,] 7e-04 0.005933333 0.021833333 0.04456667 0.05976667 0.05976667 0.04456667 0.021833333 0.005933333 7e-04
[4,] 7e-04 0.005933333 0.021833333 0.04456667 0.05976667 0.05976667 0.04456667 0.021833333 0.005933333 7e-04
[5,] 0e+00 0.000700000 0.005233333 0.01660000 0.02726667 0.02726667 0.01660000 0.005233333 0.000700000 0e+00
[close]

Now each cell has 1/15 armor HP, so initial armor HP for a Dominator is
Spoiler
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0  100  100  100  100  100  100  100  100     0
[2,]  100  100  100  100  100  100  100  100  100   100
[3,]  100  100  100  100  100  100  100  100  100   100
[4,]  100  100  100  100  100  100  100  100  100   100
[5,]    0  100  100  100  100  100  100  100  100     0
[close]
.

And cell armor contributions match the damage distribution.

Let's say it gets hit by a Hellbore shot. Then the armor hp loss looks on average like hpmatrix-damage*damagematrix*damage*damagematrix/(damage*damagematrix+armormatrix), so

Armor HP after hellbore hit
       [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]  [,10]
[1,]    NaN 99.98900 99.42364 94.98402 87.98157 87.98157 94.98402 99.42364 99.98900    NaN
[2,] 99.989 99.26621 91.82878 72.79798 56.82838 56.82838 72.79798 91.82878 99.26621 99.989
[3,] 99.989 99.26621 91.82878 72.79798 56.82838 56.82838 72.79798 91.82878 99.26621 99.989
[4,] 99.989 99.26621 91.82878 72.79798 56.82838 56.82838 72.79798 91.82878 99.26621 99.989
[5,]    NaN 99.98900 99.42364 94.98402 87.98157 87.98157 94.98402 99.42364 99.98900    NaN
[close]

So the total (average) damage dealt was 662 damage, rather than the naively expected 750*2*750*2/(1500+750*2)=750.

Now to build this into the code. I can also account for the inability to dissipate hard flux by not letting the shields regenerate on any seconds when shield damage was taken. The assumption is the enemy will not overload itself but will drop shields instead if it were overloaded by blocking.

Edit: alright, it is done. Script now handles armor as a matrix, letting damage through to hull when a cell reaches 0 and also does not let the enemy regenerate shields while taking damage. Because we are using a normal distribution for the damage instead of simulation, we'll decide whether to use the 5% minimum armor rule by taking a probability weighted average of the remaining armor matrix and seeing if it is at least 5%.
R code
library(ggplot2)
library(ggthemes)

armordamagematrix <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.022,0.136,0.341,0.341,0.136,0.022)
for (i in 1:6) {
  armordamagematrix[,i:(i+4)] <- armordamagematrix[,i:(i+4)]+b*normaldistpoints
}

armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,useminarmor,startingarmor) {
  if(useminarmor == 0){
  if(armor == 0) {return (damage)}
  return(damage*(max(0.15,damage/(damage+armor))))
  }
  else{
  return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
  }
}

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1.33,1.33,1.33)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")

weapon1 <- locust
weapon2 <- locust
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- dummy
weapon6 <- dummy

shieldblock <- 0

damageattimepoint <- function(weapon, timepoint) c(unlist(weapon[1])*unlist(weapon[3])[timepoint %% length(unlist(weapon[3]))], unlist(weapon[2]))

timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
  #are we using shield to block?
  shieldblock <- 0
  if(hullhp > 0){} else {shieldhp <- 0}
  useminarmor <- 0
  #are we using the 5% minimum armor rule? deduce this by applying a weighted average of armor
  if(weighted.mean(armormatrix,armordamagematrix) <= startingarmor/15*0.05){useminarmor <- 1}
 
  #1. shields. if shieldhp is sufficient, use shield to block
  if (weapon1[[4]] !=""){
  weapon1mult <- unlist(weapon1[2])
  if (shieldhp > damageattimepoint(weapon1, timepoint)[1]*weapon1mult){
    shieldhp <- shieldhp - damageattimepoint(weapon1, timepoint)[1]*weapon1mult
    shieldhp <- max(shieldhp, 0)
    if(damageattimepoint(weapon1,timepoint)[1] > 0) {shieldblock <- 1}
  } else {
    #if you did not use shield to block, regenerate flux
    #2. armor and hull
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult

          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
   
  }
  }
  #repeat for other weapons
  if (weapon2[[4]] != ""){
  weapon2mult <- unlist(weapon2[2])
  if (shieldhp > damageattimepoint(weapon2, timepoint)[1]*weapon2mult){
    shieldhp <- shieldhp - damageattimepoint(weapon2, timepoint)[1]*weapon2mult
    shieldhp <- max(shieldhp, 0)
    if(damageattimepoint(weapon2,timepoint)[1] > 0) {shieldblock <- 1}
  } else {
    if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
    #2.1. damage armor and hull
    hulldamage <- 0   
   
    for (j in 2:9){
      for (i in 2:4){
        hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
       
        armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
      }}
    for (j in 2:9){
      for (i in c(1,5)){
        hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
        armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
      }}
    for (j in c(1,10)){
      for (i in 2:4){
        hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
        armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
      }}
    hullhp <- hullhp - hulldamage
    hullhp <- max(hullhp, 0)
   
    armorhp <- sum(armormatrix)/(46/15)
    if(hullhp==0) armorhp <- 0
   
  }
  }
 
  if (weapon3[[4]] != ""){
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > damageattimepoint(weapon3, timepoint)[1]*weapon3mult){
      shieldhp <- shieldhp - damageattimepoint(weapon3, timepoint)[1]*weapon3mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon3,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon4[[4]] != ""){
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > damageattimepoint(weapon4, timepoint)[1]*weapon4mult){
      shieldhp <- shieldhp - damageattimepoint(weapon4, timepoint)[1]*weapon4mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon4,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon5[[4]] != ""){
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > damageattimepoint(weapon5, timepoint)[1]*weapon5mult){
      shieldhp <- shieldhp - damageattimepoint(weapon5, timepoint)[1]*weapon5mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon5,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon6[[4]] != ""){
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > damageattimepoint(weapon6, timepoint)[1]*weapon6mult){
      shieldhp <- shieldhp - damageattimepoint(weapon6, timepoint)[1]*weapon6mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon6,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
  return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}

totaltime = 200

#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)

armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0



timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))

for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
  shieldhp <- state[[2]]
  armorhp <- state[[3]]
  hullhp <- state[[4]]
  flux <- shieldmax - shieldhp
  armormatrix <- state[[8]]
  if(hullhp == 0){flux <- 0}
  timeseriesarray <- rbind(timeseriesarray , c(state[[1]], flux/shieldmax*100, state[[3]]/startingarmor*100, state[[4]]/ship[1]*100))
 
}

colnames(timeseriesarray) <-  c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))


ggplot(timeseriesarray, aes(x=Time)) + theme_tufte() +
  geom_line(aes(y = Flux, color = "Flux")) +
  geom_line(aes(y = Armor, color="Armor")) +
  geom_line(aes(y = Hull, color="Hull")) +
  scale_colour_manual("",
                      breaks = c("Flux", "Armor", "Hull"),
                      values = c("lightsteelblue", "red", "maroon")) +
  ylab("% max") +
  xlab("Time (s)") +
  labs(title=weaponstitle)


[close]

It turns out that this was extremely significant for evaluating the performance of the Locust.

 Here are some graphs, again vs Dominator:
(https://i.postimg.cc/hPfBLbxF/image.png)(https://i.postimg.cc/nLTRSNb3/image.png)(https://i.postimg.cc/fLcxg99D/image.png)

And the results for best combo of weapons to kill Dominators with are in. I did NOT expect this.

Locust power
"Timetokill"   "Weapon1"   "Weapon2"   "Weapon3"   "Weapon4"   "Weapon5"   "Weapon6"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"12"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"12"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   ""
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   ""   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   ""
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   ""
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   ""
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   ""   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   ""   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   ""   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Hephaestus"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Storm Needler"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Mark IX"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Hephaestus"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Storm Needler"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   ""
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   ""
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   ""
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   ""   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   ""   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   ""   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Mjolnir"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Hellbore"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Hephaestus"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Storm Needler"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Hephaestus"   "Gauss"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Storm Needler"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"15"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"15"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"15"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"15"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"15"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"16"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"16"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"16"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"16"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Locust"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Hellbore"
"16"   "Locust"   "Locust"   "Harpoon"   ""   "Hellbore"   "Mjolnir"
"16"   "Locust"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Hellbore"
"16"   "Locust"   "Locust"   ""   "Harpoon"   "Hellbore"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   ""
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hellbore"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hellbore"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hephaestus"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hephaestus"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hephaestus"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Storm Needler"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Storm Needler"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Storm Needler"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"16"   "Locust"   "Hurricane"   "Harpoon"   ""   "Mjolnir"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Hephaestus"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Storm Needler"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Hellbore"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Mark IX"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Hellbore"
"16"   "Locust"   "Hurricane"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Locust"   "Hurricane"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Locust"   "Hurricane"   ""   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Locust"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Locust"   ""   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   ""
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   ""   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Hephaestus"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Storm Needler"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Hellbore"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mark IX"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Hellbore"
"16"   "Hurricane"   "Locust"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   ""
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   ""
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   ""
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Hephaestus"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Storm Needler"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Mjolnir"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Hellbore"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   ""   "Gauss"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   ""   "Mark IX"
"16"   "Hurricane"   "Hurricane"   "Sabot"   "Harpoon"   ""   "Mjolnir"
"16"   ""   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"16"   ""   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
[close]

The top combinations for killing Brilliants are:
Spoiler
"Timetokill"   "Weapon1"   "Weapon2"   "Weapon3"   "Weapon4"   "Weapon5"   "Weapon6"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"10"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"10"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"10"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"10"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"10"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"10"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"10"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"10"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"10"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"10"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"10"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   ""
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"11"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   ""   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   ""
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hephaestus"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mjolnir"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   "Sabot"   ""   "Gauss"
"11"   "Squall"   "Locust"   "Harpoon"   ""   "Gauss"   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   ""
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hephaestus"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mjolnir"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Harpoon"   ""   "Gauss"
"11"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Squall"   "Locust"   ""   "Harpoon"   "Gauss"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Hephaestus"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Storm Needler"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   ""
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Hephaestus"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Storm Needler"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mjolnir"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hephaestus"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Storm Needler"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mark IX"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Mjolnir"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Storm Needler"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mark IX"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Storm Needler"   "Mjolnir"
"11"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   ""   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   ""
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Hephaestus"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   "Mjolnir"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   "Sabot"   ""   "Gauss"
"11"   "Locust"   "Squall"   "Harpoon"   ""   "Gauss"   "Gauss"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   ""
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Hephaestus"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   "Mjolnir"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"11"   "Locust"   "Squall"   "Sabot"   "Harpoon"   ""   "Gauss"
"11"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Locust"   "Squall"   ""   "Harpoon"   "Gauss"   "Gauss"
"11"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"11"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"11"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"11"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"11"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"11"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"11"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"11"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"11"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"11"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Mark IX"
"11"   "Locust"   "Locust"   "Harpoon"   ""   "Mark IX"   "Gauss"
"11"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"11"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"11"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"11"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"11"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"11"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Locust"   "Locust"   ""   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"11"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"11"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"11"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"11"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"11"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"11"   "Locust"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"11"   "Locust"   ""   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"11"   "Locust"   ""   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Locust"   ""   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"11"   "Locust"   ""   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Locust"   ""   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Locust"   ""   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Locust"   ""   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Locust"   ""   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"11"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"11"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hellbore"
"11"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"11"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"11"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Gauss"
"11"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"11"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hellbore"
"11"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"11"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"11"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Gauss"
"11"   ""   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"11"   ""   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"11"   ""   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mjolnir"
"11"   ""   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"11"   ""   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Gauss"
"11"   ""   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"11"   ""   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mjolnir"
"11"   ""   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"11"   ""   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Gauss"
"12"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"12"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"12"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"12"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"12"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"12"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Storm Needler"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Hephaestus"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Hellbore"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Hephaestus"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Storm Needler"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   ""
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mjolnir"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Hephaestus"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Storm Needler"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   ""
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   ""   "Hephaestus"
"12"   "Squall"   "Locust"   "Harpoon"   "Sabot"   ""   "Storm Needler"
"12"   "Squall"   "Locust"   "Harpoon"   ""   "Mark IX"   "Hephaestus"
"12"   "Squall"   "Locust"   "Harpoon"   ""   "Mark IX"   "Storm Needler"
"12"   "Squall"   "Locust"   "Harpoon"   ""   "Hephaestus"   "Mark IX"
"12"   "Squall"   "Locust"   "Harpoon"   ""   "Storm Needler"   "Mark IX"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Storm Needler"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Hephaestus"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Hellbore"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Hephaestus"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Storm Needler"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   ""
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mjolnir"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Hephaestus"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Storm Needler"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   ""
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   ""   "Hephaestus"
"12"   "Squall"   "Locust"   "Sabot"   "Harpoon"   ""   "Storm Needler"
"12"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"12"   "Squall"   "Locust"   ""   "Harpoon"   "Mark IX"   "Hephaestus"
"12"   "Squall"   "Locust"   ""   "Harpoon"   "Mark IX"   "Storm Needler"
"12"   "Squall"   "Locust"   ""   "Harpoon"   "Hephaestus"   "Mark IX"
"12"   "Squall"   "Locust"   ""   "Harpoon"   "Storm Needler"   "Mark IX"
"12"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"12"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"12"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Hellbore"
"12"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   ""
"12"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Mjolnir"
"12"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   ""   "Mjolnir"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Hellbore"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Storm Needler"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Mjolnir"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Hephaestus"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   "Hellbore"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   "Hephaestus"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   "Storm Needler"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   ""
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   "Mjolnir"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   "Hephaestus"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   "Storm Needler"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   ""
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   ""   "Hephaestus"
"12"   "Locust"   "Squall"   "Harpoon"   "Sabot"   ""   "Storm Needler"
"12"   "Locust"   "Squall"   "Harpoon"   ""   "Mark IX"   "Hephaestus"
"12"   "Locust"   "Squall"   "Harpoon"   ""   "Mark IX"   "Storm Needler"
"12"   "Locust"   "Squall"   "Harpoon"   ""   "Hephaestus"   "Mark IX"
"12"   "Locust"   "Squall"   "Harpoon"   ""   "Storm Needler"   "Mark IX"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Hellbore"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Storm Needler"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Mjolnir"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Hephaestus"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   "Hellbore"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   "Hephaestus"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   "Storm Needler"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   ""
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   "Mjolnir"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   "Hephaestus"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   "Storm Needler"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   ""
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   ""   "Hephaestus"
"12"   "Locust"   "Squall"   "Sabot"   "Harpoon"   ""   "Storm Needler"
"12"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"12"   "Locust"   "Squall"   ""   "Harpoon"   "Mark IX"   "Hephaestus"
"12"   "Locust"   "Squall"   ""   "Harpoon"   "Mark IX"   "Storm Needler"
"12"   "Locust"   "Squall"   ""   "Harpoon"   "Hephaestus"   "Mark IX"
"12"   "Locust"   "Squall"   ""   "Harpoon"   "Storm Needler"   "Mark IX"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"12"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"13"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"13"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"13"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"13"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Hellbore"
"13"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Hephaestus"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Hephaestus"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   "Storm Needler"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Hephaestus"   ""
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Hephaestus"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   "Storm Needler"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   "Storm Needler"   ""
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   ""   "Hephaestus"
"13"   "Squall"   "Locust"   "Harpoon"   "Harpoon"   ""   "Storm Needler"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hephaestus"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Storm Needler"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   ""
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Storm Needler"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   ""
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   ""   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   "Sabot"   ""   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Gauss"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Gauss"   "Hephaestus"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Mark IX"   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Mark IX"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Hellbore"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Hephaestus"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Mjolnir"   "Storm Needler"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Hellbore"   "Gauss"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Hellbore"   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Hephaestus"   "Gauss"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Hephaestus"   "Mjolnir"
"13"   "Squall"   "Locust"   "Harpoon"   ""   "Storm Needler"   "Mjolnir"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hephaestus"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Storm Needler"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   ""
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Hellbore"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Storm Needler"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   ""
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Mark IX"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Mark IX"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Hellbore"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   ""   "Mjolnir"
"13"   "Squall"   "Locust"   "Sabot"   "Harpoon"   ""   "Hellbore"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Hephaestus"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Storm Needler"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Mjolnir"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Mjolnir"
"13"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Mjolnir"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Gauss"   "Hellbore"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Gauss"   "Hephaestus"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Mark IX"   "Mjolnir"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Mjolnir"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Hellbore"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Hephaestus"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Mjolnir"   "Storm Needler"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Hellbore"   "Gauss"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Hellbore"   "Mjolnir"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Hephaestus"   "Gauss"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Hephaestus"   "Mjolnir"
"13"   "Squall"   "Locust"   ""   "Harpoon"   "Storm Needler"   "Mjolnir"
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   ""
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hellbore"   "Hephaestus"
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   "Hephaestus"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   "Harpoon"   ""   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Hephaestus"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Storm Needler"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Mjolnir"   ""
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   "Storm Needler"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hellbore"   ""
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Hephaestus"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   "Storm Needler"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   ""   "Mjolnir"
"13"   "Locust"   "Squall"   "Harpoon"   "Sabot"   ""   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Gauss"   "Mjolnir"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Gauss"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Gauss"   "Hephaestus"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Gauss"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Hellbore"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Hephaestus"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Mjolnir"   "Storm Needler"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Hellbore"   "Gauss"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Hellbore"   "Mjolnir"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Hephaestus"   "Gauss"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Hephaestus"   "Mjolnir"
"13"   "Locust"   "Squall"   "Harpoon"   ""   "Storm Needler"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Hephaestus"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Storm Needler"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Mjolnir"   ""
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Hellbore"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   "Storm Needler"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hellbore"   ""
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Hephaestus"   "Mark IX"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   "Mark IX"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   "Storm Needler"   "Hellbore"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   ""   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Harpoon"   ""   "Hellbore"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Hephaestus"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Storm Needler"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Hephaestus"   "Mjolnir"
"13"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Storm Needler"   "Mjolnir"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Gauss"   "Hellbore"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Gauss"   "Hephaestus"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Hellbore"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Hephaestus"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Mjolnir"   "Storm Needler"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Hellbore"   "Gauss"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Hellbore"   "Mjolnir"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Hephaestus"   "Gauss"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Hephaestus"   "Mjolnir"
"13"   "Locust"   "Squall"   ""   "Harpoon"   "Storm Needler"   "Mjolnir"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Harpoon"   "Hellbore"   "Gauss"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Locust"   "Harpoon"   "Sabot"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Locust"   "Harpoon"   ""   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Harpoon"   "Hellbore"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Hellbore"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mark IX"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Hephaestus"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Mjolnir"   "Storm Needler"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Mjolnir"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Gauss"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Mark IX"
"13"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Mjolnir"
"13"   "Locust"   "Locust"   ""   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Gauss"   ""
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   "Sabot"   ""   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   ""   "Gauss"   "Gauss"
"13"   "Locust"   "Hurricane"   "Harpoon"   ""   "Gauss"   "Mark IX"
"13"   "Locust"   "Hurricane"   "Harpoon"   ""   "Mark IX"   "Gauss"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Gauss"   ""
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"13"   "Locust"   "Hurricane"   "Sabot"   "Harpoon"   ""   "Gauss"
"13"   "Locust"   "Hurricane"   ""   "Harpoon"   "Gauss"   "Gauss"
"13"   "Locust"   "Hurricane"   ""   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Locust"   "Hurricane"   ""   "Harpoon"   "Mark IX"   "Gauss"
"13"   "Locust"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Locust"   ""   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"13"   "Locust"   ""   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"13"   "Locust"   ""   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mark IX"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Gauss"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Hephaestus"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   "Storm Needler"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Gauss"   ""
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mjolnir"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Hephaestus"   "Gauss"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   "Storm Needler"   "Gauss"
"13"   "Hurricane"   "Locust"   "Harpoon"   "Sabot"   ""   "Gauss"
"13"   "Hurricane"   "Locust"   "Harpoon"   ""   "Gauss"   "Gauss"
"13"   "Hurricane"   "Locust"   "Harpoon"   ""   "Gauss"   "Mark IX"
"13"   "Hurricane"   "Locust"   "Harpoon"   ""   "Mark IX"   "Gauss"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Gauss"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Hephaestus"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   "Storm Needler"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Gauss"   ""
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mjolnir"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Hephaestus"   "Gauss"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   "Storm Needler"   "Gauss"
"13"   "Hurricane"   "Locust"   "Sabot"   "Harpoon"   ""   "Gauss"
"13"   "Hurricane"   "Locust"   ""   "Harpoon"   "Gauss"   "Gauss"
"13"   "Hurricane"   "Locust"   ""   "Harpoon"   "Gauss"   "Mark IX"
"13"   "Hurricane"   "Locust"   ""   "Harpoon"   "Mark IX"   "Gauss"
"13"   ""   "Locust"   "Harpoon"   "Harpoon"   "Gauss"   "Mark IX"
"13"   ""   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Gauss"
"13"   ""   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mark IX"
"13"   ""   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mark IX"
"14"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"14"   "Squall"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"14"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"14"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"14"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"14"   "Locust"   "Hurricane"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"14"   "Locust"   ""   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"14"   "Locust"   ""   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"14"   "Locust"   ""   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"14"   "Locust"   ""   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"14"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"14"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"14"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mark IX"   "Mjolnir"
"14"   "Hurricane"   "Locust"   "Harpoon"   "Harpoon"   "Mjolnir"   "Mark IX"
"14"   ""   "Locust"   "Harpoon"   "Sabot"   "Mark IX"   "Mjolnir"
"14"   ""   "Locust"   "Harpoon"   "Sabot"   "Mjolnir"   "Mark IX"
"14"   ""   "Locust"   "Sabot"   "Harpoon"   "Mark IX"   "Mjolnir"
"14"   ""   "Locust"   "Sabot"   "Harpoon"   "Mjolnir"   "Mark IX"
"15"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Gauss"   "Mark IX"
"15"   "Squall"   "Squall"   "Harpoon"   "Sabot"   "Mark IX"   "Gauss"
"15"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Gauss"   "Mark IX"
"15"   "Squall"   "Squall"   "Sabot"   "Harpoon"   "Mark IX"   "Gauss"
"15"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Gauss"
"15"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Gauss"   "Mjolnir"
"15"   "Squall"   "Squall"   "Sabot"   "Sabot"   "Mjolnir"   "Gauss"
"15"   "Squall"   "Locust"   "Harpoon"   ""   "Gauss"   "Storm Needler"
"15"   "Squall"   "Locust"   "Harpoon"   ""   "Storm Needler"   "Gauss"
"15"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Hephaestus"
"15"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Gauss"   "Storm Needler"
"15"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"15"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Hephaestus"   "Gauss"
"15"   "Squall"   "Locust"   "Sabot"   "Sabot"   "Storm Needler"   "Gauss"
"15"   "Squall"   "Locust"   ""   "Harpoon"   "Gauss"   "Storm Needler"
"15"   "Squall"   "Locust"   ""   "Harpoon"   "Storm Needler"   "Gauss"
"15"   "Squall"   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Squall"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Squall"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"15"   "Squall"   ""   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"15"   "Locust"   "Squall"   "Harpoon"   ""   "Gauss"   "Storm Needler"
"15"   "Locust"   "Squall"   "Harpoon"   ""   "Storm Needler"   "Gauss"
"15"   "Locust"   "Squall"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"15"   "Locust"   "Squall"   ""   "Harpoon"   "Gauss"   "Storm Needler"
"15"   "Locust"   "Squall"   ""   "Harpoon"   "Storm Needler"   "Gauss"
"15"   "Locust"   "Locust"   "Sabot"   "Sabot"   "Hellbore"   "Gauss"
"15"   "Hurricane"   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   "Hurricane"   ""   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   ""   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
"15"   ""   "Squall"   "Harpoon"   "Harpoon"   "Gauss"   "Mjolnir"
"15"   ""   "Squall"   "Harpoon"   "Harpoon"   "Mjolnir"   "Gauss"
"15"   ""   "Hurricane"   "Harpoon"   "Harpoon"   "Gauss"   "Gauss"
[close]


One more analysis: what if you just don't know what you're facing and are too lazy to figure out a combo? Which weapons are generally best? To solve this, I ran the analyses for Tempest, Hammerhead, Brilliant and Onslaught. Then computed time divided by average time to kill the ship, and summed time values by weapon. Yielding a weapon total score (lower is better ie. means the weapon appears more often earlier in the table). Only comparable within groups.

Best weapons overall
      [Name]            [Total score]              
 [1,] "Squall"        "14083.913945038"
 [2,] "Locust"        "17314.4987742282"
 [3,] "Hurricane"     "17749.5872807338"
 [4,] "Sabot"         "24892.0870271849"
 [5,] "Harpoon"       "24255.9129728151"
 [6,] "Gauss"         "7899.61820082352"
 [7,] "Mark IX"       "7911.18763682106"
 [8,] "Hellbore"      "8103.78176570459"
 [9,] "Hephaestus"    "8454.36403774929"
[10,] "Mjolnir"       "8288.8835490106"
[11,] "Storm Needler" "8490.16480989094"
[close]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 13, 2022, 12:25:15 PM
Well, I'm glad to hear that my choice of two Locusts, which was done almost entirely for aesthetic and OCD reasons, turned out to also be pretty effective.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 14, 2022, 02:53:09 AM
I think it'd be helpful to run some back-of-the-envelope calculations on the numbers first. Ignoring the burst nature of some of the weapons, taking the 2x Locust 2x Harpoon Gauss HAG setup, it looks to be around 1723 DPS vs shields (450 Locusts, 333 Harpoons, 700 Gauss, 240 HAG), so shields would take around 5.8 seconds to drop. Then assuming no remaining armor, with 75 residual armor for hit strength calculations, it looks to be around 2008 DPS vs hull (720 Locusts, 634 Harpoons, 288 Gauss, 366 HAG), so it would take around 7 seconds to get rid of hull. So that's around 13 seconds already, and that ignores the time it takes to remove armor, and how much shields might regen.

Similarly, if it were 2x Squall instead of 2x Locust, that's 2297 DPS vs shields (1024 Squalls, 333 Harpoons, 700 Gauss, 240 HAG), so shields would take around 4.4 seconds to drop. Then 1608 DPS vs hull (320 Squalls, 634 Harpoons, 288 Gauss, 366 HAG), so around 8.7 seconds to get rid of hull. So around 13.1 seconds there. Neither Locust nor Squall are good at anti-armor, so the bulk of the anti-armor would be from the other weapons.

So in either case you should expect around 13 seconds for initial shields plus hull, then add on however much time it takes for the shields that regen, and then add on the time it takes for armor.

So while I can appreciate the effort, the problem is that the calculations don't match up with experience. If you use those loadouts against a SIM Dominator (with the weapons removed so it doesn't flux itself up), it usually takes around 22-28 seconds to kill regardless of 2x Squall 2x Harpoon Gauss HAG or 2x Locust 2x Harpoon Gauss HAG. This is from results using Detailed Combat Results, since Gauss is once per 2 seconds and HAG is 4 shots per second (but not every shot will hit), which makes them relatively reliable for timing how long it takes to kill a target. It was basically near the beginning of the second Squall burst (noting that each burst takes 19.5 seconds), or near the end of the third Locust burst (noting that each burst takes 8.9 seconds).

I'm seeing around 15k of total shield damage, around 8-9k of total armor damage, and of course 14k of total hull damage. The 15k of total shield damage implies that the Dominator has its shields down for around 10 seconds total during the exchange to regenerate flux. The 8-9k of total armor damage implies that the shots are hitting a band of armor around 17 cells wide (noting that each cell is 100 hp, so each column of cells is 500 hp deep). The visible portion of the Dominator is 12 cells wide so this roughly matches.

In general though the enemy will be firing weapons and thus driving up its own flux to an extent (as well as your own ship). So paper calculations or simulation results won't be that applicable to actual battles. They're useful for getting a rough idea of how well the weapons perform, but it becomes more accurate to look at actual combat results.

[attachment deleted by admin]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 14, 2022, 03:34:13 AM
Those back of the envelope calculations seem very reasonable. Let's compare it to the model.
(https://i.ibb.co/z4J8TJm/image.png)

In the model, the opponent drops shields at 4 seconds (lets in a hit earlier already to not overload), raising them again later. And the time to kill is 13 seconds. I'd say that is very encouraging. Note that the model also accounts for the bursty nature of the weapons, while the back of the envelope does not. For example, in the model, the Locusts fire 80 missiles in the first 4 seconds, then are inactive for 5 seconds, as in the game but which distinction is lost while using flat DPS. This is probably why the shields drop faster here. The model was also correct vs. your double locust calculation earlier.

The model will still obviously be inaccurate regardless, or rather an oversimplication, spherical cow. The most glaring differences are
- No point defense
- No chance of weapons missing or the enemy rotating
- Weapons hit instantly without travel time
- Shields can be flickered on and off every second
- The opponent will not overload their shields under any circumstances
- No officer skills, no capacitors or vents

Because of this, the time to kill will be (much) longer in real combat. And real combat data is obviously highly preferable. However, it's also impossible to do what this model is trying to do by simulating. If you were to simulate all of the weapons space explored vs 4 ships, you'd require 4*3*2*6 = 144 simulations just to get 1 trial of each combination. And considering that you probably would want a large number of trials of each combination to make statistically sound arguments, it seems humanly impossible without writing custom software to emulate Starsector.

You could make the argument that if you accept that the above oversimplifications affect all weapons roughly equally (this is debatable) then conclusions about weapon superiority are still valid even though the model has spherical cows.

I'll post some new results about the weapon space shortly.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 14, 2022, 05:14:51 AM
Alright so I'll double post just for clarity, the thread is on the top anyway. I figured that the previous test was not comprehensive enough at all. For example, even though Mark IX and Squall scored best, it seems foolish to recommend that anyone kit their ship with 2x Mark IX 2x Squall if going against an unknown opponent. The Mark IX's score probably comes from combinations with other weapons. So here are results about the choice of weapons more generally, vs. a larger sample of ships, also testing for combinations.

I tested weapons against the following ships: Tempest, Brawler (LP), Vanguard, Glimmer, Enforcer, Hammerhead, Medusa, Fulgent, Dominator, Champion, Aurora, Brilliant, Onslaught, Conquest, Paragon (no Fortress Shield) and Radiant, ie. 1 reasonably dangerous ship from each tech tier and size. Necessarily a little subjective but on the other hand it seems like it would be foolish to test vs ships that are not particularly difficult to kill or dangerous.

The results are presented in the format of how much faster that weapon kills the enemy ship vs. the median weapon of the category, on average, when the other equipment is random. Calculation of the statistic is spoilered below
Methods
Simulate the time to kill for all ships using the time series (armor matrix) approach with all combinations of the weapons. Calculate mean of time to kill by ship for each weapon/weapon combination. Divide by mean time to kill that ship for all weapons. Calculate an average of the previous across all ships for each weapon/weapon combination. Calculate 1/previous -1. Convert to %. Sort. All weapon slots were always filled. The following outliers were excluded: Hurricane-Hurricane-Harpoon-Harpoon-Hellbore-Hellbore vs. Radiant or Paragon, which never resulted in a kill despite being given 4x higher time than other combinations.
[close]
R
#please excuse my atrocious programming style in this one

weaponnames <- c("Squall", "Locust", "Hurricane", "Sabot", "Harpoon", "Gauss", "Mark IX", "Hellbore", "Hephaestus", "Mjolnir", "Storm Needler")
shipnames <- c("tempest", "vanguard", "brawlerlp", "glimmer", "enforcer", "hammerhead", "medusa", "fulgent", "dominator", "champion", "aurora", "brilliant", "onslaught", "conquest", "paragon", "radiant")
lmnames <- c("Squall", "Locust", "Hurricane")
mrmnames <- c("Sabot", "Harpoon")
gunnames <- c("Gauss", "Mark IX", "Hellbore", "Hephaestus", "Mjolnir", "Storm Needler")
lmcolumns <- c(1,2)
mrmcolumns <- c(3,4)
guncolumns <- c(5,6)

filename <- function(x) paste("optimizeweaponsbytime", shipnames
  • , ".txt", sep="")

readfile <- function(filename) read.csv(filename, sep = "\t")

shiparray <- lapply(1:length(shipnames), function(x) readfile(filename(x)))

timemean <- function(ship,wpnname) mean(ship[which(ship==wpnname, arr.ind=TRUE)[,1],1])/mean(ship[,1])
xycontains <- function(ship,wpnname,row,column) if(ship[row,column]==wpnname) {return(TRUE)} else {return(FALSE)}
xypair <- function(ship,wpnnamea,wpnnameb,row,columna,columnb) if((xycontains(ship,wpnnamea,row,columna) | xycontains(ship,wpnnamea,row,columnb)) & (xycontains(ship,wpnnameb,row,columna) | xycontains(ship,wpnnameb,row,columnb))) {return(TRUE)} else {return(FALSE)}
pairtimemean <- function(ship,wpnnamea,wpnnameb,columna,columnb){
  localsum <- 0
  increment <- 0
  #calculate the mean time for this pair to kill the ship
  for (h in 1:length(ship[,1])){
    if(xypair(ship,wpnnamea,wpnnameb,h,columna,columnb)){
      localsum <- localsum + ship[h,1]
      increment <- increment + 1
    }
  }
  return(localsum/(increment*mean(ship[,1])))
}


doublepairtimemean <- function(ship,wpnnamea,wpnnameb,wpnnamec,wpnnamed,columna,columnb,columnc,columnd){
  localsum <- 0
  increment <- 0
  for (h in 1:length(ship[,1])){
    if(xypair(ship,wpnnamea,wpnnameb,h,columna,columnb)){
      if(xypair(ship,wpnnamec,wpnnamed,h,columnc,columnd))
      localsum <- localsum + ship[h,1]
      increment <- increment + 1
    }
  }
  return(localsum/(increment*mean(ship[,1])))
}



timearray <- function(gunnames){
  pairarray <- data.frame()
  for(i in 1:length(gunnames)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        localsum <- localsum + (timemean(shiparray[[k]],gunnames))
      }
      pairarray <- (rbind(pairarray, c(gunnames,(localsum/length(shipnames)))))
   
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  colnames(pairarray) <- c("Weapon", "Score")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. score")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  print(pairarray)
}

pairtimearray <- function(gunnames,columna,columnb){
  pairarray <- data.frame()
  for(i in 1:length(gunnames)){
    for(j in 1:length(gunnames)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        #calculate the average time for these weapons to kill the ship
        localsum <- localsum + (pairtimemean(shiparray[[k]],gunnames,gunnames[j],columna,columnb))

      }
      pairarray <- (rbind(pairarray, c(paste(gunnames,gunnames[j]),(localsum/length(shipnames)))))
     
    }
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  colnames(pairarray) <- c("Weapon", "Score")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. score")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  print(pairarray)
}

twopairtimearray <- function(gunnames,gunnamesb,columna,columnb,columnc,columnd){
  pairarray <- data.frame()
  for(i in 1:length(gunnames)){
    for(j in 1:length(gunnames)){
      for(l in 1:length(gunnamesb))
        for(m in 1:length(gunnamesb)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        localsum <- localsum + (doublepairtimemean(shiparray[[k]],gunnames,gunnames[j],gunnamesb[l],gunnamesb[m],columna,columnb,columnc,columnd))
      }
      pairarray <- (rbind(pairarray, c(paste(gunnames,gunnames[j],gunnamesb[l],gunnamesb[m]),(localsum/length(shipnames)))))
        }
    }
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  colnames(pairarray) <- c("Weapon", "Score")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. score")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  print(pairarray)
}

#example
pairtimearray(lmnames,2,3)
[close]

Results retracted, see below for results with bugs fixed

You might argue that you don't need to consider which guns are best for killing lighter ships, since those die anyway. So here is an analysis of capital ships (Onslaught, Conquest, Paragon, Radiant) only.
Results retracted, see below for results with bugs fixed


Vanshilar was specifically interested in killing Ordos, so here are the results from the simulation.
Results retracted, see below for results with bugs fixed


Overall conclusions
1. Alex has done an incredible job of balancing the weapons. No single weapon dominates when considered vs. all ship sizes and tiers. A 9.4% or even a 14.4% (for Gauss vs. capital ships) difference in average time to kill is far from dominating. Furthermore, as far as the guns go, the higher rarity weapons are slightly but not overwhelmingly better than the lower rarity weapons. I'm very impressed.
2. Probably as a result of the above, weapon combinations have a much more significant effect than choice of single weapons. I think this is another example of excellent game design as it rewards thought and skill. For example, the Hellbore appears to generally somewhat underperform many other weapons. However, in some combinations Hellbore overperforms instead.
3. Generally speaking, despite specific weapons not having an overall advantage vs. all ships, kinetics overperform vs harder targets. Though this was not specifically analyzed, probably by inversion, HE overperforms vs targets whose shields are more easily overloaded. So even though capships have a lot of armor, shields seem to be the deciding factor, despite averaging across tech levels. Of course, this does not account for heavy armor hull mod and officer skills, which might make the difference in the real game.
4. The Locust is a very interesting one, in that it does not appear to be particularly strong by itself, but is part of some strong combos. This is likely due to its ability to strip hull from a damaged ship.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 14, 2022, 10:20:36 AM
3. Generally speaking, despite specific weapons not having an overall advantage vs. all ships, kinetics overperform vs harder targets. Though this was not specifically analyzed, probably by inversion, HE overperforms vs targets whose shields are more easily overloaded. So even though capships have a lot of armor, shields seem to be the deciding factor, despite averaging across tech levels. Of course, this does not account for heavy armor hull mod and officer skills, which might make the difference in the real game.

I generally try to split loadouts on my ship equally between KI and HE but overall I tend towards HE. There are several reasons for this but the big one is that enemy will usually build up flux just by shooting at you. Default AI ship fits don't pay much(any?) attention to flux balance - i.e. weapon flux + shield flux is way higher than dissipation - so theoretically even if you don't shoot at enemy shields at all they will eventually overflux themselves anyway. Furthermore HE damage on shields is simply halved while KI damage on hull is halved and then a subject to further reduction from armor.

Officer skills are huge - it's easy to get lost in the 0.6 flux/damage shield and forget that the Radiant has as much armor as a Dominator and as much hull as an Onslaught. And since it's captained by an Alpha AI core it also has 8/14 = ~57% chance for either Impact Mitigation or Polarized Armor and ~32% chance for BOTH. Anyone who ran Brawler LPs against Ordo can attest that it takes a lot less time to make a Radiant drop its shields than it does to actually blow it up - and that is despite the typical Brawler LP fit having more HE DPS than KI DPS(Assault Chaingun's 500 vs. Heavy Machine Gun's 320)
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Thaago on October 14, 2022, 11:21:02 AM
This is a really fascinating series of simulations CapnHector! And I also applaud your post where you point out the limitations vs real gameplay - that really helps in interpreting the results and how they can be applied.

I think its interesting that in general you found HE weapons to underperform (mildly) vs many of the hardest enemies, but at the same time one of the biggest differences between your simulations and in game combat is armor damage being spread among different regions, both by the enemy turning and also by weapon inaccuracy. Looking at the posts in this thread, Vanshillar calculated that punching a clean hole in a dominator was 2.1k total armor damage, while their tests shower 8-9k damage vs a gunless but defending itself ship - a factor of 4 in total damage is a pretty big difference! It's also going to depend on the physical size of the target ship, as larger ships have more total armor cells.

I would be very interested if you could rerun your results vs the Dominator with some sort of armor fudge factor (maybe based on ship class to account for hull size for a more general situation?) to account for spreading damage around multiple cells.

[Edit] Also the most shocking of the results here for me is the Storm Needler rating poorly despite range not being considered! Speculations?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Hiruma Kai on October 14, 2022, 11:48:07 AM
[Edit] Also the most shocking of the results here for me is the Storm Needler rating poorly despite range not being considered! Speculations?

Needler is poor against both armor and hull (due to residual armor).  Its claim to fame is its extreme efficiency and good shield DPS.  Flux efficiency is not considered in these simulations since the firing ship is treated as having infinite flux (which might be true of a Conquest just firing 2 large weapons to be honest).  25 armor penetration is going to fall flat against capital tier residual armor (5% * 1500 = 75), so that 500 DPS drops to 125 DPS against capital hull.  Even a Mark IX has ~199 DPS against capital hull, roughly 60% more DPS.

If you did this same test with the flux dissipation of an Dominator, you might come to a different conclusion.  Also, if the ship is allowed to back off or trade places with other ships, so shields get more than a few vent cycles in.  In the case of zero to full destruction with no stop in between, shields only provide a fraction of their typical value as renewable hit points.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 14, 2022, 02:38:59 PM
Because of this, the time to kill will be (much) longer in real combat. And real combat data is obviously highly preferable. However, it's also impossible to do what this model is trying to do by simulating.

The thing is, the model should still be accurate (to the extent possible) to the simple simulation conditions that it's under here, in this case, firing on a single SIM Dominator with the given stats that's not firing back, before generalizing it to a wider range of conditions (i.e. different weapons and different targets). That's just part of validating the model. Yet the model predicts that the Dominator dies at the end of the 2nd Locust volley (about 13 seconds), while in simulation it dies at the end of the 3rd Locust volley (about 22 seconds in the model's timing). That's a significant error that should be addressed.

For example, 2 Locusts, at a total of 20 missiles per second doing 200 frag damage each, will do 20 * 200 * 50/(50+75) = 1600 DPS vs hull while they're active. (The way it works is that against hull, weapons still have the hit strength as if they're hitting the residual 5% of armor, and that includes kinetic/HE/frag multipliers, so in this case their hit strength against hull is 200/4 = 50.) So that's a total of 6400 damage to hull during the 4-second burst. For the 2 Gauss, it would be 2 * 700 * 350/(350+75) = 1153 total damage, then 0 for the next second.

So during the Locust's second volley, at seconds 10 through 13 (after the Harpoon volley on the 9th second -- by the way, the Harpoon's cycle time is actually every 9 seconds, not every 8 in your model, since there's a 0.25 second delay between missiles during its 4-missile burst), the Locusts and Gauss shots should do a total of 4*1600 + 2*1153 = 8706 damage to hull. And that's assuming all of it goes to hull, ignoring the portion that goes toward armor and the portion that goes toward shields. The Harpoons are at cooldown at this point so they don't contribute here.

Yet in your 2x Locust 2x Harpoon 2x Gauss model, it shows that after the Harpoon volley, there's around 65% of hull left, or around 9100 HP. Somehow the Locusts and Gauss shots by themselves (Harpoons are on cooldown here) were able to get rid of 9100 hull, plus 40% of armor, plus any remaining flux, in that span, even though they shouldn't even be able to take out just the remaining hull at that point. So there's something there in the model that's overestimating the damage done.

By the way, the way the damage goes through armor into hull behaves "as you'd expect":
1. When a shot hits armor/hull, the total armor in each of the cells is summed (each of the 9 inner cells contribute their full value, while each of the 12 outer cells contribute half their armor value), noting that at the beginning of the fight, each cell is given 1/15 of the base armor value shown on the refit screen.
2. The hit strength calculation is then applied against this summed armor value (noting that the weapon's hit strength is /2 if kinetic, *2 if HE, /4 if frag), with a minimum of 5% of the base armor rating in case the armor remaining was less than that amount.
3. Then, the damage is proportioned out to each cell, with each of the inner cells receiving 1/15 of that damage, while each of the outer cells receive 1/30 of that damage. For each individual cell, the damage is first applied toward armor (with the damage /2 if kinetic, *2 if HE, /4 if frag). If the armor is removed, any remaining amount gets applied to the ship's hull, at 100% of the damage value. Note that all damage types are defined with respect to 100% to hull damage.
3a. As a corollary, even if all cells have no armor remaining, i.e. the weapon is purely hitting hull at this point, the hit strength calculation is still carried out, at 5% of the base armor rating. So higher weapon hit strength is still useful even after armor is gone, because the hit strength is always "as if hitting armor" even if there's no armor left. This prevents frag weapons like Vulcans from doing too much damage to hull against ships that had high armor.

Vanshilar was specifically interested in killing Ordos, so here are the results from the simulation.

By the way, thus far, my data is that the typical Ordos fleet will have 1.7 Radiants, 5.5 Brilliants, 4.2 Scintillas, 5.5 Fulgents, 4.1 Glimmers, and 3.7 Lumens.

1. Alex has done an incredible job of balancing the weapons. No single weapon dominates when considered vs. all ship sizes and tiers. A 9.4% or even a 14.4% (for Gauss vs. capital ships) difference in average time to kill is far from dominating. Furthermore, as far as the guns go, the higher rarity weapons are slightly but not overwhelmingly better than the lower rarity weapons. I'm very impressed.

Oh yes no doubt about it. For example testing HVD vs Heavy Autocannon vs Heavy Needler on my manually-piloted Onslaught, the difference from Detailed Combat Results is usually less than 10-20%, even though they have very different ranges, damage outputs, and flux efficiencies. It really depends on how aggressively I was burn driving into the enemy fleet on any given run. So which weapon is "best" depends on the player's personal playstyle, which is as it should be. (Shorter range has more DPS and is more flux efficient, but means you take more damage from the enemy, so it's higher risk higher reward, while longer range is the opposite.) That's part of the fun of the game, trying out different weapon combinations and seeing what works best for the player.

3. Generally speaking, despite specific weapons not having an overall advantage vs. all ships, kinetics overperform vs harder targets.

That's probably because harder targets have more shields and more flux regeneration. Each stage of damage is basically a gate to the next stage, i.e. you have to get through their shields first, then you have to get through their armor, then you have to get through their hull, in that order. Sometimes you can get around it by positioning (i.e. targeting their exposed engines) but in general this is how it'll work. So if a loadout is lacking in anti-shield, it'll have a tough time getting through that first stage in the first place before it can get to the later stages. And even while it's trying to take out the armor and hull, the shields will still flicker on, so it's something that the loadout contends with throughout the fight.

I generally try to split loadouts on my ship equally between KI and HE but overall I tend towards HE.

I tend toward kinetic weapons with good average DPS and flux efficiency and HE/frag weapons with good burst DPS. This is because at the beginning stages of the fight, both ships are basically just sitting there, trading their flux (increasing their own flux to increase the other ship's flux even more), so burst DPS isn't as important if there are multiple volleys, but you want to be efficient on your flux usage. However, once one ship (hopefully the enemy's) starts getting high in flux, then it starts backing off, and you want to kill it before it can get away or retreat behind other ships. So you need to have good burst DPS against armor and hull to capitalize on that window of opportunity. If you let them get away, then you have to burn through their shields all over again, which is a lot of wasted effort.

I think this is best exemplified by the fleet that I've found with the best time-to-kill record against double Ordos and triple Ordos thus far, me manually piloting an Onslaught XIV while the rest of the fleet is Gryphons using Squalls/Harpoons/Breach/HVD. The Gryphons provide good "general" damage, especially against shields and lesser targets, but I will burn drive in to kill larger targets as needed. My Onslaught XIV weapon loadout is 2 TPCs (duh), 5 HVDs, 4 Light Needlers with Ballistic Rangefinder, Devastators on the sides, Hephaestus for the middle large, and...4 Proximity Charge Launchers to provide burst damage as well as anti-missile coverage to my front.

Most of the time I'm basically just drifting forward as needed, firing my regular (non-Prox) weapons, but when I encounter a Brilliant or especially a Radiant I'll burn drive forward into their face, launching everything including the Prox (although for flux purposes I'll turn off the HAG until their flux gets high). With Missile Spec providing +50% rate of fire and +10% missile damage on a weapon that's normally 500 HE DPS at one shot per second, this amounts to 4*1.5*1.1*500 = 3300 HE DPS at 550 HE hit strength from just the Prox alone. If we combine it with the other weapons (except TPC which may be out of charges at this point), against a Radiant's bare hull (1500 base armor), this amounts to about 4183 DPS, which will burn through a Radiant's hull in less than 5 seconds. (Yes, while the Radiant will likely have officer bonuses, so do I, so I'm assuming they all come out in the wash for now.) Against shields, ignoring the HAG but including the TPC, the burst DPS is roughly 7000 DPS, reduced to 4200 DPS due to the Radiant's 0.6 shield efficiency.

Basically these are such massive numbers due to the Prox (which contributes 1650 anti-shield DPS, 6600 DPS at 1100 hit strength against armor depending on their armor amount, and then 3089 DPS against bare hull) that half the time the Radiant will simply overload from receiving too much burst damage too quickly, or even when it doesn't, it doesn't get a chance to jump away before dying. So it means that I can quickly kill off the Radiants and not have to worry about them jumping away to recover.

(By the way, this doesn't mean that the Prox is the solution to everything; most of the time it sits idle and thus contributes 0 DPS, I had to get Expanded Missile Racks to make it last long enough, plus Missile Spec, so it's very expensive. Also, this strategy relies on the rest of the fleet clearing the other ships away from the Radiant so that I don't get surrounded, because if I do, I'll likely die, so the rest of the fleet is an important factor here.)

Thus far the average time to kill according to Detailed Combat Results is around 407 seconds (6.8 minutes) for a triple Ordos, with the best at 383 seconds (6.4 minutes), using this Onslaught with 10 Gryphons. For a double Ordos, it's been around 378 seconds (6.3 minutes), with the best at 333 seconds (5.5 minutes), using this Onslaught with 6 Gryphons. Now, this is battle time, but I use the SpeedUp mod to play it at 2x speed (since I don't have to do any intricate arcade-style maneuvering), so the battle time is actually half of this. While I do spend some time giving commands, I get 13.4 million XP (so, 13.4 SP) for the triple Ordos and 8.5 million XP (so, 8.5 SP) for the double Ordos, so I get significantly more than 60 SP per playing hour this way. Basically I haven't found a faster XP-gaining fleet, and it's due in large part to the burst HE damage that Prox provides.

Furthermore HE damage on shields is simply halved while KI damage on hull is halved and then a subject to further reduction from armor.

No, kinetic does full damage to hull. Their hit strength is cut in half as if they were targeting armor, though.

And since it's captained by an Alpha AI core it also has 8/14 = ~57% chance for either Impact Mitigation or Polarized Armor and ~32% chance for BOTH.

I'm not convinced that the enemy core officer skills are randomly selected; thus far, what I've observed is:
* Cores always have Helmsmanship, Impact Mitigation, and Energy Weapon Mastery.
* Generally, the 4th skill will be Combat Endurance.
* Then the 5th and 6th skills (i.e. Beta) will be Target Analysis and Gunnery Implants.
* Then the 7th and 8th skills (i.e. Alpha) will be Damage Control and Field Modulation.
* Radiants with Alpha Cores tend to have Polarized Armor instead of Combat Endurance.

I haven't really seen cores with Point Defense, Ballistic Mastery, Systems Expertise, Missile Specialization, nor Ordnance Expertise in the latest patch. Maybe I looked at too few fleets (too small of a sample). But at any rate, I don't think each skill is equally likely to show up.

This is a really fascinating series of simulations CapnHector! And I also applaud your post where you point out the limitations vs real gameplay - that really helps in interpreting the results and how they can be applied.

I think the toughest part is actually accounting for the burst nature of some weapons, and accounting for how armor is calculated, both of which CapnHector's model does. In comparison, adjusting for things like the size of the target or that it's maneuvering is relatively easy, by estimating from real-world results (i.e. Detailed Combat Results data). For example, the size of the target can be adjusted by changing the width of the armor, i.e. how many columns of armor are being simulated. If the target is smaller, then the width is smaller, and any shot that goes too far to the left or to the right is considered a miss (does zero damage). Target maneuvering and weapon inaccuracy can be abstractly modeled as increasing the width of the normal distribution (i.e. the standard deviation). The actual values can be estimated from experimental results.

So it's a matter of, as the model gradually gets refined, it gradually becomes more accurate at predicting real-world results. But I think the hardest part is actually already done basically.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 14, 2022, 06:50:46 PM
Does this analysis consider the flux cost and OP cost of weapons? Gauss and Mjolnir have higher damage output because they also have much higher flux cost.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 15, 2022, 01:13:56 AM
I think this is best exemplified by the fleet that I've found with the best time-to-kill record against double Ordos and triple Ordos thus far, me manually piloting an Onslaught XIV while the rest of the fleet is Gryphons using Squalls/Harpoons/Breach/HVD.

Not the first time I see Gryphons praised but from my experience Gryphon AI is absolutely suicidal which does not pair well with the Gryphon's weak tank.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 15, 2022, 01:22:40 AM
I would be very interested if you could rerun your results vs the Dominator with some sort of armor fudge factor (maybe based on ship class to account for hull size for a more general situation?) to account for spreading damage around multiple cells.

[Edit] Also the most shocking of the results here for me is the Storm Needler rating poorly despite range not being considered! Speculations?

Uhm, first of all, the storm needler suffered from an incorrect modulo operation in the damage over time function causing it to deal very little damage compared to what it should have, which I missed in testing due to not manually checking the cycle of that weapon specifically. Very sorry and thanks for noticing it. I'll re-run all the results in a moment. The weapons most affected are Storm Needler and Hephaestus.

The main problem with the armor fudge is how to implement such an armor fudge factor. For example, if I just increase armor HP by a factor of 4, then that also increases damage reduction. I'll discuss this in a bit more detail in my reply to Vanshilar below, but I think a reasonable rough estimate could be given by implementing armor "regeneration" to compensate for the ship turning at a rate such that the TTK is increased by a factor of 2, so maybe 1/6th of the starting armor / second. This is actually not even enough, since the most effective combos took the ship out at 17 seconds now, but it'll probably illustrate the effects.

As expected, the armor regenerating significantly changes the results, making HE more valuable. (here the code is fixed so we can see the Storm Needler is actually a decent though not great weapon).
vs Dominator

> timearray(lmnames)
     Weapon Avg. score
2    Locust      10.0%
3 Hurricane       0.0%
1    Squall      -8.7%
> timearray(mrmnames)
   Weapon Avg. score
2 Harpoon       7.7%
1   Sabot      -6.7%
> timearray(gunnames)
         Weapon Avg. score
5       Mjolnir      10.5%
4    Hephaestus       4.5%
6 Storm Needler       1.4%
1         Gauss      -1.4%
2       Mark IX      -2.5%
3      Hellbore      -4.0%
> pairtimearray(lmnames,2,3)
               Weapon Avg. score
5       Locust Locust       7.9%
6    Locust Hurricane       7.8%
9 Hurricane Hurricane       0.8%
2       Squall Locust      -0.7%
1       Squall Squall      -6.1%
3    Squall Hurricane      -6.3%
> pairtimearray(mrmnames,4,5)
           Weapon Avg. score
4 Harpoon Harpoon       2.2%
2   Sabot Harpoon       0.0%
1     Sabot Sabot      -7.2%
> pairtimearray(gunnames,6,7)
                        Weapon Avg. score
23          Hephaestus Mjolnir      11.8%
17            Hellbore Mjolnir       8.8%
29             Mjolnir Mjolnir       8.7%
30       Mjolnir Storm Needler       7.9%
5                Gauss Mjolnir       7.7%
11             Mark IX Mjolnir       4.8%
22       Hephaestus Hephaestus       3.0%
16         Hellbore Hephaestus       2.5%
4             Gauss Hephaestus       1.8%
36 Storm Needler Storm Needler       0.1%
24    Hephaestus Storm Needler       0.0%
10          Mark IX Hephaestus      -0.6%
12       Mark IX Storm Needler      -1.7%
6          Gauss Storm Needler      -1.9%
1                  Gauss Gauss      -2.2%
18      Hellbore Storm Needler      -2.7%
8              Mark IX Mark IX      -3.3%
15           Hellbore Hellbore      -4.1%
2                Gauss Mark IX      -4.3%
3               Gauss Hellbore      -9.7%
9             Mark IX Hellbore     -10.2%
[close]

vs Dominator with regenerating armor
> timearray(lmnames)
     Weapon Avg. score
3 Hurricane      12.0%
2    Locust       0.0%
1    Squall     -15.7%
> timearray(mrmnames)
   Weapon Avg. score
2 Harpoon      28.5%
1   Sabot     -18.2%
> timearray(gunnames)
         Weapon Avg. score
5       Mjolnir      19.5%
4    Hephaestus      11.4%
6 Storm Needler       1.1%
1         Gauss      -1.1%
3      Hellbore      -3.1%
2       Mark IX      -4.5%
> pairtimearray(lmnames,2,3)
               Weapon Avg. score
6    Locust Hurricane      10.2%
9 Hurricane Hurricane       9.2%
3    Squall Hurricane       1.6%
5       Locust Locust      -1.6%
1       Squall Squall     -12.5%
2       Squall Locust     -14.2%
> pairtimearray(mrmnames,4,5)
           Weapon Avg. score
4 Harpoon Harpoon       6.6%
2   Sabot Harpoon       0.0%
1     Sabot Sabot     -22.1%
> pairtimearray(gunnames,6,7)
                        Weapon Avg. score
23          Hephaestus Mjolnir      29.7%
17            Hellbore Mjolnir      16.2%
29             Mjolnir Mjolnir      16.2%
30       Mjolnir Storm Needler      11.6%
16         Hellbore Hephaestus      11.5%
5                Gauss Mjolnir      10.1%
22       Hephaestus Hephaestus       9.1%
11             Mark IX Mjolnir       7.6%
4             Gauss Hephaestus       4.4%
24    Hephaestus Storm Needler       1.5%
10          Mark IX Hephaestus       0.0%
36 Storm Needler Storm Needler      -0.3%
1                  Gauss Gauss      -2.1%
6          Gauss Storm Needler      -2.7%
15           Hellbore Hellbore      -2.9%
18      Hellbore Storm Needler      -4.3%
12       Mark IX Storm Needler      -4.6%
8              Mark IX Mark IX      -4.9%
2                Gauss Mark IX      -6.7%
3               Gauss Hellbore      -9.1%
9             Mark IX Hellbore     -12.0%
[close]

The Storm Needler specifically is great vs shields but comparatively poor at destroying armor and hull as pointed out above.

(https://i.ibb.co/sC1FHZP/image.png)
(https://i.ibb.co/c6KjGMg/image.png)

Does this analysis consider the flux cost and OP cost of weapons? Gauss and Mjolnir have higher damage output because they also have much higher flux cost.

No. Flux is assumed to be infinite (which is somewhat accurate when it comes to the Conquest). If you wish to consider efficiency, then you would be interested in the TTK / cost ratio. Specifically, if the cost of weapon of interest is a and of the median weapon is b, then you should calculate 1/(1/(score+1)*(a/b))-1, which simplifies to (b/a)(x+1)-1. For example if the score of the Mjolnir is +10%, and the median weapon is Storm Needler, then the flux efficiency adjusted score would be (350/667)(1+0.1)-1, so the flux efficiency adjusted score is actually -42% - you are killing 10% faster at almost double the cost. However there is generally a surplus of flux and OP on the Conquest so I'm not particularly concerned about efficiency. The same formula could also be used for range adjusted scores.

(edit: replaced images with images from fixed code. Results are still from bugged code but illustrative)
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 15, 2022, 01:47:05 AM
Because of this, the time to kill will be (much) longer in real combat. And real combat data is obviously highly preferable. However, it's also impossible to do what this model is trying to do by simulating.

The thing is, the model should still be accurate (to the extent possible) to the simple simulation conditions that it's under here, in this case, firing on a single SIM Dominator with the given stats that's not firing back, before generalizing it to a wider range of conditions (i.e. different weapons and different targets). That's just part of validating the model. Yet the model predicts that the Dominator dies at the end of the 2nd Locust volley (about 13 seconds), while in simulation it dies at the end of the 3rd Locust volley (about 22 seconds in the model's timing). That's a significant error that should be addressed.

Thanks for the thoughtful feedback and criticism. This model really should have probably been validated a bit more, see above. Probably a problem stemming from it being just for fun and not being a real research project but this is also one of my weaknesses as a researcher that I tend to get carried away with models and fumble with the "boring" parts TBH. Comparing to simulation results is important. But there are some questions I have about the simulation: is the enemy turning? Is it retreating? Does it have point defense?

There is a big question about what we want to model. For example, the model could be improved by modeling the ship as individual armor matrices with a rotation and speed and range based chance of hitting and damaging them. But does that really improve the comparison? For example are we interested in the best way to kill a rotating ship? If that is what the simulation does, then trying to match the simulation might not be reasonable if we are interested in trying to kill ships that are attacking you. And would including a chance to miss improve generalizability, when this would in practice be a function of range and ship size, so difficult to capture in one human-interpretable number?

For example, 2 Locusts, at a total of 20 missiles per second doing 200 frag damage each, will do 20 * 200 * 50/(50+75) = 1600 DPS vs hull while they're active. (The way it works is that against hull, weapons still have the hit strength as if they're hitting the residual 5% of armor, and that includes kinetic/HE/frag multipliers, so in this case their hit strength against hull is 200/4 = 50.) So that's a total of 6400 damage to hull during the 4-second burst. For the 2 Gauss, it would be 2 * 700 * 350/(350+75) = 1153 total damage, then 0 for the next second.

So during the Locust's second volley, at seconds 10 through 13 (after the Harpoon volley on the 9th second -- by the way, the Harpoon's cycle time is actually every 9 seconds, not every 8 in your model, since there's a 0.25 second delay between missiles during its 4-missile burst), the Locusts and Gauss shots should do a total of 4*1600 + 2*1153 = 8706 damage to hull. And that's assuming all of it goes to hull, ignoring the portion that goes toward armor and the portion that goes toward shields. The Harpoons are at cooldown at this point so they don't contribute here.

I'm not sure what hit strength vs. hull means. Can you elaborate?  From what I understood from the previous thread, for the damage that goes through to hull, the multiplier is not applied, so that's how the model calculates damage. The multiplier is only applied to the proportion blocked by armor.


By the way, the way the damage goes through armor into hull behaves "as you'd expect":
1. When a shot hits armor/hull, the total armor in each of the cells is summed (each of the 9 inner cells contribute their full value, while each of the 12 outer cells contribute half their armor value), noting that at the beginning of the fight, each cell is given 1/15 of the base armor value shown on the refit screen.
2. The hit strength calculation is then applied against this summed armor value (noting that the weapon's hit strength is /2 if kinetic, *2 if HE, /4 if frag), with a minimum of 5% of the base armor rating in case the armor remaining was less than that amount.
3. Then, the damage is proportioned out to each cell, with each of the inner cells receiving 1/15 of that damage, while each of the outer cells receive 1/30 of that damage. For each individual cell, the damage is first applied toward armor (with the damage /2 if kinetic, *2 if HE, /4 if frag). If the armor is removed, any remaining amount gets applied to the ship's hull, at 100% of the damage value. Note that all damage types are defined with respect to 100% to hull damage.
3a. As a corollary, even if all cells have no armor remaining, i.e. the weapon is purely hitting hull at this point, the hit strength calculation is still carried out, at 5% of the base armor rating. So higher weapon hit strength is still useful even after armor is gone, because the hit strength is always "as if hitting armor" even if there's no armor left. This prevents frag weapons like Vulcans from doing too much damage to hull against ships that had high armor.

Thanks for the summary. I'll post here a detailed description of what the model does, since my quickly typed spaghetti code is probably unreadable to others. And let's see if there are any glaring errors. That is really the crux of the issue.

R code, with comments

COMMENT: The next rows define a damage matrix based on the normal distribution, which is used to calculate how cells get damaged. This represents weapon accuracy. Since weapon hits are a binomial distribution, it is appropriate to approximate it by a normal distribution for the average of a large number of hits. The target is the middle, but the hits are spread across 6 cells. The spread figure is a guesstimate and could be calibrated based on simulations.

armordamagematrix <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.022,0.136,0.341,0.341,0.136,0.022)
for (i in 1:6) {
  armordamagematrix[,i:(i+4)] <- armordamagematrix[,i:(i+4)]+b*normaldistpoints
}

COMMENT: this function calculates how armor is damaged. It is passed a parameter about whether to use the 5% rule. Damage can only be reduced by 85%.

armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,useminarmor,startingarmor) {
  if(useminarmor == 0){
  if(armor == 0) {return (damage)}
  return(damage*(max(0.15,damage/(damage+armor))))
  }
  else{
  return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
  }
}

COMMENT: give time cycles for weapons fire based on the game files

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1.33,1.33,1.33)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

COMMENT: create lists of weapons to use later

#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")

COMMENT: Select weapons

weapon1 <- dummy
weapon2 <- dummy
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- mjolnir
weapon6 <- mjolnir

COMMENT: Initialize shield blocking

shieldblock <- 0

COMMENT: the damage is the first item of the weapon list (damage) times the second item of the weapon list (shots / timepoint) modulo cycle length (+1, which was missing). Returns a vector with damage type and damage at that timepoint.

damageattimepoint <- function(weapon, timepoint) c(unlist(weapon[1])*weapon[[3]][timepoint %% (length(weapon[[3]])+1)], unlist(weapon[2]))

COMMENT: Main time series:

timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
  #are we using shield to block?
  shieldblock <- 0
  if(hullhp > 0){} else {shieldhp <- 0}
  useminarmor <- 0
  #are we using the 5% minimum armor rule? deduce this by applying a weighted average of armor
  if(weighted.mean(armormatrix,armordamagematrix) <= startingarmor/15*0.05){useminarmor <- 1}
 
  #1. shields. if shieldhp is sufficient, use shield to block

COMMENT: reduce shield health by blocked amount. If this happens, do not regenerate shield (lower flux) this second.
  if (weapon1[[4]] !=""){
  weapon1mult <- unlist(weapon1[2])
  if (shieldhp > damageattimepoint(weapon1, timepoint)[1]*weapon1mult){
    shieldhp <- shieldhp - damageattimepoint(weapon1, timepoint)[1]*weapon1mult
    shieldhp <- max(shieldhp, 0)
    if(damageattimepoint(weapon1,timepoint)[1] > 0) {shieldblock <- 1}
  } else {
    #if you did not use shield to block, regenerate flux
    #2. armor and hull
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     

COMMENT: For each armor cell: Calculate damage per the probability distribution. First, using current armor, calculate the amount going through to hull by calculating damage adjusted for multiplier vs armor minus armor. Remove the multiplier from this amount and set it aside to remove from hullhp later. Then, reduce armor by armor adjusted weapon damage * multiplier vs armor * cell hit probability

      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult

          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}

Comment: reduce hull.
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
  Comment: calculate total armor for graphing purposes only. The combat calculations happen as matrices.
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
   
  }
  }
  #repeat for other weapons
  if (weapon2[[4]] != ""){
  weapon2mult <- unlist(weapon2[2])
  if (shieldhp > damageattimepoint(weapon2, timepoint)[1]*weapon2mult){
    shieldhp <- shieldhp - damageattimepoint(weapon2, timepoint)[1]*weapon2mult
    shieldhp <- max(shieldhp, 0)
    if(damageattimepoint(weapon2,timepoint)[1] > 0) {shieldblock <- 1}
  } else {
    if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
    #2.1. damage armor and hull
    hulldamage <- 0   
   
    for (j in 2:9){
      for (i in 2:4){
        hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
       
        armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
      }}
    for (j in 2:9){
      for (i in c(1,5)){
        hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
        armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
      }}
    for (j in c(1,10)){
      for (i in 2:4){
        hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
        armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
      }}
    hullhp <- hullhp - hulldamage
    hullhp <- max(hullhp, 0)
   
    armorhp <- sum(armormatrix)/(46/15)
    if(hullhp==0) armorhp <- 0
   
  }
  }
 
  if (weapon3[[4]] != ""){
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > damageattimepoint(weapon3, timepoint)[1]*weapon3mult){
      shieldhp <- shieldhp - damageattimepoint(weapon3, timepoint)[1]*weapon3mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon3,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon4[[4]] != ""){
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > damageattimepoint(weapon4, timepoint)[1]*weapon4mult){
      shieldhp <- shieldhp - damageattimepoint(weapon4, timepoint)[1]*weapon4mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon4,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon5[[4]] != ""){
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > damageattimepoint(weapon5, timepoint)[1]*weapon5mult){
      shieldhp <- shieldhp - damageattimepoint(weapon5, timepoint)[1]*weapon5mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon5,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon6[[4]] != ""){
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > damageattimepoint(weapon6, timepoint)[1]*weapon6mult){
      shieldhp <- shieldhp - damageattimepoint(weapon6, timepoint)[1]*weapon6mult
      shieldhp <- max(shieldhp, 0)
      if(damageattimepoint(weapon6,timepoint)[1] > 0) {shieldblock <- 1}
    } else {
      if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
        }}
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)

      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
  return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}
Comment: maximum running time

totaltime = 150

#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)

armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0



timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))


Comment: iterate time series, reasonably self explanatory
for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
  shieldhp <- state[[2]]
  armorhp <- state[[3]]
  hullhp <- state[[4]]
  flux <- shieldmax - shieldhp
  armormatrix <- state[[8]]
  if(hullhp == 0){flux <- 0}
  timeseriesarray <- rbind(timeseriesarray , c(state[[1]], flux/shieldmax*100, state[[3]]/startingarmor*100, state[[4]]/ship[1]*100))
 
}

colnames(timeseriesarray) <-  c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))

Comment: create plot
ggplot(timeseriesarray, aes(x=Time))  +
  geom_line(aes(y = Flux, color = "Flux")) +
  geom_line(aes(y = Armor, color="Armor")) +
  geom_line(aes(y = Hull, color="Hull")) +
  scale_colour_manual("",
                      breaks = c("Flux", "Armor", "Hull"),
                      values = c("lightsteelblue", "red", "maroon")) +
  ylab("% max") +
  xlab("Time (s)") +
  labs(title=weaponstitle)



[close]

Edit: upon reviewing and commenting the code I found the mistake which was pretty elementary. So in total there were two. The first has to do with R indexing vectors from 1 to n, so to create a cycle over that vector you do not take x modulo vector length but x modulo vector length + 1. Second, the armor hit strength was calculated in bulk vs. all the damage coming in from that weapon that turn. That is incorrect. It should be calculated matrix cell by cell (there should not be a need to do the summation and then division steps mentioned in the step by step, because if you are splitting a damage across n cells that have k armor each, then n*a/n*(a/n)/(a/n+k)=a^2/n(a/n+k)=a^2/(a+nk) so it is the same to calculate it by cell or in bulk). So I moved that to the damage function and made it return a scalar instead of a vector.

The corrected code reads, for the damage functions

Spoiler

shielddamageattimepoint <- function(weapon, timepoint){
  nohits <- weapon[[3]][timepoint %% (length(weapon[[3]]))+1]
  if (nohits == 0) {return(0)} else {
    return(weapon[[1]]*nohits)
  }
}

damageattimepoint <- function(weapon, timepoint, armor, useminarmor, startingarmor, hitx, hity){
  # vectors in R are indexed starting from 1
  nohits <- weapon[[3]][timepoint %% (length(weapon[[3]]))+1]
  if (nohits == 0) {return(0)} else {
    damagesum <- 0
  # for each hit within this 1 second, calculate the proportion of damage allocated to this cell from the matrix, and apply the appropriate armor reduction
    for (i in 1:nohits) {
      damagesum <- damagesum + armordamageselectivereduction(weapon[[1]]*armordamagematrix[hitx,hity],armor,useminarmor,startingarmor)
    }
    return(damagesum)
  }
}

[close]

for the main timeseries

Spoiler

  #1. shields. if shieldhp is sufficient, use shield to block
  if (weapon1[[4]] !=""){
    weapon1mult <- unlist(weapon1[2])
    if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon1,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
      # apply the following to all cells that are not at the corners
      for (j in 2:9){
        for (i in 2:4){
     # hull damage is whatever is left from deducting the armor value from the strength to hit armor, rescale it by the inverse of the multiplier to get base strength
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
     # reduce armor strength by damage to armor
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
# repeat for other weapons
[close]

With these  changes, a result that is more harmonious with your simulations on the game engine and calculations is produced:
(https://i.ibb.co/CMRwHf3/image.png)

So by the calculations time to kill is 16 sec. In the simulation the time for this combo was 22-28 sec. But that also includes weapons missing and projectile travel time and the enemy rotating I presume.

Here are the results with these issues fixed vs Dominator. The Storm Needler turns out to be very good when combined with other weapons when range is discounted.

Spoiler

> timearray(lmnames)
     Weapon Avg. score
2    Locust       2.7%
1    Squall       0.0%
3 Hurricane      -5.2%
> timearray(mrmnames)
   Weapon Avg. score
2 Harpoon       9.5%
1   Sabot      -8.0%
> timearray(gunnames)
         Weapon Avg. score
6 Storm Needler      11.0%
5       Mjolnir       4.5%
4    Hephaestus       0.8%
1         Gauss      -0.8%
2       Mark IX      -8.9%
3      Hellbore     -13.6%
> pairtimearray(lmnames,2,3)
               Weapon Avg. score
2       Squall Locust       5.8%
5       Locust Locust       1.2%
1       Squall Squall       0.5%
3    Squall Hurricane      -0.5%
9 Hurricane Hurricane      -4.8%
6    Locust Hurricane      -5.1%
> pairtimearray(mrmnames,4,5)
           Weapon Avg. score
4 Harpoon Harpoon       3.8%
2   Sabot Harpoon       0.0%
1     Sabot Sabot      -7.7%
> pairtimearray(gunnames,6,7)
                        Weapon Avg. score
24    Hephaestus Storm Needler      13.8%
6          Gauss Storm Needler      13.2%
36 Storm Needler Storm Needler      10.6%
5                Gauss Mjolnir      10.2%
12       Mark IX Storm Needler       6.3%
23          Hephaestus Mjolnir       6.0%
18      Hellbore Storm Needler       4.9%
29             Mjolnir Mjolnir       3.8%
4             Gauss Hephaestus       2.8%
22       Hephaestus Hephaestus       0.8%
1                  Gauss Gauss      -0.8%
11             Mark IX Mjolnir      -1.1%
10          Mark IX Hephaestus      -5.6%
8              Mark IX Mark IX      -8.0%
16         Hellbore Hephaestus      -9.2%
17            Hellbore Mjolnir      -9.4%
2                Gauss Mark IX      -9.6%
15           Hellbore Hellbore     -12.1%
3               Gauss Hellbore     -14.5%
9             Mark IX Hellbore     -19.9%
> twopairtimearray(lmnames,gunnames,2,3,6,7)
                                             Weapon Avg. score
59                 Squall Locust Hephaestus Mjolnir      32.8%
168          Locust Locust Hephaestus Storm Needler      28.8%
149                     Locust Locust Gauss Mjolnir      27.8%
150               Locust Locust Gauss Storm Needler      27.7%
41                      Squall Locust Gauss Mjolnir      26.9%
312    Hurricane Hurricane Hephaestus Storm Needler      26.2%
210          Locust Hurricane Mjolnir Storm Needler      26.1%
40                   Squall Locust Gauss Hephaestus      25.3%
318       Hurricane Hurricane Mjolnir Storm Needler      24.9%
294         Hurricane Hurricane Gauss Storm Needler      24.6%
23                 Squall Squall Hephaestus Mjolnir      24.2%
78             Squall Hurricane Gauss Storm Needler      23.7%
66              Squall Locust Mjolnir Storm Needler      22.2%
162            Locust Locust Hellbore Storm Needler      22.0%
24           Squall Squall Hephaestus Storm Needler      21.9%
6                 Squall Squall Gauss Storm Needler      21.7%
192          Locust Hurricane Mark IX Storm Needler      20.7%
30              Squall Squall Mjolnir Storm Needler      20.4%
5                       Squall Squall Gauss Mjolnir      19.9%
46                 Squall Locust Mark IX Hephaestus      19.2%
156             Locust Locust Mark IX Storm Needler      18.9%
148                  Locust Locust Gauss Hephaestus      17.7%
52                Squall Locust Hellbore Hephaestus      17.1%
54             Squall Locust Hellbore Storm Needler      16.4%
4                    Squall Squall Gauss Hephaestus      16.1%
47                    Squall Locust Mark IX Mjolnir      15.1%
306      Hurricane Hurricane Hellbore Storm Needler      14.9%
48              Squall Locust Mark IX Storm Needler      14.4%
76                Squall Hurricane Gauss Hephaestus      13.7%
18             Squall Squall Hellbore Storm Needler      13.6%
12              Squall Squall Mark IX Storm Needler      13.2%
155                   Locust Locust Mark IX Mjolnir      12.7%
53                   Squall Locust Hellbore Mjolnir      12.4%
39                     Squall Locust Gauss Hellbore      11.2%
311          Hurricane Hurricane Hephaestus Mjolnir       9.9%
11                    Squall Squall Mark IX Mjolnir       9.5%
83                 Squall Hurricane Mark IX Mjolnir       8.7%
154                Locust Locust Mark IX Hephaestus       8.3%
292            Hurricane Hurricane Gauss Hephaestus       7.8%
10                 Squall Squall Mark IX Hephaestus       7.6%
184               Locust Hurricane Gauss Hephaestus       6.4%
16                Squall Squall Hellbore Hephaestus       5.8%
299             Hurricane Hurricane Mark IX Mjolnir       5.5%
191                Locust Hurricane Mark IX Mjolnir       5.3%
203             Locust Hurricane Hephaestus Mjolnir       4.7%
17                   Squall Squall Hellbore Mjolnir       4.3%
74                   Squall Hurricane Gauss Mark IX       3.6%
161                  Locust Locust Hellbore Mjolnir       2.6%
38                      Squall Locust Gauss Mark IX       2.0%
2                       Squall Squall Gauss Mark IX       1.9%
3                      Squall Squall Gauss Hellbore       1.8%
45                   Squall Locust Mark IX Hellbore       1.0%
146                     Locust Locust Gauss Mark IX       0.6%
88             Squall Hurricane Hellbore Hephaestus      -0.6%
89                Squall Hurricane Hellbore Mjolnir      -1.1%
75                  Squall Hurricane Gauss Hellbore      -2.5%
290               Hurricane Hurricane Gauss Mark IX      -4.2%
147                    Locust Locust Gauss Hellbore      -4.5%
196            Locust Hurricane Hellbore Hephaestus      -5.8%
305            Hurricane Hurricane Hellbore Mjolnir      -5.9%
9                    Squall Squall Mark IX Hellbore      -5.9%
304         Hurricane Hurricane Hellbore Hephaestus      -6.1%
197               Locust Hurricane Hellbore Mjolnir      -7.1%
182                  Locust Hurricane Gauss Mark IX      -7.5%
81                Squall Hurricane Mark IX Hellbore      -8.4%
180       Locust Locust Storm Needler Storm Needler      -8.9%
324 Hurricane Hurricane Storm Needler Storm Needler     -11.0%
291              Hurricane Hurricane Gauss Hellbore     -11.2%
153                  Locust Locust Mark IX Hellbore     -11.7%
36        Squall Squall Storm Needler Storm Needler     -13.8%
173                   Locust Locust Mjolnir Mjolnir     -14.0%
297            Hurricane Hurricane Mark IX Hellbore     -14.1%
183                 Locust Hurricane Gauss Hellbore     -15.4%
29                    Squall Squall Mjolnir Mjolnir     -15.8%
166             Locust Locust Hephaestus Hephaestus     -16.4%
22              Squall Squall Hephaestus Hephaestus     -16.6%
189               Locust Hurricane Mark IX Hellbore     -17.5%
145                       Locust Locust Gauss Gauss     -18.4%
1                         Squall Squall Gauss Gauss     -18.9%
317             Hurricane Hurricane Mjolnir Mjolnir     -19.5%
310       Hurricane Hurricane Hephaestus Hephaestus     -22.9%
289                 Hurricane Hurricane Gauss Gauss     -23.1%
8                     Squall Squall Mark IX Mark IX     -24.6%
152                   Locust Locust Mark IX Mark IX     -25.1%
15                  Squall Squall Hellbore Hellbore     -25.7%
159                 Locust Locust Hellbore Hellbore     -27.4%
296             Hurricane Hurricane Mark IX Mark IX     -28.2%
303           Hurricane Hurricane Hellbore Hellbore     -33.0%
216    Locust Hurricane Storm Needler Storm Needler     -54.6%
58              Squall Locust Hephaestus Hephaestus     -54.9%
65                    Squall Locust Mjolnir Mjolnir     -55.7%
108    Squall Hurricane Storm Needler Storm Needler     -55.9%
72        Squall Locust Storm Needler Storm Needler     -56.1%
37                        Squall Locust Gauss Gauss     -57.7%
101                Squall Hurricane Mjolnir Mjolnir     -58.3%
94           Squall Hurricane Hephaestus Hephaestus     -59.4%
73                     Squall Hurricane Gauss Gauss     -59.5%
209                Locust Hurricane Mjolnir Mjolnir     -59.7%
51                  Squall Locust Hellbore Hellbore     -59.9%
44                    Squall Locust Mark IX Mark IX     -60.7%
202          Locust Hurricane Hephaestus Hephaestus     -61.8%
181                    Locust Hurricane Gauss Gauss     -61.9%
80                 Squall Hurricane Mark IX Mark IX     -62.5%
87               Squall Hurricane Hellbore Hellbore     -64.3%
188                Locust Hurricane Mark IX Mark IX     -64.8%
195              Locust Hurricane Hellbore Hellbore     -66.6%
[close]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 15, 2022, 06:19:41 AM
Alright, here are the results from analysis vs. all ships re-done with the issues fixed: glimmer, brawler LP, vanguard, tempest, medusa, hammerhead, enforcer, dominator, fulgent, brilliant, radiant, onslaught, aurora, paragon, conquest, champion included. The previous conclusions are still mostly valid but specifically the Storm Needler turns out to be a power weapon now that the stupid vector modulo issue is fixed. Commentary later after digesting this all a little.

I think the essential conclusions that
- weapons are well balanced
- rarity and weapon effectiveness interact the right way for player enjoyment
- reasonable combos are more important than the individual weapons (see e.g. Hellbore -20.7%, Hellbore Hellbore -20.9% killing speed,  Hellbore Storm Needler +0.0% killing speed, Squall Locust Hellbore Storm Needler +33.9% killing speed).
are still valid.

All weapons vs all ships - killing speed, averaged across ships, vs median weapon/combo in category

Large missiles
     Weapon Avg. score
     Weapon Avg. score
1    Squall      26.6%
2    Locust       0.0%
3 Hurricane     -16.4%
Medium missiles
   Weapon Avg. score
1   Sabot       1.4%
2 Harpoon      -1.3%
Guns
         Weapon Avg. score
6 Storm Needler      20.9%
5       Mjolnir      11.5%
1         Gauss       5.9%
4    Hephaestus      -5.3%
2       Mark IX      -5.7%
3      Hellbore     -20.7%
Pairs of weapons
Large missiles
               Weapon Avg. score
2       Squall Locust      23.9%
1       Squall Squall      18.0%
3    Squall Hurricane       4.3%
5       Locust Locust      -4.0%
9 Hurricane Hurricane     -16.3%
6    Locust Hurricane     -21.4%
Medium missiles
           Weapon Avg. score
1     Sabot Sabot       0.6%
2   Sabot Harpoon       0.0%
4 Harpoon Harpoon      -1.2%
Guns
                        Weapon Avg. score
30       Mjolnir Storm Needler      27.5%
6          Gauss Storm Needler      23.0%
36 Storm Needler Storm Needler      14.9%
5                Gauss Mjolnir      13.9%
12       Mark IX Storm Needler      10.9%
24    Hephaestus Storm Needler       9.3%
29             Mjolnir Mjolnir       6.3%
11             Mark IX Mjolnir       1.9%
1                  Gauss Gauss       1.2%
23          Hephaestus Mjolnir       1.2%
18      Hellbore Storm Needler       0.0%
2                Gauss Mark IX      -3.3%
4             Gauss Hephaestus      -3.5%
22       Hephaestus Hephaestus      -8.3%
8              Mark IX Mark IX      -8.8%
17            Hellbore Mjolnir     -10.6%
10          Mark IX Hephaestus     -13.3%
3               Gauss Hellbore     -17.3%
15           Hellbore Hellbore     -20.9%
16         Hellbore Hephaestus     -24.3%
9             Mark IX Hellbore     -27.6%

Combinations of large missiles x combinations of guns
                                            Weapon Avg. score
42                Squall Locust Gauss Storm Needler      61.8%
66              Squall Locust Mjolnir Storm Needler      60.5%
30              Squall Squall Mjolnir Storm Needler      57.5%
6                 Squall Squall Gauss Storm Needler      54.7%
41                      Squall Locust Gauss Mjolnir      52.2%
48              Squall Locust Mark IX Storm Needler      45.5%
102          Squall Hurricane Mjolnir Storm Needler      45.4%
60           Squall Locust Hephaestus Storm Needler      45.4%
5                       Squall Squall Gauss Mjolnir      44.5%
12              Squall Squall Mark IX Storm Needler      39.1%
78             Squall Hurricane Gauss Storm Needler      39.0%
59                 Squall Locust Hephaestus Mjolnir      38.9%
24           Squall Squall Hephaestus Storm Needler      37.4%
47                    Squall Locust Mark IX Mjolnir      37.3%
174             Locust Locust Mjolnir Storm Needler      36.5%
54             Squall Locust Hellbore Storm Needler      33.9%
38                      Squall Locust Gauss Mark IX      33.3%
150               Locust Locust Gauss Storm Needler      32.6%
40                   Squall Locust Gauss Hephaestus      31.8%
11                    Squall Squall Mark IX Mjolnir      30.4%
23                 Squall Squall Hephaestus Mjolnir      30.3%
77                   Squall Hurricane Gauss Mjolnir      28.8%
18             Squall Squall Hellbore Storm Needler      28.4%
2                       Squall Squall Gauss Mark IX      25.7%
4                    Squall Squall Gauss Hephaestus      24.9%
53                   Squall Locust Hellbore Mjolnir      24.6%
318       Hurricane Hurricane Mjolnir Storm Needler      23.6%
84           Squall Hurricane Mark IX Storm Needler      22.8%
149                     Locust Locust Gauss Mjolnir      22.5%
39                     Squall Locust Gauss Hellbore      20.2%
96        Squall Hurricane Hephaestus Storm Needler      19.6%
156             Locust Locust Mark IX Storm Needler      19.5%
168          Locust Locust Hephaestus Storm Needler      19.1%
210          Locust Hurricane Mjolnir Storm Needler      18.7%
46                 Squall Locust Mark IX Hephaestus      18.6%
17                   Squall Squall Hellbore Mjolnir      17.1%
294         Hurricane Hurricane Gauss Storm Needler      16.8%
95              Squall Hurricane Hephaestus Mjolnir      15.1%
83                 Squall Hurricane Mark IX Mjolnir      15.1%
90          Squall Hurricane Hellbore Storm Needler      14.2%
10                 Squall Squall Mark IX Hephaestus      14.1%
3                      Squall Squall Gauss Hellbore      13.7%
186            Locust Hurricane Gauss Storm Needler      11.7%
167                Locust Locust Hephaestus Mjolnir      10.7%
76                Squall Hurricane Gauss Hephaestus      10.6%
74                   Squall Hurricane Gauss Mark IX      10.5%
155                   Locust Locust Mark IX Mjolnir       9.6%
45                   Squall Locust Mark IX Hellbore       7.5%
293               Hurricane Hurricane Gauss Mjolnir       7.5%
162            Locust Locust Hellbore Storm Needler       7.2%
52                Squall Locust Hellbore Hephaestus       6.6%
36        Squall Squall Storm Needler Storm Needler       5.1%
300       Hurricane Hurricane Mark IX Storm Needler       4.6%
148                  Locust Locust Gauss Hephaestus       3.6%
146                     Locust Locust Gauss Mark IX       3.3%
312    Hurricane Hurricane Hephaestus Storm Needler       2.7%
9                    Squall Squall Mark IX Hellbore       2.6%
185                  Locust Hurricane Gauss Mjolnir       2.0%
89                Squall Hurricane Hellbore Mjolnir       1.9%
16                Squall Squall Hellbore Hephaestus       1.9%
82              Squall Hurricane Mark IX Hephaestus       1.0%
204       Locust Hurricane Hephaestus Storm Needler       0.7%
192          Locust Hurricane Mark IX Storm Needler       0.2%
75                  Squall Hurricane Gauss Hellbore      -0.2%
29                    Squall Squall Mjolnir Mjolnir      -1.3%
161                  Locust Locust Hellbore Mjolnir      -3.3%
1                         Squall Squall Gauss Gauss      -4.1%
299             Hurricane Hurricane Mark IX Mjolnir      -4.2%
311          Hurricane Hurricane Hephaestus Mjolnir      -5.4%
306      Hurricane Hurricane Hellbore Storm Needler      -6.3%
203             Locust Hurricane Hephaestus Mjolnir      -7.9%
154                Locust Locust Mark IX Hephaestus      -8.3%
191                Locust Hurricane Mark IX Mjolnir      -8.8%
81                Squall Hurricane Mark IX Hellbore      -9.6%
292            Hurricane Hurricane Gauss Hephaestus      -9.7%
290               Hurricane Hurricane Gauss Mark IX      -9.7%
180       Locust Locust Storm Needler Storm Needler     -10.0%
88             Squall Hurricane Hellbore Hephaestus     -10.1%
147                    Locust Locust Gauss Hellbore     -10.5%
198         Locust Hurricane Hellbore Storm Needler     -11.7%
8                     Squall Squall Mark IX Mark IX     -12.3%
22              Squall Squall Hephaestus Hephaestus     -12.9%
184               Locust Hurricane Gauss Hephaestus     -15.1%
182                  Locust Hurricane Gauss Mark IX     -15.6%
173                   Locust Locust Mjolnir Mjolnir     -16.5%
305            Hurricane Hurricane Hellbore Mjolnir     -17.2%
298          Hurricane Hurricane Mark IX Hephaestus     -18.6%
160               Locust Locust Hellbore Hephaestus     -19.9%
145                       Locust Locust Gauss Gauss     -20.8%
15                  Squall Squall Hellbore Hellbore     -20.9%
324 Hurricane Hurricane Storm Needler Storm Needler     -20.9%
197               Locust Hurricane Hellbore Mjolnir     -21.0%
153                  Locust Locust Mark IX Hellbore     -23.3%
190             Locust Hurricane Mark IX Hephaestus     -24.4%
291              Hurricane Hurricane Gauss Hellbore     -25.0%
317             Hurricane Hurricane Mjolnir Mjolnir     -27.2%
166             Locust Locust Hephaestus Hephaestus     -28.6%
152                   Locust Locust Mark IX Mark IX     -29.3%
183                 Locust Hurricane Gauss Hellbore     -29.4%
304         Hurricane Hurricane Hellbore Hephaestus     -29.7%
289                 Hurricane Hurricane Gauss Gauss     -31.4%
297            Hurricane Hurricane Mark IX Hellbore     -33.8%
196            Locust Hurricane Hellbore Hephaestus     -35.2%
310       Hurricane Hurricane Hephaestus Hephaestus     -37.8%
296             Hurricane Hurricane Mark IX Mark IX     -38.2%
159                 Locust Locust Hellbore Hellbore     -38.9%
189               Locust Hurricane Mark IX Hellbore     -39.6%
72        Squall Locust Storm Needler Storm Needler     -45.2%
303           Hurricane Hurricane Hellbore Hellbore     -47.0%
65                    Squall Locust Mjolnir Mjolnir     -48.1%
37                        Squall Locust Gauss Gauss     -49.4%
108    Squall Hurricane Storm Needler Storm Needler     -53.1%
44                    Squall Locust Mark IX Mark IX     -54.1%
58              Squall Locust Hephaestus Hephaestus     -54.2%
101                Squall Hurricane Mjolnir Mjolnir     -56.1%
73                     Squall Hurricane Gauss Gauss     -57.6%
51                  Squall Locust Hellbore Hellbore     -58.3%
80                 Squall Hurricane Mark IX Mark IX     -61.2%
94           Squall Hurricane Hephaestus Hephaestus     -61.6%
216    Locust Hurricane Storm Needler Storm Needler     -62.1%
209                Locust Hurricane Mjolnir Mjolnir     -65.1%
87               Squall Hurricane Hellbore Hellbore     -65.4%
181                    Locust Hurricane Gauss Gauss     -67.6%
202          Locust Hurricane Hephaestus Hephaestus     -70.7%
188                Locust Hurricane Mark IX Mark IX     -71.1%
195              Locust Hurricane Hellbore Hellbore     -75.7%
[close]

And in the spirit of transparency, here is all the code used to generate these numbers:
Weapon time series - fixed version "weapondatafixed.R"

library(ggplot2)
library(ggthemes)

armordamagematrix <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.022,0.136,0.341,0.341,0.136,0.022)
for (i in 1:6) {
  armordamagematrix[,i:(i+4)] <- armordamagematrix[,i:(i+4)]+b*normaldistpoints
}

armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,useminarmor,startingarmor) {
  if(useminarmor == 0){
    if(armor == 0) {return (damage)}
    return(damage*(max(0.15,damage/(damage+armor))))
  }
  else{
    return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
  }
}

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles in 1 second, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds. Since there is no neat way to handle this when time is discrete at 1 sec we'll handle as follows
mjolnirtics <- c(1,1,2,1,2,1,2,1,1)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")

weapon1 <- dummy
weapon2 <- dummy
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- stormneedler
weapon6 <- stormneedler

shieldblock <- 0

shielddamageattimepoint <- function(weapon, timepoint){
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    return(weapon[[1]]*nohits)
  }
}

damageattimepoint <- function(weapon, timepoint, armor, useminarmor, startingarmor, hitx, hity){
  # vectors in R are indexed starting from 1
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    damagesum <- 0
    for (i in 1:nohits) {
      damagesum <- damagesum + armordamageselectivereduction(weapon[[1]]*armordamagematrix[hitx,hity],armor,useminarmor,startingarmor)
    }
    return(damagesum)
  }
}

timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
  #are we using shield to block?
  shieldblock <- 0
  hulldamage <- 0
  if(hullhp > 0){} else {shieldhp <- 0}
  useminarmor <- 0
  #are we using the 5% minimum armor rule? deduce this by applying a weighted average of armor
  if(weighted.mean(armormatrix,armordamagematrix) <= startingarmor/15*0.05){useminarmor <- 1
  }
 
  #1. shields. if shieldhp is sufficient, use shield to block
  if (weapon1[[4]] !=""){
    weapon1mult <- unlist(weapon1[2])
    if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon1,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  #repeat for other weapons
 
  if (weapon2[[4]] !=""){
    weapon2mult <- unlist(weapon2[2])
    if (shieldhp > shielddamageattimepoint(weapon2, timepoint)*weapon2mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon2, timepoint)*weapon2mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon2,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon3[[4]] !=""){
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > shielddamageattimepoint(weapon3, timepoint)*weapon3mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon3, timepoint)*weapon3mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon3,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon4[[4]] !=""){
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > shielddamageattimepoint(weapon4, timepoint)*weapon4mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon4, timepoint)*weapon4mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon4,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon5[[4]] !=""){
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > shielddamageattimepoint(weapon5, timepoint)*weapon5mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon5, timepoint)*weapon5mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon5,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon6[[4]] !=""){
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > shielddamageattimepoint(weapon6, timepoint)*weapon6mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon6, timepoint)*weapon6mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon6,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
 
 
  if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
  return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}

totaltime = 60

#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)

armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0



timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))

for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
  shieldhp <- state[[2]]
  armorhp <- state[[3]]
  hullhp <- state[[4]]
  flux <- shieldmax - shieldhp
  armormatrix <- state[[8]]
  if(hullhp == 0){flux <- 0}
  timeseriesarray <- rbind(timeseriesarray , c(state[[1]], flux/shieldmax*100, state[[3]]/startingarmor*100, state[[4]]/ship[1]*100))
 
}

colnames(timeseriesarray) <-  c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))


ggplot(timeseriesarray, aes(x=Time))  +
  geom_line(aes(y = Flux, color = "Flux")) +
  geom_line(aes(y = Armor, color="Armor")) +
  geom_line(aes(y = Hull, color="Hull")) +
  scale_colour_manual("",
                      breaks = c("Flux", "Armor", "Hull"),
                      values = c("lightsteelblue", "red", "maroon")) +
  ylab("% max") +
  xlab("Time (s)") +
  labs(title=weaponstitle)
[close]

Create tables of time to kill by weapon by ship "weaponsoptimize.R"
armordamagematrix <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.022,0.136,0.341,0.341,0.136,0.022)

#ships -
#ship, hullhp, shieldregen, shieldmax, startingarmor, name
glimmer <- c(1500, 250/0.6, 2500/0.6, 200, "glimmer")
brawlerlp <- c(2000, 500/0.8, 3000/0.8, 450, "brawlerlp")
vanguard <- c(3000, 150, 2000, 600, "vanguard")
tempest <- c(1250, 225/0.6, 2500/0.6, 200, "tempest")
medusa <- c(3000,400/0.6,6000/0.6,300, "medusa")
hammerhead <- c(5000,250/0.8,4200/0.8,500, "hammerhead")
enforcer <- c(4000,200,4000,900, "enforcer")
dominator <- c(14000, 500, 10000, 1500, "dominator")
fulgent <- c(5000,300/0.6,5000/0.6,450,"fulgent")
brilliant <- c(8000,600/0.6,10000/0.6,900,"brilliant")
radiant <- c(20000,1500/0.6,25000/0.6,1500,"radiant")
onslaught <- c(20000,600,17000,1750,"onslaught")
aurora <- c(8000,800/0.8,11000/0.8,800, "aurora")
paragon <- c(18000,1250/0.6,25000/0.6,1500,"paragon")
conquest <- c(12000,1200/1.4,20000/1.4,1200,"conquest")
champion <- c(10000,550/0.8,10000/0.8,1250, "champion")

ships <- list(glimmer, brawlerlp, vanguard, tempest, medusa, hammerhead, enforcer, dominator, fulgent, brilliant,radiant,onslaught,aurora,paragon,conquest,champion)

for (f in 1:length(ships)){

ship <- ships[[f]]
shipname <- ship[[5]]
ship <- as.double(ship[1:4])

for (i in 1:6) {
  armordamagematrix[,i:(i+4)] <- armordamagematrix[,i:(i+4)]+b*normaldistpoints
}

armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,useminarmor,startingarmor) {
  if(useminarmor == 0){
    if(armor == 0) {return (damage)}
    return(damage*(max(0.15,damage/(damage+armor))))
  }
  else{
    return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
  }
}

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1,1,2,1,2,1,2,1,1)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")

weapon1 <- squall
weapon2 <- squall
weapon3 <- harpoon
weapon4 <- harpoon
weapon5 <- mjolnir
weapon6 <- mjolnir

weapon1choices <- list(squall, locust, hurricane)
weapon2choices <- list(squall, locust, hurricane)
weapon3choices <- list(harpoon, sabot)
weapon4choices <- list(harpoon, sabot)
weapon5choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler)
weapon6choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler)

timeseriesarray <- data.frame(matrix(ncol = 7,nrow=0))



timetokill=0


shieldblock <- 0

shielddamageattimepoint <- function(weapon, timepoint){
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    return(weapon[[1]]*nohits)
  }
}

damageattimepoint <- function(weapon, timepoint, armor, useminarmor, startingarmor, hitx, hity){
  # vectors in R are indexed starting from 1
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    damagesum <- 0
    for (i in 1:nohits) {
      damagesum <- damagesum + armordamageselectivereduction(weapon[[1]]*armordamagematrix[hitx,hity],armor,useminarmor,startingarmor)
    }
    return(damagesum)
  }
}
timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
  #are we using shield to block?
  shieldblock <- 0
  hulldamage <- 0
  if(hullhp > 0){} else {shieldhp <- 0}
  useminarmor <- 0
  #are we using the 5% minimum armor rule? deduce this by applying a weighted average of armor
  if(weighted.mean(armormatrix,armordamagematrix) <= startingarmor/15*0.05){useminarmor <- 1
  }
 
  #1. shields. if shieldhp is sufficient, use shield to block
  if (weapon1[[4]] !=""){
    weapon1mult <- unlist(weapon1[2])
    if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon1,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  #repeat for other weapons
 
  if (weapon2[[4]] !=""){
    weapon2mult <- unlist(weapon2[2])
    if (shieldhp > shielddamageattimepoint(weapon2, timepoint)*weapon2mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon2, timepoint)*weapon2mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon2,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon3[[4]] !=""){
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > shielddamageattimepoint(weapon3, timepoint)*weapon3mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon3, timepoint)*weapon3mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon3,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon4[[4]] !=""){
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > shielddamageattimepoint(weapon4, timepoint)*weapon4mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon4, timepoint)*weapon4mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon4,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon5[[4]] !=""){
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > shielddamageattimepoint(weapon5, timepoint)*weapon5mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon5, timepoint)*weapon5mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon5,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon6[[4]] !=""){
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > shielddamageattimepoint(weapon6, timepoint)*weapon6mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon6, timepoint)*weapon6mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon6,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
 
 
  if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
  return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}

totaltime = 500



armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0
timetokill <- 0

for (i in 1:length(weapon1choices)) {
  weapon1<-weapon1choices[]
  for (j in 1:length(weapon2choices)) {
    weapon2<-weapon2choices[[j]]
    for (k in 1:length(weapon3choices)) {
      weapon3<-weapon3choices[[k]]
      for (l in 1:length(weapon4choices)) {
        weapon4<-weapon4choices[[l]]
        for (m in 1:length(weapon5choices)) {
          weapon5<-weapon5choices[[m]]
          for (n in 1:length(weapon6choices)) {
            weapon6<-weapon6choices[[n]]
for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
  shieldhp <- state[[2]]
  armorhp <- state[[3]]
  hullhp <- state[[4]]
  flux <- shieldmax - shieldhp
  armormatrix <- state[[8]]
  if(hullhp == 0){flux <- 0
  if (timetokill == 0){timetokill <- t
  break}
  }
 
}
if (timetokill ==0){timetokill <- NA}

tobind <- c(timetokill,unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))
timeseriesarray <- rbind(timeseriesarray,tobind)

armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0
timetokill <- 0
          }
        }
      }
    }
  }
}

colnames(timeseriesarray) <-  c("Timetokill", "Weapon1", "Weapon2", "Weapon3", "Weapon4", "Weapon5", "Weapon6")

write.table(timeseriesarray, file = "optimizeweapons.tsv", row.names=FALSE, sep="\t")

sortbytime <- timeseriesarray[order(as.integer(timeseriesarray$Timetokill)),]

write.table(sortbytime, file = paste("optimizeweaponsbytime",shipname,".txt", sep=""), row.names=FALSE, sep="\t")
}
[close]

Aggregate time by weapon combination, calculate score statistic, print results "weapontotalscore.R"
#please excuse my terrible programming style in this one

weaponnames <- c("Squall", "Locust", "Hurricane", "Sabot", "Harpoon", "Gauss", "Mark IX", "Hellbore", "Hephaestus", "Mjolnir", "Storm Needler")
shipnames <- c("glimmer", "brawlerlp", "vanguard", "tempest", "medusa", "hammerhead", "enforcer", "dominator", "fulgent", "brilliant","radiant","onslaught","aurora","paragon","conquest","champion")
lmnames <- c("Squall", "Locust", "Hurricane")
mrmnames <- c("Sabot", "Harpoon")
gunnames <- c("Gauss", "Mark IX", "Hellbore", "Hephaestus", "Mjolnir", "Storm Needler")
lmcolumns <- c(1,2)
mrmcolumns <- c(3,4)
guncolumns <- c(5,6)

filename <- function(x) paste("optimizeweaponsbytime", shipnames
  • , ".txt", sep="")

readfile <- function(filename) read.csv(filename, sep = "\t")

shiparray <- lapply(1:length(shipnames), function(x) readfile(filename(x)))

timemean <- function(ship,wpnname) mean(ship[which(ship==wpnname, arr.ind=TRUE)[,1],1])/mean(ship[,1])
xycontains <- function(ship,wpnname,row,column) if(ship[row,column]==wpnname) {return(TRUE)} else {return(FALSE)}
xypair <- function(ship,wpnnamea,wpnnameb,row,columna,columnb) if((xycontains(ship,wpnnamea,row,columna) | xycontains(ship,wpnnamea,row,columnb)) & (xycontains(ship,wpnnameb,row,columna) | xycontains(ship,wpnnameb,row,columnb))) {return(TRUE)} else {return(FALSE)}
pairtimemean <- function(ship,wpnnamea,wpnnameb,columna,columnb){
  localsum <- 0
  increment <- 0
  #calculate the mean time for this pair to kill the ship
  for (h in 1:length(ship[,1])){
    if(xypair(ship,wpnnamea,wpnnameb,h,columna,columnb)){
      localsum <- localsum + ship[h,1]
      increment <- increment + 1
    }
  }
  return(localsum/(increment*mean(ship[,1])))
}


doublepairtimemean <- function(ship,wpnnamea,wpnnameb,wpnnamec,wpnnamed,columna,columnb,columnc,columnd){
  localsum <- 0
  increment <- 0
  for (h in 1:length(ship[,1])){
    if(xypair(ship,wpnnamea,wpnnameb,h,columna,columnb)){
      # this dumb hack deals with the double counting problem
      if(wpnnamea==wpnnameb){ factor <- 0.5} else {factor <- 1}
      if(xypair(ship,wpnnamec,wpnnamed,h,columnc,columnd))
      # this dumb hack deals with the double counting problem
      if(wpnnamec==wpnnamed){
        localsum <- localsum + (ship[h,1]*factor/2)
      }else{
      localsum <- localsum + ship[h,1]
      }
      increment <- increment + 1
    }
  }
  return(localsum/(increment*mean(ship[,1])))
}



timearray <- function(gunnames){
  pairarray <- data.frame()
  for(i in 1:length(gunnames)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        localsum <- localsum + (timemean(shiparray[[k]],gunnames))
      }
      pairarray <- (rbind(pairarray, c(gunnames,(localsum/length(shipnames)))))
   
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  colnames(pairarray) <- c("Weapon", "Score")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. score")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  print(pairarray)
}

pairtimearray <- function(gunnames,columna,columnb){
  pairarray <- data.frame()
  for(i in 1:length(gunnames)){
    for(j in 1:length(gunnames)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        #calculate the average time for these weapons to kill the ship
        localsum <- localsum + (pairtimemean(shiparray[[k]],gunnames,gunnames[j],columna,columnb))

      }
      pairarray <- (rbind(pairarray, c(paste(gunnames,gunnames[j]),(localsum/length(shipnames)))))
     
    }
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  colnames(pairarray) <- c("Weapon", "Score")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. score")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  print(pairarray)
}

twopairtimearray <- function(gunnames,gunnamesb,columna,columnb,columnc,columnd){
  pairarray <- data.frame()
  for(i in 1:length(gunnames)){
    for(j in 1:length(gunnames)){
      for(l in 1:length(gunnamesb))
        for(m in 1:length(gunnamesb)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        localsum <- localsum + (doublepairtimemean(shiparray[[k]],gunnames,gunnames[j],gunnamesb[l],gunnamesb[m],columna,columnb,columnc,columnd))
      }
      pairarray <- (rbind(pairarray, c(paste(gunnames,gunnames[j],gunnamesb[l],gunnamesb[m]),(localsum/length(shipnames)))))
      }
    }
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  colnames(pairarray) <- c("Weapon", "Score")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. score")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  print(pairarray)
}

timearray(lmnames)
timearray(mrmnames)
timearray(gunnames)
pairtimearray(lmnames,2,3)
pairtimearray(mrmnames,4,5)
pairtimearray(gunnames,6,7)
twopairtimearray(lmnames,gunnames,2,3,6,7)
[close]

If anyone has any specific questions they'd like modeled just ask.

I do suppose it's been shown pretty conclusively that my layout in the OP was suboptimal, and yet I was dominating the game with it and quite satisfied, so that goes to show that this is very much a problem of fine-tuning that's difficult to approach by gut feeling.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 15, 2022, 07:55:42 AM
Does this analysis consider the flux cost and OP cost of weapons? Gauss and Mjolnir have higher damage output because they also have much higher flux cost.

No. Flux is assumed to be infinite (which is somewhat accurate when it comes to the Conquest). If you wish to consider efficiency, then you would be interested in the TTK / cost ratio. Specifically, if the cost of weapon of interest is a and of the median weapon is b, then you should calculate 1/(1/(score+1)*(a/b))-1, which simplifies to (b/a)(x+1)-1. For example if the score of the Mjolnir is +10%, and the median weapon is Storm Needler, then the flux efficiency adjusted score would be (350/667)(1+0.1)-1, so the flux efficiency adjusted score is actually -42% - you are killing 10% faster at almost double the cost. However there is generally a surplus of flux and OP on the Conquest so I'm not particularly concerned about efficiency. The same formula could also be used for range adjusted scores.
I don't think it's quite so simple because combat does not occur in isolation. Taking damage on your shields reduces your available capacity, and thus your ability to return fire, and the same for your opponent. It's a coupled dynamic system, and a simple DPS comparison doesn't really capture that. But that only applies to shields. For hull/armor, effective DPS (after accounting for armor mechanics) is the more important thing.

In terms of OP, it's also difficult to assign a cost because OP points don't have intrinsic value, but rather, are as valuable as what they allow you to equip in that specific loadout. It's definitely not always true that a weapon with 2x the OP cost is 2x as expensive to equip. If that OP is coming from excess capacitors, it could be a minimal price, but if that OP is coming at the expense of critical vents, or a critical hullmod, it might be much more costly than 2x the 'price' in terms of overall loadout effectiveness.

That's not to say a simple DPS comparison is useless because it certainly matters, but I don't think it's a wholistic representation of the balance of weapons and loadouts.

In a perfect world, someone would make a standalone executable version of the combat sim that runs without any UI or visuals as fast as possible. Basically a function that takes ships/loadouts and returns combat results (result, damage etc.). Then you could just run optimization/analysis on it directly to take into account all of nuances of the game/AI perfectly. I feel like that would be handy for balancing too: you can easily do things like test a new weapon in a ton of different loadouts, or test a new ship against a ton of different enemies automatically (obviously wouldn't replace testing for human piloting balance, or for AI performance/issues).
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 15, 2022, 10:24:54 AM
Does this analysis consider the flux cost and OP cost of weapons? Gauss and Mjolnir have higher damage output because they also have much higher flux cost.

No. Flux is assumed to be infinite (which is somewhat accurate when it comes to the Conquest). If you wish to consider efficiency, then you would be interested in the TTK / cost ratio. Specifically, if the cost of weapon of interest is a and of the median weapon is b, then you should calculate 1/(1/(score+1)*(a/b))-1, which simplifies to (b/a)(x+1)-1. For example if the score of the Mjolnir is +10%, and the median weapon is Storm Needler, then the flux efficiency adjusted score would be (350/667)(1+0.1)-1, so the flux efficiency adjusted score is actually -42% - you are killing 10% faster at almost double the cost. However there is generally a surplus of flux and OP on the Conquest so I'm not particularly concerned about efficiency. The same formula could also be used for range adjusted scores.
I don't think it's quite so simple because combat does not occur in isolation. Taking damage on your shields reduces your available capacity, and thus your ability to return fire, and the same for your opponent. It's a coupled dynamic system, and a simple DPS comparison doesn't really capture that. But that only applies to shields. For hull/armor, effective DPS (after accounting for armor mechanics) is the more important thing.

In terms of OP, it's also difficult to assign a cost because OP points don't have intrinsic value, but rather, are as valuable as what they allow you to equip in that specific loadout. It's definitely not always true that a weapon with 2x the OP cost is 2x as expensive to equip. If that OP is coming from excess capacitors, it could be a minimal price, but if that OP is coming at the expense of critical vents, or a critical hullmod, it might be much more costly than 2x the 'price' in terms of overall loadout effectiveness.

That's not to say a simple DPS comparison is useless because it certainly matters, but I don't think it's a wholistic representation of the balance of weapons and loadouts.

Point is well taken. The problem is that the more abstracted statistics get and the more assumptions they contain, the harder it is to understand what they actually mean. However, it doesn't have to be a single number. Given that I have accurate time to kill statistics I could actually report standardized flux to kill alongside it as a measure of efficiency. And also max range for the particular combo considering ITU, ballistic mastery and gunnery implants, to get a more useful table to guide weapon selection. Will need to work on this next time I have a chance.

E: all right, here it is. The flux cost is calculated as a difference vs  the mean, again but with no inversion. For weapons with flux cost 0 it's marked NaN due to the method of calculation.

So +20% damage is better (it means 20% faster killing speed, ie. time to kill is 83% of the median) but +20% flux means 20% more flux used to kill the target (calculated as time to kill * flux /second).
Gun data with flux costs and ranges

Large missiles
     Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
1    Squall              26.6%      NaN%            2500             2500
2    Locust               0.0%      NaN%            1400             1400
3 Hurricane             -16.4%      NaN%            2500             2500
Medium missiles
   Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
2   Sabot               1.4%      NaN%            1400             1400
1 Harpoon              -1.3%      NaN%            2500             2500
Guns
         Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
4 Storm Needler              20.9%    -33.9%             700             1295
5       Mjolnir              11.5%     36.6%             900             1665
1         Gauss               5.9%     29.4%            1200             2220
6    Hephaestus              -5.3%     15.7%             900             1665
2       Mark IX              -5.7%    -15.7%             900             1665
3      Hellbore             -20.7%    -28.0%             900             1665

Large missile combinations
               Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
2       Squall Locust              23.9%      NaN%            1400             1400
1       Squall Squall              18.0%      NaN%            2500             2500
3    Squall Hurricane               4.3%      NaN%            2500             2500
5       Locust Locust              -4.0%      NaN%            1400             1400
9 Hurricane Hurricane             -16.3%      NaN%            2500             2500
6    Locust Hurricane             -21.4%      NaN%            1400             1400
Medium missile combinations
           Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
4     Sabot Sabot               0.6%      NaN%            1400             1400
2   Harpoon Sabot               0.0%      NaN%            2500             2500
1 Harpoon Harpoon              -1.2%      NaN%            2500             2500
Gun combinations
                        Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
23       Storm Needler Mjolnir              27.5%    -17.3%             700             1295
4          Gauss Storm Needler              23.0%    -19.9%             700             1295
22 Storm Needler Storm Needler              14.9%    -36.8%             700             1295
5                Gauss Mjolnir              13.9%     15.5%             900             1665
10       Mark IX Storm Needler              10.9%    -34.7%             700             1295
24    Storm Needler Hephaestus               9.3%    -21.2%             700             1295
29             Mjolnir Mjolnir               6.3%     30.2%             900             1665
11             Mark IX Mjolnir               1.9%      3.3%             900             1665
1                  Gauss Gauss               1.2%     23.0%            1200             2220
30          Mjolnir Hephaestus               1.2%     17.6%             900             1665
16      Hellbore Storm Needler               0.0%    -37.7%             700             1295
2                Gauss Mark IX              -3.3%      1.8%             900             1665
6             Gauss Hephaestus              -3.5%     16.1%             900             1665
36       Hephaestus Hephaestus              -8.3%      8.7%             900             1665
8              Mark IX Mark IX              -8.8%    -20.8%             900             1665
17            Hellbore Mjolnir             -10.6%      6.4%             900             1665
12          Mark IX Hephaestus             -13.3%     -0.9%             900             1665
3               Gauss Hellbore             -17.3%      6.7%             900             1665
15           Hellbore Hellbore             -20.9%    -34.4%             900             1665
18         Hellbore Hephaestus             -24.3%      0.0%             900             1665
9             Mark IX Hellbore             -27.6%    -14.3%             900             1665
[close]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 16, 2022, 12:53:12 AM
New analysis. Added medium guns into the mix. Also improved the firing cycles of the large guns to be still more accurate to reality. Based on previous analysis, it seems like Squall Squall is the best large missile combo (the range reduction from 2500 to 1400 and reduction in duration of fire means Squall Locust is not worth it) and Harpoon Harpoon is the medium missile combo to go for. I do not have the computing power to analyze large missiles x large guns x medium missiles x medium guns, so therefore for this analysis large missiles are fixed as Squall Squall and medium missiles are fixed as Harpoon Harpoon. This and the inclusion of medium guns also changes the results for large guns, so they are reposted.

Large and medium guns, modeled

Large guns
         Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
4 Storm Needler              12.5%    -28.0%             700             1295
5       Mjolnir               7.7%     43.3%             900             1665
1         Gauss               4.1%     33.4%            1200             2220
2       Mark IX              -3.8%    -16.2%             900             1665
6    Hephaestus              -4.4%     16.2%             900             1665
3      Hellbore             -11.0%    -35.0%             900             1665
Medium guns
                Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
2     Heavy Autocannon               3.3%     13.2%             800             1480
6        Heavy Needler               3.0%      6.0%             700             1295
3             Arbalest               2.9%    -33.6%             700             1295
5 Hypervelocity Driver              -2.7%     -1.7%            1000             1850
1         Heavy Mortar              -3.4%      1.7%             700             1295
4         Heavy Mauler              -5.2%    -30.9%            1000             1850
Combinations of large guns
                        Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
                        Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
23       Storm Needler Mjolnir              18.6%     -6.8%             700             1295
4          Gauss Storm Needler              15.4%    -10.6%             700             1295
22 Storm Needler Storm Needler              10.1%    -30.9%             700             1295
5                Gauss Mjolnir              10.1%     25.0%             900             1665
10       Mark IX Storm Needler               7.5%    -29.4%             700             1295
24    Storm Needler Hephaestus               6.1%    -15.0%             700             1295
29             Mjolnir Mjolnir               5.8%     37.0%             900             1665
11             Mark IX Mjolnir               2.2%      7.9%             900             1665
1                  Gauss Gauss               2.2%     27.5%            1200             2220
30          Mjolnir Hephaestus               1.6%     22.7%             900             1665
16      Hellbore Storm Needler               0.0%    -34.8%             700             1295
2                Gauss Mark IX              -1.4%      4.5%             900             1665
6             Gauss Hephaestus              -2.8%     20.8%             900             1665
17            Hellbore Mjolnir              -3.9%      3.7%             900             1665
8              Mark IX Mark IX              -4.7%    -20.7%             900             1665
36       Hephaestus Hephaestus              -5.4%     10.2%             900             1665
3               Gauss Hellbore              -9.6%      2.1%             900             1665
12          Mark IX Hephaestus             -10.0%      0.0%             900             1665
15           Hellbore Hellbore             -11.0%    -38.9%             900             1665
9             Mark IX Hellbore             -15.8%    -22.8%             900             1665
18         Hellbore Hephaestus             -16.4%     -5.1%             900             1665
Combinations of medium guns
                                      Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
                                      Weapon Avg. killing speed Avg. flux Range (no mods) Range(ITU+BM+GI)
9                  Heavy Autocannon Arbalest               6.6%     -5.9%             700             1295
12            Heavy Autocannon Heavy Needler               6.3%     15.2%             700             1295
18                    Arbalest Heavy Needler               6.3%     -9.5%             700             1295
8          Heavy Autocannon Heavy Autocannon               2.8%     23.2%             800             1480
36               Heavy Needler Heavy Needler               2.5%     15.4%             700             1295
15                         Arbalest Arbalest               2.4%    -27.8%             700             1295
11     Heavy Autocannon Hypervelocity Driver               0.8%     14.2%             800             1480
30        Hypervelocity Driver Heavy Needler               0.8%     10.1%             700             1295
17             Arbalest Hypervelocity Driver               0.6%    -11.8%             700             1295
6                 Heavy Mortar Heavy Needler               0.1%     12.3%             700             1295
2              Heavy Mortar Heavy Autocannon               0.0%     16.5%             700             1295
3                      Heavy Mortar Arbalest              -0.8%     -9.1%             700             1295
10             Heavy Autocannon Heavy Mauler              -1.2%      0.0%             800             1480
24                Heavy Mauler Heavy Needler              -1.9%     -3.5%             700             1295
16                     Arbalest Heavy Mauler              -1.9%    -26.1%             700             1295
29 Hypervelocity Driver Hypervelocity Driver              -2.7%      6.4%            1000             1850
1                  Heavy Mortar Heavy Mortar              -3.3%     10.2%             700             1295
22                 Heavy Mauler Heavy Mauler              -4.9%    -25.4%            1000             1850
5          Heavy Mortar Hypervelocity Driver              -5.9%     11.6%             700             1295
23         Heavy Mauler Hypervelocity Driver              -7.9%     -5.2%            1000             1850
4                  Heavy Mortar Heavy Mauler              -8.0%     -3.5%             700             1295

Large guns by medium guns
                           Largeguns                                 Mediumguns Time Killing speed score
21  Storm Needler Storm Needler                         Arbalest Arbalest   3.937500               47.8%
147 Storm Needler Storm Needler         Heavy Autocannon Heavy Autocannon   4.000000               45.5%
399 Storm Needler Storm Needler               Heavy Needler Heavy Needler   4.000000               45.5%
105 Storm Needler Storm Needler                    Arbalest Heavy Needler   4.031250               44.3%
42  Storm Needler Storm Needler                 Arbalest Heavy Autocannon   4.062500               43.2%
210 Storm Needler Storm Needler            Heavy Autocannon Heavy Needler   4.062500               43.2%
420 Storm Needler Storm Needler        Heavy Needler Hypervelocity Driver   4.062500               43.2%
384         Gauss Storm Needler               Heavy Needler Heavy Needler   4.125000               41.0%
41        Mjolnir Storm Needler                 Arbalest Heavy Autocannon   4.312500               34.9%
209       Mjolnir Storm Needler            Heavy Autocannon Heavy Needler   4.312500               34.9%
398       Mjolnir Storm Needler               Heavy Needler Heavy Needler   4.312500               34.9%
146       Mjolnir Storm Needler         Heavy Autocannon Heavy Autocannon   4.375000               33.0%
20        Mjolnir Storm Needler                         Arbalest Arbalest   4.406250               32.0%
27          Gauss Storm Needler                 Arbalest Heavy Autocannon   4.437500               31.1%
104       Mjolnir Storm Needler                    Arbalest Heavy Needler   4.437500               31.1%
189 Storm Needler Storm Needler             Heavy Autocannon Heavy Mortar   4.437500               31.1%
195         Gauss Storm Needler            Heavy Autocannon Heavy Needler   4.437500               31.1%
357 Storm Needler Storm Needler                Heavy Mortar Heavy Needler   4.437500               31.1%
6           Gauss Storm Needler                         Arbalest Arbalest   4.468750               30.2%
132         Gauss Storm Needler         Heavy Autocannon Heavy Autocannon   4.468750               30.2%
63  Storm Needler Storm Needler                     Arbalest Heavy Mauler   4.500000               29.3%
84  Storm Needler Storm Needler                     Arbalest Heavy Mortar   4.500000               29.3%
419       Mjolnir Storm Needler        Heavy Needler Hypervelocity Driver   4.500000               29.3%
90          Gauss Storm Needler                    Arbalest Heavy Needler   4.531250               28.4%
126 Storm Needler Storm Needler             Arbalest Hypervelocity Driver   4.562500               27.5%
188       Mjolnir Storm Needler             Heavy Autocannon Heavy Mortar   4.562500               27.5%
231 Storm Needler Storm Needler     Heavy Autocannon Hypervelocity Driver   4.562500               27.5%
383               Gauss Mjolnir               Heavy Needler Heavy Needler   4.562500               27.5%
85                  Gauss Gauss                    Arbalest Heavy Needler   4.625000               25.8%
125       Mjolnir Storm Needler             Arbalest Hypervelocity Driver   4.625000               25.8%
168 Storm Needler Storm Needler             Heavy Autocannon Heavy Mauler   4.625000               25.8%
294 Storm Needler Storm Needler                Heavy Mauler Heavy Needler   4.625000               25.8%
441 Storm Needler Storm Needler Hypervelocity Driver Hypervelocity Driver   4.625000               25.8%
83        Mjolnir Storm Needler                     Arbalest Heavy Mortar   4.656250               25.0%
103             Mjolnir Mjolnir                    Arbalest Heavy Needler   4.656250               25.0%
393    Hephaestus Storm Needler               Heavy Needler Heavy Needler   4.656250               25.0%
405         Gauss Storm Needler        Heavy Needler Hypervelocity Driver   4.671875               24.5%
40              Mjolnir Mjolnir                 Arbalest Heavy Autocannon   4.687500               24.1%
102       Mark IX Storm Needler                    Arbalest Heavy Needler   4.687500               24.1%
131               Gauss Mjolnir         Heavy Autocannon Heavy Autocannon   4.687500               24.1%
230       Mjolnir Storm Needler     Heavy Autocannon Hypervelocity Driver   4.687500               24.1%
293       Mjolnir Storm Needler                Heavy Mauler Heavy Needler   4.687500               24.1%
379                 Gauss Gauss               Heavy Needler Heavy Needler   4.687500               24.1%
397             Mjolnir Mjolnir               Heavy Needler Heavy Needler   4.687500               24.1%
62        Mjolnir Storm Needler                     Arbalest Heavy Mauler   4.718750               23.3%
207       Mark IX Storm Needler            Heavy Autocannon Heavy Needler   4.718750               23.3%
279         Gauss Storm Needler                Heavy Mauler Heavy Needler   4.718750               23.3%
342         Gauss Storm Needler                Heavy Mortar Heavy Needler   4.718750               23.3%
356       Mjolnir Storm Needler                Heavy Mortar Heavy Needler   4.718750               23.3%
167       Mjolnir Storm Needler             Heavy Autocannon Heavy Mauler   4.734375               22.9%
145             Mjolnir Mjolnir         Heavy Autocannon Heavy Autocannon   4.750000               22.5%
190                 Gauss Gauss            Heavy Autocannon Heavy Needler   4.750000               22.5%
194               Gauss Mjolnir            Heavy Autocannon Heavy Needler   4.750000               22.5%
208             Mjolnir Mjolnir            Heavy Autocannon Heavy Needler   4.750000               22.5%
216         Gauss Storm Needler     Heavy Autocannon Hypervelocity Driver   4.750000               22.5%
336 Storm Needler Storm Needler                 Heavy Mortar Heavy Mortar   4.750000               22.5%
396       Mark IX Storm Needler               Heavy Needler Heavy Needler   4.750000               22.5%
99     Hephaestus Storm Needler                    Arbalest Heavy Needler   4.781250               21.7%
378 Storm Needler Storm Needler         Heavy Mortar Hypervelocity Driver   4.781250               21.7%
5                 Gauss Mjolnir                         Arbalest Arbalest   4.812500               20.9%
18        Mark IX Storm Needler                         Arbalest Arbalest   4.812500               20.9%
19              Mjolnir Mjolnir                         Arbalest Arbalest   4.812500               20.9%
39        Mark IX Storm Needler                 Arbalest Heavy Autocannon   4.812500               20.9%
89                Gauss Mjolnir                    Arbalest Heavy Needler   4.812500               20.9%
144       Mark IX Storm Needler         Heavy Autocannon Heavy Autocannon   4.812500               20.9%
22                  Gauss Gauss                 Arbalest Heavy Autocannon   4.875000               19.3%
69          Gauss Storm Needler                     Arbalest Heavy Mortar   4.875000               19.3%
111         Gauss Storm Needler             Arbalest Hypervelocity Driver   4.875000               19.3%
127                 Gauss Gauss         Heavy Autocannon Heavy Autocannon   4.875000               19.3%
174         Gauss Storm Needler             Heavy Autocannon Heavy Mortar   4.875000               19.3%
204    Hephaestus Storm Needler            Heavy Autocannon Heavy Needler   4.875000               19.3%
252 Storm Needler Storm Needler                 Heavy Mauler Heavy Mauler   4.875000               19.3%
273 Storm Needler Storm Needler                 Heavy Mauler Heavy Mortar   4.875000               19.3%
26                Gauss Mjolnir                 Arbalest Heavy Autocannon   4.906250               18.6%
1                   Gauss Gauss                         Arbalest Arbalest   4.937500               17.8%
48          Gauss Storm Needler                     Arbalest Heavy Mauler   4.937500               17.8%
141    Hephaestus Storm Needler         Heavy Autocannon Heavy Autocannon   4.937500               17.8%
153         Gauss Storm Needler             Heavy Autocannon Heavy Mauler   4.937500               17.8%
315 Storm Needler Storm Needler         Heavy Mauler Hypervelocity Driver   4.937500               17.8%
335       Mjolnir Storm Needler                 Heavy Mortar Heavy Mortar   4.937500               17.8%
36     Hephaestus Storm Needler                 Arbalest Heavy Autocannon   4.968750               17.1%
88                Gauss Mark IX                    Arbalest Heavy Needler   5.000000               16.4%
377       Mjolnir Storm Needler         Heavy Mortar Hypervelocity Driver   5.000000               16.4%
173               Gauss Mjolnir             Heavy Autocannon Heavy Mortar   5.031250               15.6%
355             Mjolnir Mjolnir                Heavy Mortar Heavy Needler   5.031250               15.6%
440       Mjolnir Storm Needler Hypervelocity Driver Hypervelocity Driver   5.031250               15.6%
68                Gauss Mjolnir                     Arbalest Heavy Mortar   5.046875               15.3%
15     Hephaestus Storm Needler                         Arbalest Arbalest   5.062500               14.9%
25                Gauss Mark IX                 Arbalest Heavy Autocannon   5.062500               14.9%
187             Mjolnir Mjolnir             Heavy Autocannon Heavy Mortar   5.062500               14.9%
211                 Gauss Gauss     Heavy Autocannon Hypervelocity Driver   5.062500               14.9%
229             Mjolnir Mjolnir     Heavy Autocannon Hypervelocity Driver   5.062500               14.9%
292             Mjolnir Mjolnir                Heavy Mauler Heavy Needler   5.062500               14.9%
363         Gauss Storm Needler         Heavy Mortar Hypervelocity Driver   5.062500               14.9%
395             Mark IX Mjolnir               Heavy Needler Heavy Needler   5.062500               14.9%
341               Gauss Mjolnir                Heavy Mortar Heavy Needler   5.078125               14.6%
321         Gauss Storm Needler                 Heavy Mortar Heavy Mortar   5.093750               14.2%
106                 Gauss Gauss             Arbalest Hypervelocity Driver   5.125000               13.5%
124             Mjolnir Mjolnir             Arbalest Hypervelocity Driver   5.125000               13.5%
272       Mjolnir Storm Needler                 Heavy Mauler Heavy Mortar   5.125000               13.5%
404               Gauss Mjolnir        Heavy Needler Hypervelocity Driver   5.125000               13.5%
417       Mark IX Storm Needler        Heavy Needler Hypervelocity Driver   5.125000               13.5%
418             Mjolnir Mjolnir        Heavy Needler Hypervelocity Driver   5.125000               13.5%
414    Hephaestus Storm Needler        Heavy Needler Hypervelocity Driver   5.156250               12.8%
426         Gauss Storm Needler Hypervelocity Driver Hypervelocity Driver   5.156250               12.8%
354       Mark IX Storm Needler                Heavy Mortar Heavy Needler   5.171875               12.5%
64                  Gauss Gauss                     Arbalest Heavy Mortar   5.187500               12.2%
82              Mjolnir Mjolnir                     Arbalest Heavy Mortar   5.187500               12.2%
95       Hellbore Storm Needler                    Arbalest Heavy Needler   5.187500               12.2%
186       Mark IX Storm Needler             Heavy Autocannon Heavy Mortar   5.187500               12.2%
193               Gauss Mark IX            Heavy Autocannon Heavy Needler   5.187500               12.2%
314       Mjolnir Storm Needler         Heavy Mauler Hypervelocity Driver   5.187500               12.2%
389      Hellbore Storm Needler               Heavy Needler Heavy Needler   5.187500               12.2%
225    Hephaestus Storm Needler     Heavy Autocannon Hypervelocity Driver   5.218750               11.5%
101             Mark IX Mjolnir                    Arbalest Heavy Needler   5.250000               10.8%
200      Hellbore Storm Needler            Heavy Autocannon Heavy Needler   5.250000               10.8%
206             Mark IX Mjolnir            Heavy Autocannon Heavy Needler   5.250000               10.8%
228       Mark IX Storm Needler     Heavy Autocannon Hypervelocity Driver   5.250000               10.8%
300         Gauss Storm Needler         Heavy Mauler Hypervelocity Driver   5.250000               10.8%
337                 Gauss Gauss                Heavy Mortar Heavy Needler   5.250000               10.8%
258         Gauss Storm Needler                 Heavy Mauler Heavy Mortar   5.281250               10.2%
43                  Gauss Gauss                     Arbalest Heavy Mauler   5.312500                9.5%
61              Mjolnir Mjolnir                     Arbalest Heavy Mauler   5.312500                9.5%
81        Mark IX Storm Needler                     Arbalest Heavy Mortar   5.312500                9.5%
110               Gauss Mjolnir             Arbalest Hypervelocity Driver   5.312500                9.5%
130               Gauss Mark IX         Heavy Autocannon Heavy Autocannon   5.312500                9.5%
143             Mark IX Mjolnir         Heavy Autocannon Heavy Autocannon   5.312500                9.5%
215               Gauss Mjolnir     Heavy Autocannon Hypervelocity Driver   5.312500                9.5%
274                 Gauss Gauss                Heavy Mauler Heavy Needler   5.312500                9.5%
278               Gauss Mjolnir                Heavy Mauler Heavy Needler   5.312500                9.5%
400                 Gauss Gauss        Heavy Needler Hypervelocity Driver   5.312500                9.5%
47                Gauss Mjolnir                     Arbalest Heavy Mauler   5.375000                8.2%
98           Hephaestus Mjolnir                    Arbalest Heavy Needler   5.375000                8.2%
123       Mark IX Storm Needler             Arbalest Hypervelocity Driver   5.375000                8.2%
129            Gauss Hephaestus         Heavy Autocannon Heavy Autocannon   5.375000                8.2%
140          Hephaestus Mjolnir         Heavy Autocannon Heavy Autocannon   5.375000                8.2%
148                 Gauss Gauss             Heavy Autocannon Heavy Mauler   5.375000                8.2%
152               Gauss Mjolnir             Heavy Autocannon Heavy Mauler   5.375000                8.2%
169                 Gauss Gauss             Heavy Autocannon Heavy Mortar   5.375000                8.2%
192            Gauss Hephaestus            Heavy Autocannon Heavy Needler   5.375000                8.2%
382               Gauss Mark IX               Heavy Needler Heavy Needler   5.375000                8.2%
392          Hephaestus Mjolnir               Heavy Needler Heavy Needler   5.375000                8.2%
425               Gauss Mjolnir Hypervelocity Driver Hypervelocity Driver   5.375000                8.2%
439             Mjolnir Mjolnir Hypervelocity Driver Hypervelocity Driver   5.375000                8.2%
38              Mark IX Mjolnir                 Arbalest Heavy Autocannon   5.406250                7.6%
120    Hephaestus Storm Needler             Arbalest Hypervelocity Driver   5.406250                7.6%
251       Mjolnir Storm Needler                 Heavy Mauler Heavy Mauler   5.406250                7.6%
288    Hephaestus Storm Needler                Heavy Mauler Heavy Needler   5.406250                7.6%
17              Mark IX Mjolnir                         Arbalest Arbalest   5.437500                7.0%
35           Hephaestus Mjolnir                 Arbalest Heavy Autocannon   5.437500                7.0%
166             Mjolnir Mjolnir             Heavy Autocannon Heavy Mauler   5.437500                7.0%
376             Mjolnir Mjolnir         Heavy Mortar Hypervelocity Driver   5.437500                7.0%
381            Gauss Hephaestus               Heavy Needler Heavy Needler   5.437500                7.0%
162    Hephaestus Storm Needler             Heavy Autocannon Heavy Mauler   5.468750                6.4%
183    Hephaestus Storm Needler             Heavy Autocannon Heavy Mortar   5.468750                6.4%
203          Hephaestus Mjolnir            Heavy Autocannon Heavy Needler   5.468750                6.4%
291       Mark IX Storm Needler                Heavy Mauler Heavy Needler   5.468750                6.4%
416             Mark IX Mjolnir        Heavy Needler Hypervelocity Driver   5.468750                6.4%
4                 Gauss Mark IX                         Arbalest Arbalest   5.500000                5.8%
24             Gauss Hephaestus                 Arbalest Heavy Autocannon   5.500000                5.8%
32       Hellbore Storm Needler                 Arbalest Heavy Autocannon   5.500000                5.8%
57     Hephaestus Storm Needler                     Arbalest Heavy Mauler   5.500000                5.8%
137      Hellbore Storm Needler         Heavy Autocannon Heavy Autocannon   5.500000                5.8%
351    Hephaestus Storm Needler                Heavy Mortar Heavy Needler   5.500000                5.8%
438       Mark IX Storm Needler Hypervelocity Driver Hypervelocity Driver   5.500000                5.8%
3              Gauss Hephaestus                         Arbalest Arbalest   5.531250                5.2%
14           Hephaestus Mjolnir                         Arbalest Arbalest   5.531250                5.2%
165       Mark IX Storm Needler             Heavy Autocannon Heavy Mauler   5.531250                5.2%
237         Gauss Storm Needler                 Heavy Mauler Heavy Mauler   5.531250                5.2%
362               Gauss Mjolnir         Heavy Mortar Hypervelocity Driver   5.531250                5.2%
60        Mark IX Storm Needler                     Arbalest Heavy Mauler   5.562500                4.6%
78     Hephaestus Storm Needler                     Arbalest Heavy Mortar   5.562500                4.6%
136            Hellbore Mjolnir         Heavy Autocannon Heavy Autocannon   5.562500                4.6%
334             Mjolnir Mjolnir                 Heavy Mortar Heavy Mortar   5.562500                4.6%
353             Mark IX Mjolnir                Heavy Mortar Heavy Needler   5.562500                4.6%
358                 Gauss Gauss         Heavy Mortar Hypervelocity Driver   5.562500                4.6%
11       Hellbore Storm Needler                         Arbalest Arbalest   5.593750                4.0%
312       Mark IX Storm Needler         Heavy Mauler Hypervelocity Driver   5.593750                4.0%
122             Mark IX Mjolnir             Arbalest Hypervelocity Driver   5.625000                3.4%
205             Mark IX Mark IX            Heavy Autocannon Heavy Needler   5.625000                3.4%
227             Mark IX Mjolnir     Heavy Autocannon Hypervelocity Driver   5.625000                3.4%
313             Mjolnir Mjolnir         Heavy Mauler Hypervelocity Driver   5.625000                3.4%
375       Mark IX Storm Needler         Heavy Mortar Hypervelocity Driver   5.625000                3.4%
421                 Gauss Gauss Hypervelocity Driver Hypervelocity Driver   5.625000                3.4%
87             Gauss Hephaestus                    Arbalest Heavy Needler   5.656250                2.9%
59              Mark IX Mjolnir                     Arbalest Heavy Mauler   5.687500                2.3%
119          Hephaestus Mjolnir             Arbalest Hypervelocity Driver   5.687500                2.3%
161          Hephaestus Mjolnir             Heavy Autocannon Heavy Mauler   5.687500                2.3%
164             Mark IX Mjolnir             Heavy Autocannon Heavy Mauler   5.687500                2.3%
185             Mark IX Mjolnir             Heavy Autocannon Heavy Mortar   5.687500                2.3%
224          Hephaestus Mjolnir     Heavy Autocannon Hypervelocity Driver   5.687500                2.3%
270       Mark IX Storm Needler                 Heavy Mauler Heavy Mortar   5.687500                2.3%
316                 Gauss Gauss                 Heavy Mortar Heavy Mortar   5.687500                2.3%
320               Gauss Mjolnir                 Heavy Mortar Heavy Mortar   5.687500                2.3%
330    Hephaestus Storm Needler                 Heavy Mortar Heavy Mortar   5.687500                2.3%
372    Hephaestus Storm Needler         Heavy Mortar Hypervelocity Driver   5.687500                2.3%
403               Gauss Mark IX        Heavy Needler Hypervelocity Driver   5.687500                2.3%
435    Hephaestus Storm Needler Hypervelocity Driver Hypervelocity Driver   5.687500                2.3%
31             Hellbore Mjolnir                 Arbalest Heavy Autocannon   5.718750                1.7%
350          Hephaestus Mjolnir                Heavy Mortar Heavy Needler   5.718750                1.7%
56           Hephaestus Mjolnir                     Arbalest Heavy Mauler   5.750000                1.2%
77           Hephaestus Mjolnir                     Arbalest Heavy Mortar   5.750000                1.2%
80              Mark IX Mjolnir                     Arbalest Heavy Mortar   5.750000                1.2%
116      Hellbore Storm Needler             Arbalest Hypervelocity Driver   5.750000                1.2%
179      Hellbore Storm Needler             Heavy Autocannon Heavy Mortar   5.750000                1.2%
214               Gauss Mark IX     Heavy Autocannon Hypervelocity Driver   5.750000                1.2%
250             Mjolnir Mjolnir                 Heavy Mauler Heavy Mauler   5.750000                1.2%
257               Gauss Mjolnir                 Heavy Mauler Heavy Mortar   5.750000                1.2%
267    Hephaestus Storm Needler                 Heavy Mauler Heavy Mortar   5.750000                1.2%
271             Mjolnir Mjolnir                 Heavy Mauler Heavy Mortar   5.750000                1.2%
290             Mark IX Mjolnir                Heavy Mauler Heavy Needler   5.750000                1.2%
309    Hephaestus Storm Needler         Heavy Mauler Hypervelocity Driver   5.750000                1.2%
333       Mark IX Storm Needler                 Heavy Mortar Heavy Mortar   5.750000                1.2%
74       Hellbore Storm Needler                     Arbalest Heavy Mortar   5.781250                0.6%
94             Hellbore Mjolnir                    Arbalest Heavy Needler   5.781250                0.6%
158      Hellbore Storm Needler             Heavy Autocannon Heavy Mauler   5.781250                0.6%
295                 Gauss Gauss         Heavy Mauler Hypervelocity Driver   5.781250                0.6%
33        Hephaestus Hephaestus                 Arbalest Heavy Autocannon   5.812500                0.1%
53       Hellbore Storm Needler                     Arbalest Heavy Mauler   5.812500                0.1%
115            Hellbore Mjolnir             Arbalest Hypervelocity Driver   5.812500                0.1%
182          Hephaestus Mjolnir             Heavy Autocannon Heavy Mortar   5.812500                0.1%
199            Hellbore Mjolnir            Heavy Autocannon Heavy Needler   5.812500                0.1%
213            Gauss Hephaestus     Heavy Autocannon Hypervelocity Driver   5.812500                0.1%
220            Hellbore Mjolnir     Heavy Autocannon Hypervelocity Driver   5.812500                0.1%
221      Hellbore Storm Needler     Heavy Autocannon Hypervelocity Driver   5.812500                0.1%
249       Mark IX Storm Needler                 Heavy Mauler Heavy Mauler   5.812500                0.1%
253                 Gauss Gauss                 Heavy Mauler Heavy Mortar   5.812500                0.1%
299               Gauss Mjolnir         Heavy Mauler Hypervelocity Driver   5.812500                0.1%
340               Gauss Mark IX                Heavy Mortar Heavy Needler   5.812500                0.1%
410      Hellbore Storm Needler        Heavy Needler Hypervelocity Driver   5.812500                0.1%
413          Hephaestus Mjolnir        Heavy Needler Hypervelocity Driver   5.812500                0.1%
2                Gauss Hellbore                         Arbalest Arbalest   5.843750               -0.4%
100             Mark IX Mark IX                    Arbalest Heavy Needler   5.843750               -0.4%
284      Hellbore Storm Needler                Heavy Mauler Heavy Needler   5.843750               -0.4%
347      Hellbore Storm Needler                Heavy Mortar Heavy Needler   5.843750               -0.4%
10             Hellbore Mjolnir                         Arbalest Arbalest   5.875000               -1.0%
12        Hephaestus Hephaestus                         Arbalest Arbalest   5.875000               -1.0%
16              Mark IX Mark IX                         Arbalest Arbalest   5.875000               -1.0%
23               Gauss Hellbore                 Arbalest Heavy Autocannon   5.875000               -1.0%
37              Mark IX Mark IX                 Arbalest Heavy Autocannon   5.875000               -1.0%
73             Hellbore Mjolnir                     Arbalest Heavy Mortar   5.875000               -1.0%
109               Gauss Mark IX             Arbalest Hypervelocity Driver   5.875000               -1.0%
128              Gauss Hellbore         Heavy Autocannon Heavy Autocannon   5.875000               -1.0%
139          Hephaestus Mark IX         Heavy Autocannon Heavy Autocannon   5.875000               -1.0%
150            Gauss Hephaestus             Heavy Autocannon Heavy Mauler   5.875000               -1.0%
171            Gauss Hephaestus             Heavy Autocannon Heavy Mortar   5.875000               -1.0%
172               Gauss Mark IX             Heavy Autocannon Heavy Mortar   5.875000               -1.0%
246    Hephaestus Storm Needler                 Heavy Mauler Heavy Mauler   5.875000               -1.0%
277               Gauss Mark IX                Heavy Mauler Heavy Needler   5.875000               -1.0%
287          Hephaestus Mjolnir                Heavy Mauler Heavy Needler   5.875000               -1.0%
"Gauss Mark IX"   "Heavy Autocannon Heavy Mauler"   5.90625   "-1.5%"
"Hellbore Mjolnir"   "Heavy Needler Hypervelocity Driver"   5.90625   "-1.5%"
"Hephaestus Mark IX"   "Arbalest Arbalest"   5.9375   "-2.0%"
"Hephaestus Mark IX"   "Arbalest Heavy Autocannon"   5.9375   "-2.0%"
"Gauss Hephaestus"   "Arbalest Heavy Mortar"   5.9375   "-2.0%"
"Gauss Mark IX"   "Arbalest Heavy Mortar"   5.9375   "-2.0%"
"Hephaestus Hephaestus"   "Arbalest Heavy Needler"   5.9375   "-2.0%"
"Hephaestus Hephaestus"   "Heavy Autocannon Heavy Autocannon"   5.9375   "-2.0%"
"Hellbore Mjolnir"   "Heavy Autocannon Heavy Mortar"   5.9375   "-2.0%"
"Hephaestus Hephaestus"   "Heavy Autocannon Heavy Needler"   5.9375   "-2.0%"
"Gauss Mjolnir"   "Heavy Mauler Heavy Mauler"   5.9375   "-2.0%"
"Mark IX Mjolnir"   "Heavy Mortar Heavy Mortar"   5.9375   "-2.0%"
"Hellbore Mjolnir"   "Heavy Mortar Heavy Needler"   5.9375   "-2.0%"
"Hellbore Mjolnir"   "Heavy Needler Heavy Needler"   5.9375   "-2.0%"
"Hephaestus Mark IX"   "Heavy Needler Heavy Needler"   5.9375   "-2.0%"
"Hellbore Storm Needler"   "Hypervelocity Driver Hypervelocity Driver"   5.9375   "-2.0%"
"Hellbore Storm Needler"   "Heavy Mortar Heavy Mortar"   5.96875   "-2.5%"
"Mark IX Mjolnir"   "Hypervelocity Driver Hypervelocity Driver"   5.96875   "-2.5%"
"Gauss Hephaestus"   "Arbalest Heavy Mauler"   6   "-3.0%"
"Gauss Mark IX"   "Arbalest Heavy Mauler"   6   "-3.0%"
"Gauss Hellbore"   "Arbalest Heavy Needler"   6   "-3.0%"
"Gauss Hephaestus"   "Arbalest Hypervelocity Driver"   6   "-3.0%"
"Hephaestus Mark IX"   "Heavy Autocannon Heavy Needler"   6   "-3.0%"
"Gauss Hephaestus"   "Heavy Mortar Heavy Needler"   6   "-3.0%"
"Gauss Hephaestus"   "Heavy Mortar Hypervelocity Driver"   6   "-3.0%"
"Hellbore Storm Needler"   "Heavy Mortar Hypervelocity Driver"   6   "-3.0%"
"Gauss Hellbore"   "Heavy Needler Heavy Needler"   6   "-3.0%"
"Gauss Hephaestus"   "Heavy Needler Hypervelocity Driver"   6   "-3.0%"
"Gauss Mark IX"   "Hypervelocity Driver Hypervelocity Driver"   6   "-3.0%"
"Hephaestus Mjolnir"   "Hypervelocity Driver Hypervelocity Driver"   6   "-3.0%"
"Hephaestus Mark IX"   "Arbalest Heavy Needler"   6.03125   "-3.5%"
"Mark IX Mark IX"   "Heavy Autocannon Heavy Mortar"   6.03125   "-3.5%"
"Mark IX Mjolnir"   "Heavy Mauler Hypervelocity Driver"   6.03125   "-3.5%"
"Mark IX Mjolnir"   "Heavy Mortar Hypervelocity Driver"   6.03125   "-3.5%"
"Mark IX Mark IX"   "Arbalest Hypervelocity Driver"   6.0625   "-4.0%"
"Mark IX Mark IX"   "Heavy Autocannon Heavy Autocannon"   6.0625   "-4.0%"
"Gauss Hellbore"   "Heavy Autocannon Heavy Needler"   6.0625   "-4.0%"
"Hephaestus Mark IX"   "Heavy Autocannon Hypervelocity Driver"   6.0625   "-4.0%"
"Mark IX Mark IX"   "Heavy Autocannon Hypervelocity Driver"   6.0625   "-4.0%"
"Hellbore Storm Needler"   "Heavy Mauler Heavy Mortar"   6.0625   "-4.0%"
"Mark IX Mjolnir"   "Heavy Mauler Heavy Mortar"   6.0625   "-4.0%"
"Gauss Hephaestus"   "Heavy Mauler Heavy Needler"   6.0625   "-4.0%"
"Hellbore Mjolnir"   "Heavy Mauler Heavy Needler"   6.0625   "-4.0%"
"Mark IX Mark IX"   "Heavy Mortar Heavy Needler"   6.0625   "-4.0%"
"Gauss Mark IX"   "Heavy Mortar Hypervelocity Driver"   6.0625   "-4.0%"
"Hephaestus Hephaestus"   "Heavy Needler Hypervelocity Driver"   6.0625   "-4.0%"
"Gauss Hellbore"   "Arbalest Hypervelocity Driver"   6.09375   "-4.5%"
"Hephaestus Hephaestus"   "Arbalest Hypervelocity Driver"   6.09375   "-4.5%"
"Mark IX Mark IX"   "Arbalest Heavy Mauler"   6.125   "-5.0%"
"Mark IX Mark IX"   "Arbalest Heavy Mortar"   6.125   "-5.0%"
"Hellbore Mark IX"   "Arbalest Heavy Needler"   6.125   "-5.0%"
"Hephaestus Mark IX"   "Arbalest Hypervelocity Driver"   6.125   "-5.0%"
"Hellbore Mark IX"   "Heavy Autocannon Heavy Autocannon"   6.125   "-5.0%"
"Mark IX Mark IX"   "Heavy Autocannon Heavy Mauler"   6.125   "-5.0%"
"Hellbore Mark IX"   "Heavy Autocannon Heavy Needler"   6.125   "-5.0%"
"Gauss Gauss"   "Heavy Mauler Heavy Mauler"   6.125   "-5.0%"
"Mark IX Mjolnir"   "Heavy Mauler Heavy Mauler"   6.125   "-5.0%"
"Gauss Mark IX"   "Heavy Mauler Heavy Mortar"   6.125   "-5.0%"
"Hellbore Storm Needler"   "Heavy Mauler Hypervelocity Driver"   6.125   "-5.0%"
"Gauss Hephaestus"   "Heavy Mortar Heavy Mortar"   6.125   "-5.0%"
"Hephaestus Hephaestus"   "Heavy Needler Heavy Needler"   6.125   "-5.0%"
"Mark IX Mark IX"   "Heavy Needler Heavy Needler"   6.125   "-5.0%"
"Gauss Hephaestus"   "Hypervelocity Driver Hypervelocity Driver"   6.125   "-5.0%"
"Hephaestus Mark IX"   "Heavy Autocannon Heavy Mortar"   6.15625   "-5.5%"
"Hephaestus Mjolnir"   "Heavy Mortar Heavy Mortar"   6.15625   "-5.5%"
"Hephaestus Mjolnir"   "Heavy Mortar Hypervelocity Driver"   6.15625   "-5.5%"
"Hellbore Mark IX"   "Arbalest Arbalest"   6.1875   "-6.0%"
"Hellbore Mark IX"   "Arbalest Heavy Autocannon"   6.1875   "-6.0%"
"Hephaestus Mark IX"   "Arbalest Heavy Mortar"   6.1875   "-6.0%"
"Hellbore Mjolnir"   "Heavy Autocannon Heavy Mauler"   6.1875   "-6.0%"
"Gauss Hellbore"   "Heavy Autocannon Hypervelocity Driver"   6.1875   "-6.0%"
"Gauss Mark IX"   "Heavy Mauler Heavy Mauler"   6.1875   "-6.0%"
"Hellbore Storm Needler"   "Heavy Mauler Heavy Mauler"   6.1875   "-6.0%"
"Gauss Hephaestus"   "Heavy Mauler Hypervelocity Driver"   6.1875   "-6.0%"
"Gauss Mark IX"   "Heavy Mortar Heavy Mortar"   6.1875   "-6.0%"
"Gauss Hellbore"   "Heavy Needler Hypervelocity Driver"   6.1875   "-6.0%"
"Hephaestus Mark IX"   "Heavy Needler Hypervelocity Driver"   6.1875   "-6.0%"
"Hephaestus Mark IX"   "Heavy Autocannon Heavy Mauler"   6.21875   "-6.4%"
"Hephaestus Mark IX"   "Heavy Mauler Heavy Needler"   6.25   "-6.9%"
"Gauss Mark IX"   "Heavy Mauler Hypervelocity Driver"   6.25   "-6.9%"
"Hephaestus Mark IX"   "Heavy Mortar Heavy Needler"   6.25   "-6.9%"
"Hellbore Hephaestus"   "Heavy Needler Heavy Needler"   6.25   "-6.9%"
"Hellbore Hephaestus"   "Arbalest Heavy Needler"   6.28125   "-7.4%"
"Mark IX Mark IX"   "Heavy Mortar Hypervelocity Driver"   6.28125   "-7.4%"
"Hellbore Hephaestus"   "Arbalest Heavy Autocannon"   6.3125   "-7.8%"
"Hellbore Mjolnir"   "Arbalest Heavy Mauler"   6.3125   "-7.8%"
"Hephaestus Mark IX"   "Arbalest Heavy Mauler"   6.3125   "-7.8%"
"Gauss Hellbore"   "Heavy Autocannon Heavy Mortar"   6.3125   "-7.8%"
"Hephaestus Hephaestus"   "Heavy Autocannon Heavy Mortar"   6.3125   "-7.8%"
"Hellbore Hephaestus"   "Heavy Autocannon Heavy Needler"   6.3125   "-7.8%"
"Hephaestus Mjolnir"   "Heavy Mauler Hypervelocity Driver"   6.3125   "-7.8%"
"Hephaestus Hephaestus"   "Heavy Mortar Heavy Needler"   6.3125   "-7.8%"
"Mark IX Mark IX"   "Heavy Needler Hypervelocity Driver"   6.3125   "-7.8%"
"Hellbore Mjolnir"   "Hypervelocity Driver Hypervelocity Driver"   6.34375   "-8.3%"
"Hephaestus Hephaestus"   "Arbalest Heavy Mortar"   6.375   "-8.7%"
"Hellbore Mark IX"   "Arbalest Hypervelocity Driver"   6.375   "-8.7%"
"Hephaestus Hephaestus"   "Heavy Autocannon Hypervelocity Driver"   6.375   "-8.7%"
"Hephaestus Mjolnir"   "Heavy Mauler Heavy Mortar"   6.375   "-8.7%"
"Gauss Hephaestus"   "Heavy Mauler Heavy Mortar"   6.40625   "-9.2%"
"Hellbore Mark IX"   "Heavy Autocannon Hypervelocity Driver"   6.4375   "-9.6%"
"Mark IX Mark IX"   "Heavy Mauler Heavy Needler"   6.4375   "-9.6%"
"Gauss Hellbore"   "Heavy Mortar Heavy Needler"   6.4375   "-9.6%"
"Hephaestus Hephaestus"   "Arbalest Heavy Mauler"   6.46875   "-10.1%"
"Hellbore Hephaestus"   "Arbalest Arbalest"   6.5   "-10.5%"
"Gauss Hellbore"   "Arbalest Heavy Mauler"   6.5   "-10.5%"
"Hellbore Hephaestus"   "Heavy Autocannon Heavy Autocannon"   6.5   "-10.5%"
"Hephaestus Mjolnir"   "Heavy Mauler Heavy Mauler"   6.5   "-10.5%"
"Gauss Hellbore"   "Heavy Autocannon Heavy Mauler"   6.5625   "-11.3%"
"Hephaestus Hephaestus"   "Heavy Autocannon Heavy Mauler"   6.5625   "-11.3%"
"Gauss Hellbore"   "Heavy Mauler Heavy Needler"   6.5625   "-11.3%"
"Gauss Hellbore"   "Arbalest Heavy Mortar"   6.59375   "-11.8%"
"Gauss Hephaestus"   "Heavy Mauler Heavy Mauler"   6.625   "-12.2%"
"Hellbore Mjolnir"   "Heavy Mortar Heavy Mortar"   6.625   "-12.2%"
"Hellbore Mjolnir"   "Heavy Mortar Hypervelocity Driver"   6.625   "-12.2%"
"Hellbore Mjolnir"   "Heavy Mauler Hypervelocity Driver"   6.6875   "-13.0%"
"Hellbore Hellbore"   "Arbalest Heavy Needler"   6.75   "-13.8%"
"Hellbore Mjolnir"   "Heavy Mauler Heavy Mortar"   6.75   "-13.8%"
"Hephaestus Hephaestus"   "Heavy Mauler Heavy Needler"   6.75   "-13.8%"
"Gauss Hellbore"   "Heavy Mortar Hypervelocity Driver"   6.75   "-13.8%"
"Hephaestus Mark IX"   "Heavy Mortar Hypervelocity Driver"   6.75   "-13.8%"
"Hellbore Hephaestus"   "Heavy Needler Hypervelocity Driver"   6.75   "-13.8%"
"Hephaestus Mark IX"   "Hypervelocity Driver Hypervelocity Driver"   6.75   "-13.8%"
"Hellbore Hephaestus"   "Heavy Mortar Heavy Needler"   6.78125   "-14.2%"
"Hellbore Mark IX"   "Heavy Needler Hypervelocity Driver"   6.78125   "-14.2%"
"Mark IX Mark IX"   "Heavy Mauler Heavy Mortar"   6.8125   "-14.6%"
"Hellbore Mark IX"   "Heavy Mortar Heavy Needler"   6.8125   "-14.6%"
"Hellbore Mark IX"   "Heavy Needler Heavy Needler"   6.8125   "-14.6%"
"Hellbore Hephaestus"   "Heavy Autocannon Hypervelocity Driver"   6.84375   "-15.0%"
"Hephaestus Mark IX"   "Heavy Mauler Heavy Mortar"   6.84375   "-15.0%"
"Hellbore Hephaestus"   "Arbalest Hypervelocity Driver"   6.875   "-15.4%"
"Hellbore Mark IX"   "Heavy Autocannon Heavy Mortar"   6.875   "-15.4%"
"Hephaestus Mark IX"   "Heavy Mauler Heavy Mauler"   6.875   "-15.4%"
"Hephaestus Mark IX"   "Heavy Mauler Hypervelocity Driver"   6.875   "-15.4%"
"Gauss Hellbore"   "Heavy Mortar Heavy Mortar"   6.875   "-15.4%"
"Hephaestus Hephaestus"   "Heavy Mortar Heavy Mortar"   6.875   "-15.4%"
"Mark IX Mark IX"   "Heavy Mortar Heavy Mortar"   6.875   "-15.4%"
"Hephaestus Hephaestus"   "Hypervelocity Driver Hypervelocity Driver"   6.875   "-15.4%"
"Mark IX Mark IX"   "Hypervelocity Driver Hypervelocity Driver"   6.875   "-15.4%"
"Hellbore Mark IX"   "Arbalest Heavy Mortar"   6.90625   "-15.8%"
"Hephaestus Mark IX"   "Heavy Mortar Heavy Mortar"   6.90625   "-15.8%"
"Hellbore Hephaestus"   "Arbalest Heavy Mauler"   6.9375   "-16.1%"
"Hellbore Hephaestus"   "Heavy Autocannon Heavy Mauler"   6.9375   "-16.1%"
"Hellbore Mark IX"   "Heavy Autocannon Heavy Mauler"   6.9375   "-16.1%"
"Hellbore Hellbore"   "Heavy Autocannon Heavy Needler"   6.9375   "-16.1%"
"Hellbore Mjolnir"   "Heavy Mauler Heavy Mauler"   6.9375   "-16.1%"
"Hellbore Hephaestus"   "Heavy Mauler Heavy Needler"   6.9375   "-16.1%"
"Hephaestus Hephaestus"   "Heavy Mauler Hypervelocity Driver"   6.9375   "-16.1%"
"Mark IX Mark IX"   "Heavy Mauler Hypervelocity Driver"   6.9375   "-16.1%"
"Gauss Hellbore"   "Heavy Mauler Heavy Mortar"   6.96875   "-16.5%"
"Gauss Hellbore"   "Heavy Mauler Hypervelocity Driver"   6.96875   "-16.5%"
"Hellbore Mark IX"   "Arbalest Heavy Mauler"   7   "-16.9%"
"Hellbore Hellbore"   "Heavy Autocannon Heavy Autocannon"   7   "-16.9%"
"Hephaestus Hephaestus"   "Heavy Mortar Hypervelocity Driver"   7   "-16.9%"
"Gauss Hellbore"   "Hypervelocity Driver Hypervelocity Driver"   7   "-16.9%"
"Hellbore Hephaestus"   "Heavy Autocannon Heavy Mortar"   7.03125   "-17.3%"
"Hellbore Hephaestus"   "Arbalest Heavy Mortar"   7.0625   "-17.6%"
"Hellbore Hellbore"   "Arbalest Arbalest"   7.125   "-18.3%"
"Hephaestus Hephaestus"   "Heavy Mauler Heavy Mortar"   7.125   "-18.3%"
"Hellbore Mark IX"   "Heavy Mauler Heavy Needler"   7.15625   "-18.7%"
"Hellbore Hellbore"   "Arbalest Heavy Autocannon"   7.1875   "-19.1%"
"Hephaestus Hephaestus"   "Heavy Mauler Heavy Mauler"   7.1875   "-19.1%"
"Mark IX Mark IX"   "Heavy Mauler Heavy Mauler"   7.1875   "-19.1%"
"Hellbore Mark IX"   "Heavy Mortar Hypervelocity Driver"   7.25   "-19.7%"
"Hellbore Hellbore"   "Heavy Needler Heavy Needler"   7.25   "-19.7%"
"Hellbore Hephaestus"   "Hypervelocity Driver Hypervelocity Driver"   7.25   "-19.7%"
"Hellbore Hellbore"   "Heavy Autocannon Hypervelocity Driver"   7.3125   "-20.4%"
"Gauss Hellbore"   "Heavy Mauler Heavy Mauler"   7.3125   "-20.4%"
"Hellbore Mark IX"   "Hypervelocity Driver Hypervelocity Driver"   7.3125   "-20.4%"
"Hellbore Mark IX"   "Heavy Mortar Heavy Mortar"   7.375   "-21.1%"
"Hellbore Hellbore"   "Heavy Needler Hypervelocity Driver"   7.40625   "-21.4%"
"Hellbore Hellbore"   "Arbalest Hypervelocity Driver"   7.4375   "-21.8%"
"Hellbore Mark IX"   "Heavy Mauler Heavy Mortar"   7.4375   "-21.8%"
"Hellbore Hellbore"   "Heavy Mortar Heavy Needler"   7.4375   "-21.8%"
"Hellbore Hephaestus"   "Heavy Mortar Hypervelocity Driver"   7.4375   "-21.8%"
"Hellbore Hellbore"   "Heavy Autocannon Heavy Mortar"   7.5   "-22.4%"
"Hellbore Hellbore"   "Arbalest Heavy Mortar"   7.5625   "-23.1%"
"Hellbore Hephaestus"   "Heavy Mauler Hypervelocity Driver"   7.5625   "-23.1%"
"Hellbore Mark IX"   "Heavy Mauler Hypervelocity Driver"   7.5625   "-23.1%"
"Hellbore Hellbore"   "Heavy Autocannon Heavy Mauler"   7.625   "-23.7%"
"Hellbore Hephaestus"   "Heavy Mortar Heavy Mortar"   7.625   "-23.7%"
"Hellbore Hellbore"   "Arbalest Heavy Mauler"   7.75   "-24.9%"
"Hellbore Hephaestus"   "Heavy Mauler Heavy Mortar"   7.75   "-24.9%"
"Hellbore Hephaestus"   "Heavy Mauler Heavy Mauler"   7.78125   "-25.2%"
"Hellbore Mark IX"   "Heavy Mauler Heavy Mauler"   8   "-27.3%"
"Hellbore Hellbore"   "Heavy Mauler Heavy Needler"   8   "-27.3%"
"Hellbore Hellbore"   "Heavy Mortar Hypervelocity Driver"   8.03125   "-27.6%"
"Hellbore Hellbore"   "Hypervelocity Driver Hypervelocity Driver"   8.1875   "-28.9%"
"Hellbore Hellbore"   "Heavy Mauler Heavy Mortar"   8.375   "-30.5%"
"Hellbore Hellbore"   "Heavy Mortar Heavy Mortar"   8.375   "-30.5%"
"Hellbore Hellbore"   "Heavy Mauler Hypervelocity Driver"   9.1875   "-36.7%"
"Hellbore Hellbore"   "Heavy Mauler Heavy Mauler"   10.5625   "-44.9%"

[close]

Sorry, no flux table for the 2x2 combinations due to lack of computing power or desire to rewrite code anymore. Also sorry about formatting issues near end of table.

Here's the code
weaponsoptimize.R
armordamagematrix <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.022,0.136,0.341,0.341,0.136,0.022)

#ships -
#ship, hullhp, shieldregen, shieldmax, startingarmor, name
glimmer <- c(1500, 250/0.6, 2500/0.6, 200, "glimmer")
brawlerlp <- c(2000, 500/0.8, 3000/0.8, 450, "brawlerlp")
vanguard <- c(3000, 150, 2000, 600, "vanguard")
tempest <- c(1250, 225/0.6, 2500/0.6, 200, "tempest")
medusa <- c(3000,400/0.6,6000/0.6,300, "medusa")
hammerhead <- c(5000,250/0.8,4200/0.8,500, "hammerhead")
enforcer <- c(4000,200,4000,900, "enforcer")
dominator <- c(14000, 500, 10000, 1500, "dominator")
fulgent <- c(5000,300/0.6,5000/0.6,450,"fulgent")
brilliant <- c(8000,600/0.6,10000/0.6,900,"brilliant")
radiant <- c(20000,1500/0.6,25000/0.6,1500,"radiant")
onslaught <- c(20000,600,17000,1750,"onslaught")
aurora <- c(8000,800/0.8,11000/0.8,800, "aurora")
paragon <- c(18000,1250/0.6,25000/0.6,1500,"paragon")
conquest <- c(12000,1200/1.4,20000/1.4,1200,"conquest")
champion <- c(10000,550/0.8,10000/0.8,1250, "champion")

ships <- list(glimmer, brawlerlp, vanguard, tempest, medusa, hammerhead, enforcer, dominator, fulgent, brilliant,radiant,onslaught,aurora,paragon,conquest,champion)

for (f in 1:length(ships)){

ship <- ships[[f]]
shipname <- ship[[5]]
ship <- as.double(ship[1:4])

for (i in 1:6) {
  armordamagematrix[,i:(i+4)] <- armordamagematrix[,i:(i+4)]+b*normaldistpoints
}

armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,useminarmor,startingarmor) {
  if(useminarmor == 0){
    if(armor == 0) {return (damage)}
    return(damage*(max(0.15,damage/(damage+armor))))
  }
  else{
    return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
  }
}

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles in 1 second, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds, taking .4 seconds for the burst, so 20 shots / 17 seconds in bursts of 4
markixtics <- c(4,0,0,4,0,0,4,0,0,4,0,0,0,4,0,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1,1,2,1,2,1,2,1,1)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

#arbalest fires 1 shot every 1.2 seconds, so 5 shots / 6 seconds
arbalesttics <- c(1,1,1,0,1,1)
arbalest <- list(200, 2, arbalesttics, "Arbalest")
#heavy mauler fires a burst of 3, taking .9 seconds to do so, then recharges for 4.5 seconds. So total of 3 shots / 5.4 seconds, so total of 15 shots / 27 seconds in bursts of 3.
heavymaulertics <- c(3,0,0,0,0,0,3,0,0,0,0,3,0,0,0,0,3,0,0,0,0,3,0,0,0,0,0)
heavymauler <- list(200,0.5,heavymaulertics, "Heavy Mauler")
#heavy autocannon takes .6 seconds to fire a burst, then recharges for 1 second. So 3 shots / 1.6 secs, so 15 shots / 8 secs in bursts
hactics <- c(3,0,3,3,0,3,3,0)
hac <- list(100, 2, hactics, "Heavy Autocannon")
hvdtics <- c(1,0,0)
hvd <- list(275,2,hvdtics,"Hypervelocity Driver")
#heavy needler fires a burst of 30 needles with 0.05 sec intervals (1.5 sec) and then recharges for 4.55 sec (round to 4.5 sec)
needlertics <- c(20,10,0,0,0,0)
needler <- list(50,2,needlertics,"Heavy Needler")
#heavy mortar fires a burst of 2 rounds, taking .6 seconds to do so, then recharges for .7 seconds. So a total of 2 rounds every 1.3 seconds, so 20 rounds / 13 seconds in bursts of 2.
mortartics <- c(2,2,0,2,2,2,2,0,2,2,2,0,2)
mortar <- list(110,0.5,mortartics, "Heavy Mortar")
#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")


weapon1 <- squall
weapon2 <- squall
weapon3 <- harpoon
weapon4 <- harpoon
weapon5 <- mjolnir
weapon6 <- mjolnir

weapon1choices <- list(squall)
weapon2choices <- list(squall)
weapon3choices <- list(harpoon)
weapon4choices <- list(harpoon)
weapon5choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler)
weapon6choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler)
weapon7choices <- list(arbalest, heavymauler, hac, hvd, needler, mortar)
weapon8choices <- list(arbalest, heavymauler, hac, hvd, needler, mortar)


timeseriesarray <- data.frame(matrix(ncol = 7,nrow=0))



timetokill=0


shieldblock <- 0

shielddamageattimepoint <- function(weapon, timepoint){
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    return(weapon[[1]]*nohits)
  }
}

damageattimepoint <- function(weapon, timepoint, armor, useminarmor, startingarmor, hitx, hity){
  # vectors in R are indexed starting from 1
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    damagesum <- 0
    for (i in 1:nohits) {
      damagesum <- damagesum + armordamageselectivereduction(weapon[[1]]*armordamagematrix[hitx,hity],armor,useminarmor,startingarmor)
    }
    return(damagesum)
  }
}
timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
  #are we using shield to block?
  shieldblock <- 0
  hulldamage <- 0
  if(hullhp > 0){} else {shieldhp <- 0}
  useminarmor <- 0
  #are we using the 5% minimum armor rule? deduce this by applying a weighted average of armor
  if(weighted.mean(armormatrix,armordamagematrix) <= startingarmor/15*0.05){useminarmor <- 1
  }
 
  #1. shields. if shieldhp is sufficient, use shield to block
  if (weapon1[[4]] !=""){
    weapon1mult <- unlist(weapon1[2])
    if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon1,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon1mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  #repeat for other weapons
 
  if (weapon2[[4]] !=""){
    weapon2mult <- unlist(weapon2[2])
    if (shieldhp > shielddamageattimepoint(weapon2, timepoint)*weapon2mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon2, timepoint)*weapon2mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon2,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon2mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon3[[4]] !=""){
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > shielddamageattimepoint(weapon3, timepoint)*weapon3mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon3, timepoint)*weapon3mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon3,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon3mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon4[[4]] !=""){
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > shielddamageattimepoint(weapon4, timepoint)*weapon4mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon4, timepoint)*weapon4mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon4,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon4mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon5[[4]] !=""){
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > shielddamageattimepoint(weapon5, timepoint)*weapon5mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon5, timepoint)*weapon5mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon5,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon5mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (weapon6[[4]] !=""){
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > shielddamageattimepoint(weapon6, timepoint)*weapon6mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon6, timepoint)*weapon6mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon6,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon6mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon7[[4]] !=""){
    weapon7mult <- unlist(weapon7[2])
    if (shieldhp > shielddamageattimepoint(weapon7, timepoint)*weapon7mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon7, timepoint)*weapon7mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon7,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon7[2])==0.25){weapon7mult = 0.25} else {weapon7mult= 1 / unlist(weapon7[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon7mult*damageattimepoint(weapon7, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon7mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon7mult*damageattimepoint(weapon7, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon7mult*damageattimepoint(weapon7, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon7mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon7mult*damageattimepoint(weapon7, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon7mult*damageattimepoint(weapon7, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon7mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon7mult*damageattimepoint(weapon7, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
  if (weapon8[[4]] !=""){
    weapon8mult <- unlist(weapon8[2])
    if (shieldhp > shielddamageattimepoint(weapon8, timepoint)*weapon8mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon8, timepoint)*weapon8mult
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon8,timepoint) > 0) {shieldblock <- 1}
    } else {
     
      if(unlist(weapon8[2])==0.25){weapon8mult = 0.25} else {weapon8mult= 1 / unlist(weapon8[2])}
      hulldamage <- 0   
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon8mult*damageattimepoint(weapon8, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon8mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon8mult*damageattimepoint(weapon8, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon8mult*damageattimepoint(weapon8, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon8mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon8mult*damageattimepoint(weapon8, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon8mult*damageattimepoint(weapon8, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j)-armormatrix[i,j])/weapon8mult
         
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon8mult*damageattimepoint(weapon8, timepoint,armormatrix[i,j],useminarmor,startingarmor,i,j))
        }}
     
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
 
 
  if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
  return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}

totaltime = 500



armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0
timetokill <- 0

for (i in 1:length(weapon1choices)) {
  weapon1<-weapon1choices[]
  for (j in 1:length(weapon2choices)) {
    weapon2<-weapon2choices[[j]]
    for (k in 1:length(weapon3choices)) {
      weapon3<-weapon3choices[[k]]
      for (l in 1:length(weapon4choices)) {
        weapon4<-weapon4choices[[l]]
        for (m in 1:length(weapon5choices)) {
          weapon5<-weapon5choices[[m]]
          for (n in 1:length(weapon6choices)) {
            weapon6<-weapon6choices[[n]]
            for (o in 1:length(weapon7choices)) {
              weapon7<-weapon7choices[
  • ]

              for (p in 1:length(weapon8choices)) {
                weapon8<-weapon8choices[[p]]
for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
  shieldhp <- state[[2]]
  armorhp <- state[[3]]
  hullhp <- state[[4]]
  flux <- shieldmax - shieldhp
  armormatrix <- state[[8]]
  if(hullhp == 0){flux <- 0
  if (timetokill == 0){timetokill <- t
  break}
  }
 
}
if (timetokill ==0){timetokill <- NA}

tobind <- c(timetokill,unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]),unlist(weapon7[4]),unlist(weapon8[4]))
timeseriesarray <- rbind(timeseriesarray,tobind)

armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0
timetokill <- 0
          }
        }
      }
    }
  }
}
  }
}
colnames(timeseriesarray) <-  c("Timetokill", "Weapon1", "Weapon2", "Weapon3", "Weapon4", "Weapon5", "Weapon6", "Weapon7", "Weapon8")

write.table(timeseriesarray, file = "optimizeweapons.tsv", row.names=FALSE, sep="\t")

sortbytime <- timeseriesarray[order(as.integer(timeseriesarray$Timetokill)),]

write.table(sortbytime, file = paste("optimizeweaponsbytime",shipname,"medguns.txt", sep=""), row.names=FALSE, sep="\t")
}
[close]
weapontotalscore.R
#please excuse my terrible programming style in this one

weaponnames <- c("Squall", "Locust", "Hurricane", "Sabot", "Harpoon", "Gauss", "Mark IX", "Hellbore", "Hephaestus", "Mjolnir", "Storm Needler")
shipnames <- c("glimmer", "brawlerlp", "vanguard", "tempest", "medusa", "hammerhead", "enforcer", "dominator", "fulgent", "brilliant","radiant","onslaught","aurora","paragon","conquest","champion")
lmnames <- c("Squall", "Locust", "Hurricane")
mrmnames <- c("Sabot", "Harpoon")

#name, flux / sec, range, range with itu + bm + gi (+85 total for ballistic & energy, +0 for missiles)
gauss <- c("Gauss", 600, 1200, 1.85*1200)
markix <- c("Mark IX", 348, 900, 1.85*900)
hellbore <- c("Hellbore", 250, 900, 1.85*900)
stormneedler <- c("Storm Needler", 350,700,1.85*700)
mjolnir <-c("Mjolnir", 667, 900, 1.85*900)
hephaestus <-c("Hephaestus", 480, 900, 1.85*900)

squall <-c("Squall",0,2500,2500)
harpoon <-c("Harpoon",0,2500,2500)
sabot <-c("Sabot",0,1400,1400)
locust <-c("Locust",0,1400,1400)
hurricane <-c("Hurricane",0,2500,2500)

mortar <-c("Heavy Mortar",180,700,1.85*700)
hac <-c("Heavy Autocannon", 214,800,1.85*800)
arbalest <-c("Arbalest",125,700,1.85*700)
heavymauler <-c("Heavy Mauler",120,1000,1.85*1000)
hvd <-c("Hypervelocity Driver",175,1000,1.85*1000)
needler <-c("Heavy Needler",200,700,1.85*700)

lms <- list(squall, locust, hurricane)
mrms <- list(harpoon, sabot)
guns <- list(gauss, markix, hellbore, stormneedler, mjolnir, hephaestus)
smallguns <- list(mortar, hac, arbalest, heavymauler, hvd, needler)

lmcolumns <- c(2,3)
mrmcolumns <- c(4,5)
guncolumns <- c(6,7)
smallguncolumns <-c(8,9)

filename <- function(x) paste("optimizeweaponsbytime", shipnames
  • , "medguns.txt", sep="")

readfile <- function(filename) read.csv(filename, sep = "\t")

shiparray <- lapply(1:length(shipnames), function(x) readfile(filename(x)))
#compute mean for every ship beforehand
for (i in 1:length(shiparray)){
  shiparray[] <- cbind(shiparray[], mean(shiparray[][,1]))
}

timemean <- function(ship,wpnname) mean(ship[which(ship==wpnname, arr.ind=TRUE)[,1],1])/ship[1,10]
xycontains <- function(ship,wpnname,row,column) if(ship[row,column]==wpnname) {return(TRUE)} else {return(FALSE)}
xypair <- function(ship,wpnnamea,wpnnameb,row,columna,columnb) if((xycontains(ship,wpnnamea,row,columna) | xycontains(ship,wpnnamea,row,columnb)) & (xycontains(ship,wpnnameb,row,columna) | xycontains(ship,wpnnameb,row,columnb))) {return(TRUE)} else {return(FALSE)}
pairtimemean <- function(ship,wpnnamea,wpnnameb,columna,columnb){
  localsum <- 0
  increment <- 0
  #calculate the mean time for this pair to kill the ship
  for (h in 1:length(ship[,1])){
    if(xypair(ship,wpnnamea,wpnnameb,h,columna,columnb)){
      localsum <- localsum + ship[h,1]
      increment <- increment + 1
    }
  }
  return(localsum/(increment*ship[1,10]))
}


doublepairtimemean <- function(ship,wpnnamea,wpnnameb,wpnnamec,wpnnamed,columna,columnb,columnc,columnd){
  localsum <- 0
  increment <- 0
  for (h in 1:length(ship[,1])){
    if(xypair(ship,wpnnamea,wpnnameb,h,columna,columnb)){
      # this dumb hack deals with the double counting problem
      if(wpnnamea==wpnnameb){ factor <- 0.5} else {factor <- 1}
      if(xypair(ship,wpnnamec,wpnnamed,h,columnc,columnd))
      # this dumb hack deals with the double counting problem
      if(wpnnamec==wpnnamed){
        localsum <- localsum + (ship[h,1]*factor/2)
      }else{
      localsum <- localsum + ship[h,1]
      }
      increment <- increment + 1
    }
  }
  return(localsum/(increment*ship[1,10]))
}



timearray <- function(guns){
  pairarray <- data.frame()
  for(i in 1:length(guns)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        localsum <- localsum + (timemean(shiparray[[k]],guns[][1]))
      }
      pairarray <- (rbind(pairarray, c(guns[][1],localsum/length(shipnames),localsum/length(shipnames)*as.double(guns[][2]),guns[][3],guns[][4])))
   
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  pairarray[,3] <- as.double(pairarray[,3])/median(as.double(pairarray[,3]))-1
  colnames(pairarray) <- c("Weapon", "Score", "","","")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. killing speed","Avg. flux","Range (no mods)", "Range(ITU+BM+GI)")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  pairarray[,3] <- sprintf("%0.1f%%", pairarray[,3] * 100)
 
  print(pairarray)
}

pairtimearray <- function(guns,columna,columnb){
  pairarray <- data.frame()
  for(i in 1:length(guns)){
    for(j in 1:length(guns)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        #calculate the average time for these weapons to kill the ship
        localsum <- localsum + (pairtimemean(shiparray[[k]],guns[][1],guns[[j]][1],columna,columnb))

      }
      pairarray <- (rbind(pairarray, c(paste(guns[][1],guns[[j]][1]),localsum/length(shipnames),localsum/length(shipnames)*(as.double(guns[][2])+as.double(guns[[j]][2])),min(as.double(guns[][3]),as.double(guns[[j]][3])),min(as.double(guns[][4]),as.double(guns[[j]][4])))))
     
    }
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  pairarray[,3] <- as.double(pairarray[,3])/median(as.double(pairarray[,3]))-1
  colnames(pairarray) <- c("Weapon", "Score", "","","")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. killing speed","Avg. flux","Range (no mods)", "Range(ITU+BM+GI)")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  pairarray[,3] <- sprintf("%0.1f%%", pairarray[,3] * 100)
 
  print(pairarray)
}

twopairtimearray <- function(gunnames,gunnamesb,columna,columnb,columnc,columnd){
  pairarray <- data.frame()
  for(i in 1:length(gunnames)){
    for(j in 1:length(gunnames)){
      for(l in 1:length(gunnamesb))
        for(m in 1:length(gunnamesb)){
      localsum <- 0
      for(k in 1:length(shipnames)){
        localsum <- localsum + (doublepairtimemean(shiparray[[k]],gunnames[][1],gunnames[[j]][1],gunnamesb[[l]][1],gunnamesb[[m]][1],columna,columnb,columnc,columnd))
      }
      pairarray <- (rbind(pairarray, c(paste(gunnames[][1],gunnames[[j]][1],gunnamesb[[l]][1],gunnamesb[[m]][1]),localsum/length(shipnames),localsum/length(shipnames)*(as.double(gunnames[][2])+as.double(gunnames[[j]][2])+as.double(gunnamesb[[l]][2])+as.double(gunnamesb[[m]][2])),min(as.double(gunnames[][3]),as.double(gunnames[[j]][3]),as.double(gunnamesb[[l]][3]),as.double(gunnamesb[[m]][3])),min(gunnames[][3],gunnames[[j]][3],gunnamesb[[l]][3],gunnamesb[[m]][3]))))
      }
    }
  }
  pairarray <- pairarray[!duplicated(pairarray[ ,2]),]
  pairarray[,2] <- as.double(pairarray[,2])
  pairarray[,2] <- 1/(pairarray[,2]/median(pairarray[,2]))-1
  pairarray[,3] <- as.double(pairarray[,3])/median(as.double(pairarray[,3]))-1
  colnames(pairarray) <- c("Weapon", "Score", "","","")
  pairarray <- pairarray[order(pairarray$Score, decreasing = TRUE), ]
  colnames(pairarray) <- c("Weapon", "Avg. killing speed","Avg. flux","Range (no mods)", "Range(ITU+BM+GI)")
  pairarray[,2] <- sprintf("%0.1f%%", pairarray[,2] * 100)
  pairarray[,3] <- sprintf("%0.1f%%", pairarray[,3] * 100)
 
  print(pairarray)
}

pairtimearray(guns,6,7)
pairtimearray(smallguns,8,9)
twopairtimearray(c("Gauss","Mjolnir"),smallguns,6,7,8,9)
[close]
weaponsaggregatemeantimebasicr.R

#use computationally inexpensive functions to manage

weaponnames <- c("Squall", "Locust", "Hurricane", "Sabot", "Harpoon", "Gauss", "Mark IX", "Hellbore", "Hephaestus", "Mjolnir", "Storm Needler")
shipnames <- c("glimmer", "brawlerlp", "vanguard", "tempest", "medusa", "hammerhead", "enforcer", "dominator", "fulgent", "brilliant","radiant","onslaught","aurora","paragon","conquest","champion")
lmnames <- c("Squall", "Locust", "Hurricane")
mrmnames <- c("Sabot", "Harpoon")

#name, flux / sec, range, range with itu + bm + gi (+85 total for ballistic & energy, +0 for missiles)
gauss <- c("Gauss", 600, 1200, 1.85*1200)
markix <- c("Mark IX", 348, 900, 1.85*900)
hellbore <- c("Hellbore", 250, 900, 1.85*900)
stormneedler <- c("Storm Needler", 350,700,1.85*700)
mjolnir <-c("Mjolnir", 667, 900, 1.85*900)
hephaestus <-c("Hephaestus", 480, 900, 1.85*900)

squall <-c("Squall",0,2500,2500)
harpoon <-c("Harpoon",0,2500,2500)
sabot <-c("Sabot",0,1400,1400)
locust <-c("Locust",0,1400,1400)
hurricane <-c("Hurricane",0,2500,2500)

mortar <-c("Heavy Mortar",180,700,1.85*700)
hac <-c("Heavy Autocannon", 214,800,1.85*800)
arbalest <-c("Arbalest",125,700,1.85*700)
heavymauler <-c("Heavy Mauler",120,1000,1.85*1000)
hvd <-c("Hypervelocity Driver",175,1000,1.85*1000)
needler <-c("Heavy Needler",200,700,1.85*700)

lms <- list(squall, locust, hurricane)
mrms <- list(harpoon, sabot)
guns <- list(gauss, markix, hellbore, stormneedler, mjolnir, hephaestus)
smallguns <- list(mortar, hac, arbalest, heavymauler, hvd, needler)

lmcolumns <- c(2,3)
mrmcolumns <- c(4,5)
guncolumns <- c(6,7)
smallguncolumns <-c(8,9)

filename <- function(x) paste("optimizeweaponsbytime", shipnames
  • , "medguns.txt", sep="")

readfile <- function(filename) read.csv(filename, sep = "\t")

#this assumes there is only 1 choice for LMs and Medium Missiles

maindataframe <- data.frame()
for (i in 1:length(shipnames)) {
  shipnamecolumn <- matrix(data=shipnames,ncol=1,nrow=(length(guns)^2*length(smallguns)^2*1*1))
  maindataframe <- rbind(maindataframe,cbind(shipnamecolumn, readfile(filename(i))))
}

#drop useless columns
maindataframe <- maindataframe[,c(1,2,7:10)]
maindataframesorted <- data.frame()

#order heavy guns and medium guns alphabetically by row and merge cells
for (i in 1:length(maindataframe[,1])){
  maindataframesorted <- rbind(maindataframesorted, (c(maindataframe[i,1],maindataframe[i,2],paste(t(apply(maindataframe[i,3:4], 1, sort))[1],t(apply(maindataframe[i,3:4], 1, sort))[2],sep=" "),paste(t(apply(maindataframe[i,5:6], 1, sort))[1],t(apply(maindataframe[i,5:6], 1, sort))[2],sep=" "))))

}
#compute the mean by elementary operations
colnames(maindataframesorted) <- c("Ship", "Time", "Largeguns", "Mediumguns")
maindataframesorted$Time <- as.double(maindataframesorted$Time)
maindataframesorted <- aggregate(Time ~ Largeguns + Mediumguns, data = maindataframesorted, FUN = mean, na.rm = TRUE)


maindataframesorted <- cbind(maindataframesorted, (1/(maindataframesorted$Time/mean(maindataframesorted$Time))-1))

maindataframesorted <- maindataframesorted[order(maindataframesorted$Time),]

maindataframesorted[,4] <- sprintf("%0.1f%%", maindataframesorted[,4] * 100)


colnames(maindataframesorted) <- c("Time", "Largeguns", "Mediumguns", "Killing speed score")

maindataframesorted


[close]

So my original design was crap (-16.9% killing speed). I tried designing one around Arbalest with rangefinder and Gauss Mjolnir but it wasn't that good. Currently I'm running Squall Squall Harpoon Harpoon Gauss Gauss HAC HAC with 25 caps instead. Much more satisfying. But definitely need to try to design one featuring the Storm Needler based on test results.

How to take out Jangala Star Fortress (the key is to use Conquests):

(https://i.postimg.cc/x12TCcG8/image.png) (https://postimg.cc/6yMNb6mx)
(https://i.postimg.cc/63kTfzZL/image.png) (https://postimg.cc/5YmxxBn6)
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 16, 2022, 07:12:55 AM
Not the first time I see Gryphons praised but from my experience Gryphon AI is absolutely suicidal which does not pair well with the Gryphon's weak tank.

Yeah Gryphons really depend on overwhelming firepower. If it doesn't have that, it's toast. Basically a glass cannon.

Having said that, what I do is I put a single HVD on it, with ITU. I'm not sure if it helps the AI with range, but it'll generally stay at standoff-range. It sometimes does decide to charge in, especially with full assault mode on (which admittedly is how I run it most of the time), but that seems to work well. Plus that helps picks off targets.

The main problem with the armor fudge is how to implement such an armor fudge factor. For example, if I just increase armor HP by a factor of 4, then that also increases damage reduction. I'll discuss this in a bit more detail in my reply to Vanshilar below, but I think a reasonable rough estimate could be given by implementing armor "regeneration" to compensate for the ship turning at a rate such that the TTK is increased by a factor of 2, so maybe 1/6th of the starting armor / second. This is actually not even enough, since the most effective combos took the ship out at 17 seconds now, but it'll probably illustrate the effects.

No, regenerating armor will distort the results by favoring weapons good against armor, and disfavoring weapons bad against armor. Also, once armor is gone, it's supposed to be gone, not to come back to block more damage. I would say it's easier to simulate it by having a wider band of armor cells.

Attached is a screenshot of the Dominator and its armor cells (in the lower left corner). As far as I can tell, the size of the armor cells is about 17.5 pixels wide (noting that my display naturally rescales sizes to about 80%, thus the weapon range is important for measurement purposes). So assuming that a shot always hits in an armor band that's 6 cells wide means that you assume all shots will hit in the center half of the Dominator. In practice, not only will shots hit across the entire face of the Dominator, but some shots will be so far off that they miss.

Fortunately, the face of most ships can be approximated as a line, since you're really just hitting the perimeter of the ship most of the time. Thus you can just approximate it as a wider armor band. And thus to accommodate that, the normal distribution for the width of the weapon shot also needs to widen. But these are relatively easy to do.

Unfortunately, it seems like different ships have different armor cell sizes. I'm not sure how that's calculated. The Dominator's armor cells seem to be around 17.5 pixels wide, for example, while the Starliner's is around 28 pixels wide. Obviously, the smaller the armor cell size, the more protection it provides. I don't know how it's determined though, but that might be worth looking at to see which ships have bigger or smaller armor cells (smaller armor cells are better).

Thanks for the thoughtful feedback and criticism. This model really should have probably been validated a bit more, see above. Probably a problem stemming from it being just for fun and not being a real research project but this is also one of my weaknesses as a researcher that I tend to get carried away with models and fumble with the "boring" parts TBH. Comparing to simulation results is important. But there are some questions I have about the simulation: is the enemy turning? Is it retreating? Does it have point defense?

Actually I think the hardest part is already done. Damage to shields is easy to estimate. Damage to hull is also easy to estimate. It's always been how damage to armor is calculated that's difficult to simulate, and also how to conceptualize the effect of maneuvering, weapon spread, etc. Modeling this as a band of armor being hit by a weapon with a distribution (i.e. normal distribution in this case) neatly solves those issues. The width of the armor band encapsulates the width of the ship and how much it rotates, and the width of the normal distribution encapsulates maneuvering and weapon spread (where if it's wider than the armor band, it's considered a miss). These parameters can be estimated from combat results.

I'm not sure what hit strength vs. hull means. Can you elaborate?  From what I understood from the previous thread, for the damage that goes through to hull, the multiplier is not applied, so that's how the model calculates damage. The multiplier is only applied to the proportion blocked by armor.

Any time a weapon hits a ship (i.e. not to shields, but to the ship itself), the hit strength calculation is applied, using the local armor at the point of impact. It doesn't matter if there is any armor remaining or not; even if none is remaining (i.e. it's hitting bare hull), then it's assumed that there is still a residual amount of 5% of the base armor rating for the purposes of this hit strength calculation. And once the summed armor value of the local armor goes below 5%, it again assumes 5% remaining. So that minimum of 5% always exists. Weapon multipliers for the purposes of hit strength as if they're hitting armor (i.e. /2 for kinetic, *2 for HE, /4 for frag) also apply here. This is step #2 above.

When the damage is actually applied to those cells, yes, to hull it always applies as 100%. But that's the damage that has already gone through the hit strength calculation -- that's step #3 above, which is after the damage reduction applied in step #2. This prevents people from doing things like, taking a bunch of Vulcan cannons (500 DPS, 25 frag hit strength), firing a Reaper into the rear of an Onslaught, and then wailing into the hull of the ship with the Vulcans. Well, they can, but it ends up doing 75 DPS to hull (due to the minimum 15% for the hit strength calculation) instead of the 500 DPS stated on the weapon stat card.

For the Locust, because of the hit strength calculation, the damage to hull is going to be 50/(50+75) = 40% of the original damage. So for 2 Locusts firing into hull, the model should be showing that the ship loses 1600 hull per second during the volleys. That should be easy enough to validate by setting shieldregen and shieldmax to 0 and then seeing what happens after armor is gone (assuming no armor regen, of course).

So by the calculations time to kill is 16 sec. In the simulation the time for this combo was 22-28 sec. But that also includes weapons missing and projectile travel time and the enemy rotating I presume.

Actually it doesn't include weapon missing nor travel time, since it's based on how many hits were actually registered; Detailed Combat Results doesn't count misses (although it would be great if it could). You can see for example that there were 212 to 237 Locust hits among the 3 tests, and since each Locust volley is a total of 80 shots, this means the ship died toward the end of the 3rd Locust volley. (All Locust shots hit due to its good tracking.) That's where my time estimates come from.

[attachment deleted by admin]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 16, 2022, 08:43:13 AM
Okay, then we 're almost done since I am now confident in the code. Next step would be to simply calibrate vs simulation results to find the actual normal distribution. But here's a Q that needs to be resolved going forward: I understand from your post that each cell can take advantage of the minimum armor rule. But from https://fractalsoftworks.com/forum/index.php?topic=22331.0 I got that it is instead applied if the matrix's pooled armor value is sub 5% (but specifically not if the pooled value is over 5% even if the cell has 0 armor). That is why my model uses the probability weighted average instead of calculating it cell by cell. If, however, it works cell by cell, then the model is again overestimating locust and needler damage.

But do we have evidence one way or another?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 16, 2022, 09:48:11 AM
The only time the hit strength damage reduction calculation is applied is when the shot first hits the ship, and that is as a pooled value (step #2). That is where the minimum armor of 5% of base armor rating applies, and when the lowest possible percentage of 15% of damage that gets through (down to 10% if the ship has Polarized Armor) applies. There is no damage reduction for individual cells (regardless of armor or hull) once it splits up the damage calculated in step #2 toward the individual cells (1/15 to each of the 9 inner cells, 1/30 to each of the 12 outer cells) in step #3. When it goes to apply the damage to individual cells, if there is any armor remaining, it will apply the weapon damage type bonuses/penalties (/2 if kinetic, *2 if HE, /4 if frag) toward removing that armor, while any remaining damage remaining beyond that will go toward the hull at 100%. But that's weapon damage type, not hit strength. The hit strength doesn't matter at that point.

The armor mechanics wasn't first described by me (I think that would be FooF, in 2017, before I started playing the game), but I did test out that this is how it works. Specifically, that this matches with the reported armor/hull damage values shown by the game when you hit the same spot over and over again (or, a neighboring spot, etc.).
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 16, 2022, 10:28:57 AM
Okay. But here we don't have individual shots but rather normal distribution shaped waves hitting the ship, so a pooled value for a singular hit armor matrix doesn't exist. So what then is the fraction of the pooled total value that the cell sees to calculate 5%? If we are portioning damage to cells according to a reversible map, then is the armor seen by a cell the pooled armor distributed to cells by the same map? It would seem so, since the map we are using is just a multiplication operation. Specifically if a is damage and b is the armor and k is the number of cells. f(a,i,j) is for a cell (i,j) just a/k*c_ij which is the cell specific value. And sum(1/k(c_ij)) = 1 since sum(f(a,i,j))=a.So calculating the damage reduction we have a*a/(a+b)=sum(f(a))sum(f(a))/(sum(f(a))+b)=(a/k*(sum(c_ij))^2/(a/k*(sum(c_ij))+b/k(sum(c_ij))))=a*a*sum(c_ij)/k/(a+b)=sum(f(a*a/(a+b)).

So presumably, if I adjust the model just so that each cell always gets minimum 0.05*startingarmor*hitprobability(cell) for reducing damage of damage*hitprobability(cell) we're golden?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 16, 2022, 01:20:48 PM
Damage gets done to multiple armor cells on a hit, and the damage is not uniformly distributed between the affected cells (outer cells take half damage), so I don't think you can just uniformly apply some factor.


One thing I'm not sure about is where the shots are actually allowed to land? It seems like armor is divided into a grid over the 2D ship model, but I think shots can only really land on 'edge' of the ship? Or are they allowed to penetrate and hit interior cells as well?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 16, 2022, 03:54:37 PM
Sorry, typing math on phone leads to bad notation. But by c_ij I mean each cell has a particular constant factor of its own. In the model this also includes the division of damage. The hit probability matrix is generated as follows: create a 5 row, 10 column matrix and a 5 row, 5 column matrix. The 5 row, 5 column matrix is filled so that all cells have value 1/30. Then the innermost 15 cells are given value 1/15. This is the damage distribution matrix. (The corners should also be set to 0 here, I need to add that). Then this matrix is summed according to a normal distribution several times over the 5 row, 10 column matrix, and corners are set to 0. This is the cell hit probability matrix mentioned. Though it is technically also a damage distribution matrix.

Anyway, what I meant above by f(a,i,j)=a/k*c_ij is exactly what the program does: spread damage over the matrix, multiply by a cell specific factor. Also the armor adjustment is currently done cell by cell. Thinking about it more I suppose I could also construct a way to pool the damage back... But it would be quite natural to calculate it cell by cell since we do not actually have a par of the ship hit. Intuitively I'd assume the pooled armor for the "expected cell matrix" is also calculated just by using the same 5,10 matrix.

You can essentially imagine this in visual terms as there being a superposition of armor cells that are hit by a wave of ghost shots (expected value shots) according to a normal distribution whose intensities sum to the value of a real shot. Then it's also logical that the intensity (armor value) of the expected armor cells that the shots hit varies according to the same distribution function, summing up to the real armor.

The matrix of adjacent cells does extend outside the sprite according to Vanshilar. Shots are assumed to land on a line of (currently) 6 armor cells. The adjacent cells extend 2 cells outward in all directions from each of these cells.

E: Okay I've tried layouts suggested by the model. And it has definitely improved my Conquest builds, but this needs an accuracy parameter. The stupid HACs that the model thinks are so good can't hit the broad side of a space station on a bad day (probably part of the balance on part of Alex) and yet the model gives them the same accuracy as all other weapons which has to be a problem. They are not actually as good at killing frigates as the model would predict for example.

So I'm thinking there should be several versions of the normal distribution which are applied based on weapon accuracy to get more accurate results. Needs a little thought how to put it into code to express the armor checks vs. weapons with several different distributions dealing damage consecutively.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 17, 2022, 11:30:10 AM
Okay. But here we don't have individual shots but rather normal distribution shaped waves hitting the ship, so a pooled value for a singular hit armor matrix doesn't exist. So what then is the fraction of the pooled total value that the cell sees to calculate 5%?

Oh, I didn't realize it was probability waves hitting the target. I saw that it was normal distribution but didn't realize that's what you were doing. In which case that's more innovative than I thought.

I would think the most direct way to model it is this. Say you're working with a target that's 5 armor cells deep and 10 armor cells wide. That means that the cells that can be hit by the weapon is the middle 1x6 vector of cells. For each of those cells, you can calculate their effective armor rating by pooling the values of the 5x5 cells around them. I don't know if there might be a tensor or convolution function of some sort in R to do this easily, but even if not, it's easy to just code in with a for statement. That's where the 5% minimum armor is applied.

Then, the incoming weapon shot gets modeled as a normal distribution, where the standard deviation depends on the weapon's inherent spread, the target's maneuverability, and the armor cell size. Each of those can be estimated from combat or measured directly. The normal distribution would be to the width of the "hittable" armor cells, in this case, 6 cells. Any amount to either side is assumed to just miss.

From there, the hit strength damage reduction A/(A+B) formula is calculated for each cell. That's where the 15% minimum for the A/(A+B) is applied. So you get a hit strength damage reduction vector from that. Then, the damage as if the shot hit that cell is calculated, then split to the 5x5, then multiplied by the probability of hitting that cell, and is then applied to the original 5x10 armor band. This is then done for each cell in that 1x6 vector.

The order of operations is important; the hit strength damage reduction vector is calculated before any damage is taken off, and doesn't need to be updated during the shot, so this preserves the simultaneity of calculating each shot in the probability wave as the original armor band's values get updated.

I'm not 100% convinced that this is mathematically equivalent to generating statistics from multiple simulations of each shot hitting the armor band one by one, since the hit strength calculation is nonlinear, but realistically the model will be matched to some actual real-world statistics from combat data so those fudge factors will hopefully iron out any inaccuracies in modeling. It would at least be a huge step up from simulating a shot hitting the same armor cell over and over.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 17, 2022, 01:06:18 PM
The distribution should cover the entire area where the shots can go, even if that is wider than the target. And the probabilities for hitting each cell should total to 1 - probability of missing. The probability mass corresponding to a miss is important, and needs to be included because that is what will account for reduced DPS due to missing.

Also, I'm not so sure about trying to model movement-based inaccuracy. Given actual relative movement with no spread, the shot location is not random, so it really should be a bias in the mean of the distribution rather than a variance. But if you try to model some distribution of possible relative movements, you could maybe come up with some distribution of shot locations from that. Although that would still depend on how the automatic aim leading and the AI works as well. All in all, I think it would be pretty tough to model accurately.

I would definitely start with pure weapon spread before worrying about any of that. I'm pretty sure the actual randomness in shots is implemented as a random error in the angle that the shot is fired at relative the the aiming direction. It should be relatively simple to generate a distribution over the target ship based on range, and the original angle distribution from the code using geometry. Idk what distribution the spread angles are sampled from though. Could probably dig through the code to find it, but maybe someone knows (Alex)?

Other than that, I think you're just interesting in keep track of the expected value of damage done to each armor cell and to hull. For a single shot, that should be something like:
EV[damage to cell_a] = probability(shot landing at cell_b)*(damage done to cell_a given shot lands at cell_b) summed over all the cell_b possibilities (and you can just sub hull for cell_a as well). You should be able to do that pretty easily with a loop or two and all the damage calculations can be done easily in each case given the specific cell_a and cell_b.

Edit: I'm actually quite sure that doing this sequentially (basically using the EV of the damage due to the previous shot as the input for the next EV calculation) is not the same as calculating the EV of the damage of multiple sequential shots. But IDK how much error would accrue. Might actually be interesting to calculate both of those things and check the error. I think the EV of a sequence of shots would be:

E[dt] = E[sum(dn)] = sum(E[dn]) where n is the shot number

but then the EV of the 3rd shot (nth shot requires n nested loops which I didn't want to try and represent lol) would be:

E[d3] = sum_s3(sum_s2(sum_s1(  f(f(f(d0|s1)|s2)|s3)  p(s1)p(s2)p(s3) ))) where s1,s2,s3 are the shot locations of each shot (and sum_sn is a sum over the possible shot locations of the n_th shot), so basically you are doing loops over every possible combination of shot locations and adding the damage from that combo. Also f(d|s) is the function that returns the damage given the shot location. Pretty sure you could do it all in a single loop with some fancy indexing, and write the nested damage function recursively as well, so it might be feasible to do for some small number (like <5) of shots (and possible hit locations), just for a test, but the computation cost scales really poorly for large numbers of shots. Also, you should be able to store the values of a bunch stuff from calculating the Ev of each shot to reuse for the next I think.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 18, 2022, 01:32:46 AM
By the way, I took a look at how the size of the armor cells are determined. The game looks only at the length of the ship sprite, but not the width:

If the length is < 150, then each armor cell is 15 pixels wide.
If the length is between 150 and 300, then each armor cell is 1/10 the length.
If the length is > 300, then each armor cell is 30 pixels wide.

For reference, an Enforcer is 136 pixels long, a Hammerhead is 164 pixels long, an Aurora is 280 pixels long, and a Legion is 308 pixels long. Testing was done by looking at the lower left green icon in combat of an Atlas whose length and width were set to different amounts in atlas.ship.

This has some interesting implications. Since each armor cell is given 1/15 of the base armor rating, then having smaller armor cells is better, since it means those armor points are more densely packed. Assuming that shots tend to hit in different spots, rather than in the same spot over and over, then this could mean as much as a factor of 2 difference in how much armor the incoming fire needs to remove before hitting hull.

Also, since ships are roughly spherical, this means that "wider" ships are better in terms of taking armor damage, since they'll tend to have somewhat smaller armor cells than "longer" ships. However, this is countered by the fact that "wider" ships provide a bigger frontal area that an opposing weapon could hit, which balances this out. So Alex made the right decision here (in basing armor cell size on length).

Taking a couple of examples, Enforcers are 136 pixels long, so their armor cells are 15 pixels wide. At 900 base armor, each armor cell holds 60 armor to start, so that's 4 armor per pixel. Dominators are 180 pixels long, so their armor cells are 18 pixels wide. At 1500 base armor, each armor cell holds 100 armor to start, so that's 5.56 armor per pixel. Onslaughts are 384 pixels long, so their armor cells are 30 pixels wide. At 1750 base armor, each armor cell holds 117 armor to start, so that's 3.89 armor per pixel. So it turns out, Dominators actually have the most concentrated armor protection. It won't help against focused fire, i.e. taking a Reaper hit or something, but over the course of a long battle, with incoming fire from multiple directions, the smaller armor cells means that it'll be able to absorb a surprising amount of damage since there's more armor packed into a given area.

(What the Onslaught has going for it however is that the nose is "jagged" meaning some shots will land more inward and others more outward, and the sides slope away, both of which increase the number of armor cells that can absorb the damage. So this helps it absorb more damage than a smooth or square shape. Not sure if Alex intentionally designed the Onslaught with this in mind, but this contributes to the Onslaught being able to take a lot of punishment.)

E: Okay I've tried layouts suggested by the model. And it has definitely improved my Conquest builds, but this needs an accuracy parameter. The stupid HACs that the model thinks are so good can't hit the broad side of a space station on a bad day (probably part of the balance on part of Alex) and yet the model gives them the same accuracy as all other weapons which has to be a problem. They are not actually as good at killing frigates as the model would predict for example.

Yeah my testing a while back (here (https://fractalsoftworks.com/forum/index.php?topic=25077.msg373121#msg373121)) was that, even with Gunnery Implants (best target leading and -25% recoil) and Ballistic Mastery (+33% projectile speed), something like the Mark IX misses around 24% of the time in actual combat. Heavy Autocannon has similar stats so it probably misses a similar amount of time. That's why I figured the model needs to have a wider distribution (wider than the armor) or some other means of accounting for misses. This is also why it makes sense that in testing, the target Dominator ended up taking ~8-9k of armor damage, since that was roughly the width of the ship (about 12 armor cells wide); the remaining shots would've missed, and hence it could be modeled as an armor band that would be ~17 cells wide.

Then in the model, the distribution's variance would be based on the weapon's inherent spread and some function of the weapon's speed and the target's maneuverability (slower projectile speed and higher target maneuverability means greater variance). In terms of weapons doing damage consecutively, easiest hack would be to base it on weapon speed, i.e. fastest weapon resolves first within each time interval.

Also, I'm not so sure about trying to model movement-based inaccuracy. Given actual relative movement with no spread, the shot location is not random, so it really should be a bias in the mean of the distribution rather than a variance. But if you try to model some distribution of possible relative movements, you could maybe come up with some distribution of shot locations from that. Although that would still depend on how the automatic aim leading and the AI works as well. All in all, I think it would be pretty tough to model accurately.

At that point, the shots are no longer independent of each other, so you're really looking at some sort of Markov Chain Monte Carlo simulation to accurately capture that. Too much effort for too little improvement in modeling accuracy. Also, if the mean is shifting, then it's just equivalent to the ship rotating, so the shots are more or less still seeing the same number of armor cells, just that where they're located physically on the ship is different. So I don't think moving the mean is worth doing here. Easier to just capture all that in the variance.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 18, 2022, 10:01:15 AM
Too much effort for too little improvement in modeling accuracy. Also, if the mean is shifting, then it's just equivalent to the ship rotating, so the shots are more or less still seeing the same number of armor cells, just that where they're located physically on the ship is different. So I don't think moving the mean is worth doing here. Easier to just capture all that in the variance.

To clarify, I was thinking of shifting the mean as being more akin to the ships translating, and the distribution of shots and locations of armor cells as being represented in a tangent plane to the target ship rather than over angles. Personally, I think that makes it easier to visualize translations and rotation of both ships, as well as missed shots all in the same 1D space. But it's not that important (although it might help to interpret what I was trying to say).

The effect of increasing variance is that damage gets spread out over all the visible armor cells and total damage slowly decreases as variance increases and more shots miss. The effect of shifting the mean (which is what happens when your point of aim is off-center due to movement) is that the damage gets shifted to one side of the ship, and total damage suddenly decreases as the center of the distribution moves off of the ship. Those are going to result in very different distributions of damage. The results of your simulation (how armor cells are damaged, how long that takes etc.) will not look like real combat, even if you tune your variance so that the overall TTK is similar. The tuned variance will also only be useful for whatever case you tuned it, and it will not be accurate in other cases.

I would much rather see actual analysis of how specific movements affect accuracy. Stuff like 'weapon A becomes x% less effective against enemies moving over y speed due to missing' rather than 'weapon A did x% less damage than theoretical max on average against a certain fleet'. To me, that is just much more informative for making decision about how to outfit ships against certain opponents, and how to manage firing weapons and target selection IMO.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 18, 2022, 10:03:19 AM
I'm also pretty sure the distribution being sampled from in the actual game when generating shots is not a normal distribution, since I'm pretty sure the error angle for each shot is bounded (while normal distributions are unbounded by definition). I would guess a uniform distribution. That would actually have a non-trivial impact on the probability of hitting a particular cell, and how much damage gets spread out.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 18, 2022, 01:22:38 PM
But if the shot angle has a uniform distribution, then isn't the mean shot angle over several shots a Bates distribution, and so approximately a normal distribution?

Unfortunately some work has come up taking time from more important things like modeling optimal Conquests or building my kingdom on conquered Eventide. It doesn't seem that hard to model this though as you can essentially just pool the armor back up between shots, thinking about it. Or even better,just build a function that selects the appropriate width distribution and uses it for the cell by cell operation. Still need to prove cell by cell = pooled.

Very interesting find on the cells by Vanshilar.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 18, 2022, 03:00:46 PM
But if the shot angle has a uniform distribution, then isn't the mean shot angle over several shots a Bates distribution, and so approximately a normal distribution?
I thiiiink that would be the distribution of the mean value of all the shots, rather than the distribution of the shots themselves. So one sample from a bates distribution would correspond to the mean of n shots sampled from a uniform distribution. But don't quote me on that. I am very sure that sampling repeatedly from a uniform distribution will yield different results than repeatedly sampling from a normal distribution.

It doesn't seem that hard to model this though as you can essentially just pool the armor back up between shots, thinking about it. Or even better,just build a function that selects the appropriate width distribution and uses it for the cell by cell operation. Still need to prove cell by cell = pooled.
For the expected damage of one shot, there is no issue with doing things cell by cell.

The problem comes when you want to get the expected value of the total damage of a sequence of shots. It's not obvious (and I think not true) that taking the expected damage of the previous shot (and resulting armor value) as the starting point to calculate the expected damage of the next shot and then adding them is equivalent to the expected damage of the sequence of two shots.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Fotsvamp on October 19, 2022, 07:28:58 AM
This thread has derailed quite a bit, maybe split off a thread for stats analysis rather than Conquest appreciation?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 19, 2022, 08:33:37 AM
This thread has derailed quite a bit, maybe split off a thread for stats analysis rather than Conquest appreciation?

To be fair the ultimate goal of all the math is to find the optimal Conquest. But how about a new thread rule: everyone who posts about statistics must also say something about the Conquest.

I just took out all the [SUPER REDACTED] guardians in the Sector again with a fleet of nothing but Conquests with 2x Squall 2x Gauss 2x Harpoon 2x HAC (playership has 2x Storm Needler instead, but I'm having trouble making it work). Total losses from both fights, 3 Conquests. Conquest is a true powerhouse. I think the important thing is to abuse the missiles and install Hardened Shields and the other appropriate hull mods.

Thing is, I think installing Resonators and Rift Torpedos actually made the ships possibly worse than just the below layout.

This build crushes just about everything in the game when deployed en masse, no other ships needed:
(https://i.ibb.co/rbsy16y/image.png) (https://ibb.co/hXf8tW8)

For officer skills I think you want Helmsmanship, Target Analysis, Ballistic Mastery, Field Modulation, Missile Specialization and Gunnery Implants, that's what I'm going for on every officer at least, with Steady personality (Aggressive gets the ships killed). Elites on #1, #3, #4 and #5. If only 1 elite skill then Missile Spec.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Tadas on October 19, 2022, 09:24:34 AM
I guess you are playing with increased deployment cap which I think is a bit easier and favors missile spam. On standard cap it would be a bit awkward to waste 20 DP and problems with capital only fleets starts showing - losing ability to control more than 1 control point and getting surrounded.

I am a bit surprised how well Gauss is performing, but I guess I saw that inefficient damage to flux ratio and never really tried it. But I guess if you can afford it, it's really good.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 19, 2022, 09:29:41 AM
Yes I do play with max DP setting since I like large scale combat. Never considered that as a factor! Occasionally do have to miss on using 20 DP or so but it doesn't matter really, I'd still rather bring more Conquests and support than try to fill it.

The thing is, even when enemy fleet is massive and varied, these ships tend to form a line of battle with a void full of missiles and Gauss shots between the enemy fleet and mine. I think the Steady AI helps achieve that. But then shorter range weapons end up being just wasted OP much of the time.

Another nice thing about this build is the fleet doesn't care about D-mods much. As you can see looking at my fleet, I just let them explode and deploy a new one which happens sometimes. Since much of the firepower comes from Gauss & missiles fired from standoff distance, D-mods don't really matter for ship combat effectiveness, at least not most of the time.

The endgame (what endgame, when I can already destroy the [SUPER REDACTED] and conquer Eventide and Chicomoztoc and make 300k/mo from alpha run colonies? the power trip I guess) build is to switch to Derelict Operations after you have all officers with 4 elite skills and all ships with 3 s-mods that you want. Is the plan. Also should help with DP gaps if using lower setting.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 19, 2022, 04:02:53 PM
To clarify, I was thinking of shifting the mean as being more akin to the ships translating, and the distribution of shots and locations of armor cells as being represented in a tangent plane to the target ship rather than over angles.

If the target is moving to its right, then it's going to take more hits on its right side. So that's basically equivalent to shifting the center of the band of armor cells being modeled a bit to the right.

Those are going to result in very different distributions of damage. The results of your simulation (how armor cells are damaged, how long that takes etc.) will not look like real combat, even if you tune your variance so that the overall TTK is similar. The tuned variance will also only be useful for whatever case you tuned it, and it will not be accurate in other cases.

The specific distribution etc. isn't important. What's important is whether or not it can accurately model the amount of damage done to the target and how long it takes (including accounting for misses ideally). Moving the mean off-target versus a bigger variance will both have the same effect of decreasing the hit rate. In either case the model's parameters would have to be matched to combat data, so a sudden drop off if the aim is so far off would be modeled by having a variance that gets exponentially bigger if the target's maneuverability is greater than the weapon's shot speed (for example). Although I would then say that that's simply not what the model is meant for, if the aim is that bad or the target is that maneuverable.

I would much rather see actual analysis of how specific movements affect accuracy. Stuff like 'weapon A becomes x% less effective against enemies moving over y speed due to missing' rather than 'weapon A did x% less damage than theoretical max on average against a certain fleet'. To me, that is just much more informative for making decision about how to outfit ships against certain opponents, and how to manage firing weapons and target selection IMO.

Sure, if you find a good way to model or analyze that, go ahead and present it. I'm more interested in looking at how quickly a fleet of a given configuration can kill off another fleet, and generally the "another fleet" is single/double/triple Ordos because faction fleets are speedbumps not worth optimizing over. I think "weapon A becomes x% less effective against enemies moving over y speed due to missing" is more suited for combat results than modeling.

I would also say that "accurately modeling the hit rate" is a separate issue than "accurately modeling how long it takes to remove shields, remove armor, and remove hull". Sure, there's some connection there, i.e. if the weapon only hits 50% of the time then the total time is doubled, plus there's more shield regen to contend with. But it's also possible to treat the model as just time to remove shields/armor/hull if the shot hits, and then just insert whatever hit rate model you want that feeds into that.

I'm also pretty sure the distribution being sampled from in the actual game when generating shots is not a normal distribution, since I'm pretty sure the error angle for each shot is bounded (while normal distributions are unbounded by definition). I would guess a uniform distribution. That would actually have a non-trivial impact on the probability of hitting a particular cell, and how much damage gets spread out.

It's almost certainly a uniform distribution, since I don't think Alex nor any programmer would bother to code in a specific distribution; it's much easier to just define some +- bounds and have the game (uniformly) select a random value within those bounds. But realistically in combat with the ship maneuvering both to the left and to the right, plus weapons with tracking, plus the weapon is aiming for the middle, it makes sense that the middle ends up getting hit more often than the sides. That's also just from experience. It doesn't have to be a normal distribution but it's good enough as a starting point.

I just took out all the [SUPER REDACTED] guardians in the Sector again with a fleet of nothing but Conquests with 2x Squall 2x Gauss 2x Harpoon 2x HAC (playership has 2x Storm Needler instead, but I'm having trouble making it work).

I find (for AI control at least), they work better with 2x Squall 2x Gauss 2x Harpoon 2x HVD instead of HAC. HVD has faster projectile speed and no shot spread, plus HAC is essentially competing against the other weapons (Squall, Gauss, and Harpoon) for damage, so quite a few targets get taken out at long range even before HAC gets a chance. Flagship Onslaught, 4 Conquests, 2 Gryphons to capture objectives do pretty well vs double Ordos. (Funny story, I started off by trying 5 Conquests, but those Conquests would simply never bother to hold objectives -- they'd grab them, move to the middle, and let the enemy ships take them back and thus surround my fleet in the middle. Dumb AI.) At +411% XP bonus so easy 7.4 mil XP for the double Ordos.

[attachment deleted by admin]
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 19, 2022, 07:07:28 PM
Total losses from both fights, 3 Conquests.

Doesn't seem like that much of a success to me...

Quote from: Tadas
I guess you are playing with increased deployment cap which I think is a bit easier and favors missile spam. On standard cap it would be a bit awkward to waste 20 DP and problems with capital only fleets starts showing - losing ability to control more than 1 control point and getting surrounded.

240 / 40 = 6. Am I missing something?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Tadas on October 19, 2022, 07:48:50 PM
Battle size is 300 by default. So you can max out at 180 pts.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 19, 2022, 08:08:05 PM
Total losses from both fights, 3 Conquests.

Doesn't seem like that much of a success to me...

Quote from: Tadas
I guess you are playing with increased deployment cap which I think is a bit easier and favors missile spam. On standard cap it would be a bit awkward to waste 20 DP and problems with capital only fleets starts showing - losing ability to control more than 1 control point and getting surrounded.

240 / 40 = 6. Am I missing something?

Allies and/or officer levels (I think?) lead to irregular DPs occasionally, but mostly it is 240 or 200 DP yes.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 19, 2022, 08:23:37 PM

I'm also pretty sure the distribution being sampled from in the actual game when generating shots is not a normal distribution, since I'm pretty sure the error angle for each shot is bounded (while normal distributions are unbounded by definition). I would guess a uniform distribution. That would actually have a non-trivial impact on the probability of hitting a particular cell, and how much damage gets spread out.

It's almost certainly a uniform distribution, since I don't think Alex nor any programmer would bother to code in a specific distribution; it's much easier to just define some +- bounds and have the game (uniformly) select a random value within those bounds. But realistically in combat with the ship maneuvering both to the left and to the right, plus weapons with tracking, plus the weapon is aiming for the middle, it makes sense that the middle ends up getting hit more often than the sides. That's also just from experience. It doesn't have to be a normal distribution but it's good enough as a starting point.

I just took out all the [SUPER REDACTED] guardians in the Sector again with a fleet of nothing but Conquests with 2x Squall 2x Gauss 2x Harpoon 2x HAC (playership has 2x Storm Needler instead, but I'm having trouble making it work).

I find (for AI control at least), they work better with 2x Squall 2x Gauss 2x Harpoon 2x HVD instead of HAC. HVD has faster projectile speed and no shot spread, plus HAC is essentially competing against the other weapons (Squall, Gauss, and Harpoon) for damage, so quite a few targets get taken out at long range even before HAC gets a chance. Flagship Onslaught, 4 Conquests, 2 Gryphons to capture objectives do pretty well vs double Ordos. (Funny story, I started off by trying 5 Conquests, but those Conquests would simply never bother to hold objectives -- they'd grab them, move to the middle, and let the enemy ships take them back and thus surround my fleet in the middle. Dumb AI.) At +411% XP bonus so easy 7.4 mil XP for the double Ordos.

Thanks for the tips on the Conquests! I'll try your build. Yes it's also my experience they might actually do best with a more durable ship tanking (hammer and anvil) but a mono-Conquest fleet is more aesthetic and thematic for SD navy.

Re, statistics: guys, if the probability of one shot having angle alpha is uniform, then the mean of alpha_i for large n is normally distributed by the Central limit theorem. And the PDF of mean alpha is a normal distribution. In fact this is true for most distributions of alpha so we don't need to assume much. That is why it is appropriate to use the normal distribution.

Edit: removed an untruth. If we have one gun and assume it is a uniform distribution then we can also simply assume for arc [c,d] subset of angle alpha in [a,b] that the shots will hit [c,d] |d-c|/|b-a| of the time so no big math problems. If we want to know where many independents shots will hit on average instead, then it is the normal distribution mentioned above.

Illustration removed due to not having enough time to verify it is correct.

I was really hoping to do some Latex on this but I don't have the time at all just now.  Essentially regardless of shot distribution what remains to prove is that for matrix cell a_ij of the summed armor damage matrix with a sequence of timepoints k, sum_k(E(a_ijk))=E(sum_k(a_ijk)) and that then for armor damage a E(a)=sum_j sum_i sum_k E(a_ijk). Then we can conclude the model is correct and focus on finding parameters.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 19, 2022, 11:40:45 PM
Battle size is 300 by default. So you can max out at 180 pts.

Restored Defaults just to be sure, it's 400.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 20, 2022, 12:01:04 AM
I was really hoping to do some Latex on this but I don't have the time at all just now.  Essentially what remains to prove is that for matrix cell a_ij of the summed armor damage matrix with a sequence of timepoints k, sum_k(E(a_ijk))=E(sum_k(a_ijk)) and that then for armor damage a E(a)=sum_j sum_i sum_k E(a_ijk). Then we can conclude the model is correct and focus on finding parameters.
The first equation is definitely correct, that's a property of the EV operator. A sum of EVs of variables is always equal to the EV of the sum of the variables.

The problem is how to calculate the expected value of the damage of a shot in the middle of the sequence, because it depends on the armor value after the previous shot. The simple approach is just to use the armor values after the expected damage from the previous shot is applied, but I am fairly sure that is not correct.

Re, statistics: guys, if the probability of one shot having angle alpha is uniform, then the mean of alpha_i for large n is normally distributed by the Central limit theorem. And the CDF of alpha is a normal distribution. In fact this is true for most distributions of alpha so we don't need to assume much. That is why it is appropriate to use the normal distribution.
The mean of a group of uniformly distributed shots will follow a normal distribution. The shots themselves do not, they follow the distribution they are generated by. In terms of actual calculations, the probability of a shot hitting a particular armor cell comes from the uniform distribution (or whatever is in the code). And we care about that probability because E(damage) = damage|shot_location * p(shot_location) summed over all the shot locations.

@Vanshilar
The whole point of modeling armor cells is to try and account for how distributed damage changes the TTK, so I think it's important to make sure you're representing the way damage is distributed correctly. To highlight what I am trying to say consider the following examples:
If you take a relatively low variance damage distribution and shift the mean so that it is is right at the edge of the target, the result will be that half of the damage is concentrated on a few armor cells at the edge of the ship, and the other half will miss. If you instead leave the mean of the distribution at the center of the target and increase the variance of the damage distribution so that half of the shots miss, you will have half of the damage distributed over the entire front of ship while the other half misses. Those are very different situations, and the time to strip the armor should be significantly different, despite the fact that the % of shots missing is identical.

You should be able to construct a similar example where the overall TTK is identical but the armor values and % of shots hitting are very different. In that case, you will get one situation where the armor of the whole front of the ship gets slowly stripped, and another situation where the majority of the damage misses so that the time it takes to strip the few cells at the edge of the ship is the same.

In both of these cases, you've adjusted the variance of one of the distributions to match some statistic of the shifted mean distribution (either hit% or TTK), but you end up with a totally different situation overall that isn't really a useful comparison. If you don't care about this distinction, there is no point in simulating the armor cells at all.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Tadas on October 20, 2022, 12:08:48 AM
 Oh found a thread: The default for a new install is 400, but if you had the game installed before, it'll pick up that it was set to 300.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 20, 2022, 12:53:49 AM
Okay, so I programmed it into Excel. Armor band 19 cells wide (15 cells hittable). I set it for 1500 base armor, 14000 hull, taking fire from a weapon that does 500 HE damage per shot.

Assuming uniform distribution, it kills the target in 46 shots; after the 46th shot it'll have done 8850 damage to armor (out of 9100 total armor in cells) and 14197 damage to hull.

I tried 3 normal distributions:

1. mean = 0, stdev = 1, x = {-1.05, -0.9, ..., 0.9, 1.05}, and then normalizing. This represents the center 70.6% of the distribution, i.e. 29.4% miss. The chance of a shot hitting the center cell is 8.1%, while the chance of a shot hitting the cell at the end is 4.7%, so hitting the center is about twice as likely as hitting the end. Then it kills the target in 46 shots; after the 46th shot it'll have done 8589 damage to armor and 14360 damage to hull.

2. mean = 0, stdev = 1, x = {-1.4, -1.2,..., 1.2, 1.4}, and then normalizing. This represents the center 83.8% of the distribution, i.e. 16.2% of the shots miss. The chance of a shot hitting the center cell is 9.2%, while the chance of a shot hitting the cell at the end is 3.5%, so hitting the center is about 3 times as likely as hitting the end. Then it kills the target in 45 shots; after the 45th shot it'll have done 8456 damage to armor and 14227 damage to hull.

3. mean = 0, stdev = 1, x = {-7/3, -6/3,..., 6/3, 7/3}, and then normalizing. This represents the center 98% of the distribution, i.e. 2% of the shots miss. The chance of a shot hitting the center cell is 13.5%, while the chance of a shot hitting the cell at the end is 0.9%, so hitting the center is about 15 times as likely as hitting the end. Then it kills the target in 43 shots; after the 43rd shot it'll have done 7112 damage to armor and 14061 damage to hull.

Basically as the variance decreases and the shots get more accurate, it's more likely that the shots will land on a spot where the armor's already cleared out, and thus less damage gets done to armor and more damage gets done to hull, so the target dies a bit faster, even when counting by number of shots that actually hit. (Uniform distribution is effectively a normal distribution with infinite variance that's then normalized.) The difference is relatively minor though.

Now if we assume the shots hit one at a time, rather than a probability wave. Uniform distribution across 15 hittable cells. For 200 samples, the average damage to armor after 46 shots was 8684 +- 270, and the average damage to hull was 13727 +- 213. So modeling it as a probability wave rather than simulating individual shots one after another meant it overestimates damage to hull by around 3.4%. So, fairly close.

So realistically the models are going to be within say around 10% of each other whether you look at it as uniform or normal distribution, and whether you simulate it as a probability wave hitting all at once or as discrete shots hitting one after another.

Edit:
In both of these cases, you've adjusted the variance of one of the distributions to match some statistic of the shifted mean distribution (either hit% or TTK), but you end up with a totally different situation overall that isn't really a useful comparison. If you don't care about this distinction, there is no point in simulating the armor cells at all.

It's not that adjusting the mean vs the variance will always mathematically have the same effect when fitting model to data. It's that for the purposes of the model simulating combat, this edge case of "super accurate weapon that's always nicking the very side of the hittable part of the ship" is not something worth considering. I don't think it's worth planning a weapons loadout around barely hitting one side or another of a ship.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 20, 2022, 05:10:41 AM
I was really hoping to do some Latex on this but I don't have the time at all just now.  Essentially what remains to prove is that for matrix cell a_ij of the summed armor damage matrix with a sequence of timepoints k, sum_k(E(a_ijk))=E(sum_k(a_ijk)) and that then for armor damage a E(a)=sum_j sum_i sum_k E(a_ijk). Then we can conclude the model is correct and focus on finding parameters.
The first equation is definitely correct, that's a property of the EV operator. A sum of EVs of variables is always equal to the EV of the sum of the variables.

The problem is how to calculate the expected value of the damage of a shot in the middle of the sequence, because it depends on the armor value after the previous shot. The simple approach is just to use the armor values after the expected damage from the previous shot is applied, but I am fairly sure that is not correct.


The general expression is rather intractable at least for my limited skills. I tried using max(0,x) =approx x/(1+e^-x). You do not want to do that.

Anyway, this is pretty trivial but
(https://i.ibb.co/HFvpnw4/Image.png) (https://imgbb.com/)

Correct or not? It should read E(d) on line 4 but too lazy to retype. And also missing a ()^-1 underneath the fraction after line 4. Doesn't matter for the idea.

Per the thread rules, here is another observation on the Conquest: since it is a cheap and ubiquitously available ship (at least if you are SD) then you do not really care about losing one, which is great. Hence re: lost 3 while fighting [SUPER REDACTED] (or rather recovered them with D-mods, it does not really matter when you don't care about Conquests or D-mods that much. Also new crew is available at Cruor and Sindria, and they'd still rather take their chances aboard your death traps I assume.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 20, 2022, 09:04:57 AM
@Vanshilar
500 HE damage vs 1500 armor is going to result in armor cells getting stripped supper quickly which is not really an interesting case (that's closer to torpedo damage than any gun other than hellbore). I think it would be more useful to consider a much lower hit strength, like 100/200 energy or something vs 1000 armor (that's like medium energy vs cruiser armor which seems like a pretty middle of the road case). Pretty sure that will have a large impact.

Also, it makes no sense to me that in case 1 25%+ more shots miss than case 3, but somehow it only takes 3 more shots to kill. Unless you mean that 46 hits are required to kill, not counting misses.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 20, 2022, 09:27:33 AM
@CapnHector
I'm pretty sure there are some errors, for instance E(a/(1+a)) =/= E(a)*E(1/(1+a)), those expression are not independant.

But I'm also a bit confused about what the variable a is. Is that supposed to be some total armor value? Because it's 100% not true that using the standard armor formula on total armor is equivalent to doing all the armor cell stuff.

You've got some matrix of armor cell values, and the EVs of all of them on the current iteration depend on the values of the others at the previous iteration. Given the previous armor values, calculating the EV is not complicated, but if you want to consider the EV of damage over a sequence of shots (so that the values of armor at the previous iteration are functions of the random variables), it's way way more complicated.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 20, 2022, 09:31:31 AM
@CapnHector
I'm pretty sure there are some errors, for instance E(a/(1+a)) =/= E(a)*E(1/(1+a)), those expression are not independant.

But I'm also a bit confused about what the variable a is. Is that supposed to be some total armor value? Because it's 100% not true that using the standard armor formula on total armor is equivalent to doing all the armor cell stuff.

You've got some matrix of armor cell values, and the EVs of all of them on the current iteration depend on the values of the others at the previous iteration. Given the previous armor values, calculating the EV is not complicated, but if you want to consider the EV of damage over a sequence of shots (so that the values of armor at the previous iteration are functions of the random variables), it's way way more complicated.

Yeah that was a typo that E(a) sorry. It should read E(d). Assume the a_i is the armor value of a single cell after i shots. And d is hit strength (i.e. damage dealt). The main idea is if hit strength is constant there is no covariance problem, so E(a_i) can be calculated based on E(a_{i-1})
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 20, 2022, 09:43:41 AM
so E(a_i) can be calculated based on E(a_{i-1})
I believe this is incorrect. I don't think you can just use the EV of the previous armor value here.

Say a_i = f(a_i-1,d) (where f is a function representing all the necessary calculations). In general E[a_i] =/= f(E[a_i-1], E[d]) unless f is linear (which it is not). Also, f is really a function of a bunch of other armor cells as well, which makes things even more complicated.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 20, 2022, 09:57:04 AM
so E(a_i) can be calculated based on E(a_{i-1})
I believe this is incorrect. I don't think you can just use the EV of the previous armor value here.

Say a_i = f(a_i-1,d) (where f is a function representing all the necessary calculations). In general E[a_i] =/= f(E[a_i-1], E[d]) unless f is linear (which it is not). Also, f is really a function of a bunch of other armor cells as well, which makes things even more complicated.

Specifically let's assume we are above the minimum armor value. We can do the same thing when below it and the edge cases won't contribute much error. Then we know the explicit function f(a_i, d) and it is a_{i-1}-d/(1+1/a_{i-1} (the latter part from damage * damage /(damage+damage/armor). Now assume d is a constant. Then Cov(d,1/(1+1/(a_{i-1}) = 0. Then by the sum property of E(X) E(f(a_i))=E(a_{i-1})-E(d)*E(1/(1+1/a_{i-1})). E(d) is just d as hit strength is constant in Starsector. So I guess the beef is E(f(a_{i-1})) = E(a_{i-1})-d*E(1/(1+1/a_{i-1})) != E(a_i). But why?

Given that this is a sequence and not a continuous function can't we do E(f(f(f(f(...(a_0))...) To get E(a_i)?
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 20, 2022, 10:27:40 AM
(the latter part from damage * damage /(damage+damage/armor).

The formula is damage*damage/(damage + armor) which could be written as damage/(1+armor/damage) (I think that is what you are trying write), so sure, if you are not considering armor cells, that is fine. Really, that armor value is actually a summation over several different armor cells, and the damage is distributed over multiple cells (meaning that damage is done to this cell when the shot hits other cells), so when calculating expectation, there are a bunch more terms. But all of that is not too difficult to handle for one shot.

Given that this is a sequence and not a continuous function can't we do E(f(f(f(f(...(a_0))...) To get E(a_i)?
The fundamental issue is that in general E[f(f(...f(a_0)))] =/= E[f(E[...f(a_0)])] for arbitrary f. The rhs is what we can easily calculate, the lhs is the value we are interested in. It's possible the error is not too significant, but it might be worth testing that.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 20, 2022, 10:51:09 AM
Yeah I have all the attention span of a drunk goldfish rn. Sorry about all the typos. Math shouldn't be done on a bathroom break on your phone.
 Anyway

Let's fix that.

"let's assume we are above the minimum armor value. We can do the same thing when below it and the edge cases won't contribute much error. Then we know the explicit function f(a_i, d) and it is a_{i-1}-d/(1+a_{i-1}/d) (the latter part from damage * damage /(damage+armor). Now assume d is a constant. Then Cov(d,1/(1+(a_{i-1}/d) = 0. Then by the sum property of E(X) E(f(a_i))=E(a_{i-1})-E(d)*E(1/(1+a_{i-1}/d}). E(d) is just d as hit strength is constant in Starsector. So I guess the beef is E(f(a_{i-1})) = E(a_{i-1})-d*E(1/(1+a_{i-1}/d)) != E(a_i). But why?

I get that this isn't so for an arbitrary function, the rules of calculating EV don't work like that. But why not for this one?
Can't really compute the error when can't define the function other than as a sequence.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: intrinsic_parity on October 20, 2022, 02:42:13 PM
I'm pretty sure that E[f(f(...f(a_0)))] = E[f(E[...f(a_0)])] is only true for linear f (it's definitely true in that case).

Earlier I was trying to figure out what E[f(...f(a_0))] was exactly, although I think I did a bad job of explaining what I was doing. I think it should be something like E[a_3] = sum_s3(sum_s2(sum_s1(  f(f(f(a_0,s1),s2),s3)  p(s1)p(s2)p(s3) ))) where sn is the location of the nth shot. But after some numerical experimentation, I don't think it matter enough to worry about it. The error was relatively small, and didn't blow up in cases where it took a lot of shots to kill, so I think it should be fine.

@Vanshilar
Also, I implemented a simulation of armor cells so I could test things for myself (and matched your results with the uniform distribution). But your 3rd case (the least spread out one) is still not a very tight distribution. From my testing, it seems approximately equivalent to a uniform distribution over ~9-11 cells in terms of the number of shots required to kill. You could have a much tighter spread than that quite reasonably. In your case with 500 HE damage, a uniform spread over ~5 cells gets down to about 38 shots in my testing. And all shots hitting one cell takes 35 hits to kill. Also, with those numbers, a simple sim (with no armor cells) takes 35 shots to kill as well.

If I pick another scenario, say 1000 armor, 10000 hull, 100 energy damage (pulse laser vs eagle). I get:
uniform spread over 15 cells: ~431 shots
uniform spread over 9 cells: ~341 shots
uniform spread over 5 cells: ~282 shots
all shots hitting one cell: 221 shots
simple sim, no cells : 203 shots

In that case, the effect of distributing the damage is much larger, almost a 2x increase in shots to kill for damage spread over the entire ship (not even missing), compared to perfectly accurate fire.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 20, 2022, 09:54:10 PM
Alrighty well since we can't agree on a distribution function a priori let's just cop out and construct the distribution at this point.

We'll give R the parameters for range, weapon firing arc, ship width in pixels, and no. of armor cells. Start with Dominator so 15 armor cells.

The spray arc of the weapon is 2pi*range*((max angle)/360 #in Starsector weapon max angle is in degrees). Then the weapon hits the target target width / arc of the time. Additionally this gives us a chance to implement Thaago's fudge factor, which is an error in the hit accuracy due to enemy movement etc. The distribution of the error really shouldn't matter much but let's be realistic and draw it from a normal distribution anyway. mu(error)=0 and the standard deviation is the "fudge factor".

So, in R,
R


#dominator, hullhp, shieldregen, shieldmax, startingarmor, widthinpixels, armorcells
ship <- c(14000, 500, 10000, 1500, 180, 15)

#engagementrange
range <- 1000

#weaponaccuracy - this will be made a function of time and weapon later. the accuracy of a hellbore is 10
acc <- 10

#fudge factor
errorsd <- 0.01
#the fudge factor should be a function of range (more error in position at greater range), but not a function of weapon firing angle, and be expressed in terms of pixels
error <- errorsd*range

#where does one shot hit within the weapon's arc of fire, in pixel difference from the target? get a random angle in degrees according to a uniform distribution,
#then consider that the circumference is 2 pi * range pixels, so the hit coordinates in pixels are
shotangle <- function(acc) return(runif(1,-acc/2,acc/2)/360*2*pi*range)

#how much is the visual arc of the ship in rad?
shipangle <- ship[5]/(2* pi *range)

#how much is the visual arc of a single cell of armor in rad?
cellangle <- shipangle/ship[6]

#now assume the weapon is targeting the center of the ship's visual arc and that the ship is in the center of the weapon's firing arc
#which cell will the shot hit, or will it miss?
#call the cells (MISS, cell1, cell2, ... ,celli, MISS) and get a vector giving the (maximum for negative / minimum for positive) angles for hitting each
anglerangevector <- vector(mode="double", length = ship[6]+1)
anglerangevector[1] <- -shipangle/2
for (i in 1:(length(anglerangevector)-1)) anglerangevector[i+1] <- anglerangevector+cellangle

#now convert it to pixels
anglerangevector <- anglerangevector*2*pi*range

#this vector will store the hits
shipcellvector <- vector(mode="double", length = ship[6]+2)

#now add a random positional error to the coordinates of the hit
hitlocation <- function(acc){
  location <- shotangle(acc)
  location <- location + rnorm(1,0,error)
  return(location)
}

#so which box was hit?
cellhit <- function(angle){
  if(angle < anglerangevector[1]) return(1)
  if(angle > anglerangevector[ship[6]+1]) return(ship[6]+2)
  for (i in 1:length(anglerangevector)) {
    if ((angle > anglerangevector) & (angle <= anglerangevector[i+1])) return(i+1)
  }
}


#now let's run this over 10 000 shots and count how many shots hit where
for (i in 1:10000) {
  wherehit <- cellhit(hitlocation(acc))
  shipcellvector[wherehit] <- shipcellvector[wherehit] + 1
}

shipcellvector
[close]

Here are some distributions. First and last cell represent misses, rest are armor cells.
Hellbore cannon, no fudge factor
Spoiler
> shipcellvector
 [1]   0 503 696 663 700 646 704 720 663 661 724 692 669 681 744 534   0
[close]
(it's expected that it shouldn't miss since the weapon firing arc is smaller than the visual arc of the ship)

Hellbore cannon, fudge factor 0.01 (random positional error SD = 10 px)
Spoiler
> shipcellvector
 [1] 152 438 593 711 744 700 687 738 641 717 663 655 660 683 621 441 156
[close]

Heavy autocannon, no fudge factor
Spoiler
> shipcellvector
 [1] 2154  389  413  376  390  381  400  339  371  423  368  392  398  334  382  383 2107
[close]

Heavy autocannon, fudge factor 0.05 (random positional error SD = 50 px)
Spoiler
> shipcellvector
 [1] 2254  363  358  384  360  379  374  362  393  363  380  392  384  401  355  324 2174
[close]

Now the plan is to use this code to generate shot distributions as a function of time using e.g. 100 000 samples, then summing damage matrices according to distributions to get the expected damage. We'll ignore the possible inaccuracy in cell by cell expected values if it exists because I have no idea how to eliminate it if it does and it shouldn't be large.

This post was edited to make the positional error a function of range instead of shot angle which would obviously have been inaccurate to reality.

Add: "average distribution" for an unknown weapon (average over max spread angle from 1 to 20, the maximum for normal weapons), as % of shots hitting cell, no fudge factor
Spoiler

for (j in 1:20){
  acc <- j
for (i in 1:10000) {
  wherehit <- cellhit(hitlocation(acc))
  shipcellvector[wherehit] <- shipcellvector[wherehit] + 1
}
}

shipcellvector <- shipcellvector/sum(shipcellvector)
shipcellvector <- round(shipcellvector*100,2)
shipcellvector

> shipcellvector
 [1]  7.78  2.58  3.15  3.73  4.52  5.63  6.83  9.65 12.35  9.56  6.86  5.51  4.52  3.73  3.16  2.58  7.86
[close]

Summary: the distribution of hits is uniform if the maximum spread of the weapon is precisely known with no fudge factor applied (assuming the game samples the firing angle from one uniform distribution), but with a special problem of edge cases due to the discrete nature of the armor cells. If the maximum spread of the weapon is not known then a normal distribution should be used instead. The error should be normal, resulting in a final distribution of hits that is X+Y where X is a uniform distribution but with the edge problem and Y is a normal distribution. Given how laborious it is to calculate and justify this distribution I'll instead just simulate it for each ship and weapon instead and use the pre-calculated distribution for the expected location of hits.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on October 20, 2022, 10:45:29 PM
You now at this point you might as well ask Alex to give you the code...
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 21, 2022, 01:56:30 AM
You now at this point you might as well ask Alex to give you the code...

I'll take that as a compliment. Also when this simulation of the Conquest is done and we know what the optimum Conquest is we should go back to appreciating the Conquest as the focus of this thread.

Anyway, next step. Let's try to simulate the Hephaestus. We know the maximum spread / shot is 10. And spread/shot starts at 0 and is increased by 2 for each shot fired. In this model you never stop firing so spread decay is not a concern.

R

# this function generates the shot distribution per 1 shot with 100000 samples
createdistribution <- function(acc){
  distributionvector <- vector(mode="double", length = ship[6]+2)
  for (i in 1:100000){
    wherehit <- cellhit(hitlocation(acc))
    distributionvector[wherehit] <- distributionvector[wherehit] +1
  }
  return(distributionvector/sum(distributionvector))
}

# this is the default distribution of damage to armor cells
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
b[1,1] <- 0
b[1,5] <- 0
b[5,1] <- 0
b[5,5] <- 0

#this function generates a sum of matrices multiplied by the distribution

createhitmatrix <- function(acc){
  hitmatrix <- matrix(0,5,ship[6]+4)
  distributionvector <- createdistribution(acc)
  for (i in 1:ship[6]){
    hitmatrix[,i:(i+4)] <- hitmatrix[,i:(i+4)]+b*(distributionvector[i+1])
  }
  return(hitmatrix)
}

#for weapons with damage changing over time we need a sequence of matrices
createhitmatrixsequence <- function(accvector){
  hitmatrixsequence <- list()
  for (i in 1:length(accvector)){
    hitmatrixsequence[] <- createhitmatrix(accvector)
  }
  return(hitmatrixsequence)
}
   
capture.output(createhitmatrixsequence(c(2,4,6,8)), file = "matrixsequence.txt")

[close]

Now here's what we get, sorry about the line breaks but R has a hard time printing lists of large matrices
Spoiler

# (fudge factor = 0)

[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6]       [,7]       [,8]       [,9]      [,10]      [,11]      [,12]
[1,]    0    0    0    0    0    0 0.00000000 0.01093667 0.02235400 0.03333333 0.02239667 0.01097933
[2,]    0    0    0    0    0    0 0.01093667 0.03329067 0.05568733 0.06666667 0.05573000 0.03337600
[3,]    0    0    0    0    0    0 0.01093667 0.03329067 0.05568733 0.06666667 0.05573000 0.03337600
[4,]    0    0    0    0    0    0 0.01093667 0.03329067 0.05568733 0.06666667 0.05573000 0.03337600
[5,]    0    0    0    0    0    0 0.00000000 0.01093667 0.02235400 0.03333333 0.02239667 0.01097933
          [,13] [,14] [,15] [,16] [,17] [,18] [,19]
[1,] 0.00000000     0     0     0     0     0     0
[2,] 0.01097933     0     0     0     0     0     0
[3,] 0.01097933     0     0     0     0     0     0
[4,] 0.01097933     0     0     0     0     0     0
[5,] 0.00000000     0     0     0     0     0     0

[[2]]
     [,1] [,2] [,3] [,4]        [,5]        [,6]        [,7]       [,8]       [,9]      [,10]      [,11]
[1,]    0    0    0    0 0.000000000 0.002363333 0.008168333 0.01383833 0.01714167 0.01709767 0.01716367
[2,]    0    0    0    0 0.002363333 0.010531667 0.022006667 0.03334333 0.04240767 0.04573633 0.04232867
[3,]    0    0    0    0 0.002363333 0.010531667 0.022006667 0.03334333 0.04240767 0.04573633 0.04232867
[4,]    0    0    0    0 0.002363333 0.010531667 0.022006667 0.03334333 0.04240767 0.04573633 0.04232867
[5,]    0    0    0    0 0.000000000 0.002363333 0.008168333 0.01383833 0.01714167 0.01709767 0.01716367
          [,12]       [,13]       [,14]       [,15] [,16] [,17] [,18] [,19]
[1,] 0.01382833 0.008067333 0.002331333 0.000000000     0     0     0     0
[2,] 0.03332333 0.021895667 0.010398667 0.002331333     0     0     0     0
[3,] 0.03332333 0.021895667 0.010398667 0.002331333     0     0     0     0
[4,] 0.03332333 0.021895667 0.010398667 0.002331333     0     0     0     0
[5,] 0.01382833 0.008067333 0.002331333 0.000000000     0     0     0     0

[[3]]
     [,1] [,2] [,3]        [,4]        [,5]        [,6]       [,7]       [,8]       [,9]      [,10]
[1,]    0    0    0 0.000000000 0.003317667 0.007085667 0.01090300 0.01136800 0.01138367 0.01141667
[2,]    0    0    0 0.003317667 0.010403333 0.017988667 0.02558867 0.02983733 0.03038567 0.03053467
[3,]    0    0    0 0.003317667 0.010403333 0.017988667 0.02558867 0.02983733 0.03038567 0.03053467
[4,]    0    0    0 0.003317667 0.010403333 0.017988667 0.02558867 0.02983733 0.03038567 0.03053467
[5,]    0    0    0 0.000000000 0.003317667 0.007085667 0.01090300 0.01136800 0.01138367 0.01141667
          [,11]      [,12]      [,13]       [,14]       [,15]       [,16] [,17] [,18] [,19]
[1,] 0.01151800 0.01155433 0.01101367 0.007129667 0.003309667 0.000000000     0     0     0
[2,] 0.03063867 0.03020200 0.02587767 0.018143333 0.010439333 0.003309667     0     0     0
[3,] 0.03063867 0.03020200 0.02587767 0.018143333 0.010439333 0.003309667     0     0     0
[4,] 0.03063867 0.03020200 0.02587767 0.018143333 0.010439333 0.003309667     0     0     0
[5,] 0.01151800 0.01155433 0.01101367 0.007129667 0.003309667 0.000000000     0     0     0

[[4]]
     [,1]         [,2]         [,3]        [,4]        [,5]       [,6]       [,7]        [,8]        [,9]
[1,]    0 0.0000000000 0.0009296667 0.003798667 0.006680333 0.00863500 0.00865600 0.008685667 0.008666333
[2,]    0 0.0009296667 0.0047283333 0.010479000 0.016245000 0.02108967 0.02309233 0.023118000 0.023056333
[3,]    0 0.0009296667 0.0047283333 0.010479000 0.016245000 0.02108967 0.02309233 0.023118000 0.023056333
[4,]    0 0.0009296667 0.0047283333 0.010479000 0.016245000 0.02108967 0.02309233 0.023118000 0.023056333
[5,]    0 0.0000000000 0.0009296667 0.003798667 0.006680333 0.00863500 0.00865600 0.008685667 0.008666333
           [,10]      [,11]      [,12]    [,13]    [,14]       [,15]      [,16]        [,17]        [,18]
[1,] 0.008615667 0.00853300 0.00850200 0.008485 0.008530 0.006600333 0.00377800 0.0009043333 0.0000000000
[2,] 0.022950000 0.02281133 0.02269133 0.022683 0.020793 0.016034667 0.01037833 0.0046823333 0.0009043333
[3,] 0.022950000 0.02281133 0.02269133 0.022683 0.020793 0.016034667 0.01037833 0.0046823333 0.0009043333
[4,] 0.022950000 0.02281133 0.02269133 0.022683 0.020793 0.016034667 0.01037833 0.0046823333 0.0009043333
[5,] 0.008615667 0.00853300 0.00850200 0.008485 0.008530 0.006600333 0.00377800 0.0009043333 0.0000000000
     [,19]
[1,]     0
[2,]     0
[3,]     0
[4,]     0
[5,]     0

[close]

You can see the Hephaestus' damage becoming more spread out over multiple shots.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Vanshilar on October 21, 2022, 04:28:12 AM
@Vanshilar
500 HE damage vs 1500 armor is going to result in armor cells getting stripped supper quickly which is not really an interesting case (that's closer to torpedo damage than any gun other than hellbore). I think it would be more useful to consider a much lower hit strength, like 100/200 energy or something vs 1000 armor (that's like medium energy vs cruiser armor which seems like a pretty middle of the road case). Pretty sure that will have a large impact.

No, it's the opposite. The smaller the hits, the more closely CapnHector's probability wave method approximates hits being fired one at a time, since each hit only takes off a bit of armor at a time. It's the large hits where the errors would be more apparent since hits will take off large chunks in specific sections while leaving other sections intact, while the probability wave takes off armor across the whole width relatively evenly.

For example, for 100 energy shots against 1000 armor, with uniform probability on 15 hittable armor cells, then for 500 hits, CapnHector's probability wave method predicts 5679 armor taken off and 14496 damage to hull. If the hits were done one at a time, after 500 hits, for 200 samples, the average was 5655 +- 57 to armor and 14397 +- 175 to hull. So now it's less than 1% off instead of before when it was over 3% off.

So basically, this method of approximating hits is pretty good, with it only being a couple percent off if big weapons are being used. For smaller weapons, the error is negligible.

Also, it makes no sense to me that in case 1 25%+ more shots miss than case 3, but somehow it only takes 3 more shots to kill. Unless you mean that 46 hits are required to kill, not counting misses.

I was assuming every shot hit, i.e. the normal distribution was normalized such that the part that fit within the 15 hittable cells summed to 1. Me talking about the part that misses was just to give an idea of how wide or narrow that distribution was. Maybe I should have said 46 "hits" instead of 46 "shots" or something, but that's what I meant. I guess I'll use that going forward to remove ambiguity.

Also, I implemented a simulation of armor cells so I could test things for myself (and matched your results with the uniform distribution). But your 3rd case (the least spread out one) is still not a very tight distribution. From my testing, it seems approximately equivalent to a uniform distribution over ~9-11 cells in terms of the number of shots required to kill. You could have a much tighter spread than that quite reasonably.

It really depends on what you're fighting, i.e. your weapon's projectile speed and spread, the target's size and maneuverability, etc. For that distribution, 77% of the hits were landing within the center 7 cells and 95% of the hits were landing within the center 11 cells. So you basically hit almost all the time. If you're fighting something like an Onslaught at close range (i.e. essentially non-maneuvering target with big armor cells) then it may be a good representation. If you're trying to chase down a frigate, then probably not. For example, earlier I posted about killing a sim Dominator, which usually took off around 8-9k armor. At base 1500 armor, meaning each column of cells was 500 armor, this translates to stripping off a band of armor that's around 16-18 cells wide. So it was hitting a band of armor around 12-14 wide (basically the entire front face), with the rest missing (and yes there were a number of misses). And Dominators are not exactly known for being maneuverable.

A uniform distribution basically means that you're hitting across the entire width of the band of armor, and then end up breaking through all that armor into hull at pretty much the same time. A normal distribution basically means that you open up a hole in the middle of the armor first, start doing damage to hull at that point, and then gradually widen that hole in the armor as you go along. It's up to you the player to decide what type of armor-busting you see more frequently.

In that case, the effect of distributing the damage is much larger, almost a 2x increase in shots to kill for damage spread over the entire ship (not even missing), compared to perfectly accurate fire.

Well yes, the wider the band of armor being assumed, the longer it's going to take to break through that armor. I mean that's what most of the discussion is about. Simulating hits to shields is easy, simulating hits to hull is easy, it's simulating hits to armor that's difficult. In this case the wider the band of armor being assumed, the more armor there is to churn through and thus the longer it takes. But also, the higher the hit strength, and/or the weapon damage type (HE being best, frag being worst), the faster the armor gets broken through and the less it matters.

Assuming uniform distribution, the number of hits to break through armor is *almost* exactly linear with the width of armor (number of cells wide) being assumed. (The difference is that once the armor band is wide enough, the weapon won't necessarily finish off the armor at the very left and very right before the ship dies.) So for example, for a 1000 armor, 10k hull ship (ignoring shields), a 100 energy damage weapon takes 221 hits to kill it if always hitting the same spot, and 428 hits to kill it if it's uniformly spread across 15 hittable armor cells (width of 19 cells total), a 94% increase. It takes 150 hits to hull to kill it, so this means that the hits to armor increased from 71 to 278.

If the weapon were 100 HE damage, however, it takes 150 hits if hitting the same spot, and 224 hits if spread across 15 hittable armor cells, a 49% increase. With 125 hits needed to kill hull, this means that the hits to armor increased from 25 to 99.

So in this case, assuming a band of 15 hittable armor cells basically quadruples the number of hits needed to break through armor compared with assuming that all hits land in the same spot. And the relationship between number of cells wide and number of hits to armor needed is basically linear.

If we now go back to 1500 armor, 14k hull ship (ignoring shields), a 500 energy damage weapon takes 44 hits to kill it if hitting the same spot, 74 hits if across 15 hittable armor cells, a 68% increase. Number of hits to armor increases from 12 to 42. If that's now a 500 HE damage weapon, then it's 35 hits to kill if hitting the same spot, 46 hits to kill if across 15 hittable armor cells, a 31% increase. Number of hits to armor increases from 5 to 16. So the number of hits to armor needed triples if you assume 15 hittable armor cells instead of 1.

The practical takeaway from this is that if you have a relatively weak weapon (low weapon hit strength relative to target's armor), you'll want to make sure the shots are accurate to not have to go through as much armor. If you have a relatively strong weapon, then you don't have to worry as much about hitting the same spot because the effect won't be as big.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on October 21, 2022, 07:41:21 AM
Next step (working on this piecewise between some things)

We give every weapon data on how its accuracy degrades
Spoiler

#WEAPON ACCURACY
#missiles do not have spread
squallacc <- c(0)
locustacc <- c(0)
hurricaneacc <- c(0)
harpoonacc <- c(0)
sabotacc <- c(0)

#gauss has a spread of 0 and no increase per shot
gaussacc <- c(0)
#hephaestus has a spread of 0 and it increases by 2 per shot to a max of 10
hephaestusacc <- c(seq(0,10,2))
#mark ix has a spread of 0 and it increases by 2 per shot to a max of 15
markixacc <- c(seq(0,15,2),15)
#mjolnir has a spread of 0 and it increases by 1 per shot to a max of 5
mjolniracc <- c(seq(1,5,1))
#hellbore has a spread of 10
hellboreacc <- c(10)
#storm needler has a spread of 10
stormneedleracc <- c(10)
[close]

Then we calculate a hit chance based on the distribution for each weapon and the damage matrix for each weapon and how it changes over time, and bind this to the list entry for each weapon

Spoiler

if(weapon1[4] != ""){
  hitchancevector <- vector(mode = "double", length = length(weapon1[[5]]))
  for (i in 1:length(weapon1[[5]])){
    hitchancevector <- hitchance(weapon1[[5]])
  }
  hitchancevector
  weapon1[[6]] <- hitchancevector
  weapon1[[7]] <- createhitmatrixsequence(weapon1[[5]])
}
[close]

change the damage functions a little
Spoiler

damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
    # vectors in R are indexed starting from 1
  hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]]))+1]]
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    damagesum <- 0
    for (i in 1:nohits) {
#      damagesum <- damagesum + as.double(weapon[[1]]*hitmatrix[hitx,hity])
     damagesum <- damagesum + armordamageselectivereduction(as.double(weapon[[1]]*hitmatrix[hitx,hity]),armor,startingarmor)
     shots <- shots + 1
     hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]])+1)]]
    }
    return(damagesum)
  }
}

# reduce shield hp loss per hit by hit chance. Still use the full damage to calculate whether to block!

    if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult*weapon1[[6]][weapon1shots]
      shieldhp <- max(shieldhp, 0)

[...]
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]])+1)])
        }}
etc.

[close]

Putting it all together we have this
ConquestTimeSeries.R
library(ggplot2)
library(ggthemes)

#SHIP
#dominator, hullhp, shieldregen, shieldmax, startingarmor, widthinpixels, armorcells
ship <- c(14000, 500, 10000, 1500, 180, 15)

#engagementrange
range <- 1000

#weaponaccuracy - this will be made a function of time and weapon later. the accuracy of a hellbore is 10
acc <- 10

#fudge factor
errorsd <- 0.00
#the fudge factor should be a function of range (more error in position at greater range), but not a function of weapon firing angle, and be expressed in terms of pixels
error <- errorsd*range

#where does one shot hit within the weapon's arc of fire, in pixel difference from the target? get a random angle in degrees according to a uniform distribution,
#then consider that the circumference is 2 pi * range pixels, so the hit coordinates in pixels are
shotangle <- function(acc) return(runif(1,-acc/2,acc/2)/360*2*pi*range)

#how much is the visual arc of the ship in rad?
shipangle <- ship[5]/(2* pi *range)

#how much is the visual arc of a single cell of armor in rad?
cellangle <- shipangle/ship[6]

#now assume the weapon is targeting the center of the ship's visual arc and that the ship is in the center of the weapon's firing arc
#which cell will the shot hit, or will it miss?
#call the cells (MISS, cell1, cell2, ... ,celli, MISS) and get a vector giving the (maximum for negative / minimum for positive) angles for hitting each
anglerangevector <- vector(mode="double", length = ship[6]+1)
anglerangevector[1] <- -shipangle/2
for (i in 1:(length(anglerangevector)-1)) anglerangevector[i+1] <- anglerangevector+cellangle

#now convert it to pixels
anglerangevector <- anglerangevector*2*pi*range

#this vector will store the hits
shipcellvector <- vector(mode="double", length = ship[6]+2)

#now add a random positional error to the coordinates of the hit
hitlocation <- function(acc){
  location <- shotangle(acc)
  location <- location + rnorm(1,0,error)
  return(location)
}

#so which box was hit?
cellhit <- function(angle){
  if(angle < anglerangevector[1]) return(1)
  if(angle > anglerangevector[ship[6]+1]) return(ship[6]+2)
  for (i in 1:length(anglerangevector)) {
    if ((angle > anglerangevector) & (angle <= anglerangevector[i+1])) return(i+1)
  }
}


# this function generates the shot distribution per 1 shot with 100000 samples
createdistribution <- function(acc){
  distributionvector <- vector(mode="double", length = ship[6]+2)
  for (i in 1:100000){
    wherehit <- cellhit(hitlocation(acc))
    distributionvector[wherehit] <- distributionvector[wherehit] +1
  }
  return(distributionvector/sum(distributionvector))
}

# this is the default distribution of damage to armor cells
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
b[1,1] <- 0
b[1,5] <- 0
b[5,1] <- 0
b[5,5] <- 0

#this function generates a sum of matrices multiplied by the distribution

createhitmatrix <- function(acc){
  hitmatrix <- matrix(0,5,ship[6]+4)
  distributionvector <- createdistribution(acc)
  for (i in 1:ship[6]){
    hitmatrix[,i:(i+4)] <- hitmatrix[,i:(i+4)]+b*(distributionvector[i+1])
  }
  return(hitmatrix)
}


hitchance <- function(acc){
  hitchance <- 0
  distributionvector <- createdistribution(acc)
  hitchance <- (1-(distributionvector[1]+distributionvector[ship[6]]))
  return(hitchance)
}

#for weapons with damage changing over time we need a sequence of matrices
createhitmatrixsequence <- function(accvector){
  hitmatrixsequence <- list()
  for (i in 1:length(accvector)){
    hitmatrixsequence[] <- createhitmatrix(accvector)
  }
  return(hitmatrixsequence)
}
 
armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,startingarmor) {
  useminarmor <- 0
  if(armor < 0.05*startingarmor / 15) useminarmor <- 1
  if(useminarmor == 0){
    if(armor == 0) {return (damage)}
    return(damage*(max(0.15,damage/(damage+armor))))
  }
  else{
    return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
  }
}

#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles in 1 second, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds. Since there is no neat way to handle this when time is discrete at 1 sec we'll handle as follows
mjolnirtics <- c(1,1,2,1,2,1,2,1,1)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)

#WEAPON ACCURACY
#missiles do not have spread
squallacc <- c(0)
locustacc <- c(0)
hurricaneacc <- c(0)
harpoonacc <- c(0)
sabotacc <- c(0)

#gauss has a spread of 0 and no increase per shot
gaussacc <- c(0)
#hephaestus has a spread of 0 and it increases by 2 per shot to a max of 10
hephaestusacc <- c(seq(0,10,2))
#mark ix has a spread of 0 and it increases by 2 per shot to a max of 15
markixacc <- c(seq(0,15,2),15)
#mjolnir has a spread of 0 and it increases by 1 per shot to a max of 5
mjolniracc <- c(seq(1,5,1))
#hellbore has a spread of 10
hellboreacc <- c(10)
#storm needler has a spread of 10
stormneedleracc <- c(10)

#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name, weapon accuracy over time, hit chance
squall <- list(250, 2, squalltics, "Squall", squallacc)
locust <- list(200, 0.25, locusttics, "Locust", locustacc)
hurricane <- list(500, 0.5, hurricanetics, "Hurricane", hurricaneacc)
harpoon <- list(750, 0.5, harpoontics, "Harpoon", harpoonacc)
sabot <- list(200, 2, sabottics, "Sabot", sabotacc)
gauss <- list(700, 2, gausstics, "Gauss", gaussacc)
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus", hephaestusacc)
markix <- list(200, 2, markixtics, "Mark IX", markixacc)
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir", mjolniracc)
hellbore <- list(750, 0.5, hellboretics, "Hellbore", hellboreacc)
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler", stormneedleracc)
dummy <- list(0,0,c(0),"",c(0),c(0))

weapon1 <- squall
weapon2 <- squall
weapon3 <- harpoon
weapon4 <- harpoon
weapon5 <- hephaestus
weapon6 <- gauss

#now create the sequences of hit matrices and hit chances for each weapon

if(weapon1[4] != ""){
  hitchancevector <- vector(mode = "double", length = length(weapon1[[5]]))
  for (i in 1:length(weapon1[[5]])){
    hitchancevector <- hitchance(weapon1[[5]])
  }
  hitchancevector
  weapon1[[6]] <- hitchancevector
  weapon1[[7]] <- createhitmatrixsequence(weapon1[[5]])
}

if(weapon2[4] != ""){
  hitchancevector <- vector(mode = "double", length = length(weapon2[[5]]))
  for (i in 1:length(weapon2[[5]])){
    hitchancevector <- hitchance(weapon2[[5]])
  }
  hitchancevector
  weapon2[[6]] <- hitchancevector
  weapon2[[7]] <- createhitmatrixsequence(weapon2[[5]])
}

if(weapon3[4] != ""){
  hitchancevector <- vector(mode = "double", length = length(weapon3[[5]]))
  for (i in 1:length(weapon3[[5]])){
    hitchancevector <- hitchance(weapon3[[5]])
  }
  hitchancevector
  weapon3[[6]] <- hitchancevector
  weapon3[[7]] <- createhitmatrixsequence(weapon3[[5]])
}

if(weapon4[4] != ""){
  hitchancevector <- vector(mode = "double", length = length(weapon4[[5]]))
  for (i in 1:length(weapon4[[5]])){
    hitchancevector <- hitchance(weapon4[[5]])
  }
  hitchancevector
  weapon4[[6]] <- hitchancevector
  weapon4[[7]] <- createhitmatrixsequence(weapon4[[5]])
}

if(weapon5[4] != ""){
  hitchancevector <- vector(mode = "double", length = length(weapon5[[5]]))
  for (i in 1:length(weapon5[[5]])){
    hitchancevector <- hitchance(weapon5[[5]])
  }
  hitchancevector
  weapon5[[6]] <- hitchancevector
  weapon5[[7]] <- createhitmatrixsequence(weapon5[[5]])
}

if(weapon6[4] != ""){
  hitchancevector <- vector(mode = "double", length = length(weapon6[[5]]))
  for (i in 1:length(weapon6[[5]])){
    hitchancevector <- hitchance(weapon6[[5]])
  }
  hitchancevector
  weapon6[[6]] <- hitchancevector
  weapon6[[7]] <- createhitmatrixsequence(weapon6[[5]])
}

shieldblock <- 0

shielddamageattimepoint <- function(weapon, timepoint){
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    return(weapon[[1]]*nohits)
  }
}

damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
    # vectors in R are indexed starting from 1
  hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]]))]]
  nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
  if (nohits == 0) {return(0)} else {
    damagesum <- 0
    for (i in 1:nohits) {
#      damagesum <- damagesum + as.double(weapon[[1]]*hitmatrix[hitx,hity])
     damagesum <- damagesum + armordamageselectivereduction(as.double(weapon[[1]]*hitmatrix[hitx,hity]),armor,startingarmor)
     shots <- shots + 1
     hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]]))]]
    }
    return(damagesum)
  }
}


weapon1shots <- 1
weapon2shots <- 1
weapon3shots <- 1
weapon4shots <- 1
weapon5shots <- 1
weapon6shots <- 1

armormatrix <- matrix(ship[4]/15,5,ship[6]+4)

timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
  weaponacc <- 0
  #are we using shield to block?
  shieldblock <- 0
  hulldamage <- 0
  if(hullhp > 0){} else {shieldhp <- 0}
 
  #1. shields. if shieldhp is sufficient, use shield to block
  if (weapon1[[4]] !=""){
    weapon1mult <- unlist(weapon1[2])
    if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))]
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon1,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      #damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){

      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))])
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))])
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))])
        }}
     
      hullhp <- hullhp - hulldamage*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))]
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  weapon1shots <- weapon1shots + weapon1[[3]][(timepoint %% (length(weapon1[[3]])+1))]

 
  #repeat for other weapons
  if (weapon2[[4]] !=""){
    weapon2mult <- unlist(weapon2[2])
    if (shieldhp > shielddamageattimepoint(weapon2, timepoint)*weapon2mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon2, timepoint)*weapon2mult*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))]
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon2,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      #damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)-armormatrix[i,j])/weapon2mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))])
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)-armormatrix[i,j])/weapon2mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))])
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)-armormatrix[i,j])/weapon2mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))])
        }}
     
      hullhp <- hullhp - hulldamage*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))]
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  weapon2shots <- weapon2shots + weapon2[[3]][(timepoint %% (length(weapon2[[3]])))+1]
  if (weapon3[[4]] !=""){
    weapon3mult <- unlist(weapon3[2])
    if (shieldhp > shielddamageattimepoint(weapon3, timepoint)*weapon3mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon3, timepoint)*weapon3mult*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))]
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon3,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      #damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))])
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))])
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)-armormatrix[i,j])/weapon3mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))])
        }}
     
      hullhp <- hullhp - hulldamage*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))]
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  weapon3shots <- weapon3shots + weapon3[[3]][(timepoint %% (length(weapon3[[3]])))+1]
  if (weapon4[[4]] !=""){
    weapon4mult <- unlist(weapon4[2])
    if (shieldhp > shielddamageattimepoint(weapon4, timepoint)*weapon4mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon4, timepoint)*weapon4mult*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))]
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon4,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      #damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))])
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))])
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)-armormatrix[i,j])/weapon4mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))])
        }}
     
      hullhp <- hullhp - hulldamage*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))]
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  weapon4shots <- weapon4shots + weapon4[[3]][(timepoint %% (length(weapon4[[3]])))+1]
  if (weapon5[[4]] !=""){
    weapon5mult <- unlist(weapon5[2])
    if (shieldhp > shielddamageattimepoint(weapon5, timepoint)*weapon5mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon5, timepoint)*weapon5mult*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))]
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon5,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      #damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))])
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))])
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)-armormatrix[i,j])/weapon5mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))])
        }}
     
      hullhp <- hullhp - hulldamage*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))]
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  weapon5shots <- weapon5shots + weapon5[[3]][(timepoint %% (length(weapon5[[3]])))+1]
  if (weapon6[[4]] !=""){
    weapon6mult <- unlist(weapon6[2])
    if (shieldhp > shielddamageattimepoint(weapon6, timepoint)*weapon6mult){
      shieldhp <- shieldhp - shielddamageattimepoint(weapon6, timepoint)*weapon6mult*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))]
      shieldhp <- max(shieldhp, 0)
      if(shielddamageattimepoint(weapon6,timepoint) > 0) {shieldblock <- 1}
    } else {
      #if you did not use shield to block, regenerate flux
      #2. armor and hull
      if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
      #2.1. damage armor and hull
      hulldamage <- 0   
     
      #damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
     
      for (j in 2:9){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))])
        }}
     
     
      for (j in 2:9){
        for (i in c(1,5)){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))])
        }}
      for (j in c(1,10)){
        for (i in 2:4){
          hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)-armormatrix[i,j])/weapon6mult
          armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))])
        }}
     
      hullhp <- hullhp - hulldamage*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))]
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
    }
  }
  weapon6shots <- weapon6shots + weapon6[[3]][(timepoint %% (length(weapon6[[3]])))+1]
 
   
      hullhp <- hullhp - hulldamage
      hullhp <- max(hullhp, 0)
     
      armorhp <- sum(armormatrix)/(46/15)
      if(hullhp==0) armorhp <- 0
     
   
 
 
 
 
 
  if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
  return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}

totaltime = 60



armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0



timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))

for (t in 1:totaltime){
  state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
  shieldhp <- state[[2]]
  armorhp <- state[[3]]
  hullhp <- state[[4]]
  flux <- shieldmax - shieldhp
  armormatrix <- state[[8]]
  if(hullhp == 0){flux <- 0}
  timeseriesarray <- rbind(timeseriesarray , c(state[[1]], flux/shieldmax*100, state[[3]]/startingarmor*100, state[[4]]/ship[1]*100))
 
}

colnames(timeseriesarray) <-  c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))


ggplot(timeseriesarray, aes(x=Time))  +
  geom_line(aes(y = Flux, color = "Flux")) +
  geom_line(aes(y = Armor, color="Armor")) +
  geom_line(aes(y = Hull, color="Hull")) +
  scale_colour_manual("",
                      breaks = c("Flux", "Armor", "Hull"),
                      values = c("lightsteelblue", "red", "maroon")) +
  ylab("% max") +
  xlab("Time (s)") +
  labs(title=weaponstitle)

[close]

Yielding this
(https://i.ibb.co/68v10m8/image.png) (https://ibb.co/DYG8ftY)
(fudge factor of 0)

Now interestingly we are within the time predicted by Vanshilar's simulations now that accuracy has been taken into account (and minimum armor rule is fixed and applied correctly), even without a fudge factor. Next let's try to figure out what the fudge factor should be with Locust-Locust-Harpoon-Harpoon-Gauss-HAC and Vanshilar's data.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on December 15, 2022, 05:57:30 AM
Let me dig out this thread to present Optimizing the Conquest: A Non-mathematical Model of Space Combat.

After the Radiants beat up my ass for the 69th time I finally swallowed up my OCD and stopped trying to make a symmetrical Conquest. Instead I... still tried to make it symmetrical, only with split damage types this time(all kinetic left, all explosive/fragmentation right) Since I knew I was going to need all the kinetic damage I can get, and with only one Squall, I went all out and even put a Resonator on it to boost the kinetic damage output(if you put Sabots on the left, which I tried, the AI is never going to use them - I think it's a range issue, 1200 is just not enough)

(https://i.ibb.co/64Nkz2Z/conquestold.jpg)

The results were... acceptable? This is actually the setup I beat the bounty Omega Ordo with, albeit it took a long time and I suffered losses. Because of this I don't consider the build fully viable, I also don't like to rely on Omega weapons since in current version of the game they are random and limited. I had the Resonators I needed this time, I might not have them the next time. Which is a shame because I really like the idea of a two-faced Conquest. I also like the Hurricane, it looks cool and slaps hard.

That's when I swallowed even more of my OCD and went for double Squalls.

(https://i.ibb.co/zxBYV8t/conquestmid.jpg)

This is probably how most sensible people would fit a Conquest, with the exception of the Maulers and EO. I really wanted to have some explosive damage in there - Squalls are getting nerfed against armor next patch and I do fight enemies other than the Remnant, up to and including Derelict bounties, which really require some explosive weapons if you want to do them in a reasonable amount of time. I used this build for a while and considered it finished but the more I played with it the more flaws I noticed. First of all, noticeable range mismatch between Gauss and Maulers. Second of all, Gauss have very slow rotation speed and AI likes to "wiggle" the ship which causes rather embarassing misses(Later I dumped some flux capacity for Advanced Turret Gyros for this reason) Maulers themselves are kind of meh as well - they fire in a burst which makes it too easy for an enemy ship to simply raise the shield to stop the shots, and AI is not great with slow firing weapons in general since it fires at first thing that's in range. And the damage... I swear that a single shot from a Gauss does more hull damage than entire three shot salvo from a Mauler sometimes.

This is when I remembered my old Conquest with double Mjolnirs and thought... why not? Could it even be done while remaining flux neutral?

(https://i.ibb.co/NS7RtVT/conquest.jpg)

It could.

No more problems with turret turn speed, no more problems with range mismatch, no more Maulers, Mjolnir can still crack open armor. Mjolnirs can also swat fighters rather effectively unlike the Gauss, which is great because AI will often fire at enemy fighters when there's nothing else in range. Also note the triple EMP damage(Ion Beam/HVD/Mjolnir)

Is the tank fine without any flux capacitors? Yes! This took me way too long to realize but since Conquest already has a massive base flux capacity, adding capacitors with OP is actually very inefficient. For example this version has base flux capacity of 26k, which means that spending 5 OP on capacitors(+1000 capacity) would increase it by only 1/26th, or by less than 4%. You really want to go all out with vents on the Conquest.

Could it be improved? I guess HVDs could be swapped for Heavy Autocannons, but it's debatable whether or not they are actually better than HVDs, and in my experience they tend to spray a lot given the distances involved, even with Gunnery Implants. And yes, the Efficiency Overhaul is still there.

After playing with Conquests for so long they seem honestly kind of ridiculous. For 40 DP you get two large missile mounts, two medium missile mounts, two large ballistic mounts, two medium ballistic mounts and an Ion Beam - there isn't a single(practical) ship in the game with more firepower per DP spent. And all that on a hull that actually moves, unlike most other capitals. I can't even imagine using other ships now since they just seem so puny in comparison. Maybe the upcoming Pegasus will be better, but I expect it to be at least 50 DP so we'll see about that.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on December 15, 2022, 08:11:44 AM
I like you already! Thanks for contributing to Conquest appreciation especially as the other thread has turned a little math-y for the moment until we work out some things to do with the model.

Your build looks excellent and Mjolnir Mjolnir was the combo of large ballistics with the fastest times to kill in testing. Here is the build I've personally settled on

(https://i.ibb.co/qdZFPL2/optimal-comquest.png) (https://ibb.co/DtqgSPj)

Honestly, this ship delivers on so many fronts I really can't be bothered to change the design or consider other capitals anymore. It is burn 10 and can take on almost anything with the game, due to its range, overwhelming firepower and tendency to form natural lines of battle when paired with Steady officers. Although you'll note in this playthrough I paired it with aggressive Brawler LP's, which works quite well (also burn 10 and they can capture objectives kill the frigates that distract your Conquests). This is the build I used to do the Super Redacted mission and also farm Ordos.

I don't think HAC is the way to go though, because the accuracy is very underwhelming. I tried it for a while, but went back. I should probably play around with Mjolnirs since I don't have that much experience with them, despite simulations suggesting better efficiency I wanted to pair Gauss with the missiles because of the range.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on December 23, 2022, 04:07:48 AM
I'm going to follow up on this and say that based on some more experience fighting remnants using Mjolnir Mjolnir, I think I have a new favorite. The concerns about range turn out to have been unfounded, since the Remnant ships will close the distance and overwhelm you. I decided to go for what the model said was best, and use Mjolnir Mjolnir Needler Needler, alongside stabilized and hardened shields and of course this build still can reach burn 10 which I like while doing it all. That said, to optimize it for combat, S-mod in the Hardened Shields to gain extra 25 OP.

(https://i.ibb.co/f2BbbK3/victorious-build.png) (https://ibb.co/FKN99fQ)

I was just able to take out a double Ordo of 4 Radiants and 10 Brilliants with these 5 Conquests and a supporting crew of 2 afflictors and 4 brawler LPs with absolutely minimal player input - no piloting of my own, just orders to capture command points and then eliminate orders on the Radiants for the Conquests. Only 4 frigates were lost. I'm not 100% about the Locusts, but I do think they are useful finishers after all and they are predicted to be good by the model. I think they may be useful in that you want to sweep the lesser Remnant ships aside fast so as to not die to the Radiants.

Here are some very nice scenes from a different fight that illustrate Conquest dynamics at their best, Hegemony decided to send an invasion fleet full of capital ships vs. my base of Sindria. Of course, they all died with no losses or need for player input on my side.

(https://i.ibb.co/XFjM1K2/mjolnir-locust-version.png) (https://ibb.co/kq5vjwH)
(https://i.ibb.co/VVkD0d3/mjolnir-locust-version-2.png) (https://ibb.co/G7rkfXF)
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: Grievous69 on December 23, 2022, 04:28:06 AM
That could be even better if you replace the s-modded ADF with something else. Conquest has 8 base burn, not sure what you need 10 burn for against Remnants.
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: BCS on December 23, 2022, 09:56:27 AM
Base 10 burn fleet is the dream after all
Title: Re: Conquest appreciation thread (0.95.1a)
Post by: CapnHector on December 23, 2022, 10:14:16 AM
Yeah, this was a Nexerelin Pirate playthrough, so burn 10 was actually helpful at times. I agree with you that to optimize it for combat you should S-mod in the Hardened Shields, I think. I would personally probably just use the rest for capacitors, can't think of much that would benefit this ship more. Armored weapon mounts and then mounting HACs if that helps with the accuracy could be another consideration, since it would be +100 range. But I can't be bothered, because it is good enough as it is, and if it makes travel go faster then all the better.

It was a Pirate playthrough, before I started my own faction and conquered Sindria that is. Fun fact: Phillip is still there and still Supreme Executor, and I am still not important enough to petition him.