Skip to content

[Hunter] Prioritize PTR Liquid Luster execute windows - #11938

Draft
Alkwer wants to merge 2 commits into
simulationcraft:midnightfrom
Alkwer:mm-ptr-luster-priority
Draft

Alkwer wants to merge 2 commits into
simulationcraft:midnightfrom
Alkwer:mm-ptr-luster-priority

Conversation

@Alkwer

@Alkwer Alkwer commented Oct 12, 2026 •

Copy link
Copy Markdown

The PTR MM cooldown list evaluates the generic potion action before its specialized Liquid Luster rule, so the generic potion can win when both are eligible. This gives Luster priority in the existing Recklessness/Bullseye pre-Trueshot window and adds a fallback during active Trueshot at full Bullseye stacks with more than 20 seconds remaining.

Both Luster rules now require Recklessness and Bullseye. The unconditional end-of-fight fallback stays on the generic potion action. This prevents the prioritized Luster rule from replacing the opener potion in a short fight or replacing a different selected potion. The comment describes the preference without claiming a universal critical-strike cap.

Draft for maintainer review and release-build validation. Only the PTR cds potion rules and their generated marksmanship_ptr() C++ change; shot priorities remain the upstream defaults.

Measured with official Windows nightly af05b9e, PTR 12.1.5.70077, hotfix 2026-10-07/70077. The branch starts at 80f9547, whose only change since that nightly is in sc_evoker.cpp. Base PTR TXT/generated actions match the tested native default.

Current-code results, Patchwerk 1T, personal Font + Heart gear, Recklessness, 20,000 requested iterations per cell (19,999 reported samples), threads=1, fixed_time=1, vary_combat_length=0.2, target_error=0, seed=2026101291. Ten new candidate runs were compared with the saved native controls on the same official executable; actor, seed and complete runtime settings were verified identical within each pair.

Hero / nominal duration Default DPS Proposed DPS Delta Approx. delta SE, pp
Sentinel, 240s 201976.4 201976.4 +0.000% identical
Sentinel, 300s 201583.9 201804.7 +0.110% 0.036
Sentinel, 360s 199821.2 200050.9 +0.115% 0.030
Sentinel, 450s 193155.6 193254.8 +0.051% 0.032
Sentinel, 600s 188724.4 188796.7 +0.038% 0.025
Dark Ranger, 240s 187977.0 187977.0 +0.000% identical
Dark Ranger, 300s 188246.6 188527.2 +0.149% 0.035
Dark Ranger, 360s 186915.4 187214.6 +0.160% 0.030
Dark Ranger, 450s 180660.1 180701.6 +0.023% 0.032
Dark Ranger, 600s 176930.8 176919.6 -0.006% 0.024

At 240s, collected gameplay data is identical. The 300s/360s results support a small gain for these profiles. The 450s/600s differences, including the small negative DR600 estimate, have approximate 95% intervals overlapping zero. Delta SE combines the two marginal standard errors scaled by baseline DPS; iteration covariance is unavailable, so this is not a paired significance claim. This table applies to the guarded policy in the current head.

Regression checks, 2,000 requested iterations per run (1,999 samples), seed=2026101299, fixed_time=1, vary_combat_length=0:

  • Sentinel 20s / Recklessness: 500871.896 DPS, exactly matching default, with Recklessness on the opener. The removed unconditional Luster terminal fallback had produced 468667.577 DPS in this case.
  • Both heroes at 20/30/31/60s / Recklessness: all eight comparisons have identical collected_data, buffs, procs and gains to default.
  • Sentinel 330s / Alluring Nostrum: 190209.082 DPS, exactly matching default, with both uses remaining Alluring Nostrum.
  • These nine comparisons used 16 new simulations plus two saved native controls. Potion action/buff data confirms the selected potions; the shared stats entry's id/spell_name label may differ because Luster is declared first, while its execution counters match.

Review scope: one player gear/talent pair per hero, plus bounded short-fight and alternate-potion regressions. Broader gear/stat, talent, AoE, DungeonRoute and release-build validation remain needed. Full Bullseye + Trueshot does not guarantee a universal crit cap; Recklessness can select another highest secondary and Penetrating Shots can preserve value from extra crit. The active-Trueshot fallback retains its tested >20s guard, so it may use less than Luster's full 30s ramp. Potion cooldown and trinket rules are unchanged. Without Bullseye, neither Luster rule is eligible (checked statically; no dedicated no-Bullseye simulation).

