Skip to content

Commit

Permalink
Merge branch 'more-unstable-internal' into misc-fixes-batch1
Browse files Browse the repository at this point in the history
  • Loading branch information
Tiny-DM authored Jan 9, 2024
2 parents 3d8ecf0 + b7a2add commit b792d20
Show file tree
Hide file tree
Showing 77 changed files with 1,208 additions and 356 deletions.
747 changes: 743 additions & 4 deletions A3A/addons/core/Stringtable.xml

Large diffs are not rendered by default.

20 changes: 11 additions & 9 deletions A3A/addons/core/functions/AI/fn_artySupport.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ _mrkFinal setMarkerColorLocal "ColorRed";

if (_typeArty == "BARRAGE") then
{
_mrkFinal setMarkerTextLocal "Artillery Barrage Begin";
_mrkFinal setMarkerTextLocal localize "STR_A3A_fn_ai_artySupport_mrkFinal";
positionTel = [];

[_titleStr, localize "STR_A3A_fn_ai_artySupport_selectposend"] call A3A_fnc_customHint;
Expand Down Expand Up @@ -173,7 +173,7 @@ if ((isNil "roundsX") and (_typeArty != "BARRAGE")) exitWith {deleteMarkerLocal

if (_typeArty != "BARRAGE") then
{
_mrkFinal setMarkerTextLocal "Arty Strike";
_mrkFinal setMarkerTextLocal localize "STR_A3A_fn_ai_artySupport_artyStrike";
_rounds = roundsX;
_roundsMax = _rounds;
roundsX = nil;
Expand All @@ -195,7 +195,8 @@ if ((not(_markerX in forcedSpawn)) and (_positionTel distance (getMarkerPos _mar
publicVariable "forcedSpawn";
};

_textX = format ["Requesting fire support on Grid %1. %2 Rounds.", mapGridPosition _positionTel, round _rounds];
_roundPlural = if (round _rounds == 1) then {localize "STR_A3A_fn_ai_artySupport_singleRound"} else {localize "STR_A3A_fn_ai_artySupport_multiRound"};
_textX = format [localize "STR_A3A_fn_ai_artySupport_fireMission", mapGridPosition _positionTel, round _rounds, _roundPlural];
[theBoss,"sideChat",_textX] remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];

if (_typeArty == "BARRAGE") then
Expand All @@ -204,19 +205,19 @@ if (_typeArty == "BARRAGE") then
_mrkFinal2 setMarkerShapeLocal "ICON";
_mrkFinal2 setMarkerTypeLocal "hd_destroy";
_mrkFinal2 setMarkerColorLocal "ColorRed";
_mrkFinal2 setMarkerTextLocal "Artillery Barrage End";
_mrkFinal2 setMarkerTextLocal localize "STR_A3A_fn_ai_artySupport_mrkFinal2";
_ang = [_positionTel,_positionTel2] call BIS_fnc_dirTo;
sleep 5;
_eta = (_artyArrayDef1 select 0) getArtilleryETA [_positionTel, ((getArtilleryAmmo [(_artyArrayDef1 select 0)]) select 0)];
_timeX = time + _eta;
_textX = format ["Acknowledged. Fire mission is inbound. ETA %1 secs for the first impact.",round _eta];
[petros,"sideChat",_textX]remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];
_textX = format [localize "STR_A3A_fn_ai_artySupport_yesBarrage",round _eta];
[petros,"sideChat",_textX] remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];
[_timeX] spawn
{
private ["_timeX"];
_timeX = _this select 0;
waitUntil {sleep 1; time > _timeX};
[petros,"sideChat","Splash. Out"] remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];
[petros,"sideChat",localize "STR_A3A_fn_ai_artySupport_splash"] remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];
};
};

Expand Down Expand Up @@ -275,14 +276,15 @@ if (_typeArty != "BARRAGE") then
#define ARTILLERY_ERROR_INFORMATION [_positionTel, ((getArtilleryAmmo [(_artyArrayDef1 select 0)]) select 0)]
Error_4("Params: %1,%2,%3,%4,%5",_artyArrayDef1 select 0,_positionTel,((getArtilleryAmmo [(_artyArrayDef1 select 0)]) select 0),(_artyArrayDef1 select 0) getArtilleryETA ARTILLERY_ERROR_INFORMATION);
};
_textX = format ["Acknowledged. Fire mission is inbound. %2 Rounds fired. ETA %1 secs.",round _eta,_roundsMax - _rounds];
_roundPlural = if ((_roundsMax - _rounds) == 1) then {localize "STR_A3A_fn_ai_artySupport_singleRound"} else {localize "STR_A3A_fn_ai_artySupport_multiRound"};
_textX = format [localize "STR_A3A_fn_ai_artySupport_yesSingle",round _eta,_roundsMax - _rounds, _roundPlural];
[petros,"sideChat",_textX] remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];
};

