Good work!
And here I was patting myself on the back for writing amateur (literally halfway through my first course in the R language), unfinished code to simulate how many attack rolls it takes to kill a single combination of hit points and AC. The saddest part of this is that I already did the "hard" work, and now I'm stuck trying to get averages and plots from my probability table (i.e. Number of Attacks Needed vs. Probability. That's the "atkprobtable" near the bottom). I think the table might be interpreting its contents as a string rather than integers/floats. Or something like that. Once I can get this table working, it won't take long to start simulating 1v1 slugfests, adding more features (pretty graphs, more than 2 combatants, vulnerability/resistance, chance to win a slugfest, etc), and applying data analytics to it.
EDIT: Whoops. Turned out I just needed to mapply() the as.double function to the table. I feel really dumb right now.
Spoiler: R Code
Show
#Skill Roll
#d20roll
p.d6 <- rep(1/6,6)
d6 <- 1:6
dieroll<-function(x,n){
sample(d6, size=1, prob=p.d6, replace=T)
}
mean(result)
sd(result)
###
#Try to make a die-roll function
dieroll<-function(x,n){
p.die <- rep(1/x,x)
die <- 1:x
return(sample(die, size=n, prob=p.die, replace=T))
}
###Modified d20
d20<-function(x=0){
return(dieroll(20,1)+x)
}
###d12, d10, d8, d6, d4, d2
d12<-function(x=0){
return(dieroll(12,1)+x)
}
d10<-function(x=0){
return(dieroll(10,1)+x)
}
d8<-function(x=0){
return(dieroll(8,1)+x)
}
d6<-function(x=0){
return(dieroll(6,1)+x)
}
d4<-function(x=0){
return(dieroll(4,1)+x)
}
###
simatks<-function(Atk_bonus, AC, Max_HP){
hitdmg<-function(X){
return(d8(0))
}
critdmg<-function(x){
return(d8(0)+d8(0))
}
crit_counter=0
hit_counter=0
miss_counter=0
atk_counter=0
dmgcnt=0
HP = Max_HP
while(HP>0){
Atk_roll= d20(Atk_bonus)
hitdmg1=hitdmg(0)
critdmg1=critdmg(0)
Hitstring="Error"
if (Atk_roll-Atk_bonus==20){
HP = HP - critdmg1
dmgcnt = dmgcnt + critdmg1
crit_counter=crit_counter+1
atk_counter=atk_counter+1
Hitstring="Crit"
}
else if (Atk_roll >= AC){
HP = HP - hitdmg1
hit_counter=hit_counter+1
atk_counter=atk_counter+1
dmgcnt = dmgcnt + hitdmg1
Hitstring="Hit"
}
else if (Atk_roll < AC){
miss_counter=miss_counter+1
atk_counter=atk_counter+1
Hitstring="Missed"
}
#print(cat("attack #",atk_counter, Hitstring, "and", HP, " hit points remain||"))
}
return(atk_counter)
}
countatks=mapply(simatks, rep(0,1000), MoreArgs=list(AC=10, Max_HP=20))
counttable<-table(countatks)
atkprobtable=data.frame(counttable/sum(counttable))
names(atkprobtable)=c("Atks", "Prob")
atkprobtable=mapply(as.double,atkprobtable)
plot(atkprobtable, type="b")
It's inspiring to see someone like OP actually managing to get work done. Keep it up.