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.35f;
32 float throwCooldown = 0.4f;
33
34 // Flight physics
35 float fuseTime = -1.0f;
36 float bounceRestitution = 0.0f;
37 bool sticky = false;
38 float maxLifeTime = 8.0f;
39
40 // Detonation
42 // — Explosion params (used when detonation == Explosion)
43 float damage = 0.0f;
44 float explosionRadius = 0.0f;
45 float damageFalloffExp = 1.0f;
46 float selfDamageMult = 0.4f;
47 float maxKnockback = 0.0f;
48 float knockbackFalloffExp = 1.0f;
49 // — FireField params (used when detonation == FireField)
50 float fireRadius = 0.0f;
51 float fireDuration = 0.0f;
52 float fireDps = 0.0f;
53
54 // Cosmetic
55 int modelId = 1;
56 glm::vec3 tint = {1.0f, 1.0f, 1.0f};
57};
58
60inline bool isGrenadeType(WeaponType type)
61{
62 return type == WeaponType::HEGrenade || type == WeaponType::Molotov || type == WeaponType::Impulse;
63}
64
74inline bool canAcceptType(WeaponSlot slot, WeaponType type)
75{
76 const bool slotIsGrenade = (slot == WeaponSlot::GRENADE);
77 const bool typeIsGrenade = isGrenadeType(type);
78 return slotIsGrenade == typeIsGrenade;
79}
80
83{
84 switch (type) {
91 default:
92 break;
93 }
94 assert(false && "nextGrenadeType called on non-grenade WeaponType");
96}
97
101{
102 assert(isGrenadeType(type) && "getGrenadeConfig requires a grenade WeaponType");
103 // Pin the index calc below (type - HEGrenade) to the WeaponType ordering.
104 // If a future edit reorders WeaponType, this fires at compile time instead of
105 // silently miswiring the table.
106 static_assert(static_cast<std::size_t>(WeaponType::Molotov) == static_cast<std::size_t>(WeaponType::HEGrenade) + 1);
107 static_assert(static_cast<std::size_t>(WeaponType::Impulse) == static_cast<std::size_t>(WeaponType::HEGrenade) + 2);
108 static constexpr std::array<GrenadeConfig, 3> k_grenadeConfigs{{
109 // HEGrenade
111 .throwSpeed = 1500.0f,
112 .throwPitchOffset = 0.35f,
113 .throwCooldown = 0.4f,
114 .fuseTime = 3.0f,
115 .bounceRestitution = 0.5f,
116 .sticky = false,
117 .maxLifeTime = 8.0f,
119 .damage = 120.0f,
120 .explosionRadius = 200.0f,
121 .damageFalloffExp = 2.5f,
122 .selfDamageMult = 0.4f,
123 .maxKnockback = 500.0f,
124 .knockbackFalloffExp = 2.0f,
125 .modelId = 1,
126 .tint = {0.4f, 1.0f, 0.4f}, // green
127 },
128 // Molotov
130 .throwSpeed = 1200.0f,
131 .throwPitchOffset = 0.44f,
132 .throwCooldown = 0.4f,
133 .fuseTime = -1.0f, // impact-detonate
134 .bounceRestitution = 0.0f,
135 .sticky = false,
136 .maxLifeTime = 5.0f,
138 .fireRadius = 250.0f,
139 .fireDuration = 5.0f,
140 .fireDps = 30.0f,
141 .modelId = 1,
142 .tint = {1.0f, 0.5f, 0.1f}, // orange
143 },
144 // Impulse
146 .throwSpeed = 1500.0f,
147 .throwPitchOffset = 0.35f,
148 .throwCooldown = 0.4f,
149 .fuseTime = 1.0f, // ticks after sticking
150 .bounceRestitution = 0.0f,
151 .sticky = true,
152 .maxLifeTime = 8.0f,
154 .damage = 0.0f,
155 .explosionRadius = 350.0f,
156 .damageFalloffExp = 1.0f,
157 .selfDamageMult = 1.0f,
158 .maxKnockback = 1100.0f,
159 .knockbackFalloffExp = 1.5f,
160 .modelId = 1,
161 .tint = {0.4f, 0.6f, 1.0f}, // blue
162 },
163 }};
164
165 const std::size_t k_idx = static_cast<std::size_t>(type) - static_cast<std::size_t>(WeaponType::HEGrenade);
166 return k_grenadeConfigs[k_idx];
167}
bool isGrenadeType(WeaponType type)
True if type is a grenade (covered by getGrenadeConfig).
Definition GrenadeConfig.hpp:60
WeaponType nextGrenadeType(WeaponType type)
Cycle to the next grenade type. HE → Molotov → Impulse → HE.
Definition GrenadeConfig.hpp:82
const GrenadeConfig & getGrenadeConfig(WeaponType type)
Returns the config for a grenade WeaponType.
Definition GrenadeConfig.hpp:100
bool canAcceptType(WeaponSlot slot, WeaponType type)
Slot/type compatibility predicate for pickups.
Definition GrenadeConfig.hpp:74
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, Impulse).
Definition GrenadeConfig.hpp:22
Weapon state component for armed entities.
WeaponSlot
Identifier for one of the player's weapon slots.
Definition WeaponState.hpp:28
@ GRENADE
Exclusive grenade slot — only accepts grenade types (see canAcceptType).
Definition WeaponState.hpp:31
WeaponType
Weapon type — determines tracer style, damage, sound, and impact effects.
Definition WeaponState.hpp:12
@ Impulse
Sticky 1s fuse, big knockback, no damage (movement tool).
Definition WeaponState.hpp:19
@ HEGrenade
Bouncy grenade with 3s fuse, lethal explosion.
Definition WeaponState.hpp:17
@ Molotov
Impact-detonate, leaves a fire field (damage over time).
Definition WeaponState.hpp:18
Pending explosion to process this tick.
Definition Explosion.hpp:11
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:46
float throwPitchOffset
Upward rotation applied to eye dir (rad, ~20°).
Definition GrenadeConfig.hpp:31
float explosionRadius
Definition GrenadeConfig.hpp:44
float throwCooldown
Min seconds between throws.
Definition GrenadeConfig.hpp:32
float damage
Definition GrenadeConfig.hpp:43
float bounceRestitution
0 = no bounce, 0.5 = lossy, 1.0 = elastic.
Definition GrenadeConfig.hpp:36
glm::vec3 tint
RGB multiplier for projectile rendering.
Definition GrenadeConfig.hpp:56
GrenadeDetonationKind detonation
Definition GrenadeConfig.hpp:41
float maxKnockback
Definition GrenadeConfig.hpp:47
float knockbackFalloffExp
Definition GrenadeConfig.hpp:48
float damageFalloffExp
Definition GrenadeConfig.hpp:45
float fireRadius
Definition GrenadeConfig.hpp:50
float throwSpeed
Initial speed along throw direction (u/s).
Definition GrenadeConfig.hpp:30
float fireDps
Definition GrenadeConfig.hpp:52
bool sticky
If true, freezes velocity on first surface hit.
Definition GrenadeConfig.hpp:37
float maxLifeTime
Hard timeout safety (s).
Definition GrenadeConfig.hpp:38
int modelId
Reuses rocket model for v1.
Definition GrenadeConfig.hpp:55
float fireDuration
Definition GrenadeConfig.hpp:51
float fuseTime
Seconds; <0 means impact-detonate (no fuse).
Definition GrenadeConfig.hpp:35