Devastators on left side are tripping me out though.
I always put them on the right side, like god intended.
I wonder how squall nerf will affect it next patch.Spoiler alert: Not at all.
Oh yeah, re left vs right: I like putting the guns on the left so its the same as on an Odyssey in terms of flying.
Augmented drive field, efficiency overhaul, locust. Damn, I am too much of a coward to use stuff that does not directly help in combat. I suppose locust does I just rarely use it and mostly on Apogees if I do.
That said two Locusts is... a LOT of missiles. Gets into the "finishing off a cruiser" territory.I actually find myself using Locusts for their "intended" purpose fairly often: making fighter wings threatening my frigate wolfpacks go away.
That said two Locusts is... a LOT of missiles. Gets into the "finishing off a cruiser" territory.I actually find myself using Locusts for their "intended" purpose fairly often: making fighter wings threatening my frigate wolfpacks go away.
Squall | Locust | |
Range | 2500 | 1400 |
Ammo for | 2.6 | 2.2 minutes of continuous fire (no expanded missile racks) |
1 volley is fired over | 19.4 seconds | 8.9 seconds |
DPS vs shields | 512 | 224.75 |
DPS vs armor | 128+EMP | 224.75 |
Tracking | Bad | Excellent |
remainingarmor <- function(damage, armor, startingarmor) max(0.05*startingarmor,armor-damage)
armordamage <- function(damage, armor) damage*(max(0.15,damage/(damage+armor)))
totalarmordamage <- function(damage, startingarmor, salvo){
armor <-startingarmor
totaldamage <- 0
for (i in 1:salvo){
totaldamage <- totaldamage + armordamage(damage, armor)
armor <- remainingarmor(armordamage(damage,armor), armor, startingarmor)
}
totaldamage
}
armorhpremaining <- function(missiledamage, multiplier, startingarmor, salvo) startingarmor - totalarmordamage(missiledamage*multiplier,startingarmor,salvo)
shieldhpremaining <- function(duration, dps, multiplier, startingshields, regenrate) startingshields-duration*dps*multiplier+duration*regenrate
hullhpremaining <- function(missiledamage, startinghull, salvo) startinghull-missiledamage*salvo
Apparently the reason the Squall spam strategy works is partly that when you have several Conquests worth of Squalls firing at a single target, it is enough to penetrate even cruiser/capital level armor in addition to devastating shields. Also, because of the range, you usually have several ships that can spam missiles at a single target. Of course, this is ignoring that you should also mount Harpoons to go with the Squalls.
library(ggplot2)
library(ggthemes)
armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1.33,1.33,1.33)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)
#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")
weapon1 <- squall
weapon2 <- squall
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- dummy
weapon6 <- dummy
damageattimepoint <- function(weapon, timepoint) c(unlist(weapon[1])*unlist(weapon[3])[timepoint %% length(unlist(weapon[3]))], unlist(weapon[2]))
timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor){
#flux dissipation - perfect shielduse
if(hullhp > 0){
shieldhp <- min(shieldhp+shieldregen, shieldmax)
} else {shieldhp <- 0}
#1. shields. if shieldhp is sufficient, use shield to block
weapon1mult <- unlist(weapon1[2])
if (shieldhp > damageattimepoint(weapon1, timepoint)[1]*weapon1mult){
shieldhp <- shieldhp - damageattimepoint(weapon1, timepoint)[1]*weapon1mult
shieldhp <- max(shieldhp, 0)
} else {
#2. armor
if(armorhp > 0){
if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon1, timepoint)[1]*weapon1mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
#3. hull
hulldmg <- damageattimepoint(weapon1, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
#other weapons
weapon2mult <- unlist(weapon2[2])
if (shieldhp > damageattimepoint(weapon2, timepoint)[1]*weapon2mult){
shieldhp <- shieldhp - damageattimepoint(weapon2, timepoint)[1]*weapon2mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon2, timepoint)[1]*weapon2mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon2, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon3mult <- unlist(weapon3[2])
if (shieldhp > damageattimepoint(weapon3, timepoint)[1]*weapon3mult){
shieldhp <- shieldhp - damageattimepoint(weapon3, timepoint)[1]*weapon3mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon3, timepoint)[1]*weapon3mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon3, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon4mult <- unlist(weapon4[2])
if (shieldhp > damageattimepoint(weapon4, timepoint)[1]*weapon4mult){
shieldhp <- shieldhp - damageattimepoint(weapon4, timepoint)[1]*weapon4mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon4, timepoint)[1]*weapon4mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon4, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon5mult <- unlist(weapon5[2])
if (shieldhp > damageattimepoint(weapon5, timepoint)[1]*weapon5mult){
shieldhp <- shieldhp - damageattimepoint(weapon5, timepoint)[1]*weapon5mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon5, timepoint)[1]*weapon5mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon5, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon6mult <- unlist(weapon6[2])
if (shieldhp > damageattimepoint(weapon6, timepoint)[1]*weapon6mult){
shieldhp <- shieldhp - damageattimepoint(weapon6, timepoint)[1]*weapon6mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon6, timepoint)[1]*weapon6mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon6, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
return(c(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor))
}
totaltime = 180
#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)
armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))
for (t in 1:totaltime){
state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor)
shieldhp <- state[2]
armorhp <- state[3]
hullhp <- state[4]
flux <- shieldmax - shieldhp
if(hullhp == 0){flux <- 0}
timeseriesarray <- rbind(timeseriesarray , c(state[1], flux/shieldmax*100, state[3]/startingarmor*100, state[4]/ship[1]*100))
}
colnames(timeseriesarray) <- c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))
ggplot(timeseriesarray, aes(x=Time)) + theme_tufte() +
geom_line(aes(y = Flux, color = "Flux")) +
geom_line(aes(y = Armor, color="Armor")) +
geom_line(aes(y = Hull, color="Hull")) +
scale_colour_manual("",
breaks = c("Flux", "Armor", "Hull"),
values = c("lightsteelblue", "red", "maroon")) +
ylab("% max") +
xlab("Time (s)") +
labs(title=weaponstitle)
armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1.33,1.33,1.33)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)
#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")
weapon1 <- squall
weapon2 <- squall
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- dummy
weapon6 <- dummy
weapon1choices <- list(squall, locust, hurricane, dummy)
weapon2choices <- list(squall, locust, hurricane, dummy)
weapon3choices <- list(harpoon, sabot, dummy)
weapon4choices <- list(harpoon, sabot, dummy)
weapon5choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler, dummy)
weapon6choices <- list(gauss, markix, mjolnir, hellbore, hephaestus, stormneedler, dummy)
timeseriesarray <- data.frame(matrix(ncol = 7,nrow=0))
timetokill=0
damageattimepoint <- function(weapon, timepoint) c(unlist(weapon[1])*unlist(weapon[3])[timepoint %% length(unlist(weapon[3]))], unlist(weapon[2]))
timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor){
#flux dissipation - perfect shielduse
if(hullhp > 0){
shieldhp <- min(shieldhp+shieldregen, shieldmax)
} else {shieldhp <- 0}
#1. shields. if shieldhp is sufficient, use shield to block
weapon1mult <- unlist(weapon1[2])
if (shieldhp > damageattimepoint(weapon1, timepoint)[1]*weapon1mult){
shieldhp <- shieldhp - damageattimepoint(weapon1, timepoint)[1]*weapon1mult
shieldhp <- max(shieldhp, 0)
} else {
#2. armor
if(armorhp > 0){
if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon1, timepoint)[1]*weapon1mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
#3. hull
hulldmg <- damageattimepoint(weapon1, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
#other weapons
weapon2mult <- unlist(weapon2[2])
if (shieldhp > damageattimepoint(weapon2, timepoint)[1]*weapon2mult){
shieldhp <- shieldhp - damageattimepoint(weapon2, timepoint)[1]*weapon2mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon2, timepoint)[1]*weapon2mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon2, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon3mult <- unlist(weapon3[2])
if (shieldhp > damageattimepoint(weapon3, timepoint)[1]*weapon3mult){
shieldhp <- shieldhp - damageattimepoint(weapon3, timepoint)[1]*weapon3mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon3, timepoint)[1]*weapon3mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon3, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon4mult <- unlist(weapon4[2])
if (shieldhp > damageattimepoint(weapon4, timepoint)[1]*weapon4mult){
shieldhp <- shieldhp - damageattimepoint(weapon4, timepoint)[1]*weapon4mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon4, timepoint)[1]*weapon4mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon4, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon5mult <- unlist(weapon5[2])
if (shieldhp > damageattimepoint(weapon5, timepoint)[1]*weapon5mult){
shieldhp <- shieldhp - damageattimepoint(weapon5, timepoint)[1]*weapon5mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon5, timepoint)[1]*weapon5mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon5, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
weapon6mult <- unlist(weapon6[2])
if (shieldhp > damageattimepoint(weapon6, timepoint)[1]*weapon6mult){
shieldhp <- shieldhp - damageattimepoint(weapon6, timepoint)[1]*weapon6mult
shieldhp <- max(shieldhp, 0)
} else {
if(armorhp > 0){
if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
armorhp <- armorhp - armordamage(damageattimepoint(weapon6, timepoint)[1]*weapon6mult,armorhp,startingarmor)
armorhp <- max(armorhp, 0)
} else {
hulldmg <- damageattimepoint(weapon6, timepoint)[1]
hullhp <- hullhp - hulldmg*hulldmg/(hulldmg+0.05*startingarmor)
hullhp <- max(hullhp,0)
}
}
return(c(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor))
}
totaltime = 180
#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)
weapon1choices[[2]]
armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
for (i in 1:length(weapon1choices)) {
weapon1<-weapon1choices[]
for (j in 1:length(weapon2choices)) {
weapon2<-weapon2choices[[j]]
for (k in 1:length(weapon3choices)) {
weapon3<-weapon3choices[[k]]
for (l in 1:length(weapon4choices)) {
weapon4<-weapon4choices[[l]]
for (m in 1:length(weapon5choices)) {
weapon5<-weapon5choices[[m]]
for (n in 1:length(weapon6choices)) {
weapon6<-weapon6choices[[n]]
for (t in 1:totaltime){
state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor)
shieldhp <- state[2]
armorhp <- state[3]
hullhp <- state[4]
flux <- shieldmax - shieldhp
if(hullhp == 0){flux <- 0
if (timetokill == 0){timetokill <- t}
}
}
if (timetokill ==0){timetokill <- NA}
tobind <- c(timetokill,unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))
timeseriesarray <- rbind(timeseriesarray,tobind)
timetokill <- 0
armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
}
}
}
}
}
}
colnames(timeseriesarray) <- c("Timetokill", "Weapon1", "Weapon2", "Weapon3", "Weapon4", "Weapon5", "Weapon6")
timeseriesarray
write.table(timeseriesarray, file = "optimizeweapons.tsv", row.names=FALSE, sep="\t")
timeseriesarray[,1]
sortbytime <- timeseriesarray[order(as.integer(timeseriesarray$Timetokill)),]
sortbytime
write.table(sortbytime, file = "optimizeweaponsbytime.txt", row.names=FALSE, sep="\t")
"Timetokill" "Weapon1" "Weapon2" "Weapon3" "Weapon4" "Weapon5" "Weapon6"
"16" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"16" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Gauss" "Gauss"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mark IX"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Gauss" "Hephaestus"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Gauss" "Storm Needler"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Gauss" ""
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Gauss"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Hephaestus" "Gauss"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Storm Needler" "Gauss"
"16" "Hurricane" "Hurricane" "Sabot" "Harpoon" "" "Gauss"
"17" "Squall" "Squall" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Squall" "Squall" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Squall" "Squall" "Harpoon" "Harpoon" "Gauss" "Hellbore"
"17" "Squall" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "Squall" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Squall" "Squall" "Harpoon" "Harpoon" "Hellbore" "Gauss"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Hellbore"
"17" "Squall" "Locust" "Harpoon" "Harpoon" "Hellbore" "Mjolnir"
"17" "Squall" "Locust" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"17" "Squall" "Locust" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Hellbore"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Storm Needler"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Hephaestus"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Storm Needler"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mark IX" ""
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Hellbore" "Gauss"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Hephaestus" "Mark IX"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Storm Needler" "Gauss"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "Storm Needler" "Mark IX"
"17" "Squall" "Hurricane" "Harpoon" "Harpoon" "" "Mark IX"
"17" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" "Gauss"
"17" "Squall" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"17" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" "Gauss"
"17" "Squall" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Locust" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Hellbore"
"17" "Locust" "Squall" "Harpoon" "Harpoon" "Hellbore" "Mjolnir"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" "Hellbore"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Locust" "Locust" "Harpoon" "Harpoon" "Hellbore" "Gauss"
"17" "Locust" "Locust" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"17" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"17" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"17" "Locust" "Locust" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"17" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"17" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Locust" "Hurricane" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Gauss" "Hellbore"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Gauss" "Storm Needler"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mark IX" "Hephaestus"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mark IX" "Storm Needler"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mark IX" ""
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Hellbore" "Gauss"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Hephaestus" "Mark IX"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Storm Needler" "Gauss"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "Storm Needler" "Mark IX"
"17" "Hurricane" "Squall" "Harpoon" "Harpoon" "" "Mark IX"
"17" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" "Gauss"
"17" "Hurricane" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"17" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" "Gauss"
"17" "Hurricane" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Hurricane" "Locust" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Hellbore"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Hephaestus"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Storm Needler"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mark IX" ""
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Hellbore" "Gauss"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Hephaestus" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Storm Needler" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "" "Mark IX"
"17" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"17" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"17" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"17" "Hurricane" "Hurricane" "Harpoon" "" "Mjolnir" "Gauss"
"17" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Gauss" "Hellbore"
"17" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"17" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Hellbore" "Gauss"
"17" "Hurricane" "Hurricane" "" "Harpoon" "Mjolnir" "Gauss"
"17" "Hurricane" "" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "Hurricane" "" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "Hurricane" "" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "Hurricane" "" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "Hurricane" "" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "Hurricane" "" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"17" "" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Gauss"
"17" "" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"17" "" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"17" "" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"17" "" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"17" "" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"19" "Squall" "Squall" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"19" "Squall" "Squall" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"19" "Squall" "Squall" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"19" "Squall" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"19" "Squall" "Squall" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"19" "Squall" "Squall" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"19" "Squall" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"19" "Squall" "Squall" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "Squall" "Squall" "Sabot" "Sabot" "Gauss" "Mark IX"
"19" "Squall" "Squall" "Sabot" "Sabot" "Gauss" "Mjolnir"
"19" "Squall" "Squall" "Sabot" "Sabot" "Gauss" "Hellbore"
"19" "Squall" "Squall" "Sabot" "Sabot" "Mark IX" "Gauss"
"19" "Squall" "Squall" "Sabot" "Sabot" "Mark IX" "Mark IX"
"19" "Squall" "Squall" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"19" "Squall" "Squall" "Sabot" "Sabot" "Mark IX" "Hellbore"
"19" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Gauss"
"19" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"19" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"19" "Squall" "Squall" "Sabot" "Sabot" "Hellbore" "Gauss"
"19" "Squall" "Squall" "Sabot" "Sabot" "Hellbore" "Mark IX"
"19" "Squall" "Locust" "Harpoon" "Sabot" "Mark IX" "Gauss"
"19" "Squall" "Locust" "Harpoon" "Sabot" "Mjolnir" "Hellbore"
"19" "Squall" "Locust" "Sabot" "Harpoon" "Mark IX" "Gauss"
"19" "Squall" "Locust" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"19" "Squall" "Locust" "Sabot" "Sabot" "Gauss" "Mjolnir"
"19" "Squall" "Locust" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"19" "Squall" "Locust" "Sabot" "Sabot" "Mjolnir" "Gauss"
"19" "Squall" "Locust" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"19" "Squall" "Locust" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"19" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mark IX"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Gauss"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"19" "Squall" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Hellbore"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mark IX"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Gauss"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"19" "Squall" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Gauss" "Mark IX"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Gauss" "Mjolnir"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Mark IX" "Gauss"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Gauss"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"19" "Squall" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"19" "Locust" "Squall" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"19" "Locust" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"19" "Locust" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"19" "Locust" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"19" "Locust" "Squall" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"19" "Locust" "Locust" "Harpoon" "Sabot" "Gauss" "Gauss"
"19" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Gauss"
"19" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"19" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"19" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"19" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" "Hellbore"
"19" "Locust" "Locust" "Harpoon" "Sabot" "Hellbore" "Mjolnir"
"19" "Locust" "Locust" "Harpoon" "" "Gauss" "Gauss"
"19" "Locust" "Locust" "Sabot" "Harpoon" "Gauss" "Gauss"
"19" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Gauss"
"19" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"19" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"19" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"19" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"19" "Locust" "Locust" "Sabot" "Harpoon" "Hellbore" "Mjolnir"
"19" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Mark IX"
"19" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Mjolnir"
"19" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Gauss"
"19" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"19" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Gauss"
"19" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"19" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Hellbore"
"19" "Locust" "Locust" "Sabot" "Sabot" "Hellbore" "Mjolnir"
"19" "Locust" "Locust" "" "Harpoon" "Gauss" "Gauss"
"19" "Locust" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"19" "Locust" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Gauss" "Gauss"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mark IX"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Gauss"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"19" "Locust" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Gauss" "Gauss"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mark IX"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Gauss"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"19" "Locust" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"19" "Locust" "Hurricane" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "Locust" "Hurricane" "Sabot" "Sabot" "Gauss" "Mark IX"
"19" "Locust" "Hurricane" "Sabot" "Sabot" "Mark IX" "Gauss"
"19" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" "Mark IX"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Mark IX" "Gauss"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"19" "Hurricane" "Squall" "Harpoon" "Sabot" "Mjolnir" "Hellbore"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" "Mark IX"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Mark IX" "Gauss"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"19" "Hurricane" "Squall" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Gauss" "Mark IX"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Gauss" "Mjolnir"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Mark IX" "Gauss"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Mjolnir" "Gauss"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"19" "Hurricane" "Squall" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"19" "Hurricane" "Locust" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"19" "Hurricane" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Gauss" "Gauss"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Gauss" "Mark IX"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Mark IX" "Gauss"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"19" "Hurricane" "Locust" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Gauss" "Gauss"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Gauss" "Mark IX"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Mark IX" "Gauss"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"19" "Hurricane" "Locust" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"19" "Hurricane" "Locust" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "Hurricane" "Locust" "Sabot" "Sabot" "Gauss" "Mark IX"
"19" "Hurricane" "Locust" "Sabot" "Sabot" "Mark IX" "Gauss"
"19" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Storm Needler"
"19" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Storm Needler" "Gauss"
"19" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Gauss" "Gauss"
"19" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mark IX"
"19" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Gauss"
"19" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"19" "Hurricane" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"19" "Hurricane" "Hurricane" "Harpoon" "" "Mark IX" "Mjolnir"
"19" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Hellbore"
"19" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"19" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Hellbore" "Mark IX"
"19" "Hurricane" "Hurricane" "Sabot" "Harpoon" "Hellbore" "Mjolnir"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Gauss" "Mark IX"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Gauss" "Mjolnir"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Gauss" "Hellbore"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Mark IX" "Gauss"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Gauss"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"19" "Hurricane" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"19" "Hurricane" "Hurricane" "" "Harpoon" "Mark IX" "Mjolnir"
"19" "Hurricane" "" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"19" "Hurricane" "" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"19" "Hurricane" "" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"19" "Hurricane" "" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"19" "Hurricane" "" "Sabot" "Sabot" "Gauss" "Gauss"
"19" "" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"19" "" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"19" "" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"19" "" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"19" "" "Hurricane" "Sabot" "Sabot" "Gauss" "Gauss"
"20" "Locust" "Locust" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"20" "Locust" "Locust" "Harpoon" "Harpoon" "Mark IX" "Storm Needler"
"20" "Locust" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Hellbore"
"20" "Locust" "Locust" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"20" "Locust" "Locust" "Harpoon" "Harpoon" "Hellbore" "Mjolnir"
"20" "Locust" "Locust" "Harpoon" "Harpoon" "Storm Needler" "Mark IX"
"20" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" "Hephaestus"
"20" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" "Storm Needler"
"20" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" ""
"20" "Locust" "Locust" "Harpoon" "Sabot" "Hephaestus" "Mjolnir"
"20" "Locust" "Locust" "Harpoon" "Sabot" "Storm Needler" "Mjolnir"
"20" "Locust" "Locust" "Harpoon" "Sabot" "" "Mjolnir"
"20" "Locust" "Locust" "Harpoon" "" "Gauss" "Mjolnir"
"20" "Locust" "Locust" "Harpoon" "" "Mjolnir" "Gauss"
"20" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" "Hephaestus"
"20" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" "Storm Needler"
"20" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" ""
"20" "Locust" "Locust" "Sabot" "Harpoon" "Hephaestus" "Mjolnir"
"20" "Locust" "Locust" "Sabot" "Harpoon" "Storm Needler" "Mjolnir"
"20" "Locust" "Locust" "Sabot" "Harpoon" "" "Mjolnir"
"20" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Hellbore"
"20" "Locust" "Locust" "Sabot" "Sabot" "Hellbore" "Gauss"
"20" "Locust" "Locust" "" "Harpoon" "Gauss" "Mjolnir"
"20" "Locust" "Locust" "" "Harpoon" "Mjolnir" "Gauss"
"20" "Locust" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"20" "Hurricane" "Locust" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"21" "Squall" "Squall" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"21" "Squall" "Squall" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"21" "Squall" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Hellbore"
"21" "Squall" "Squall" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"21" "Squall" "Squall" "Harpoon" "Sabot" "Gauss" "Gauss"
"21" "Squall" "Squall" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"21" "Squall" "Squall" "Harpoon" "Sabot" "Mjolnir" "Hellbore"
"21" "Squall" "Squall" "Sabot" "Harpoon" "Gauss" "Gauss"
"21" "Squall" "Squall" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"21" "Squall" "Squall" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"21" "Squall" "Locust" "Harpoon" "Harpoon" "Gauss" "Hellbore"
"21" "Squall" "Locust" "Harpoon" "Harpoon" "Hellbore" "Gauss"
"21" "Squall" "Locust" "Harpoon" "Sabot" "Gauss" "Gauss"
"21" "Squall" "Locust" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"21" "Squall" "Locust" "Sabot" "Harpoon" "Gauss" "Gauss"
"21" "Squall" "Locust" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"21" "Squall" "Locust" "Sabot" "Sabot" "Gauss" "Gauss"
"21" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Hellbore"
"21" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" "Hephaestus"
"21" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" "Storm Needler"
"21" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" ""
"21" "Squall" "Hurricane" "Harpoon" "Sabot" "Hephaestus" "Gauss"
"21" "Squall" "Hurricane" "Harpoon" "Sabot" "Storm Needler" "Gauss"
"21" "Squall" "Hurricane" "Harpoon" "Sabot" "" "Gauss"
"21" "Squall" "Hurricane" "Harpoon" "" "Gauss" "Gauss"
"21" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" "Hephaestus"
"21" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" "Storm Needler"
"21" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" ""
"21" "Squall" "Hurricane" "Sabot" "Harpoon" "Hephaestus" "Gauss"
"21" "Squall" "Hurricane" "Sabot" "Harpoon" "Storm Needler" "Gauss"
"21" "Squall" "Hurricane" "Sabot" "Harpoon" "" "Gauss"
"21" "Squall" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Hellbore"
"21" "Squall" "Hurricane" "" "Harpoon" "Gauss" "Gauss"
"21" "Squall" "" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"21" "Squall" "" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"21" "Squall" "" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"21" "Locust" "Squall" "Harpoon" "Harpoon" "Gauss" "Gauss"
"21" "Locust" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"21" "Locust" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"21" "Locust" "Squall" "Harpoon" "Sabot" "Gauss" "Gauss"
"21" "Locust" "Squall" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"21" "Locust" "Squall" "Sabot" "Harpoon" "Gauss" "Gauss"
"21" "Locust" "Squall" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"21" "Locust" "Squall" "Sabot" "Sabot" "Gauss" "Mjolnir"
"21" "Locust" "Squall" "Sabot" "Sabot" "Mjolnir" "Gauss"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" "Hephaestus"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" "Storm Needler"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" ""
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Mark IX" "Hephaestus"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Mark IX" ""
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Hephaestus" "Gauss"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Hephaestus" "Mark IX"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "Storm Needler" "Gauss"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "" "Gauss"
"21" "Locust" "Locust" "Harpoon" "Harpoon" "" "Mark IX"
"21" "Locust" "Locust" "Harpoon" "Sabot" "Gauss" "Mark IX"
"21" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Hephaestus"
"21" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Storm Needler"
"21" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" ""
"21" "Locust" "Locust" "Harpoon" "Sabot" "Hephaestus" "Mark IX"
"21" "Locust" "Locust" "Harpoon" "Sabot" "Storm Needler" "Mark IX"
"21" "Locust" "Locust" "Harpoon" "Sabot" "" "Mark IX"
"21" "Locust" "Locust" "Harpoon" "" "Gauss" "Mark IX"
"21" "Locust" "Locust" "Harpoon" "" "Mark IX" "Mjolnir"
"21" "Locust" "Locust" "Harpoon" "" "Mjolnir" "Mark IX"
"21" "Locust" "Locust" "Sabot" "Harpoon" "Gauss" "Mark IX"
"21" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Hephaestus"
"21" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Storm Needler"
"21" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" ""
"21" "Locust" "Locust" "Sabot" "Harpoon" "Hephaestus" "Mark IX"
"21" "Locust" "Locust" "Sabot" "Harpoon" "Storm Needler" "Mark IX"
"21" "Locust" "Locust" "Sabot" "Harpoon" "" "Mark IX"
"21" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Hephaestus"
"21" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Storm Needler"
"21" "Locust" "Locust" "Sabot" "Sabot" "Gauss" ""
"21" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Mark IX"
"21" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Hephaestus"
"21" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Storm Needler"
"21" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" ""
"21" "Locust" "Locust" "Sabot" "Sabot" "Hephaestus" "Gauss"
"21" "Locust" "Locust" "Sabot" "Sabot" "Hephaestus" "Mjolnir"
"21" "Locust" "Locust" "Sabot" "Sabot" "Storm Needler" "Gauss"
"21" "Locust" "Locust" "Sabot" "Sabot" "Storm Needler" "Mjolnir"
"21" "Locust" "Locust" "Sabot" "Sabot" "" "Gauss"
"21" "Locust" "Locust" "Sabot" "Sabot" "" "Mjolnir"
"21" "Locust" "Locust" "Sabot" "" "Gauss" "Gauss"
"21" "Locust" "Locust" "Sabot" "" "Gauss" "Mjolnir"
"21" "Locust" "Locust" "Sabot" "" "Mjolnir" "Gauss"
"21" "Locust" "Locust" "Sabot" "" "Mjolnir" "Mjolnir"
"21" "Locust" "Locust" "" "Harpoon" "Gauss" "Mark IX"
"21" "Locust" "Locust" "" "Harpoon" "Mark IX" "Mjolnir"
"21" "Locust" "Locust" "" "Harpoon" "Mjolnir" "Mark IX"
"21" "Locust" "Locust" "" "Sabot" "Gauss" "Gauss"
"21" "Locust" "Locust" "" "Sabot" "Gauss" "Mjolnir"
"21" "Locust" "Locust" "" "Sabot" "Mjolnir" "Gauss"
"21" "Locust" "Locust" "" "Sabot" "Mjolnir" "Mjolnir"
"21" "Locust" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Hephaestus"
"21" "Locust" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Storm Needler"
"21" "Locust" "Hurricane" "Harpoon" "Harpoon" "Gauss" ""
"21" "Locust" "Hurricane" "Harpoon" "Harpoon" "Hephaestus" "Gauss"
"21" "Locust" "Hurricane" "Harpoon" "Harpoon" "Storm Needler" "Gauss"
"21" "Locust" "Hurricane" "Harpoon" "Harpoon" "" "Gauss"
"21" "Locust" "" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"21" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Hellbore"
"21" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" "Hephaestus"
"21" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" "Storm Needler"
"21" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" ""
"21" "Hurricane" "Squall" "Harpoon" "Sabot" "Hephaestus" "Gauss"
"21" "Hurricane" "Squall" "Harpoon" "Sabot" "Storm Needler" "Gauss"
"21" "Hurricane" "Squall" "Harpoon" "Sabot" "" "Gauss"
"21" "Hurricane" "Squall" "Harpoon" "" "Gauss" "Gauss"
"21" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" "Hephaestus"
"21" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" "Storm Needler"
"21" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" ""
"21" "Hurricane" "Squall" "Sabot" "Harpoon" "Hephaestus" "Gauss"
"21" "Hurricane" "Squall" "Sabot" "Harpoon" "Storm Needler" "Gauss"
"21" "Hurricane" "Squall" "Sabot" "Harpoon" "" "Gauss"
"21" "Hurricane" "Squall" "Sabot" "Sabot" "Mjolnir" "Hellbore"
"21" "Hurricane" "Squall" "" "Harpoon" "Gauss" "Gauss"
"21" "Hurricane" "Locust" "Harpoon" "Harpoon" "Gauss" "Hephaestus"
"21" "Hurricane" "Locust" "Harpoon" "Harpoon" "Gauss" "Storm Needler"
"21" "Hurricane" "Locust" "Harpoon" "Harpoon" "Gauss" ""
"21" "Hurricane" "Locust" "Harpoon" "Harpoon" "Hephaestus" "Gauss"
"21" "Hurricane" "Locust" "Harpoon" "Harpoon" "Storm Needler" "Gauss"
"21" "Hurricane" "Locust" "Harpoon" "Harpoon" "" "Gauss"
"21" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Hephaestus"
"21" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Gauss" ""
"21" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "Hephaestus" "Gauss"
"21" "Hurricane" "Hurricane" "Harpoon" "Harpoon" "" "Gauss"
"21" "Hurricane" "Hurricane" "Sabot" "Sabot" "Hellbore" "Gauss"
"21" "" "Squall" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"21" "" "Squall" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"21" "" "Squall" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"21" "" "Locust" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"22" "Squall" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"22" "Squall" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"22" "Squall" "Squall" "Harpoon" "Sabot" "Gauss" "Mark IX"
"22" "Squall" "Squall" "Harpoon" "Sabot" "Mark IX" "Gauss"
"22" "Squall" "Squall" "Sabot" "Harpoon" "Gauss" "Mark IX"
"22" "Squall" "Squall" "Sabot" "Harpoon" "Mark IX" "Gauss"
"22" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Hellbore"
"22" "Squall" "Locust" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"22" "Squall" "Locust" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"22" "Squall" "Locust" "Harpoon" "Sabot" "Gauss" "Mark IX"
"22" "Squall" "Locust" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"22" "Squall" "Locust" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"22" "Squall" "Locust" "Harpoon" "Sabot" "Mark IX" "Hellbore"
"22" "Squall" "Locust" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"22" "Squall" "Locust" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"22" "Squall" "Locust" "Harpoon" "Sabot" "Hellbore" "Mark IX"
"22" "Squall" "Locust" "Sabot" "Harpoon" "Gauss" "Mark IX"
"22" "Squall" "Locust" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"22" "Squall" "Locust" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"22" "Squall" "Locust" "Sabot" "Harpoon" "Mark IX" "Hellbore"
"22" "Squall" "Locust" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"22" "Squall" "Locust" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"22" "Squall" "Locust" "Sabot" "Harpoon" "Hellbore" "Mark IX"
"22" "Squall" "Locust" "Sabot" "Sabot" "Gauss" "Hellbore"
"22" "Squall" "Locust" "Sabot" "Sabot" "Mark IX" "Hellbore"
"22" "Squall" "Locust" "Sabot" "Sabot" "Mjolnir" "Hellbore"
"22" "Squall" "Locust" "Sabot" "Sabot" "Hellbore" "Gauss"
"22" "Squall" "Locust" "Sabot" "Sabot" "Hellbore" "Mark IX"
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Hephaestus"
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" "Storm Needler"
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mjolnir" ""
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "Hellbore" "Mjolnir"
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "Hephaestus" "Mjolnir"
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "Storm Needler" "Mjolnir"
"22" "Squall" "Hurricane" "Harpoon" "Harpoon" "" "Mjolnir"
"22" "Squall" "Hurricane" "Sabot" "Sabot" "Mark IX" "Mark IX"
"22" "Squall" "" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"22" "Squall" "" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"22" "Locust" "Squall" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"22" "Locust" "Squall" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"22" "Locust" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"22" "Locust" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"22" "Locust" "Squall" "Harpoon" "Sabot" "Mark IX" "Gauss"
"22" "Locust" "Squall" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"22" "Locust" "Squall" "Sabot" "Harpoon" "Mark IX" "Gauss"
"22" "Locust" "Squall" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"22" "Locust" "Squall" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"22" "Locust" "Squall" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"22" "Locust" "Squall" "Sabot" "Sabot" "Mjolnir" "Hellbore"
"22" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Hellbore"
"22" "Locust" "Locust" "Harpoon" "Sabot" "Hellbore" "Mark IX"
"22" "Locust" "Locust" "Harpoon" "" "Mark IX" "Gauss"
"22" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Hellbore"
"22" "Locust" "Locust" "Sabot" "Harpoon" "Hellbore" "Mark IX"
"22" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Hellbore"
"22" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Hephaestus"
"22" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Storm Needler"
"22" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" ""
"22" "Locust" "Locust" "Sabot" "Sabot" "Hellbore" "Mark IX"
"22" "Locust" "Locust" "Sabot" "Sabot" "Hephaestus" "Mark IX"
"22" "Locust" "Locust" "Sabot" "Sabot" "Storm Needler" "Mark IX"
"22" "Locust" "Locust" "Sabot" "Sabot" "" "Mark IX"
"22" "Locust" "Locust" "Sabot" "" "Gauss" "Mark IX"
"22" "Locust" "Locust" "" "Harpoon" "Mark IX" "Gauss"
"22" "Locust" "Locust" "" "Sabot" "Gauss" "Mark IX"
"22" "Locust" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"22" "Locust" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Hellbore"
"22" "Locust" "Hurricane" "Harpoon" "" "Gauss" "Mjolnir"
"22" "Locust" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"22" "Locust" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"22" "Locust" "Hurricane" "" "Harpoon" "Gauss" "Mjolnir"
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Hephaestus"
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Storm Needler"
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mjolnir" ""
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "Hellbore" "Mjolnir"
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "Hephaestus" "Mjolnir"
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "Storm Needler" "Mjolnir"
"22" "Hurricane" "Squall" "Harpoon" "Harpoon" "" "Mjolnir"
"22" "Hurricane" "Squall" "Sabot" "Sabot" "Mark IX" "Mark IX"
"22" "Hurricane" "Locust" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"22" "Hurricane" "Locust" "Harpoon" "Sabot" "Mjolnir" "Hellbore"
"22" "Hurricane" "Locust" "Harpoon" "" "Gauss" "Mjolnir"
"22" "Hurricane" "Locust" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"22" "Hurricane" "Locust" "Sabot" "Harpoon" "Mjolnir" "Hellbore"
"22" "Hurricane" "Locust" "" "Harpoon" "Gauss" "Mjolnir"
"22" "Hurricane" "Hurricane" "Sabot" "Sabot" "Mark IX" "Mark IX"
"22" "Hurricane" "" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"22" "Hurricane" "" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"22" "Hurricane" "" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"22" "Hurricane" "" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"22" "" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"22" "" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"22" "" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"22" "" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"22" "" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"22" "" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"23" "Squall" "Squall" "Harpoon" "Harpoon" "Hellbore" "Hellbore"
"23" "Squall" "Squall" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"23" "Squall" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"23" "Squall" "Squall" "Harpoon" "" "Gauss" "Mjolnir"
"23" "Squall" "Squall" "Harpoon" "" "Mjolnir" "Gauss"
"23" "Squall" "Squall" "Harpoon" "" "Hellbore" "Gauss"
"23" "Squall" "Squall" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"23" "Squall" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"23" "Squall" "Squall" "" "Harpoon" "Gauss" "Mjolnir"
"23" "Squall" "Squall" "" "Harpoon" "Mjolnir" "Gauss"
"23" "Squall" "Squall" "" "Harpoon" "Hellbore" "Gauss"
"23" "Squall" "Hurricane" "Harpoon" "Harpoon" "Gauss" "Hephaestus"
"23" "Squall" "Hurricane" "Harpoon" "Harpoon" "Gauss" ""
"23" "Squall" "Hurricane" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"23" "Squall" "Hurricane" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"23" "Squall" "Hurricane" "Harpoon" "Harpoon" "Hephaestus" "Gauss"
"23" "Squall" "Hurricane" "Harpoon" "Harpoon" "" "Gauss"
"23" "Squall" "Hurricane" "Harpoon" "Sabot" "Mark IX" "Hellbore"
"23" "Squall" "Hurricane" "Harpoon" "Sabot" "Hellbore" "Mark IX"
"23" "Squall" "Hurricane" "Harpoon" "" "Gauss" "Mark IX"
"23" "Squall" "Hurricane" "Harpoon" "" "Mark IX" "Gauss"
"23" "Squall" "Hurricane" "Sabot" "Harpoon" "Mark IX" "Hellbore"
"23" "Squall" "Hurricane" "Sabot" "Harpoon" "Hellbore" "Mark IX"
"23" "Squall" "Hurricane" "" "Harpoon" "Gauss" "Mark IX"
"23" "Squall" "Hurricane" "" "Harpoon" "Mark IX" "Gauss"
"23" "Squall" "" "Harpoon" "Harpoon" "Gauss" "Gauss"
"23" "Squall" "" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"23" "Squall" "" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"23" "Squall" "" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"23" "Squall" "" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"23" "Locust" "Squall" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"23" "Locust" "Squall" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"23" "Locust" "Squall" "Sabot" "Sabot" "Gauss" "Gauss"
"23" "Locust" "Locust" "Harpoon" "Sabot" "Gauss" "Hellbore"
"23" "Locust" "Locust" "Harpoon" "Sabot" "Hellbore" "Gauss"
"23" "Locust" "Locust" "Sabot" "Harpoon" "Gauss" "Hellbore"
"23" "Locust" "Locust" "Sabot" "Harpoon" "Hellbore" "Gauss"
"23" "Locust" "Hurricane" "Sabot" "Sabot" "Gauss" "Mjolnir"
"23" "Locust" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Gauss"
"23" "Locust" "" "Harpoon" "Harpoon" "Gauss" "Gauss"
"23" "Locust" "" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"23" "Locust" "" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"23" "Hurricane" "Squall" "Harpoon" "Harpoon" "Gauss" "Hephaestus"
"23" "Hurricane" "Squall" "Harpoon" "Harpoon" "Gauss" ""
"23" "Hurricane" "Squall" "Harpoon" "Harpoon" "Mark IX" "Hellbore"
"23" "Hurricane" "Squall" "Harpoon" "Harpoon" "Hellbore" "Mark IX"
"23" "Hurricane" "Squall" "Harpoon" "Harpoon" "Hephaestus" "Gauss"
"23" "Hurricane" "Squall" "Harpoon" "Harpoon" "" "Gauss"
"23" "Hurricane" "Squall" "Harpoon" "Sabot" "Mark IX" "Hellbore"
"23" "Hurricane" "Squall" "Harpoon" "Sabot" "Hellbore" "Mark IX"
"23" "Hurricane" "Squall" "Harpoon" "" "Gauss" "Mark IX"
"23" "Hurricane" "Squall" "Harpoon" "" "Mark IX" "Gauss"
"23" "Hurricane" "Squall" "Sabot" "Harpoon" "Mark IX" "Hellbore"
"23" "Hurricane" "Squall" "Sabot" "Harpoon" "Hellbore" "Mark IX"
"23" "Hurricane" "Squall" "" "Harpoon" "Gauss" "Mark IX"
"23" "Hurricane" "Squall" "" "Harpoon" "Mark IX" "Gauss"
"23" "Hurricane" "Locust" "Sabot" "Sabot" "Gauss" "Mjolnir"
"23" "Hurricane" "Locust" "Sabot" "Sabot" "Mjolnir" "Gauss"
"23" "Hurricane" "Hurricane" "Harpoon" "" "Gauss" "Mjolnir"
"23" "Hurricane" "Hurricane" "Sabot" "" "Gauss" "Gauss"
"23" "Hurricane" "Hurricane" "" "Harpoon" "Gauss" "Mjolnir"
"23" "Hurricane" "Hurricane" "" "Sabot" "Gauss" "Gauss"
"23" "Hurricane" "" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"23" "Hurricane" "" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"23" "" "Squall" "Harpoon" "Harpoon" "Gauss" "Gauss"
"23" "" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"23" "" "Squall" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"23" "" "Squall" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"23" "" "Squall" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"23" "" "Locust" "Harpoon" "Harpoon" "Gauss" "Gauss"
"23" "" "Locust" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"23" "" "Locust" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"23" "" "Hurricane" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"23" "" "Hurricane" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"24" "Squall" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"24" "Squall" "Squall" "Harpoon" "Sabot" "Gauss" "Hellbore"
"24" "Squall" "Squall" "Harpoon" "Sabot" "Hellbore" "Gauss"
"24" "Squall" "Squall" "Harpoon" "Sabot" "Hellbore" "Mjolnir"
"24" "Squall" "Squall" "Harpoon" "" "Gauss" "Hellbore"
"24" "Squall" "Squall" "Harpoon" "" "Mjolnir" "Mjolnir"
"24" "Squall" "Squall" "Sabot" "Harpoon" "Gauss" "Hellbore"
"24" "Squall" "Squall" "Sabot" "Harpoon" "Hellbore" "Gauss"
"24" "Squall" "Squall" "Sabot" "Harpoon" "Hellbore" "Mjolnir"
"24" "Squall" "Squall" "Sabot" "Sabot" "Hellbore" "Mjolnir"
"24" "Squall" "Squall" "Sabot" "" "Gauss" "Mjolnir"
"24" "Squall" "Squall" "Sabot" "" "Mjolnir" "Gauss"
"24" "Squall" "Squall" "" "Harpoon" "Gauss" "Hellbore"
"24" "Squall" "Squall" "" "Harpoon" "Mjolnir" "Mjolnir"
"24" "Squall" "Squall" "" "Sabot" "Gauss" "Mjolnir"
"24" "Squall" "Squall" "" "Sabot" "Mjolnir" "Gauss"
"24" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Hephaestus"
"24" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Storm Needler"
"24" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" ""
"24" "Squall" "Locust" "Harpoon" "Harpoon" "Hephaestus" "Mjolnir"
"24" "Squall" "Locust" "Harpoon" "Harpoon" "Storm Needler" "Mjolnir"
"24" "Squall" "Locust" "Harpoon" "Harpoon" "" "Mjolnir"
"24" "Squall" "Locust" "Sabot" "" "Mjolnir" "Mjolnir"
"24" "Squall" "Locust" "" "Sabot" "Mjolnir" "Mjolnir"
"24" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" "Hellbore"
"24" "Squall" "Hurricane" "Harpoon" "Sabot" "Hellbore" "Gauss"
"24" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" "Hellbore"
"24" "Squall" "Hurricane" "Sabot" "Harpoon" "Hellbore" "Gauss"
"24" "Squall" "Hurricane" "Sabot" "Sabot" "Gauss" "Hellbore"
"24" "Squall" "Hurricane" "Sabot" "Sabot" "Hellbore" "Gauss"
"24" "Squall" "Hurricane" "Sabot" "" "Mjolnir" "Mjolnir"
"24" "Squall" "Hurricane" "" "Sabot" "Mjolnir" "Mjolnir"
"24" "Locust" "Squall" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"24" "Locust" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"24" "Locust" "Squall" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"24" "Locust" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"24" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" "Hellbore"
"24" "Hurricane" "Squall" "Harpoon" "Sabot" "Hellbore" "Gauss"
"24" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" "Hellbore"
"24" "Hurricane" "Squall" "Sabot" "Harpoon" "Hellbore" "Gauss"
"24" "Hurricane" "Squall" "Sabot" "Sabot" "Gauss" "Hellbore"
"24" "Hurricane" "Squall" "Sabot" "Sabot" "Hellbore" "Gauss"
"24" "Hurricane" "Squall" "Sabot" "" "Mjolnir" "Mjolnir"
"24" "Hurricane" "Squall" "" "Sabot" "Mjolnir" "Mjolnir"
"Timetokill" "Weapon1" "Weapon2" "Weapon3" "Weapon4" "Weapon5" "Weapon6"
"10" "Squall" "Squall" "Harpoon" "Harpoon" "Gauss" "Gauss"
"10" "Squall" "Squall" "Harpoon" "Harpoon" "Gauss" "Mark IX"
"10" "Squall" "Squall" "Harpoon" "Harpoon" "Mark IX" "Gauss"
"10" "Squall" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mark IX"
"10" "Squall" "Squall" "Harpoon" "Harpoon" "Mark IX" "Mjolnir"
"10" "Squall" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mark IX"
"10" "Squall" "Squall" "Harpoon" "Harpoon" "Mjolnir" "Mjolnir"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Gauss" "Gauss"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Gauss" "Mark IX"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Mark IX" "Gauss"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Mark IX" "Mjolnir"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mark IX"
"10" "Squall" "Squall" "Harpoon" "Sabot" "Mjolnir" "Mjolnir"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Gauss" "Gauss"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Gauss" "Mark IX"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Mark IX" "Gauss"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Mark IX" "Mjolnir"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mark IX"
"10" "Squall" "Squall" "Sabot" "Harpoon" "Mjolnir" "Mjolnir"
"10" "Squall" "Squall" "Sabot" "Sabot" "Gauss" "Gauss"
"10" "Squall" "Squall" "Sabot" "Sabot" "Gauss" "Mark IX"
"10" "Squall" "Squall" "Sabot" "Sabot" "Mark IX" "Gauss"
"10" "Squall" "Squall" "Sabot" "Sabot" "Mark IX" "Mark IX"
"10" "Squall" "Squall" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"10" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Gauss"
"10" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"10" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"10" "Squall" "Squall" "Sabot" "Sabot" "Mjolnir" "Hellbore"
"10" "Squall" "Squall" "Sabot" "Sabot" "Hellbore" "Hephaestus"
"10" "Squall" "Squall" "Sabot" "Sabot" "Hellbore" "Storm Needler"
"10" "Squall" "Squall" "Sabot" "Sabot" "Hellbore" ""
"10" "Squall" "Squall" "Sabot" "Sabot" "Hephaestus" "Hellbore"
"10" "Squall" "Squall" "Sabot" "Sabot" "Storm Needler" "Hellbore"
"10" "Squall" "Squall" "Sabot" "Sabot" "" "Hellbore"
"10" "Squall" "Locust" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"10" "Squall" "Locust" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"10" "Squall" "Locust" "Sabot" "Sabot" "Gauss" "Gauss"
"10" "Squall" "Locust" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"10" "Squall" "Locust" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"10" "Squall" "Locust" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"11" "Squall" "Squall" "Sabot" "Sabot" "Gauss" "Mjolnir"
"11" "Squall" "Squall" "Sabot" "" "Gauss" "Hellbore"
"11" "Squall" "Squall" "" "Sabot" "Gauss" "Hellbore"
"11" "Squall" "Locust" "Sabot" "Sabot" "Gauss" "Mark IX"
"11" "Squall" "Locust" "Sabot" "Sabot" "Gauss" "Mjolnir"
"11" "Squall" "Locust" "Sabot" "Sabot" "Mark IX" "Gauss"
"11" "Squall" "Locust" "Sabot" "Sabot" "Mjolnir" "Gauss"
"11" "Squall" "Hurricane" "Sabot" "Sabot" "Hellbore" "Gauss"
"11" "Hurricane" "Squall" "Sabot" "Sabot" "Hellbore" "Gauss"
"13" "Squall" "Locust" "Harpoon" "Harpoon" "Gauss" "Mjolnir"
"13" "Squall" "Locust" "Harpoon" "Harpoon" "Mjolnir" "Gauss"
"13" "Squall" "Locust" "Sabot" "Sabot" "Mark IX" "Hellbore"
"13" "Squall" "Locust" "Sabot" "Sabot" "Hellbore" "Mark IX"
"13" "Locust" "Squall" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"13" "Locust" "Squall" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"13" "Locust" "Squall" "Sabot" "Sabot" "Gauss" "Gauss"
"13" "Locust" "Squall" "Sabot" "Sabot" "Gauss" "Mjolnir"
"13" "Locust" "Squall" "Sabot" "Sabot" "Mark IX" "Hellbore"
"13" "Locust" "Squall" "Sabot" "Sabot" "Mjolnir" "Gauss"
"13" "Locust" "Squall" "Sabot" "Sabot" "Mjolnir" "Mjolnir"
"13" "Locust" "Squall" "Sabot" "Sabot" "Hellbore" "Mark IX"
"13" "Locust" "Locust" "Harpoon" "Harpoon" "Gauss" "Gauss"
"13" "Locust" "Locust" "Harpoon" "Sabot" "Gauss" "Gauss"
"13" "Locust" "Locust" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"13" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Mark IX"
"13" "Locust" "Locust" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"13" "Locust" "Locust" "Sabot" "Harpoon" "Gauss" "Gauss"
"13" "Locust" "Locust" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"13" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Mark IX"
"13" "Locust" "Locust" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"13" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Gauss"
"13" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Mark IX"
"13" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Mjolnir"
"13" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Gauss"
"13" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Mark IX"
"13" "Locust" "Locust" "Sabot" "Sabot" "Mark IX" "Mjolnir"
"13" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Gauss"
"13" "Locust" "Locust" "Sabot" "Sabot" "Mjolnir" "Mark IX"
"13" "Locust" "Locust" "Sabot" "" "Gauss" "Gauss"
"13" "Locust" "Locust" "" "Sabot" "Gauss" "Gauss"
"15" "Squall" "Locust" "Harpoon" "Harpoon" "Gauss" "Gauss"
"15" "Squall" "Locust" "Harpoon" "Sabot" "Gauss" "Gauss"
"15" "Squall" "Locust" "Harpoon" "Sabot" "Mjolnir" "Gauss"
"15" "Squall" "Locust" "Sabot" "Harpoon" "Gauss" "Gauss"
"15" "Squall" "Locust" "Sabot" "Harpoon" "Mjolnir" "Gauss"
"15" "Squall" "Hurricane" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"15" "Squall" "Hurricane" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"15" "Squall" "Hurricane" "Sabot" "Sabot" "Gauss" "Gauss"
"15" "Squall" "Hurricane" "Sabot" "Sabot" "Gauss" "Mjolnir"
"15" "Squall" "Hurricane" "Sabot" "Sabot" "Mjolnir" "Gauss"
"15" "Locust" "Squall" "Harpoon" "Harpoon" "Gauss" "Gauss"
"15" "Locust" "Locust" "Harpoon" "Sabot" "Gauss" "Mark IX"
"15" "Locust" "Locust" "Harpoon" "Sabot" "Mark IX" "Gauss"
"15" "Locust" "Locust" "Sabot" "Harpoon" "Gauss" "Mark IX"
"15" "Locust" "Locust" "Sabot" "Harpoon" "Mark IX" "Gauss"
"15" "Locust" "Locust" "Sabot" "Sabot" "Gauss" "Hellbore"
"15" "Locust" "Locust" "Sabot" "Sabot" "Hellbore" "Gauss"
"15" "Hurricane" "Squall" "Harpoon" "Sabot" "Gauss" "Mjolnir"
"15" "Hurricane" "Squall" "Sabot" "Harpoon" "Gauss" "Mjolnir"
"15" "Hurricane" "Squall" "Sabot" "Sabot" "Gauss" "Gauss"
"15" "Hurricane" "Squall" "Sabot" "Sabot" "Gauss" "Mjolnir"
"15" "Hurricane" "Squall" "Sabot" "Sabot" "Mjolnir" "Gauss"
I am surprised how many people use Hellbores, I always thought of them as large mount equivalent of the Heavy Mortar - something you get only because you lack flux/OP to get something better.
"Timetokill" "Weapon1" "Weapon2" "Weapon3" "Weapon4" "Weapon5" "Weapon6"
"29" "Squall" "Squall" "" "" "Gauss" "Gauss"
"29" "Squall" "Locust" "" "" "Gauss" "Gauss"
"29" "Locust" "Locust" "" "" "Mjolnir" "Gauss"
"30" "Squall" "Squall" "" "" "Gauss" "Mjolnir"
"30" "Squall" "Squall" "" "" "Mjolnir" "Gauss"
"30" "Squall" "Squall" "" "" "Mjolnir" "Mjolnir"
"30" "Locust" "Locust" "" "" "Gauss" "Gauss"
"30" "Locust" "Locust" "" "" "Gauss" "Mjolnir"
"30" "Locust" "Locust" "" "" "Mjolnir" "Mjolnir"
"31" "Squall" "Squall" "" "" "Gauss" "Mark IX"
"31" "Squall" "Squall" "" "" "Mark IX" "Gauss"
"31" "Squall" "Squall" "" "" "Mark IX" "Hellbore"
"31" "Squall" "Squall" "" "" "Hellbore" "Mark IX"
"31" "Squall" "Locust" "" "" "Gauss" "Mjolnir"
"31" "Squall" "Locust" "" "" "Mjolnir" "Gauss"
"31" "Squall" "Hurricane" "" "" "Gauss" "Gauss"
"31" "Squall" "Hurricane" "" "" "Gauss" "Mark IX"
"31" "Squall" "Hurricane" "" "" "Gauss" "Hellbore"
"31" "Squall" "Hurricane" "" "" "Mark IX" "Gauss"
"31" "Squall" "Hurricane" "" "" "Mjolnir" "Mjolnir"
"31" "Squall" "Hurricane" "" "" "Hellbore" "Gauss"
"31" "Locust" "Locust" "" "" "Hellbore" "Gauss"
"31" "Hurricane" "Squall" "" "" "Gauss" "Gauss"
"31" "Hurricane" "Squall" "" "" "Gauss" "Mark IX"
"31" "Hurricane" "Squall" "" "" "Gauss" "Hellbore"
"31" "Hurricane" "Squall" "" "" "Mark IX" "Gauss"
"31" "Hurricane" "Squall" "" "" "Mjolnir" "Mjolnir"
"31" "Hurricane" "Squall" "" "" "Hellbore" "Gauss"
"31" "Hurricane" "Hurricane" "" "" "Gauss" "Gauss"
"31" "Hurricane" "Hurricane" "" "" "Gauss" "Mark IX"
"31" "Hurricane" "Hurricane" "" "" "Gauss" "Mjolnir"
"31" "Hurricane" "Hurricane" "" "" "Gauss" "Hellbore"
"31" "Hurricane" "Hurricane" "" "" "Gauss" "Hephaestus"
"31" "Hurricane" "Hurricane" "" "" "Gauss" "Storm Needler"
"31" "Hurricane" "Hurricane" "" "" "Gauss" ""
"31" "Hurricane" "Hurricane" "" "" "Mark IX" "Gauss"
"31" "Hurricane" "Hurricane" "" "" "Mark IX" "Mark IX"
"31" "Hurricane" "Hurricane" "" "" "Mark IX" "Mjolnir"
"31" "Hurricane" "Hurricane" "" "" "Mjolnir" "Gauss"
"31" "Hurricane" "Hurricane" "" "" "Mjolnir" "Mark IX"
"31" "Hurricane" "Hurricane" "" "" "Hellbore" "Gauss"
"31" "Hurricane" "Hurricane" "" "" "Hephaestus" "Gauss"
"31" "Hurricane" "Hurricane" "" "" "Storm Needler" "Gauss"
"31" "Hurricane" "Hurricane" "" "" "" "Gauss"
"33" "Locust" "Locust" "" "" "Gauss" "Mark IX"
"33" "Locust" "Locust" "" "" "Mark IX" "Gauss"
"34" "Squall" "Locust" "" "" "Mark IX" "Mjolnir"
"34" "Squall" "Locust" "" "" "Mjolnir" "Mark IX"
"34" "Squall" "Hurricane" "" "" "Mark IX" "Mark IX"
"34" "Squall" "Hurricane" "" "" "Mark IX" "Mjolnir"
"34" "Squall" "Hurricane" "" "" "Mjolnir" "Mark IX"
"34" "Locust" "Locust" "" "" "Mark IX" "Mjolnir"
"34" "Locust" "Locust" "" "" "Mjolnir" "Mark IX"
"34" "Hurricane" "Squall" "" "" "Mark IX" "Mark IX"
"34" "Hurricane" "Squall" "" "" "Mark IX" "Mjolnir"
"34" "Hurricane" "Squall" "" "" "Mjolnir" "Mark IX"
"35" "Squall" "Locust" "" "" "Mjolnir" "Mjolnir"
"35" "Squall" "Hurricane" "" "" "Gauss" "Mjolnir"
"35" "Squall" "Hurricane" "" "" "Mjolnir" "Gauss"
"35" "Locust" "Squall" "" "" "Gauss" "Gauss"
"35" "Locust" "Hurricane" "" "" "Gauss" "Gauss"
"35" "Hurricane" "Squall" "" "" "Gauss" "Mjolnir"
"35" "Hurricane" "Squall" "" "" "Mjolnir" "Gauss"
"35" "Hurricane" "Locust" "" "" "Gauss" "Gauss"
"37" "Squall" "Squall" "" "" "Mark IX" "Mark IX"
"37" "Squall" "Squall" "" "" "Mark IX" "Mjolnir"
"37" "Squall" "Locust" "" "" "Gauss" "Mark IX"
"37" "Squall" "Locust" "" "" "Mark IX" "Gauss"
"37" "Locust" "Squall" "" "" "Gauss" "Mjolnir"
"37" "Locust" "Hurricane" "" "" "Gauss" "Mark IX"
"37" "Locust" "Hurricane" "" "" "Mark IX" "Gauss"
"37" "Hurricane" "Locust" "" "" "Gauss" "Mark IX"
"37" "Hurricane" "Locust" "" "" "Mark IX" "Gauss"
"38" "Locust" "Squall" "" "" "Mjolnir" "Mjolnir"
"38" "Locust" "Locust" "" "" "Gauss" "Hellbore"
"38" "Hurricane" "Hurricane" "" "" "Mjolnir" "Mjolnir"
"39" "Hurricane" "" "" "" "Gauss" "Gauss"
"39" "" "Hurricane" "" "" "Gauss" "Gauss"
"40" "Squall" "Squall" "" "" "Mjolnir" "Mark IX"
"40" "Locust" "Squall" "" "" "Mjolnir" "Gauss"
"40" "Locust" "Locust" "" "" "Mark IX" "Mark IX"
"40" "Locust" "Locust" "" "" "Mark IX" "Hellbore"
"40" "Locust" "Locust" "" "" "Mjolnir" "Hellbore"
"40" "Locust" "Locust" "" "" "Hellbore" "Mjolnir"
"40" "Locust" "Hurricane" "" "" "Gauss" "Mjolnir"
"40" "Locust" "Hurricane" "" "" "Mark IX" "Mark IX"
"40" "Locust" "Hurricane" "" "" "Mjolnir" "Mjolnir"
"40" "Hurricane" "Locust" "" "" "Gauss" "Mjolnir"
"40" "Hurricane" "Locust" "" "" "Mark IX" "Mark IX"
"40" "Hurricane" "Locust" "" "" "Mjolnir" "Mjolnir"
"41" "Squall" "Squall" "" "" "Mjolnir" "Hellbore"
"41" "Squall" "Squall" "" "" "Hellbore" "Mjolnir"
"41" "Squall" "Locust" "" "" "Gauss" "Hellbore"
"41" "Squall" "Locust" "" "" "Hellbore" "Gauss"
"41" "Locust" "Squall" "" "" "Gauss" "Mark IX"
"41" "Locust" "Squall" "" "" "Mark IX" "Gauss"
"41" "Locust" "Hurricane" "" "" "Mjolnir" "Gauss"
"41" "Hurricane" "Locust" "" "" "Mjolnir" "Gauss"
"42" "Squall" "Squall" "" "" "Hellbore" "Gauss"
"42" "Squall" "Locust" "" "" "Mark IX" "Mark IX"
"43" "Squall" "Squall" "" "" "Gauss" "Hellbore"
"43" "Squall" "" "" "" "Gauss" "Gauss"
"43" "Locust" "Squall" "" "" "Mark IX" "Mark IX"
"43" "Locust" "Squall" "" "" "Mark IX" "Mjolnir"
"43" "Locust" "Squall" "" "" "Mjolnir" "Mark IX"
"43" "" "Squall" "" "" "Gauss" "Gauss"
"44" "Squall" "Locust" "" "" "Mjolnir" "Hellbore"
"44" "Squall" "Locust" "" "" "Hellbore" "Mark IX"
"45" "Squall" "Locust" "" "" "Hellbore" "Mjolnir"
"45" "Locust" "Squall" "" "" "Hellbore" "Gauss"
"45" "Hurricane" "" "" "" "Gauss" "Mark IX"
"45" "Hurricane" "" "" "" "Mark IX" "Gauss"
"45" "" "Hurricane" "" "" "Gauss" "Mark IX"
"45" "" "Hurricane" "" "" "Mark IX" "Gauss"
"46" "Squall" "Locust" "" "" "Mark IX" "Hellbore"
"46" "Squall" "Hurricane" "" "" "Gauss" "Hephaestus"
"46" "Squall" "Hurricane" "" "" "Gauss" "Storm Needler"
"46" "Squall" "Hurricane" "" "" "Gauss" ""
"46" "Squall" "Hurricane" "" "" "Mark IX" "Hellbore"
"46" "Squall" "Hurricane" "" "" "Mjolnir" "Hellbore"
"46" "Squall" "Hurricane" "" "" "Mjolnir" "Hephaestus"
"46" "Squall" "Hurricane" "" "" "Mjolnir" "Storm Needler"
"46" "Squall" "Hurricane" "" "" "Mjolnir" ""
"46" "Squall" "Hurricane" "" "" "Hellbore" "Mark IX"
"46" "Squall" "Hurricane" "" "" "Hellbore" "Mjolnir"
"46" "Squall" "Hurricane" "" "" "Hephaestus" "Gauss"
"46" "Squall" "Hurricane" "" "" "Hephaestus" "Mjolnir"
"46" "Squall" "Hurricane" "" "" "Storm Needler" "Gauss"
"46" "Squall" "Hurricane" "" "" "Storm Needler" "Mjolnir"
"46" "Squall" "Hurricane" "" "" "" "Gauss"
"46" "Squall" "Hurricane" "" "" "" "Mjolnir"
"46" "Squall" "" "" "" "Gauss" "Mark IX"
"46" "Squall" "" "" "" "Mark IX" "Gauss"
"46" "Squall" "" "" "" "Mjolnir" "Mjolnir"
"46" "Locust" "Squall" "" "" "Gauss" "Hellbore"
"46" "Locust" "Locust" "" "" "Hellbore" "Mark IX"
"46" "Locust" "Hurricane" "" "" "Gauss" "Hellbore"
"46" "Locust" "Hurricane" "" "" "Gauss" "Storm Needler"
"46" "Locust" "Hurricane" "" "" "Mark IX" "Mjolnir"
"46" "Locust" "Hurricane" "" "" "Mark IX" "Hellbore"
"46" "Locust" "Hurricane" "" "" "Mjolnir" "Mark IX"
"46" "Locust" "Hurricane" "" "" "Hellbore" "Gauss"
"46" "Locust" "Hurricane" "" "" "Storm Needler" "Gauss"
"46" "Hurricane" "Squall" "" "" "Gauss" "Hephaestus"
"46" "Hurricane" "Squall" "" "" "Gauss" "Storm Needler"
"46" "Hurricane" "Squall" "" "" "Gauss" ""
"46" "Hurricane" "Squall" "" "" "Mark IX" "Hellbore"
"46" "Hurricane" "Squall" "" "" "Mjolnir" "Hellbore"
"46" "Hurricane" "Squall" "" "" "Mjolnir" "Hephaestus"
"46" "Hurricane" "Squall" "" "" "Mjolnir" "Storm Needler"
"46" "Hurricane" "Squall" "" "" "Mjolnir" ""
"46" "Hurricane" "Squall" "" "" "Hellbore" "Mark IX"
"46" "Hurricane" "Squall" "" "" "Hellbore" "Mjolnir"
"46" "Hurricane" "Squall" "" "" "Hephaestus" "Gauss"
"46" "Hurricane" "Squall" "" "" "Hephaestus" "Mjolnir"
"46" "Hurricane" "Squall" "" "" "Storm Needler" "Gauss"
"46" "Hurricane" "Squall" "" "" "Storm Needler" "Mjolnir"
"46" "Hurricane" "Squall" "" "" "" "Gauss"
"46" "Hurricane" "Squall" "" "" "" "Mjolnir"
"46" "Hurricane" "Locust" "" "" "Gauss" "Hellbore"
"46" "Hurricane" "Locust" "" "" "Gauss" "Storm Needler"
"46" "Hurricane" "Locust" "" "" "Mark IX" "Mjolnir"
"46" "Hurricane" "Locust" "" "" "Mark IX" "Hellbore"
"46" "Hurricane" "Locust" "" "" "Mjolnir" "Mark IX"
"46" "Hurricane" "Locust" "" "" "Hellbore" "Gauss"
"46" "Hurricane" "Locust" "" "" "Storm Needler" "Gauss"
"46" "Hurricane" "Hurricane" "" "" "Mark IX" "Hellbore"
"46" "Hurricane" "Hurricane" "" "" "Hellbore" "Mark IX"
"46" "Hurricane" "" "" "" "Gauss" "Mjolnir"
"46" "Hurricane" "" "" "" "Mark IX" "Mjolnir"
"46" "Hurricane" "" "" "" "Mjolnir" "Gauss"
"46" "" "Squall" "" "" "Gauss" "Mark IX"
"46" "" "Squall" "" "" "Mark IX" "Gauss"
"46" "" "Squall" "" "" "Mjolnir" "Mjolnir"
"46" "" "Hurricane" "" "" "Gauss" "Mjolnir"
"46" "" "Hurricane" "" "" "Mark IX" "Mjolnir"
"46" "" "Hurricane" "" "" "Mjolnir" "Gauss"
"47" "Squall" "Squall" "" "" "Gauss" "Hephaestus"
"47" "Squall" "Squall" "" "" "Gauss" "Storm Needler"
"47" "Squall" "Squall" "" "" "Gauss" ""
"47" "Squall" "Squall" "" "" "Hephaestus" "Gauss"
"47" "Squall" "Squall" "" "" "Storm Needler" "Gauss"
"47" "Squall" "Squall" "" "" "" "Gauss"
"47" "Squall" "" "" "" "Gauss" "Mjolnir"
"47" "Locust" "Squall" "" "" "Mjolnir" "Hellbore"
"47" "Locust" "Squall" "" "" "Hellbore" "Mjolnir"
"47" "Locust" "Hurricane" "" "" "Gauss" "Hephaestus"
"47" "Locust" "Hurricane" "" "" "Gauss" ""
"47" "Locust" "Hurricane" "" "" "Hephaestus" "Gauss"
"47" "Locust" "Hurricane" "" "" "" "Gauss"
"47" "Hurricane" "Locust" "" "" "Gauss" "Hephaestus"
"47" "Hurricane" "Locust" "" "" "Gauss" ""
"47" "Hurricane" "Locust" "" "" "Hephaestus" "Gauss"
"47" "Hurricane" "Locust" "" "" "" "Gauss"
"47" "" "Squall" "" "" "Gauss" "Mjolnir"
"48" "Locust" "Squall" "" "" "Hellbore" "Mark IX"
"49" "Squall" "" "" "" "Gauss" "Hellbore"
"49" "Squall" "" "" "" "Mjolnir" "Gauss"
"49" "Squall" "" "" "" "Hellbore" "Gauss"
"49" "Locust" "Squall" "" "" "Mark IX" "Hellbore"
"49" "Locust" "Locust" "" "" "Gauss" "Hephaestus"
"49" "Locust" "Locust" "" "" "Gauss" ""
"49" "Locust" "Locust" "" "" "Hephaestus" "Gauss"
"49" "Locust" "Locust" "" "" "" "Gauss"
"49" "Locust" "Hurricane" "" "" "Hellbore" "Mark IX"
"49" "Hurricane" "Locust" "" "" "Hellbore" "Mark IX"
"49" "" "Squall" "" "" "Gauss" "Hellbore"
"49" "" "Squall" "" "" "Mjolnir" "Gauss"
"49" "" "Squall" "" "" "Hellbore" "Gauss"
"50" "Squall" "Squall" "" "" "Mjolnir" "Storm Needler"
"50" "Squall" "Squall" "" "" "Storm Needler" "Mjolnir"
"50" "Squall" "Locust" "" "" "Gauss" "Hephaestus"
"50" "Squall" "Locust" "" "" "Gauss" "Storm Needler"
"50" "Squall" "Locust" "" "" "Gauss" ""
"50" "Squall" "Locust" "" "" "Hephaestus" "Gauss"
"50" "Squall" "Locust" "" "" "Storm Needler" "Gauss"
"50" "Squall" "Locust" "" "" "" "Gauss"
"52" "Squall" "" "" "" "Mark IX" "Mark IX"
"52" "Squall" "" "" "" "Mark IX" "Mjolnir"
"52" "" "Squall" "" "" "Mark IX" "Mark IX"
"52" "" "Squall" "" "" "Mark IX" "Mjolnir"
"53" "Locust" "" "" "" "Gauss" "Gauss"
"53" "" "Locust" "" "" "Gauss" "Gauss"
"55" "Locust" "Locust" "" "" "Gauss" "Storm Needler"
"55" "Locust" "Locust" "" "" "Storm Needler" "Gauss"
"57" "Locust" "Locust" "" "" "Mark IX" "Hephaestus"
"57" "Locust" "Locust" "" "" "Mark IX" "Storm Needler"
"57" "Locust" "Locust" "" "" "Mark IX" ""
"57" "Locust" "Locust" "" "" "Hephaestus" "Mark IX"
"57" "Locust" "Locust" "" "" "Storm Needler" "Mark IX"
"57" "Locust" "Locust" "" "" "" "Mark IX"
Oh yeah, re left vs right: I like putting the guns on the left so its the same as on an Odyssey in terms of flying.
I'm still going to go with the Squall for the range and combination with Hellbores, but now I'm really curious about which is objectively the superior choice. Anybody have any ideas how this could be tested empirically, like simulations of fleet combat?
After one Squall salvo the Dominator will have 1125 armor remaining. Used in pairs, after two Squall salvos the Dominator will have 750 armor remaining. It will take a total of 4 salvos (65 missiles) to penetrate Dominator armor.
a <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.021,0.136,0.341,0.341,0.136,0.021)
for (i in 1:6) {
a[,i:(i+4)] <- a[,i:(i+4)]+b*normaldistpoints
}
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0e+00 0.000700000 0.005233333 0.01660000 0.02726667 0.02726667 0.01660000 0.005233333 0.000700000 0e+00
[2,] 7e-04 0.005933333 0.021833333 0.04456667 0.05976667 0.05976667 0.04456667 0.021833333 0.005933333 7e-04
[3,] 7e-04 0.005933333 0.021833333 0.04456667 0.05976667 0.05976667 0.04456667 0.021833333 0.005933333 7e-04
[4,] 7e-04 0.005933333 0.021833333 0.04456667 0.05976667 0.05976667 0.04456667 0.021833333 0.005933333 7e-04
[5,] 0e+00 0.000700000 0.005233333 0.01660000 0.02726667 0.02726667 0.01660000 0.005233333 0.000700000 0e+00
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 100 100 100 100 100 100 100 100 0
[2,] 100 100 100 100 100 100 100 100 100 100
[3,] 100 100 100 100 100 100 100 100 100 100
[4,] 100 100 100 100 100 100 100 100 100 100
[5,] 0 100 100 100 100 100 100 100 100 0
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] NaN 99.98900 99.42364 94.98402 87.98157 87.98157 94.98402 99.42364 99.98900 NaN
[2,] 99.989 99.26621 91.82878 72.79798 56.82838 56.82838 72.79798 91.82878 99.26621 99.989
[3,] 99.989 99.26621 91.82878 72.79798 56.82838 56.82838 72.79798 91.82878 99.26621 99.989
[4,] 99.989 99.26621 91.82878 72.79798 56.82838 56.82838 72.79798 91.82878 99.26621 99.989
[5,] NaN 99.98900 99.42364 94.98402 87.98157 87.98157 94.98402 99.42364 99.98900 NaN
library(ggplot2)
library(ggthemes)
armordamagematrix <- matrix(0,nrow=5,ncol=10)
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
normaldistpoints <- c(0.022,0.136,0.341,0.341,0.136,0.022)
for (i in 1:6) {
armordamagematrix[,i:(i+4)] <- armordamagematrix[,i:(i+4)]+b*normaldistpoints
}
armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,useminarmor,startingarmor) {
if(useminarmor == 0){
if(armor == 0) {return (damage)}
return(damage*(max(0.15,damage/(damage+armor))))
}
else{
return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
}
}
#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds
mjolnirtics <- c(1.33,1.33,1.33)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)
#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name
squall <- list(250, 2, squalltics, "Squall")
locust <- list(200, 0.25, locusttics, "Locust")
hurricane <- list(500, 0.5, hurricanetics, "Hurricane")
harpoon <- list(750, 0.5, harpoontics, "Harpoon")
sabot <- list(200, 2, sabottics, "Sabot")
gauss <- list(700, 2, gausstics, "Gauss")
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus")
markix <- list(200, 2, markixtics, "Mark IX")
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir")
hellbore <- list(750, 0.5, hellboretics, "Hellbore")
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler")
dummy <- list(0,0,c(0),"")
weapon1 <- locust
weapon2 <- locust
weapon3 <- dummy
weapon4 <- dummy
weapon5 <- dummy
weapon6 <- dummy
shieldblock <- 0
damageattimepoint <- function(weapon, timepoint) c(unlist(weapon[1])*unlist(weapon[3])[timepoint %% length(unlist(weapon[3]))], unlist(weapon[2]))
timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
#are we using shield to block?
shieldblock <- 0
if(hullhp > 0){} else {shieldhp <- 0}
useminarmor <- 0
#are we using the 5% minimum armor rule? deduce this by applying a weighted average of armor
if(weighted.mean(armormatrix,armordamagematrix) <= startingarmor/15*0.05){useminarmor <- 1}
#1. shields. if shieldhp is sufficient, use shield to block
if (weapon1[[4]] !=""){
weapon1mult <- unlist(weapon1[2])
if (shieldhp > damageattimepoint(weapon1, timepoint)[1]*weapon1mult){
shieldhp <- shieldhp - damageattimepoint(weapon1, timepoint)[1]*weapon1mult
shieldhp <- max(shieldhp, 0)
if(damageattimepoint(weapon1,timepoint)[1] > 0) {shieldblock <- 1}
} else {
#if you did not use shield to block, regenerate flux
#2. armor and hull
if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
#2.1. damage armor and hull
hulldamage <- 0
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon1mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon1mult*damageattimepoint(weapon1, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
hullhp <- hullhp - hulldamage
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
#repeat for other weapons
if (weapon2[[4]] != ""){
weapon2mult <- unlist(weapon2[2])
if (shieldhp > damageattimepoint(weapon2, timepoint)[1]*weapon2mult){
shieldhp <- shieldhp - damageattimepoint(weapon2, timepoint)[1]*weapon2mult
shieldhp <- max(shieldhp, 0)
if(damageattimepoint(weapon2,timepoint)[1] > 0) {shieldblock <- 1}
} else {
if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
#2.1. damage armor and hull
hulldamage <- 0
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon2mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon2mult*damageattimepoint(weapon2, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
hullhp <- hullhp - hulldamage
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
if (weapon3[[4]] != ""){
weapon3mult <- unlist(weapon3[2])
if (shieldhp > damageattimepoint(weapon3, timepoint)[1]*weapon3mult){
shieldhp <- shieldhp - damageattimepoint(weapon3, timepoint)[1]*weapon3mult
shieldhp <- max(shieldhp, 0)
if(damageattimepoint(weapon3,timepoint)[1] > 0) {shieldblock <- 1}
} else {
if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
#2.1. damage armor and hull
hulldamage <- 0
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon3mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon3mult*damageattimepoint(weapon3, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
hullhp <- hullhp - hulldamage
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
if (weapon4[[4]] != ""){
weapon4mult <- unlist(weapon4[2])
if (shieldhp > damageattimepoint(weapon4, timepoint)[1]*weapon4mult){
shieldhp <- shieldhp - damageattimepoint(weapon4, timepoint)[1]*weapon4mult
shieldhp <- max(shieldhp, 0)
if(damageattimepoint(weapon4,timepoint)[1] > 0) {shieldblock <- 1}
} else {
if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
#2.1. damage armor and hull
hulldamage <- 0
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon4mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon4mult*damageattimepoint(weapon4, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
hullhp <- hullhp - hulldamage
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
if (weapon5[[4]] != ""){
weapon5mult <- unlist(weapon5[2])
if (shieldhp > damageattimepoint(weapon5, timepoint)[1]*weapon5mult){
shieldhp <- shieldhp - damageattimepoint(weapon5, timepoint)[1]*weapon5mult
shieldhp <- max(shieldhp, 0)
if(damageattimepoint(weapon5,timepoint)[1] > 0) {shieldblock <- 1}
} else {
if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
#2.1. damage armor and hull
hulldamage <- 0
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon5mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon5mult*damageattimepoint(weapon5, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
hullhp <- hullhp - hulldamage
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
if (weapon6[[4]] != ""){
weapon6mult <- unlist(weapon6[2])
if (shieldhp > damageattimepoint(weapon6, timepoint)[1]*weapon6mult){
shieldhp <- shieldhp - damageattimepoint(weapon6, timepoint)[1]*weapon6mult
shieldhp <- max(shieldhp, 0)
if(damageattimepoint(weapon6,timepoint)[1] > 0) {shieldblock <- 1}
} else {
if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
#2.1. damage armor and hull
hulldamage <- 0
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor)-armormatrix[i,j])/weapon6mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-armordamageselectivereduction(armordamagematrix[i,j]*weapon6mult*damageattimepoint(weapon6, timepoint)[1],armormatrix[i,j],useminarmor,startingarmor))
}}
hullhp <- hullhp - hulldamage
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}
totaltime = 200
#dominator, hullhp, shieldregen, shieldmax, startingarmor
ship <- c(14000, 500, 10000, 1500)
armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0
timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))
for (t in 1:totaltime){
state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
shieldhp <- state[[2]]
armorhp <- state[[3]]
hullhp <- state[[4]]
flux <- shieldmax - shieldhp
armormatrix <- state[[8]]
if(hullhp == 0){flux <- 0}
timeseriesarray <- rbind(timeseriesarray , c(state[[1]], flux/shieldmax*100, state[[3]]/startingarmor*100, state[[4]]/ship[1]*100))
}
colnames(timeseriesarray) <- c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))
ggplot(timeseriesarray, aes(x=Time)) + theme_tufte() +
geom_line(aes(y = Flux, color = "Flux")) +
geom_line(aes(y = Armor, color="Armor")) +
geom_line(aes(y = Hull, color="Hull")) +
scale_colour_manual("",
breaks = c("Flux", "Armor", "Hull"),
values = c("lightsteelblue", "red", "maroon")) +
ylab("% max") +
xlab("Time (s)") +
labs(title=weaponstitle)
[Name] [Total score]
[1,] "Squall" "14083.913945038"
[2,] "Locust" "17314.4987742282"
[3,] "Hurricane" "17749.5872807338"
[4,] "Sabot" "24892.0870271849"
[5,] "Harpoon" "24255.9129728151"
[6,] "Gauss" "7899.61820082352"
[7,] "Mark IX" "7911.18763682106"
[8,] "Hellbore" "8103.78176570459"
[9,] "Hephaestus" "8454.36403774929"
[10,] "Mjolnir" "8288.8835490106"
[11,] "Storm Needler" "8490.16480989094"
#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
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.
[Edit] Also the most shocking of the results here for me is the Storm Needler rating poorly despite range not being considered! Speculations?
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.
Vanshilar was specifically interested in killing Ordos, so here are the results from the simulation.
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.
3. Generally speaking, despite specific weapons not having an overall advantage vs. all ships, kinetics overperform vs harder targets.
I generally try to split loadouts on my ship equally between KI and HE but overall I tend towards HE.
Furthermore HE damage on shields is simply halved while KI damage on hull is halved and then a subject to further reduction from armor.
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.
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 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.
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?
> 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%
> 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%
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.
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.
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.
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)
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)
}
}
#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
> 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%
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%
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)
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")
}
#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
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.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.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.
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.
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
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%"
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")
}
#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
#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
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.
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.
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?
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.
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.
Okay. But here we don't have individual shots but rather normal distribution shaped waves hitting the ship, so a pooled value for a singular hit armor matrix doesn't exist. So what then is the fraction of the pooled total value that the cell sees to calculate 5%?
E: Okay I've tried layouts suggested by the model. And it has definitely improved my Conquest builds, but this needs an accuracy parameter. The stupid HACs that the model thinks are so good can't hit the broad side of a space station on a bad day (probably part of the balance on part of Alex) and yet the model gives them the same accuracy as all other weapons which has to be a problem. They are not actually as good at killing frigates as the model would predict for example.
Also, I'm not so sure about trying to model movement-based inaccuracy. Given actual relative movement with no spread, the shot location is not random, so it really should be a bias in the mean of the distribution rather than a variance. But if you try to model some distribution of possible relative movements, you could maybe come up with some distribution of shot locations from that. Although that would still depend on how the automatic aim leading and the AI works as well. All in all, I think it would be pretty tough to model accurately.
Too much effort for too little improvement in modeling accuracy. Also, if the mean is shifting, then it's just equivalent to the ship rotating, so the shots are more or less still seeing the same number of armor cells, just that where they're located physically on the ship is different. So I don't think moving the mean is worth doing here. Easier to just capture all that in the variance.
But if the shot angle has a uniform distribution, then isn't the mean shot angle over several shots a Bates distribution, and so approximately a normal distribution?I thiiiink that would be the distribution of the mean value of all the shots, rather than the distribution of the shots themselves. So one sample from a bates distribution would correspond to the mean of n shots sampled from a uniform distribution. But don't quote me on that. I am very sure that sampling repeatedly from a uniform distribution will yield different results than repeatedly sampling from a normal distribution.
It doesn't seem that hard to model this though as you can essentially just pool the armor back up between shots, thinking about it. Or even better,just build a function that selects the appropriate width distribution and uses it for the cell by cell operation. Still need to prove cell by cell = pooled.For the expected damage of one shot, there is no issue with doing things cell by cell.
This thread has derailed quite a bit, maybe split off a thread for stats analysis rather than Conquest appreciation?
To clarify, I was thinking of shifting the mean as being more akin to the ships translating, and the distribution of shots and locations of armor cells as being represented in a tangent plane to the target ship rather than over angles.
Those are going to result in very different distributions of damage. The results of your simulation (how armor cells are damaged, how long that takes etc.) will not look like real combat, even if you tune your variance so that the overall TTK is similar. The tuned variance will also only be useful for whatever case you tuned it, and it will not be accurate in other cases.
I would much rather see actual analysis of how specific movements affect accuracy. Stuff like 'weapon A becomes x% less effective against enemies moving over y speed due to missing' rather than 'weapon A did x% less damage than theoretical max on average against a certain fleet'. To me, that is just much more informative for making decision about how to outfit ships against certain opponents, and how to manage firing weapons and target selection IMO.
I'm also pretty sure the distribution being sampled from in the actual game when generating shots is not a normal distribution, since I'm pretty sure the error angle for each shot is bounded (while normal distributions are unbounded by definition). I would guess a uniform distribution. That would actually have a non-trivial impact on the probability of hitting a particular cell, and how much damage gets spread out.
I just took out all the [SUPER REDACTED] guardians in the Sector again with a fleet of nothing but Conquests with 2x Squall 2x Gauss 2x Harpoon 2x HAC (playership has 2x Storm Needler instead, but I'm having trouble making it work).
Total losses from both fights, 3 Conquests.
I guess you are playing with increased deployment cap which I think is a bit easier and favors missile spam. On standard cap it would be a bit awkward to waste 20 DP and problems with capital only fleets starts showing - losing ability to control more than 1 control point and getting surrounded.
Total losses from both fights, 3 Conquests.
Doesn't seem like that much of a success to me...Quote from: TadasI guess you are playing with increased deployment cap which I think is a bit easier and favors missile spam. On standard cap it would be a bit awkward to waste 20 DP and problems with capital only fleets starts showing - losing ability to control more than 1 control point and getting surrounded.
240 / 40 = 6. Am I missing something?
I'm also pretty sure the distribution being sampled from in the actual game when generating shots is not a normal distribution, since I'm pretty sure the error angle for each shot is bounded (while normal distributions are unbounded by definition). I would guess a uniform distribution. That would actually have a non-trivial impact on the probability of hitting a particular cell, and how much damage gets spread out.
It's almost certainly a uniform distribution, since I don't think Alex nor any programmer would bother to code in a specific distribution; it's much easier to just define some +- bounds and have the game (uniformly) select a random value within those bounds. But realistically in combat with the ship maneuvering both to the left and to the right, plus weapons with tracking, plus the weapon is aiming for the middle, it makes sense that the middle ends up getting hit more often than the sides. That's also just from experience. It doesn't have to be a normal distribution but it's good enough as a starting point.I just took out all the [SUPER REDACTED] guardians in the Sector again with a fleet of nothing but Conquests with 2x Squall 2x Gauss 2x Harpoon 2x HAC (playership has 2x Storm Needler instead, but I'm having trouble making it work).
I find (for AI control at least), they work better with 2x Squall 2x Gauss 2x Harpoon 2x HVD instead of HAC. HVD has faster projectile speed and no shot spread, plus HAC is essentially competing against the other weapons (Squall, Gauss, and Harpoon) for damage, so quite a few targets get taken out at long range even before HAC gets a chance. Flagship Onslaught, 4 Conquests, 2 Gryphons to capture objectives do pretty well vs double Ordos. (Funny story, I started off by trying 5 Conquests, but those Conquests would simply never bother to hold objectives -- they'd grab them, move to the middle, and let the enemy ships take them back and thus surround my fleet in the middle. Dumb AI.) At +411% XP bonus so easy 7.4 mil XP for the double Ordos.
Battle size is 300 by default. So you can max out at 180 pts.
I was really hoping to do some Latex on this but I don't have the time at all just now. Essentially what remains to prove is that for matrix cell a_ij of the summed armor damage matrix with a sequence of timepoints k, sum_k(E(a_ijk))=E(sum_k(a_ijk)) and that then for armor damage a E(a)=sum_j sum_i sum_k E(a_ijk). Then we can conclude the model is correct and focus on finding parameters.The first equation is definitely correct, that's a property of the EV operator. A sum of EVs of variables is always equal to the EV of the sum of the variables.
Re, statistics: guys, if the probability of one shot having angle alpha is uniform, then the mean of alpha_i for large n is normally distributed by the Central limit theorem. And the CDF of alpha is a normal distribution. In fact this is true for most distributions of alpha so we don't need to assume much. That is why it is appropriate to use the normal distribution.The mean of a group of uniformly distributed shots will follow a normal distribution. The shots themselves do not, they follow the distribution they are generated by. In terms of actual calculations, the probability of a shot hitting a particular armor cell comes from the uniform distribution (or whatever is in the code). And we care about that probability because E(damage) = damage|shot_location * p(shot_location) summed over all the shot locations.
In both of these cases, you've adjusted the variance of one of the distributions to match some statistic of the shifted mean distribution (either hit% or TTK), but you end up with a totally different situation overall that isn't really a useful comparison. If you don't care about this distinction, there is no point in simulating the armor cells at all.
I was really hoping to do some Latex on this but I don't have the time at all just now. Essentially what remains to prove is that for matrix cell a_ij of the summed armor damage matrix with a sequence of timepoints k, sum_k(E(a_ijk))=E(sum_k(a_ijk)) and that then for armor damage a E(a)=sum_j sum_i sum_k E(a_ijk). Then we can conclude the model is correct and focus on finding parameters.The first equation is definitely correct, that's a property of the EV operator. A sum of EVs of variables is always equal to the EV of the sum of the variables.
The problem is how to calculate the expected value of the damage of a shot in the middle of the sequence, because it depends on the armor value after the previous shot. The simple approach is just to use the armor values after the expected damage from the previous shot is applied, but I am fairly sure that is not correct.
@CapnHector
I'm pretty sure there are some errors, for instance E(a/(1+a)) =/= E(a)*E(1/(1+a)), those expression are not independant.
But I'm also a bit confused about what the variable a is. Is that supposed to be some total armor value? Because it's 100% not true that using the standard armor formula on total armor is equivalent to doing all the armor cell stuff.
You've got some matrix of armor cell values, and the EVs of all of them on the current iteration depend on the values of the others at the previous iteration. Given the previous armor values, calculating the EV is not complicated, but if you want to consider the EV of damage over a sequence of shots (so that the values of armor at the previous iteration are functions of the random variables), it's way way more complicated.
so E(a_i) can be calculated based on E(a_{i-1})I believe this is incorrect. I don't think you can just use the EV of the previous armor value here.
so E(a_i) can be calculated based on E(a_{i-1})I believe this is incorrect. I don't think you can just use the EV of the previous armor value here.
Say a_i = f(a_i-1,d) (where f is a function representing all the necessary calculations). In general E[a_i] =/= f(E[a_i-1], E[d]) unless f is linear (which it is not). Also, f is really a function of a bunch of other armor cells as well, which makes things even more complicated.
(the latter part from damage * damage /(damage+damage/armor).
Given that this is a sequence and not a continuous function can't we do E(f(f(f(f(...(a_0))...) To get E(a_i)?The fundamental issue is that in general E[f(f(...f(a_0)))] =/= E[f(E[...f(a_0)])] for arbitrary f. The rhs is what we can easily calculate, the lhs is the value we are interested in. It's possible the error is not too significant, but it might be worth testing that.
#dominator, hullhp, shieldregen, shieldmax, startingarmor, widthinpixels, armorcells
ship <- c(14000, 500, 10000, 1500, 180, 15)
#engagementrange
range <- 1000
#weaponaccuracy - this will be made a function of time and weapon later. the accuracy of a hellbore is 10
acc <- 10
#fudge factor
errorsd <- 0.01
#the fudge factor should be a function of range (more error in position at greater range), but not a function of weapon firing angle, and be expressed in terms of pixels
error <- errorsd*range
#where does one shot hit within the weapon's arc of fire, in pixel difference from the target? get a random angle in degrees according to a uniform distribution,
#then consider that the circumference is 2 pi * range pixels, so the hit coordinates in pixels are
shotangle <- function(acc) return(runif(1,-acc/2,acc/2)/360*2*pi*range)
#how much is the visual arc of the ship in rad?
shipangle <- ship[5]/(2* pi *range)
#how much is the visual arc of a single cell of armor in rad?
cellangle <- shipangle/ship[6]
#now assume the weapon is targeting the center of the ship's visual arc and that the ship is in the center of the weapon's firing arc
#which cell will the shot hit, or will it miss?
#call the cells (MISS, cell1, cell2, ... ,celli, MISS) and get a vector giving the (maximum for negative / minimum for positive) angles for hitting each
anglerangevector <- vector(mode="double", length = ship[6]+1)
anglerangevector[1] <- -shipangle/2
for (i in 1:(length(anglerangevector)-1)) anglerangevector[i+1] <- anglerangevector+cellangle
#now convert it to pixels
anglerangevector <- anglerangevector*2*pi*range
#this vector will store the hits
shipcellvector <- vector(mode="double", length = ship[6]+2)
#now add a random positional error to the coordinates of the hit
hitlocation <- function(acc){
location <- shotangle(acc)
location <- location + rnorm(1,0,error)
return(location)
}
#so which box was hit?
cellhit <- function(angle){
if(angle < anglerangevector[1]) return(1)
if(angle > anglerangevector[ship[6]+1]) return(ship[6]+2)
for (i in 1:length(anglerangevector)) {
if ((angle > anglerangevector) & (angle <= anglerangevector[i+1])) return(i+1)
}
}
#now let's run this over 10 000 shots and count how many shots hit where
for (i in 1:10000) {
wherehit <- cellhit(hitlocation(acc))
shipcellvector[wherehit] <- shipcellvector[wherehit] + 1
}
shipcellvector
> shipcellvector
[1] 0 503 696 663 700 646 704 720 663 661 724 692 669 681 744 534 0
> shipcellvector
[1] 152 438 593 711 744 700 687 738 641 717 663 655 660 683 621 441 156
> shipcellvector
[1] 2154 389 413 376 390 381 400 339 371 423 368 392 398 334 382 383 2107
> shipcellvector
[1] 2254 363 358 384 360 379 374 362 393 363 380 392 384 401 355 324 2174
for (j in 1:20){
acc <- j
for (i in 1:10000) {
wherehit <- cellhit(hitlocation(acc))
shipcellvector[wherehit] <- shipcellvector[wherehit] + 1
}
}
shipcellvector <- shipcellvector/sum(shipcellvector)
shipcellvector <- round(shipcellvector*100,2)
shipcellvector
> shipcellvector
[1] 7.78 2.58 3.15 3.73 4.52 5.63 6.83 9.65 12.35 9.56 6.86 5.51 4.52 3.73 3.16 2.58 7.86
You now at this point you might as well ask Alex to give you the code...
# this function generates the shot distribution per 1 shot with 100000 samples
createdistribution <- function(acc){
distributionvector <- vector(mode="double", length = ship[6]+2)
for (i in 1:100000){
wherehit <- cellhit(hitlocation(acc))
distributionvector[wherehit] <- distributionvector[wherehit] +1
}
return(distributionvector/sum(distributionvector))
}
# this is the default distribution of damage to armor cells
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
b[1,1] <- 0
b[1,5] <- 0
b[5,1] <- 0
b[5,5] <- 0
#this function generates a sum of matrices multiplied by the distribution
createhitmatrix <- function(acc){
hitmatrix <- matrix(0,5,ship[6]+4)
distributionvector <- createdistribution(acc)
for (i in 1:ship[6]){
hitmatrix[,i:(i+4)] <- hitmatrix[,i:(i+4)]+b*(distributionvector[i+1])
}
return(hitmatrix)
}
#for weapons with damage changing over time we need a sequence of matrices
createhitmatrixsequence <- function(accvector){
hitmatrixsequence <- list()
for (i in 1:length(accvector)){
hitmatrixsequence[] <- createhitmatrix(accvector)
}
return(hitmatrixsequence)
}
capture.output(createhitmatrixsequence(c(2,4,6,8)), file = "matrixsequence.txt")
# (fudge factor = 0)
[[1]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] 0 0 0 0 0 0 0.00000000 0.01093667 0.02235400 0.03333333 0.02239667 0.01097933
[2,] 0 0 0 0 0 0 0.01093667 0.03329067 0.05568733 0.06666667 0.05573000 0.03337600
[3,] 0 0 0 0 0 0 0.01093667 0.03329067 0.05568733 0.06666667 0.05573000 0.03337600
[4,] 0 0 0 0 0 0 0.01093667 0.03329067 0.05568733 0.06666667 0.05573000 0.03337600
[5,] 0 0 0 0 0 0 0.00000000 0.01093667 0.02235400 0.03333333 0.02239667 0.01097933
[,13] [,14] [,15] [,16] [,17] [,18] [,19]
[1,] 0.00000000 0 0 0 0 0 0
[2,] 0.01097933 0 0 0 0 0 0
[3,] 0.01097933 0 0 0 0 0 0
[4,] 0.01097933 0 0 0 0 0 0
[5,] 0.00000000 0 0 0 0 0 0
[[2]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 0 0 0 0 0.000000000 0.002363333 0.008168333 0.01383833 0.01714167 0.01709767 0.01716367
[2,] 0 0 0 0 0.002363333 0.010531667 0.022006667 0.03334333 0.04240767 0.04573633 0.04232867
[3,] 0 0 0 0 0.002363333 0.010531667 0.022006667 0.03334333 0.04240767 0.04573633 0.04232867
[4,] 0 0 0 0 0.002363333 0.010531667 0.022006667 0.03334333 0.04240767 0.04573633 0.04232867
[5,] 0 0 0 0 0.000000000 0.002363333 0.008168333 0.01383833 0.01714167 0.01709767 0.01716367
[,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19]
[1,] 0.01382833 0.008067333 0.002331333 0.000000000 0 0 0 0
[2,] 0.03332333 0.021895667 0.010398667 0.002331333 0 0 0 0
[3,] 0.03332333 0.021895667 0.010398667 0.002331333 0 0 0 0
[4,] 0.03332333 0.021895667 0.010398667 0.002331333 0 0 0 0
[5,] 0.01382833 0.008067333 0.002331333 0.000000000 0 0 0 0
[[3]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 0.000000000 0.003317667 0.007085667 0.01090300 0.01136800 0.01138367 0.01141667
[2,] 0 0 0 0.003317667 0.010403333 0.017988667 0.02558867 0.02983733 0.03038567 0.03053467
[3,] 0 0 0 0.003317667 0.010403333 0.017988667 0.02558867 0.02983733 0.03038567 0.03053467
[4,] 0 0 0 0.003317667 0.010403333 0.017988667 0.02558867 0.02983733 0.03038567 0.03053467
[5,] 0 0 0 0.000000000 0.003317667 0.007085667 0.01090300 0.01136800 0.01138367 0.01141667
[,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19]
[1,] 0.01151800 0.01155433 0.01101367 0.007129667 0.003309667 0.000000000 0 0 0
[2,] 0.03063867 0.03020200 0.02587767 0.018143333 0.010439333 0.003309667 0 0 0
[3,] 0.03063867 0.03020200 0.02587767 0.018143333 0.010439333 0.003309667 0 0 0
[4,] 0.03063867 0.03020200 0.02587767 0.018143333 0.010439333 0.003309667 0 0 0
[5,] 0.01151800 0.01155433 0.01101367 0.007129667 0.003309667 0.000000000 0 0 0
[[4]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 0.0000000000 0.0009296667 0.003798667 0.006680333 0.00863500 0.00865600 0.008685667 0.008666333
[2,] 0 0.0009296667 0.0047283333 0.010479000 0.016245000 0.02108967 0.02309233 0.023118000 0.023056333
[3,] 0 0.0009296667 0.0047283333 0.010479000 0.016245000 0.02108967 0.02309233 0.023118000 0.023056333
[4,] 0 0.0009296667 0.0047283333 0.010479000 0.016245000 0.02108967 0.02309233 0.023118000 0.023056333
[5,] 0 0.0000000000 0.0009296667 0.003798667 0.006680333 0.00863500 0.00865600 0.008685667 0.008666333
[,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
[1,] 0.008615667 0.00853300 0.00850200 0.008485 0.008530 0.006600333 0.00377800 0.0009043333 0.0000000000
[2,] 0.022950000 0.02281133 0.02269133 0.022683 0.020793 0.016034667 0.01037833 0.0046823333 0.0009043333
[3,] 0.022950000 0.02281133 0.02269133 0.022683 0.020793 0.016034667 0.01037833 0.0046823333 0.0009043333
[4,] 0.022950000 0.02281133 0.02269133 0.022683 0.020793 0.016034667 0.01037833 0.0046823333 0.0009043333
[5,] 0.008615667 0.00853300 0.00850200 0.008485 0.008530 0.006600333 0.00377800 0.0009043333 0.0000000000
[,19]
[1,] 0
[2,] 0
[3,] 0
[4,] 0
[5,] 0
@Vanshilar
500 HE damage vs 1500 armor is going to result in armor cells getting stripped supper quickly which is not really an interesting case (that's closer to torpedo damage than any gun other than hellbore). I think it would be more useful to consider a much lower hit strength, like 100/200 energy or something vs 1000 armor (that's like medium energy vs cruiser armor which seems like a pretty middle of the road case). Pretty sure that will have a large impact.
Also, it makes no sense to me that in case 1 25%+ more shots miss than case 3, but somehow it only takes 3 more shots to kill. Unless you mean that 46 hits are required to kill, not counting misses.
Also, I implemented a simulation of armor cells so I could test things for myself (and matched your results with the uniform distribution). But your 3rd case (the least spread out one) is still not a very tight distribution. From my testing, it seems approximately equivalent to a uniform distribution over ~9-11 cells in terms of the number of shots required to kill. You could have a much tighter spread than that quite reasonably.
In that case, the effect of distributing the damage is much larger, almost a 2x increase in shots to kill for damage spread over the entire ship (not even missing), compared to perfectly accurate fire.
#WEAPON ACCURACY
#missiles do not have spread
squallacc <- c(0)
locustacc <- c(0)
hurricaneacc <- c(0)
harpoonacc <- c(0)
sabotacc <- c(0)
#gauss has a spread of 0 and no increase per shot
gaussacc <- c(0)
#hephaestus has a spread of 0 and it increases by 2 per shot to a max of 10
hephaestusacc <- c(seq(0,10,2))
#mark ix has a spread of 0 and it increases by 2 per shot to a max of 15
markixacc <- c(seq(0,15,2),15)
#mjolnir has a spread of 0 and it increases by 1 per shot to a max of 5
mjolniracc <- c(seq(1,5,1))
#hellbore has a spread of 10
hellboreacc <- c(10)
#storm needler has a spread of 10
stormneedleracc <- c(10)
if(weapon1[4] != ""){
hitchancevector <- vector(mode = "double", length = length(weapon1[[5]]))
for (i in 1:length(weapon1[[5]])){
hitchancevector <- hitchance(weapon1[[5]])
}
hitchancevector
weapon1[[6]] <- hitchancevector
weapon1[[7]] <- createhitmatrixsequence(weapon1[[5]])
}
damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
# vectors in R are indexed starting from 1
hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]]))+1]]
nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
if (nohits == 0) {return(0)} else {
damagesum <- 0
for (i in 1:nohits) {
# damagesum <- damagesum + as.double(weapon[[1]]*hitmatrix[hitx,hity])
damagesum <- damagesum + armordamageselectivereduction(as.double(weapon[[1]]*hitmatrix[hitx,hity]),armor,startingarmor)
shots <- shots + 1
hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]])+1)]]
}
return(damagesum)
}
}
# reduce shield hp loss per hit by hit chance. Still use the full damage to calculate whether to block!
if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult*weapon1[[6]][weapon1shots]
shieldhp <- max(shieldhp, 0)
[...]
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]])+1)])
}}
etc.
library(ggplot2)
library(ggthemes)
#SHIP
#dominator, hullhp, shieldregen, shieldmax, startingarmor, widthinpixels, armorcells
ship <- c(14000, 500, 10000, 1500, 180, 15)
#engagementrange
range <- 1000
#weaponaccuracy - this will be made a function of time and weapon later. the accuracy of a hellbore is 10
acc <- 10
#fudge factor
errorsd <- 0.00
#the fudge factor should be a function of range (more error in position at greater range), but not a function of weapon firing angle, and be expressed in terms of pixels
error <- errorsd*range
#where does one shot hit within the weapon's arc of fire, in pixel difference from the target? get a random angle in degrees according to a uniform distribution,
#then consider that the circumference is 2 pi * range pixels, so the hit coordinates in pixels are
shotangle <- function(acc) return(runif(1,-acc/2,acc/2)/360*2*pi*range)
#how much is the visual arc of the ship in rad?
shipangle <- ship[5]/(2* pi *range)
#how much is the visual arc of a single cell of armor in rad?
cellangle <- shipangle/ship[6]
#now assume the weapon is targeting the center of the ship's visual arc and that the ship is in the center of the weapon's firing arc
#which cell will the shot hit, or will it miss?
#call the cells (MISS, cell1, cell2, ... ,celli, MISS) and get a vector giving the (maximum for negative / minimum for positive) angles for hitting each
anglerangevector <- vector(mode="double", length = ship[6]+1)
anglerangevector[1] <- -shipangle/2
for (i in 1:(length(anglerangevector)-1)) anglerangevector[i+1] <- anglerangevector+cellangle
#now convert it to pixels
anglerangevector <- anglerangevector*2*pi*range
#this vector will store the hits
shipcellvector <- vector(mode="double", length = ship[6]+2)
#now add a random positional error to the coordinates of the hit
hitlocation <- function(acc){
location <- shotangle(acc)
location <- location + rnorm(1,0,error)
return(location)
}
#so which box was hit?
cellhit <- function(angle){
if(angle < anglerangevector[1]) return(1)
if(angle > anglerangevector[ship[6]+1]) return(ship[6]+2)
for (i in 1:length(anglerangevector)) {
if ((angle > anglerangevector) & (angle <= anglerangevector[i+1])) return(i+1)
}
}
# this function generates the shot distribution per 1 shot with 100000 samples
createdistribution <- function(acc){
distributionvector <- vector(mode="double", length = ship[6]+2)
for (i in 1:100000){
wherehit <- cellhit(hitlocation(acc))
distributionvector[wherehit] <- distributionvector[wherehit] +1
}
return(distributionvector/sum(distributionvector))
}
# this is the default distribution of damage to armor cells
b <- matrix(0,nrow=5,ncol=5)
b[1:5,2:4] <- 1/30
b[2:4,1:5] <- 1/30
b[2:4,2:4] <- 1/15
b[1,1] <- 0
b[1,5] <- 0
b[5,1] <- 0
b[5,5] <- 0
#this function generates a sum of matrices multiplied by the distribution
createhitmatrix <- function(acc){
hitmatrix <- matrix(0,5,ship[6]+4)
distributionvector <- createdistribution(acc)
for (i in 1:ship[6]){
hitmatrix[,i:(i+4)] <- hitmatrix[,i:(i+4)]+b*(distributionvector[i+1])
}
return(hitmatrix)
}
hitchance <- function(acc){
hitchance <- 0
distributionvector <- createdistribution(acc)
hitchance <- (1-(distributionvector[1]+distributionvector[ship[6]]))
return(hitchance)
}
#for weapons with damage changing over time we need a sequence of matrices
createhitmatrixsequence <- function(accvector){
hitmatrixsequence <- list()
for (i in 1:length(accvector)){
hitmatrixsequence[] <- createhitmatrix(accvector)
}
return(hitmatrixsequence)
}
armordamage <- function(damage, armor, startingarmor) damage*(max(0.15,damage/(damage+max(0.05*startingarmor,armor))))
armordamageselectivereduction <- function(damage, armor,startingarmor) {
useminarmor <- 0
if(armor < 0.05*startingarmor / 15) useminarmor <- 1
if(useminarmor == 0){
if(armor == 0) {return (damage)}
return(damage*(max(0.15,damage/(damage+armor))))
}
else{
return(damage*(max(0.15,damage/(damage+0.05*startingarmor/15))))
}
}
#squall fires 2 missiles / sec for 10 secs, then recharges for 10 secs
squalltics <- c(2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0)
#locust fires 10 missiles / sec for 4 secs, then recharges for 5 secs
locusttics <- c(10,10,10,10,0,0,0,0,0)
#hurricane fires 9 missiles every 15 seconds
hurricanetics <- c(9,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
#harpoon pod fires 4 missiles in 1 second, then recharges for 8 seconds (in reality 8.25)
harpoontics <- c(4,0,0,0,0,0,0,0,0)
#sabot pod fires 2*5 missiles, then recharges for 8 seconds (in reality 8.75 seconds and firing time is .5 seconds)
sabottics <- c(10,0,0,0,0,0,0,0,0)
#gauss fires 1 shot, then charges for 1 second
gausstics <- c(1,0)
#hephaestus fires 4 shots / sec
hephaestustics <- c(4)
#mark ix fires 4 shots every 3 seconds
markixtics <- c(4,0,0)
#mjolnir fires 4 shots per 3 seconds. Since there is no neat way to handle this when time is discrete at 1 sec we'll handle as follows
mjolnirtics <- c(1,1,2,1,2,1,2,1,1)
#hellbore fires 1 shot per 4 seconds
hellboretics <- c(1,0,0,0)
#storm needler fires 10 shots per second
stormneedlertics <- c(10)
#WEAPON ACCURACY
#missiles do not have spread
squallacc <- c(0)
locustacc <- c(0)
hurricaneacc <- c(0)
harpoonacc <- c(0)
sabotacc <- c(0)
#gauss has a spread of 0 and no increase per shot
gaussacc <- c(0)
#hephaestus has a spread of 0 and it increases by 2 per shot to a max of 10
hephaestusacc <- c(seq(0,10,2))
#mark ix has a spread of 0 and it increases by 2 per shot to a max of 15
markixacc <- c(seq(0,15,2),15)
#mjolnir has a spread of 0 and it increases by 1 per shot to a max of 5
mjolniracc <- c(seq(1,5,1))
#hellbore has a spread of 10
hellboreacc <- c(10)
#storm needler has a spread of 10
stormneedleracc <- c(10)
#damage per shot, damage type (2=kinetic, 0.5=he, 0.25=frag, 1=energy), tics, weapon name, weapon accuracy over time, hit chance
squall <- list(250, 2, squalltics, "Squall", squallacc)
locust <- list(200, 0.25, locusttics, "Locust", locustacc)
hurricane <- list(500, 0.5, hurricanetics, "Hurricane", hurricaneacc)
harpoon <- list(750, 0.5, harpoontics, "Harpoon", harpoonacc)
sabot <- list(200, 2, sabottics, "Sabot", sabotacc)
gauss <- list(700, 2, gausstics, "Gauss", gaussacc)
hephaestus <- list(120, 0.5, hephaestustics, "Hephaestus", hephaestusacc)
markix <- list(200, 2, markixtics, "Mark IX", markixacc)
mjolnir <- list(400, 1, mjolnirtics, "Mjolnir", mjolniracc)
hellbore <- list(750, 0.5, hellboretics, "Hellbore", hellboreacc)
stormneedler <- list(50, 2, stormneedlertics, "Storm Needler", stormneedleracc)
dummy <- list(0,0,c(0),"",c(0),c(0))
weapon1 <- squall
weapon2 <- squall
weapon3 <- harpoon
weapon4 <- harpoon
weapon5 <- hephaestus
weapon6 <- gauss
#now create the sequences of hit matrices and hit chances for each weapon
if(weapon1[4] != ""){
hitchancevector <- vector(mode = "double", length = length(weapon1[[5]]))
for (i in 1:length(weapon1[[5]])){
hitchancevector <- hitchance(weapon1[[5]])
}
hitchancevector
weapon1[[6]] <- hitchancevector
weapon1[[7]] <- createhitmatrixsequence(weapon1[[5]])
}
if(weapon2[4] != ""){
hitchancevector <- vector(mode = "double", length = length(weapon2[[5]]))
for (i in 1:length(weapon2[[5]])){
hitchancevector <- hitchance(weapon2[[5]])
}
hitchancevector
weapon2[[6]] <- hitchancevector
weapon2[[7]] <- createhitmatrixsequence(weapon2[[5]])
}
if(weapon3[4] != ""){
hitchancevector <- vector(mode = "double", length = length(weapon3[[5]]))
for (i in 1:length(weapon3[[5]])){
hitchancevector <- hitchance(weapon3[[5]])
}
hitchancevector
weapon3[[6]] <- hitchancevector
weapon3[[7]] <- createhitmatrixsequence(weapon3[[5]])
}
if(weapon4[4] != ""){
hitchancevector <- vector(mode = "double", length = length(weapon4[[5]]))
for (i in 1:length(weapon4[[5]])){
hitchancevector <- hitchance(weapon4[[5]])
}
hitchancevector
weapon4[[6]] <- hitchancevector
weapon4[[7]] <- createhitmatrixsequence(weapon4[[5]])
}
if(weapon5[4] != ""){
hitchancevector <- vector(mode = "double", length = length(weapon5[[5]]))
for (i in 1:length(weapon5[[5]])){
hitchancevector <- hitchance(weapon5[[5]])
}
hitchancevector
weapon5[[6]] <- hitchancevector
weapon5[[7]] <- createhitmatrixsequence(weapon5[[5]])
}
if(weapon6[4] != ""){
hitchancevector <- vector(mode = "double", length = length(weapon6[[5]]))
for (i in 1:length(weapon6[[5]])){
hitchancevector <- hitchance(weapon6[[5]])
}
hitchancevector
weapon6[[6]] <- hitchancevector
weapon6[[7]] <- createhitmatrixsequence(weapon6[[5]])
}
shieldblock <- 0
shielddamageattimepoint <- function(weapon, timepoint){
nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
if (nohits == 0) {return(0)} else {
return(weapon[[1]]*nohits)
}
}
damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
# vectors in R are indexed starting from 1
hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]]))]]
nohits <- weapon[[3]][(timepoint %% (length(weapon[[3]])))+1]
if (nohits == 0) {return(0)} else {
damagesum <- 0
for (i in 1:nohits) {
# damagesum <- damagesum + as.double(weapon[[1]]*hitmatrix[hitx,hity])
damagesum <- damagesum + armordamageselectivereduction(as.double(weapon[[1]]*hitmatrix[hitx,hity]),armor,startingarmor)
shots <- shots + 1
hitmatrix <- weapon[[7]][[min(shots,length(weapon[[7]]))]]
}
return(damagesum)
}
}
weapon1shots <- 1
weapon2shots <- 1
weapon3shots <- 1
weapon4shots <- 1
weapon5shots <- 1
weapon6shots <- 1
armormatrix <- matrix(ship[4]/15,5,ship[6]+4)
timeseries <- function(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix){
weaponacc <- 0
#are we using shield to block?
shieldblock <- 0
hulldamage <- 0
if(hullhp > 0){} else {shieldhp <- 0}
#1. shields. if shieldhp is sufficient, use shield to block
if (weapon1[[4]] !=""){
weapon1mult <- unlist(weapon1[2])
if (shieldhp > shielddamageattimepoint(weapon1, timepoint)*weapon1mult){
shieldhp <- shieldhp - shielddamageattimepoint(weapon1, timepoint)*weapon1mult*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))]
shieldhp <- max(shieldhp, 0)
if(shielddamageattimepoint(weapon1,timepoint) > 0) {shieldblock <- 1}
} else {
#if you did not use shield to block, regenerate flux
#2. armor and hull
if(unlist(weapon1[2])==0.25){weapon1mult = 0.25} else {weapon1mult= 1 / unlist(weapon1[2])}
#2.1. damage armor and hull
hulldamage <- 0
#damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))])
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))])
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)-armormatrix[i,j])/weapon1mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon1mult*damageattimepoint(weapon1, timepoint,armormatrix[i,j],startingarmor,i,j,weapon1shots)*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))])
}}
hullhp <- hullhp - hulldamage*weapon1[[6]][min(weapon1shots,length(weapon1[[6]]))]
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
weapon1shots <- weapon1shots + weapon1[[3]][(timepoint %% (length(weapon1[[3]])+1))]
#repeat for other weapons
if (weapon2[[4]] !=""){
weapon2mult <- unlist(weapon2[2])
if (shieldhp > shielddamageattimepoint(weapon2, timepoint)*weapon2mult){
shieldhp <- shieldhp - shielddamageattimepoint(weapon2, timepoint)*weapon2mult*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))]
shieldhp <- max(shieldhp, 0)
if(shielddamageattimepoint(weapon2,timepoint) > 0) {shieldblock <- 1}
} else {
#if you did not use shield to block, regenerate flux
#2. armor and hull
if(unlist(weapon2[2])==0.25){weapon2mult = 0.25} else {weapon2mult= 1 / unlist(weapon2[2])}
#2.1. damage armor and hull
hulldamage <- 0
#damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)-armormatrix[i,j])/weapon2mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))])
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)-armormatrix[i,j])/weapon2mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))])
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)-armormatrix[i,j])/weapon2mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon2mult*damageattimepoint(weapon2, timepoint,armormatrix[i,j],startingarmor,i,j,weapon2shots)*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))])
}}
hullhp <- hullhp - hulldamage*weapon2[[6]][min(weapon2shots,length(weapon2[[6]]))]
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
weapon2shots <- weapon2shots + weapon2[[3]][(timepoint %% (length(weapon2[[3]])))+1]
if (weapon3[[4]] !=""){
weapon3mult <- unlist(weapon3[2])
if (shieldhp > shielddamageattimepoint(weapon3, timepoint)*weapon3mult){
shieldhp <- shieldhp - shielddamageattimepoint(weapon3, timepoint)*weapon3mult*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))]
shieldhp <- max(shieldhp, 0)
if(shielddamageattimepoint(weapon3,timepoint) > 0) {shieldblock <- 1}
} else {
#if you did not use shield to block, regenerate flux
#2. armor and hull
if(unlist(weapon3[2])==0.25){weapon3mult = 0.25} else {weapon3mult= 1 / unlist(weapon3[2])}
#2.1. damage armor and hull
hulldamage <- 0
#damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)-armormatrix[i,j])/weapon3mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))])
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)-armormatrix[i,j])/weapon3mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))])
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)-armormatrix[i,j])/weapon3mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon3mult*damageattimepoint(weapon3, timepoint,armormatrix[i,j],startingarmor,i,j,weapon3shots)*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))])
}}
hullhp <- hullhp - hulldamage*weapon3[[6]][min(weapon3shots,length(weapon3[[6]]))]
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
weapon3shots <- weapon3shots + weapon3[[3]][(timepoint %% (length(weapon3[[3]])))+1]
if (weapon4[[4]] !=""){
weapon4mult <- unlist(weapon4[2])
if (shieldhp > shielddamageattimepoint(weapon4, timepoint)*weapon4mult){
shieldhp <- shieldhp - shielddamageattimepoint(weapon4, timepoint)*weapon4mult*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))]
shieldhp <- max(shieldhp, 0)
if(shielddamageattimepoint(weapon4,timepoint) > 0) {shieldblock <- 1}
} else {
#if you did not use shield to block, regenerate flux
#2. armor and hull
if(unlist(weapon4[2])==0.25){weapon4mult = 0.25} else {weapon4mult= 1 / unlist(weapon4[2])}
#2.1. damage armor and hull
hulldamage <- 0
#damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)-armormatrix[i,j])/weapon4mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))])
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)-armormatrix[i,j])/weapon4mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))])
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)-armormatrix[i,j])/weapon4mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon4mult*damageattimepoint(weapon4, timepoint,armormatrix[i,j],startingarmor,i,j,weapon4shots)*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))])
}}
hullhp <- hullhp - hulldamage*weapon4[[6]][min(weapon4shots,length(weapon4[[6]]))]
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
weapon4shots <- weapon4shots + weapon4[[3]][(timepoint %% (length(weapon4[[3]])))+1]
if (weapon5[[4]] !=""){
weapon5mult <- unlist(weapon5[2])
if (shieldhp > shielddamageattimepoint(weapon5, timepoint)*weapon5mult){
shieldhp <- shieldhp - shielddamageattimepoint(weapon5, timepoint)*weapon5mult*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))]
shieldhp <- max(shieldhp, 0)
if(shielddamageattimepoint(weapon5,timepoint) > 0) {shieldblock <- 1}
} else {
#if you did not use shield to block, regenerate flux
#2. armor and hull
if(unlist(weapon5[2])==0.25){weapon5mult = 0.25} else {weapon5mult= 1 / unlist(weapon5[2])}
#2.1. damage armor and hull
hulldamage <- 0
#damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)-armormatrix[i,j])/weapon5mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))])
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)-armormatrix[i,j])/weapon5mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))])
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)-armormatrix[i,j])/weapon5mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon5mult*damageattimepoint(weapon5, timepoint,armormatrix[i,j],startingarmor,i,j,weapon5shots)*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))])
}}
hullhp <- hullhp - hulldamage*weapon5[[6]][min(weapon5shots,length(weapon5[[6]]))]
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
weapon5shots <- weapon5shots + weapon5[[3]][(timepoint %% (length(weapon5[[3]])))+1]
if (weapon6[[4]] !=""){
weapon6mult <- unlist(weapon6[2])
if (shieldhp > shielddamageattimepoint(weapon6, timepoint)*weapon6mult){
shieldhp <- shieldhp - shielddamageattimepoint(weapon6, timepoint)*weapon6mult*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))]
shieldhp <- max(shieldhp, 0)
if(shielddamageattimepoint(weapon6,timepoint) > 0) {shieldblock <- 1}
} else {
#if you did not use shield to block, regenerate flux
#2. armor and hull
if(unlist(weapon6[2])==0.25){weapon6mult = 0.25} else {weapon6mult= 1 / unlist(weapon6[2])}
#2.1. damage armor and hull
hulldamage <- 0
#damageattimepoint <- function(weapon, timepoint, armor, startingarmor, hitx, hity, shots){
for (j in 2:9){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)-armormatrix[i,j])/weapon6mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))])
}}
for (j in 2:9){
for (i in c(1,5)){
hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)-armormatrix[i,j])/weapon6mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))])
}}
for (j in c(1,10)){
for (i in 2:4){
hulldamage <- hulldamage+max(0,weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)-armormatrix[i,j])/weapon6mult
armormatrix[i,j] <- max(0,armormatrix[i,j]-weapon6mult*damageattimepoint(weapon6, timepoint,armormatrix[i,j],startingarmor,i,j,weapon6shots)*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))])
}}
hullhp <- hullhp - hulldamage*weapon6[[6]][min(weapon6shots,length(weapon6[[6]]))]
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
}
}
weapon6shots <- weapon6shots + weapon6[[3]][(timepoint %% (length(weapon6[[3]])))+1]
hullhp <- hullhp - hulldamage
hullhp <- max(hullhp, 0)
armorhp <- sum(armormatrix)/(46/15)
if(hullhp==0) armorhp <- 0
if (shieldblock==0){shieldhp <- min(shieldmax,shieldhp+shieldregen)}
return(list(timepoint, shieldhp, armorhp, hullhp, shieldregen, shieldmax, startingarmor,armormatrix))
}
totaltime = 60
armorhp <- ship[4]
shieldhp <- ship[3]
hullhp <- ship[1]
shieldregen <- ship[2]
shieldmax <- ship[3]
armorhp <- ship[4]
startingarmor <- ship[4]
armormatrix <- matrix(ship[4]/15,nrow=5,ncol=10)
armormatrix[1,1] <-0
armormatrix[1,10] <-0
armormatrix[5,1] <-0
armormatrix[5,10] <- 0
timeseriesarray <- data.frame(matrix(ncol = 4,nrow=0))
for (t in 1:totaltime){
state <- timeseries(t,shieldhp,armorhp,hullhp,shieldregen,shieldmax,startingarmor,armormatrix)
shieldhp <- state[[2]]
armorhp <- state[[3]]
hullhp <- state[[4]]
flux <- shieldmax - shieldhp
armormatrix <- state[[8]]
if(hullhp == 0){flux <- 0}
timeseriesarray <- rbind(timeseriesarray , c(state[[1]], flux/shieldmax*100, state[[3]]/startingarmor*100, state[[4]]/ship[1]*100))
}
colnames(timeseriesarray) <- c("Time", "Flux", "Armor", "Hull")
weaponstitle <- paste(unlist(weapon1[4]),unlist(weapon2[4]),unlist(weapon3[4]),unlist(weapon4[4]),unlist(weapon5[4]),unlist(weapon6[4]))
ggplot(timeseriesarray, aes(x=Time)) +
geom_line(aes(y = Flux, color = "Flux")) +
geom_line(aes(y = Armor, color="Armor")) +
geom_line(aes(y = Hull, color="Hull")) +
scale_colour_manual("",
breaks = c("Flux", "Armor", "Hull"),
values = c("lightsteelblue", "red", "maroon")) +
ylab("% max") +
xlab("Time (s)") +
labs(title=weaponstitle)