Skip to content

Instantly share code, notes, and snippets.

@cgdangelo
Last active April 13, 2017 17:21
Show Gist options
  • Save cgdangelo/7b50e0ab7034d99621fc87684e537914 to your computer and use it in GitHub Desktop.
Save cgdangelo/7b50e0ab7034d99621fc87684e537914 to your computer and use it in GitHub Desktop.
# @TODO (Legos) Gravity Spiral. Check for Evocation charges before ending burn phase?
# @TODO (Legos) Cord of Infinity. Affects MoA usage? At how many stacks? Sync only with AP? How long to delay?
# @TODO (Legos) Mystic Kilt of the Rune Master. Likely has some effect on mana breakpoints and rotational differences, specifically in conserve.
# @TODO (Trinkets) On-use trinkets need some love.
# @TODO (Trinkets) So far "gaming" Whispers has not made a difference, but triple-check to be safe.
# @TODO (Talents) Implement the other shit talents that no one cares about.
# @TODO (Talents) Talent overrides.
# @TODO (Rotation) Steal old AM travel time hack from T18 APL again, see if that makes a difference anyway.
# @TODO (Rotation) Reacting to Touch of the Magi, if worthwhile.
# @TODO Steal more of default APL and just add optimizations to that idk there should be more dps here >:(
# @FIXME I appear to be working on Arcane in 2017, clearly a bug.
html=dikembe.html
../profiles/Tier19M_NH/Mage_Arcane_T19M_NH.simc
copy=Dikembe
actions.precombat=flask
actions.precombat+=/food
actions.precombat+=/augmentation,type=defiled
actions.precombat+=/summon_arcane_familiar
actions.precombat+=/snapshot_stats
actions.precombat+=/mirror_image
actions.precombat+=/potion
actions.precombat+=/mark_of_aluneth,if=talent.charged_up.enabled
actions.precombat+=/arcane_blast
########################################################################################################################
# Default Actions #
########################################################################################################################
actions=
# Tracks the current number of Arcane Missiles! procs that the player is aware of.
actions+=/variable,name=missiles_procs,op=set,value=buff.arcane_missiles.react
# We can update the value of this variable after each burn phase completes, which will give us a heuristic to help
# approximate the next expected burn.
actions+=/variable,name=average_burn_length,op=set,value=(variable.average_burn_length+burn_phase_duration)%variable.total_burns,if=burn_phase&prev_gcd.1.evocation
# This is merely a guess as to when the next burn phase will occur, based on the average length of prior burns. We do not
# necessarily need Evocation to be off cooldown to begin burning; rather, we need Evocation to be off cooldown by the
# time that we _end_ burning. We do, however, need Arcane Power to be ready to begin burning. Thus, we can use whatever
# is higher: Evocation's cooldown minus the burn length, or Arcane Power's cooldown.
actions+=/variable,name=time_until_burn,op=set,value=cooldown.evocation.remains-variable.average_burn_length
actions+=/variable,name=time_until_burn,op=max,value=cooldown.arcane_power.remains
# Determines Time Warp usage. As long as we don't have the buff, we use lust on pull, whenever a burn phase is active
# or when the target will be dead by the time the buff wears off (40 seconds). With Shard of the Exodar equipped,
# this effectively gives us 3 lusts: one from ourselves on pull, another from the raid (Hunter/Mage/Shaman or drums),
# and a final one when our Time Warp is off cooldown again (5:00 or later). We prefer to use the latter 2 when
# entering another burn phase, i.e., during Arcane Power.
actions+=/time_warp,if=buff.bloodlust.down&(time=0|burn_phase|target.time_to_die<=buff.bloodlust.duration)
# Arcane Charges amplify the damage of most abilities, so we build a full stack before continuing.
actions+=/call_action_list,name=build,if=buff.arcane_charge.stack<4
# Process the burn actions if we are already inside a burn phase, or ready to start one. `burn_phase` is a flag that is
# toggled on and off in the `actions.burn` list. When it has a truthy value, that means we are currently in a burn phase.
#
# We start a burn phase under these conditions:
# * Arcane Power is ready
# * Evocation will be ready before the burn ends
# * Mark of Aluneth is ready, or on cooldown for too long to justify a delay
#
# Alternatively, we start a burn when the target will die before the burn ends. We effectively seek to end the fight
# with minimal mana.
actions+=/call_action_list,name=burn,if=burn_phase|(cooldown.arcane_power.up&cooldown.evocation.remains<=variable.average_burn_length&(cooldown.mark_of_aluneth.up|cooldown.mark_of_aluneth.remains>20))|target.time_to_die<=variable.average_burn_length
# The goal of our conserve phase is to ensure that we will have enough mana to be casting throughout our burn phase.
actions+=/call_action_list,name=conserve
########################################################################################################################
# Build Actions #
########################################################################################################################
actions.build=
# Charged Up will grant us 4 Arcane Charges instantly, but it does introduce a rotational problem. During a conserve
# phase, to preserve mana we will have to cast Arcane Barrage. We then rebuild Arcane Charges with Charged Up. Now we
# have insufficient mana to cast Arcane Blast, but Arcane Barrage is still on cooldown. In the absence of any other
# suitable actions, Robomage is forced to sit and wait for Arcane Barrage to be available again. The exception is
# during burn phases, where we don't care about mana usage.
actions.build+=/charged_up,if=buff.arcane_charge.stack<2&cooldown.arcane_barrage.up|burn_phase
# There's no sense in us wasting a proc of Arcane Missiles, so we cast AM at max stacks.
actions.build+=/arcane_missiles,if=variable.missiles_procs=3
actions.build+=/arcane_explosion,if=active_enemies>1
actions.build+=/arcane_blast
# These actions should never be called. Using Arcane Explosion on single target or Arcane Barrage at less than
# 4 stacks indicates that we probably mismanaged our mana at some point.
actions.build+=/arcane_explosion
actions.build+=/arcane_barrage
########################################################################################################################
# Conserve Actions #
########################################################################################################################
actions.conserve=
actions.conserve+=/mark_of_aluneth,if=cooldown.arcane_power.remains>20|target.time_to_die<recharge_time
actions.conserve+=/rune_of_power,if=cooldown.arcane_power.remains>recharge_time&(cooldown.mark_of_aluneth.remains>recharge_time|prev_gcd.1.mark_of_aluneth)
actions.conserve+=/arcane_missiles
actions.conserve+=/arcane_barrage,if=buff.rune_of_power.remains<=travel_time
actions.conserve+=/arcane_blast,if=buff.rune_of_power.up|mana.pct>90
actions.conserve+=/arcane_barrage
########################################################################################################################
# Burn Actions #
########################################################################################################################
actions.burn=
# Increment our burn phase counter. Whenever we enter the `burn` actions without being in a burn phase, it means that
# we are about to start one.
actions.burn+=/variable,name=total_burns,op=add,value=1,if=!burn_phase
# Presence of Mind usage can be slightly different depending on talent choice. We want our 2 instant Arcane Blast to be
# inside Arcane Power, but with the Rune of Power talent we also want them to be within the RoP buff to maximize damage.
# Therefore, this variable essentially stores the remaining time on whatever will end first: AP or RoP.
actions.burn+=/variable,name=damage_buff_remains,op=set,value=buff.arcane_power.remains
actions.burn+=/variable,name=damage_buff_remains,op=min,value=buff.rune_of_power.remains,if=talent.rune_of_power.enabled
#actions.burn+=/variable,name=damage_buff_remains,op=setif,condition=talent.rune_of_power.enabled,value=buff.rune_of_power.remains,value_else=buff.arcane_power.remains
# Handle the burn_phase flag, indicating whether or not we are actually in a burn phase. Conditions for starting a burn
# phase were already evaluated in default action (thus, we entered the `burn` actions), and we consider the end of a
# burn to be when Evocation is cast.
actions.burn+=/start_burn_phase,if=!burn_phase
actions.burn+=/stop_burn_phase,if=burn_phase&burn_phase_duration>0&prev_gcd.1.evocation
actions.burn+=/mark_of_aluneth
actions.burn+=/rune_of_power
actions.burn+=/arcane_power
actions.burn+=/berserking
actions.burn+=/blood_fury
# Second potion is meant to be used during burn, of course, but Troll/Orc have some worthwhile racials that warrant
# delaying potion usage for the next burn, if we can make it before the target dies.
actions.burn+=/potion,if=((race.troll&buff.berserking.up)|(race.orc&buff.blood_fury.up))
actions.burn+=/potion,if=((race.troll&cooldown.berserking.remains>target.time_to_die)|(race.orc&cooldown.blood_fury.remains>target.time_to_die))
actions.burn+=/potion,if=!(race.troll|race.orc)
# See above explanation for Presence of Mind usage.
actions.burn+=/presence_of_mind,if=variable.damage_buff_remains<=2*action.arcane_blast.execute_time
actions.burn+=/arcane_blast,if=buff.presence_of_mind.up
# Arcane Missiles has higher DPET compared to Arcane Blast. Use procs as they come.
actions.burn+=/arcane_missiles,if=variable.missiles_procs
actions.burn+=/arcane_blast
# We can squeeze out some extra damage during a burn with Charged Up. Arcane Barrage will provide an extra chance to
# proc Arcane Missiles itself, and the GCD maybe provide enough mp5 regen to use another Arcane Blast.
actions.burn+=/arcane_barrage,if=cooldown.charged_up.remains<=execute_time
#@FIXME Maybe? Was meant to Barrage and use CU after Evo, not before, but using it before seems just as effective.
#actions.burn+=/arcane_barrage,if=talent.charged_up.enabled&cooldown.charged_up.remains<=action.evocation.tick_time*ceil(mana.deficit%(mana.max%2))
# Throughout my testing, channeling more than 2 ticks of Evocation has been a pretty notable DPS loss (upwards of 7-8k).
actions.burn+=/evocation,interrupt_if=ticks=2|mana.pct=100
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment