group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
AbilityState.hpp
Go to the documentation of this file.
1
3
4#pragma once
5
6#include <algorithm>
7#include <array>
8#include <cstdint>
9#include <glm/vec3.hpp>
10
11enum class AbilitySlot : uint8_t
12{
15};
16
27
28inline constexpr std::size_t kAbilityChoicesPerTier = 2;
29
30// Per-match candidate pools. `ServerGame::selectMatchAbilityPool()` draws
31// `kAbilityChoicesPerTier` (2) from each pool to offer at level-up.
32inline constexpr std::array<AbilityType, 3> primaryAbilityTypes = {
36};
37
38inline constexpr std::array<AbilityType, 3> secondaryAbilityTypes = {
42};
43
44inline constexpr const char* abilityName(AbilityType type)
45{
46 switch (type) {
48 return "DASH";
50 return "GRAPPLE";
52 return "GRAVITY";
54 return "RECALL";
56 return "LEVITATE";
58 return "WALLHACK";
60 default:
61 return "LOCKED";
62 }
63}
64
65inline constexpr const char* abilityDescription(AbilityType type)
66{
67 switch (type) {
69 return "Burst in your movement direction.";
71 return "Hook terrain and pull yourself in.";
73 return "Flip gravity and fight from the ceiling.";
75 return "Mark a spot, then return to it.";
77 return "Hold to ride a gentle updraft.";
79 return "See enemies through walls briefly.";
81 default:
82 return "No ability selected.";
83 }
84}
85
87{
88 int level = 0;
89 float accumDamage = 0;
90 bool pendingLevel1 = false;
91 bool pendingLevel2 = false;
92
93 std::array<AbilityType, kAbilityChoicesPerTier> primaryChoices = {primaryAbilityTypes[0], primaryAbilityTypes[1]};
94 std::array<AbilityType, kAbilityChoicesPerTier> secondaryChoices = {secondaryAbilityTypes[0], secondaryAbilityTypes[1]};
95
98
99 float primaryCooldown = 0.0f;
100 bool primaryActive = false;
101
102 float secondaryCooldown = 0.0f;
103 bool secondaryActive = false;
104
105 bool recallMarkerSet = false;
107 glm::vec3 recallMarkerPosition{0.0f};
108
112 float wallhackTimer = 0.0f;
113};
114
116{
117 return state.pendingLevel1 || state.pendingLevel2;
118}
119
124
125inline const std::array<AbilityType, kAbilityChoicesPerTier>& choicesForPendingSelection(const AbilityState& state)
126{
127 return state.pendingLevel1 ? state.primaryChoices : state.secondaryChoices;
128}
129
130inline void choosePendingAbility(AbilityState& state, std::size_t choiceIndex)
131{
132 choiceIndex = std::min(choiceIndex, kAbilityChoicesPerTier - 1);
133
134 if (state.pendingLevel1) {
135 state.primary = state.primaryChoices[choiceIndex];
136 state.primaryCooldown = 0.0f;
137 state.primaryActive = false;
138 state.pendingLevel1 = false;
139 return;
140 }
141
142 if (state.pendingLevel2) {
143 state.secondary = state.secondaryChoices[choiceIndex];
144 state.secondaryCooldown = 0.0f;
145 state.secondaryActive = false;
146 state.recallMarkerSet = false;
147 state.pendingLevel2 = false;
148 }
149}
150
151inline bool isAbilityOnCooldown(const AbilityState& state, AbilityType type)
152{
153 if (state.primary == type && state.primaryCooldown > 0.0f) {
154 return true;
155 }
156
157 if (state.secondary == type && state.secondaryCooldown > 0.0f) {
158 return true;
159 }
160
161 return false;
162}
163
164inline void setAbilityCooldown(AbilityState& state, AbilityType type, float cooldown)
165{
166 if (state.primary == type) {
167 state.primaryCooldown = cooldown;
168 }
169
170 if (state.secondary == type) {
171 state.secondaryCooldown = cooldown;
172 }
173}
174
175inline float abilityCooldownRemaining(const AbilityState& state, AbilityType type)
176{
177 if (state.primary == type) {
178 return state.primaryCooldown;
179 }
180
181 if (state.secondary == type) {
182 return state.secondaryCooldown;
183 }
184
185 return 0.0f;
186}
constexpr std::array< AbilityType, 3 > primaryAbilityTypes
Definition AbilityState.hpp:32
constexpr const char * abilityDescription(AbilityType type)
Definition AbilityState.hpp:65
AbilityType
Definition AbilityState.hpp:18
@ Dash
Definition AbilityState.hpp:20
@ Recall
Definition AbilityState.hpp:23
@ None
Definition AbilityState.hpp:19
@ Wallhack
Tier-2: briefly see enemies through walls (red chams).
Definition AbilityState.hpp:25
@ Gravity
Definition AbilityState.hpp:22
@ Levitate
Tier-1: hold to ride a gentle updraft for a few seconds.
Definition AbilityState.hpp:24
@ Grapple
Definition AbilityState.hpp:21
const std::array< AbilityType, kAbilityChoicesPerTier > & choicesForPendingSelection(const AbilityState &state)
Definition AbilityState.hpp:125
float abilityCooldownRemaining(const AbilityState &state, AbilityType type)
Definition AbilityState.hpp:175
void choosePendingAbility(AbilityState &state, std::size_t choiceIndex)
Definition AbilityState.hpp:130
bool isAbilityOnCooldown(const AbilityState &state, AbilityType type)
Definition AbilityState.hpp:151
void setAbilityCooldown(AbilityState &state, AbilityType type, float cooldown)
Definition AbilityState.hpp:164
constexpr std::array< AbilityType, 3 > secondaryAbilityTypes
Definition AbilityState.hpp:38
bool hasPendingAbilitySelection(const AbilityState &state)
Definition AbilityState.hpp:115
constexpr std::size_t kAbilityChoicesPerTier
Definition AbilityState.hpp:28
AbilitySlot
Definition AbilityState.hpp:12
@ Primary
Definition AbilityState.hpp:13
@ Secondary
Definition AbilityState.hpp:14
AbilitySlot pendingAbilitySlot(const AbilityState &state)
Definition AbilityState.hpp:120
constexpr const char * abilityName(AbilityType type)
Definition AbilityState.hpp:44
Definition AbilityState.hpp:87
float wallhackTimer
Wallhack reveal: seconds remaining of the see-through-walls effect.
Definition AbilityState.hpp:112
bool primaryActive
Definition AbilityState.hpp:100
glm::vec3 recallMarkerPosition
Definition AbilityState.hpp:107
std::array< AbilityType, kAbilityChoicesPerTier > primaryChoices
Definition AbilityState.hpp:93
AbilityType primary
Definition AbilityState.hpp:96
float accumDamage
Definition AbilityState.hpp:89
std::array< AbilityType, kAbilityChoicesPerTier > secondaryChoices
Definition AbilityState.hpp:94
int level
Definition AbilityState.hpp:88
bool secondaryActive
Definition AbilityState.hpp:103
float secondaryCooldown
Definition AbilityState.hpp:102
bool pendingLevel2
Definition AbilityState.hpp:91
AbilityType secondary
Definition AbilityState.hpp:97
bool recallMarkerSet
Definition AbilityState.hpp:105
bool recallMarkerGravityFlipped
Definition AbilityState.hpp:106
float primaryCooldown
Definition AbilityState.hpp:99
bool pendingLevel1
Definition AbilityState.hpp:90