/*%FSM*/ /*%FSM*/ /* item0[] = {"flock_member",0,250,-50.000000,-150.000000,50.000000,-100.000000,0.000000,"flock member"}; item1[] = {"pre_vars",4,218,75.000000,0.000000,175.000000,50.000000,90.000000,"pre vars"}; item2[] = {"do",2,250,-50.000000,0.000000,50.000000,50.000000,0.000000,"do"}; item3[] = {"start",8,218,-50.000000,-75.000000,50.000000,-25.000000,0.000000,"start"}; item4[] = {"cohesion",4,218,-50.000000,75.000000,50.000000,125.000000,70.000000,"cohesion"}; item5[] = {"separation",4,218,-175.000000,75.000000,-75.000000,125.000000,60.000000,"separation"}; item6[] = {"alignment",4,218,75.000000,75.000000,175.000000,125.000000,80.000000,"alignment"}; item7[] = {"apply",4,4314,-175.000000,0.000000,-75.000000,50.000000,50.000000,"apply"}; item8[] = {"end",1,250,-175.000000,-150.000000,-75.000000,-100.000000,0.000000,"end"}; item9[] = {"dead",4,218,-175.000000,-75.000000,-75.000000,-25.000000,100.000000,"dead"}; item10[] = {"debug",4,218,75.000000,-75.000000,175.000000,-25.000000,0.000000,"debug"}; link0[] = {0,3}; link1[] = {1,2}; link2[] = {2,1}; link3[] = {2,4}; link4[] = {2,5}; link5[] = {2,6}; link6[] = {2,7}; link7[] = {2,9}; link8[] = {2,10}; link9[] = {3,2}; link10[] = {4,2}; link11[] = {5,2}; link12[] = {6,2}; link13[] = {7,2}; link14[] = {9,8}; link15[] = {10,2}; globals[] = {25.000000,1,0,0,0,640,480,1,15,6316128,1,-290.597351,361.043304,268.212158,-321.329132,808,731,1}; window[] = {2,-1,-1,-1,-1,775,150,1350,150,3,826}; *//*%FSM*/ class FSM { fsmName = "flock"; class States { /*%FSM*/ class flock_member { name = "flock_member"; init = /*%FSM*/"//" \n "//Flocking Behaviour AI" \n "//" \n "//An attempt to make UAVs fly with flock / bird like behaviour." \n "//" \n "//" \n "//CONTROLS:" \n "//" \n "//INS / DEL - Alignment Up / Down" \n "//Home / End - Cohesion Up / Down" \n "//PG Up / Pg Dn - Separate up / Down" \n "//Up / Down Arrow - Speed Up / Down" \n "//Left / Right Arrow - Script Speed Up / Down" \n "" \n "_unit = _this select 0;" \n "_trgt = player;" \n "_doCheck = 100;" \n "_zPos = 48;" \n "_neighborzone = [0,6];" \n "_relativeZone = [6,800];" \n "_t = diag_tickTime;" \n "_running =false;" \n "_inclPlayer = false;" \n "" \n "_defaultAlign = 0.08;" \n "_defaultCohese = 0.24;" \n "_defaultSeparate = 0.66;" \n "_defaultSpeed = 5.5 ;" \n "_defaultResponse = 0.8;" \n "" \n "//Control Vars" \n "if (isNil ""axeLoopTime"")then{" \n "axeLoopTime = _defaultResponse;" \n "};" \n "" \n "_loopTimeRand = random (axeLoopTime / 10);" \n "" \n "if (isNil ""axeSpeed"")then{" \n "axeSpeed = _defaultSpeed;" \n "};" \n "if (isNil ""axeWeightAlign"")then{" \n "axeWeightAlign = _defaultAlign;" \n "};" \n "if (isNil ""axeWeightCohese"")then{" \n "axeWeightCohese = _defaultCohese;" \n "};" \n "if (isNil ""axeWeightSpearate"")then{" \n "axeWeightSpearate =_defaultSeparate;" \n "};" \n "" \n "" \n "_rtrnVectorDist = {" \n "_v1 = _this select 0;" \n "_v2 = _this select 1;" \n "_out = sqrt (((_v2 select 0) - (_v1 select 0)) ^ 2 + ((_v2 select 1) - (_v1 select 1)) ^ 2 + ((_v2 select 2) - (_v1 select 2)) ^ 2);" \n "_out" \n "};" \n "" \n "" \n "" \n "" \n "" \n "//Debug" \n "_debugDo = true;" \n "_debugTime = 1;" \n "_d = _t;" \n "_debugMrkrName = """";" \n "" \n "" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class start { priority = 0.000000; to="do"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"true"/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class do { name = "do"; init = /*%FSM*/""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class dead { priority = 100.000000; to="end"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"!alive _unit"/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class pre_vars { priority = 90.000000; to="do"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doCheck > 90 && diag_tickTime - _t > (axeLoopTime + _loopTimeRand) && !_running"/*%FSM*/; action=/*%FSM*/"" \n "_running = true;" \n "_neighbourCount = 0;" \n "_validNeighbourCount = 0;" \n "" \n "_allElements = [];" \n "_neighboursIn = nearestObjects [_unit,[""UAV_01_base_F""],_neighborzone select 1];" \n "_neighbours = [];" \n "_relativesIn = nearestObjects [_unit,[""UAV_01_base_F""],_relativeZone select 1];" \n "_relatives = [];" \n "" \n "if(_inclPlayer)then{" \n "_neighboursIn pushBack player;" \n "_relativesIn pushBack player;" \n "};" \n "" \n "//Clean Zones" \n "" \n "{" \n "" \n " if(_x distance _unit > (_neighborzone select 0))then{" \n " _neighbours pushBack _x;" \n " };" \n "" \n " " \n "" \n "}forEach _neighboursIn;" \n "" \n "{" \n "" \n " if(_x distance _unit > (_relativeZone select 0))then{" \n " _relatives pushBack _x;" \n " };" \n "" \n "_allElements pushBack _x;" \n "" \n "}forEach _relativesIn;" \n "" \n "" \n "" \n "" \n "_neighbourCount = count _neighbours;" \n "_relativeCount = count _relatives;" \n "" \n "_unitPos = getPosATL _unit;" \n "axeLineStart = _unitPos;" \n "_posZ = _unitPos select 2;" \n "" \n "//Alignment" \n "_vectorAlOut = [0,0,0];" \n "_vectorAl = [0,0,0];" \n "_velXal = 0;" \n "_velYal = 0;" \n "//Additional" \n "_dirTo = 0;" \n "" \n "//Cohesion" \n "_vectorCoh = [0,0,0];" \n "_posXco = 0;" \n "_posYco = 0;" \n "" \n "//Separation" \n "_vectorSep = [0,0,0];" \n "_vectorDist = [];" \n "_vectorSepOut = [];" \n "_posXSe = 0;" \n "_posYSe = 0;" \n "_posZSe = 0;" \n "" \n "//Output" \n "_velX = 0;" \n "_velY = 0;" \n "_velOut = [];" \n "_velocity = nil;" \n "" \n "_doCheck = 90;" \n ""/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class alignment { priority = 80.000000; to="do"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doCheck > 80 && _running"/*%FSM*/; action=/*%FSM*/"_validNeighbourCount = 0;" \n "if(_relativeCount > 0)then{" \n "" \n " {" \n "" \n " if(_x != _unit)then{" \n " " \n " if(alive _x)then{" \n " " \n " _velXal = _velXal + ((velocity _x) select 0);" \n " _velYal = _velYal + ((velocity _x) select 1);" \n " _validNeighbourCount = _validNeighbourCount + 1;" \n " _dirTo = _dirTo + ([getPosATL _unit, getPosATL _x] call BIS_fnc_dirTo);" \n "" \n " };" \n "" \n " };" \n " " \n " }forEach _allElements;" \n "" \n "_velXal = _velXal / _validNeighbourCount;" \n "_velYal = _velYal / _validNeighbourCount;" \n "" \n "_dirTo = _dirTo / _validNeighbourCount;//Experiment with direction" \n "" \n "_vectorAlOut set [0, _velXal];" \n "_vectorAlOut set [1, _velYal];" \n "" \n "_vectorAl = vectorNormalized _vectorAlOut; " \n "" \n "};" \n "" \n "" \n "" \n "_doCheck = 80;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class cohesion { priority = 70.000000; to="do"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doCheck > 70 && _running"/*%FSM*/; action=/*%FSM*/" _validNeighbourCount = 0;" \n "if(_relativeCount > 0)then{" \n "" \n " {" \n "" \n " if(_x != _unit)then{" \n " " \n " if(alive _x)then{" \n " " \n " _posXco = _posXco + (getPosATL _x select 0);" \n " _posYco = _posYco + (getPosATL _x select 1);" \n " _validNeighbourCount = _validNeighbourCount + 1;" \n " " \n " };" \n "" \n " };" \n " " \n " }forEach _relatives;" \n "" \n "_posXco = _posXco / _validNeighbourCount;" \n "_posYco = _posYco / _validNeighbourCount;" \n "" \n "_vectorCoh = [_unitPos select 0,_unitPos select 1,_posZ] vectorDiff [_posXco,_posYco,_posZ];" \n "" \n "};" \n "" \n "" \n " " \n "_doCheck = 70;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class separation { priority = 60.000000; to="do"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doCheck > 60 && _running"/*%FSM*/; action=/*%FSM*/"" \n "if(count _neighbours > 0)then{" \n "" \n " {" \n "" \n " if(_x != _unit)then{" \n " " \n " if(alive _x)then{" \n "" \n " _posXse = _posXse + (getPosATL _x select 0);" \n " _posYse = _posYse + (getPosATL _x select 1);" \n " _validNeighbourCount = _validNeighbourCount + 1;" \n " };" \n "" \n " };" \n " " \n " }forEach _neighbours;" \n "" \n "_posXse = _posXse / _validNeighbourCount;" \n "_posYse = _posYse / _validNeighbourCount;" \n "" \n "_posXse =_posXse * -1;" \n "_posYse =_posYse * -1;" \n "_posZSe =_posZSe * -1;" \n "" \n "_vectorSep = [_unitPos select 0,_unitPos select 1,_posZ] vectorDiff [_posXse,_posYse,_posZSe];" \n "" \n "};" \n "" \n "" \n "_doCheck = 60;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class apply { priority = 50.000000; to="do"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doCheck > 50 && _running"/*%FSM*/; action=/*%FSM*/"" \n "_velX = ((_vectorAl select 0) * axeWeightAlign) + ((_vectorCoh select 0) * axeWeightCohese) + ((_vectorSep select 0) * axeWeightSpearate);" \n "_velY = ((_vectorAl select 1) * axeWeightAlign) + ((_vectorCoh select 1) * axeWeightCohese) + ((_vectorSep select 1) * axeWeightSpearate);" \n "_velZ = 0;" \n "" \n "if(_unitPos select 2 < 6)then{" \n "_velZ = 10;" \n "};" \n "_velOut = [_velX, _velY, _velZ];" \n "_velocity = vectorNormalized _velOut; " \n "" \n "//Speed" \n "" \n "_velocity set [0, (_velocity select 0) * axeSpeed];" \n "_velocity set [1, (_velocity select 1) * axeSpeed];" \n "" \n "" \n "_unit setDir _dirTo;//Additional - Trying to fix the spreading issue" \n "" \n "" \n "//_unit limitSpeed axeSpeed; " \n "//_unit setVelocity (_unit modelToWorld _velOut);" \n "_unit setVelocity ( (velocity _unit) vectorDiff _velocity);" \n "" \n "_doCheck = 100;" \n "_t = diag_tickTime;" \n "_loopTimeRand = random (axeLoopTime / 3);" \n "_running = false;" \n "" \n "" \n "//DEBUG" \n "//systemchat format [""%1 | %2"", ( (getposatl _unit) vectorDiff _velocity), _velocity];" \n "axeLineFinish = (_unit modelToWorld _velocity);"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class debug { priority = 0.000000; to="do"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_debugDo && diag_ticKtime - _d > _debugTime"/*%FSM*/; action=/*%FSM*/"" \n "" \n "_pos = getPosATl _unit;" \n "deleteMarkerLocal _debugMrkrName;" \n "_debugMrkrName = format[""axe%1"", name _unit];" \n "_mkr = createMarkerLocal [_debugMrkrName, _pos];" \n "_debugMrkrName setMarkerShapeLocal ""ICON"";" \n "_debugMrkrName setMarkerTypeLocal ""mil_dot"";" \n "_debugMrkrName setMarkerColorLocal ""COLORGREEN"";" \n "_debugMrkrName setMarkerSizeLocal [0.9,0.9];" \n "" \n "" \n "_d = diag_tickTime;"/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class end { name = "end"; init = /*%FSM*/"" \n "" \n "deleteVehicle _unit;" \n "deleteMarkerLocal _debugMrkrName;"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { }; }; /*%FSM*/ }; initState="flock_member"; finalStates[] = { "end" }; }; /*%FSM*/