Epoch/Sources/epoch_code/compile/setup/masterLoop/Event1.sqf
vbawol a0e9ec0153 digest concept
-use the second set of GVARs to track adding and removing attributes.
-Epoch_player* vars moved to local vars only accessible inside the
master loop.
-TODO: finish digest system with a config entry to control digest
limits. Some extra logic is needed.

Basically, when you consume some food, it will not increase your hunger
level immediately but raise over time.

Each of these should have limits on how much you can store in the digest
and how much each tick the digest var can affect the local player var in
the master loop.
2017-09-20 09:23:46 -05:00

300 lines
10 KiB
Plaintext

// init
_forceBloodRise = false;
_forceFatigue = false;
_allowBloodDrop = false;
_forceStaminaDrop = false;
_warnbloodPressure = _playerBloodP > 120;
_increaseStamina = true;
_val = 0;
// AR HUD Target start
_currentTarget = objNull;
_currentTargetMode = 0;
_cursorTarget = ([10] call EPOCH_fnc_cursorTarget);
if (!isNull _cursorTarget && {!(EPOCH_target isEqualTo _cursorTarget)}) then {
_interactType = typeOf _cursorTarget;
_interaction = (_cfgObjectInteractions >> _interactType);
if (isClass(_interaction)) then {
_currentTargetMode = getNumber (_interaction >> "interactMode");
_allowTarget = switch (getNumber (_interaction >> "aliveState")) do {
case 1: {!(alive _cursorTarget)};
case 2: {(alive _cursorTarget)};
default {true};
};
if (_allowTarget) then {
_currentTarget = _cursorTarget;
};
} else {
// AllVehicles = vehicles=0, bases=1
if (_cursorTarget isKindOf "AllVehicles") then {
_currentTarget = _cursorTarget;
} else {
if (_cursorTarget isKindOf "Constructions_modular_F" || _cursorTarget isKindOf "Constructions_static_F") then {
_currentTargetMode = 1;
_currentTarget = _cursorTarget;
};
};
};
};
EPOCH_currentTarget = _currentTarget;
EPOCH_currentTargetMode = _currentTargetMode;
// AR HUD target end
// dynamic HUD start
{
_x params [["_selectedVar",[]],["_HUDclass","topRight"],["_ctrlText",""],["_criticalAttributes",[]]];
_selectedVar params [["_selVarName",""],["_selVarType",""],["_selVarSubData",""],["_extraLogicRaw",[]],["_selVarLimits",[]]];
_varIndex = _customVarNames find _selVarName;
if (_varIndex != -1 || !(_selVarLimits isEqualTo [])) then {
if (_selVarLimits isEqualTo []) then {
_selVarLimits = _customVarLimits select _varIndex;
};
_currentVarVal = [_selVarName,_varIndex,_selVarType,_selVarSubData] call EPOCH_fnc_returnHudVar;
_selVarLimits params [["_playerLimitMax",100],["_playerLimitMin",0],["_playerWarnLimit",101],["_playerCriticalLimit",101],["_playerWarnLow",0],["_playerCriticalLow",0]];
_extraLogic = false;
if !(_extraLogicRaw isEqualTo []) then {
_extraLogicRaw params [["_extraLogicType",""],["_extraLogicCond",""],["_extraLogicData",""]];
_extraLogicVarName = "";
_extraLogicDefaultValue = "";
if (_extraLogicType isEqualType []) then {
_extraLogicType params [["_extraLogicVarName",""],["_extraLogicType",""],["_extraLogicDefaultValue",""]];
};
_extraVarIndex = _customVarNames find _extraLogicVarName;
_extraLogic = [([_extraLogicVarName,_extraVarIndex,_extraLogicType,_extraLogicDefaultValue] call EPOCH_fnc_returnHudVar),_extraLogicCond,_extraLogicData] call EPOCH_fnc_arrayToLogic;
};
if (_playerLimitMax isEqualType "") then {
_playerLimitMax = missionNamespace getVariable [_playerLimitMax, 0];
};
if (_playerLimitMin isEqualType "") then {
_playerLimitMin = missionNamespace getVariable [_playerLimitMin, 0];
};
_warnLow = _currentVarVal < _playerWarnLow;
_warnHigh = _currentVarVal > _playerWarnLimit;
_criticalLow = _currentVarVal <= _playerCriticalLow;
_criticalHigh = _currentVarVal >= _playerCriticalLimit;
if (_warnHigh || _warnLow || _extraLogic) then {
_hudIndex = missionNamespace getVariable [format["EPOCH_dynHUD_%1",_HUDclass],1];
_curCtrl = [_HUDclass,_hudIndex] call epoch_getHUDCtrl;
missionNamespace setVariable [format["EPOCH_dynHUD_%1",_HUDclass], _hudIndex + 1];
if (_ctrlText isEqualType []) then {
_ctrlText = if (_warnHigh) then {_ctrlText select 0} else {_ctrlText select 1};
};
_curCtrl ctrlSetText _ctrlText;
_critical = (_criticalHigh || _criticalLow);
if (_critical) then {
_forceUpdate = "forceUpdate" in _criticalAttributes;
_forceFatigue = "forceFatigue" in _criticalAttributes;
_forceBloodRise = "forceBloodRise" in _criticalAttributes;
[_curCtrl,0.55] call epoch_2DCtrlHeartbeat;
};
// todo make this reversable or even limited to a color range.
_color = [_playerLimitMin,_playerLimitMax,_currentVarVal,1] call EPOCH_colorRange;
_curCtrl ctrlSetTextColor _color;
};
};
} forEach _hudConfigs;
// dynamic HUD end
// cause Fatigue if cold or hot, also increase blood pressure if thristy or hungry.
if (_forceBloodRise || _forceFatigue) then {
_increaseStamina = false;
} else {
if (_playerStamina > 0 && !_panic) then {
_allowBloodDrop = true;
};
};
// force Fatigue
if (_forceFatigue) then {
player setFatigue 1;
} else {
if (!_warnbloodPressure) then {
player setFatigue 0;
};
};
// Blood pressure handler
if (EPOCH_digestBloodP > 0) then {
_playerBloodP = ((_playerBloodP + EPOCH_digestBloodP) min _playerBloodPMax) max _playerBloodPMin;
} else {
if (_forceBloodRise) then {
// force Blood Pressure Rise
_playerBloodP = (_playerBloodP + 0.05) min 190;
} else {
if (_allowBloodDrop) then {
// allow player to bleed out
_lowerBPlimit = [100,0] select (isBleeding player);
_playerBloodP = _playerBloodP - 1 max _lowerBPlimit;
};
};
};
// check if player On Foot
_isOnFoot = isNull objectParent player;
if (_isOnFoot) then {
_val = log(abs(speed player));
_staminaThreshold = [0.7,0.3] select EPOCH_playerIsSwimming;
if (_val > _staminaThreshold) then {
_forceStaminaDrop = true;
};
};
// Decrease Stamina
if (_forceStaminaDrop) then {
_playerStamina = (_playerStamina - (_val/4)) max 0;
} else {
// Increase Stamina if player is not Fatigued
if (_increaseStamina && (getFatigue player) == 0) then {
_playerStamina = (_playerStamina + 0.5) min EPOCH_playerStaminaMax;
};
};
// ~ debug
if (EPOCH_debugMode) then {
call EPOCH_debugMonitor;
};
// player to player trade loop
call EPOCH_TradeLoop;
// blank out unused hud elements and prepare for next loop
_hudIndex = missionNamespace getVariable [format["EPOCH_dynHUD_%1","topRight"],1];
for "_i" from _hudIndex to 9 do {
_c = ["topRight",_i] call epoch_getHUDCtrl;
_c ctrlSetText "";
};
missionNamespace setVariable [format["EPOCH_dynHUD_%1","topRight"], nil];
// EPOCH TraderMissions
if (!isnil "EPOCH_ResetTraderMission") then {
if (!isNil "EPOCH_taskMarker") then{
EPOCH_taskMarker params ["_mkrName","_taskMarkerVis"];
[player,_taskMarkerVis,_mkrName] remoteExec ["EPOCH_server_removeMarker",2];
EPOCH_taskMarker = nil;
};
if !(_EPOCH_TraderMissionArray isequalto []) then {
_EPOCH_TraderMissionArray params ["_mainblock"];
_mainblock params ["","","","","",["_missionCleanUpCall",""]];
call _missionCleanUpCall;
};
EPOCH_ActiveTraderMission = [];
_EPOCH_TraderMissionArray = [];
_LastMissionTrigger = 0;
["Mission sucessfully resettet", 5] call Epoch_message;
EPOCH_ResetTraderMission = nil;
};
if !(EPOCH_ActiveTraderMission isequalto []) then {
if (_EPOCH_TraderMissionArray isequalto []) then {
_EPOCH_TraderMissionArray = EPOCH_ActiveTraderMission call _EPOCH_BuildTraderMisson;
};
_EPOCH_TraderMissionArray params ["_mainblock","_taskDelay","_triggerintervall","_taskDialogues","_taskEvents","_taskFailed","_taskComplete"];
if (diag_ticktime < _taskDelay) exitwith {};
if (diag_ticktime < _LastMissionTrigger + _triggerintervall) exitwith {};
_LastMissionTrigger = diag_ticktime;
_mainblock params ["_inGameTasksconfig","_taskName","_unit","_taskItem","_taskTitle","_missionCleanUpCall","_taskCleanup"];
_taskComplete params ["_taskCompleteCond","_taskReward","_taskCompleteDiags","_taskCompleteCall","_taskNextTrigger"];
_taskFailed params ['_taskFailedCond','_taskFailTime','_taskFailedDiags','_taskFailedSQF','_taskFailedCall'];
if (diag_ticktime > _taskFailTime || call _taskFailedCond) exitwith {
if (count _taskFailedDiags > 0) then {
_diag = selectRandom _taskFailedDiags;
[format ["%1",_diag], 5] call Epoch_message;
};
if !(_taskFailedSQF isequalto '') then {
call compile format ["[_taskName,_plyr,_unit,_taskItem] execVM ""%1""",_taskFailedSQF];
};
if !(str(_taskFailedCall) == "{}") then {
call _taskFailedCall;
};
if (!isNil "EPOCH_taskMarker") then{
EPOCH_taskMarker params ['_mkrName','_taskMarkerVis'];
[player,_taskMarkerVis,_mkrName] remoteExec ["EPOCH_server_removeMarker",2];
EPOCH_taskMarker = nil;
};
call _missionCleanUpCall;
EPOCH_ActiveTraderMission = [];
_EPOCH_TraderMissionArray = [];
_LastMissionTrigger = 0;
};
if (call _taskCompleteCond) exitwith {
if (count _taskCompleteDiags > 0) then {
_diag = selectrandom _taskCompleteDiags;
[format ["%1",_diag], 5] call Epoch_message;
};
if(count _taskReward > 0) then {
[player,Epoch_personalToken,_taskReward,[],objNull,false] remoteExec ["EPOCH_Server_createObject",2];
};
if !(str(_taskCompleteCall) == "{}") then {
call _taskCompleteCall;
};
if (_taskCleanup isequalto 1) then {
if (!isNil "EPOCH_taskMarker") then{
EPOCH_taskMarker params ['_mkrName','_taskMarkerVis'];
[player,_taskMarkerVis,_mkrName] remoteExec ["EPOCH_server_removeMarker",2];
EPOCH_taskMarker = nil;
};
call _missionCleanUpCall;
};
if (count _taskNextTrigger > 0) then {
_nexttask = selectrandom _taskNextTrigger;
_EPOCH_TraderMissionArray = [_inGameTasksconfig,_nexttask] call _EPOCH_BuildTraderMisson;
}
else {
EPOCH_ActiveTraderMission = [];
_EPOCH_TraderMissionArray = [];
};
_LastMissionTrigger = 0;
};
{
_x params ["_taskEventCond","_taskEventCALL","_taskEventTasks"];
if (call _taskEventCond) exitwith {
call _taskEventCALL;
if (count _taskEventTasks > 0) exitwith {
_task = selectrandom _taskEventTasks;
_EPOCH_TraderMissionArray = [_inGameTasksconfig,_task] call _EPOCH_BuildTraderMisson;
};
_taskEvents deleteat _foreachindex;
};
} foreach _taskEvents;
{
_x params ['_taskDiagCond','_taskDiag'];
if (call _taskDiagCond) exitwith {
_diag = selectRandom _taskDiag;
if !(_diag isequalto "") then {
[format ["%1",_diag], 5] call Epoch_message;
};
_taskDialogues deleteat _foreachindex;
};
} foreach _taskDialogues;
};
// Update read only vars
EPOCH_playerRadiation = _playerRadiation;
EPOCH_playerAliveTime = _playerAliveTime;
EPOCH_playerBloodP = _playerBloodP;
EPOCH_playerNuisance = _playerNuisance;
EPOCH_playerHunger = _playerHunger;
EPOCH_playerThirst = _playerThirst;
EPOCH_playerSoiled = _playerSoiled;
EPOCH_playerToxicity = _playerToxicity;
EPOCH_playerImmunity = _playerImmunity;
EPOCH_playerTemp = _playerTemp;
EPOCH_playerWet = _playerWet;
EPOCH_playerEnergy = _playerEnergy;
EPOCH_playerAlcohol = _playerAlcohol;
EPOCH_playerStamina = _playerStamina;
// force update
if (EPOCH_forceUpdateNow) then {
EPOCH_forceUpdateNow = false;
call _fnc_forceUpdate;
};