diff --git a/sim/druid/balance/TestBalance.results b/sim/druid/balance/TestBalance.results new file mode 100644 index 000000000..5843f41bb --- /dev/null +++ b/sim/druid/balance/TestBalance.results @@ -0,0 +1,196 @@ +character_stats_results: { + key: "TestBalance-Phase5-Lvl60-CharacterStats-Default" + value: { + final_stats: 217.35 + final_stats: 200.1 + final_stats: 300.2075 + final_stats: 180.55 + final_stats: 210.45 + final_stats: 150 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 49.25 + final_stats: 0 + final_stats: 25.81519 + final_stats: 0 + final_stats: 0 + final_stats: 1044.7 + final_stats: 0 + final_stats: 23.905 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 3672.25 + final_stats: 0 + final_stats: 0 + final_stats: 784.2 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 10.905 + final_stats: 5 + final_stats: 0 + final_stats: 4835.32875 + final_stats: 27 + final_stats: 60 + final_stats: 60 + final_stats: 70 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestBalance-Phase5-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.41993 + weights: 0 + weights: 0.49198 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 4.11318 + weights: 3.16483 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Average-Default" + value: { + dps: 502.03576 + tps: 523.22217 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-FullBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 520.28089 + tps: 758.25771 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-FullBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 409.77009 + tps: 422.72601 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-FullBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 536.40526 + tps: 557.19402 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-NoBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 246.78487 + tps: 427.5317 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-NoBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 195.64652 + tps: 204.68386 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-NoBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 361.0815 + tps: 376.26525 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-FullBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 495.0913 + tps: 730.51146 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-FullBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 393.46144 + tps: 406.23053 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-FullBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 534.12213 + tps: 554.86172 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-NoBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 241.68414 + tps: 422.43096 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-NoBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 192.73883 + tps: 201.77617 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-NoBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 361.5953 + tps: 376.77906 + } +} +dps_results: { + key: "TestBalance-Phase5-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 494.86012 + tps: 516.25597 + } +} diff --git a/sim/druid/feral/TestFeral.results b/sim/druid/feral/TestFeral.results new file mode 100644 index 000000000..288b814f9 --- /dev/null +++ b/sim/druid/feral/TestFeral.results @@ -0,0 +1,364 @@ +character_stats_results: { + key: "TestFeral-Phase5-Lvl60-CharacterStats-Default" + value: { + final_stats: 329.82 + final_stats: 228.85 + final_stats: 300.2075 + final_stats: 216.66 + final_stats: 210.45 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 41.25 + final_stats: 0 + final_stats: 26.41822 + final_stats: 0 + final_stats: 0 + final_stats: 1748.49 + final_stats: 0 + final_stats: 33.3425 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 6213.9 + final_stats: 0 + final_stats: 0 + final_stats: 841.7 + final_stats: 580 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 16.3425 + final_stats: 5 + final_stats: 0 + final_stats: 4835.32875 + final_stats: 27 + final_stats: 60 + final_stats: 60 + final_stats: 70 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 0 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestFeral-Phase5-Lvl60-StatWeights-Default" + value: { + weights: 0.67462 + weights: 0.53884 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.24451 + weights: 0 + weights: 5.48958 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Average-Default" + value: { + dps: 709.44416 + tps: 528.09487 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-NoBleed-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 405.3226 + tps: 520.99922 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-NoBleed-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 384.24199 + tps: 284.53209 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-NoBleed-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 452.29707 + tps: 333.294 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-NoBleed-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 181.39652 + tps: 305.24379 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-NoBleed-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 166.99752 + tps: 127.4363 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-NoBleed-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 210.30186 + tps: 167.41165 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 405.3226 + tps: 520.99922 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 384.24199 + tps: 284.53209 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 452.29707 + tps: 333.294 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 181.39652 + tps: 305.24379 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 166.99752 + tps: 127.4363 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Default-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 210.30186 + tps: 167.41165 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Flower-Aoe-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 405.3226 + tps: 520.99922 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Flower-Aoe-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 384.24199 + tps: 284.53209 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Flower-Aoe-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 452.29707 + tps: 333.294 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Flower-Aoe-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 181.39652 + tps: 305.24379 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Flower-Aoe-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 166.99752 + tps: 127.4363 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-NightElf-blank-Flower-Aoe-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 210.30186 + tps: 167.41165 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-NoBleed-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 420.29532 + tps: 530.84234 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-NoBleed-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 399.68342 + tps: 295.50391 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-NoBleed-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 472.61736 + tps: 351.86128 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-NoBleed-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 180.76748 + tps: 305.07322 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-NoBleed-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 166.51698 + tps: 127.11686 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-NoBleed-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 210.58222 + tps: 167.65243 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 420.29532 + tps: 530.84234 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 399.68342 + tps: 295.50391 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 472.61736 + tps: 351.86128 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 180.76748 + tps: 305.07322 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 166.51698 + tps: 127.11686 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Default-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 210.58222 + tps: 167.65243 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Flower-Aoe-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 420.29532 + tps: 530.84234 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Flower-Aoe-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 399.68342 + tps: 295.50391 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Flower-Aoe-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 472.61736 + tps: 351.86128 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Flower-Aoe-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 180.76748 + tps: 305.07322 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Flower-Aoe-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 166.51698 + tps: 127.11686 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-Settings-Tauren-blank-Flower-Aoe-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 210.58222 + tps: 167.65243 + } +} +dps_results: { + key: "TestFeral-Phase5-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 376.62744 + tps: 267.40548 + } +} diff --git a/sim/hunter/TestBM.results b/sim/hunter/TestBM.results new file mode 100644 index 000000000..36900a9d3 --- /dev/null +++ b/sim/hunter/TestBM.results @@ -0,0 +1,280 @@ +character_stats_results: { + key: "TestBM-Phase2-Lvl40-CharacterStats-Default" + value: { + final_stats: 211.255 + final_stats: 332.695 + final_stats: 359.32325 + final_stats: 163.185 + final_stats: 191.015 + final_stats: 162 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 34.75 + final_stats: 0 + final_stats: 28.53276 + final_stats: 0 + final_stats: 0 + final_stats: 1127.95 + final_stats: 0 + final_stats: 30.08066 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 3272.775 + final_stats: 0 + final_stats: 0 + final_stats: 2503.39 + final_stats: 1281.39 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 4380.2325 + final_stats: 13 + final_stats: 56 + final_stats: 30 + final_stats: 30 + final_stats: 30 + final_stats: 263 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestBM-Phase2-Lvl40-StatWeights-Default" + value: { + weights: 0 + weights: 0.50664 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.13996 + weights: 4.3644 + weights: 3.36833 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.07897 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Average-Default" + value: { + dps: 653.95169 + tps: 298.34077 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 938.88875 + tps: 912.66402 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 667.23482 + tps: 313.89596 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 701.09983 + tps: 319.47299 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 389.83157 + tps: 609.23817 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 199.49201 + tps: 112.68143 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 214.83784 + tps: 106.45497 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 787.77778 + tps: 681.30603 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 698.66246 + tps: 339.611 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 734.58089 + tps: 336.78729 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 295.57734 + tps: 561.83868 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 251.93539 + tps: 167.86977 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 273.04179 + tps: 168.58356 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 920.3286 + tps: 894.1469 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 652.573 + tps: 298.23343 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 685.67111 + tps: 300.57623 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 394.08419 + tps: 603.97612 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 204.56596 + tps: 113.66426 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 222.20253 + tps: 107.48562 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 764.88278 + tps: 717.87402 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 682.45237 + tps: 326.12824 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 718.89282 + tps: 322.33991 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 296.4647 + tps: 559.91976 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 253.84926 + tps: 166.05371 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 274.46254 + tps: 167.6218 + } +} +dps_results: { + key: "TestBM-Phase2-Lvl40-SwitchInFrontOfTarget-Default" + value: { + dps: 632.37975 + tps: 278.24115 + } +} diff --git a/sim/hunter/TestMM.results b/sim/hunter/TestMM.results new file mode 100644 index 000000000..54e9f0763 --- /dev/null +++ b/sim/hunter/TestMM.results @@ -0,0 +1,210 @@ +character_stats_results: { + key: "TestMM-Phase4-Lvl60-CharacterStats-Default" + value: { + final_stats: 297.275 + final_stats: 507.265 + final_stats: 474.2485 + final_stats: 215.05 + final_stats: 246.675 + final_stats: 162 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 47.25 + final_stats: 3 + final_stats: 28.14833 + final_stats: 0 + final_stats: 0 + final_stats: 1602.54 + final_stats: 3 + final_stats: 34.58731 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4665.75 + final_stats: 0 + final_stats: 0 + final_stats: 2852.53 + final_stats: 1870.53 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 6709.2541 + final_stats: 27 + final_stats: 86 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestMM-Phase4-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0.15354 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.12138 + weights: 7.19003 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-AllItems-DevilsaurEye-19991" + value: { + dps: 343.41085 + tps: 355.72397 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-AllItems-DevilsaurTooth-19992" + value: { + dps: 338.0538 + tps: 350.37503 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Average-Default" + value: { + dps: 337.33348 + tps: 349.70703 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 419.37663 + tps: 579.42693 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 274.78179 + tps: 282.80397 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 266.84113 + tps: 276.55328 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 174.1017 + tps: 414.45707 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 112.97901 + tps: 124.99678 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 111.38138 + tps: 115.74126 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 449.68521 + tps: 610.1654 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 296.74888 + tps: 304.78254 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 301.1019 + tps: 310.94522 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 173.0927 + tps: 413.95607 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 113.4107 + tps: 125.45386 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 116.07029 + tps: 120.43017 + } +} +dps_results: { + key: "TestMM-Phase4-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 224.48153 + tps: 236.67331 + } +} diff --git a/sim/hunter/TestSV.results b/sim/hunter/TestSV.results new file mode 100644 index 000000000..a77972337 --- /dev/null +++ b/sim/hunter/TestSV.results @@ -0,0 +1,210 @@ +character_stats_results: { + key: "TestSV-Phase4-Lvl60-CharacterStats-Default" + value: { + final_stats: 297.275 + final_stats: 583.35475 + final_stats: 474.2485 + final_stats: 215.05 + final_stats: 246.675 + final_stats: 162 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 47.25 + final_stats: 3 + final_stats: 28.14833 + final_stats: 0 + final_stats: 0 + final_stats: 1678.62975 + final_stats: 3 + final_stats: 39.0254 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4665.75 + final_stats: 0 + final_stats: 0 + final_stats: 3004.7095 + final_stats: 1922.7095 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 6582.6644 + final_stats: 27 + final_stats: 86 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestSV-Phase4-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0.23711 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.13693 + weights: 7.55342 + weights: 1.10189 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-AllItems-DevilsaurEye-19991" + value: { + dps: 466.59017 + tps: 404.77075 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-AllItems-DevilsaurTooth-19992" + value: { + dps: 462.52818 + tps: 399.46188 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Average-Default" + value: { + dps: 460.30515 + tps: 398.87454 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 1324.90663 + tps: 1909.48506 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 459.93206 + tps: 397.14761 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 460.26913 + tps: 394.30809 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 758.08202 + tps: 1425.79955 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 178.18299 + tps: 169.04959 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 180.93972 + tps: 162.40202 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 1325.62601 + tps: 1934.85365 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 455.40794 + tps: 396.73842 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 456.19204 + tps: 391.57823 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 754.54603 + tps: 1415.54554 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 176.9543 + tps: 167.04892 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 183.63139 + tps: 160.99185 + } +} +dps_results: { + key: "TestSV-Phase4-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 323.67628 + tps: 281.33173 + } +} diff --git a/sim/mage/TestArcane.results b/sim/mage/TestArcane.results new file mode 100644 index 000000000..017e8f275 --- /dev/null +++ b/sim/mage/TestArcane.results @@ -0,0 +1,196 @@ +character_stats_results: { + key: "TestArcane-Phase5-Lvl60-CharacterStats-Default" + value: { + final_stats: 172.5 + final_stats: 179.4 + final_stats: 265.8225 + final_stats: 221.95 + final_stats: 220.8 + final_stats: 150 + final_stats: 0 + final_stats: 40 + final_stats: 15 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 41.25 + final_stats: 0 + final_stats: 24.92876 + final_stats: 0 + final_stats: 0 + final_stats: 792.5 + final_stats: 0 + final_stats: 16.2 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4688.475 + final_stats: 0 + final_stats: 0 + final_stats: 358.8 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 3.2 + final_stats: 5 + final_stats: 0 + final_stats: 4148.225 + final_stats: 52 + final_stats: 85 + final_stats: 85 + final_stats: 85 + final_stats: 85 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestArcane-Phase5-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.28967 + weights: 0 + weights: 0.43631 + weights: 0 + weights: 0.05906 + weights: 0.37724 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 4.93705 + weights: 2.55452 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Average-Default" + value: { + dps: 372.01945 + tps: 386.74766 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 371.0616 + tps: 648.00894 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 371.0616 + tps: 384.90897 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 388.44813 + tps: 404.27494 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 197.61902 + tps: 439.20185 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 197.61902 + tps: 209.69816 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 250.03264 + tps: 265.51076 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 369.74627 + tps: 635.6476 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 369.74627 + tps: 383.04134 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 399.77203 + tps: 416.03702 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 198.01526 + tps: 437.80854 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 198.01526 + tps: 210.00492 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 253.36293 + tps: 268.84104 + } +} +dps_results: { + key: "TestArcane-Phase5-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 369.60437 + tps: 383.11611 + } +} diff --git a/sim/mage/TestFrost.results b/sim/mage/TestFrost.results new file mode 100644 index 000000000..fbbdfca19 --- /dev/null +++ b/sim/mage/TestFrost.results @@ -0,0 +1,196 @@ +character_stats_results: { + key: "TestFrost-Phase5-Lvl60-CharacterStats-Default" + value: { + final_stats: 172.5 + final_stats: 179.4 + final_stats: 265.8225 + final_stats: 221.95 + final_stats: 220.8 + final_stats: 150 + final_stats: 0 + final_stats: 40 + final_stats: 15 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 41.25 + final_stats: 0 + final_stats: 24.92876 + final_stats: 0 + final_stats: 0 + final_stats: 792.5 + final_stats: 0 + final_stats: 16.2 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4262.25 + final_stats: 0 + final_stats: 0 + final_stats: 358.8 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 3.2 + final_stats: 5 + final_stats: 0 + final_stats: 4148.225 + final_stats: 31 + final_stats: 64 + final_stats: 64 + final_stats: 64 + final_stats: 64 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestFrost-Phase5-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.10653 + weights: 0 + weights: 0.46322 + weights: 0 + weights: 0.06157 + weights: 0.40165 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 5.49189 + weights: 2.56205 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Average-Default" + value: { + dps: 392.75219 + tps: 315.3999 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 399.58783 + tps: 587.87827 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 399.58783 + tps: 318.94962 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 400.34254 + tps: 322.31659 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 225.11332 + tps: 404.6202 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 225.11332 + tps: 183.3459 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 268.33572 + tps: 220.57852 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 390.98053 + tps: 580.85367 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 390.98053 + tps: 313.15673 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 396.72646 + tps: 322.21705 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" + value: { + dps: 224.67699 + tps: 406.5577 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" + value: { + dps: 224.67699 + tps: 182.93016 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" + value: { + dps: 267.36261 + tps: 219.59609 + } +} +dps_results: { + key: "TestFrost-Phase5-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 389.92099 + tps: 313.27487 + } +} diff --git a/sim/mage/TestP1Mage.results b/sim/mage/TestP1Mage.results index 960c03606..c658026a3 100644 --- a/sim/mage/TestP1Mage.results +++ b/sim/mage/TestP1Mage.results @@ -53,18 +53,18 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 0.01055 + weights: 0.01506 weights: 0 - weights: 0.13055 + weights: 0.16867 weights: 0 - weights: 0.13055 + weights: 0.16867 weights: 0 weights: 0 weights: 0 weights: 0 weights: 0 - weights: 0.64435 - weights: 0.5321 + weights: 0.92841 + weights: 1.33618 weights: 0 weights: 0 weights: 0 @@ -99,98 +99,98 @@ stat_weights_results: { dps_results: { key: "TestP1Mage-Phase1-Lvl60-Average-Default" value: { - dps: 54.83156 - tps: 62.0652 + dps: 71.27337 + tps: 78.50702 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 55.33731 - tps: 167.06291 + dps: 74.6557 + tps: 186.3813 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 55.33731 - tps: 60.92359 + dps: 74.6557 + tps: 80.24198 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 52.21493 - tps: 57.57093 + dps: 68.75136 + tps: 74.10736 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 30.66147 - tps: 212.32815 + dps: 32.0808 + tps: 213.74748 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 30.66147 - tps: 39.7448 + dps: 32.0808 + tps: 41.16413 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 29.57362 - tps: 33.03878 + dps: 30.94654 + tps: 34.4117 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 54.53749 - tps: 184.74762 + dps: 72.74565 + tps: 202.95578 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 54.53749 - tps: 61.048 + dps: 72.74565 + tps: 79.25615 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 51.44671 - tps: 58.02596 + dps: 66.9292 + tps: 73.50845 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 30.54926 - tps: 214.44915 + dps: 31.90564 + tps: 215.80554 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 30.54926 - tps: 39.74425 + dps: 31.90564 + tps: 41.10063 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 29.45515 - tps: 32.91712 + dps: 30.74064 + tps: 34.20262 } } dps_results: { key: "TestP1Mage-Phase1-Lvl60-SwitchInFrontOfTarget-Default" value: { - dps: 54.63154 - tps: 61.86075 + dps: 71.89682 + tps: 79.12603 } } diff --git a/sim/mage/arcane_barrage.go b/sim/mage/arcane_barrage.go deleted file mode 100644 index f2dafab52..000000000 --- a/sim/mage/arcane_barrage.go +++ /dev/null @@ -1,56 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (mage *Mage) registerArcaneBarrageSpell() { - if !mage.HasRune(proto.MageRune_RuneCloakArcaneBarrage) { - return - } - - baseDamageLow := mage.baseRuneAbilityDamage() * 3.58 - baseDamageHigh := mage.baseRuneAbilityDamage() * 4.38 - damageCoef := 0.429 - manaCost := 0.08 - cooldown := time.Second * 3 - - mage.ArcaneBarrage = mage.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_MageArcaneBarrage, - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneCloakArcaneBarrage)}, - SpellSchool: core.SpellSchoolArcane, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL, - MissileSpeed: 24, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: mage.NewTimer(), - Duration: cooldown, - }, - }, - - BonusCoefficient: damageCoef, - DamageMultiplier: 1, - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - result := spell.CalcDamage(sim, target, sim.Roll(baseDamageLow, baseDamageHigh), spell.OutcomeMagicHitAndCrit) - - spell.WaitTravelTime(sim, func(sim *core.Simulation) { - spell.DealDamage(sim, result) - }) - }, - }) -} diff --git a/sim/mage/arcane_blast.go b/sim/mage/arcane_blast.go deleted file mode 100644 index bb19f61a1..000000000 --- a/sim/mage/arcane_blast.go +++ /dev/null @@ -1,106 +0,0 @@ -package mage - -import ( - "slices" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -// TODO: Classic verify Arcane Blast rune numbers -// https://www.wowhead.com/classic/news/patch-1-15-build-52124-ptr-datamining-season-of-discovery-runes-336044#news-post-336044 -// https://www.wowhead.com/classic/spell=400574/arcane-blast -func (mage *Mage) registerArcaneBlastSpell() { - if !mage.HasRune(proto.MageRune_RuneHandsArcaneBlast) { - return - } - - hasLivingFlameRune := mage.HasRune(proto.MageRune_RuneLegsLivingFlame) - - baseLowDamage := mage.baseRuneAbilityDamage() * 4.53 - baseHighDamage := mage.baseRuneAbilityDamage() * 5.27 - spellCoeff := .714 - castTime := time.Millisecond * 2500 - manaCost := .07 - - mage.ArcaneBlastDamageMultiplier = 0.15 - - additiveDamageAffectedSpells := []*core.Spell{} - // Purposefully excluded living flame and arcane missiles ticks because we manually disable the arcane blast aura after the final tick - affectedSpellCodes := []int32{ - SpellCode_MageArcaneBarrage, SpellCode_MageArcaneExplosion, SpellCode_MageArcaneSurge, SpellCode_MageBalefireBolt, SpellCode_MageSpellfrostBolt, - } - - mage.ArcaneBlastAura = mage.GetOrRegisterAura(core.Aura{ - Label: "Arcane Blast Aura", - ActionID: core.ActionID{SpellID: 400573}, - Duration: time.Second * 6, - MaxStacks: 4, - OnInit: func(aura *core.Aura, sim *core.Simulation) { - additiveDamageAffectedSpells = core.FilterSlice( - core.Flatten([][]*core.Spell{ - mage.ArcaneExplosion, - mage.ArcaneMissilesTickSpell, - {mage.ArcaneSurge}, - {mage.SpellfrostBolt}, - {mage.BalefireBolt}, - }), - func(spell *core.Spell) bool { return spell != nil }, - ) - }, - OnStacksChange: func(aura *core.Aura, sim *core.Simulation, oldStacks int32, newStacks int32) { - mage.ArcaneBlast.Cost.Multiplier -= 175 * oldStacks - mage.ArcaneBlast.Cost.Multiplier += 175 * newStacks - - oldMultiplier := mage.ArcaneBlastDamageMultiplier * float64(oldStacks) - newMultiplier := mage.ArcaneBlastDamageMultiplier * float64(newStacks) - core.Each(additiveDamageAffectedSpells, func(spell *core.Spell) { - spell.DamageMultiplierAdditive -= oldMultiplier - spell.DamageMultiplierAdditive += newMultiplier - }) - - if hasLivingFlameRune { - // Living Flame is the only spell buffed multiplicatively for whatever reason - mage.LivingFlame.DamageMultiplier /= 1 + oldMultiplier - mage.LivingFlame.DamageMultiplier *= 1 + newMultiplier - } - }, - OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { - if spell.Flags.Matches(SpellFlagMage) && slices.Contains(affectedSpellCodes, spell.SpellCode) { - aura.Deactivate(sim) - } - }, - }) - - mage.ArcaneBlast = mage.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 400574}, - SpellCode: SpellCode_MageArcaneBlast, - SpellSchool: core.SpellSchoolArcane, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - CastTime: castTime, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseLowDamage, baseHighDamage) - spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - - mage.ArcaneBlastAura.Activate(sim) - mage.ArcaneBlastAura.AddStack(sim) - }, - }) -} diff --git a/sim/mage/arcane_missiles.go b/sim/mage/arcane_missiles.go index c3c9c1072..9e97f5f50 100644 --- a/sim/mage/arcane_missiles.go +++ b/sim/mage/arcane_missiles.go @@ -5,7 +5,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const ArcaneMissilesRanks = 8 @@ -41,9 +40,6 @@ func (mage *Mage) getArcaneMissilesSpellConfig(rank int) core.SpellConfig { numTicks := castTime tickLength := time.Second - hasArcaneBlastRune := mage.HasRune(proto.MageRune_RuneHandsArcaneBlast) - hasMissileBarrageRune := mage.HasRune(proto.MageRune_RuneBeltMissileBarrage) - tickSpell := mage.getArcaneMissilesTickSpell(rank) mage.ArcaneMissilesTickSpell[rank] = tickSpell @@ -74,14 +70,13 @@ func (mage *Mage) getArcaneMissilesSpellConfig(rank int) core.SpellConfig { // TODO: This check is necessary to ensure the final tick occurs before // Arcane Blast stacks are dropped. To fix this, ticks need to reliably // occur before aura expirations. + + //TODO: Test interaction in classic code without aura dot := mage.ArcaneMissiles[rank].Dot(aura.Unit) if dot.TickCount < dot.NumberOfTicks { dot.TickCount++ dot.TickOnce(sim) } - if hasArcaneBlastRune && mage.ArcaneBlastAura.IsActive() { - mage.ArcaneBlastAura.Deactivate(sim) - } }, }, NumberOfTicks: numTicks, @@ -93,10 +88,6 @@ func (mage *Mage) getArcaneMissilesSpellConfig(rank int) core.SpellConfig { ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { spell.Dot(target).Apply(sim) - - if hasMissileBarrageRune && mage.MissileBarrageAura.IsActive() { - mage.MissileBarrageAura.Deactivate(sim) - } }, ExpectedTickDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, _ bool) *core.SpellResult { return tickSpell.CalcDamage(sim, target, baseTickDamage, spell.OutcomeExpectedMagicHitAndCrit) diff --git a/sim/mage/arcane_surge.go b/sim/mage/arcane_surge.go deleted file mode 100644 index 93692cc90..000000000 --- a/sim/mage/arcane_surge.go +++ /dev/null @@ -1,86 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (mage *Mage) registerArcaneSurgeSpell() { - if !mage.HasRune(proto.MageRune_RuneLegsArcaneSurge) { - return - } - - actionID := core.ActionID{SpellID: int32(proto.MageRune_RuneLegsArcaneSurge)} - baseDamageLow := mage.baseRuneAbilityDamage() * 2.26 - baseDamageHigh := mage.baseRuneAbilityDamage() * 2.64 - spellCoeff := .429 - cooldown := time.Minute * 2 - auraDuration := time.Second * 8 - - manaMetrics := mage.NewManaMetrics(actionID) - - manaAura := mage.GetOrRegisterAura(core.Aura{ - Label: "Arcane Surge", - ActionID: actionID, - Duration: auraDuration, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.SpiritRegenMultiplier *= 3 - mage.PseudoStats.ForceFullSpiritRegen = true - mage.UpdateManaRegenRates() - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.SpiritRegenMultiplier /= 3 - mage.PseudoStats.ForceFullSpiritRegen = false - mage.UpdateManaRegenRates() - }, - }) - - mage.ArcaneSurge = mage.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellCode: SpellCode_MageArcaneSurge, - SpellSchool: core.SpellSchoolArcane, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL, - - ManaCost: core.ManaCostOptions{ - FlatCost: 0.0, // Drains remaining mana so we have to use ModifyCast - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: mage.NewTimer(), - Duration: cooldown, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - damage := sim.Roll(baseDamageLow, baseDamageHigh) - // Damage increased based on remaining mana up to 300% - oldMultiplier := spell.DamageMultiplier - spell.DamageMultiplier *= 1 + mage.CurrentManaPercent()*3 - spell.CalcAndDealDamage(sim, target, damage, spell.OutcomeMagicHitAndCrit) - spell.DamageMultiplier = oldMultiplier - // Because of the 0 base mana cost we have to create resource metrics - mage.SpendMana(sim, mage.CurrentMana(), manaMetrics) - manaAura.Activate(sim) - }, - - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return mage.CurrentMana() > 0 - }, - }) - - mage.AddMajorCooldown(core.MajorCooldown{ - Spell: mage.ArcaneSurge, - Type: core.CooldownTypeDPS, - }) -} diff --git a/sim/mage/armors.go b/sim/mage/armors.go index 22e3d46d2..d3049fa18 100644 --- a/sim/mage/armors.go +++ b/sim/mage/armors.go @@ -2,7 +2,6 @@ package mage import ( "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" "github.com/wowsims/classic/sim/core/stats" ) @@ -94,31 +93,3 @@ func (mage *Mage) applyMageArmor() { }, })) } - -func (mage *Mage) applyMoltenArmor() { - if !mage.HasRune(proto.MageRune_RuneBracersMoltenArmor) { - return - } - - crit := 5.0 * core.SpellCritRatingPerCritChance - - mage.MoltenArmorAura = core.MakePermanent(mage.RegisterAura(core.Aura{ - Label: "Molten Armor", - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneBracersMoltenArmor)}, - BuildPhase: core.CharacterBuildPhaseBuffs, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - if aura.Unit.Env.MeasuringStats && aura.Unit.Env.State != core.Finalized { - mage.AddStat(stats.SpellCrit, crit) - } else { - mage.AddStatDynamic(sim, stats.SpellCrit, crit) - } - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - if aura.Unit.Env.MeasuringStats && aura.Unit.Env.State != core.Finalized { - mage.AddStat(stats.SpellCrit, -crit) - } else { - mage.AddStatDynamic(sim, stats.SpellCrit, -crit) - } - }, - })) -} diff --git a/sim/mage/balefire_bolt.go b/sim/mage/balefire_bolt.go deleted file mode 100644 index 03f5b2a9c..000000000 --- a/sim/mage/balefire_bolt.go +++ /dev/null @@ -1,96 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -// https://www.wowhead.com/classic/spell=428878/balefire-bolt -func (mage *Mage) registerBalefireBoltSpell() { - if !mage.HasRune(proto.MageRune_RuneBracersBalefireBolt) { - return - } - - baseDamageLow := mage.baseRuneAbilityDamage() * 2.8 - baseDamageHigh := mage.baseRuneAbilityDamage() * 4.2 - spellCoeff := .857 - castTime := time.Millisecond * 2500 - buffDuration := time.Second * 30 - manaCost := .20 - maxStacks := 5 - stackMultiplier := 0.20 - - statDeps := make([]*stats.StatDependency, maxStacks+1) // 5 stacks + zero conditions - for i := 1; i < maxStacks+1; i++ { - statDeps[i] = mage.NewDynamicMultiplyStat(stats.Spirit, 1.0-stackMultiplier*float64(i)) - } - - balefireAura := mage.RegisterAura(core.Aura{ - Label: "Balefire Bolt (Stacks)", - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneBracersBalefireBolt)}.WithTag(1), - Duration: buffDuration, - MaxStacks: int32(maxStacks), - OnStacksChange: func(aura *core.Aura, sim *core.Simulation, oldStacks int32, newStacks int32) { - mage.BalefireBolt.DamageMultiplierAdditive -= stackMultiplier * float64(oldStacks) - mage.BalefireBolt.DamageMultiplierAdditive += stackMultiplier * float64(newStacks) - - if oldStacks != 0 { - aura.Unit.DisableDynamicStatDep(sim, statDeps[oldStacks]) - } - if newStacks != 0 { - aura.Unit.EnableDynamicStatDep(sim, statDeps[newStacks]) - } - - if newStacks == aura.MaxStacks { - mage.RemoveHealth(sim, mage.CurrentHealth()) - - if sim.Log != nil { - mage.Log(sim, "YOU DIED") - } - - sim.Cleanup() - } - }, - }) - - mage.BalefireBolt = mage.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneBracersBalefireBolt)}, - SpellCode: SpellCode_MageBalefireBolt, - SpellSchool: core.SpellSchoolArcane | core.SpellSchoolFire | core.SpellSchoolFrost, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL, - // TODO: Verify missile speed - MissileSpeed: 28, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - CastTime: castTime, - GCD: core.GCDDefault, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - - balefireAura.Activate(sim) - balefireAura.AddStack(sim) - - spell.WaitTravelTime(sim, func(sim *core.Simulation) { - spell.DealDamage(sim, result) - }) - }, - }) -} diff --git a/sim/mage/counterspell.go b/sim/mage/counterspell.go index 0c59adb32..1d1ec34b1 100644 --- a/sim/mage/counterspell.go +++ b/sim/mage/counterspell.go @@ -7,6 +7,7 @@ import ( ) // This exists purely so that it can be used to extend the arcane buff from the mage T1 4pc +// Not relevant in classic currently but will keep func (mage *Mage) registerCounterspellSpell() { mage.RegisterSpell(core.SpellConfig{ ActionID: core.ActionID{SpellID: 2139}, diff --git a/sim/mage/deep_freeze.go b/sim/mage/deep_freeze.go deleted file mode 100644 index 1261e2559..000000000 --- a/sim/mage/deep_freeze.go +++ /dev/null @@ -1,56 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (mage *Mage) registerDeepFreezeSpell() { - if !mage.HasRune(proto.MageRune_RuneHelmDeepFreeze) { - return - } - - baseDamageLow := mage.baseRuneAbilityDamage() * 4.62 - baseDamageHigh := mage.baseRuneAbilityDamage() * 5.38 - spellCoeff := 2.5 - cooldown := time.Second * 30 - manaCost := .12 - - hasFingersOfFrostRune := mage.HasRune(proto.MageRune_RuneChestFingersOfFrost) - - mage.DeepFreeze = mage.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneHelmDeepFreeze)}, - SpellSchool: core.SpellSchoolFrost, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: mage.NewTimer(), - Duration: cooldown, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) - spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - }, - - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - return hasFingersOfFrostRune && mage.FingersOfFrostAura.IsActive() - }, - }) -} diff --git a/sim/mage/fire_blast.go b/sim/mage/fire_blast.go index 9ffa6bbcc..302f61775 100644 --- a/sim/mage/fire_blast.go +++ b/sim/mage/fire_blast.go @@ -4,7 +4,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const FireBlastRanks = 7 @@ -29,7 +28,6 @@ func (mage *Mage) registerFireBlastSpell() { } func (mage *Mage) newFireBlastSpellConfig(rank int, cdTimer *core.Timer) core.SpellConfig { - hasOverheatRune := mage.HasRune(proto.MageRune_RuneCloakOverheat) spellId := FireBlastSpellId[rank] baseDamageLow := FireBlastBaseDamage[rank][0] @@ -40,11 +38,6 @@ func (mage *Mage) newFireBlastSpellConfig(rank int, cdTimer *core.Timer) core.Sp cooldown := time.Second * 8 flags := SpellFlagMage | core.SpellFlagAPL - if hasOverheatRune { - cooldown = time.Second * 15 - flags |= core.SpellFlagCastTimeNoGCD | core.SpellFlagCastWhileCasting - } - gcd := core.TernaryDuration(hasOverheatRune, 0, core.GCDDefault) return core.SpellConfig{ ActionID: core.ActionID{SpellID: spellId}, @@ -62,7 +55,7 @@ func (mage *Mage) newFireBlastSpellConfig(rank int, cdTimer *core.Timer) core.Sp }, Cast: core.CastConfig{ DefaultCast: core.Cast{ - GCD: gcd, + GCD: core.GCDDefault, }, CD: core.Cooldown{ Timer: cdTimer, @@ -70,15 +63,15 @@ func (mage *Mage) newFireBlastSpellConfig(rank int, cdTimer *core.Timer) core.Sp }, }, - BonusCritRating: core.TernaryFloat64(hasOverheatRune, 100, 2*float64(mage.Talents.Incinerate)) * core.SpellCritRatingPerCritChance, + BonusCritRating: 2 * float64(mage.Talents.Incinerate) * core.SpellCritRatingPerCritChance, DamageMultiplier: 1, ThreatMultiplier: 1, BonusCoefficient: spellCoeff, ExpectedInitialDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, _ bool) *core.SpellResult { - baseDamageCacl := (baseDamageLow + baseDamageHigh) / 2 - return spell.CalcDamage(sim, target, baseDamageCacl, spell.OutcomeExpectedMagicHitAndCrit) + baseDamageCalc := (baseDamageLow + baseDamageHigh) / 2 + return spell.CalcDamage(sim, target, baseDamageCalc, spell.OutcomeExpectedMagicHitAndCrit) }, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) diff --git a/sim/mage/fireball.go b/sim/mage/fireball.go index 506950d9b..42ef8da50 100644 --- a/sim/mage/fireball.go +++ b/sim/mage/fireball.go @@ -75,7 +75,7 @@ func (mage *Mage) newFireballSpellConfig(rank int) core.SpellConfig { NumberOfTicks: numTicks, TickLength: tickLength, OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, baseDotDamage+mage.BonusFireballDoTAmount, isRollover) + dot.Snapshot(target, baseDotDamage, isRollover) }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) @@ -87,7 +87,6 @@ func (mage *Mage) newFireballSpellConfig(rank int) core.SpellConfig { BonusCoefficient: spellCoeff, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - mage.BonusFireballDoTAmount = 0 baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) spell.WaitTravelTime(sim, func(sim *core.Simulation) { diff --git a/sim/mage/frostfire_bolt.go b/sim/mage/frostfire_bolt.go deleted file mode 100644 index 7d9d83992..000000000 --- a/sim/mage/frostfire_bolt.go +++ /dev/null @@ -1,78 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (mage *Mage) registerFrostfireBoltSpell() { - if !mage.HasRune(proto.MageRune_RuneBeltFrostfireBolt) { - return - } - - actionID := core.ActionID{SpellID: int32(proto.MageRune_RuneBeltFrostfireBolt)} - baseDamageLow := mage.baseRuneAbilityDamage() * 3.25 - baseDamageHigh := mage.baseRuneAbilityDamage() * 3.79 - baseDotDamage := mage.baseRuneAbilityDamage() * 0.08 - spellCoeff := 1.0 - castTime := time.Second * 3 - manaCost := .14 - - numTicks := int32(3) + mage.Talents.Permafrost/3 - tickLength := time.Second * 3 - - mage.FrostfireBolt = mage.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellCode: SpellCode_MageFrostfireBolt, - SpellSchool: core.SpellSchoolFrost | core.SpellSchoolFire, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | SpellFlagChillSpell | core.SpellFlagBinary | core.SpellFlagAPL, - MissileSpeed: 28, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - CastTime: castTime, - GCD: core.GCDDefault, - }, - }, - - Dot: core.DotConfig{ - Aura: core.Aura{ - Label: "Frostfire Bolt", - ActionID: actionID.WithTag(1), - }, - NumberOfTicks: numTicks, - TickLength: tickLength, - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, baseDotDamage, isRollover) - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - - spell.WaitTravelTime(sim, func(sim *core.Simulation) { - spell.DealDamage(sim, result) - - if result.Landed() { - spell.Dot(target).Apply(sim) - } - }) - }, - }) -} diff --git a/sim/mage/frozen_orb.go b/sim/mage/frozen_orb.go deleted file mode 100644 index 6a1e10b70..000000000 --- a/sim/mage/frozen_orb.go +++ /dev/null @@ -1,159 +0,0 @@ -package mage - -import ( - "fmt" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (mage *Mage) registerFrozenOrbCD() { - if !mage.HasRune(proto.MageRune_RuneCloakFrozenOrb) { - return - } - - cooldown := time.Minute - manaCost := 0.11 - - mage.FrozenOrb = mage.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_MageFrozenOrb, - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneCloakFrozenOrb)}, - SpellSchool: core.SpellSchoolFrost, - ProcMask: core.ProcMaskEmpty, - Flags: core.SpellFlagAPL, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: mage.NewTimer(), - Duration: cooldown, - }, - }, - - ApplyEffects: func(sim *core.Simulation, _ *core.Unit, _ *core.Spell) { - for _, orb := range mage.frozenOrbPets { - if !orb.IsActive() { - orb.EnableWithTimeout(sim, orb, time.Second*15) - break - } - } - }, - }) - - mage.AddMajorCooldown(core.MajorCooldown{ - Spell: mage.FrozenOrb, - Type: core.CooldownTypeDPS, - }) -} - -type FrozenOrb struct { - core.Pet - - mage *Mage - - FrozenOrbTick *core.Spell - FrozenOrbFingerOfFrost *core.Aura - TickCount int64 -} - -func (mage *Mage) NewFrozenOrbPets() []*FrozenOrb { - // It's possible to have up to 2 Frozen Orbs active at a time because of Cold Snap - return []*FrozenOrb{mage.newFrozenOrb(1), mage.newFrozenOrb(2)} -} - -func (mage *Mage) newFrozenOrb(idx int32) *FrozenOrb { - frozenOrb := &FrozenOrb{ - Pet: core.NewPet(fmt.Sprintf("Frozen Orb %d", idx), &mage.Character, frozenOrbBaseStats, frozenOrbStatInheritance(), false, true), - mage: mage, - TickCount: 0, - } - - mage.AddPet(frozenOrb) - - return frozenOrb -} - -func (orb *FrozenOrb) GetPet() *core.Pet { - return &orb.Pet -} - -func (orb *FrozenOrb) Initialize() { - orb.registerFrozenOrbTickSpell() - - // Frozen Orb seems to benefit from Frost Specialization - orb.PseudoStats.SchoolBonusHitChance = orb.mage.PseudoStats.SchoolBonusHitChance -} - -func (orb *FrozenOrb) Reset(_ *core.Simulation) { -} - -func (orb *FrozenOrb) ExecuteCustomRotation(sim *core.Simulation) { - if success := orb.FrozenOrbTick.Cast(sim, orb.mage.CurrentTarget); !success { - orb.Disable(sim) - } -} - -var frozenOrbBaseStats = stats.Stats{} - -func frozenOrbStatInheritance() core.PetStatInheritance { - return func(ownerStats stats.Stats) stats.Stats { - return stats.Stats{ - stats.SpellHit: ownerStats[stats.SpellHit], - stats.SpellCrit: ownerStats[stats.SpellCrit], - stats.SpellPower: ownerStats[stats.SpellPower], - } - } -} - -func (orb *FrozenOrb) registerFrozenOrbTickSpell() { - hasFOFRune := orb.mage.HasRune(proto.MageRune_RuneChestFingersOfFrost) - baseDamage := orb.mage.baseRuneAbilityDamage() * 0.9 - spellCoef := .129 - - orb.FrozenOrbTick = orb.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 440809}, - SpellSchool: core.SpellSchoolFrost | core.SpellSchoolArcane, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | SpellFlagChillSpell, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second, - }, - }, - - BonusCoefficient: spellCoef, - DamageMultiplier: 1, - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - for _, aoeTarget := range sim.Encounter.TargetUnits { - spell.CalcAndDealDamage(sim, aoeTarget, baseDamage, spell.OutcomeMagicHitAndCrit) - } - orb.TickCount += 1 - if orb.TickCount == 15 { - orb.TickCount = 0 - } - }, - }) - - if hasFOFRune { - orb.FrozenOrbFingerOfFrost = core.MakePermanent(orb.RegisterAura(core.Aura{ - Label: "Frozen Orb FoF", - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell == orb.FrozenOrbTick && orb.TickCount == 0 { - orb.mage.FingersOfFrostAura.Activate(sim) - orb.mage.FingersOfFrostAura.AddStack(sim) - } - }, - })) - } -} diff --git a/sim/mage/ice_barrier.go b/sim/mage/ice_barrier.go index 09f7d2b90..c75a19485 100644 --- a/sim/mage/ice_barrier.go +++ b/sim/mage/ice_barrier.go @@ -40,10 +40,10 @@ func (mage *Mage) newIceBarrierSpellConfig(rank int, cdTimer *core.Timer) core.S Label: fmt.Sprintf("Ice Barrier (Rank %d)", rank), Duration: time.Minute, OnGain: func(aura *core.Aura, sim *core.Simulation) { - // Dummy + // Dummy, needs shield implementation }, OnExpire: func(aura *core.Aura, sim *core.Simulation) { - // Dummy + // Dummy, needs shield implementation }, }) diff --git a/sim/mage/ice_lance.go b/sim/mage/ice_lance.go deleted file mode 100644 index 2ffbaf9fc..000000000 --- a/sim/mage/ice_lance.go +++ /dev/null @@ -1,57 +0,0 @@ -package mage - -import ( - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -// TODO: Classic review ice lance numbers on live -func (mage *Mage) registerIceLanceSpell() { - if !mage.HasRune(proto.MageRune_RuneHandsIceLance) { - return - } - - baseDamageLow := mage.baseRuneAbilityDamage() * .55 - baseDamageHigh := mage.baseRuneAbilityDamage() * .65 - spellCoeff := .143 - manaCost := .08 - - hasFingersOfFrostRune := mage.HasRune(proto.MageRune_RuneChestFingersOfFrost) - - mage.IceLance = mage.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneHandsIceLance)}, - SpellSchool: core.SpellSchoolFrost, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL, - MissileSpeed: 38, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) - - oldMultiplier := spell.DamageMultiplier - if hasFingersOfFrostRune && mage.FingersOfFrostAura.IsActive() { - spell.DamageMultiplier *= 3.0 - } - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - spell.DamageMultiplier = oldMultiplier - - spell.WaitTravelTime(sim, func(sim *core.Simulation) { - spell.DealDamage(sim, result) - }) - }, - }) -} diff --git a/sim/mage/icy_veins.go b/sim/mage/icy_veins.go deleted file mode 100644 index c8c8bb849..000000000 --- a/sim/mage/icy_veins.go +++ /dev/null @@ -1,60 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (mage *Mage) registerIcyVeinsSpell() { - if !mage.HasRune(proto.MageRune_RuneLegsIceVeins) { - return - } - - actionID := core.ActionID{SpellID: int32(proto.MageRune_RuneLegsIceVeins)} - castSpeedMultiplier := 1.2 - manaCost := .03 - duration := time.Second * 20 - cooldown := time.Minute * 3 - - icyVeinsAura := mage.RegisterAura(core.Aura{ - Label: "Icy Veins", - ActionID: actionID, - Duration: duration, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.MultiplyCastSpeed(castSpeedMultiplier) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.MultiplyCastSpeed(1 / castSpeedMultiplier) - }, - }) - - mage.IcyVeins = mage.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolFrost, - Flags: core.SpellFlagNoOnCastComplete, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - CD: core.Cooldown{ - Timer: mage.NewTimer(), - Duration: cooldown, - }, - }, - ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { - // Need to check for icy veins already active in case Cold Snap is used right after. - return !icyVeinsAura.IsActive() - }, - ApplyEffects: func(sim *core.Simulation, _ *core.Unit, _ *core.Spell) { - icyVeinsAura.Activate(sim) - }, - }) - - mage.AddMajorCooldown(core.MajorCooldown{ - Spell: mage.IcyVeins, - Type: core.CooldownTypeDPS, - }) -} diff --git a/sim/mage/ignite.go b/sim/mage/ignite.go index 8d2a0d131..2bde93841 100644 --- a/sim/mage/ignite.go +++ b/sim/mage/ignite.go @@ -14,6 +14,7 @@ func (mage *Mage) applyIgnite() { if mage.Talents.Ignite == 0 { return } + newIgniteDamage := 0.0 mage.RegisterAura(core.Aura{ Label: "Ignite Talent", @@ -26,16 +27,13 @@ func (mage *Mage) applyIgnite() { return } if spell.SpellSchool.Matches(core.SpellSchoolFire) && result.DidCrit() { - mage.procIgnite(sim, result) - } - }, - // TODO: Classic verify mechanics match for rune based Living Bomb - OnPeriodicDamageDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if !spell.ProcMask.Matches(core.ProcMaskSpellDamage) { - return - } - if mage.LivingBomb != nil && result.DidCrit() { - mage.procIgnite(sim, result) + newIgniteDamage = result.Damage * 0.08 * float64(mage.Talents.Ignite) + dot := mage.Ignite.Dot(result.Target) + dot.ApplyOrRefresh(sim) + if dot.GetStacks() < dot.MaxStacks{ + dot.AddStack(sim) + dot.TakeSnapshot(sim, true) + } } }, }) @@ -58,27 +56,29 @@ func (mage *Mage) applyIgnite() { Dot: core.DotConfig{ Aura: core.Aura{ Label: "Ignite", + MaxStacks: 5, + Duration: time.Second * 4, }, NumberOfTicks: IgniteTicks, TickLength: time.Second * 2, + + OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, applyStack bool) { + if !applyStack { + return + } + + // only the first stack snapshots the multiplier + if dot.GetStacks() == 1 { + attackTable := dot.Spell.Unit.AttackTables[target.UnitIndex][dot.Spell.CastType] + dot.SnapshotAttackerMultiplier = dot.Spell.AttackerDamageMultiplier(attackTable) + dot.SnapshotBaseDamage = newIgniteDamage + } else { + dot.SnapshotBaseDamage += newIgniteDamage + } + }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) }, }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - spell.Dot(target).ApplyOrReset(sim) - }, }) -} - -func (mage *Mage) procIgnite(sim *core.Simulation, result *core.SpellResult) { - dot := mage.Ignite.Dot(result.Target) - - newDamage := result.Damage * 0.08 * float64(mage.Talents.Ignite) - outstandingDamage := core.TernaryFloat64(dot.IsActive(), dot.SnapshotBaseDamage*float64(dot.NumberOfTicks-dot.TickCount), 0) - - dot.Snapshot(result.Target, (outstandingDamage+newDamage)/float64(IgniteTicks), false) - - mage.Ignite.Cast(sim, result.Target) -} +} \ No newline at end of file diff --git a/sim/mage/living_bomb.go b/sim/mage/living_bomb.go deleted file mode 100644 index 05ca0690e..000000000 --- a/sim/mage/living_bomb.go +++ /dev/null @@ -1,93 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -// TODO: Classic verify numbers such as aoe caps and base damage -// https://www.wowhead.com/classic/news/patch-1-15-build-52124-ptr-datamining-season-of-discovery-runes-336044#news-post-336044 -// https://www.wowhead.com/classic/spell=400614/living-bomb -// https://www.wowhead.com/classic/spell=400613/living-bomb -func (mage *Mage) registerLivingBombSpell() { - if !mage.HasRune(proto.MageRune_RuneHandsLivingBomb) { - return - } - - actionID := core.ActionID{SpellID: int32(proto.MageRune_RuneHandsLivingBomb)} - baseDotDamage := mage.baseRuneAbilityDamage() * .85 - baseExplosionDamage := mage.baseRuneAbilityDamage() * 1.71 - dotCoeff := .20 - explosionCoeff := .40 - manaCost := .22 - - ticks := int32(4) - tickLength := time.Second * 3 - - livingBombExplosionSpell := mage.RegisterSpell(core.SpellConfig{ - ActionID: actionID.WithTag(1), - SpellCode: SpellCode_MageLivingBombExplosion, - SpellSchool: core.SpellSchoolFire, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagPassiveSpell, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: explosionCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - spell.CalcAndDealDamage(sim, target, baseExplosionDamage, spell.OutcomeMagicCrit) - }, - }) - - mage.LivingBomb = mage.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolFire, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL | core.SpellFlagPureDot, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - - Dot: core.DotConfig{ - Aura: core.Aura{ - Label: "Living Bomb (DoT)", - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - for _, aoeTarget := range sim.Encounter.TargetUnits { - livingBombExplosionSpell.Cast(sim, aoeTarget) - } - }, - }, - - NumberOfTicks: ticks, - TickLength: tickLength, - BonusCoefficient: dotCoeff, - - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, baseDotDamage, isRollover) - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - result := spell.CalcAndDealOutcome(sim, target, spell.OutcomeMagicHitNoHitCounter) - if result.Landed() { - spell.Dot(target).Apply(sim) - } - }, - }) -} diff --git a/sim/mage/living_flame.go b/sim/mage/living_flame.go deleted file mode 100644 index 4b9d1ba19..000000000 --- a/sim/mage/living_flame.go +++ /dev/null @@ -1,92 +0,0 @@ -package mage - -import ( - "math" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -// TODO: Classic verify numbers / snapshot / travel time -// https://www.wowhead.com/classic/news/patch-1-15-build-52124-ptr-datamining-season-of-discovery-runes-336044#news-post-336044 -// https://www.wowhead.com/classic/spell=401558/living-flame -func (mage *Mage) registerLivingFlameSpell() { - if !mage.HasRune(proto.MageRune_RuneLegsLivingFlame) { - return - } - - baseDamage := mage.baseRuneAbilityDamage() * 1 - spellCoeff := .143 - manaCost := .11 - cooldown := time.Second * 30 - - ticks := int32(10) - tickLength := time.Second * 1 - - hasArcaneBlastRune := mage.HasRune(proto.MageRune_RuneHandsArcaneBlast) - - mage.LivingFlame = mage.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneLegsLivingFlame)}, - SpellCode: SpellCode_MageLivingFlame, - SpellSchool: core.SpellSchoolArcane | core.SpellSchoolFire, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | core.SpellFlagAPL | core.SpellFlagPureDot, - MissileSpeed: 6.02, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: mage.NewTimer(), - Duration: cooldown, - }, - }, - - // Not affected by hit - DamageMultiplier: 1, - ThreatMultiplier: 1, - - Dot: core.DotConfig{ - Aura: core.Aura{ - Label: "Living Flame", - }, - - NumberOfTicks: ticks, - TickLength: tickLength, - BonusCoefficient: spellCoeff, - - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, baseDamage, isRollover) - - // We have to deactivate AB here because otherwise the stacks are removed before the snapshot is calculated - if hasArcaneBlastRune && mage.ArcaneBlastAura.IsActive() { - mage.ArcaneBlastAura.Deactivate(sim) - } - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - for _, aoeTarget := range sim.Encounter.TargetUnits { - dot.CalcAndDealPeriodicSnapshotDamage(sim, aoeTarget, dot.OutcomeTick) - } - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - dot := spell.Dot(target) - // Ticks lost to travel time - dot.NumberOfTicks = ticks - int32(math.Floor(spell.TravelTime().Seconds())) - spell.WaitTravelTime(sim, func(sim *core.Simulation) { - dot.Apply(sim) - }) - }, - }) - - mage.AddMajorCooldown(core.MajorCooldown{ - Spell: mage.LivingFlame, - Type: core.CooldownTypeDPS, - }) -} diff --git a/sim/mage/mage.go b/sim/mage/mage.go index 9d75ffe68..312c092da 100644 --- a/sim/mage/mage.go +++ b/sim/mage/mage.go @@ -14,25 +14,15 @@ const ( const ( SpellCode_MageNone int32 = iota - SpellCode_MageArcaneBarrage - SpellCode_MageArcaneBlast SpellCode_MageArcaneExplosion SpellCode_MageArcaneMissiles SpellCode_MageArcaneMissilesTick - SpellCode_MageArcaneSurge - SpellCode_MageBalefireBolt SpellCode_MageBlastWave SpellCode_MageFireball SpellCode_MageFireBlast SpellCode_MageFrostbolt - SpellCode_MageFrostfireBolt - SpellCode_MageFrozenOrb SpellCode_MageIgnite - SpellCode_MageLivingBomb - SpellCode_MageLivingBombExplosion - SpellCode_MageLivingFlame SpellCode_MageScorch - SpellCode_MageSpellfrostBolt ) var TalentTreeSizes = [3]int{16, 16, 17} @@ -61,59 +51,30 @@ type Mage struct { Options *proto.Mage_Options activeBarrier *core.Aura - frozenOrbPets []*FrozenOrb - ArcaneBarrage *core.Spell - ArcaneBlast *core.Spell ArcaneExplosion []*core.Spell ArcaneMissiles []*core.Spell ArcaneMissilesTickSpell []*core.Spell - ArcaneSurge *core.Spell - BalefireBolt *core.Spell BlastWave []*core.Spell Blizzard []*core.Spell - DeepFreeze *core.Spell Fireball []*core.Spell FireBlast []*core.Spell Flamestrike []*core.Spell Frostbolt []*core.Spell - FrostfireBolt *core.Spell - FrozenOrb *core.Spell IceBarrier []*core.Spell - IceLance *core.Spell Ignite *core.Spell - LivingBomb *core.Spell - LivingFlame *core.Spell ManaGem []*core.Spell PresenceOfMind *core.Spell Pyroblast []*core.Spell Scorch []*core.Spell - SpellfrostBolt *core.Spell - IcyVeins *core.Spell - - ArcaneBlastAura *core.Aura - ArcanePotencyAura *core.Aura ArcanePowerAura *core.Aura ClearcastingAura *core.Aura CombustionAura *core.Aura - FingersOfFrostAura *core.Aura - HotStreakAura *core.Aura IceArmorAura *core.Aura IceBarrierAuras []*core.Aura ImprovedScorchAuras core.AuraArray MageArmorAura *core.Aura - MissileBarrageAura *core.Aura - MoltenArmorAura *core.Aura - - ArcaneBlastMissileBarrageChance float64 - BonusFireballDoTAmount float64 - FingersOfFrostProcChance float64 - - // Variables for telling the mage to try to maintain the Fireball DoT with T2 Fire 6pc - ArcaneBlastDamageMultiplier float64 - FireballMissileActive bool // Whether Fireball has been cast but has not hit to avoid chain-casting - MaintainFireballDoT bool } // Agent is a generic way to access underlying mage on any of the agents. @@ -154,10 +115,6 @@ func (mage *Mage) Initialize() { } func (mage *Mage) Reset(sim *core.Simulation) { - mage.BonusFireballDoTAmount = 0 - for _, orb := range mage.frozenOrbPets { - orb.TickCount = 0 - } } func NewMage(character *core.Character, options *proto.Player) *Mage { @@ -175,26 +132,11 @@ func NewMage(character *core.Character, options *proto.Player) *Mage { mage.AddStatDependency(stats.Strength, stats.AttackPower, core.APPerStrength[character.Class]) mage.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[mage.Class][int(mage.Level)]*core.SpellCritRatingPerCritChance) - switch mage.Consumes.MageScroll { - case proto.MageScroll_MageScrollArcaneRecovery: - mage.AddStat(stats.MP5, 8) - case proto.MageScroll_MageScrollArcaneAccuracy: - mage.AddStat(stats.SpellHit, core.SpellHitRatingPerHitChance) - case proto.MageScroll_MageScrollArcanePower: - mage.AddStat(stats.SpellCrit, core.SpellCritRatingPerCritChance) - case proto.MageScroll_MageScrollFireProtection: - mage.AddStat(stats.FireResistance, 20) - case proto.MageScroll_MageScrollFrostProtection: - mage.AddStat(stats.FrostResistance, 20) - } - switch mage.Options.Armor { case proto.Mage_Options_IceArmor: mage.applyFrostIceArmor() case proto.Mage_Options_MageArmor: mage.applyMageArmor() - case proto.Mage_Options_MoltenArmor: - mage.applyMoltenArmor() } // Set mana regen to 12.5 + Spirit/4 each 2s tick @@ -202,19 +144,7 @@ func NewMage(character *core.Character, options *proto.Player) *Mage { return 6.25 + mage.GetStat(stats.Spirit)/8 } - if mage.HasRune(proto.MageRune_RuneCloakFrozenOrb) { - mage.frozenOrbPets = mage.NewFrozenOrbPets() - } - guardians.ConstructGuardians(&mage.Character) return mage } - -func (mage *Mage) HasRune(rune proto.MageRune) bool { - return false // mage.HasRuneById(int32(rune)) -} - -func (mage *Mage) baseRuneAbilityDamage() float64 { - return 13.828124 + 0.018012*float64(mage.Level) + 0.044141*float64(mage.Level*mage.Level) -} diff --git a/sim/mage/pyroblast.go b/sim/mage/pyroblast.go index 54a710bb2..22c5c49bf 100644 --- a/sim/mage/pyroblast.go +++ b/sim/mage/pyroblast.go @@ -5,7 +5,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const PyroblastRanks = 8 @@ -33,7 +32,6 @@ func (mage *Mage) registerPyroblastSpell() { } func (mage *Mage) newPyroblastSpellConfig(rank int) core.SpellConfig { - hasHotStreakRune := mage.HasRune(proto.MageRune_RuneHelmHotStreak) numTicks := int32(4) tickLength := time.Second * 3 @@ -96,10 +94,6 @@ func (mage *Mage) newPyroblastSpellConfig(rank int) core.SpellConfig { baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - if hasHotStreakRune && mage.HotStreakAura.IsActive() { - mage.HotStreakAura.Deactivate(sim) - } - spell.WaitTravelTime(sim, func(sim *core.Simulation) { spell.DealDamage(sim, result) diff --git a/sim/mage/runes.go b/sim/mage/runes.go deleted file mode 100644 index 9d5a713a0..000000000 --- a/sim/mage/runes.go +++ /dev/null @@ -1,422 +0,0 @@ -package mage - -import ( - "slices" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (mage *Mage) ApplyRunes() { - // Helm - mage.registerDeepFreezeSpell() - - // CLoak - mage.registerArcaneBarrageSpell() - // mage.applyOverheat() - mage.registerFrozenOrbCD() - - // Chest - mage.applyBurnout() - mage.applyEnlightenment() - mage.applyFingersOfFrost() - - // Bracers - mage.registerBalefireBoltSpell() - - // Hands - mage.registerArcaneBlastSpell() - mage.registerIceLanceSpell() - mage.registerLivingBombSpell() - - // Waist - mage.registerFrostfireBoltSpell() - mage.applyHotStreak() - mage.applyMissileBarrage() - mage.registerSpellfrostBoltSpell() - - // Legs - mage.registerArcaneSurgeSpell() - mage.registerIcyVeinsSpell() - mage.registerLivingFlameSpell() - - // Feet - mage.applyBrainFreeze() - mage.applySpellPower() -} - -func (mage *Mage) applyBurnout() { - if !mage.HasRune(proto.MageRune_RuneChestBurnout) { - return - } - - actionID := core.ActionID{SpellID: int32(proto.MageRune_RuneChestBurnout)} - metric := mage.NewManaMetrics(actionID) - - mage.AddStat(stats.SpellCrit, 15*core.SpellCritRatingPerCritChance) - - mage.RegisterAura(core.Aura{ - Label: "Burnout", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if !spell.Flags.Matches(SpellFlagMage) && !result.DidCrit() { - return - } - aura.Unit.SpendMana(sim, aura.Unit.BaseMana*0.01, metric) - }, - }) -} - -func (mage *Mage) applyEnlightenment() { - if !mage.HasRune(proto.MageRune_RuneChestEnlightenment) { - return - } - - damageAuraThreshold := .70 - manaAuraThreshold := .30 - - // https://www.wowhead.com/classic/spell=412326/enlightenment - damageAura := mage.RegisterAura(core.Aura{ - Label: "Enlightenment (Damage)", - ActionID: core.ActionID{SpellID: 412326}, - Duration: core.NeverExpires, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.DamageDealtMultiplier *= 1.1 - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.DamageDealtMultiplier /= 1.1 - }, - }) - - // https://www.wowhead.com/classic/spell=412325/enlightenment - manaAura := mage.RegisterAura(core.Aura{ - Label: "Enlightenment (Mana)", - ActionID: core.ActionID{SpellID: 412325}, - Duration: core.NeverExpires, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.SpiritRegenRateCasting += 0.10 - mage.UpdateManaRegenRates() - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.SpiritRegenRateCasting -= .10 - mage.UpdateManaRegenRates() - }, - }) - - mage.RegisterAura(core.Aura{ - Label: "Enlightenment", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - damageAura.Activate(sim) - }, - OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { - percentMana := aura.Unit.CurrentManaPercent() - - if percentMana > damageAuraThreshold && !damageAura.IsActive() { - damageAura.Activate(sim) - } else if percentMana <= damageAuraThreshold { - damageAura.Deactivate(sim) - } - - if percentMana < manaAuraThreshold && !manaAura.IsActive() { - manaAura.Activate(sim) - } else if percentMana >= manaAuraThreshold { - manaAura.Deactivate(sim) - } - }, - }) -} - -func (mage *Mage) applyFingersOfFrost() { - if !mage.HasRune(proto.MageRune_RuneChestFingersOfFrost) { - return - } - - mage.FingersOfFrostProcChance += 0.15 - bonusCrit := 10 * float64(mage.Talents.Shatter) * core.SpellCritRatingPerCritChance - - mage.FingersOfFrostAura = mage.RegisterAura(core.Aura{ - Label: "Fingers of Frost Proc", - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneChestFingersOfFrost)}, - Duration: time.Second * 15, - MaxStacks: 2, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - mage.AddStatDynamic(sim, stats.SpellCrit, bonusCrit) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - mage.AddStatDynamic(sim, stats.SpellCrit, -bonusCrit) - }, - OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { - // OnCastComplete is called after OnSpellHitDealt / etc, so don't deactivate if it was just activated. - if aura.RemainingDuration(sim) == aura.Duration { - return - } - - if !spell.ProcMask.Matches(core.ProcMaskSpellDamage) || !spell.SpellSchool.Matches(core.SpellSchoolFrost) { - return - } - - if aura.GetStacks() == 1 { - // Brain freeze can be batched with 2x FFBs into Deep Freeze - core.StartDelayedAction(sim, core.DelayedActionOptions{ - DoAt: sim.CurrentTime + core.SpellBatchWindow, - OnAction: func(sim *core.Simulation) { - if aura.IsActive() { - aura.RemoveStack(sim) - } - }, - }) - } else { - aura.RemoveStack(sim) - } - }, - }) - - mage.RegisterAura(core.Aura{ - Label: "Fingers of Frost Trigger", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell.Flags.Matches(SpellFlagChillSpell) && sim.RandomFloat("Fingers of Frost") < mage.FingersOfFrostProcChance { - mage.FingersOfFrostAura.Activate(sim) - mage.FingersOfFrostAura.SetStacks(sim, 2) - } - }, - }) -} - -func (mage *Mage) applyHotStreak() { - if !mage.HasRune(proto.MageRune_RuneHelmHotStreak) { - return - } - - actionID := core.ActionID{SpellID: 48108} - - pyroblastSpells := []*core.Spell{} - triggerSpellCodes := []int32{SpellCode_MageFireball, SpellCode_MageFrostfireBolt, SpellCode_MageBalefireBolt, SpellCode_MageFireBlast, SpellCode_MageScorch, SpellCode_MageLivingBombExplosion} - - mage.HotStreakAura = mage.RegisterAura(core.Aura{ - Label: "Hot Streak", - ActionID: actionID, - Duration: time.Second * 10, - OnInit: func(aura *core.Aura, sim *core.Simulation) { - pyroblastSpells = core.FilterSlice(mage.Pyroblast, func(spell *core.Spell) bool { return spell != nil }) - }, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - core.Each(pyroblastSpells, func(spell *core.Spell) { - spell.CastTimeMultiplier -= 1 - spell.Cost.Multiplier -= 100 - }) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - core.Each(pyroblastSpells, func(spell *core.Spell) { - spell.CastTimeMultiplier += 1 - spell.Cost.Multiplier += 100 - }) - }, - }) - - heatingUpAura := mage.RegisterAura(core.Aura{ - Label: "Heating Up", - ActionID: actionID.WithTag(1), - Duration: time.Hour, - }) - - mage.RegisterAura(core.Aura{ - Label: "Hot Streak Trigger", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if !slices.Contains(triggerSpellCodes, spell.SpellCode) { - return - } - - if !result.DidCrit() { - if heatingUpAura.IsActive() { - heatingUpAura.Deactivate(sim) - } - - return - } - - if heatingUpAura.IsActive() { - heatingUpAura.Deactivate(sim) - mage.HotStreakAura.Activate(sim) - } else if mage.HotStreakAura.IsActive() { - // When batching a Scorch crit into an instant Pyro, the Pyro consumes Hot Streak before the Scorch hits, so the Scorch re-applies Heating Up - // We can replicate this by adding a 1ms delay then checking the state of the auras again. - core.StartDelayedAction(sim, core.DelayedActionOptions{ - DoAt: sim.CurrentTime + core.SpellBatchWindow, - OnAction: func(sim *core.Simulation) { - if heatingUpAura.IsActive() { - heatingUpAura.Deactivate(sim) - mage.HotStreakAura.Activate(sim) - } else if !mage.HotStreakAura.IsActive() { - heatingUpAura.Activate(sim) - } - }, - }) - } else { - heatingUpAura.Activate(sim) - } - }, - }) -} - -func (mage *Mage) applyMissileBarrage() { - if !mage.HasRune(proto.MageRune_RuneBeltMissileBarrage) { - return - } - - procChance := .20 - mage.ArcaneBlastMissileBarrageChance = .40 - buffDuration := time.Second * 15 - - arcaneMissilesSpells := []*core.Spell{} - affectedSpellCodes := []int32{SpellCode_MageArcaneBarrage, SpellCode_MageArcaneBlast, SpellCode_MageFireball, SpellCode_MageFrostbolt} - - mage.MissileBarrageAura = mage.RegisterAura(core.Aura{ - Label: "Missile Barrage", - ActionID: core.ActionID{SpellID: 400589}, - Duration: buffDuration, - OnInit: func(aura *core.Aura, sim *core.Simulation) { - arcaneMissilesSpells = core.FilterSlice(mage.ArcaneMissiles, func(spell *core.Spell) bool { return spell != nil }) - }, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - core.Each(arcaneMissilesSpells, func(spell *core.Spell) { - spell.Cost.Multiplier -= 10000 - for _, target := range sim.Encounter.TargetUnits { - spell.Dot(target).TickLength /= 2 - } - }) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - core.Each(arcaneMissilesSpells, func(spell *core.Spell) { - spell.Cost.Multiplier += 10000 - for _, target := range sim.Encounter.TargetUnits { - spell.Dot(target).TickLength *= 2 - } - }) - }, - }) - - mage.RegisterAura(core.Aura{ - Label: "Missile Barrage Talent", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { - if !slices.Contains(affectedSpellCodes, spell.SpellCode) { - return - } - - procChance := procChance - if spell.SpellCode == SpellCode_MageArcaneBlast { - procChance = mage.ArcaneBlastMissileBarrageChance - } - - if sim.RandomFloat("Missile Barrage") < procChance { - mage.MissileBarrageAura.Activate(sim) - } - }, - }) -} - -func (mage *Mage) applyBrainFreeze() { - if !mage.HasRune(proto.MageRune_RuneFeetBrainFreeze) { - return - } - - procChance := .20 - buffDuration := time.Second * 15 - - affectedSpells := []*core.Spell{} - triggerSpellCodes := []int32{SpellCode_MageFireball, SpellCode_MageFrostfireBolt, SpellCode_MageSpellfrostBolt, SpellCode_MageBalefireBolt} - - procAura := mage.RegisterAura(core.Aura{ - Label: "Brain Freeze", - ActionID: core.ActionID{SpellID: 400730}, - Duration: buffDuration, - OnInit: func(aura *core.Aura, sim *core.Simulation) { - affectedSpells = core.FilterSlice( - core.Flatten([][]*core.Spell{ - mage.Fireball, - {mage.FrostfireBolt}, - {mage.SpellfrostBolt}, - {mage.BalefireBolt}, - }), - func(spell *core.Spell) bool { return spell != nil }, - ) - }, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - core.Each(affectedSpells, func(spell *core.Spell) { - spell.CastTimeMultiplier -= 1 - spell.Cost.Multiplier -= 100 - }) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - core.Each(affectedSpells, func(spell *core.Spell) { - spell.CastTimeMultiplier += 1 - spell.Cost.Multiplier += 100 - }) - }, - OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { - // OnCastComplete is called after OnSpellHitDealt / etc, so don't deactivate if it was just activated. - if aura.RemainingDuration(sim) == aura.Duration { - return - } - - if slices.Contains(triggerSpellCodes, spell.SpellCode) && spell.CurCast.CastTime == 0 { - aura.Deactivate(sim) - } - }, - }) - - units := []*core.Unit{&mage.Unit} - // Can also proc from Frozen Orb hits - if mage.HasRune(proto.MageRune_RuneCloakFrozenOrb) { - units = append(units, core.MapSlice(mage.frozenOrbPets, func(orb *FrozenOrb) *core.Unit { return &orb.Unit })...) - } - - for _, unit := range units { - core.MakePermanent(unit.RegisterAura(core.Aura{ - Label: "Brain Freeze Trigger", - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell.Flags.Matches(SpellFlagChillSpell) && result.Landed() && sim.Proc(procChance, "Brain Freeze") { - procAura.Activate(sim) - } - }, - })) - } -} - -func (mage *Mage) applySpellPower() { - if !mage.HasRune(proto.MageRune_RuneFeetSpellPower) { - return - } - - units := []*core.Unit{&mage.Unit} - // Can also proc from Frozen Orb hits - if mage.HasRune(proto.MageRune_RuneCloakFrozenOrb) { - units = append(units, core.MapSlice(mage.frozenOrbPets, func(orb *FrozenOrb) *core.Unit { return &orb.Unit })...) - } - - for _, unit := range units { - unit.OnSpellRegistered(func(spell *core.Spell) { - if spell.Flags.Matches(SpellFlagMage) { - spell.CritDamageBonus += 0.5 - } - }) - } -} diff --git a/sim/mage/spellfrost_bolt.go b/sim/mage/spellfrost_bolt.go deleted file mode 100644 index cfcd49cc5..000000000 --- a/sim/mage/spellfrost_bolt.go +++ /dev/null @@ -1,54 +0,0 @@ -package mage - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (mage *Mage) registerSpellfrostBoltSpell() { - if !mage.HasRune(proto.MageRune_RuneBeltSpellfrostBolt) { - return - } - - baseDamageLow := mage.baseRuneAbilityDamage() * 3.04 - baseDamageHigh := mage.baseRuneAbilityDamage() * 3.55 - spellCoeff := .814 - castTime := time.Millisecond * 2500 - manaCost := .12 - - mage.SpellfrostBolt = mage.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.MageRune_RuneBeltSpellfrostBolt)}, - SpellCode: SpellCode_MageSpellfrostBolt, - SpellSchool: core.SpellSchoolArcane | core.SpellSchoolFrost, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagMage | SpellFlagChillSpell | core.SpellFlagBinary | core.SpellFlagAPL, - MissileSpeed: 28, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - CastTime: castTime, - GCD: core.GCDDefault, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - - spell.WaitTravelTime(sim, func(sim *core.Simulation) { - spell.DealDamage(sim, result) - }) - }, - }) -} diff --git a/sim/mage/talents.go b/sim/mage/talents.go index eb2214e8d..ba15bb390 100644 --- a/sim/mage/talents.go +++ b/sim/mage/talents.go @@ -5,7 +5,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" "github.com/wowsims/classic/sim/core/stats" ) @@ -20,13 +19,6 @@ func (mage *Mage) applyArcaneTalents() { mage.registerPresenceOfMindCD() mage.registerArcanePowerCD() - // For talents that benefit both the mage and frozen orbs - units := []*core.Unit{&mage.Unit} - // Frozen Orb also benefits - if mage.HasRune(proto.MageRune_RuneCloakFrozenOrb) { - units = append(units, core.MapSlice(mage.frozenOrbPets, func(orb *FrozenOrb) *core.Unit { return &orb.Unit })...) - } - // Arcane Subtlety if mage.Talents.ArcaneSubtlety > 0 { threatMultiplier := 1 - .20*float64(mage.Talents.ArcaneSubtlety) @@ -65,14 +57,12 @@ func (mage *Mage) applyArcaneTalents() { bonusDamageMultiplierAdditive := .01 * float64(mage.Talents.ArcaneInstability) bonusCritRating := 1 * float64(mage.Talents.ArcaneInstability) * core.SpellCritRatingPerCritChance - for _, unit := range units { - unit.OnSpellRegistered(func(spell *core.Spell) { - if spell.Flags.Matches(SpellFlagMage) { - spell.DamageMultiplierAdditive += bonusDamageMultiplierAdditive - spell.BonusCritRating += bonusCritRating - } - }) - } + mage.OnSpellRegistered(func(spell *core.Spell) { + if spell.Flags.Matches(SpellFlagMage) { + spell.DamageMultiplierAdditive += bonusDamageMultiplierAdditive + spell.BonusCritRating += bonusCritRating + } + }) } } @@ -120,50 +110,37 @@ func (mage *Mage) applyFrostTalents() { mage.registerIceBarrierSpell() mage.applyWintersChill() - // For talents that benefit both the mage and frozen orbs - units := []*core.Unit{&mage.Unit} - // Frozen Orb also benefits - if mage.HasRune(proto.MageRune_RuneCloakFrozenOrb) { - units = append(units, core.MapSlice(mage.frozenOrbPets, func(orb *FrozenOrb) *core.Unit { return &orb.Unit })...) - } - // Elemental Precision if mage.Talents.ElementalPrecision > 0 { bonusHit := 2 * float64(mage.Talents.ElementalPrecision) * core.SpellHitRatingPerHitChance - for _, unit := range units { - unit.OnSpellRegistered(func(spell *core.Spell) { - if spell.Flags.Matches(SpellFlagMage) && (spell.SpellSchool.Matches(core.SpellSchoolFire) || spell.SpellSchool.Matches(core.SpellSchoolFrost)) { - spell.BonusHitRating += bonusHit - } - }) - } + mage.OnSpellRegistered(func(spell *core.Spell) { + if spell.Flags.Matches(SpellFlagMage) && (spell.SpellSchool.Matches(core.SpellSchoolFire) || spell.SpellSchool.Matches(core.SpellSchoolFrost)) { + spell.BonusHitRating += bonusHit + } + }) } // Ice Shards if mage.Talents.IceShards > 0 { critBonus := .20 * float64(mage.Talents.IceShards) - for _, unit := range units { - unit.OnSpellRegistered(func(spell *core.Spell) { - if spell.SpellSchool.Matches(core.SpellSchoolFrost) && spell.Flags.Matches(SpellFlagMage) { - spell.CritDamageBonus += critBonus - } - }) - } + mage.OnSpellRegistered(func(spell *core.Spell) { + if spell.SpellSchool.Matches(core.SpellSchoolFrost) && spell.Flags.Matches(SpellFlagMage) { + spell.CritDamageBonus += critBonus + } + }) } // Piercing Ice if mage.Talents.PiercingIce > 0 { bonusDamageMultiplierAdditive := 0.02 * float64(mage.Talents.PiercingIce) - for _, unit := range units { - unit.OnSpellRegistered(func(spell *core.Spell) { - if spell.SpellSchool.Matches(core.SpellSchoolFrost) && spell.Flags.Matches(SpellFlagMage) { - spell.DamageMultiplierAdditive += bonusDamageMultiplierAdditive - } - }) - } + mage.OnSpellRegistered(func(spell *core.Spell) { + if spell.SpellSchool.Matches(core.SpellSchoolFrost) && spell.Flags.Matches(SpellFlagMage) { + spell.DamageMultiplierAdditive += bonusDamageMultiplierAdditive + } + }) } // Frost Channeling @@ -230,9 +207,6 @@ func (mage *Mage) applyArcaneConcentration() { if sim.Proc(procChance, "Arcane Concentration") { mage.ClearcastingAura.Activate(sim) - if mage.ArcanePotencyAura != nil { - mage.ArcanePotencyAura.Activate(sim) - } } }, }) @@ -306,24 +280,15 @@ func (mage *Mage) registerArcanePowerCD() { return } - // For talents that benefit both the mage and frozen orbs - units := []*core.Unit{&mage.Unit} - // Frozen Orb also benefits - if mage.HasRune(proto.MageRune_RuneCloakFrozenOrb) { - units = append(units, core.MapSlice(mage.frozenOrbPets, func(orb *FrozenOrb) *core.Unit { return &orb.Unit })...) - } - actionID := core.ActionID{SpellID: 12042} affectedSpells := []*core.Spell{} - for _, unit := range units { - unit.OnSpellRegistered(func(spell *core.Spell) { - if spell.Flags.Matches(SpellFlagMage) { - affectedSpells = append(affectedSpells, spell) - } - }) - } + mage.OnSpellRegistered(func(spell *core.Spell) { + if spell.Flags.Matches(SpellFlagMage) { + affectedSpells = append(affectedSpells, spell) + } + }) mage.ArcanePowerAura = mage.RegisterAura(core.Aura{ Label: "Arcane Power", @@ -411,8 +376,6 @@ func (mage *Mage) registerCombustionCD() { return } - hasOverheatRune := mage.HasRune(proto.MageRune_RuneCloakOverheat) - actionID := core.ActionID{SpellID: 11129} cd := core.Cooldown{ Timer: mage.NewTimer(), @@ -453,8 +416,8 @@ func (mage *Mage) registerCombustionCD() { } // Ignite, Living Bomb explosions, and Fire Blast with Overheart don't consume crit stacks - if spell.SpellCode == SpellCode_MageIgnite || - spell.SpellCode == SpellCode_MageLivingBombExplosion || (hasOverheatRune && spell.SpellCode == SpellCode_MageFireBlast) { + // To Do: Classic - I don't believe ignite can crit so can probably remove this check? + if spell.SpellCode == SpellCode_MageIgnite { return } diff --git a/sim/priest/shadow/TestShadow.results b/sim/priest/shadow/TestShadow.results new file mode 100644 index 000000000..b3478b8bf --- /dev/null +++ b/sim/priest/shadow/TestShadow.results @@ -0,0 +1,196 @@ +character_stats_results: { + key: "TestShadow-Phase5-Lvl60-CharacterStats-Default" + value: { + final_stats: 178.25 + final_stats: 185.15 + final_stats: 354.1655 + final_stats: 216.2 + final_stats: 226.55 + final_stats: 150 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 40 + final_stats: 41.25 + final_stats: 0 + final_stats: 25.43216 + final_stats: 0 + final_stats: 0 + final_stats: 798.25 + final_stats: 0 + final_stats: 16 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4339 + final_stats: 0 + final_stats: 0 + final_stats: 370.3 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 3 + final_stats: 5 + final_stats: 0 + final_stats: 5058.655 + final_stats: 27 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestShadow-Phase5-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.21637 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.21637 + weights: 0 + weights: 1.87704 + weights: 0.77573 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Average-Default" + value: { + dps: 286.06733 + tps: 276.95122 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-NightElf-blank-Basic-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 644.32784 + tps: 810.64669 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-NightElf-blank-Basic-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 280.56029 + tps: 271.6082 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-NightElf-blank-Basic-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 286.68517 + tps: 277.38896 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-NightElf-blank-Basic-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 286.20154 + tps: 448.27043 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-NightElf-blank-Basic-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 192.23402 + tps: 188.87547 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-NightElf-blank-Basic-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 196.52876 + tps: 188.66761 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-Troll-blank-Basic-phase_5-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 590.44037 + tps: 781.1205 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-Troll-blank-Basic-phase_5-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 284.04091 + tps: 275.05313 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-Troll-blank-Basic-phase_5-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 280.26214 + tps: 271.34086 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-Troll-blank-Basic-phase_5-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 294.10019 + tps: 455.85314 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-Troll-blank-Basic-phase_5-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 194.36975 + tps: 192.39595 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-Settings-Troll-blank-Basic-phase_5-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 191.14629 + tps: 183.50044 + } +} +dps_results: { + key: "TestShadow-Phase5-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 284.04091 + tps: 275.05313 + } +} diff --git a/sim/warlock/dps/TestAffliction.results b/sim/warlock/dps/TestAffliction.results new file mode 100644 index 000000000..0bfa0c765 --- /dev/null +++ b/sim/warlock/dps/TestAffliction.results @@ -0,0 +1,162 @@ +character_stats_results: { + key: "TestAffliction-Phase4-Lvl60-CharacterStats-Default" + value: { + final_stats: 194.35 + final_stats: 203.55 + final_stats: 437.7475 + final_stats: 258.75 + final_stats: 239.2 + final_stats: 564.6 + final_stats: 0 + final_stats: 40 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 159 + final_stats: 45.25 + final_stats: 5 + final_stats: 28.96938 + final_stats: 0 + final_stats: 0 + final_stats: 814.35 + final_stats: 0 + final_stats: 25.1775 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4974.25 + final_stats: 0 + final_stats: 0 + final_stats: 1353.1 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 12.1775 + final_stats: 5 + final_stats: 0 + final_stats: 5911.475 + final_stats: 27 + final_stats: 76 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestAffliction-Phase4-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.02841 + weights: 0 + weights: 0.28413 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 3.47155 + weights: 0.74065 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Average-Default" + value: { + dps: 503.11693 + tps: 355.02362 + hps: 207.21698 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-placeholder-Affliction Warlock-affliction-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 500.4467 + tps: 822.12009 + hps: 206.57229 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-placeholder-Affliction Warlock-affliction-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 500.4467 + tps: 352.10643 + hps: 206.57229 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-placeholder-Affliction Warlock-affliction-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 523.21588 + tps: 376.7872 + hps: 196.21055 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-placeholder-Affliction Warlock-affliction-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 308.23238 + tps: 748.95525 + hps: 119.78727 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-placeholder-Affliction Warlock-affliction-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 308.23238 + tps: 224.64519 + hps: 119.78727 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-placeholder-Affliction Warlock-affliction-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 334.51601 + tps: 250.15416 + hps: 112.94454 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 500.4467 + tps: 352.10643 + hps: 206.57229 + } +} diff --git a/sim/warlock/dps/TestDemonology.results b/sim/warlock/dps/TestDemonology.results new file mode 100644 index 000000000..7574a8037 --- /dev/null +++ b/sim/warlock/dps/TestDemonology.results @@ -0,0 +1,154 @@ +character_stats_results: { + key: "TestDemonology-Phase2-Lvl40-CharacterStats-Default" + value: { + final_stats: 120.75 + final_stats: 80.5 + final_stats: 398.46925 + final_stats: 189.75 + final_stats: 158.4125 + final_stats: 524.20625 + final_stats: 0 + final_stats: 40 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 159 + final_stats: 32.75 + final_stats: 5 + final_stats: 29.67145 + final_stats: 0 + final_stats: 0 + final_stats: 566.75 + final_stats: 0 + final_stats: 20.6189 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 3489.25 + final_stats: 0 + final_stats: 0 + final_stats: 986 + final_stats: 440 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 7.6189 + final_stats: 5 + final_stats: 0 + final_stats: 4738.6925 + final_stats: 13 + final_stats: 46 + final_stats: 30 + final_stats: 30 + final_stats: 30 + final_stats: 263 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestDemonology-Phase2-Lvl40-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.004 + weights: 0 + weights: 0.0709 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.13387 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-Average-Default" + value: { + dps: 76.1651 + tps: 80.20343 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-Settings-Orc-placeholder-Demonology Warlock-demonology-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 75.78854 + tps: 89.68818 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-Settings-Orc-placeholder-Demonology Warlock-demonology-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 75.78854 + tps: 79.81293 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-Settings-Orc-placeholder-Demonology Warlock-demonology-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 81.78573 + tps: 100.98705 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-Settings-Orc-placeholder-Demonology Warlock-demonology-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 52.79904 + tps: 54.97303 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-Settings-Orc-placeholder-Demonology Warlock-demonology-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 52.79904 + tps: 54.97303 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-Settings-Orc-placeholder-Demonology Warlock-demonology-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 55.93888 + tps: 67.23421 + } +} +dps_results: { + key: "TestDemonology-Phase2-Lvl40-SwitchInFrontOfTarget-Default" + value: { + dps: 75.78854 + tps: 79.81293 + } +} diff --git a/sim/warlock/dps/TestDestruction.results b/sim/warlock/dps/TestDestruction.results new file mode 100644 index 000000000..877530544 --- /dev/null +++ b/sim/warlock/dps/TestDestruction.results @@ -0,0 +1,154 @@ +character_stats_results: { + key: "TestDestruction-Phase4-Lvl60-CharacterStats-Default" + value: { + final_stats: 194.35 + final_stats: 203.55 + final_stats: 503.40962 + final_stats: 258.75 + final_stats: 227.24 + final_stats: 558.62 + final_stats: 0 + final_stats: 40 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 159 + final_stats: 45.25 + final_stats: 5 + final_stats: 28.96938 + final_stats: 0 + final_stats: 0 + final_stats: 814.35 + final_stats: 0 + final_stats: 25.1775 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4974.25 + final_stats: 0 + final_stats: 0 + final_stats: 1353.1 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 12.1775 + final_stats: 5 + final_stats: 0 + final_stats: 6568.09625 + final_stats: 27 + final_stats: 76 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestDestruction-Phase4-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.23734 + weights: 0 + weights: 0.35633 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 5.08727 + weights: 2.46119 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Average-Default" + value: { + dps: 662.52898 + tps: 495.4123 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-placeholder-Destruction Warlock-destruction-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 664.84066 + tps: 1093.96523 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-placeholder-Destruction Warlock-destruction-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 664.84066 + tps: 498.74818 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-placeholder-Destruction Warlock-destruction-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 728.86416 + tps: 587.44758 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-placeholder-Destruction Warlock-destruction-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 124.33411 + tps: 892.43736 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-placeholder-Destruction Warlock-destruction-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 124.33411 + tps: 49.90734 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-placeholder-Destruction Warlock-destruction-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 108.5207 + tps: 34.05603 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 664.58069 + tps: 498.37335 + } +} diff --git a/sim/warlock/tank/TestAffliction.results b/sim/warlock/tank/TestAffliction.results new file mode 100644 index 000000000..6402954b9 --- /dev/null +++ b/sim/warlock/tank/TestAffliction.results @@ -0,0 +1,162 @@ +character_stats_results: { + key: "TestAffliction-Phase4-Lvl60-CharacterStats-Default" + value: { + final_stats: 192.05 + final_stats: 190.9 + final_stats: 309.465 + final_stats: 194.35 + final_stats: 231.15 + final_stats: 325.575 + final_stats: 0 + final_stats: 40 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 40 + final_stats: 41.25 + final_stats: 0 + final_stats: 25.90678 + final_stats: 0 + final_stats: 0 + final_stats: 812.05 + final_stats: 0 + final_stats: 24.545 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4008.25 + final_stats: 0 + final_stats: 0 + final_stats: 765.8 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 11.545 + final_stats: 5 + final_stats: 0 + final_stats: 4628.65 + final_stats: 27 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestAffliction-Phase4-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: -0.24219 + weights: 0 + weights: 0.07296 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 3.66598 + weights: 1.00627 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Average-Default" + value: { + dps: 395.84375 + tps: 281.87701 + hps: 143.33867 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-blank-Affliction Warlock-p4_destro_aff_tank-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 395.57517 + tps: 703.08928 + hps: 142.8239 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-blank-Affliction Warlock-p4_destro_aff_tank-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 395.57517 + tps: 283.01063 + hps: 142.8239 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-blank-Affliction Warlock-p4_destro_aff_tank-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 452.30043 + tps: 318.40647 + hps: 145.6732 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-blank-Affliction Warlock-p4_destro_aff_tank-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 223.03096 + tps: 698.11297 + hps: 82.49614 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-blank-Affliction Warlock-p4_destro_aff_tank-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 223.03096 + tps: 179.23118 + hps: 82.49614 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-Settings-Orc-blank-Affliction Warlock-p4_destro_aff_tank-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 245.33588 + tps: 198.82781 + hps: 87.92117 + } +} +dps_results: { + key: "TestAffliction-Phase4-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 390.74659 + tps: 276.99213 + hps: 143.19304 + } +} diff --git a/sim/warlock/tank/TestDemonology.results b/sim/warlock/tank/TestDemonology.results new file mode 100644 index 000000000..726842093 --- /dev/null +++ b/sim/warlock/tank/TestDemonology.results @@ -0,0 +1,162 @@ +character_stats_results: { + key: "TestDemonology-Phase4-Lvl60-CharacterStats-Default" + value: { + final_stats: 192.05 + final_stats: 190.9 + final_stats: 355.88475 + final_stats: 194.35 + final_stats: 219.5925 + final_stats: 319.79625 + final_stats: 0 + final_stats: 61 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 40 + final_stats: 41.25 + final_stats: 0 + final_stats: 25.90678 + final_stats: 0 + final_stats: 0 + final_stats: 812.05 + final_stats: 0 + final_stats: 24.545 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4008.25 + final_stats: 0 + final_stats: 0 + final_stats: 765.8 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 11.545 + final_stats: 5 + final_stats: 0 + final_stats: 5092.8475 + final_stats: 27 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestDemonology-Phase4-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.02972 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.51017 + weights: 0.29947 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-Average-Default" + value: { + dps: 47.54011 + tps: 54.8855 + hps: 2.70296 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-Settings-Orc-blank-Demonology Warlock-p4_demo_tank-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 35.20133 + tps: 97.83623 + hps: 2.65522 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-Settings-Orc-blank-Demonology Warlock-p4_demo_tank-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 35.20133 + tps: 42.64598 + hps: 2.65522 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-Settings-Orc-blank-Demonology Warlock-p4_demo_tank-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 57.07716 + tps: 79.38914 + hps: 13.78919 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-Settings-Orc-blank-Demonology Warlock-p4_demo_tank-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 20.24215 + tps: 78.72015 + hps: 1.57632 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-Settings-Orc-blank-Demonology Warlock-p4_demo_tank-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 20.24215 + tps: 25.67848 + hps: 1.57632 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-Settings-Orc-blank-Demonology Warlock-p4_demo_tank-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 33.98654 + tps: 48.23407 + hps: 8.38795 + } +} +dps_results: { + key: "TestDemonology-Phase4-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 41.88046 + tps: 49.34478 + hps: 2.65522 + } +} diff --git a/sim/warlock/tank/TestDestruction.results b/sim/warlock/tank/TestDestruction.results new file mode 100644 index 000000000..e8ddeebe6 --- /dev/null +++ b/sim/warlock/tank/TestDestruction.results @@ -0,0 +1,162 @@ +character_stats_results: { + key: "TestDestruction-Phase4-Lvl60-CharacterStats-Default" + value: { + final_stats: 192.05 + final_stats: 190.9 + final_stats: 309.465 + final_stats: 194.35 + final_stats: 231.15 + final_stats: 325.575 + final_stats: 0 + final_stats: 40 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 40 + final_stats: 41.25 + final_stats: 0 + final_stats: 25.90678 + final_stats: 0 + final_stats: 0 + final_stats: 812.05 + final_stats: 0 + final_stats: 24.545 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4008.25 + final_stats: 0 + final_stats: 0 + final_stats: 765.8 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 11.545 + final_stats: 5 + final_stats: 0 + final_stats: 4628.65 + final_stats: 27 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestDestruction-Phase4-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.91009 + weights: 0 + weights: 0.11006 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 3.92216 + weights: 1.09794 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Average-Default" + value: { + dps: 389.2209 + tps: 277.26564 + hps: 136.1828 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-blank-Destruction Warlock-p4_destro_aff_tank-FullBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 388.3852 + tps: 702.12766 + hps: 133.92194 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-blank-Destruction Warlock-p4_destro_aff_tank-FullBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 388.3852 + tps: 276.76072 + hps: 133.92194 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-blank-Destruction Warlock-p4_destro_aff_tank-FullBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 437.42061 + tps: 307.31494 + hps: 140.78957 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-blank-Destruction Warlock-p4_destro_aff_tank-NoBuffs-P4-Consumes-LongMultiTarget" + value: { + dps: 217.59792 + tps: 687.37145 + hps: 79.34399 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-blank-Destruction Warlock-p4_destro_aff_tank-NoBuffs-P4-Consumes-LongSingleTarget" + value: { + dps: 217.59792 + tps: 175.07065 + hps: 79.34399 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-Settings-Orc-blank-Destruction Warlock-p4_destro_aff_tank-NoBuffs-P4-Consumes-ShortSingleTarget" + value: { + dps: 238.92422 + tps: 192.95731 + hps: 84.6674 + } +} +dps_results: { + key: "TestDestruction-Phase4-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 387.76787 + tps: 277.39069 + hps: 136.72322 + } +}