From b5dd6e912aa0614acf36c0855bc8d1118f1f7e0e Mon Sep 17 00:00:00 2001 From: NerdEgghead Date: Tue, 26 Dec 2023 19:57:07 -0800 Subject: [PATCH] Completed APL migration of Feral DPS sim Changes to be committed: modified: proto/apl.proto modified: sim/druid/feral/TestFeralApl.results modified: sim/druid/feral/apl_values.go modified: sim/druid/feral/rotation.go modified: ui/core/components/individual_sim_ui/apl_actions.ts modified: ui/core/components/individual_sim_ui/apl_helpers.ts modified: ui/core/launched_sims.ts modified: ui/feral_druid/apls/default.apl.json modified: ui/feral_druid/presets.ts modified: ui/feral_druid/sim.ts --- proto/apl.proto | 10 + sim/druid/feral/TestFeralApl.results | 544 +++++++++--------- sim/druid/feral/apl_values.go | 22 +- sim/druid/feral/rotation.go | 5 +- .../individual_sim_ui/apl_actions.ts | 46 +- .../individual_sim_ui/apl_helpers.ts | 30 +- ui/core/launched_sims.ts | 2 +- ui/feral_druid/apls/default.apl.json | 29 +- ui/feral_druid/presets.ts | 2 +- ui/feral_druid/sim.ts | 41 +- 10 files changed, 427 insertions(+), 304 deletions(-) diff --git a/proto/apl.proto b/proto/apl.proto index 34217456a9..b6a0a723c9 100644 --- a/proto/apl.proto +++ b/proto/apl.proto @@ -5,6 +5,7 @@ option go_package = "./proto"; import "common.proto"; import "shaman.proto"; +import "druid.proto"; // Rotation options are based heavily on APL. See https://github.com/simulationcraft/simc/wiki/ActionLists. @@ -265,6 +266,15 @@ message APLActionItemSwap { } message APLActionCatOptimalRotationAction { + FeralDruid.Rotation.AplType rotation_type = 1; + bool manual_params = 2; + float max_ff_delay = 3; + float min_roar_offset = 4; + int32 rip_leeway = 5; + bool use_rake = 6; + bool use_bite = 7; + float bite_time = 8; + bool flower_weave = 9; } /////////////////////////////////////////////////////////////////////////// diff --git a/sim/druid/feral/TestFeralApl.results b/sim/druid/feral/TestFeralApl.results index 40bdfbed07..1d65d80b29 100644 --- a/sim/druid/feral/TestFeralApl.results +++ b/sim/druid/feral/TestFeralApl.results @@ -46,956 +46,956 @@ character_stats_results: { dps_results: { key: "TestFeralApl-AllItems-Althor'sAbacus-50359" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-Althor'sAbacus-50366" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-AshtongueTalismanofEquilibrium-32486" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-AustereEarthsiegeDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-Bandit'sInsignia-40371" value: { - dps: 11053.54068 - tps: 7908.21715 + dps: 11248.49036 + tps: 8050.37075 } } dps_results: { key: "TestFeralApl-AllItems-BaubleofTrueBlood-50354" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 hps: 91.80479 } } dps_results: { key: "TestFeralApl-AllItems-BaubleofTrueBlood-50726" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 hps: 91.80479 } } dps_results: { key: "TestFeralApl-AllItems-BeamingEarthsiegeDiamond" value: { - dps: 11169.92198 - tps: 7991.2218 + dps: 11358.03239 + tps: 8128.96825 } } dps_results: { key: "TestFeralApl-AllItems-BlessedRegaliaofUndeadCleansing" value: { - dps: 8367.89573 - tps: 5999.83872 + dps: 8537.20531 + tps: 6123.93742 } } dps_results: { key: "TestFeralApl-AllItems-BracingEarthsiegeDiamond" value: { - dps: 11134.55244 - tps: 7806.86053 + dps: 11330.21537 + tps: 7946.74064 } } dps_results: { key: "TestFeralApl-AllItems-BrutalGladiator'sIdolofResolve-35019" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-ChaoticSkyflareDiamond" value: { - dps: 11442.28988 - tps: 8184.60302 + dps: 11636.61367 + tps: 8326.76096 } } dps_results: { key: "TestFeralApl-AllItems-CorpseTongueCoin-50349" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-CorpseTongueCoin-50352" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-CorrodedSkeletonKey-50356" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 hps: 64 } } dps_results: { key: "TestFeralApl-AllItems-DarkmoonCard:Berserker!-42989" value: { - dps: 11018.16099 - tps: 7883.4715 + dps: 11207.15399 + tps: 8021.54544 } } dps_results: { key: "TestFeralApl-AllItems-DarkmoonCard:Death-42990" value: { - dps: 11048.11396 - tps: 7904.88768 + dps: 11241.28004 + tps: 8045.70015 } } dps_results: { key: "TestFeralApl-AllItems-DarkmoonCard:Greatness-44255" value: { - dps: 11078.34064 - tps: 7926.12427 + dps: 11267.77139 + tps: 8064.73336 } } dps_results: { key: "TestFeralApl-AllItems-DeadlyGladiator'sIdolofResolve-42588" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-Death'sChoice-47464" value: { - dps: 11450.1305 - tps: 8190.16986 + dps: 11643.19767 + tps: 8331.36081 } } dps_results: { key: "TestFeralApl-AllItems-DeathKnight'sAnguish-38212" value: { - dps: 10970.57227 - tps: 7849.68351 + dps: 11176.20694 + tps: 7999.64782 } } dps_results: { key: "TestFeralApl-AllItems-Deathbringer'sWill-50362" value: { - dps: 11488.98044 - tps: 8217.8281 + dps: 11708.8537 + tps: 8377.75223 } } dps_results: { key: "TestFeralApl-AllItems-Deathbringer'sWill-50363" value: { - dps: 11588.31383 - tps: 8288.28002 + dps: 11793.77979 + tps: 8437.97497 } } dps_results: { key: "TestFeralApl-AllItems-Defender'sCode-40257" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-DestructiveSkyflareDiamond" value: { - dps: 11174.71865 - tps: 7994.62744 + dps: 11363.042 + tps: 8132.52508 } } dps_results: { key: "TestFeralApl-AllItems-DislodgedForeignObject-50348" value: { - dps: 11096.66221 - tps: 7939.0578 + dps: 11288.14404 + tps: 8079.04838 } } dps_results: { key: "TestFeralApl-AllItems-DislodgedForeignObject-50353" value: { - dps: 11066.03055 - tps: 7917.30931 + dps: 11255.35203 + tps: 8055.76605 } } dps_results: { key: "TestFeralApl-AllItems-DreamwalkerBattlegear" value: { - dps: 9190.2289 - tps: 6583.39612 + dps: 9334.4757 + tps: 6689.47589 } } dps_results: { key: "TestFeralApl-AllItems-DreamwalkerGarb" value: { - dps: 7917.98149 - tps: 5682.79278 + dps: 8061.34952 + tps: 5787.72512 } } dps_results: { key: "TestFeralApl-AllItems-EffulgentSkyflareDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-EmberSkyflareDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-EnigmaticSkyflareDiamond" value: { - dps: 11169.92198 - tps: 7991.2218 + dps: 11358.03239 + tps: 8128.96825 } } dps_results: { key: "TestFeralApl-AllItems-EnigmaticStarflareDiamond" value: { - dps: 11167.23974 - tps: 7989.31742 + dps: 11355.9468 + tps: 8127.48748 } } dps_results: { key: "TestFeralApl-AllItems-EphemeralSnowflake-50260" value: { - dps: 10998.21993 - tps: 7869.53771 + dps: 11158.43371 + tps: 7987.10362 } } dps_results: { key: "TestFeralApl-AllItems-EssenceofGossamer-37220" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-EternalEarthsiegeDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-ExtractofNecromanticPower-40373" value: { - dps: 11048.28537 - tps: 7904.78503 + dps: 11241.55637 + tps: 8045.97113 } } dps_results: { key: "TestFeralApl-AllItems-EyeoftheBroodmother-45308" value: { - dps: 10999.13015 - tps: 7869.9596 + dps: 11191.08291 + tps: 8010.20976 } } dps_results: { key: "TestFeralApl-AllItems-Figurine-SapphireOwl-42413" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11055.18415 + tps: 7913.57207 } } dps_results: { key: "TestFeralApl-AllItems-ForethoughtTalisman-40258" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-ForgeEmber-37660" value: { - dps: 10965.1328 - tps: 7845.82149 + dps: 11154.5414 + tps: 7984.1905 } } dps_results: { key: "TestFeralApl-AllItems-ForlornSkyflareDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-ForlornStarflareDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-FuriousGladiator'sIdolofResolve-42589" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-FuryoftheFiveFlights-40431" value: { - dps: 11098.77661 - tps: 7940.63381 + dps: 11302.86472 + tps: 8089.35049 } } dps_results: { key: "TestFeralApl-AllItems-FuturesightRune-38763" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-Gladiator'sSanctuary" value: { - dps: 9708.33043 - tps: 6951.77172 + dps: 9909.88676 + tps: 7098.3169 } } dps_results: { key: "TestFeralApl-AllItems-Gladiator'sWildhide" value: { - dps: 7937.76831 - tps: 5694.44825 + dps: 8154.68889 + tps: 5852.64991 } } dps_results: { key: "TestFeralApl-AllItems-GlowingTwilightScale-54573" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-GlowingTwilightScale-54589" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-GnomishLightningGenerator-41121" value: { - dps: 11025.55515 - tps: 7888.57178 + dps: 11219.07548 + tps: 8029.86012 } } dps_results: { key: "TestFeralApl-AllItems-HatefulGladiator'sIdolofResolve-42587" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-Heartpierce-49982" value: { - dps: 11684.47467 - tps: 8356.10549 + dps: 11789.48721 + tps: 8434.47852 } } dps_results: { key: "TestFeralApl-AllItems-Heartpierce-50641" value: { - dps: 11752.75713 - tps: 8405.03476 + dps: 11830.14865 + tps: 8463.12378 } } dps_results: { key: "TestFeralApl-AllItems-IdolofLunarFury-47670" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-IdoloftheCorruptor-45509" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-IdoloftheCryingMoon-50456" value: { - dps: 11464.02712 - tps: 8199.96167 + dps: 11667.30393 + tps: 8348.55104 } } dps_results: { key: "TestFeralApl-AllItems-IdoloftheLunarEclipse-50457" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-IdoloftheRavenGoddess-32387" value: { - dps: 11159.39707 - tps: 7983.8239 + dps: 11366.53967 + tps: 8134.63448 } } dps_results: { key: "TestFeralApl-AllItems-IdoloftheUnseenMoon-33510" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-IdoloftheWhiteStag-32257" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-IllustrationoftheDragonSoul-40432" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-ImpassiveSkyflareDiamond" value: { - dps: 11169.92198 - tps: 7991.2218 + dps: 11358.03239 + tps: 8128.96825 } } dps_results: { key: "TestFeralApl-AllItems-ImpassiveStarflareDiamond" value: { - dps: 11167.23974 - tps: 7989.31742 + dps: 11355.9468 + tps: 8127.48748 } } dps_results: { key: "TestFeralApl-AllItems-IncisorFragment-37723" value: { - dps: 11081.69201 - tps: 7928.50374 + dps: 11277.19978 + tps: 8071.12837 } } dps_results: { key: "TestFeralApl-AllItems-InsightfulEarthsiegeDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-InvigoratingEarthsiegeDiamond" value: { - dps: 11166.84764 - tps: 7989.11381 + dps: 11363.08137 + tps: 8132.25388 hps: 15.15199 } } dps_results: { key: "TestFeralApl-AllItems-LasherweaveBattlegear" value: { - dps: 11834.21272 - tps: 8460.69942 + dps: 11977.08455 + tps: 8565.42903 } } dps_results: { key: "TestFeralApl-AllItems-LasherweaveRegalia" value: { - dps: 8591.80379 - tps: 6163.07628 + dps: 8709.80854 + tps: 6250.97292 } } dps_results: { key: "TestFeralApl-AllItems-LastWord-50179" value: { - dps: 11640.63516 - tps: 8325.42816 + dps: 11839.93551 + tps: 8471.04468 } } dps_results: { key: "TestFeralApl-AllItems-LastWord-50708" value: { - dps: 11668.66557 - tps: 8345.32975 + dps: 11868.42688 + tps: 8491.27355 } } dps_results: { key: "TestFeralApl-AllItems-Lavanthor'sTalisman-37872" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-MajesticDragonFigurine-40430" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-Malfurion'sBattlegear" value: { - dps: 9762.5458 - tps: 6992.80737 + dps: 9908.75917 + tps: 7100.80692 } } dps_results: { key: "TestFeralApl-AllItems-Malfurion'sRegalia" value: { - dps: 7969.39515 - tps: 5720.56785 + dps: 8110.50895 + tps: 5824.72234 } } dps_results: { key: "TestFeralApl-AllItems-MeteoriteWhetstone-37390" value: { - dps: 11179.86722 - tps: 7998.20814 + dps: 11292.65748 + tps: 8082.25291 } } dps_results: { key: "TestFeralApl-AllItems-NevermeltingIceCrystal-50259" value: { - dps: 11035.14962 - tps: 7895.60822 + dps: 11211.2675 + tps: 8024.39125 } } dps_results: { key: "TestFeralApl-AllItems-Nibelung-49992" value: { - dps: 11453.32526 - tps: 8192.43814 + dps: 11649.3486 + tps: 8335.72797 } } dps_results: { key: "TestFeralApl-AllItems-Nibelung-50648" value: { - dps: 11453.32526 - tps: 8192.43814 + dps: 11649.3486 + tps: 8335.72797 } } dps_results: { key: "TestFeralApl-AllItems-NightsongBattlegear" value: { - dps: 9740.57618 - tps: 6975.26449 + dps: 9828.09234 + tps: 7040.91593 } } dps_results: { key: "TestFeralApl-AllItems-NightsongGarb" value: { - dps: 7845.4538 - tps: 5633.39215 + dps: 7966.22848 + tps: 5723.03107 } } dps_results: { key: "TestFeralApl-AllItems-OfferingofSacrifice-37638" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-PersistentEarthshatterDiamond" value: { - dps: 11160.69617 - tps: 7984.74627 + dps: 11356.82118 + tps: 8127.80914 } } dps_results: { key: "TestFeralApl-AllItems-PersistentEarthsiegeDiamond" value: { - dps: 11166.84764 - tps: 7989.11381 + dps: 11363.08137 + tps: 8132.25388 } } dps_results: { key: "TestFeralApl-AllItems-PetrifiedScarab-21685" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-PetrifiedTwilightScale-54571" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-PetrifiedTwilightScale-54591" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-PowerfulEarthshatterDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-PowerfulEarthsiegeDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-PurifiedShardoftheGods" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-ReignoftheDead-47316" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-ReignoftheDead-47477" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-RelentlessEarthsiegeDiamond" value: { - dps: 11453.32526 - tps: 8192.43814 + dps: 11649.3486 + tps: 8335.72797 } } dps_results: { key: "TestFeralApl-AllItems-RelentlessGladiator'sIdolofResolve-42591" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-RevitalizingSkyflareDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-RuneofRepulsion-40372" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-SavageGladiator'sIdolofResolve-42574" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-SealofthePantheon-36993" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-ShinyShardoftheGods" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-Sindragosa'sFlawlessFang-50361" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-SliverofPureIce-50339" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-SliverofPureIce-50346" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-SoulPreserver-37111" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-SouloftheDead-40382" value: { - dps: 11006.02456 - tps: 7874.85464 + dps: 11197.94961 + tps: 8015.08512 } } dps_results: { key: "TestFeralApl-AllItems-SparkofLife-37657" value: { - dps: 11012.9848 - tps: 7879.64683 + dps: 11089.23564 + tps: 7937.97298 } } dps_results: { key: "TestFeralApl-AllItems-SphereofRedDragon'sBlood-37166" value: { - dps: 11069.73947 - tps: 7921.28881 + dps: 11192.80555 + tps: 8012.92857 } } dps_results: { key: "TestFeralApl-AllItems-StormshroudArmor" value: { - dps: 8601.68001 - tps: 6166.49863 + dps: 8657.35313 + tps: 6208.34494 } } dps_results: { key: "TestFeralApl-AllItems-SwiftSkyflareDiamond" value: { - dps: 11166.84764 - tps: 7989.11381 + dps: 11363.08137 + tps: 8132.25388 } } dps_results: { key: "TestFeralApl-AllItems-SwiftStarflareDiamond" value: { - dps: 11160.69617 - tps: 7984.74627 + dps: 11356.82118 + tps: 8127.80914 } } dps_results: { key: "TestFeralApl-AllItems-SwiftWindfireDiamond" value: { - dps: 11149.9311 - tps: 7977.10307 + dps: 11345.86585 + tps: 8120.03086 } } dps_results: { key: "TestFeralApl-AllItems-TalismanofTrollDivinity-37734" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-TearsoftheVanquished-47215" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-TheGeneral'sHeart-45507" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-ThunderheartHarness" value: { - dps: 7484.346 - tps: 5369.67652 + dps: 7544.14508 + tps: 5414.60182 } } dps_results: { key: "TestFeralApl-AllItems-ThunderheartRegalia" value: { - dps: 6578.93302 - tps: 4727.58116 + dps: 6621.13152 + tps: 4760.68314 } } dps_results: { key: "TestFeralApl-AllItems-ThunderingSkyflareDiamond" value: { - dps: 11229.91029 - tps: 8033.88829 + dps: 11412.94075 + tps: 8167.95319 } } dps_results: { key: "TestFeralApl-AllItems-TinyAbominationinaJar-50351" value: { - dps: 11058.12293 - tps: 7914.31244 + dps: 11275.27345 + tps: 8072.37822 } } dps_results: { key: "TestFeralApl-AllItems-TinyAbominationinaJar-50706" value: { - dps: 11143.20624 - tps: 7974.57202 + dps: 11293.68902 + tps: 8085.45327 } } dps_results: { key: "TestFeralApl-AllItems-TirelessSkyflareDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-TirelessStarflareDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-TomeofArcanePhenomena-36972" value: { - dps: 10994.71822 - tps: 7866.90192 + dps: 11116.67174 + tps: 7957.15347 } } dps_results: { key: "TestFeralApl-AllItems-TrenchantEarthshatterDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-TrenchantEarthsiegeDiamond" value: { - dps: 11134.55244 - tps: 7966.18422 + dps: 11330.21537 + tps: 8108.91902 } } dps_results: { key: "TestFeralApl-AllItems-UndeadSlayer'sBlessedArmor" value: { - dps: 8740.20174 - tps: 6264.32555 + dps: 8891.77212 + tps: 6375.67986 } } dps_results: { key: "TestFeralApl-AllItems-Val'anyr,HammerofAncientKings-46017" value: { - dps: 8600.30629 - tps: 6166.94424 + dps: 8723.65591 + tps: 6258.48616 } } dps_results: { key: "TestFeralApl-AllItems-VengefulGladiator'sIdolofResolve-33947" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-AllItems-WingedTalisman-37844" value: { - dps: 10853.70661 - tps: 7766.6341 + dps: 11053.60972 + tps: 7912.37943 } } dps_results: { key: "TestFeralApl-AllItems-WrathfulGladiator'sIdolofResolve-51429" value: { - dps: 11107.39591 - tps: 7946.90308 + dps: 11300.78539 + tps: 8088.02373 } } dps_results: { key: "TestFeralApl-Average-Default" value: { - dps: 11456.57961 - tps: 8194.76951 + dps: 11615.83238 + tps: 8311.65236 } } dps_results: { key: "TestFeralApl-Settings-Tauren-p3-Default-default-FullBuffs-LongMultiTarget" value: { - dps: 11453.32526 - tps: 8192.43814 + dps: 11649.3486 + tps: 8335.72797 } } dps_results: { key: "TestFeralApl-Settings-Tauren-p3-Default-default-FullBuffs-LongSingleTarget" value: { - dps: 11453.32526 - tps: 8192.43814 + dps: 11649.3486 + tps: 8335.72797 } } dps_results: { key: "TestFeralApl-Settings-Tauren-p3-Default-default-FullBuffs-ShortSingleTarget" value: { - dps: 13050.93286 - tps: 9315.14759 + dps: 13479.0228 + tps: 9623.57866 } } dps_results: { key: "TestFeralApl-Settings-Tauren-p3-Default-default-NoBuffs-LongMultiTarget" value: { - dps: 7083.67635 - tps: 5088.49168 + dps: 7188.97313 + tps: 5167.29087 } } dps_results: { key: "TestFeralApl-Settings-Tauren-p3-Default-default-NoBuffs-LongSingleTarget" value: { - dps: 7083.67635 - tps: 5088.49168 + dps: 7188.97313 + tps: 5167.29087 } } dps_results: { key: "TestFeralApl-Settings-Tauren-p3-Default-default-NoBuffs-ShortSingleTarget" value: { - dps: 7578.66914 - tps: 5429.46642 + dps: 7838.43339 + tps: 5618.76017 } } dps_results: { key: "TestFeralApl-SwitchInFrontOfTarget-Default" value: { - dps: 3096.09321 - tps: 2210.11726 + dps: 9085.46642 + tps: 6513.27759 } } diff --git a/sim/druid/feral/apl_values.go b/sim/druid/feral/apl_values.go index 528b135e7a..aa26424991 100644 --- a/sim/druid/feral/apl_values.go +++ b/sim/druid/feral/apl_values.go @@ -106,7 +106,25 @@ func (impl *APLActionCatOptimalRotationAction) GetNextAction(*core.Simulation) * return nil } -func (cat *FeralDruid) newActionCatOptimalRotationAction(_ *core.APLRotation, _ *proto.APLActionCatOptimalRotationAction) core.APLActionImpl { +func (cat *FeralDruid) newActionCatOptimalRotationAction(_ *core.APLRotation, config *proto.APLActionCatOptimalRotationAction) core.APLActionImpl { + rotationOptions := &proto.FeralDruid_Rotation{ + RotationType: config.RotationType, + MaintainFaerieFire: true, + UseRake: config.UseRake, + UseBite: config.UseBite, + BiteTime: config.BiteTime, + MangleSpam: false, + MaxFfDelay: config.MaxFfDelay, + Powerbear: false, + MinRoarOffset: config.MinRoarOffset, + RipLeeway: config.RipLeeway, + HotUptime: 0.0, + FlowerWeave: config.FlowerWeave, + ManualParams: config.ManualParams, + } + + cat.setupRotation(rotationOptions) + return &APLActionCatOptimalRotationAction{ cat: cat, } @@ -132,7 +150,7 @@ func (action *APLActionCatOptimalRotationAction) Execute(sim *core.Simulation) { cat.OnGCDReady(sim) } - cat.OnEnergyGain(sim) + cat.doTigersFury(sim) action.lastAction = sim.CurrentTime } diff --git a/sim/druid/feral/rotation.go b/sim/druid/feral/rotation.go index 815ad6ccf3..5fa1b6a1df 100644 --- a/sim/druid/feral/rotation.go +++ b/sim/druid/feral/rotation.go @@ -29,7 +29,10 @@ func (cat *FeralDruid) OnGCDReady(sim *core.Simulation) { return } - cat.TryUseCooldowns(sim) + if !cat.IsUsingAPL { + cat.TryUseCooldowns(sim) + } + if !cat.GCD.IsReady(sim) { return } diff --git a/ui/core/components/individual_sim_ui/apl_actions.ts b/ui/core/components/individual_sim_ui/apl_actions.ts index cb93eda523..356d9a0cf2 100644 --- a/ui/core/components/individual_sim_ui/apl_actions.ts +++ b/ui/core/components/individual_sim_ui/apl_actions.ts @@ -39,6 +39,7 @@ import { Input, InputConfig } from '../input.js'; import { Player } from '../../player.js'; import { TextDropdownPicker } from '../dropdown_picker.js'; import { ListItemPickerConfig, ListPicker } from '../list_picker.js'; +import { FeralDruid_Rotation_AplType } from '../../proto/druid.js'; import * as AplHelpers from './apl_helpers.js'; import * as AplValues from './apl_values.js'; @@ -345,7 +346,7 @@ const actionKindFactories: {[f in NonNullable]: ActionKindConfig< }), fields: [ AplHelpers.actionIdFieldConfig('spellId', 'dot_spells', ''), - AplHelpers.numberFieldConfig('maxDots', { + AplHelpers.numberFieldConfig('maxDots', false, { label: 'Max Dots', labelTooltip: 'Maximum number of DoTs to simultaneously apply.', }), @@ -373,7 +374,7 @@ const actionKindFactories: {[f in NonNullable]: ActionKindConfig< }), fields: [ AplHelpers.actionIdFieldConfig('spellId', 'shield_spells', ''), - AplHelpers.numberFieldConfig('maxShields', { + AplHelpers.numberFieldConfig('maxShields', false, { label: 'Max Shields', labelTooltip: 'Maximum number of Shields to simultaneously apply.', }), @@ -575,8 +576,47 @@ const actionKindFactories: {[f in NonNullable]: ActionKindConfig< submenu: ['Feral Druid'], shortDescription: 'Executes optimized Feral DPS rotation using hardcoded legacy algorithm.', includeIf: (player: Player, isPrepull: boolean) => player.spec == Spec.SpecFeralDruid, - newValue: () => APLActionCatOptimalRotationAction.create(), + newValue: () => APLActionCatOptimalRotationAction.create({ + rotationType: FeralDruid_Rotation_AplType.SingleTarget, + manualParams: true, + maxFfDelay: 0.1, + minRoarOffset: 25.0, + ripLeeway: 4, + useRake: true, + useBite: true, + biteTime: 4.0, + flowerWeave: false, + }), fields: [ + AplHelpers.rotationTypeFieldConfig('rotationType'), + AplHelpers.booleanFieldConfig('manualParams', 'Manual Advanced Parameters', { + 'labelTooltip': 'Manually specify advanced parameters, otherwise will use preset defaults.', + }), + AplHelpers.numberFieldConfig('maxFfDelay', true, { + 'label': 'Max FF Delay', + 'labelTooltip': 'Max allowed FF delay to fit in damage casts. Ignored if not using manual advanced parameters.', + }), + AplHelpers.numberFieldConfig('minRoarOffset', true, { + 'label': 'Roar Offset', + 'labelTooltip': 'Targeted offset in Rip/Roar timings. Ignored for AOE rotation or if not using manual advanced parameters.', + }), + AplHelpers.numberFieldConfig('ripLeeway', false, { + 'label': 'Rip Leeway', + 'labelTooltip': 'Rip leeway when optimizing Roar clips. Ignored for AOE rotation or if not using manual advanced parameters.', + }), + AplHelpers.booleanFieldConfig('useRake', 'Use Rake', { + 'labelTooltip': 'Use Rake during rotation. Ignored for AOE rotation or if not using manual advanced parameters.', + }), + AplHelpers.booleanFieldConfig('useBite', 'Bite during rotation', { + 'labelTooltip': 'Use Bite during rotation rather than exclusively at end of fight. Ignored for AOE rotation or if not using manual advanced parameters.', + }), + AplHelpers.numberFieldConfig('biteTime', true, { + 'label': 'Bite Time', + 'labelTooltip': 'Min seconds remaining on Rip/Roar to allow a Bite. Ignored if not Biting during rotation.', + }), + AplHelpers.booleanFieldConfig('flowerWeave', 'Flower Weave', { + 'labelTooltip': 'Fish for Clearcasting procs during AOE rotation with GotW. Ignored for Single Target rotation or if not using manual advanced parameters.', + }), ], }), }; diff --git a/ui/core/components/individual_sim_ui/apl_helpers.ts b/ui/core/components/individual_sim_ui/apl_helpers.ts index fbed95b667..cf65abc599 100644 --- a/ui/core/components/individual_sim_ui/apl_helpers.ts +++ b/ui/core/components/individual_sim_ui/apl_helpers.ts @@ -4,13 +4,14 @@ import { Player, UnitMetadata } from '../../player.js'; import { EventID, TypedEvent } from '../../typed_event.js'; import { bucket } from '../../utils.js'; import { AdaptiveStringPicker } from '../string_picker.js'; -import { NumberPicker } from '../number_picker.js'; +import { NumberPicker, NumberPickerConfig } from '../number_picker.js'; import { DropdownPicker, DropdownPickerConfig, DropdownValueConfig, TextDropdownPicker } from '../dropdown_picker.js'; import { UnitPicker, UnitPickerConfig, UnitValue } from '../unit_picker.js'; import { Input, InputConfig } from '../input.js'; import { ActionID } from '../../proto/common.js'; import { BooleanPicker } from '../boolean_picker.js'; import { APLValueRuneSlot, APLValueRuneType } from '../../proto/apl.js'; +import { FeralDruid_Rotation_AplType } from '../../proto/druid.js'; export type ACTION_ID_SET = 'auras' | 'stackable_auras' | 'icd_auras' | 'exclusive_effect_auras' | 'spells' | 'castable_spells' | 'channel_spells' | 'dot_spells' | 'shield_spells' | 'non_instant_spells'; @@ -489,13 +490,15 @@ export function booleanFieldConfig(field: string, label?:string, options?: Parti }; } -export function numberFieldConfig(field: string, options?: Partial>): APLPickerBuilderFieldConfig { +export function numberFieldConfig(field: string, float: boolean, options?: Partial>): APLPickerBuilderFieldConfig { return { field: field, newValue: () => 0, factory: (parent, player, config) => { - config.extraCssClasses = ['input-inline'].concat(config.extraCssClasses || []); - return new NumberPicker(parent, player, config); + const numberPickerConfig = config as NumberPickerConfig>; + numberPickerConfig.float = float; + numberPickerConfig.extraCssClasses = ['input-inline'].concat(config.extraCssClasses || []); + return new NumberPicker(parent, player, numberPickerConfig); }, ...(options || {}), }; @@ -556,6 +559,25 @@ export function runeSlotFieldConfig(field: string): APLPickerBuilderFieldConfig< }; } +export function rotationTypeFieldConfig(field: string): APLPickerBuilderFieldConfig { + let values = [ + { value: FeralDruid_Rotation_AplType.SingleTarget, label: 'Single Target' }, + { value: FeralDruid_Rotation_AplType.Aoe, label: 'AOE' }, + ] + + return { + field: field, + label: 'Type', + newValue: () => FeralDruid_Rotation_AplType.SingleTarget, + factory: (parent, player, config) => new TextDropdownPicker(parent, player, { + ...config, + defaultLabel: 'Single Target', + equals: (a, b) => a == b, + values: values, + }), + }; +} + export function aplInputBuilder(newValue: () => T, fields: Array>): (parent: HTMLElement, player: Player, config: InputConfig, T>) => Input, T> { return (parent, player, config) => { return new APLPickerBuilder(parent, player, { diff --git a/ui/core/launched_sims.ts b/ui/core/launched_sims.ts index a252796213..47d45e1755 100644 --- a/ui/core/launched_sims.ts +++ b/ui/core/launched_sims.ts @@ -41,7 +41,7 @@ export const simLaunchStatuses: Record = { // Alpha and Beta show an info notice at the top of the page. export const aplLaunchStatuses: Record = { [Spec.SpecBalanceDruid]: LaunchStatus.Beta, - [Spec.SpecFeralDruid]: LaunchStatus.Beta, + [Spec.SpecFeralDruid]: LaunchStatus.Launched, [Spec.SpecFeralTankDruid]: LaunchStatus.Launched, [Spec.SpecRestorationDruid]: LaunchStatus.Launched, [Spec.SpecElementalShaman]: LaunchStatus.Beta, diff --git a/ui/feral_druid/apls/default.apl.json b/ui/feral_druid/apls/default.apl.json index ebdc0d5fe3..618e167e68 100644 --- a/ui/feral_druid/apls/default.apl.json +++ b/ui/feral_druid/apls/default.apl.json @@ -1,19 +1,12 @@ { - "type": "TypeAPL", - "prepullActions": [ - {"action":{"activateAura":{"auraId":{"spellId":16870}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"30"}}}},"castSpell":{"spellId":{"spellId":50213}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":16870}}}}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":49800}}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":49800}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":16870}}}}},{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":50334}}},{"cmp":{"op":"OpLt","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"15"}}}}]}},{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":50334}}}}},{"cmp":{"op":"OpLt","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"87"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":16857}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"spellTimeToReady":{"spellId":{"spellId":50213}}},"rhs":{"const":{"val":"15s"}}}},{"dotIsActive":{"spellId":{"spellId":49800}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":16870}}}}}]}},"castSpell":{"spellId":{"spellId":50334}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"1"}}}},{"or":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":52610}}}}},{"and":{"vals":[{"dotIsActive":{"spellId":{"spellId":49800}}},{"cmp":{"op":"OpGt","lhs":{"math":{"op":"OpSub","lhs":{"remainingTime":{}},"rhs":{"dotRemainingTime":{"spellId":{"spellId":49800}}}}},"rhs":{"const":{"val":"10s"}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":52610}}},"rhs":{"math":{"op":"OpAdd","lhs":{"dotRemainingTime":{"spellId":{"spellId":49800}}},"rhs":{"const":{"val":"4s"}}}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":52610}}},"rhs":{"remainingTime":{}}}},{"cmp":{"op":"OpGe","lhs":{"catNewSavageRoarDuration":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"dotRemainingTime":{"spellId":{"spellId":49800}}},"rhs":{"const":{"val":"25s"}}}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":52610}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":16870}}}}},{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":50334}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"25"}}}}]}},{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":50334}}}}},{"cmp":{"op":"OpLt","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"67"}}}}]}}]}},{"or":{"vals":[{"and":{"vals":[{"dotIsActive":{"spellId":{"spellId":49800}}},{"auraIsActive":{"auraId":{"spellId":52610}}},{"cmp":{"op":"OpGe","lhs":{"dotRemainingTime":{"spellId":{"spellId":49800}}},"rhs":{"const":{"val":"4s"}}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"spellId":52610}}},"rhs":{"const":{"val":"4s"}}}}]}},{"and":{"vals":[{"dotIsActive":{"spellId":{"spellId":49800}}},{"cmp":{"op":"OpLt","lhs":{"math":{"op":"OpSub","lhs":{"remainingTime":{}},"rhs":{"dotRemainingTime":{"spellId":{"spellId":49800}}}}},"rhs":{"const":{"val":"10s"}}}}]}},{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":48577}}}}, - {"action":{"condition":{"and":{"vals":[{"auraShouldRefresh":{"auraId":{"spellId":48566},"maxOverlap":{"const":{"val":"1s"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":16870}}}}}]}},"castSpell":{"spellId":{"spellId":48566}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":16870}}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":48574}}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"9s"}}}}]}},"castSpell":{"spellId":{"spellId":48574}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":16870}}},{"cmp":{"op":"OpGe","lhs":{"catExcessEnergy":{}},"rhs":{"const":{"val":"120"}}}}]}},{"cmp":{"op":"OpEq","lhs":{"const":{"val":"1"}},"rhs":{"const":{"val":"0"}}}}]}},"castSpell":{"spellId":{"spellId":48566}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":16870}}},{"cmp":{"op":"OpGe","lhs":{"catExcessEnergy":{}},"rhs":{"const":{"val":"42s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":48572}}}} - ] -} \ No newline at end of file + "type": "TypeAPL", + "prepullActions": [ + {"action":{"activateAura":{"auraId":{"spellId":16870}}},"doAtValue":{"const":{"val":"-1s"}}}, + {"action":{"castSpell":{"spellId":{"spellId":50334}}},"doAtValue":{"const":{"val":"-1s"}}} + ], + "priorityList": [ + {"action":{"autocastOtherCooldowns":{}}}, + {"action":{"condition":{"const":{"val":"false"}},"castSpell":{"spellId":{"spellId":50334}}}}, + {"action":{"catOptimalRotationAction":{"manualParams":false,"maxFfDelay":0.1,"minRoarOffset":25,"ripLeeway":4,"useRake":true,"useBite":true,"biteTime":4}}} + ] +} diff --git a/ui/feral_druid/presets.ts b/ui/feral_druid/presets.ts index 523d4be4e8..4e25339fa6 100644 --- a/ui/feral_druid/presets.ts +++ b/ui/feral_druid/presets.ts @@ -64,7 +64,7 @@ export const DefaultRotation = FeralDruidRotation.create({ prePopOoc: true, }); -export const ROTATION_PRESET_LEGACY_DEFAULT = PresetUtils.makePresetSimpleRotation('Legacy Default', Spec.SpecFeralDruid, DefaultRotation); +export const SIMPLE_ROTATION_DEFAULT = PresetUtils.makePresetSimpleRotation('Simple Default', Spec.SpecFeralDruid, DefaultRotation); // Default talents. Uses the wowhead calculator format, make the talents on // https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. diff --git a/ui/feral_druid/sim.ts b/ui/feral_druid/sim.ts index ea429b1a75..05014e7c54 100644 --- a/ui/feral_druid/sim.ts +++ b/ui/feral_druid/sim.ts @@ -1,5 +1,6 @@ import { Class, + Cooldowns, Debuffs, Faction, IndividualBuffs, @@ -18,12 +19,22 @@ import { Stats } from '../core/proto_utils/stats.js'; import { getSpecIcon, specNames } from '../core/proto_utils/utils.js'; import { Player } from '../core/player.js'; +import { + FeralDruid_Rotation as DruidRotation, +} from '../core/proto/druid.js'; + import * as IconInputs from '../core/components/icon_inputs.js'; import * as OtherInputs from '../core/components/other_inputs.js'; +import * as AplUtils from '../core/proto_utils/apl_utils.js'; import * as DruidInputs from './inputs.js'; import * as Presets from './presets.js'; -import { APLRotation } from 'ui/core/proto/apl.js'; +import { + APLAction, + APLPrepullAction, + APLListItem, + APLRotation, +} from '../core/proto/apl.js'; const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { cssClass: 'feral-druid-sim-ui', @@ -153,7 +164,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { Presets.StandardTalents, ], rotations: [ - Presets.ROTATION_PRESET_LEGACY_DEFAULT, + Presets.SIMPLE_ROTATION_DEFAULT, Presets.APL_ROTATION_DEFAULT, ], // Preset gear configurations that the user can quickly select. @@ -170,6 +181,32 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { return Presets.APL_ROTATION_DEFAULT.rotation.rotation!; }, + simpleRotation: (player: Player, simple: DruidRotation, cooldowns: Cooldowns): APLRotation => { + let [prepullActions, actions] = AplUtils.standardCooldownDefaults(cooldowns); + + const preOmen = APLPrepullAction.fromJsonString(`{"action":{"activateAura":{"auraId":{"spellId":16870}}},"doAtValue":{"const":{"val":"-1s"}}}`); + const preZerk = APLPrepullAction.fromJsonString(`{"action":{"castSpell":{"spellId":{"spellId":50334}}},"doAtValue":{"const":{"val":"-1s"}}}`); + const blockZerk = APLAction.fromJsonString(`{"condition":{"const":{"val":"false"}},"castSpell":{"spellId":{"spellId":50334}}}`); + const doRotation = APLAction.fromJsonString(`{"catOptimalRotationAction":{"rotationType":${simple.rotationType},"manualParams":${simple.manualParams},"maxFfDelay":${simple.maxFfDelay.toFixed(2)},"minRoarOffset":${simple.minRoarOffset.toFixed(2)},"ripLeeway":${simple.ripLeeway.toFixed(0)},"useRake":${simple.useRake},"useBite":${simple.useBite},"biteTime":${simple.biteTime.toFixed(2)},"flowerWeave":${simple.flowerWeave}}}`); + + prepullActions.push(...[ + simple.prePopOoc ? preOmen: null, + simple.prePopBerserk ? preZerk: null, + ].filter(a => a) as Array) + + actions.push(...[ + blockZerk, + doRotation, + ].filter(a => a) as Array) + + return APLRotation.create({ + prepullActions: prepullActions, + priorityList: actions.map(action => APLListItem.create({ + action: action, + })) + }); + }, + raidSimPresets: [ { spec: Spec.SpecFeralDruid,