| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 / Elvl | 15 | Plvl | Pdps | Phps | Elvl | Xp/s | Ehp | Edps | Exp | T(trade) | T(free) | T(rest) | T(total) | Dmg | Healed | (Healed without rest) | |||||||||
65 | Edps / Elvl | 2 | 30 | 20 | 10 | 6.83 | 15.43769128 | 102.45 | 13.66 | 86.93481121 | 4.1225 | 1 | 0.508835 | 5.631335 | 56.31335 | 56.31335 | 51.225 | |||||||||
66 | First strike time | 1 | 30 | 10 | 20 | 11.01 | 15.43741681 | 165.15 | 22.02 | 263.7021856 | 15.515 | 1 | 0.567015 | 17.082015 | 341.6403 | 341.6403 | 330.3 | |||||||||
67 | Travel time | 0.5 | 30 | 15 | 15 | 8.92 | 17.16315082 | 133.8 | 17.84 | 161.6768807 | 7.92 | 1 | 0.49952 | 9.42 | 141.2928 | 141.2928 | 133.8 | |||||||||
68 | Magic number | 2.324 | 300 | 200 | 100 | 68.28 | 3255.157452 | 1024.2 | 136.56 | 18318.84647 | 4.121 | 1 | 0.5066376 | 5.6276376 | 562.76376 | 562.76376 | 512.1 | |||||||||
69 | 300 | 100 | 200 | 110.1 | 3255.177166 | 1651.5 | 220.2 | 55604.98517 | 15.515 | 1 | 0.567015 | 17.082015 | 3416.403 | 3416.403 | 3303 | |||||||||||
70 | 300 | 150 | 150 | 89.19 | 3618.511591 | 1337.85 | 178.38 | 34082.76067 | 7.919 | 1 | 0.4982748 | 9.419 | 1412.59122 | 1412.59122 | 1337.85 | |||||||||||
71 | 3000 | 2000 | 1000 | 682.78 | 686390.0283 | 10241.7 | 1365.56 | 3862500.591 | 4.12085 | 1 | 0.506417926 | 5.627267926 | 5627.267926 | 5627.267926 | 5120.85 | |||||||||||
72 | 3000 | 1000 | 2000 | 1100.96 | 686389.3481 | 16514.4 | 2201.92 | 11724033.75 | 15.5144 | 1 | 0.566333824 | 17.08073382 | 34161.46765 | 34161.46765 | 33028.8 | |||||||||||
73 | 3000 | 1500 | 1500 | 891.87 | 762974.1979 | 13378.05 | 1783.74 | 7186225.078 | 7.9187 | 1 | 0.497901292 | 9.4187 | 14124.90194 | 14124.90194 | 13378.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 |