|
Post by neil on May 11, 2021 10:51:20 GMT
A comment on RPG.net about Blue Planet was "the setting's good but the system has really lethal combat." I though I'd test that. I simulated a few hundred thousand damage rolls to see what the results are. See below. I simulated somone being hit by an attack up to five times. I ended the simulation if the target failed a stun save, or failed a trauma save by 5 (instant death), or survived 5 attacks. I didn't bother tracking whether an injury would be eventually fatal, as that would happen well after the fight. I did the simulations for a range of attributes (treating them all the same value) and a range of damage ratings. The code to generate this is in the post below. Assumptions: damage rating can never be modified below 1, but can be higher than 10. Target numbers for stun and trauma rolls can go below 1 (making them impossible to succeed) and above 10 (making them impossible to fail). How long did fights last?For each attribute value and damage rating, this is the percentage of fights that lasted a particular duration. For instance, with attribute -2 hit by DR6 attacks, the target is taken out in the first round in 83% of combats, and never survives to round 4. There's a lot of numbers, but you can see that even small changes in attribute and damage rating make a big difference. | duration | 1 | 2 | 3 | 4 | 5 |
---|
attr | dr | | | | | |
---|
-2 | 2 | 30 | 21 | 15 | 10 | 24 |
---|
4 | 55 | 25 | 11 | 5 | 4 |
---|
6 | 83 | 14 | 2 | 0 | 0 |
---|
8 | 100 | 0 | 0 | 0 | 0 |
---|
10 | 100 | 0 | 0 | 0 | 0 |
---|
0 | 2 | 5 | 5 | 5 | 4 | 81 |
---|
4 | 19 | 15 | 12 | 10 | 45 |
---|
6 | 34 | 23 | 15 | 10 | 18 |
---|
8 | 53 | 25 | 12 | 6 | 5 |
---|
10 | 67 | 22 | 7 | 2 | 1 |
---|
2 | 2 | 1 | 1 | 0 | 1 | 98 |
---|
4 | 3 | 3 | 2 | 3 | 89 |
---|
6 | 9 | 9 | 7 | 7 | 67 |
---|
8 | 18 | 15 | 12 | 10 | 45 |
---|
10 | 29 | 20 | 14 | 11 | 26 |
---|
4 | 2 | 0 | 0 | 0 | 0 | 99 |
---|
4 | 0 | 0 | 0 | 0 | 99 |
---|
6 | 1 | 1 | 1 | 1 | 96 |
---|
8 | 4 | 3 | 4 | 3 | 87 |
---|
10 | 8 | 6 | 7 | 6 | 74 |
---|
To give a clearer view on what's happening, here are the results for just attribute = 2 (and changing DR) and DR = 6 (and changing attribute). I picked those as being "typical PC" and "large calibre handgun". As you can see, the changes in attribute and damage rating make a huge difference for how a fight plays out. I think it also explains the comment that "combat is deadly." For typical PCs, there's a reasonable chance that they'll be taken out by the first hit. That's not the case in systems that use HPs or Stress, where you can expect to take a few blows before being at risk of being taken out. Whether that's a bug or a feature is another question... More detail below...
|
|
|
Post by neil on May 11, 2021 11:07:13 GMT
Continuing.... With all this data, there's a couple of other things to look at. Worst woundOne is the worst wound suffered, as that affects how long characters take to recover after taking damage. This table is split between "target was taken out" and "target was still acting after five rounds". | survived | False | True |
---|
| worst_wound | Serious | Critical | None | Minor | Serious | Critical |
---|
attr | dr | | | | | | |
---|
-2 | 2 | 66 | 17 | 0 | 12 | 5 | 0 |
---|
4 | 61 | 37 | 0 | 1 | 1 | 0 |
---|
6 | 38 | 62 | 0 | 0 | 0 | 0 |
---|
8 | 0 | 100 | 0 | 0 | 0 | 0 |
---|
10 | 0 | 100 | 0 | 0 | 0 | 0 |
---|
0 | 2 | 21 | 2 | 3 | 54 | 18 | 1 |
---|
4 | 47 | 17 | 0 | 11 | 21 | 4 |
---|
6 | 47 | 42 | 0 | 1 | 6 | 5 |
---|
8 | 26 | 71 | 0 | 0 | 0 | 2 |
---|
10 | 0 | 100 | 0 | 0 | 0 | 0 |
---|
2 | 2 | 3 | 0 | 21 | 66 | 9 | 0 |
---|
4 | 11 | 2 | 4 | 54 | 27 | 3 |
---|
6 | 27 | 13 | 0 | 10 | 37 | 13 |
---|
8 | 28 | 36 | 0 | 1 | 14 | 22 |
---|
10 | 16 | 66 | 0 | 0 | 1 | 18 |
---|
4 | 2 | 1 | 0 | 20 | 66 | 12 | 0 |
---|
4 | 1 | 0 | 20 | 66 | 12 | 1 |
---|
6 | 4 | 0 | 3 | 55 | 33 | 3 |
---|
8 | 10 | 6 | 0 | 11 | 52 | 20 |
---|
10 | 12 | 20 | 0 | 1 | 23 | 44 |
---|
Again, just those cases where you're being shot by a large-calibre handgun... | survived | False | True |
---|
| worst_wound | Serious | Critical | None | Minor | Serious | Critical |
---|
attr | dr | | | | | | |
---|
-2 | 6 | 38 | 62 | 0 | 0 | 0 | 0 |
---|
0 | 6 | 47 | 42 | 0 | 1 | 6 | 5 |
---|
2 | 6 | 27 | 13 | 0 | 10 | 37 | 13 |
---|
4 | 6 | 4 | 0 | 3 | 55 | 33 | 3 |
---|
Total imparimentAnother thing to look at is the total impariment suffered at the end of the fight, again split between "still active" and not. | | total_penalty |
---|
| survived | False | True |
---|
attr | dr | | |
---|
-2 | 2 | -3.20 | -3.86 |
---|
4 | -3.11 | -5.31 |
---|
6 | -2.90 | -7.00 |
---|
8 | -3.00 | 0.00 |
---|
10 | -3.00 | 0.00 |
---|
0 | 2 | -3.18 | -2.60 |
---|
4 | -3.80 | -4.89 |
---|
6 | -4.20 | -7.09 |
---|
8 | -4.28 | -10.70 |
---|
10 | -4.39 | -15.00 |
---|
2 | 2 | -2.59 | -1.44 |
---|
4 | -3.18 | -2.81 |
---|
6 | -4.28 | -5.48 |
---|
8 | -5.11 | -8.26 |
---|
10 | -5.80 | -11.43 |
---|
4 | 2 | -2.60 | -1.48 |
---|
4 | -2.71 | -1.50 |
---|
6 | -3.26 | -2.92 |
---|
8 | -4.57 | -5.81 |
---|
10 | -5.76 | -8.69 |
---|
Again, just for the handgun case: | | total_penalty |
---|
| survived | False | True |
---|
attr | dr | | |
---|
-2 | 6 | -2.90 | -7.00 |
---|
0 | 6 | -4.20 | -7.09 |
---|
2 | 6 | -4.28 | -5.48 |
---|
4 | 6 | -3.26 | -2.92 |
---|
It could be better for your long-term health to fall over after the first attack, so you don't take several wounds! Note in the large table the penalties when facing high DR attacks.
|
|
|
Post by neil on May 11, 2021 11:09:39 GMT
And finally, the code to generate these tables. (Python 3, using Pandas and matplotlib)
# --- # jupyter: # jupytext: # formats: ipynb,md,py:light # text_representation: # extension: .py # format_name: light # format_version: '1.5' # jupytext_version: 1.11.1 # kernelspec: # display_name: Python 3 # language: python # name: python3 # ---
# + import random import pandas as pd import numpy as np
import matplotlib as mpl import matplotlib.pyplot as plt # %matplotlib inline # -
damage_result = {0: 'None', 1: 'Minor', 2: 'Serious', 3: 'Critical'} penalty = {'None': 0, 'Minor': -1, 'Serious': -2, 'Critical': -3} stun_test = ['Serious', 'Critical'] trauma_test = ['Critical']
def new_combat(attr, dr, offset=5): return { 'history': [] , 'attr': attr , 'dr': dr , 'offset': offset , 'stunned': False , 'dead': False }
def stun_roll(attr, penalty, offset=5): tn = attr + penalty + offset return any(random.randint(1, 10) <= tn for _ in range(2))
def trauma_roll(attr, penalty, offset=5): tn = attr + penalty + offset return any((tn - random.randint(1, 10)) >= -5 for _ in range(2))
def damage_roll(dr): return damage_result[sum(random.randint(1, 10) <= dr for _ in range(3))]
# + tags=[] def combat_round(combat): wound = damage_roll(max(combat['dr'] - combat['attr'], 1)) combat['history'].append(wound) if wound in stun_test: combat['stunned'] = not stun_roll(combat['attr'], penalty[wound], offset=combat['offset']) if wound in trauma_test: combat['dead'] = not trauma_roll(combat['attr'], penalty[wound], offset=combat['offset']) return combat
# -
def run_combat(combat, max_rounds=10): while len(combat['history']) < max_rounds: combat_round(combat) if combat['stunned'] or combat['dead']: break return combat
# + max_rounds=5 trials=5000
results_list = []
for a in [-2, 0, 2, 4]: for d in [2, 4, 6, 8, 10]: for _ in range(trials): c = new_combat(a, d) run_combat(c, max_rounds=max_rounds) results_list.append({ 'attr': a , 'dr': d , 'duration': len(c['history']) , 'survived': not(c['stunned'] or c['dead']) , 'worst_wound': max(c['history'], key=lambda w: -1 * penalty[w]) , 'total_penalty': sum(penalty[w] for w in c['history']) })
results = pd.DataFrame(results_list) # -
durations = pd.DataFrame(results[['attr', 'dr', 'duration']].value_counts().sort_index()) durations = durations.unstack(level=-1, fill_value=0) durations = durations.droplevel(0, axis='columns') np.round(100 * durations / trials).astype(np.int64)
ax = (durations.loc[2, :] / trials).plot.bar(stacked=True) ax.set_title('Duration with attr = 2') ax.set_xlabel('Damage rating') ax.legend(bbox_to_anchor=(1.1, 1.05)) plt.savefig('synergy_combat_duration_with_attr_2.png', facecolor='silver');
with open('synergy-combat-durations.html', 'w') as f: np.round(100 * durations / trials).astype(np.int64).to_html(f)
survivals = pd.DataFrame(results[['attr', 'dr', 'survived', 'worst_wound']].value_counts().sort_index()) survivals = survivals.unstack(level=[-2, -1], fill_value=0) survivals = survivals.droplevel(0, axis='columns') survivals = survivals.reindex(columns=['None', 'Minor', 'Serious', 'Critical'], level='worst_wound') survivals / trials
with open('synergy-combat-survivals.html', 'w') as f: np.round(100 * survivals / trials).astype(np.int64).to_html(f)
# + tags=[] penalties = results[['attr', 'dr', 'survived', 'total_penalty']].groupby(['attr', 'dr', 'survived']).mean() penalties = penalties.unstack(level=[-1], fill_value=0) penalties # -
with open('synergy-combat-penalties.html', 'w') as f: penalties.to_html(f, float_format='{:5.2f}'.format)
(durations.loc[(slice(None), 6), :] / trials).droplevel(1, axis='index')
# + tags=[] ax = (durations.loc[(slice(None), 6), :] / trials).droplevel(1, axis='index').plot.bar(stacked=True) ax.set_title('Duration with damage rating = 6') ax.set_xlabel('Attribute') ax.legend(bbox_to_anchor=(1.1, 1.05)) plt.savefig('synergy_combat_duration_with_dr_6.png', facecolor='silver'); # -
with open('synergy-combat-durations-6.html', 'w') as f: np.round(100 * durations.loc[(slice(None), 6), :] / trials).astype(np.int64).to_html(f)
survivals.loc[(slice(None), 6), :] / trials
with open('synergy-combat-survivals-6.html', 'w') as f: np.round(100 * survivals.loc[(slice(None), 6), :] / trials).astype(np.int64).to_html(f)
penalties.loc[(slice(None), 6), :]
with open('synergy-combat-penalties-6.html', 'w') as f: penalties.loc[(slice(None), 6), :].to_html(f, float_format='{:5.2f}'.format)
|
|
|
Post by Pawel on May 11, 2021 15:53:01 GMT
Wow, Neil. That is some very impressive amount of work put into this! What would you say are your findings, following this playtest?
|
|
|
Post by neil on May 11, 2021 17:38:53 GMT
I put some comments in the posts, but they may have got lost among all the data. As you can see, the changes in attribute and damage rating make a huge difference for how a fight plays out. I think it also explains the comment that "combat is deadly." For typical PCs, there's a reasonable chance that they'll be taken out by the first hit. That's not the case in systems that use HPs or Stress, where you can expect to take a few blows before being at risk of being taken out. Whether that's a bug or a feature is another question... It could be better for your long-term health to fall over after the first attack, so you don't take several wounds! Note in the large table the penalties when facing high DR attacks. The main thing is that small changes in effective attribute level and damage rating make huge differences in the outcomes of a damage roll.
|
|
|
Post by Pawel on May 11, 2021 19:29:11 GMT
Ah, that's right. Sorry, half blind. I'm far from being any sort of expert on actual mechanics in just about any RPG (I run my games almost purely narratively). My understanding is that Blue Planet mechanics are generally quite deadly (which I like thematically - but again, I only occasionally pick up the dice, to add random elements to my decisions and narration). Do I interpret your findings correctly that you feel combat is best balanced for mid-tier characters and equipment? That either end of the attribute & damage rating ranges are too easy or too hard?
|
|
|
Post by Pawel on May 11, 2021 19:29:53 GMT
Neil, come to think of it, my participation in this particular discussion might actually be quite useless. I bet there are lots of board members much more proficient in picking up this topic than I am.
|
|
|
Post by michaelsd on May 11, 2021 21:41:04 GMT
Interesting data, and for data checking death it is interesting. Thank you!
I personally do like BPs damage resolution because it is lethal, but because it gives a good verisimilitude for the game's setting with it's complexity / realism ratio. Part of it's charm is that it realistic enough to represent the individual weapons and the damage they cause, but random enough to be wary of any possible results (you are never bulletproof, just the chances are low that you die).
|
|
|
Post by neil on May 12, 2021 8:15:36 GMT
Neil, come to think of it, my participation in this particular discussion might actually be quite useless. I bet there are lots of board members much more proficient in picking up this topic than I am. Sorry. I should have been clearer in pointing out my observations of the results, and I definately shouldn't have written a terse reply that could be read as hostile. Please put it down to me having a bad day.
|
|
|
Post by neil on May 12, 2021 8:21:49 GMT
Interesting data, and for data checking death it is interesting. Thank you for the data. I personally do not like BPs damage resolution because it is lethal, but because it gives a good verisimilitude for the game's setting with it's complexity / realism ratio. Part of it's charm is that it realistic enough to represent the individual weapons and the damage they cause, but random enough to be wary of any possible results (you are never bulletproof, just the chances are low that you die). Agreed. The chancy nature of combat is true to the setting. Whether you think it makes a fun game is up to you. But one thing that can cause problems in play is the healing times. Serious wounds take several weeks to recover, and Critical wounds can take months. If you've taken multiple wounds, the recovery times will increase. That means a character that is shot in the first scene of a game will likely be affected by that wound for many, many sessions to come. It's a far cry from the insta-heal of D&D and the like!
|
|
|
Post by Pawel on May 12, 2021 8:25:49 GMT
Neil, come to think of it, my participation in this particular discussion might actually be quite useless. I bet there are lots of board members much more proficient in picking up this topic than I am. Sorry. I should have been clearer in pointing out my observations of the results, and I definately shouldn't have written a terse reply that could be read as hostile. Please put it down to me having a bad day. Oh, no worries at all, mate. Honestly! The reason I started backing away was simply because you've put a lot of work into testing this important part of the game and I realised my input was actually not helpful at all - if anything, I was dimming the results of your work with my amateurish "d'oh, whut it mean?". Sorry to hear you had a bad day though! Hope that's now behind you and you get to start a new day afresh.
|
|
Jason
Junior Member
Posts: 30
|
Post by Jason on May 12, 2021 14:45:39 GMT
But one thing that can cause problems in play is the healing times. Serious wounds take several weeks to recover, and Critical wounds can take months. If you've taken multiple wounds, the recovery times will increase. That means a character that is shot in the first scene of a game will likely be affected by that wound for many, many sessions to come. What does "recovering" entail, though? You might not be physically moving around much, but perhaps you could still operate a telepresence drone?
|
|
|
Post by michaelsd on Nov 18, 2022 6:27:55 GMT
Interesting data, and for data checking death it is interesting. Thank you for the data. I personally do not like BPs damage resolution because it is lethal, but because it gives a good verisimilitude for the game's setting with it's complexity / realism ratio. Part of it's charm is that it realistic enough to represent the individual weapons and the damage they cause, but random enough to be wary of any possible results (you are never bulletproof, just the chances are low that you die). Agreed. The chancy nature of combat is true to the setting. Whether you think it makes a fun game is up to you. But one thing that can cause problems in play is the healing times. Serious wounds take several weeks to recover, and Critical wounds can take months. If you've taken multiple wounds, the recovery times will increase. That means a character that is shot in the first scene of a game will likely be affected by that wound for many, many sessions to come. It's a far cry from the insta-heal of D&D and the like!
I am not sure "chancy" is the right word. That "chancy" damage roll very much replaces hit location and armor / penetration, which is a huge thing. It is not so much a randomiser, but a system to simulate those things.
Without Bacta Tanks from Star Wars or regenerators from Star Trek, the healing times are quite realistic. Simple half or quater that in the name of cool.
Jason: wounds have specific effect until healed, and healed has specific timelines. But again, GM can change it. What I really liked in another RPG, is giving a modifier for the facility for diffferent Tech Level, or superior quality etc.
|
|