From 07f76b2e1d110af981dcd4eac8ff5b067a5ef3ca Mon Sep 17 00:00:00 2001 From: dtookey Date: Tue, 5 Sep 2023 08:57:09 -0400 Subject: [PATCH] picking apart a few models --- src/main/kotlin/entries/BGSimulation.kt | 62 ++++++++++++++++++------- src/main/kotlin/simulation/Reporting.kt | 9 +++- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/entries/BGSimulation.kt b/src/main/kotlin/entries/BGSimulation.kt index c9ebe07..5c79a23 100644 --- a/src/main/kotlin/entries/BGSimulation.kt +++ b/src/main/kotlin/entries/BGSimulation.kt @@ -1,6 +1,7 @@ package entries import simulation.* +import simulation.dice.DiceBag import simulation.dice.RollType import simulation.fifthEd.AttackResult import simulation.fifthEd.AttackSimulatorModel @@ -10,17 +11,39 @@ import simulation.fifthEd.SimpleMeleeAttackAction fun main() { val rounds = 1_000_000 val start = System.currentTimeMillis() - val computedRounds = doSimulation(rounds) +// val computedRounds = doSimulation(rounds) +crunchBarbarian(21) +// crunchMonk() val finish = System.currentTimeMillis() - println("Simulation finished $computedRounds rounds in: ${finish - start}ms") +// println("Simulation finished $computedRounds rounds in: ${finish - start}ms") + println("Simulation finished in: ${finish - start}ms") } const val avgDamage = "Avg Dmg" -fun doSimulation(rounds: Int): Long { + +fun crunchMonk(ac: Int= 18) { + val attackRoll = MeleeAttackBuilder("1d20", "1d8", ac) + .withAtkBonus(11) + .withDmgBonus(7) + .build() + + val attackBless = MeleeAttackBuilder("1d20", "1d8", ac) + .withAtkBonus(11) + .withAtkBonus(DiceBag.plainDice("1d4")) + .withDmgBonus(7) + .build() + + val attacks = listOf(Pair("Normal Attack", attackRoll), Pair("Bless Attack", attackBless)) - val defense = 18 + + generateCombatSuggestions(attacks, 1000000, defaultReport()) +} + +fun crunchBarbarian(defense: Int = 16){ + + val rounds = 1_000_000 val attackDice = "1d20" val weaponDice = "2d6" @@ -46,14 +69,9 @@ fun doSimulation(rounds: Int): Long { .build() val attacks = listOf(Pair("Normal Attack", normalAttack), Pair("GWM Attack", gwmAttack)) - val reportFactory = ReportBuilder.getInstance() - .addRateMetric("Accuracy") { it.rollSucceeded } - .addRateMetric("Crit Rate") { it.rollSucceeded } - .addAverageMetric(avgDamage) { it.resultingDamage.toLong() } - generateCombatSuggestions(attacks, rounds, reportFactory) - return rounds.toLong() * attacks.size.toLong() + generateCombatSuggestions(attacks, rounds, defaultReport()) } fun generateCombatSuggestions( @@ -65,7 +83,7 @@ fun generateCombatSuggestions( val results = attacks .associateWith { attackInfo -> - val label = "${attackInfo.first}" + val label = attackInfo.first val attack = attackInfo.second RollType.entries.associateWith { @@ -74,7 +92,11 @@ fun generateCombatSuggestions( val report = reportFactory.build(label) - report.computeResults(results) + print("${attackInfo.first} $it\t") + + val res = report.computeResults(results) + println(Report.formatReport(res.name, res.results)) + res }.toMap() } @@ -86,10 +108,10 @@ fun generateCombatSuggestions( results.forEach { attackAction -> val current = attackAction.value[rollType] - if(choice == null){ - choice = current - }else{ - if(current?.results?.getDamage()!!.metricValue > choice!!.results.getDamage()!!.metricValue){ + if (choice == null) { + choice = current + } else { + if (current?.results?.getDamage()!!.metricValue > choice!!.results.getDamage()!!.metricValue) { choice = current } } @@ -100,6 +122,14 @@ fun generateCombatSuggestions( } } +fun defaultReport(): ReportBuilder{ + return ReportBuilder.getInstance() + .addRateMetric("Accuracy") { it.rollSucceeded } + .addRateMetric("Crit Rate") { it.rollSucceeded } + .addStdDevMetric("Dmg std") { it.resultingDamage.toLong() } + .addAverageMetric(avgDamage) { it.resultingDamage.toLong() } +} + fun List.getDamage(): MetricResult? { diff --git a/src/main/kotlin/simulation/Reporting.kt b/src/main/kotlin/simulation/Reporting.kt index dc57bdd..47395ad 100644 --- a/src/main/kotlin/simulation/Reporting.kt +++ b/src/main/kotlin/simulation/Reporting.kt @@ -10,7 +10,7 @@ interface Report { val name: String val metrics: List> - companion object{ + companion object { fun formatReport(name: String, results: List): String { val builder = StringBuilder() results.forEach { @@ -23,7 +23,7 @@ interface Report { } - fun computeResults(results: List): MetricReport{ + fun computeResults(results: List): MetricReport { val m = ArrayList(metrics.size) metrics.forEach { val value = it.mapToMetric(results) @@ -59,6 +59,11 @@ interface ReportBuilder { metrics.add(RateMetric(metricName, fieldMapFn)) return this } + + fun addStdDevMetric(metricName: String, fieldMapFn: (AttackResult) -> Long): ReportBuilder { + metrics.add(StdDevMetric(metricName, fieldMapFn)) + return this + } } class ReportBuilderImpl : ReportBuilder {