Combat Log

From OuroDev

Disclaimer : This is written mostly in the perspective of making the Combat Log a better interface for addons. Right now the combat log is the only way to get information out of the client, bar directly reading values in memory CheatEngine-style.

Main problem : variance

Here is a few examples of combat log lines :

Player/Pets inflicting damage :

You blast Warrior with your Enhanced Water Jet for 11.74 points of Smashing damage and reduce their defense!
You drench Warrior with your Enhanced Water Jet for 44.05 points of Cold damage.
Your Apprentice Charm hits Resistance Recruit for 13.1 points of energy damage!
Your Spectral Wounds convinces Longbow Guardian that they took 13.42 points of damage.
Your Reactive Interface continues to burn for 13.38 points of fire damage!
Corruption deals 1.59 additional points of Toxic damage as hellfire sears Warrior!

Player/Pets taking damage :

Sibyl's Shadowstar continues to drain you, dealing 60.13 points of negative energy damage.
Keres creates a Circle of Death which points of lethal damage and reduces your movement and attack speed!
You choke on poison Spores for 5.9 points of Toxic damage.
Weak Fire Goblin burns you with their Incinerate for 2.92 points of fire damage!

All of those express the same thing : [Entity 1] used [Ability] on [Entity 2] and dealt [damage] But they all do it in a different way, which make parsing extremely hard. This is a problem for any application/addon wanting to interface with the client via the combat log.

The lines aren't random. The same ability used in the same circumstance will always result in the same formulation. Some of them are very common (the first two examples seem to be some sort of "default"), but some are used by a single ability/monster (I never spotted the "Keres" example anywhere else - and it's bugged). Having all those ability use the same type of line would allow for much easier and foolproof parsing.

Second problem : other players aren't there

Here are "non-player main actor" log lines :

Bob: Bob hits Weak Fire Goblin with their Photon Grenade for 43.72 points of energy damage!
Bob: You disorient Weak Fire Goblin with your Photon Grenade!
Flames: Your flames burn Common Fire Goblin for 7.86 points of fire damage.

Bob & Flames are respectively a robot henchmen, and a "patch of fire" pseudo-pet. The combat log currently *can* output lines for entities that aren't the player, using the "EntityName: " prefix. It however doesn't do it for other players' data, despite the client knowing what is happening to them. Having nearby and/or team players' activity in the combat log would be useful, even if their data become sometime unavailable due to distance/zoning/etc.

Third problem : identification

The logs currently use names without any markup nor tag (outside of "Bob: " and "Flames: " to indicate the rest of the line is a pet's one) This has three problems :

  • It make it harder for parsing, as names are allowed to take multiple words so you can never know in advance where it will start or finish.
  • Player/Pets names can conflict with parsing rules and be wrongfully recognized as a keyword for something else.
  • More importantly feature-wise : there is no way to differentiate two entities with the same name.

Adding some form of markups would help tremendously for parsing : <Bob>, <Weak Fire Goblin>, <Sibyl>, {Enhanced Water Jet}, {Circle of Death} Adding an ID for entities would allow to track them individually : <Resistance Recruit@1234>, <Resistance Recruit@1235>, <Longbow Guardian@666> Entities already have some sort of ID in the client, since it can manage several monsters with the same name.

Actual characters used won't really matter but : Already in use for punctuation : " , . ! " Already in use for numbering : " , . " Already in use as pseudo-pet-tagging : " : " Already in use as chat-tagging : " [ ] "

Extension : buff/debuff tracking

Some buff/debuff are indirectly told :

Protector Bot protects you from all attacks with a Force Shield.
You gain Tidal Power!
Frost Shamaness chills you with an Ice Blast for 37.58 points of cold damage and slows your movement and attack speed.
Ancient of Sorrow scorns you with a Mournful Blast for 75.17 points of energy damage and reduces your defense!

The first two *could* be worked with, since the buff name is know - so it's possible to manually find their duration and deduce when they will end.
The second two aren't really usable.
There is a lot of buff/debuff that simply don't show up in the log at all.
Activating tooggles often show no messages either.

Having a new type of line would simplify everything :

  • One to indicate that [Entity] gained an instance of [Buff/Debuff] for [Duration]
  • One to indicate that [Entity] lost and instance of [Buff/Debuff] - for those that can be consumed early, like Tidal Power

The player's GUI display all active buff and debuff, so there is some sort of 'common point' from where all those events could be extracted. I'm not sure if such a common point exist for non-player entities. As previously, getting the buff's internal ID on top of its name would avoid problems when two players use the same powerset.

Clean and complete buff/debuff tracking would allow addons to simplify the job of control/buff based powerset, who could time their abilities properly instead of guessing refresh times. Accurate buff tracking could also be a game changer for powersets that rely on additional resources stored as buff (Water/ and Savage/, for example). Accurate buff/debuff tracking on other players would allow better coordination between supports in task forces (especially those with "Clear Mind" abilities that can remove CC on others, if only they could *know* about it in the middle of a big fight)