A3-Conquest.Altis / DAC / AI_1 / DAC_Add_Behaviour.sqf
DAC_Add_Behaviour.sqf
Raw
//////////////////////////////
//    Dynamic-AI-Creator    //
//    Version 3.1b - 2014   //
//--------------------------//
//    DAC_Add_behaviour     //
//--------------------------//
//    Script by Silola      //
//    silola@freenet.de     //
//////////////////////////////

private	[
			"_group","_groupid","_i","_art","_maxrad","_maxtime","_zskill","_leader","_target","_curwp","_curBH","_firemark","_cargoA","_call","_callg",
			"_curCM","_run","_go","_allCargo","_cargoG","_vehG","_looktime","_id","_newtarget","_troublepos","_searcharea","_searchcount","_wx","_wy","_rd","_pos"
		];
		
_group = _this select 0;_art = _this select 1;_zskill = _this select 2;_i = 0;_id = 0;_firemark = [];_cargoA = [];_callg = [];
_searcharea = 0;_searchcount = 0;_leader = leader _group;_target = objNull;_allCargo = [];_cargoG = [];_vehG = [];_troublepos = [];_call = [];_pos = [];
_curwp = 0;_curBH = "";_curCM = "";_run = 2;_go = 0;_timestep = time + 20;_groupid = 1;_looktime = 10;_newtarget = objNull;_wx = 0;_wy = 0;_rd = 0;
_DAC_Arrays = ["DAC_All_Groups","DAC_Help_Groups","DAC_Fire_Groups","DAC_Radio_Groups","DAC_Cover_Groups","DAC_Call_Groups","DAC_Hit_Groups","DAC_No_Support","DAC_Min_Groups","DAC_Arti_Array"];

if(format["%1",_group getVariable "getout_dac"] != "<NULL>") then
{
	if((_group getVariable "getout_dac") == 1) then
	{
		_group setVariable ["getout_dac", 0, false];
	};
}
else
{
	_group setVariable ["getout_dac", 0, false];
};

{if(_x != (vehicle _x)) then {if(!((vehicle _x) in _vehG)) then {_vehG set [count _vehG,(vehicle _x)]}}}foreach units _group;
sleep 0.1;
if(count _vehG > 0) then
{
	while{_i < count _vehG} do
	{
		
		_cargoA = crew (_vehG select _i);
		if(count _cargoA > 1) then
		{
			{if((_x != (driver (_vehG select _i))) && (_x != (gunner (_vehG select _i))) && (_x != (commander (_vehG select _i)))) then {_allCargo set [count _allCargo,[_x,(_vehG select _i)]]}}foreach _cargoA;
		};
		_i = _i + 1;
	};
};

if((count waypoints _group) == 1) then {_pos = getWPPos [_group,0]};

