J'ai écrit un programme terrible en Python terriblement écrit qui tente de faire des calculs DPS à un niveau très basique. Je l'utilise pour comparer des armes depuis un certain temps et cela ne semble pas très mal la plupart du temps.
Il simule le tir d'une arme à feu pendant 60 secondes, puis divise les dégâts infligés par 60. Il comptabilise:
- Dégâts des armes
- Cadence de tir
- Magazine
- Dégâts élémentaires
- Type de dégâts (vs chair, bouclier, armure)
- Playthrough (par défaut, il utilise le second)
- En option, précision de manière essentiellement bidon (mais pas par défaut)
- Reculez en option de manière certainement bidon (mais pas par défaut)
- En option, augmentez les statistiques des mauvais rangs (mais pas par défaut)
Cela ne fonctionne pas bien si:
- L'arme a des attributs fantaisistes (= texte rouge)
- Vous comparez des fusils de chasse avec des fusils non par défaut, tous les plombs frappent tout le temps)
- Vous comparez les fusils de sniper avec des fusils non-sniper (car le calcul des coups critiques est plutôt compliqué ... et pourquoi feriez-vous cela pour commencer?)
- C'est un pistolet avec un multiplicateur de dégâts "x2" (à moins que cela signifie qu'il tire deux plombs à la fois, alors voir les remarques ci-dessus sur les fusils de chasse)
- C'est un pistolet e-tech (vous devez vraiment voir comment l'e-tech l'arme fonctionne, voire pas du tout, avant de commencer à comparer les dégâts)
- Le jeu ne se comporte pas comme je l'ai modélisé
Je vais mettre ici l'essentiel des le calcul pour un examen plus facile par les pairs:
def dps (arme, playthrough = 2, bonusStats = zeroStats, referenceTime = 60, precisionAdjusting = lambda x: 1, # lambda x: x ** (1 / 3), accountForRecoilInVastlyBogusWays = False): time = 0 damage = Damage (0,0,0) ammoCount = weapon.magazine recoilMalus = 0 while time < = referenceTime: time + = 1 / (weapon.fireRate * bonusStats.rate) pour i dans xrange (weapon.pelletCount):
if random () < precisionAdjusting (weapon.accuracy / 100 * bonusStats.accuracy + recoilMalus): damage.add (weapon.damage * bonusStats.damage, arme.element, playthrough) if weapon.element: if random () < arme. elementChance / 100 * bonusStats.elementChance: damage.add (weapon.elementDPS * bonusStats.elementDamage * elementLength [arme.element], arme.element, playthrough) #this ajuste le type de dommage par rapport au type de santé ammoCount - = 1 si accountForRecoilInVastlyBogusWays: recoilMalMal = 0.01 * 1 / bonusStats.recoil if ammoCount == 0: time + = weapon.reloadTime * bonusStats.reload ammoCount = weapon.magazine recoilMalus = 0 return damage / time
Comme le Le programme s'exécute dans la console et vous demande de taper à peu près la carte d'arme, crachant le DPS en retour. Il est sous licence WTFPL, alors n'hésitez pas à l'améliorer de toutes manières.