Back when I played World of Warcraft, I used to solo my way through heroic Sethekk Halls once per day in order to fight Anzu, in the hopes of earning the ultra-rare Raven Lord mount. \u00a0I eventually stopped trying after twenty or thirty runs; \u00a0I just got bored. \u00a0Anzu followed precisely the same attack script every time; \u00a0once I’d learned how to reliably handle that attack sequence, fighting him got really dull. \u00a0And even so, World of Warcraft’s bosses are typically far more interesting and elaborate than its more usual monsters.<\/em><\/p>\n<\/p>\n
In MMORPG Tycoon 2, I’ve set up monsters to execute all of their available attacks one at a time, in order. \u00a0If a monster has run out of attacks which it can use from its current position (that is, if they’re all on cooldown), then it will come closer, until it’s within range of its currently available attacks, or until its longer-ranged attacks recharge.<\/p>\n
I’ve also fixed things so that when you’ve taken control of an in-game character, you can be killed by monsters. \u00a0You respawn at a graveyard, just like the regular subscribers do. \u00a0(Previously, you were sent to the graveyard, then immediately teleported back to where you had been when you died)<\/p>\n
Finally, I’ve hooked things up so that players can use healing abilities on themselves, if they’re in danger of dying. \u00a0In the event that players have two or more health-like attributes (ones which result in bad things happening if they run out — typically death), then they’ll prioritise their healing based upon which attribute is nearer to running out. \u00a0Just like with the attacks, they’ll select the stronger and faster healing abilities, when available.<\/p>\n
Note that currently, the player AI is operating in a very simplistic fashion; \u00a0a player goes into one of two “modes”; \u00a0either “I want to heal”, or “I want to attack”. \u00a0Player AI is not yet smart enough to choose to use a “drain life” sort of move which sucks health from an enemy into himself, when he could instead use a dedicated healing ability which would heal himself more quickly, or a dedicated attack which would deal damage more quickly. \u00a0Similarly, it’s not yet smart enough to correctly handle a healing spell which drains one “health” value in order to heal a different “health” value. \u00a0I’m not aware of any MMOs which actually have this type of ability (although plenty have abilities which convert health into mana), but it’s easily possible to do in MT2. \u00a0It will take a little more work to build a more holistic AI which is capable of advancing toward multiple goals simultaneously (“I want to damage the enemy as much as possible, while also healing myself if necessary”), instead of the current state-based one.<\/p>\n
But honestly, the state-based one is probably good enough for everyone except for me, so I’ll go with it at least for the next milestone. \u00a0:)<\/p>\n
Incidentally, watching the players and monsters mutually attacking each other for the very first time (shown in the screenshot above) was kind of amusing; \u00a0all the combat abilities were still set as Damage-Over-Time attacks, and so regardless of which (player or monster) died first, the other would die a few seconds later, as the stacked DoT effects continued to deal damage long after the fight had ended.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"Okay, I’ve got the monsters attacking subscribers, now, using the fancy new fully-customisable combat model. Folks have asked me, both here and in person, why the monsters couldn’t just use the combat AI that I’ve already written for the players. \u00a0And the reason is a philosophical one. \u00a0See, in an MMORPG, players always try to…<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[24,25],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/po9WK-rG","_links":{"self":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/posts\/1716"}],"collection":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/comments?post=1716"}],"version-history":[{"count":0,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/posts\/1716\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/media?parent=1716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/categories?post=1716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/tags?post=1716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}