group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
WeaponConfig.hpp
Go to the documentation of this file.
1
3
4#pragma once
5
6#include "CollisionShape.hpp"
8
9#include <array>
10#include <cstddef>
11
14{
15 float fireCooldown = 0.1f;
16 int magazineSize = 0;
18 float damage = 0.0f;
19 bool hitscan = true;
25 float hitscanRadius = 0.0f;
27 bool explosive = false;
28 bool isBeam = false;
29 bool isCharge = false;
30 float dps = 0.0f;
31 float ammoPerSecond = 0.0f;
32
33 // ── Tesla Cannon (auto-lock cone beam) tuning ──
38 bool autoLockBeam = false;
40 float maxRange = 0.0f;
42 float coneHalfAngleDeg = 0.0f;
45 float dpsMax = 0.0f;
47 float dpsRampTime = 0.0f;
52
53 float chargeDamage = 0.0f;
54 float maxChargeTime = 0.0f;
55 float reloadTime = 0.0f;
56
57 bool semiAuto = false;
58
60 float recoilPitchPerShot = 0.0f;
61 float recoilYawPerShot = 0.0f;
62 float recoilRampShots = 1.0f;
63 float recoilRecovery = 0.0f;
64
72 float recoilPatternScale = 0.0f;
73};
74
77inline float recoilPatternH_R301(float n)
78{
79 if (n <= 10.0f) {
80 const float q = n - 1.0f;
81 return 3.4047f * q - 0.2173f * q * q;
82 }
83 if (n <= 15.0f) {
84 const float q = n - 10.0f;
85 return 13.0435f + 2.1919f * q + 0.2681f * q * q;
86 }
87 if (n <= 20.0f) {
88 const float q = n - 15.0f;
89 return 30.7065f - 2.1566f * q - 0.3404f * q * q;
90 }
91 if (n <= 22.0f) {
92 const float q = n - 20.0f;
93 return 11.4130f - 2.6123f * q;
94 }
95 const float q = n - 22.0f;
96 return 6.1885f + 1.9224f * q + 0.2776f * q * q;
97}
98
101inline float recoilPatternV_R301(float n)
102{
103 if (n <= 10.0f) {
104 const float q = n - 1.0f;
105 return 4.0792f * q + 0.09485f * q * q;
106 }
107 if (n <= 15.0f) {
108 const float q = n - 10.0f;
109 return 44.3954f + 5.0237f * q - 0.2764f * q * q;
110 }
111 if (n <= 20.0f) {
112 const float q = n - 15.0f;
113 return 62.6046f + 4.5740f * q - 0.5132f * q * q;
114 }
115 if (n <= 22.0f) {
116 const float q = n - 20.0f;
117 return 72.6457f + 4.4688f * q;
118 }
119 const float q = n - 22.0f;
120 return 81.5833f + 4.1890f * q - 0.1866f * q * q;
121}
122
124{
125 int modelId = 0;
126 float initialSpeed = 0.0f;
127 float scale = 1.0f;
128 CollisionShape shape = CollisionShape{.halfExtents = {5.0f, 5.0f, 5.0f}};
129 float maxLifeTime = 5.0f;
130 float explosionRadius = 0.0f;
140 float maxKnockback = 0.0f;
145};
146
149{
150 static constexpr std::array<WeaponConfig, 9> k_kWeaponConfigs{{
152 .fireCooldown = 0.125f,
153 .magazineSize = 50,
154 .defaultAmmoCapacity = 350,
155 .damage = 15.0f,
156 .hitscan = true,
157 .hitscanRadius =
158 11.2f, // -30% cylinder hitreg (was 16.0); player capsules are ~2.5–6.5u radius in world space.
159 .initialProjectileSpeed = 0.0f,
160 .explosive = false,
161 .reloadTime = 1.25f,
162 // R-301 closed-form pattern (user-provided 5-segment polynomial in
163 // WeaponConfig.hpp). Resampled across the 50-bullet mag so the full
164 // pattern domain [1, 28] walks shot 1 → 50. recoilRecovery still
165 // controls heat decay between bursts (resets the pattern).
166 // The legacy per-shot fields are zeroed; the pattern path takes
167 // priority when recoilPatternScale > 0.
168 .recoilFreeShots = 0,
169 .recoilPitchPerShot = 0.0f,
170 .recoilYawPerShot = 0.0f,
171 .recoilRampShots = 1.0f,
172 .recoilRecovery = 30.0f,
173 .recoilPatternScale = 0.0025f, // ~14.3° total vertical at full mag (100 units).
174 }, // Rifle
176 .fireCooldown = 1.0f,
177 .magazineSize = 4,
178 .defaultAmmoCapacity = 8,
179 .damage = 180.0f,
180 .hitscan = false,
181 .initialProjectileSpeed = 3000.0f,
182 .explosive = true,
183 .reloadTime = 2.5f,
184 }, // Rocket
186 .fireCooldown = 0.5f,
187 .magazineSize = 8,
188 .defaultAmmoCapacity = 32,
189 .damage = 50.0f,
190 .hitscan = true,
191 .hitscanRadius = 8.4f, // -30% cylinder hitreg (was 12.0)
192 .initialProjectileSpeed = 0.0f,
193 .explosive = false,
194 .isCharge = true,
195 .chargeDamage = 80.0f,
196 .maxChargeTime = 1.0f,
197 .reloadTime = 2.0f,
198 }, // RailGun
200 .fireCooldown = 0.0f,
201 .magazineSize = 400,
202 .defaultAmmoCapacity = 800,
203 .damage = 10.0f,
204 .hitscan = true,
205 .hitscanRadius = 12.0f,
206 .initialProjectileSpeed = 0.0f,
207 .explosive = false,
208 .isBeam = true,
209 .dps = 42.0f, // ramp floor — starting DPS before lock ramp
210 .ammoPerSecond = 20.0f,
211 .autoLockBeam = true,
212 .maxRange = 350.0f,
213 .coneHalfAngleDeg = 48.0f, // very wide cone — strafing/jukes still hold lock
214 .dpsMax = 52.0f, // ramp ceiling after dpsRampTime of held lock
215 .dpsRampTime = 2.0f, // seconds of continuous lock to reach dpsMax
216 .shieldDamageMultiplier = 0.9f, // energy-vs-energy, slightly more bite than before
217 .reloadTime = 2.0f,
218 }, // EnergyGun
220 .fireCooldown = 0.9f,
221 .magazineSize = 6,
222 .defaultAmmoCapacity = 6,
223 .damage = 8.0f,
224 .hitscan = true,
225 .hitscanRadius = 4.2f, // -30% cylinder hitreg (was 6.0); still tighter than rifle since the 11 pellets
226 // compound close-range damage.
227 .initialProjectileSpeed = 0.0f,
228 .explosive = false,
229 .reloadTime = 2.5f,
230 // semiAuto intentionally left false — shotgun auto-fires on cooldown
231 // while LMB is held (matches charge rifle in normal mode). The
232 // 0.9s fireCooldown is what gates the rate.
233 }, // Shotgun
235 .fireCooldown = 0.4f,
236 .magazineSize = 1,
237 .defaultAmmoCapacity = 99,
238 .damage = 0.0f,
239 .hitscan = false,
240 .initialProjectileSpeed = 1500.0f, // overridden by GrenadeConfig.throwSpeed at spawn
241 .explosive = false,
242 }, // HEGrenade
244 .fireCooldown = 0.4f,
245 .magazineSize = 1,
246 .defaultAmmoCapacity = 99,
247 .damage = 0.0f,
248 .hitscan = false,
249 .initialProjectileSpeed = 1200.0f,
250 .explosive = false,
251 }, // Molotov
253 .fireCooldown = 0.4f,
254 .magazineSize = 1,
255 .defaultAmmoCapacity = 99,
256 .damage = 0.0f,
257 .hitscan = false,
258 .initialProjectileSpeed = 1500.0f,
259 .explosive = false,
260 }, // Sticky
261 WeaponConfig{}, // None
262 }};
263
264 return k_kWeaponConfigs[static_cast<std::size_t>(type)];
265}
266
269{
270 static constexpr std::array<ProjectileConfig, 9> k_kProjectileConfigs{{
271 ProjectileConfig{}, // Rifle
273 .modelId = 1,
274 .initialSpeed = 0.0f,
275 .scale = 1.0f,
276 .shape = CollisionShape{.halfExtents = {5.0f, 5.0f, 5.0f}},
277 .maxLifeTime = 5.0f,
278 .explosionRadius = 340.0f, // Buffed from 250 — wider blast.
279 .explosionFalloffExponent = 1.5f, // Softened from cubic (3.0) — smoother, more forgiving splash.
280 .selfDamageMultiplier = 0.4f, // 40% self-damage so rocket jumps don't suicide.
281 .maxKnockback = 800.0f, // Feet-rocket pop scaled against k_jumpSpeed=660; retune if too soft.
282 .knockbackFalloffExponent = 2.0f, // Quadratic: push reaches further than damage.
283 }, // Rocket
284 ProjectileConfig{}, // RailGun
285 ProjectileConfig{}, // EnergyGun
286 ProjectileConfig{}, // Shotgun — hitscan, no projectile
287 ProjectileConfig{}, // HEGrenade — flight params come from GrenadeConfig
288 ProjectileConfig{}, // Molotov
289 ProjectileConfig{}, // Sticky
290 ProjectileConfig{}, // None
291 }};
292
293 return k_kProjectileConfigs[static_cast<std::size_t>(type)];
294}
295
296inline int calcPickupReserve(int currentReserve, int currentMag, int pickupReserve, int pickupMag, WeaponType type)
297{
298 const auto& config = getWeaponConfig(type);
299 const int maxAmmo = config.magazineSize + config.defaultAmmoCapacity;
300 const int pickupAmmo = pickupMag + pickupReserve;
301 return std::min(currentReserve + pickupAmmo, maxAmmo - currentMag);
302}
Collision shape component — AABB or vertical capsule.
Projectile component and weapon/surface type enumerations.
int calcPickupReserve(int currentReserve, int currentMag, int pickupReserve, int pickupMag, WeaponType type)
Definition WeaponConfig.hpp:296
float recoilPatternH_R301(float n)
Closed-form 5-segment R-301 recoil pattern (horizontal, right-positive).
Definition WeaponConfig.hpp:77
const ProjectileConfig & getProjectileConfig(WeaponType type)
Returns the projectile config for a weapon type.
Definition WeaponConfig.hpp:268
float recoilPatternV_R301(float n)
Closed-form 5-segment R-301 recoil pattern (vertical, up-positive).
Definition WeaponConfig.hpp:101
const WeaponConfig & getWeaponConfig(WeaponType type)
Returns the gameplay config for a weapon type.
Definition WeaponConfig.hpp:148
WeaponType
Weapon type — determines tracer style, damage, sound, and impact effects.
Definition WeaponState.hpp:12
Collision shape attached to an entity.
Definition CollisionShape.hpp:34
Definition WeaponConfig.hpp:124
float maxKnockback
Peak knockback velocity (u/s) imparted at the epicenter.
Definition WeaponConfig.hpp:140
float selfDamageMultiplier
Damage scale applied when the rocket's owner is the victim (self-damage).
Definition WeaponConfig.hpp:137
int modelId
Definition WeaponConfig.hpp:125
float explosionFalloffExponent
Damage falloff curve exponent.
Definition WeaponConfig.hpp:134
float explosionRadius
Definition WeaponConfig.hpp:130
float initialSpeed
Definition WeaponConfig.hpp:126
float maxLifeTime
Definition WeaponConfig.hpp:129
CollisionShape shape
Definition WeaponConfig.hpp:128
float knockbackFalloffExponent
Knockback falloff exponent (same form as explosionFalloffExponent).
Definition WeaponConfig.hpp:144
float scale
Definition WeaponConfig.hpp:127
Immutable gameplay stats for a weapon type.
Definition WeaponConfig.hpp:14
int defaultAmmoCapacity
Definition WeaponConfig.hpp:17
bool semiAuto
If true, fire requires trigger release between shots (pump/burst weapons).
Definition WeaponConfig.hpp:57
float maxChargeTime
in seconds
Definition WeaponConfig.hpp:54
bool isCharge
True for charge weapons (hold to charge, release to fire).
Definition WeaponConfig.hpp:29
float dpsMax
Ramp ceiling DPS reached after dpsRampTime of continuous lock.
Definition WeaponConfig.hpp:45
bool hitscan
Definition WeaponConfig.hpp:19
float ammoPerSecond
Ammo drain rate (beam weapons only).
Definition WeaponConfig.hpp:31
float hitscanRadius
Hit-detection cylinder radius (world units) for hitscan weapons.
Definition WeaponConfig.hpp:25
float coneHalfAngleDeg
Half-angle of the lock-on cone in degrees (auto-lock beams only).
Definition WeaponConfig.hpp:42
float shieldDamageMultiplier
Effectiveness multiplier against shield layers (overShield + armor).
Definition WeaponConfig.hpp:51
float initialProjectileSpeed
Definition WeaponConfig.hpp:26
float chargeDamage
Damage dealt on release (charge weapons only).
Definition WeaponConfig.hpp:53
int magazineSize
Definition WeaponConfig.hpp:16
int recoilFreeShots
Shots before recoil kicks in (legacy formula path).
Definition WeaponConfig.hpp:59
float recoilRecovery
Heat decay per second (shared by both paths).
Definition WeaponConfig.hpp:63
bool isBeam
True for continuous beam weapons (no per-shot cooldown).
Definition WeaponConfig.hpp:28
float recoilPatternScale
Closed-form pattern (R-301-style) scale; rad per pattern unit.
Definition WeaponConfig.hpp:72
float dpsRampTime
Seconds of continuous lock on the same target to reach dpsMax.
Definition WeaponConfig.hpp:47
float maxRange
Hard range cap (world units) for the auto-lock beam. 0 = unlimited.
Definition WeaponConfig.hpp:40
float fireCooldown
Definition WeaponConfig.hpp:15
float recoilPitchPerShot
Upward kick per shot (legacy formula path).
Definition WeaponConfig.hpp:60
bool autoLockBeam
True for Winston-style auto-lock beams: each tick picks the enemy closest to the crosshair inside con...
Definition WeaponConfig.hpp:38
bool explosive
Definition WeaponConfig.hpp:27
float damage
Definition WeaponConfig.hpp:18
float recoilYawPerShot
Horizontal swing strength (legacy formula path).
Definition WeaponConfig.hpp:61
float reloadTime
Time to complete a reload, in seconds.
Definition WeaponConfig.hpp:55
float recoilRampShots
Curve shape / stem length (legacy formula path).
Definition WeaponConfig.hpp:62
float dps
Damage per second (beam weapons only; discrete weapons use damage).
Definition WeaponConfig.hpp:30