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)