Skip to content

Instantly share code, notes, and snippets.

@robex
Last active July 5, 2022 16:58
Show Gist options
  • Save robex/57b50a4a92351acf796495c42d288f32 to your computer and use it in GitHub Desktop.
Save robex/57b50a4a92351acf796495c42d288f32 to your computer and use it in GitHub Desktop.
## /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