Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve Arcane Mage implementation #128

Open
wants to merge 6 commits into
base: main
Choose a base branch
from

Conversation

borbrunpagle
Copy link

Various fixes and improvements to arcane mage rotation and consumables.

Add Mage Armor to the mage ability list.

Improvements to the arcane mage EP calculation.

Restore the apparently missing ability to run EP for a chosen profile.

Instead of applying a random 2% hit reduction, which messes with various proc chances, etc. switch the delta on the hit EP test to use a negative hit modifier.

Add mage armor, which is used by arcane mages.

Add a spirit buff mutex and scroll of spirit.

Add Innervate.

Add missing elixirs used by arcane mages.

Frostbolt gets double benefit from Element Precision. (Who knows why?)

Various fixes and improvements to arcane mage rotation and consumables.

Add Mage Armor to the mage ability list.

Improvements to the arcane mage EP calculation.

Restore the apparently missing ability to run EP for a chosen profile.

Instead of applying a random 2% hit reduction, which messes with various proc chances, etc. switch the delta on the hit EP test to use a negative hit modifier.

Add mage armor, which is used by arcane mages.

Add a spirit buff mutex and scroll of spirit.

Add Innervate.

Add missing elixirs used by arcane mages.

Frostbolt gets double benefit from Element Precision. (Who knows why?)
@borbrunpagle borbrunpagle changed the title Correct the readme, single the "-single" part is not actually required. Improve Arcane Mage implementation Dec 26, 2021
Copy link
Owner

@secretbis secretbis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the Mage expertise! I don't play one myself, so this is very helpful!

I noticed a few missing implementations - are there some missing commits for this PR? Let me know if there is anything I can help with!

- name: Blood Fury
- name: Berserking
- name: Bloodlust
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bloodlust is also a configurable raid buff, and is not an ability Mages can cast. As such, it should be removed from the rotation, as it won't do anything here.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It wasn't clear to me how to configure the Bloodlust buff. For example, how do you specify when it triggers?

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raid version of Bloodlust is cast at the start of the fight, and lines up with generally-immediate cooldown usage by presets.

ui/src/presets/samples/mage_arcane_phase2.yml Show resolved Hide resolved
@@ -265,7 +258,11 @@ class TBCSim : CliktCommand() {
val specFilter = specFilterStr?.split(",")
val categoryFilter = categoryFilterStr?.split(",")

if (calcEP) {
if (calcEP && configFile?.exists() == true) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry about this, looks like I broke that option a long time ago and never fixed the docs... The EP rankings on the site mostly replaced the intent of that feature.

Would the most useful output for a single-character sim be just a table of results to the console? Or, would something else be better?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found creating the list of my personal EPs to be the most useful thing. Arcane mages have a few different points where haste, in particular, changes very dramatically in value. Understanding where I am relative to those points of inflection is what I wanted to get, and the current output with my local changes does that.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good! Whenever you're ready, I'd love to see the implementation!

src/commonMain/kotlin/character/Spec.kt Show resolved Hide resolved
override val durationMs: Int = 60000

override fun modifyStats(sp: SimParticipant): Stats {
return Stats(fireDamage = 80)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is missing the melee proc implementation, but I'm happy to add that later - just noting so I don't forget.

Copy link
Owner

@secretbis secretbis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is looking great! I added a couple suggestions about spirit buff priority, and barring a couple comments in the rotation and the personal EP output, should be basically good to go soon!

override val name: String = "Scroll of Spirit V"
override val icon: String = "inv_scroll_01.jpg"
override val durationMs: Int = 30 * 60 * 1000
override val mutex: List<Mutex> = listOf(Mutex.BUFF_SPIRIT)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be useful to add an override for mutexPriority here, since that will resolve based on the potency of the buff. The default priority is whichever is newer, which isn't correct for most stat-based buffs.

The value there would be mapOf(Mutex.BUFF_SPIRIT to 30), and the corresponding 50 weight in Divine Spirit.

@@ -20,6 +21,7 @@ class DivineSpirit : Ability() {
override val name: String = Companion.name
override val icon: String = "spell_holy_prayerofspirit.jpg"
override val durationMs: Int = -1
override val mutex: List<Mutex> = listOf(Mutex.BUFF_SPIRIT)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As with the spirit scroll implementation, this would benefit from a mutexPriority override to accurately express the potency.

@@ -2,6 +2,7 @@ package data.abilities.raid

import character.Ability
import character.Buff
import character.Mutex
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Leftover import

@@ -265,7 +258,11 @@ class TBCSim : CliktCommand() {
val specFilter = specFilterStr?.split(",")
val categoryFilter = categoryFilterStr?.split(",")

if (calcEP) {
if (calcEP && configFile?.exists() == true) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good! Whenever you're ready, I'd love to see the implementation!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants