-
Contributor
Not really that on topic, but I'm wondering for some time now how a reinforcement learner would play out for WoW. You could either enrich it with some hierarchy (e.g. options http://www.cs.cmu.edu/~mstoll/pubs/s...02learning.pdf) and then train combat situations in a simulator, or just do combat within a RL setting and do the other stuff (navigating, high level tasks) the old-fashioned way. Of course you need appropriate sensoring capabilities in your bot (e.g. query health values, cast times, debuffs, etc.) for a better-than-mediocre performance, but given enough training time in the simulator, I would suspect that such a learner would outperform every player and bot in DPS.
I'm not really doing bots anymore (would love, but got stuff to do), but that would actually be very interesting. Also I'm wondering if there are some more modern deep learning concepts which might perform even better.
-
Contributor
Interesting read banana. Thanks.
To expand the topic a bit how do you guys do healing priority ? Basic for me I developed a weight scale type system. It's very basic right now lower health is more weight , if you have a flag, are a tank, have taken x dmg in the last x seconds all these give you a score and I sort the table based on score to get the best target.
Anyone have a different or more effective solution? Or maybe stuff to include in the scoring system?
-
Originally Posted by
aeo
Interesting read banana. Thanks.
To expand the topic a bit how do you guys do healing priority ? Basic for me I developed a weight scale type system. It's very basic right now lower health is more weight , if you have a flag, are a tank, have taken x dmg in the last x seconds all these give you a score and I sort the table based on score to get the best target.
Anyone have a different or more effective solution? Or maybe stuff to include in the scoring system?
When you have several people with similar health percentages who need heals, you could prioritize those with any kind of effects that increase healing taken by a decent percent. In some situations, this can lead to really giant increases in efficiency.
-
Contributor
Yeah great idea . Make use of others buffs will add it thanks
-
The list of things that make a person take increased healing is fairly small, but make sure to include checks for things like Glyph of Recovery - WoWWiki - Your guide to the World of Warcraft and its universe - Wikia on rogues and things like that if you can too.
-
Active Member
I use a decision tree with some nice glue to make the code simple to understand, and not clogged full of super-common predicates. Here's one rotation implementation:
Code:
class EnhancementShamanBrain(BasicCombatBrain):
def __init__(self):
super(EnhancementShamanBrain, self).__init__()
self.LightningShield = Buff("Lightning Shield")
self.UnleashElements = Spell("Unleash Elements")
self.FlameShock = Debuff("Flame Shock")
self.FeralSpirit = Spell("Feral Spirit")
self.HealingSurge = Spell("Healing Surge")
self.LavaLash = Attack("Lava Lash")
self.LightningBolt = Attack("Lightning Bolt")
self.Stormstrike = Attack("Stormstrike")
self.WindShear = Attack("Wind Shear")
self._healTimer = TrueEvery(7)
def GetSpell(self):
B = self
yield B.LightningShield
target = self.game_state.GetTarget()
if target and target.GetSpellCasting():
if target.GetSpellCasting() in FLAGS.interruptible_spells:
yield B.WindShear
if self.game_state.GetPlayerHealth() < 0.50:
yield B.FeralSpirit
if B.HealingSurge.CanUse() and self._healTimer.get():
yield B.HealingSurge
if self.game_state.GetPlayerBuff("Maelstrom Weapon") == 5:
if self.game_state.GetPlayerHealth() < 0.90:
yield B.HealingSurge
yield B.LightningBolt
yield B.FlameShock
yield B.UnleashElements
yield B.Stormstrike
yield B.LavaLash
GetSpell() is a generator for brevity -- you could get a similar effect by returning a list of actions in order of preference. "Attack", "Buff", etc. all internally manage basic decisions like "is this ability on cooldown?" "Do I have enough mana?", and "Do I already have this buff?". The calling code looks like this:
Code:
for spell in self.GetSpell():
if spell.CanUse():
target = self.game_state.GetTarget()
print("Casting %s->%s" % (spell.name(), target.name if target else "None"))
spell.use()
break
-
Post Thanks / Like - 1 Thanks
aeo (1 members gave Thanks to ioctl for this useful post)