Skip to content
Open
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
8ddd7a9
Create hev.h
jimsworld Mar 11, 2025
0bb235c
Move hev.h to props directory
jimsworld Mar 12, 2025
f420319
Remove hev.h from root directory
jimsworld Mar 12, 2025
a8964f9
Uploading hev_config.h
jimsworld Mar 26, 2025
bd26622
Merge branch 'profezzorn:master' into patch-1
jimsworld Mar 26, 2025
1c653b8
Updated hev.h accounting changes from old branch
jimsworld Mar 27, 2025
27291d5
Removed hev_config.h
jimsworld Mar 27, 2025
e867fa3
Delay Hazard Damage
jimsworld Mar 28, 2025
57ed294
Update hev.h
jimsworld Apr 1, 2025
acba631
removed extra empty line
jimsworld Apr 1, 2025
f5cac73
Removed all extra lines
Apr 3, 2025
4bdb790
Removed /////// from the end of each function name
jimsworld Apr 9, 2025
e7138bc
Fixed indentation consistency
jimsworld Apr 9, 2025
2f33e2c
Inverted initial if statement in HazardDecrease
jimsworld Apr 10, 2025
145f483
Added descriptions for all sounds currently needed
jimsworld Apr 14, 2025
9aa5d40
Merge branch 'profezzorn:master' into props-hev.h
jimsworld Apr 16, 2025
3abec2d
Introduced HEVTimer class to manage timing events
jimsworld Apr 25, 2025
ba7c614
HEVTimer class reworked:
jimsworld Apr 25, 2025
8ce7404
Updated Random Hazard and Hazard Decrease function
jimsworld May 8, 2025
98887f4
Updated IncreaseHealth and IncreaseArmor functions
jimsworld May 9, 2025
086f434
Fixed an issue with Increase Health and Armor
jimsworld May 13, 2025
7f41d4c
Utilising prop_base's debounce for Clashes
jimsworld May 29, 2025
95b4317
Merge branch 'profezzorn:master' into props-hev.h
jimsworld May 29, 2025
af83a2b
Commiting updates to work over weekend.
jimsworld Jun 20, 2025
e3956aa
Created new HEVTimer subclass for finer control.
jimsworld Jun 25, 2025
949a816
Removed 3rd argument from DoEffect calls:
jimsworld Jul 2, 2025
7649730
Updated tweaks and changes to hev.h
jimsworld Jul 7, 2025
82098b9
Submitting changes so far, to work away from home.
jimsworld Jul 15, 2025
53e0e37
Removed HEVTimerHazard:
jimsworld Jul 15, 2025
9060279
Complete overhaul of top comment block:
jimsworld Jul 16, 2025
18b4fa9
Comment ammendments.
jimsworld Jul 17, 2025
228bdf3
Merge branch 'profezzorn:master' into props-hev.h
jimsworld Jul 17, 2025
9d02aad
Updated comments and catergorised EFFECTS
jimsworld Jul 18, 2025
cce563c
Added SB_Effect2 and preceding Armor Readout sfx
jimsworld Jul 21, 2025
801f1c7
Latest updates to props/hev.h:
jimsworld Jul 23, 2025
a1b3a8f
Merge branch 'profezzorn:master' into props-hev.h
jimsworld Jul 23, 2025
2ec51e7
Refactored DoDamage():
jimsworld Aug 7, 2025
543b108
Accounting for latest reviews.
jimsworld Aug 15, 2025
3a45bda
Minor amendment for Armor Compromised logic.
jimsworld Aug 15, 2025
cc14c95
Merge branch 'profezzorn:master' into props-hev.h
jimsworld Aug 29, 2025
b44af1d
Merge branch 'profezzorn:master' into props-hev.h
jimsworld Sep 1, 2025
e261f7f
Merge branch 'profezzorn:master' into props-hev.h
jimsworld Nov 1, 2025
c3c3a51
Fixed Armor Readout not firing properly.
jimsworld Nov 4, 2025
f9d12a7
Randomised Hazard Damage interval.
jimsworld Nov 7, 2025
a4d71cd
Added set damage values per hazard type.
jimsworld Nov 11, 2025
d75e0bb
Reverted default timing values from testing.
jimsworld Nov 11, 2025
9e381b8
Heat/Shock Hazard Damage Additions:
jimsworld Nov 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 84 additions & 24 deletions props/hev.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,8 @@
// - These 4 Hazards have a 50% chance to let the user know //
// that damage is lingering via a (HEV VOICE LINE). //
// - This has been configured directly in the sound font files. //
// ▪ Heat and Shock do not have lingering damage and should be //
// cleared immediately by the user by clicking AUX. //
// ▪ Heat/Shock do not have indefinite lingering damage as they will //
// clear themselves after a short time. //
// //
//----------------- Quick Healing & Recharging ------------------------//
// //
Expand Down Expand Up @@ -287,9 +287,17 @@
// - Delay (ms) before Hazard damage starts after checking and //
// triggering Hazard. Allows time for HEV Voice Line to finish. //
// //
// HEV_HAZARD_DECREASE_MS //
// - Time (ms) between each tick of Hazard damage. //
// Lower = faster damage-over-time. //
// HEV_HAZARD_DECREASE_MIN_MS //
// - Minimum time (ms) between each tick of Hazard damage. //
// //
// HEV_HAZARD_DECREASE_MAX_MS //
// - Maximum time (ms) between each tick of Hazard damage. //
// //
// HEV_HAZARD_SURGE_MIN_MS //
// - Minimum time (ms) for a quick surge of Hazard damage. //
// //
// HEV_HAZARD_SURGE_MAX_MS //
// - Maximum time (ms) for a quick surge of Hazard damage. //
// //
// HEV_HAZARD_AFTER_REVIVE_MS //
// - Time (ms) after reviving before Hazards can happen again. //
Expand All @@ -314,8 +322,17 @@
#ifndef HEV_HAZARD_DELAY_MS
#define HEV_HAZARD_DELAY_MS 6000
#endif
#ifndef HEV_HAZARD_DECREASE_MS
#define HEV_HAZARD_DECREASE_MS 1000
#ifndef HEV_HAZARD_DECREASE_MIN_MS
#define HEV_HAZARD_DECREASE_MIN_MS 1000
#endif
#ifndef HEV_HAZARD_DECREASE_MAX_MS
#define HEV_HAZARD_DECREASE_MAX_MS 4000
#endif
#ifndef HEV_HAZARD_SURGE_MIN_MS
#define HEV_HAZARD_SURGE_MIN_MS 8000
#endif
#ifndef HEV_HAZARD_SURGE_MAX_MS
#define HEV_HAZARD_SURGE_MAX_MS 15000
#endif
#ifndef HEV_HAZARD_AFTER_REVIVE_MS
#define HEV_HAZARD_AFTER_REVIVE_MS 60000
Expand Down Expand Up @@ -353,22 +370,19 @@ EFFECT(stun);

struct HEVTimerBase {
uint32_t start_ = 0;

uint32_t interval_ = 0;

bool active_ = false;

void reset() { active_ = false; }

void start() { active_ = true; start_ = millis(); }

void configure(uint32_t interval) { interval_ = interval; }
void configure_random(uint32_t min_ms, uint32_t max_ms) {
interval_ = min_ms + random(max_ms - min_ms + 1);
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is in a different PR.

}

// Returns true if timer is inactive or timeout exceeded.
bool check() {
return !active_ || (millis() - start_ > interval_);
}

bool running() const {
return active_ && (millis() - start_) <= interval_;
}
Expand All @@ -385,14 +399,17 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
// Debounce to prevent false Clashes. //
// - timer_random_event_ - Interval timer for Random Hazards. //
// Controls how often Hazards can occur.//
// - timer_hazard_delay_ - Delay inbetween event trigger and //
// Hazard dps. Gap for voice to finish. //
// - timer_hazard_delay_ - Delay between event trigger and //
// Hazard DPS. Also used as a gap for //
// voice to end before stun sfx start. //
// - timer_hazard_after_revive_ - Cooldown after user revives. //
// Blocks Hazards until timer is done. //
// - timer_health_increase_ - Interval for Health recharge. //
// Controls healing rate. //
// - timer_armor_increase_ - Interval for Armor recharge. //
// Controls Armor recharge rate. //
// - timer_hazard_surge_ - Duration timer for a quick surge of //
// hazardous damage (Heat/Shock). //
//=====================================================================//

HEVTimerBase timer_clash_;
Expand All @@ -401,6 +418,7 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
HEVTimerBase timer_hazard_after_revive_;
HEVTimerBase timer_health_increase_;
HEVTimerBase timer_armor_increase_;
HEVTimerBase timer_hazard_surge_;

Hev() : PropBase() {
timer_clash_.configure(this->clash_timeout_);
Expand All @@ -409,6 +427,7 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
timer_hazard_after_revive_.configure(HEV_HAZARD_AFTER_REVIVE_MS);
timer_health_increase_.configure(HEV_HEALTH_INCREASE_MS);
timer_armor_increase_.configure(HEV_ARMOR_INCREASE_MS);
timer_hazard_surge_.configure(0);
}

const char* name() override { return "Hev"; }
Expand All @@ -433,11 +452,12 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {

Hazard current_hazard_ = HAZARD_NONE;

// Calculate Physical Damage
// Calculate Physical and Hazard Damage
void DoDamage(int damage, bool quiet = false, DamageType type = DAMAGE_PHYSICAL) {
int previous_health = health_;
int previous_armor = armor_;
int tens = health_ / 10;
int log_hazard_damage = 0;

// Damage type and calculation
switch (type) {
Expand All @@ -455,11 +475,24 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
break;

case DAMAGE_HAZARD:
int hazard_damage = damage;
if (damage == 0) {
switch (current_hazard_) {
case HAZARD_BIO: hazard_damage = 2; break;
case HAZARD_RAD: hazard_damage = 3; break;
case HAZARD_BLO: hazard_damage = 2; break;
case HAZARD_CHE: hazard_damage = 2; break;
case HAZARD_HEA: hazard_damage = 4; break;
case HAZARD_SHO: hazard_damage = 5; break;
default: hazard_damage = 1; break;
}
}
if (armor_ > 0) {
armor_ -= damage;
armor_ -= hazard_damage;
} else {
health_ -= damage;
health_ -= hazard_damage;
}
log_hazard_damage = hazard_damage;
break;
}

Expand All @@ -468,7 +501,7 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
if (armor_ < 0) armor_ = 0;

// (HEV VOICE LINE) Logic for Armor Compromised
if (previous_armor > 0 && armor_ == 0 && health_ == 0) {
if (previous_armor > 0 && armor_ == 0) {
SaberBase::DoEffect(EFFECT_USER2, 0.0);
PVLOG_NORMAL << "Armor Compromised!\n";
}
Expand All @@ -490,7 +523,8 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
}

// Print Damage, Health and Armor
PVLOG_NORMAL << "DAMAGE: -" << damage << "\n";
PVLOG_NORMAL << "DAMAGE: -" << damage << " / ";
PVLOG_NORMAL << "HAZARD DAMAGE: -" << log_hazard_damage << "\n";
PVLOG_NORMAL << "HEALTH: " << health_ << " / ";
PVLOG_NORMAL << "ARMOR: " << armor_ << "\n";
}
Expand Down Expand Up @@ -564,7 +598,6 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
PVLOG_NORMAL << "Activating Hazard.\n";
current_hazard_ = (Hazard)(1 + random(6));
SaberBase::DoEffect(EFFECT_ALT_SOUND, 0.0, current_hazard_);

} else {
PVLOG_NORMAL << "Skipping Hazard.\n";
timer_random_event_.start();
Expand All @@ -577,6 +610,7 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
// Reset timer when hazard is cleared
if (current_hazard_ == HAZARD_NONE) {
timer_hazard_delay_.reset();
timer_hazard_surge_.reset();
return;
}

Expand All @@ -587,19 +621,43 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
return;
}

// Check sequence and apply damage
// Check sequence then start surge timer or apply hazard damage
if (!timer_hazard_delay_.running()) {
DoDamage(1, false, DAMAGE_HAZARD);
// For Heat/Shock: start surge timer if not already started
if ((current_hazard_ == HAZARD_HEA || current_hazard_ == HAZARD_SHO)) {
if (!timer_hazard_surge_.active_) {
timer_hazard_surge_.configure_random(
HEV_HAZARD_SURGE_MIN_MS,
HEV_HAZARD_SURGE_MAX_MS
);
timer_hazard_surge_.start();
} else if (timer_hazard_surge_.check()) {
PVLOG_NORMAL << "Heat/Shock Hazard expired.\n";
current_hazard_ = HAZARD_NONE;
timer_hazard_delay_.reset();
timer_hazard_surge_.reset();
SaberBase::DoEffect(EFFECT_ALT_SOUND, 0.0, current_hazard_);
timer_random_event_.start();
return;
}
}
// Apply hazard damage
DoDamage(0, false, DAMAGE_HAZARD);

// Clear hazard on death
if (health_ == 0) {
current_hazard_ = HAZARD_NONE;
timer_hazard_delay_.reset();
timer_hazard_surge_.reset();
SaberBase::DoEffect(EFFECT_ALT_SOUND, 0.0, current_hazard_);
return;
}

timer_hazard_delay_.configure(HEV_HAZARD_DECREASE_MS);
// Interval for continuous damage is randomized between min and max
timer_hazard_delay_.configure_random(
HEV_HAZARD_DECREASE_MIN_MS,
HEV_HAZARD_DECREASE_MAX_MS
);
timer_hazard_delay_.start();
}
}
Expand All @@ -608,6 +666,7 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
void Revive() {
if (health_ == 0) {
timer_random_event_.reset();
timer_hazard_surge_.reset();
}
}

Expand Down Expand Up @@ -675,6 +734,7 @@ class Hev : public PROP_INHERIT_PREFIX PropBase {
SaberBase::DoEffect(EFFECT_ALT_SOUND, 0.0, current_hazard_);
timer_random_event_.reset();
timer_random_event_.start();
timer_hazard_delay_.reset();
return true;
}
// Play a no-hazard sound ?
Expand Down