I was asked a question about Shards attack system on the spring engine lobby server. Having described Shards attack system, I decided to repost the log here for posterity
[20:19:31] <[Mr]Peanus_Butter> yo its#fhh£hu@4545, just a few questions about shard if you've a moment [20:19:41] oh rly? [20:20:10] <[Mr]Peanus_Butter> i'm wondering how shard determines threats or enemy positions... how does it choose how to attack basically [20:20:27] <[Mr]Peanus_Butter> i know it waits until a certain number of units are massed [20:20:33] <[Mr]Peanus_Butter> but how does it decide where to go? [20:20:37] the files in question are attackhandler.lua and attackerbehaviour.lua [20:20:46] <[Mr]Peanus_Butter> just a sec, i make open [20:20:55] when the unit is built [20:21:07] behaviourfactory looks at the behaviours table and loads the ones specified [20:21:13] if no entry is found [20:21:25] it looks to see if the unit is in the attackerslist table [20:21:32] and adds the attackerbehaviour [20:21:45] the attackerbehaviour then acts kind of like a conscripted soldier at home [20:21:58] it fires off an event registering its presence to the attackhandler [20:22:09] attackhandler then saves it in a table and does a check [20:22:23] if the queue of waiting attackers in the list is above a threshold [20:22:28] it removes them from the queue [20:22:36] and starts looking for a target [20:22:48] it iterates through every enemy on the map [20:22:55] <[Mr]Peanus_Butter> ok i'm going to need a DL link, apparently i havent got it on this computer [20:22:59] adding its position to a counter on a grid [20:23:08] <[Mr]Peanus_Butter> (still listening, thx for this) [20:23:23] when all the units are categorised, it picks the grid sector with the lowest nonzero value [20:23:45] this is how AAI, and NTai chose their targets [20:23:53] only AAI and NTai chose the highest [20:23:56] not the lowest [20:24:02] NTai had a lot of other twists also [20:24:04] <[Mr]Peanus_Butter> so the choice of area to send attackers to is -not- actually using a threatmap, but a similar behavior, looking for a weak point [20:24:24] those 2 AIs did the targeting loop every few frames and added it to a heatmap that decayed [20:24:34] its more instantaneous and reactive [20:24:37] no lingering threats [20:24:45] rather simple if I do say so [20:24:53] when an enemy target is found [20:25:01] <[Mr]Peanus_Butter> hmmmm [20:25:04] the attackhandler orders the attackerbehaviour to attack [20:25:13] a fight command is sent to the position [20:25:20] and the attacker is now left ot its own devices [20:25:27] and si out of the loop [20:25:43] when the attackerbehaviour recieves a unitIdle event for the attacker [20:25:52] the assumption is that there is nothing for it to do [20:26:01] so it assigns the attacker as in waiting [20:26:08] and repeats the whole process from the beginning [20:26:23] <[Mr]Peanus_Butter> well it sounds pretty efficient [20:26:23] a nice and simple 'new' unit goes in [20:26:26] attacker comes out [20:26:53] <[Mr]Peanus_Butter> attacking a weakpoint seems like a better strategy than attacking the strongest point [20:26:58] I have further optimisations to make to the algorithm to make it pluggable [20:27:13] you have IK to thank for that insight [20:27:15] but [20:27:23] I intend to make it a choice in future [20:27:27] like supcom [20:27:33] cull weakest vs attack strongest [20:28:22] do you mind if I repost this as a blog post? [20:28:41] <[Mr]Peanus_Butter> yeah for sure; its helpful knowing how it works [20:29:15] <[Mr]Peanus_Butter> i'm playing with a survival game idea with car and bob and wombat and a few others; trying to learn what i can about the various AI behaviours in spring [20:29:26] note [20:29:31] that the entire attacking system can be either [20:29:33] sidestepped [20:29:35] or replaced [20:29:53] all it would take is either your own behaviours, thats then assigned to attacker units [20:29:54] or [20:30:05] <[Mr]Peanus_Butter> the other day I was testing shard against some other AI I've forgotten which and noticed the difference in attacking weak vs strong; i attributed it to a difference in threatmapping, but now i am wiser [20:30:07] put your own attackerhandler and attackbehaviour in your games subfolder [20:30:21] Shards Lua VM is set to ignore the main files if one is present in a game subdir [20:30:29] so itll be as if ym implementation never existed [20:30:55] or you can have different units use differing attack systems