The repository's ConvertAPL.py was rerun and checked for idempotence; generated actions match the tested TXT exactly, and C++ outside marksmanship_ptr() is unchanged. The updated translation unit compiled with MSVC 19.44. Full build/CI and release validation are still pending.

Reproduce with the pinned af05b9e simulator. With this PR checked out, extract complete APL files (bash), then save the profiles below:

git show 80f9547c41b11c6fe15783539459c28ae49acb63:engine/class_modules/apl/hunter/mm_ptr.txt > baseline-apl.simc
git show HEAD:engine/class_modules/apl/hunter/mm_ptr.txt > candidate-apl.simc
simc sentinel.simc input=baseline-apl.simc max_time=300 json=sentinel-baseline.json
simc sentinel.simc input=candidate-apl.simc max_time=300 json=sentinel-candidate.json
simc darkranger.simc input=baseline-apl.simc max_time=300 json=dr-baseline.json
simc darkranger.simc input=candidate-apl.simc max_time=300 json=dr-candidate.json
# Repeat each hero at max_time=240,360,450,600.

# Short-fight regression (repeat both heroes at 20,30,31,60):
simc sentinel.simc input=baseline-apl.simc max_time=20 vary_combat_length=0 iterations=2000 seed=2026101299 potion=potion_of_recklessness_2 json=short-baseline.json
simc sentinel.simc input=candidate-apl.simc max_time=20 vary_combat_length=0 iterations=2000 seed=2026101299 potion=potion_of_recklessness_2 json=short-candidate.json
# Alternate-potion regression:
simc sentinel.simc input=baseline-apl.simc max_time=330 vary_combat_length=0 iterations=2000 seed=2026101299 potion=alluring_nostrum_2 json=nostrum-baseline.json
simc sentinel.simc input=candidate-apl.simc max_time=330 vary_combat_length=0 iterations=2000 seed=2026101299 potion=alluring_nostrum_2 json=nostrum-candidate.json

JSON DPS mean and mean_std_dev are under sim.players[0].collected_data.dps. The tables use the binary's native default controls; previously verified native-vs-inline baseline runs reproduce the same gameplay data.

sentinel.simc (native control profile/settings; output path removed)
ptr=1
hunter="Veratrot"
level=90
race=vulpera
region=eu
server=burning_legion
role=attack
professions=alchemy=100/inscription=1
spec=marksmanship
omnium_talents=136814:1/136815:1/136817:1/136819:1/136822:1
head=,id=271492,enchant_id=8017,bonus_id=6652/13335/12854/13696/13692/13698/1587,redirected_base_stats=268230
neck=,id=268265,gem_id=240983/240908,bonus_id=6652/13668/13334/13987/12854
shoulder=,id=271490,enchant_id=8001,bonus_id=13335/13694/6652/13697/12851,content_tuning=1040
back=,id=193763,bonus_id=13440/6652/13662/12699/12846,content_tuning=1279
chest=,id=271876,enchant_id=7987,bonus_id=6652/13662/13334/13846/12854
wrist=,id=244584,bonus_id=12214/13667/12497/13751/14001/8960/12384/8791/13836/13696,content_tuning=3615,crafted_stats=40/36,crafting_quality=5
hands=,id=271493,bonus_id=6652/13440/13691/13697/12846,redirected_base_stats=193752
waist=,id=244581,gem_id=240890,bonus_id=12214/13667/13695/12497/13751/14001/8960/12384/8791/13836/13696,content_tuning=3615,crafted_stats=36/32,crafting_quality=5
legs=,id=271491,enchant_id=8159,bonus_id=12846/6652/13440/13693/13698/1574,redirected_base_stats=159375
feet=,id=159388,enchant_id=7963,bonus_id=13440/6652/13662/12699/12846,content_tuning=1279
finger1=,id=251136,enchant_id=7967,gem_id=240908,bonus_id=13440/6652/13668/12699/12846,content_tuning=1279
finger2=,id=158366,enchant_id=7967,gem_id=240908,bonus_id=13440/6652/13668/12699/12854
trinket1=,id=270168,bonus_id=6652/13334/12854
trinket2=,id=270175,bonus_id=6652/13334/12854
main_hand=,id=268207,enchant_id=8689,bonus_id=6652/13334/13708/12854
temporary_enchant=
midnight.crucible_of_erratic_energies_violence=1
midnight.crucible_of_erratic_energies_sustenance=1
midnight.crucible_of_erratic_energies_predation=1
dragonflight.ruby_whelp_shell_training=
calculate_scale_factors=0
scale_only=strength,intellect,agility,crit,mastery,vers,haste,weapon_dps,weapon_offhand_dps
override.bloodlust=1
override.arcane_intellect=1
override.power_word_fortitude=1
override.battle_shout=1
override.mystic_touch=1
override.chaos_brand=1
override.skyfury=1
override.mark_of_the_wild=1
override.hunters_mark=1
override.bleeding=1
talents=C4PAD57yiELKEty14ekTDtZEqwCMwMGGLDgZwGAAAAAAAAYGzYmltZMzMmBPgxMGM2WmZmZmZmZmFmZZwMAAgxMzYAMjNGGgNmZbGD

