ABCDEFGHIJKLMNOPQRSTUVWXYZ
1
The goal here, is to establish how much xp enemies should give - in a setting where players are expected to kill a lot of enemies back-to-back
2
It is almost certainly not worth pursuing absolutely perfect formulae, but this exercise will produce a solid baseline to start with
3
This should only take about an hour, but will replace an extremely lengthy and innacurate cycle of fiddling and playtesting
4
Anyways; the relevant factors to consider are how quickly a player can kill enemies, and how quickly they recover from fighting
5
There should be balance between an offensive player and a defensive player of the same general power
6
7
Assumptions:
8
- The player has enough max hp to survive any fight (And so player hp is irrelevant)
9
- Enemies have dps and hp that scales linearly to their level, and no damage mitigation whatsoever
10
- Player capabilities have been boiled down to effective average dps, and effective average hp healed/defended per second
11
- All sources of healing and damage mitigation are included in the player's hps score. A tank that takes no damage, is equivalent to a druid that regenerates their health
12
- This is of course a horrifying oversimplification, but there are a few reasons why it isn't so bad
13
- Primarily, a LOT can be done to obfuscate this kind of "internal stat", so players won't know it even exists to be used in these calculations
14
- Players are optimally grinding enemies at the optimal enemy level
15
- "Balance" is achieved when 1dps is just as valuable a 1hps, in terms of how quickly the player can sustainably gain xp
16
- The player gets the first hit, dealing damage before the enemy retaliates
17
- There is travel time between enemies
18
- Otherwise, it would probably always be optimal to fight enemies that die in one hit
19
- The optimal enemy to grind, is the strongest enemy the player can kill repeatedly without stopping
20
- Lower than this, the player is wasting their Phps. They could be pushing harder for free
21
- Higher than this will likely seem like better exp per second, but will be much more difficult and risky. Safe resting is not always available, nor will the player necessarily have enough max hp for high rest times to make sense
22
23
Combat will flow something like:
24
Player gets the first hit -> Player and enemy trade blows -> (Player stops to recover back to near full health ->) Player travels to the next enemy
25
- Because of our assumptions about optimal grinding, we will try to get the "Stop to recover" time to 0
26
27
Getting down to brass tacks:
28
First of all, let's start with some (P)layer stats
29
Pdps(Arbitrary)Self-explanatory
30
Phps(Arbitrary)
Previously discussed
31
Plvl(= Pdps + Phps)
To a very large extent, this value doesn't actually matter. It is just an estimate of the player's overall power
32
33
The (E)nemy has stats as well, of course
34
Elvl(To be figured out later)
As with player levels, this doesn't actually matter except as a guide for other stats. We could just as easily calculate enemy xp as a factor of enemy hp
35
Edps(= 2 * Elvl)
This ratio is wholly arbitrary
36
Ehp(= 15 * Elvl)
Also arbitrary, but different Ehp:Edps ratios will have different outcomes
37
Exp(= Unknown)
The unknown formula - the driving need for this spreadsheet!
38
39
It's about damn time
40
T(free)(= Min(Arbitrary, Ehp/Pdps))
The player's head start on the dps race. Cannot be greater than the time it takes for the enemy to die
41
T(trading)(= (Ehp / Pdps) - T(free))
Time spent trading blows before the enemy dies
42
T(rest)(= Max(Arbitrary, calculated))
Time spent resting between fights. Cannot be less than the travel time
43
T(total)(= T(free) + T(trading) + T(rest))Self-explanatory
44
45
Figuring out the player's optimal enemy level:
46
Damage(= T(trading) * Edps)
The enemy deals damage only during the trading-blows time
47
Healed(= T(total) * Phps)
The player's simplified hps is assumed to be active at all times
48
Now, of critical importance, Healed = Damage. (The player rests just enough that they aren't dying)
49
Our only independant variables are Pdps, Phps, Elvl, and T(rest)
50
Thus, any given combination of (Pdps, Phps, Elvl) will have a necessary T(rest) that can be calculated
51
This logically makes sense as the player resting between victories, whether they were easy or hard
52
For any given combination of (Pdps, Phps), we can force T(rest) to its previously-assumed optimal value (The minimum 0.5s), by fiddling with Elvl!
53
This logically makes sense as the player choosing the optimal enemy for their particular build
54
55
Elvl(Now we can figure it out!)
The actual math here is too complex to bother manually calculating. I just fiddle with the value until T(rest) gets near that 0.5s minimum. There are tools for this
56
Expps(Exp / T(total))
We can't calculate this yet, but we know we want it to be equal any time Plvl is equal
57
Exp(= Still unknown, but...)
This is still not worth trying to manually calculate, but we can give ourselves as many data points as we need to find a formula that works
58
By plonking in a bunch of arbitrary Pdps and Phps values, we can calculate everything up to Exp
59
All that matters now, is for Expps to be equal while Plvl is equal
60
From experience, I'd estimate we'll need something like (Exp = Elvl ^ (Something)). Obvious, I suppose, but we'll see if this kind of curve can give us balance
61
62
The actual table:
63
(Columns are in vaguely "makes sense" order, rather than the order they are calculated in. Check the first row for the formulae I've used)
64
Ehp / Elvl15PlvlPdpsPhpsElvlXp/sEhpEdpsExpT(trade)T(free)T(rest)T(total)DmgHealed(Healed without rest)
65
Edps / Elvl23020106.8315.43769128102.4513.6686.934811214.122510.5088355.63133556.3133556.3133551.225
66
First strike time130102011.0115.43741681165.1522.02263.702185615.51510.56701517.082015341.6403341.6403330.3
67
Travel time0.53015158.9217.16315082133.817.84161.67688077.9210.499529.42141.2928141.2928133.8
68
Magic number2.32430020010068.283255.1574521024.2136.5618318.846474.12110.50663765.6276376562.76376562.76376512.1
69
300100200110.13255.1771661651.5220.255604.9851715.51510.56701517.0820153416.4033416.4033303
70
30015015089.193618.5115911337.85178.3834082.760677.91910.49827489.4191412.591221412.591221337.85
71
300020001000682.78686390.028310241.71365.563862500.5914.1208510.5064179265.6272679265627.2679265627.2679265120.85
72
3000100020001100.96686389.348116514.42201.9211724033.7515.514410.56633382417.0807338234161.4676534161.4676533028.8
73
300015001500891.87762974.197913378.051783.747186225.0787.918710.4979012929.418714124.9019414124.9019413378.05
74
75
Results:
76
It's not perfect, but that is neither reasonable nor entirely desired
77
After all, this is all in service of finding sane starting values to refine after playtesting
78
One interesting discovery, as an implication of our starting assumptions, is that players with Phps close to their Phps, are a bit overly strong
79
This is probably because the player's overall power is some very mildly multiplicative factor of their dps and hps
80
Personally, I think this is great! It's not overbearingly strong, and opens up hybrid builds (Which usually have intangible added costs) as viable
81
These findings will change dramatically based on the actual values for Pdps and Phps. An exponential curve for Exp per Elvl will generally work so long as the player's overall power is some factor of Pdps*Phps and Plvl is calculated as Pdps + Phps