while {_run > 0} do
{
	if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - run = %2",time,_run]};
	switch (_run) do
	{
		case 1:	{
					//-----------------------------
					//#setoldbehaviour
					//-----------------------------
					if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - SetOldBehav",time]};
					if((_group getVariable "getout_dac") == 1) then
					{
						_go = 0;_run = 10;
					}
					else
					{
						{_x setunitpos "auto"}foreach units _group;
						if(count _allCargo > 0) then {{(_x select 0) assignascargo (_x select 1);[(_x select 0)] ordergetin true;[(_x select 0)] allowgetin true}foreach _allCargo};
						_group setbehaviour _curBH;_group setcombatmode _curCM;
						_group setCurrentWaypoint [_group, _curwp];
						if(count _pos > 0) then {[_group, 0] setWPPos _pos;(leader _group) domove _pos};
						_run = 2;
					};
				};
		case 2:	{
					//-----------------------------
					//#wait
					//-----------------------------
					_go = 1;_looktime = time + (10 + random 10);
					while {_go > 0} do
					{
						sleep (1 + (random 1));
						if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - Waiting for Action",time]};
						_call = [_group,_leader,_timestep] call DAC_fSimpleConditions;
						if((_group getVariable "getout_dac") == 1) then
						{
							_go = 0;_run = 10;
						}
						else
						{
							if((count _call) > 0) then
							{
								_run = (_call select 0);_target = (_call select 1);
								_go = 0;
							}
							else
							{
								if(time > _looktime) then
								{
									_looktime = time + (10 + random 10);
									{
										if(!(vehicle _x in DAC_Arti_Veh)) then
										{
											_rd = random 360;
											if(_x != (vehicle _x)) then
											{
												if(_x == (gunner (vehicle _x))) then
												{
													(gunner (vehicle _x)) lookat [(position _x Select 0) + (Sin (_rd) * 500),(position _x Select 1) + (Cos (_rd) * 500),50];
												};
											}
											else
											{
												if(_x hasweapon "Binocular") then {_x selectweapon "Binocular"};
											};
										};
									}	foreach units _group;
								};
							};
						};
					};	
				};
		case 3:	{
					//-----------------------------
					//#groupchangemove
					//-----------------------------
					_curwp = currentWaypoint _group;
					_curBH = behaviour _leader;
					_curCM = combatmode _leader;
					if(count _allCargo > 0) then {{unassignvehicle (_x select 0);[(_x select 0)] ordergetin false}foreach _allCargo};
					if(_leader == (vehicle _leader)) then {[_leader,2] spawn DAC_fAISpeak};
					if((vehicle _target) iskindof "Man") then {[3,(leader _group)] spawn DAC_fAIRadio} else {if(((vehicle _target) iskindof "Tank") || ((vehicle _target) iskindof "Car"))then {[4,(leader _group)] spawn DAC_fAIRadio}};
					[_group,_target] spawn DAC_fSetBehaviour;
					if(!(_group in DAC_Radio_Groups)) then {[17,_groupid,_group,"P",player distance _leader] spawn DAC_fShowRadio};
					_waittime = time + (((10 * DAC_AI_Level) + ((skill _leader) * 50)) / ((count units _group) + 1));_run = 4;
				};
		case 4:	{
					//-----------------------------
					//#groupwaitfortarget
					//-----------------------------
					if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - groupwaitfortarget_1",time]};
					_go = 1;_id = 1;
					while {_go > 0} do
					{
						sleep (1 + (random 1));
						if((_group getVariable "getout_dac") == 1) then
						{
							_go = 0;_run = 10;
						}
						else
						{
							if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - groupwaitfortarget_2",time]};
							if((({alive _x} count units _group) == 0) && (_go == 1)) then {_go = 0;_run = 10};
							if((_group in DAC_Hit_Groups) && (_go == 1)) then {_go = 0;_run = 6};
							if(_go == 1) then
							{
								_newtarget = [_group,_target,0] call DAC_fCheckNewTarget;
								if(isNull _newtarget) then {_go = 0;_id = 1;_run = 5} else {if(_newtarget != _target) then {_target = _newtarget};_id = 1};
								if((time > _waittime) || (_id == 0)) then
								{
									{_x setunitpos "auto"} foreach units _group;
									if((_art > 0) && (_id == 1)) then
									{
										if(_leader in DAC_West_Units) then {if(((position _target) select 2) < 5) then {[_leader,6] spawn DAC_fAISpeak;[7,(leader _group)] spawn DAC_fAIRadio;[_leader,_target,_artibehav] spawn DAC_fCallArti}};
										if(_leader in DAC_East_Units) then {if(((position _target) select 2) < 5) then {[_leader,6] spawn DAC_fAISpeak;[7,(leader _group)] spawn DAC_fAIRadio;[_leader,_target,_artibehav] spawn DAC_fCallArti}};
									};
									_go = 0;_run = 5;
								};
							};
						};
					};
				};
		case 5:	{
					//-----------------------------
					//#querytarget
					//-----------------------------
					if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - querytarget",time]};
					if(_id > 0) then
					{
						if(!([_group,_target] call DAC_fCheckTarget)) then
						{
							_run = 6;
						};
					};
					if(_run == 5) then
					{
						if(_group in DAC_Hit_Groups) then {DAC_Hit_Groups = DAC_Hit_Groups - [_group]};
						if(_group in DAC_Call_Groups) then {DAC_Call_Groups = DAC_Call_Groups - [_group]};
						if(({alive _x} count units (group _target)) == 0) then {[18,_groupid,_group,"P",player distance _leader] spawn DAC_fShowRadio};
						if(_leader == (vehicle _leader)) then {[_leader,5] spawn DAC_fAISpeak;[11,(leader _group)] spawn DAC_fAIRadio;};
						_run = 7;
					};
				};
		case 6:	{
					//-----------------------------
					//#groupmovetoenemy
					//-----------------------------
					if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - groupmovetoenemy",time]};
					sleep (1 + (random 1));
					if(({alive _x} count units _group) == 0) then
					{
						_run = 10;
					}
					else
					{
						if(_group in DAC_Hit_Groups) then
						{
							_callg = [];
							{if((!(side _x == side leader _group)) && (((leader _group) knowsabout _x) > 0) && (alive _x))  then {_callg set [count _callg,_x]}} foreach DAC_Fire_Pos;
							if((count _callg) > 0) then
							{
								if((count _callg) > 1) then
								{
									_target = _callg select (random ((count _callg) - 1));
								}
								else
								{
									_target = _callg select 0;
								};
							};
						};
						if(isNull _target) then
						{
							if(_group in DAC_Hit_Groups) then {DAC_Hit_Groups = DAC_Hit_Groups - [_group]};
							[18,_groupid,_group,"P",player distance _leader] spawn DAC_fShowRadio;_run = 7;
						}
						else
						{
							{_x dowatch _target} foreach units _group;
							if(!(_group in DAC_Help_Groups)) then {DAC_Help_Groups set [count DAC_Help_Groups,_group]};
							if(_group in DAC_Hit_Groups) then {[20,_groupid,_group,"T",_target distance leader _group] spawn DAC_fShowRadio} else {[15,_groupid,_group,"P",player distance _leader] spawn DAC_fShowRadio};
							_run = 5;
						};
					};
				};
		case 7:	{
					//-----------------------------
					//#seenothing
					//-----------------------------
					if(count _zskill == 0) then
					{
						_run = 1;
					}
					else
					{
						{_x setunitpos "auto"} foreach units _group;
						if(_group in DAC_Cover_Groups) then {DAC_Cover_Groups = DAC_Cover_Groups - [_group]};
						_leader = leader _group;
						_troublepos = position (leader _group);[12,(leader _group)] spawn DAC_fAIRadio;
						_searcharea  = (_zskill select 0);_searchcount = (time + (_zskill select 1));
						_wx = _troublepos select 0;_wy = _troublepos select 1;
						_run = 8;
					};
				};
		case 8:	{
					//-----------------------------
					//#searchingtarget
					//-----------------------------
					_go = 1;_id = 0;
					_group setbehaviour "AWARE";
					_group setcombatmode "YELLOW";
					while {_go > 0} do
					{
						sleep 0.1;
						_firemark = [(_wx) + (_searcharea - (random (_searcharea * 2))),(_wy) + (_searcharea - (random (_searcharea * 2))),0];
						if(!(surfaceIsWater _firemark)) then
						{
							_go = 0;
						};
					};
					{if(_x == (vehicle _x)) then {_x domove [(((_firemark) select 0) + (Sin (random 360) * (3 + (random 15)))),(((_firemark) select 1) + (Cos (random 360) * (3 + (random 15)))),0]}}foreach units _group;
					while {_go == 0} do
					{
						sleep (1 + (random 1));
						if(({alive _x} count units _group) == 0) then
						{
							_run = 10;_go = 1;
						}
						else
						{
							_newtarget = [_group,_target,0] call DAC_fCheckNewTarget;
							if(isNull _newtarget) then
							{
								if(time > _searchcount) then
								{
									_run = 1;_go = 1;
								}
								else
								{
									if(unitready (vehicle _leader)) then
									{
										_wx = _troublepos select 0;
										_wy = _troublepos select 1;
										_go = 1;
									};
								};
							}
							else
							{
								_target = _newtarget;_run = 6;_go = 1;
							};
						};
					};
				};
		case 9:	{
					//-----------------------------
					//#Break
					//-----------------------------
					_go = 1;
					while {_go > 0} do
					{
						sleep (0.1 + (random 0.2));
						if((({alive _x} count units _group) == 0) && (_go == 1)) then
						{
							_go = 0;_run = 10;
						}
						else
						{
							if(!(leader _group == _leader)) then
							{
								_leader = leader _group;
								_newtarget = [_group,_target] call DAC_fCheckNewTarget;
								if(isNull _newtarget) then {_id = 0} else {if(_newtarget != _target) then {_target = _newtarget};_id = 1};
								if(_id == 0) then
								{
									_run = 7;_go = 0;
								}
								else
								{
									_run = 3;_go = 0;
								};
							};
						};
					};
				};
		case 10:{
					//-----------------------------
					//#groupdown
					//-----------------------------
					if(_group in xCam_Debug_Group) then {xCam_Debug_String = format["%1 - GroupDown",time]};
					{call compile format["if(_group in %1) then {%1 = %1 - [_group]}",_x]}foreach _DAC_Arrays;
					_run = 0;		
				};
		Default	{};
	};
};