Mathematical Formulas for DPS and DPE
The maximum DamagePerSecond of an unenhanced attack is its DamagePerActivation. Activation is also called Cast Time.
A lot of data can be found http://tomax.cohtitan.com/data/ but I'm unsure how up to date that is.
What's missing there can be found in game using the Real Numbers.
Or are you asking for something completely different? I do all my attack chains by hand in excel.
Be well, people of CoH.

DPA, DPS and DPE are 3 seperate things to me. DPA is dp arcanatime + cast time. DPS is dp arcanatime + cast time + actual rechg and DPE is most obvious but that's looking at powers individually to first attain priority. Different attacks have the potential to hit a different amount so then there can be scaling involved. Secondary effects can help get a certain amount of extra efficiency.
He will honor his words; he will definitely carry out his actions. What he promises he will fulfill. He does not care about his bodily self, putting his life and death aside to come forward for another's troubled besiegement. He does not boast about his ability, or shamelessly extol his own virtues. - Sima Qian.
A lot of data can be found http://tomax.cohtitan.com/data/ but I'm unsure how up to date that is.
What's missing there can be found in game using the Real Numbers.
Or are you asking for something completely different? I do all my attack chains by hand in excel.
Different attacks have the potential to hit a different amount so then there can be scaling involved. Secondary effects can help get a certain amount of extra efficiency.
DPA = FinalDamage / (ArcanaTime + CastTime)
and
DPS = FinalDmage / (ArcanaTime + CastTime + FinalRecharge(in seconds)),
where ArcanaTime = [RoundUp(CastTime / 0.132) + 1] * 0.132 ?
I'm actually new to the term ArcanaTime. Had to Pwiki it.

Arcanatime is the adjusted cast time. You only use one of them.
So DPA = final damage/arcanatime
DPS should really only be used for a full chain, including any pauses that might be in that chain.
So DPS = Total chain damage/total arcanatime of chain
Be well, people of CoH.

