Fürs Protokoll habe ich das jetzt am Computer durchsimuliert. Vielleicht hilft es dem ein oder anderen beim Balancing der Raumkämpfe.
Ich nehme als Beispiel ein Schiff mit Scale 5 und Security 4 (wie das meiner Spieler). Dieses feuert auf ein Schiff mit Scale 3, Shields 9, Resistance 3, also zB einen B'Rel class Bird of Prey. Der Angriff erfolgt aus idealer Distanz und trifft (ohne Zusatzerfolge oder sonstiges Momentum). Versatile setze ich primär zum Senken der Resistance ein. Nach 10.000 Schadenswürfen erhalte ich in Abhängigkeit von weapon system (Phaser, Disruptor, Polaron Beam) und delivery method (Cannon, Bank, Array) folgende durchschnittliche Anzahl von breaches:
phaser cannons yield average 1.58 breaches (maximum 2 breaches)
phaser banks yield average 1.42 breaches (maximum 2 breaches)
phaser arrays yield average 2.93 breaches (maximum 4 breaches)
disruptor cannons yield average 1.64 breaches (maximum 2 breaches)
disruptor banks yield average 1.46 breaches (maximum 2 breaches)
disruptor arrays yield average 2.47 breaches (maximum 4 breaches)
polaron beam cannons yield average 1.58 breaches (maximum 2 breaches)
polaron beam banks yield average 1.40 breaches (maximum 2 breaches)
polaron beam arrays yield average 2.82 breaches (maximum 4 breaches)
Mit einem Angriff kann man normalerweise höchtstens 2 breaches erzeugen (Schaden > 5 und Schilde auf 0 senken wenn man gut würfelt).
Generell sind Arrays deshalb immer am besten, da sie durch den zweiten Hit mit einem Angriff bis zu 4 breaches verursachen können.
Im Durchschnitt hebt das die Anzahl an breaches bei Phasern und Polaron beams auf fast 3. Disruptor Arrays fallen etwas ab, da hier die Resistance des verteidigenden Schiffes nicht so einfach gesenkt werden kann (Piercing oder Versatile fehlt).
Fazit:
Für anspruchsvolle Kämpfe den Gegnern einfach Phaser oder Polaron Beam arrays verpassen. Die stechen statistisch deutlich hervor.
Ansonsten sind die Unterschiede (1.40 bis 1.64 breaches pro Angriff) aber nicht so weltbewegend.
Hier noch der python Code für die interessierten:
import numpy as np
def roll_effect(ndice):
x = 0
efx = 0
for i in range(ndice):
tmp = np.random.randint(1,7)
if tmp < 3:
x += tmp
elif tmp >= 5:
x += 1
efx += 1
return x, efx
def roll_damage(damage, resistance, shields,
versatile=None,
vicious=None,
piercing=None,
spread=None):
breaches = 0
dam, eff = roll_effect(damage)
if vicious is not None:
dam += eff*vicious
if piercing is not None:
resistance = max(0, resistance - piercing * eff)
if versatile is not None:
if resistance > 2:
resistance = max(0, resistance - 2*versatile)
elif resistance > 0:
resistance -= 1
if versatile > 1:
dam += versatile - 1
else:
dam += versatile
# update shields and breaches
eff_dam = dam - resistance
if shields <= eff_dam and eff_dam > 0:
breaches += 1
if eff_dam >= 5:
breaches += 1
shields = max(0, shields-eff_dam)
if spread is not None and eff > 0:
# second hit
dam2 = np.ceil(dam * 0.5) + max(0, eff-1)
eff_dam = dam2 - resistance
if shields <= eff_dam and eff_dam > 0:
breaches += 1
if eff_dam >= 5:
breaches += 1
shields = max(0, shields-eff_dam)
return breaches
np.random.seed(2342)
nrolls = 10000
# attack ship
scale_att = 5
sec_att = 4
base_dam = scale_att + sec_att
# defense ship
shields_defense = 9
scale_defense = 3
resistance_defense = scale_defense
for weapon_type in ("phaser", "disruptor", "polaron beam"):
for delivery_method in ("cannons", "banks", "arrays"):
versatile = None
spread = None
vicious = None
piercing = None
damage = base_dam
if weapon_type == 'phaser':
versatile = 2
if weapon_type == 'disruptor':
vicious = 1
if weapon_type == 'polaron beam':
piercing = 2
if delivery_method == 'cannons':
damage += 2
if delivery_method == 'banks':
damage += 1
if delivery_method == 'arrays':
spread = True
breaches = []
for i in range(nrolls):
breaches.append( roll_damage(damage, resistance_defense, shields_defense,
versatile=versatile,
vicious=vicious,
spread=spread,
piercing=piercing) )
breaches = np.array(breaches)
av_breaches = np.average(breaches)
max_breaches = np.amax(breaches)
print(f"{weapon_type:15s} {delivery_method:10s} yield average {av_breaches:5.2f} breaches (maximum {max_breaches:d} breaches)")