forge/arma/server/addons/task/functions/fnc_initMissionSetupService.sqf
2026-06-03 22:48:59 -05:00

234 lines
10 KiB
Plaintext

#include "..\script_component.hpp"
/*
* Author: IDSolutions
* Initializes the framework mission setup service.
*
* Arguments:
* None
*
* Return Value:
* Mission setup service object <HASHMAP OBJECT>
*
* Public: No
*/
#pragma hemtt ignore_variables ["_self"]
GVAR(MissionSetupServiceBaseClass) = compileFinal createHashMapFromArray [
["#type", "MissionSetupServiceBaseClass"],
["getMissionConfig", compileFinal {
private _missionConfig = missionConfigFile >> "CfgMissions";
if !(isClass _missionConfig) then {
_missionConfig = configFile >> "CfgMissions";
};
_missionConfig
}],
["getServicePricingConfig", compileFinal {
private _pricingConfig = missionConfigFile >> "CfgServicePricing";
if !(isClass _pricingConfig) then {
_pricingConfig = configFile >> "CfgServicePricing";
};
_pricingConfig
}],
["numberOrDefault", compileFinal {
params ["_value", "_default"];
if (_value isEqualType "") exitWith {
private _parsed = parseNumber _value;
[_default, _parsed] select (_parsed isEqualType 0)
};
if (_value isEqualType 0) exitWith { _value };
_default
}],
["resolveFactionSide", compileFinal {
params [["_faction", "", [""]], ["_fallbackSide", east]];
private _cfgFaction = configFile >> "CfgFactionClasses" >> _faction;
if !(isClass _cfgFaction) exitWith { _fallbackSide };
private _sideNumber = -1;
if (isNumber (_cfgFaction >> "side")) then {
_sideNumber = getNumber (_cfgFaction >> "side");
} else {
private _sideText = toUpperANSI getText (_cfgFaction >> "side");
_sideNumber = switch (_sideText) do {
case "0";
case "EAST";
case "OPFOR": { 0 };
case "2";
case "GUER";
case "GUERRILA";
case "GUERRILLA";
case "INDEPENDENT";
case "RESISTANCE": { 2 };
default { -1 };
};
};
switch (_sideNumber) do {
case 0: { east };
case 2: { resistance };
default { _fallbackSide };
}
}],
["apply", compileFinal {
if !(isServer) exitWith { false };
params [
["_overrides", createHashMap, [createHashMap]]
];
private _missionConfig = _self call ["getMissionConfig", []];
private _paramOrDefault = {
params ["_varName", "_default", "_overrides"];
if (_varName in _overrides) exitWith {
_overrides getOrDefault [_varName, _default]
};
private _paramValue = [_varName, _default] call BIS_fnc_getParamValue;
missionNamespace getVariable [_varName, _paramValue]
};
private _serviceDefault = {
params ["_varName", "_default"];
private _serviceConfig = _self call ["getServicePricingConfig", []];
if (isNumber (_serviceConfig >> _varName)) exitWith {
getNumber (_serviceConfig >> _varName)
};
_default
};
private _maxConcurrent = [
["maxConcurrentMissions", getNumber (_missionConfig >> "maxConcurrentMissions"), _overrides] call _paramOrDefault,
3
] call (_self get "numberOrDefault");
private _interval = [
["missionInterval", getNumber (_missionConfig >> "missionInterval"), _overrides] call _paramOrDefault,
300
] call (_self get "numberOrDefault");
private _locationReuseCooldown = [
["locationReuseCooldown", getNumber (_missionConfig >> "locationReuseCooldown"), _overrides] call _paramOrDefault,
900
] call (_self get "numberOrDefault");
private _moneyMin = [["moneyMin", 500, _overrides] call _paramOrDefault, 500] call (_self get "numberOrDefault");
private _moneyMax = [["moneyMax", 1000, _overrides] call _paramOrDefault, 1000] call (_self get "numberOrDefault");
private _repMin = [["reputationMin", 25, _overrides] call _paramOrDefault, 25] call (_self get "numberOrDefault");
private _repMax = [["reputationMax", 100, _overrides] call _paramOrDefault, 100] call (_self get "numberOrDefault");
private _penMin = [["penaltyMin", -5, _overrides] call _paramOrDefault, -5] call (_self get "numberOrDefault");
private _penMax = [["penaltyMax", -25, _overrides] call _paramOrDefault, -25] call (_self get "numberOrDefault");
private _timeMin = [["timeLimitMin", 600, _overrides] call _paramOrDefault, 600] call (_self get "numberOrDefault");
private _timeMax = [["timeLimitMax", 900, _overrides] call _paramOrDefault, 900] call (_self get "numberOrDefault");
private _medicalSpawnCost = [["medicalSpawnCost", ["medicalSpawnCost", 100] call _serviceDefault, _overrides] call _paramOrDefault, 100] call (_self get "numberOrDefault");
private _medicalHealCost = [["medicalHealCost", ["medicalHealCost", 100] call _serviceDefault, _overrides] call _paramOrDefault, 100] call (_self get "numberOrDefault");
private _serviceRepairCost = [["serviceRepairCost", ["serviceRepairCost", 500] call _serviceDefault, _overrides] call _paramOrDefault, 500] call (_self get "numberOrDefault");
private _serviceRearmCost = [["serviceRearmCost", ["serviceRearmCost", 500] call _serviceDefault, _overrides] call _paramOrDefault, 500] call (_self get "numberOrDefault");
private _fuelCost = [["fuelCost", ["fuelCost", 5] call _serviceDefault, _overrides] call _paramOrDefault, 5] call (_self get "numberOrDefault");
private _transportBaseFare = [["transportBaseFare", ["transportBaseFare", 100] call _serviceDefault, _overrides] call _paramOrDefault, 100] call (_self get "numberOrDefault");
private _transportPricePerKm = [["transportPricePerKm", ["transportPricePerKm", 50] call _serviceDefault, _overrides] call _paramOrDefault, 50] call (_self get "numberOrDefault");
private _generatorProvider = _overrides getOrDefault ["generatorProvider", GETGVAR(generatorProvider,"builtin")];
if !(_generatorProvider isEqualType "") then { _generatorProvider = str _generatorProvider; };
_generatorProvider = toLowerANSI _generatorProvider;
if !(_generatorProvider in ["builtin", "custom"]) then { _generatorProvider = "builtin"; };
private _enemyFaction = _overrides getOrDefault [
"enemyFaction",
GETMVAR(ENEMY_FACTION_STR,GETMVAR(enemyFaction,"IND_G_F"))
];
if !(_enemyFaction isEqualType "") then { _enemyFaction = str _enemyFaction; };
if (_enemyFaction isEqualTo "") then { _enemyFaction = "IND_G_F"; };
_maxConcurrent = (_maxConcurrent max 1) min 50;
_interval = _interval max 1;
_locationReuseCooldown = _locationReuseCooldown max 0;
_moneyMin = _moneyMin max 0;
_moneyMax = _moneyMax max _moneyMin;
_repMin = _repMin max -100000;
_repMax = _repMax max _repMin;
_penMin = _penMin min 0;
_penMax = _penMax min 0;
_timeMin = _timeMin max 0;
_timeMax = _timeMax max _timeMin;
_medicalSpawnCost = _medicalSpawnCost max 0;
_medicalHealCost = _medicalHealCost max 0;
_serviceRepairCost = _serviceRepairCost max 0;
_serviceRearmCost = _serviceRearmCost max 0;
_fuelCost = _fuelCost max 0;
_transportBaseFare = _transportBaseFare max 0;
_transportPricePerKm = _transportPricePerKm max 0;
private _settings = createHashMapFromArray [
["useMenuSettings", true],
["maxConcurrentMissions", _maxConcurrent],
["missionInterval", _interval],
["locationReuseCooldown", _locationReuseCooldown],
["moneyMin", _moneyMin],
["moneyMax", _moneyMax],
["reputationMin", _repMin],
["reputationMax", _repMax],
["penaltyMin", _penMin],
["penaltyMax", _penMax],
["timeLimitMin", _timeMin],
["timeLimitMax", _timeMax],
["medicalSpawnCost", _medicalSpawnCost],
["medicalHealCost", _medicalHealCost],
["serviceRepairCost", _serviceRepairCost],
["serviceRearmCost", _serviceRearmCost],
["fuelCost", _fuelCost],
["transportBaseFare", _transportBaseFare],
["transportPricePerKm", _transportPricePerKm],
["enemyFaction", _enemyFaction],
["generatorProvider", _generatorProvider]
];
SETMPVAR(GVAR(missionSetup_settings),_settings);
SETMPVAR(GVAR(missionSetup_settingsApplied),true);
SETMPVAR(GVAR(generatorProvider),_generatorProvider);
{
missionNamespace setVariable [_x, _settings getOrDefault [_x, 0], true];
} forEach [
"medicalSpawnCost",
"medicalHealCost",
"serviceRepairCost",
"serviceRearmCost",
"fuelCost",
"transportBaseFare",
"transportPricePerKm"
];
private _side = _self call ["resolveFactionSide", [_enemyFaction, east]];
ENEMY_SIDE = _side;
SETMPVAR(ENEMY_FACTION_STR,_enemyFaction);
publicVariable "ENEMY_SIDE";
["INFO", format [
"Framework mission setup applied. Faction=%1, Side=%2, MaxConcurrent=%3, Interval=%4, GeneratorProvider=%5",
_enemyFaction,
_side,
_maxConcurrent,
_interval,
_generatorProvider
]] call EFUNC(common,log);
if !(isNil QEGVAR(common,EventBus)) then {
EGVAR(common,EventBus) call ["emit", [
"mission.setup.applied",
createHashMapFromArray [["settings", _settings]],
createHashMapFromArray [["source", "task"]]
]];
};
true
}]
];
GVAR(MissionSetupService) = createHashMapObject [GVAR(MissionSetupServiceBaseClass)];
GVAR(MissionSetupService)