Fractal Softworks Forum

Please login or register.

Login with username, password and session length
Advanced search  

News:

Starsector 0.97a is out! (02/02/24); New blog post: Planet Search Overhaul (07/13/24)

Pages: 1 2 [3] 4 5 ... 7

Author Topic: Conquest appreciation thread (0.95.1a)  (Read 11358 times)

Vanshilar

  • Admiral
  • *****
  • Posts: 714
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #30 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]
Logged

CapnHector

  • Admiral
  • *****
  • Posts: 1056
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #31 on: October 14, 2022, 03:34:13 AM »

Those back of the envelope calculations seem very reasonable. Let's compare it to the model.


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.
« Last Edit: October 14, 2022, 05:26:54 AM by CapnHector »
Logged
5 ships vs 5 Ordos: Executor · Invictus · Paragon · Astral · Legion · Onslaught · Odyssey | Video LibraryHiruma Kai's Challenge

CapnHector

  • Admiral
  • *****
  • Posts: 1056
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #32 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.
« Last Edit: October 15, 2022, 06:22:19 AM by CapnHector »
Logged
5 ships vs 5 Ordos: Executor · Invictus · Paragon · Astral · Legion · Onslaught · Odyssey | Video LibraryHiruma Kai's Challenge

BCS

  • Captain
  • ****
  • Posts: 279
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #33 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)
Logged

Thaago

  • Global Moderator
  • Admiral
  • *****
  • Posts: 7541
  • Harpoon Affectionado
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #34 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?
« Last Edit: October 14, 2022, 11:24:29 AM by Thaago »
Logged

Hiruma Kai

  • Admiral
  • *****
  • Posts: 903
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #35 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.
« Last Edit: October 14, 2022, 11:59:03 AM by Hiruma Kai »
Logged

Vanshilar

  • Admiral
  • *****
  • Posts: 714
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #36 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.
« Last Edit: October 14, 2022, 02:46:08 PM by Vanshilar »
Logged

intrinsic_parity

  • Admiral
  • *****
  • Posts: 3080
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #37 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.
Logged

BCS

  • Captain
  • ****
  • Posts: 279
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #38 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.
Logged

CapnHector

  • Admiral
  • *****
  • Posts: 1056
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #39 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.




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)
« Last Edit: October 15, 2022, 05:21:51 AM by CapnHector »
Logged
5 ships vs 5 Ordos: Executor · Invictus · Paragon · Astral · Legion · Onslaught · Odyssey | Video LibraryHiruma Kai's Challenge

CapnHector

  • Admiral
  • *****
  • Posts: 1056
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #40 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:


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]
« Last Edit: October 15, 2022, 05:56:58 AM by CapnHector »
Logged
5 ships vs 5 Ordos: Executor · Invictus · Paragon · Astral · Legion · Onslaught · Odyssey | Video LibraryHiruma Kai's Challenge

CapnHector

  • Admiral
  • *****
  • Posts: 1056
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #41 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.
« Last Edit: October 15, 2022, 07:35:48 AM by CapnHector »
Logged
5 ships vs 5 Ordos: Executor · Invictus · Paragon · Astral · Legion · Onslaught · Odyssey | Video LibraryHiruma Kai's Challenge

intrinsic_parity

  • Admiral
  • *****
  • Posts: 3080
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #42 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).
Logged

CapnHector

  • Admiral
  • *****
  • Posts: 1056
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #43 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]
« Last Edit: October 15, 2022, 11:56:35 AM by CapnHector »
Logged
5 ships vs 5 Ordos: Executor · Invictus · Paragon · Astral · Legion · Onslaught · Odyssey | Video LibraryHiruma Kai's Challenge

CapnHector

  • Admiral
  • *****
  • Posts: 1056
    • View Profile
Re: Conquest appreciation thread (0.95.1a)
« Reply #44 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):


« Last Edit: October 16, 2022, 06:44:18 AM by CapnHector »
Logged
5 ships vs 5 Ordos: Executor · Invictus · Paragon · Astral · Legion · Onslaught · Odyssey | Video LibraryHiruma Kai's Challenge
Pages: 1 2 [3] 4 5 ... 7