if (_typeArty != "BARRAGE") then
{
waitUntil {sleep 1; time > _timeX};
[petros,"sideChat","Splash. Out."] remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];
[petros,"sideChat",localize "STR_A3A_fn_ai_artySupport_splash"] remoteExec ["A3A_fnc_commsMP",[teamPlayer,civilian]];
};
sleep 10;
deleteMarkerLocal _mrkFinal;
Expand Down
16 changes: 8 additions & 8 deletions A3A/addons/core/functions/AI/fn_autoLoot.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@ _truckX = _this select 1;
if ((isPlayer _unit) or (player != leader group player)) exitWith {};
if !([_unit] call A3A_fnc_canFight) exitWith {};
//_helping = _unit getVariable "helping";
if (_unit getVariable ["helping",false]) exitWith {_unit groupChat "I cannot rearm right now. I'm healing a comrade"};
if (_unit getVariable ["helping",false]) exitWith {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noHelping"};
_rearming = _unit getVariable "rearming";
if (_rearming) exitWith {_unit groupChat "I am currently rearming. Cancelling."; _unit setVariable ["rearming",false]};
if (_unit == gunner _truckX) exitWith {_unit groupChat "I cannot rearm right now. I'm manning this gun"};
if (!canMove _truckX) exitWith {_unit groupChat "It is useless to load my vehicle, as it needs repairs"};
if (_rearming) exitWith {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noDoing"; _unit setVariable ["rearming",false]};
if (_unit == gunner _truckX) exitWith {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noStatic"};
if (!canMove _truckX) exitWith {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noRepairs"};

_objectsX = [];
_hasBox = false;
_weaponX = "";
_weaponsX = [];
_bigTimeOut = time + 120;
_objectsX = nearestObjects [_unit, ["WeaponHolderSimulated", "GroundWeaponHolder", "WeaponHolder"], 50];
if (count _objectsX == 0) exitWith {_unit groupChat "I see no corpses here to loot"};
if (count _objectsX == 0) exitWith {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noCorpses"};

_target = objNull;
_distanceX = 51;
Expand All @@ -43,10 +43,10 @@ if (_unit distance _objectX < _distanceX) then
};
} forEach _objectsX;

if (isNull _target) exitWith {_unit groupChat "There is nothing to loot"};
if (isNull _target) exitWith {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noLoot"};
_target setVariable ["busy",true];
_unit setVariable ["rearming",true];
_unit groupChat "Starting looting";
_unit groupChat localize "STR_A3A_fn_ai_autoLoot_startLoot";

_originalLoadout = getUnitLoadout _unit;

Expand Down Expand Up @@ -178,7 +178,7 @@ while {_continuar and ([_unit] call A3A_fnc_canFight) and (_unit getVariable "re
};
if (!_continuar) then
{
_unit groupChat "No more weapons to loot"
_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noWeapons"
};
//if (primaryWeapon _unit == "") then {_unit action ["TakeWeapon",_truckX,_Pweapon]; sleep 3};
//if ((secondaryWeapon _unit == "") and (_Sweapon != "")) then {_unit action ["TakeWeapon",_truckX,_Sweapon]};
Expand Down
43 changes: 22 additions & 21 deletions A3A/addons/core/functions/AI/fn_autoRearm.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ if (isPlayer _unit) exitWith {};
if !([_unit] call A3A_fnc_canFight) exitWith {};

private _inPlayerGroup = (isPlayer (leader _unit));
if (_unit getVariable ["helping",false]) exitWith {if (_inPlayerGroup) then {_unit groupChat "I cannot rearm right now. I'm healing a comrade"}};
if (_unit getVariable ["helping",false]) exitWith {if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noHelping"}};

private _rearming = _unit getVariable ["rearming",false];
if (_rearming) exitWith {if (_inPlayerGroup) then {_unit groupChat "I am currently rearming. Cancelling."; _unit setVariable ["rearming",false]}};
if (_rearming) exitWith {if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoLoot_noDoing"; _unit setVariable ["rearming",false]}};
if (vehicle _unit != _unit) exitWith {};
_unit setVariable ["rearming",true];

Expand Down Expand Up @@ -61,15 +61,15 @@ if ((_primaryWeapon in FactionGet(reb,"initialRebelEquipment")) || (_primaryWeap
_unit stop false;
if (!((alive _selectedContainer) || (_selectedContainer isKindOf "ReammoBox_F"))) then {_selectedContainer setVariable ["busy",true]};
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking a better weapon"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getGun"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if ((unitReady _unit) && ([_unit] call A3A_fnc_canFight) && (_unit distance _selectedContainer > 3) && (_selectedContainer isKindOf "ReammoBox_F") && (!isNull _selectedContainer)) then {_unit setPos position _selectedContainer};
if (_unit distance _selectedContainer < 3) then {
_unit action ["TakeWeapon",_selectedContainer,_selectedWeapon];
sleep 5;
if (primaryWeapon _unit isEqualTo _selectedWeapon) then {
if (_inPlayerGroup) then {_unit groupChat "I have a better weapon now"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_haveGun"};
if (_selectedContainer isKindOf "ReammoBox_F") then {_unit action ["rearm",_selectedContainer]};
};
};
Expand Down Expand Up @@ -111,21 +111,22 @@ if ((_foundItem) && (_unit getVariable "rearming")) then {
_unit stop false;
if (!((alive _selectedContainer) || (_selectedContainer isKindOf "ReammoBox_F"))) then {_selectedContainer setVariable ["busy",true]};
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Rearming"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_rearming"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if ((unitReady _unit) && ([_unit] call A3A_fnc_canFight) && (_unit distance _selectedContainer > 3) && (_selectedContainer isKindOf "ReammoBox_F") && (!isNull _selectedContainer)) then {_unit setPos position _selectedContainer};
if (_unit distance _selectedContainer < 3) then {
_unit action ["rearm",_selectedContainer];
if ({_x in _primaryMagazines} count (magazines _unit) >= _targetMagazines) then {
if (_inPlayerGroup) then {_unit groupChat "Rearmed"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_rearmed";
} else {
if (_inPlayerGroup) then {_unit groupChat "Partially Rearmed"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_partRearmed"};
};
};
_selectedContainer setVariable ["busy",false];
};
} else {
if (_inPlayerGroup) then {_unit groupChat "No source to rearm my primary weapon"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_noSourcePrim"};
};

_foundItem = false;
Expand All @@ -152,15 +153,15 @@ if ((_secondaryWeapon == "") && (loadAbs _unit < 340)) then {
_unit stop false;
if ((!alive _selectedContainer) || (!(_selectedContainer isKindOf "ReammoBox_F"))) then {_selectedContainer setVariable ["busy",true]};
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking a secondary weapon"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getSec"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if ((unitReady _unit) && ([_unit] call A3A_fnc_canFight) && (_unit distance _selectedContainer > 3) && (_selectedContainer isKindOf "ReammoBox_F") && (!isNull _selectedContainer)) then {_unit setPos position _selectedContainer};
if (_unit distance _selectedContainer < 3) then {
_unit action ["TakeWeapon",_selectedContainer,_selectedWeapon];
sleep 3;
if (secondaryWeapon _unit == _selectedWeapon) then {
if (_inPlayerGroup) then {_unit groupChat "I have a secondary weapon now"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_haveSec"};
if (_selectedContainer isKindOf "ReammoBox_F") then {sleep 3;_unit action ["rearm",_selectedContainer]};
};
};
Expand Down Expand Up @@ -200,7 +201,7 @@ if (_secondaryWeapon != "") then {
_unit stop false;
if (!alive _selectedContainer) then {_selectedContainer setVariable ["busy",true]};
_unit doMove (position _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Rearming"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_rearming"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if ((unitReady _unit) && ([_unit] call A3A_fnc_canFight) && (_unit distance _selectedContainer > 3) && (_selectedContainer isKindOf "ReammoBox_F") && (!isNull _selectedContainer)) then {_unit setPos position _selectedContainer};
Expand All @@ -216,14 +217,14 @@ if (_secondaryWeapon != "") then {
};

if ({_x in _primaryMagazines} count (magazines _unit) >= 2) then {
if (_inPlayerGroup) then {_unit groupChat "Rearmed"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_rearmed"};
} else {
if (_inPlayerGroup) then {_unit groupChat "Partially Rearmed"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_partRearmed"};
};
};
_selectedContainer setVariable ["busy",false];
} else {
if (_inPlayerGroup) then {_unit groupChat "No source to rearm my secondary weapon"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_noSourceSec"};
};
sleep 3;
};
Expand All @@ -244,7 +245,7 @@ if (!haveRadio && {!(_unit call A3A_fnc_hasARadio)}) then {
_unit stop false;
_selectedContainer setVariable ["busy",true];
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking a Radio"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getRadio"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if (_unit distance _selectedContainer < 3) then {
Expand Down Expand Up @@ -274,7 +275,7 @@ if (hmd _unit == "") then {
_selectedContainer setVariable ["busy",true];
private _hmd = hmd _selectedContainer;
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking NV Googles"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getNVGs"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if (_unit distance _selectedContainer < 3) then {
Expand Down Expand Up @@ -303,7 +304,7 @@ if (!(headgear _unit in allArmoredHeadgear)) then {
_selectedContainer setVariable ["busy",true];
private _helmet = headgear _selectedContainer;
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking a Helmet"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getHelm"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if (_unit distance _selectedContainer < 3) then {
Expand Down Expand Up @@ -332,7 +333,7 @@ if ({_x == "FirstAidKit"} count (items _unit) < _targetFAKs) then {
_unit stop false;
_selectedContainer setVariable ["busy",true];
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking a First Aid Kit"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getFAK"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if (_unit distance _selectedContainer < 3) then {
Expand Down Expand Up @@ -362,7 +363,7 @@ if ((_foundItem) && (_unit getVariable "rearming")) then {
_unit stop false;
_selectedContainer setVariable ["busy",true];
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking a a better vest"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getVest"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if (_unit distance _selectedContainer < 3) then {
Expand Down Expand Up @@ -395,7 +396,7 @@ if (backpack _unit == "") then {
_unit stop false;
_selectedContainer setVariable ["busy",true];
_unit doMove (getPosATL _selectedContainer);
if (_inPlayerGroup) then {_unit groupChat "Picking a Backpack"};
if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_getPack"};
_timeOut = time + 60;
waitUntil {sleep 1; !([_unit] call A3A_fnc_canFight) || (isNull _selectedContainer) || (_unit distance _selectedContainer < 3) || (_timeOut < time) || (unitReady _unit)};
if (_unit distance _selectedContainer < 3) then {
Expand All @@ -413,5 +414,5 @@ if (backpack _unit == "") then {
};

_unit doFollow (leader _unit);
if (!_needsRearm) then {if (_inPlayerGroup) then {_unit groupChat "No need to rearm"}} else {if (_inPlayerGroup) then {_unit groupChat "Rearming Done"}};
if (!_needsRearm) then {if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_noNeed"}} else {if (_inPlayerGroup) then {_unit groupChat localize "STR_A3A_fn_ai_autoRearm_done"}};
_unit setVariable ["rearming",false];
17 changes: 7 additions & 10 deletions A3A/addons/core/functions/AI/fn_captureX.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ private _response = "";
private _fleeSide = _sideX;

if (_recruiting) then {
_playerX globalChat "How about joining the good guys?";
_playerX globalChat localize "STR_A3A_fn_ai_captureX_recr1";

private _chance = 0;
if (_sideX == Occupants) then
Expand All @@ -33,24 +33,20 @@ if (_recruiting) then {
if (random 100 < _chance) then
{
_modAggro = [1, 30];
_response = "Why not? It can't be any worse.";
_response = localize "STR_A3A_fn_ai_captureX_recr_yes1";
_modHR = true;
_fleeSide = teamPlayer;
}
else
{
_response = "Screw you!";
_response = localize "STR_A3A_fn_ai_captureX_recr_no1";
_modAggro = [0, 0];
};
}
else {
_playerX globalChat "Go back to your base and tell your comrades we are not enemies. We just want to live in peace";
_response = selectRandom [
"Okay, thank you. I owe you my life",
"Thank you. I swear you won't regret it!",
"Thank you, I won't forget this!"
];

_playerX globalChat localize "STR_A3A_fn_ai_captureX_dismiss";
private _responseNum = str selectRandom [1,2,3];
_response = localize ("STR_A3A_fn_ai_captureX_libresponse" + _responseNum);
_modAggro = [-3, 30];
};

Expand All @@ -70,3 +66,4 @@ if (alive _unit && {!(_unit getVariable ["incapacitated", false])}) then

deleteVehicle _unit;
deleteGroup _group;

6 changes: 3 additions & 3 deletions A3A/addons/core/functions/AI/fn_help.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ private _fnc_doHeal = {
sleep 10; true;
};
if (_cured && _medic != _target && _isPlayerGroup) then {
_medic groupChat format ["You are ready %1",name _target];
_medic groupChat format [localize "STR_A3A_fn_ai_heal_ready",name _target];
};
_medic stop false;
_target stop false;
Expand All @@ -55,13 +55,13 @@ if (_medicX != _unit) then
// Is this one even used? Never seen it
if !(_unit getVariable ["incapacitated",false]) then
{
if (_isPlayerGroup) then {_unit groupChat format ["Comrades, this is %1. I'm hurt!", name _unit]};
if (_isPlayerGroup) then {_unit groupChat format [localize "STR_A3A_fn_ai_heal_hurt", name _unit]};
playSound3D [(selectRandom injuredSounds),_unit,false, getPosASL _unit, 1, 1, 50];
};

// Fire helping message if in player group
if (_isPlayerGroup) then {
_medicX groupChat format ["Wait a minute comrade %1, I will patch you up.", name _unit]
_medicX groupChat format [localize "STR_A3A_fn_ai_heal_support", name _unit]
};

// Actual helping hint for player
Expand Down
Loading

0 comments on commit b792d20

Please sign in to comment.