sreVbriefing.html}Qbriefing.sqf}Q` description.ext}QNinit.sqf}Qinitjipcompatible.sqf}QPmission.sqm}Qeoverview.html}Qoverview.paa}Q^phantom.jpg}Qphotograph.jpg}Qscripts\Init_UPSMON.sqf}QvUscripts\UPSMON\actions\followme.sqf}Q scripts\UPSMON\common\MON_functions.sqf}Qscripts\UPSMON\MON_artillery_add.sqf}Q scripts\UPSMON\MON_spawn.sqf}Qscripts\UPSMON\MON_surrended.sqf}Q,scripts\UPSMON.sqf}Qm@ Debriefing

Endmission cheat is for weaklings.


Cheaters fail at life.





Mission Accomplished


You have successfully eliminated the Russian general and safely extracted from Chernarus. Mission accomplished.





Mission Failed


You and your partner has been elminated. Mission Failed.


p1 createDiaryRecord ["Diary", ["Credits", "Mission by Phantom Six. UPSMON created by Monsada."]]; p1 createDiaryRecord ["Diary", ["Hints", "Be sneaky, you're only civilians with very little ammo."]]; p1 createDiaryRecord ["Diary", ["Photo", ""]]; p1 createDiaryRecord ["Diary", ["Background", "General Rostovo has been funding Chedaki movements and genocides. You must eliminate him while he is having a meeting with the Chedakis and retreat back to the boat and sail away. General Rostovo can be found in one of 3 possible locations. here or here or here."]]; tskobj_1a = p1 createSimpleTask ["Extract"]; tskobj_1a setSimpleTaskDescription ["Return to the boat and escape Chernarus", "Extract", "Extract"]; tskobj_1a setSimpleTaskDestination (getMarkerPos "extract"); tskobj_2a = p1 createSimpleTask ["Assassinate General Rostovo"]; tskobj_2a setSimpleTaskDescription ["Eliminate the Russian general who is funding the Chedakis and their genocides. There are 3 possible locations to find him","Assassinate General Rostovo","Rostovo"]; p2 createDiaryRecord ["Diary", ["Credits", "Mission by Phantom Six. UPSMON created by Monsada."]]; p2 createDiaryRecord ["Diary", ["Hints", "Be sneaky, you're only civilians with very little ammo."]]; p2 createDiaryRecord ["Diary", ["Photo", ""]]; p2 createDiaryRecord ["Diary", ["Background", "General Rostovo has been funding Chedaki movements and genocides. You must eliminate him while he is having a meeting with the Chedakis and retreat back to the boat and sail away. General Rostovo can be found in one of 3 possible locations. here or here or here."]]; tskobj_1b = p2 createSimpleTask ["Extract"]; tskobj_1b setSimpleTaskDescription ["Return to the boat and escape Chernarus", "Extract", "Extract"]; tskobj_1b setSimpleTaskDestination (getMarkerPos "extract"); tskobj_2b = p2 createSimpleTask ["Assassinate General Rostovo"]; tskobj_2b setSimpleTaskDescription ["Eliminate the Russian general who is funding the Chedakis and their genocides. There are 3 possible locations to find him","Assassinate General Rostovo","Rostovo"];onLoadMission = "Bloody Lake"; onLoadMissionTime = False; loadScreen = "phantom.jpg"; class Header { gameType = Coop; minPlayers = 1; maxPlayers = 2; playerCountMultipleOf =1; }; respawn = "GROUP"; respawnDelay = 5; class Params { class Rain { title = "Rain"; values[] = {0,1,2,3}; texts[] = {"None","Light","Moderate","Heavy"}; default = 0; }; class Fog { title = "Fog"; values[] = {0,1,2,3}; texts[] = {"None","Light","Moderate","Heavy"}; default = 0; }; class Density { title = "AI Density:"; values[] = {0,1,2,3,4}; texts[] = {"Low","Normal","Moderate","High","Insane"}; default = 1; }; }; class Magazines { class ACE_Bandage{count = 20;}; class ACE_Bodybag {count = 20;}; class ACE_Epinephrine {count = 20;}; class ACE_IV {count = 20;}; class ACE_LargeBandage {count = 20;}; class ACE_Medkit {count = 20;}; class ACE_Morphine {count = 20;}; class ACE_Plasma {count = 20;}; class ACE_Splint {count = 20;}; class ACE_Tourniquet {count = 20;}; };"area0" setMarkerAlpha 0; switch (paramsArray select 0) do { case 0: { 0 setOvercast 0; 0 setRain 0; }; case 1: { 0 setOvercast 0.8; 0 setRain 0.3; }; case 2: { 0 setOvercast 0.9; 0 setRain 0.6; }; case 3: { 0 setOvercast 1; 0 setRain 1; }; }; switch (paramsArray select 1) do { case 0: { 0 setFog 0; }; case 1: { 0 setFog 0.3; }; case 2: { 0 setFog 0.6; }; case 3: { 0 setFog 1; }; }; if ((!isServer) && (player != player)) then { waitUntil {player == player}; }; //Init UPSMON scritp (must be run on all clients) call compile preprocessFileLineNumbers "scripts\Init_UPSMON.sqf"; //Process statements stored using setVehicleInit processInitCommands; //Finish world initialization before mission is launched. finishMissionInit; // --- Info text waitUntil{!(isNil "BIS_fnc_init")}; sleep 15; ["November 25, 1991", "6:30 AM"] call BIS_fnc_infoText; sleep 3; ["Bloody", "Lake"] call BIS_fnc_infoText; sleep 3; ["Created by", "Phantom Six"] call BIS_fnc_infoText;//OMG don't delete me!!! call compile preProcessFileLineNumbers "briefing.sqf";version=11; class Mission { addOns[]= { "chernarus", "cacharacters2", "ca_modules_functions", "ca_missions_firstaidsystem", "ca_missions_battlefieldclearance", "ca_missions_alternativeinjurysimulation", "CAWater", "ace_sys_wounds", "ace_main" }; addOnsAuto[]= { "cacharacters2", "ca_modules_functions", "ace_sys_wounds", "ace_main", "CAWater", "chernarus" }; randomSeed=15729266; class Intel { briefingName="ACE CO 02 Bloody Lake"; briefingDescription="Assassinate the Russian general who is secretly funding the Chedakis"; startWeather=0.25; forecastWeather=0.25; year=1991; month=11; day=25; hour=6; }; class Groups { items=24; class Item0 { side="GUER"; class Vehicles { items=2; class Item0 { position[]={13732.7,1.0771474,11217.482}; azimut=-23.094101; special="NONE"; id=0; side="GUER"; vehicle="GUE_Woodlander2"; player="PLAYER COMMANDER"; leader=1; rank="SERGEANT"; skill=1; text="p1"; init="this addWeapon ""ACE_Earplugs"";"; description="Civilian Sniper"; }; class Item1 { position[]={13730.714,1.0866089,11216.981}; azimut=-19.215099; special="NONE"; id=1; side="GUER"; vehicle="GUE_Woodlander1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; text="p2"; init="this addWeapon ""ACE_Earplugs"";"; description="Civilian Spotter"; }; }; }; class Item1 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={13716.635,0.4922871,11209.068}; id=2; side="LOGIC"; vehicle="FunctionsManager"; leader=1; lock="UNLOCKED"; skill=0.60000002; }; }; }; class Item2 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={13306.484,29.450914,11616.365}; azimut=-77.531502; special="NONE"; id=4; side="EAST"; vehicle="RU_Commander"; leader=1; rank="COLONEL"; skill=1; text="general"; init="removeAllWeapons this; this addWeapon ""AKS_Gold""; this addMagazine ""30Rnd_762x39_AK47"";this addMagazine ""30Rnd_762x39_AK47"";this addMagazine ""30Rnd_762x39_AK47"";this addMagazine ""30Rnd_762x39_AK47"";this addMagazine ""HandGrenade_East"";this addMagazine ""HandGrenade_East"";this addMagazine ""SmokeShellRed""; this addMagazine ""SmokeShell"";"; }; }; }; class Item3 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={13303.513,29.356802,11616.577}; azimut=90; special="NONE"; id=5; side="EAST"; vehicle="Ins_Bardak"; leader=1; rank="MAJOR"; skill=0.63541603; text="insurgent"; }; }; }; class Item4 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={13307.512,29.046055,11614.926}; azimut=-83.842499; special="NONE"; id=6; side="EAST"; vehicle="MVD_Soldier"; leader=1; rank="MAJOR"; skill=0.82937503; text="LHG"; }; }; }; class Item5 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={13307.897,29.83843,11617.479}; azimut=-83.842499; special="NONE"; id=7; side="EAST"; vehicle="MVD_Soldier"; leader=1; rank="MAJOR"; skill=0.82937503; text="RHG"; }; }; }; class Item6 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={13302.514,28.801737,11615.211}; azimut=-268.591; special="NONE"; id=8; side="EAST"; vehicle="Ins_Soldier_2"; leader=1; rank="MAJOR"; skill=0.68135405; text="RHI"; }; }; }; class Item7 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={13302.544,29.871426,11618.025}; azimut=-268.591; special="NONE"; id=9; side="EAST"; vehicle="Ins_Soldier_2"; leader=1; rank="MAJOR"; skill=0.68135405; text="LHI"; }; }; }; class Item8 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13524.105,44.477821,11806.646}; special="NONE"; id=10; side="EAST"; vehicle="Ins_Woodlander2"; leader=1; rank="CORPORAL"; skill=0.37510234; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf"";"; }; class Item1 { position[]={13522.663,44.711895,11804.14}; special="NONE"; id=11; side="EAST"; vehicle="Ins_Woodlander1"; skill=0.24749812; }; class Item2 { position[]={13524.663,44.262329,11804.14}; special="NONE"; id=12; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.28322756; }; class Item3 { position[]={13527.232,43.639713,11804.309}; special="NONE"; id=13; side="EAST"; vehicle="Ins_Woodlander1"; skill=0.24749812; }; }; }; class Item9 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13256.286,52.046867,11806.646}; special="NONE"; id=14; side="EAST"; vehicle="Ins_Woodlander2"; leader=1; rank="CORPORAL"; skill=0.38531089; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf"";"; }; class Item1 { position[]={13254.844,51.670074,11804.14}; special="NONE"; id=15; side="EAST"; vehicle="Ins_Woodlander1"; skill=0.24749812; }; class Item2 { position[]={13256.844,51.694069,11804.14}; special="NONE"; id=16; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.28322756; }; class Item3 { position[]={13259.413,51.748039,11804.309}; special="NONE"; id=17; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.40062356; }; }; }; class Item10 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13559.79,52.974434,12120.004}; special="NONE"; id=18; side="EAST"; vehicle="Ins_Soldier_GL"; leader=1; rank="CORPORAL"; skill=0.56395811; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf"";"; }; class Item1 { position[]={13558.348,52.809978,12117.498}; special="NONE"; id=19; side="EAST"; vehicle="Ins_Soldier_MG"; skill=0.50270778; }; class Item2 { position[]={13560.348,52.677547,12117.498}; special="NONE"; id=20; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.45676976; }; class Item3 { position[]={13562.917,52.530655,12117.667}; special="NONE"; id=21; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.41593617; }; }; }; class Item11 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13315.213,31.907372,11626.394}; special="NONE"; id=22; side="EAST"; vehicle="Ins_Soldier_GL"; leader=1; rank="CORPORAL"; skill=0.56395811; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf"";"; }; class Item1 { position[]={13313.771,31.549009,11623.888}; special="NONE"; id=23; side="EAST"; vehicle="Ins_Soldier_MG"; skill=0.50270778; }; class Item2 { position[]={13315.771,31.535673,11623.888}; special="NONE"; id=24; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.45676976; }; class Item3 { position[]={13318.34,31.549242,11624.057}; special="NONE"; id=25; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.41593617; }; }; }; class Item12 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13187.635,90.011948,12148.927}; special="NONE"; id=26; side="EAST"; vehicle="Ins_Soldier_GL"; leader=1; rank="CORPORAL"; skill=0.56395811; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf"";if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; class Item1 { position[]={13186.192,90.584572,12146.421}; special="NONE"; id=27; side="EAST"; vehicle="Ins_Soldier_MG"; skill=0.50270778; init="if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; class Item2 { position[]={13188.192,90.38723,12146.421}; special="NONE"; id=28; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.45676976; init="if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; class Item3 { position[]={13190.762,90.336136,12146.59}; special="NONE"; id=29; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.41593617; init="if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; }; }; class Item13 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13086.686,60.962021,11895.386}; special="NONE"; id=30; side="EAST"; vehicle="Ins_Soldier_GL"; leader=1; rank="CORPORAL"; skill=0.56395811; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf""; if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; class Item1 { position[]={13085.243,59.782848,11892.88}; special="NONE"; id=31; side="EAST"; vehicle="Ins_Soldier_MG"; skill=0.50270778; init="if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; class Item2 { position[]={13087.243,59.353096,11892.88}; special="NONE"; id=32; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.45676976; init="if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; class Item3 { position[]={13089.813,59.398968,11893.049}; special="NONE"; id=33; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.41593617; init="if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; }; }; class Item14 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13713.063,32.486183,11966.769}; special="NONE"; id=34; side="EAST"; vehicle="Ins_Woodlander2"; leader=1; rank="CORPORAL"; skill=0.38531089; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf""; if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; class Item1 { position[]={13711.62,32.277016,11964.263}; special="NONE"; id=35; side="EAST"; vehicle="Ins_Woodlander1"; skill=0.24749812; init="if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; class Item2 { position[]={13713.62,32.210335,11964.263}; special="NONE"; id=36; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.28322756; init="if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; class Item3 { position[]={13716.189,32.137112,11964.432}; special="NONE"; id=37; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.40062356; init="if ((paramsArray select 2) <= 1) then {deleteVehicle this};"; }; }; }; class Item15 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13095.217,46.248837,11759.587}; special="NONE"; id=38; side="EAST"; vehicle="Ins_Woodlander2"; leader=1; rank="CORPORAL"; skill=0.38531089; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf""; if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; class Item1 { position[]={13093.773,46.607391,11757.081}; special="NONE"; id=39; side="EAST"; vehicle="Ins_Woodlander1"; skill=0.24749812; init="if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; class Item2 { position[]={13095.773,46.390232,11757.081}; special="NONE"; id=40; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.28322756; init="if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; class Item3 { position[]={13098.343,46.176174,11757.25}; special="NONE"; id=41; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.40062356; init="if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; }; }; class Item16 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13720.683,18.457817,11821.514}; special="NONE"; id=42; side="EAST"; vehicle="Ins_Soldier_GL"; leader=1; rank="CORPORAL"; skill=0.56395811; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf""; if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; class Item1 { position[]={13719.24,18.456066,11819.008}; special="NONE"; id=43; side="EAST"; vehicle="Ins_Soldier_MG"; skill=0.50270778; init="if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; class Item2 { position[]={13721.24,18.29344,11819.008}; special="NONE"; id=44; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.45676976; init="if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; class Item3 { position[]={13723.811,18.091536,11819.177}; special="NONE"; id=45; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.41593617; init="if ((paramsArray select 2) <= 2) then {deleteVehicle this};"; }; }; }; class Item17 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13432.253,44.1063,11730.21}; special="NONE"; id=46; side="EAST"; vehicle="Ins_Woodlander2"; leader=1; rank="CORPORAL"; skill=0.38531089; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf""; if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; class Item1 { position[]={13430.81,44.002029,11727.704}; special="NONE"; id=47; side="EAST"; vehicle="Ins_Woodlander1"; skill=0.24749812; init="if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; class Item2 { position[]={13432.81,43.952362,11727.704}; special="NONE"; id=48; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.28322756; init="if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; class Item3 { position[]={13435.379,43.887444,11727.873}; special="NONE"; id=49; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.40062356; init="if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; }; }; class Item18 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13452.392,69.762794,12203.99}; special="NONE"; id=50; side="EAST"; vehicle="Ins_Soldier_GL"; leader=1; rank="CORPORAL"; skill=0.56395811; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf"";if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; class Item1 { position[]={13450.949,69.717384,12201.484}; special="NONE"; id=51; side="EAST"; vehicle="Ins_Soldier_MG"; skill=0.50270778; init="if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; class Item2 { position[]={13452.949,69.541351,12201.484}; special="NONE"; id=52; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.45676976; init="if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; class Item3 { position[]={13455.519,69.328873,12201.653}; special="NONE"; id=53; side="EAST"; vehicle="Ins_Soldier_2"; skill=0.41593617; init="if ((paramsArray select 2) <= 3) then {deleteVehicle this};"; }; }; }; class Item19 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={13556.194,33.607586,11626.265}; special="NONE"; id=54; side="EAST"; vehicle="Ins_Woodlander2"; leader=1; rank="CORPORAL"; skill=0.38531089; init="nul=[this,""area0""] execVM ""scripts\upsmon.sqf""; if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; class Item1 { position[]={13554.751,33.671749,11623.759}; special="NONE"; id=55; side="EAST"; vehicle="Ins_Woodlander1"; skill=0.24749812; init="if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; class Item2 { position[]={13556.751,33.525051,11623.759}; special="NONE"; id=56; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.28322756; init="if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; class Item3 { position[]={13559.32,33.339806,11623.928}; special="NONE"; id=57; side="EAST"; vehicle="Ins_Woodlander3"; skill=0.40062356; init="if ((paramsArray select 2) == 0) then {deleteVehicle this};"; }; }; }; class Item20 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={13687.039,2.6351304,11199.764}; id=58; side="LOGIC"; vehicle="ACE_Wounds_Logic"; leader=1; lock="UNLOCKED"; skill=0.60000002; }; }; }; class Item21 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={13698.47,2.2041578,11199.584}; id=59; side="LOGIC"; vehicle="ACE_Wounds_EveryoneMedic"; leader=1; lock="UNLOCKED"; skill=0.60000002; }; }; }; class Item22 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={13711.644,1.5548892,11197.995}; id=60; side="LOGIC"; vehicle="ACE_Required_Logic"; leader=1; lock="UNLOCKED"; skill=0.60000002; }; }; }; class Item23 { side="CIV"; class Vehicles { items=1; class Item0 { position[]={4622.7769,8.9692507,2567.3062}; id=61; side="CIV"; vehicle="Citizen1"; leader=1; skill=0.60000002; text="selector"; markers[]= { "spawn_3", "spawn_1_1" }; init="this disableAI ""move"";"; }; }; }; }; class Vehicles { items=1; class Item0 { position[]={13734.697,0.020097105,11208.128}; azimut=-20.841299; special="NONE"; id=3; side="EMPTY"; vehicle="PBX"; leader=1; skill=1; text="boat"; }; }; class Markers { items=9; class Item0 { position[]={13730.465,0.67373002,11214.734}; name="insertion"; text="Insertion"; type="mil_start"; }; class Item1 { position[]={13729.866,0.17300186,11196.344}; name="extraction"; text="Extraction"; type="mil_end"; }; class Item2 { position[]={14650.76,0.27989867,10806}; name="extract"; type="Empty"; }; class Item3 { position[]={13293.739,27.172026,11612.496}; name="hvt"; text="HVT"; type="mil_dot"; colorName="ColorOrange"; }; class Item4 { position[]={13444.576,69.971901,12014.251}; name="hvt_1"; text="HVT"; type="mil_dot"; colorName="ColorOrange"; }; class Item5 { position[]={13388.091,68.548698,12114.776}; name="hvt_2"; text="HVT"; type="mil_dot"; colorName="ColorOrange"; }; class Item6 { position[]={4637.5918,8.979352,2555.9512}; name="spawn_3"; type="Empty"; }; class Item7 { position[]={4655.0322,8.9317379,2547.6194}; name="spawn_1_1"; type="Empty"; }; class Item8 { position[]={13381.077,55.161213,11840.81}; name="area0"; markerType="ELLIPSE"; type="Empty"; fillName="Border"; a=475; b=475; drawBorder=1; }; }; class Sensors { items=9; class Item0 { position[]={13614.396,3.2110803,11119.629}; a=0; b=0; activationBy="ALPHA"; repeating=1; interruptable=1; age="UNKNOWN"; expActiv="copyToClipboard format [""this setPosATL %1;this setDir %2"",getPosATL player, getDir player]"; class Effects { }; }; class Item1 { position[]={4638.146,8.994174,2557.063}; a=10; b=10; activationBy="CIV"; interruptable=1; age="UNKNOWN"; expCond="selector in thislist;"; expActiv="insurgent setPosATL [13441.6,12019.9,0.001297];insurgent setDir 94.468 ;general setPosATL [13443.8,12019.7,0.0015564];general setDir 283.363; LHG setPosATL [13444.8,12018.9,0.00157928];LHG setDir 276.176; RHG setPosATL [13444.9,12020.1,0.00160217];RHG setDir 276.696; LHI setPosATL [13440.8,12020.6,0.001297];LHI setDir 93.0314; RHI setPosATL [13440.7,12019.4,0.00130463];RHI setDir 93.0314;"; class Effects { }; }; class Item2 { position[]={4656.269,8.9419308,2546.855}; a=10; b=10; activationBy="CIV"; interruptable=1; age="UNKNOWN"; expCond="selector in thislist;"; expActiv="general setPosATL [13377.2,12117,0.00110626];general setDir 262.763; insurgent setPosATL [13375.5,12116.1,0.00175476];insurgent setDir 61.6649;LHG setPosATL [13378.2,12116.6,0.00111389];LHG setDir 254.303;RHG setPosATL [13377.9,12117.8,0.00111389];RHG setDir 254.282;LHI setPosATL [13374.5,12116.3,0.00184631];LHI setDir 65.7108;RHI setPosATL [13374.9,12115.3,0.00177002];RHI setDir 76.1141;"; class Effects { }; }; class Item3 { position[]={4621.1401,8.956109,2568.2917}; a=10; b=10; activationBy="CIV"; interruptable=1; age="UNKNOWN"; expCond="selector in thislist;"; expActiv="general setPosATL [13288.8,11616.6,0.000581741];general setDir 275.751; insurgent setPosATL [13287,11616.8,0.00229454];insurgent setDir 93.7023; LHG setPosATL [13289.5,11615.8,0.000581741];LHG setDir 273.495; RHG setPosATL [13289.8,11617.1,0.000530243];RHG setDir 290.51; LHI setPosATL [13286.2,11617.6,0.00193405];RHI setDir 99.6832; RHI setPosATL [13286,11616.4,0.00266838];RHI setDir 103.369;"; class Effects { }; }; class Item4 { position[]={13694.767,1.3943034,11176.523}; a=0; b=0; interruptable=1; type="END3"; age="UNKNOWN"; expCond="!alive p1 && !alive p2"; expActiv="forceEnd;"; class Effects { }; }; class Item5 { position[]={15359.598,0.35740253,10650.131}; a=1000; b=2000; rectangular=1; activationBy="GROUP"; timeoutMin=10; timeoutMid=10; timeoutMax=10; type="END2"; age="UNKNOWN"; idVehicle=0; expCond="this && !alive general"; expActiv="forceEnd;"; class Effects { }; }; class Item6 { position[]={13633.327,2.7841675,11122.256}; a=0; b=0; activationBy="BRAVO"; repeating=1; interruptable=1; age="UNKNOWN"; expActiv="tester addWeapon ""AKS_gold""; tester addMagazine ""30Rnd_762x39_AK47"";tester addMagazine ""30Rnd_762x39_AK47"";tester addMagazine ""30Rnd_762x39_AK47"";tester addMagazine ""30Rnd_762x39_AK47"";"; class Effects { }; }; class Item7 { position[]={13684.524,1.8075707,11176.168}; a=0; b=0; interruptable=1; age="UNKNOWN"; expCond="!alive general"; expActiv="""2a"" objStatus ""DONE""; tskobj_2a setTaskState ""SUCCEEDED""; obj_2a = true; publicVariable ""obj_2a""; ""2b"" objStatus ""DONE""; tskobj_2b setTaskState ""SUCCEEDED""; obj_2b = true; publicVariable ""obj_2b""; "; class Effects { titleEffect="PLAIN DOWN"; }; }; class Item8 { position[]={15367.038,0.33622953,10632.979}; a=1000; b=2000; rectangular=1; activationBy="GROUP"; interruptable=1; age="UNKNOWN"; idVehicle=0; expCond="this && !alive general"; expActiv="""1a"" objStatus ""DONE""; tskobj_1a setTaskState ""SUCCEEDED""; obj_1a = true; publicVariable ""obj_2a""; ""1b"" objStatus ""DONE""; tskobj_1b setTaskState ""SUCCEEDED""; obj_1b = true; publicVariable ""obj_1b""; "; class Effects { titleEffect="PLAIN DOWN"; }; }; }; }; class Intro { addOns[]= { "chernarus" }; addOnsAuto[]= { "chernarus" }; randomSeed=6868266; class Intel { startWeather=0.25; forecastWeather=0.25; year=2008; month=10; day=11; hour=9; minute=20; }; }; class OutroWin { addOns[]= { "chernarus" }; addOnsAuto[]= { "chernarus" }; randomSeed=8187027; class Intel { startWeather=0.25; forecastWeather=0.25; year=2008; month=10; day=11; hour=9; minute=20; }; }; class OutroLoose { addOns[]= { "chernarus" }; addOnsAuto[]= { "chernarus" }; randomSeed=334866; class Intel { startWeather=0.25; forecastWeather=0.25; year=2008; month=10; day=11; hour=9; minute=20; }; }; Overview

Assassinate a Russian general with a hunting rifle as a civilian.

by Phantom Six

GGATCGVAGGATGALFGGATSFFO@pw~:IUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU5bUի AUս!AU_$!b-= 9 MkUWZqBU s9(1qR9pQB+ {ZT,{E)*{(B{R]Bmk)Jjc{e)5+{9rT׀Mk9 mkiJXs xR$!뾼 c9UZE)_/Z!UWx9 !AWWWAUWV!UUU^UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!UUAUU //f1AUU+1aշ(BU *Re)iRe)^ c9 /{B/?ӜZU^/Z0IJ jQU0Qe)%/iJ( s1^`Q9_QZ@iJׯU1q9 'נR\X}⒔R0A/׋mkf1X ..sB}~xmkIJAmk1 }01'mkE)qIJUe)UרiJ!UIJ _!UpUW^zUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAP/!AUտ1>IJ!R1=6,{9>ZUUU`1/U9z`Us$!/IJ {-Q,c%]ӜMkz_PZ^zC{תqB`}IJ 1zuB/ֵBX+ c]xuZ+Mk_`bkB/q crvZ q98Mk_4iJ jR^BziJ509W{Rr=o{1Mk1x`z~9pb*(BUU~x^ UAUWV^UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAU  9 (B!UZE)U+ Mk(B‚0IJ-Z(-RRU{{e)5>ӜZU~@ӜR+ Q(BZIJU.Ӝ,cU(B պIJ^+8ƪRUz*(B/Ҕ c^u{9Xe)zsB`s1~z -1UU^pBW*1UWAV^VaVx!UUWVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA-A"9-/9 ]$!IJXXVZ)J Mk1 sRur'Mk1 ^0iJW{{A5qjR~RsB9+ cׯcuZ %Z\qR /^׽Q]閵RWB'{8Zx^UU9. sT5Mk^x)E)zQ1^B QiJ\y,c,cWR(W4BӜBުӜiJW_\{(BW^bxE)ӜMk׀4R^^W(Bu}.R ^UZ/\UZT?(BxIJz_sIJ6{1׿{(B_(mkBvrX9$!`9WUz AUxx|UW^z!UUU_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA5 A- e)U+(B ՋR MkE)^5MkIJXmkIJ (9z~Z! _Z1^Z1*QZ]sB~,9U`|9_ղRz1U09Mk1Q9-/P)JܪMkB`sIJCrB+ q9W֒9z)J_׭ӜB/5׽HBz RUxWUR{Xq9ՠ{BU(B s{1Z7T׶iJֿ nscMku_6׶ZU (B߸T1Ӝ1B}u,c-aqRpӜ(Bq cuiJx50R|oMk9Z^++mkE)_Ux9_UW AWWbzzzAUUUUUUUUUUUUUUUUUUUUUUUUAՕAU5%$!- 9$!-_/?R!* Zf1*Z1 zMke) Wk9-}sf1^MkE)UZf1 zs1V-sIJU{1__.QRz-s9%`jMk9/,c9`.s9 {)J^-,cU%²Z_qRիҔjR//^_(B%UTiJW+IJ\BWҔA{1/>4IJxӜ(Bz IJ8ƪR )JxU c_q!*ׯ׽R+-8{sTuBziJ_0IJ /mk%낷sWmkbrz{iJ%^IJ R__*Q c}ިZW`{jR^~}s!W_\_9^U!~~AUXPXUUUUUUUUUUUUUUUUUUUUAU%U *AU >A IJ$!%R^,c!RBm c9U~ c$!-s$!_xmkf1RE)VsE)zժsA/0E)QB +0f1\{9 UiJ^/UiJqIJ( c5W4Z{},c0!X޺IJ Rz_$!7 0R&zZ^(B/ B8Ǝsu {uMk~` c ^s`}RU (BըZ9{kpMk>0^  c^UIJ-q%)^mkf1ಔE) W(BW c W-sRx]{iJ9׫s9 rmkf1ꀾR1b_|1W_AWxpAVXP`UUUUUUUUUUUU!UUU- A/1 _R!߂mk%)UW?se)Umk9 }se)U^ -k1U{jR{UU{IJ-E){(B|VZE)^{BZ!x{E)WZ}iJsZU{A`*89կuMkb׵UZ 1_qiJ-_ߎsR.uZ/RWՒBX0B /ӜIJWӜ(BZ R^R{*UUE)ӜIJU_/Z{%궵RUUZjUIJ{B AӜ9._0e)_*$!s(B%6Rsji{(BZMk$! VMk1`s9}UiJE)U^Z9+ -Z1xiJ$!W *iJ p9zUE)a_UAU_z!UWV~UUUUUUUU-5!A* 9 Z _ Z$!/,c9pzmkB Z ^ZE)URE)*U,c^MkE).s9- \ cE) \09 ӜIJ qRIJUQ9ծsIJz WZ5^U(BMk9xӜR 9\\ QR%ӜZ7ӜZp 0iJx{R⭋{B_z{9/Z/ RR^0)JU{9+pp(B UU{E)x 0B %0Azmk11^0jR-5s9 z{!ܠMk!zZ1 ,c(Bk\Z9{1%^mk9WWUZA{$!U*s9U^,ce) c9WziJ'(,c9.WsB"1_Z$! %ZE)^R9MkIJ*5 QBbz_W cE)iJU-4B\s׫s9 z9 [_1\,c9/Wmk)J s(B``01 {R\Mk1_+,c$! sIJ/Wks9ks1.'Us9Վs1W ce) c1^ c!* {IJ(_WUsE)PZe) ,ce)X_Ze)-Re)(5^ZZ1{ cE)/Z96.ZE)^ R9ppZ9_ WR1c`%ՉJ -(Bx^zf1*X!AUxA  ս+*!}U5/1b--Be) cE)+ c(B'}mkA/ c9WMk9}ߊR!%R r R1 ZA _,cAx {1תMkBՀ,c1_*z cf1ը/ c9^s1 {e)^WR- Z1?*ns1x c1zs*%iJpVZ187Mk1]p cUZ$!R$!V*R*/x*ZE) p,c!׋Ze) wZ$!^ c$!zZE)ukZ. mkB][ c$!*xmke)Z9R!ZE) - ,cE)Z\ ns1}kV,c1Re)`\Z}u* c RE)à^R!IJ$!UZ1UZ1WZ9©ުR1Ur*iJ1ZR!W91^Z`^jzpA-'UIJտ ,c! {IJp,cf1  mkUZRE) 6*_sBz !UBx|9,cf1p *0(B ܨMk1Xs1ր MkE)^{IJ WsB s1׷MkB*W*MkE)W c s1Z9\ ZAMkIJ Lc W,c^UsE)UU sE)U\RWiJ!/z-RE)^*Z5+ c9z ZE)(^ c c!5Mk1+ c1p`Z{UZ$!] c$!ׂUIJ!%ns$!*+]Mk1,c1zMk$!*k1zUmk9W mk1p~sׯmkE)^Ze) R jp Z [%)/Z!IJ1xW)J$!X (Bzx~1}_%)aWUA5IJ$!7%)sB-qE)01_*{e)x01se) _ s1 ]{1Us9 {IJ({1X޲BMkB WZs9׾qR{WsB^/Z]ZW{jRj,cE)s z{1 sRc]{$!zz_e)%-IJXxbe)_*{1 ^׎s1IJUZ,c^5 Mk,c1 +mke)zZ1\/Z9} c1ժZ1 c1׫ZVZ9%mk9piJ1X jRD! AU-9{p,c9mk1x«Z+*ZE)Lc9Z9^Z)J-== cE)^mke)%Rb`Z9 cE) U ce)UUiJ%)_9ap!%iJ *Z1  s1s9 U,c1 {iJW cE)*Wmk1֋Z1(>>{9~,c$!Zf1*x{B ^s9Mk9\_q9 zsIJt c ׎s)J mk!zsjRZ-mkjRX9 cj cm {9pUmk1UU{!/Ws Mk9Z qRU0B7RuUs1`h c1-mk1pz{9}iJE)ZE)xjR$! 5VR1-Z$!ח,ce){ c ,c xMk9 R(*Mk9zX,c1^z Z!r.mkE)-վ ce)-k$!WW R%)R$!XIJE){IJ.zMkE),c9Ze)U(Z$! IJwiJE)j+5iJU1ժB5Z!Z*{1^z~,cE)mk97 c1_\{1{k-Z %kR^zIJE)RE)*bZ01}Z!. c Us1_ 1$!*WT%)UmkA*{R^ mk(B_mkE)* MkE)|WmkE)x-Z!use)*{B-{IJ ^mk90B߮s(B׿ cBX~7Mk9-sBVҔA {aU {1/Mk$!WzZE)hmk! ce)xs$! {f1^Mk1 c!7/*1z{9ॎsE).mk%)(mkIJhpZ(BmZ9pZE) `Z$!XiJ! Ub9cRe)p iJZ$! 5Umk*_R AazRe) ]%{1s9 ^,c(B c$!{_ c9-WX,c%)?s1zW\,c%)޵ mk1 _,c!_IJ!UR*{9b c1{ {e)_ c1 Xmk9W%}{1,c1wmk9s9U*{9Z0(BUWsRi c1ׂ*-jR qiJU`,c,c1 WIJ/ {9p|{Q9UE)bMk9i ZW*{9 MkX/15(Bx}_ ce)֗/{1WE)^-e)xmk9 (B{B^^`,ce) Z!6 MkB ce)R9WMk9^5{9Mk!*mk9]Z1WpZ! ZA(XR`IJb~/*R! e)bMkIJU _s9˿,c9X.Mk9ߗ.(mkiJW 1WMkB-Q1^ c1W*mk9_WUR1~ s%)(B U{ZUMkR" {f1z cf1^UR9Z9x`^7ns9׭j9WzQ{RAZ+U}_IJU cBCs1*-Ӝ1_ u,ci{X_IJw%$!y,cUWU YZUB^xzQ9{ ^MkA{1z50%)Z➕B_խsB .0ZjR{)JWMke)W{1-,c9 4s9WsB_z cB/bs(B __s9.-s1^MkE) c!\Mk1}/R1 %s9 MkiJ5 cf1\Z$!zR!ziJ!9^ 01ꨯ{(BU{sf1RWU Q109_MkxZ! *q(B_{U0!WU {e)U9U Ws9\^0B-MkE)* W9%mkE)(/ӜIJU}Mk9,cB^-mk9U,c9z s9U_R9-( c(B5<{IJ*__{(B{_RW-{4B _–R^ӜBVy c }BWiJU|Q(BU׋01ӜR- s_'^uBW_B z0mk)J(}{E) WBb{z,cA _Mk ZE)mk!ՂMk$!^Z_ c!pZ$! 5s1{9UU {1կsiJW+/1^MkBUMkBMkE)/mkAWR$!/q(B^//%){9\mk_*{!QIJU{B_QHB Z5W(BpQ1*B_xmk9}) siJ s9_{BW/Bx{B {AW*A_*q1R\UiJ{IJ}{9mk)J&mkjR ^pR}4iJ7 c`՚mkU%~9^R ~4B% 0jR ZkX9ӜMkXW{)J7/ZQRzzQ(BpUZ!W(se)Պ mk$!WޠZE)k-sUR$!-/IJؠU,cE)? ҔRA1}XZ'zmkյ|jRbuA 1WQiJm z{IJuX9,c9 p{sZ._,cf1Z1*U9mkUZ{IJ] z{iJW u c9z cIJ\s1 ^mk1ދUR1ભR1_b.{E) }{ *s9z{IJU^{9*_Umk_s%)sBX*{9 ӜRW BUxUuRU-UIJ~_sIJ& s1~ cD!*s(BW ӜIJ_Wmk!b,ce)*IJ _U1_Mk9 _{9^-{9WBmkU_Mk1p8LcE)xsR\-mkBz5.,{E)UZ  c!sIJ}U{B_?4f1W{iJU{Z!**mkf1<|!UiJ %* caU]$!ӜIJqbޠ cD!Mk9U{1 s1.Wmk9<5s9sBիs%)z Mk1\,c1/Mkx/ns ׾Z1p zs1 _ c+^Mke) +mk1xQ9%{iJXmk176 c1 c1Vs9xwsE) ,c%) { c!׺ qBU^mkBUyE) {)Jիs9W*MkB x,c9. {1Us1U cB\Z1CMk s9XZxR5Ӝf1 _0e),c9W c9U*WQZ}QiJؕqB^Z9V-1(Bmk9{!__zmk!Uf1*(B R B_1UqRUU/IJ{iJ}{B%IJU{ZՃ qB*WMk1ը{(BZW9*jR`)Jj %z{X,c1ݿzZE)7Ra֮/R1/xR! R (R1\ZE)WիZE)%5zjR$!Z9Mk9 sB c(B7+%mkB.{iJ^se)W cE)xIJE)5ziJe)*,cB U cB zmk1.'{%)^!z cE)-*{1*zU{9诵ՍkB-p,cBVmk!_W*,c!UUxR /Mk1,cWW Z - ,cE)Zf1V~jR$!ɧ/A /AWx c1 mk$!pW ce)-k9_B/%^1ߒB_1URUU(u)JWq c}xIJ{ W{1s9_Umk1^߮s(B ,c1^{B핯{ZUz.f1*{1pxRE)`kBmk!- =Q1^+{1Uzܞ{RIJbs(B cBx ,cBz cIJ_{9Ux c9 /,c1%*mk1ת ,cB`^^mk9mk9~/{9ހsBWZ1*,c9IJx`Ru cE)XIJ_*RVBa'ZWiJ!x,cկ-ke)W,c1+9.9s*%1k{1_5^W1UsE)_/4f1U Lc WXxկӜE)_~sנ c!b*s1MkE) ^W{1׵,cE)x c! {f15uiJ{^1 zs  ӜIJ/ 9X09W~ 0B-U^Mk$!p{%)7 9pMk1ps(B/mk9W [ z^s- 0Z׀{PIJ 7QIJX^qjR7uZUj`MkIJU&U09W-qZU}x^$!Ws9sR5%k{Z{ zs(B/z+,c%)\*q!Us1(0B`Mk9^ {1_z c1 =*Mk1xZE) mk9UmkR]\/MkIJr\$!s9^ %Rrs1x{1(.ZZQBW5*e)UW UiJ]09 9{(B,c1`Mk9? }QZ_(BpWjs1^mkA zzs9`W7׽$!U0e)rR|{jR7U4MkB UQ1x_{f14iJ qjRWxzWW`h1/ x^Ӝf1𶵉(BbzE) {9/ ~0E)-)J}xZ!\WW4E) s1Xxs!ժA_?41 s_U QZ^pBz R/01\Vs(B-®siJ*Uq9 W9ӜmkW5i0 cT qRzsR5Ux{(B }mke) {e)W,c1 (_se)sE)W*IJ] 9PZ-WUIJ(_׽,c{ uIJUxqR ӜmkUjRꂭ{RWQiJp ӜA 9W%)U 0!-xV4iJxUU1UE)_f1յ╭!*_x+-Ӝu!_E)U{z{e) Xxs -s(BP{Ap{E)ޭ~ Q$!{1x%)U0 ,c1_/Ru^( c$!`MkE)Ղs9QR_ c\ cE)zxqjRU09,c9W,czs*IJ-{1zMk9.0RUU5IJz_`Z1/ 01W41- ׽RUWxe) u1U{ Uf1յ{R4(B bUz8 cU bֵZu9 ^f1 UuR^-UQR^ (UiJ_BUqB~=URUոZ{zsB4R/}uIJ ׽$!תZUUɠU(Bzq9 uIJ^{1U c%)* 55e) WUb UqE)49ze)%/0^Ӝ9W/ 4)J_ ಔ1zX 51 W9VW+PUX,c$!Usח (B}{XWMkE)W-a^ {1BbRV(Mk$!]{*5A튎s1/_9,cXZ׽ZqiJWu(BUӜR`^  xq9XB_ zb!U`9׀B _Wu9U)JWz-(B_U*4e)ի9 Z15 {7XyZ~\ cUp)JZӜBx Q!{9%.ӜmkUU/0ZU(iJzR$!7x~s9U׽!ׯyZUuZX-/XMkW%zRU ZUh,cbUU$!/~{!\`U_jRU- Mke)UMkWMk Zbו,ce) R8(UsU$!ծsB c)ZW ce) mke)/?0!\Z!LcE)**,ce) Ӝ(B/1^_-UU{10IJ/5IJ UIJWU9ks*^s9+x^sֿ\U cUQ! 4BժuR U c%IJWZ^ 09/*Te)PAU5'WuZ-i׽E)'9,Y,c_}IeIJZ_IJVs!MkUiJ?RTӜ9A[B1`#RE)WB (ײf1}s!*>E)议E)bc}E)09 {R^pUQe)~9}Z mkB+U,c%).iJpz{1UiJ8 Z s9ZoQ9%0IJcz_mk MkE)Mk! ^kf1U{1U{(B5^9UQ{%){R}s9֪p)J{e)ڎsB{_U5Ze):R$!_9%)e)i1bzU1A' e)9dE)9*s!mBU%Ip!b,c׵ cE)VxmkE)UU MkU c$!+ZE)%}iJ!xjR )JBUb,c {9^*1~{1`` c{IJݠ{E)VB{ծsf1^0e)'0jRxBcV{xq!U uIJUQR%) *^s1h+R{/겔R \Us9\*{!z !{-ӜE)%T)J^ ƪRU_ c./8q{+VZҔ9^e)UIJ se)\ ,TZ%Mk %$! W1 1^ .:((0f1^^\\aTTVV!E)U1p\Wx\W(BUUU^sUU5 B0R_$! ^,c96 sf1^s9z^sE)-׭s9(se)mke),c!_Q_Mk)J+U\s9x{ c1 ( [ xzxx1!11$!1!81`$se)յ%u(B%8IJ\^UUsB 0iJz0jR /]iJXxzs |IJ_}mkAMk9յs9_s$!/5*q9WZ%ZU^RU9 |E)VW sRA`? *נBsE)W4B7 ,c`/VQ9^Ӝ9~-uIJ 9UbzqU q!U-IJขUZ +0~\\\!WUUUAIJ!W_qm UUIJWU5 ${E)p{E)% sBBW(se)ӜRU Mk) mkx cB _ZE)_X c Z%)%؎sIJ-mke)RMkE)*{R-UIJU ~mk9_RE)x|~1E)!1 )-1! Hhr$!U59RXӜe)- 4IJrx{E) s$!Wns* -mk1>܀IJ_QiJ(Ӝ1_s%)z/.Ƣ**!T c)}9-BzQ1z958Zbq/E)*{f1])J5UB^XqE)0Z}9 W$!UUIJ-ӜRu{-{%)xxe)URZ^ZX\AUU~jUUUUBUUU$!UU1'>;;s%)q9Z*pQ1( 햵RrMkBޠ,cB\_mk9 mk9.%Z5%%)T//QBZpp1$!;9sӜE)%,cE)\UQ9-0E)0e)U!zs +{9_ߎse)W$!UkQ1- UZ ^^QIJxq15uBU9 ֵMk]}qR7s^^^\ATVVRUUUUUUUUAՕU1AMkbCKs!/zqB_ IJp0IJ {e)_W{e)U {e){(BW`Q9 IJ_Xs9}W_sE){B-.s$!Z{f1%-Q(BzZ׿\s9kke)9h*9e)9Mke)5Q1ee9~^(B!+_IJ! /RWX/'Lc1uVbe)%',cV,c$!b c/ sB UӜR[sAIJ{Xmk9ֿ(4A]{$!ɍ/IJTUe)#RUQRpe)~Z Q Us%)mkE){e)Us -,cXR!5-{R]}mk!U QJ/ q1֪*ֵ cUkx\1ZU}[sAzzz`!]UUUUUUUUUUUUUUUUU cbKIms+ q10ZzWr,c09Uu c/UU,cߠ/QZ^WsIJb_Z`-!Wx{1 {1mk1-ߪ{1Z9ՀRe)\,cf191P9e)9ZUe)-ކ1VWUUiJ_rZRIJ UU-Ze)x_p(B!^xpiJ IJ1UUMk9+ rmkE)U,cf1*-!8iJB@`p{9bs9 kaye)U},cT\XSyΊR/'{iJ. se):U9?W1ղRUz{e)WXq%)=Q1{(B_{{iJU-ke)Z9_U,cIJ_zZ k{BAQ`jj@IJUUU9 UUUe)UUE)UUU 1UU,cAeu*sZ 77B5mkU׼WQ1\s(B ks1 ns9-s(Bx{* c9^,c9(sB^mk!U c!꿵mkB7 c98^{9]UB1zNdԆ1e)IJ!uB彖!no{1U59~jRU/jRUMk$!UIJ$!PE)Umk!^\T^mk09?714$ 9pPX{7'{9QE)CKCiJ >YjRaIͥ]9ōɲ!۠XQ90e)WZe)zk˭{! խqBկӜR~)JRKRqj09jWWs1%-%ZE) MkE)?-ֵb_ R^0Z5  (B*Wq9HUe)Mk_>.0E)U4f1U_*1 qf1p0IJ- 9UiJ`^Mk9-`~se)p01-W!zs ꪵ,c1 s(B }^01`E)0)Jzs9. c 'u(B1:_UQf1VXrC{f1UUmMY$!s1e)SZ\T{E)cМ0E)V9!V^b(B!{E)e)WVTBMy9UU%)[\TVU1=99;u !XX\0!ZMkaڸBiiAA1`֒ 59 (y ܜQrx{f1%5|IJ\k1^,c!c몷{9)IJ/*պB_WV\{9{BoB c1_ Ӝe)%iJp0RUXmk9#4s]Zz[{pZ5:+׽mkm%%B/^zIJU8 c%5Z{xTQ(Bտ(BW{Z{Z} QR-_09XU{/.0B*QR?ׯQB^IJ{9-7 c{1xmk%)^W`1E)yq9IIII0%)iiqQ!ɩR!"mk4`>?==f1VWժR zX(B%)U9e)T\؝!csRX!5C%)w=Mkށj~~Un{14{e)X}IJiaaaZ!U⢣E)0<46'׽IJoMk1ܞ׽ZIqRRf1*b"\{1 f1.{B/Y΅)XMkE)bxmk1abrE)--iJ*ծs9%-E) W1_Z WxU$!Z`zzr c3mk|e) z c105Mk5iJPxUIJU{R\qR+zRzB/IJտ*RQ,cb,c-}cq9W0Zcp-QRUxs9. mkB_{e)~{%)_PpQ!SS )/'',c1;mkE)PXXX155͊R 9 Z>(B!PB;>>}1*\1ܔ}BbPX\0E)OyMk555%:ކ1_Vv|ֵ #2ZfΞRaaccMkE)֧95%%ZIAacjR0IJz(B*%0RXW/s16*mkjR&\IJ{uZe)Vq_׽9M,c$!ɉ16fU`hhh{ZX,c$!T1WMk1URIJՕ55B667'0ÂƆ1 !YΦ1w}qE),8{% ,cjB\ܘ0B8<<>֦1WVT\}sccbbmk!VVnȖ1 ]09ppsq9cR%)(߸K1? c[u!UUs x8u1Sx9%-s1^TT9{]R\^VWA-%A- 5RUU0-+,cE)\\*{1-+ZRQiJX0(B4Z- e)\\\|R1URe)>Us9.iJZrjBU0!/{18 cmiIӜ9*''.\pp8ZSSP{1(*~s$!ꭎs1 Usf1Wu1^^Z!UB1]T_E)y(($ ca sBq1$!Ts1SRPښ9I3yIJڔfsB]<9%Z 9e)|^sâ1׽s q5E\Bmk55%1\XXP{pxxxs!L4iJ*555ާ9P8(B\\{9j mk Mk9 W| E)TT,c c155]!srrrkE) -01[e)-ɡ!\ܘs$!O}9;>)J\tlZw-*B! ZFj c8(0f1b{6&'Umk<{IU}Vf{PPPRsPRrc֮sxXXZ49Ņ55MkpxXX8Z Ҕ^49e)ZXXXRU\1IXƆ1υRR$!XXz_E)AZ_bX\VVUUUUA%UU/Z%%iJE)U/5%sB__{(B+ 1ZIJ5,c Mk9h~0%)ͅZ1U'{E)mk(B* c(09߳s9`ת]$!D!/**)}{&!W c9qr(,c$!W c1%be)?5)JVV{1WU~xq%)K<9SSRRs112MkE)<$׽B==%jRE)e)jzAbcaz9Օ5YΊRxx|qIJ  ގsrRX\uIJޤ)J1  0mk5%'iJcҚ*<{8Q׽,cÃ!sz7ުRQmk57u1pXsB Z9 c1Z%mk9U*98````mkIJ,v,mk9NIBMke)ZZ\\\,c;?5YΧ9\\{(B8e) TA- Ymk֮sl<<{@`pP{RXӜ,ccsҔjR~zyq{_{f1 {(BTMkj9{Z# XƎsQmk[Zގs55% c@`rK{B@`` c!. 'W1x} ~A UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUb*E)A/5!/WIJ!%,cB5zUmk9_RA V\(B ~UUiJ+ Mk9_}BMkB* IJ;ӜR`mkIJkZ%) 'sE)ppmkUse)}zZf1r9/0B + ce)Tls!c cA֗U9jxxxmk9鱱{9TTVֆ1% )JppXҔjRBӜ$!׿*XƯ{ܖײ,cBJmciJ'%:&Z1~|$!/%%IJ9p cE) ?-{BR,Mku c12{(B4&mkIJ<6siJ8ܮs9XX,1+^_,c!Z!>]UBA\|\^a!jAp^WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUb+UUE)a--9 ZZE)_ UZZxr{UUUU,c %s9bz^W,cR+.- QIJ555qAxxZ(B)5sB57?mk\\Ws$! _s$!X^b$!-s1=)-,cf1BLc%)RSZsA5uZ\^UWLc9ԯ{179qiJX<0R@@`׽95%Z췕,cBTT,c1s(B%%s9`jRE)X{9IJE)ZE)?* 5Mk155 c(B/8(B{B5{B'..Qe)mk1UR%)xX\^IJ!r[]BWW$!A~WWrWU!UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU5A/e)?U1xzz*1UU15ݯ [9',c1+??Q! (,&BX\VVZ zz+ 0Z90_se))mkBXns9ڔ,cE)cbIJRSZ_-kA55=;{iJ& c$!IJ9hpz4 #1<<IJ`@41iҔR c1txxXZ9[\Z1/-=Mk1ckZe)^͎{BIIAaZ!678{1iJ9( }Rqq0f1???7MkB,WiJ&4)Jx9VE)ax^V~~_A`_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUZj a ]E)1! WBj`Z! 5s1eZ9{Mk9={955 cxxZ zMk1/-MkB.hZE)?Mk1rqe)u}(B_^\Vmk9,6R!7'׽9UՕIJ#;s!%%1@@`pyIJ?IJTVWUZ1ܖ c1\\TT׽1Օ5/{1{XpR9Q(BqQSRZ''ZE)9{(B®V,ce)~wֵBsSSSs17__B$!iJ|~%)a*9!AVWWVVAXWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAAU!VA a E)A*+)Ja(BE)hl~iJ%) +Re)(ժR!\IJ$!(BZR$!5b,cE)pࢃs(Bս\4?/o,cE) Mke)!!)J$!--A5e}{! Q%-- 9XXQ(BBR^Z1,cE)RE)חq(Bi{[$!{[[(BE)C9R[ZZR ,c IJ$!ԔIJ!llvwe)RRZ^9ZZe)b1A|^WW*!UUUbUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!UUU!UUU/$!b-]9ݦ1W(B8*IJe)y9 `R ./-R (pZ!-R$!] c1MkE) ce)0BIJ!9?be)Վs!MIi׽$!0B46{e)tZe) ce)IJ?7%%{9ZX\se)cbIJ$!mkx||IJ5],c1u1/e)תRX\Ve)AZ^_VABkUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!UUUAUAFA8$!Aˋ}9A (B\R iJAX^1b W^(B ,c!\XIJ!V [f1OuRѓ(B!. t(B%)ՊR!aa01 0IJ%ens$!^9!$R!||nZ````{e)\TZ!@@HJ9-=R||VWE) 1Az!A} >!E) WWW!VWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUUUUUUUUUUUUUUUUUUUUUUUAUUU!UU/9AU IJb*,c _ *{e)/ {(B X{1{Rx{RZU=s9ުˆnsiJ۲ ce)hZ1ZE)_{U_BAU_!UWzAUUW\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUUՂUս+9AU Z/sB+{IJ{9޾ 0ZrPZxU(B/4 c},c56suӜR{R*,c ^,c}ZW QRx8Ӝ(B]\(B^!WUW^!UUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUՕE) Uյ/ c {(B-.LcUU,c_ӜR *4{5,sUIJ s ]usʸZslqZMkrn{Z7/ӜmkU+2?su.\TMk{s])Jz{9x,cE)U\BW_WAUUW\UUUUUUUUUUUUUUUUUUUUA`%)/+(B/*ZB 5sR%W{uMkUUqZ {Z'0 c MkuUӜMk_pUZ~QZzq c+*\(B^ ,cMk^pZj0B~{RX)sRW\0b鹣{R`MkiJmk1^ cW_1AUW~xAUUW\UUUUUUUUUUUU!A!`X9  iJf15+,c9**+ c1|\Z9(>sR]^siJu{R"^_]mkiJTZy}Z?QIJr.QZUpZ-QZq(B.mk[r4R/_s^ Z(QR޾s+*ZXqZ{Bz-k$!W^x`E)AU_~xAUUW\UUUU UUUս/9 /IJe)_ ZB[/Z9* {9 Z9s9rsiJ mkR 0Rq,ccjZ"U0IJ6{ZP440 c~70 cಔZj}ӜRmk_4MkU]R W4RUsIJQiJ ^(B^mk9LcAWUB!Xxx$!_~!UUWVյ5-1b//+jR1 cB/>R1V c1UZB Z9('-sB{9umkjR.mk(BWQRb{{B+ {Rbu,cIJ 50R/W0(B^mkB©sIJ_siJ^,cB mk(B8}sB~׊R9ԊR1zIJ1_* R1~Rf1UB1;{9x`x֣^^~xf1 //R$! c9WZ9MkB_zMk9sIJ' cIJU( cB_,cAߺZ9xxR9+ c9MkBX{[RE)^W*IJe)ViJ1 Z9 c1Z1_*ZB/hTZ9_uZ1/U c9bZ1j RE)«Z1W]iJ1-oR1R9WzxBE)jE)A^xZ$!ս- Mk(B["MkIJ_` c9*ns(BuMkIJz]MkRsIJߧ'MkBXsiJzMkRʫsBb1`\Mk9MkIJWMk1^^ c9U鸼ZIJ驤jR9*UiJ95Z%)zZ1R9_Mk(B_R9h jRe)xR1}xRf1u c9뭊R1rB1hIJWW_Ze)߿ ZBJ,cB+Z9mZ1 iJ9*W c9 c9_}ZBc cBmkjRp_ c9} c9WఎsIJ cIJݎsRRC,ciJaJ,c9^8ZMkE).⺎s9^z;mk9՗mkB_>mkBMkB` c(B c9RBpZ1zZ1iJE)XiJE) \IJrzxsRUW cIJ*sRׂmkBk,cBUMk9տՀMk(B{rsB{Mk9{RUUxW cB,c)JnsiJ{Z_5uQRZZ%cRk,c9c1*IJ}^pIJZ{(B_Mk1pjMk1UZBZ Z9 ~Mk9WZ9b_ Z)J{),cR\fZB\/Z1W{ZߋU,cIJ|*sB_sIJ*UsIJU,cA -mk(B^,cIJ ׫,cR6(<+{iJ{ZrcmkRz{mkBsZW{uiJ/uQ(BUQZ=?U0bȀ0iJsZoW[mk9\WZ9{ .se)_ mk1}_Mk1 -jR$!{"mk%)* "sjRXVsRrhUZIJ b,cIJ,c9_R1iJ9{-R9bbZ1 cB) cIJZiJoW( c9z c9U,c)J*Z}s9}-k9Z9ZIJnYPZe)WIJE)ؼ * c!R9`e)-mkIJX\,c9ֵmkf1/QZZrߢsRUsZ^k0RUUmkiJbszMkR*{IJ-bsA`-k9W~sZ,QR]U^XsRUU c9mkIJ] cIJߦh,cBsiJU^_b1{z8b1޸Ze)_ ZMke)կ*Mk9((B]9_ s(Bz/01bmk$! ,cA\ZBb`Mk9`+ mkBQ(BpzjQR5 {E)BxMkE) mkB>6mkjR-,c)Jb{E)7%mkB 8\R7 ג(B_IJ*,cB$,({R e{(B*}0IJRWUsAQiJտ/4ZUq cUZ`b/Ҕ c_{Z z{R*QZ](Bz 0Z~QIJ 0IJ`{9 Z0)JUXMk9#QiJIJw6{{f1^ cE)Mk1_r`mk1W mkIJ c1WMk-0R%-+qR'`W{9(,cE)^{1 R/Z{0Z sqiJ4s%;RZzWmk98.WӜ,c}Q9XZ^Mk1WҔA []qiJ(IJ WZ{y} cܾ c9{iJ%)[Ze)[[pMkE) c9Z1 '* c9 s9XpZBn{E){1zQBUmkIJ(/Mk1`sj,cAՕ {IJ{R+Zo`B.[U,cW%1^xmk%) c1 QZ]=R]3g9V_ŠR9U R9XZ9X +mkiJ(?؎s(BW(>sIJW \{RpkB~VkR1wE)R`R9iJ$! `MkE)%s1~ c1_},cA7{9x{9W c1V\s WqRâ0R-QZR+5ߒiJ{iJWr{iJ*{jR(RPs1rms1rU]UIJ17:ߪR9Rf1RE)‚=Z9u,cB ZIJpkmk)Jr cBpZ9 *sB믂U c1iMkE)_{9^-kRYwiJ] ,c1XiJrmkW1 Z! %mkB ,cB s(B}{)J]sIJz/ _{1_MkB]qIJ-wIJp~UU0e)r_U1 /_9 **iJ1mk9]-P,c1^XZ9bW܊RE)5 Ze)_xRE)ZZ$!׮sIJu {9WܮsIJZsR Us(BmkR( XqB{Z9-+sBpjwJ$! e)51AظZ! WUs sB{(mkIJեsR {y,cIJ.iXsB,cBxz^m)JW79~׭f1/  [?{1 ɿQ9⠎s(Bj{(B_޵ sIJrsIJꗷ sIJWs)JUV:{B5T{Z([QR 5Ӝ,c*-iJV zzzzAWVVVUR R.QZ\^^ c9.b1rs(B},cA.Mk(Bub,cByR1_91TUUW(BE)?=mkBIZ1"XU c1( ce)zZBXsiJݹ ֵBs{IJ7w4Z[q{9sBVhs9( mk9xMk99:msf1{9%-qZ_mk`e)UUUUUU9 s1qMkUQZ/W{iJ޻mkR>^ cB,' c1XZ9* Z19e)zxxx01U5s1cR؞,c%)XIJE)~7(B%)Z%)9iJu-iJX\\TsR-g41ˍ csYYs{IJrb{BՎs1QZu~,c(B[be)+ӜiJZ[_^iJ^1U+*Ӝ(B*ӜiJmkjR'mkReMk(B ubmk9!{RUꊮsiJ~qZ_r{Mk1XW^ c1Vbq1 cE),Ze)^\|~{1Օ59L1gi},c-- 9tޖr(B祏sE)׽Zb`B'ZBh}Mk(B72ӜRrmMmkB+g1b -ծsE)+߽ c1zZ -5s}09VVUR -{IJ/V{R*ղ c+4,c{ZxޮsR؊mkR}vs9jϧ% c1csE)C0177mkE)_4(B5%-!XƎsjӒ𖵪RTwUMk 8)Jֵ(B975'yZrbbpӜ9sZ09^0)J=OQ1(cZhxz--,c5RA, p umk]5UӜMk7.#Mk1TT|mk9-QiJx[sBzZZlhMkB[MkBMk9TT1Z1#mkE)CCÂXjR%q1\׽Z9;ƪR|^^{(BҘq=500y,chZ==mk؜IJT>ӜABo⢲MkE)CKOff1Apx^WAUUU9!-5ՊR QJˏӜZ{IJ׺ s9 c9R^mkIJX4MkЕIJpppX c9z4IJՕs9\x|IJMMOO-k(BiJ񳶵R Ɋ)J؞uRMk\~_qZ׽k =Yq*u{@«ߙ-k=;(( cnxX(B9T{(B8x9!x^b\WWUUUUUa5UU9A-9BW0R"?{Z/{(Bz~P,c9׽sRUiJ,cBzB5MkiJ4iJ%5Rx|tvIJ!,c~_qOiJ$ cs {IJ{4R??նs %{ߗ8Q jR>VTIJE)^^Zz_WX^WUUUUUUUUUUUUU5U)Ja/UIJ.mkB-UAZUUMk!ꩩMk(BZ+3 cX^,c9'J,c9mk1?/ c9,{ / c9bj(Bc{B2jRjz^mkjR *?sBzz c9qsB%,c5%{Z$wrZumkB\jb$!#_ZaWWx^WUUUUUUUUUUUUUUUUUA`$!/B /9\\^ c!{IJ? 0B\VWZ%)brsf1c c1=? c$!hx|R1U cqQYQRsBpz{~ c9?Mk9xz^Z9sSR c9$!//MkiJ?)yZ%)^(BWe)!~WU\WUUUUUUUUUUUUUUUUUUUUUUUUUU UUU+UUE)!+U9 U c!+R1..Z1B,c1)_UZ1 Mk9??{9,c1=={9ҚQR4v{9|VUu{17%mk9V c1X\,c9 Y[{1ee(BW9aWU~WUAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUU`E) U9 U9IJc}(B-Re)T c1 e)9V {95Mk1rIJE)eZ$!Z%)^jR\VWIJ_WAaouU!~WUAX_UU UUUUUUUUUUUUUUUUUUUU@@UUUUUUUUbUUU5RUս+ caկsA /QR*0,cU?0R€1(B*{BUMkW1U^xaUUW\UUUUUUUUUUUU!`iJA- qIJ c _mk_uMk+sx}0 c&=QMk-,cZmke)x,cU_z! `IJb+Z9 *ZBmkjR >sZ^/ Q,cUޮs c,c? cmk%_Ҕ cU0jRsAޫZa^xE)UUW^B - R9-Z9 cB낎siJ_U cBsIJ(ows9WUs9 c9MkBWZBR9B^^IJ9 ֪IJ9Ux1!Xx`RE)  ZIJUZ9[ZA ,ciJMkR:^Mk(B׷,cA{ Z9Z9 ZBݭ cB>ZB^(R9 VhR9y:9pMkRU^p{ cRj*W cB׳+ cR*vMkIJ mkZUx,cR'-(R*]{ZXsB킠{IJW c9W c9s,cB{,cjRZ9^jbs(BUU,cBWMkiJ c(BzZ9Z1,c9,c9{ cBuJ,c(BZ(B\% {IJ͎mk)JCmkIJゥmkZ=}U,c9 sIJ>-sR\mk9{Z^ۯsZU5ZQR^s(J @`{B -uR* }sBX c9~mk9 c9ܺZ9ּ cBcR /mkIJ TeMk9rLcb/sZ{Rx{)JB,cB۫{R"n9WWUZ9/]Z9,cIJ:ZBVxRf1R1z cBV{IJr,cxXX)J/},c%MkIJ*,cRz~{iJ5U{E)WU9++mk9# ,cBw8Mk9}(Z9WsB_  cU_sR:qR s iJA}55Mk Mk(B cB+ZIJ?!R1pp_[Zf15%-mk9U,cIJU4RU{R͍{jRsiJ*]{jR(*ծs9 -MkXsA*iJsR]zmkR{iJwZe)zx c1R1uԖs9UYΪRmisS{E)*:۲4R^~XMkiJ%{RXRRA iJ%%%%9prpqB{R* ӜZX\MkIJ{}Mk9빳Q(B_?(B7&u cxX\VyήsSIJٛ׽Z||{AMkazZE)5UU|--0Rr׎sIJ~hYZIJ\\~_s)Jia0)J4s%}Mkг,c\[uR#+׽0Rmk~9X^WUUUUUf1-UUiJA ժR.'09{Z9/R1@ c1Zc`0(BWMkB|vw0IJ==5s1ZR~W 9 UUUUUUUUbUUUe) UIJUR$! uR$!Z9ؚ[SsBiZ1nshMk%) sZuumk%) z,kf)%ZBsBW/s(Bumkb`b,ca- -,ciJ( c1jzjRe) 򸒔IJߵQZ}mEmkRMsa+-5R{ iJCcmkR^W RսuMk'' cO`r c!p^RUUUIJ!U cZ9*ms1,c(*~ cAx_U!\UUUmk!5{RusRhU c!W\p,ciJ0sRUU,cjRUp?Z9~,cE):8,k(B j~h{97MkiJՉ cA Us9qB+"Wbx^U A-kpપ cb sz,c9A+ZRW ExifMM*bj(1r2i ' 'Adobe Photoshop CS5 Windows2012:05:25 23:57:47&(. gHH Adobe_CMAdobed            P" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$IJI$Re粠 kI inr_D~ϩ[5ٍ]~V5H<7N Mxv3]_]l/9%8.EN)Vc K_hcIcW golz582Ie=fX4|Q1̢ګ6זz*eVuvo־g MoR]pd2}'Rs3i)+}amVeո=ss_g\S[=⥟zvN9^CZ*Y_:ݪ܆\ʚzϲde3~GO濛U&ާo몦5ٸR"_ev ~Jhga<3w4"9@]׌;ߏ~0~_1vkkuz/v岯ٿT5ދf]SMu>kItźCi~ޅIN I$I$$I)I%)$IJI$Rcpcr!;ݠ>5Ez񾟧EPi"ἍHlZAi[]Jp1`Y$A^:8Y)I$Jzה΢kێ}mo_\7eێi"c}vTW6˶1Ѭ9v +dʭ`>S?uv%>jI$$I)I$JI%)$IJI$R{1kڟkˍm?)^d 7A*dn{$I%=u%Fᱰ4qo۾mh_6t&G`ѿwoyRc[mRMKd}Uye%ƙy9%<:I$I$$I)I%)$IJN֗84rLdSz-Lg s5?q}olcYS̥{?,rl N~Q%'}l-^mnݧ~ԫ75%ō  Zy?T X@q&R?g"oފuw]Mgb ms<=6j՞dWiȹ4;nvmzW;6ůbd[{YƲ׶X[[k]7n}6IHzoFWs:udY5t45~tC|`,m9Xd:湎և_6-ޡF7NR8Ai"c;\ſ%ݽ[w/tC׌Vk\Cuoٽ+ eeq=tI%)$IOI%)$IJI$RѲK_S]O OsO=QV_V7#lԹŭX77IMϪZY[-}6z澵]enK\ 5[6ճ{>:jYEd1k=cwC'z}mN@a۔0͂Mc1&F]n5 ےVb~o6PyٸVcif"7_Zk-V2z5w7}}ֱͽnv㵕[eloJi7 -ȱ;Edej_ֳocSƽE-1ek~2nko5~QIJI$RI$I%?@Photoshop 3.08BIMZ%GZ%GZ%Gw8BIM% FV4x$8BIM: printOutputClrSenumClrSRGBCInteenumInteClrmMpBlboolprintSixteenBitbool printerNameTEXT8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Rlt@ɷ vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM 8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMCphantomnullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM P g Adobe_CMAdobed            P" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%)$IJI$Re粠 kI inr_D~ϩ[5ٍ]~V5H<7N Mxv3]_]l/9%8.EN)Vc K_hcIcW golz582Ie=fX4|Q1̢ګ6זz*eVuvo־g MoR]pd2}'Rs3i)+}amVeո=ss_g\S[=⥟zvN9^CZ*Y_:ݪ܆\ʚzϲde3~GO濛U&ާo몦5ٸR"_ev ~Jhga<3w4"9@]׌;ߏ~0~_1vkkuz/v岯ٿT5ދf]SMu>kItźCi~ޅIN I$I$$I)I%)$IJI$Rcpcr!;ݠ>5Ez񾟧EPi"ἍHlZAi[]Jp1`Y$A^:8Y)I$Jzה΢kێ}mo_\7eێi"c}vTW6˶1Ѭ9v +dʭ`>S?uv%>jI$$I)I$JI%)$IJI$R{1kڟkˍm?)^d 7A*dn{$I%=u%Fᱰ4qo۾mh_6t&G`ѿwoyRc[mRMKd}Uye%ƙy9%<:I$I$$I)I%)$IJN֗84rLdSz-Lg s5?q}olcYS̥{?,rl N~Q%'}l-^mnݧ~ԫ75%ō  Zy?T X@q&R?g"oފuw]Mgb ms<=6j՞dWiȹ4;nvmzW;6ůbd[{YƲ׶X[[k]7n}6IHzoFWs:udY5t45~tC|`,m9Xd:湎և_6-ޡF7NR8Ai"c;\ſ%ݽ[w/tC׌Vk\Cuoٽ+ eeq=tI%)$IOI%)$IJI$RѲK_S]O OsO=QV_V7#lԹŭX77IMϪZY[-}6z澵]enK\ 5[6ճ{>:jYEd1k=cwC'z}mN@a۔0͂Mc1&F]n5 ےVb~o6PyٸVcif"7_Zk-V2z5w7}}ֱͽnv㵕[eloJi7 -ȱ;Edej_ֳocSƽE-1ek~2nko5~QIJI$RI$I%?8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong׌FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong׌LCntlong8BIMRoll8BIMmfri8BIM http://ns.adobe.com/xap/1.0/ Adobed@         s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uq$oUTN^W6Bb.y=7Gf0&lU5i<"k:;JdVV)7ynON]Y?V*<8+t3|LXۭj SVWy8YK㊰?7~Nk^Q./n"_qoW2fVUf*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbSf5:]ٱVm~@~chsjzv*h?SX&]jݾ ī~&_syqEkyUeN%_,UiK|UhUK^K9!sZ]lдkBXoZ9Xq_wqZU?Һ6>}⑕~qWZlu)_554x("IoG H}r5-l*~UehV6kg,ޛzӆc*1j6zq6q2Ʋ5 8ݛJ|y{&,3O ּYUc4m|VyI5YK-+ ʲq\U[^ּ-0\Z:D,SF'8ɿ).uoMCRYn&o-f_$rLM%t['>0 ƽ}/ܯ>LCΛu_I g\__M1^IqT?Fͳzz$2FTj|-7rCqNn0|k=gJV4g_?emqV#EZ6Mc$7\cE[=5?ثk[Xկ$XH-$̩cp~*^[s['Ynjb#ke潢SO1OVI~Ȱ'Y{$W4mӫqN?ڥGycN6 _X\XI;4GbqW*U5yVZk8c_lU|p˩Mjev5oqV+/*,Q⑸4?qWZVYp̾6*l|IM?I?̸[h'XndKv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uت&kɣFYf_Cyq'Z:/#W?zl]]MuYثIup/_t򽎇&o*6z r;c9zm8~bKȺXP[dK*UxU4W~Y=Ŝr,zm־mYfJ1Wis~_]K[u} *Ĭ7㊾hKM^p5`_o]z/,ȼլ,yDu.|?ˊ9tد̭y[7 $g++T0b?ǍSV)Oґ+ TOw|f7-dvv^k Oƭ|_*qӛG9zR\\\IRЁ,CAS\MoOEX'yF*/,k^ZEƤ抷P,:?㊾2/(܊e<<9<ɫ0+M'k'Zb'.U^j|宩nt/^Vb1X+=RYh ?|c¶zoy Y<T{֯|m5?kڦMOxU^;9}4v>LFUMBI~eUU㊾2]7{̚u+zgVvoisb,A[xn&uW8ȵ;_[<[\d[+ VNPܬu ;|< UCrZddnHYlU~Mh~nE_FY.~&UT:}Վr Ҵ *O\u4~Eҡu!9!ۓSli[O8^ָ֡&cn?~* _ȾbI5lx*ƙY['[v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]l U/^|WLAWR/ݶ^gc{ǗoI iM_,mJP%YHѭv }meߙ~E|- d|gUj_WYb;YM>Ui#Xڱ~!⯐?4 }{U}5ǔ///,Y$ϔ|Bz7*PԳK{VE8iybil)-hirPr_f>VKռ,> v:FF1TG<7W~_a= vca"KYyoV*?X->hﴫVk{y Ȼ1WoWZ~qv+ַ6vݗ*I{:_W[[;k}R;8h:ū*wֹ>g/.#7k+D_Ob9#YdEVHےqWc[ߓ7[mqW6EϮm:%q_}~DNO-7_wOۓz 8⬃oȷߙ_lu&n.94kE67uMZ}VIcq5T22b??2%,;Ri.Eb)aOч>?ث4Z"4L_v?nKMXbKfV9\pko7*ENWY_WO8C9w+њV'=sޯ.?"7^/_ȿzuVWe9eVIbu-ld@A⯍qWbT׿2 lUn$-7b%6u¼,kg4zeQqogϟV$bMkt Ŭd ߵ_c_6-旪 ζG+"VD}!8-{Z֡p-+#}[T/lUt5y?Z KQG__yQ?9fhC 6hmkco*E?goȾ2V?Pf&r//֏_6Aǚ,X}6Me6YJߎ*#yIGv2/yLo} C"lUv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]&KTkM^⯳|8{䕷7/3yZ;դI*+=/Tc=JcϏxeovmiݓ\~O*oʝ;PԵ ?Ѿpolp4+͠9*qϷP]_LY^Zp5/qW/*=zW~L\I妳uxfmIXޜKluM?C~ ŝnW4/Վ*??-̾UM}k 252,㊢-Mԯ+g,pq_9L~kyC[X/Mk5Ѽ`:ڸ+/xԬzrNub;&<'Fky5ŵwWfO#3t_/E<ЬqY*/dw)r-;8n`α,LU4o=+Cx̍tߪU_5kί}Nj]M}y.W犨]X\yg4p2WG"2*˸8/*cehv붶>cH׊]+AwHMb9vGƛc; ,Mw_?ϞjNJMBbVb?1EEWM,?6|M_j^WIVo!3/I/0R-k5Er*+'$*%:5OɝGTӣmuhciZ @ʭX_;8gSҼMJvL!G+ҋ׎*^sʲ7+(nލ2ĕ1V91/ˏ)VcOwoq]z>nY*cv*q/MFkƍqO3Kikyy/+⩧/$Z>|cY$Xg^6Y[^Oiw\ռddtgx^S ]ֵ 4bws mO>Way/TzmI} ɣdzt1Wzh!^XYֺԃ+"Hd⯛?-~`yuo[Xn7FGr~J}F⪱ßU>dF4EV'x|-9k~Yyj˪BןSVKXNLŹQ+qWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]'yRMơ[ӎF*ϝ6ƭj\i+"edʫ~⬗zU_H/5+Y)"l x7g_5}G>wkxv:$i$y,Ǐ*=6??'FK'5;y-}5[ܦVO^A1yo*ЬRau8X?fU幵k.3kgIk+Vef_Stbkx7Fo'Ꟙv7+XY][maez,ܿYG~_ywQԵ/m]}Ie^/O 8n3/| V%厩o5'ǒC#Qt_ͭ˺_05{Tչ 8 'cZr>4| ~U]v*UثWb]v*UثWb]v*Ug_i w]Mirbx$h_IC'7Em5?4_c5]D7%d-Ls/fkHt{^?^սE 2W*,07P[yUēcf]S}_o6ky;>ͭ5ܾS^y9ye.,uVpCg3qUoR8Wy?M-ǤȺ g Z+4@*:VQןK?0y=b}H jE;~??bgK^r-_YT4V/Od~ UK_:琼yCW\xqk,mˋ˲?i|1?//0^utX!nqZiq&b>?5\sT(i5zp/R1V3v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]e?pt6m$[3\UV:֛girz~ wV/A2CU_>dO4[KX}kvrz`js_Z ki$vgBz/}O/掽g/IѴ[\UcQH#֕xלXαWb]v*UثWb]v*UثWb]v*UثWb]v*Uh-q#YFޤvY+󖟙SX!Fj ʢK/1&*?r^]ԿMZcGg4uVH㨉$E*ğ6$ڸaFYHvޢ__\[[kukqC42|K$r/C?J#h7 񕸵N}9y*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]Gًf/Tb?NjgIV]b6er7m/I*6_1cN8cyW)Ec7znO.T~P~`-q =16*/t:f24;qQWb]v*UثWb]uqWb]v*UثWb]v*Uت7J5=n=;Hc8b^LIYŌAKHHOoq%‘S~TyycHd=W qV){/aheUF*]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Ub[U.ʃӊ/O+Yy^8",a=0! K?죐K̷j7\M4fbIo$&LC#E{|6 nVDY3εfc!"]EWb]v*UثWb]v*UثWb]v*UثWb].k?,C.YMrhkaz-`W&^2@[i^^k ^{I+'aLf,]@6ͻD nwiLmҡ4Ԭ^vs~~$2Ȳv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*OXWbӚUwWFk[U5krAPig .<bPq@Պ A}$rK(-scyb]v*UثWb]v*UثWb]v*UثWb]Ygi$UƤ U㶆P-6 H~Td7Rh09n)Ћz`fquaan:c_d;v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Z]wM\Uyb{yI ʒ?찡Y(%irz g%e?իԎ>k1s5ЬE{blxt9.]v*UثWb]v*UثWb]v*UثWb]Mp-<ܘľ3Б}eQn ujWrq;*P.qKvjp]3ȃ`k֔1@ۦVwq&j 7M{mJ6n)T|[v*UثWb]v*UثWb]v*UثWb]v*h~z$ q[ƂlU폚lz]<2,噕d dVˡ.>HzlR>R%'pjp/t|ۅrS\ZT ю(xE^dUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]lUUثTfj:v]WrJY?,UWXySNuTx*dT⩾y+EA#|Ѩye%R$3Q$RXt ԄP=h2*wQH31E$b6ABGgߛ{ھ䓑 "zW4XkN\zMy Ȑ!5/˻Sӆ #,6Xs!Ib(F*v*UثWb]v*UثWb]v*UثWbWGTT}W3qb1՟RXBܵ{'D-zUO5E0ZC^Jo RR~ "V[En&iT!;99>}Y3G)R ;#%ߏ4`eFf`oꤘBh9 :.DiNtynT# }1&E4ߡU v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتyHcR9 :v/̟\x"@n59%k fWGd .^p6laa^aZT'yڋj)<:~''mdZj!@w!GJRHۉ jl;{m Yub,?-K41VWb]v*UثWb]v*UثWb]U[㶁KM+EK1_]~]A5>Ks{|9X@}>Hi$$m?ţ&q>Bޤ2܁@#Hͷ~Wۮ$RARc֭wXF;:Qh:M.9=-BA4"O"^O-|G7RUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uث'4K 1Ik$.D׷ «XE~T*'nB_n)=auB`UN*BùĨF{J˂ zPvLHF8IB.{J#Y FpP0UثWb]v*UثWb]v*UثWbS&Mr1WuIo/nf~L-~I= ¼6S0+*HLL@) U,H8nsS1,4vE(k$CPWq@)R0[*\i^nҧ]v*UثWb]v*UثWb]v*U4Z6UW_;%F-u/s#| ,KѬ8d:{*ƽ)1T4DrۯL%7"zIeQ eH#!Ӣ%XuޘHb+TyYm5+pGD.úڥM?[;Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثu4**UثWbSO.h厓n+%Ԫ%'sbi<\y=PNžQIU^  C؁λŒ4N"*wٮ  @`J?0Oe]}IkYڟqn]v*UثWb]v*UثWb]v*U3 sX@%ANʘEfJ:*O `ܽh* pQn:B &7\~P=K 0HY=.\*W1X"X Z@`?S>q>c^-Wœ UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uzj:>{DmԻ( *-iqV^Heq7K,]o&xEqTӯH4L@ pLm}v>bĒjz'b]v*UثWb]v*UثWb]v*щ2:Uw$7/)Cs,q+brLK,k"n␘$oUﲀ;`)hքVbnL|? aPO IT)$6B=QӐ+ v ʼޡ=7ɑJcjz7PNޡi1$PzsJ #UqWWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*U6o}ˑ+i+]H/Pi ShI]uiYFd, Yv]COؑl'Ҹa]FVc[5'&xeI /eR74U |z+W]#Z6wF;ryAWb]v*UثWb]v*UثWb]WqƊj⯯$nV_.j1'8#V1*rAzVr^># -t:5p`J!/@p=*;iĊoC.CPi>cs5$XPnE]@`=G_HZ}"uKnO_"]x.86B\rP`WʘUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*U^.mx|V{yeE}9)+F+]-orLhf;l?|2%j$ҥ~m-Ib; 7#I$ [[ti+@Gpr|;[_.L'!XӾD^֌άzP[R 7oqKYNhH N v*UثWb]v*UثWb]v*Uث`Ђ;op]ڎ\sDP˝%oK>#熕ШndBrqͪC7kJ2:ԛ=[ۧё!(l)4^)/c<]*YR}7Q z7AGCNm(QTv*UثWb]v*UثWb]v*UثWb]z_e0=qW {Bek0(0%ү Hj VªmZU!ov7]T ̢z\v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWyfm_Q1M,N$#OSL\UY0:*TJlA!4߀y2.Pےܒv*UثWb]v*UثWb]v*UثWb]wHk-/Ӛ Nl*dfS|J9zmTR%Ӱ•7VdU~yCR2w /ׯsGɄ>z]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثj 4N*e,|S%KDVB(R@W(Q}<1T^]>u"U0!y2‡%|v*UثWb]v*UثWb]v*UثWb_HMi o',}e@&U*"@9D\y6=Q +Ob0M5ȶqҮԗQ^0ΥL!_aWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uتe1km:+n[_Ԥ[2jW(enG0UtUiBت[t"j*֛ ";wO*2jUثWb]v*UثWb]v*UثWb]m'U }KX~֟j{,{z#|뉴mڤ})grE)ciOA)6, Q!ch/#kB)g= E،**UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتqbFbFH(qWi1=M'qHE VJ7• BGjTC0'BS:M/Φ|G5yM]v*UثWb]v*UثWb]v*UثWb1⯱&cUVt<+hQ-GQjTu9=p&졹(fbV818= ?H+J278Pv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتoA+K-\?;⫚EI8:~ ,Hz3)nkrWCJ*yNDU7`+N-ʐ˱P.?8i8aҧzb̒v*UثWb]v*UثWb]v*UثWbqW_7]ZX9a9+QE2 S4jg,n`B2C|G` =+Q(Y$h ;6${[ <FώUs_M^ڿyTWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتoA. ^n=% p}I8Ui`>)X¯Tm>ׂ\Dí%0<0هC7qn{8 ^h,)aN_-`%v*UثWb]v*UثWb]v*UثWb]}_hַrDto:$,)@^R{`Bgo _C( Xw}S oF[eE;ď|U޲'`UXJ漁_gҐ00TwBC_ÉG w_TYTWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتoAI?kˠ?i)E)p%m3k2 UO on{-%?Gu(]Ik :wȔ1_2)*WV}0EX&M]v*UثWb]v*UثWb]v*UثWb_YG]at{ '*bMw—JBߐwonz!J[waEvkxF|j1W)0 H`o Gߊݚ[#—߯)]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتoAJ^+pW-bUWvD/)[zIX}d?,K\ZG_NC*銨^04o0!HN-aՀv*UثWb]v*UثWb]v*UثWb]Kʈ7,SqWVPdGF2>.le$Š0{CEk#W?w2|hHdGZ "?G#q"=A⯽|r^]Үb5G^Q BuBJq$5v:—ģg)b]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UتqoA/MSL|nn⨹P`)C452)yFk&ŘB6g7.KtaN*Xb r> ǵt2jG1d5yXb]v*UثWb]v*UثWb]v*Uت3H,2aoFSxE&e\*A,Zb7š|9u$b"+|+ ڟ)r=Rһyw…1O? 4nޙ#~b]v*UثWb]v*UثtUmmQZ-B8*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uث/K6Z@3Wog| AryYzx`T1%a)yF[R3=$ŚyR[t>*g ;ث0"|*t%W(c`)^Rv$6-b]v*UثWb]v*UثWb]v*Uتk婡׬'9|_j~TTMB#\3 !5>S-Iw۠+?˩7"r/K  5ђ_%Ei&4S_sg@SCQQ$rd:֧cWzTtaO~mN}#%yYN_&Wl(K1Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uث/&au˝h7JWgZlB XuXA oZU$W>@`T;^G'˼ h`t,1# 8)p m逪MmӌO_oR򜱋V,@zG"1ѧ.ez:{w5sHf_EfV _˄ӤTdOi\UA]v*UثWb]v*2AC$~!F8_K%*%@fW{x`Hgq! <V5|ao~hy+WGY@̦ &P UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uتs4vR|K Uz. .%btPk餜p4eo醖ط5Kqjc @88im/$1**GbGʸحV2jxTt>Yp2@10:Mͷh{w]\U>J|/ qeC95W1TeR?y~xK\%cЭ $@АsUl Ib6~ȴ JGR8Ҽg-9A9e [7VGEJ \<v=2ƶ-i+qŹObA~9Q$cAF^]v*UثWbU-溙-<,q$}-}5yN]IJ}GWͤyi!(cRG&>+($Q!e%},K_ZMTZjQfQ`7DS7CCWF)E01WhXtRV=FR&GӀHF) 5ȥ$dߙͬM>q~>*n1WzϤ] E xZxAw(*O<+lo+_ϑsK6V% V^D p+k˹Zkig'y՘Ԓp%Kv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb\&sኳ)~Q΀Iiu(jb3Lyʉ9T}AÑHrG][^~gU{TJUV$7cWڻ}{\Wܲ0FiP*| IAOzBضL%Yc`U n22e?dh7aEq"PPbP[5dp$Ǎk@3\*חVĆY m#jlA"/7Xi ?s_N*7yɮxm5Hb4OZpSFL bJAhӷH>$cO@ݫi7-U8P~C倰%-EY$-7D , ݊H8-)BE3-]v*UثWbJp:T*.o/ݛUԑf& }NdDPiݓcGH뒶VZ%KbGdWՄ񚵹 }#??+yw+%dNE*Oݶ-Mw7Ud^7lTʙ=#OO?SKᦓ[o}zUBE:*ŊIezFg==$lIY7SQTPhm@"ށpZ<9 ;@IO͝r+kQ 3I=x0*z?dPH)s"@ו{q9ÇQuGs ,kgJא!O+ڦw eGu+SE ;d14=qUȏ#K;*RN*-B~dmlH]0 *;XvhӬQ UT„ukv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثUTTqWyGq^t'ƷړE(PnIY䏐Il)2^Fz|lf@w^ '/놕 9y?8 E*^@|%w_FEh#бIg/C N|,0TA$k^I֮F=A2¶ujX+{{[~HE|159InoaH$Z Ez<}FTfcž T(T6֢!MS_m|yPL,,jHoXjv]yS4x)dU4ت^-`}gGlm&8/,Yz¥H+$ynO 4tEGZ$ZdK ԯ.⢕*M?/)&P>HPCgsp%P4` {S%ie KPE, U⍑\j(A ڂl IK o #u(0Pv^ǛhSb]v*UثT˺hWT(Rc*͕ߖtCmN@n5Ąsg7(T#`"XڇjPel-Cj@S|[W*pPiO]+:;fy;k6׳ϣVmv  (Ql˥vkT^z+OZ[E-bHl7#|MD'tuecާ'a Fĕ N2lKwqk0l. l7ڸK +SZΉmX_5zS^Tq+K4=KC{]BJ7RG_LTIukzbK-&K"3w'ld0E;m,X>-=hvǚ^ik/qGM~ҟ?EDtL~WLյ_WS~<<,%隌Z*@7fvO (mmGǚ1t@> 4 Z+Ҝl AIЯ)?ۋZ&b`+R&ƕ篥O,W w3bdGc3I'ƹ.KJCO*Yvq2H) V(d9EG7B a+ q$w,~g Xf}6_I#%!Qߨ8X[kkL*FC iQM),GUk&-s7a-b[q_nk0%Szv*UثWb]eDO8lM>IX+,v銾勍sI/6*3GLSahZUCYb@=QQAB)^+Zփ} *V>#B^֎b|2̽! ?UgP{`dj$^!67[ Wv0]GPZ9bG =0ݱyjZVֳgC;'L c_M{qxiGym$7VBH^ȫ jA ' iNXʬ?|~1_+¿N*[k&5y\Gk9F=xڸas |1dnk^8*F*:| =_^]"!MF ,!I :}9%J.u{a ʧO|*wDS[Js_)Lu JV!qnv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثVqn;1\}?gBV  ɡ[ OP0Bd"y(%+fk( $x0YWoEׯ|ԐT wi8m[$oh>x AE(S KYSfI4{X'׸\\Ri'EW}Z#B-?d:aJ#S0*> 8=dRӘ~!El5&p#QQ+U)@=*qSJ`9 %2]Q"ԯ|JӬTBJ %oI89oL;0"խa%;lj>xri:eJ҅OlAv*UثWbg6Ct:_pB]7Q1,(,{b}54:ռ(ӌZ5WIޟz_iZ=&%XEFcG h2˦MZ$(Zu[Sj%HlON{U|y؀wĨGpY@4B/nJZ{E.)Jֱ8!'mIJhaZD2+?}rVL²l7K.h4[w ZU/>E]E|MPm/ ThjL;!:INa%i-O0p:9J5R y[ʚD4ޛ<$e ק"y5ѵUҮླYYӨ䄍0*hX$.,/ʛʚi(m[Gі j?|.]v*UثWb]v*UثWb]v*UثWb]v*UثWbv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثU[yx0pphk*"%P ?brW * `TfW2@P@o3n)> Ur4 uɪ$Nw%zUieVЄJ٫L@Wxt%B42,T~\:UYM;•7_ʼnI.bH܂#FPlYı\i\DPU?,_7]Y[4IiiN!&" Sk-y¦ 256I+X^;乆4|[kBR󅞛/VzE 72=y2f8,K\ZH+S ~Ub]7_j֝.iz 5/^:/q-o,QRvPb-S1Wѥ}oֈm׆~bq)Ux = K:+ ;*0^KЎJhÉz|GlC9{ yg=*]Jft%_%j*)sl+of{i'BYԱ''+J?A&-P"JI Pn(ASU`{9[Z@rҗSde`H~ ^Yߙimm-(,bZ,OLIV ]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*=Jܤ!Ez"eڲdp‡(\EI=Xۃ<)]_ݏVAU]W|!h+ZGӉ[vF+F0.yhhS*V,~=*ҭJI&Y]NqL nHnGea7k*0-w^*m@EI464Ջnwj. 8144rjP %lп #=FƼe >\Y"hE{] -{`UثȝjO9tm!6vj#jʃzr^LMCڬm8]UOi?DDbЬJUMLmLVN_2\!WG0؍%Uy /v_[٨ ,I sOݕz9&)z-Ȭ| _S Yܗ .އj6lLA M `Jn}2A x{EZS;>ݲttFULw50* } 38yʞ[t%,ۜ10jzΧ)C,I;VRPWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*K*5]8AVia*䵤ߟğC2VSOҺpծwqVɨak\T^;ѻRQFCsL m^4ɍ4\R xW7*!C%݀A;䚈VH6Ől7#FD lrZuq1[h/)6u>:~x[C+H$L7ЄI@` oGq,^y]̶ZTB$+ҦGT]B1;T3iNK5 X/͏r,F{h#X\bAtʼ`ms5눀4;ʿ7>F"4/+qEpQJ@*?n=*$~b_A_κA;SM#H#"hJEY6D%bP׸'&$eEI5⢟4VBҵM|NE,ٻm/D&wMY枺w]:QHAə|L-rz|z4s΢HeSmB3PG@%ʧ@"%QxdCj BՁE'c mR;+IfmM ]ی`/uF~^=(Lqu CιqigBMbF$jrKFe.(%@uʸڥw?wʊB<0ZA\mXƩ9q5mzyխ0*@1yĒ~]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]L4?XdxOuL!*,ZָUQ\,U_o̞nJgPb<[Qk\]-$Ա?^}_QĠDM['L6eߗsÅJZqv^d·4w\U?BXʶY1pyesGH檔g nLmS hd|'M^܊N)Ͱ_Z Ѽ&ǵo4q6- p;}%–~zA,z/Ydp (n(RN9k3yf\ұ%TkJW?7nA ]T"$n@~(; dS/=fcOTD0B.p+u,-s{h[ya&Q_ߚh7)\YܭĎ+GP r󿞣[ g6 EzqJmi?NXt%).TvPvsk"K 1[ȳ[ʡ2XTF+ T/*V,0 Uq&F%ӐCWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]L4?Xdx J$ U @=UTa"kV I$jNkv*'~wzx$4,n ,*WY~5klU6&?0o6Lvz-8͕iJ>Pvo5-zةtiFBHZ},oc#X@"zJ7aB? Ku T($ XhuF# S|sM^ޥ㝂‡?*W~_a4hF>~`GHx6D!iRp'*i=FN¯;|s?]zߢt-=r?$uߺȔ0_88AfPկZXc( !<*~LU&]{疩+t]q>ږб8|RJ0ivƏrzm 3PAA; LP~8ҟ0TE6~uUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]Tg946 b&x.7` Pa z*k_6yJK_us:+q(aXثWb]g>HՑ}"s2[׸?i~AHe)r$U.!/Ր%TBY[`wϖCMYRKM-Y 0yWǎ W„I;8UثWb]ScrVO;Ke2XWb]v*UثWb]$VVbI>늭]u1V銵v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbd~[Zzm\_]H f_Ii3ZumamgeֶxTvRȟ' cj2V~MWHkkIˏ%[xͥيmˊˊ.*ߣ'YY~]ś]F)UVb7o1V?[ſo.*JO UFOZqT]M8xO럣n>oFN?UG8F*ߣ/x긪UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbbDUq8"4_lUE?7yZtך5H 34 U[*~chcM|%_\5aE䝱Tw]?0yfvKyh9#?*rC/Zǧ[¾7P !QWWygqmk}8/!Y9i/.ت;[y|k4V_E_c:UfoѬ\U>?fY/u"qVY-XڴMq*ˊW_zy5|n#Yg_obMgsHɤ_N8nثחqWZ5 RWI\U~h4Ss-Gk ^jm]}UeG˜ۼ8O1YǨj F_2D7S{qMi'\U:o4k ,mŚe*μ8o7CƵ]/O_y|*5/}/Iu5[y$m?m@zr.uK5e?׿*'R+[N*?=7C^żrjSGȾqDy?1Wԑ:_Mnz|}8U_7Z6yMkVmZH?YF`|ynֺjX۔&*/ǻ?rVKY#VolUfu/z7вw7cxWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbY'I }8o%例k2B9nf_?~Ql8C4֖35պ2܏lU'ySj#ԛ4I$*r:[^-R9fY-ݹK",Y85ZNq$Zt^6X=[qVg">wC[压yJ;sLQy㊼rS_i/4;U֬u הr7ʼqVaQZnA2jys6:đ&oaq|m++{,ֶoUdU<8G/,UjV ŻFhu~_ ڍ˩^w8z7Ȭ4ףh(KI.o1W~`j}ߖ>\o[[FOrno˭sDVfaNn;zYIx?%n<̭icNIҫ\Vq⸫{O߲V*/*`۸ W@k?W7Z|rxzrzmƘ/R瞼Phw)G|d8srɞ}Ԣ򕭽ƛYԞFt#Ŋm䵸[?Sh[o}>??/>GdKH>\=E|_iT7mu=c\ϖc-}ckfW9u^K3r?O󟙤| W +%ϭ+]Ȱ~~Z.vYԿL\quq6m#\MҸ|qk-6GI,vH銿7/W/3Vp~*~\GD7PND~*,^L<]^=T=8QmVT?*-.~r[M$2?4lVԟ7iw& .UunV5Ibb?')4גZ\(J_|h-ƥ+8Hcy>?Un<~g|Gyy.(Ff?QyK!8k8Ay 6ySO~$Ǽj|a֤u .H} ;b?6}9yy[7gncDXg%^/qWnigi7 yjŭmdMW̷wwW OYڵvOHPSGʺƱyE6GzrIzhjgPqV8ojf_̸oOW.z5ͫUxϾ*nݯ,nո2BeZH+⯔?.+=|JB/Y6YUq%ʶGksXc ܚ8eLUO(A.q6>[ci"9f_e_k01A&*o.EkZM5mXi$ޤqȼ( ~*"~n^`k|?SPn45:O;sE.?,ׯa|gu̳bV^#U 86~_Zioo4(ˎ኱?/+/~kԓZv2Cq$nNኧAu[ºoX#Grݺb?-o7xfn-a[85s'Ŷ*|{bEԛ-q xƿӊ7ʷQ5Y?G_C 0fw*f劭]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbUa}>}k[ֳ;|K6F*ffIU ˿FOm/귐o7VROW`8ۼ9U}Lޖo";;?Zd҅x&S/OUחrOy==ki8+FqVM̯:\yZ]?-ꍊsOF};7GOIi̛̿fuQ`[v,#~bg}?-6oՋ *Y?08ga86[5dm1n_*[,䴶Ii]YZyVfi&F,$?_ߖycVhoRM.Vј㊽CWC}^oLU_}˚6f(4U`"M*Z{yL|?j-vU8ly-6YG'i?^*"1-<} X5 n ZJG|d9ȭ˖H+5uCY/|r5+/,dWh_?F}iĐao;E"?F*̯?;~kj|s X+1y5MrGWtlt5+xs/ǟU6߷[yKW&`DR"/eWmԚm}R5Xma8o_kN->7-v}5M!M*- /؛ {=UVOFP_sRʟT5 Ï)TϟZ򧘎*HfZ2r˿O0XkY6K_h)\Uν_ziQԭ泺٪?:~'ƇxF*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_ExifMM*bj(1r2i ' 'Adobe Photoshop CS5 Windows2012:05:25 23:09:23&(.nHH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?5-65qA7<ATB Nj PCV%=CQu/$4l[U|- 5Sw\"r?ՠk81KU<~:Fas^H92GcW`hyM4`+Sg1]{hnH}﹞v(}\:R76 Zvxs&}jƀv\5\_rUkq k긻=ճI_Vײ~wԴQgTj| )y$[#wYWIX(韶o,ij!eno7U}hD,,ϞxӲ佮eN=GmwSq>Q㚻gZ69=BZ5zVTuίY>~,UovP9D6F?Zݾ Y+28NWAP'_>峙U?_UڻgA*-h$))_mʞZr:Q¯E8c3&9h}^&5Xx 3Vs~G[RJU7%ѰT\-6?}RZq1f;p6!2kଭsvv4ƣѲC.׻[kk{1 t[]xUs*qn;pVOhRg]<9u3JZ)zOeH.!l^z~w#MWLhc\\kwi.+xv=^27WH֚PwZ mŠwvO~,ԌjD+Js-ߒ6ϯݐj׹]XC[`j٣osZ7#)G}QӛkZ_g`-okggޣ򟉞dPne45sS8 Xy>3y\ss1[lYC 0%Y]Lm|[@QS 4 |}tev?ڋI\A?.G2z#eusg߫Djim{%=jeO]av?;oʺY nM s椦t ,psoܴ7UVzCX3Fs\] bA5~Xʲ6?KpY}Gcbʯ$ӑK6cֱ}=BѠ^SLc]X<_!G A4ǡoUJ"-a5ԩ7}7Ȯ7NA]#('>alhO1N\lf6<<[߼9LڌZ]r XH}6{v hln}-5.V1,n ~Rp{z50F?['#?o;*9${VHɷ_h ǼzwVv3{s'ѽOѬZ26..-:K }B_M~MS 3?Mٽ1g5ð=fnwWrkX[U`e5=on5>W_]civͧsw]WcYUx`s[a![wϣV54EFivB@BoY6o}iqauzMeL~ŝ;Aw%ǧjoD=t*Ft9?5$KKuF©%^?F9?s~qA6a4-?> r^\c '8uDGUz0Ƶ& 䨗aߥdAn1&-k;n~͕7TAs#@K[?6"k(؍o8ߓpgC_i=nC9CI?a`3֋)5`?EQ'u ]N%;[ȬGGgq4tCMR"@O<9hўr!k \ ;)*J/s c`&`|uuXA zԳ*ڬp :l{CTXW`{ԑ xq\N7B,{4 fnz_j{ȯvڜַYmݹQ=EeK]hn{}[?YG&)#rܱ>Ջ˜iݺ; #Eҋ:c?ҋ\I,s6XsuMgT]sZqxݯ,U9 (wj̇Fm*]gӂQ3ĝn%[%o zhydY2ց?HӰYQ'̏Ĺ9=. gW~ }*ΡK&yฏ.RS eU7b92 XؒvnZ/#湷hK} 9a۾̦`cw#R1DDG>xb1qc#8 nͦQX?~ğ lޟE sm~*[+d?s-o~ů)\sݠCC9_I n4TFqPfk'-_khë[lY4 k羮UQpCd?k]\[9=4Ƃn .e 9CXZ+wXN_jX{+sm4cdzgVְ*aԈJ<??H뙩!۾ Ëž޳ X\3sz0Mmq vo$(ՕRKƟH' -װc1%(:+c\pFC=<\vkp׃iga΋+k˚xx5c>JzlrֺWI˥}$5jtnڐ Ӵ]?L':iU3}zX:SySm {ڛ/6{D9gܵrfK*.1ڵ{bkC\O»2[K45şUw ?l?%Hpap@J+i' R9_Xۆ!T)4(3TװU{gョcOgߔ:Ľni7YvUJ~f/ *ө.d>|}gmOũ@c1%jxՏ]'c[6 n쨾|rCneRgFgou؆`^_Fxmuo6kuce-'e$xz DY]sWA _Ϸ5OKU?{ujTwAc{,7~OSD?U',?knז 6gJ1ۧ(<\]:} ym9 3Vq>W=ruv\vZ׆ G-CV016z×'t9-DZSӇ/tsn=Xx38HbV]ssx;_F%os+Hа2u{V [cUK(zfcO@ xJn+#,m`NCl >(XTmf4 (syE+ޠ\>hd%%feH8( A))!.r$w\8\u?(>-F40k*VMGtL@$H\\dT->Rƚh=#O'9 i?9!Tz\#ԛ[L~0KXx =浍.vĞ?JCK "4SzgW{5biL"`,>,?Bױ9q+E +%Šv٘vD2 A,7^{}1 4(JQHh)R8RxTd#Qn#8&߄)H7x܌ZfD 螀5eDs#QH5J:&φ ]f61~p;-k]UyͦdbFa=DGt'X~0p紣ݬ/՞wU}ش_[E{\[Ic[Wnr7S[~e {lm^ plםn"EQL8I{ANvݠxu/eŪ]~ک]Wk(m!Kt#ݹ8cwLʶC $tH8Ep]?;yeDcI"{6Sm @:Ptxϳƚ{qk68=u?SwOfDTٽߺ{q1/@};iaCEV3śiYQk"dyϚUOw3nǽi,9lېjloڽ>Ûk{C5?F`$ xM}/-ymῚV+k4.6([KT}3%I60ang7֮ʿ=. ~udD46F4Jߪ]2ᶋr KsԶ>ߤVn{kܿA qu G>鿛H#ior{&5f ]}riMML>)#ncp`~ݽ0 ]a2v^N<{]HyuYvQsVa`n~6>3YkX?ANmqv̂k-[Y1̶[Z;*M,{kP-mu4}'9m~:-%-cׅFw^s6ĄJ ?V=cZ]{C~VX=vn2K:S5Z$^G}XLª܁gvV X%@`Ym-V:n=L?X[W'{~=JVn[J< juZdNoL=K̀9y..mʷ?=]#U7wnw\LZ{k{!6f5SgԣWՎԙ[/uKkۃklɸ:16DF^oTλ}e>:8qf.s++^f>+ۏװ~Xz@v#k;y6:֓44[>7}{74Ȕ&Photoshop 3.08BIM%8BIM: printOutputClrSenumClrSRGBCInteenumInteClrmMpBlboolprintSixteenBitbool printerNameTEXT8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMU2012-05-25_00001nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM ,n Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?5-65qA7<ATB Nj PCV%=CQu/$4l[U|- 5Sw\"r?ՠk81KU<~:Fas^H92GcW`hyM4`+Sg1]{hnH}﹞v(}\:R76 Zvxs&}jƀv\5\_rUkq k긻=ճI_Vײ~wԴQgTj| )y$[#wYWIX(韶o,ij!eno7U}hD,,ϞxӲ佮eN=GmwSq>Q㚻gZ69=BZ5zVTuίY>~,UovP9D6F?Zݾ Y+28NWAP'_>峙U?_UڻgA*-h$))_mʞZr:Q¯E8c3&9h}^&5Xx 3Vs~G[RJU7%ѰT\-6?}RZq1f;p6!2kଭsvv4ƣѲC.׻[kk{1 t[]xUs*qn;pVOhRg]<9u3JZ)zOeH.!l^z~w#MWLhc\\kwi.+xv=^27WH֚PwZ mŠwvO~,ԌjD+Js-ߒ6ϯݐj׹]XC[`j٣osZ7#)G}QӛkZ_g`-okggޣ򟉞dPne45sS8 Xy>3y\ss1[lYC 0%Y]Lm|[@QS 4 |}tev?ڋI\A?.G2z#eusg߫Djim{%=jeO]av?;oʺY nM s椦t ,psoܴ7UVzCX3Fs\] bA5~Xʲ6?KpY}Gcbʯ$ӑK6cֱ}=BѠ^SLc]X<_!G A4ǡoUJ"-a5ԩ7}7Ȯ7NA]#('>alhO1N\lf6<<[߼9LڌZ]r XH}6{v hln}-5.V1,n ~Rp{z50F?['#?o;*9${VHɷ_h ǼzwVv3{s'ѽOѬZ26..-:K }B_M~MS 3?Mٽ1g5ð=fnwWrkX[U`e5=on5>W_]civͧsw]WcYUx`s[a![wϣV54EFivB@BoY6o}iqauzMeL~ŝ;Aw%ǧjoD=t*Ft9?5$KKuF©%^?F9?s~qA6a4-?> r^\c '8uDGUz0Ƶ& 䨗aߥdAn1&-k;n~͕7TAs#@K[?6"k(؍o8ߓpgC_i=nC9CI?a`3֋)5`?EQ'u ]N%;[ȬGGgq4tCMR"@O<9hўr!k \ ;)*J/s c`&`|uuXA zԳ*ڬp :l{CTXW`{ԑ xq\N7B,{4 fnz_j{ȯvڜַYmݹQ=EeK]hn{}[?YG&)#rܱ>Ջ˜iݺ; #Eҋ:c?ҋ\I,s6XsuMgT]sZqxݯ,U9 (wj̇Fm*]gӂQ3ĝn%[%o zhydY2ց?HӰYQ'̏Ĺ9=. gW~ }*ΡK&yฏ.RS eU7b92 XؒvnZ/#湷hK} 9a۾̦`cw#R1DDG>xb1qc#8 nͦQX?~ğ lޟE sm~*[+d?s-o~ů)\sݠCC9_I n4TFqPfk'-_khë[lY4 k羮UQpCd?k]\[9=4Ƃn .e 9CXZ+wXN_jX{+sm4cdzgVְ*aԈJ<??H뙩!۾ Ëž޳ X\3sz0Mmq vo$(ՕRKƟH' -װc1%(:+c\pFC=<\vkp׃iga΋+k˚xx5c>JzlrֺWI˥}$5jtnڐ Ӵ]?L':iU3}zX:SySm {ڛ/6{D9gܵrfK*.1ڵ{bkC\O»2[K45şUw ?l?%Hpap@J+i' R9_Xۆ!T)4(3TװU{gョcOgߔ:Ľni7YvUJ~f/ *ө.d>|}gmOũ@c1%jxՏ]'c[6 n쨾|rCneRgFgou؆`^_Fxmuo6kuce-'e$xz DY]sWA _Ϸ5OKU?{ujTwAc{,7~OSD?U',?knז 6gJ1ۧ(<\]:} ym9 3Vq>W=ruv\vZ׆ G-CV016z×'t9-DZSӇ/tsn=Xx38HbV]ssx;_F%os+Hа2u{V [cUK(zfcO@ xJn+#,m`NCl >(XTmf4 (syE+ޠ\>hd%%feH8( A))!.r$w\8\u?(>-F40k*VMGtL@$H\\dT->Rƚh=#O'9 i?9!Tz\#ԛ[L~0KXx =浍.vĞ?JCK "4SzgW{5biL"`,>,?Bױ9q+E +%Šv٘vD2 A,7^{}1 4(JQHh)R8RxTd#Qn#8&߄)H7x܌ZfD 螀5eDs#QH5J:&φ ]f61~p;-k]UyͦdbFa=DGt'X~0p紣ݬ/՞wU}ش_[E{\[Ic[Wnr7S[~e {lm^ plםn"EQL8I{ANvݠxu/eŪ]~ک]Wk(m!Kt#ݹ8cwLʶC $tH8Ep]?;yeDcI"{6Sm @:Ptxϳƚ{qk68=u?SwOfDTٽߺ{q1/@};iaCEV3śiYQk"dyϚUOw3nǽi,9lېjloڽ>Ûk{C5?F`$ xM}/-ymῚV+k4.6([KT}3%I60ang7֮ʿ=. ~udD46F4Jߪ]2ᶋr KsԶ>ߤVn{kܿA qu G>鿛H#ior{&5f ]}riMML>)#ncp`~ݽ0 ]a2v^N<{]HyuYvQsVa`n~6>3YkX?ANmqv̂k-[Y1̶[Z;*M,{kP-mu4}'9m~:-%-cׅFw^s6ĄJ ?V=cZ]{C~VX=vn2K:S5Z$^G}XLª܁gvV X%@`Ym-V:n=L?X[W'{~=JVn[J< juZdNoL=K̀9y..mʷ?=]#U7wnw\LZ{k{!6f5SgԣWՎԙ[/uKkۃklɸ:16DF^oTλ}e>:8qf.s++^f>+ۏװ~Xz@v#k;y6:֓44[>7}{74Ȕ8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM http://ns.adobe.com/xap/1.0/ Adobed         ""   @  s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?[ӈaאNsH= CU;U1"Fګp*4@0tWd!n䍗sd S-?HjH}n~~ R2̲ƦAWǟ…Pn#j~ԉs\jN&o OS QypڴOn|&6M][V 9_?im\Z`^(?4]V~X)mGN?tVlژ_dT}R5N -/%Ion^YUd?ZiMKtb7*m5=SA&4k<+i|@UcHA"Qƈom^?2!AyQm4u; |Z\IW^b(yjՅW2nRUg?T\f2oS7nCcIF7yEOE7yF4c#mim/}qjzƯ*r!>BKkl<íiVOh-1R9VƖ?5O=㈟Ɩ=y[kT[q%7K8m gPc N6'|..fAv5]~_]kh8A=qV A{?\AiLP?-1= 4cJ-A/ SG\Oca+Ra|_N*~Q7ӊʭe~_t U6j?*E_wqC HDqCxmŅ!_]ȺŨ[z/{+KOnKWֻWҜOl)iNء{⫽%?4# -Np-7ԏ亵_ϗ簞r}QdY.*qVQM];U! XpWaUyw_kBkl*?'ŠN }B2ϫ*J&pzJO4Oeell[ 7Urj~)d-xMvhGlj4Fh[U`ߙbCQADZ/J:rߨbRpNPGL]%R5(p劮V#lUz1b[j U SaiJwZӔN+U#Zx["NI^y/?.؞U%͐dRJkJऩ|q-4'mc% OB ؐ~1B&*F%,Π +EmƐHWTe놕 ?eF47rlim\TW[TY[^'~4 `>wGA!~ZJp;܃L L'Pk>`Id0@}Ն(US UK̼_S_:(K"j1ܱbqHCb$PNԈi*O) G ̧\U PaVWbrv*b#)J(U_P\U⭃[*lUw|Up\1UűVbb/ vi?朐bSʇUGEn~'YWb'ث`^:{⫆*+`A,Ol*thO˒{>3ZdkAE_mu{*Mpx8$bѦ,Q5{ ##}l9jҦPlUcQDVZeWJ̋_*{䡏d=_MK=j+17@ 2I^""H$pT:ou5V\`܌LO*yciYh"$Y5Rኺu^ms_:÷!d}2I/O%[aVMЊI劼Y r3F>q){o *K ʐ*Myw[0?Hk|UkTⅴllUџޯJ \ [E\q'Ht|)Im;;_I\p!*r A_ zvvZEčRBE>$뀥,5}vuD[Rx^_6*.gP#؅Ru6]UF?XavnM ESٱ5%[ĕ?6(FyA4-P6<ko$~TS"UQʺBZ>dQCџҿUal?g__$~hyxpt䪀%*?44sZG5\J& _UXҠ`?ĩiJxUh+F]Z'lUL_00h,s򗗩(ixT=-Axxb*®[xU|AsBjjrH1( y۲1VEz8 CՀo*د|*WqVRo0ЍekeSy#KI<֒][]M% gu#L_*wwTv ,d⁒ ˟j#7irbN\p$Rx A`A0Aյ߾nE! 'l*kVpq^?"h˞98UO O| 6Ӥ8hE*j*U1 vEq]Y#m-(UhZ((i8UHiFwɡ|6wrU44șlD46 n"x*cK]I(uP/d)}=ds9${XA H9溛Osh|M?6ŭre[1P{}q4,Ja{9)-:MS޼r%^-Y"YHkMԛv'ybFgF(K؞Byt|ZzF0U#j2@i2G͍4@OF0Y)2&x`Kq OB1J}`z_,(Eb7]8:"uR P pHb%H1,BRQ{4Sxn.7!| PVkYPZ*xUb".pթaJȷ l'R2~IP02]RmG̰j1؄ā3@µyb]Uu`O8~*㊷(B^|E\RV"ËRu/귓f׺xۇņI G\7WV>%~߳qC/A6e19֛ZSƸ*,]$` «_'$b_šŸ,P\H`7' kSMxX/jRG0E\3V7V]%OQUeFWzDVbv**_d)Ja 7ΰV;T*}o=2P5MT?e6b'^Qw7.&GfBp>_YtY& J n8?p%sXS3E;Q 0PqT>dM $q%-~"H*͌lR4"b%Ts5Wy>BEopȨn)$AThb%]x,XmŊ5FZQwPZ?+h)uq /G96+搏ߦPrL[RVL(R8m} ?z y|ߔCBu2("bcgVHHY>yQ ڔN:APpbUl -XV .4=2Ryƽ1M㩍K r' .0QSQaɌm}kp*>|h2+qv uX>T1撵Q (*ʴۋh4M4ʧ1Q$)6п'*UJ1#`#X)Ri-| DIEOis̳qV O,Vv-tıTIhXV[ʛĪpDxcil"t3+O*PۻfDPS}#0)"{IHK747#.O6mONo%jViK;kf$CZldj,.;Z V=7d?pu^[84TBƕbUaP^-)WnFrhξxնTdtOfewZoT8lr2T$ؑbyqFSW)֤_HLRGH?<$ūS-')B$qmVܳ#eB(^Ϙ2x~vO] E&zvH J} H4 L*:te$*0*@ڻe.Uv@(o%~T44& W<} vd\};iaU9IJ5eO KZF$̐)֞ng,AP }н4o72S1j\czuND* R|kc>rQ槓q堭`;JLC,KßlU xQW-]N#t ɱEZ\**=I2lmtVKk['#_!%PKKvoᔔ#cpebV1DZc*-$Wq2Ȗ%Di{dô?9% W\hIX {`M5S~E:b X=t9$)DثDQf}8{j[Ï] ~ RMN.eG%=~.J)a q -P. ]I<֖CkL4095E 7 $Ў'Te,xo! ubT % ?ָUl1V<^e5rHL ӎU37O6UƘ\ʯс-Pw[cIck]Ȇ>N[Ld R?zeU$j_[=y,{V7n+oBck~#"y2EM*R>RR뻘IUvBcv%A~5V{zrD dAZmZaөO 9pũL9t8rA:CA+e-5QJ#d*|aPV7\4`lS0{RedNJ<Ա/5Tz/"˃\'W~ z* (^Y&*zOI eVS%w:N*#֣w*䵧㊥>a&ebX[Mٖ?Y48ZĤAiUOrWk#Oݹ¸AB׮X Z8[4چo҇W.$@j$«OJQ+U'6gO ?Gq BN@TkrzV#l»WғBr@t -dOq)N0.XĨC-~830]b݁p!Vah2%(ӯ\mV4"60?$U\FT"*DV?a'nFjU&CNF&K 'F;&eM*Ɗ I‹SL4E_+qXò}ϭ9[Ԃ4iә:R)\j*ƈYa6WC=FZGѐ1Uc=dAm4n 7$) $4 r\LP`6{p0hإV)Q/ <GEaKm,EW98Igd AFFCtğM'kH SvW쟆8r)[_~@W7>S耜XKA_NmNDF *Q4p?pR- 5)) MQ^JۄS˩?< :" hOF_V'('՗Ó !,dg~QZٷ&%Jn伌KwsԜҳb)H4͸X ۉ}Bn#9!u^ E7XS8j˄ DITҳ-d 8eXrz}(*v=)TiVE5!QJS) [,̒ A!EcJ9D+YtbB 5Rx̥: 'J|y}2a@>]kT`ч*2|A]lĥmFӄr[8,Uu1WS\>XǧLPP7*va[ X3aP(LHiAвצVJ@Dq'p&!kN17R>63V0ĩlMl(XN;ⶵ;a[V:D !""+O㐤uJQS݌&wu8f7L_ws? Mz7?ܴܟqq܊Y{~~㇈w-y]x~rwMykYO|x5ݮ[<^K^l[V]OsLNȒp~ՏMPJkP FPjvNi^*Mt#" _Z"^)POClT"6r5^Bir6?dB [IA ] PQpyFz|)vN<@5)MlXӐv\Y|a&u*;r\i/zdHrm\2/8I'2WV2$lCy\D6HsTFTͱRq'`>Up2wD?Z2Ib'኷귉E%^`+DŽ#BGo׺zm ܠe [|^84ZlU…2{(ZTx7~pF?v(P"'L1J)_b| US޸+[1WU\RI~e,cG&B/*h>td <~xѵiQ9\e oC؜A+4+VЗ4:Iw!㊴H=WP6*s_ļb~~>MSJc\d P~A.;PSlUYN?F)['>\bqB%(KJ׎FZbUB\ $إGŷ\(WU8CRhjz0[Ƭı*JV=")8hμc9:dL5cecehy[4ԃHuۣi姓<vev'%3gl' (GWo9fmIb= bhXۏ[bžR-f+lwkyT̔۾A;.Oh 8db7fA4V ,pm$$q &ģM WfAYZS8V׭蟎 [o/kKխ ix6k;n~8Sl̨(Dn9d90A/65\*"5(*Q15v)U+V}Bj+SA*ƛ \˸;NHI1U|)diʛ<TU>6^+ZOu^l7, *Yz a@͖?i~d;|B9d*6elm?}jFd0p:[%E1T=%OqUO a_w:/1TW(GFG >zGeOQ AlN9p"ivR:tV(jbJ)l:bߨF*rRK; yD\{ӑq\F McQmRxmRžxJmEKavZvˬZ><+iu('ѕ7/Y,@#Wx[ +#VpGO<+hK YUa!U=Ӄ6Op} ۿK8V:DžmҶ~/ mXW0𭩶n:?눊 tY!Z䂓÷(PfPC n$rZWu-^Dxъ1.rv, A>,gNhTRJĊC;x Tȯ&55uۗQ*i\ Ȏ;1B rN$K!(ⱷP:ByFcL 3ni?h{ߦJ1!m(з+ֹ9 3O(服-eU_ENHB8,dhwz1ޮ7s+~?ɿ啿yb~֌~醂ۏcow׮?呿i *-N4phU%$,>3 ,ʗCXDUe ƌ+ 3M,h-^?qƂ+}wy,A\d?[YߎRYZ/}vN{㲭3ߏƂ' Lck`K,gNo΁OC$Cе_!i]T_CAצ zhh|1k^pZa!„Qw5G$^īgtzoeiBې&~[tr:elUpUV#~P=k]6HU@ V Fid 8;.Yu'_YE34\vT%ݬm%^%0, X-!gsqKV`]O438ܦ"ߘqcG)(2plt_c0ăMNٜZr)<7+d^Q,=b;bPPt',$:cHLtj Z? 4sMlJCP-nzzdEt29d1B~l#X~Q% רV*uƖ$xKm V<78fS[B >X\w mZĆ, \y)z ai@-S&lOE-+ֵW⫽J`Ux 2=1B֝|0d=hȧƕg3O_ 7Ao+yPPÖLѯi¹QJ`0RۄW>I]&4 hܟ[KYZѕD'oW%lO$vopփB]\eaOFF.;I@,n/!E>{#M܍NWқ8UP1Vw]u[8)Zow}Oa*r+ q57P(9CdSz6*Ӝd h\-3L+,SeX` F͖U71jUi\]7QOU1__6\cS!CT^S~'aUlW^ph¯ZW}_z}ثF%^5{Tw*/!rJQ vȥEo0(q˹쌲\ld Y o!Lm'*x9rByKwdէ8.On7I?Ӆ }8FZLveKGTT):(Y}jfA Iva)y}ܣ1Zߐi4VَyP6ʤǠӑKbjң|i ?Rn;FV ?P9SǷ5pwS\i-Na#\*ե'>i?Sv!'2Z.2koe*p >?v*^^S9[Gos\TQqE⾨,: b֌wlsz{ l voY(0Ivz~!Q f]OBH#UQ_RkL_j~;b1ɼjja ,FT'BMJ`R3i߮mRT(hЄԩ#|P Y8ICCk,3ЬjGl6<+,#NPWpB?/CeA>,^c7G"nP|*Xy sz}ӎjȻքT9 i!yy| 7\,w7 +E}A+IƧbLV}fs Ӫ[IP/LPk)l|h*ZccP~FVٔR5krE uFyc[:iD\tIߎW&YQ_E*~ҀS6H BbGS‡zT')XNH!Aϩ+Vn|.ƻUR;f9xSl 4"փPZy^+qC<֎J5` u %/o;*Mn=8kҧ;*znj[{vUXSlvU\q컭75|H7zSawc>pIt߭q? RMt߮tZr݃kP8P 6]p)Oʗy}bzP E*bhr;&f|sَ˺~QC8nEum0?N c~4㲩2Z 6S)A]66|'5Nf׶LJZB _l4і(ޱƼW$) 7.'_ɻ8J{4l |+בiH ! $Ǫ𹋘2 ^J,ݘx,6'8r1 *1$Qu ;TJ0 Kv|*,]b` B&S8i")QR$&3RGC"~㣚8^ta;7AOdXѯ=bʕ,"n>ʆSVSdQLU$mRC$рîd+:JfNv\ 'dNE;^IP噣Ġ(Cm*o4ӫmi^y;ZrA8گ]m]KCױ%ˢLw3NÐ-.=i%BXLmig)kG֔YcA#oO)zpA"=`a7EjlT,(<}sFN:4Ac;COӛG]ϩ' }-iCTaˠhKf6=#)r'lji)3kKBuu@lmiZUu`w L;0w{m} PԒBA>8Q { *OvVHIZaB>7qZ!1ݗGX!ve&\1AOPi;S#l}.N**6R:‰m|# PSȤsTq+0{`VSWAcfu܎Ug KxbS@ت*'U(aQPJ+Tby6EWq&L1(hM W1TEoUc!H8L pà,+dJmg]:ѫodYy,a&6> Zq瘱尠<ȑAqj*NEdT'.uHS޿H5ݤ1p.9q*@+9MA@;Le F[6$rxx%wX )B4wK=S"~|UN"1Kn~>xHU k*r:2)x{A+9\t 65Qd3p}:=c|WPTFNH72ɣg_]-]cOJcːH) 򽯮HMJʹlye/,Z4#x2pIEBIl;o!TU7ҭ~r7C(Rw=ȕgRܨq di5WD=Q>8 ^WjQaëҮh-g&mևr,Y.f`+J9))N|$=A ؍ 1 (UDPy.*?*`E>"|UBI Mׯ^QFoUqArfҴ^?_p*n"j#Ud&;Q%PtR \GNb~db JUQJN{SaLB*clUf4Z~xGD<+lKWUTƐj3'b>xiX_=UcOZ _]\4{WL Q |,ΣzzH[7scJSB߮\֯ +[܃&֭vߍ"ˣƖ[}^.GI8.qBW\i׶1R,-9%lp}VXmE0+yaVo5KS"vs*S1e4«Xd>…aVcZ[-P8* @\Ъxz䐿UdR|1TÑw4VRչ ӱU\Io8xU G֢rÄAOE7 Z2EuSL ¶g\m*$IjF%n1Erh L6T[B⾧9dP7RtOzCA?98%kAoBw?K IuNӶH@~Պe^*<*KLU<(lmSqW ~Uث{WHu]SR~1P&q U(sZ^\0* lU-˛iBeKa$; -Wg?v*nI٫ V4a[S4qW }·:#hzcʣ;.erAqvZbUyr46&sҴ= B[:b4`*:WRֳZd Ǹ5iF0>'S1ȞPwi{BEEqR岷Rik QyGT('zXOV"<p$keItJI4+۾H%dU%Qԁq`F=2Y&tC!P*YYZ_K$e-阖dXHb!`GpyFKҪv_zb Pm(4lDt<Vɖh"-YcY=>DެKSoNЍO)PjkKDKX64;WQb!L(OƔPU4i}cLU gVh~x-.IGJvb1jKP[սH?)Ajn4r9}f%ᵧ Ҭc9wb~8@mW&KO†@ڭ:'mvZھr;'8ޘ+79cȀ+Al!Ehwvh8VR } POiOF ctjbJC_Յ _օfS1K_-³Pڟ O=L*|i#mT`;8 P:}>Ãb;F Y]jZָ@A/щ#sc*;zٓ[{!d¸‹kMB!=A4¶ԣӍ-a!iƖ׬F?N<)N?ƖՎD0\(]?;^*oEz}%Dq^iլr:TG'ƖB˦~T imDR>lh-$EJ+58Mkj4kLe$G2T}+5 2uCGdǚSJ*R ø;!欎+W% !yo IKq;Gs " m8-fhLm]F?.71s 6'i7VLj r@ѷ e̘JŴJ:94"6~=*F@TjJ1?.Cp=Bq^?+jS%IFի촾+T 4X̜P%śJ,|Kmiip]&ꃯ"plE"0. ;Rc"y~ƸVDTswgHM z5ZU:UJKOՍ /v6:zߍpZҙѵz Iܑ/Ս\tmXMNCaiF]3U>cAbbn # >-YKcp2TnqiH>L F O 94MyHTѓaJ֦L-ir::2/?ZT B(4{)Ҳh>d}"ٽc'NkM2R4~]\y * xR131ys\H]6'm&6yKͲTXccM&~WLQ{[F!;y;̈́KQ^Æ ־5O^o} d=?t ¸yt<*G%ҐO/#ᲚTwcxmh6?.,[Imh5*%%mVʹU#zI5hT^]lgobȺ[*KѸq⭏#h Oമh]MH?"J\F6qt0Zmn4~|1ZAO&ٓ,o k\lOLOc6 tuQca(KEY_IJ\(՝JQ"~*-t;,(DBW;*eoyOJZnjO,*ooS%@{iqLa҂GR|HQ ڡ|+;:V(-ÚnM}Gƭה=}LWN0֏GсP*=0 YDl'Qrn_) wM?0d/.-nmgY.#Sor_Q}iS0pQ^ٔ֋Ig~fЭ:*&RXNĨPPT|rH}_L25Ȗv%4XvE<<+m Km88imN5ߦ4i* veP`cKiMǙ B3O'( לKigW%4?ռ%b P!_6dGoJy]d$ KGN|D+_WjfLm|VG|NuUH+qBzp\du]/dGH *iz RiJ!ܩZ[bu q6,~0H.z4mi8ӗȡ5aM?S_ٹ_~Bhy`量Y+GU+5]+K$|0ȵJ?c_.v._Ӯ?SEqϰ]S$r$ W i.r["G(ߙ' f@{Fe^ $g/E^BFQL5Q7fYE #Vi1 +n@Æ{OqU&R4aZqݟъ).'|^JXkǀL!K;ҟ H"U=[b`~&5XCr }mU.MS,RݐJ[]xV^Qёם /Qm&. .Fe[SBGb6mMI!xT^ox/zh"OEy*/4=I@U)?4A iaU_\5Ug B\5UԆ ^%r̿u8ܯ1½؁dX!||甲׫~28el_EI]z394ܧ2?&~D$6ӸP2ȪIz`U 65 ڕ+kэigK%av}lVa;sw0"ipH[ZaPZ &Vd?_0lV.犯VW…]Z['ZN*6)l*UmqVLUe|TW [ [s]oZ2{8تqU }#Zij^f]VSj b wWUh)Zcj[|N(ZASӿ|6`Or8vEr6=ȷ'Wd-nn.{}Aٵ>XX[|UWlbu zZ(_ j1U _z v߯EWq wP+ezlTmS꾏^G,*;zi`%n0VZ-bE g77ڸX\s*s6F}& s&ڛ iLV(NH@&! ZNuqVbҔ5[/W4[-8u\[X[|Uܩ=qV늵\Uت^h}BWsnb_*XEWr--Z*L5na 0 *GcA[;Ӧ VN6HL6kSsC@ǮHuh~%_#/!؆83s]\UMqULURqW k\*G]\mPeOFJZ*6jbbz Q)X.7ɪ w!B>er ywn1 e.g ,̤8t[I%^oᙝZf45:␉bY#R*$|JpqVOR8hk| pH*LUi&U8N*I*\U;⪀WuqUUF5[®lr1KuZ\N*p!ثWn fٶҾ=t= ab"8}8'V@o-%Կb iar/f$жk<I)$kdU8*9)lTBSӯl WLUuqV늭$baV80c'|U+vIޙ+R{x`R"F ؊YL)ǎ5&8ÎwB}VFwH bQM8*}FO1]ɱi)%,h~GXh7%%-X;|UJ⭒)յ'l-bV@={b}V늶*i ]m]UaWV늻kv**@3TZ*;֣ƸUВիGj8Ӧj&n+ZTQNJ)o=3+ ze*2Mqw460[ yP\P*aV`VQ[ `$<~Y6U0*`)BTYnxa[I XRPRTiq5 pI*S^!TNK.HO⩭К$g* BP⮮GVUqVbޘ╄qC*qV늴N*q8qV_\h~?cqr `*WqAFCHIMUpjQup`+-i~ =!8:|P][QH 4ҝ*EzcR M:Wbb[ Wh bI)hⅤUo#\MF)kqUS^qV*p+ uqWbN*b҃/u#Rx<[1|X^lyfڧo/W$F>|` q2F(_ɢG]FP:tf aG"DI/#Xԟ'/&eQ/.zSGr=6bmJN$diu+!.L7^[A\2L[p8jb1V*ኮثj*utJeETdF#aJ *GOPCC2,TP8y>VGCE*z@|*KjCMb^@׉ 愮X)Z UثVWvZWWXj?hb*@)㊮8^]+xWTqZ8W/kKJ>15[&3Hv(Xo D%~hfu#slqrJ廻yfbrb r 'P$ŪmZ~ȭ,lGrĖem=)&Qjz 㕶j'?<̴2L[Z-uN*^*Z U2 ZJ;9eIj}|RusGoĥc`~/hw|UB :|CU' aRxX,PimDx q%n&®*qCt)q R* *;WZKJ]LUׅ[}V†K)ov**UqVb犿RəvIyH ĩ35Pu1WzV<Qk_)}xN#p֭܆ -X;0DPbNCOB@MJIȟ僓Y櫒CX U*7«+VV[phVO!$WPHJITbe~4 zD?$#r{ FPɡܰ.*BӠ59%Ȅh=  #_ )Y,փġ*HU>{%jU|URp+xثVWWT UN*|UU ]BUծ)v*኷NqV < J>{?́mT0XPrV;D/v}9 TLjëTxd'TO.%QڃJ# y!B$8m\WWzbK+Xk| WVWbTWq#[L*ZUuF4N)ql*U])hb%k qWo[y(SrzM]()HvOݶKrsCkoS׶R[[R"J&.­WUثlww JS4pI!H0;(؃(˶*#gzGs2@*0w=rLKxPaDS!L]E*Pw1E)$I!H7:xJe/褁XaB̒1VW`KXث®\@T٨i\*kv*.ثU8*6]L*1UءثGLRZ_>& Q1VoLJ!ԜcT*_qnݶÏ\cS*->9YfA<@2Do o */ክ`ԥ:\#)WaVէ|Ui4v[P[a*o*ڧ ^(A޵ဥ9IT 3{ 4s *'V5ی QZU$UfE#b+kI=CB•… Z)Fىd׊mUq#rrhqGJJEqqPR{cJ\ |impA шuJ|0ҭHѤ*zwnҶ R:PJ64ҩX~xҮTF4e#aUTЁ;U@]A4ZeST|,(ءx1Uޘ+ +uƕN+%FZg7+m*0:▩Tf_NRyW*^H`x:cNNAÈVI[q HmnN*ߊJI?* b@lUr;-⅛Ws*\sw„v,mJfP蝣\uNTEu¹$.mbiIErz+Qާ W--]\HR8HɷʊQ|ER)S}TШݱBiAi5y]G%aNX]A[T7 G`qC\w늮;vl-~XTcsF9p%o6p HbP?!WҩųLR*JV@: >5paC[Vo_T2-QQz _ UBP=Ԍ\" ŬɥH= 5Oݙ C/Ƨq2e Q`dZ ثr|(IP ;=%PZ1UT>⫸haViNFN1ȞaPr$U^b=U1Wl?*X)6T@N r#sJuDaM|~(\U)ާIiw e]UW6W7n(86AZy/l0dTi[B1V}w <`?b[71B*⫽&qU=JTnIWGQ)劸zt«T:[۷7CfPUJ )b/1JЊOQPT5@t,u>Uت6ڸ?\О2.梻0%g0Ƶ*VWRZ!j3v 32Le"6ZI8+a- Cک^"zjIRj0Kt;KiRI))Orlk*Srb#U'V\o[$|UA1V0Oÿq\mZ+!kM# 1$↋Qi+T'` 1UQa{ƾߵEqUhN4*"P FIioⴱ<^CZ\WO9;E9y<YU>e~Y m #:02,@/\*"cU4<~*]@*l wO0ڴFܷ\_q8Ӥc 8-irE{xZ^"?N6^FiL獭6COMGiJ[e$SǮ(VPP:v uPN U(1ujٵqwգ]ʊ`U*lbX0!\AL+*j6OjT-!_Vh6G_UFM MRx)-W+9mi4S[#.I@ri}UAɚ@jH+<8*(2|FVJ*R6㑵nNP@KU8< 1ڒv~*j6WlHH=\նd?mqUq­p5mWg(tq 'm% $-hM[+j2CVJcLV[&*O~ f⩮Ye~4(S_پy 1@6ܸ~*Bnb)[CӶ)RLA>UPЏ,iZQm%nz`BFP@)[#jU$ LUT}nr:dUsG]aUToWJ }‡2`WpmZ>?? UwiN޸ƒ* p*ԗ~So㊿*ǠЂ[8g4.?W/PfBND :n;L .W:22gS)RWcCJљ- BSl >Z 튫2*TY01[\C(V82; meƒLX?nU aZ`= Uk6#6LR助̃AJ bVnGEURNVJ>^ёxAq(d C|B=VPB*URvXi8V=n2-{{aU6F,ƙ)Ė>5ikQ_ؔ/E+۷|d {!P渡a6*Wq Sk.}Nj{UrD9S^U‡mu1:«w>6kJ bJ1R#Bɩ >%pB7Qtg;b{bWcfߊiJP有U S!UA4Sb۰WW# pqWGU>*t*s\R* ~DU lUg#^ W┃*w#Kx)$FU2Kr#~)Mt~Q !?ܡK> n(J{SKZEAQ˨# *$Jك V|*en *6R ԝ i=Z~")WBva\UcT]=I8wiRDrtI)Q_*yP~u-#r0+dϮ(\ d |p'Ug ݎR3G'@F(D =zb&/9Q{U f-}a ŁUcKiav F+OR̔،4]0b#Ez퍡UY$6R8ɧ@?hD.9*W|n߀n-F&˗ffgYH9%1i2Hn\%T~bQ ~X0'!]تaY(0c]>`Jv>UQ*!Gϐ ~xPR1W+|A^0jkQa;P' G^F6+Z'm.2]!S@X'x&_Zx$xh!Zt% Z/X8b'ㅢL`xOHWVG,()9c.Z}jM jZF옟1Lm|kwf)rԖ:%hT_ˆ(+wS˪%(OcƞLQ1 ? 8ZVK$tT.GT erFݿW#V|1,oJSAMAZLj$:;cqaR1?gJ6T4|b׍G5U[KJrl!Y,+޻ILW#ˁև^M<̣n5?N$9?-D)M!/<[<y$jծs|8Db-J<D5$2=0iz؆Ž(!솕`CΞG7ycHto) Z x$H h%Y=MMة٤;|E㉒t.h~(^$&1Ȗv5-$R W#b8sHHKGt7IW#WGQ<5양D6xJy0 B@օDŒ}Di &!D[J"},^M&Kծ% Ed'Vp YAQ˵q%<"֊?FtHjYNkЉaH;sB EUE cV,+XHh **Ǧحiޡ@i D+ɯL"63w?q, vǙ?~wS;W_"Zi >/yMuGQRF%-J?>;P0yo'ՄwhV9Q· M^k} +F!^-rvގ?' &"J ۍAOCHb$WOi zռp2Up)cA1ZT:?qUkVVF~?摍2t& tʌ_Gr@0.6 nٷ+MDa?*"ՕUnw'(#nbe$?n-ԧSok;QHީusU4Ê!/_ du^FNehBW#$vwҫE4S`w~U\QP?Ϧ6T=IT*'"Z?N UXV0"X ƹ+A P*P֮m`[dHo-t_ |Ө^}Vc q'n,`R&ݷ's^4*[Y#ca8LF\8B9M(Aћ[Y\eR@^X m 쁾E{{e<ኤWkW[H"uyMCq-{n#'&}6-Pxo/o$INRȏM:d#lN-30ҷỏgTD!J&I(Tjђ~—$t ␀acg#4I54(M?Ϧ(;ý1M u]fMq"¤r>ph%_yQmr$5ɀ[@ >+I.WX#Ɉ,|?$n?M>GH߹fʑCr-Q]MOT\d:{Z QڴU>MF.jjkOat-58bR ﱡ%>Х-0G%8r YfD72 I~C_U,/JOE*+_rj)Sw+e2qoLi[VP]qT d4ȥNWWvN|*V?Ve%QfKWԄRa6I<:5+$YM"E,J=ʃTխ?H%;4KdQ0O,(Ink]>/EDR1oԆG ȊR%#kH!/{ⶕ0zJWflƔ4cc\X*kˁ+|g# "}-CNƐjЏQ\C KNsH*"f%7BæHN.屏{L^Yn'Rf.AWM| 6J,m ޭ*H NUJegvaƟ_lTa(;bܑA$nOv٬W Rb6QC\Oc= ?*Gn.~硑r]YU/B1,9.kwdBHRTWͱE?5 ViW?wIw1/4 $5}WI2Hz1<8O=S(,zRjIaYQc8Pk-XHgQ{W_uTt.nتӄ5ՙhO @ &ج{_6U)6D2(Tnԏ2,qҤN *% 9SNɱQd{-*i$XSs0Q֢8l!(${Bռkm#B.]v2D>LALV̺AOɈ҆&$9$#t ^ ? dL&YDH(?fldȊ=t P2 F=BK3bɧaTy-$y߀h~[(lTJY8ʼn,-$N䜱@jE(N$F)~%3Ӫ)7ĥJMb fK#X."A[s!^WSNR)l(ǧP<%d(QCliӅU ޗN\ eWUڝOزQt !NאRG-DTTdS]N>V Pͬ[nn ksc "ԉdY cQUH1Qȡ\ q EQ;b_̞hD:kG$rqXE2'L-C 8U5{=% ++M-2˚mtYuȨI,o28mYRhvBh?e漕t9 QCڔgA*݉QI9V4Ӛ^!HX9Tjzym`emCsʓVxQX`xmcIK&㕭mE*A/ƙcy۬2L-^UE?oaoFCw,h=RӴ:<قc ө PU·ÀZ"썹BVl4d^FI_PpΉ HOU? ]K_>WzDMjkY18D[bdǦH UT@ mJ'~̂>_r&TPYi1ں2G)&aĖTN IG)wƖ3J4J|9PQTαY hcX!ŏҵbRGÓ1(H<`I)̦`ș\YR b˿7NMO+2gS kLj>JY:R)ݐWw]߼Ӥ+˥._ a@jqO_ܢ\GXJ1'gj~`nnxz9 DiKUfQԜi Oy37u_? ;e{kip0ƨ ,{wZ @ISEiXK-/dX5})~$r@[ B7c3F(6b*~KƒjZΥ;1` xL02{`Xd+E%ZLC;58IRE~.iW~XDF+˽0\G^aѐWqR; A"H w킓l@ ޫw ա 4@ɐX)Ar(M?p̼'d $p`;LB S 6*g!v&(94.]^K(@F_oT"TpPiZ\>@Ǡ x,! }XTӚܒnjX}oGmG*9nB8-T^O- R-++F*~AЪ/+*!M)FEg=TE*IIWn.`*5Q ~y -IaZ/xP"PEI9FZQ1iO&fgnMI!a@x>wV9n!+kZ3İ'!)${XF~UllG+z-@:9uSG0 kJ.s[~0aǦ$% k UDq+5ɤȢ?edKoJTw$̓VOZrJWu<7s(2 3crjRk[[ $@Ex?\[;[G8I5o> HY(`{ؙ0cTdH^2@S C֭NUR8R#犪*oFB8pP78i7z+h;SH I {~"(+W.Y!YTXTa|)?9IEM80͍+|)%4`&7q{szKZW(dS8PhZ]Ʃ8*m9i3-B:g9ߑ9Q,NhXP<2)B{W=Gz\ B%/V&,)ea ]DBҸ%# 8H#CiM iE#񧈧{d2<F*Kb֕DYGNd\@dXߜ)ӤV=4}Xޡ{zy|9*bur]Ǿ4O(=UxQđPkC:;46S9 T?24մ$sȉo ea"6Twd֏󹖛aA37;pnBn#e6xNDh: dIH OD@]u#VlYUZ2^FC^L9;Sr$N.IɇE-Ja֕?')d~vR YAR)lyJ8Ȩ-þ[6f&Hf~VxL4U}B) KAtBhy&bh2"*7 _dHè%K ڡU *ʊ!R'͗H!*zԑ1dW27kTr lEr!TF@raT=0} do {if (((_bld BuildingPos _bi) select 0)==0) then {_bi=-99} else {_bz=((_bld BuildingPos _bi) select 2); if (((_bz)>4) && ((_bz>_maxZ) || ((_bz==_maxZ) && (random 1>.8)))) then {_maxZ=_bz; _bldpos=_bi}};_bi=_bi+1};_bldpos}; KRON_BldPos2 = {private ["_bld","_bldpos"]; _bld=_this select 0; _bldpos = 1; while {format ["%1", _bld buildingPos _bldpos] != "[0,0,0]"} do {_bldpos = _bldpos + 1;}; _bldpos = _bldpos - 1; _bldpos;}; KRON_OnRoad = {private["_p","_w","_i","_lst"];_p=_this select 0; _w=_this select 1; _i=_this select 2; _lst=_p nearObjects ["House",12]; if ((count _lst==0) && (_w || !(surfaceIsWater _p))) then {_i=99}; (_i+1)}; KRON_getDirPos = {private["_a","_b","_from","_to","_return"]; _from = _this select 0; _to = _this select 1; _return = 0; _a = ((_to select 0) - (_from select 0)); _b = ((_to select 1) - (_from select 1)); if (_a != 0 || _b != 0) then {_return = _a atan2 _b}; if ( _return < 0 ) then { _return = _return + 360 }; _return}; //KRON_distancePosSqr = {round(((round((_this select 0) select 0)-round((_this select 1) select 0))^2 + (round((_this select 0) select 1)-round((_this select 1) select 1))^2)^0.5)}; //KRON_distancePosSqr = {((((_this select 0) select 0)-((_this select 1) select 0))^2 + (((_this select 0) select 1)-((_this select 1) select 1))^2)^0.5}; KRON_distancePosSqr = {round(((((_this select 0) select 0)-((_this select 1) select 0))^2 + (((_this select 0) select 1)-((_this select 1) select 1))^2)^0.5)}; KRON_relPos = {private["_p","_d","_a","_x","_y","_xout","_yout"];_p=_this select 0; _x=_p select 0; _y=_p select 1; _d=_this select 1; _a=_this select 2; _xout=_x + sin(_a)*_d; _yout=_y + cos(_a)*_d;[_xout,_yout,0]}; KRON_rotpoint = {private["_cp","_a","_tx","_ty","_cd","_sd","_cx","_cy","_xout","_yout"];_cp=_this select 0; _cx=_cp select 0; _cy=_cp select 1; _a=_this select 1; _cd=cos(_a*-1); _sd=sin(_a*-1); _tx=_this select 2; _ty=_this select 3; _xout=if (_a!=0) then {_cx+ (_cd*_tx - _sd*_ty)} else {_cx+_tx}; _yout=if (_a!=0) then {_cy+ (_sd*_tx + _cd*_ty)} else {_cy+_ty}; [_xout,_yout,0]}; KRON_stayInside = { private["_np","_nx","_ny","_cp","_cx","_cy","_rx","_ry","_d","_tp","_tx","_ty","_fx","_fy"]; _np=_this select 0; _nx=_np select 0; _ny=_np select 1; _cp=_this select 1; _cx=_cp select 0; _cy=_cp select 1; _rx=_this select 2; _ry=_this select 3; _d=_this select 4; _tp = [_cp,_d,(_nx-_cx),(_ny-_cy)] call KRON_rotpoint; _tx = _tp select 0; _fx=_tx; _ty = _tp select 1; _fy=_ty; if (_tx<(_cx-_rx)) then {_fx=_cx-_rx}; if (_tx>(_cx+_rx)) then {_fx=_cx+_rx}; if (_ty<(_cy-_ry)) then {_fy=_cy-_ry}; if (_ty>(_cy+_ry)) then {_fy=_cy+_ry}; if ((_fx!=_tx) || (_fy!=_ty)) then {_np = [_cp,_d*-1,(_fx-_cx),(_fy-_cy)] call KRON_rotpoint}; _np; }; // Misc KRON_UPSgetArg = {private["_cmd","_arg","_list","_a","_v"]; _cmd=_this select 0; _arg=_this select 1; _list=_this select 2; _a=-1; {_a=_a+1; _v=format["%1",_list select _a]; if (_v==_cmd) then {_arg=(_list select _a+1)}} foreach _list; _arg}; KRON_UPSsetArg = {private["_cmd","_arg","_list","_a","_v"]; _cmd=_this select 0; _arg=_this select 1; _list=_this select 2; _a=-1; { _a=_a+1; _v=format["%1",_list select _a]; if (_v==_cmd) then { _a=_a+1; _list set [_a,_arg]; }; } foreach _list; _list}; KRON_deleteDead = {private["_u","_s"];_u=_this select 0; _s= _this select 1; _u removeAllEventHandlers "killed"; sleep _s; deletevehicle _u}; // *********************************************************************************************************** // MAIN UPSMON SERVER FUNCTION // *********************************************************************************************************** MON_MAIN_server = { private["_obj","_trg","_l","_pos","_countWestSur","_countEastSur","_countResSur","_WestSur","_EastSur","_ResSur","_target","_targets","_targets0","_targets1","_targets2","_npc","_cycle" ,"_arti","_side","_range","_rounds","_area","_maxcadence","_mincadence","_bullet","_fire","_knownpos","_sharedenemy","_enemyside"]; _cycle = 20; //Time to do a call to commander _arti = objnull; _side = ""; _range = 0; _rounds = 0; _area = 0; _maxcadence = 0; _mincadence = 0; _bullet = ""; _fire = false; _target = objnull; _knownpos =[0,0,0]; _enemyside = []; _WestSur = KRON_UPS_WEST_SURRENDED; _EastSur = KRON_UPS_EAST_SURRENDED; _ResSur = KRON_UPS_GUER_SURRENDED; //Main loop while {true} do { _countWestSur = round ( KRON_UPS_West_Total * KRON_UPS_WEST_SURRENDER / 100); _countEastSur = round ( KRON_UPS_East_Total * KRON_UPS_EAST_SURRENDER / 100); _countResSur = round ( KRON_UPS_Guer_Total * KRON_UPS_GUER_SURRENDER / 100); //Checks for WEST surrender if (KRON_UPS_WEST_SURRENDER > 0 && !KRON_UPS_WEST_SURRENDED ) then { { if (!alive _x || !canmove _x) then {KRON_AllWest = KRON_AllWest-[_x]}; }foreach KRON_AllWest; if ( count KRON_AllWest <= _countWestSur ) then { KRON_UPS_WEST_SURRENDED = true; publicvariable "KRON_AllWest"; publicvariable "KRON_UPS_WEST_SURRENDED"; }; }; //Checks for EAST surrender if (KRON_UPS_EAST_SURRENDER > 0 && !KRON_UPS_EAST_SURRENDED ) then { { if (!alive _x || !canmove _x) then {KRON_AllEast = KRON_AllEast-[_x]}; }foreach KRON_AllEast; if ( count KRON_AllEast <= _countEastSur ) then { KRON_UPS_EAST_SURRENDED = true; publicvariable "KRON_AllEast"; publicvariable "KRON_UPS_EAST_SURRENDED"; }; }; //Checks for RESISTANCE surrender if (KRON_UPS_GUER_SURRENDER > 0 && !KRON_UPS_GUER_SURRENDED ) then { { if (!alive _x || !canmove _x) then {KRON_AllRes = KRON_AllRes-[_x]}; }foreach KRON_AllRes; if ( count KRON_AllRes <= _countResSur ) then { KRON_UPS_GUER_SURRENDED = true; publicvariable "KRON_AllRes"; publicvariable "KRON_UPS_GUER_SURRENDED"; }; }; //Exec surrended script if (KRON_UPS_WEST_SURRENDED && !_WestSur ) then { _WestSur = true; [west] spawn UPSMON_surrended; }; if (KRON_UPS_EAST_SURRENDED && !_EastSur ) then { _EastSur = true; [east] spawn UPSMON_surrended; }; if (KRON_UPS_GUER_SURRENDED && !_ResSur ) then { _ResSur = true; [Resistance] spawn UPSMON_surrended; }; sleep 0.5; _sharedenemy = 0; _targets0 = []; _targets1 = []; _targets2 = []; { if (!isnull _x && alive _x && !captive _x ) then { _npc = _x; _targets = []; switch (side _npc) do { //West targets case west: { _sharedenemy = 0; _enemyside = [east]; }; //East targets case east: { _sharedenemy = 1; _enemyside = [west]; }; //Resistance targets case resistance: { _sharedenemy = 2; _enemyside = KRON_UPS_Res_enemy; }; }; if (side _npc in KRON_UPS_Res_enemy) then { _enemyside = _enemyside + [resistance]; }; //Gets known targets on each leader for comunicating enemy position //Has better performance with targetsquery //_targets = _npc nearTargets KRON_UPS_sharedist; _targets = _npc targetsQuery ["","","","",""]; { //_target = _x select 4; //Neartargets _target = _x select 1;//Targetsquery if ( side _target in _enemyside ) then { //if (KRON_UPS_Debug>0) then {diag_log format["%1: %2 _enemyside=%3 _target=%4 %5 enemies=%6",_npc getVariable ("UPSMON_grpid"),_npc,_enemyside, typeof _target,side _target,_npc countEnemy _targets ]}; //if (KRON_UPS_Debug>0) then {player globalchat format["%1: %2 _enemyside=%3 _target=%4 %5 enemies=%6",_npc getVariable ("UPSMON_grpid"),_npc,_enemyside, typeof _target,side _target,_npc countEnemy _targets ]}; if (!isnull _target && alive _target && canmove _target && !captive _target && _npc knowsabout _target > 0.5 && ( _target iskindof "Land" || _target iskindof "Air" || _target iskindof "Ship" ) && !( _target iskindof "Animal") && ( _target emptyPositions "Gunner" == 0 && _target emptyPositions "Driver" == 0 || (!isnull (gunner _target) && canmove (gunner _target)) || (!isnull (driver _target) && canmove (driver _target))) ) then { //Saves last known position //_knownpos = _x select 0; //Neartargets _knownpos = _x select 4;//Targetsquery _target setvariable ["UPSMON_lastknownpos", _knownpos, false]; call (compile format ["_targets%1 = _targets%1 - [_target]",_sharedenemy]); call (compile format ["_targets%1 = _targets%1 + [_target]",_sharedenemy]); }; }; }foreach _targets; }; sleep 0.5; }foreach KRON_NPCs; //Share targets KRON_targets0 = _targets0; KRON_targets1 = _targets1; KRON_targets2 = _targets2; //Target debug console if (KRON_UPS_Debug>0) then {hintsilent parseText format["West(A=%1 C=%2 T=%3)
East(A=%4 C=%5 T=%6)
Res(A=%7 C=%8 T=%9)
" ,KRON_UPS_West_Total, count KRON_AllWest, count KRON_targets0 ,KRON_UPS_East_Total, count KRON_AllEast, count KRON_targets1 ,KRON_UPS_Guer_Total, count KRON_AllRes, count KRON_targets2 ]}; sleep 0.5; //Artillery module control { _arti = _x select 0; _rounds = _x select 1; _range = _x select 2; _area = _x select 3; _maxcadence = _x select 4; _mincadence = _x select 5; _bullet = _x select 6; if (!isnull (gunner _arti) && canmove (gunner _arti)) then { _side = side gunner _arti; _fire = call (compile format ["KRON_UPS_ARTILLERY_%1_FIRE",_side]); //If fire enabled gets a known target pos for doing fire if no friendly squads near. if (_fire) then { _target = call (compile format ["KRON_UPS_ARTILLERY_%1_TARGET",_side]); if (isnil "_target" ) then {_target = objnull;}; switch (_side) do { //West targets case west: { _targets = KRON_targets0; }; //East targets case east: { _targets = KRON_targets1; }; //Resistance targets case resistance: { _targets = KRON_targets2; }; }; //Check if has a target if (!(_target in _targets ) || isnull _target || !alive _target) then { _target = objnull; { _auxtarget = _x; _targetPos = _auxtarget getvariable ("UPSMON_lastknownpos"); if (!isnil "_targetPos") then { //If target in range check no friendly squad near if (alive _auxtarget && !(_auxtarget iskindof "Air") && (round([position _arti,_targetPos] call KRON_distancePosSqr)) <= _range) then { _target = _auxtarget; //Must check if no friendly squad near fire position { if (!isnull _x && _side == side _x) then { if ((round([position _x,_targetPos] call KRON_distancePosSqr)) < KRON_UPS_safedist) exitwith {_target = objnull;}; }; }foreach KRON_NPCs; }; }; //If target found exit if (!isnull _target) exitwith {}; }foreach _targets; }; //If target fires artillery if (!isnull _target) then { //Fix current target call (compile format ["KRON_UPS_ARTILLERY_%1_TARGET = _target",_side]); _targetPos = _target getvariable ("UPSMON_lastknownpos"); if (!isnil "_targetPos") then { [_targetPos,_rounds,_area,_maxcadence,_mincadence,_bullet] spawn MON_artillery_dofire; }; }; }; }; sleep 0.5; }foreach KRON_UPS_ARTILLERY_UNITS; //if (KRON_UPS_Debug>0) then {player globalchat format["Init_upsmon artillery=%1 %2",count KRON_UPS_ARTILLERY_UNITS]}; sleep _cycle; }; }; // *********************************************************************************************************** // INITIALIZATION OF UPSMON // *********************************************************************************************************** _l = allunits + vehicles; { if ((_x iskindof "AllVehicles") && (side _x != civilian)) then { _s = side _x; switch (_s) do { case west: { KRON_AllWest=KRON_AllWest+[_x]; }; case east: { KRON_AllEast=KRON_AllEast+[_x]; }; case resistance: { KRON_AllRes=KRON_AllRes+[_x]; }; }; }; } forEach _l; _l = nil; if (isNil("KRON_UPS_Debug")) then {KRON_UPS_Debug=0}; KRON_UPS_East_enemies = KRON_AllWest; KRON_UPS_West_enemies = KRON_AllEast; if (east in KRON_UPS_Res_enemy ) then { KRON_UPS_East_enemies = KRON_UPS_East_enemies+KRON_AllRes; KRON_UPS_Guer_enemies = KRON_AllEast; } else { KRON_UPS_East_friends = KRON_UPS_East_friends+KRON_AllRes; KRON_UPS_Guer_friends = KRON_AllEast; }; if (west in KRON_UPS_Res_enemy ) then { KRON_UPS_West_enemies = KRON_UPS_West_enemies+KRON_AllRes; KRON_UPS_Guer_enemies = KRON_UPS_Guer_enemies+KRON_AllWest; } else { KRON_UPS_West_friends = KRON_UPS_West_friends+KRON_AllRes; KRON_UPS_Guer_friends = KRON_UPS_Guer_friends+KRON_AllWest; }; KRON_UPS_West_Total = count KRON_AllWest; KRON_UPS_East_Total = count KRON_AllEast; KRON_UPS_Guer_Total = count KRON_AllRes; //Initialization done KRON_UPS_INIT=1; }; // --------------------------------------------------------------------------------------------------------- processInitCommands; //Executes de main process of server [] SPAWN MON_MAIN_server; diag_log "--------------------------------"; diag_log (format["UPSMON started"]); if(true) exitWith {}; // ========================================================================================================= // Script for action follow me when surrended, adds the soldier to player squad in a random choice. // Version: 1.0 // Author: Monsada (smirall@hotmail.com) // --------------------------------------------------------------------------------------------------------- private ["_obj","_caller","_id","_objtype","_rnd","_join","_direction"]; _npc = _this select 0; _caller = _this select 1; _id = _this select 2; _rnd = 0; _join=true; _npc switchmove ""; _direction = ((getpos _caller select 0) - (getpos _npc select 0)) atan2 ((getpos _caller select 1) - (getpos _npc select 1)); //If positive values are needed then use: if(_direction < 0) then {_direction = _direction + 360}; _npc setdir _direction; _npc dowatch _caller; _npc setSpeedMode "LIMITED"; _npc domove position _caller; sleep 0.5; _rnd = random 100; _npc setmimic "Sad"; if (_rnd <= 30 ) then { _npc globalchat "Ok"; }; if (_rnd > 30 && _rnd <= 50) then { _npc globalchat "Yes"; }; if (_rnd > 50 && _rnd <= 100) then { _join=false; _rnd = random 100; if (_rnd < 20) then { _npc setmimic "angry"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle31rejpaniVnose"; _npc globalchat "Kiss my ass"; }; if (_rnd > 20 && _rnd <= 40) then { _npc setmimic "Agresive"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle33rejpaniVzadku"; sleep 3; _npc globalchat "Que te den"; }; if (_rnd > 40 && _rnd <= 60) then { _npc setmimic "Agresive"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle33rejpaniVzadku"; sleep 1; _npc globalchat "Fuck you"; }; if (_rnd > 60 && _rnd <= 80) then { _npc setmimic "Agresive"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle32podrbaniNanose"; sleep 0.5; _npc globalchat "Follow your mother"; }; if (_rnd > 80 && _rnd <= 100) then { _npc setmimic "angry"; sleep 0.1; _npc switchmove "CtsPercMstpSnonWnonDnon_idle32podrbaniNanose"; _npc globalchat "Fuck you"; }; }; if (_join) then { // remove the action once it is activated _npc stop false; if (_npc == leader _npc) then { _npc globalchat "All follow that man"; { _x switchmove ""; [_x] joinSilent _caller; }foreach units _npc; } else { _npc removeAction _id; [_npc] joinSilent _caller; }; }; if (true) exitWith {}; // ========================================================================================================= // Biblioteca de funciones comunes // Version: 5.0.7 // Author: Monsada (smirall@hotmail.com) // http://www.simulacion-esp.com/ // Comunidad Hispana de Simulacin // ========================================================================================================= MON_bugged_vehicles = ["BIS_alice_emptydoor","ACE_Grenade_Geometry"]; // --------------------------------------------------------------------------------------------------------- //Funcin que permite posicionar objetos a la altura definida //param1: objeto //param2: altura MON_subir = { if (!isserver) exitwith{}; private ["_object","_altura","_pos","_x","_y","_z","_bld","_bldpos"]; _object = _this select 0; _altura = _this select 1; _x = 0; _y = 0; _z = 0; _pos =0; _bld = objnull; _bldpos =0; _pos = getposasl _object; _x = _pos select 0; _y = ( _pos select 1 ); _z = ( _pos select 2 ) + _altura; _object setposasl [_x,_y ,_z]; }; //Retorna la direccin entre dos posiciones MON_getDirPos = {private["_a","_b","_from","_to","_return"]; _from = _this select 0; _to = _this select 1; _return = 0; _a = ((_to select 0) - (_from select 0)); _b = ((_to select 1) - (_from select 1)); if (_a != 0 || _b != 0) then {_return = _a atan2 _b}; if ( _return < 0 ) then { _return = _return + 360 }; _return}; // --------------------------------------------------------------------------------------------------------- //Funcin de borra unidades que han sido matadas //param1: objeto a borrar cuando muera //param2: tiempo a esperar antes de borrar el objeto MON_deleteDead = {private["_u","_s"];_u=_this select 0; _s= _this select 1; _u removeAllEventHandlers "killed"; sleep _s; deletevehicle _u}; MON_deleteDeadDist = {private["_u","_s","_dist","_OCercanos","_cicle","_deleted","_isplayer"]; _i = 0; _cicle = 10; _deleted = false; _isplayer = false; _u = _this select 0; _s = _this select 1; _dist = _this select 2; _u removeAllEventHandlers "killed"; sleep _s; while {!_deleted} do { _isplayer = false; //Buscamos objetos cercanos _OCercanos = nearestObjects [_u, ["Man"] , _dist]; //Validamos si alguno de los soldados cerca es un jugador y est vivo {if (isplayer _x && alive _x) exitwith {_isplayer = true;}}foreach _OCercanos; if (!_isplayer) then { deletevehicle _u; _deleted = true; }; sleep _cicle; }; }; // --------------------------------------------------------------------------------------------------------- //Funcin tomada de UPS, busca el comando en la lista y devuelve el siguiente elemento //param1: comando a buscar //param2: valor por defecto del comando //param3: array con los comandos //Retorna valor del comando encontrado o valor por defecto MON_getArg = {private["_cmd","_arg","_list","_a","_v"]; _cmd=_this select 0; _arg=_this select 1; _list=_this select 2; _a=-1; {_a=_a+1; _v=format["%1",_list select _a]; if (_v==_cmd) then {_arg=(_list select _a+1)}} foreach _list; _arg}; // --------------------------------------------------------------------------------------------------------- //Funcin que devuelve una posicin en 3D a partir de otra, una direccin y una distancia //param1: posicin //param2: direccin //param3: distancia //Retorna vector de posicion en 3D [0,0,0] MON_GetPos = { private ["_pos","_dir","_dist","_cosU","_cosT","_relTX","_sinU","_sinT","_relTY","_newPos","_newPosX","_newPosY", "_targetZ" ]; _pos = _this select 0; _dir = _this select 1; _dist = _this select 2; _targetX = _pos select 0; _targetY = _pos select 1; _targetZ = _pos select 2; //Calculamos posicin _cosU = [_dir] call MON_GetCOS; _sinU = [_dir] call MON_GetSIN; _cosT = abs cos(_dir); _sinT = abs sin(_dir); _relTX = _sinT * _dist * _cosU; _relTY = _cosT * _dist * _sinU; _newPosX = _targetX + _relTX; _newPosY = _targetY + _relTY; _newPos = [_newPosX,_newPosY,_targetZ]; _newPos; }; // --------------------------------------------------------------------------------------------------------- //Funcin que devuelve una posicin en 2D a partir de otra, una direccin y una distancia //param1: posicin //param2: direccin //param3: distancia //Retorna vector de posicion en 2D [0,0] MON_GetPos2D = { private ["_pos","_dir","_dist","_cosU","_cosT","_relTX","_sinU","_sinT","_relTY","_newPos","_newPosX","_newPosY" ]; _pos = _this select 0; _dir = _this select 1; _dist = _this select 2; _targetX = _pos select 0; _targetY = _pos select 1; //Calculamos posicin _cosU = [_dir] call MON_GetCOS; _sinU = [_dir] call MON_GetSIN; _cosT = abs cos(_dir); _sinT = abs sin(_dir); _relTX = _sinT * _dist * _cosU; _relTY = _cosT * _dist * _sinU; _newPosX = _targetX + _relTX; _newPosY = _targetY + _relTY; _newPos = [_newPosX,_newPosY]; _newPos; }; // --------------------------------------------------------------------------------------------------------- //Funcin que devuelve las posiciones que se pueden ocupar dentro de un edificio //param1: objeto location //Retorna numero de posiciones que tiene el edificio MON_BldPos = {private ["_bld","_bldpos"]; _bld=_this; _bldpos = 1; while {format ["%1", _bld buildingPos _bldpos] != "[0,0,0]"} do {_bldpos = _bldpos + 1;}; _bldpos = _bldpos - 1; _bldpos;}; // --------------------------------------------------------------------------------------------------------- //Funcin que devuelve la casa que hay ms cerca del objeto param1 y las posiciones que se pueden ocupar dentro de ella. //param1: objeto //Retorna vector con [objeto location, posiciones que tiene] MON_PosInfo = { private["_obj","_bld","_bldpos"]; _obj=_this; _bld = nearestbuilding _obj; _bldpos= _bld call MON_BldPos; [_bld,_bldpos]; }; // --------------------------------------------------------------------------------------------------------- //Funcin que devuelve el valor negativo o positivo del seno en base a un angulo MON_GetSIN = { private["_dir","_sin","_cos"]; _dir=_this select 0; if (_dir<90) then { _sin=1; } else { if (_dir<180) then { _sin=-1; } else { if (_dir<270) then { _sin=-1; } else { _sin=1; }; }; }; _sin }; // --------------------------------------------------------------------------------------------------------- //Funcin que devuelve el valor negativo o positivo del coseno en base a un angulo MON_GetCOS = { private["_dir","_cos"]; _dir=_this select 0; if (_dir<90) then { _cos=1; } else { if (_dir<180) then { _cos=1; } else { if (_dir<270) then { _cos=-1; } else { _cos=-1; }; }; }; _cos }; //Funcin que busca vehiculos cercanos y hace entrar a las unidades del lider //Parmeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestVehicles = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin"]; _grpid = _this select 0; _npc = _this select 1; _vehicles=[[]]; _air=[[]]; _units = []; _unitsIn = []; _getin=false; if (leader _npc == _npc) then { _units = units _npc; } else { _units = _units + [_npc]; }; { if ( (_x!= vehicle _x && !((vehicle _x) iskindof "StaticWeapon" )) || !(_x iskindof "Man") || !alive _x || !canmove _x || !canstand _x) then {_units = _units-[_x];}; }foreach _units; _unitsIn = _units; //if (KRON_UPS_Debug>0) then {diag_log format["%1 _units=%2",_grpid, count _units]}; //First catch combat vehicles if ( (count _units) > 0) then { _air = [_npc,200] call MON_NearestsAirTransports; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _air = _air - [_x]};}foreach _air; _units = [_grpid, _units, _air, false] call MON_selectvehicles; }; sleep 0.05; if ( (count _units) > 1) then { _vehicles = [_npc,200,true] call MON_NearestsLandCombat; {if (_npc knowsabout(_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; sleep 0.05; if ( (count _units) > 0) then { _vehicles = [_npc,200] call MON_NearestsLandTransports; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; sleep 5; if ( (count _units) > 0 && (count _vehicles) > 0) then { sleep 1; _vehicles = _vehicles + _air; _units = [_grpid, _units, _vehicles, true] call MON_selectvehicles; }; sleep 0.05; _unitsIn = _unitsIn - _units; _unitsIn; }; //Funcin que busca vehiculos cercanos y hace entrar a las unidades del lider //Parmeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestCombat = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin","_dist","_all"]; _grpid = _this select 0; _npc = _this select 1; _dist = _this select 2; _all = _this select 3; _vehicles=[[]]; _units = []; _unitsIn = []; _getin=false; if (leader _npc == _npc) then { _units = units _npc; } else { _units = _units + [_npc]; }; { if ( (_x!= vehicle _x && !((vehicle _x) iskindof "StaticWeapon" )) || !(_x iskindof "Man") || !alive _x || !canmove _x || !canstand _x) then {_units = _units-[_x];}; }foreach _units; //If suficient units leader will not get in if (!all) then { if (count _units > 2 ) then {_units = _units - [leader _npc]}; }; _unitsIn = _units; //We need 2 units available if not any leave vehicle to another squad if ( (count _units) > 1) then { _vehicles = [_npc,_dist,_all] call MON_NearestsAirCombat; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; sleep 0.05; if ( (count _units) > 1) then { _vehicles = [_npc,_dist,_all] call MON_NearestsLandCombat; {if (_npc knowsabout(_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; _unitsIn = _unitsIn - _units; _unitsIn; }; //Funcin que busca vehiculos cercanos y hace entrar a las unidades del lider //Parmeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestBoat = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin","_dist"]; _grpid = _this select 0; _npc = _this select 1; _dist = _this select 2; _vehicles=[[]]; _units = []; _unitsIn = []; _getin=false; if (leader _npc == _npc) then { _units = units _npc; } else { _units = _units + [_npc]; }; { if ( (_x!= vehicle _x && !((vehicle _x) iskindof "StaticWeapon" )) || !(_x iskindof "Man") || !alive _x || !canmove _x || !canstand _x) then {_units = _units-[_x];}; }foreach _units; _unitsIn = _units; //We need 2 units available if not any leave vehicle to another squad if ( (count _units) > 0) then { _vehicles = [_npc,_dist] call MON_Nearestsboats; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; if ( (count _units) > 1 && (count _vehicles) > 0) then { sleep 1; _units = [_grpid, _units, _vehicles, true] call MON_selectvehicles; }; _unitsIn = _unitsIn - _units; _unitsIn; }; //Funcin que busca staticos cercanos y hace entrar a las unidades del lider //Parmeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestStatic = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin","_count"]; _grpid = _this select 0; _npc = _this select 1; _count = 0; _distance = 100; if ((count _this) > 2) then {_distance = _this select 2;}; _vehicles=[]; _units = []; _unitsIn = []; _getin=false; //Buscamos staticos cerca _vehicles = [_npc,_distance] call MON_NearestsStaticWeapons; if ( count _vehicles == 0) exitwith {_unitsIn;}; if (leader _npc == _npc) then { _units = (units _npc) - [_npc]; } else { _units = _units + [_npc]; }; //Solo tomamos las unidades vivas y que no estn en vehiculo { if ( (_x iskindof "Man") && _x == vehicle _x && alive _x && canmove _x && canstand _x) then { _unitsIn = _unitsIn + [_x]; }; }foreach _units; //Intentamos tomar solo las que estn disponibles _units = []; { if (unitready _x) then { _units = _units + [_x]; }; }foreach _unitsin; //Si hay unidades disponibles las usamos if (count _units > 0) then { _unitsIn = _units; }; //if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Found %2 estatic weapons %3 men available",_grpid,count _vehicles, count _unitsIn]}; _units = _unitsIn; if ( count _unitsIn > 0) then { _units = [_grpid, _units, _vehicles, true] call MON_selectvehicles; }; _unitsIn = _unitsIn - _units; _unitsIn; }; //Function to assign units to vehicles //Parmeters: [_grpid,_unitsin,_vehicle] // <- _grpid: id of group to assign to vehicle // <- _units: array of units to getin // <- _vehicles: array of vehicles to use // -> _untis: array of units getin MON_selectvehicles = { private["_vehicles","_emptypositions","_units","_unitsIn","_i","_grpid","_vehgrpid","_unit","_wp","_any","_index","_cargo"]; _grpid = _this select 0; _units = _this select 1; _vehicles = _this select 2; _any = _this select 3; //meter en cualquier vehiculo _wp = []; _vehicle = []; _unitsIn = []; _emptypositions = 0; _i = 0; _vehgrpid = 0; _unit = objnull; _index = 0; _cargo = []; { if ((count _units) == 0 ) exitwith {}; _vehicle = _x select 0 ; _emptypositions = _x select 1; _unitsIn = []; _i = 0; _vehgrpid = _vehicle getvariable ("UPSMON_grpid"); _cargo = _vehicle getvariable ("UPSMON_cargo"); if ( isNil("_vehgrpid") ) then {_vehgrpid = 0;}; if ( isNil("_cargo") ) then {_cargo = [];}; //Asignamos el vehiculo a a la escuadra si contiene las posiciones justas if (_vehgrpid == 0) then { _vehicle setVariable ["UPSMON_grpid", _grpid, false]; _vehicle setVariable ["UPSMON_cargo", _units, false]; _vehgrpid = _grpid; }; { if (!alive _x || !canmove _x) then {_cargo = _cargo - [_x]; }; }foreach _cargo; _emptypositions = _emptypositions - (count _cargo - count ( crew _vehicle) ); //ahora buscamos en cualquier vehiculo if ( _vehgrpid == _grpid || (_emptypositions > 0 && _any)) then { while {_i < _emptypositions && _i < count _units} do { _unit = _units select _i; _unitsIn = _unitsIn + [_unit]; _i = _i + 1; }; { _units = _units - [_x]; }foreach _unitsIn; if ( (count _unitsIn) > 0) then { //Asignamos el vehiculo a a la escuadra si contiene las posiciones justas if (_vehgrpid == _grpid) then { _vehicle setVariable ["UPSMON_cargo", _units, false]; }; //Metemos las unidades en el vehiculo [_grpid,_unitsIn,_vehicle] spawn MON_UnitsGetIn; if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Get in %2 %3 units of %4 available",_grpid,typeof _vehicle,count _unitsIn,_emptypositions]}; //if (KRON_UPS_Debug>0) then {diag_log format["%1 getin %2 id=%7 any=%8 unitsin=%9 quedan=%6 emptypositions=%3 cargo=%4 crew=%5",_grpid, typeof _vehicle, _emptypositions, count _cargo,count (crew _vehicle),count _units,_vehgrpid,_any, count _unitsIn]}; }; }; _index = _index + 1; sleep 0.05; } foreach _vehicles; _units; }; //Funcion que mete la tropa en el vehiculo //Parmeters: [_grpid,_unitsin,_vehicle] // <- _grpid: id of group to assign to vehicle // <- _unitsin: array of units to getin // <- _vehicle MON_UnitsGetIn = { private["_grpid","_vehicle","_npc","_driver","_gunner", "_unitsin", "_units" , "_Commandercount","_Drivercount","_Gunnercount","_cargo", "_Cargocount","_emptypositions","_Commander","_vehgrpid","_cargo"]; _grpid = _this select 0; _unitsin = _this select 1; _vehicle = _this select 2; _units = _unitsin; _driver = objnull; _gunner = objnull; _Commander = objnull; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; _cargo = []; _Cargocount = (_vehicle) emptyPositions "Cargo"; _Gunnercount = (_vehicle) emptyPositions "Gunner"; _Commandercount = (_vehicle) emptyPositions "Commander"; _Drivercount = (_vehicle) emptyPositions "Driver"; //Obtenemos el identificador del vehiculo _vehgrpid = _vehicle getvariable ("UPSMON_grpid"); _cargo = _vehicle getvariable ("UPSMON_cargo"); if ( isNil("_vehgrpid") ) then {_vehgrpid = 0;}; if ( isNil("_cargo") ) then {_cargo = [];}; _cargo = _cargo - _unitsin; //Para evitar duplicados _cargo = _cargo + _unitsin; //Aadimos a la carga _vehicle setVariable ["UPSMON_cargo", _cargo, false]; //Hablitamos a la IA para entrar en el vehiculo { [_x,0] call MON_dostop; if ("StaticWeapon" countType [vehicle (_x)]>0) then { _x spawn MON_doGetOut; }; unassignVehicle _x; _x spawn MON_Allowgetin; }foreach _units; //Asignamos al lider como comandante o carga { if ( _vehgrpid == _grpid && _x == leader _x && _Commandercount > 0 ) exitwith { _Commandercount = 0; _Commander = _x; _Commander assignAsCommander _vehicle; _units = _units - [_x]; [_x] orderGetIn true; }; if ( _x == leader _x && _Cargocount > 0 ) exitwith { _x assignAsCargo _vehicle; _units = _units - [_x]; _Cargocount = _Cargocount - 1; [_x] orderGetIn true; }; }foreach _units; //if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: _vehgrpid %2 ,_Gunnercount %3, %4",_grpid,_vehgrpid,_Gunnercount,count _units]}; //Si el vehiculo pertenece al grupo asignamos posiciones de piloto, sin solo de carga if ( _vehgrpid == _grpid ) then { //Asignamos el conductor if ( _Drivercount > 0 && count (_units) > 0 ) then { _driver = _units select (count _units - 1); [_driver,_vehicle,0] spawn MON_assignasdriver; _units = _units - [_driver]; }; //Asignamos el artillero if ( _Gunnercount > 0 && count (_units) > 0 ) then { _gunner = [_vehicle,_units] call MON_getNearestSoldier; [_gunner,_vehicle] spawn MON_assignasgunner; _units = _units - [_gunner]; }; }; //if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: _vehgrpid=%2 units=%4",_grpid,_vehgrpid,_cargocount,count _units]}; //Movemos el resto como carga if ( _Cargocount > 0 && count (_units) > 0 ) then { { _x assignAsCargo _vehicle; [_x] orderGetIn true; sleep 0.05; } forEach _units; }; { [_x] spawn MON_avoidDissembark; } forEach (_unitsin - [_driver]) - [_gunner]; }; MON_getNearestSoldier = { private["_units","_obj","_near"]; _obj = _this select 0; _units = _this select 1; _near = objnull; { if (isnull _near) then { _near = _x; } else { if ( _x distance _obj < _near distance _obj ) then {_near = _x;}; }; }foreach _units; _near; }; MON_avoidDissembark = { private["_npc","_vehicle","_timeout"]; _npc = _this select 0; _vehicle = vehicle _npc ; _timeout = 120; _timeout = time + _timeout; while {_npc == vehicle _npc && alive _npc && canmove _npc && time < _timeout} do { sleep 1; }; if (!alive _npc || !canmove _npc || time >= _timeout || driver vehicle _npc == _npc) exitwith{}; _npc stop true; while {_npc != vehicle _npc && alive _npc && canmove _npc} do {sleep 1;}; if (!alive _npc || !canmove _npc) exitwith{}; _npc stop false; //sleep 0.5; if (!isnull (assignedVehicle player)) then { [_npc] ordergetin true; [_npc] spawn MON_avoidDissembark; }; }; //Funcin que devuelve un vehiculo de transporte cercano //Parmeters: [_npc] // <- _npc: object for position search // -> _vehicle: vehicle MON_NearestLandTransport = { private["_vehicle","_npc","_transportSoldier","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount"]; _npc = _this; _OCercanos = []; _transportSoldier = 0; _vehicle = objnull; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Car","TANK","Truck","Motorcycle"] , 150]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _transportSoldier = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && canMove _x && _transportSoldier >= count (units _npc) && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) exitwith {_vehicle = _x;}; }foreach _OCercanos; _vehicle; }; //Funcin que devuelve un array con los vehiculos terrestres ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsLandTransports = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Car","TANK","Truck","Motorcycle"] , _distance]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _emptypositions > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Funcin que devuelve un array con los vehiculos terrestres ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsLandCombat = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance","_all"]; _npc = _this select 0; _distance = _this select 1; _all = _this select 2; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Car","TANK","Truck","Motorcycle"] , _distance]; { if (_all) then { _Cargocount = (_x) emptyPositions "Cargo"; }; _Gunnercount = (_x) emptyPositions "Gunner"; _Drivercount = (_x) emptyPositions "Driver"; _Commandercount = (_x) emptyPositions "Commander"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _Gunnercount > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Funcin que devuelve un array con los vehiculos aereos ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsAirTransports = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Helicopter"] , _distance]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _emptypositions > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Funcin que devuelve un array con los vehiculos aereos ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsAirCombat = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance","_all"]; _npc = _this select 0; _distance = _this select 1; _all = _this select 2; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Helicopter"] , _distance]; { if (_all) then { _Cargocount = (_x) emptyPositions "Cargo"; }; _Gunnercount = (_x) emptyPositions "Gunner"; _Drivercount = (_x) emptyPositions "Driver"; _Commandercount = (_x) emptyPositions "Commander"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _Gunnercount > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Funcin que devuelve un array con los vehiculos staticos ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsStaticWeapons = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["StaticWeapon"] , _distance]; { _Gunnercount = (_x) emptyPositions "Gunner"; _emptypositions = _Gunnercount; if (!locked _x && alive _x && _emptypositions > 0 && !(typeof _x in MON_bugged_vehicles) ) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Funcin que devuelve un array con los vehiculos marinos ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_Nearestsboats = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Ship"] , _distance]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _emptypositions > 0 && canMove _x && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Funcin para retardar la toma del volante, as no se va el vehiculo y da tiempo a subir MON_assignasdriver = { private["_vehicle","_driver","_wait"]; _driver = _this select 0; _vehicle = _this select 1; _wait = _this select 2; [_driver,_wait] spawn MON_dostop; unassignVehicle _driver; _driver assignasdriver _vehicle; [_driver] orderGetIn true; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: assigning to driver of %2 ",_driver, typeof _vehicle]}; }; MON_assignasgunner = { private["_vehicle","_gunner","_dist"]; _gunner = _this select 0; _vehicle = _this select 1; _dist=0; _gunner assignasgunner _vehicle; [_gunner] orderGetIn true; waituntil { _gunner != vehicle _gunner || !alive _gunner || !canmove _gunner ||!alive _vehicle || !canfire _vehicle}; if ( alive _gunner && alive _vehicle && canmove _gunner && canfire _vehicle) then { _dist = _gunner distance _vehicle; if (_dist < 3) then { _gunner moveInTurret [_vehicle, [0,0]] ; }; }; }; //Allow getin MON_Allowgetin = { //Hablitamos a la IA para entrar en el vehiculo [_this] allowGetIn true; }; //Funcin que ordena al soldado salir si se encuentra en un vehiculo y a la distancia indicada //Parmeters: [_heli,_targetPos,_atdist] // <- _npc: unit in vehicle // <- _targetPos: position for exiting(if no waypoint used) // <- _atdist: distance for doing paradrop or landing // -> _getout: true if getout MON_GetOutDist = { private["_vehicle","_npc","_target","_atdist","_getout","_dogetout","_driver","_commander","_targetpos","_dist","_vehpos","_vehicles"]; _npc = _this select 0; _targetpos = _this select 1; _atdist = _this select 2; _getout = false; _dogetout = []; _vehicles = []; sleep 0.05; if (!alive _npc) exitwith{}; _vehicle = vehicle _npc; _vehpos = getpos _vehicle; _dist = round([_vehpos,_targetpos] call KRON_distancePosSqr); //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Getoutdist dist=%2 atdist=%3 ",typeof _vehicle,_dist, _atdist]}; if ( _vehicle != _npc || !(_npc iskindof "Man")) then { if ( (_dist) <= _atdist ) then { { if (( vehicle _x != _x || !(_x iskindof "Man")) && !((vehicle _x) in _vehicles)) then { _vehicles = _vehicles + [vehicle _x]; }; }foreach units _npc; { _vehicle = _x; _dogetout = crew _vehicle; _driver = driver _vehicle; _gunner = gunner _vehicle; //Si hay artillero no sacarenos ni al piloto ni al artillero ni al comandante if ( alive _gunner && canmove _gunner ) then { _dogetout = _dogetout - [_gunner] - [_driver]; }; if ( count _dogetout > 0 ) then { _getout = true; //Paramos el vehiculo y esperamos 5 segundos [_vehicle,10] spawn MON_doStop; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Getoutdist dist=%2 atdist=%3 ",typeof _vehicle,_dist, _atdist]}; { _x spawn MON_GetOut; sleep 0.5; }foreach _dogetout; //Quitamos el id al vehiculo para que pueda ser reutilizado _vehicle setVariable ["UPSMON_grpid", 0, false]; _vehicle setVariable ["UPSMON_cargo", [], false]; [_npc,_vehicle, _driver] spawn MON_checkleaveVehicle; }; } foreach _vehicles; }; }; _dogetout; }; //Evalua si han salido todas las unidades para abandonar el vehiculo MON_checkleaveVehicle={ _npc = _this select 0; _vehicle = _this select 1; _driver = _this select 2; _in = false; //Damos tiempo a que todas las unidades salgan sleep 10; { if (_x != vehicle _x) then {_in = true}; }foreach units _npc; if (!_in) then { _driver enableAI "MOVE"; sleep 1; _driver stop false; sleep 1; _driver leaveVehicle _vehicle; sleep 1; }; }; //Function for order a unit to exit if no gunner //Parmeters: [_npc] // <- _npc: MON_GetOut = { private["_vehicle","_npc","_getout" ,"_gunner"]; _npc = _this; _vehicle = vehicle (_npc); _gunner = objnull; _gunner = gunner _vehicle; sleep 0.05; if (!alive _npc) exitwith{}; //Si no hay artillero abandonamos el vehiculo if ( isnull _gunner || !alive _gunner || !canmove _gunner || (_gunner != _npc && driver _vehicle != _npc && commander _vehicle != _npc) ) then { [_npc] allowGetIn false; unassignVehicle _npc; _npc spawn MON_doGetOut; }; }; //Function for order a unit to exit //Parmeters: [_npc] // <- _npc: MON_doGetOut = { private["_vehicle","_npc","_getout" ,"_gunner","_groupOne","_timeout","_dir"]; _npc = _this; _vehicle = vehicle (_npc); sleep 0.05; if (_vehicle != _npc) then { //Wait until vehicle is stopped waituntil {!alive _npc || !canmove _npc || !alive _vehicle || ((velocity _vehicle select 0) <= 0 && (velocity _vehicle select 1) <= 0 ) || ( _vehicle iskindof "Air" && ((position _vehicle) select 2) <= 1)}; if (!alive _npc || !canmove _npc) exitwith{}; unassignVehicle _npc; _npc action ["getOut", _vehicle]; doGetOut _npc; [_npc] spawn MON_cancelstop; waituntil {!alive _npc || !canmove _npc || vehicle _npc == _npc}; }; if (!alive _npc || !canmove _npc) exitwith{}; if (leader _npc != _npc) then { //Moves out with dispersion of 45 _dir = getDir _npc; _dir = _dir + 45 - (random 90); [_npc,25,_dir] spawn MON_domove; //if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 Moving away from %2 %3",_npc, typeof _vehicle,_dir];}; }; }; //Function for exiting of heli //Parmeters: [_heli,_targetPos,_atdist] // <- _heli: // <- _targetPos: position for exiting(if no waypoint used) // <- _atdist: distance for doing paradrop or landing MON_doParadrop = { private["_heli","_npc","_getout" ,"_gunner","_targetpos","_helipos","_dist","_index","_grp","_wp","_targetPosWp","_targetP","_units","_crew","_timeout","_firstTime","_NearestEnemy"]; _heli = _this select 0; _targetPos = [0,0]; _atdist = 250; _flyingheigh = 90; _landonBeh = ["CARELESS","SAFE"]; _timeout=0; _firstTime = true; //Gets optional parameters if ((count _this) > 1) then {_targetPos = _this select 1;}; if ((count _this) > 2) then {_atdist = _this select 2;}; if ((count _this) > 3) then {_flyingheigh = _this select 3;}; _helipos = [0,0]; _targetposWp = [0,0]; _gunner = objnull; _gunner = gunner _heli; _dist = 1000000; _index = 0; _grp = GRPNULL; _wp = []; _units =[]; _crew =[]; if (_flyingheigh < 90) then {_flyingheigh = 90}; waituntil {count crew _heli > 0 || !alive _heli || !canmove _heli}; _grp = group ((crew _heli) select 0); _npc = leader ((crew _heli) select 0); _units = units _npc; if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 do paradrop at dist %2 ",typeof _heli, _atdist];}; while { (_dist >= _atdist || _dist < 10) && alive _heli && canmove _heli && count crew _heli > 0} do { _heli flyInHeight _flyingheigh; //Take last waypoint _index = (count waypoints _grp) - 1; _wp = [_grp,_index]; _targetPosWp = waypointPosition _wp; if (format ["%1", _targetPosWp] == "[0,0,0]") then {_targetPosWp = _targetPos}; _helipos = position _heli; _dist = round([_helipos,_targetPosWp] call KRON_distancePosSqr); if (_firstTime) then { _firstTime = false; if (_dist <= _atdist ) then { _targetPosWp = _targetPos; _dist = round([_helipos,_targetPosWp] call KRON_distancePosSqr); }; }; //if (KRON_UPS_Debug>0 ) then {hintsilent format["flying heigh=%1 dist=%2 jump at=%3",(position _heli) select 2,_dist,_atdist];}; sleep 1; }; if (!alive _heli || count crew _heli == 0 || (count (assignedCargo _heli) == 0 && !isnull (gunner _heli))) exitwith{}; _crew = crew _heli; _NearestEnemy = _heli findnearestenemy _heli; //Jump if (((position _heli) select 2) >= 55 && !surfaceIsWater position _heli && (!(toupper (behaviour _npc) IN _landonBeh) || !isnull _NearestEnemy || random 100 <= 50)) then { //moving hely for avoiding stuck [_heli,1000] spawn MON_domove; sleep 3; if (KRON_UPS_Debug>0 ) then {_heli globalchat format["doing paradrop high %1 dist=%2",(position _heli) select 2,_dist,_atdist];}; //Do paradrop { if( (assignedVehicleRole _x) select 0 == "Cargo")then { unassignVehicle _x; _x action ["EJECT", _heli] ; _x stop false; [_x] spawn MON_ACE_Watersurvival; }; sleep 0.5; } forEach crew _heli - [gunner _heli] - [driver _heli]; //Clear Hely vars _heli setVariable ["UPSMON_grpid", 0, false]; _heli setVariable ["UPSMON_cargo", [], false]; //Waits until all units are down _timeout = time + 60; { waituntil {(_x == vehicle _x ) || !alive _x || !canmove _x || isnull _x || time > _timeout}; //Fix bug of ACE that sometimes AI gets in stand animation //_x switchMove "AmovPercMsprSlowWrflDf_AmovPpneMstpSrasWrflDnon_2"; }foreach (_crew - [driver _heli]) - [gunner _heli]; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 after paradrop",_npc]}; if (alive _npc && canmove _npc) then { _npc move _targetPosWp; }else{ {if (alive _x && canmove _x) exitwith { _x move _targetPosWp;}}foreach _crew; }; //If only pilot land heli if (count crew _heli <=1) then { [_heli] spawn MON_landHely; }; } else { //land if ( !surfaceIsWater _helipos && ((random 100)<20 || !canmove _heli || (!isnull _NearestEnemy && (toupper (behaviour _npc) IN _landonBeh) && random 100 <= 50))) then { [_heli] spawn MON_landHely; } else { If (alive _heli && canmove _heli && count crew _heli > 0) then { if (KRON_UPS_Debug>0 ) then {_heli globalchat format["%1 failed paradrop, trying another time",typeof _heli];}; //Try another time _heli flyInHeight _flyingheigh; sleep 3; [_heli, _targetPos, _atdist*1.5,_flyingheigh] spawn MON_doParadrop; }; }; }; //if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 exit do paradrop %2 ",_npc, _atdist];}; }; //Lands hely MON_landHely = { private["_heli","_npc","_crew","_NearestEnemy","_timeout","_landing","_targetpos"]; _heli = _this select 0; _crew =[]; _targetpos=[0,0]; _timeout = 0; _landing = false; sleep 0.05; if (!alive _heli || !canmove _heli ) exitwith{}; _crew = crew _heli; _npc = leader (_crew select 0); //Checks hely is already landing _landing = _heli getVariable "UPSMON_landing"; if (isnil ("_landing")) then {_landing=false;}; if (_landing) exitwith {}; //Orders to land heli _heli land "LAND"; if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 is trying to land, altitude=%2 %3",typeof _heli,(position _heli) select 2,behaviour _npc];}; //Puts a mark for knowing hely is landing _heli setVariable ["UPSMON_landing", true, false]; //Waits for land position waituntil {!alive _heli || toUpper(landResult _heli) != "NOTREADY" }; if (alive _heli && (toUpper(landResult _heli) == "NOTFOUND")) exitwith { if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 no landing zone, doing paradrop",typeof _heli];}; _heli setVariable ["UPSMON_landing", false, false]; [_heli] spawn MON_doparadrop; }; //1rt try-Waits until velocity and heigh are good for getting out _timeout = 30 + time; waituntil {!alive _heli || time > _timeout || ((velocity _heli select 2) <= 1 && ((position _heli) select 2) <= 2)}; //2nd try-Waits until velocity and heigh are good for getting out if (((position _heli) select 2) > 2 && ((position _heli) select 2) < 50 && !surfaceiswater position _heli) then { _heli land "LAND"; _timeout = 30 + time; if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 trying another time to land",typeof _heli,(position _heli) select 2,behaviour _npc];}; waituntil {!alive _heli || time > _timeout || ((position _heli) select 2) > 30 || ((velocity _heli select 2) <= 1 && ((position _heli) select 2) <= 2)}; }; //Chechs if alive before continuing if (!alive _heli) exitwith {}; if (((position _heli) select 2) >= 3) exitwith { if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 landing timeout, doing paradrop",typeof _heli];}; _heli setVariable ["UPSMON_landing", false, false]; //[_heli,1000] spawn MON_domove; sleep 5; [_heli] spawn MON_doparadrop; }; //dogetout each soldier { _x spawn MON_doGetOut; sleep 0.2; }forEach crew _heli; _timeout = 30 + time; //Waits until all getout of heli { waituntil {vehicle _x == _x || !canmove _x || !alive _x || movetofailed _x || time > _timeout }; }forEach _crew; // If leader alive sets combat mode if (alive _npc && canmove _npc) then { //Gets nearest known enemy for putting in combat mode _NearestEnemy = _npc findNearestEnemy _npc; if (!isnull _NearestEnemy ) then { _npc setBehaviour "AWARE"; _groupOne = group _npc; _groupOne setFormation "DIAMOND"; }; //Moves to current target Position _grpid = _npc getvariable "UPSMON_grpid"; if !(isnil "_grpid") then { _targetpos =(KRON_targetsPos select _grpid); _npc move _targetpos; if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 landed",_grpid,count KRON_targetsPos];}; }; }; //Quitamos el id al vehiculo para que pueda ser reutilizado _heli setVariable ["UPSMON_grpid", 0, false]; _heli setVariable ["UPSMON_cargo", [], false]; _heli setVariable ["UPSMON_landing", false, false]; }; //Controls that heli not stoped flying MON_HeliStuckcontrol = { private["_heli","_landing","_stuckcontrol","_dir1","_targetPos","_lastpos"]; _heli = _this select 0; _landing = false; _stuckcontrol = false; _targetPos=[0,0,0]; _dir1 = 0; sleep 0.05; if ( !alive _heli || !canmove _heli ) exitwith{}; //Checks stuckcontrol not active _stuckcontrol = _heli getVariable "UPSMON_stuckcontrol"; if (isnil ("_stuckcontrol")) then {_stuckcontrol=false}; if (_stuckcontrol) exitwith {}; _heli setVariable ["UPSMON_stuckcontrol", true, false]; if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 stuck control begins",typeof _heli];}; //Stuck loop control while { alive _heli } do { sleep 5; if ((velocity _heli select 0) <= 3 && (velocity _heli select 1) <= 3 && (velocity _heli select 2) <= 3 && ((position _heli) select 2) >= 30) then { _landing = _heli getVariable "UPSMON_landing"; if (isnil ("_landing")) then {_landing=false;}; if (!_landing) then { //moving hely for avoiding stuck [_heli,1000] spawn MON_domove; if (KRON_UPS_Debug>0 ) then {player GLOBALCHAT format["%1 stucked at %2m altitude, moving",typeof _heli,(position _heli) select 2];}; sleep 30; }; }; }; //if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 exits from stuck control",typeof _heli];}; _heli setVariable ["UPSMON_stuckcontrol", false, false]; }; //Function that checks is gunner is alive, if not moves a cargo MON_Gunnercontrol = { private["_vehicle","_gunnercontrol","_hasgunner","_crew","_crew2"]; _vehicle = _this select 0; _targetPos=[0,0,0]; _dir1 = 0; _gunnercontrol = false; _hasgunner = (_vehicle) emptyPositions "Gunner" > 0 || !isnull gunner _vehicle; _crew = []; _crew2 = []; //Without driver and gunner sleep 0.05; if ( !alive _vehicle || !canmove _vehicle ) exitwith{}; //Checks stuckcontrol not active _gunnercontrol = _vehicle getVariable "UPSMON_gunnercontrol"; if (isnil ("_gunnercontrol")) then {_gunnercontrol=false}; if (_gunnercontrol) exitwith {}; _vehicle setVariable ["UPSMON_gunnercontrol", true, false]; _crew = crew _vehicle; //gunner and driver loop control while { alive _vehicle && canmove _vehicle && count _crew > 0} do { _crew = crew _vehicle; { if (!canmove _x || !alive _x) then {_crew = _crew -[_x];}; }foreach _crew; //Driver control if ((isnull (driver _vehicle) || !alive (driver _vehicle) || !canmove (driver _vehicle)) && count _crew > 0) then { _crew2 = _crew - [gunner _vehicle]; if (count _crew2 > 0) then { (_crew2 select (count _crew2 - 1)) spawn MON_movetodriver; }; }; //Gunner control if ( _hasgunner && (isnull (gunner _vehicle) || !alive (gunner _vehicle) || !canmove (gunner _vehicle)) && count _crew > 1) then { _crew2 = _crew - [driver _vehicle]; if (count _crew2 > 0) then { (_crew2 select (count _crew2 - 1)) spawn MON_movetogunner; }else{ (_crew select 0) spawn MON_movetogunner; }; }; sleep 20; //if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 crew=%2",typeof _vehicle, count _crew];}; }; //if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 exits from gunner control",typeof _vehicle];}; _vehicle setVariable ["UPSMON_gunnercontrol", false, false]; }; //Mueve a todo el grupo adelante MON_move = { private["_npc","_dir1","_targetPos","_dist"]; _npc = _this select 0; _dist = _this select 1; sleep 0.05; if (!alive _npc || !canmove _npc ) exitwith{}; _dir1 = getDir _npc; _targetPos = [position _npc,_dir1, _dist] call MON_GetPos2D; _npc move _targetPos; }; //Mueve al soldado adelante MON_domove = { private["_npc","_dir1","_targetPos","_dist"]; _npc = _this select 0; _dist = _this select 1; if ((count _this) > 2) then {_dir1 = _this select 2;} else{_dir1 = getDir _npc;}; sleep 0.05; if (!alive _npc || !canmove _npc ) exitwith{}; _targetPos = [position _npc,_dir1, _dist] call MON_GetPos2D; //If position water and not boat not go if (surfaceIsWater _targetPos && !(_npc iskindof "boat" || _npc iskindof "air") ) exitwith {}; _npc domove _targetPos; }; //Funcin que detiene al soldado y lo hace esperar x segundos MON_doStop = { private["_sleep","_npc"]; _npc = _this select 0; _sleep = _this select 1; sleep 0.05; if (!alive _npc || !canmove _npc ) exitwith{}; if ( _sleep == 0 ) then {_sleep = 0.001}; //Restauramos valores por defecto de movimiento //_npc disableAI "MOVE"; dostop _npc ; sleep _sleep; [_npc] spawn MON_cancelstop; }; //Funcin que detiene al soldado y lo hace esperar x segundos MON_cancelstop = { private["_npc"]; _npc = _this select 0; _npc stop false; }; //Realiza la animacin de esquivar granada MON_evadeGrenade = { if (!alive _this || (vehicle _this) != _this || !canmove _this) exitwith{}; _this playmovenow "AmovPercMstpSlowWrflDnon_ActsPpneMstpSlowWrflDr_GrenadeEscape"; sleep 8; if (!alive _this || (vehicle _this) != _this || !canmove _this) exitwith{}; _this switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDr"; //croqueta _this playmovenow "AmovPpneMstpSrasWrflDnon"; //prone }; //Realiza la animacin de la croqueta MON_animCroqueta = { if (!alive _this || (vehicle _this) != _this || !canmove _this || !(_this iskindof "Man")) exitwith{}; if ((random 1)<=.50) then { _x switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDl"; //croqueta } else { _x switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDr"; //croqueta }; }; //Lanza una granada MON_throw_grenade = { private["_target","_npc"]; _npc = _this select 0; _target = _this select 1; sleep 0.5; if (!alive _npc || (vehicle _npc) != _npc || !canmove _npc) exitwith{}; _npc addMagazine "SmokeShell"; [_npc,_target] spawn MON_dowatch; _npc selectWeapon "throw"; sleep .1; _npc fire ["SmokeShellMuzzle","SmokeShellMuzzle","SmokeShell"]; sleep 4; }; //Establece el tipo de posicin MON_setUnitPos = { private["_pos","_npc"]; _npc = _this select 0; _pos = _this select 1; sleep 0.5; if (!alive _npc || !canmove _npc || _npc != vehicle _npc || !(_npc iskindof "Man")) exitwith{}; _npc setUnitPos _pos; sleep 1; }; //Establece el tipo de posicin MON_setUnitPosTime = { private["_pos","_npc"]; _npc = _this select 0; _pos = _this select 1; _time = _this select 2; if (!alive _npc || !canmove _npc) exitwith{}; _npc setUnitPos _pos; sleep _time; _npc setUnitPos "AUTO"; sleep 1; }; // Funcin para mirar en una direccin MON_dowatch = { private["_target","_npc"]; _npc = _this select 0; _target = _this select 1; if (!alive _npc) exitwith{}; _npc dowatch _target; sleep 1; }; //Funcin que mueve al soldado a la posicin de conductor //Parmeters: [_npc,_vehicle] // <- _npc: unit to move to driver pos // <- _vehicle MON_movetoDriver = { private["_vehicle","_npc"]; _npc = _this ; _vehicle = vehicle _npc; //Si est muerto if (vehicle _npc == _npc || !alive _npc || !canmove _npc || !(_npc iskindof "Man")) exitwith{}; if (isnull(driver _vehicle) || !alive(driver _vehicle) || !canmove(driver _vehicle)) then { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Moving to driver of %2 ",_npc,typeof _vehicle]}; _npc action ["getOut", _vehicle]; doGetOut _npc; WaitUntil {vehicle _npc==_npc || !alive _npc || !canmove _npc}; //Si est muerto if (!alive _npc || !canmove _npc) exitwith{}; unassignVehicle _npc; _npc assignasdriver _vehicle; _npc moveindriver _vehicle; }; }; //Funcin que mueve al soldado a la posicin de conductor //Parmeters: [_npc,_vehicle] // <- _npc: unit to move to driver pos // <- _vehicle MON_movetogunner = { private["_vehicle","_npc"]; _npc = _this ; _vehicle = vehicle _npc; sleep 0.05; //Si est muerto if (vehicle _npc == _npc || !alive _npc || !canmove _npc || !(_npc iskindof "Man")) exitwith{}; if (isnull(gunner _vehicle) || !alive(gunner _vehicle) || !canmove(gunner _vehicle)) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: Moving to gunner of %2 ",_npc,typeof _vehicle]}; _npc action ["getOut", _vehicle]; doGetOut _npc; WaitUntil {vehicle _npc==_npc || !alive _npc || !canmove _npc}; //Si est muerto if (!alive _npc || !canmove _npc) exitwith{}; unassignVehicle _npc; _npc assignasgunner _vehicle; _npc moveingunner _vehicle; }; }; //Funcin que retorna array de arrays con edificios y sus plantas //Parmeters: [_object,(_distance,_minfloors)] // <- _object: soldier to get near buildings // <- _distance: distance to search buildings (optional, 25 by default) // <- _minfloors: min floors of building (optional) if not especified min floors is 2 // -> [_bld,_bldpos] MON_GetNearestBuildings = { private ["_object","_altura","_pos","_bld","_bldpos","_posinfo","_minfloors","_OCercanos","_distance","_blds"]; _distance = 25; _minfloors = 2; _altura = 0; _blds = []; _object = _this select 0; if ((count _this) > 1) then {_distance = _this select 1;}; if ((count _this) > 2) then {_minfloors = _this select 2;}; _pos =0; _bld = objnull; _bldpos =0; _posinfo=[]; //La altura mnima es 2 porque hay muchos edificios q devuelven 2 de altura pero no se puede entrar en ellos. if ( minfloors == 0 ) then { minfloors = 2; }; // _posinfo: [0,0]=no house near, [obj,0]=house near, but no roof positions, [obj,pos]=house near, with roof pos //_posinfo= _object call MON_PosInfo; _OCercanos = nearestObjects [_object, ["house","building"] , _distance]; { _bldpos = _x call MON_BldPos; if ( _bldpos >= _minfloors && damage _x <= 0 ) then { _blds = _blds + [[_x,_bldpos]];}; //player sidechat format["%1 cerca de edificio con %2 plantas %5",typeof _object,_bldpos]; }foreach _OCercanos; _blds; }; //Function to move al units of squad to near buildings //Parmeters: [_npc,(_patrol,_minfloors)] // <- _npc: lider // <- _distance: distance to search buildings (optional, 25 by default) // <- _patrol: wheter must patrol or not MON_moveNearestBuildings = { private ["_npc","_altura","_pos","_bld","_bldpos","_posinfo","_blds","_distance","_cntobjs1","_bldunitin","_blddist","_patrol","_wait","_all"]; _distance = 30; _altura = 0; _patrol = false; _wait=60; _all = false; _npc = _this select 0; if ((count _this) > 1) then {_distance = _this select 1;}; if ((count _this) > 2) then {_patrol = _this select 2;}; if ((count _this) > 3) then {_wait = _this select 3;}; if ((count _this) > 4) then {_all = _this select 4;}; _pos =0; _bld = objnull; _bldpos =0; _cntobjs1=0; _bldunitsin=[]; _units=[]; _blds=[]; //If all soldiers move leader too if (_all) then { _units = (units _npc); }else{ _units = (units _npc) - [_npc]; }; sleep 0.05; { if (_x iskindof "Man" && unitReady _x && _x == vehicle _x && canmove _x && alive _x && canstand _x) then {_bldunitsin = _bldunitsin + [_x]} }foreach _units; if (count _bldunitsin == 0) exitwith {}; //Obtenemos los edificios cercanos al lider _blds = [_npc,_distance] call MON_GetNearestBuildings; if (count _blds==0) exitwith {}; //Movemos a la unidades a los edificios cercanos. [_bldunitsin, _blds, _patrol,_wait,_all] spawn MON_moveBuildings; }; //Function to move al units of squad to near buildings //Parmeters: [_npc,(_patrol,_minfloors)] // <- _units: array of units // <- _blds: array of buildingsinfo [_bld,pos] // <- _patrol: wheter must patrol or not // -> _bldunitsin: array of units moved to builidings MON_moveBuildings = { private ["_npc","_altura","_pos","_bld","_bldpos","_posinfo","_blds","_cntobjs1","_bldunitin","_blddist","_i","_patrol","_wait","_all","_minpos","_blds2"]; _patrol = false; _wait = 60; _minpos = 2; _all = false; _units = _this select 0; _blds = _this select 1; if ((count _this) > 2) then {_patrol = _this select 2;}; if ((count _this) > 3) then {_wait = _this select 3;}; if ((count _this) > 4) then {_all = _this select 4;}; if ((count _this) > 5) then {_minpos = _this select 5;}; _altura = 0; _pos =0; _bld = objnull; _bldpos =0; _cntobjs1=0; _bldunitsin=[]; _movein=[]; _blds2 =[]; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_moveBuildings _units=%1 _blds=%2",count _units, count _blds]; }; //if (KRON_UPS_Debug>0) then {diag_log format["MON_moveBuildings _units=%1 _blds=%2",count _units, count _blds];}; { _bld = _x select 0; _bldpos = _x select 1; if ( _bldpos >= _minpos ) then { _cntobjs1 = 1; _movein = []; _i = 0; if (_patrol) then { if (_bldpos >= 8) then { _cntobjs1 = 2 }; } else { if (_bldpos >= 8) then { _cntobjs1 = round(random 3) + 1;}; }; //Buscamos una unidad cercana para recorrerlo { if (_x iskindof "Man" && unitReady _x && canmove _x && alive _x && vehicle _x == _x && _i < _cntobjs1) then{ _movein = _movein + [_x]; _i = _i + 1; }; } foreach _units; //if (KRON_UPS_Debug>0) then {player globalchat format["_units=%3 _bldunitsin %4 _movein=%1",_movein, typeof _bld, count _units, count _bldunitsin];} //if (KRON_UPS_Debug>0) then {diag_log format["_units=%3 _bldunitsin %4 _movein=%1 %2 %5",_movein, typeof _bld, count _units, count _bldunitsin,_x];}; if (count _movein > 0) then { _bldunitsin = _bldunitsin + _movein; _units = _units - _bldunitsin; if (_patrol) then { { [_x,_bld,_bldpos] spawn MON_patrolBuilding; }foreach _movein; } else { { _altura = floor(random(_bldpos)); if (_altura<2) then {_altura = _minpos}; [_x,_bld,_altura,_wait] spawn MON_movetoBuilding; }foreach _movein; }; }; }; if (count _units == 0) exitwith {}; }foreach _blds; //If need to enter all units in building and rest try with a superior lvl if ( _all && count _units > 0 ) then { _blds2 = []; _minpos = _minpos + 3; { if ( (_x select 1) >= _minpos) then { _blds2 = _blds2 + [_x]; }; }foreach _blds; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_moveBuildings exit _units=%1 _blds=%2",count _units, count _blds2]; }; //if (KRON_UPS_Debug>0) then {diag_log format["MON_moveBuildings exit _units=%1 _blds=%2",count _units, count _blds2];}; if (count _blds2 > 0 ) then { [_units, _blds2, _patrol,_wait,_all,_minpos] call MON_moveBuildings; }; _bldunitsin = _bldunitsin + _units; }; _bldunitsin; }; //Function to move a unit to a position in a building //Parmeters: [_npc,(_patrol,_minfloors)] // <- _npc: soldier // <- _bld: building // <- _altura: building // <- _wait: time to wait in position MON_movetoBuilding = { private ["_npc","_altura","_bld","_wait","_dist","_retry","_soldiers"]; _wait = 60; _timeout = 120; _dist = 0; _retry = false; _npc = _this select 0; _bld = _this select 1; _altura = _this select 2; if ((count _this) > 3) then {_wait = _this select 3;}; //Si est en un vehiculo ignoramos la orden if (vehicle _npc != _npc || !alive _npc || !canmove _npc) exitwith{}; //Si ya est en un edificio ignoramos la orden _inbuilding = _npc getvariable ("UPSMON_inbuilding"); if ( isNil("_inbuilding") ) then {_inbuilding = false;}; if (_inbuilding) exitwith{}; _npc domove (_bld buildingPos _altura); _npc setVariable ["UPSMON_inbuilding", _inbuilding, false]; _npc setvariable ["UPSMON_buildingpos", nil, false]; _timeout = time + _timeout; //if (KRON_UPS_Debug>0) then {player globalchat format["%4|_bld=%1 | %2 | %3",typeof _bld, _npc, typeof _npc ,_altura];}; //if (KRON_UPS_Debug>0) then {diag_log format["%4|_bld=%1 | %2 | %3",typeof _bld, _npc, typeof _npc ,_altura];}; waitUntil {moveToCompleted _npc || moveToFailed _npc || !alive _npc || !canmove _npc || _timeout < time}; if (moveToCompleted _npc && alive _npc && canmove _npc) then { _dist = [position _npc,_bld buildingPos _altura] call KRON_distancePosSqr; _soldiers = [_npc,1] call MON_nearestSoldiers; //If more soldiers in same floor see to keep or goout. if (count _soldiers > 0) then { { if (!isnil{_x getvariable ("UPSMON_buildingpos")}) exitwith {_retry = true}; }foreach _soldiers; }; if (!_retry && _dist <= 2) then { _npc setvariable ["UPSMON_buildingpos", _altura, false]; sleep 0.1; [_npc,_wait] spawn MON_dostop; }; }; if (!alive _npc || !canmove _npc) exitwith{}; _npc setVariable ["UPSMON_inbuilding", false, false]; //Down one position. if (_retry ) then { _altura = _altura + 1; _bldpos = _bld call MON_BldPos; if (_altura <= _bldpos) then { [_npc,_bld,_altura] spawn MON_movetoBuilding; }; }; }; //Funcin para mover a una unidad al edificio ms cercano //Parmeters: [_npc,_bld,(_BldPos)] // <- _npc: soldier to move // <- _bld:building to patrol // <- _BldPos: positions of builiding (optional) MON_patrolBuilding = { private ["_npc","_bld","_bldpos","_posinfo","_minfloors","_OCercanos","_distance","_timeout","_pos","_inbuilding","_rnd","_NearestEnemy","_patrolto","_time"]; _bldpos = 0; _pos = 0; _timeout = 0; _i = 1; _inbuilding = false; _rnd = 0; _patrolto = 0; _NearestEnemy = objnull; _time = 0; _npc = _this select 0; _bld = _this select 1; if ((count _this) > 2) then {_bldpos = _this select 2;} else {_bldpos = _x call MON_BldPos;}; if (_i > _bldpos) then {_i = _bldpos}; _patrolto = round ( 10 + random (_bldpos) ); if (_patrolto > _bldpos) then {_patrolto = _bldpos}; //Si ya est muerto o no se puede mover se ignora if (!(_npc iskindof "Man") || !alive _npc || !canmove _npc) exitwith{}; //Si ya est en un edificio ignoramos la orden _inbuilding = _npc getvariable ("UPSMON_inbuilding"); if ( isNil("_inbuilding") ) then {_inbuilding = false;}; //Asignamos el vehiculo a a la escuadra si contiene las posiciones justas if (!_inbuilding) then { _inbuilding = true; _npc setVariable ["UPSMON_inbuilding", _inbuilding, false]; [_npc,"Middle"] spawn MON_setUnitPos; _timeout = time + 60; //player sidechat format["%1 patrol building %2 from %3 to %4",typeof _npc, typeof _bld,_i, _patrolto]; while { _i <= _patrolto && alive _npc && canmove _npc} do{ _npc domove (_bld buildingPos _i); _time = time + 30; waitUntil {moveToCompleted _npc or moveToFailed _npc or !alive _npc or _time < time}; if (moveToCompleted _npc) then { _timeout = time + 60; _i = _i + 1; } else { if (moveToFailed _npc || !canmove _npc || !alive _npc || _timeout < time) then { //player sidechat format["%1 Cancelando patrulla en %2",_npc, typeof _bld]; _i = _patrolto + 1; }; }; sleep 0.05; }; //Si est en un vehiculo ignoramos la orden if (!alive _npc || !canmove _npc) exitwith{}; //Volvemos con el lider _npc domove (position leader _npc); //Marcamos que ya hemos finalizado sleep 60; //Damos tiempo para salir del edificio _npc setVariable ["UPSMON_inbuilding", false, false]; }; }; //Function to put a mine //Parmeters: [_npc,(_position)] // <- _npc: leader // <- _position:location for mine (optional) MON_CreateMine = { private ["_npc","_rnd","_soldier","_mine","_dir","_position"]; _soldier = _this select 0; if ((count _this) > 1) then {_position = _this select 1;} else {_position = [0,0];}; _mine = objnull; _rnd = 0; _dir = 0; _npc = leader _soldier; if (_soldier == _npc ) then { _rnd = round (random ( count ((units _npc)))); _soldier = (units _npc) select _rnd; }; //leader only control not work //Si est en un vehiculo ignoramos la orden if (!(_x iskindof "Man" ) || _soldier == _npc || _soldier!=vehicle _soldier || !alive _soldier || !canmove _soldier) exitwith {false}; //Animacin para montar el arma if ((count _this) > 1) then { [_soldier,_position] spawn MON_doCreateMine; }else{ [_soldier] spawn MON_doCreateMine; }; true; }; MON_doCreateMine = { private ["_npc","_rnd","_soldier","_mine","_dir","_position"]; _position = [0,0]; _soldier = _this select 0; if ((count _this) > 1) then {_position = _this select 1;}; //If not is Man or dead exit if (!(_x iskindof "Man" ) || _soldier!=vehicle _soldier || !alive _soldier || !canmove _soldier) exitwith {false}; _soldier stop false; [_soldier,"AUTO"] spawn MON_setUnitPos; if ((count _this) > 1) then { _soldier domove _position; waituntil {unitReady _soldier || moveToCompleted _soldier || moveToFailed _soldier || !alive _soldier || !canmove _soldier}; }; if (moveToFailed _soldier || !alive _soldier || _soldier != vehicle _soldier || !canmove _soldier) exitwith {false}; //Crouche _soldier playMovenow "ainvpknlmstpslaywrfldnon_1"; sleep 1; if (!alive _soldier || !canmove _soldier) exitwith{}; _dir = getdir _soldier; _position = [position _soldier,_dir, 0.5] call MON_GetPos2D; _mine = createMine ["MineMine", _position , [], 0]; //Prepare mine _soldier playMoveNow "AinvPknlMstpSlayWrflDnon_medic"; sleep 5; //Return to formation _soldier domove position ( leader _soldier ); }; //Function to surrender AI soldier //Parmeters: [_npc] // <- _npc: soldier to surrender MON_surrender = { private ["_npc","_vehicle"]; _npc = _this select 0; if (!alive _npc || !canmove _npc) exitwith {}; _npc addrating -1000; _npc setcaptive true; sleep 0.5; _vehicle = vehicle _npc; if ( _npc != _vehicle || !(_npc iskindof "Man" )) then { _vehicle setcaptive true; if ( "Air" countType [_vehicle]>0) then { //Si acaba de entrar en el heli se define punto de aterrizaje if (_npc == driver _vehicle ) then { [_vehicle] call MON_landHely; }; } else { _npc spawn MON_doGetOut; }; //Esperamos a que est parado waituntil {_npc == vehicle _npc || !alive _npc}; }; if (!alive _npc || !canmove _npc) exitwith {}; _npc setcaptive true; _npc stop true; [_npc,"UP"] call MON_setUnitPos; removeAllWeapons _npc; sleep 1; _npc playMoveNow "AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon"; }; //Returns leader if was dead MON_getleader = { private ["_npc","_members"]; _npc = _this select 0; _members = _this select 1; sleep 0.05; if (!alive _npc ) then { //takes commder a soldier not in vehicle { if (alive _x && canmove _x && _x == vehicle _x && !isplayer _x) exitwith { _npc = _x; }; }foreach _members; //if no soldier out of vehicle takes any if (!alive _npc ) then { { if (alive _x && canmove _x) exitwith {_npc = _x;}; }foreach _members; }; //If not alive or already leader or is player exits if (isPlayer _npc || !alive _npc || !canmove _npc ) then { { if (alive _x && !isPlayer _x) exitwith {_npc = [_npc, _members] call MON_getleader;}; }foreach _members; _npc; }; if (leader _npc == _npc) exitwith {_npc}; //Set new _npc as leader group _npc selectLeader _npc; }; _npc; }; MON_ACE_Watersurvival = { private ["_lb","_pos","_ejector","_in","_grpid","_rnd"]; _in =[]; _rnd = 0; _ejector = _this select 0; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_ACE_Watersurvival %1",typeof _ejector]}; waitUntil { !canmove _ejector || !alive _ejector || isnull (_ejector) || ((getPos vehicle _ejector) select 2 < 1) }; if ( !surfaceIsWater (getpos _ejector) || !canmove _ejector || !alive _ejector || isnull (_ejector) ) exitWith {}; //Miramos de entrar en un barco cercano _grpid = _ejector getvariable "UPSMON_grpid"; if (isnil "_grpid") then {_grpid = 0}; _in = [_grpid,_ejector,30] call MON_GetIn_NearestBoat; //If no boat near creates a zodiac if (count _in <= 0) then { if (!(isNil "ace_main")) then { _lb = "ACE_Lifeboat_US" createVehicle getposASL _ejector; }else{ _lb = "Zodiac" createVehicle getposASL _ejector; }; _pos = getposASL _ejector; _pos set [0, ((_pos select 0) + 2)]; _pos set [1, ((_pos select 1) + 2)]; //_pos set [2, 0]; _lb setPos _pos; //Moves in boat if !(isPlayer _ejector) then { [_ejector,_lb,0] call MON_assignasdriver; }; }; //Wait until reached eart waitUntil { !canmove _ejector || !alive _ejector || isnull (_ejector) || !surfaceIsWater (position _ejector) }; if (KRON_UPS_Debug>0) then {player globalchat format["Exit from boat%1",typeof _lb]}; _ejector spawn MON_dogetout; }; //Function to do artillery //Parmeters: [_position,(_rounds,_area,_cadence,_mincadence)] // <- _position: center of fire create artillery // <- _rounds: rounds of fire // <- _area: Dispersion area // <- _maxcadence: Cadence of fire, is random between min // <- _mincadence: Minimum cadence // <- _bullet: class of bullet to fire, default ARTY_Sh_81_HE MON_artillery_dofire = { if (!isserver) exitWith {}; private ["_smoke1","_i","_area","_position","_maxcadence","_mincadence","_sleep","_rounds"]; _area = 150; _maxcadence = 10; _mincadence = 5; _sleep = 0; _rounds = 5; _bullet = "ARTY_Sh_81_HE"; _position =[]; //_bullet = "ARTY_Sh_105_HE"; //_bullet = "ARTY_Sh_122_HE"; _position = _this select 0; if ((count _this) > 1) then {_rounds = _this select 1;}; if ((count _this) > 2) then {_area = _this select 2;}; if ((count _this) > 3) then {_maxcadence = _this select 3;}; if ((count _this) > 4) then {_mincadence = _this select 4;}; if ((count _this) > 5) then {_bullet = _this select 5;}; _area2 = _area * 2; if (KRON_UPS_Debug>0) then {player globalchat format["artillery doing fire on %1",_position]}; for [{_i=0}, {_i<_rounds}, {_i=_i+1}] do { _sleep = random _maxcadence; if (_sleep < _mincadence) then {_sleep = _mincadence}; sleep _sleep; _smoke1 = _bullet createVehicle [(_position select 0)+ random _area2 - _area, (_position select 1)+ random _area2 - _area, (_position select 2)+ 20]; }; }; //Funcin que devuelve un array con los vehiculos terrestres ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_deadbodies = { private["_vehicles","_npc","_bodies","_OCercanos","_distance","_side"]; _npc = _this select 0; _distance = _this select 1; //_side = _this select 2; _OCercanos = []; _bodies = []; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Man"] , _distance]; { if (_npc knowsabout _x >0.5 && (!canmove _x || !alive _x)) then { _bodies = _bodies + [_x];}; }foreach _OCercanos; _bodies; }; //Funcin que devuelve un array con los vehiculos terrestres ms cercanos //Parmeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_nearestSoldiers = { private["_vehicles","_npc","_soldiers","_OCercanos","_distance","_side"]; _npc = _this select 0; _distance = _this select 1; if (isnull _npc) exitwith {}; _OCercanos = []; _soldiers = []; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Man"] , _distance]; _OCercanos = _OCercanos - [_npc]; { if ( alive _x && canmove _x ) then { _soldiers = _soldiers + [_x];}; }foreach _OCercanos; _soldiers; }; /* ===================================================================================================== MON_spawn.sqf Author: Monsada (chs.monsada@gmail.com) Comunidad Hispana de Simulacin: http://www.simulacion-esp.com ===================================================================================================== Parmeters: [_artillery,(_range,_rounds,_area,_cadence,_mincadence)] execvm "scripts\UPSMON\MON_artillery_add.sqf"; <- _artillery object to attach artillery script, must be an object with gunner. <- ( _rounds ) rounds to fire each time, default 1 <- ( _range ) range of artillery, default 800 <- ( _area ) Dispersion area, 150m by default <- ( _maxcadence ) Cadence of fire, is random between min, default 10s <- ( _mincadence ) Minimum cadence, default 5s <- ( _bullet ) Class of bullet to fire, default ARTY_Sh_81_HE ===================================================================================================== 1. Place a static weapon on map. 2. Exec module in int of static weapon nul=[this] execVM "scripts\UPSMON\MON_artillery_add.sqf"; 1. Be sure static weapon has a gunner or place a "fortify" squad near, this will make squad to take static weapon. 2. Create a trigger in your mission for setting when to fire. Set side artillery variable to true: KRON_UPS_ARTILLERY_EAST_FIRE = true; This sample will do east artilleries to fire on known enemies position, when you want to stop fire set to false. For more info: http://dev-heaven.net/projects/upsmon/wiki/Artillery_module =====================================================================================================*/ if (!isserver) exitWith {}; //Waits until UPSMON is init waitUntil {!isNil("KRON_UPS_INIT")}; waitUntil {KRON_UPS_INIT==1}; private ["_artillery","_smoke1","_i","_area","_position","_maxcadence","_mincadence","_sleep","_rounds"]; _range = 800; _area = 150; _maxcadence = 10; _mincadence = 5; _sleep = 0; _rounds = 1; _bullet = "ARTY_Sh_81_HE"; _vector =[]; _artillery = _this select 0; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_artillery_add before %1 %2 %3",isnull _artillery,alive _artillery]}; if (isnull _artillery || !alive _artillery) exitwith{}; if ((count _this) > 1) then {_rounds = _this select 1;}; if ((count _this) > 2) then {_range = _this select 2;}; if ((count _this) > 3) then {_area = _this select 3;}; if ((count _this) > 4) then {_maxcadence = _this select 4;}; if ((count _this) > 5) then {_mincadence = _this select 5;}; if ((count _this) > 6) then {_bullet = _this select 6;}; //Add artillery to array of artilleries _vector = [_artillery,_rounds,_range,_area,_maxcadence,_mincadence,_bullet]; if (isnil "KRON_UPS_ARTILLERY_UNITS" ) then {KRON_UPS_ARTILLERY_UNITS = []}; KRON_UPS_ARTILLERY_UNITS = KRON_UPS_ARTILLERY_UNITS + [_vector]; if (true) exitwith{}; /* ===================================================================================================== MON_spawn.sqf Author: Monsada (chs.monsada@gmail.com) Comunidad Hispana de Simulacin: http://www.simulacion-esp.com ===================================================================================================== Parmeters: [Param1,Param2,Param3,[Param4]] EXECVM "SCRIPTS\UPSMON\MON_SPAWN.SQF"; <- Param1 Id of the template to copy. <- Param2 Position to create new squad. <- Param3 N of squads to create <- Param4 Array of parameters of UPSMON, first must be name of marc to patrol ===================================================================================================== Function that allows to spawn UPSMON squads. 1- create a squad in editor. Exec UPSMON and set TEMPLATE id, this will save members of squad, not equipement. nul = [this,"town","TEMPLATE:",1] execVM "scripts\upsmon.sqf"; 2- Exec MON_spawn on trigger or where you want telling the copy of the template to create and the position. nul = [1,[0,0,0],3,[mark, upsmon optional params]] EXECVM "SCRIPTS\UPSMON\MON_SPAWN.SQF"; =====================================================================================================*/ if (!isserver) exitWith {}; //Waits until UPSMON is init waitUntil {!isNil("KRON_UPS_INIT")}; waitUntil {KRON_UPS_INIT==1}; private ["_template","_position","_params","_copies","_membertypes","_unittype","_side","_UCthis","_initstr","_grp","_lead","_newunit","_i","_newpos","_vehicle","_initlstr"]; //Parameter reading _template = _this select 0; _position = _this select 1; _copies = _this select 2; _params = _this select 3; //Initialization _membertypes = []; _side = ""; _UCthis = []; _initstr = ""; _initlstr = ""; _grp = grpnull; _lead = objnull; _newunit = objnull; _newpos=[]; _vehicle=[]; //Gets parameters of UPSMON for [{_i=0},{_i0) then {player globalchat format["Spawning %3 copies of template %1",_template,_position,_copies,count KRON_UPS_TEMPLATES]}; //if (KRON_UPS_Debug>0) then {diag_log format["Spawning %3 copies of template %1 on %2 templates %4",_template,_position,_copies,count KRON_UPS_TEMPLATES]}; //Search if any template { if ((_x select 0) == _template) then { _side = _x select 1; _membertypes = _x select 2; _vehicletypes = _x select 3; //Gets leader type _unittype= _membertypes select 0; //if (KRON_UPS_Debug>0) then {player globalchat format["template %1:%2 ",_template,_membertypes]}; for [{_i=1},{_i<=_copies},{_i=_i+1}] do { // make the clones civilians // use random Civilian models for single unit groups if ((_unittype=="Civilian") && (count _members==1)) then {_rnd=1+round(random 20); if (_rnd>1) then {_unittype=format["Civilian%1",_rnd]}}; _grp=createGroup _side; _lead = _grp createUnit [_unittype, _position, [], 0, "form"]; _lead setVehicleInit _initlstr; [_lead] join _grp; _grp selectLeader _lead; sleep 1; // copy team members (skip the leader) _c=0; { _c=_c+1; if (_c>1) then { _newpos = _position findEmptyPosition [10, 200]; sleep .4; if (count _newpos <= 0) then {_newpos = _position}; _newunit = _grp createUnit [_x, _newpos, [],0,"form"]; _newunit setVehicleInit _initstr; [_newunit] join _grp; }; } foreach _membertypes; { _newpos = _position findEmptyPosition [10, 200]; sleep .4; if (count _newpos <= 0) then {_newpos = _position}; _newunit = _x createvehicle (_newpos); } foreach _vehicletypes; //Set new parameters _params = [_lead] + _UCthis; //Exec UPSMON script _params SPAWN UPSMON; processInitCommands; }; }; }foreach KRON_UPS_TEMPLATES; if (true) exitwith{}; // ========================================================================================================= // Script for adding the action of follow player. // Version: 1.0 // Author: Monsada (smirall@hotmail.com) // --------------------------------------------------------------------------------------------------------- private ["_side","_soldiers"]; _side = _this select 0; _soldiers = switch (_side) do { case west: {KRON_AllWest}; case east: {KRON_AllEast}; case resistance: {KRON_AllRes}; }; { if ( leader _x == _x ) then { _x addaction ["Order your men to follow me", "scripts\UPSMON\actions\followme.sqf", [], 1, false]; } else { _x addaction ["Follow me", "scripts\UPSMON\actions\followme.sqf", [], 1, false]; }; }foreach _soldiers; if (true) exitWith {}; // ========================================================================================================= // UPSMON - Urban Patrol Script Mon // Version: 5.0.7 // Author: Monsada (chs.monsada@gmail.com) // Comunidad Hispana de Simulacin: // http://www.simulacion-esp.com // // Wiki: http://dev-heaven.net/projects/upsmon/wiki // Forum: http://forums.bistudio.com/showthread.php?t=91696 // Share your missions with upsmon: http://dev-heaven.net/projects/upsmon/boards/86 // --------------------------------------------------------------------------------------------------------- // Based on Urban Patrol Script // Version: 2.0.3 // Author: Kronzky (www.kronzky.info / kronzky@gmail.com) // --------------------------------------------------------------------------------------------------------- // Required parameters: // unit = Unit to patrol area (1st argument) // markername = Name of marker that covers the active area. (2nd argument) // // Patrol squad samples: // nul=[this,"town"] execVM "upsmon.sqf"; // // defensive squad samples: // nul=[this,"town","nomove"] execVM "scripts\upsmon.sqf"; // // Optional parameters: _ // random = Place unit at random start position. // randomdn = Only use random positions on ground level. // randomup = Only use random positions at top building positions. // min:n/max:n = Create a random number (between min and max) of 'clones'. // init:string = Custom init string for created clones. // nomove = Unit will stay at start position until enemy is spotted. // nofollow = Unit will only follow an enemy within the marker area. // delete:n = Delete dead units after 'n' seconds. // nowait = Do not wait at patrol end points. // noslow = Keep default behaviour of unit (don't change to "safe" and "limited"). // noai = Don't use enhanced AI for evasive and flanking maneuvers. // showmarker = Display the area marker. // trigger = Display a message when no more units are left in sector. // empty:n = Consider area empty, even if 'n' units are left. // track = Display a position and destination marker for each unit. // reinforcement = Makes squad as reinforcement, when alarm KRON_UPS_reinforcement==true this squad will go where enemy were. // reinforcement:x = Makes squad as reinforcement id, when alarm KRON_UPS_reinforcementx==true this squad will go where enemy were. // fortify = makes leader order to take positions on nearly buildings at distance 200 meters, squad fortified moves less than "nomove" // spawned = use only with squads created in runtime, this feature will add squad to UPSMON correctly. // nowp = No waypoints will be created for this squad UNTIL ENEMY DETECTED, this squad will comunicate enemies but will not be moved by UPSMON until enemy detected, after that upsmon takes control of squad // nowp2 = No waypoints will be created for this squad UNTIL ENEMY DETECTED and damaged, this squad will comunicate enemies but will not be moved by UPSMON until enemy detected and damaged, after that upsmon takes control of squad // nowp3 = No waypoints will be created for this squad in any way, this squad will comunicate enemies but will not be moved by UPSMON. // ambush = Ambush squad will not move until in combat, will lay mines if enabled and wait for incoming enemies stealth and ambush when near or discovered. // ambush2 = Ambush squad will not move until in combat, will NOT LAY MINES and wait for incoming enemies stealth and ambush when near or discovered. // ambush:n = Creates an anbush and wait maximun the especified time n in seconds. you can put 0 seconds for putting mines and go away if combined with "move" for example // ambush2:n = Same as ambush:n but without laying mines. // aware,combat,stealth,careless defines default behaviour of squad // respawn = allow squad to respawn when all members are dead and no targets near // respawn:x = allows to define the number of times squad may respawn. // ----------------------------------------------------------------------------- // Modified: 08.04.2010 // ----------------------------------------------------------------------------- // Changes in version: // ----------------------------------------------------------------------------- // Added: // nowp = No waypoints will be created for this squad UNTIL ENEMY DETECTED // nowp2 = No waypoints will be created for this squad UNTIL ENEMY DETECTED AND DAMAGED // nowp3 = No waypoints will be created for this squad in any way. // Ambush2 Same as ambush but without using mines // Added spawn support for vehicles in squad // Modified: // FORTIFY moves leader too and prevents from moving when hurt // Solved bug in targetting of resistance // Solved bug when respawning a template squad were creating a new template // Solved bug that did exiting AI form vehicle when upsmon begins // Solved bug of squads loosing group and gets stucked // Avoid to take same position on buildings // Solved bug in control of heli // ----------------------------------------------------------------------------- if (!isServer) exitWith {}; // ----------------------------------------------------------------------------- if (isNil("KRON_UPS_INIT")) then { KRON_UPS_INIT=0; }; waitUntil {KRON_UPS_INIT==1}; // convert argument list to uppercase _UCthis = []; for [{_i=0},{_i0) then {player sidechat format["%1: New instance",_grpidx,_npc getVariable ("UPSMON_grpid")]}; //Is ACE mod installed and loaded? //_ace = isClass(configFile >> "CfgPatches" >> "ace_main"); //Did ACE scripting start? //if (KRON_UPS_Debug>0) then {player sidechat format["_ACE=%1 ACE=%2",_ace,!(isNil "ace_main")]}; // get name of area marker _areamarker = _this select 1; if (isNil ("_areamarker")) exitWith { hint "UPS: Area marker not defined.\n(Typo, or name not enclosed in quotation marks?)"; }; // remember center position of area marker _centerpos = getMarkerPos _areamarker; _centerX = abs(_centerpos select 0); _centerY = abs(_centerpos select 1); _centerpos = [_centerX,_centerY]; // show area marker _showmarker = if ("SHOWMARKER" in _UCthis) then {"SHOWMARKER"} else {"HIDEMARKER"}; if (_showmarker=="HIDEMARKER") then { //_areamarker setMarkerCondition "false"; // VBS2 _areamarker setMarkerPos [-abs(_centerX),-abs(_centerY)]; }; // is anybody alive in the group? _exit = true; if (typename _npc=="OBJECT") then { if (!isnull group _npc) then { _npc = [_npc,units (group _npc)] call MON_getleader; }else{ _vehicles = [_npc,2] call MON_nearestSoldiers; if (count _vehicles>0) then { _npc = [_vehicles select 0,units (_vehicles select 0)] call MON_getleader; }; }; } else { if (count _obj>0) then { _npc = [_obj,count _obj] call MON_getleader; }; }; if (!(_npc iskindof "Man")) then { if (!isnull(commander _npc) ) then { _npc = commander _npc; }else{ if (!isnull(driver _npc) ) then { _npc = driver _npc; }else{ _npc = gunner _npc; }; }; group _npc selectLeader _npc; }; if (alive _npc) then {_exit = false;}; if (KRON_UPS_Debug>0 && _exit) then {player sidechat format["%1 There is no alive members %1 %2 %3",_grpidx,typename _npc,typeof _npc, count units _npc]}; // exit if something went wrong during initialization (or if unit is on roof) if (_exit) exitWith { if (KRON_UPS_DEBUG>0) then {hint "Initialization aborted"}; }; // remember the original group members, so we can later find a new leader, in case he dies _members = units _npc; KRON_UPS_Total = KRON_UPS_Total + (count _members); //Fills member soldier types _vehicles = []; { if (vehicle _x != _x ) then { _vehicles = _vehicles - [vehicle _x]; _vehicles = _vehicles + [vehicle _x]; }; _membertypes = _membertypes + [typeof _x]; }foreach _members; //Fills member vehicle types { _vehicletypes = _vehicletypes + [typeof _x]; }foreach _vehicles; // what type of "vehicle" is unit ? _isman = "Man" countType [_npc]>0; _iscar = "LandVehicle" countType [_npc]>0; _isboat = "Ship" countType [_npc]>0; _isplane = "Air" countType [_npc]>0; // we just have to brute-force it for now, and declare *everyone* an enemy who isn't a civilian _issoldier = _side != civilian; _friends=[]; _enemies=[]; _sharedenemy=0; if (_issoldier) then { switch (_side) do { case west: { _sharedenemy=0; _friendside = [west]; _enemyside = [east]; }; case east: { _sharedenemy=1; _friendside = [east]; _enemyside = [west]; }; case resistance: { _sharedenemy=2; _enemyside = KRON_UPS_Res_enemy; if (!(east in _enemyside)) then { _friendside = [east]; }; if (!(west in _enemyside)) then { _friendside = [west]; }; }; }; }; if (_side in KRON_UPS_Res_enemy) then { _enemyside = _enemyside + [resistance]; }else { _friendside = _friendside + [resistance]; }; sleep .05; //Sets min units alive for surrender _surrender = call (compile format ["KRON_UPS_%1_SURRENDER",_side]); // Tanks friendlys are contabiliced { if ( side _x in _friendside && ( _x iskindof "Tank" || _x iskindof "Wheeled_APC" )) then { _friendlytanks = _friendlytanks + [_x]; }; }foreach vehicles; // global unit variable to externally influence script //call compile format ["KRON_UPS_%1=1",_npcname]; // X/Y range of target area _areasize = getMarkerSize _areamarker; _rangeX = _areasize select 0; _rangeY = _areasize select 1; _area = abs((_rangeX * _rangeY) ^ 0.5); // marker orientation (needed as negative value!) _areadir = (markerDir _areamarker) * -1; // store some trig calculations _cosdir=cos(_areadir); _sindir=sin(_areadir); // minimum distance of new target position _mindist=(_rangeX^2+_rangeY^2)/3; if (_rangeX==0) exitWith { hint format["UPS: Cannot patrol Sector: %1\nArea Marker doesn't exist",_areamarker]; }; //hint format["%1,%2,%3,%4",_areamarker,isNil ("_areamarker"),_rangeX,_rangeY]; // remember the original mode & speed _orgMode = behaviour _npc; _orgSpeed = speedmode _npc; // set first target to current position (so we'll generate a new one right away) _currPos = getpos _npc; _orgPos = _currPos; _orgDir = getDir _npc; _orgWatch=[_currPos,50,_orgDir] call KRON_relPos; _lastpos = _currPos; _avoidPos = [0,0]; _flankPos = [0,0]; _attackPos = [0,0]; _newattackPos = [0,0]; _fixedtargetpos = [0,0]; _frontPos = [0,0]; _dirf1 = 0;_dirf2=0;_flankPos2=[0,0]; _dist = 10000; _lastdist = 0; _lastmove1 = 0; _lastmove2 = 0; _maxmove=0; _moved=0; _damm=0; _dammchg=0; _lastdamm = 0; _timeontarget = 0; _fightmode = "walk"; _fm=0; _gothit = false; _pursue=false; _hitPos=[0,0,0]; _react = 0; _lastdamage = 0; _lastknown = 0; _opfknowval = 0; _sin0=1; _sin90=1; _cos90=0; _sin270=-1; _cos270=0; _targetX =0; _targetY=0; _relTX=0;_relTY=0; _relUX=0;_relUY=0; _supressed = false; _flankdist=0; _nBuilding=nil; _nBuildingt =nil; _speedmode="Limited"; _distnbuid = 0; _distnbuidt = 0; _objsflankPos1 = []; _cntobjs1 = 0; _objsflankPos2 = []; _cntobjs2 = 0; _targettext =""; _dir1 =0;_dir2=0;_dir3=0;_dd=0; _timeontarget=0; _newdamage =0; _reinforcement =""; _reinforcementsent = false; _target = objnull; _newtarget=objnull; _flankdir=0; //1 tendencia a flankpos1, 2 tendencia a flankpos2 _prov=0; _targets=[]; _planta=0; //Indice de plantas en edificios _newflankAngle = 0; _closeenough = KRON_UPS_closeenough; _gunner = objnull; _driver = objnull; _fortify = false; _buildingdist= 60;//Distance to search buildings near _Behaviour = "CARELESS"; _grp = grpnull; _grp = group _npc; _template = 0; _nowpType = 1; _ambushtype = 1; // set target tolerance high for choppers & planes if (_isplane) then {_closeenough=KRON_UPS_closeenough * 2}; // ***************************************** optional arguments ***************************************** // wait at patrol end points _pause = if ("NOWAIT" in _UCthis) then {"NOWAIT"} else {"WAIT"}; // don't move until an enemy is spotted _nomove = if ("NOMOVE" in _UCthis) then {"NOMOVE"} else {"MOVE"}; //fortify group in near places _fortify= if ("FORTIFY" in _UCthis) then {true} else {false}; _fortifyorig = _fortify; if (_fortify) then { _nomove="NOMOVE"; _minreact = KRON_UPS_minreact * 3; _buildingdist = _buildingdist * 2; _makenewtarget = true; _wait = 3000; }; // don't follow outside of marker area _nowp = if ("NOWP" in _UCthis) then {true} else {false}; _nowp = if ("NOWP2" in _UCthis) then {true} else {_nowp}; _nowp = if ("NOWP3" in _UCthis) then {true} else {_nowp}; _nowpType = if ("NOWP2" in _UCthis) then {2} else {_nowpType}; _nowpType = if ("NOWP3" in _UCthis) then {3} else {_nowpType}; _orignowp = _nowp; //Ambush squad will no move until in combat or so close enemy _ambush= if ("AMBUSH" in _UCthis) then {true} else {false}; _ambush= if ("AMBUSH:" in _UCthis) then {true} else {_ambush}; _ambush= if ("AMBUSH2" in _UCthis) then {true} else {_ambush}; _ambushwait = ["AMBUSH:",_ambushwait,_UCthis] call KRON_UPSgetArg; _ambushwait = ["AMBUSH2:",_ambushwait,_UCthis] call KRON_UPSgetArg; _ambushType = if ("AMBUSH2" in _UCthis) then {2} else {_ambushType}; _ambushType = if ("AMBUSH2:" in _UCthis) then {2} else {_ambushType}; // don't follow outside of marker area _respawn = if ("RESPAWN" in _UCthis) then {true} else {false}; _respawn = if ("RESPAWN:" in _UCthis) then {true} else {_respawn}; _respawnmax = ["RESPAWN:",_respawnmax,_UCthis] call KRON_UPSgetArg; if (!_respawn) then {_respawnmax = 0}; // any init strings? _initstr = ["INIT:","",_UCthis] call KRON_UPSgetArg; // don't follow outside of marker area _nofollow = if ("NOFOLLOW" in _UCthis) then {"NOFOLLOW"} else {"FOLLOW"}; // share enemy info _shareinfo = if ("NOSHARE" in _UCthis) then {"NOSHARE"} else {"SHARE"}; // "area cleared" trigger activator _areatrigger = if ("TRIGGER" in _UCthis) then {"TRIGGER"} else {if ("NOTRIGGER" in _UCthis) then {"NOTRIGGER"} else {"SILENTTRIGGER"}}; // suppress fight behaviour if ("NOAI" in _UCthis) then {_issoldier=false}; // adjust cycle delay _cycle = ["CYCLE:",KRON_UPS_Cycle,_UCthis] call KRON_UPSgetArg; _currcycle=_cycle; //spawned for squads createds in runtime _spawned= if ("SPAWNED" in _UCthis) then {true} else {false}; if (_spawned) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: squad has been spawned, respawns %2",_grpidx,_respawnmax]}; switch (side _npc) do { case west: { KRON_AllWest=KRON_AllWest + units _npc; }; case east: { KRON_AllEast=KRON_AllEast + units _npc; }; case resistance: { KRON_AllRes=KRON_AllRes + units _npc; if (east in KRON_UPS_Res_enemy ) then { KRON_UPS_East_enemies = KRON_UPS_East_enemies+units _npc; } else { KRON_UPS_East_friends = KRON_UPS_East_friends+units _npc; }; if (west in KRON_UPS_Res_enemy ) then { KRON_UPS_West_enemies = KRON_UPS_West_enemies+units _npc; } else { KRON_UPS_West_friends = KRON_UPS_West_friends+units _npc; }; }; }; call (compile format ["KRON_UPS_%1_Total = KRON_UPS_%1_Total + count (units _npc)",side _npc]); }; // drop units at random positions _initpos = "ORIGINAL"; if ("RANDOM" in _UCthis) then {_initpos = "RANDOM"}; if ("RANDOMUP" in _UCthis) then {_initpos = "RANDOMUP"}; if ("RANDOMDN" in _UCthis) then {_initpos = "RANDOMDN"}; // don't position groups or vehicles on rooftops if ((_initpos!="ORIGINAL") && ((!_isman) || (count _members)>1)) then {_initpos="RANDOMDN"}; // set behaviour modes (or not) _orgMode = "SAFE"; if ("CARELESS" in _UCthis) then {_orgMode = "CARELESS"}; if ("AWARE" in _UCthis) then {_orgMode = "AWARE"}; if ("COMBAT" in _UCthis) then {_orgMode = "COMBAT"}; if ("STEALTH" in _UCthis) then {_orgMode = "STEALTH"}; _Behaviour = _orgMode; _npc setbehaviour _Behaviour; //Sets initial speed _noslow = if ("NOSLOW" in _UCthis) then {"NOSLOW"} else {"SLOW"}; if (_noslow!="NOSLOW") then { _orgSpeed = "limited"; } else { _orgSpeed = "FULL"; }; _speedmode = _orgSpeed; _npc setspeedmode _speedmode; // If enemy detected reinforcements will be sent _reinforcement= if ("REINFORCEMENT" in _UCthis) then {"REINFORCEMENT"} else {"NOREINFORCEMENT"}; _rfid = ["REINFORCEMENT:",0,_UCthis] call KRON_UPSgetArg; if (_rfid>0) then { _reinforcement="REINFORCEMENT"; //if (KRON_UPS_Debug>0) then {hintsilent format["%1: reinforcement group %2",_grpidx,_rfid,_rfidcalled,_reinforcement]}; }; //Is a template for spawn module? _template = ["TEMPLATE:",_template,_UCthis] call KRON_UPSgetArg; //Fills template array for spawn if (_template > 0 && !_spawned) then { KRON_UPS_TEMPLATES = KRON_UPS_TEMPLATES + ( [[_template]+[_side]+[_membertypes]+[_vehicletypes]] ); //if (KRON_UPS_Debug>0) then {diag_log format["%1 Adding TEMPLATE %2 _spawned %3",_grpidx,_template,_spawned]}; //if (KRON_UPS_Debug>0) then {player globalchat format["KRON_UPS_TEMPLATES %1",count KRON_UPS_TEMPLATES]}; }; // make start position random if (_initpos!="ORIGINAL") then { // find a random position (try a max of 20 positions) _try=0; _bld=0; _bldpos=0; while {_try<20} do { _currPos=[_centerX,_centerY,_rangeX,_rangeY,_cosdir,_sindir,_areadir] call KRON_randomPos; _posinfo=[_currPos] call KRON_PosInfo3; // _posinfo: [0,0]=no house near, [obj,-1]=house near, but no roof positions, [obj,pos]=house near, with roof pos _bld=_posinfo select 0; _bldpos=_posinfo select 1; if (_isplane || _isboat || !(surfaceiswater _currPos)) then { if (((_initpos=="RANDOM") || (_initpos=="RANDOMUP")) && (_bldpos>0)) then {_try=99}; if (((_initpos=="RANDOM") || (_initpos=="RANDOMDN")) && (_bldpos==0)) then {_try=99}; }; _try=_try+1; //sleep .05; }; if (_bldpos==0) then { if (_isman) then { {_x setpos _currPos} foreach units _npc; } else { _npc setpos _currPos; }; } else { // put the unit on top of a building _npc setPos (_bld buildingPos _bldpos); _currPos = getPos _npc; _nowp=true; // don't move if on roof }; sleep .05; }; // track unit _track = if (("TRACK" in _UCthis) || (KRON_UPS_Debug>0)) then {"TRACK"} else {"NOTRACK"}; _trackername = ""; _destname = ""; if (_track=="TRACK") then { _track = "TRACK"; _trackername=format["trk_%1",_grpidx]; _markerobj = createMarker[_trackername,[0,0]]; _markerobj setMarkerShape "ICON"; _markertype = if (isClass(configFile >> "cfgMarkers" >> "WTF_Dot")) then {"WTF_DOT"} else {"DOT"}; _trackername setMarkerType _markertype; _markercolor = switch (side _npc) do { case west: {"ColorGreen"}; case east: {"ColorRed"}; case resistance: {"ColorBlue"}; default {"ColorBlack"}; }; _trackername setMarkerColor _markercolor; _trackername setMarkerText format["%1",_grpidx]; _trackername setmarkerpos _currPos; _destname=format["dest_%1",_grpidx]; _markerobj = createMarker[_destname,[0,0]]; _markerobj setMarkerShape "ICON"; _markertype = if (isClass(configFile >> "cfgMarkers" >> "WTF_Flag")) then {"WTF_FLAG"} else {"FLAG"}; _destname setMarkerType _markertype; _destname setMarkerColor _markercolor; _destname setMarkerText format["%1",_grpidx]; _destname setMarkerSize [.5,.5]; }; // delete dead units _deletedead = ["DELETE:",0,_UCthis] call KRON_UPSgetArg; if (_deletedead>0) then { {_x addEventHandler['killed',format["[_this select 0,%1] spawn KRON_deleteDead",_deletedead]]; }forEach _members; }; // how many group clones? // TBD: add to global side arrays? _mincopies = ["MIN:",0,_UCthis] call KRON_UPSgetArg; _maxcopies = ["MAX:",0,_UCthis] call KRON_UPSgetArg; if (_mincopies>_maxcopies) then {_maxcopies=_mincopies}; if (_maxcopies>140) exitWith {hint "Cannot create more than 140 groups!"}; if (_maxcopies>0) then { _copies=_mincopies+random (_maxcopies-_mincopies); // create the clones for "_grpcnt" from 1 to _copies do { // copy groups if (isNil ("KRON_grpindex")) then {KRON_grpindex = 0}; KRON_grpindex = KRON_grpindex+1; // copy group leader _unittype = typeof _npc; // make the clones civilians // use random Civilian models for single unit groups if ((_unittype=="Civilian") && (count _members==1)) then {_rnd=1+round(random 20); if (_rnd>1) then {_unittype=format["Civilian%1",_rnd]}}; _grp=createGroup side _npc; _lead = _grp createUnit [_unittype, getpos _npc, [], 0, "form"]; _lead setVehicleVarName format["l%1",KRON_grpindex]; call compile format["l%1=_lead",KRON_grpindex]; _lead setBehaviour _orgMode; _lead setSpeedmode _orgSpeed; _lead setSkill skill _npc; _lead setVehicleInit _initstr; [_lead] join _grp; _grp selectLeader _lead; // copy team members (skip the leader) _c=0; { _c=_c+1; if (_c>1) then { _newunit = _grp createUnit [typeof _x, getpos _x, [],0,"form"]; _newunit setBehaviour _orgMode; _newunit setSpeedMode _orgSpeed; _newunit setSkill skill _x; _newunit setVehicleInit _initstr; [_newunit] join _grp; }; } foreach _members; _nul=[_lead,_areamarker,_pause,_noslow,_nomove,_nofollow,_initpos,_track,_showmarker,_shareinfo,"DELETE:",_deletedead] execVM "scripts\upsmon.sqf"; //sleep .05; }; processInitCommands; sleep .05; }; // units that can be left for area to be "cleared" _zoneempty = ["EMPTY:",0,_UCthis] call KRON_UPSgetArg; // create area trigger if (_areatrigger!="NOTRIGGER") then { _trgside = switch (side _npc) do { case west: {"WEST"}; case east: {"EAST"}; case resistance: {"GUER"}; case civilian: {"CIV"};}; //_trgside = switch (side _npc) do { case west: {"EAST"}; case east: {"WEST"}; case resistance: {"ANY"}; case civilian: {"ANY"};}; _trgname="KRON_Trig_"+_trgside+"_"+_areamarker; _flgname="KRON_Cleared_"+_areamarker; // has the trigger been created already? KRON_TRGFlag=-1; call compile format["%1=false",_flgname]; call compile format["KRON_TRGFlag=%1",_trgname]; if (isNil ("KRON_TRGFlag")) then { // trigger doesn't exist yet, so create one (make it a bit bigger than the marker, to catch path finding 'excursions' and flanking moves) call compile format["%1=createTrigger['EmptyDetector',_centerpos]",_trgname]; call compile format["%1 setTriggerArea[_rangeX*1.5,_rangeY*1.5,markerDir _areamarker,true]",_trgname]; call compile format["%1 setTriggerActivation[_trgside,'PRESENT',true]",_trgname]; call compile format["%1 setEffectCondition 'true'",_trgname]; call compile format["%1 setTriggerTimeout [5,7,10,true]",_trgname]; if (_areatrigger!="SILENTTRIGGER") then { call compile format["%1 setTriggerStatements['count thislist<=%6', 'titletext [''SECTOR <%2> LIMPIO'',''PLAIN''];''%2'' setmarkerpos [-%4,-%5];%3=true;', 'titletext [''SECTOR <%2> HA SIDO REOCUPADO'',''PLAIN''];''%2'' setmarkerpos [%4,%5];%3=false;']", _trgname,_areamarker,_flgname,_centerX,_centerY,_zoneempty]; } else { call compile format["%1 setTriggerStatements['count thislist<=%3', '%2=true;', '%2=false;']", _trgname,_flgname,_zoneempty]; }; //Si quieres que ejecute tu script descomenta estas lineas //message = format["_trgside=%1, _npc=%2",_trgside, _npc]; //call compile format["%1 setTriggerStatements['this', 'nul = [%1,%3,thisList] execvm ''mon\enemydetected.sqF'';', '%2=false;'];", _trgname,_flgname,_trgside]; //setTriggerStatements['this', 'nul = [thislist,_trgside] execvm "mon\enemydetectedd.sqF"';, 'ok = false'] }; sleep .05; }; //Si algn soldado tiene un edificio util cerca lo toma if ( _nomove=="NOMOVE" ) then { sleep 10; _unitsIn = [_grpid,_npc,150] call MON_GetIn_NearestStatic; if ( count _unitsIn > 0 ) then { sleep 10}; [_npc, _buildingdist,false,_wait,true] spawn MON_moveNearestBuildings; }; // init done _makenewtarget=true; _newpos=false; _targetPos = [0,0,0];//_currPos; _targettext ="_currPos"; _swimming = false; _waiting = if (_nomove=="NOMOVE") then {9999} else {0}; _sharedist = if (_nomove=="NOMOVE") then {KRON_UPS_sharedist} else {KRON_UPS_sharedist*1.5}; //Gets position of waypoint if no targetpos if (format ["%1", _targetPos] == "[0,0,0]") then { _index = (count waypoints _grp) - 1; _wp = [_grp,_index]; _targetPos = waypointPosition _wp; if (([_currpos,_targetPos] call KRON_distancePosSqr)<= 20) then {_targetPos = [0,0,0];}; }; // *********************************************************************************************************** // ************************************************ MAIN LOOP ************************************************ // *********************************************************************************************************** _loop=true; scopeName "main"; while {_loop} do { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: _cycle=%2 _currcycle=%3 _react=%4 _waiting=%5",_grpidx,_cycle,_currcycle,_react,_waiting]}; _timeontarget=_timeontarget+_currcycle; _react=_react+_currcycle; _waiting = _waiting - _currcycle; _lastreact = _lastreact+_currcycle; _newpos = false; // did anybody in the group got hit? _newdamage=0; { if((damage _x)>0.2) then { _newdamage=_newdamage+(damage _x); // damage has increased since last round if (_newdamage>_lastdamage) then { _lastdamage=_newdamage; _gothit=true; }; }; if (!alive _x || !canmove _x) then { _members=_members-[_x]; }; } foreach _members; // nobody left alive, exit routine if (count _members==0) then { _exit=true; } else { // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; }; //exits from loop if (_exit) exitwith {}; //Checks if surrender is enabled if ( _surrender > 0 ) then { _surrended = call (compile format ["KRON_UPS_%1_SURRENDED",_side]); }; //If surrended exits from script if (_surrended) exitwith { { [_x] spawn MON_surrender; }foreach _members; if (KRON_UPS_Debug>0) then {_npc globalchat format["%1: %2 SURRENDED",_grpidx,_side]}; }; //Asignamos el lider actual del grupo en el array de lideres de grupos KRON_NPCs set [_grpid,_npc]; // current position _currPos = getpos _npc; _currX = _currPos select 0; _currY = _currPos select 1; if (_track=="TRACK" || KRON_UPS_Debug>0) then { _trackername setmarkerpos _currPos; }; // if the AI is a civilian we don't have to bother checking for enemy encounters if ((_issoldier) && !(_exit)) then { _pursue=false; //_Behaviour = Behaviour _npc; //Variables para saber si estamos en un vehiculo _incar = "LandVehicle" countType [vehicle (_npc)]>0; _inheli = "Air" countType [vehicle (_npc)]>0; _inboat = "Ship" countType [vehicle (_npc)]>0; //Si el grupo es un refuerzo y se han detectado los enemigos se envian al objetivo if (_rfid > 0 ) then { _rfidcalled = call (compile format ["KRON_UPS_reinforcement%1",_rfid]); if (isnil "_rfidcalled") then {_rfidcalled=false}; _fixedtargetPos = call (compile format ["KRON_UPS_reinforcement%1_pos",_rfid]); if (isnil "_fixedtargetPos") then { _fixedtargetPos=[0,0]; }else{ _fixedtargetPos = [abs(_fixedtargetPos select 0),abs(_fixedtargetPos select 1)]; _target = objnull; }; }; //Reinforcement control if (_reinforcement=="REINFORCEMENT") then { if ( (KRON_UPS_reinforcement || _rfidcalled) && (!_reinforcementsent)) then { _reinforcementsent=true; _fortify = false; _minreact = KRON_UPS_minreact; _buildingdist = 60; _react = _react + 100; _waiting = -1; if (KRON_UPS_Debug>0) then {player sidechat format["%1 called for reinforcement %2",_grpidx,_fixedtargetPos]}; }else{ if ( !(KRON_UPS_reinforcement || _rfidcalled) && (_reinforcementsent)) then { _fixedtargetPos = [0,0]; _attackPos = [0,0]; _fortify = _fortifyorig; _reinforcementsent=false; _nowp = _orignowp; if (_rfid > 0 ) then { call (compile format ["KRON_UPS_reinforcement%1_pos = [0,0]",_rfid]); call (compile format ["KRON_UPS_reinforcement%1 = false",_rfid]); }; if (KRON_UPS_Debug>0) then {player sidechat format["%1 reinforcement canceled",_grpidx]}; }; }; }; //Gets targets from radio _targets = call (compile format ["KRON_targets%1",_sharedenemy]); //Reveal targets found by members to leader { _NearestEnemy = assignedTarget _x; //_NearestEnemy = _x findnearestenemy _x; if (_x knowsabout _NearestEnemy > 0.5 && (_npc knowsabout _NearestEnemy <= 0.5 || count _targets <= 0 )) then { if (_npc knowsabout _NearestEnemy <= 0.5 ) then { _npc reveal _NearestEnemy; if (KRON_UPS_Debug>0) then {player globalchat format["%1: %2 reveals target %3 to leader",_grpidx,typeof _x, typeof _NearestEnemy]}; }; //If no targets adds this if (count _targets <= 0) then { //_target = _NearestEnemy; _targets = _targets + [_NearestEnemy]; _NearestEnemy setvariable ["UPSMON_lastknownpos", position _NearestEnemy, false]; //if (KRON_UPS_Debug>0) then {player globalchat format["%1: %3 added to targets",_grpidx,typeof _x, typeof _target]}; }; }; }foreach units _npc; //Resets distance to target _dist = 10000; //Gets current known position of target and distance if ( !isNull (_target) && alive _target ) then { _newattackPos = _target getvariable ("UPSMON_lastknownpos"); if ( !isnil "_newattackPos" ) then { _attackPos=_newattackPos; //Gets distance to target known pos _dist = ([_currpos,_attackPos] call KRON_distancePosSqr); }; }; //Initialization for geting new targets //Si el objetivo actual est muerto o no existe se limpia el conocimiento anterior if (isNull (_target) || !alive _target || !canmove _target ) then { _lastknown = 0; _opfknowval = 0; _target = objnull; }; //_maxknowledge=0; _newtarget = _target; if ((_shareinfo=="SHARE")) then { // if the leader comes across another unit that's either injured or dead, go into combat mode as well. // If the other person is still alive, share enemy information. //Solicita por radio la posicin del enemigo, si est dentro del radio de accin actua if ((KRON_UPS_comradio == 2)) then { _targetsnear = false; //I we have a close target alive do not search another if (!alive _target || !canmove _target || _dist > _closeenough) then { { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: targets=%2 tg=%3 newtg=%4 dist=%5 %6 %7 %8 %9",_grpidx,count _targets,typeof _x,_newtarget, _dist,_knows, _maxknowledge,_dist2,_attackPos]}; if ( !isnull _x && canmove _x && alive _x ) then { _newattackPos = _x getvariable ("UPSMON_lastknownpos"); if ( !isnil "_newattackPos" ) then { _dist3 = ([_currpos,_newattackPos] call KRON_distancePosSqr); //Sets if near targets to begin warning IF ( _dist3 <= (_closeenough + KRON_UPS_safedist)) then { _targetsnear = true }; //Sets new target if ( ( isnull (_newtarget) || captive _newtarget|| !alive _newtarget|| !canmove _newtarget || _dist3 < _dist ) && ( _dist3 <= _sharedist || _reinforcementsent ) && ( !(_x iskindof "Air") || (_x iskindof "Air" && _isplane )) && ( !(_x iskindof "Ship") || (_x iskindof "Ship" && _isboat )) && ( _x emptyPositions "Gunner" == 0 && _x emptyPositions "Driver" == 0 || (!isnull (gunner _x) && canmove (gunner _x)) || (!isnull (driver _x) && canmove (driver _x))) ) then { _newtarget = _x; _opfknowval = _npc knowsabout _x; _dist = _dist3; if (_dist < _closeenough) exitWith {}; }; }; }; } foreach _targets; sleep 0.5; }; }; //Si cambia el target cambiamos inicializamos la direccin de flanqueo if ( !isNull (_newtarget) && alive _newtarget && canmove _newtarget && (_newtarget != _target || isNull (_target)) ) then { _timeontarget = 0; _targetdead = false; _flankdir= if (random 100 <= 10) then {0} else {_flankdir}; _target = _newtarget; }; }; //Gets current known position of target and distance if ( !isNull (_target) && alive _target ) then { //Enemy detected if (_fightmode != "fight" ) then { _fightmode = "fight"; _react = KRON_UPS_react; if (KRON_UPS_Debug>0) then {player sidechat format["%1: Enemy detected %2",_grpidx, typeof _target]}; if (_nowpType == 1) then {_nowp = false}; }; _newattackPos = _target getvariable ("UPSMON_lastknownpos"); if ( !isnil "_newattackPos" ) then { _attackPos=_newattackPos; //Gets distance to target known pos _dist = ([_currpos,_attackPos] call KRON_distancePosSqr); //Looks at target known pos _members lookat _attackPos; }; }; //Si el enemigo se ha alejado de la covertura de rdio y no es un refuerzo enviado habremos perdido la pista if ( _fightmode != "walk" && !isnull(_target) && _dist < 15 && _npc knowsabout _target < 0.5 ) then { //If squad is near last position and no target clear position of target if (KRON_UPS_Debug>0) then {player sidechat format["%1: Target lost",_grpidx]}; _fightmode="walk"; _speedmode = _orgSpeed; _target = objnull; _Behaviour = _orgMode; _waiting = -1; _unitpos = "AUTO"; _pursue=false; _nowp = _orignowp; _targetdead = true; _makenewtarget = true; //Volvemos a la posicin original }; //Si aumenta el conocimiento del target aceleramos la reaccin if (_opfknowval>_lastknown ) then { _react = _react + 20; }; // if spotted an enemy or got shot, so start pursuit, if in combat and exceed time to react or movecompleted if (_fightmode != "walk" && ((_react >= KRON_UPS_react && _lastreact >=_minreact) || moveToCompleted _npc )) then { _pursue=true; }; //Ambush if (_ambush && !_ambushed) then { _ambushed = true; _nowp = true; _currcycle = 2; _grp setFormation "LINE"; _npc setBehaviour "STEALTH"; _npc setSpeedMode "FULL"; sleep 10; { [_x,"DOWN"] spawn MON_setUnitPos; _x stop true; }foreach units _npc; //Puts a mine if near road if ( KRON_UPS_useMines && _ambushType == 1 ) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: Puting mine for ambush",_grpidx]}; _npc setBehaviour "careless"; _dir1 = getDir _npc; _mineposition = [position _npc,_dir1, 25] call MON_GetPos2D; _roads = _mineposition nearroads KRON_UPS_ambushdist; if (count _roads > 0) then { _mineposition = position (_roads select 0); if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; if (count _roads > 3) then { _mineposition = position (_roads select 3); if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; }; } else { _mineposition = [position _npc,(_dir1-30)mod 360, KRON_UPS_ambushdist + random 15] call MON_GetPos2D; if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; _mineposition = [position _npc,(_dir1+30)mod 360, KRON_UPS_ambushdist + random 15] call MON_GetPos2D; if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; }; _mineposition = [position _npc,_dir1, KRON_UPS_ambushdist + random 20] call MON_GetPos2D; if ([_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; _mineposition = [position _npc,_dir1-15, KRON_UPS_ambushdist + random 10] call MON_GetPos2D; if ([_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; _npc setBehaviour "careless"; sleep 30; { if (!stopped _x) then { _x domove position _npc; waituntil {moveToCompleted _x || moveToFailed _x || !alive _x || !canmove _x || _x distance _npc <= 5}; }; }foreach units _npc; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; _npc setBehaviour "STEALTH"; _grp setFormation "LINE"; sleep 10; { [_x,"DOWN"] spawn MON_setUnitPos; _x stop true; _x setUnitPos "DOWN"; }foreach units _npc; }; //Ambus enemy is nearly aproach //_ambushdist = 50; if (_ambush) then { _prov = ((_ambushdist*2 - (_npc distance _target))*3) - 40; //if (KRON_UPS_Debug>0) then {player sidechat format["%1:%6 _ambushdist=%5 last=%2 dist=%3 prov=%4",_grpidx,_lastdist,_npc distance _target,_prov,_ambushdist,typeof _target]}; if (_gothit || _reinforcementsent || time > _ambushwait || ( "Air" countType [_target]<=0 && ( _npc distance _target <= _ambushdist + random 10 || (!isNull (_target) && (( random 100 <= _prov && _npc distance _target > _lastdist) || _npc distance _target > _ambushdist*3 && _lastdist < _ambushdist*3 && _lastdist > 0)) )) ) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: FIREEEEEEEEE!!!",_grpidx]}; _nowp = _orignowp; _ambush = false; _ambushed = false; _currcycle = _cycle; { _x stop false; _x setUnitPos "Middle"; } foreach _members; //No engage yet _pursue = false; }; //Sets distance to target _lastdist = _npc distance _target; }; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: _nowp=%2 in vehicle=%3 _inheli=%4 _npc=%5",_grpidx,_nowp,vehicle (_npc) ,_inheli,typeof _npc ]}; //If in vehicle take driver if not controlled by user if (alive _npc && !_nowp) then { if (!_isman || (vehicle (_npc) != _npc && !_inboat && !(vehicle (_npc) iskindof "StaticWeapon"))) then { //If new target is close enough leaves vehicle _unitsin = []; if (!_inheli) then { if (_fightmode == "walk") then { _GetOutDist = _area / 20; }else{ _GetOutDist = _closeenough * ((random .4) + 0.6); }; //If near target or stuck getout of vehicle and lock or gothit exits inmediately if (_gothit || _dist <= _closeenough * 1.5 || (_lastcurrpos select 0 == _currpos select 0 && _lastcurrpos select 1 == _currpos select 1 && moveToFailed (vehicle (_npc))) || moveTocompleted (vehicle (_npc))) then { _GetOutDist = 10000; }; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: vehicle=%2 _npc=%3",_grpidx,vehicle (_npc) ,typeof _npc ]}; _unitsin = [_npc,_targetpos,_GetOutDist] call MON_GetOutDist; sleep 0.05; }else{ _GetOutDist = 0; }; if (count _unitsin > 0) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: Geting out of vehicle",_grpidx,([_currpos,_targetpos] call KRON_distancePosSqr),_GetOutDist,_area]}; _timeout = time + 15; { waituntil {vehicle _x == _x || !canmove _x || !alive _x || time > _timeout || movetofailed _x }; }foreach _unitsin; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; if (_fightmode == "fight" || _gothit) then { _npc setBehaviour "AWARE"; _groupOne = group _npc; _groupOne setFormation "DIAMOND"; [_npc,50] call MON_move; }; if (_fightmode == "fight") then { _pursue = true; }else { _pursue = false; _makenewtarget=true; }; }; }; }; //Si bajo ataque o aumenta el conocimiento se acelera la respuesta y se retoma el control de la AI if (_gothit ) then { _react = if (!_supressed) then {_react + 30}; if (_fightmode != "walk") then { if (_nowpType == 2) then {_nowp = false}; }; }; //Si no hay objetivo se anula la orden de persecucin if ((isNull (_target) || !alive _target )) then { _pursue=false; if (_gothit && !_fortify) then { if (_fightmode == "walk") then { //Podra tratarse de un sniper, mejor estar alerta y moverse por si acaso _Behaviour = "AWARE"; _speedmode = "FULL"; _unitpos = "AUTO"; _gothit = false; _makenewtarget = true; _waiting = -1; if (KRON_UPS_Debug>0) then {player sidechat format["%1: Have been damaged moving",_grpidx,_makenewtarget]}; } else { if (_react >= KRON_UPS_react && _lastreact >=_minreact && count _targets <= 0) then { //Nos disparan y no tenemos target, nos movemos de posicin if (KRON_UPS_Debug>0) then {player sidechat format["%1: Under fire by unkown target, moving to newpos",_grpidx]}; //Cubre al grupo con una granada de humo if (!_supressed && (random 100)<80) then { [_npc,_target] spawn MON_throw_grenade; }; _gothit = false; _makenewtarget = true; _waiting = -1; _pause="NOWAIT"; _speedmode = "FULL"; _unitpos = "middle"; _Behaviour = "AWARE"; }else{ if (_lastreact >=_minreact && !_targetdead) then { _targetdead = true; _pursue = true; //Nos hemos qdado sin objetivos continuamos la bsqueda if (KRON_UPS_Debug>0) then {player sidechat format["%1: Target defeated, searching",_grpidx]}; }; }; }; }; }; //If no fixed target check if current target is available if (format ["%1",_fixedtargetPos] != "[0,0]") then { //If fixed target check if close enough or near enemy and gothit if (([_currpos,_fixedtargetpos] call KRON_distancePosSqr) <= _closeenough || (_dist <= _closeenough && _gothit)) then { _fixedtargetPos = [0,0]; }else{ _pursue = false; _attackPos=_fixedtargetPos; if (_react >= KRON_UPS_react && _lastreact >=_minreact) then { _makenewtarget = true; _unitpos = "AUTO"; _speed = "FULL"; }; }; }; //If captive or surrended do not pursue if ( isnil "_attackPos") then {_pursue = false;}; if ( captive _target || format ["%1", _attackPos] == "[0,0]") then {_pursue = false;}; //If no waypoint do not move if (_nowp) then { _makenewtarget = false; _pursue = false; }; if (_inheli) then { _landing = _heli getVariable "UPSMON_landing"; if (isnil ("_landing")) then {_landing=false;}; if (_landing) then { _pursue = false; }; }; sleep 0.5; //********************************************************************************************************************** // PURSUE: SE INICIA LA PERSECUCIN DEL OBJETIVO //********************************************************************************************************************** //if (KRON_UPS_Debug>0) then {diag_log format["%1:pursue=%3 _react=%9 timeon=%4 targets=%5 _target=%6 captive=%11 _attackPos=%7 nowp=%8 _inheli=%10 _fixedtargetPos=%12 _fightmode=%13",_grpidx,_dist,_pursue,_timeontarget,count _targets, _target,_attackPos,_nowp,_react,_inheli,captive _target,_fixedtargetPos,_fightmode]}; if (_pursue) then { _pursue = false; _newpos = true; _react = 0; _lastreact = 0; _timeontarget = 0; _makenewtarget = false; _fm = 1; //Cancel supress effect when reaction time _supressed = false; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; // get position of spotted unit in player group, and watch that spot _targetPos = _attackPos; _targetX = _targetPos select 0; _targetY = _targetPos select 1; _currPos = getpos _npc; // also go into "combat mode" _pause="NOWAIT"; _waiting=0; // angle from unit to target _dir1 = [_currPos,_targetPos] call KRON_getDirPos; // angle from target to unit (reverse direction) _dir2 = (_dir1+180) mod 360; //Establecemos una distancia de flanqueo _flankdist = ((random 0.5)+0.7)*KRON_UPS_safedist; //La distancia de flanqueo no puede ser superior a la distancia del objetivo o nos pordra pillar por la espalda _flankdist = if ((_flankdist*1.40) >= _dist) then {_dist*.65} else {_flankdist}; if (_inheli) then {_flankdist = _flankdist / 2;}; // avoidance position (right or left of unit) _avoidPos = [_currPos,_dir2, KRON_UPS_safedist] call MON_GetPos2D; //Calculamos posicin de avance frontal _frontPos = [_targetPos,_dir2, _flankdist] call MON_GetPos2D; //Adaptamos el ngulo de flanqueo a la distancia _newflankAngle = ((random(KRON_UPS_flankAngle)+1) * 2 * (_flankdist / KRON_UPS_safedist )) + (KRON_UPS_flankAngle/1.4) ; if (_newflankAngle > KRON_UPS_flankAngle) then {_newflankAngle = KRON_UPS_flankAngle}; //Calculamos posicin de flanqueo 1 45 _dirf1 = (_dir2+_newflankAngle) mod 360; _flankPos = [_targetPos,_dirf1, _flankdist] call MON_GetPos2D; //Calculamos posicin de flanqueo 2 -45 _dirf2 = (_dir2-_newflankAngle+360) mod 360; _flankPos2 = [_targetPos,_dirf2, _flankdist] call MON_GetPos2D; if (KRON_UPS_Debug>0) then { "flank1" setmarkerpos _flankPos; "flank2" setmarkerpos _flankPos2; "target" setmarkerpos _attackPos; }; //Decidir por el mejor punto de flanqueo //Contamos las posiciones de destino de otros grupos ms alejadas _fldest = 0; _fldest2 = 0; _fldestfront = 0; _i = 0; { if (_i != _grpid && format ["%1", _x] != "[0,0]") then { _dist1 = [_x,_flankPos] call KRON_distancePosSqr; _dist2 = [_x,_flankPos2] call KRON_distancePosSqr; _dist3 = [_x,_frontPos] call KRON_distancePosSqr; if (_dist1 <= _flankdist/1.5 || _dist2 <= _flankdist/1.5 || _dist3 <= _flankdist/1.5) then { if (_dist1 < _dist2 && _dist1 < _dist3) then {_fldest = _fldest + 1;}; if (_dist2 < _dist1 && _dist2 < _dist3) then {_fldest2 = _fldest2 + 1;}; if (_dist3 < _dist1 && _dist3 < _dist2) then {_fldestfront = _fldestfront + 1;}; }; }; _i = _i + 1; }foreach KRON_targetsPos; //sleep 0.05; //Contamos las posiciones de otros grupos ms alejadas _i = 0; { if (_i != _grpid && !isnull(_x)) then { _dist1 = [getpos(_x),_flankPos] call KRON_distancePosSqr; _dist2 = [getpos(_x),_flankPos2] call KRON_distancePosSqr; _dist3 = [getpos(_x),_frontPos] call KRON_distancePosSqr; if (_dist1 <= _flankdist/1.5 || _dist2 <= _flankdist/1.5 || _dist3 <= _flankdist/1.5) then { if (_dist1 < _dist2 && _dist1 < _dist3) then {_fldest = _fldest + 1;}; if (_dist2 < _dist1 && _dist2 < _dist3) then {_fldest2 = _fldest2 + 1;}; if (_dist3 < _dist1 && _dist3 < _dist2) then {_fldestfront = _fldestfront + 1;}; }; }; _i = _i + 1; }foreach KRON_NPCs; //sleep 0.05; //La preferencia es la eleccin inicial de direccin switch (_flankdir) do { case 1: {_prov = 125}; case 2: {_prov = -25}; default {_prov = 50}; }; //Si es positivo significa que hay ms destinos existentes lejanos a la posicion de flanqueo1, tomamos primariamente este if (_fldest<_fldest2) then {_prov = _prov + 50;}; if (_fldest2<_fldest) then {_prov = _prov - 50;}; //Si la provablilidad es negativa indica que tomar el flank2 por lo tanto la provabilidad de coger 1 es 0 if (_prov<0) then {_prov = 0;}; //Evaluamos la direccin en base a la provablilidad calculada if ((random 100)<=_prov) then { _flankdir =1; _flankPos = _flankPos; _targettext = "_flankPos"; } else { _flankdir =2; _flankPos = _flankPos2; _targettext = "_flankPos2"; }; //Posicin de ataque por defecto el flanco _targetPos = _flankPos; _targettext = "_flankPos"; if ((surfaceIsWater _flankPos && !(_isplane || _isboat)) ) then { _targetPos = _attackPos;_targettext ="_attackPos"; _flankdir =0; } else { if (_fldestfront < _fldest && _fldestfront < _fldest2) then { _targetPos = _frontPos;_targettext ="_frontPos"; }; }; //Establecemos tipo de waypoint //con DESTROY tiene peor comportamiento y a veces no se mueven _wptype = "MOVE"; //Establecer velocidad y modo de combate _rnd = random 100; if ( _dist <= _closeenough ) then { //Si estamos muy cerca damos prioridad a fuego a discreccin if ( _dist <= _closeenough/2 ) then { //Modo combate cerrado _speedmode = "LIMITED"; _wpformation = "LINE"; _unitpos = "Middle"; _react = _react + KRON_UPS_react / 2; _minreact = KRON_UPS_minreact / 2; if ((_nomove == "NOMOVE" && _rnd < 25) && !_reinforcementsent) then { //Combate defensivo _Behaviour = "STEALTH"; _wptype = "HOLD"; } else { _Behaviour = "COMBAT"; _wptype = "MOVE"; } }else{ //Si la tropa tiene el rol de no moverse tender a mantener la posicin _speedmode = "FULL"; _wpformation = "WEDGE"; _unitpos = "Middle"; _minreact = KRON_UPS_minreact / 1.5; if ((_nomove == "NOMOVE" && _rnd < 50) && !_reinforcementsent) then { //Combate defensivo _Behaviour = "COMBAT"; _wptype = "HOLD"; } else { _Behaviour = "AWARE"; _wptype = "MOVE"; }; }; } else { if (( _dist <= (_closeenough + KRON_UPS_safedist))) then { _speedmode = "FULL"; _wpformation = "WEDGE"; _unitpos = if (_rnd < 90) then {"Middle"}else{"AUTO"}; _minreact = KRON_UPS_minreact; if ((_nomove=="NOMOVE" && _rnd < 75) && !_reinforcementsent) then { //Combate defensivo _Behaviour = "AWARE"; _wptype = "HOLD"; }else{ //Movimiento con precaucin (ms rpido) _Behaviour = "AWARE"; _wptype = "MOVE"; }; } else { //In distance of radio patrol may act. if (( _dist < KRON_UPS_sharedist )) then { //Pelotn lejos del objetivo hay que desplazarse rpido y directo al punto _Behaviour = "AWARE"; _speedmode = "FULL"; _unitpos = if (_rnd < 60) then {"Middle"}else{"AUTO"}; _minreact = KRON_UPS_minreact * 2; if ((_nomove=="NOMOVE" && _rnd < 95) && !_reinforcementsent) then { _wptype = "HOLD"; _wpformation = "WEDGE"; }else{ _wptype = "MOVE"; _wpformation = "WEDGE"; }; } else { //Pelotn muy muy lejos del objetivo si es rol nomove no se movern _Behaviour = "SAFE"; _speedmode = "FULL"; _unitpos = "AUTO"; _minreact = KRON_UPS_minreact * 3; if (((_nomove=="NOMOVE") || (_nomove=="MOVE" && _rnd < 70)) && !_reinforcementsent) then { _wptype = "HOLD"; _wpformation = "WEDGE"; }else{ _wptype = "MOVE"; _wpformation = "COLUMN"; }; }; }; }; //Las escuadras fortificadas mantienen siempre la posicin if ( _fortify && (random 100)<99) then {_wptype = "HOLD"}; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //If leader is in vehicle will move in anyway if (vehicle (_npc) != _npc || !_isman) then { _wptype = "MOVE"; _Behaviour = "AWARE"; if ( _inheli ) then { _speedmode = "FULL"; _unitpos = "AUTO"; if ( (random 100)<60 ) then { _targetPos = _AttackPos; }; }; }; //Establecemos el target KRON_targetsPos set [_grpid,_targetPos]; sleep .05; //If use statics are enabled leader searches for static weapons near. // Tanks enemies are contabiliced if ( KRON_UPS_useMines && _Mines > 0 ) then { _enemytanksnear = false; { if ( ("Tank" countType [_x] > 0 || "Wheeled_APC" countType [_x] >0 || "Tank" countType [vehicle _x] > 0 || "Wheeled_APC" countType [vehicle _x] >0 ) && alive _x && canMove _x && _npc distance _x <= _closeenough + KRON_UPS_safedist ) exitwith { _enemytanksnear = true; _enemytanknear = _x;}; }foreach _targets; //If use mines are enabled and enemy armors near and no friendly armor put mine. if ( _enemytanksnear && !isnull _enemytanknear && alive _enemytanknear ) then { _friendlytanksnear = false; { if (!( alive _x && canMove _x)) then {_friendlytanks = _friendlytanks - [_x]}; if (alive _x && canMove _x && _npc distance _x <= _closeenough + KRON_UPS_safedist ) exitwith { _friendlytanksnear = true;}; }foreach _friendlytanks; if (!_friendlytanksnear && random(100)<30 ) then { _dir1 = [_currPos,position _enemytanknear] call KRON_getDirPos; _mineposition = [position _npc,_dir1, 25] call MON_GetPos2D; _roads = _mineposition nearroads 50; if (count _roads > 0) then {_mineposition = position (_roads select 0);}; if ([_npc,_mineposition] call MON_CreateMine) then { _Mines = _Mines -1; if (KRON_UPS_Debug>0) then {player sidechat format["%1: %3 puting mine for %2",_grpidx,typeof _enemytanknear, side _npc]}; }; }; }; }; //Si es unidad de refuerzo siempre acosar al enemigo if (_reinforcementsent) then { _wptype="MOVE"; _newpos=true; _makenewtarget = false; }; if (_nofollow=="NOFOLLOW" && _wptype != "HOLD") then { _targetPos = [_targetPos,_centerpos,_rangeX,_rangeY,_areadir] call KRON_stayInside; _targetdist = [_currPos,_targetPos] call KRON_distancePosSqr; if ( _targetdist <= 1 ) then { _wptype="HOLD"; }; }; if (_wptype == "HOLD") then { _targetPos = _currPos; _targettext ="_currPos"; }; _lastknown = _opfknowval; //Se actualiza con el ltimo valor, por si cambia el target //Si por el motivo que sea se cancela la nueva posicin se deben limpiar los parmetros que hacen entrar en pursuit if (!_newpos) then { //Si la unidad ha decidio mantener posicin pero est siendo atacada est siendo suprimida, debe tener la oportunidad de reaccionar _newpos = _gothit; if (!_newpos) then { _targetPos=_lastpos; if (KRON_UPS_Debug>0) then {player sidechat format["%1 Mantaining orders %2",_grpidx,_nomove]}; }; }; if (KRON_UPS_Debug>=1) then { "avoid" setmarkerpos _avoidPos; "flank" setmarkerpos _flankPos; _destname setMarkerPos _targetPos; }; }; //END PURSUE }; //((_issoldier) && ((count _enemies)>0) sleep 0.5; //********************************************************************************************************************** // SIN NOVEDADES //********************************************************************************************************************** if !(_newpos) then { // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; // calculate new distance // if we're waiting at a waypoint, no calculating necessary _currpos = getpos _npc; //Sets behaviour of squad if nearly changes of target if (_targetsnear) then{ if( toUpper(_Behaviour) IN _safemode) then { _Behaviour = "AWARE"; _npc setBehaviour _Behaviour; }; }; //If in safe mode if find dead bodies change behaviour if( toUpper(_Behaviour) IN _safemode) then { _unitsin = [_npc,_buildingdist] call MON_deadbodies; if (count _unitsin > 0) then { _Behaviour = "AWARE"; _react = _react + 30; _npc setBehaviour _Behaviour; if (KRON_UPS_Debug>0) then {player sidechat format["%1 dead bodies found! set %2",_grpidx,_Behaviour, count _targets]}; }; }; //Stuck control if (!_nowp && alive _npc && canmove _npc && _wptype == "MOVE" && _timeontarget >= 60 && _lastcurrpos select 0 == _currpos select 0 && _lastcurrpos select 1 == _currpos select 1) then { [_npc] call MON_cancelstop; _makenewtarget = true; if (KRON_UPS_Debug>0) then {player sidechat format["%1 stucked, moving",_grpidx]}; }; _lastpos = _targetPos; _lastcurrpos = _currpos; //sets last currpos for avoiding stuk if (_waiting<0) then { //Gets distance to targetpos _targetdist = [_currPos,_targetPos] call KRON_distancePosSqr; //Se evalua si se ha excedido el tiempo mximo de espera y el objetivo ya est abatido para retornar a la posicin inicial. if (_fightmode!="walk") then { if (_timeontarget > KRON_UPS_alerttime && count _targets <= 0 && ( isNull (_target) || !alive (_target) || captive _target)) then { _pursue = false; _gothit = false; _targetdead = true; _fightmode = "walk"; _speedmode = _orgSpeed; _targetPos = _currPos; _reinforcementsent = false; _nowp = _orignowp; _target = objnull; _fixedtargetPos = [0,0]; _Behaviour = _orgMode; _waiting = -1; _unitpos = "AUTO"; _wpformation = "WEDGE"; KRON_UPS_reinforcement = false; //ya no hay amenaza if (_rfid > 0 ) then { call (compile format ["KRON_UPS_reinforcement%1 = false;",_rfid]); }; {[_x,"AUTO"] spawn MON_setUnitPos;} foreach units _npc; _npc setBehaviour _orgMode; if (KRON_UPS_Debug>0) then {player sidechat format["%1 Without objectives, leaving combat mode",_grpidx]}; }; }; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 _targetdist %2 atdist=%3 dist=%4",_grpidx, _targetdist, _area/8,_dist]}; // if not in combat and we're either close enough, seem to be stuck, or are getting damaged, so find a new target if (!_nowp && (!_gothit) && (!_swimming) && (_fightmode == "walk") && (( _targetdist <= (_area/4) || moveToFailed _npc) && (_timeontarget > KRON_UPS_maxwaiting))) then { _makenewtarget=true; _unitpos = "AUTO"; _Behaviour = _orgMode; }; // make new target if (_makenewtarget) then { _gothit=false; _react = 0; _lastreact = 0; _makenewtarget = false; _gothit=false; _timeontarget = 0; _wptype = "MOVE"; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 _fixedtargetPos %2 dist %3 ",_grpidx,_fixedtargetPos,_dist]}; if (format ["%1",_fixedtargetPos] !="[0,0]") then { _targetPos = _fixedtargetPos; _targettext ="Reinforcement"; }else{ if (KRON_UPS_Debug>0) then {player sidechat format["%1 Patrol to new position",_grpidx]}; if ((_nomove=="NOMOVE") && (_timeontarget>KRON_UPS_alerttime)) then { if (([_currPos,_orgPos] call KRON_distancePosSqr)<_closeenough) then { _newpos = false; _wptype = "HOLD"; _waiting = 9999; if (_fortify) then { _minreact = KRON_UPS_minreact * 3; _buildingdist = _buildingdist * 2; _wait = 3000; }; } else { _targetPos=_orgPos; _targettext ="_orgPos"; }; } else { // re-read marker position/size _centerpos = getMarkerPos _areamarker; _centerX = abs(_centerpos select 0); _centerY = abs(_centerpos select 1); _centerpos = [_centerX,_centerY]; _areasize = getMarkerSize _areamarker; _rangeX = _areasize select 0; _rangeY = _areasize select 1; _areadir = (markerDir _areamarker) * -1; // find a new target that's not too close to the current position _targetPos=_currPos; _targettext ="newTarget"; _tries=0; while {((([_currPos,_targetPos] call KRON_distancePosSqr) < _mindist)) && (_tries<20)} do { _tries=_tries+1; // generate new target position (on the road) _road=0; while {_road<20} do { _targetPos=[_centerX,_centerY,_rangeX,_rangeY,_cosdir,_sindir,_areadir] call KRON_randomPos; _road=[_targetPos,(_isplane||_isboat),_road] call KRON_OnRoad; }; }; }; }; sleep 0.05; // distance to target position _avoidPos = [0,0]; _flankPos = [0,0]; _attackPos = [0,0]; _frontPos = [0,0]; _fm=0; _newpos=true; }; }; }; // if in water, get right back out of it again if (surfaceIsWater _currPos) then { if (_isman && !_swimming) then { _drydist=999; // look around, to find a dry spot for [{_a=0}, {_a<=270}, {_a=_a+90}] do { _dp=[_currPos,30,_a] call KRON_relPos; if !(surfaceIsWater _dp) then {_targetPos=_dp}; }; _newpos=true; _swimming=true; }; } else { _swimming=false; }; sleep 0.5; //********************************************************************************************************************** // NEWPOS: SE EJECUTA LA ORDEN DE MOVIMIENTO //********************************************************************************************************************** // if (KRON_UPS_Debug>0) then {player sidechat format["%1 rea=%2 wai=%3 tim=%4 tg=%5 %6",_grpidx,_react,_waiting,_timeontarget,typeof _target,alive _target]}; if ((_waiting<=0) && _newpos) then { // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; _currPos = getpos _npc; _newpos = false; _waiting = -1; _swimming=false; _GetIn_NearestVehicles = false; //Gets distance to targetpos _targetdist = [_currPos,_targetPos] call KRON_distancePosSqr; //If gothit and not in vehicle if (_gothit && _npc == vehicle (_npc) && alive _npc ) then { //Unidad suprimida if ((random 100)<50) then { //if (KRON_UPS_Debug>0) then {player sidechat format["%1 supressed by fire",_grpidx]}; //La unidad est suprimida, borramos el waypoint actual _supressed = true; _targetPos = _currPos; _targettext ="SUPRESSED"; _wptype = "HOLD"; //Cuerpo a tierra { //Se anula el movimiento if ( _x iskindof "Man" && canmove _x && alive _x) then { if ((random 100)<40 || (primaryWeapon _x ) in KRON_UPS_MG_WEAPONS) then {[_x,"DOWN",20] spawn MON_setUnitPosTime; }else{ [_x,"Middle"] spawn MON_setUnitPos;}; }; } foreach units _npc; sleep 0.05; //Retirada!! if ((random 100)<=60 && morale _npc < 0) then { _targetPos = _avoidPos;_targettext = "_avoidPos"; _wptype = "MOVE"; _flankdir = 0; if (!_newpos && KRON_UPS_Debug>0) then {player sidechat format["%1 All Retreat!!!",_grpidx]}; }; }; //Animacin croqueta { if ( (random 100)<20) then { _x spawn MON_animCroqueta; }; } foreach units _npc; //Cubre al grupo con una granada de humo if ((random 100)<30 || _targettext == "_avoidPos") then { //[_npc,_target] call MON_throw_grenade; }; sleep 0.5; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //Si no ha sido suprimida continuamos el avance if (alive _npc) then { _currPos = getpos _npc; if ( _wptype == "MOVE") then { //Try to avoid stucked soldiers out of vehicles if ( _npc == vehicle _npc) then { { if (alive _x && canmove _x) then { //[_x] spawn MON_cancelstop; [_x] dofollow _npc; }; }foreach _members; }; sleep 0.05; //Search for vehicle if (!_gothit && _targetdist >= ( KRON_UPS_searchVehicledist )) then { if ( vehicle _npc == _npc && _dist > _closeenough ) then { _unitsIn = [_grpid,_npc] call MON_GetIn_NearestVehicles; if ( count _unitsIn > 0) then { _GetIn_NearestVehicles = true; _speedmode = "FULL"; _unitpos = "AUTO"; _npc setbehaviour "CARELESS"; _npc setspeedmode "FULL"; _timeout = time + 60; _vehicle = objnull; _vehicles = []; { waituntil {vehicle _x != _x || !canmove _x || !canstand _x || !alive _x || time > _timeout || movetofailed _x}; if ( vehicle _x != _x && (isnull _vehicle || _vehicle != vehicle _x)) then { _vehicle = vehicle _x ; _vehicles = _vehicles + [_vehicle] }; }foreach _unitsIn; sleep 1; { _vehicle = _x; _cargo = _vehicle getvariable ("UPSMON_cargo"); if ( isNil("_cargo")) then {_cargo = [];}; _cargo ordergetin true; //Wait for other groups to getin { waituntil {vehicle _x != _x || !canmove _x || !canstand _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _cargo; //Starts gunner control [_vehicle] spawn MON_Gunnercontrol; //Resets vehicle id and cargo _vehicle setVariable ["UPSMON_grpid", 0, false]; _vehicle setVariable ["UPSMON_cargo", [], false]; } foreach _vehicles; //Cheks if leader has dead until wait _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc) exitwith {exit=true;}; if ( "Air" countType [vehicle (_npc)]>0) then { _rnd = (random 2) * 0.1; _flyInHeight = round(KRON_UPS_flyInHeight * (0.9 + _rnd)); vehicle _npc flyInHeight _flyInHeight; //Si acaba de entrar en el heli se define punto de aterrizaje if (_GetIn_NearestVehicles) then { _GetOutDist = round(((KRON_UPS_paradropdist ) * (random 100) / 100 ) + 150); [vehicle _npc, _TargetPos, _GetOutDist,_flyInHeight] spawn MON_doParadrop; //Execute control stuck for helys [vehicle _npc] spawn MON_HeliStuckcontrol; //if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: flyingheiht=%2 paradrop at dist=%3",_grpidx, _flyInHeight, _GetOutDist,_rnd]}; }; }; }; }; }; }; sleep 0.05; //Get in combat vehicles if (!_gothit && !_GetIn_NearestVehicles && _fightmode != "walk" ) then { _dist2 = _dist / 4; if ( _dist2 <= 100 ) then { _unitsIn = []; _unitsIn = [_grpid,_npc,_dist2,false] call MON_GetIn_NearestCombat; _timeout = time + (_dist2/2); if ( count _unitsIn > 0) then { if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Geting in combat vehicle targetdist=%2",_grpidx,_npc distance _target]}; _npc setbehaviour "CARELESS"; _npc setspeedmode "FULL"; { waituntil {vehicle _x != _x || !canmove _x || !canstand _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _unitsIn; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //Return to combat mode _npc setbehaviour _Behaviour; _timeout = time + 180; { waituntil {vehicle _x != _x || !canmove _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _unitsIn; { if ( vehicle _x iskindof "Air") then { //moving hely for avoiding stuck if (driver vehicle _x == _x) then { _vehicle = vehicle (_x); [_vehicle,1000] spawn MON_domove; //Execute control stuck for helys [_vehicle] spawn MON_HeliStuckcontrol; if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Geting in combat vehicle after",_grpidx,_npc distance _target]}; }; }; if (driver vehicle _x == _x) then { //Starts gunner control [vehicle _x] spawn MON_Gunnercontrol; }; }foreach _unitsIn; }; sleep 0.05; }; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //If use statics are enabled leader searches for static weapons near. if (KRON_UPS_useStatics && (vehicle _npc == _npc) && !_GetIn_NearestVehicles && ((_wptype == "HOLD" && (random 100) < 80) || (_wptype != "HOLD" && (random 100) < 60))) then { _unitsIn = [_grpid,_npc,_buildingdist] call MON_GetIn_NearestStatic; if ( count _unitsIn > 0) then { _npc setbehaviour "CARELESS"; _npc setspeedmode "FULL"; _timeout = time + 60; { waituntil {vehicle _x != _x || !canmove _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _unitsIn; }; sleep 0.05; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //Buildings usage. if (!_GetIn_NearestVehicles) then { if ( _wptype == "HOLD" && vehicle _npc == _npc && ( _fortify ||(random 100) < 60) ) then { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Moving to nearest buildings",_grpidx]}; [_npc,_buildingdist,false,_wait] spawn MON_moveNearestBuildings; } else { //If we are close enough patrol in buildings for searching enemies if ((( _wptype != "HOLD" && vehicle _npc == _npc && (random 100) < 90 ) && _npc == vehicle _npc && _dist <= ( _closeenough ))) then { [_npc,_buildingdist,true] spawn MON_moveNearestBuildings; }; }; sleep 0.05; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc) exitwith {exit=true;}; if (isnull _grp || _grp != group _npc) then { _grp = group _npc; }; _index = currentWaypoint _grp; //Si el waypoing es distinto del que tiene o es diferente de hold lo establecemos IF (_wptype != "HOLD" || _lastwptype != _wptype) then { //No haq waypoints o estn completados //_index = 1 Waypoint por defecto, no usar. if ( _index == 1 || _index > count waypoints _grp && !isnull _grp) then { _wp = _grp addWaypoint [_targetPos, 0]; _index = _wp select 1; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: created wp %2 index %3",_grpidx,_wp, _index]}; } else { _wp = [_grp,_index]; //if (KRON_UPS_Debug>0) then {player globalchat format["%1: not created wp %2 index %3 %4",_grpidx,_wp, _index,_targetPos]}; }; }; _wp = [_grp,_index]; //Definimos los parmetros del nuevo waypoint _wp setWaypointType _wptype; _wp setWaypointPosition [_targetPos, 0]; _wp setWaypointFormation _wpformation; _wp setWaypointSpeed _speedmode; _lastwptype = _wptype; //Si tiene ms de 2 waypoints borramos los obsoletos { if ( _x select 1 < _index ) then { deleteWaypoint _x; }; }foreach waypoints _grp; sleep 0.05; //if (KRON_UPS_Debug>0) then {diag_log format["%1: waypoints %2 %3 %4 %5",_grpidx,count waypoints _grp, _grp, group _npc, group (leader _npc)]}; //Sets behaviour if (toupper(behaviour _npc) != toupper (_Behaviour)) then { _npc setBehaviour _Behaviour; }; //Refresh position vector KRON_targetsPos set [_grpid,_targetPos]; //Aunque haya predefinido un tipo de movimiento se dejar un pequeo porcentaje para variar a nivel individual { if ((random 100)<95 && _x == vehicle _x && _x iskindof "Man" && !((primaryWeapon _x ) in KRON_UPS_MG_WEAPONS)) then { [_x,_unitpos] spawn MON_setUnitPos; }else{ [_x,"AUTO"] spawn MON_setUnitPos; }; } foreach units _npc; //If closeenough will leave some soldiers doing supress fire if (_gothit || _dist <= _closeenough) then { { if (!canStand _x || ((primaryWeapon _x ) in KRON_UPS_MG_WEAPONS) || (vehicle _x == _x && _x iskindof "Man" && (random 100) < 50) ) then { _x suppressFor 20; }; } foreach units _npc; }; }; _gothit=false; //moving //if (KRON_UPS_Debug>0) then {player sidechat format["%1: %2 %3 %4 %5 %6 %7 %8 %9 %10",_grpidx, _wptype, _targettext,_dist, _speedmode, _unitpos, _Behaviour, _wpformation,_fightmode,count waypoints _grp];}; };//if ((_waiting<=0) && _newpos) then { if (_track=="TRACK") then { switch (_fm) do { case 1: {_destname setmarkerSize [.4,.4]}; case 2: {_destname setmarkerSize [.6,.6]}; default {_destname setmarkerSize [.5,.5]}; }; _destname setMarkerPos _targetPos; }; //If in hely calculations must done faster if (_isplane || _inheli) then {_currcycle = _cycle/2}; if ((_exit) || (isNil("_npc"))) then { _loop=false; } else { // slowly increase the cycle duration after an incident sleep _currcycle; }; };//while {_loop} if (KRON_UPS_Debug>0) then {hint format["%1 exiting mainloop",_grpidx]}; //Limpiamos variables globales de este grupo KRON_targetsPos set [_grpid,[0,0]]; KRON_NPCs set [_grpid,objnull]; KRON_UPS_Exited=KRON_UPS_Exited+1; if (_track=="TRACK") then { //_trackername setMarkerType "Dot"; _trackername setMarkerType "Empty"; _destname setMarkerType "Empty"; }; //Gets dist from orinal pos if (!isnull _target) then { _dist = ([_orgpos,position _target] call KRON_distancePosSqr); }; if (KRON_UPS_Debug>0) then {player sidechat format["%1 _dist=%2 _closeenough=%3",_grpidx,_dist,_closeenough]}; //does respawn of group if (_respawn && _respawnmax > 0 && !_surrended && _dist > _closeenough) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1 doing respawn",_grpidx]}; // copy group leader _unittype = _membertypes select 0; // make the clones civilians // use random Civilian models for single unit groups if ((_unittype=="Civilian") && (count _members==1)) then {_rnd=1+round(random 20); if (_rnd>1) then {_unittype=format["Civilian%1",_rnd]}}; _grp=createGroup _side; _lead = _grp createUnit [_unittype, _orgpos, [], 0, "form"]; _lead setVehicleInit _initstr; [_lead] join _grp; _grp selectLeader _lead; //sleep 1; // copy team members (skip the leader) _c=0; { _c=_c+1; if (_c>1) then { _newunit = _grp createUnit [_x, _orgpos, [],0,"form"]; _newunit setVehicleInit _initstr; [_newunit] join _grp; }; } foreach _membertypes; { _targetpos = _orgpos findEmptyPosition [10, 200]; sleep .4; if (count _newpos <= 0) then {_targetpos = _orgpos}; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 create vehicle _newpos %2 ",_x,_targetpos]}; _newunit = _x createvehicle (_targetpos); } foreach _vehicletypes; //Set new parameters if (!_spawned) then {_UCthis = _UCthis + ["SPAWNED"]}; _UCthis set [0,_lead]; _respawnmax = _respawnmax - 1; _UCthis = ["RESPAWN:",_respawnmax,_UCthis] call KRON_UPSsetArg; //Exec UPSMON script _UCthis SPAWN UPSMON; processInitCommands; }; _friends=nil; _enemies=nil; _enemytanks = nil; _friendlytanks = nil; _roads = nil; _targets = nil; _members = nil; _membertypes = nil; _UCthis = nil; if (!alive _npc) then { deleteGroup _grp; }; if(true) exitWith {}; I%,r nb2P