Last active
July 5, 2022 16:58
-
-
Save robex/57b50a4a92351acf796495c42d288f32 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## /robex/ - 2021 ## | |
import matplotlib.pyplot as plt | |
import math | |
class Weapon: | |
def __init__(self, rangemod, basedmg, maxrange, gainrange, name): | |
self.rangemod = rangemod | |
self.basedmg = basedmg | |
self.maxrange = maxrange | |
self.gainrange = gainrange | |
self.name = name | |
def bias(x, bias_amt): | |
bias_exp = math.log(bias_amt) * -1.4427 | |
return x ** bias_exp | |
def gain(x, bias_amt): | |
if x < 0.5: | |
return 0.5 * bias(2.0 * x, 1.0 - bias_amt) | |
else: | |
return 1.0 - 0.5 * bias(2.0 - 2.0 * x, 1.0 - bias_amt) | |
def dropoff(weapon, dist): | |
return weapon.basedmg * weapon.rangemod ** (dist / 500.0) | |
def dropoff_gain(weapon, dist): | |
nogain = dropoff(weapon, dist) | |
if weapon.gainrange == 0 or dist < weapon.gainrange: | |
return nogain | |
gainval = nogain * gain(((dist - weapon.gainrange) / (weapon.gainrange - weapon.maxrange)) + 1.0, 0.8) | |
return gainval | |
def plot_weapons(weapons, modname, filename): | |
step = 10 | |
max_range = 0 | |
ylim = 0 | |
for weapon in weapons: | |
ylim = max(ylim, weapon.basedmg) | |
max_range = max(max_range, weapon.maxrange) | |
max_range = max_range + 100 | |
ylim = max(ylim, 31) + 1 | |
for weapon in weapons: | |
dist = [] | |
dmg = [] | |
for i in range(0, max_range, step): | |
dist.append(i) | |
if i > weapon.maxrange: | |
dmg.append(0) | |
else: | |
dmg.append(dropoff_gain(weapon, i)) | |
plt.plot(dist, dmg, label=weapon.name) | |
plt.xlabel("distance to target (source engine units)") | |
plt.ylabel("damage (HP)") | |
axes = plt.gca() | |
axes.set_ylim([-2, ylim]) | |
plt.legend() | |
plt.grid() | |
plt.title("damage dropoff with distance (" + modname + ")") | |
plt.savefig(filename) | |
plt.close() | |
def main(): | |
chrome = Weapon(0.69, 16, 3000, 0, "chrome (1 pellet)") | |
pump = Weapon(0.69, 14, 3000, 0, "pump (1 pellet)") | |
smg = Weapon(0.79, 25, 2200, 900, "smg") | |
uzi = Weapon(0.83, 22, 2500, 0, "uzi") | |
chrome2 = Weapon(0.69, 31, 3000, 0, "chrome (1 pellet)") | |
pump2 = Weapon(0.69, 25, 3000, 0, "pump (1 pellet)") | |
smg2 = Weapon(0.83, 25, 2200, 900, "smg") | |
uzi2 = Weapon(0.83, 20, 2500, 0, "uzi") | |
mp5 = Weapon(0.83, 24, 2500, 0, "mp5") | |
pistol = Weapon(0.75, 36, 2500, 0, "pistol") | |
deagle = Weapon(0.75, 80, 3500, 0, "deagle") | |
weapons1_9 = [chrome, pump, smg, uzi] | |
weapons2_0 = [chrome2, pump2, smg2, uzi2] | |
pistols = [pistol, deagle] | |
plot_weapons(weapons1_9, "zonemod 1.9.16", "plot1_9.png") | |
plot_weapons(weapons2_0, "zonemod 2.0.1", "plot2_0.png") | |
plot_weapons(pistols, "zonemod, pistols", "plot_pistols.png") | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment