mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
cc414de8d1
* Initial commit advanced fatigue * Added animation changes * Fixes, rewrites * Broadcast 3den attribute and fix UBC * Further animation tweaks * Added Eden attribute and CBA settings * Switch to CBA events * Add beautified component name * Rewrites, fixes, tweaks * Move setVars to GVARs * Add setting to disable * Switch to status effect handler for sprint and jog blocking * Add component name * Failsafe for early unit player EH * Removed raised weapon penalty for pistols * Added respawn compatibility * Tweaked side jog animation speed * Added support for virtual load * Added stamina bar * Remove debug flags * Added custom duty factor functions and values * Added structural comments * Disabled CBA settings, added ACE settings * Fixed config * Added readme * Remove leftover debug diag_logs * Improved stringtable
64 lines
3.0 KiB
Plaintext
64 lines
3.0 KiB
Plaintext
/*
|
|
* Author: BaerMitUmlaut
|
|
* Main perFrameHandler that updates fatigue values.
|
|
*
|
|
* Arguments:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
#include "script_component.hpp"
|
|
if (isNull ACE_player) exitWith {}; // Map intros
|
|
|
|
private _currentWork = REE;
|
|
private _currentSpeed = (vectorMagnitude (velocity ACE_player)) min 6;
|
|
if ((vehicle ACE_player == ACE_player) && {_currentSpeed > 0.1} && {isTouchingGround ACE_player || {underwater ACE_player}}) then {
|
|
_currentWork = [ACE_player, _currentSpeed] call FUNC(getMetabolicCosts);
|
|
_currentWork = _currentWork max REE;
|
|
};
|
|
|
|
// Calculate muscle damage increase
|
|
// Note: Muscle damage recovery is ignored as it takes multiple days
|
|
GVAR(muscleDamage) = GVAR(muscleDamage) + (_currentWork / GVAR(peakPower)) ^ 3.2 * 0.00004;
|
|
private _muscleIntegrity = 1 - GVAR(muscleDamage);
|
|
|
|
// Calculate available power
|
|
private _ae1PathwayPowerFatigued = GVAR(ae1PathwayPower) * sqrt (GVAR(ae1Reserve) / AE1_MAXRESERVE) * OXYGEN * sqrt _muscleIntegrity;
|
|
private _ae2PathwayPowerFatigued = GVAR(ae2PathwayPower) * sqrt (GVAR(ae2Reserve) / AE2_MAXRESERVE) * OXYGEN * sqrt _muscleIntegrity;
|
|
|
|
// Calculate how much power is consumed from each reserve
|
|
private _ae1Power = _currentWork min _ae1PathwayPowerFatigued;
|
|
private _ae2Power = ((_currentWork - _ae1Power) max 0) min _ae2PathwayPowerFatigued;
|
|
private _anPower = (_currentWork - _ae1Power - _ae2Power) max 0;
|
|
|
|
// Remove ATP from reserves for current work
|
|
GVAR(ae1Reserve) = GVAR(ae1Reserve) - _ae1Power / WATTSPERATP;
|
|
GVAR(ae2Reserve) = GVAR(ae2Reserve) - _ae2Power / WATTSPERATP;
|
|
GVAR(anReserve) = GVAR(anReserve) - _anPower / WATTSPERATP;
|
|
// Increase anearobic fatigue
|
|
GVAR(anFatigue) = GVAR(anFatigue) + _anPower * (0.057 / GVAR(peakPower)) * 1.1;
|
|
|
|
// Aerobic ATP reserve recovery
|
|
GVAR(ae1Reserve) = ((GVAR(ae1Reserve) + OXYGEN * 6.60 * (GVAR(ae1PathwayPower) - _ae1Power) / GVAR(ae1PathwayPower) * GVAR(recoveryFactor)) min AE1_MAXRESERVE) max 0;
|
|
GVAR(ae2Reserve) = ((GVAR(ae2Reserve) + OXYGEN * 5.83 * (GVAR(ae2PathwayPower) - _ae2Power) / GVAR(ae2PathwayPower) * GVAR(recoveryFactor)) min AE2_MAXRESERVE) max 0;
|
|
|
|
// Anaerobic ATP reserver and fatigue recovery
|
|
GVAR(anReserve) = ((GVAR(anReserve)
|
|
+ (_ae1PathwayPowerFatigued + _ae2PathwayPowerFatigued - _ae1Power - _ae2Power) / GVAR(VO2MaxPower) * 56.7 * GVAR(anFatigue) ^ 2 * GVAR(recoveryFactor)
|
|
) min AN_MAXRESERVE) max 0;
|
|
|
|
GVAR(anFatigue) = ((GVAR(anFatigue)
|
|
- (_ae1PathwayPowerFatigued + _ae2PathwayPowerFatigued - _ae1Power - _ae2Power) * (0.057 / GVAR(peakPower)) * GVAR(anFatigue) ^ 2 * GVAR(recoveryFactor)
|
|
) min 1) max 0;
|
|
|
|
private _aeReservePercentage = (GVAR(ae1Reserve) / AE1_MAXRESERVE + GVAR(ae2Reserve) / AE2_MAXRESERVE) / 2;
|
|
private _anReservePercentage = GVAR(anReserve) / AN_MAXRESERVE;
|
|
private _perceivedFatigue = 1 - (_anReservePercentage min _aeReservePercentage);
|
|
|
|
[ACE_player, _perceivedFatigue, _currentSpeed, GVAR(anReserve) == 0] call FUNC(handleEffects);
|
|
|
|
if (GVAR(enableStaminaBar)) then {
|
|
[GVAR(anReserve) / AN_MAXRESERVE] call FUNC(handleStaminaBar);
|
|
};
|