Johnny C. Lam [05-21-14 - 13:08]
diff --git a/OvaleSimulationCraft.lua b/OvaleSimulationCraft.lua
index 5a501ca..448b393 100644
--- a/OvaleSimulationCraft.lua
+++ b/OvaleSimulationCraft.lua
@@ -23,6 +23,7 @@ local strlower = string.lower
local strmatch = string.match
local strsplit = strsplit
local strupper = string.upper
+local strsub = string.sub
local tconcat = table.concat
local tinsert = table.insert
local tonumber = tonumber
@@ -174,11 +175,24 @@ do
for class in pairs(SIMC_CLASS) do
local simcName = profile[class]
if simcName then
+ profile.simcName = strsub(simcName, 2, -2)
profile.class = class
- self:Append(script, "# Based on SimulationCraft profile %s.", simcName)
- self:Append(script, "# class=%s", class)
+ break
end
end
+
+ self:Append(script, "local _, Ovale = ...")
+ self:Append(script, "local OvaleScripts = Ovale.OvaleScripts")
+ self:Append(script, "")
+ self:Append(script, "do")
+ self:Append(script, [[ local name = "SimulationCraft: %s"]], profile.simcName)
+ self:Append(script, [[ local desc = "[5.4] SimulationCraft: %s" ]], profile.simcName)
+ self:Append(script, " local code = [[")
+
+ self:Append(script, [[# Based on SimulationCraft profile "%s".]], profile.simcName)
+ if profile.class then
+ self:Append(script, "# class=%s", profile.class)
+ end
if profile.spec then
self:Append(script, "# spec=%s", profile.spec)
end
@@ -231,6 +245,12 @@ do
for _, v in ipairs(symbols) do
self:Append(script, format("# %s", v))
end
+ self:Append(script, "]]")
+ if profile.class then
+ self:Append(script, [[ OvaleScripts:RegisterScript("%s", name, desc, code, "reference")]], strupper(profile.class))
+ end
+ self:Append(script, "end")
+
return script
end
end
@@ -380,6 +400,7 @@ do
["^$"] = false,
["^auto_attack$"] = false,
["^auto_shot$"] = false,
+ ["^elixir$"] = false,
["^flask$"] = false,
["^food$"] = false,
["^snapshot_stats$"] = false,
diff --git a/generate.lua b/generate.lua
index c3dafdc..16122cc 100644
--- a/generate.lua
+++ b/generate.lua
@@ -7,7 +7,7 @@ do
local OvaleSimulationCraft = Ovale.OvaleSimulationCraft
local profilesDirectory = "..\\SimulationCraft\\profiles\\Tier16H"
- local outputDirectory = "profiles"
+ local outputDirectory = "scripts"
local saveInput = io.input()
local saveOutput = io.output()
@@ -23,7 +23,8 @@ do
local simc = OvaleSimulationCraft(simcStr)
simc.simcComments = true
- local outputFileName = string.gsub(filename, ".simc", ".txt")
+ local outputFileName = "simulationcraft_" .. string.lower(string.gsub(filename, ".simc", ".lua"))
+ outputFileName = string.gsub(outputFileName, "death_knight", "deathknight")
print("Generating " .. outputFileName)
local outputName = outputDirectory .. "/" .. outputFileName
io.output(outputName)
diff --git a/scripts/files.xml b/scripts/files.xml
index 11b8383..1a94f89 100644
--- a/scripts/files.xml
+++ b/scripts/files.xml
@@ -27,4 +27,34 @@
<Script file="leafkiller_druid.lua" />
<Script file="wiljo_mage.lua" />
+
+ <Script file="simulationcraft_deathknight_frost_1h_t16h.lua" />
+ <Script file="simulationcraft_deathknight_frost_2h_t16h.lua" />
+ <Script file="simulationcraft_deathknight_unholy_t16h.lua" />
+ <Script file="simulationcraft_druid_balance_t16h.lua" />
+ <Script file="simulationcraft_druid_feral_t16h.lua" />
+ <Script file="simulationcraft_druid_feral_t16h_adv_rotation.lua" />
+ <Script file="simulationcraft_hunter_bm_t16h.lua" />
+ <Script file="simulationcraft_hunter_mm_t16h.lua" />
+ <Script file="simulationcraft_hunter_sv_t16h.lua" />
+ <Script file="simulationcraft_mage_arcane_t16h.lua" />
+ <Script file="simulationcraft_mage_fire_t16h.lua" />
+ <Script file="simulationcraft_mage_frost_t16h.lua" />
+ <Script file="simulationcraft_monk_windwalker_1h_t16h.lua" />
+ <Script file="simulationcraft_monk_windwalker_2h_t16h.lua" />
+ <Script file="simulationcraft_paladin_protection_t16h.lua" />
+ <Script file="simulationcraft_paladin_retribution_t16h.lua" />
+ <Script file="simulationcraft_priest_shadow_t16h.lua" />
+ <Script file="simulationcraft_rogue_assassination_t16h.lua" />
+ <Script file="simulationcraft_rogue_combat_t16h.lua" />
+ <Script file="simulationcraft_rogue_subtlety_t16h.lua" />
+ <Script file="simulationcraft_shaman_elemental_t16h.lua" />
+ <Script file="simulationcraft_shaman_enhancement_t16h.lua" />
+ <Script file="simulationcraft_warlock_affliction_t16h.lua" />
+ <Script file="simulationcraft_warlock_demonology_t16h.lua" />
+ <Script file="simulationcraft_warlock_destruction_t16h.lua" />
+ <Script file="simulationcraft_warrior_arms_t16h.lua" />
+ <Script file="simulationcraft_warrior_fury_1h_t16h.lua" />
+ <Script file="simulationcraft_warrior_fury_2h_t16h.lua" />
+ <Script file="simulationcraft_warrior_protection_t16h.lua" />
</Ui>
diff --git a/scripts/simulationcraft_deathknight_frost_1h_t16h.lua b/scripts/simulationcraft_deathknight_frost_1h_t16h.lua
new file mode 100644
index 0000000..91a0cbc
--- /dev/null
+++ b/scripts/simulationcraft_deathknight_frost_1h_t16h.lua
@@ -0,0 +1,180 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Death_Knight_Frost_1h_T16H"
+ local desc = "[5.4] SimulationCraft: Death_Knight_Frost_1h_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Death_Knight_Frost_1h_T16H".
+# class=deathknight
+# spec=frost
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#dZ!1...0.
+# glyphs=loud_horn
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_deathknight_spells)
+
+AddFunction FrostAoeActions
+{
+ #unholy_blight,if=talent.unholy_blight.enabled
+ if TalentPoints(unholy_blight_talent) Spell(unholy_blight)
+ #pestilence,if=dot.blood_plague.ticking&talent.plague_leech.enabled,line_cd=28
+ if target.DebuffPresent(blood_plague_debuff) and TalentPoints(plague_leech_talent) Spell(pestilence)
+ #pestilence,if=dot.blood_plague.ticking&talent.unholy_blight.enabled&cooldown.unholy_blight.remains<49,line_cd=28
+ if target.DebuffPresent(blood_plague_debuff) and TalentPoints(unholy_blight_talent) and SpellCooldown(unholy_blight) < 49 Spell(pestilence)
+ #howling_blast
+ Spell(howling_blast)
+ #blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>10
+ if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) > 10 BloodTap()
+ #frost_strike,if=runic_power>76
+ if RunicPower() > 76 Spell(frost_strike)
+ #death_and_decay,if=unholy=1
+ if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(death_and_decay)
+ #plague_strike,if=unholy=2
+ if Rune(unholy) >= 2 Spell(plague_strike)
+ #blood_tap,if=talent.blood_tap.enabled
+ if TalentPoints(blood_tap_talent) BloodTap()
+ #frost_strike
+ Spell(frost_strike)
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #plague_leech,if=talent.plague_leech.enabled&unholy=1
+ if TalentPoints(plague_leech_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } PlagueLeech()
+ #plague_strike,if=unholy=1
+ if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(plague_strike)
+ #empower_rune_weapon
+ Spell(empower_rune_weapon)
+}
+
+AddFunction FrostSingleTargetActions
+{
+ #blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&(runic_power>76|(runic_power>=20&buff.killing_machine.react)))
+ if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and { RunicPower() > 76 or { RunicPower() >= 20 and BuffPresent(killing_machine_buff) } } } BloodTap()
+ #frost_strike,if=buff.killing_machine.react|runic_power>88
+ if BuffPresent(killing_machine_buff) or RunicPower() > 88 Spell(frost_strike)
+ #howling_blast,if=death>1|frost>1
+ if Rune(death) >= 2 or Rune(frost) >= 2 Spell(howling_blast)
+ #unholy_blight,if=talent.unholy_blight.enabled&((dot.frost_fever.remains<3|dot.blood_plague.remains<3))
+ if TalentPoints(unholy_blight_talent) and { { target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 } } Spell(unholy_blight)
+ #soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+ if target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_frost)
+ #blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
+ if TalentPoints(blood_tap_talent) and { { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 and not SpellCooldown(soul_reaper_frost) > 0 } } BloodTap()
+ #howling_blast,if=!dot.frost_fever.ticking
+ if not target.DebuffPresent(frost_fever_debuff) Spell(howling_blast)
+ #plague_strike,if=!dot.blood_plague.ticking&unholy>0
+ if not target.DebuffPresent(blood_plague_debuff) and Rune(unholy) >= 1 Spell(plague_strike)
+ #howling_blast,if=buff.rime.react
+ if BuffPresent(rime_buff) Spell(howling_blast)
+ #frost_strike,if=runic_power>76
+ if RunicPower() > 76 Spell(frost_strike)
+ #obliterate,if=unholy>0&!buff.killing_machine.react
+ if Rune(unholy) >= 1 and not BuffPresent(killing_machine_buff) Spell(obliterate)
+ #howling_blast
+ Spell(howling_blast)
+ #frost_strike,if=talent.runic_empowerment.enabled&unholy=1
+ if TalentPoints(runic_empowerment_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(frost_strike)
+ #blood_tap,if=talent.blood_tap.enabled&(target.health.pct-3*(target.health.pct%target.time_to_die)>35|buff.blood_charge.stack>=8)
+ if TalentPoints(blood_tap_talent) and { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } > 35 or BuffStacks(blood_charge_buff) >= 8 } BloodTap()
+ #frost_strike,if=runic_power>=40
+ if RunicPower() >= 40 Spell(frost_strike)
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #blood_tap,if=talent.blood_tap.enabled
+ if TalentPoints(blood_tap_talent) BloodTap()
+ #plague_leech,if=talent.plague_leech.enabled
+ if TalentPoints(plague_leech_talent) PlagueLeech()
+ #empower_rune_weapon
+ Spell(empower_rune_weapon)
+}
+
+AddFunction FrostDefaultActions
+{
+ #auto_attack
+ #antimagic_shell,damage=100000
+ Spell(antimagic_shell)
+ #pillar_of_frost
+ Spell(pillar_of_frost)
+ #mogu_power_potion,if=target.time_to_die<=30|(target.time_to_die<=60&buff.pillar_of_frost.up)
+ if target.TimeToDie() <= 30 or { target.TimeToDie() <= 60 and BuffPresent(pillar_of_frost_buff) } UsePotionStrength()
+ #empower_rune_weapon,if=target.time_to_die<=60&(buff.mogu_power_potion.up|buff.golemblood_potion.up)
+ if target.TimeToDie() <= 60 and { BuffPresent(mogu_power_potion_buff) or BuffPresent(golemblood_potion_buff) } Spell(empower_rune_weapon)
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #use_item,slot=hands
+ UseItemActions()
+ #raise_dead
+ Spell(raise_dead)
+ #run_action_list,name=aoe,if=active_enemies>=3
+ if Enemies() >= 3 FrostAoeActions()
+ #run_action_list,name=single_target,if=active_enemies<3
+ if Enemies() < 3 FrostSingleTargetActions()
+}
+
+AddFunction FrostPrecombatActions
+{
+ #flask,type=winters_bite
+ #food,type=black_pepper_ribs_and_shrimp
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #frost_presence
+ if not Stance(deathknight_frost_presence) Spell(frost_presence)
+ #snapshot_stats
+ #army_of_the_dead
+ Spell(army_of_the_dead)
+ #mogu_power_potion
+ UsePotionStrength()
+ #pillar_of_frost
+ Spell(pillar_of_frost)
+ #raise_dead
+ Spell(raise_dead)
+}
+
+AddIcon mastery=frost help=main
+{
+ if InCombat(no) FrostPrecombatActions()
+ FrostDefaultActions()
+}
+
+### Required symbols
+# antimagic_shell
+# arcane_torrent
+# army_of_the_dead
+# berserking
+# blood_charge_buff
+# blood_fury
+# blood_plague_debuff
+# blood_tap
+# blood_tap_talent
+# death_and_decay
+# empower_rune_weapon
+# frost_fever_debuff
+# frost_presence
+# frost_strike
+# golemblood_potion_buff
+# horn_of_winter
+# howling_blast
+# killing_machine_buff
+# mogu_power_potion
+# mogu_power_potion_buff
+# obliterate
+# pestilence
+# pillar_of_frost
+# pillar_of_frost_buff
+# plague_leech
+# plague_leech_talent
+# plague_strike
+# raise_dead
+# rime_buff
+# runic_empowerment_talent
+# soul_reaper_frost
+# unholy_blight
+# unholy_blight_talent
+]]
+ OvaleScripts:RegisterScript("DEATHKNIGHT", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_deathknight_frost_2h_t16h.lua b/scripts/simulationcraft_deathknight_frost_2h_t16h.lua
new file mode 100644
index 0000000..e892a96
--- /dev/null
+++ b/scripts/simulationcraft_deathknight_frost_2h_t16h.lua
@@ -0,0 +1,191 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Death_Knight_Frost_2h_T16H"
+ local desc = "[5.4] SimulationCraft: Death_Knight_Frost_2h_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Death_Knight_Frost_2h_T16H".
+# class=deathknight
+# spec=frost
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#dZ!1...0.
+# glyphs=loud_horn
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_deathknight_spells)
+
+AddFunction FrostAoeActions
+{
+ #unholy_blight,if=talent.unholy_blight.enabled
+ if TalentPoints(unholy_blight_talent) Spell(unholy_blight)
+ #pestilence,if=dot.blood_plague.ticking&talent.plague_leech.enabled,line_cd=28
+ if target.DebuffPresent(blood_plague_debuff) and TalentPoints(plague_leech_talent) Spell(pestilence)
+ #pestilence,if=dot.blood_plague.ticking&talent.unholy_blight.enabled&cooldown.unholy_blight.remains<49,line_cd=28
+ if target.DebuffPresent(blood_plague_debuff) and TalentPoints(unholy_blight_talent) and SpellCooldown(unholy_blight) < 49 Spell(pestilence)
+ #howling_blast
+ Spell(howling_blast)
+ #blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>10
+ if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) > 10 BloodTap()
+ #frost_strike,if=runic_power>76
+ if RunicPower() > 76 Spell(frost_strike)
+ #death_and_decay,if=unholy=1
+ if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(death_and_decay)
+ #plague_strike,if=unholy=2
+ if Rune(unholy) >= 2 Spell(plague_strike)
+ #blood_tap,if=talent.blood_tap.enabled
+ if TalentPoints(blood_tap_talent) BloodTap()
+ #frost_strike
+ Spell(frost_strike)
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #plague_leech,if=talent.plague_leech.enabled&unholy=1
+ if TalentPoints(plague_leech_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } PlagueLeech()
+ #plague_strike,if=unholy=1
+ if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(plague_strike)
+ #empower_rune_weapon
+ Spell(empower_rune_weapon)
+}
+
+AddFunction FrostSingleTargetActions
+{
+ #plague_leech,if=talent.plague_leech.enabled&((dot.blood_plague.remains<1|dot.frost_fever.remains<1))
+ if TalentPoints(plague_leech_talent) and { { target.DebuffRemains(blood_plague_debuff) < 1 or target.DebuffRemains(frost_fever_debuff) < 1 } } PlagueLeech()
+ #outbreak,if=!dot.frost_fever.ticking|!dot.blood_plague.ticking
+ if not target.DebuffPresent(frost_fever_debuff) or not target.DebuffPresent(blood_plague_debuff) Spell(outbreak)
+ #unholy_blight,if=talent.unholy_blight.enabled&((!dot.frost_fever.ticking|!dot.blood_plague.ticking))
+ if TalentPoints(unholy_blight_talent) and { { not target.DebuffPresent(frost_fever_debuff) or not target.DebuffPresent(blood_plague_debuff) } } Spell(unholy_blight)
+ #soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+ if target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_frost)
+ #blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
+ if TalentPoints(blood_tap_talent) and { { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 and not SpellCooldown(soul_reaper_frost) > 0 } } BloodTap()
+ #howling_blast,if=!dot.frost_fever.ticking
+ if not target.DebuffPresent(frost_fever_debuff) Spell(howling_blast)
+ #plague_strike,if=!dot.blood_plague.ticking
+ if not target.DebuffPresent(blood_plague_debuff) Spell(plague_strike)
+ #howling_blast,if=buff.rime.react
+ if BuffPresent(rime_buff) Spell(howling_blast)
+ #obliterate,if=buff.killing_machine.react
+ if BuffPresent(killing_machine_buff) Spell(obliterate)
+ #blood_tap,if=talent.blood_tap.enabled&buff.killing_machine.react
+ if TalentPoints(blood_tap_talent) and BuffPresent(killing_machine_buff) BloodTap()
+ #blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>76)
+ if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and RunicPower() > 76 } BloodTap()
+ #frost_strike,if=runic_power>76
+ if RunicPower() > 76 Spell(frost_strike)
+ #obliterate,if=blood=2|frost=2|unholy=2
+ if Rune(blood) >= 2 or Rune(frost) >= 2 or Rune(unholy) >= 2 Spell(obliterate)
+ #plague_leech,if=talent.plague_leech.enabled&((dot.blood_plague.remains<3|dot.frost_fever.remains<3))
+ if TalentPoints(plague_leech_talent) and { { target.DebuffRemains(blood_plague_debuff) < 3 or target.DebuffRemains(frost_fever_debuff) < 3 } } PlagueLeech()
+ #outbreak,if=dot.frost_fever.remains<3|dot.blood_plague.remains<3
+ if target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 Spell(outbreak)
+ #unholy_blight,if=talent.unholy_blight.enabled&((dot.frost_fever.remains<3|dot.blood_plague.remains<3))
+ if TalentPoints(unholy_blight_talent) and { { target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 } } Spell(unholy_blight)
+ #frost_strike,if=talent.runic_empowerment.enabled&(frost=0|unholy=0|blood=0)
+ if TalentPoints(runic_empowerment_talent) and { Rune(frost) < 1 or Rune(unholy) < 1 or Rune(blood) < 1 } Spell(frost_strike)
+ #frost_strike,if=talent.blood_tap.enabled&buff.blood_charge.stack<=10
+ if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) <= 10 Spell(frost_strike)
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #obliterate
+ Spell(obliterate)
+ #blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>=20)
+ if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and RunicPower() >= 20 } BloodTap()
+ #frost_strike
+ Spell(frost_strike)
+ #plague_leech,if=talent.plague_leech.enabled
+ if TalentPoints(plague_leech_talent) PlagueLeech()
+ #empower_rune_weapon
+ Spell(empower_rune_weapon)
+}
+
+AddFunction FrostDefaultActions
+{
+ #auto_attack
+ #antimagic_shell,damage=100000
+ Spell(antimagic_shell)
+ #pillar_of_frost
+ Spell(pillar_of_frost)
+ #mogu_power_potion,if=target.time_to_die<=30|(target.time_to_die<=60&buff.pillar_of_frost.up)
+ if target.TimeToDie() <= 30 or { target.TimeToDie() <= 60 and BuffPresent(pillar_of_frost_buff) } UsePotionStrength()
+ #empower_rune_weapon,if=target.time_to_die<=60&(buff.mogu_power_potion.up|buff.golemblood_potion.up)
+ if target.TimeToDie() <= 60 and { BuffPresent(mogu_power_potion_buff) or BuffPresent(golemblood_potion_buff) } Spell(empower_rune_weapon)
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #use_item,slot=hands
+ UseItemActions()
+ #raise_dead
+ Spell(raise_dead)
+ #run_action_list,name=aoe,if=active_enemies>=3
+ if Enemies() >= 3 FrostAoeActions()
+ #run_action_list,name=single_target,if=active_enemies<3
+ if Enemies() < 3 FrostSingleTargetActions()
+}
+
+AddFunction FrostPrecombatActions
+{
+ #flask,type=winters_bite
+ #food,type=black_pepper_ribs_and_shrimp
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #frost_presence
+ if not Stance(deathknight_frost_presence) Spell(frost_presence)
+ #snapshot_stats
+ #army_of_the_dead
+ Spell(army_of_the_dead)
+ #mogu_power_potion
+ UsePotionStrength()
+ #pillar_of_frost
+ Spell(pillar_of_frost)
+ #raise_dead
+ Spell(raise_dead)
+}
+
+AddIcon mastery=frost help=main
+{
+ if InCombat(no) FrostPrecombatActions()
+ FrostDefaultActions()
+}
+
+### Required symbols
+# antimagic_shell
+# arcane_torrent
+# army_of_the_dead
+# berserking
+# blood_charge_buff
+# blood_fury
+# blood_plague_debuff
+# blood_tap
+# blood_tap_talent
+# death_and_decay
+# empower_rune_weapon
+# frost_fever_debuff
+# frost_presence
+# frost_strike
+# golemblood_potion_buff
+# horn_of_winter
+# howling_blast
+# killing_machine_buff
+# mogu_power_potion
+# mogu_power_potion_buff
+# obliterate
+# outbreak
+# pestilence
+# pillar_of_frost
+# pillar_of_frost_buff
+# plague_leech
+# plague_leech_talent
+# plague_strike
+# raise_dead
+# rime_buff
+# runic_empowerment_talent
+# soul_reaper_frost
+# unholy_blight
+# unholy_blight_talent
+]]
+ OvaleScripts:RegisterScript("DEATHKNIGHT", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_deathknight_unholy_t16h.lua b/scripts/simulationcraft_deathknight_unholy_t16h.lua
new file mode 100644
index 0000000..855bdcf
--- /dev/null
+++ b/scripts/simulationcraft_deathknight_unholy_t16h.lua
@@ -0,0 +1,203 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Death_Knight_Unholy_T16H"
+ local desc = "[5.4] SimulationCraft: Death_Knight_Unholy_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Death_Knight_Unholy_T16H".
+# class=deathknight
+# spec=unholy
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#db!2...0.
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_deathknight_spells)
+
+AddFunction UnholyAoeActions
+{
+ #unholy_blight,if=talent.unholy_blight.enabled
+ if TalentPoints(unholy_blight_talent) Spell(unholy_blight)
+ #plague_strike,if=!dot.blood_plague.ticking|!dot.frost_fever.ticking
+ if not target.DebuffPresent(blood_plague_debuff) or not target.DebuffPresent(frost_fever_debuff) Spell(plague_strike)
+ #pestilence,if=dot.blood_plague.ticking&talent.plague_leech.enabled,line_cd=28
+ if target.DebuffPresent(blood_plague_debuff) and TalentPoints(plague_leech_talent) Spell(pestilence)
+ #pestilence,if=dot.blood_plague.ticking&talent.unholy_blight.enabled&cooldown.unholy_blight.remains<49,line_cd=28
+ if target.DebuffPresent(blood_plague_debuff) and TalentPoints(unholy_blight_talent) and SpellCooldown(unholy_blight) < 49 Spell(pestilence)
+ #summon_gargoyle
+ Spell(summon_gargoyle)
+ #dark_transformation
+ Spell(dark_transformation)
+ #blood_tap,if=talent.blood_tap.enabled&buff.shadow_infusion.stack=5
+ if TalentPoints(blood_tap_talent) and BuffStacks(shadow_infusion_buff) == 5 BloodTap()
+ #blood_boil,if=blood=2|death=2
+ if Rune(blood) >= 2 or { Rune(death) >= 2 and Rune(death) < 3 } Spell(blood_boil)
+ #death_and_decay,if=unholy=1
+ if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(death_and_decay)
+ #soul_reaper,if=unholy=2&target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+ if Rune(unholy) >= 2 and target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_unholy)
+ #scourge_strike,if=unholy=2
+ if Rune(unholy) >= 2 Spell(scourge_strike)
+ #blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>10
+ if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) > 10 BloodTap()
+ #death_coil,if=runic_power>90|buff.sudden_doom.react|(buff.dark_transformation.down&rune.unholy<=1)
+ if RunicPower() > 90 or BuffPresent(sudden_doom_buff) or { BuffExpires(dark_transformation_buff) and Rune(unholy) <= 1 } Spell(death_coil)
+ #blood_boil
+ Spell(blood_boil)
+ #icy_touch
+ Spell(icy_touch)
+ #soul_reaper,if=unholy=1&target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+ if { Rune(unholy) >= 1 and Rune(unholy) < 2 } and target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_unholy)
+ #scourge_strike,if=unholy=1
+ if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(scourge_strike)
+ #death_coil
+ Spell(death_coil)
+ #blood_tap,if=talent.blood_tap.enabled
+ if TalentPoints(blood_tap_talent) BloodTap()
+ #plague_leech,if=talent.plague_leech.enabled&unholy=1
+ if TalentPoints(plague_leech_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } PlagueLeech()
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #empower_rune_weapon
+ Spell(empower_rune_weapon)
+}
+
+AddFunction UnholySingleTargetActions
+{
+ #outbreak,if=stat.attack_power>(dot.blood_plague.attack_power*1.1)&time>15&!(cooldown.unholy_blight.remains>79)
+ if AttackPower() > { target.DebuffAttackPower(blood_plague_debuff) * 1.1 } and TimeInCombat() > 15 and not { SpellCooldown(unholy_blight) > 79 } Spell(outbreak)
+ #plague_strike,if=stat.attack_power>(dot.blood_plague.attack_power*1.1)&time>15&!(cooldown.unholy_blight.remains>79)
+ if AttackPower() > { target.DebuffAttackPower(blood_plague_debuff) * 1.1 } and TimeInCombat() > 15 and not { SpellCooldown(unholy_blight) > 79 } Spell(plague_strike)
+ #blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>=32)
+ if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and RunicPower() >= 32 } BloodTap()
+ #unholy_blight,if=talent.unholy_blight.enabled&((dot.frost_fever.remains<3|dot.blood_plague.remains<3))
+ if TalentPoints(unholy_blight_talent) and { { target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 } } Spell(unholy_blight)
+ #outbreak,if=dot.frost_fever.remains<3|dot.blood_plague.remains<3
+ if target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 Spell(outbreak)
+ #soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+ if target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_unholy)
+ #blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
+ if TalentPoints(blood_tap_talent) and { { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 and not SpellCooldown(soul_reaper_unholy) > 0 } } BloodTap()
+ #plague_strike,if=!dot.blood_plague.ticking|!dot.frost_fever.ticking
+ if not target.DebuffPresent(blood_plague_debuff) or not target.DebuffPresent(frost_fever_debuff) Spell(plague_strike)
+ #summon_gargoyle
+ Spell(summon_gargoyle)
+ #dark_transformation
+ Spell(dark_transformation)
+ #death_coil,if=runic_power>90
+ if RunicPower() > 90 Spell(death_coil)
+ #death_and_decay,if=unholy=2
+ if Rune(unholy) >= 2 Spell(death_and_decay)
+ #blood_tap,if=talent.blood_tap.enabled&(unholy=2&cooldown.death_and_decay.remains=0)
+ if TalentPoints(blood_tap_talent) and { Rune(unholy) >= 2 and not SpellCooldown(death_and_decay) > 0 } BloodTap()
+ #scourge_strike,if=unholy=2
+ if Rune(unholy) >= 2 Spell(scourge_strike)
+ #festering_strike,if=blood=2&frost=2
+ if Rune(blood) >= 2 and Rune(frost) >= 2 Spell(festering_strike)
+ #death_and_decay
+ Spell(death_and_decay)
+ #blood_tap,if=talent.blood_tap.enabled&cooldown.death_and_decay.remains=0
+ if TalentPoints(blood_tap_talent) and not SpellCooldown(death_and_decay) > 0 BloodTap()
+ #death_coil,if=buff.sudden_doom.react|(buff.dark_transformation.down&rune.unholy<=1)
+ if BuffPresent(sudden_doom_buff) or { BuffExpires(dark_transformation_buff) and Rune(unholy) <= 1 } Spell(death_coil)
+ #scourge_strike
+ Spell(scourge_strike)
+ #plague_leech,if=talent.plague_leech.enabled&cooldown.outbreak.remains<1
+ if TalentPoints(plague_leech_talent) and SpellCooldown(outbreak) < 1 PlagueLeech()
+ #festering_strike
+ Spell(festering_strike)
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #death_coil
+ Spell(death_coil)
+ #blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>=8
+ if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) >= 8 BloodTap()
+ #empower_rune_weapon
+ Spell(empower_rune_weapon)
+}
+
+AddFunction UnholyDefaultActions
+{
+ #auto_attack
+ #antimagic_shell,damage=100000
+ Spell(antimagic_shell)
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #use_item,slot=hands
+ UseItemActions()
+ #mogu_power_potion,if=buff.dark_transformation.up&target.time_to_die<=60
+ if BuffPresent(dark_transformation_buff) and target.TimeToDie() <= 60 UsePotionStrength()
+ #unholy_frenzy,if=time>=4
+ if TimeInCombat() >= 4 Spell(unholy_frenzy)
+ #run_action_list,name=aoe,if=active_enemies>=3
+ if Enemies() >= 3 UnholyAoeActions()
+ #run_action_list,name=single_target,if=active_enemies<3
+ if Enemies() < 3 UnholySingleTargetActions()
+}
+
+AddFunction UnholyPrecombatActions
+{
+ #flask,type=winters_bite
+ #food,type=black_pepper_ribs_and_shrimp
+ #horn_of_winter
+ Spell(horn_of_winter)
+ #unholy_presence
+ if not Stance(deathknight_unholy_presence) Spell(unholy_presence)
+ #snapshot_stats
+ #army_of_the_dead
+ Spell(army_of_the_dead)
+ #mogu_power_potion
+ UsePotionStrength()
+ #raise_dead
+ Spell(raise_dead)
+}
+
+AddIcon mastery=unholy help=main
+{
+ if InCombat(no) UnholyPrecombatActions()
+ UnholyDefaultActions()
+}
+
+### Required symbols
+# antimagic_shell
+# arcane_torrent
+# army_of_the_dead
+# berserking
+# blood_boil
+# blood_charge_buff
+# blood_fury
+# blood_plague_debuff
+# blood_tap
+# blood_tap_talent
+# dark_transformation
+# dark_transformation_buff
+# death_and_decay
+# death_coil
+# empower_rune_weapon
+# festering_strike
+# frost_fever_debuff
+# horn_of_winter
+# icy_touch
+# mogu_power_potion
+# outbreak
+# pestilence
+# plague_leech
+# plague_leech_talent
+# plague_strike
+# raise_dead
+# scourge_strike
+# shadow_infusion_buff
+# soul_reaper_unholy
+# sudden_doom_buff
+# summon_gargoyle
+# unholy_blight
+# unholy_blight_talent
+# unholy_frenzy
+# unholy_presence
+]]
+ OvaleScripts:RegisterScript("DEATHKNIGHT", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_druid_balance_t16h.lua b/scripts/simulationcraft_druid_balance_t16h.lua
new file mode 100644
index 0000000..be4af07
--- /dev/null
+++ b/scripts/simulationcraft_druid_balance_t16h.lua
@@ -0,0 +1,124 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Druid_Balance_T16H"
+ local desc = "[5.4] SimulationCraft: Druid_Balance_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Druid_Balance_T16H".
+# class=druid
+# spec=balance
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Ua!.0.1.0
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_druid_spells)
+
+AddFunction BalanceDefaultActions
+{
+ #jade_serpent_potion,if=buff.bloodlust.react|target.time_to_die<=40|buff.celestial_alignment.up
+ if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 40 or BuffPresent(celestial_alignment_buff) UsePotionIntellect()
+ #starfall,if=!buff.starfall.up
+ if not BuffPresent(starfall_buff) Spell(starfall)
+ #force_of_nature,if=talent.force_of_nature.enabled
+ if TalentPoints(force_of_nature_talent) Spell(force_of_nature_caster)
+ #berserking,if=buff.celestial_alignment.up
+ if BuffPresent(celestial_alignment_buff) Spell(berserking)
+ #use_item,slot=hands,if=buff.celestial_alignment.up|cooldown.celestial_alignment.remains>30
+ if BuffPresent(celestial_alignment_buff) or SpellCooldown(celestial_alignment) > 30 UseItemActions()
+ #wild_mushroom_detonate,moving=0,if=buff.wild_mushroom.stack>0&buff.solar_eclipse.up
+ if WildMushroomCount() > 0 and BuffPresent(solar_eclipse_buff) Spell(wild_mushroom_detonate)
+ #natures_swiftness,if=talent.dream_of_cenarius.enabled
+ if TalentPoints(dream_of_cenarius_talent) Spell(natures_swiftness)
+ #healing_touch,if=talent.dream_of_cenarius.enabled&!buff.dream_of_cenarius.up&mana.pct>25
+ if TalentPoints(dream_of_cenarius_talent) and not BuffPresent(dream_of_cenarius_caster_buff) and ManaPercent() > 25 Spell(healing_touch)
+ #incarnation,if=talent.incarnation.enabled&(buff.lunar_eclipse.up|buff.solar_eclipse.up)
+ if TalentPoints(incarnation_talent) and { BuffPresent(lunar_eclipse_buff) or BuffPresent(solar_eclipse_buff) } Spell(incarnation)
+ #celestial_alignment,if=(!buff.lunar_eclipse.up&!buff.solar_eclipse.up)&(buff.chosen_of_elune.up|!talent.incarnation.enabled|cooldown.incarnation.remains>10)
+ if { not BuffPresent(lunar_eclipse_buff) and not BuffPresent(solar_eclipse_buff) } and { BuffPresent(chosen_of_elune_buff) or not TalentPoints(incarnation_talent) or SpellCooldown(incarnation) > 10 } Spell(celestial_alignment)
+ #natures_vigil,if=talent.natures_vigil.enabled
+ if TalentPoints(natures_vigil_talent) Spell(natures_vigil)
+ #starsurge,if=buff.shooting_stars.react&(active_enemies<5|!buff.solar_eclipse.up)
+ if BuffPresent(shooting_stars_buff) and { Enemies() < 5 or not BuffPresent(solar_eclipse_buff) } Spell(starsurge)
+ #moonfire,cycle_targets=1,if=buff.lunar_eclipse.up&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+ if BuffPresent(lunar_eclipse_buff) and { target.DebuffRemains(moonfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(moonfire)
+ #sunfire,cycle_targets=1,if=buff.solar_eclipse.up&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+ if BuffPresent(solar_eclipse_buff) and { target.DebuffRemains(sunfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(sunfire)
+ #hurricane,if=active_enemies>4&buff.solar_eclipse.up&buff.natures_grace.up
+ if Enemies() > 4 and BuffPresent(solar_eclipse_buff) and BuffPresent(natures_grace_buff) Spell(hurricane)
+ #moonfire,cycle_targets=1,if=active_enemies<5&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+ if Enemies() < 5 and { target.DebuffRemains(moonfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(moonfire)
+ #sunfire,cycle_targets=1,if=active_enemies<5&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+ if Enemies() < 5 and { target.DebuffRemains(sunfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(sunfire)
+ #hurricane,if=active_enemies>5&buff.solar_eclipse.up&mana.pct>25
+ if Enemies() > 5 and BuffPresent(solar_eclipse_buff) and ManaPercent() > 25 Spell(hurricane)
+ #moonfire,cycle_targets=1,if=buff.lunar_eclipse.up&ticks_remain<2
+ if BuffPresent(lunar_eclipse_buff) and target.TicksRemain(moonfire_debuff) < 2 Spell(moonfire)
+ #sunfire,cycle_targets=1,if=buff.solar_eclipse.up&ticks_remain<2
+ if BuffPresent(solar_eclipse_buff) and target.TicksRemain(sunfire_debuff) < 2 Spell(sunfire)
+ #hurricane,if=active_enemies>4&buff.solar_eclipse.up&mana.pct>25
+ if Enemies() > 4 and BuffPresent(solar_eclipse_buff) and ManaPercent() > 25 Spell(hurricane)
+ #starsurge,if=cooldown_react
+ if Spell(starsurge) Spell(starsurge)
+ #starfire,if=buff.celestial_alignment.up&cast_time<buff.celestial_alignment.remains
+ if BuffPresent(celestial_alignment_buff) and CastTime(starfire) < BuffRemains(celestial_alignment_buff) Spell(starfire)
+ #wrath,if=buff.celestial_alignment.up&cast_time<buff.celestial_alignment.remains
+ if BuffPresent(celestial_alignment_buff) and CastTime(wrath) < BuffRemains(celestial_alignment_buff) Spell(wrath)
+ #starfire,if=eclipse_dir=1|(eclipse_dir=0&eclipse>0)
+ if EclipseDir() == 1 or { EclipseDir() == 0 and Eclipse() > 0 } Spell(starfire)
+ #wrath,if=eclipse_dir=-1|(eclipse_dir=0&eclipse<=0)
+ if EclipseDir() == -1 or { EclipseDir() == 0 and Eclipse() <= 0 } Spell(wrath)
+ #moonfire,moving=1,cycle_targets=1,if=ticks_remain<2
+ if Speed() > 0 and target.TicksRemain(moonfire_debuff) < 2 Spell(moonfire)
+ #sunfire,moving=1,cycle_targets=1,if=ticks_remain<2
+ if Speed() > 0 and target.TicksRemain(sunfire_debuff) < 2 Spell(sunfire)
+ #wild_mushroom,moving=1,if=buff.wild_mushroom.stack<buff.wild_mushroom.max_stack
+ if Speed() > 0 and WildMushroomCount() < 3 Spell(wild_mushroom_caster)
+ #starsurge,moving=1,if=buff.shooting_stars.react
+ if Speed() > 0 and BuffPresent(shooting_stars_buff) Spell(starsurge)
+ #moonfire,moving=1,if=buff.lunar_eclipse.up
+ if Speed() > 0 and BuffPresent(lunar_eclipse_buff) Spell(moonfire)
+ #sunfire,moving=1
+ if Speed() > 0 Spell(sunfire)
+}
+
+AddIcon mastery=balance help=main
+{
+ BalanceDefaultActions()
+}
+
+### Required symbols
+# berserking
+# celestial_alignment
+# celestial_alignment_buff
+# chosen_of_elune_buff
+# dream_of_cenarius_caster_buff
+# dream_of_cenarius_talent
+# force_of_nature_caster
+# force_of_nature_talent
+# healing_touch
+# hurricane
+# incarnation
+# incarnation_talent
+# jade_serpent_potion
+# lunar_eclipse_buff
+# moonfire
+# moonfire_debuff
+# natures_grace_buff
+# natures_swiftness
+# natures_vigil
+# natures_vigil_talent
+# shooting_stars_buff
+# solar_eclipse_buff
+# starfall
+# starfall_buff
+# starfire
+# starsurge
+# sunfire
+# sunfire_debuff
+# wild_mushroom_caster
+# wild_mushroom_detonate
+# wrath
+]]
+ OvaleScripts:RegisterScript("DRUID", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_druid_feral_t16h.lua b/scripts/simulationcraft_druid_feral_t16h.lua
new file mode 100644
index 0000000..4ffe241
--- /dev/null
+++ b/scripts/simulationcraft_druid_feral_t16h.lua
@@ -0,0 +1,303 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Druid_Feral_T16H"
+ local desc = "[5.4] SimulationCraft: Druid_Feral_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Druid_Feral_T16H".
+# class=druid
+# spec=feral
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#UZ!...2.1
+# glyphs=savagery/cat_form
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_druid_spells)
+
+AddFunction FeralFillerActions
+{
+ #ravage
+ Spell(ravage usable=1)
+ #rake,if=target.time_to_die-dot.rake.remains>3&action.rake.tick_damage*(dot.rake.ticks_remain+1)-dot.rake.tick_dmg*dot.rake.ticks_remain>action.mangle_cat.hit_damage
+ if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and target.Damage(rake_debuff) * { target.TicksRemain(rake_debuff) + 1 } - target.LastEstimatedDamage(rake_debuff) * target.TicksRemain(rake_debuff) > target.Damage(mangle_cat) Spell(rake)
+ #shred,if=(buff.omen_of_clarity.react|buff.berserk.up|energy.regen>=15)&buff.king_of_the_jungle.down
+ if { BuffPresent(omen_of_clarity_melee_buff) or BuffPresent(berserk_cat_buff) or EnergyRegen() >= 15 } and BuffExpires(king_of_the_jungle_buff) Spell(shred)
+ #mangle_cat,if=buff.king_of_the_jungle.down
+ if BuffExpires(king_of_the_jungle_buff) Spell(mangle_cat)
+}
+
+AddFunction FeralDefaultActions
+{
+ #swap_action_list,name=basic
+ FeralBasicActions()
+}
+
+AddFunction FeralBasicActions
+{
+ #swap_action_list,name=aoe,if=active_enemies>=5
+ if Enemies() >= 5 FeralAoeActions()
+ #auto_attack
+ #skull_bash_cat
+ FeralInterrupt()
+ #force_of_nature,if=charges=3|trinket.proc.agility.react|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|target.time_to_die<20
+ if Charges(force_of_nature_melee) == 3 or BuffPresent(trinket_proc_agility_buff) or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+ #ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+ if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+ #faerie_fire,if=debuff.weakened_armor.stack<3
+ if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+ #healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+ if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+ #savage_roar,if=buff.savage_roar.remains<3
+ if BuffRemains(savage_roar_buff) < 3 SavageRoar()
+ #virmens_bite_potion,if=(target.health.pct<30&buff.berserk.up)|target.time_to_die<=40
+ if { target.HealthPercent() < 30 and BuffPresent(berserk_cat_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+ #tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+ if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+ #berserk,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+ #use_item,slot=hands,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) UseItemActions()
+ #blood_fury,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+ #berserking,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserking)
+ #arcane_torrent,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+ #rip,if=combo_points>=5&target.health.pct<=25&action.rip.tick_damage%dot.rip.tick_dmg>=1.15
+ if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 Spell(rip)
+ #ferocious_bite,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking
+ if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+ #rip,if=combo_points>=5&dot.rip.remains<2
+ if ComboPoints() >= 5 and target.DebuffRemains(rip_debuff) < 2 Spell(rip)
+ #thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3
+ if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 Spell(thrash_cat)
+ #rake,cycle_targets=1,if=dot.rake.remains<3|action.rake.tick_damage>dot.rake.tick_dmg
+ if target.DebuffRemains(rake_debuff) < 3 or target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) Spell(rake)
+ #pool_resource,for_next=1
+ #thrash_cat,if=dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)
+ if target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } wait Spell(thrash_cat)
+ #pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+ unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+ {
+ #ferocious_bite,if=combo_points>=5&dot.rip.ticking
+ if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+ #run_action_list,name=filler,if=buff.omen_of_clarity.react
+ if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=buff.feral_fury.react
+ if BuffPresent(feral_fury_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+ if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+ #run_action_list,name=filler,if=target.time_to_die<=8.5
+ if target.TimeToDie() <= 8.5 FeralFillerActions()
+ #run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+ if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+ if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+ #run_action_list,name=filler,if=energy.time_to_max<=1.0
+ if TimeToMaxEnergy() <= 1 FeralFillerActions()
+ }
+}
+
+AddFunction FeralAoeActions
+{
+ #swap_action_list,name=default,if=active_enemies<5
+ if Enemies() < 5 FeralDefaultActions()
+ #auto_attack
+ #faerie_fire,cycle_targets=1,if=debuff.weakened_armor.stack<3
+ if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+ #savage_roar,if=buff.savage_roar.down|(buff.savage_roar.remains<3&combo_points>0)
+ if BuffExpires(savage_roar_buff) or { BuffRemains(savage_roar_buff) < 3 and ComboPoints() > 0 } SavageRoar()
+ #use_item,slot=hands,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) UseItemActions()
+ #blood_fury,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+ #berserking,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserking)
+ #arcane_torrent,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+ #tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+ if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+ #berserk,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+ #pool_resource,for_next=1
+ #thrash_cat,if=buff.rune_of_reorigination.up
+ if BuffPresent(rune_of_reorigination_buff) wait Spell(thrash_cat)
+ #pool_resource,wait=0.1,for_next=1
+ #thrash_cat,if=dot.thrash_cat.remains<3|(buff.tigers_fury.up&dot.thrash_cat.remains<9)
+ if target.DebuffRemains(thrash_cat_debuff) < 3 or { BuffPresent(tigers_fury_buff) and target.DebuffRemains(thrash_cat_debuff) < 9 } wait Spell(thrash_cat)
+ #savage_roar,if=buff.savage_roar.remains<9&combo_points>=5
+ if BuffRemains(savage_roar_buff) < 9 and ComboPoints() >= 5 SavageRoar()
+ #rip,if=combo_points>=5
+ if ComboPoints() >= 5 Spell(rip)
+ #rake,cycle_targets=1,if=(active_enemies<8|buff.rune_of_reorigination.up)&dot.rake.remains<3&target.time_to_die>=15
+ if { Enemies() < 8 or BuffPresent(rune_of_reorigination_buff) } and target.DebuffRemains(rake_debuff) < 3 and target.TimeToDie() >= 15 Spell(rake)
+ #swipe_cat,if=buff.savage_roar.remains<=5
+ if BuffRemains(savage_roar_buff) <= 5 Spell(swipe_cat)
+ #swipe_cat,if=buff.tigers_fury.up|buff.berserk.up
+ if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) Spell(swipe_cat)
+ #swipe_cat,if=cooldown.tigers_fury.remains<3
+ if SpellCooldown(tigers_fury) < 3 Spell(swipe_cat)
+ #swipe_cat,if=buff.omen_of_clarity.react
+ if BuffPresent(omen_of_clarity_melee_buff) Spell(swipe_cat)
+ #swipe_cat,if=energy.time_to_max<=1
+ if TimeToMaxEnergy() <= 1 Spell(swipe_cat)
+}
+
+AddFunction FeralPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #mark_of_the_wild,if=!aura.str_agi_int.up
+ if not BuffPresent(str_agi_int any=1) Spell(mark_of_the_wild)
+ #healing_touch,if=!buff.dream_of_cenarius.up&talent.dream_of_cenarius.enabled
+ if not BuffPresent(dream_of_cenarius_melee_buff) and TalentPoints(dream_of_cenarius_talent) Spell(healing_touch)
+ #cat_form
+ if not Stance(druid_cat_form) Spell(cat_form)
+ #savage_roar
+ SavageRoar()
+ #stealth
+ if Stealthed(no) Spell(prowl)
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddFunction FeralAdvancedActions
+{
+ #swap_action_list,name=aoe,if=active_enemies>=5
+ if Enemies() >= 5 FeralAoeActions()
+ #auto_attack
+ #skull_bash_cat
+ FeralInterrupt()
+ #force_of_nature,if=charges=3|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|(buff.vicious.react&buff.vicious.remains<1)|target.time_to_die<20
+ if Charges(force_of_nature_melee) == 3 or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or { BuffPresent(trinket_proc_agility_buff) and BuffRemains(trinket_proc_agility_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #ravage,if=buff.stealthed.up
+ if Stealthed() Spell(ravage usable=1)
+ #ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+ if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+ #faerie_fire,if=debuff.weakened_armor.stack<3
+ if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+ #healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+ if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+ #savage_roar,if=buff.savage_roar.down
+ if BuffExpires(savage_roar_buff) SavageRoar()
+ #tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+ if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+ #berserk,if=buff.tigers_fury.up|(target.time_to_die<18&cooldown.tigers_fury.remains>6)
+ if BuffPresent(tigers_fury_buff) or { target.TimeToDie() < 18 and SpellCooldown(tigers_fury) > 6 } Spell(berserk_cat)
+ #use_item,slot=hands,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) UseItemActions()
+ #thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3&target.time_to_die>=6
+ if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 and target.TimeToDie() >= 6 Spell(thrash_cat)
+ #ferocious_bite,if=target.time_to_die<=1&combo_points>=3
+ if target.TimeToDie() <= 1 and ComboPoints() >= 3 Spell(ferocious_bite)
+ #savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&target.health.pct<25
+ if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and target.HealthPercent() < 25 SavageRoar()
+ #virmens_bite_potion,if=(combo_points>=5&(target.time_to_die*(target.health.pct-25)%target.health.pct)<15&buff.rune_of_reorigination.up)|target.time_to_die<=40
+ if { ComboPoints() >= 5 and { target.TimeToDie() * { target.HealthPercent() -25 } / target.HealthPercent() } < 15 and BuffPresent(rune_of_reorigination_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+ #rip,if=combo_points>=5&action.rip.tick_damage%dot.rip.tick_dmg>=1.15&target.time_to_die>30
+ if ComboPoints() >= 5 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 and target.TimeToDie() > 30 Spell(rip)
+ #rip,if=combo_points>=4&action.rip.tick_damage%dot.rip.tick_dmg>=0.95&target.time_to_die>30&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5
+ if ComboPoints() >= 4 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 0.95 and target.TimeToDie() > 30 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rip)
+ #pool_resource,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking&!(energy>=50|(buff.berserk.up&energy>=25))
+ unless ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) and not { Energy() >= 50 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } }
+ {
+ #ferocious_bite,if=combo_points>=5&dot.rip.ticking&target.health.pct<=25
+ if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) and target.HealthPercent() <= 25 Spell(ferocious_bite)
+ #rip,if=combo_points>=5&target.time_to_die>=6&dot.rip.remains<2&(buff.berserk.up|dot.rip.remains+1.9<=cooldown.tigers_fury.remains)
+ if ComboPoints() >= 5 and target.TimeToDie() >= 6 and target.DebuffRemains(rip_debuff) < 2 and { BuffPresent(berserk_cat_buff) or target.DebuffRemains(rip_debuff) + 1.9 <= SpellCooldown(tigers_fury) } Spell(rip)
+ #savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&buff.savage_roar.remains+2>dot.rip.remains
+ if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and BuffRemains(savage_roar_buff) + 2 > target.DebuffRemains(rip_debuff) SavageRoar()
+ #savage_roar,if=buff.savage_roar.remains<=6&combo_points>=5&buff.savage_roar.remains+2<=dot.rip.remains&dot.rip.ticking
+ if BuffRemains(savage_roar_buff) <= 6 and ComboPoints() >= 5 and BuffRemains(savage_roar_buff) + 2 <= target.DebuffRemains(rip_debuff) and target.DebuffPresent(rip_debuff) SavageRoar()
+ #savage_roar,if=buff.savage_roar.remains<=12&combo_points>=5&energy.time_to_max<=1&buff.savage_roar.remains<=dot.rip.remains+6&dot.rip.ticking
+ if BuffRemains(savage_roar_buff) <= 12 and ComboPoints() >= 5 and TimeToMaxEnergy() <= 1 and BuffRemains(savage_roar_buff) <= target.DebuffRemains(rip_debuff) + 6 and target.DebuffPresent(rip_debuff) SavageRoar()
+ #rake,if=buff.rune_of_reorigination.up&dot.rake.remains<9&buff.rune_of_reorigination.remains<=1.5
+ if BuffPresent(rune_of_reorigination_buff) and target.DebuffRemains(rake_debuff) < 9 and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rake)
+ #rake,cycle_targets=1,if=target.time_to_die-dot.rake.remains>3&(action.rake.tick_damage>dot.rake.tick_dmg|(dot.rake.remains<3&action.rake.tick_damage%dot.rake.tick_dmg>=0.75))
+ if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and { target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) or { target.DebuffRemains(rake_debuff) < 3 and target.Damage(rake_debuff) / target.LastEstimatedDamage(rake_debuff) >= 0.75 } } Spell(rake)
+ #pool_resource,for_next=1
+ #thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)&dot.rip.ticking
+ if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+ #pool_resource,for_next=1
+ #thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<9&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5&dot.rip.ticking
+ if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 9 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+ #pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+ unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+ {
+ #ferocious_bite,if=combo_points>=5&dot.rip.ticking
+ if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+ #run_action_list,name=filler,if=buff.omen_of_clarity.react
+ if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=buff.feral_fury.react
+ if BuffPresent(feral_fury_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+ if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+ #run_action_list,name=filler,if=target.time_to_die<=8.5
+ if target.TimeToDie() <= 8.5 FeralFillerActions()
+ #run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+ if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+ if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+ #run_action_list,name=filler,if=energy.time_to_max<=1.0
+ if TimeToMaxEnergy() <= 1 FeralFillerActions()
+ }
+ }
+}
+
+AddIcon mastery=feral help=main
+{
+ if InCombat(no) FeralPrecombatActions()
+ FeralDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# berserk_cat
+# berserk_cat_buff
+# berserking
+# blood_fury
+# cat_form
+# dream_of_cenarius_melee_buff
+# dream_of_cenarius_talent
+# faerie_fire
+# feral_fury_buff
+# feral_rage_buff
+# ferocious_bite
+# force_of_nature_melee
+# healing_touch
+# king_of_the_jungle_buff
+# mangle_cat
+# mark_of_the_wild
+# omen_of_clarity_melee_buff
+# predatory_swiftness_buff
+# prowl
+# rake
+# rake_debuff
+# ravage
+# rip
+# rip_debuff
+# rune_of_reorigination_buff
+# savage_roar
+# savage_roar_buff
+# shred
+# skull_bash_cat
+# str_agi_int
+# swipe_cat
+# thrash_cat
+# thrash_cat_debuff
+# tigers_fury
+# tigers_fury_buff
+# trinket_proc_agility_buff
+# virmens_bite_potion
+# weakened_armor_debuff
+]]
+ OvaleScripts:RegisterScript("DRUID", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_druid_feral_t16h_adv_rotation.lua b/scripts/simulationcraft_druid_feral_t16h_adv_rotation.lua
new file mode 100644
index 0000000..5510cea
--- /dev/null
+++ b/scripts/simulationcraft_druid_feral_t16h_adv_rotation.lua
@@ -0,0 +1,303 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Druid_Feral_T16H_Adv_Rotation"
+ local desc = "[5.4] SimulationCraft: Druid_Feral_T16H_Adv_Rotation"
+ local code = [[
+# Based on SimulationCraft profile "Druid_Feral_T16H_Adv_Rotation".
+# class=druid
+# spec=feral
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#UZ!...2.1
+# glyphs=savagery/cat_form
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_druid_spells)
+
+AddFunction FeralFillerActions
+{
+ #ravage
+ Spell(ravage usable=1)
+ #rake,if=target.time_to_die-dot.rake.remains>3&action.rake.tick_damage*(dot.rake.ticks_remain+1)-dot.rake.tick_dmg*dot.rake.ticks_remain>action.mangle_cat.hit_damage
+ if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and target.Damage(rake_debuff) * { target.TicksRemain(rake_debuff) + 1 } - target.LastEstimatedDamage(rake_debuff) * target.TicksRemain(rake_debuff) > target.Damage(mangle_cat) Spell(rake)
+ #shred,if=(buff.omen_of_clarity.react|buff.berserk.up|energy.regen>=15)&buff.king_of_the_jungle.down
+ if { BuffPresent(omen_of_clarity_melee_buff) or BuffPresent(berserk_cat_buff) or EnergyRegen() >= 15 } and BuffExpires(king_of_the_jungle_buff) Spell(shred)
+ #mangle_cat,if=buff.king_of_the_jungle.down
+ if BuffExpires(king_of_the_jungle_buff) Spell(mangle_cat)
+}
+
+AddFunction FeralDefaultActions
+{
+ #swap_action_list,name=advanced
+ FeralAdvancedActions()
+}
+
+AddFunction FeralBasicActions
+{
+ #swap_action_list,name=aoe,if=active_enemies>=5
+ if Enemies() >= 5 FeralAoeActions()
+ #auto_attack
+ #skull_bash_cat
+ FeralInterrupt()
+ #force_of_nature,if=charges=3|trinket.proc.agility.react|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|target.time_to_die<20
+ if Charges(force_of_nature_melee) == 3 or BuffPresent(trinket_proc_agility_buff) or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+ #ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+ if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+ #faerie_fire,if=debuff.weakened_armor.stack<3
+ if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+ #healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+ if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+ #savage_roar,if=buff.savage_roar.remains<3
+ if BuffRemains(savage_roar_buff) < 3 SavageRoar()
+ #virmens_bite_potion,if=(target.health.pct<30&buff.berserk.up)|target.time_to_die<=40
+ if { target.HealthPercent() < 30 and BuffPresent(berserk_cat_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+ #tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+ if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+ #berserk,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+ #use_item,slot=hands,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) UseItemActions()
+ #blood_fury,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+ #berserking,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserking)
+ #arcane_torrent,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+ #rip,if=combo_points>=5&target.health.pct<=25&action.rip.tick_damage%dot.rip.tick_dmg>=1.15
+ if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 Spell(rip)
+ #ferocious_bite,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking
+ if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+ #rip,if=combo_points>=5&dot.rip.remains<2
+ if ComboPoints() >= 5 and target.DebuffRemains(rip_debuff) < 2 Spell(rip)
+ #thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3
+ if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 Spell(thrash_cat)
+ #rake,cycle_targets=1,if=dot.rake.remains<3|action.rake.tick_damage>dot.rake.tick_dmg
+ if target.DebuffRemains(rake_debuff) < 3 or target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) Spell(rake)
+ #pool_resource,for_next=1
+ #thrash_cat,if=dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)
+ if target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } wait Spell(thrash_cat)
+ #pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+ unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+ {
+ #ferocious_bite,if=combo_points>=5&dot.rip.ticking
+ if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+ #run_action_list,name=filler,if=buff.omen_of_clarity.react
+ if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=buff.feral_fury.react
+ if BuffPresent(feral_fury_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+ if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+ #run_action_list,name=filler,if=target.time_to_die<=8.5
+ if target.TimeToDie() <= 8.5 FeralFillerActions()
+ #run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+ if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+ if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+ #run_action_list,name=filler,if=energy.time_to_max<=1.0
+ if TimeToMaxEnergy() <= 1 FeralFillerActions()
+ }
+}
+
+AddFunction FeralAoeActions
+{
+ #swap_action_list,name=default,if=active_enemies<5
+ if Enemies() < 5 FeralDefaultActions()
+ #auto_attack
+ #faerie_fire,cycle_targets=1,if=debuff.weakened_armor.stack<3
+ if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+ #savage_roar,if=buff.savage_roar.down|(buff.savage_roar.remains<3&combo_points>0)
+ if BuffExpires(savage_roar_buff) or { BuffRemains(savage_roar_buff) < 3 and ComboPoints() > 0 } SavageRoar()
+ #use_item,slot=hands,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) UseItemActions()
+ #blood_fury,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+ #berserking,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserking)
+ #arcane_torrent,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+ #tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+ if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+ #berserk,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+ #pool_resource,for_next=1
+ #thrash_cat,if=buff.rune_of_reorigination.up
+ if BuffPresent(rune_of_reorigination_buff) wait Spell(thrash_cat)
+ #pool_resource,wait=0.1,for_next=1
+ #thrash_cat,if=dot.thrash_cat.remains<3|(buff.tigers_fury.up&dot.thrash_cat.remains<9)
+ if target.DebuffRemains(thrash_cat_debuff) < 3 or { BuffPresent(tigers_fury_buff) and target.DebuffRemains(thrash_cat_debuff) < 9 } wait Spell(thrash_cat)
+ #savage_roar,if=buff.savage_roar.remains<9&combo_points>=5
+ if BuffRemains(savage_roar_buff) < 9 and ComboPoints() >= 5 SavageRoar()
+ #rip,if=combo_points>=5
+ if ComboPoints() >= 5 Spell(rip)
+ #rake,cycle_targets=1,if=(active_enemies<8|buff.rune_of_reorigination.up)&dot.rake.remains<3&target.time_to_die>=15
+ if { Enemies() < 8 or BuffPresent(rune_of_reorigination_buff) } and target.DebuffRemains(rake_debuff) < 3 and target.TimeToDie() >= 15 Spell(rake)
+ #swipe_cat,if=buff.savage_roar.remains<=5
+ if BuffRemains(savage_roar_buff) <= 5 Spell(swipe_cat)
+ #swipe_cat,if=buff.tigers_fury.up|buff.berserk.up
+ if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) Spell(swipe_cat)
+ #swipe_cat,if=cooldown.tigers_fury.remains<3
+ if SpellCooldown(tigers_fury) < 3 Spell(swipe_cat)
+ #swipe_cat,if=buff.omen_of_clarity.react
+ if BuffPresent(omen_of_clarity_melee_buff) Spell(swipe_cat)
+ #swipe_cat,if=energy.time_to_max<=1
+ if TimeToMaxEnergy() <= 1 Spell(swipe_cat)
+}
+
+AddFunction FeralPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #mark_of_the_wild,if=!aura.str_agi_int.up
+ if not BuffPresent(str_agi_int any=1) Spell(mark_of_the_wild)
+ #healing_touch,if=!buff.dream_of_cenarius.up&talent.dream_of_cenarius.enabled
+ if not BuffPresent(dream_of_cenarius_melee_buff) and TalentPoints(dream_of_cenarius_talent) Spell(healing_touch)
+ #cat_form
+ if not Stance(druid_cat_form) Spell(cat_form)
+ #savage_roar
+ SavageRoar()
+ #stealth
+ if Stealthed(no) Spell(prowl)
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddFunction FeralAdvancedActions
+{
+ #swap_action_list,name=aoe,if=active_enemies>=5
+ if Enemies() >= 5 FeralAoeActions()
+ #auto_attack
+ #skull_bash_cat
+ FeralInterrupt()
+ #force_of_nature,if=charges=3|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|(buff.vicious.react&buff.vicious.remains<1)|target.time_to_die<20
+ if Charges(force_of_nature_melee) == 3 or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or { BuffPresent(trinket_proc_agility_buff) and BuffRemains(trinket_proc_agility_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #ravage,if=buff.stealthed.up
+ if Stealthed() Spell(ravage usable=1)
+ #ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+ if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+ #faerie_fire,if=debuff.weakened_armor.stack<3
+ if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+ #healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+ if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+ #savage_roar,if=buff.savage_roar.down
+ if BuffExpires(savage_roar_buff) SavageRoar()
+ #tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+ if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+ #berserk,if=buff.tigers_fury.up|(target.time_to_die<18&cooldown.tigers_fury.remains>6)
+ if BuffPresent(tigers_fury_buff) or { target.TimeToDie() < 18 and SpellCooldown(tigers_fury) > 6 } Spell(berserk_cat)
+ #use_item,slot=hands,if=buff.tigers_fury.up
+ if BuffPresent(tigers_fury_buff) UseItemActions()
+ #thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3&target.time_to_die>=6
+ if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 and target.TimeToDie() >= 6 Spell(thrash_cat)
+ #ferocious_bite,if=target.time_to_die<=1&combo_points>=3
+ if target.TimeToDie() <= 1 and ComboPoints() >= 3 Spell(ferocious_bite)
+ #savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&target.health.pct<25
+ if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and target.HealthPercent() < 25 SavageRoar()
+ #virmens_bite_potion,if=(combo_points>=5&(target.time_to_die*(target.health.pct-25)%target.health.pct)<15&buff.rune_of_reorigination.up)|target.time_to_die<=40
+ if { ComboPoints() >= 5 and { target.TimeToDie() * { target.HealthPercent() -25 } / target.HealthPercent() } < 15 and BuffPresent(rune_of_reorigination_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+ #rip,if=combo_points>=5&action.rip.tick_damage%dot.rip.tick_dmg>=1.15&target.time_to_die>30
+ if ComboPoints() >= 5 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 and target.TimeToDie() > 30 Spell(rip)
+ #rip,if=combo_points>=4&action.rip.tick_damage%dot.rip.tick_dmg>=0.95&target.time_to_die>30&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5
+ if ComboPoints() >= 4 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 0.95 and target.TimeToDie() > 30 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rip)
+ #pool_resource,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking&!(energy>=50|(buff.berserk.up&energy>=25))
+ unless ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) and not { Energy() >= 50 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } }
+ {
+ #ferocious_bite,if=combo_points>=5&dot.rip.ticking&target.health.pct<=25
+ if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) and target.HealthPercent() <= 25 Spell(ferocious_bite)
+ #rip,if=combo_points>=5&target.time_to_die>=6&dot.rip.remains<2&(buff.berserk.up|dot.rip.remains+1.9<=cooldown.tigers_fury.remains)
+ if ComboPoints() >= 5 and target.TimeToDie() >= 6 and target.DebuffRemains(rip_debuff) < 2 and { BuffPresent(berserk_cat_buff) or target.DebuffRemains(rip_debuff) + 1.9 <= SpellCooldown(tigers_fury) } Spell(rip)
+ #savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&buff.savage_roar.remains+2>dot.rip.remains
+ if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and BuffRemains(savage_roar_buff) + 2 > target.DebuffRemains(rip_debuff) SavageRoar()
+ #savage_roar,if=buff.savage_roar.remains<=6&combo_points>=5&buff.savage_roar.remains+2<=dot.rip.remains&dot.rip.ticking
+ if BuffRemains(savage_roar_buff) <= 6 and ComboPoints() >= 5 and BuffRemains(savage_roar_buff) + 2 <= target.DebuffRemains(rip_debuff) and target.DebuffPresent(rip_debuff) SavageRoar()
+ #savage_roar,if=buff.savage_roar.remains<=12&combo_points>=5&energy.time_to_max<=1&buff.savage_roar.remains<=dot.rip.remains+6&dot.rip.ticking
+ if BuffRemains(savage_roar_buff) <= 12 and ComboPoints() >= 5 and TimeToMaxEnergy() <= 1 and BuffRemains(savage_roar_buff) <= target.DebuffRemains(rip_debuff) + 6 and target.DebuffPresent(rip_debuff) SavageRoar()
+ #rake,if=buff.rune_of_reorigination.up&dot.rake.remains<9&buff.rune_of_reorigination.remains<=1.5
+ if BuffPresent(rune_of_reorigination_buff) and target.DebuffRemains(rake_debuff) < 9 and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rake)
+ #rake,cycle_targets=1,if=target.time_to_die-dot.rake.remains>3&(action.rake.tick_damage>dot.rake.tick_dmg|(dot.rake.remains<3&action.rake.tick_damage%dot.rake.tick_dmg>=0.75))
+ if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and { target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) or { target.DebuffRemains(rake_debuff) < 3 and target.Damage(rake_debuff) / target.LastEstimatedDamage(rake_debuff) >= 0.75 } } Spell(rake)
+ #pool_resource,for_next=1
+ #thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)&dot.rip.ticking
+ if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+ #pool_resource,for_next=1
+ #thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<9&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5&dot.rip.ticking
+ if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 9 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+ #pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+ unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+ {
+ #ferocious_bite,if=combo_points>=5&dot.rip.ticking
+ if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+ #run_action_list,name=filler,if=buff.omen_of_clarity.react
+ if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=buff.feral_fury.react
+ if BuffPresent(feral_fury_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+ if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+ #run_action_list,name=filler,if=target.time_to_die<=8.5
+ if target.TimeToDie() <= 8.5 FeralFillerActions()
+ #run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+ if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+ #run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+ if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+ #run_action_list,name=filler,if=energy.time_to_max<=1.0
+ if TimeToMaxEnergy() <= 1 FeralFillerActions()
+ }
+ }
+}
+
+AddIcon mastery=feral help=main
+{
+ if InCombat(no) FeralPrecombatActions()
+ FeralDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# berserk_cat
+# berserk_cat_buff
+# berserking
+# blood_fury
+# cat_form
+# dream_of_cenarius_melee_buff
+# dream_of_cenarius_talent
+# faerie_fire
+# feral_fury_buff
+# feral_rage_buff
+# ferocious_bite
+# force_of_nature_melee
+# healing_touch
+# king_of_the_jungle_buff
+# mangle_cat
+# mark_of_the_wild
+# omen_of_clarity_melee_buff
+# predatory_swiftness_buff
+# prowl
+# rake
+# rake_debuff
+# ravage
+# rip
+# rip_debuff
+# rune_of_reorigination_buff
+# savage_roar
+# savage_roar_buff
+# shred
+# skull_bash_cat
+# str_agi_int
+# swipe_cat
+# thrash_cat
+# thrash_cat_debuff
+# tigers_fury
+# tigers_fury_buff
+# trinket_proc_agility_buff
+# virmens_bite_potion
+# weakened_armor_debuff
+]]
+ OvaleScripts:RegisterScript("DRUID", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_hunter_bm_t16h.lua b/scripts/simulationcraft_hunter_bm_t16h.lua
new file mode 100644
index 0000000..aaaaa29
--- /dev/null
+++ b/scripts/simulationcraft_hunter_bm_t16h.lua
@@ -0,0 +1,136 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Hunter_BM_T16H"
+ local desc = "[5.4] SimulationCraft: Hunter_BM_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Hunter_BM_T16H".
+# class=hunter
+# spec=beast_mastery
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Ya!...100
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_hunter_spells)
+
+AddFunction BeastMasteryDefaultActions
+{
+ #virmens_bite_potion,if=target.time_to_die<=25|buff.stampede.up
+ if target.TimeToDie() <= 25 or BuffPresent(stampede_buff) UsePotionAgility()
+ #use_item,slot=hands
+ UseItemActions()
+ #auto_shot
+ #explosive_trap,if=active_enemies>1
+ if Enemies() > 1 Spell(explosive_trap)
+ #serpent_sting,if=!ticking
+ if not target.DebuffPresent(serpent_sting_debuff) Spell(serpent_sting)
+ #blood_fury
+ Spell(blood_fury)
+ #dire_beast,if=enabled
+ if TalentPoints(dire_beast_talent) Spell(dire_beast)
+ #fervor,if=enabled&focus<=65
+ if TalentPoints(fervor_talent) and Focus() <= 65 Spell(fervor)
+ #bestial_wrath,if=focus>60&!buff.beast_within.up
+ if Focus() > 60 and not BuffPresent(beast_within_buff) Spell(bestial_wrath)
+ #multi_shot,if=active_enemies>5|(active_enemies>1&buff.beast_cleave.down)
+ if Enemies() > 5 or { Enemies() > 1 and BuffExpires(beast_cleave_buff) } Spell(multi_shot)
+ #rapid_fire,if=!buff.rapid_fire.up
+ if not BuffPresent(rapid_fire_buff) Spell(rapid_fire)
+ #stampede,if=trinket.stat.agility.up|target.time_to_die<=20|(trinket.stacking_stat.agility.stack>10&trinket.stat.agility.cooldown_remains<=3)
+ if BuffPresent(trinket_stat_agility_buff) or target.TimeToDie() <= 20 or { BuffStacks(trinket_stacking_stat_agility_buff) > 10 and { ItemCooldown(Trinket0Slot) + ItemCooldown(Trinket1Slot) } <= 3 } Spell(stampede)
+ #barrage,if=enabled&active_enemies>5
+ if TalentPoints(barrage_talent) and Enemies() > 5 Spell(barrage)
+ #kill_shot
+ Spell(kill_shot usable=1)
+ #kill_command
+ if pet.Present() KillCommand()
+ #a_murder_of_crows,if=enabled&!ticking
+ if TalentPoints(a_murder_of_crows_talent) and not target.DebuffPresent(a_murder_of_crows_debuff) Spell(a_murder_of_crows)
+ #glaive_toss,if=enabled
+ if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+ #lynx_rush,if=enabled&!dot.lynx_rush.ticking
+ if TalentPoints(lynx_rush_talent) and not target.DebuffPresent(lynx_rush_debuff) Spell(lynx_rush)
+ #barrage,if=enabled
+ if TalentPoints(barrage_talent) Spell(barrage)
+ #powershot,if=enabled
+ if TalentPoints(powershot_talent) Spell(powershot)
+ #cobra_shot,if=active_enemies>5
+ if Enemies() > 5 Spell(cobra_shot)
+ #arcane_shot,if=buff.thrill_of_the_hunt.react|buff.beast_within.up
+ if BuffPresent(thrill_of_the_hunt_buff) or BuffPresent(beast_within_buff) Spell(arcane_shot)
+ #focus_fire,five_stacks=1
+ if BuffStacks(frenzy_buff any=1) == 5 Spell(focus_fire)
+ #cobra_shot,if=dot.serpent_sting.remains<6
+ if target.DebuffRemains(serpent_sting_debuff) < 6 Spell(cobra_shot)
+ #arcane_shot,if=focus>=61
+ if Focus() >= 61 Spell(arcane_shot)
+ #cobra_shot
+ Spell(cobra_shot)
+}
+
+AddFunction BeastMasteryPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #aspect_of_the_hawk
+ if not Stance(hunter_aspect_of_the_hawk) Spell(aspect_of_the_hawk)
+ #hunters_mark,if=target.time_to_die>=21&!debuff.ranged_vulnerability.up
+ if target.TimeToDie() >= 21 and not target.DebuffPresent(ranged_vulnerability any=1) Spell(hunters_mark)
+ #summon_pet
+ SummonPet()
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddIcon mastery=beast_mastery help=main
+{
+ if InCombat(no) BeastMasteryPrecombatActions()
+ BeastMasteryDefaultActions()
+}
+
+### Required symbols
+# a_murder_of_crows
+# a_murder_of_crows_debuff
+# a_murder_of_crows_talent
+# arcane_shot
+# aspect_of_the_hawk
+# barrage
+# barrage_talent
+# beast_cleave_buff
+# beast_within_buff
+# bestial_wrath
+# blood_fury
+# cobra_shot
+# dire_beast
+# dire_beast_talent
+# explosive_trap
+# fervor
+# fervor_talent
+# focus_fire
+# glaive_toss
+# glaive_toss_talent
+# hunters_mark
+# kill_command
+# kill_shot
+# lynx_rush
+# lynx_rush_debuff
+# lynx_rush_talent
+# multi_shot
+# powershot
+# powershot_talent
+# rapid_fire
+# rapid_fire_buff
+# serpent_sting
+# serpent_sting_debuff
+# stampede
+# stampede_buff
+# summon_pet
+# thrill_of_the_hunt_buff
+# trinket_stacking_stat_agility_buff
+# trinket_stat_agility_buff
+# virmens_bite_potion
+]]
+ OvaleScripts:RegisterScript("HUNTER", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_hunter_mm_t16h.lua b/scripts/simulationcraft_hunter_mm_t16h.lua
new file mode 100644
index 0000000..44c2985
--- /dev/null
+++ b/scripts/simulationcraft_hunter_mm_t16h.lua
@@ -0,0 +1,150 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Hunter_MM_T16H"
+ local desc = "[5.4] SimulationCraft: Hunter_MM_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Hunter_MM_T16H".
+# class=hunter
+# spec=marksmanship
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#YZ!...000
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_hunter_spells)
+
+AddFunction MarksmanshipCarefulAimActions
+{
+ #serpent_sting,if=!ticking
+ if not target.DebuffPresent(serpent_sting_debuff) Spell(serpent_sting)
+ #chimera_shot
+ Spell(chimera_shot)
+ #steady_shot,if=buff.pre_steady_focus.up&buff.steady_focus.remains<6
+ if BuffPresent(pre_steady_focus_buff) and BuffRemains(steady_focus_buff) < 6 Spell(steady_shot)
+ #aimed_shot
+ Spell(aimed_shot)
+ #glaive_toss,if=enabled
+ if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+ #steady_shot
+ Spell(steady_shot)
+}
+
+AddFunction MarksmanshipDefaultActions
+{
+ #virmens_bite_potion,if=target.time_to_die<=25|buff.stampede.up
+ if target.TimeToDie() <= 25 or BuffPresent(stampede_buff) UsePotionAgility()
+ #auto_shot
+ #explosive_trap,if=active_enemies>1
+ if Enemies() > 1 Spell(explosive_trap)
+ #blood_fury
+ Spell(blood_fury)
+ #powershot,if=enabled
+ if TalentPoints(powershot_talent) Spell(powershot)
+ #lynx_rush,if=enabled&!dot.lynx_rush.ticking
+ if TalentPoints(lynx_rush_talent) and not target.DebuffPresent(lynx_rush_debuff) Spell(lynx_rush)
+ #fervor,if=enabled&focus<=50
+ if TalentPoints(fervor_talent) and Focus() <= 50 Spell(fervor)
+ #rapid_fire,if=!buff.rapid_fire.up
+ if not BuffPresent(rapid_fire_buff) Spell(rapid_fire)
+ #stampede,if=trinket.stat.agility.up|target.time_to_die<=20|(trinket.stacking_stat.agility.stack>10&trinket.stat.agility.cooldown_remains<=3)
+ if BuffPresent(trinket_stat_agility_buff) or target.TimeToDie() <= 20 or { BuffStacks(trinket_stacking_stat_agility_buff) > 10 and { ItemCooldown(Trinket0Slot) + ItemCooldown(Trinket1Slot) } <= 3 } Spell(stampede)
+ #a_murder_of_crows,if=enabled&!ticking
+ if TalentPoints(a_murder_of_crows_talent) and not target.DebuffPresent(a_murder_of_crows_debuff) Spell(a_murder_of_crows)
+ #dire_beast,if=enabled
+ if TalentPoints(dire_beast_talent) Spell(dire_beast)
+ #run_action_list,name=careful_aim,if=target.health.pct>80
+ if target.HealthPercent() > 80 MarksmanshipCarefulAimActions()
+ #steady_shot,if=buff.pre_steady_focus.up&buff.steady_focus.remains<=4
+ if BuffPresent(pre_steady_focus_buff) and BuffRemains(steady_focus_buff) <= 4 Spell(steady_shot)
+ #glaive_toss,if=enabled
+ if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+ #barrage,if=enabled
+ if TalentPoints(barrage_talent) Spell(barrage)
+ #serpent_sting,if=!ticking
+ if not target.DebuffPresent(serpent_sting_debuff) Spell(serpent_sting)
+ #chimera_shot
+ Spell(chimera_shot)
+ #steady_shot,if=buff.steady_focus.remains<(action.steady_shot.cast_time+1)&!in_flight
+ if BuffRemains(steady_focus_buff) < { CastTime(steady_shot) + 1 } and not InFlightToTarget(steady_shot) Spell(steady_shot)
+ #kill_shot
+ Spell(kill_shot usable=1)
+ #multi_shot,if=active_enemies>=4
+ if Enemies() >= 4 Spell(multi_shot)
+ #aimed_shot,if=buff.master_marksman_fire.react
+ if BuffPresent(master_marksman_fire_buff) Spell(aimed_shot)
+ #arcane_shot,if=buff.thrill_of_the_hunt.react
+ if BuffPresent(thrill_of_the_hunt_buff) Spell(arcane_shot)
+ #aimed_shot,if=cast_time<1.6
+ if CastTime(aimed_shot) < 1.6 Spell(aimed_shot)
+ #arcane_shot,if=focus>=60|(focus>=43&(cooldown.chimera_shot.remains>=action.steady_shot.cast_time))&(!buff.rapid_fire.up&!buff.bloodlust.react)
+ if Focus() >= 60 or { Focus() >= 43 and { SpellCooldown(chimera_shot) >= CastTime(steady_shot) } } and { not BuffPresent(rapid_fire_buff) and not BuffPresent(burst_haste any=1) } Spell(arcane_shot)
+ #steady_shot
+ Spell(steady_shot)
+}
+
+AddFunction MarksmanshipPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #aspect_of_the_hawk
+ if not Stance(hunter_aspect_of_the_hawk) Spell(aspect_of_the_hawk)
+ #hunters_mark,if=target.time_to_die>=21&!debuff.ranged_vulnerability.up
+ if target.TimeToDie() >= 21 and not target.DebuffPresent(ranged_vulnerability any=1) Spell(hunters_mark)
+ #summon_pet
+ SummonPet()
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddIcon mastery=marksmanship help=main
+{
+ if InCombat(no) MarksmanshipPrecombatActions()
+ MarksmanshipDefaultActions()
+}
+
+### Required symbols
+# a_murder_of_crows
+# a_murder_of_crows_debuff
+# a_murder_of_crows_talent
+# aimed_shot
+# arcane_shot
+# aspect_of_the_hawk
+# barrage
+# barrage_talent
+# blood_fury
+# chimera_shot
+# dire_beast
+# dire_beast_talent
+# explosive_trap
+# fervor
+# fervor_talent
+# glaive_toss
+# glaive_toss_talent
+# hunters_mark
+# kill_shot
+# lynx_rush
+# lynx_rush_debuff
+# lynx_rush_talent
+# master_marksman_fire_buff
+# multi_shot
+# powershot
+# powershot_talent
+# pre_steady_focus_buff
+# rapid_fire
+# rapid_fire_buff
+# serpent_sting
+# serpent_sting_debuff
+# stampede
+# stampede_buff
+# steady_focus_buff
+# steady_shot
+# summon_pet
+# thrill_of_the_hunt_buff
+# trinket_stacking_stat_agility_buff
+# trinket_stat_agility_buff
+# virmens_bite_potion
+]]
+ OvaleScripts:RegisterScript("HUNTER", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_hunter_sv_t16h.lua b/scripts/simulationcraft_hunter_sv_t16h.lua
new file mode 100644
index 0000000..305dcc8
--- /dev/null
+++ b/scripts/simulationcraft_hunter_sv_t16h.lua
@@ -0,0 +1,133 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Hunter_SV_T16H"
+ local desc = "[5.4] SimulationCraft: Hunter_SV_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Hunter_SV_T16H".
+# class=hunter
+# spec=survival
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Yb!...200
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_hunter_spells)
+
+AddFunction SurvivalDefaultActions
+{
+ #virmens_bite_potion,if=target.time_to_die<=25|buff.stampede.up
+ if target.TimeToDie() <= 25 or BuffPresent(stampede_buff) UsePotionAgility()
+ #blood_fury
+ Spell(blood_fury)
+ #auto_shot
+ #explosive_trap,if=active_enemies>1
+ if Enemies() > 1 Spell(explosive_trap)
+ #fervor,if=enabled&focus<=50
+ if TalentPoints(fervor_talent) and Focus() <= 50 Spell(fervor)
+ #a_murder_of_crows,if=enabled&!ticking
+ if TalentPoints(a_murder_of_crows_talent) and not target.DebuffPresent(a_murder_of_crows_debuff) Spell(a_murder_of_crows)
+ #lynx_rush,if=enabled&!dot.lynx_rush.ticking
+ if TalentPoints(lynx_rush_talent) and not target.DebuffPresent(lynx_rush_debuff) Spell(lynx_rush)
+ #explosive_shot,if=buff.lock_and_load.react
+ if BuffPresent(lock_and_load_buff) Spell(explosive_shot)
+ #glaive_toss,if=enabled
+ if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+ #powershot,if=enabled
+ if TalentPoints(powershot_talent) Spell(powershot)
+ #barrage,if=enabled
+ if TalentPoints(barrage_talent) Spell(barrage)
+ #serpent_sting,if=!ticking&target.time_to_die>=10
+ if not target.DebuffPresent(serpent_sting_debuff) and target.TimeToDie() >= 10 Spell(serpent_sting)
+ #explosive_shot,if=cooldown_react
+ if Spell(explosive_shot) Spell(explosive_shot)
+ #kill_shot
+ Spell(kill_shot usable=1)
+ #black_arrow,if=!ticking&target.time_to_die>=8
+ if not target.DebuffPresent(black_arrow_debuff) and target.TimeToDie() >= 8 Spell(black_arrow)
+ #multi_shot,if=active_enemies>3
+ if Enemies() > 3 Spell(multi_shot)
+ #multi_shot,if=buff.thrill_of_the_hunt.react&dot.serpent_sting.remains<2
+ if BuffPresent(thrill_of_the_hunt_buff) and target.DebuffRemains(serpent_sting_debuff) < 2 Spell(multi_shot)
+ #arcane_shot,if=buff.thrill_of_the_hunt.react
+ if BuffPresent(thrill_of_the_hunt_buff) Spell(arcane_shot)
+ #rapid_fire,if=!buff.rapid_fire.up
+ if not BuffPresent(rapid_fire_buff) Spell(rapid_fire)
+ #dire_beast,if=enabled
+ if TalentPoints(dire_beast_talent) Spell(dire_beast)
+ #stampede,if=trinket.stat.agility.up|target.time_to_die<=20|(trinket.stacking_stat.agility.stack>10&trinket.stat.agility.cooldown_remains<=3)
+ if BuffPresent(trinket_stat_agility_buff) or target.TimeToDie() <= 20 or { BuffStacks(trinket_stacking_stat_agility_buff) > 10 and { ItemCooldown(Trinket0Slot) + ItemCooldown(Trinket1Slot) } <= 3 } Spell(stampede)
+ #cobra_shot,if=dot.serpent_sting.remains<6
+ if target.DebuffRemains(serpent_sting_debuff) < 6 Spell(cobra_shot)
+ #arcane_shot,if=focus>=67&active_enemies<2
+ if Focus() >= 67 and Enemies() < 2 Spell(arcane_shot)
+ #multi_shot,if=focus>=67&active_enemies>1
+ if Focus() >= 67 and Enemies() > 1 Spell(multi_shot)
+ #cobra_shot
+ Spell(cobra_shot)
+}
+
+AddFunction SurvivalPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #aspect_of_the_hawk
+ if not Stance(hunter_aspect_of_the_hawk) Spell(aspect_of_the_hawk)
+ #hunters_mark,if=target.time_to_die>=21&!debuff.ranged_vulnerability.up
+ if target.TimeToDie() >= 21 and not target.DebuffPresent(ranged_vulnerability any=1) Spell(hunters_mark)
+ #summon_pet
+ SummonPet()
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddIcon mastery=survival help=main
+{
+ if InCombat(no) SurvivalPrecombatActions()
+ SurvivalDefaultActions()
+}
+
+### Required symbols
+# a_murder_of_crows
+# a_murder_of_crows_debuff
+# a_murder_of_crows_talent
+# arcane_shot
+# aspect_of_the_hawk
+# barrage
+# barrage_talent
+# black_arrow
+# black_arrow_debuff
+# blood_fury
+# cobra_shot
+# dire_beast
+# dire_beast_talent
+# explosive_shot
+# explosive_trap
+# fervor
+# fervor_talent
+# glaive_toss
+# glaive_toss_talent
+# hunters_mark
+# kill_shot
+# lock_and_load_buff
+# lynx_rush
+# lynx_rush_debuff
+# lynx_rush_talent
+# multi_shot
+# powershot
+# powershot_talent
+# rapid_fire
+# rapid_fire_buff
+# serpent_sting
+# serpent_sting_debuff
+# stampede
+# stampede_buff
+# summon_pet
+# thrill_of_the_hunt_buff
+# trinket_stacking_stat_agility_buff
+# trinket_stat_agility_buff
+# virmens_bite_potion
+]]
+ OvaleScripts:RegisterScript("HUNTER", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_mage_arcane_t16h.lua b/scripts/simulationcraft_mage_arcane_t16h.lua
new file mode 100644
index 0000000..c8a1f5c
--- /dev/null
+++ b/scripts/simulationcraft_mage_arcane_t16h.lua
@@ -0,0 +1,148 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Mage_Arcane_T16H"
+ local desc = "[5.4] SimulationCraft: Mage_Arcane_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Mage_Arcane_T16H".
+# class=mage
+# spec=arcane
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#ea!0...11
+# glyphs=mana_gem/mirror_image/arcane_power
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_mage_spells)
+
+AddFunction ArcaneAoeActions
+{
+ #flamestrike
+ Spell(flamestrike)
+ #living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+ if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+ #arcane_barrage,if=buff.arcane_charge.stack>=4
+ if DebuffStacks(arcane_charge_debuff) >= 4 Spell(arcane_barrage)
+ #arcane_explosion
+ Spell(arcane_explosion)
+}
+
+AddFunction ArcaneSingleTargetActions
+{
+ #arcane_barrage,if=buff.alter_time.up&buff.alter_time.remains<2
+ if BuffPresent(alter_time_buff) and BuffRemains(alter_time_buff) < 2 Spell(arcane_barrage)
+ #arcane_missiles,if=buff.alter_time.up
+ if BuffPresent(alter_time_buff) Spell(arcane_missiles)
+ #arcane_blast,if=buff.alter_time.up
+ if BuffPresent(alter_time_buff) Spell(arcane_blast)
+ #arcane_blast,if=buff.profound_magic.up&buff.arcane_charge.stack>3&mana.pct>93
+ if BuffPresent(profound_magic_buff) and DebuffStacks(arcane_charge_debuff) > 3 and ManaPercent() > 93 Spell(arcane_blast)
+ #arcane_missiles,if=(buff.arcane_missiles.stack=2&cooldown.arcane_power.remains>0)|(buff.arcane_charge.stack>=4&cooldown.arcane_power.remains>8)
+ if { BuffStacks(arcane_missiles_buff) == 2 and SpellCooldown(arcane_power) > 0 } or { DebuffStacks(arcane_charge_debuff) >= 4 and SpellCooldown(arcane_power) > 8 } Spell(arcane_missiles)
+ #living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+ if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+ #arcane_barrage,if=buff.arcane_charge.stack>=4&mana.pct<95
+ if DebuffStacks(arcane_charge_debuff) >= 4 and ManaPercent() < 95 Spell(arcane_barrage)
+ #presence_of_mind
+ Spell(presence_of_mind)
+ #arcane_blast
+ Spell(arcane_blast)
+ #arcane_barrage,moving=1
+ if Speed() > 0 Spell(arcane_barrage)
+ #fire_blast,moving=1
+ if Speed() > 0 Spell(fire_blast)
+ #ice_lance,moving=1
+ if Speed() > 0 Spell(ice_lance)
+}
+
+AddFunction ArcaneDefaultActions
+{
+ #counterspell,if=target.debuff.casting.react
+ if target.IsInterruptible() Spell(counterspell)
+ #cancel_buff,name=alter_time,moving=1
+ #conjure_mana_gem,if=mana_gem_charges<3&target.debuff.invulnerable.react
+ if ItemCharges(mana_gem) < 3 and target.InCombat(no) ConjureManaGem()
+ #time_warp,if=target.health.pct<25|time>5
+ if target.HealthPercent() < 25 or TimeInCombat() > 5 Spell(time_warp)
+ #rune_of_power,if=buff.rune_of_power.remains<cast_time
+ if RuneOfPowerRemains() < CastTime(rune_of_power) Spell(rune_of_power)
+ #rune_of_power,if=cooldown.arcane_power.remains=0&buff.rune_of_power.remains<buff.arcane_power.duration
+ if not SpellCooldown(arcane_power) > 0 and RuneOfPowerRemains() < SpellData(arcane_power_buff duration) Spell(rune_of_power)
+ #mirror_image
+ Spell(mirror_image)
+ #mana_gem,if=mana.pct<80&buff.alter_time.down
+ if ManaPercent() < 80 and BuffExpires(alter_time_buff) UseManaGem()
+ #arcane_power,if=time_to_bloodlust>180&((buff.rune_of_power.remains>=buff.arcane_power.duration&buff.arcane_missiles.stack=2&buff.arcane_charge.stack>2)|target.time_to_die<buff.arcane_power.duration+5),moving=0
+ if TimeToBloodlust() > 180 and { { RuneOfPowerRemains() >= SpellData(arcane_power_buff duration) and BuffStacks(arcane_missiles_buff) == 2 and DebuffStacks(arcane_charge_debuff) > 2 } or target.TimeToDie() < SpellData(arcane_power_buff duration) + 5 } Spell(arcane_power)
+ #berserking,if=buff.alter_time.down&(buff.arcane_power.up|target.time_to_die<18)
+ if BuffExpires(alter_time_buff) and { BuffPresent(arcane_power_buff) or target.TimeToDie() < 18 } Spell(berserking)
+ #jade_serpent_potion,if=buff.alter_time.down&(buff.arcane_power.up|target.time_to_die<50)
+ if BuffExpires(alter_time_buff) and { BuffPresent(arcane_power_buff) or target.TimeToDie() < 50 } UsePotionIntellect()
+ #use_item,slot=hands,sync=alter_time_activate,if=buff.alter_time.down
+ if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) UseItemActions()
+ #alter_time,if=buff.alter_time.down&buff.arcane_power.up
+ if BuffExpires(alter_time_buff) and BuffPresent(arcane_power_buff) Spell(alter_time)
+ #use_item,slot=hands,if=(cooldown.alter_time_activate.remains>45|target.time_to_die<25)&buff.rune_of_power.remains>20
+ if { SpellCooldown(alter_time_activate) > 45 or target.TimeToDie() < 25 } and RuneOfPowerRemains() > 20 UseItemActions()
+ #run_action_list,name=aoe,if=active_enemies>=6
+ if Enemies() >= 6 ArcaneAoeActions()
+ #run_action_list,name=single_target,if=active_enemies<6
+ if Enemies() < 6 ArcaneSingleTargetActions()
+}
+
+AddFunction ArcanePrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #arcane_brilliance
+ if BuffExpires(critical_strike any=1) or BuffExpires(spell_power_multiplier any=1) Spell(arcane_brilliance)
+ #frost_armor
+ if BuffExpires(frost_armor_buff) Spell(frost_armor)
+ #snapshot_stats
+ #rune_of_power
+ Spell(rune_of_power)
+ #jade_serpent_potion
+ UsePotionIntellect()
+ #mirror_image
+ Spell(mirror_image)
+}
+
+AddIcon mastery=arcane help=main
+{
+ if InCombat(no) ArcanePrecombatActions()
+ ArcaneDefaultActions()
+}
+
+### Required symbols
+# alter_time
+# alter_time_activate
+# alter_time_buff
+# arcane_barrage
+# arcane_blast
+# arcane_brilliance
+# arcane_charge_debuff
+# arcane_explosion
+# arcane_missiles
+# arcane_missiles_buff
+# arcane_power
+# arcane_power_buff
+# berserking
+# conjure_mana_gem
+# counterspell
+# fire_blast
+# flamestrike
+# frost_armor
+# frost_armor_buff
+# ice_lance
+# jade_serpent_potion
+# living_bomb
+# living_bomb_debuff
+# mana_gem
+# mirror_image
+# presence_of_mind
+# profound_magic_buff
+# rune_of_power
+# time_warp
+]]
+ OvaleScripts:RegisterScript("MAGE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_mage_fire_t16h.lua b/scripts/simulationcraft_mage_fire_t16h.lua
new file mode 100644
index 0000000..3e1af69
--- /dev/null
+++ b/scripts/simulationcraft_mage_fire_t16h.lua
@@ -0,0 +1,128 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Mage_Fire_T16H"
+ local desc = "[5.4] SimulationCraft: Mage_Fire_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Mage_Fire_T16H".
+# class=mage
+# spec=fire
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#eZ!0...11
+# glyphs=combustion/counterspell
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_mage_spells)
+
+AddFunction FireDefaultActions
+{
+ #counterspell,if=target.debuff.casting.react
+ if target.IsInterruptible() Spell(counterspell)
+ #cancel_buff,name=alter_time,moving=1
+ #conjure_mana_gem,if=mana_gem_charges<3&target.debuff.invulnerable.react
+ if ItemCharges(mana_gem) < 3 and target.InCombat(no) ConjureManaGem()
+ #time_warp,if=target.health.pct<25|time>5
+ if target.HealthPercent() < 25 or TimeInCombat() > 5 Spell(time_warp)
+ #rune_of_power,if=buff.rune_of_power.remains<cast_time&buff.alter_time.down
+ if RuneOfPowerRemains() < CastTime(rune_of_power) and BuffExpires(alter_time_buff) Spell(rune_of_power)
+ #rune_of_power,if=cooldown.alter_time_activate.remains=0&buff.rune_of_power.remains<6
+ if not SpellCooldown(alter_time_activate) > 0 and RuneOfPowerRemains() < 6 Spell(rune_of_power)
+ #berserking,if=buff.alter_time.down&target.time_to_die<18
+ if BuffExpires(alter_time_buff) and target.TimeToDie() < 18 Spell(berserking)
+ #jade_serpent_potion,if=buff.alter_time.down&target.time_to_die<45
+ if BuffExpires(alter_time_buff) and target.TimeToDie() < 45 UsePotionIntellect()
+ #mirror_image
+ Spell(mirror_image)
+ #combustion,if=target.time_to_die<22
+ if target.TimeToDie() < 22 Spell(combustion)
+ #combustion,if=dot.ignite.tick_dmg>=((3*action.pyroblast.crit_damage)*mastery_value*0.5)
+ if target.LastEstimatedDamage(ignite_debuff) >= { { 3 * target.CritDamage(pyroblast) } * MasteryEffect() / 100 * 0.5 } Spell(combustion)
+ #combustion,if=dot.ignite.tick_dmg>=((action.fireball.crit_damage+action.inferno_blast.crit_damage+action.pyroblast.hit_damage)*mastery_value*0.5)&dot.pyroblast.ticking&buff.alter_time.down&buff.pyroblast.down&buff.presence_of_mind.down
+ if target.LastEstimatedDamage(ignite_debuff) >= { { target.CritDamage(fireball) + target.CritDamage(inferno_blast) + target.Damage(pyroblast) } * MasteryEffect() / 100 * 0.5 } and target.DebuffPresent(pyroblast_debuff) and BuffExpires(alter_time_buff) and BuffExpires(pyroblast_buff) and BuffExpires(presence_of_mind_buff) Spell(combustion)
+ #berserking,sync=alter_time_activate,if=buff.alter_time.down
+ if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) Spell(berserking)
+ #presence_of_mind,sync=alter_time_activate,if=buff.alter_time.down
+ if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) Spell(presence_of_mind)
+ #jade_serpent_potion,sync=alter_time_activate,if=buff.alter_time.down
+ if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) UsePotionIntellect()
+ #use_item,slot=hands,sync=alter_time_activate
+ if not SpellCooldown(alter_time_activate) > 0 UseItemActions()
+ #alter_time,if=time_to_bloodlust>180&buff.alter_time.down&buff.pyroblast.react
+ if TimeToBloodlust() > 180 and BuffExpires(alter_time_buff) and BuffPresent(pyroblast_buff) Spell(alter_time)
+ #use_item,slot=hands,if=cooldown.alter_time_activate.remains>40|target.time_to_die<12
+ if SpellCooldown(alter_time_activate) > 40 or target.TimeToDie() < 12 UseItemActions()
+ #presence_of_mind,if=cooldown.alter_time_activate.remains>60|target.time_to_die<5
+ if SpellCooldown(alter_time_activate) > 60 or target.TimeToDie() < 5 Spell(presence_of_mind)
+ #flamestrike,if=active_enemies>=5
+ if Enemies() >= 5 Spell(flamestrike)
+ #inferno_blast,if=dot.combustion.ticking&active_enemies>1
+ if target.DebuffPresent(combustion_debuff) and Enemies() > 1 Spell(inferno_blast)
+ #pyroblast,if=buff.pyroblast.react|buff.presence_of_mind.up
+ if BuffPresent(pyroblast_buff) or BuffPresent(presence_of_mind_buff) Spell(pyroblast)
+ #inferno_blast,if=buff.heating_up.react&buff.pyroblast.down
+ if BuffPresent(heating_up_buff) and BuffExpires(pyroblast_buff) Spell(inferno_blast)
+ #living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+ if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+ #fireball
+ Spell(fireball)
+ #scorch,moving=1
+ if Speed() > 0 Spell(scorch)
+}
+
+AddFunction FirePrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #arcane_brilliance
+ if BuffExpires(critical_strike any=1) or BuffExpires(spell_power_multiplier any=1) Spell(arcane_brilliance)
+ #molten_armor
+ if BuffExpires(molten_armor_buff) Spell(molten_armor)
+ #snapshot_stats
+ #rune_of_power
+ Spell(rune_of_power)
+ #jade_serpent_potion
+ UsePotionIntellect()
+ #mirror_image
+ Spell(mirror_image)
+}
+
+AddIcon mastery=fire help=main
+{
+ if InCombat(no) FirePrecombatActions()
+ FireDefaultActions()
+}
+
+### Required symbols
+# alter_time
+# alter_time_activate
+# alter_time_buff
+# arcane_brilliance
+# berserking
+# combustion
+# combustion_debuff
+# conjure_mana_gem
+# counterspell
+# fireball
+# flamestrike
+# heating_up_buff
+# ignite_debuff
+# inferno_blast
+# jade_serpent_potion
+# living_bomb
+# living_bomb_debuff
+# mana_gem
+# mirror_image
+# molten_armor
+# molten_armor_buff
+# presence_of_mind
+# presence_of_mind_buff
+# pyroblast
+# pyroblast_buff
+# pyroblast_debuff
+# rune_of_power
+# scorch
+# time_warp
+]]
+ OvaleScripts:RegisterScript("MAGE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_mage_frost_t16h.lua b/scripts/simulationcraft_mage_frost_t16h.lua
new file mode 100644
index 0000000..c7977cd
--- /dev/null
+++ b/scripts/simulationcraft_mage_frost_t16h.lua
@@ -0,0 +1,128 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Mage_Frost_T16H"
+ local desc = "[5.4] SimulationCraft: Mage_Frost_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Mage_Frost_T16H".
+# class=mage
+# spec=frost
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#eb!0...11
+# glyphs=evocation/icy_veins/splitting_ice
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_mage_spells)
+
+AddFunction FrostDefaultActions
+{
+ #counterspell,if=target.debuff.casting.react
+ if target.IsInterruptible() Spell(counterspell)
+ #cancel_buff,name=alter_time,moving=1
+ #conjure_mana_gem,if=mana_gem_charges<3&target.debuff.invulnerable.react
+ if ItemCharges(mana_gem) < 3 and target.InCombat(no) ConjureManaGem()
+ #time_warp,if=target.health.pct<25|time>5
+ if target.HealthPercent() < 25 or TimeInCombat() > 5 Spell(time_warp)
+ #rune_of_power,if=buff.rune_of_power.remains<cast_time&buff.alter_time.down
+ if RuneOfPowerRemains() < CastTime(rune_of_power) and BuffExpires(alter_time_buff) Spell(rune_of_power)
+ #rune_of_power,if=cooldown.icy_veins.remains=0&buff.rune_of_power.remains<20
+ if not IcyVeinsCooldownRemains() > 0 and RuneOfPowerRemains() < 20 Spell(rune_of_power)
+ #mirror_image
+ Spell(mirror_image)
+ #frozen_orb
+ Spell(frozen_orb)
+ #icy_veins,if=time_to_bloodlust>180&((buff.brain_freeze.react|buff.fingers_of_frost.react)|target.time_to_die<22),moving=0
+ if TimeToBloodlust() > 180 and { { BuffPresent(brain_freeze_buff) or BuffPresent(fingers_of_frost_buff) } or target.TimeToDie() < 22 } IcyVeins()
+ #berserking,if=buff.icy_veins.up|target.time_to_die<18
+ if BuffPresent(icy_veins_buff) or target.TimeToDie() < 18 Spell(berserking)
+ #jade_serpent_potion,if=buff.icy_veins.up|target.time_to_die<45
+ if BuffPresent(icy_veins_buff) or target.TimeToDie() < 45 UsePotionIntellect()
+ #presence_of_mind,if=buff.icy_veins.up|cooldown.icy_veins.remains>15|target.time_to_die<15
+ if BuffPresent(icy_veins_buff) or IcyVeinsCooldownRemains() > 15 or target.TimeToDie() < 15 Spell(presence_of_mind)
+ #use_item,slot=hands,sync=alter_time_activate,if=buff.alter_time.down
+ if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) UseItemActions()
+ #alter_time,if=buff.alter_time.down&buff.icy_veins.up
+ if BuffExpires(alter_time_buff) and BuffPresent(icy_veins_buff) Spell(alter_time)
+ #use_item,slot=hands,if=(cooldown.alter_time_activate.remains>45&buff.rune_of_power.remains>20)|target.time_to_die<25
+ if { SpellCooldown(alter_time_activate) > 45 and RuneOfPowerRemains() > 20 } or target.TimeToDie() < 25 UseItemActions()
+ #flamestrike,if=active_enemies>=5
+ if Enemies() >= 5 Spell(flamestrike)
+ #frostfire_bolt,if=buff.alter_time.up&buff.brain_freeze.up
+ if BuffPresent(alter_time_buff) and BuffPresent(brain_freeze_buff) Spell(frostfire_bolt)
+ #ice_lance,if=buff.alter_time.up&buff.fingers_of_frost.up
+ if BuffPresent(alter_time_buff) and BuffPresent(fingers_of_frost_buff) Spell(ice_lance)
+ #living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+ if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+ #frostfire_bolt,if=buff.brain_freeze.react&cooldown.icy_veins.remains>2
+ if BuffPresent(brain_freeze_buff) and IcyVeinsCooldownRemains() > 2 Spell(frostfire_bolt)
+ #ice_lance,if=buff.frozen_thoughts.react&buff.fingers_of_frost.up
+ if BuffPresent(frozen_thoughts_buff) and BuffPresent(fingers_of_frost_buff) Spell(ice_lance)
+ #ice_lance,if=buff.fingers_of_frost.up&(buff.fingers_of_frost.remains<2|(buff.fingers_of_frost.stack>1&cooldown.icy_veins.remains>2))
+ if BuffPresent(fingers_of_frost_buff) and { BuffRemains(fingers_of_frost_buff) < 2 or { BuffStacks(fingers_of_frost_buff) > 1 and IcyVeinsCooldownRemains() > 2 } } Spell(ice_lance)
+ #frostbolt
+ Spell(frostbolt)
+ #fire_blast,moving=1
+ if Speed() > 0 Spell(fire_blast)
+ #ice_lance,moving=1
+ if Speed() > 0 Spell(ice_lance)
+}
+
+AddFunction FrostPrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #arcane_brilliance
+ if BuffExpires(critical_strike any=1) or BuffExpires(spell_power_multiplier any=1) Spell(arcane_brilliance)
+ #frost_armor
+ if BuffExpires(frost_armor_buff) Spell(frost_armor)
+ #water_elemental
+ if pet.Present(no) Spell(water_elemental)
+ #snapshot_stats
+ #rune_of_power
+ Spell(rune_of_power)
+ #jade_serpent_potion
+ UsePotionIntellect()
+ #mirror_image
+ Spell(mirror_image)
+}
+
+AddIcon mastery=frost help=main
+{
+ if InCombat(no) FrostPrecombatActions()
+ FrostDefaultActions()
+}
+
+### Required symbols
+# alter_time
+# alter_time_activate
+# alter_time_buff
+# arcane_brilliance
+# berserking
+# brain_freeze_buff
+# conjure_mana_gem
+# counterspell
+# fingers_of_frost_buff
+# fire_blast
+# flamestrike
+# frost_armor
+# frost_armor_buff
+# frostbolt
+# frostfire_bolt
+# frozen_orb
+# frozen_thoughts_buff
+# ice_lance
+# icy_veins
+# icy_veins_buff
+# jade_serpent_potion
+# living_bomb
+# living_bomb_debuff
+# mana_gem
+# mirror_image
+# presence_of_mind
+# rune_of_power
+# time_warp
+# water_elemental
+]]
+ OvaleScripts:RegisterScript("MAGE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_monk_windwalker_1h_t16h.lua b/scripts/simulationcraft_monk_windwalker_1h_t16h.lua
new file mode 100644
index 0000000..c14aa26
--- /dev/null
+++ b/scripts/simulationcraft_monk_windwalker_1h_t16h.lua
@@ -0,0 +1,141 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Monk_Windwalker_1h_T16H"
+ local desc = "[5.4] SimulationCraft: Monk_Windwalker_1h_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Monk_Windwalker_1h_T16H".
+# class=monk
+# spec=windwalker
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#fb!002221
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_monk_spells)
+
+AddFunction WindwalkerAoeActions
+{
+ #rushing_jade_wind,if=talent.rushing_jade_wind.enabled
+ if TalentPoints(rushing_jade_wind_talent) Spell(rushing_jade_wind)
+ #zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&!dot.zen_sphere.ticking
+ if TalentPoints(zen_sphere_talent) and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+ #chi_wave,if=talent.chi_wave.enabled
+ if TalentPoints(chi_wave_talent) Spell(chi_wave)
+ #chi_burst,if=talent.chi_burst.enabled
+ if TalentPoints(chi_burst_talent) Spell(chi_burst)
+ #rising_sun_kick,if=chi=chi.max
+ if Chi() == MaxChi() Spell(rising_sun_kick)
+ #spinning_crane_kick,if=!talent.rushing_jade_wind.enabled
+ if not TalentPoints(rushing_jade_wind_talent) Spell(spinning_crane_kick)
+}
+
+AddFunction WindwalkerSingleTargetActions
+{
+ #rising_sun_kick
+ Spell(rising_sun_kick)
+ #fists_of_fury,if=buff.energizing_brew.down&energy.time_to_max>4&buff.tiger_power.remains>4
+ if BuffExpires(energizing_brew_buff) and TimeToMaxEnergy() > 4 and BuffRemains(tiger_power_buff) > 4 Spell(fists_of_fury)
+ #chi_wave,if=talent.chi_wave.enabled&energy.time_to_max>2
+ if TalentPoints(chi_wave_talent) and TimeToMaxEnergy() > 2 Spell(chi_wave)
+ #chi_burst,if=talent.chi_burst.enabled&energy.time_to_max>2
+ if TalentPoints(chi_burst_talent) and TimeToMaxEnergy() > 2 Spell(chi_burst)
+ #zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&energy.time_to_max>2&!dot.zen_sphere.ticking
+ if TalentPoints(zen_sphere_talent) and TimeToMaxEnergy() > 2 and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+ #blackout_kick,if=buff.combo_breaker_bok.react
+ if BuffPresent(combo_breaker_bok_buff) Spell(blackout_kick)
+ #tiger_palm,if=buff.combo_breaker_tp.react&(buff.combo_breaker_tp.remains<=2|energy.time_to_max>=2)
+ if BuffPresent(combo_breaker_tp_buff) and { BuffRemains(combo_breaker_tp_buff) <= 2 or TimeToMaxEnergy() >= 2 } Spell(tiger_palm)
+ #jab,if=chi.max-chi>=2
+ if MaxChi() - Chi() >= 2 Spell(jab)
+ #blackout_kick,if=energy+energy.regen*cooldown.rising_sun_kick.remains>=40
+ if Energy() + EnergyRegen() * SpellCooldown(rising_sun_kick) >= 40 Spell(blackout_kick)
+}
+
+AddFunction WindwalkerDefaultActions
+{
+ #auto_attack
+ #chi_sphere,if=talent.power_strikes.enabled&buff.chi_sphere.react&chi<4
+ #virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<=60
+ if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 60 UsePotionAgility()
+ #use_item,name=gloves_of_the_golden_protector
+ UseItemActions()
+ #berserking
+ Spell(berserking)
+ #chi_brew,if=talent.chi_brew.enabled&chi<=2&(trinket.proc.agility.react|(charges=1&recharge_time<=10)|charges=2|target.time_to_die<charges*10)
+ if TalentPoints(chi_brew_talent) and Chi() <= 2 and { BuffPresent(trinket_proc_agility_buff) or { Charges(chi_brew) == 1 and SpellChargeCooldown(chi_brew) <= 10 } or Charges(chi_brew) == 2 or target.TimeToDie() < Charges(chi_brew) * 10 } Spell(chi_brew)
+ #tiger_palm,if=buff.tiger_power.remains<=3
+ if BuffRemains(tiger_power_buff) <= 3 Spell(tiger_palm)
+ #tigereye_brew,if=buff.tigereye_brew_use.down&buff.tigereye_brew.stack=20
+ if BuffExpires(tigereye_brew_use_buff) and BuffStacks(tigereye_brew_buff) == 20 Spell(tigereye_brew)
+ #tigereye_brew,if=buff.tigereye_brew_use.down&trinket.proc.agility.react
+ if BuffExpires(tigereye_brew_use_buff) and BuffPresent(trinket_proc_agility_buff) Spell(tigereye_brew)
+ #tigereye_brew,if=buff.tigereye_brew_use.down&chi>=2&(trinket.proc.agility.react|trinket.proc.strength.react|buff.tigereye_brew.stack>=15|target.time_to_die<40)&debuff.rising_sun_kick.up&buff.tiger_power.up
+ if BuffExpires(tigereye_brew_use_buff) and Chi() >= 2 and { BuffPresent(trinket_proc_agility_buff) or BuffPresent(trinket_proc_strength_buff) or BuffStacks(tigereye_brew_buff) >= 15 or target.TimeToDie() < 40 } and target.DebuffPresent(rising_sun_kick_debuff) and BuffPresent(tiger_power_buff) Spell(tigereye_brew)
+ #energizing_brew,if=energy.time_to_max>5
+ if TimeToMaxEnergy() > 5 Spell(energizing_brew)
+ #rising_sun_kick,if=debuff.rising_sun_kick.down
+ if target.DebuffExpires(rising_sun_kick_debuff) Spell(rising_sun_kick)
+ #tiger_palm,if=buff.tiger_power.down&debuff.rising_sun_kick.remains>1&energy.time_to_max>1
+ if BuffExpires(tiger_power_buff) and target.DebuffRemains(rising_sun_kick_debuff) > 1 and TimeToMaxEnergy() > 1 Spell(tiger_palm)
+ #invoke_xuen,if=talent.invoke_xuen.enabled
+ if TalentPoints(invoke_xuen_talent) Spell(invoke_xuen)
+ #run_action_list,name=aoe,if=active_enemies>=3
+ if Enemies() >= 3 WindwalkerAoeActions()
+ #run_action_list,name=single_target,if=active_enemies<3
+ if Enemies() < 3 WindwalkerSingleTargetActions()
+}
+
+AddFunction WindwalkerPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #stance,choose=fierce_tiger
+ if not Stance(monk_stance_of_the_fierce_tiger) Spell(stance_of_the_fierce_tiger)
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddIcon mastery=windwalker help=main
+{
+ if InCombat(no) WindwalkerPrecombatActions()
+ WindwalkerDefaultActions()
+}
+
+### Required symbols
+# berserking
+# blackout_kick
+# chi_brew
+# chi_brew_talent
+# chi_burst
+# chi_burst_talent
+# chi_wave
+# chi_wave_talent
+# combo_breaker_bok_buff
+# combo_breaker_tp_buff
+# energizing_brew
+# energizing_brew_buff
+# fists_of_fury
+# invoke_xuen
+# invoke_xuen_talent
+# jab
+# rising_sun_kick
+# rising_sun_kick_debuff
+# rushing_jade_wind
+# rushing_jade_wind_talent
+# spinning_crane_kick
+# tiger_palm
+# tiger_power_buff
+# tigereye_brew
+# tigereye_brew_buff
+# tigereye_brew_use_buff
+# trinket_proc_agility_buff
+# trinket_proc_strength_buff
+# virmens_bite_potion
+# zen_sphere
+# zen_sphere_buff
+# zen_sphere_talent
+]]
+ OvaleScripts:RegisterScript("MONK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_monk_windwalker_2h_t16h.lua b/scripts/simulationcraft_monk_windwalker_2h_t16h.lua
new file mode 100644
index 0000000..6313cc4
--- /dev/null
+++ b/scripts/simulationcraft_monk_windwalker_2h_t16h.lua
@@ -0,0 +1,141 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Monk_Windwalker_2h_T16H"
+ local desc = "[5.4] SimulationCraft: Monk_Windwalker_2h_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Monk_Windwalker_2h_T16H".
+# class=monk
+# spec=windwalker
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#fb!002221
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_monk_spells)
+
+AddFunction WindwalkerAoeActions
+{
+ #rushing_jade_wind,if=talent.rushing_jade_wind.enabled
+ if TalentPoints(rushing_jade_wind_talent) Spell(rushing_jade_wind)
+ #zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&!dot.zen_sphere.ticking
+ if TalentPoints(zen_sphere_talent) and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+ #chi_wave,if=talent.chi_wave.enabled
+ if TalentPoints(chi_wave_talent) Spell(chi_wave)
+ #chi_burst,if=talent.chi_burst.enabled
+ if TalentPoints(chi_burst_talent) Spell(chi_burst)
+ #rising_sun_kick,if=chi=chi.max
+ if Chi() == MaxChi() Spell(rising_sun_kick)
+ #spinning_crane_kick,if=!talent.rushing_jade_wind.enabled
+ if not TalentPoints(rushing_jade_wind_talent) Spell(spinning_crane_kick)
+}
+
+AddFunction WindwalkerSingleTargetActions
+{
+ #rising_sun_kick
+ Spell(rising_sun_kick)
+ #fists_of_fury,if=buff.energizing_brew.down&energy.time_to_max>4&buff.tiger_power.remains>4
+ if BuffExpires(energizing_brew_buff) and TimeToMaxEnergy() > 4 and BuffRemains(tiger_power_buff) > 4 Spell(fists_of_fury)
+ #chi_wave,if=talent.chi_wave.enabled&energy.time_to_max>2
+ if TalentPoints(chi_wave_talent) and TimeToMaxEnergy() > 2 Spell(chi_wave)
+ #chi_burst,if=talent.chi_burst.enabled&energy.time_to_max>2
+ if TalentPoints(chi_burst_talent) and TimeToMaxEnergy() > 2 Spell(chi_burst)
+ #zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&energy.time_to_max>2&!dot.zen_sphere.ticking
+ if TalentPoints(zen_sphere_talent) and TimeToMaxEnergy() > 2 and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+ #blackout_kick,if=buff.combo_breaker_bok.react
+ if BuffPresent(combo_breaker_bok_buff) Spell(blackout_kick)
+ #tiger_palm,if=buff.combo_breaker_tp.react&(buff.combo_breaker_tp.remains<=2|energy.time_to_max>=2)
+ if BuffPresent(combo_breaker_tp_buff) and { BuffRemains(combo_breaker_tp_buff) <= 2 or TimeToMaxEnergy() >= 2 } Spell(tiger_palm)
+ #jab,if=chi.max-chi>=2
+ if MaxChi() - Chi() >= 2 Spell(jab)
+ #blackout_kick,if=energy+energy.regen*cooldown.rising_sun_kick.remains>=40
+ if Energy() + EnergyRegen() * SpellCooldown(rising_sun_kick) >= 40 Spell(blackout_kick)
+}
+
+AddFunction WindwalkerDefaultActions
+{
+ #auto_attack
+ #chi_sphere,if=talent.power_strikes.enabled&buff.chi_sphere.react&chi<4
+ #virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<=60
+ if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 60 UsePotionAgility()
+ #use_item,name=gloves_of_the_golden_protector
+ UseItemActions()
+ #berserking
+ Spell(berserking)
+ #chi_brew,if=talent.chi_brew.enabled&chi<=2&(trinket.proc.agility.react|(charges=1&recharge_time<=10)|charges=2|target.time_to_die<charges*10)
+ if TalentPoints(chi_brew_talent) and Chi() <= 2 and { BuffPresent(trinket_proc_agility_buff) or { Charges(chi_brew) == 1 and SpellChargeCooldown(chi_brew) <= 10 } or Charges(chi_brew) == 2 or target.TimeToDie() < Charges(chi_brew) * 10 } Spell(chi_brew)
+ #tiger_palm,if=buff.tiger_power.remains<=3
+ if BuffRemains(tiger_power_buff) <= 3 Spell(tiger_palm)
+ #tigereye_brew,if=buff.tigereye_brew_use.down&buff.tigereye_brew.stack=20
+ if BuffExpires(tigereye_brew_use_buff) and BuffStacks(tigereye_brew_buff) == 20 Spell(tigereye_brew)
+ #tigereye_brew,if=buff.tigereye_brew_use.down&trinket.proc.agility.react
+ if BuffExpires(tigereye_brew_use_buff) and BuffPresent(trinket_proc_agility_buff) Spell(tigereye_brew)
+ #tigereye_brew,if=buff.tigereye_brew_use.down&chi>=2&(trinket.proc.agility.react|trinket.proc.strength.react|buff.tigereye_brew.stack>=15|target.time_to_die<40)&debuff.rising_sun_kick.up&buff.tiger_power.up
+ if BuffExpires(tigereye_brew_use_buff) and Chi() >= 2 and { BuffPresent(trinket_proc_agility_buff) or BuffPresent(trinket_proc_strength_buff) or BuffStacks(tigereye_brew_buff) >= 15 or target.TimeToDie() < 40 } and target.DebuffPresent(rising_sun_kick_debuff) and BuffPresent(tiger_power_buff) Spell(tigereye_brew)
+ #energizing_brew,if=energy.time_to_max>5
+ if TimeToMaxEnergy() > 5 Spell(energizing_brew)
+ #rising_sun_kick,if=debuff.rising_sun_kick.down
+ if target.DebuffExpires(rising_sun_kick_debuff) Spell(rising_sun_kick)
+ #tiger_palm,if=buff.tiger_power.down&debuff.rising_sun_kick.remains>1&energy.time_to_max>1
+ if BuffExpires(tiger_power_buff) and target.DebuffRemains(rising_sun_kick_debuff) > 1 and TimeToMaxEnergy() > 1 Spell(tiger_palm)
+ #invoke_xuen,if=talent.invoke_xuen.enabled
+ if TalentPoints(invoke_xuen_talent) Spell(invoke_xuen)
+ #run_action_list,name=aoe,if=active_enemies>=3
+ if Enemies() >= 3 WindwalkerAoeActions()
+ #run_action_list,name=single_target,if=active_enemies<3
+ if Enemies() < 3 WindwalkerSingleTargetActions()
+}
+
+AddFunction WindwalkerPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #stance,choose=fierce_tiger
+ if not Stance(monk_stance_of_the_fierce_tiger) Spell(stance_of_the_fierce_tiger)
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddIcon mastery=windwalker help=main
+{
+ if InCombat(no) WindwalkerPrecombatActions()
+ WindwalkerDefaultActions()
+}
+
+### Required symbols
+# berserking
+# blackout_kick
+# chi_brew
+# chi_brew_talent
+# chi_burst
+# chi_burst_talent
+# chi_wave
+# chi_wave_talent
+# combo_breaker_bok_buff
+# combo_breaker_tp_buff
+# energizing_brew
+# energizing_brew_buff
+# fists_of_fury
+# invoke_xuen
+# invoke_xuen_talent
+# jab
+# rising_sun_kick
+# rising_sun_kick_debuff
+# rushing_jade_wind
+# rushing_jade_wind_talent
+# spinning_crane_kick
+# tiger_palm
+# tiger_power_buff
+# tigereye_brew
+# tigereye_brew_buff
+# tigereye_brew_use_buff
+# trinket_proc_agility_buff
+# trinket_proc_strength_buff
+# virmens_bite_potion
+# zen_sphere
+# zen_sphere_buff
+# zen_sphere_talent
+]]
+ OvaleScripts:RegisterScript("MONK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_paladin_protection_t16h.lua b/scripts/simulationcraft_paladin_protection_t16h.lua
new file mode 100644
index 0000000..ab37f40
--- /dev/null
+++ b/scripts/simulationcraft_paladin_protection_t16h.lua
@@ -0,0 +1,136 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Paladin_Protection_T16H"
+ local desc = "[5.4] SimulationCraft: Paladin_Protection_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Paladin_Protection_T16H".
+# class=paladin
+# spec=protection
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#bZ!201121
+# glyphs=focused_shield/alabaster_shield/divine_protection
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_paladin_spells)
+
+AddFunction ProtectionDefaultActions
+{
+ #
+ #auto_attack
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent_mana)
+ #avenging_wrath
+ Spell(avenging_wrath)
+ #holy_avenger,if=talent.holy_avenger.enabled
+ if TalentPoints(holy_avenger_talent) Spell(holy_avenger)
+ #divine_protection
+ Spell(divine_protection)
+ #guardian_of_ancient_kings
+ Spell(guardian_of_ancient_kings_tank)
+ #eternal_flame,if=talent.eternal_flame.enabled&(buff.eternal_flame.remains<2&buff.bastion_of_glory.react>2&(holy_power>=3|buff.divine_purpose.react|buff.bastion_of_power.react))
+ if TalentPoints(eternal_flame_talent) and { BuffRemains(eternal_flame_buff) < 2 and BuffPresent(bastion_of_glory_buff) > 2 and { HolyPower() >= 3 or BuffPresent(divine_purpose_buff) or BuffPresent(bastion_of_power_buff) } } Spell(eternal_flame)
+ #eternal_flame,if=talent.eternal_flame.enabled&(buff.bastion_of_power.react&buff.bastion_of_glory.react>=5)
+ if TalentPoints(eternal_flame_talent) and { BuffPresent(bastion_of_power_buff) and BuffPresent(bastion_of_glory_buff) >= 5 } Spell(eternal_flame)
+ #shield_of_the_righteous,if=holy_power>=5|buff.divine_purpose.react|incoming_damage_1500ms>=health.max*0.3
+ if HolyPower() >= 5 or BuffPresent(divine_purpose_buff) or IncomingDamage(1.500) >= MaxHealth() * 0.3 Spell(shield_of_the_righteous)
+ #judgment,if=talent.sanctified_wrath.enabled&buff.avenging_wrath.react
+ if TalentPoints(sanctified_wrath_talent) and BuffPresent(avenging_wrath_buff) Spell(judgment)
+ #wait,sec=cooldown.judgment.remains,if=talent.sanctified_wrath.enabled&cooldown.judgment.remains>0&cooldown.judgment.remains<=0.5
+ if TalentPoints(sanctified_wrath_talent) and SpellCooldown(judgment) > 0 and SpellCooldown(judgment) <= 0.5 wait Spell(judgment)
+ #crusader_strike
+ Spell(crusader_strike)
+ #wait,sec=cooldown.crusader_strike.remains,if=cooldown.crusader_strike.remains>0&cooldown.crusader_strike.remains<=0.5
+ if SpellCooldown(crusader_strike) > 0 and SpellCooldown(crusader_strike) <= 0.5 wait Spell(crusader_strike)
+ #judgment
+ Spell(judgment)
+ #wait,sec=cooldown.judgment.remains,if=cooldown.judgment.remains>0&cooldown.judgment.remains<=0.5&(cooldown.crusader_strike.remains-cooldown.judgment.remains)>=0.5
+ if SpellCooldown(judgment) > 0 and SpellCooldown(judgment) <= 0.5 and { SpellCooldown(crusader_strike) - SpellCooldown(judgment) } >= 0.5 wait Spell(judgment)
+ #avengers_shield
+ Spell(avengers_shield)
+ #sacred_shield,if=talent.sacred_shield.enabled&target.dot.sacred_shield.remains<5
+ if TalentPoints(sacred_shield_talent) and target.BuffRemains(sacred_shield_buff) < 5 Spell(sacred_shield)
+ #holy_wrath
+ Spell(holy_wrath)
+ #execution_sentence,if=talent.execution_sentence.enabled
+ if TalentPoints(execution_sentence_talent) Spell(execution_sentence)
+ #lights_hammer,if=talent.lights_hammer.enabled
+ if TalentPoints(lights_hammer_talent) Spell(lights_hammer)
+ #hammer_of_wrath
+ Spell(hammer_of_wrath usable=1)
+ #consecration,if=target.debuff.flying.down&!ticking
+ if target.True(not flying_debuff) and not target.DebuffPresent(consecration_debuff) Spell(consecration)
+ #holy_prism,if=talent.holy_prism.enabled
+ if TalentPoints(holy_prism_talent) Spell(holy_prism)
+ #sacred_shield,if=talent.sacred_shield.enabled
+ if TalentPoints(sacred_shield_talent) Spell(sacred_shield)
+}
+
+AddFunction ProtectionPrecombatActions
+{
+ #flask,type=earth
+ #food,type=chun_tian_spring_rolls
+ #blessing_of_kings,if=(!aura.str_agi_int.up)&(aura.mastery.up)
+ if { not BuffPresent(str_agi_int any=1) } and { BuffPresent(mastery any=1) } Spell(blessing_of_kings)
+ #blessing_of_might,if=!aura.mastery.up
+ if not BuffPresent(mastery any=1) Spell(blessing_of_might)
+ #seal_of_insight
+ if not Stance(paladin_seal_of_insight) Spell(seal_of_insight)
+ #sacred_shield,if=talent.sacred_shield.enabled
+ if TalentPoints(sacred_shield_talent) Spell(sacred_shield)
+ #snapshot_stats
+}
+
+AddIcon mastery=protection help=main
+{
+ if InCombat(no) ProtectionPrecombatActions()
+ ProtectionDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent_mana
+# avengers_shield
+# avenging_wrath
+# avenging_wrath_buff
+# bastion_of_glory_buff
+# bastion_of_power_buff
+# berserking
+# blessing_of_kings
+# blessing_of_might
+# blood_fury
+# consecration
+# consecration_debuff
+# crusader_strike
+# divine_protection
+# divine_purpose_buff
+# eternal_flame
+# eternal_flame_buff
+# eternal_flame_talent
+# execution_sentence
+# execution_sentence_talent
+# guardian_of_ancient_kings_tank
+# hammer_of_wrath
+# holy_avenger
+# holy_avenger_talent
+# holy_prism
+# holy_prism_talent
+# holy_wrath
+# judgment
+# lights_hammer
+# lights_hammer_talent
+# mastery
+# sacred_shield
+# sacred_shield_buff
+# sacred_shield_talent
+# sanctified_wrath_talent
+# seal_of_insight
+# shield_of_the_righteous
+# str_agi_int
+]]
+ OvaleScripts:RegisterScript("PALADIN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_paladin_retribution_t16h.lua b/scripts/simulationcraft_paladin_retribution_t16h.lua
new file mode 100644
index 0000000..70e5186
--- /dev/null
+++ b/scripts/simulationcraft_paladin_retribution_t16h.lua
@@ -0,0 +1,154 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Paladin_Retribution_T16H"
+ local desc = "[5.4] SimulationCraft: Paladin_Retribution_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Paladin_Retribution_T16H".
+# class=paladin
+# spec=retribution
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#bb!110112
+# glyphs=double_jeopardy/mass_exorcism
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_paladin_spells)
+
+AddFunction RetributionDefaultActions
+{
+ #rebuke
+ Interrupt()
+ #mogu_power_potion,if=(buff.bloodlust.react|(buff.ancient_power.up&buff.avenging_wrath.up)|target.time_to_die<=40)
+ if { BuffPresent(burst_haste any=1) or { BuffPresent(ancient_power_buff) and BuffPresent(avenging_wrath_buff) } or target.TimeToDie() <= 40 } UsePotionStrength()
+ #auto_attack
+ #inquisition,if=(buff.inquisition.down|buff.inquisition.remains<=2)&(holy_power>=3|target.time_to_die<holy_power*20|buff.divine_purpose.react)
+ if { BuffExpires(inquisition_buff) or BuffRemains(inquisition_buff) <= 2 } and { HolyPower() >= 3 or target.TimeToDie() < HolyPower() * 20 or BuffPresent(divine_purpose_buff) } Spell(inquisition)
+ #avenging_wrath,if=buff.inquisition.up
+ if BuffPresent(inquisition_buff) Spell(avenging_wrath)
+ #guardian_of_ancient_kings,if=buff.inquisition.up
+ if BuffPresent(inquisition_buff) Spell(guardian_of_ancient_kings_melee)
+ #holy_avenger,if=talent.holy_avenger.enabled&(buff.inquisition.up&holy_power<=2)
+ if TalentPoints(holy_avenger_talent) and { BuffPresent(inquisition_buff) and HolyPower() <= 2 } Spell(holy_avenger)
+ #use_item,name=gauntlets_of_winged_triumph,if=buff.inquisition.up&(buff.ancient_power.down|buff.ancient_power.stack=12)
+ if BuffPresent(inquisition_buff) and { BuffExpires(ancient_power_buff) or BuffStacks(ancient_power_buff) == 12 } UseItemActions()
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent_mana)
+ #execution_sentence,if=talent.execution_sentence.enabled&(buff.inquisition.up&(buff.ancient_power.down|buff.ancient_power.stack=12))
+ if TalentPoints(execution_sentence_talent) and { BuffPresent(inquisition_buff) and { BuffExpires(ancient_power_buff) or BuffStacks(ancient_power_buff) == 12 } } Spell(execution_sentence)
+ #lights_hammer,if=talent.lights_hammer.enabled&(buff.inquisition.up&(buff.ancient_power.down|buff.ancient_power.stack=12))
+ if TalentPoints(lights_hammer_talent) and { BuffPresent(inquisition_buff) and { BuffExpires(ancient_power_buff) or BuffStacks(ancient_power_buff) == 12 } } Spell(lights_hammer)
+ #divine_storm,if=active_enemies>=2&(holy_power=5|buff.divine_purpose.react|(buff.holy_avenger.up&holy_power>=3))
+ if Enemies() >= 2 and { HolyPower() == 5 or BuffPresent(divine_purpose_buff) or { BuffPresent(holy_avenger_buff) and HolyPower() >= 3 } } Spell(divine_storm)
+ #divine_storm,if=buff.divine_crusader.react&holy_power=5
+ if BuffPresent(divine_crusader_buff) and HolyPower() == 5 Spell(divine_storm)
+ #templars_verdict,if=holy_power=5|buff.holy_avenger.up&holy_power>=3
+ if HolyPower() == 5 or BuffPresent(holy_avenger_buff) and HolyPower() >= 3 Spell(templars_verdict)
+ #templars_verdict,if=buff.divine_purpose.react&buff.divine_purpose.remains<4
+ if BuffPresent(divine_purpose_buff) and BuffRemains(divine_purpose_buff) < 4 Spell(templars_verdict)
+ #hammer_of_wrath
+ Spell(hammer_of_wrath usable=1)
+ #wait,sec=cooldown.hammer_of_wrath.remains,if=cooldown.hammer_of_wrath.remains>0&cooldown.hammer_of_wrath.remains<=0.2
+ if SpellCooldown(hammer_of_wrath) > 0 and SpellCooldown(hammer_of_wrath) <= 0.2 wait Spell(hammer_of_wrath)
+ #divine_storm,if=buff.divine_crusader.react&buff.avenging_wrath.up
+ if BuffPresent(divine_crusader_buff) and BuffPresent(avenging_wrath_buff) Spell(divine_storm)
+ #templars_verdict,if=buff.avenging_wrath.up
+ if BuffPresent(avenging_wrath_buff) Spell(templars_verdict)
+ #hammer_of_the_righteous,if=active_enemies>=4
+ if Enemies() >= 4 Spell(hammer_of_the_righteous)
+ #crusader_strike
+ Spell(crusader_strike)
+ #wait,sec=cooldown.crusader_strike.remains,if=cooldown.crusader_strike.remains>0&cooldown.crusader_strike.remains<=0.2
+ if SpellCooldown(crusader_strike) > 0 and SpellCooldown(crusader_strike) <= 0.2 wait Spell(crusader_strike)
+ #exorcism,if=active_enemies>=2&active_enemies<=4&set_bonus.tier15_2pc_melee&glyph.mass_exorcism.enabled
+ if Enemies() >= 2 and Enemies() <= 4 and ArmorSetBonus(T15_melee 2) and Glyph(glyph_of_mass_exorcism) Spell(exorcism)
+ #judgment
+ Spell(judgment)
+ #wait,sec=cooldown.judgment.remains,if=cooldown.judgment.remains>0&cooldown.judgment.remains<=0.2
+ if SpellCooldown(judgment) > 0 and SpellCooldown(judgment) <= 0.2 wait Spell(judgment)
+ #divine_storm,if=buff.divine_crusader.react
+ if BuffPresent(divine_crusader_buff) Spell(divine_storm)
+ #templars_verdict,if=buff.divine_purpose.react
+ if BuffPresent(divine_purpose_buff) Spell(templars_verdict)
+ #exorcism
+ Spell(exorcism)
+ #wait,sec=cooldown.exorcism.remains,if=cooldown.exorcism.remains>0&cooldown.exorcism.remains<=0.2
+ if SpellCooldown(exorcism) > 0 and SpellCooldown(exorcism) <= 0.2 wait Spell(exorcism)
+ #templars_verdict,if=buff.tier15_4pc_melee.up&active_enemies<4
+ if BuffPresent(tier15_4pc_melee_buff) and Enemies() < 4 Spell(templars_verdict)
+ #divine_storm,if=active_enemies>=2&buff.inquisition.remains>4
+ if Enemies() >= 2 and BuffRemains(inquisition_buff) > 4 Spell(divine_storm)
+ #templars_verdict,if=buff.inquisition.remains>4
+ if BuffRemains(inquisition_buff) > 4 Spell(templars_verdict)
+ #holy_prism,if=talent.holy_prism.enabled
+ if TalentPoints(holy_prism_talent) Spell(holy_prism)
+}
+
+AddFunction RetributionPrecombatActions
+{
+ #flask,type=winters_bite
+ #food,type=black_pepper_ribs_and_shrimp
+ #blessing_of_kings,if=!aura.str_agi_int.up
+ if not BuffPresent(str_agi_int any=1) Spell(blessing_of_kings)
+ #blessing_of_might,if=!aura.mastery.up
+ if not BuffPresent(mastery any=1) Spell(blessing_of_might)
+ #seal_of_truth,if=active_enemies<4
+ if Enemies() < 4 if not Stance(paladin_seal_of_truth) Spell(seal_of_truth)
+ #seal_of_righteousness,if=active_enemies>=4
+ if Enemies() >= 4 if not Stance(paladin_seal_of_righteousness) Spell(seal_of_righteousness)
+ #snapshot_stats
+ #mogu_power_potion
+ UsePotionStrength()
+}
+
+AddIcon mastery=retribution help=main
+{
+ if InCombat(no) RetributionPrecombatActions()
+ RetributionDefaultActions()
+}
+
+### Required symbols
+# ancient_power_buff
+# arcane_torrent_mana
+# avenging_wrath
+# avenging_wrath_buff
+# berserking
+# blessing_of_kings
+# blessing_of_might
+# blood_fury
+# crusader_strike
+# divine_crusader_buff
+# divine_purpose_buff
+# divine_storm
+# execution_sentence
+# execution_sentence_talent
+# exorcism
+# glyph_of_mass_exorcism
+# guardian_of_ancient_kings_melee
+# hammer_of_the_righteous
+# hammer_of_wrath
+# holy_avenger
+# holy_avenger_buff
+# holy_avenger_talent
+# holy_prism
+# holy_prism_talent
+# inquisition
+# inquisition_buff
+# judgment
+# lights_hammer
+# lights_hammer_talent
+# mastery
+# mogu_power_potion
+# rebuke
+# seal_of_righteousness
+# seal_of_truth
+# str_agi_int
+# templars_verdict
+# tier15_4pc_melee_buff
+]]
+ OvaleScripts:RegisterScript("PALADIN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_priest_shadow_t16h.lua b/scripts/simulationcraft_priest_shadow_t16h.lua
new file mode 100644
index 0000000..a72c10c
--- /dev/null
+++ b/scripts/simulationcraft_priest_shadow_t16h.lua
@@ -0,0 +1,156 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Priest_Shadow_T16H"
+ local desc = "[5.4] SimulationCraft: Priest_Shadow_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Priest_Shadow_T16H".
+# class=priest
+# spec=shadow
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Xb!002202
+# glyphs=inner_sanctum/mind_flay/dark_archangel/shadowy_friends/shadow_ravens
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_priest_spells)
+
+AddFunction ShadowDefaultActions
+{
+ #shadowform
+ if not Stance(priest_shadowform) Spell(shadowform)
+ #use_item,slot=hands
+ UseItemActions()
+ #jade_serpent_potion,if=buff.bloodlust.react|target.time_to_die<=40
+ if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 40 UsePotionIntellect()
+ #mindbender,if=talent.mindbender.enabled
+ if TalentPoints(mindbender_talent) Spell(mindbender)
+ #shadowfiend,if=!talent.mindbender.enabled
+ if not TalentPoints(mindbender_talent) Spell(shadowfiend)
+ #power_infusion,if=talent.power_infusion.enabled
+ if TalentPoints(power_infusion_talent) Spell(power_infusion)
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent_mana)
+ #shadow_word_death,if=buff.shadow_word_death_reset_cooldown.stack=1&active_enemies<=5
+ if BuffStacks(shadow_word_death_reset_cooldown_buff) == 1 and Enemies() <= 5 Spell(shadow_word_death usable=1)
+ #devouring_plague,if=shadow_orb=3&(cooldown.mind_blast.remains<1.5|target.health.pct<20&cooldown.shadow_word_death.remains<1.5)
+ if ShadowOrbs() == 3 and { SpellCooldown(mind_blast) < 1.5 or target.HealthPercent() < 20 and SpellCooldown(shadow_word_death) < 1.5 } Spell(devouring_plague)
+ #mind_blast,if=active_enemies<=5&cooldown_react
+ if Enemies() <= 5 and Spell(mind_blast) Spell(mind_blast)
+ #shadow_word_death,if=buff.shadow_word_death_reset_cooldown.stack=0&active_enemies<=5
+ if BuffStacks(shadow_word_death_reset_cooldown_buff) == 0 and Enemies() <= 5 Spell(shadow_word_death usable=1)
+ #mind_flay_insanity,if=target.dot.devouring_plague_tick.ticks_remain=1,chain=1
+ if TalentPoints(solace_and_insanity_talent) and target.DebuffPresent(devouring_plague_debuff) and target.TicksRemain(devouring_plague_debuff) == 1 Spell(mind_flay)
+ #mind_flay_insanity,interrupt=1,chain=1,if=active_enemies<=5
+ if TalentPoints(solace_and_insanity_talent) and target.DebuffPresent(devouring_plague_debuff) and Enemies() <= 5 Spell(mind_flay)
+ #shadow_word_pain,cycle_targets=1,max_cycle_targets=5,if=miss_react&!ticking
+ if True(miss_react) and not target.DebuffPresent(shadow_word_pain_debuff) and DebuffCountOnAny(shadow_word_pain_debuff) <= 5 Spell(shadow_word_pain)
+ #vampiric_touch,cycle_targets=1,max_cycle_targets=5,if=remains<cast_time&miss_react
+ if target.DebuffRemains(vampiric_touch_debuff) < CastTime(vampiric_touch) and True(miss_react) and DebuffCountOnAny(vampiric_touch_debuff) <= 5 Spell(vampiric_touch)
+ #shadow_word_pain,cycle_targets=1,max_cycle_targets=5,if=miss_react&ticks_remain<=1
+ if True(miss_react) and target.TicksRemain(shadow_word_pain_debuff) <= 1 and DebuffCountOnAny(shadow_word_pain_debuff) <= 5 Spell(shadow_word_pain)
+ #vampiric_touch,cycle_targets=1,max_cycle_targets=5,if=remains<cast_time+tick_time&miss_react
+ if target.DebuffRemains(vampiric_touch_debuff) < CastTime(vampiric_touch) + target.TickTime(vampiric_touch_debuff) and True(miss_react) and DebuffCountOnAny(vampiric_touch_debuff) <= 5 Spell(vampiric_touch)
+ #vampiric_embrace,if=shadow_orb=3&health.pct<=40
+ if ShadowOrbs() == 3 and HealthPercent() <= 40 Spell(vampiric_embrace)
+ #devouring_plague,if=shadow_orb=3&ticks_remain<=1
+ if ShadowOrbs() == 3 and target.TicksRemain(devouring_plague_debuff) <= 1 Spell(devouring_plague)
+ #mind_spike,if=active_enemies<=5&buff.surge_of_darkness.react=2
+ if Enemies() <= 5 and BuffStacks(surge_of_darkness_buff) == 2 Spell(mind_spike)
+ #halo,if=talent.halo.enabled&target.distance<=30&target.distance>=17
+ if TalentPoints(halo_talent) and target.Distance() <= 30 and target.Distance() >= 17 Spell(halo)
+ #cascade_damage,if=talent.cascade.enabled&(active_enemies>1|(target.distance>=25&stat.mastery_rating<15000)|target.distance>=28)&target.distance<=40&target.distance>=11
+ if TalentPoints(cascade_talent) and { Enemies() > 1 or { target.Distance() >= 25 and MasteryRating() < 15000 } or target.Distance() >= 28 } and target.Distance() <= 40 and target.Distance() >= 11 Spell(cascade_damage)
+ #divine_star,if=talent.divine_star.enabled&(active_enemies>1|stat.mastery_rating<3500)&target.distance<=24
+ if TalentPoints(divine_star_talent) and { Enemies() > 1 or MasteryRating() < 3500 } and target.Distance() <= 24 Spell(divine_star)
+ #wait,sec=cooldown.shadow_word_death.remains,if=target.health.pct<20&cooldown.shadow_word_death.remains<0.5&active_enemies<=1
+ if target.HealthPercent() < 20 and SpellCooldown(shadow_word_death) < 0.5 and Enemies() <= 1 wait Spell(shadow_word_death)
+ #wait,sec=cooldown.mind_blast.remains,if=cooldown.mind_blast.remains<0.5&active_enemies<=1
+ if SpellCooldown(mind_blast) < 0.5 and Enemies() <= 1 wait Spell(mind_blast)
+ #mind_spike,if=buff.surge_of_darkness.react&active_enemies<=5
+ if BuffStacks(surge_of_darkness_buff) and Enemies() <= 5 Spell(mind_spike)
+ #mind_sear,chain=1,interrupt=1,if=active_enemies>=3
+ if Enemies() >= 3 Spell(mind_sear)
+ #mind_flay,chain=1,interrupt=1
+ Spell(mind_flay)
+ #shadow_word_death,moving=1
+ if Speed() > 0 Spell(shadow_word_death usable=1)
+ #mind_blast,moving=1,if=buff.divine_insight_shadow.react&cooldown_react
+ if Speed() > 0 and BuffPresent(divine_insight_shadow_buff) and Spell(mind_blast) Spell(mind_blast)
+ #divine_star,moving=1,if=talent.divine_star.enabled&target.distance<=28
+ if Speed() > 0 and TalentPoints(divine_star_talent) and target.Distance() <= 28 Spell(divine_star)
+ #cascade_damage,moving=1,if=talent.cascade.enabled&target.distance<=40
+ if Speed() > 0 and TalentPoints(cascade_talent) and target.Distance() <= 40 Spell(cascade_damage)
+ #shadow_word_pain,moving=1
+ if Speed() > 0 Spell(shadow_word_pain)
+ #dispersion
+ Spell(dispersion)
+}
+
+AddFunction ShadowPrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #power_word_fortitude,if=!aura.stamina.up
+ if not BuffPresent(stamina any=1) Spell(power_word_fortitude)
+ #inner_fire
+ if BuffExpires(inner_fire_buff) Spell(inner_fire)
+ #shadowform
+ if not Stance(priest_shadowform) Spell(shadowform)
+ #snapshot_stats
+ #jade_serpent_potion
+ UsePotionIntellect()
+}
+
+AddIcon mastery=shadow help=main
+{
+ if InCombat(no) ShadowPrecombatActions()
+ ShadowDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent_mana
+# berserking
+# blood_fury
+# cascade_damage
+# cascade_talent
+# devouring_plague
+# devouring_plague_debuff
+# dispersion
+# divine_insight_shadow_buff
+# divine_star
+# divine_star_talent
+# halo
+# halo_talent
+# inner_fire
+# inner_fire_buff
+# jade_serpent_potion
+# mind_blast
+# mind_flay
+# mind_flay_insanity
+# mind_sear
+# mind_spike
+# mindbender
+# mindbender_talent
+# power_infusion
+# power_infusion_talent
+# power_word_fortitude
+# shadow_word_death
+# shadow_word_death_reset_cooldown_buff
+# shadow_word_pain
+# shadow_word_pain_debuff
+# shadowfiend
+# shadowform
+# solace_and_insanity_talent
+# stamina
+# surge_of_darkness_buff
+# vampiric_embrace
+# vampiric_touch
+# vampiric_touch_debuff
+]]
+ OvaleScripts:RegisterScript("PRIEST", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_rogue_assassination_t16h.lua b/scripts/simulationcraft_rogue_assassination_t16h.lua
new file mode 100644
index 0000000..3389f82
--- /dev/null
+++ b/scripts/simulationcraft_rogue_assassination_t16h.lua
@@ -0,0 +1,117 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Rogue_Assassination_T16H"
+ local desc = "[5.4] SimulationCraft: Rogue_Assassination_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Rogue_Assassination_T16H".
+# class=rogue
+# spec=assassination
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#ca!200002
+# glyphs=vendetta
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_rogue_spells)
+
+AddFunction AssassinationDefaultActions
+{
+ #virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<40
+ if BuffPresent(burst_haste any=1) or target.TimeToDie() < 40 UsePotionAgility()
+ #auto_attack
+ #kick
+ if target.IsInterruptible() Spell(kick)
+ #preparation,if=!buff.vanish.up&cooldown.vanish.remains>60
+ if not BuffPresent(vanish_buff) and SpellCooldown(vanish) > 60 Spell(preparation)
+ #use_item,slot=hands
+ UseItemActions()
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent,if=energy<60
+ if Energy() < 60 Spell(arcane_torrent_energy)
+ #vanish,if=time>10&!buff.stealth.up&!buff.shadow_blades.up
+ if TimeInCombat() > 10 and not Stealthed() and not BuffPresent(shadow_blades_buff) Spell(vanish)
+ #mutilate,if=buff.stealth.up
+ if Stealthed() Spell(mutilate)
+ #shadow_blades,if=buff.bloodlust.react|time>60
+ if BuffPresent(burst_haste any=1) or TimeInCombat() > 60 Spell(shadow_blades)
+ #slice_and_dice,if=buff.slice_and_dice.remains<2
+ if BuffRemains(slice_and_dice_buff) < 2 Spell(slice_and_dice)
+ #dispatch,if=dot.rupture.ticks_remain<2&energy>90
+ if target.TicksRemain(rupture_debuff) < 2 and Energy() > 90 Spell(dispatch usable=1)
+ #mutilate,if=dot.rupture.ticks_remain<2&energy>90
+ if target.TicksRemain(rupture_debuff) < 2 and Energy() > 90 Spell(mutilate)
+ #marked_for_death,if=talent.marked_for_death.enabled&combo_points=0
+ if TalentPoints(marked_for_death_talent) and ComboPoints() == 0 Spell(marked_for_death)
+ #rupture,if=ticks_remain<2|(combo_points=5&ticks_remain<3)
+ if target.TicksRemain(rupture_debuff) < 2 or { ComboPoints() == 5 and target.TicksRemain(rupture_debuff) < 3 } Spell(rupture)
+ #fan_of_knives,if=combo_points<5&active_enemies>=4
+ if ComboPoints() < 5 and Enemies() >= 4 Spell(fan_of_knives)
+ #vendetta
+ Spell(vendetta)
+ #envenom,if=combo_points>4
+ if ComboPoints() > 4 Spell(envenom)
+ #envenom,if=combo_points>=2&buff.slice_and_dice.remains<3
+ if ComboPoints() >= 2 and BuffRemains(slice_and_dice_buff) < 3 Spell(envenom)
+ #dispatch,if=combo_points<5
+ if ComboPoints() < 5 Spell(dispatch usable=1)
+ #mutilate
+ Spell(mutilate)
+ #tricks_of_the_trade
+ TricksOfTheTrade()
+}
+
+AddFunction AssassinationPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #apply_poison,lethal=deadly
+ ApplyPoisons()
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+ #stealth
+ if not IsStealthed() Spell(stealth)
+ #marked_for_death,if=talent.marked_for_death.enabled
+ if TalentPoints(marked_for_death_talent) Spell(marked_for_death)
+ #slice_and_dice,if=talent.marked_for_death.enabled
+ if TalentPoints(marked_for_death_talent) Spell(slice_and_dice)
+}
+
+AddIcon mastery=assassination help=main
+{
+ if InCombat(no) AssassinationPrecombatActions()
+ AssassinationDefaultActions()
+}
+
+### Required symbols
+# apply_poison
+# arcane_torrent_energy
+# berserking
+# blood_fury
+# dispatch
+# envenom
+# fan_of_knives
+# kick
+# marked_for_death
+# marked_for_death_talent
+# mutilate
+# preparation
+# rupture
+# rupture_debuff
+# shadow_blades
+# shadow_blades_buff
+# slice_and_dice
+# slice_and_dice_buff
+# stealth
+# tricks_of_the_trade
+# vanish
+# vanish_buff
+# vendetta
+# virmens_bite_potion
+]]
+ OvaleScripts:RegisterScript("ROGUE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_rogue_combat_t16h.lua b/scripts/simulationcraft_rogue_combat_t16h.lua
new file mode 100644
index 0000000..0eb01a7
--- /dev/null
+++ b/scripts/simulationcraft_rogue_combat_t16h.lua
@@ -0,0 +1,141 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Rogue_Combat_T16H"
+ local desc = "[5.4] SimulationCraft: Rogue_Combat_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Rogue_Combat_T16H".
+# class=rogue
+# spec=combat
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#cZ!200002
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_rogue_spells)
+
+AddFunction CombatFinisherActions
+{
+ #rupture,if=ticks_remain<2&target.time_to_die>=26&(active_enemies<2|!buff.blade_flurry.up)
+ if target.TicksRemain(rupture_debuff) < 2 and target.TimeToDie() >= 26 and { Enemies() < 2 or not BuffPresent(blade_flurry_buff) } Spell(rupture)
+ #crimson_tempest,if=active_enemies>=7&dot.crimson_tempest_dot.ticks_remain<=2
+ if Enemies() >= 7 and target.TicksRemain(crimson_tempest_dot_debuff) <= 2 Spell(crimson_tempest)
+ #eviscerate
+ Spell(eviscerate)
+}
+
+AddFunction CombatGeneratorActions
+{
+ #fan_of_knives,line_cd=5,if=active_enemies>=4
+ if Enemies() >= 4 Spell(fan_of_knives)
+ #revealing_strike,if=ticks_remain<2
+ if target.TicksRemain(revealing_strike_debuff) < 2 Spell(revealing_strike)
+ #sinister_strike
+ Spell(sinister_strike)
+}
+
+AddFunction CombatDefaultActions
+{
+ #virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<40
+ if BuffPresent(burst_haste any=1) or target.TimeToDie() < 40 UsePotionAgility()
+ #auto_attack
+ #kick
+ if target.IsInterruptible() Spell(kick)
+ #preparation,if=!buff.vanish.up&cooldown.vanish.remains>60
+ if not BuffPresent(vanish_buff) and SpellCooldown(vanish) > 60 Spell(preparation)
+ #use_item,slot=hands,if=time=0|buff.shadow_blades.up
+ if TimeInCombat() == 0 or BuffPresent(shadow_blades_buff) UseItemActions()
+ #blood_fury,if=time=0|buff.shadow_blades.up
+ if TimeInCombat() == 0 or BuffPresent(shadow_blades_buff) Spell(blood_fury)
+ #berserking,if=time=0|buff.shadow_blades.up
+ if TimeInCombat() == 0 or BuffPresent(shadow_blades_buff) Spell(berserking)
+ #arcane_torrent,if=energy<60
+ if Energy() < 60 Spell(arcane_torrent_energy)
+ #blade_flurry,if=(active_enemies>=2&!buff.blade_flurry.up)|(active_enemies<2&buff.blade_flurry.up)
+ if { Enemies() >= 2 and not BuffPresent(blade_flurry_buff) } or { Enemies() < 2 and BuffPresent(blade_flurry_buff) } Spell(blade_flurry)
+ #ambush
+ Spell(ambush usable=1)
+ #vanish,if=time>10&(combo_points<3|(talent.anticipation.enabled&anticipation_charges<3)|(buff.shadow_blades.down&(combo_points<4|(talent.anticipation.enabled&anticipation_charges<4))))&((talent.shadow_focus.enabled&buff.adrenaline_rush.down&energy<20)|(talent.subterfuge.enabled&energy>=90)|(!talent.shadow_focus.enabled&!talent.subterfuge.enabled&energy>=60))
+ if TimeInCombat() > 10 and { ComboPoints() < 3 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 3 } or { BuffExpires(shadow_blades_buff) and { ComboPoints() < 4 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 4 } } } } and { { TalentPoints(shadow_focus_talent) and BuffExpires(adrenaline_rush_buff) and Energy() < 20 } or { TalentPoints(subterfuge_talent) and Energy() >= 90 } or { not TalentPoints(shadow_focus_talent) and not TalentPoints(subterfuge_talent) and Energy() >= 60 } } Spell(vanish)
+ #shadow_blades,if=time>5
+ if TimeInCombat() > 5 Spell(shadow_blades)
+ #killing_spree,if=energy<45
+ if Energy() < 45 Spell(killing_spree)
+ #adrenaline_rush,if=energy<35|buff.shadow_blades.up
+ if Energy() < 35 or BuffPresent(shadow_blades_buff) Spell(adrenaline_rush)
+ #slice_and_dice,if=buff.slice_and_dice.remains<2|(buff.slice_and_dice.remains<15&buff.bandits_guile.stack=11&combo_points>=4)
+ if BuffRemains(slice_and_dice_buff) < 2 or { BuffRemains(slice_and_dice_buff) < 15 and BuffStacks(bandits_guile_buff) == 11 and ComboPoints() >= 4 } Spell(slice_and_dice)
+ #marked_for_death,if=talent.marked_for_death.enabled&(combo_points<=1&dot.revealing_strike.ticking)
+ if TalentPoints(marked_for_death_talent) and { ComboPoints() <= 1 and target.DebuffPresent(revealing_strike_debuff) } Spell(marked_for_death)
+ #run_action_list,name=generator,if=combo_points<5|(talent.anticipation.enabled&anticipation_charges<=4&!dot.revealing_strike.ticking)
+ if ComboPoints() < 5 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) <= 4 and not target.DebuffPresent(revealing_strike_debuff) } CombatGeneratorActions()
+ #run_action_list,name=finisher,if=!talent.anticipation.enabled|buff.deep_insight.up|cooldown.shadow_blades.remains<=11|anticipation_charges>=4|(buff.shadow_blades.up&anticipation_charges>=3)
+ if not TalentPoints(anticipation_talent) or BuffPresent(deep_insight_buff) or SpellCooldown(shadow_blades) <= 11 or BuffStacks(anticipation_buff) >= 4 or { BuffPresent(shadow_blades_buff) and BuffStacks(anticipation_buff) >= 3 } CombatFinisherActions()
+ #run_action_list,name=generator,if=energy>60|buff.deep_insight.down|buff.deep_insight.remains>5-combo_points
+ if Energy() > 60 or BuffExpires(deep_insight_buff) or BuffRemains(deep_insight_buff) > 5 - ComboPoints() CombatGeneratorActions()
+}
+
+AddFunction CombatPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #apply_poison,lethal=deadly
+ ApplyPoisons()
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+ #stealth
+ if not IsStealthed() Spell(stealth)
+ #marked_for_death,if=talent.marked_for_death.enabled
+ if TalentPoints(marked_for_death_talent) Spell(marked_for_death)
+ #slice_and_dice,if=talent.marked_for_death.enabled
+ if TalentPoints(marked_for_death_talent) Spell(slice_and_dice)
+}
+
+AddIcon mastery=combat help=main
+{
+ if InCombat(no) CombatPrecombatActions()
+ CombatDefaultActions()
+}
+
+### Required symbols
+# adrenaline_rush
+# adrenaline_rush_buff
+# ambush
+# anticipation_buff
+# anticipation_talent
+# apply_poison
+# arcane_torrent_energy
+# bandits_guile_buff
+# berserking
+# blade_flurry
+# blade_flurry_buff
+# blood_fury
+# crimson_tempest
+# crimson_tempest_dot_debuff
+# deep_insight_buff
+# eviscerate
+# fan_of_knives
+# kick
+# killing_spree
+# marked_for_death
+# marked_for_death_talent
+# preparation
+# revealing_strike
+# revealing_strike_debuff
+# rupture
+# rupture_debuff
+# shadow_blades
+# shadow_blades_buff
+# shadow_focus_talent
+# sinister_strike
+# slice_and_dice
+# slice_and_dice_buff
+# stealth
+# subterfuge_talent
+# vanish
+# vanish_buff
+# virmens_bite_potion
+]]
+ OvaleScripts:RegisterScript("ROGUE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_rogue_subtlety_t16h.lua b/scripts/simulationcraft_rogue_subtlety_t16h.lua
new file mode 100644
index 0000000..86fe4e1
--- /dev/null
+++ b/scripts/simulationcraft_rogue_subtlety_t16h.lua
@@ -0,0 +1,154 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Rogue_Subtlety_T16H"
+ local desc = "[5.4] SimulationCraft: Rogue_Subtlety_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Rogue_Subtlety_T16H".
+# class=rogue
+# spec=subtlety
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#cb!200002
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_rogue_spells)
+
+AddFunction SubtletyPoolActions
+{
+ #preparation,if=!buff.vanish.up&cooldown.vanish.remains>60
+ if not BuffPresent(vanish_buff) and SpellCooldown(vanish) > 60 Spell(preparation)
+}
+
+AddFunction SubtletyPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #apply_poison,lethal=deadly
+ ApplyPoisons()
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+ #stealth
+ if not IsStealthed() Spell(stealth)
+ #premeditation
+ Spell(premeditation usable=1)
+ #slice_and_dice
+ Spell(slice_and_dice)
+}
+
+AddFunction SubtletyGeneratorActions
+{
+ #run_action_list,name=pool,if=buff.master_of_subtlety.down&buff.shadow_dance.down&debuff.find_weakness.down&(energy+cooldown.shadow_dance.remains*energy.regen<80|energy+cooldown.vanish.remains*energy.regen<60)
+ if BuffExpires(master_of_subtlety_buff) and BuffExpires(shadow_dance_buff) and target.DebuffExpires(find_weakness_debuff) and { Energy() + SpellCooldown(shadow_dance) * EnergyRegen() < 80 or Energy() + SpellCooldown(vanish) * EnergyRegen() < 60 } SubtletyPoolActions()
+ #fan_of_knives,if=active_enemies>=4
+ if Enemies() >= 4 Spell(fan_of_knives)
+ #hemorrhage,if=remains<3|position_front
+ if target.DebuffRemains(hemorrhage_debuff) < 3 or False(position_front) Spell(hemorrhage)
+ #shuriken_toss,if=talent.shuriken_toss.enabled&(energy<65&energy.regen<16)
+ if TalentPoints(shuriken_toss_talent) and { Energy() < 65 and EnergyRegen() < 16 } Spell(shuriken_toss)
+ #backstab
+ Spell(backstab usable=1)
+ #run_action_list,name=pool
+ SubtletyPoolActions()
+}
+
+AddFunction SubtletyFinisherActions
+{
+ #slice_and_dice,if=buff.slice_and_dice.remains<4
+ if BuffRemains(slice_and_dice_buff) < 4 Spell(slice_and_dice)
+ #rupture,if=ticks_remain<2&active_enemies<3
+ if target.TicksRemain(rupture_debuff) < 2 and Enemies() < 3 Spell(rupture)
+ #crimson_tempest,if=(active_enemies>1&dot.crimson_tempest_dot.ticks_remain<=2&combo_points=5)|active_enemies>=5
+ if { Enemies() > 1 and target.TicksRemain(crimson_tempest_dot_debuff) <= 2 and ComboPoints() == 5 } or Enemies() >= 5 Spell(crimson_tempest)
+ #eviscerate,if=active_enemies<4|(active_enemies>3&dot.crimson_tempest_dot.ticks_remain>=2)
+ if Enemies() < 4 or { Enemies() > 3 and target.TicksRemain(crimson_tempest_dot_debuff) >= 2 } Spell(eviscerate)
+ #run_action_list,name=pool
+ SubtletyPoolActions()
+}
+
+AddFunction SubtletyDefaultActions
+{
+ #virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<40
+ if BuffPresent(burst_haste any=1) or target.TimeToDie() < 40 UsePotionAgility()
+ #auto_attack
+ #kick
+ if target.IsInterruptible() Spell(kick)
+ #use_item,slot=hands,if=buff.shadow_dance.up
+ if BuffPresent(shadow_dance_buff) UseItemActions()
+ #blood_fury,if=buff.shadow_dance.up
+ if BuffPresent(shadow_dance_buff) Spell(blood_fury)
+ #berserking,if=buff.shadow_dance.up
+ if BuffPresent(shadow_dance_buff) Spell(berserking)
+ #arcane_torrent,if=energy<60
+ if Energy() < 60 Spell(arcane_torrent_energy)
+ #shadow_blades
+ Spell(shadow_blades)
+ #premeditation,if=combo_points<=4
+ if ComboPoints() <= 4 Spell(premeditation usable=1)
+ #pool_resource,for_next=1
+ #ambush,if=combo_points<5|(talent.anticipation.enabled&anticipation_charges<3)|(buff.sleight_of_hand.up&buff.sleight_of_hand.remains<=gcd)
+ if ComboPoints() < 5 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 3 } or { BuffPresent(sleight_of_hand_buff) and BuffRemains(sleight_of_hand_buff) <= GCD() } wait Spell(ambush usable=1)
+ #pool_resource,for_next=1,extra_amount=75
+ #shadow_dance,if=energy>=75&buff.stealth.down&buff.vanish.down&debuff.find_weakness.down
+ if Energy() >= 75 and Stealthed(no) and BuffExpires(vanish_buff) and target.DebuffExpires(find_weakness_debuff) wait Spell(shadow_dance)
+ #pool_resource,for_next=1,extra_amount=45
+ #vanish,if=energy>=45&energy<=75&combo_points<=3&buff.shadow_dance.down&buff.master_of_subtlety.down&debuff.find_weakness.down
+ if Energy() >= 45 and Energy() <= 75 and ComboPoints() <= 3 and BuffExpires(shadow_dance_buff) and BuffExpires(master_of_subtlety_buff) and target.DebuffExpires(find_weakness_debuff) wait Spell(vanish)
+ #marked_for_death,if=talent.marked_for_death.enabled&combo_points=0
+ if TalentPoints(marked_for_death_talent) and ComboPoints() == 0 Spell(marked_for_death)
+ #run_action_list,name=generator,if=talent.anticipation.enabled&anticipation_charges<4&buff.slice_and_dice.up&dot.rupture.remains>2&(buff.slice_and_dice.remains<6|dot.rupture.remains<4)
+ if TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 4 and BuffPresent(slice_and_dice_buff) and target.DebuffRemains(rupture_debuff) > 2 and { BuffRemains(slice_and_dice_buff) < 6 or target.DebuffRemains(rupture_debuff) < 4 } SubtletyGeneratorActions()
+ #run_action_list,name=finisher,if=combo_points=5
+ if ComboPoints() == 5 SubtletyFinisherActions()
+ #run_action_list,name=generator,if=combo_points<4|energy>80|talent.anticipation.enabled
+ if ComboPoints() < 4 or Energy() > 80 or TalentPoints(anticipation_talent) SubtletyGeneratorActions()
+ #run_action_list,name=pool
+ SubtletyPoolActions()
+}
+
+AddIcon mastery=subtlety help=main
+{
+ if InCombat(no) SubtletyPrecombatActions()
+ SubtletyDefaultActions()
+}
+
+### Required symbols
+# ambush
+# anticipation_buff
+# anticipation_talent
+# apply_poison
+# arcane_torrent_energy
+# backstab
+# berserking
+# blood_fury
+# crimson_tempest
+# crimson_tempest_dot_debuff
+# eviscerate
+# fan_of_knives
+# find_weakness_debuff
+# hemorrhage
+# hemorrhage_debuff
+# kick
+# marked_for_death
+# marked_for_death_talent
+# master_of_subtlety_buff
+# premeditation
+# preparation
+# rupture
+# rupture_debuff
+# shadow_blades
+# shadow_dance
+# shadow_dance_buff
+# shuriken_toss
+# shuriken_toss_talent
+# sleight_of_hand_buff
+# slice_and_dice
+# slice_and_dice_buff
+# stealth
+# vanish
+# vanish_buff
+# virmens_bite_potion
+]]
+ OvaleScripts:RegisterScript("ROGUE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_shaman_elemental_t16h.lua b/scripts/simulationcraft_shaman_elemental_t16h.lua
new file mode 100644
index 0000000..c8ab790
--- /dev/null
+++ b/scripts/simulationcraft_shaman_elemental_t16h.lua
@@ -0,0 +1,160 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Shaman_Elemental_T16H"
+ local desc = "[5.4] SimulationCraft: Shaman_Elemental_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Shaman_Elemental_T16H".
+# class=shaman
+# spec=elemental
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Wa!...2.0
+# glyphs=chain_lightning
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_shaman_spells)
+
+AddFunction ElementalAoeActions
+{
+ #lava_beam
+ Spell(lava_beam)
+ #magma_totem,if=active_enemies>2&!totem.fire.active
+ if Enemies() > 2 and not TotemPresent(fire) Spell(magma_totem)
+ #searing_totem,if=active_enemies<=2&!totem.fire.active
+ if Enemies() <= 2 and not TotemPresent(fire) Spell(searing_totem)
+ #lava_burst,if=active_enemies<3&dot.flame_shock.remains>cast_time&cooldown_react
+ if Enemies() < 3 and target.DebuffRemains(flame_shock_debuff) > CastTime(lava_burst) and Spell(lava_burst) Spell(lava_burst)
+ #flame_shock,cycle_targets=1,if=!ticking&active_enemies<3
+ if not target.DebuffPresent(flame_shock_debuff) and Enemies() < 3 Spell(flame_shock)
+ #earthquake,if=active_enemies>4
+ if Enemies() > 4 Spell(earthquake)
+ #thunderstorm,if=mana.pct_nonproc<80
+ if ManaPercent() < 80 Spell(thunderstorm)
+ #chain_lightning,if=mana.pct_nonproc>10
+ if ManaPercent() > 10 Spell(chain_lightning)
+ #lightning_bolt
+ Spell(lightning_bolt)
+}
+
+AddFunction ElementalSingleActions
+{
+ #use_item,name=grips_of_tidal_force,if=((cooldown.ascendance.remains>10|level<87)&cooldown.fire_elemental_totem.remains>10)|buff.ascendance.up|buff.bloodlust.up|totem.fire_elemental_totem.active
+ if { { SpellCooldown(ascendance_caster) > 10 or Level() < 87 } and SpellCooldown(fire_elemental_totem) > 10 } or BuffPresent(ascendance_caster_buff) or BuffPresent(burst_haste any=1) or TotemPresent(fire totem=fire_elemental_totem) UseItemActions()
+ #unleash_elements,if=talent.unleashed_fury.enabled&!buff.ascendance.up
+ if TalentPoints(unleashed_fury_talent) and not BuffPresent(ascendance_caster_buff) Spell(unleash_elements)
+ #spiritwalkers_grace,moving=1,if=buff.ascendance.up
+ if Speed() > 0 and BuffPresent(ascendance_caster_buff) Spell(spiritwalkers_grace)
+ #lava_burst,if=dot.flame_shock.remains>cast_time&(buff.ascendance.up|cooldown_react)
+ if target.DebuffRemains(flame_shock_debuff) > CastTime(lava_burst) and { BuffPresent(ascendance_caster_buff) or Spell(lava_burst) } Spell(lava_burst)
+ #flame_shock,if=ticks_remain<2
+ if target.TicksRemain(flame_shock_debuff) < 2 Spell(flame_shock)
+ #elemental_blast,if=talent.elemental_blast.enabled
+ if TalentPoints(elemental_blast_talent) Spell(elemental_blast)
+ #earth_shock,if=buff.lightning_shield.react=buff.lightning_shield.max_stack
+ if BuffStacks(lightning_shield_buff) == 7 Spell(earth_shock)
+ #earth_shock,if=buff.lightning_shield.react>3&dot.flame_shock.remains>cooldown&dot.flame_shock.remains<cooldown+action.flame_shock.tick_time
+ if BuffStacks(lightning_shield_buff) > 3 and target.DebuffRemains(flame_shock_debuff) > SpellCooldown(earth_shock) and target.DebuffRemains(flame_shock_debuff) < SpellCooldown(earth_shock) + target.TickTime(flame_shock_debuff) Spell(earth_shock)
+ #flame_shock,if=time>60&remains<=buff.ascendance.duration&cooldown.ascendance.remains+buff.ascendance.duration<duration
+ if TimeInCombat() > 60 and target.DebuffRemains(flame_shock_debuff) <= SpellData(ascendance_caster_buff duration) and SpellCooldown(ascendance_caster) + SpellData(ascendance_caster_buff duration) < SpellData(flame_shock_debuff duration) Spell(flame_shock)
+ #earth_elemental_totem,if=!active&cooldown.fire_elemental_totem.remains>=60
+ if not TotemPresent(earth totem=earth_elemental_totem) and SpellCooldown(fire_elemental_totem) >= 60 Spell(earth_elemental_totem)
+ #searing_totem,if=cooldown.fire_elemental_totem.remains>20&!totem.fire.active
+ if SpellCooldown(fire_elemental_totem) > 20 and not TotemPresent(fire) Spell(searing_totem)
+ #spiritwalkers_grace,moving=1,if=((talent.elemental_blast.enabled&cooldown.elemental_blast.remains=0)|(cooldown.lava_burst.remains=0&!buff.lava_surge.react))|(buff.raid_movement.duration>=action.unleash_elements.gcd+action.earth_shock.gcd)
+ if Speed() > 0 and { { { TalentPoints(elemental_blast_talent) and not SpellCooldown(elemental_blast) > 0 } or { not SpellCooldown(lava_burst) > 0 and not BuffPresent(lava_surge_buff) } } or { 0 >= GCD() + GCD() } } Spell(spiritwalkers_grace)
+ #lightning_bolt
+ Spell(lightning_bolt)
+}
+
+AddFunction ElementalDefaultActions
+{
+ #wind_shear
+ Interrupt()
+ #bloodlust,if=target.health.pct<25|time>5
+ if target.HealthPercent() < 25 or TimeInCombat() > 5 Bloodlust()
+ #stormlash_totem,if=!active&!buff.stormlash.up&(buff.bloodlust.up|time>=60)
+ if not TotemPresent(air totem=stormlash_totem) and not BuffPresent(stormlash_buff) and { BuffPresent(burst_haste any=1) or TimeInCombat() >= 60 } Spell(stormlash_totem)
+ #jade_serpent_potion,if=time>60&(pet.primal_fire_elemental.active|pet.greater_fire_elemental.active|target.time_to_die<=60)
+ if TimeInCombat() > 60 and { TotemPresent(fire totem=fire_elemental_totem) or TotemPresent(fire totem=fire_elemental_totem) or target.TimeToDie() <= 60 } UsePotionIntellect()
+ #berserking,if=!buff.bloodlust.up&!buff.elemental_mastery.up&(set_bonus.tier15_4pc_caster=1|(buff.ascendance.cooldown_remains=0&(dot.flame_shock.remains>buff.ascendance.duration|level<87)))
+ if not BuffPresent(burst_haste any=1) and not BuffPresent(elemental_mastery_buff) and { ArmorSetBonus(T15_caster 4) == 1 or { SpellCooldown(ascendance_caster) == 0 and { target.DebuffRemains(flame_shock_debuff) > SpellData(ascendance_caster_buff duration) or Level() < 87 } } } Spell(berserking)
+ #blood_fury,if=buff.bloodlust.up|buff.ascendance.up|((cooldown.ascendance.remains>10|level<87)&cooldown.fire_elemental_totem.remains>10)
+ if BuffPresent(burst_haste any=1) or BuffPresent(ascendance_caster_buff) or { { SpellCooldown(ascendance_caster) > 10 or Level() < 87 } and SpellCooldown(fire_elemental_totem) > 10 } Spell(blood_fury)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #elemental_mastery,if=talent.elemental_mastery.enabled&(time>15&((!buff.bloodlust.up&time<120)|(!buff.berserking.up&!buff.bloodlust.up&buff.ascendance.up)|(time>=200&(cooldown.ascendance.remains>30|level<87))))
+ if TalentPoints(elemental_mastery_talent) and { TimeInCombat() > 15 and { { not BuffPresent(burst_haste any=1) and TimeInCombat() < 120 } or { not BuffPresent(berserking_buff) and not BuffPresent(burst_haste any=1) and BuffPresent(ascendance_caster_buff) } or { TimeInCombat() >= 200 and { SpellCooldown(ascendance_caster) > 30 or Level() < 87 } } } } Spell(elemental_mastery)
+ #ancestral_swiftness,if=talent.ancestral_swiftness.enabled&!buff.ascendance.up
+ if TalentPoints(ancestral_swiftness_talent) and not BuffPresent(ascendance_caster_buff) Spell(ancestral_swiftness)
+ #fire_elemental_totem,if=!active
+ if not TotemPresent(fire totem=fire_elemental_totem) Spell(fire_elemental_totem)
+ #ascendance,if=active_enemies>1|(dot.flame_shock.remains>buff.ascendance.duration&(target.time_to_die<20|buff.bloodlust.up|time>=60)&cooldown.lava_burst.remains>0)
+ if Enemies() > 1 or { target.DebuffRemains(flame_shock_debuff) > SpellData(ascendance_caster_buff duration) and { target.TimeToDie() < 20 or BuffPresent(burst_haste any=1) or TimeInCombat() >= 60 } and SpellCooldown(lava_burst) > 0 } Spell(ascendance_caster)
+ #run_action_list,name=single,if=active_enemies=1
+ if Enemies() == 1 ElementalSingleActions()
+ #run_action_list,name=aoe,if=active_enemies>1
+ if Enemies() > 1 ElementalAoeActions()
+}
+
+AddFunction ElementalPrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #flametongue_weapon,weapon=main
+ if WeaponEnchantExpires(main) Spell(flametongue_weapon)
+ #lightning_shield,if=!buff.lightning_shield.up
+ if not BuffPresent(lightning_shield_buff) Spell(lightning_shield)
+ #snapshot_stats
+ #jade_serpent_potion
+ UsePotionIntellect()
+}
+
+AddIcon mastery=elemental help=main
+{
+ if InCombat(no) ElementalPrecombatActions()
+ ElementalDefaultActions()
+}
+
+### Required symbols
+# ancestral_swiftness
+# ancestral_swiftness_talent
+# arcane_torrent
+# ascendance_caster
+# ascendance_caster_buff
+# berserking
+# berserking_buff
+# blood_fury
+# bloodlust
+# chain_lightning
+# earth_elemental_totem
+# earth_shock
+# earthquake
+# elemental_blast
+# elemental_blast_talent
+# elemental_mastery
+# elemental_mastery_buff
+# elemental_mastery_talent
+# fire_elemental_totem
+# flame_shock
+# flame_shock_debuff
+# flametongue_weapon
+# jade_serpent_potion
+# lava_beam
+# lava_burst
+# lava_surge_buff
+# lightning_bolt
+# lightning_shield
+# lightning_shield_buff
+# magma_totem
+# searing_totem
+# spiritwalkers_grace
+# stormlash_buff
+# stormlash_totem
+# thunderstorm
+# unleash_elements
+# unleashed_fury_talent
+# wind_shear
+]]
+ OvaleScripts:RegisterScript("SHAMAN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_shaman_enhancement_t16h.lua b/scripts/simulationcraft_shaman_enhancement_t16h.lua
new file mode 100644
index 0000000..6ea67b4
--- /dev/null
+++ b/scripts/simulationcraft_shaman_enhancement_t16h.lua
@@ -0,0 +1,211 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Shaman_Enhancement_T16H"
+ local desc = "[5.4] SimulationCraft: Shaman_Enhancement_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Shaman_Enhancement_T16H".
+# class=shaman
+# spec=enhancement
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#WZ!...0.1
+# glyphs=chain_lightning
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_shaman_spells)
+
+AddFunction EnhancementAoeActions
+{
+ #fire_nova,if=active_flame_shock>=4
+ if DebuffCountOnAny(flame_shock_debuff) >= 4 Spell(fire_nova)
+ #wait,sec=cooldown.fire_nova.remains,if=active_flame_shock>=4&cooldown.fire_nova.remains<0.67
+ if DebuffCountOnAny(flame_shock_debuff) >= 4 and SpellCooldown(fire_nova) < 0.67 wait Spell(fire_nova)
+ #magma_totem,if=active_enemies>5&!totem.fire.active
+ if Enemies() > 5 and not TotemPresent(fire) Spell(magma_totem)
+ #searing_totem,if=active_enemies<=5&!totem.fire.active
+ if Enemies() <= 5 and not TotemPresent(fire) Spell(searing_totem)
+ #lava_lash,if=dot.flame_shock.ticking
+ if target.DebuffPresent(flame_shock_debuff) Spell(lava_lash)
+ #elemental_blast,if=talent.elemental_blast.enabled&buff.maelstrom_weapon.react>=1
+ if TalentPoints(elemental_blast_talent) and BuffPresent(maelstrom_weapon_buff) >= 1 Spell(elemental_blast)
+ #chain_lightning,if=active_enemies>=2&buff.maelstrom_weapon.react>=3
+ if Enemies() >= 2 and BuffPresent(maelstrom_weapon_buff) >= 3 Spell(chain_lightning)
+ #unleash_elements
+ Spell(unleash_elements)
+ #flame_shock,cycle_targets=1,if=!ticking
+ if not target.DebuffPresent(flame_shock_debuff) Spell(flame_shock)
+ #stormblast
+ Spell(stormblast)
+ #fire_nova,if=active_flame_shock>=3
+ if DebuffCountOnAny(flame_shock_debuff) >= 3 Spell(fire_nova)
+ #chain_lightning,if=active_enemies>=2&buff.maelstrom_weapon.react>=1
+ if Enemies() >= 2 and BuffPresent(maelstrom_weapon_buff) >= 1 Spell(chain_lightning)
+ #stormstrike
+ Spell(stormstrike)
+ #earth_shock,if=active_enemies<4
+ if Enemies() < 4 Spell(earth_shock)
+ #feral_spirit
+ Spell(feral_spirit)
+ #earth_elemental_totem,if=!active&cooldown.fire_elemental_totem.remains>=50
+ if not TotemPresent(earth totem=earth_elemental_totem) and SpellCooldown(fire_elemental_totem) >= 50 Spell(earth_elemental_totem)
+ #spiritwalkers_grace,moving=1
+ if Speed() > 0 Spell(spiritwalkers_grace)
+ #fire_nova,if=active_flame_shock>=1
+ if DebuffCountOnAny(flame_shock_debuff) >= 1 Spell(fire_nova)
+}
+
+AddFunction EnhancementSingleActions
+{
+ #searing_totem,if=!totem.fire.active
+ if not TotemPresent(fire) Spell(searing_totem)
+ #unleash_elements,if=(talent.unleashed_fury.enabled|set_bonus.tier16_2pc_melee=1)
+ if { TalentPoints(unleashed_fury_talent) or ArmorSetBonus(T16_melee 2) == 1 } Spell(unleash_elements)
+ #elemental_blast,if=talent.elemental_blast.enabled&buff.maelstrom_weapon.react>=1
+ if TalentPoints(elemental_blast_talent) and BuffPresent(maelstrom_weapon_buff) >= 1 Spell(elemental_blast)
+ #lightning_bolt,if=buff.maelstrom_weapon.react=5
+ if BuffPresent(maelstrom_weapon_buff) == 5 Spell(lightning_bolt)
+ #feral_spirit,if=set_bonus.tier15_4pc_melee=1
+ if ArmorSetBonus(T15_melee 4) == 1 Spell(feral_spirit)
+ #stormblast
+ Spell(stormblast)
+ #stormstrike
+ Spell(stormstrike)
+ #flame_shock,if=buff.unleash_flame.up&!ticking
+ if BuffPresent(unleash_flame_buff) and not target.DebuffPresent(flame_shock_debuff) Spell(flame_shock)
+ #lava_lash
+ Spell(lava_lash)
+ #lightning_bolt,if=set_bonus.tier15_2pc_melee=1&buff.maelstrom_weapon.react>=4&!buff.ascendance.up
+ if ArmorSetBonus(T15_melee 2) == 1 and BuffPresent(maelstrom_weapon_buff) >= 4 and not BuffPresent(ascendance_melee_buff) Spell(lightning_bolt)
+ #flame_shock,if=(buff.unleash_flame.up&(dot.flame_shock.remains<10|action.flame_shock.tick_damage>dot.flame_shock.tick_dmg))|!ticking
+ if { BuffPresent(unleash_flame_buff) and { target.DebuffRemains(flame_shock_debuff) < 10 or target.Damage(flame_shock_debuff) > target.LastEstimatedDamage(flame_shock_debuff) } } or not target.DebuffPresent(flame_shock_debuff) Spell(flame_shock)
+ #unleash_elements
+ Spell(unleash_elements)
+ #frost_shock,if=glyph.frost_shock.enabled&set_bonus.tier14_4pc_melee=0
+ if Glyph(glyph_of_frost_shock) and ArmorSetBonus(T14_melee 4) == 0 Spell(frost_shock)
+ #lightning_bolt,if=buff.maelstrom_weapon.react>=3&!buff.ascendance.up
+ if BuffPresent(maelstrom_weapon_buff) >= 3 and not BuffPresent(ascendance_melee_buff) Spell(lightning_bolt)
+ #ancestral_swiftness,if=talent.ancestral_swiftness.enabled&buff.maelstrom_weapon.react<2
+ if TalentPoints(ancestral_swiftness_talent) and BuffPresent(maelstrom_weapon_buff) < 2 Spell(ancestral_swiftness)
+ #lightning_bolt,if=buff.ancestral_swiftness.up
+ if BuffPresent(ancestral_swiftness_buff) Spell(lightning_bolt)
+ #earth_shock,if=(!glyph.frost_shock.enabled|set_bonus.tier14_4pc_melee=1)
+ if { not Glyph(glyph_of_frost_shock) or ArmorSetBonus(T14_melee 4) == 1 } Spell(earth_shock)
+ #feral_spirit
+ Spell(feral_spirit)
+ #earth_elemental_totem,if=!active
+ if not TotemPresent(earth totem=earth_elemental_totem) Spell(earth_elemental_totem)
+ #spiritwalkers_grace,moving=1
+ if Speed() > 0 Spell(spiritwalkers_grace)
+ #lightning_bolt,if=buff.maelstrom_weapon.react>1&!buff.ascendance.up
+ if BuffPresent(maelstrom_weapon_buff) > 1 and not BuffPresent(ascendance_melee_buff) Spell(lightning_bolt)
+}
+
+AddFunction EnhancementDefaultActions
+{
+ #wind_shear
+ Interrupt()
+ #bloodlust,if=target.health.pct<25|time>5
+ if target.HealthPercent() < 25 or TimeInCombat() > 5 Bloodlust()
+ #auto_attack
+ #use_item,name=grips_of_celestial_harmony
+ UseItemActions()
+ #stormlash_totem,if=!active&!buff.stormlash.up&(buff.bloodlust.up|time>=60)
+ if not TotemPresent(air totem=stormlash_totem) and not BuffPresent(stormlash_buff) and { BuffPresent(burst_haste any=1) or TimeInCombat() >= 60 } Spell(stormlash_totem)
+ #virmens_bite_potion,if=time>60&(pet.primal_fire_elemental.active|pet.greater_fire_elemental.active|target.time_to_die<=60)
+ if TimeInCombat() > 60 and { TotemPresent(fire totem=fire_elemental_totem) or TotemPresent(fire totem=fire_elemental_totem) or target.TimeToDie() <= 60 } UsePotionAgility()
+ #blood_fury
+ Spell(blood_fury)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #berserking
+ Spell(berserking)
+ #elemental_mastery,if=talent.elemental_mastery.enabled&(talent.primal_elementalist.enabled&glyph.fire_elemental_totem.enabled&(cooldown.fire_elemental_totem.remains=0|cooldown.fire_elemental_totem.remains>=80))
+ if TalentPoints(elemental_mastery_talent) and { TalentPoints(primal_elementalist_talent) and Glyph(glyph_of_fire_elemental_totem) and { not SpellCooldown(fire_elemental_totem) > 0 or SpellCooldown(fire_elemental_totem) >= 80 } } Spell(elemental_mastery)
+ #elemental_mastery,if=talent.elemental_mastery.enabled&(talent.primal_elementalist.enabled&!glyph.fire_elemental_totem.enabled&(cooldown.fire_elemental_totem.remains=0|cooldown.fire_elemental_totem.remains>=50))
+ if TalentPoints(elemental_mastery_talent) and { TalentPoints(primal_elementalist_talent) and not Glyph(glyph_of_fire_elemental_totem) and { not SpellCooldown(fire_elemental_totem) > 0 or SpellCooldown(fire_elemental_totem) >= 50 } } Spell(elemental_mastery)
+ #elemental_mastery,if=talent.elemental_mastery.enabled&!talent.primal_elementalist.enabled
+ if TalentPoints(elemental_mastery_talent) and not TalentPoints(primal_elementalist_talent) Spell(elemental_mastery)
+ #fire_elemental_totem,if=!active
+ if not TotemPresent(fire totem=fire_elemental_totem) Spell(fire_elemental_totem)
+ #ascendance,if=cooldown.strike.remains>=3
+ if SpellCooldown(strike) >= 3 Spell(ascendance_melee)
+ #lifeblood,if=(glyph.fire_elemental_totem.enabled&(pet.primal_fire_elemental.active|pet.greater_fire_elemental.active))|!glyph.fire_elemental_totem.enabled
+ if { Glyph(glyph_of_fire_elemental_totem) and { TotemPresent(fire totem=fire_elemental_totem) or TotemPresent(fire totem=fire_elemental_totem) } } or not Glyph(glyph_of_fire_elemental_totem) Spell(lifeblood)
+ #run_action_list,name=single,if=active_enemies=1
+ if Enemies() == 1 EnhancementSingleActions()
+ #run_action_list,name=aoe,if=active_enemies>1
+ if Enemies() > 1 EnhancementAoeActions()
+}
+
+AddFunction EnhancementPrecombatActions
+{
+ #flask,type=spring_blossoms
+ #food,type=sea_mist_rice_noodles
+ #windfury_weapon,weapon=main
+ if WeaponEnchantExpires(main) Spell(windfury_weapon)
+ #flametongue_weapon,weapon=off
+ if WeaponEnchantExpires(off) Spell(flametongue_weapon)
+ #lightning_shield,if=!buff.lightning_shield.up
+ if not BuffPresent(lightning_shield_buff) Spell(lightning_shield)
+ #snapshot_stats
+ #virmens_bite_potion
+ UsePotionAgility()
+}
+
+AddIcon mastery=enhancement help=main
+{
+ if InCombat(no) EnhancementPrecombatActions()
+ EnhancementDefaultActions()
+}
+
+### Required symbols
+# ancestral_swiftness
+# ancestral_swiftness_buff
+# ancestral_swiftness_talent
+# arcane_torrent
+# ascendance_melee
+# ascendance_melee_buff
+# berserking
+# blood_fury
+# bloodlust
+# chain_lightning
+# earth_elemental_totem
+# earth_shock
+# elemental_blast
+# elemental_blast_talent
+# elemental_mastery
+# elemental_mastery_talent
+# feral_spirit
+# fire_elemental_totem
+# fire_nova
+# flame_shock
+# flame_shock_debuff
+# flametongue_weapon
+# frost_shock
+# glyph_of_fire_elemental_totem
+# glyph_of_frost_shock
+# lava_lash
+# lifeblood
+# lightning_bolt
+# lightning_shield
+# lightning_shield_buff
+# maelstrom_weapon_buff
+# magma_totem
+# primal_elementalist_talent
+# searing_totem
+# spiritwalkers_grace
+# stormblast
+# stormlash_buff
+# stormlash_totem
+# stormstrike
+# strike
+# unleash_elements
+# unleash_flame_buff
+# unleashed_fury_talent
+# virmens_bite_potion
+# wind_shear
+# windfury_weapon
+]]
+ OvaleScripts:RegisterScript("SHAMAN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warlock_affliction_t16h.lua b/scripts/simulationcraft_warlock_affliction_t16h.lua
new file mode 100644
index 0000000..145c477
--- /dev/null
+++ b/scripts/simulationcraft_warlock_affliction_t16h.lua
@@ -0,0 +1,155 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Warlock_Affliction_T16H"
+ local desc = "[5.4] SimulationCraft: Warlock_Affliction_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Warlock_Affliction_T16H".
+# class=warlock
+# spec=affliction
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Va!....00
+# glyphs=siphon_life
+# pet=felhunter
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warlock_spells)
+
+AddFunction AfflictionAoeActions
+{
+ #summon_infernal
+ Spell(summon_infernal)
+ #soulburn,cycle_targets=1,if=buff.soulburn.down&!dot.soulburn_seed_of_corruption.ticking&!action.soulburn_seed_of_corruption.in_flight_to_target&shard_react
+ if BuffExpires(soulburn_buff) and not target.DebuffPresent(soulburn_seed_of_corruption_debuff) and not InFlightToTarget(soulburn_seed_of_corruption) and SoulShards() >= 1 Spell(soulburn)
+ #soul_swap,if=buff.soulburn.up&!dot.agony.ticking&!dot.corruption.ticking
+ if BuffPresent(soulburn_buff) and not target.DebuffPresent(agony_debuff) and not target.DebuffPresent(corruption_debuff) Spell(soul_swap)
+ #soul_swap,cycle_targets=1,if=buff.soulburn.up&dot.corruption.ticking&!dot.agony.ticking
+ if BuffPresent(soulburn_buff) and target.DebuffPresent(corruption_debuff) and not target.DebuffPresent(agony_debuff) Spell(soul_swap)
+ #seed_of_corruption,cycle_targets=1,if=(buff.soulburn.down&!in_flight_to_target&!ticking)|(buff.soulburn.up&!dot.soulburn_seed_of_corruption.ticking&!action.soulburn_seed_of_corruption.in_flight_to_target)
+ if { BuffExpires(soulburn_buff) and not InFlightToTarget(seed_of_corruption) and not target.DebuffPresent(seed_of_corruption_debuff) } or { BuffPresent(soulburn_buff) and not target.DebuffPresent(soulburn_seed_of_corruption_debuff) and not InFlightToTarget(soulburn_seed_of_corruption) } Spell(seed_of_corruption)
+ #haunt,cycle_targets=1,if=!in_flight_to_target&debuff.haunt.remains<cast_time+travel_time&shard_react
+ if not InFlightToTarget(haunt) and target.DebuffRemains(haunt_debuff) < CastTime(haunt) + 0.5 and SoulShards() >= 1 Spell(haunt)
+ #life_tap,if=mana.pct<70
+ if ManaPercent() < 70 Spell(life_tap)
+ #fel_flame,cycle_targets=1,if=!in_flight_to_target
+ if not InFlightToTarget(fel_flame) Spell(fel_flame)
+}
+
+AddFunction AfflictionDefaultActions
+{
+ #curse_of_the_elements,if=debuff.magic_vulnerability.down
+ if target.DebuffExpires(magic_vulnerability any=1) Spell(curse_of_the_elements)
+ #use_item,name=gloves_of_the_horned_nightmare
+ UseItemActions()
+ #jade_serpent_potion,if=buff.bloodlust.react|target.health.pct<=20
+ if BuffPresent(burst_haste any=1) or target.HealthPercent() <= 20 UsePotionIntellect()
+ #berserking
+ Spell(berserking)
+ #dark_soul,if=!talent.archimondes_darkness.enabled|(talent.archimondes_darkness.enabled&(charges=2|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react|target.health.pct<=10))
+ if not TalentPoints(archimondes_darkness_talent) or { TalentPoints(archimondes_darkness_talent) and { Charges(dark_soul_misery) == 2 or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) or target.HealthPercent() <= 10 } } Spell(dark_soul_misery)
+ #service_pet,if=talent.grimoire_of_service.enabled
+ if TalentPoints(grimoire_of_service_talent) ServicePet()
+ #run_action_list,name=aoe,if=active_enemies>6
+ if Enemies() > 6 AfflictionAoeActions()
+ #summon_doomguard
+ Spell(summon_doomguard)
+ #soul_swap,if=buff.soulburn.up
+ if BuffPresent(soulburn_buff) Spell(soul_swap)
+ #soulburn,if=(buff.dark_soul.up|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react>6)&(dot.agony.ticks_remain<=action.agony.add_ticks%2|dot.corruption.ticks_remain<=action.corruption.add_ticks%2|dot.unstable_affliction.ticks_remain<=action.unstable_affliction.add_ticks%2)&shard_react
+ if { BuffPresent(dark_soul_misery_buff) or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) > 6 } and { target.TicksRemain(agony_debuff) <= TicksAdded(agony_debuff) / 2 or target.TicksRemain(corruption_debuff) <= TicksAdded(corruption_debuff) / 2 or target.TicksRemain(unstable_affliction_debuff) <= TicksAdded(unstable_affliction_debuff) / 2 } and SoulShards() >= 1 Spell(soulburn)
+ #soulburn,if=(dot.unstable_affliction.ticks_remain<=1|dot.corruption.ticks_remain<=1|dot.agony.ticks_remain<=1)&shard_react&target.health.pct<=20
+ if { target.TicksRemain(unstable_affliction_debuff) <= 1 or target.TicksRemain(corruption_debuff) <= 1 or target.TicksRemain(agony_debuff) <= 1 } and SoulShards() >= 1 and target.HealthPercent() <= 20 Spell(soulburn)
+ #soul_swap,if=active_enemies>1&buff.soul_swap.down&(buff.dark_soul.up|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react>6)
+ if Enemies() > 1 and BuffExpires(soul_swap_buff) and { BuffPresent(dark_soul_misery_buff) or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) > 6 } Spell(soul_swap)
+ #soul_swap,cycle_targets=1,if=active_enemies>1&buff.soul_swap.up&(dot.agony.ticks_remain<=action.agony.add_ticks%2|dot.corruption.ticks_remain<=action.corruption.add_ticks%2|dot.unstable_affliction.ticks_remain<=action.unstable_affliction.add_ticks%2)&shard_react
+ if Enemies() > 1 and BuffPresent(soul_swap_buff) and { target.TicksRemain(agony_debuff) <= TicksAdded(agony_debuff) / 2 or target.TicksRemain(corruption_debuff) <= TicksAdded(corruption_debuff) / 2 or target.TicksRemain(unstable_affliction_debuff) <= TicksAdded(unstable_affliction_debuff) / 2 } and SoulShards() >= 1 Spell(soul_swap)
+ #haunt,if=!in_flight_to_target&remains<cast_time+travel_time+tick_time&shard_react&target.health.pct<=20
+ if not InFlightToTarget(haunt) and target.DebuffRemains(haunt_debuff) < CastTime(haunt) + 0.5 + target.TickTime(haunt_debuff) and SoulShards() >= 1 and target.HealthPercent() <= 20 Spell(haunt)
+ #drain_soul,interrupt=1,chain=1,if=target.health.pct<=20
+ if target.HealthPercent() <= 20 Spell(drain_soul)
+ #haunt,if=!in_flight_to_target&remains<cast_time+travel_time+tick_time&shard_react
+ if not InFlightToTarget(haunt) and target.DebuffRemains(haunt_debuff) < CastTime(haunt) + 0.5 + target.TickTime(haunt_debuff) and SoulShards() >= 1 Spell(haunt)
+ #agony,if=(tick_damage*n_ticks*(100+crit_pct_current)>4*dot.agony.tick_dmg*dot.agony.ticks_remain*(100+dot.agony.crit_pct))&miss_react
+ if { target.Damage(agony_debuff) * target.Ticks(agony_debuff) * { 100 + SpellCritChance() } > 4 * target.LastEstimatedDamage(agony_debuff) * target.TicksRemain(agony_debuff) * { 100 + target.DebuffSpellCritChance(agony_debuff) } } and True(miss_react) Spell(agony)
+ #corruption,if=((stat.spell_power>spell_power&ticks_remain<add_ticks%2)|(stat.spell_power>spell_power*1.5)|remains<gcd)&miss_react
+ if { { Spellpower() > target.DebuffSpellpower(corruption_debuff) and target.TicksRemain(corruption_debuff) < TicksAdded(corruption_debuff) / 2 } or { Spellpower() > target.DebuffSpellpower(corruption_debuff) * 1.5 } or target.DebuffRemains(corruption_debuff) < GCD() } and True(miss_react) Spell(corruption)
+ #unstable_affliction,if=((stat.spell_power>spell_power&ticks_remain<add_ticks%2)|(stat.spell_power>spell_power*1.5)|remains<cast_time+gcd)&miss_react
+ if { { Spellpower() > target.DebuffSpellpower(unstable_affliction_debuff) and target.TicksRemain(unstable_affliction_debuff) < TicksAdded(unstable_affliction_debuff) / 2 } or { Spellpower() > target.DebuffSpellpower(unstable_affliction_debuff) * 1.5 } or target.DebuffRemains(unstable_affliction_debuff) < CastTime(unstable_affliction) + GCD() } and True(miss_react) Spell(unstable_affliction)
+ #life_tap,if=buff.dark_soul.down&buff.bloodlust.down&mana.pct<50
+ if BuffExpires(dark_soul_misery_buff) and BuffExpires(burst_haste any=1) and ManaPercent() < 50 Spell(life_tap)
+ #malefic_grasp,chain=1,interrupt_if=target.health.pct<=20
+ Spell(malefic_grasp)
+ #life_tap,moving=1,if=mana.pct<80&mana.pct<target.health.pct
+ if Speed() > 0 and ManaPercent() < 80 and ManaPercent() < target.HealthPercent() Spell(life_tap)
+ #fel_flame,moving=1
+ if Speed() > 0 Spell(fel_flame)
+ #life_tap
+ Spell(life_tap)
+}
+
+AddFunction AfflictionPrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #dark_intent,if=!aura.spell_power_multiplier.up
+ if not BuffPresent(spell_power_multiplier any=1) Spell(dark_intent)
+ #summon_pet,if=!talent.grimoire_of_sacrifice.enabled|buff.grimoire_of_sacrifice.down
+ if not TalentPoints(grimoire_of_sacrifice_talent) or BuffExpires(grimoire_of_sacrifice_buff) SummonPet()
+ #snapshot_stats
+ #grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled
+ if pet.Present() and TalentPoints(grimoire_of_sacrifice_talent) Spell(grimoire_of_sacrifice)
+ #service_pet,if=talent.grimoire_of_service.enabled
+ if TalentPoints(grimoire_of_service_talent) ServicePet()
+ #jade_serpent_potion
+ UsePotionIntellect()
+}
+
+AddIcon mastery=affliction help=main
+{
+ if InCombat(no) AfflictionPrecombatActions()
+ AfflictionDefaultActions()
+}
+
+### Required symbols
+# agony
+# agony_debuff
+# archimondes_darkness_talent
+# berserking
+# corruption
+# corruption_debuff
+# curse_of_the_elements
+# dark_intent
+# dark_soul_misery
+# dark_soul_misery_buff
+# drain_soul
+# fel_flame
+# grimoire_of_sacrifice
+# grimoire_of_sacrifice_buff
+# grimoire_of_sacrifice_talent
+# grimoire_of_service_talent
+# haunt
+# haunt_debuff
+# jade_serpent_potion
+# life_tap
+# malefic_grasp
+# seed_of_corruption
+# seed_of_corruption_debuff
+# service_pet
+# soul_swap
+# soul_swap_buff
+# soulburn
+# soulburn_buff
+# soulburn_seed_of_corruption
+# soulburn_seed_of_corruption_debuff
+# spell_power_multiplier
+# summon_doomguard
+# summon_infernal
+# summon_pet
+# trinket_proc_intellect_buff
+# trinket_stacking_proc_intellect_buff
+# unstable_affliction
+# unstable_affliction_debuff
+]]
+ OvaleScripts:RegisterScript("WARLOCK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warlock_demonology_t16h.lua b/scripts/simulationcraft_warlock_demonology_t16h.lua
new file mode 100644
index 0000000..ba7c637
--- /dev/null
+++ b/scripts/simulationcraft_warlock_demonology_t16h.lua
@@ -0,0 +1,159 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Warlock_Demonology_T16H"
+ local desc = "[5.4] SimulationCraft: Warlock_Demonology_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Warlock_Demonology_T16H".
+# class=warlock
+# spec=demonology
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#VZ!....10
+# pet=felguard
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warlock_spells)
+
+AddFunction DemonologyAoeActions
+{
+ #summon_infernal
+ Spell(summon_infernal)
+ #cancel_metamorphosis,if=buff.metamorphosis.up&dot.corruption.remains>10&demonic_fury<=650&buff.dark_soul.down&!dot.immolation_aura.ticking
+ if BuffPresent(metamorphosis_buff) and target.DebuffRemains(corruption_debuff) > 10 and DemonicFury() <= 650 and BuffExpires(dark_soul_knowledge_buff) and not target.DebuffPresent(immolation_aura_debuff) Spell(cancel_metamorphosis)
+ #immolation_aura,if=buff.metamorphosis.up
+ if BuffPresent(metamorphosis_buff) Spell(immolation_aura)
+ #void_ray,if=buff.metamorphosis.up&dot.corruption.remains<10
+ if BuffPresent(metamorphosis_buff) and target.DebuffRemains(corruption_debuff) < 10 Spell(void_ray)
+ #doom,cycle_targets=1,if=buff.metamorphosis.up&(!ticking|remains<tick_time|(ticks_remain+1<n_ticks&buff.dark_soul.up))&target.time_to_die>=30&miss_react
+ if BuffPresent(metamorphosis_buff) and { not target.DebuffPresent(doom_debuff) or target.DebuffRemains(doom_debuff) < target.TickTime(doom_debuff) or { target.TicksRemain(doom_debuff) + 1 < target.Ticks(doom_debuff) and BuffPresent(dark_soul_knowledge_buff) } } and target.TimeToDie() >= 30 and True(miss_react) Spell(doom)
+ #void_ray,if=buff.metamorphosis.up
+ if BuffPresent(metamorphosis_buff) Spell(void_ray)
+ #corruption,cycle_targets=1,if=!ticking&target.time_to_die>30&miss_react
+ if not target.DebuffPresent(corruption_debuff) and target.TimeToDie() > 30 and True(miss_react) Spell(corruption)
+ #hand_of_guldan
+ Spell(hand_of_guldan)
+ #metamorphosis,if=dot.corruption.remains<10|buff.dark_soul.up|demonic_fury>=950|demonic_fury%32>target.time_to_die
+ if target.DebuffRemains(corruption_debuff) < 10 or BuffPresent(dark_soul_knowledge_buff) or DemonicFury() >= 950 or DemonicFury() / 32 > target.TimeToDie() Spell(metamorphosis)
+ #hellfire,chain=1,interrupt=1
+ Spell(hellfire)
+ #life_tap
+ Spell(life_tap)
+}
+
+AddFunction DemonologyDefaultActions
+{
+ #curse_of_the_elements,if=debuff.magic_vulnerability.down
+ if target.DebuffExpires(magic_vulnerability any=1) Spell(curse_of_the_elements)
+ #use_item,name=gloves_of_the_horned_nightmare
+ UseItemActions()
+ #jade_serpent_potion,if=buff.bloodlust.react|target.health.pct<=20
+ if BuffPresent(burst_haste any=1) or target.HealthPercent() <= 20 UsePotionIntellect()
+ #berserking
+ Spell(berserking)
+ #dark_soul,if=!talent.archimondes_darkness.enabled|(talent.archimondes_darkness.enabled&(charges=2|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react|target.health.pct<=10))
+ if not TalentPoints(archimondes_darkness_talent) or { TalentPoints(archimondes_darkness_talent) and { Charges(dark_soul_knowledge) == 2 or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) or target.HealthPercent() <= 10 } } Spell(dark_soul_knowledge)
+ #service_pet,if=talent.grimoire_of_service.enabled
+ if TalentPoints(grimoire_of_service_talent) ServicePet()
+ #felguard:felstorm
+ Spell(felguard_felstorm)
+ #wrathguard:wrathstorm
+ Spell(wrathguard_wrathstorm)
+ #run_action_list,name=aoe,if=active_enemies>4
+ if Enemies() > 4 DemonologyAoeActions()
+ #summon_doomguard
+ Spell(summon_doomguard)
+ #doom,cycle_targets=1,if=buff.metamorphosis.up&(ticks_remain<=1|(ticks_remain+1<n_ticks&buff.dark_soul.up)|(ticks_remain<=add_ticks%2&stat.spell_power>spell_power))&target.time_to_die>=30&miss_react
+ if BuffPresent(metamorphosis_buff) and { target.TicksRemain(doom_debuff) <= 1 or { target.TicksRemain(doom_debuff) + 1 < target.Ticks(doom_debuff) and BuffPresent(dark_soul_knowledge_buff) } or { target.TicksRemain(doom_debuff) <= TicksAdded(doom_debuff) / 2 and Spellpower() > target.DebuffSpellpower(doom_debuff) } } and target.TimeToDie() >= 30 and True(miss_react) Spell(doom)
+ #cancel_metamorphosis,if=buff.metamorphosis.up&buff.dark_soul.down&demonic_fury<=650&target.time_to_die>30&(cooldown.metamorphosis.remains<4|demonic_fury<=300)&!(action.hand_of_guldan.in_flight&dot.shadowflame.remains)
+ if BuffPresent(metamorphosis_buff) and BuffExpires(dark_soul_knowledge_buff) and DemonicFury() <= 650 and target.TimeToDie() > 30 and { SpellCooldown(metamorphosis) < 4 or DemonicFury() <= 300 } and not { InFlightToTarget(hand_of_guldan) and target.DebuffRemains(shadowflame_debuff) } Spell(cancel_metamorphosis)
+ #soul_fire,if=buff.metamorphosis.up&buff.molten_core.react&(buff.dark_soul.remains<action.shadow_bolt.cast_time|buff.dark_soul.remains>cast_time)
+ if BuffPresent(metamorphosis_buff) and BuffPresent(molten_core_buff) and { BuffRemains(dark_soul_knowledge_buff) < CastTime(shadow_bolt) or BuffRemains(dark_soul_knowledge_buff) > CastTime(soul_fire) } Spell(soul_fire)
+ #touch_of_chaos,if=buff.metamorphosis.up
+ if BuffPresent(metamorphosis_buff) Spell(touch_of_chaos)
+ #metamorphosis,if=(buff.dark_soul.up&buff.dark_soul.remains<demonic_fury%32)|demonic_fury>=950|demonic_fury%32>target.time_to_die|(action.hand_of_guldan.in_flight&dot.shadowflame.remains)
+ if { BuffPresent(dark_soul_knowledge_buff) and BuffRemains(dark_soul_knowledge_buff) < DemonicFury() / 32 } or DemonicFury() >= 950 or DemonicFury() / 32 > target.TimeToDie() or { InFlightToTarget(hand_of_guldan) and target.DebuffRemains(shadowflame_debuff) } Spell(metamorphosis)
+ #corruption,cycle_targets=1,if=!ticking&target.time_to_die>=6&miss_react
+ if not target.DebuffPresent(corruption_debuff) and target.TimeToDie() >= 6 and True(miss_react) Spell(corruption)
+ #corruption,cycle_targets=1,if=spell_power<stat.spell_power&ticks_remain<=add_ticks%2&target.time_to_die>=6&miss_react
+ if target.DebuffSpellpower(corruption_debuff) < Spellpower() and target.TicksRemain(corruption_debuff) <= TicksAdded(corruption_debuff) / 2 and target.TimeToDie() >= 6 and True(miss_react) Spell(corruption)
+ #hand_of_guldan,if=!in_flight&dot.shadowflame.remains<travel_time+action.shadow_bolt.cast_time&(charges=2|dot.shadowflame.remains>travel_time|(charges=1&recharge_time<4))
+ if not InFlightToTarget(hand_of_guldan) and target.DebuffRemains(shadowflame_debuff) < 0.5 + CastTime(shadow_bolt) and { Charges(hand_of_guldan) == 2 or target.DebuffRemains(shadowflame_debuff) > 0.5 or { Charges(hand_of_guldan) == 1 and SpellChargeCooldown(hand_of_guldan) < 4 } } Spell(hand_of_guldan)
+ #soul_fire,if=buff.molten_core.react&(buff.dark_soul.remains<action.shadow_bolt.cast_time|buff.dark_soul.remains>cast_time)&(buff.molten_core.react>9|target.health.pct<=28)
+ if BuffPresent(molten_core_buff) and { BuffRemains(dark_soul_knowledge_buff) < CastTime(shadow_bolt) or BuffRemains(dark_soul_knowledge_buff) > CastTime(soul_fire) } and { BuffPresent(molten_core_buff) > 9 or target.HealthPercent() <= 28 } Spell(soul_fire)
+ #life_tap,if=mana.pct<60
+ if ManaPercent() < 60 Spell(life_tap)
+ #shadow_bolt
+ Spell(shadow_bolt)
+ #fel_flame,moving=1
+ if Speed() > 0 Spell(fel_flame)
+ #life_tap
+ Spell(life_tap)
+}
+
+AddFunction DemonologyPrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #dark_intent,if=!aura.spell_power_multiplier.up
+ if not BuffPresent(spell_power_multiplier any=1) Spell(dark_intent)
+ #summon_pet,if=!talent.grimoire_of_sacrifice.enabled|buff.grimoire_of_sacrifice.down
+ if not TalentPoints(grimoire_of_sacrifice_talent) or BuffExpires(grimoire_of_sacrifice_buff) SummonPet()
+ #snapshot_stats
+ #grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled
+ if pet.Present() and TalentPoints(grimoire_of_sacrifice_talent) Spell(grimoire_of_sacrifice)
+ #service_pet,if=talent.grimoire_of_service.enabled
+ if TalentPoints(grimoire_of_service_talent) ServicePet()
+ #jade_serpent_potion
+ UsePotionIntellect()
+}
+
+AddIcon mastery=demonology help=main
+{
+ if InCombat(no) DemonologyPrecombatActions()
+ DemonologyDefaultActions()
+}
+
+### Required symbols
+# archimondes_darkness_talent
+# berserking
+# cancel_metamorphosis
+# corruption
+# corruption_debuff
+# curse_of_the_elements
+# dark_intent
+# dark_soul_knowledge
+# dark_soul_knowledge_buff
+# doom
+# doom_debuff
+# fel_flame
+# felguard_felstorm
+# grimoire_of_sacrifice
+# grimoire_of_sacrifice_buff
+# grimoire_of_sacrifice_talent
+# grimoire_of_service_talent
+# hand_of_guldan
+# hellfire
+# immolation_aura
+# immolation_aura_debuff
+# jade_serpent_potion
+# life_tap
+# metamorphosis
+# metamorphosis_buff
+# molten_core_buff
+# service_pet
+# shadow_bolt
+# shadowflame_debuff
+# soul_fire
+# spell_power_multiplier
+# summon_doomguard
+# summon_infernal
+# summon_pet
+# touch_of_chaos
+# trinket_proc_intellect_buff
+# trinket_stacking_proc_intellect_buff
+# void_ray
+# wrathguard_wrathstorm
+]]
+ OvaleScripts:RegisterScript("WARLOCK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warlock_destruction_t16h.lua b/scripts/simulationcraft_warlock_destruction_t16h.lua
new file mode 100644
index 0000000..6fd190a
--- /dev/null
+++ b/scripts/simulationcraft_warlock_destruction_t16h.lua
@@ -0,0 +1,136 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Warlock_Destruction_T16H"
+ local desc = "[5.4] SimulationCraft: Warlock_Destruction_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Warlock_Destruction_T16H".
+# class=warlock
+# spec=destruction
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Vb!....20
+# pet=felhunter
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warlock_spells)
+
+AddFunction DestructionAoeActions
+{
+ #summon_infernal
+ Spell(summon_infernal)
+ #rain_of_fire,if=!ticking&!in_flight
+ if not target.DebuffPresent(rain_of_fire_aftermath_debuff) and not InFlightToTarget(rain_of_fire_aftermath) Spell(rain_of_fire_aftermath)
+ #fire_and_brimstone,if=ember_react&buff.fire_and_brimstone.down
+ if BurningEmbers() >= 10 and BuffExpires(fire_and_brimstone_buff) Spell(fire_and_brimstone)
+ #immolate,if=buff.fire_and_brimstone.up&!ticking
+ if BuffPresent(fire_and_brimstone_buff) and not target.DebuffPresent(immolate_debuff) Spell(immolate)
+ #conflagrate,if=buff.fire_and_brimstone.up
+ if BuffPresent(fire_and_brimstone_buff) Spell(conflagrate)
+ #incinerate,if=buff.fire_and_brimstone.up
+ if BuffPresent(fire_and_brimstone_buff) Spell(incinerate)
+ #incinerate
+ Spell(incinerate)
+}
+
+AddFunction DestructionDefaultActions
+{
+ #curse_of_the_elements,if=debuff.magic_vulnerability.down
+ if target.DebuffExpires(magic_vulnerability any=1) Spell(curse_of_the_elements)
+ #use_item,name=gloves_of_the_horned_nightmare
+ UseItemActions()
+ #jade_serpent_potion,if=buff.bloodlust.react|target.health.pct<=20
+ if BuffPresent(burst_haste any=1) or target.HealthPercent() <= 20 UsePotionIntellect()
+ #berserking
+ Spell(berserking)
+ #dark_soul,if=!talent.archimondes_darkness.enabled|(talent.archimondes_darkness.enabled&(charges=2|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react|target.health.pct<=10))
+ if not TalentPoints(archimondes_darkness_talent) or { TalentPoints(archimondes_darkness_talent) and { Charges(dark_soul_instability) == 2 or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) or target.HealthPercent() <= 10 } } Spell(dark_soul_instability)
+ #service_pet,if=talent.grimoire_of_service.enabled
+ if TalentPoints(grimoire_of_service_talent) ServicePet()
+ #run_action_list,name=aoe,if=active_enemies>3
+ if Enemies() > 3 DestructionAoeActions()
+ #summon_doomguard
+ Spell(summon_doomguard)
+ #rain_of_fire,if=!ticking&!in_flight&active_enemies>1
+ if not target.DebuffPresent(rain_of_fire_aftermath_debuff) and not InFlightToTarget(rain_of_fire_aftermath) and Enemies() > 1 Spell(rain_of_fire_aftermath)
+ #havoc,target=2,if=active_enemies>1
+ if Enemies() > 1 Spell(havoc)
+ #shadowburn,if=ember_react&(burning_ember>3.5|mana.pct<=20|target.time_to_die<20|buff.havoc.stack>=1|trinket.proc.intellect.react|(trinket.stacking_proc.intellect.remains<cast_time*4&trinket.stacking_proc.intellect.remains>cast_time))
+ if BurningEmbers() >= 10 and { BurningEmbers() / 10 > 3.5 or ManaPercent() <= 20 or target.TimeToDie() < 20 or DebuffStacksOnAny(havoc_debuff) >= 1 or BuffPresent(trinket_proc_intellect_buff) or { BuffRemains(trinket_stacking_proc_intellect_buff) < CastTime(shadowburn) * 4 and BuffRemains(trinket_stacking_proc_intellect_buff) > CastTime(shadowburn) } } Spell(shadowburn)
+ #immolate,cycle_targets=1,if=n_ticks*crit_pct_current>3*dot.immolate.ticks_remain*dot.immolate.crit_pct&miss_react
+ if target.Ticks(immolate_debuff) * SpellCritChance() > 3 * target.TicksRemain(immolate_debuff) * target.DebuffSpellCritChance(immolate_debuff) and True(miss_react) Spell(immolate)
+ #conflagrate,if=charges=2&buff.havoc.stack=0
+ if Charges(conflagrate) == 2 and DebuffStacksOnAny(havoc_debuff) == 0 Spell(conflagrate)
+ #rain_of_fire,if=!ticking&!in_flight,moving=1
+ if Speed() > 0 and not target.DebuffPresent(rain_of_fire_aftermath_debuff) and not InFlightToTarget(rain_of_fire_aftermath) Spell(rain_of_fire_aftermath)
+ #chaos_bolt,if=ember_react&target.health.pct>20&(buff.backdraft.stack<3|level<86|(active_enemies>1&action.incinerate.cast_time<1))&(burning_ember>(4.5-active_enemies)|buff.skull_banner.remains>cast_time|(trinket.proc.intellect.react&trinket.proc.intellect.remains>cast_time)|(trinket.stacking_proc.intellect.remains<cast_time*2.5&trinket.stacking_proc.intellect.remains>cast_time))
+ if BurningEmbers() >= 10 and target.HealthPercent() > 20 and { BuffStacks(backdraft_buff) < 3 or Level() < 86 or { Enemies() > 1 and CastTime(incinerate) < 1 } } and { BurningEmbers() / 10 > { 4.5 - Enemies() } or BuffRemains(skull_banner_buff) > CastTime(chaos_bolt) or { BuffPresent(trinket_proc_intellect_buff) and BuffRemains(trinket_proc_intellect_buff) > CastTime(chaos_bolt) } or { BuffRemains(trinket_stacking_proc_intellect_buff) < CastTime(chaos_bolt) * 2.5 and BuffRemains(trinket_stacking_proc_intellect_buff) > CastTime(chaos_bolt) } } Spell(chaos_bolt)
+ #chaos_bolt,if=ember_react&target.health.pct>20&(buff.havoc.stack=3&buff.havoc.remains>cast_time)
+ if BurningEmbers() >= 10 and target.HealthPercent() > 20 and { DebuffStacksOnAny(havoc_debuff) == 3 and DebuffRemainsOnAny(havoc_debuff) > CastTime(chaos_bolt) } Spell(chaos_bolt)
+ #conflagrate
+ Spell(conflagrate)
+ #incinerate
+ Spell(incinerate)
+ #fel_flame,moving=1
+ if Speed() > 0 Spell(fel_flame)
+}
+
+AddFunction DestructionPrecombatActions
+{
+ #flask,type=warm_sun
+ #food,type=mogu_fish_stew
+ #dark_intent,if=!aura.spell_power_multiplier.up
+ if not BuffPresent(spell_power_multiplier any=1) Spell(dark_intent)
+ #summon_pet,if=!talent.grimoire_of_sacrifice.enabled|buff.grimoire_of_sacrifice.down
+ if not TalentPoints(grimoire_of_sacrifice_talent) or BuffExpires(grimoire_of_sacrifice_buff) SummonPet()
+ #snapshot_stats
+ #grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled
+ if pet.Present() and TalentPoints(grimoire_of_sacrifice_talent) Spell(grimoire_of_sacrifice)
+ #service_pet,if=talent.grimoire_of_service.enabled
+ if TalentPoints(grimoire_of_service_talent) ServicePet()
+ #jade_serpent_potion
+ UsePotionIntellect()
+}
+
+AddIcon mastery=destruction help=main
+{
+ if InCombat(no) DestructionPrecombatActions()
+ DestructionDefaultActions()
+}
+
+### Required symbols
+# archimondes_darkness_talent
+# backdraft_buff
+# berserking
+# chaos_bolt
+# conflagrate
+# curse_of_the_elements
+# dark_intent
+# dark_soul_instability
+# fel_flame
+# fire_and_brimstone
+# fire_and_brimstone_buff
+# grimoire_of_sacrifice
+# grimoire_of_sacrifice_buff
+# grimoire_of_sacrifice_talent
+# grimoire_of_service_talent
+# havoc
+# havoc_debuff
+# immolate
+# immolate_debuff
+# incinerate
+# jade_serpent_potion
+# rain_of_fire_aftermath
+# rain_of_fire_aftermath_debuff
+# service_pet
+# shadowburn
+# skull_banner_buff
+# spell_power_multiplier
+# summon_doomguard
+# summon_infernal
+# summon_pet
+# trinket_proc_intellect_buff
+# trinket_stacking_proc_intellect_buff
+]]
+ OvaleScripts:RegisterScript("WARLOCK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_arms_t16h.lua b/scripts/simulationcraft_warrior_arms_t16h.lua
new file mode 100644
index 0000000..dd23396
--- /dev/null
+++ b/scripts/simulationcraft_warrior_arms_t16h.lua
@@ -0,0 +1,171 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Warrior_Arms_T16H"
+ local desc = "[5.4] SimulationCraft: Warrior_Arms_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Warrior_Arms_T16H".
+# class=warrior
+# spec=arms
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Za!122011
+# glyphs=unending_rage/death_from_above/sweeping_strikes/resonating_power
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction ArmsAoeActions
+{
+ #sweeping_strikes
+ Spell(sweeping_strikes)
+ #cleave,if=rage>110&active_enemies<=4
+ if Rage() > 110 and Enemies() <= 4 Spell(cleave)
+ #bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+ #dragon_roar,if=enabled&debuff.colossus_smash.down
+ if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) Spell(dragon_roar)
+ #colossus_smash,if=debuff.colossus_smash.remains<1
+ if target.DebuffRemains(colossus_smash_debuff) < 1 Spell(colossus_smash)
+ #thunder_clap,target=2,if=dot.deep_wounds.attack_power*1.1<stat.attack_power
+ if target.DebuffAttackPower(deep_wounds_debuff) * 1.1 < AttackPower() Spell(thunder_clap)
+ #mortal_strike,if=active_enemies=2|rage<50
+ if Enemies() == 2 or Rage() < 50 Spell(mortal_strike)
+ #execute,if=buff.sudden_execute.down&active_enemies=2
+ if BuffExpires(sudden_execute_buff) and Enemies() == 2 Spell(execute)
+ #slam,if=buff.sweeping_strikes.up&debuff.colossus_smash.up
+ if BuffPresent(sweeping_strikes_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(slam)
+ #overpower,if=active_enemies=2
+ if Enemies() == 2 Spell(overpower)
+ #slam,if=buff.sweeping_strikes.up
+ if BuffPresent(sweeping_strikes_buff) Spell(slam)
+ #battle_shout
+ Spell(battle_shout)
+}
+
+AddFunction ArmsSingleTargetActions
+{
+ #heroic_strike,if=rage>115|(debuff.colossus_smash.up&rage>60&set_bonus.tier16_2pc_melee)
+ if Rage() > 115 or { target.DebuffPresent(colossus_smash_debuff) and Rage() > 60 and ArmorSetBonus(T16_melee 2) } Spell(heroic_strike)
+ #mortal_strike,if=dot.deep_wounds.remains<1.0|buff.enrage.down|rage<10
+ if target.DebuffRemains(deep_wounds_debuff) < 1 or BuffExpires(enrage_buff) or Rage() < 10 Spell(mortal_strike)
+ #colossus_smash,if=debuff.colossus_smash.remains<1.0
+ if target.DebuffRemains(colossus_smash_debuff) < 1 Spell(colossus_smash)
+ #bladestorm,if=enabled,interrupt_if=!cooldown.colossus_smash.remains
+ if TalentPoints(bladestorm_talent) Spell(bladestorm)
+ #mortal_strike
+ Spell(mortal_strike)
+ #storm_bolt,if=enabled&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #dragon_roar,if=enabled&debuff.colossus_smash.down
+ if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) Spell(dragon_roar)
+ #execute,if=buff.sudden_execute.down|buff.taste_for_blood.down|rage>90|target.time_to_die<12
+ if BuffExpires(sudden_execute_buff) or BuffExpires(taste_for_blood_buff) or Rage() > 90 or target.TimeToDie() < 12 Spell(execute)
+ #slam,if=target.health.pct>=20&(trinket.stacking_stat.crit.stack>=10|buff.recklessness.up)
+ if target.HealthPercent() >= 20 and { BuffStacks(trinket_stacking_stat_crit_buff) >= 10 or BuffPresent(recklessness_buff) } Spell(slam)
+ #overpower,if=target.health.pct>=20&rage<100|buff.sudden_execute.up
+ if target.HealthPercent() >= 20 and Rage() < 100 or BuffPresent(sudden_execute_buff) Spell(overpower)
+ #execute
+ Spell(execute)
+ #slam,if=target.health.pct>=20
+ if target.HealthPercent() >= 20 Spell(slam)
+ #heroic_throw
+ Spell(heroic_throw)
+ #battle_shout
+ Spell(battle_shout)
+}
+
+AddFunction ArmsDefaultActions
+{
+ #auto_attack
+ #mogu_power_potion,if=(target.health.pct<20&buff.recklessness.up)|buff.bloodlust.react|target.time_to_die<=25
+ if { target.HealthPercent() < 20 and BuffPresent(recklessness_buff) } or BuffPresent(burst_haste any=1) or target.TimeToDie() <= 25 UsePotionStrength()
+ #recklessness,if=!talent.bloodbath.enabled&((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20))|buff.bloodbath.up&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20)|target.time_to_die<=12
+ if not TalentPoints(bloodbath_talent) and { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } } or BuffPresent(bloodbath_buff) and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } or target.TimeToDie() <= 12 Spell(recklessness)
+ #avatar,if=enabled&(buff.recklessness.up|target.time_to_die<=25)
+ if TalentPoints(avatar_talent) and { BuffPresent(recklessness_buff) or target.TimeToDie() <= 25 } Spell(avatar)
+ #skull_banner,if=buff.skull_banner.down&(((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&target.time_to_die>192&buff.cooldown_reduction.up)|buff.recklessness.up)
+ if BuffExpires(skull_banner_buff) and { { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and target.TimeToDie() > 192 and BuffPresent(cooldown_reduction_strength_buff) } or BuffPresent(recklessness_buff) } Spell(skull_banner)
+ #use_item,slot=hands,if=!talent.bloodbath.enabled&debuff.colossus_smash.up|buff.bloodbath.up
+ if not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) or BuffPresent(bloodbath_buff) UseItemActions()
+ #blood_fury,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(blood_fury)
+ #berserking,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(berserking)
+ #arcane_torrent,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(arcane_torrent)
+ #bloodbath,if=enabled&(debuff.colossus_smash.remains>0.1|cooldown.colossus_smash.remains<5|target.time_to_die<=20)
+ if TalentPoints(bloodbath_talent) and { target.DebuffRemains(colossus_smash_debuff) > 0.1 or SpellCooldown(colossus_smash) < 5 or target.TimeToDie() <= 20 } Spell(bloodbath)
+ #berserker_rage,if=buff.enrage.remains<0.5
+ if BuffRemains(enrage_buff) < 0.5 Spell(berserker_rage)
+ #heroic_leap,if=debuff.colossus_smash.up
+ if target.DebuffPresent(colossus_smash_debuff) Spell(heroic_leap)
+ #run_action_list,name=aoe,if=active_enemies>=2
+ if Enemies() >= 2 ArmsAoeActions()
+ #run_action_list,name=single_target,if=active_enemies<2
+ if Enemies() < 2 ArmsSingleTargetActions()
+}
+
+AddFunction ArmsPrecombatActions
+{
+ #flask,type=winters_bite
+ #food,type=black_pepper_ribs_and_shrimp
+ #snapshot_stats
+ #stance,choose=battle
+ if not Stance(warrior_battle_stance) Spell(battle_stance)
+ #battle_shout
+ Spell(battle_shout)
+ #mogu_power_potion
+ UsePotionStrength()
+}
+
+AddIcon mastery=arms help=main
+{
+ if InCombat(no) ArmsPrecombatActions()
+ ArmsDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_buff
+# bloodbath_talent
+# cleave
+# colossus_smash
+# colossus_smash_debuff
+# cooldown_reduction_strength_buff
+# deep_wounds_debuff
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# execute
+# heroic_leap
+# heroic_strike
+# heroic_throw
+# mogu_power_potion
+# mortal_strike
+# overpower
+# recklessness
+# recklessness_buff
+# skull_banner
+# skull_banner_buff
+# slam
+# storm_bolt
+# storm_bolt_talent
+# sudden_execute_buff
+# sweeping_strikes
+# sweeping_strikes_buff
+# taste_for_blood_buff
+# thunder_clap
+# trinket_stacking_stat_crit_buff
+]]
+ OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_fury_1h_t16h.lua b/scripts/simulationcraft_warrior_fury_1h_t16h.lua
new file mode 100644
index 0000000..2c64170
--- /dev/null
+++ b/scripts/simulationcraft_warrior_fury_1h_t16h.lua
@@ -0,0 +1,272 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Warrior_Fury_1h_T16H"
+ local desc = "[5.4] SimulationCraft: Warrior_Fury_1h_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Warrior_Fury_1h_T16H".
+# class=warrior
+# spec=fury
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#ZZ!122212
+# glyphs=unending_rage/death_from_above/bull_rush
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction FurySingleTargetActions
+{
+ #bloodbath,if=enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20)
+ if TalentPoints(bloodbath_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } Spell(bloodbath)
+ #berserker_rage,if=buff.enrage.remains<1&cooldown.bloodthirst.remains>1
+ if BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 Spell(berserker_rage)
+ #heroic_strike,if=((debuff.colossus_smash.up&rage>=40)&target.health.pct>=20)|rage>=100&buff.enrage.up
+ if { { target.DebuffPresent(colossus_smash_debuff) and Rage() >= 40 } and target.HealthPercent() >= 20 } or Rage() >= 100 and BuffPresent(enrage_buff) Spell(heroic_strike)
+ #heroic_leap,if=debuff.colossus_smash.up
+ if target.DebuffPresent(colossus_smash_debuff) Spell(heroic_leap)
+ #storm_bolt,if=enabled&buff.cooldown_reduction.up&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and BuffPresent(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #raging_blow,if=buff.raging_blow.stack=2&debuff.colossus_smash.up&target.health.pct>=20
+ if BuffStacks(raging_blow_buff) == 2 and target.DebuffPresent(colossus_smash_debuff) and target.HealthPercent() >= 20 Spell(raging_blow)
+ #storm_bolt,if=enabled&buff.cooldown_reduction.down&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #bloodthirst,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)
+ if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } Spell(bloodthirst)
+ #wild_strike,if=buff.bloodsurge.react&target.health.pct>=20&cooldown.bloodthirst.remains<=1
+ if BuffPresent(bloodsurge_buff) and target.HealthPercent() >= 20 and SpellCooldown(bloodthirst) <= 1 Spell(wild_strike)
+ #wait,sec=cooldown.bloodthirst.remains,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+ if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+ #dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+ if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+ #colossus_smash
+ Spell(colossus_smash)
+ #storm_bolt,if=enabled&buff.cooldown_reduction.down
+ if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) Spell(storm_bolt)
+ #execute,if=debuff.colossus_smash.up|rage>70|target.time_to_die<12
+ if target.DebuffPresent(colossus_smash_debuff) or Rage() > 70 or target.TimeToDie() < 12 Spell(execute)
+ #raging_blow,if=target.health.pct<20|buff.raging_blow.stack=2|(debuff.colossus_smash.up|(cooldown.bloodthirst.remains>=1&buff.raging_blow.remains<=3))
+ if target.HealthPercent() < 20 or BuffStacks(raging_blow_buff) == 2 or { target.DebuffPresent(colossus_smash_debuff) or { SpellCooldown(bloodthirst) >= 1 and BuffRemains(raging_blow_buff) <= 3 } } Spell(raging_blow)
+ #bladestorm,if=enabled
+ if TalentPoints(bladestorm_talent) Spell(bladestorm)
+ #wild_strike,if=buff.bloodsurge.up
+ if BuffPresent(bloodsurge_buff) Spell(wild_strike)
+ #raging_blow,if=cooldown.colossus_smash.remains>=3
+ if SpellCooldown(colossus_smash) >= 3 Spell(raging_blow)
+ #shattering_throw,if=cooldown.colossus_smash.remains>5
+ if SpellCooldown(colossus_smash) > 5 Spell(shattering_throw)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #heroic_throw,if=debuff.colossus_smash.down&rage<60
+ if target.DebuffExpires(colossus_smash_debuff) and Rage() < 60 Spell(heroic_throw)
+ #battle_shout,if=rage<70&!debuff.colossus_smash.up
+ if Rage() < 70 and not target.DebuffPresent(colossus_smash_debuff) Spell(battle_shout)
+ #wild_strike,if=debuff.colossus_smash.up&target.health.pct>=20
+ if target.DebuffPresent(colossus_smash_debuff) and target.HealthPercent() >= 20 Spell(wild_strike)
+ #battle_shout,if=rage<70
+ if Rage() < 70 Spell(battle_shout)
+ #wild_strike,if=cooldown.colossus_smash.remains>=2&rage>=70&target.health.pct>=20
+ if SpellCooldown(colossus_smash) >= 2 and Rage() >= 70 and target.HealthPercent() >= 20 Spell(wild_strike)
+ #impending_victory,if=enabled&target.health.pct>=20&cooldown.colossus_smash.remains>=2
+ if TalentPoints(impending_victory_talent) and target.HealthPercent() >= 20 and SpellCooldown(colossus_smash) >= 2 Spell(impending_victory)
+}
+
+AddFunction FuryDefaultActions
+{
+ #auto_attack
+ #mogu_power_potion,if=(target.health.pct<20&buff.recklessness.up)|target.time_to_die<=25
+ if { target.HealthPercent() < 20 and BuffPresent(recklessness_buff) } or target.TimeToDie() <= 25 UsePotionStrength()
+ #recklessness,if=!talent.bloodbath.enabled&((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20))|buff.bloodbath.up&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20)|target.time_to_die<=12
+ if not TalentPoints(bloodbath_talent) and { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } } or BuffPresent(bloodbath_buff) and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } or target.TimeToDie() <= 12 Spell(recklessness)
+ #avatar,if=enabled&(buff.recklessness.up|target.time_to_die<=25)
+ if TalentPoints(avatar_talent) and { BuffPresent(recklessness_buff) or target.TimeToDie() <= 25 } Spell(avatar)
+ #skull_banner,if=buff.skull_banner.down&(((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&target.time_to_die>192&buff.cooldown_reduction.up)|buff.recklessness.up)
+ if BuffExpires(skull_banner_buff) and { { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and target.TimeToDie() > 192 and BuffPresent(cooldown_reduction_strength_buff) } or BuffPresent(recklessness_buff) } Spell(skull_banner)
+ #use_item,slot=hands,if=!talent.bloodbath.enabled&debuff.colossus_smash.up|buff.bloodbath.up
+ if not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) or BuffPresent(bloodbath_buff) UseItemActions()
+ #blood_fury,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(blood_fury)
+ #berserking,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(berserking)
+ #arcane_torrent,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(arcane_torrent)
+ #run_action_list,name=single_target,if=active_enemies=1
+ if Enemies() == 1 FurySingleTargetActions()
+ #run_action_list,name=two_targets,if=active_enemies=2
+ if Enemies() == 2 FuryTwoTargetsActions()
+ #run_action_list,name=three_targets,if=active_enemies=3
+ if Enemies() == 3 FuryThreeTargetsActions()
+ #run_action_list,name=aoe,if=active_enemies>3
+ if Enemies() > 3 FuryAoeActions()
+}
+
+AddFunction FuryPrecombatActions
+{
+ #flask,type=winters_bite
+ #food,type=black_pepper_ribs_and_shrimp
+ #snapshot_stats
+ #stance,choose=battle
+ if not Stance(warrior_battle_stance) Spell(battle_stance)
+ #battle_shout
+ Spell(battle_shout)
+ #mogu_power_potion
+ UsePotionStrength()
+}
+
+AddFunction FuryTwoTargetsActions
+{
+ #bloodbath,if=enabled&((!talent.bladestorm.enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20))|(talent.bladestorm.enabled))
+ if TalentPoints(bloodbath_talent) and { { not TalentPoints(bladestorm_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } } or { TalentPoints(bladestorm_talent) } } Spell(bloodbath)
+ #berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up)))|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+ if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+ #cleave,if=(rage>=60&debuff.colossus_smash.up)|rage>110
+ if { Rage() >= 60 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 110 Spell(cleave)
+ #heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+ if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+ #bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up))
+ if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } Spell(bladestorm)
+ #dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+ if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+ #colossus_smash
+ Spell(colossus_smash)
+ #bloodthirst,cycle_targets=1,if=dot.deep_wounds.remains<5
+ if target.DebuffRemains(deep_wounds_debuff) < 5 Spell(bloodthirst)
+ #storm_bolt,if=enabled&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #bloodthirst
+ Spell(bloodthirst)
+ #wait,sec=cooldown.bloodthirst.remains,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+ if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+ #raging_blow,if=buff.meat_cleaver.up
+ if BuffPresent(meat_cleaver_buff) Spell(raging_blow)
+ #whirlwind,if=!buff.meat_cleaver.up
+ if not BuffPresent(meat_cleaver_buff) Spell(whirlwind)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #execute
+ Spell(execute)
+ #battle_shout
+ Spell(battle_shout)
+ #heroic_throw
+ Spell(heroic_throw)
+}
+
+AddFunction FuryThreeTargetsActions
+{
+ #bloodbath,if=enabled
+ if TalentPoints(bloodbath_talent) Spell(bloodbath)
+ #berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+ if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+ #cleave,if=(rage>=70&debuff.colossus_smash.up)|rage>90
+ if { Rage() >= 70 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 90 Spell(cleave)
+ #heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+ if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+ #bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+ #dragon_roar,if=enabled&!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(dragon_roar_talent) and not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+ #bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+ if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+ #colossus_smash
+ Spell(colossus_smash)
+ #storm_bolt,if=enabled&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #raging_blow,if=buff.meat_cleaver.stack=2
+ if BuffStacks(meat_cleaver_buff) == 2 Spell(raging_blow)
+ #whirlwind
+ Spell(whirlwind)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #raging_blow
+ Spell(raging_blow)
+ #battle_shout
+ Spell(battle_shout)
+ #heroic_throw
+ Spell(heroic_throw)
+}
+
+AddFunction FuryAoeActions
+{
+ #bloodbath,if=enabled
+ if TalentPoints(bloodbath_talent) Spell(bloodbath)
+ #berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+ if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+ #cleave,if=rage>90
+ if Rage() > 90 Spell(cleave)
+ #heroic_leap,if=buff.enrage.up
+ if BuffPresent(enrage_buff) Spell(heroic_leap)
+ #bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+ #bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking&buff.enrage.down
+ if not target.DebuffPresent(deep_wounds_debuff) and BuffExpires(enrage_buff) Spell(bloodthirst)
+ #raging_blow,if=buff.meat_cleaver.stack=3
+ if BuffStacks(meat_cleaver_buff) == 3 Spell(raging_blow)
+ #whirlwind
+ Spell(whirlwind)
+ #dragon_roar,if=enabled&debuff.colossus_smash.down&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+ #bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+ if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+ #colossus_smash
+ Spell(colossus_smash)
+ #storm_bolt,if=enabled
+ if TalentPoints(storm_bolt_talent) Spell(storm_bolt)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #battle_shout
+ Spell(battle_shout)
+}
+
+AddIcon mastery=fury help=main
+{
+ if InCombat(no) FuryPrecombatActions()
+ FuryDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_buff
+# bloodbath_talent
+# bloodsurge_buff
+# bloodthirst
+# cleave
+# colossus_smash
+# colossus_smash_debuff
+# cooldown_reduction_strength_buff
+# deep_wounds_debuff
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# execute
+# heroic_leap
+# heroic_strike
+# heroic_throw
+# impending_victory
+# impending_victory_talent
+# meat_cleaver_buff
+# mogu_power_potion
+# raging_blow
+# raging_blow_buff
+# recklessness
+# recklessness_buff
+# shattering_throw
+# shockwave
+# shockwave_talent
+# skull_banner
+# skull_banner_buff
+# storm_bolt
+# storm_bolt_talent
+# whirlwind
+# wild_strike
+]]
+ OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_fury_2h_t16h.lua b/scripts/simulationcraft_warrior_fury_2h_t16h.lua
new file mode 100644
index 0000000..95b5775
--- /dev/null
+++ b/scripts/simulationcraft_warrior_fury_2h_t16h.lua
@@ -0,0 +1,275 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Warrior_Fury_2h_T16H"
+ local desc = "[5.4] SimulationCraft: Warrior_Fury_2h_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Warrior_Fury_2h_T16H".
+# class=warrior
+# spec=fury
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#ZZ!122012
+# glyphs=unending_rage/death_from_above/bull_rush
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction FurySingleTargetActions
+{
+ #bloodbath,if=enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20)
+ if TalentPoints(bloodbath_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } Spell(bloodbath)
+ #berserker_rage,if=buff.enrage.remains<1&cooldown.bloodthirst.remains>1
+ if BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 Spell(berserker_rage)
+ #heroic_strike,if=(debuff.colossus_smash.up&rage>=40|rage>=100)&buff.enrage.up
+ if { target.DebuffPresent(colossus_smash_debuff) and Rage() >= 40 or Rage() >= 100 } and BuffPresent(enrage_buff) Spell(heroic_strike)
+ #heroic_leap,if=debuff.colossus_smash.up&buff.enrage.up
+ if target.DebuffPresent(colossus_smash_debuff) and BuffPresent(enrage_buff) Spell(heroic_leap)
+ #bloodthirst,if=!buff.enrage.up
+ if not BuffPresent(enrage_buff) Spell(bloodthirst)
+ #storm_bolt,if=enabled&buff.cooldown_reduction.up&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and BuffPresent(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #raging_blow,if=buff.raging_blow.stack=2&debuff.colossus_smash.up
+ if BuffStacks(raging_blow_buff) == 2 and target.DebuffPresent(colossus_smash_debuff) Spell(raging_blow)
+ #storm_bolt,if=enabled&buff.cooldown_reduction.down&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+ if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+ #bloodthirst
+ Spell(bloodthirst)
+ #wild_strike,if=buff.bloodsurge.react&cooldown.bloodthirst.remains<=1&cooldown.bloodthirst.remains>0.3
+ if BuffPresent(bloodsurge_buff) and SpellCooldown(bloodthirst) <= 1 and SpellCooldown(bloodthirst) > 0.3 Spell(wild_strike)
+ #wait,sec=cooldown.bloodthirst.remains,if=!(debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+ if not { target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+ #colossus_smash
+ Spell(colossus_smash)
+ #storm_bolt,if=enabled&buff.cooldown_reduction.down
+ if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) Spell(storm_bolt)
+ #execute,if=buff.raging_blow.stack<2&(((rage>70&!debuff.colossus_smash.up)|debuff.colossus_smash.up)|trinket.proc.strength.up)|target.time_to_die<5
+ if BuffStacks(raging_blow_buff) < 2 and { { { Rage() > 70 and not target.DebuffPresent(colossus_smash_debuff) } or target.DebuffPresent(colossus_smash_debuff) } or BuffPresent(trinket_proc_strength_buff) } or target.TimeToDie() < 5 Spell(execute)
+ #berserker_rage,if=buff.raging_blow.stack<=1&target.health.pct>=20
+ if BuffStacks(raging_blow_buff) <= 1 and target.HealthPercent() >= 20 Spell(berserker_rage)
+ #raging_blow,if=buff.raging_blow.stack=2|debuff.colossus_smash.up|buff.raging_blow.remains<=3
+ if BuffStacks(raging_blow_buff) == 2 or target.DebuffPresent(colossus_smash_debuff) or BuffRemains(raging_blow_buff) <= 3 Spell(raging_blow)
+ #bladestorm,if=enabled,interrupt_if=cooldown.bloodthirst.remains<1
+ if TalentPoints(bladestorm_talent) Spell(bladestorm)
+ #raging_blow,if=cooldown.colossus_smash.remains>=1
+ if SpellCooldown(colossus_smash) >= 1 Spell(raging_blow)
+ #wild_strike,if=buff.bloodsurge.up
+ if BuffPresent(bloodsurge_buff) Spell(wild_strike)
+ #shattering_throw,if=cooldown.colossus_smash.remains>5
+ if SpellCooldown(colossus_smash) > 5 Spell(shattering_throw)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #heroic_throw,if=debuff.colossus_smash.down&rage<60
+ if target.DebuffExpires(colossus_smash_debuff) and Rage() < 60 Spell(heroic_throw)
+ #wild_strike,if=debuff.colossus_smash.up
+ if target.DebuffPresent(colossus_smash_debuff) Spell(wild_strike)
+ #battle_shout,if=rage<70
+ if Rage() < 70 Spell(battle_shout)
+ #impending_victory,if=enabled&cooldown.colossus_smash.remains>=1.5
+ if TalentPoints(impending_victory_talent) and SpellCooldown(colossus_smash) >= 1.5 Spell(impending_victory)
+ #wild_strike,if=cooldown.colossus_smash.remains>=2&rage>=70
+ if SpellCooldown(colossus_smash) >= 2 and Rage() >= 70 Spell(wild_strike)
+}
+
+AddFunction FuryDefaultActions
+{
+ #auto_attack
+ #mogu_power_potion,if=(target.health.pct<20&buff.recklessness.up)|target.time_to_die<=25
+ if { target.HealthPercent() < 20 and BuffPresent(recklessness_buff) } or target.TimeToDie() <= 25 UsePotionStrength()
+ #recklessness,if=!talent.bloodbath.enabled&((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20))|buff.bloodbath.up&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20)|target.time_to_die<=12
+ if not TalentPoints(bloodbath_talent) and { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } } or BuffPresent(bloodbath_buff) and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } or target.TimeToDie() <= 12 Spell(recklessness)
+ #avatar,if=enabled&(buff.recklessness.up|target.time_to_die<=25)
+ if TalentPoints(avatar_talent) and { BuffPresent(recklessness_buff) or target.TimeToDie() <= 25 } Spell(avatar)
+ #skull_banner,if=buff.skull_banner.down&(((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&target.time_to_die>192&buff.cooldown_reduction.up)|buff.recklessness.up)
+ if BuffExpires(skull_banner_buff) and { { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and target.TimeToDie() > 192 and BuffPresent(cooldown_reduction_strength_buff) } or BuffPresent(recklessness_buff) } Spell(skull_banner)
+ #use_item,slot=hands,if=!talent.bloodbath.enabled&debuff.colossus_smash.up|buff.bloodbath.up
+ if not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) or BuffPresent(bloodbath_buff) UseItemActions()
+ #blood_fury,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(blood_fury)
+ #berserking,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(berserking)
+ #arcane_torrent,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+ if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(arcane_torrent)
+ #run_action_list,name=single_target,if=active_enemies=1
+ if Enemies() == 1 FurySingleTargetActions()
+ #run_action_list,name=two_targets,if=active_enemies=2
+ if Enemies() == 2 FuryTwoTargetsActions()
+ #run_action_list,name=three_targets,if=active_enemies=3
+ if Enemies() == 3 FuryThreeTargetsActions()
+ #run_action_list,name=aoe,if=active_enemies>3
+ if Enemies() > 3 FuryAoeActions()
+}
+
+AddFunction FuryPrecombatActions
+{
+ #elixir,type=mad_hozen
+ #food,type=black_pepper_ribs_and_shrimp
+ #snapshot_stats
+ #stance,choose=battle
+ if not Stance(warrior_battle_stance) Spell(battle_stance)
+ #battle_shout
+ Spell(battle_shout)
+ #mogu_power_potion
+ UsePotionStrength()
+}
+
+AddFunction FuryTwoTargetsActions
+{
+ #bloodbath,if=enabled&((!talent.bladestorm.enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20))|(talent.bladestorm.enabled))
+ if TalentPoints(bloodbath_talent) and { { not TalentPoints(bladestorm_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } } or { TalentPoints(bladestorm_talent) } } Spell(bloodbath)
+ #berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up)))|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+ if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+ #cleave,if=(rage>=60&debuff.colossus_smash.up)|rage>110
+ if { Rage() >= 60 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 110 Spell(cleave)
+ #heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+ if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+ #bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up))
+ if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } Spell(bladestorm)
+ #dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+ if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+ #colossus_smash
+ Spell(colossus_smash)
+ #bloodthirst,cycle_targets=1,if=dot.deep_wounds.remains<5
+ if target.DebuffRemains(deep_wounds_debuff) < 5 Spell(bloodthirst)
+ #storm_bolt,if=enabled&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #bloodthirst
+ Spell(bloodthirst)
+ #wait,sec=cooldown.bloodthirst.remains,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+ if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+ #raging_blow,if=buff.meat_cleaver.up
+ if BuffPresent(meat_cleaver_buff) Spell(raging_blow)
+ #whirlwind,if=!buff.meat_cleaver.up
+ if not BuffPresent(meat_cleaver_buff) Spell(whirlwind)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #execute
+ Spell(execute)
+ #battle_shout
+ Spell(battle_shout)
+ #heroic_throw
+ Spell(heroic_throw)
+}
+
+AddFunction FuryThreeTargetsActions
+{
+ #bloodbath,if=enabled
+ if TalentPoints(bloodbath_talent) Spell(bloodbath)
+ #berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+ if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+ #cleave,if=(rage>=70&debuff.colossus_smash.up)|rage>90
+ if { Rage() >= 70 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 90 Spell(cleave)
+ #heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+ if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+ #bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+ #dragon_roar,if=enabled&!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(dragon_roar_talent) and not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+ #bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+ if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+ #colossus_smash
+ Spell(colossus_smash)
+ #storm_bolt,if=enabled&debuff.colossus_smash.up
+ if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+ #raging_blow,if=buff.meat_cleaver.stack=2
+ if BuffStacks(meat_cleaver_buff) == 2 Spell(raging_blow)
+ #whirlwind
+ Spell(whirlwind)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #raging_blow
+ Spell(raging_blow)
+ #battle_shout
+ Spell(battle_shout)
+ #heroic_throw
+ Spell(heroic_throw)
+}
+
+AddFunction FuryAoeActions
+{
+ #bloodbath,if=enabled
+ if TalentPoints(bloodbath_talent) Spell(bloodbath)
+ #berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+ if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+ #cleave,if=rage>90
+ if Rage() > 90 Spell(cleave)
+ #heroic_leap,if=buff.enrage.up
+ if BuffPresent(enrage_buff) Spell(heroic_leap)
+ #bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+ #bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking&buff.enrage.down
+ if not target.DebuffPresent(deep_wounds_debuff) and BuffExpires(enrage_buff) Spell(bloodthirst)
+ #raging_blow,if=buff.meat_cleaver.stack=3
+ if BuffStacks(meat_cleaver_buff) == 3 Spell(raging_blow)
+ #whirlwind
+ Spell(whirlwind)
+ #dragon_roar,if=enabled&debuff.colossus_smash.down&(buff.bloodbath.up|!talent.bloodbath.enabled)
+ if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+ #bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+ if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+ #colossus_smash
+ Spell(colossus_smash)
+ #storm_bolt,if=enabled
+ if TalentPoints(storm_bolt_talent) Spell(storm_bolt)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #battle_shout
+ Spell(battle_shout)
+}
+
+AddIcon mastery=fury help=main
+{
+ if InCombat(no) FuryPrecombatActions()
+ FuryDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_buff
+# bloodbath_talent
+# bloodsurge_buff
+# bloodthirst
+# cleave
+# colossus_smash
+# colossus_smash_debuff
+# cooldown_reduction_strength_buff
+# deep_wounds_debuff
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# execute
+# heroic_leap
+# heroic_strike
+# heroic_throw
+# impending_victory
+# impending_victory_talent
+# meat_cleaver_buff
+# mogu_power_potion
+# raging_blow
+# raging_blow_buff
+# recklessness
+# recklessness_buff
+# shattering_throw
+# shockwave
+# shockwave_talent
+# skull_banner
+# skull_banner_buff
+# storm_bolt
+# storm_bolt_talent
+# trinket_proc_strength_buff
+# whirlwind
+# wild_strike
+]]
+ OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_protection_t16h.lua b/scripts/simulationcraft_warrior_protection_t16h.lua
new file mode 100644
index 0000000..a294ff7
--- /dev/null
+++ b/scripts/simulationcraft_warrior_protection_t16h.lua
@@ -0,0 +1,154 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+ local name = "SimulationCraft: Warrior_Protection_T16H"
+ local desc = "[5.4] SimulationCraft: Warrior_Protection_T16H"
+ local code = [[
+# Based on SimulationCraft profile "Warrior_Protection_T16H".
+# class=warrior
+# spec=protection
+# talents=http://us.battle.net/wow/en/tool/talent-calculator#Zb!.00110
+# glyphs=unending_rage/hold_the_line/heavy_repercussions
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction ProtectionDpsCdsActions
+{
+ #avatar,if=enabled
+ if TalentPoints(avatar_talent) Spell(avatar)
+ #bloodbath,if=enabled
+ if TalentPoints(bloodbath_talent) Spell(bloodbath)
+ #blood_fury
+ Spell(blood_fury)
+ #berserking
+ Spell(berserking)
+ #arcane_torrent
+ Spell(arcane_torrent)
+ #dragon_roar,if=enabled
+ if TalentPoints(dragon_roar_talent) Spell(dragon_roar)
+ #shattering_throw
+ Spell(shattering_throw)
+ #skull_banner
+ Spell(skull_banner)
+ #recklessness
+ Spell(recklessness)
+ #storm_bolt,if=enabled
+ if TalentPoints(storm_bolt_talent) Spell(storm_bolt)
+ #shockwave,if=enabled
+ if TalentPoints(shockwave_talent) Spell(shockwave)
+ #bladestorm,if=enabled
+ if TalentPoints(bladestorm_talent) Spell(bladestorm)
+ #run_action_list,name=normal_rotation
+ ProtectionNormalRotationActions()
+}
+
+AddFunction ProtectionNormalRotationActions
+{
+ #shield_slam
+ Spell(shield_slam)
+ #revenge
+ Spell(revenge)
+ #battle_shout,if=rage<=rage.max-20
+ if Rage() <= MaxRage() -20 Spell(battle_shout)
+ #thunder_clap,if=glyph.resonating_power.enabled|target.debuff.weakened_blows.down
+ if Glyph(glyph_of_resonating_power) or target.DebuffExpires(weakened_blows_debuff) Spell(thunder_clap)
+ #demoralizing_shout
+ Spell(demoralizing_shout)
+ #impending_victory,if=enabled
+ if TalentPoints(impending_victory_talent) Spell(impending_victory)
+ #victory_rush,if=!talent.impending_victory.enabled
+ if not TalentPoints(impending_victory_talent) Spell(victory_rush)
+ #devastate
+ Spell(devastate)
+}
+
+AddFunction ProtectionDefaultActions
+{
+ #auto_attack
+ #mountains_potion,if=incoming_damage_2500ms>health.max*0.6&(buff.shield_wall.down&buff.last_stand.down)
+ if IncomingDamage(2.500) > MaxHealth() * 0.6 and { BuffExpires(shield_wall_buff) and BuffExpires(last_stand_buff) } Spell(mountains_potion)
+ #use_item,slot=trinket2
+ UseItemActions()
+ #heroic_strike,if=buff.ultimatum.up|buff.glyph_incite.up
+ if BuffPresent(ultimatum_buff) or BuffPresent(glyph_incite_buff) Spell(heroic_strike)
+ #berserker_rage,if=buff.enrage.down&rage<=rage.max-10
+ if BuffExpires(enrage_buff) and Rage() <= MaxRage() -10 Spell(berserker_rage)
+ #shield_block
+ Spell(shield_block)
+ #shield_barrier,if=incoming_damage_1500ms>health.max*0.3|rage>rage.max-20
+ if IncomingDamage(1.500) > MaxHealth() * 0.3 or Rage() > MaxRage() -20 Spell(shield_barrier)
+ #shield_wall,if=incoming_damage_2500ms>health.max*0.6
+ if IncomingDamage(2.500) > MaxHealth() * 0.6 Spell(shield_wall)
+ #run_action_list,name=dps_cds,if=buff.vengeance.value>health.max*0.20
+ if BuffAmount(vengeance_buff) > MaxHealth() * 0.2 ProtectionDpsCdsActions()
+ #run_action_list,name=normal_rotation
+ ProtectionNormalRotationActions()
+}
+
+AddFunction ProtectionPrecombatActions
+{
+ #flask,type=earth
+ #food,type=chun_tian_spring_rolls
+ #snapshot_stats
+ #stance,choose=defensive
+ if not Stance(warrior_defensive_stance) Spell(defensive_stance)
+ #battle_shout
+ Spell(battle_shout)
+ #mountains_potion
+ Spell(mountains_potion)
+}
+
+AddIcon mastery=protection help=main
+{
+ if InCombat(no) ProtectionPrecombatActions()
+ ProtectionDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_talent
+# demoralizing_shout
+# devastate
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# glyph_incite_buff
+# glyph_of_resonating_power
+# heroic_strike
+# impending_victory
+# impending_victory_talent
+# last_stand_buff
+# mountains_potion
+# recklessness
+# revenge
+# shattering_throw
+# shield_barrier
+# shield_block
+# shield_slam
+# shield_wall
+# shield_wall_buff
+# shockwave
+# shockwave_talent
+# skull_banner
+# storm_bolt
+# storm_bolt_talent
+# thunder_clap
+# ultimatum_buff
+# vengeance_buff
+# victory_rush
+# weakened_blows_debuff
+]]
+ OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file