desired_targets=1
max_time=300
vary_combat_length=0.2
max_prio_damage=1
fixed_time=1
single_actor_batch=1
optimize_expressions=1
threads=1
iterations=20000
target_error=0
seed=2026101291
report_details=1
darkranger.simc (native control profile/settings; output path removed)
ptr=1
hunter="Veratrot"
level=90
race=vulpera
region=eu
server=burning_legion
role=attack
professions=alchemy=100/inscription=1
spec=marksmanship
omnium_talents=136814:1/136815:1/136817:1/136819:1/136822:1
head=,id=271492,enchant_id=8017,bonus_id=6652/13335/12854/13696/13692/13698/1587,redirected_base_stats=268230
neck=,id=268265,gem_id=240983/240908,bonus_id=6652/13668/13334/13987/12854
shoulder=,id=271490,enchant_id=8001,bonus_id=13335/13694/6652/13697/12851,content_tuning=1040
back=,id=193763,bonus_id=13440/6652/13662/12699/12846,content_tuning=1279
chest=,id=271876,enchant_id=7987,bonus_id=6652/13662/13334/13846/12854
wrist=,id=244584,bonus_id=12214/13667/12497/13751/14001/8960/12384/8791/13836/13696,content_tuning=3615,crafted_stats=40/36,crafting_quality=5
hands=,id=271493,bonus_id=6652/13440/13691/13697/12846,redirected_base_stats=193752
waist=,id=244581,gem_id=240890,bonus_id=12214/13667/13695/12497/13751/14001/8960/12384/8791/13836/13696,content_tuning=3615,crafted_stats=36/32,crafting_quality=5
legs=,id=271491,enchant_id=8159,bonus_id=12846/6652/13440/13693/13698/1574,redirected_base_stats=159375
feet=,id=159388,enchant_id=7963,bonus_id=13440/6652/13662/12699/12846,content_tuning=1279
finger1=,id=251136,enchant_id=7967,gem_id=240908,bonus_id=13440/6652/13668/12699/12846,content_tuning=1279
finger2=,id=158366,enchant_id=7967,gem_id=240908,bonus_id=13440/6652/13668/12699/12854
trinket1=,id=270168,bonus_id=6652/13334/12854
trinket2=,id=270175,bonus_id=6652/13334/12854
main_hand=,id=268207,enchant_id=8689,bonus_id=6652/13334/13708/12854
temporary_enchant=
midnight.crucible_of_erratic_energies_violence=1
midnight.crucible_of_erratic_energies_sustenance=1
midnight.crucible_of_erratic_energies_predation=1
dragonflight.ruby_whelp_shell_training=
calculate_scale_factors=0
scale_only=strength,intellect,agility,crit,mastery,vers,haste,weapon_dps,weapon_offhand_dps
override.bloodlust=1
override.arcane_intellect=1
override.power_word_fortitude=1
override.battle_shout=1
override.mystic_touch=1
override.chaos_brand=1
override.skyfury=1
override.mark_of_the_wild=1
override.hunters_mark=1
override.bleeding=1
talents=C4PAD57yiELKEty14ekTDtZEqYzsMwAGwMsFYWAAAAAAAAAzYGzssNjZmxM4BMNjBjtlZmZmZmZmBzsMYGAAwYmZMzMDAGGgNmZbGD

desired_targets=1
max_time=300
vary_combat_length=0.2
max_prio_damage=1
fixed_time=1
single_actor_batch=1
optimize_expressions=1
threads=1
iterations=20000
target_error=0
seed=2026101291
report_details=1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant