group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
GrenadeConfig.hpp
Go to the documentation of this file.
1
8
9#pragma once
10
11#include "WeaponState.hpp"
12
13#include <array>
14#include <cassert>
15#include <cstddef>
16#include <cstdint>
17#include <glm/vec3.hpp>
18
20enum class GrenadeDetonationKind : uint8_t
21{
24};
25
28{
29 // Throw mechanics
30 float throwSpeed = 1500.0f;
31 float throwPitchOffset = 0.14f;
33 float throwCooldown = 0.4f;
34
35 // Flight physics
36 float fuseTime = -1.0f;
37 float bounceRestitution = 0.0f;
38 bool sticky = false;
39 float maxLifeTime = 8.0f;
40
41 // Detonation
43 // — Explosion params (used when detonation == Explosion)
44 float damage = 0.0f;
45 float explosionRadius = 0.0f;
46 float damageFalloffExp = 1.0f;
47 float selfDamageMult = 0.4f;
48 float maxKnockback = 0.0f;
49 float knockbackFalloffExp = 1.0f;
50 // — FireField params (used when detonation == FireField)
51 float fireRadius = 0.0f;
52 float fireDuration = 0.0f;
53 float fireDps = 0.0f;
54
55 // Cosmetic
56 int modelId = 1;
57 glm::vec3 tint = {1.0f, 1.0f, 1.0f};
58};
59
62inline constexpr float kGrenadeThrowAnimTime = 0.5f;
63
64inline constexpr std::array<WeaponType, 3> kGrenadeTypes = {
68};
69inline constexpr std::size_t kGrenadeTypeCount = kGrenadeTypes.size();
70
72inline bool isGrenadeType(WeaponType type)
73{
74 for (WeaponType grenadeType : kGrenadeTypes) {
75 if (type == grenadeType) {
76 return true;
77 }
78 }
79 return false;
80}
81
82inline std::size_t grenadeTypeIndex(WeaponType type)
83{
84 for (std::size_t i = 0; i < kGrenadeTypes.size(); ++i) {
85 if (kGrenadeTypes[i] == type) {
86 return i;
87 }
88 }
89
90 assert(false && "grenadeTypeIndex called on non-grenade WeaponType");
91 return 0;
92}
93
94inline WeaponType grenadeTypeAt(std::size_t index)
95{
96 if (index >= kGrenadeTypes.size()) {
97 index = 0;
98 }
99 return kGrenadeTypes[index];
100}
101
102inline constexpr const char* grenadeTypeName(WeaponType type)
103{
104 switch (type) {
106 return "FRAG";
108 return "MOLOTOV";
110 return "STICKY";
111 default:
112 return "GRENADE";
113 }
114}
115
120inline bool canAcceptType(WeaponSlot /*slot*/, WeaponType type)
121{
122 return !isGrenadeType(type) && type != WeaponType::None;
123}
124
128{
129 assert(isGrenadeType(type) && "getGrenadeConfig requires a grenade WeaponType");
130 // Pin the index calc below (type - HEGrenade) to the WeaponType ordering.
131 // If a future edit reorders WeaponType, this fires at compile time instead of
132 // silently miswiring the table.
133 static_assert(static_cast<std::size_t>(WeaponType::Molotov) == static_cast<std::size_t>(WeaponType::HEGrenade) + 1);
134 static_assert(static_cast<std::size_t>(WeaponType::Sticky) == static_cast<std::size_t>(WeaponType::HEGrenade) + 2);
135 static constexpr std::array<GrenadeConfig, 3> k_grenadeConfigs{{
136 // HEGrenade
138 .throwSpeed = 1800.0f,
139 .throwPitchOffset = 0.14f,
140 .throwCooldown = 1.0f,
141 .fuseTime = 2.0f,
142 .bounceRestitution = 0.5f,
143 .sticky = false,
144 .maxLifeTime = 8.0f,
146 .damage = 150.0f,
147 .explosionRadius = 300.0f,
148 .damageFalloffExp = 2.5f,
149 .selfDamageMult = 0.4f,
150 .maxKnockback = 1100.0f, // impulse-grade knockback folded into the HE frag
151 .knockbackFalloffExp = 1.5f,
152 .modelId = 1,
153 .tint = {0.4f, 1.0f, 0.4f}, // green
154 },
155 // Molotov
157 .throwSpeed = 1500.0f,
158 .throwPitchOffset = 0.20f,
159 .throwCooldown = 1.0f,
160 .fuseTime = -1.0f, // impact-detonate
161 .bounceRestitution = 0.0f,
162 .sticky = false,
163 .maxLifeTime = 5.0f,
165 .fireRadius = 250.0f,
166 .fireDuration = 5.0f,
167 .fireDps = 30.0f,
168 .modelId = 1,
169 .tint = {1.0f, 0.5f, 0.1f}, // orange
170 },
171 // Sticky
173 .throwSpeed = 1800.0f,
174 .throwPitchOffset = 0.14f,
175 .throwCooldown = 1.0f,
176 .fuseTime = 2.0f, // arms once it sticks to a surface or player
177 .bounceRestitution = 0.0f,
178 .sticky = true,
179 .maxLifeTime = 8.0f,
181 .damage = 180.0f,
182 .explosionRadius = 220.0f,
183 .damageFalloffExp = 2.0f,
184 .selfDamageMult = 0.4f,
185 .maxKnockback = 400.0f,
186 .knockbackFalloffExp = 2.0f,
187 .modelId = 1,
188 .tint = {0.4f, 0.6f, 1.0f}, // blue
189 },
190 }};
191
192 const std::size_t k_idx = static_cast<std::size_t>(type) - static_cast<std::size_t>(WeaponType::HEGrenade);
193 return k_grenadeConfigs[k_idx];
194}
constexpr std::size_t kGrenadeTypeCount
Definition GrenadeConfig.hpp:69
constexpr const char * grenadeTypeName(WeaponType type)
Definition GrenadeConfig.hpp:102
constexpr float kGrenadeThrowAnimTime
Duration of the throw "wind-up": the gun dips (client viewmodel) and firing is locked out for this lo...
Definition GrenadeConfig.hpp:62
bool isGrenadeType(WeaponType type)
True if type is a grenade (covered by getGrenadeConfig).
Definition GrenadeConfig.hpp:72
const GrenadeConfig & getGrenadeConfig(WeaponType type)
Returns the config for a grenade WeaponType.
Definition GrenadeConfig.hpp:127
WeaponType grenadeTypeAt(std::size_t index)
Definition GrenadeConfig.hpp:94
bool canAcceptType(WeaponSlot, WeaponType type)
Weapon-slot type compatibility predicate for pickup guards.
Definition GrenadeConfig.hpp:120
GrenadeDetonationKind
How a grenade detonates.
Definition GrenadeConfig.hpp:21
@ FireField
Spawn a FireField entity for damage-over-time (Molotov).
Definition GrenadeConfig.hpp:23
@ Explosion
queueExplosion() with damage + knockback (HE, Sticky).
Definition GrenadeConfig.hpp:22
std::size_t grenadeTypeIndex(WeaponType type)
Definition GrenadeConfig.hpp:82
constexpr std::array< WeaponType, 3 > kGrenadeTypes
Definition GrenadeConfig.hpp:64
Weapon state component for armed entities.
WeaponSlot
Identifier for one of the player's weapon slots.
Definition WeaponState.hpp:32
WeaponType
Weapon type — determines tracer style, damage, sound, and impact effects.
Definition WeaponState.hpp:12
@ None
No weapon in this slot.
Definition WeaponState.hpp:21
@ Sticky
Sticks to first surface or player; guaranteed kill when stuck to a player.
Definition WeaponState.hpp:20
@ HEGrenade
Bouncy grenade with 3s fuse, lethal explosion + big knockback.
Definition WeaponState.hpp:18
@ Molotov
Impact-detonate, leaves a fire field (damage over time).
Definition WeaponState.hpp:19
Pending explosion to process this tick.
Definition Explosion.hpp:13
A burning area on the ground that damages players standing in it.
Definition FireField.hpp:14
All tuning for one grenade type.
Definition GrenadeConfig.hpp:28
float selfDamageMult
Definition GrenadeConfig.hpp:47
float throwPitchOffset
Slight upward bias on eye dir (rad).
Definition GrenadeConfig.hpp:31
float explosionRadius
Definition GrenadeConfig.hpp:45
float throwCooldown
Min seconds between throws.
Definition GrenadeConfig.hpp:33
float damage
Definition GrenadeConfig.hpp:44
float bounceRestitution
0 = no bounce, 0.5 = lossy, 1.0 = elastic.
Definition GrenadeConfig.hpp:37
glm::vec3 tint
RGB multiplier for projectile rendering.
Definition GrenadeConfig.hpp:57
GrenadeDetonationKind detonation
Definition GrenadeConfig.hpp:42
float maxKnockback
Definition GrenadeConfig.hpp:48
float knockbackFalloffExp
Definition GrenadeConfig.hpp:49
float damageFalloffExp
Definition GrenadeConfig.hpp:46
float fireRadius
Definition GrenadeConfig.hpp:51
float throwSpeed
Initial speed along throw direction (u/s).
Definition GrenadeConfig.hpp:30
float fireDps
Definition GrenadeConfig.hpp:53
bool sticky
If true, freezes velocity on first surface hit.
Definition GrenadeConfig.hpp:38
float maxLifeTime
Hard timeout safety (s).
Definition GrenadeConfig.hpp:39
int modelId
Legacy model id; client rendering resolves grenade.glb by WeaponType.
Definition GrenadeConfig.hpp:56
float fireDuration
Definition GrenadeConfig.hpp:52
float fuseTime
Seconds; <0 means impact-detonate (no fuse).
Definition GrenadeConfig.hpp:36