Ovale Spell Priority

Ovale Spell Priority

6M Downloads

Arcane Mage rotation completely broken

flatluigi opened this issue ยท 1 comments

commented

Something's busted with however Ovale's working with the Arcane Mage simcraft profile, producing a rotation that's nonsensical and extremely low-power -- it has you getting to 4 charges, slowly using Arcane Explosion right before Quickening runs out (i.e. every four seconds), and never using Mark of Aluneth, Arcane Power, or Rune of Power.

Here's the profile I got straight from my simulation:

mage="Qarrion"
level=110
race=goblin
role=spell
`position=back
professions=tailoring=800/enchanting=796
talents=1121112
artifact=4:0:0:0:0:73:1:74:3:75:3:78:1:79:3:80:1:81:3:82:3:83:1:84:3:87:1:290:1:1169:1:1339:1
spec=arcane

This default action priority list is automatically created based on your character.

It is a attempt to provide you with a action list that is both simple and practicable,

while resulting in a meaningful and good simulation. It may not result in the absolutely highest possible dps.

Feel free to edit, adapt and improve it to your own needs.

SimulationCraft is always looking for updates and improvements to the default action lists.

Executed before combat begins. Accepts non-harmful actions only.

actions.precombat=flask,type=flask_of_the_whispered_pact
actions.precombat+=/food,type=the_hungry_magister
actions.precombat+=/augmentation,type=defiled
actions.precombat+=/summon_arcane_familiar
actions.precombat+=/snapshot_stats
actions.precombat+=/mirror_image
actions.precombat+=/potion,name=deadly_grace
actions.precombat+=/arcane_blast

Executed every time the actor is available.

actions=counterspell,if=target.debuff.casting.react
actions+=/time_warp,if=(time=0&buff.bloodlust.down)|(buff.bloodlust.down&equipped.132410)
actions+=/mirror_image,if=buff.arcane_power.down
actions+=/stop_burn_phase,if=prev_gcd.evocation&burn_phase_duration>gcd.max
actions+=/mark_of_aluneth,if=cooldown.arcane_power.remains>20
actions+=/call_action_list,name=build,if=buff.arcane_charge.stack<4
actions+=/call_action_list,name=init_burn,if=buff.arcane_power.down&buff.arcane_charge.stack=4&(cooldown.mark_of_aluneth.remains=0|cooldown.mark_of_aluneth.remains>20)&(!talent.rune_of_power.enabled|(cooldown.arcane_power.remains<=action.rune_of_power.cast_time|action.rune_of_power.recharge_time<cooldown.arcane_power.remains))|target.time_to_die<45
actions+=/call_action_list,name=burn,if=burn_phase
actions+=/call_action_list,name=rop_phase,if=buff.rune_of_power.up&!burn_phase
actions+=/call_action_list,name=conserve

actions.build=charged_up,if=buff.arcane_charge.stack<=1
actions.build+=/arcane_missiles,if=buff.arcane_missiles.react=3
actions.build+=/arcane_orb
actions.build+=/arcane_explosion,if=active_enemies>1
actions.build+=/arcane_blast

actions.burn=call_action_list,name=cooldowns
actions.burn+=/arcane_missiles,if=buff.arcane_missiles.react=3
actions.burn+=/arcane_explosion,if=buff.quickening.remains<action.arcane_blast.cast_time&talent.quickening.enabled
actions.burn+=/presence_of_mind,if=buff.arcane_power.remains>2gcd
actions.burn+=/nether_tempest,if=dot.nether_tempest.remains<=2|!ticking
actions.burn+=/arcane_blast,if=active_enemies<=1&mana.pct%10
execute_time>target.time_to_die
actions.burn+=/arcane_explosion,if=active_enemies>1&mana.pct%10*execute_time>target.time_to_die
actions.burn+=/arcane_missiles,if=buff.arcane_missiles.react>1
actions.burn+=/arcane_explosion,if=active_enemies>1&buff.arcane_power.remains>cast_time
actions.burn+=/arcane_blast,if=buff.presence_of_mind.up|buff.arcane_power.remains>cast_time
actions.burn+=/supernova,if=mana.pct<100
actions.burn+=/arcane_missiles,if=mana.pct>10&(talent.overpowered.enabled|buff.arcane_power.down)
actions.burn+=/arcane_explosion,if=active_enemies>1
actions.burn+=/arcane_blast
actions.burn+=/evocation,interrupt_if=mana.pct>99

actions.conserve=arcane_missiles,if=buff.arcane_missiles.react=3
actions.conserve+=/arcane_explosion,if=buff.quickening.remains<action.arcane_blast.cast_time&talent.quickening.enabled
actions.conserve+=/arcane_blast,if=mana.pct>99
actions.conserve+=/nether_tempest,if=(refreshable|!ticking)
actions.conserve+=/arcane_blast,if=buff.rhonins_assaulting_armwraps.up&equipped.132413
actions.conserve+=/arcane_missiles
actions.conserve+=/supernova,if=mana.pct<100
actions.conserve+=/frost_nova,if=equipped.132452
actions.conserve+=/arcane_explosion,if=mana.pct>=82&equipped.132451&active_enemies>1
actions.conserve+=/arcane_blast,if=mana.pct>=82&equipped.132451
actions.conserve+=/arcane_barrage,if=mana.pct<100&cooldown.arcane_power.remains>5
actions.conserve+=/arcane_explosion,if=active_enemies>1
actions.conserve+=/arcane_blast

actions.cooldowns=rune_of_power,if=mana.pct>45&buff.arcane_power.down
actions.cooldowns+=/arcane_power
actions.cooldowns+=/blood_fury
actions.cooldowns+=/berserking
actions.cooldowns+=/arcane_torrent
actions.cooldowns+=/potion,name=deadly_grace,if=buff.arcane_power.up

actions.init_burn=mark_of_aluneth
actions.init_burn+=/frost_nova,if=equipped.132452
actions.init_burn+=/nether_tempest,if=dot.nether_tempest.remains<10&(prev_gcd.mark_of_aluneth|(talent.rune_of_power.enabled&cooldown.rune_of_power.remains<gcd.max))
actions.init_burn+=/rune_of_power
actions.init_burn+=/start_burn_phase,if=((cooldown.evocation.remains-(2*burn_phase_duration))%2<burn_phase_duration)|cooldown.arcane_power.remains=0|target.time_to_die<55

actions.rop_phase=arcane_missiles,if=buff.arcane_missiles.react=3
actions.rop_phase+=/arcane_explosion,if=buff.quickening.remains<action.arcane_blast.cast_time&talent.quickening.enabled
actions.rop_phase+=/nether_tempest,if=dot.nether_tempest.remains<=2|!ticking
actions.rop_phase+=/arcane_missiles,if=buff.arcane_charge.stack=4
actions.rop_phase+=/arcane_explosion,if=active_enemies>1
actions.rop_phase+=/arcane_blast,if=mana.pct>45
actions.rop_phase+=/arcane_barrage

head=mana_scavengers_mask,id=141449,bonus_id=1482/3336
neck=roughhammered_silver_necklace,id=134187,bonus_id=3473/1808/1502/1674,enchant_id=5439
shoulders=mantle_of_tirisgarde,id=139752,bonus_id=3386/3384
back=windwhipped_greatcloak,id=141541,bonus_id=1808/1482/3336,enchant_id=5436
chest=belovirs_final_stand,id=133977,bonus_id=1811/3458
wrists=tunnel_fiend_bracers,id=134435,bonus_id=1727/1507/3337
hands=manawracker_gloves,id=134305,bonus_id=3432/1512/3337,enchant_id=5447
waist=bonespeaker_cinch,id=134215,bonus_id=3474/1507/1674

legs=oncefashionable_narthalas_leggings,id=139595
feet=seawitch_sandals,id=134264,bonus_id=3432/1512/3337
finger1=cursed_wardens_keepsake,id=141546,bonus_id=3466/1477/3336,enchant_id=5429
finger2=ring_of_deep_sea_pearls,id=141545,bonus_id=1472,enchant_id=5429
trinket1=devilsaur_shockbaton,id=140030,bonus_id=3473/1492/1674
trinket2=bleached_skull_talisman,id=134204,bonus_id=3474/42/605/1507/1674
main_hand=aluneth,id=127857,bonus_id=729,gem_id=0/0/0/0,relic_id=3473:1502:1674/3474:1507:1674/3432:1507:3336

Gear Summary

gear_ilvl=849.00

gear_stamina=19707

gear_intellect=14999

gear_crit_rating=7189

gear_haste_rating=2432

gear_mastery_rating=7296

gear_versatility_rating=1291

gear_speed_rating=412

gear_armor=1698


and here's the resultant output:

Based on SimulationCraft profile "Qarrion".

class=mage

spec=arcane

talents=1121112

Include(ovale_common)
Include(ovale_trinkets_mop)
Include(ovale_trinkets_wod)
Include(ovale_mage_spells)

AddCheckBox(opt_interrupt L(interrupt) default specialization=arcane)
AddCheckBox(opt_arcane_mage_burn_phase L(arcane_mage_burn_phase) default specialization=arcane)
AddCheckBox(opt_time_warp SpellName(time_warp) specialization=arcane)

AddFunction ArcaneInterruptActions
{
if CheckBoxOn(opt_interrupt) and not target.IsFriend() and target.IsInterruptible()
{
Spell(counterspell)
if not target.Classification(worldboss)
{
Spell(arcane_torrent_mana)
if target.InRange(quaking_palm) Spell(quaking_palm)
}
}
}

actions.default

AddFunction ArcaneDefaultMainActions
{
#stop_burn_phase,if=prev_gcd.evocation&burn_phase_duration>gcd.max
if PreviousGCDSpell(evocation) and GetStateDuration(burn_phase) > GCD() and GetState(burn_phase) > 0 SetState(burn_phase 0)
#call_action_list,name=build,if=buff.arcane_charge.stack<4
if DebuffStacks(arcane_charge_debuff) < 4 ArcaneBuildMainActions()

unless DebuffStacks(arcane_charge_debuff) < 4 and ArcaneBuildMainPostConditions()
{
    #call_action_list,name=init_burn,if=buff.arcane_power.down&buff.arcane_charge.stack=4&(cooldown.mark_of_aluneth.remains=0|cooldown.mark_of_aluneth.remains>20)&(!talent.rune_of_power.enabled|(cooldown.arcane_power.remains<=action.rune_of_power.cast_time|action.rune_of_power.recharge_time<cooldown.arcane_power.remains))|target.time_to_die<45
    if { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) ArcaneInitBurnMainActions()

    unless { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneInitBurnMainPostConditions()
    {
        #call_action_list,name=burn,if=burn_phase
        if GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) ArcaneBurnMainActions()

        unless GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneBurnMainPostConditions()
        {
            #call_action_list,name=rop_phase,if=buff.rune_of_power.up&!burn_phase
            if BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 ArcaneRopPhaseMainActions()

            unless BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 and ArcaneRopPhaseMainPostConditions()
            {
                #call_action_list,name=conserve
                ArcaneConserveMainActions()
            }
        }
    }
}

}

AddFunction ArcaneDefaultMainPostConditions
{
DebuffStacks(arcane_charge_debuff) < 4 and ArcaneBuildMainPostConditions() or { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneInitBurnMainPostConditions() or GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneBurnMainPostConditions() or BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 and ArcaneRopPhaseMainPostConditions() or ArcaneConserveMainPostConditions()
}

AddFunction ArcaneDefaultShortCdActions
{
#stop_burn_phase,if=prev_gcd.evocation&burn_phase_duration>gcd.max
if PreviousGCDSpell(evocation) and GetStateDuration(burn_phase) > GCD() and GetState(burn_phase) > 0 SetState(burn_phase 0)
#mark_of_aluneth,if=cooldown.arcane_power.remains>20
if SpellCooldown(arcane_power) > 20 Spell(mark_of_aluneth)
#call_action_list,name=build,if=buff.arcane_charge.stack<4
if DebuffStacks(arcane_charge_debuff) < 4 ArcaneBuildShortCdActions()

unless DebuffStacks(arcane_charge_debuff) < 4 and ArcaneBuildShortCdPostConditions()
{
    #call_action_list,name=init_burn,if=buff.arcane_power.down&buff.arcane_charge.stack=4&(cooldown.mark_of_aluneth.remains=0|cooldown.mark_of_aluneth.remains>20)&(!talent.rune_of_power.enabled|(cooldown.arcane_power.remains<=action.rune_of_power.cast_time|action.rune_of_power.recharge_time<cooldown.arcane_power.remains))|target.time_to_die<45
    if { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) ArcaneInitBurnShortCdActions()

    unless { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneInitBurnShortCdPostConditions()
    {
        #call_action_list,name=burn,if=burn_phase
        if GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) ArcaneBurnShortCdActions()

        unless GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneBurnShortCdPostConditions()
        {
            #call_action_list,name=rop_phase,if=buff.rune_of_power.up&!burn_phase
            if BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 ArcaneRopPhaseShortCdActions()

            unless BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 and ArcaneRopPhaseShortCdPostConditions()
            {
                #call_action_list,name=conserve
                ArcaneConserveShortCdActions()
            }
        }
    }
}

}

AddFunction ArcaneDefaultShortCdPostConditions
{
DebuffStacks(arcane_charge_debuff) < 4 and ArcaneBuildShortCdPostConditions() or { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneInitBurnShortCdPostConditions() or GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneBurnShortCdPostConditions() or BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 and ArcaneRopPhaseShortCdPostConditions() or ArcaneConserveShortCdPostConditions()
}

AddFunction ArcaneDefaultCdActions
{
#counterspell,if=target.debuff.casting.react
if target.IsInterruptible() ArcaneInterruptActions()
#time_warp,if=(time=0&buff.bloodlust.down)|(buff.bloodlust.down&equipped.132410)
if { TimeInCombat() == 0 and BuffExpires(burst_haste_buff any=1) or BuffExpires(burst_haste_buff any=1) and HasEquippedItem(132410) } and CheckBoxOn(opt_time_warp) and DebuffExpires(burst_haste_debuff any=1) Spell(time_warp)
#mirror_image,if=buff.arcane_power.down
if BuffExpires(arcane_power_buff) Spell(mirror_image)
#stop_burn_phase,if=prev_gcd.evocation&burn_phase_duration>gcd.max
if PreviousGCDSpell(evocation) and GetStateDuration(burn_phase) > GCD() and GetState(burn_phase) > 0 SetState(burn_phase 0)

unless SpellCooldown(arcane_power) > 20 and Spell(mark_of_aluneth)
{
    #call_action_list,name=build,if=buff.arcane_charge.stack<4
    if DebuffStacks(arcane_charge_debuff) < 4 ArcaneBuildCdActions()

    unless DebuffStacks(arcane_charge_debuff) < 4 and ArcaneBuildCdPostConditions()
    {
        #call_action_list,name=init_burn,if=buff.arcane_power.down&buff.arcane_charge.stack=4&(cooldown.mark_of_aluneth.remains=0|cooldown.mark_of_aluneth.remains>20)&(!talent.rune_of_power.enabled|(cooldown.arcane_power.remains<=action.rune_of_power.cast_time|action.rune_of_power.recharge_time<cooldown.arcane_power.remains))|target.time_to_die<45
        if { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) ArcaneInitBurnCdActions()

        unless { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneInitBurnCdPostConditions()
        {
            #call_action_list,name=burn,if=burn_phase
            if GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) ArcaneBurnCdActions()

            unless GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneBurnCdPostConditions()
            {
                #call_action_list,name=rop_phase,if=buff.rune_of_power.up&!burn_phase
                if BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 ArcaneRopPhaseCdActions()

                unless BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 and ArcaneRopPhaseCdPostConditions()
                {
                    #call_action_list,name=conserve
                    ArcaneConserveCdActions()
                }
            }
        }
    }
}

}

AddFunction ArcaneDefaultCdPostConditions
{
SpellCooldown(arcane_power) > 20 and Spell(mark_of_aluneth) or DebuffStacks(arcane_charge_debuff) < 4 and ArcaneBuildCdPostConditions() or { BuffExpires(arcane_power_buff) and DebuffStacks(arcane_charge_debuff) == 4 and { not SpellCooldown(mark_of_aluneth) > 0 or SpellCooldown(mark_of_aluneth) > 20 } and { not Talent(rune_of_power_talent) or SpellCooldown(arcane_power) <= CastTime(rune_of_power) or SpellChargeCooldown(rune_of_power) < SpellCooldown(arcane_power) } or target.TimeToDie() < 45 } and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneInitBurnCdPostConditions() or GetState(burn_phase) > 0 and CheckBoxOn(opt_arcane_mage_burn_phase) and ArcaneBurnCdPostConditions() or BuffPresent(rune_of_power_buff) and not GetState(burn_phase) > 0 and ArcaneRopPhaseCdPostConditions() or ArcaneConserveCdPostConditions()
}

actions.build

AddFunction ArcaneBuildMainActions
{
#charged_up,if=buff.arcane_charge.stack<=1
if DebuffStacks(arcane_charge_debuff) <= 1 Spell(charged_up)
#arcane_missiles,if=buff.arcane_missiles.react=3
if BuffStacks(arcane_missiles_buff) == 3 Spell(arcane_missiles)
#arcane_explosion,if=active_enemies>1
if Enemies() > 1 Spell(arcane_explosion)
#arcane_blast
Spell(arcane_blast)
}

AddFunction ArcaneBuildMainPostConditions
{
}

AddFunction ArcaneBuildShortCdActions
{
unless DebuffStacks(arcane_charge_debuff) <= 1 and Spell(charged_up) or BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles)
{
#arcane_orb
Spell(arcane_orb)
}
}

AddFunction ArcaneBuildShortCdPostConditions
{
DebuffStacks(arcane_charge_debuff) <= 1 and Spell(charged_up) or BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or Enemies() > 1 and Spell(arcane_explosion) or Spell(arcane_blast)
}

AddFunction ArcaneBuildCdActions
{
}

AddFunction ArcaneBuildCdPostConditions
{
DebuffStacks(arcane_charge_debuff) <= 1 and Spell(charged_up) or BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or Spell(arcane_orb) or Enemies() > 1 and Spell(arcane_explosion) or Spell(arcane_blast)
}

actions.burn

AddFunction ArcaneBurnMainActions
{
#call_action_list,name=cooldowns
ArcaneCooldownsMainActions()

unless ArcaneCooldownsMainPostConditions()
{
    #arcane_missiles,if=buff.arcane_missiles.react=3
    if BuffStacks(arcane_missiles_buff) == 3 Spell(arcane_missiles)
    #arcane_explosion,if=buff.quickening.remains<action.arcane_blast.cast_time&talent.quickening.enabled
    if BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) Spell(arcane_explosion)
    #nether_tempest,if=dot.nether_tempest.remains<=2|!ticking
    if target.DebuffRemaining(nether_tempest_debuff) <= 2 or not target.DebuffPresent(nether_tempest_debuff) Spell(nether_tempest)
    #arcane_blast,if=active_enemies<=1&mana.pct%10*execute_time>target.time_to_die
    if Enemies() <= 1 and ManaPercent() / 10 * ExecuteTime(arcane_blast) > target.TimeToDie() Spell(arcane_blast)
    #arcane_explosion,if=active_enemies>1&mana.pct%10*execute_time>target.time_to_die
    if Enemies() > 1 and ManaPercent() / 10 * ExecuteTime(arcane_explosion) > target.TimeToDie() Spell(arcane_explosion)
    #arcane_missiles,if=buff.arcane_missiles.react>1
    if BuffStacks(arcane_missiles_buff) > 1 Spell(arcane_missiles)
    #arcane_explosion,if=active_enemies>1&buff.arcane_power.remains>cast_time
    if Enemies() > 1 and BuffRemaining(arcane_power_buff) > CastTime(arcane_explosion) Spell(arcane_explosion)
    #arcane_blast,if=buff.presence_of_mind.up|buff.arcane_power.remains>cast_time
    if BuffPresent(presence_of_mind_buff) or BuffRemaining(arcane_power_buff) > CastTime(arcane_blast) Spell(arcane_blast)
    #supernova,if=mana.pct<100
    if ManaPercent() < 100 Spell(supernova)
    #arcane_missiles,if=mana.pct>10&(talent.overpowered.enabled|buff.arcane_power.down)
    if ManaPercent() > 10 and { Talent(overpowered_talent) or BuffExpires(arcane_power_buff) } Spell(arcane_missiles)
    #arcane_explosion,if=active_enemies>1
    if Enemies() > 1 Spell(arcane_explosion)
    #arcane_blast
    Spell(arcane_blast)
}

}

AddFunction ArcaneBurnMainPostConditions
{
ArcaneCooldownsMainPostConditions()
}

AddFunction ArcaneBurnShortCdActions
{
#call_action_list,name=cooldowns
ArcaneCooldownsShortCdActions()

unless ArcaneCooldownsShortCdPostConditions() or BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion)
{
    #presence_of_mind,if=buff.arcane_power.remains>2*gcd
    if BuffRemaining(arcane_power_buff) > 2 * GCD() Spell(presence_of_mind)
}

}

AddFunction ArcaneBurnShortCdPostConditions
{
ArcaneCooldownsShortCdPostConditions() or BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion) or { target.DebuffRemaining(nether_tempest_debuff) <= 2 or not target.DebuffPresent(nether_tempest_debuff) } and Spell(nether_tempest) or Enemies() <= 1 and ManaPercent() / 10 * ExecuteTime(arcane_blast) > target.TimeToDie() and Spell(arcane_blast) or Enemies() > 1 and ManaPercent() / 10 * ExecuteTime(arcane_explosion) > target.TimeToDie() and Spell(arcane_explosion) or BuffStacks(arcane_missiles_buff) > 1 and Spell(arcane_missiles) or Enemies() > 1 and BuffRemaining(arcane_power_buff) > CastTime(arcane_explosion) and Spell(arcane_explosion) or { BuffPresent(presence_of_mind_buff) or BuffRemaining(arcane_power_buff) > CastTime(arcane_blast) } and Spell(arcane_blast) or ManaPercent() < 100 and Spell(supernova) or ManaPercent() > 10 and { Talent(overpowered_talent) or BuffExpires(arcane_power_buff) } and Spell(arcane_missiles) or Enemies() > 1 and Spell(arcane_explosion) or Spell(arcane_blast)
}

AddFunction ArcaneBurnCdActions
{
#call_action_list,name=cooldowns
ArcaneCooldownsCdActions()

unless ArcaneCooldownsCdPostConditions() or BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion) or { target.DebuffRemaining(nether_tempest_debuff) <= 2 or not target.DebuffPresent(nether_tempest_debuff) } and Spell(nether_tempest) or Enemies() <= 1 and ManaPercent() / 10 * ExecuteTime(arcane_blast) > target.TimeToDie() and Spell(arcane_blast) or Enemies() > 1 and ManaPercent() / 10 * ExecuteTime(arcane_explosion) > target.TimeToDie() and Spell(arcane_explosion) or BuffStacks(arcane_missiles_buff) > 1 and Spell(arcane_missiles) or Enemies() > 1 and BuffRemaining(arcane_power_buff) > CastTime(arcane_explosion) and Spell(arcane_explosion) or { BuffPresent(presence_of_mind_buff) or BuffRemaining(arcane_power_buff) > CastTime(arcane_blast) } and Spell(arcane_blast) or ManaPercent() < 100 and Spell(supernova) or ManaPercent() > 10 and { Talent(overpowered_talent) or BuffExpires(arcane_power_buff) } and Spell(arcane_missiles) or Enemies() > 1 and Spell(arcane_explosion) or Spell(arcane_blast)
{
    #evocation,interrupt_if=mana.pct>99
    Spell(evocation)
}

}

AddFunction ArcaneBurnCdPostConditions
{
ArcaneCooldownsCdPostConditions() or BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion) or { target.DebuffRemaining(nether_tempest_debuff) <= 2 or not target.DebuffPresent(nether_tempest_debuff) } and Spell(nether_tempest) or Enemies() <= 1 and ManaPercent() / 10 * ExecuteTime(arcane_blast) > target.TimeToDie() and Spell(arcane_blast) or Enemies() > 1 and ManaPercent() / 10 * ExecuteTime(arcane_explosion) > target.TimeToDie() and Spell(arcane_explosion) or BuffStacks(arcane_missiles_buff) > 1 and Spell(arcane_missiles) or Enemies() > 1 and BuffRemaining(arcane_power_buff) > CastTime(arcane_explosion) and Spell(arcane_explosion) or { BuffPresent(presence_of_mind_buff) or BuffRemaining(arcane_power_buff) > CastTime(arcane_blast) } and Spell(arcane_blast) or ManaPercent() < 100 and Spell(supernova) or ManaPercent() > 10 and { Talent(overpowered_talent) or BuffExpires(arcane_power_buff) } and Spell(arcane_missiles) or Enemies() > 1 and Spell(arcane_explosion) or Spell(arcane_blast)
}

actions.conserve

AddFunction ArcaneConserveMainActions
{
#arcane_missiles,if=buff.arcane_missiles.react=3
if BuffStacks(arcane_missiles_buff) == 3 Spell(arcane_missiles)
#arcane_explosion,if=buff.quickening.remains<action.arcane_blast.cast_time&talent.quickening.enabled
if BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) Spell(arcane_explosion)
#arcane_blast,if=mana.pct>99
if ManaPercent() > 99 Spell(arcane_blast)
#nether_tempest,if=(refreshable|!ticking)
if target.Refreshable(nether_tempest_debuff) or not target.DebuffPresent(nether_tempest_debuff) Spell(nether_tempest)
#arcane_blast,if=buff.rhonins_assaulting_armwraps.up&equipped.132413
if BuffPresent(rhonins_assaulting_armwraps_buff) and HasEquippedItem(132413) Spell(arcane_blast)
#arcane_missiles
Spell(arcane_missiles)
#supernova,if=mana.pct<100
if ManaPercent() < 100 Spell(supernova)
#frost_nova,if=equipped.132452
if HasEquippedItem(132452) Spell(frost_nova)
#arcane_explosion,if=mana.pct>=82&equipped.132451&active_enemies>1
if ManaPercent() >= 82 and HasEquippedItem(132451) and Enemies() > 1 Spell(arcane_explosion)
#arcane_blast,if=mana.pct>=82&equipped.132451
if ManaPercent() >= 82 and HasEquippedItem(132451) Spell(arcane_blast)
#arcane_barrage,if=mana.pct<100&cooldown.arcane_power.remains>5
if ManaPercent() < 100 and SpellCooldown(arcane_power) > 5 Spell(arcane_barrage)
#arcane_explosion,if=active_enemies>1
if Enemies() > 1 Spell(arcane_explosion)
#arcane_blast
Spell(arcane_blast)
}

AddFunction ArcaneConserveMainPostConditions
{
}

AddFunction ArcaneConserveShortCdActions
{
}

AddFunction ArcaneConserveShortCdPostConditions
{
BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion) or ManaPercent() > 99 and Spell(arcane_blast) or { target.Refreshable(nether_tempest_debuff) or not target.DebuffPresent(nether_tempest_debuff) } and Spell(nether_tempest) or BuffPresent(rhonins_assaulting_armwraps_buff) and HasEquippedItem(132413) and Spell(arcane_blast) or Spell(arcane_missiles) or ManaPercent() < 100 and Spell(supernova) or HasEquippedItem(132452) and Spell(frost_nova) or ManaPercent() >= 82 and HasEquippedItem(132451) and Enemies() > 1 and Spell(arcane_explosion) or ManaPercent() >= 82 and HasEquippedItem(132451) and Spell(arcane_blast) or ManaPercent() < 100 and SpellCooldown(arcane_power) > 5 and Spell(arcane_barrage) or Enemies() > 1 and Spell(arcane_explosion) or Spell(arcane_blast)
}

AddFunction ArcaneConserveCdActions
{
}

AddFunction ArcaneConserveCdPostConditions
{
BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion) or ManaPercent() > 99 and Spell(arcane_blast) or { target.Refreshable(nether_tempest_debuff) or not target.DebuffPresent(nether_tempest_debuff) } and Spell(nether_tempest) or BuffPresent(rhonins_assaulting_armwraps_buff) and HasEquippedItem(132413) and Spell(arcane_blast) or Spell(arcane_missiles) or ManaPercent() < 100 and Spell(supernova) or HasEquippedItem(132452) and Spell(frost_nova) or ManaPercent() >= 82 and HasEquippedItem(132451) and Enemies() > 1 and Spell(arcane_explosion) or ManaPercent() >= 82 and HasEquippedItem(132451) and Spell(arcane_blast) or ManaPercent() < 100 and SpellCooldown(arcane_power) > 5 and Spell(arcane_barrage) or Enemies() > 1 and Spell(arcane_explosion) or Spell(arcane_blast)
}

actions.cooldowns

AddFunction ArcaneCooldownsMainActions
{
}

AddFunction ArcaneCooldownsMainPostConditions
{
}

AddFunction ArcaneCooldownsShortCdActions
{
#rune_of_power,if=mana.pct>45&buff.arcane_power.down
if ManaPercent() > 45 and BuffExpires(arcane_power_buff) Spell(rune_of_power)
}

AddFunction ArcaneCooldownsShortCdPostConditions
{
}

AddFunction ArcaneCooldownsCdActions
{
unless ManaPercent() > 45 and BuffExpires(arcane_power_buff) and Spell(rune_of_power)
{
#arcane_power
Spell(arcane_power)
#blood_fury
Spell(blood_fury_sp)
#berserking
Spell(berserking)
#arcane_torrent
Spell(arcane_torrent_mana)
}
}

AddFunction ArcaneCooldownsCdPostConditions
{
ManaPercent() > 45 and BuffExpires(arcane_power_buff) and Spell(rune_of_power)
}

actions.init_burn

AddFunction ArcaneInitBurnMainActions
{
#frost_nova,if=equipped.132452
if HasEquippedItem(132452) Spell(frost_nova)
#nether_tempest,if=dot.nether_tempest.remains<10&(prev_gcd.mark_of_aluneth|(talent.rune_of_power.enabled&cooldown.rune_of_power.remains<gcd.max))
if target.DebuffRemaining(nether_tempest_debuff) < 10 and { PreviousGCDSpell(mark_of_aluneth) or Talent(rune_of_power_talent) and SpellCooldown(rune_of_power) < GCD() } Spell(nether_tempest)
#start_burn_phase,if=((cooldown.evocation.remains-(2*burn_phase_duration))%2<burn_phase_duration)|cooldown.arcane_power.remains=0|target.time_to_die<55
if { { SpellCooldown(evocation) - 2 * GetStateDuration(burn_phase) } / 2 < GetStateDuration(burn_phase) or not SpellCooldown(arcane_power) > 0 or target.TimeToDie() < 55 } and not GetState(burn_phase) > 0 SetState(burn_phase 1)
}

AddFunction ArcaneInitBurnMainPostConditions
{
}

AddFunction ArcaneInitBurnShortCdActions
{
#mark_of_aluneth
Spell(mark_of_aluneth)

unless HasEquippedItem(132452) and Spell(frost_nova) or target.DebuffRemaining(nether_tempest_debuff) < 10 and { PreviousGCDSpell(mark_of_aluneth) or Talent(rune_of_power_talent) and SpellCooldown(rune_of_power) < GCD() } and Spell(nether_tempest)
{
    #rune_of_power
    Spell(rune_of_power)
    #start_burn_phase,if=((cooldown.evocation.remains-(2*burn_phase_duration))%2<burn_phase_duration)|cooldown.arcane_power.remains=0|target.time_to_die<55
    if { { SpellCooldown(evocation) - 2 * GetStateDuration(burn_phase) } / 2 < GetStateDuration(burn_phase) or not SpellCooldown(arcane_power) > 0 or target.TimeToDie() < 55 } and not GetState(burn_phase) > 0 SetState(burn_phase 1)
}

}

AddFunction ArcaneInitBurnShortCdPostConditions
{
HasEquippedItem(132452) and Spell(frost_nova) or target.DebuffRemaining(nether_tempest_debuff) < 10 and { PreviousGCDSpell(mark_of_aluneth) or Talent(rune_of_power_talent) and SpellCooldown(rune_of_power) < GCD() } and Spell(nether_tempest)
}

AddFunction ArcaneInitBurnCdActions
{
unless Spell(mark_of_aluneth) or HasEquippedItem(132452) and Spell(frost_nova) or target.DebuffRemaining(nether_tempest_debuff) < 10 and { PreviousGCDSpell(mark_of_aluneth) or Talent(rune_of_power_talent) and SpellCooldown(rune_of_power) < GCD() } and Spell(nether_tempest) or Spell(rune_of_power)
{
#start_burn_phase,if=((cooldown.evocation.remains-(2*burn_phase_duration))%2<burn_phase_duration)|cooldown.arcane_power.remains=0|target.time_to_die<55
if { { SpellCooldown(evocation) - 2 * GetStateDuration(burn_phase) } / 2 < GetStateDuration(burn_phase) or not SpellCooldown(arcane_power) > 0 or target.TimeToDie() < 55 } and not GetState(burn_phase) > 0 SetState(burn_phase 1)
}
}

AddFunction ArcaneInitBurnCdPostConditions
{
Spell(mark_of_aluneth) or HasEquippedItem(132452) and Spell(frost_nova) or target.DebuffRemaining(nether_tempest_debuff) < 10 and { PreviousGCDSpell(mark_of_aluneth) or Talent(rune_of_power_talent) and SpellCooldown(rune_of_power) < GCD() } and Spell(nether_tempest) or Spell(rune_of_power)
}

actions.precombat

AddFunction ArcanePrecombatMainActions
{
#flask,type=flask_of_the_whispered_pact
#food,type=the_hungry_magister
#augmentation,type=defiled
Spell(augmentation)
#summon_arcane_familiar
Spell(summon_arcane_familiar)
#potion,name=deadly_grace
#arcane_blast
Spell(arcane_blast)
}

AddFunction ArcanePrecombatMainPostConditions
{
}

AddFunction ArcanePrecombatShortCdActions
{
}

AddFunction ArcanePrecombatShortCdPostConditions
{
Spell(augmentation) or Spell(summon_arcane_familiar) or Spell(arcane_blast)
}

AddFunction ArcanePrecombatCdActions
{
unless Spell(augmentation) or Spell(summon_arcane_familiar)
{
#snapshot_stats
#mirror_image
Spell(mirror_image)
}
}

AddFunction ArcanePrecombatCdPostConditions
{
Spell(augmentation) or Spell(summon_arcane_familiar) or Spell(arcane_blast)
}

actions.rop_phase

AddFunction ArcaneRopPhaseMainActions
{
#arcane_missiles,if=buff.arcane_missiles.react=3
if BuffStacks(arcane_missiles_buff) == 3 Spell(arcane_missiles)
#arcane_explosion,if=buff.quickening.remains<action.arcane_blast.cast_time&talent.quickening.enabled
if BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) Spell(arcane_explosion)
#nether_tempest,if=dot.nether_tempest.remains<=2|!ticking
if target.DebuffRemaining(nether_tempest_debuff) <= 2 or not target.DebuffPresent(nether_tempest_debuff) Spell(nether_tempest)
#arcane_missiles,if=buff.arcane_charge.stack=4
if DebuffStacks(arcane_charge_debuff) == 4 Spell(arcane_missiles)
#arcane_explosion,if=active_enemies>1
if Enemies() > 1 Spell(arcane_explosion)
#arcane_blast,if=mana.pct>45
if ManaPercent() > 45 Spell(arcane_blast)
#arcane_barrage
Spell(arcane_barrage)
}

AddFunction ArcaneRopPhaseMainPostConditions
{
}

AddFunction ArcaneRopPhaseShortCdActions
{
}

AddFunction ArcaneRopPhaseShortCdPostConditions
{
BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion) or { target.DebuffRemaining(nether_tempest_debuff) <= 2 or not target.DebuffPresent(nether_tempest_debuff) } and Spell(nether_tempest) or DebuffStacks(arcane_charge_debuff) == 4 and Spell(arcane_missiles) or Enemies() > 1 and Spell(arcane_explosion) or ManaPercent() > 45 and Spell(arcane_blast) or Spell(arcane_barrage)
}

AddFunction ArcaneRopPhaseCdActions
{
}

AddFunction ArcaneRopPhaseCdPostConditions
{
BuffStacks(arcane_missiles_buff) == 3 and Spell(arcane_missiles) or BuffRemaining(quickening_buff) < CastTime(arcane_blast) and Talent(quickening_talent) and Spell(arcane_explosion) or { target.DebuffRemaining(nether_tempest_debuff) <= 2 or not target.DebuffPresent(nether_tempest_debuff) } and Spell(nether_tempest) or DebuffStacks(arcane_charge_debuff) == 4 and Spell(arcane_missiles) or Enemies() > 1 and Spell(arcane_explosion) or ManaPercent() > 45 and Spell(arcane_blast) or Spell(arcane_barrage)
}

Arcane icons.

AddCheckBox(opt_mage_arcane_aoe L(AOE) default specialization=arcane)

AddIcon checkbox=!opt_mage_arcane_aoe enemies=1 help=shortcd specialization=arcane
{
if not InCombat() ArcanePrecombatShortCdActions()
unless not InCombat() and ArcanePrecombatShortCdPostConditions()
{
ArcaneDefaultShortCdActions()
}
}

AddIcon checkbox=opt_mage_arcane_aoe help=shortcd specialization=arcane
{
if not InCombat() ArcanePrecombatShortCdActions()
unless not InCombat() and ArcanePrecombatShortCdPostConditions()
{
ArcaneDefaultShortCdActions()
}
}

AddIcon enemies=1 help=main specialization=arcane
{
if not InCombat() ArcanePrecombatMainActions()
unless not InCombat() and ArcanePrecombatMainPostConditions()
{
ArcaneDefaultMainActions()
}
}

AddIcon checkbox=opt_mage_arcane_aoe help=aoe specialization=arcane
{
if not InCombat() ArcanePrecombatMainActions()
unless not InCombat() and ArcanePrecombatMainPostConditions()
{
ArcaneDefaultMainActions()
}
}

AddIcon checkbox=!opt_mage_arcane_aoe enemies=1 help=cd specialization=arcane
{
if not InCombat() ArcanePrecombatCdActions()
unless not InCombat() and ArcanePrecombatCdPostConditions()
{
ArcaneDefaultCdActions()
}
}

AddIcon checkbox=opt_mage_arcane_aoe help=cd specialization=arcane
{
if not InCombat() ArcanePrecombatCdActions()
unless not InCombat() and ArcanePrecombatCdPostConditions()
{
ArcaneDefaultCdActions()
}
}

Required symbols

132410

132413

132451

132452

arcane_barrage

arcane_blast

arcane_charge_debuff

arcane_explosion

arcane_missiles

arcane_missiles_buff

arcane_orb

arcane_power

arcane_power_buff

arcane_torrent_mana

augmentation

berserking

blood_fury_sp

charged_up

counterspell

evocation

frost_nova

mark_of_aluneth

mirror_image

nether_tempest

nether_tempest_debuff

overpowered_talent

presence_of_mind

presence_of_mind_buff

quaking_palm

quickening_buff

quickening_talent

rhonins_assaulting_armwraps_buff

rune_of_power

rune_of_power_buff

rune_of_power_talent

summon_arcane_familiar

supernova

time_warp

commented

From what my experience has been, something is wrong with the GetState and SetState functions.
I have written my own script for 7.1.5, which has removed these functions. Not sure how it measures up, but it has worked for me so far. I still had to make the same correction to the ovale_mage_spells file as was referenced in another post, replacing arcane blast definitions with:


Define(arcane_blast 30451)
    SpellInfo(arcane_blast arcanecharges=-1)
    SpellAddBuff(arcane_blast presence_of_mind_buff=0 if_spell=presence_of_mind)
    SpellAddBuff(arcane_blast profound_magic_buff=0 itemset=T16_caster itemcount=2 specialization=arcane)
    SpellAddBuff(arcane_blast ice_floes_buff=0 if_spell=ice_floes)

My script:


# Based on information from Icy Veins and rotation from Ask Mr Robot

Include(ovale_common)
Include(ovale_trinkets_mop)
Include(ovale_trinkets_wod)
Include(ovale_mage_spells)

AddCheckBox(opt_interrupt L(interrupt) default specialization=arcane)
AddCheckBox(opt_arcane_mage_burn_phase L(arcane_mage_burn_phase) default specialization=arcane)
AddCheckBox(opt_time_warp SpellName(time_warp) specialization=arcane)

AddFunction ArcaneInterruptActions
{
    if CheckBoxOn(opt_interrupt) and not target.IsFriend() and target.IsInterruptible()
    {
        Spell(counterspell)
        if not target.Classification(worldboss)
        {
            Spell(arcane_torrent_mana)
            if target.InRange(quaking_palm) Spell(quaking_palm)
        }
    }
}

AddFunction ArcaneDefaultMainActions
{
    if PreviousGCDSpell(arcane_barrage) and ManaPercent() < 15 Spell(evocation)
    # You can adjust the remaining cooldown on evocation based on your mastery level
    # A higher mastery will allow for a longer burn phase (50 seconds is my current burn phase time)
    # Play around with the time so that Ovale suggests evocation as soon as it comes off cooldown
    # while still having mana to stay in burn phase until then.
    if ArcaneCharges() < 4 and (ManaPercent() > 70 or { CheckBoxOn(opt_arcane_mage_burn_phase) and (SpellCooldown(evocation) < 50 or target.TimeToDie() < 55) } ) ArcaneDefaultBuildActions()
    if CheckBoxOn(opt_arcane_mage_burn_phase) and ((SpellCooldown(evocation) < 50 or target.TimeToDie() < 55) and not PreviousGCDSpell(evocation) and ArcaneCharges() ==4) ArcaneDefaultBurnActions()
    Spell(supernova)
    if target.DebuffRemaining(nether_tempest_debuff) < 4 or not target.DebuffPresent(nether_tempest_debuff) Spell(nether_tempest)
    Spell(arcane_missiles)
    if target.DebuffRemaining(nether_tempest_debuff) < 10 and (not HasEquippedItem(132451) or ManaPercent() < 84 - 0.8 * ExecuteTime(arcane_blast)) Spell(nether_tempest)
    if not HasEquippedItem(132451) or ManaPercent() < 88 - 0.8 * ExecuteTime(arcane_blast) Spell(arcane_barrage)
    Spell(arcane_blast)
}

AddFunction ArcaneDefaultBuildActions
{
    if ArcaneCharges() <= 1 Spell(charged_up)
    Spell(arcane_orb)
    if Enemies(less 10) >= 3 Spell(arcane_explosion)
    Spell(arcane_blast)
}

AddFunction ArcaneDefaultBurnActions
{
    Spell(supernova)
    if target.DebuffRemaining(nether_tempest_debuff) < 4 or not target.DebuffPresent(nether_tempest_debuff) Spell(nether_tempest)
    Spell(arcane_missiles)
    if Enemies(less 10) >= 3 Spell(arcane_explosion)
    if ManaPercent() >= 15 Spell(arcane_blast)
    if ManaPercent() < 15 Spell(evocation)
    Spell(arcane_barrage)
}

AddFunction ArcaneDefaultShortCdActions
{
    Spell(mirror_image)
    if CheckBoxOn(opt_arcane_mage_burn_phase) and ((SpellCooldown(evocation) < 50 or target.TimeToDie() < 55) and not PreviousGCDSpell(evocation) and ArcaneCharges() ==4)
    {
      Spell(arcane_power)
      if BuffPresent(rune_of_power_buff) or not Talent(rune_of_power_talent) Spell(mark_of_aluneth)
      Spell(presence_of_mind)
    }
}

AddFunction ArcaneDefaultCdActions
{
    if { target.HealthPercent() < 25 or TimeInCombat() == 0 } and CheckBoxOn(opt_time_warp) and DebuffExpires(burst_haste_debuff any=1) Spell(time_warp)
    if CheckBoxOn(opt_arcane_mage_burn_phase) and ((SpellCooldown(evocation) < 50 or target.TimeToDie() < 55) and not PreviousGCDSpell(evocation) and ArcaneCharges() ==4)
    {
      if BuffExpires(burst_haste_buff any=1) and (SpellCooldown(arcane_power) > 0 and SpellCooldown(evocation) < 45) Spell(shard_of_the_exodar_warp)
      if not BuffPresent(rune_of_power_buff) and Talent(rune_of_power_talent) Spell(rune_of_power)
    }
}

### Arcane icons.

AddCheckBox(opt_mage_arcane_aoe L(AOE) default specialization=arcane)

AddIcon checkbox=!opt_mage_arcane_aoe enemies=1 help=shortcd specialization=arcane
{
    ArcaneDefaultShortCdActions()
}

AddIcon checkbox=opt_mage_arcane_aoe help=shortcd specialization=arcane
{
    ArcaneDefaultShortCdActions()
}

AddIcon enemies=1 help=main specialization=arcane
{
    ArcaneDefaultMainActions()
}

AddIcon checkbox=opt_mage_arcane_aoe help=aoe specialization=arcane
{
    ArcaneDefaultMainActions()
}

AddIcon checkbox=!opt_mage_arcane_aoe enemies=1 help=cd specialization=arcane
{
    ArcaneDefaultCdActions()
}

AddIcon checkbox=opt_mage_arcane_aoe help=cd specialization=arcane
{
    ArcaneDefaultCdActions()
}