I've recently been fiddling around with a Java-based algorithm for CoH to calculate the most efficient attack chain, given a set of attacks, based on Maximum Damage per Second, or Maximum Damage per Endurance (mostly as a programming exercise for myself).
|
Maximum DPE is going to be outrageously simple: take the most endurance efficient attack you've got (calculate DPE by dividing damage done by the endurance cost of the power) and use only that.
Maximum DPS is a substantially harder algorithm because you have to start accounting for wait times, specific power selection, and other things. I've done a lot of work on a similar program and there are still a lot of problems because it's not nearly as simple as you think it would be.
Sadly, I do not have access to the precise mathematical formulas to calculate DPS and DPE for a given attack. |
DPE is incredibly simple because it's just a matter of taking the damage the power does and dividing it by the endurance costs of the power. There isn't anything more complicated than that. In the program I'm working on, all I care about for DPE is the option to set a ceiling on the endurance consumption of an attack string so that, if an attack string is too end expensive, it won't consider it.
If you're not familiar with Arcanatime (i.e. how much time powers actually take up), you may want to familiarize yourself with this formula:
(roundUp(baseTime/.132)+1)*.132
Take the listed animation time of a power, divide it by .132 (which is the length of a single server "tick"), round that value to the next highest integer, add 1, and then multiply by .132. What this does is account for the fact that the server checks on your actions and states in discrete time periods and has to set aside a single frame for your state to change from finished to ready.
Yeah something like that but DPS differs to DPA possibly just to me though. I was doing this stuff long before Mids and thats how I differentiated things to get what I wanted to know.
He will honor his words; he will definitely carry out his actions. What he promises he will fulfill. He does not care about his bodily self, putting his life and death aside to come forward for another's troubled besiegement. He does not boast about his ability, or shamelessly extol his own virtues. - Sima Qian.
Thanks a lot guys! I think I'm starting to tie some knots.
Maximum DPS is a substantially harder algorithm because you have to start accounting for wait times, specific power selection, and other things. I've done a lot of work on a similar program and there are still a lot of problems because it's not nearly as simple as you think it would be.
So far, this what I'm thinking (algorithm wise) so far, for simple, standard attacks. This means all regular attacks that deal a fixed amount of damage to an enemy; no DoTs, no Criticals, no special damage types, no Defense/Resistance calculations, no "Nukes" or other "special" attacks.
Given a set of standard attacks, with pre-defined Damage, Recharge, and Activation (Cast) time, we find the attack chain as such:
1. Take the power with highest damage (we'll call this power "Alpha"). Cast that.
2. Take the power with the next highest damage that is recharged. Cast that.
3. So on and so forth until the total amount of (Recharge + Activation) of all powers that have been cast is greater than or equal to the Recharge time of "Alpha". This means Alpha is recharged, and the last attack used is the finisher of the attack chain, from which point you can go back to Step 1.
The algorithm is pretty simple. Or at least I hope it is, cause this is what I do in the actual game mentally. Converting this into code, however, can be a little tricky, but not difficult.
PS: For this algorithm, I don't even need the DPS/DPA value for the attacks. The formula for DPS/DPA come in handy for calculating the total DPS of an Attack Chain. The next step would be incorprating things like accuracy, DoTs, etc.
Edit: Also, my algorithm assumes that all attacks SHOULD be used. I can see how it'd be challenging to pick out an attack that would LOWER the total DPS.

As far as I'm concerned, DPS refers to the damage that a full attack string deals divided by the entire duration of the attack string in question. DPA refers to the damage that a single attack deals divided by the time that it takes to animate. They're both functions of damage over time, so it's a reasonably semantic argument, but, as I see it, DPS is an end value whereas DPA is a derivative value that assists in calculation and optimization.
|
He will honor his words; he will definitely carry out his actions. What he promises he will fulfill. He does not care about his bodily self, putting his life and death aside to come forward for another's troubled besiegement. He does not boast about his ability, or shamelessly extol his own virtues. - Sima Qian.
I know about City of Data. I'm actually asking for the raw formulas, though. So, DPA = FinalDamage / (ArcanaTime + CastTime) and DPS = FinalDmage / (ArcanaTime + CastTime + FinalRecharge(in seconds)), where ArcanaTime = [RoundUp(CastTime / 0.132) + 1] * 0.132 ? I'm actually new to the term ArcanaTime. Had to Pwiki it. |
[Edit:] I also prefer to use DPS only for chains. I use DPC (Damage Per second of Cycle time) for what you're terming DPS.
Kosmos
Global: @Calorie
MA Arcs in 4-star purgatory: Four in a Row (#2198) - Hostile Takeover (#69714) - Red Harvest (#268305)
Another thing Bright Shadow is that there used to be a Sherksilvers herobuilder with which you could do attack chains on. It leaned towards how many attack chains you could do to the endurance bar. Attack powersets back then looked more partially balanced to how much damage you can do to an endurance bar rather than burst. I say partially because if you had a secondary effect you basically did less damage. People tended to be only interested in burst and maintaining that burst and of which there was more of a limit to with SOs.
He will honor his words; he will definitely carry out his actions. What he promises he will fulfill. He does not care about his bodily self, putting his life and death aside to come forward for another's troubled besiegement. He does not boast about his ability, or shamelessly extol his own virtues. - Sima Qian.
But honestly, this is just for me to practice my Java skills. I needed a project, why not make something half-useful.

So far, this what I'm thinking (algorithm wise) so far, for simple, standard attacks. This means all regular attacks that deal a fixed amount of damage to an enemy; no DoTs, no Criticals, no special damage types, no Defense/Resistance calculations, no "Nukes" or other "special" attacks.
|
That's just simplifying the damage of the powers and I agree with it as such. The problem with this is that you're making it painfully simple to such an extent that it's only useful to only some powersets. Criticals are rather simple to account for because they're just a chance for something to occur and it doesn't have any effect upon anything later on in the string, so I'm not entirely sure why you'd skip over them. The big problem is when you attempt to calculate attack strings for sets like Sonic Blast, Claws, or Dual Blades because they rely on stacking up -res debuffs and +dam buffs, respectively, to achieve their levels of damage. The same problem applies to doing attack string calculations for Blasters thanks to Defiance. Of course, the number of sets that you would exclude aren't that great, but they're still problematic.
Given a set of standard attacks, with pre-defined Damage, Recharge, and Activation (Cast) time, we find the attack chain as such: 1. Take the power with highest damage (we'll call this power "Alpha"). Cast that. 2. Take the power with the next highest damage that is recharged. Cast that. 3. So on and so forth until the total amount of (Recharge + Activation) of all powers that have been cast is greater than or equal to the Recharge time of "Alpha". This means Alpha is recharged, and the last attack used is the finisher of the attack chain, from which point you can go back to Step 1. The algorithm is pretty simple. Or at least I hope it is, cause this is what I do in the actual game mentally. Converting this into code, however, can be a little tricky, but not difficult. |
is that it is oftentimes more effective to use an attack with a lower DPS that activates quickly to space out 2 other attacks that have higher DPS. This is how we get attack strings like GD>GC>SD>GC. Your algorithm would come up with GD>SD>GC>SotW, which is less effective. There is also the problem of wait times often being better for your attack string than simply activating another power automatically. With many powersets, like Fire Blast, it's actually better to simply wait half of a second to use Blaze again rather than using Flares because of the huge difference in the DPAs between the two powers.
If it were as simple as simply using a priority list, a decent attack string calculator would have been made a good long while ago. Hell, the fact that Starsman uses attack priority lists rather than attack strings is one of the biggest problems I have with his analysis since, beyond the most basic levels of recharge, priority lists are useless.
The methodology I plan on using is threefold: I would have one algorithm that simply generates attack strings in a brute force method (i.e. it doesn't attempt to do any calculations aside from determining whether a specific attack is available for use at the time), another that determines if the attack string in has all powers recharging appropriately (and, with a bit more work, apply -res and +dam buffs from things like Defiance), and another that simply calculates the DPS of the attack string in question.
The three algorithms will work by simply creating every possible attack string possible, one at a time (including the base attack "Wait" with an animation time of .132 and a recharge time of 0), and then comparing them to the current best (so that it doesn't take up a crapload of memory). Honestly, as far as I can tell, this is the only way to make sure that you can reliably get the best attack strings for sets. Priority and algorithmic generation methods simply have too many exceptions for me to put much faith in them.
You do have a point. And It seems your method is purely Brute Force, which is...well...brute force. My method is more centered around "simulating" a combat scenario. And the reason for that is because I plan on expanding this further. The attack-chain calculator would be a part of it. As for simplicity of my requirements...again, this is just my baby step!
Also, thanks for the tip on the whole "wait" scenario. I forgot to take that into account. I think it'd still be possible though.
As for calculating -RES, the quickest idea that comes up to my mind would be to simply increasing the damage of all attacks for the duration of the -RES effect. *shrug* Just something to think about.
Either way, since we seem to be working on similar goal through different paths, feel free to PM me. I'd be happy to exchange ideas with you.

I think in the end interpreting the data will be harder than the coding.
One of the big things people do right now is average unreliable damage. They'll look at Fire Blast, for example, find the average amount of damage the DoT does, and use that as the DPA.
The problem is that Fire Blast doesn't actually do that DPA. It does some number between the highest and lowest possible damage in a range. 200 DPA from a Fire Blast power compared to 200 from another power mean two different things, but they are often compared as if they are the same.
To illustrate, imagine a Power X that when fired did between 1 and 500 points of damage. The average damage this power does is 250. But it doesn't actually do 250 damage; the odds of that happening are 1/499. Compared to Power Y that reliably does 250 damage, there is about a 50% chance that Power X does less damage and 50% chance it does more. This may not sound relevant at all, but on some of the very strong attacks (e.g. Blaster third tier blasts) that one attack could eliminate a minion instantly. This basically turns the power into a "Save vs Death Ray." The value of such a power is that, if we assume a standard target has 400 Hp, 1 in 5 shots of Power X will end the fight instantly, while Power Y never will.
One of the big things people do right now is average unreliable damage. They'll look at Fire Blast, for example, find the average amount of damage the DoT does, and use that as the DPA.
The problem is that Fire Blast doesn't actually do that DPA. It does some number between the highest and lowest possible damage in a range. 200 DPA from a Fire Blast power compared to 200 from another power mean two different things, but they are often compared as if they are the same.
To illustrate, imagine a Power X that when fired did between 1 and 500 points of damage. The average damage this power does is 250. But it doesn't actually do 250 damage; the odds of that happening are 1/499. Compared to Power Y that reliably does 250 damage, there is about a 50% chance that Power X does less damage and 50% chance it does more. This may not sound relevant at all, but on some of the very strong attacks (e.g. Blaster third tier blasts) that one attack could eliminate a minion instantly. This basically turns the power into a "Save vs Death Ray." The value of such a power is that, if we assume a standard target has 400 Hp, 1 in 5 shots of Power X will end the fight instantly, while Power Y never will.
Thanks, though. This is another thing that would be important, and I might've overlooked down the road.

I did mine in Python.
What I did was created a class object that was initialized by a list of lists (where the powerset info is located). I drop this guy into one of two types of functions. One determines the best chain. The other determines time to kill opponents of X def, Y res, etc.
In attack chain function I start a timer with 0.01s increments (not real seconds btw). I then pick out random powers in the set and fire them off, keeping track of activation times, recharge times, accumulated damage etc; remembering the attack chain with the highest damage. I suppose I could have created a mega big matrix with all the parameters, but was too lazy. I'm being very brief in my explanation btw.
I was more interested in determining the best attack chain against an opponent. So, I would have my hero object, with powers, 'fight' another hero object with def, res and hp. Since the attack chain function keeps track of buffs and debuffs, it was interesting to see some powersets sneak ahead of others despite their apparent lack of DPS on paper.
Dark Bard, Zoobait, Debacle
jmsb
Por vezes d� vontade...
chucknorriss
speak american godamnit
What I did was created a class object that was initialized by a list of lists (where the powerset info is located). I drop this guy into one of two types of functions. One determines the best chain. The other determines time to kill opponents of X def, Y res, etc.
In attack chain function I start a timer with 0.01s increments (not real seconds btw). I then pick out random powers in the set and fire them off, keeping track of activation times, recharge times, accumulated damage etc; remembering the attack chain with the highest damage. I suppose I could have created a mega big matrix with all the parameters, but was too lazy. I'm being very brief in my explanation btw.
I was more interested in determining the best attack chain against an opponent. So, I would have my hero object, with powers, 'fight' another hero object with def, res and hp. Since the attack chain function keeps track of buffs and debuffs, it was interesting to see some powersets sneak ahead of others despite their apparent lack of DPS on paper.
Over the summer, I plan on making a "fight simulator". Which would take a character with user-defined stats, put it against another character, and then instantly determines who would win based on all factors involved, with the most efficient attack chain. That's what I'm shooting for. Where I'd land is a different story!
My psuedo-code seems to be very similar to yours too. Except I don't have an incrementing timer. I have a clock mechanism that just uses sums of Recharges and Activations to keep track of time.

Over the summer, I plan on making a "fight simulator". Which would take a character with user-defined stats, put it against another character, and then instantly determines who would win based on all factors involved, with the most efficient attack chain. That's what I'm shooting for. Where I'd land is a different story! |
I'm a Software Engineering student, and sadly, in my program, they rarely give us any practical stuff to work on so we can get a little more hands on experience. So that's where the incentive comes from.
As for useful information; it depends. The way I envision it, it would only be useful to someone who finds purely theoretical numbers useful. There is a lot more to combat in this game than pure numbers; things that are either impossible, or beyond the capacity of a project done by a lone girl. The system would be assuming a lot of pre-defined conditions, and it may INSPIRE new strategies or build tweaks; but not dictate.

That's pretty much my ultimate goal. Over the summer, I plan on making a "fight simulator". Which would take a character with user-defined stats, put it against another character, and then instantly determines who would win based on all factors involved, with the most efficient attack chain. That's what I'm shooting for. Where I'd land is a different story! My psuedo-code seems to be very similar to yours too. Except I don't have an incrementing timer. I have a clock mechanism that just uses sums of Recharges and Activations to keep track of time. |
Dark Bard, Zoobait, Debacle
jmsb
Por vezes d� vontade...
chucknorriss
speak american godamnit
You do have a point. And It seems your method is purely Brute Force, which is...well...brute force. My method is more centered around "simulating" a combat scenario. And the reason for that is because I plan on expanding this further. The attack-chain calculator would be a part of it. As for simplicity of my requirements...again, this is just my baby step!
![]() |
I have no problem saying that I plan on my number cruncher to be just what I call it: a number cruncher. I don't plan on creating anything more complex based off of it like a fight simulator so I'm fine using a brute force approach if that's what allows me to achieve accurate results. I'd like to be able to use an algorithmic approach because it's substantially more efficient and elegant (in fact, I use what can honestly be coined as a very complex algorithm in my own construction of attack strings using pencil, paper, and calculator), but a lot of this comes from the problem that there are simply too many different potential problems with the pseudo-algorithm I use. If I can get the brute force calculator done so that I know what it puts out is the best, I can start working to get a more simple and elegant solution that doesn't use up quite as many resources and begin testing it against the brute force approach.
Also, thanks for the tip on the whole "wait" scenario. I forgot to take that into account. I think it'd still be possible though. |
As for calculating -RES, the quickest idea that comes up to my mind would be to simply increasing the damage of all attacks for the duration of the -RES effect. *shrug* Just something to think about. |
Either way, since we seem to be working on similar goal through different paths, feel free to PM me. I'd be happy to exchange ideas with you. ![]() |
I'd have a whole summer to do it. Besides, it's my ultimate goal. I may not get as close to it as I'd want. I just like challenges. ![]() I'm a Software Engineering student, and sadly, in my program, they rarely give us any practical stuff to work on so we can get a little more hands on experience. So that's where the incentive comes from. As for useful information; it depends. The way I envision it, it would only be useful to someone who finds purely theoretical numbers useful. There is a lot more to combat in this game than pure numbers; things that are either impossible, or beyond the capacity of a project done by a lone girl. The system would be assuming a lot of pre-defined conditions, and it may INSPIRE new strategies or build tweaks; but not dictate. |
Well, I mean it's certainly feasible to determine who wins in a contest where they both stand there punching each other, and there might be some useful data about attack/defense balance there (for Scrapper v. Scrapper, Tank v. Scrapper, Scrapper v. Tank, either v. Brute, etc) but it's about the same as the Pylon Challenge. The problem is that the idea starts running into issues as soon as you have two characters who fight at different ranges such that one makes an active effort to maintain distance (Blaster v. Scrapper). This starts getting less and less feasible the further your options get from a straight slugfest. A /dev blaster using caltrops, smokebomb + cloaking device, and so on is going to be a nightmare to model, as will just about any AT with access to defender or controller sets.
|
Right. I mean let's look at the problem with Controllers right off the bat.
A Controller does double damage if the enemy is held, slept, stunned or immobilized. Therefore, the Controller should ideally do one of these things to start out the fight. Immediate issues arise in calculating DPA and DPS of an attack chain:
- Minions and Lts will tend to get mezzed in one shot, but bosses take 2, UNLESS you score an Overpower OR open with a mag 4 single target immob
- Sleep will only let you get one double-damage shot in
- The opening attack has (at a minimum) a 5% chance to miss. If it does miss, the enemy is not mezzed, so continuing with the attack chain could be a waste. You could still salvage the attack chain IF you have some other mezz available and IF that enemy is a minion or lt or you get lucky with a boss and IF the power you need to do the mezz isn't a later part of the attack chain itself.
- If the Controller happens to be Fire, he has access to Hot Feet. The DPA on Hot Feet is infinity, so it puts out as much damage in theory as allowable during the DPS period measured. However, it also does double damage when the enemy is mezzed...
- Fire Control applies DoT damage similar to Fire Blast, with all the attendant problems of measuring a DoT that does a range of damage instead of predictable
- Against an AV you may be able to get Containment 50% of the time when triangles are down, it's doubtful the rest of the time. So, at a minimum, a Controller needs to know both the mezzed and not-mezzed damage of its powers.
I think you're brave for taking on this project. I don't mean to be a naysayer, just want to show why DPA and DPS are much trickier than is often supposed by the charts people post.
I've recently been fiddling around with a Java-based algorithm for CoH to calculate the most efficient attack chain, given a set of attacks, based on Maximum Damage per Second, or Maximum Damage per Endurance (mostly as a programming exercise for myself).
Sadly, I do not have access to the precise mathematical formulas to calculate DPS and DPE for a given attack.
Can anyone point me in the right direction? Where can I find these formulas, and other formulas for other game attributes?
Any help would be appreciated!