/*%FSM*/ /*%FSM*/ /* item0[] = {"brainz",0,250,-25.000000,75.000000,75.000000,125.000000,0.000000,"brainz"}; item1[] = {"_",8,218,125.000000,-175.000000,225.000000,-125.000000,0.000000,""}; item2[] = {"instinct",2,250,125.000000,-250.000000,225.000000,-200.000000,0.000000,"instinct"}; item3[] = {"check",4,218,275.000000,-250.000000,375.000000,-200.000000,5.000000,"check"}; item4[] = {"pre_dispose",2,4346,-75.000000,-100.000000,25.000000,-50.000000,0.000000,"pre dispose"}; item5[] = {"dispose_1",4,218,-75.000000,-275.000000,25.000000,-225.000000,100.000000,"dispose"}; item6[] = {"wait_dispose",4,218,-100.000000,-25.000000,0.000000,25.000000,0.000000,"wait" \n "dispose"}; item7[] = {"reset_vars",2,250,125.000000,-100.000000,225.000000,-50.000000,0.000000,"reset vars"}; item8[] = {"do_attack",4,218,550.000000,-100.000000,650.000000,-50.000000,60.000000,"do attack"}; item9[] = {"dispose",4,218,-75.000000,-200.000000,25.000000,-150.000000,200.000000,"dispose"}; item10[] = {"imaginary_target",4,218,600.000000,-150.000000,700.000000,-100.000000,70.000000,"imaginary" \n "target"}; item11[] = {"move",4,218,375.000000,-375.000000,475.000000,-325.000000,60.000000,"move"}; item12[] = {"checking_status",2,250,400.000000,-175.000000,500.000000,-125.000000,0.000000,"checking status"}; item13[] = {"smell",4,218,475.000000,-325.000000,575.000000,-275.000000,90.000000,"smell"}; item14[] = {"final_checks___r",4,218,375.000000,-75.000000,475.000000,-25.000000,10.000000,"final" \n "checks / resets"}; item15[] = {"done",4,218,275.000000,-100.000000,375.000000,-50.000000,100.000000,"done"}; item16[] = {"moan",4,218,300.000000,-400.000000,400.000000,-350.000000,70.000000,"moan"}; item17[] = {"Wait_random",4,218,25.000000,-25.000000,125.000000,25.000000,10.000000,"Wait random"}; item18[] = {"end",1,250,-150.000000,75.000000,-50.000000,125.000000,0.000000,"end"}; item19[] = {"attack",4,218,-50.000000,-350.000000,50.000000,-300.000000,90.000000,"attack"}; item20[] = {"stuck",4,218,475.000000,-50.000000,575.000000,0.000000,30.000000,"stuck"}; item21[] = {"pre_vars___check",4,218,375.000000,-300.000000,475.000000,-250.000000,95.000000,"pre vars / checks"}; item22[] = {"sight___target",4,218,550.000000,-275.000000,650.000000,-225.000000,85.000000,"sight / target"}; item23[] = {"hearing___target",4,218,600.000000,-225.000000,700.000000,-175.000000,80.000000,"hearing / target"}; item24[] = {"spin",2,250,-50.000000,-425.000000,50.000000,-375.000000,0.000000,"spin"}; item25[] = {"wait",4,218,75.000000,-425.000000,175.000000,-375.000000,0.000000,"wait"}; item26[] = {"scream",4,218,200.000000,-425.000000,300.000000,-375.000000,80.000000,"scream"}; item27[] = {"____FAKE____",9,0,0.000000,0.000000,5135053892148252000000000000000000.000000,0.000000,0.000000,"____FAKE____"}; link0[] = {0,17}; link1[] = {1,2}; link2[] = {2,3}; link3[] = {2,5}; link4[] = {2,9}; link5[] = {2,11}; link6[] = {2,16}; link7[] = {2,19}; link8[] = {2,26}; link9[] = {3,12}; link10[] = {4,6}; link11[] = {5,2}; link12[] = {6,18}; link13[] = {7,1}; link14[] = {7,9}; link15[] = {8,12}; link16[] = {9,4}; link17[] = {10,12}; link18[] = {11,2}; link19[] = {12,8}; link20[] = {12,13}; link21[] = {12,14}; link22[] = {12,15}; link23[] = {12,20}; link24[] = {12,21}; link25[] = {12,22}; link26[] = {12,23}; link27[] = {13,12}; link28[] = {14,12}; link29[] = {15,7}; link30[] = {16,2}; link31[] = {17,7}; link32[] = {19,24}; link33[] = {20,12}; link34[] = {21,12}; link35[] = {22,12}; link36[] = {23,12}; link37[] = {24,25}; link38[] = {25,2}; link39[] = {26,2}; link40[] = {27,10}; globals[] = {0.000000,0,0,0,0,640,480,1,267,6316128,1,-268.969421,732.515686,320.848328,-611.003845,978,884,1}; window[] = {2,-1,-1,-1,-1,733,208,1233,208,3,996}; *//*%FSM*/ class FSM { fsmName = "zombie"; class States { /*%FSM*/ class brainz { name = "brainz"; itemno = 0; init = /*%FSM*/"_zombie = _this select 0;" \n "_sBomb = _this select 1;" \n "_head = objNull;" \n "_lastAlert = diag_tickTime;" \n "_trgt = player;" \n "" \n "//Defaults" \n "_fsmPath = ""epoch_code\system"";" \n "_zombie setBehaviour ""CARELESS"";" \n "_zombie setUnitPos ""UP""; " \n "_trgtArr = [""Epoch_Male_F"",""Epoch_Female_F"",""LandVehicle"",""Ship"",""Air"",""Tank""];" \n "" \n "_trgt = player;" \n "_t = diag_tickTime;" \n "_zedPos = getPosATL _zombie;" \n "" \n "//Behaviour Vars" \n "_attackDist = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""attackDist"");" \n "_groanTrig = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""groanTrig"");" \n "_zDisposeRange = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""disposeRange"");" \n "_sHideTrig = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""hideLevel""); " \n "_moveTrig = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""chargeLevel""); " \n "_sHardness = floor (random 6) max 1;" \n "_checkFreq = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""reflexSpeed"");" \n "_welcomeWait = random 4;" \n "_config = 'CfgEpochClient' call EPOCH_returnConfig;" \n "_zSmell = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""smell"");" \n "_zSight = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""sight"");" \n "_zHear = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""hearing"");" \n "_zMem = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""memory"");" \n "_zMoans = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""moans"");" \n "_zScreams = getArray (getMissionConfig ""CfgEpochRyanZombie"" >> ""screams"");" \n "" \n "//Smell" \n "_smellDist = _zSmell select 0;" \n "_smellCoeff = _zSmell select 1;" \n "" \n "//Sight" \n "_sightDist = _zSight select 0;" \n "_sightCoeff = _zSight select 1;" \n "_sight = [_zombie, ""VIEW""] checkVisibility [eyePos _zombie,aimPos _trgt];" \n "" \n "//Hearing" \n "_hearDist = _zHear select 0;" \n "_hearCoeff = _zHear select 1;" \n "_zFiredNear = _zombie getVariable [""zFiredNear"",[objNull, 0]];" \n "_shotDist = 0;" \n "" \n "//Memory" \n "_memTime = _zMem select 0;" \n "_memCoeff = _zMem select 1;" \n "_m = _t;" \n "_spottedPos = [0,0,0];" \n "" \n "//Moving" \n "_moveTo = [0,0,0];" \n "" \n "//Init moveTo" \n "_zombie moveTo _zedPos;" \n "" \n "//Attack" \n "_lastAttack = _t;" \n "_doAttack = false;" \n "" \n "//Sounds" \n "_doMoan = false;" \n "_doScream = false;" \n "_lastMoan = _t;" \n "" \n "//Missions" \n "_traderDispose = false;" \n "" \n "//FSM" \n "_walkHandle = -1;" \n "" \n "_requestDispose = false;" \n "_nrstTrgt = objNull;" \n "_lowDist = 0;" \n "_currDist = 0;" \n "_filterBuilds = [""Land_i_Addon_03_V1_F"",""Land_Offices_01_V1_F""];" \n "" \n "_u = _t;" \n "_c = _u;" \n "_f = _c;" \n "_h = _f;" \n "_d2 = _h;" \n "" \n "" \n "" \n "_dirTo = 0;" \n "_lDist = 0;" \n "_checkEntry = """";" \n "" \n "_decisionMade = false;" \n "_actionDone = false;" \n "_zombiePos=[0,0,0];" \n "_moveTo=[0,0,0];" \n "_trgtPos=[0,0,0];" \n "_hidePos = [0,0,0];" \n "_nrPlyrs = [];" \n "_circlePos = [0,0,0];" \n "_behindPos = [0,0,0];" \n "_sSide = 90;" \n "" \n "_vectTot = [0,0,0];" \n "" \n "_lastAction = """";" \n "_maxStalkDist = 48;" \n "_maxStalkDistPerm = 48;" \n "_minStalkDist = 12;" \n "_minStalkDistPerm = 12;" \n "_doWander = false;" \n "_callHide = false;" \n "_callMove = false;" \n "_callGroan = false;" \n "" \n "//Feeling vars" \n "_sAnger = 50;" \n "_sFear = 50;" \n "_threateLevel = 0;" \n "_addThreat = 0;" \n "_sHit = [objNull, 0];" \n "" \n "_angerCoeff = random 1;" \n "_calmAngerCoeff = 1 - _angerCoeff;" \n "_fearCoeff = random 1;" \n "_calmFearCoeff = 1 - _fearCoeff;" \n "" \n "_stuckCount = 0;" \n "" \n "_traderDispose = false;" \n "" \n "_doMove = false;" \n "_sanityCheckDone = false;" \n "_canSee = ([_zombie, ""VIEW""] checkVisibility [eyePos _zombie,aimPos _trgt] >= 0.5);" \n "_nrTrgts = [];" \n "_threatLevel = 0;" \n "_trgtDist = _trgt distance _zombie;" \n "_sanityCheck = 0;" \n "_doHide = false;" \n "_doAttack = false;" \n "_firedNear = 0;" \n "" \n "" \n "" \n "" \n "//Debug - Uncomment Sounds for live" \n "_randomGroan = {" \n "/*" \n "_sounds = [""sapper_groan0"",""sapper_groan1"",""sapper_groan2""];" \n "_sound = selectRandom _sounds;" \n "" \n "_zombie say3D _sound;" \n "[player, _zombie, _sound, Epoch_personalToken] remoteExec [""EPOCH_server_handle_say3D"",2];" \n "*/" \n "};" \n "" \n "_doInterrupt = {" \n "_actionDone = true;" \n "_criteria = ""(true)"";" \n "};" \n "" \n "//DEBUG" \n "_doDebug = false;" \n "axeDebug = _doDebug ;" \n "if(_doDebug)then{" \n "axeDebug = true;" \n "axeZed = _zombie;" \n "_debugDo = ""START"";" \n "_mkrName = """";" \n "};" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class Wait_random { itemno = 17; priority = 10.000000; to="reset_vars"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"(diag_tickTime - _t) > _welcomeWait;"/*%FSM*/; action=/*%FSM*/"call _randomGroan;"/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class instinct { name = "instinct"; itemno = 2; init = /*%FSM*/"//systemchat format[""I %1"",diag_tickTime];" \n "" \n "" \n "" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class dispose { itemno = 9; priority = 200.000000; to="pre_dispose"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doDispose || !(alive _zombie)"/*%FSM*/; action=/*%FSM*/"if(_walkHandle < 0)then{" \n "_walkHandle setFSMVariable [""_callDispose"", true];" \n "};" \n "_zombie removeAllEventHandlers ""Hit"";" \n "_zombie removeAllEventHandlers ""FiredNear"";" \n "//[] call EPOCH_zombieSpawn;" \n "" \n "_t = diag_tickTime;" \n "" \n "//systemChat ""Dispose/Respawn"";"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class dispose_1 { itemno = 5; priority = 100.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"!(alive _zombie) || _traderDispose || _trgtDist > _zDisposeRange;"/*%FSM*/; action=/*%FSM*/"_doDispose = true;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class attack { itemno = 19; priority = 90.000000; to="spin"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doAttack"/*%FSM*/; action=/*%FSM*/"_zombie moveTo _zedPos;" \n "_aslPos = ATLToASL _zedPos;" \n "_trgtPos = getPosASLVisual _trgt;" \n "_unitV = velocity _zombie;" \n "_unitvDir = vectorDir _zombie;" \n "_vDir = _aslPos vectorFromTo _trgtPos;" \n "_unitvUp = vectorUp _trgt;" \n "_lastAttack = _t;" \n "_doAttack = false;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class scream { itemno = 26; priority = 80.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doScream"/*%FSM*/; action=/*%FSM*/"_random = selectRandom _zScreams;" \n "playSound format [""%1"",_random];" \n "_doScream = false;" \n "_debugDo = ""SCREAM"";" \n "//systemChat ""Scream"";"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class moan { itemno = 16; priority = 70.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doMoan && diag_tickTime - _lastMoan > 8"/*%FSM*/; action=/*%FSM*/"_random = selectRandom _zMoans;" \n "playSound format [""%1"",_random];" \n "_doMoan = false;" \n "_lastMoan = _t;" \n "_debugDo = ""SOUNDS"";"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class move { itemno = 11; priority = 60.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"!(_moveTo isEqualTo [0,0,0]) && moveToCompleted _zombie"/*%FSM*/; action=/*%FSM*/"if(_walkHandle < 0)then{" \n "_walkHandle = [""EPOCH_zombie_walking"",_fsmPath,[_zombie]] call EPOCH_fnc_dynamicFSM;" \n "};" \n "_walkHandle setFSMVariable [""_nextPos"", _moveTo];" \n "_walkHandle setFSMVariable [""_deadTrgts"", _deadTrgts];" \n "_moveTo = [0,0,0];" \n "_debugDo = ""MOVE"";"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class check { itemno = 3; priority = 5.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"diag_tickTime > _u + _checkFreq"/*%FSM*/; action=/*%FSM*/"_sanityCheck = 100;" \n "_debugDo = ""CHECK"";" \n "" \n ""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class pre_dispose { name = "pre_dispose"; itemno = 4; init = /*%FSM*/"_nrTrgts = (_zedPos nearEntities [_trgtArr, 480]) select {isPlayer _x};" \n "_canSee = [];" \n "{" \n " if !(lineIntersects [eyePos _trgt, eyePos _zombie, _zombie, _trgt]) then{" \n " _canSee pushBack _x;" \n " };" \n "}forEach _nrTrgts;" \n "if (count _canSee < 1)then{" \n "deleteVehicle _zombie;" \n "_t = _t + 480;" \n "}else{" \n "_zombie setdamage 1;" \n "};"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class wait_dispose { itemno = 6; priority = 0.000000; to="end"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"diag_tickTime - _t > 480;"/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class reset_vars { name = "reset_vars"; itemno = 7; init = /*%FSM*/"//System Vars" \n "_t = diag_tickTime;" \n "_u = _t;" \n "" \n "_doLoiter = false;" \n "_loiterType = 0;" \n "" \n "_doMove = false;" \n "_moving = false;" \n "_moveCount = 0;" \n "_attempts = 0;" \n "" \n "_doGroan = false;" \n "" \n "" \n "_rnd = 0;" \n "_sWait = 0;" \n "_doDispose = false;" \n "_chooseTarget = false;" \n "" \n "_nrTrgts=[];" \n "_doHide = false;" \n "" \n "//Moving" \n "_moving = false;" \n "" \n "//Sight" \n "//_spottedPos = [0,0,0];" \n "" \n "//Safezones" \n "_inSafe = false;" \n "" \n "//Dispose" \n "" \n "//FSM" \n "" \n "" \n "//Brain Vars" \n "_override = false;" \n "_criteria =""(false)"";" \n "_criteriaMet = false;" \n "_criteriaMetAction = nil;" \n "_allowInterrupt = false;" \n "_interruptReason = ""(false)"";" \n "" \n "_debugDo = ""RESET"";" \n "" \n "" \n "" \n "" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class dispose { itemno = 9; priority = 200.000000; to="pre_dispose"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doDispose || !(alive _zombie)"/*%FSM*/; action=/*%FSM*/"if(_walkHandle < 0)then{" \n "_walkHandle setFSMVariable [""_callDispose"", true];" \n "};" \n "_zombie removeAllEventHandlers ""Hit"";" \n "_zombie removeAllEventHandlers ""FiredNear"";" \n "//[] call EPOCH_zombieSpawn;" \n "" \n "_t = diag_tickTime;" \n "" \n "//systemChat ""Dispose/Respawn"";"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class _ { itemno = 1; priority = 0.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"true"/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class checking_status { name = "checking_status"; itemno = 12; init = /*%FSM*/""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class done { itemno = 15; priority = 100.000000; to="reset_vars"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck < 1" \n ""/*%FSM*/; action=/*%FSM*/"_debugDo = ""CHECKED"";"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class pre_vars___check { itemno = 21; priority = 95.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 95;"/*%FSM*/; action=/*%FSM*/"//Zed" \n "_zedPos = getPosATL _zombie;" \n "_zedSpeed = speed _zombie;" \n "" \n "//Target" \n "_trgtDist = _trgt distance _zombie;" \n "_trgtPos = getPosATL _trgt;" \n "_deadTrgts = [];" \n "" \n "//Smell" \n "_smellVect = [0,0,0];" \n "_smellPos = [0,0,0];" \n "_canSmellCount = 0;" \n "" \n "//Sight" \n "_canSee = false;" \n "_visTrgts = [];" \n "_sightVect = [0,0,0];" \n "_spottedVect = [0,0,0];" \n "" \n "//Attack" \n "_sight = 0;" \n "" \n "" \n "//Hearing" \n "_hearVect = [0,0,0];" \n "" \n "//Target" \n "_spottedVect = [0,0,0];" \n "" \n "//Wander - Imaginary Target" \n "_wanderVect = [0,0,0];" \n "" \n "_vectTot = [0,0,0];" \n "_vectDiv = 0;" \n "" \n "//EH" \n "_zFiredNear = _zombie getVariable [""zFiredNear"",[objNull, 0]];" \n "_shotDist = _zFiredNear select 1;" \n "" \n "//Memory" \n "if(diag_tickTime - _m > _memTime)then{" \n "_spottedPos = [0,0,0];" \n "};" \n "" \n "//Safe Zones" \n "" \n "_restricted = nearestObjects [player, [""ProtectionZone_Invisible_F""], 30];" \n "if !(_restricted isEqualTo []) then {" \n "_inSafe = true;" \n "};" \n "" \n "_sanityCheck = 95;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class smell { itemno = 13; priority = 90.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 90 && !_moving && _smellCoeff > 0 && !_inSafe"/*%FSM*/; action=/*%FSM*/"_nrstTrgt = objNull;" \n "_nrTrgts = (_zedPos nearEntities [_trgtArr, _sightDist]) select {isPlayer _x};" \n "_avPos = [0,0,0];" \n "_upwindPos = [0,0,0];" \n "_smellTrgtPos = [];" \n "" \n "{" \n " if(alive _x)then{" \n " _upwindPos = [_x, _smellDist, winddir] call BIS_fnc_relPos;" \n " if(_zombie distance _upwindPos < _smellDist + 1)exitWith{" \n " _smellTrgtPos = getPosATL _x;" \n " _canSmellCount =_canSmellCount + 1;" \n " };" \n " }else{" \n " _deadTrgts pushBack _x;" \n " };" \n "} forEach _nrTrgts;" \n "" \n "" \n "if(_canSmellCount > 0)then{" \n "_smellVect = _zedPos vectorDiff _smellTrgtPos;" \n "_vectDiv = _vectDiv + 1;" \n "};" \n "" \n "" \n "_sanityCheck = 90;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class sight___target { itemno = 22; priority = 85.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 85 && _sightCoeff > 0 && !_inSafe"/*%FSM*/; action=/*%FSM*/"_nrTrgts = (_zedPos nearEntities [_trgtArr, _sightDist]) select {isPlayer _x};" \n "_sightPos = [0,0,0];" \n "_avPos = [0,0,0];" \n "" \n "_trgtCount = count _nrTrgts;" \n "_visTrgts = [];" \n "" \n "if(_trgtCount > 0)then{" \n "" \n "" \n "" \n " {" \n " _sight = [_zombie, ""VIEW""] checkVisibility [eyePos _zombie,aimPos (driver _x)];" \n " if(alive _x)then{" \n " if(_sight >= 0.62)then{" \n " _thisPos = getPosATL _x;" \n " _relDir = _zombie getRelDir _thisPos;" \n " if(_relDir < 42 || _relDir > 318)then{" \n " _visTrgts pushBack _x;" \n " _avPos = _avPos vectorAdd _thisPos;" \n " };" \n " };" \n " }else{" \n " _deadTrgts pushBack _x;" \n " };" \n " } forEach _nrTrgts;" \n "" \n " if(count _visTrgts > 0)then{" \n " _spottedPos = getPosATL (_visTrgts select 0);" \n " //_sightVect = _zedPos vectorDiff ([_avPos,_trgtCount,false] call EPOCH_fnc_vectorDivide);" \n " _sightVect = _zedPos vectorDiff _spottedPos;" \n " _sightVect = [_sightVect,_sightCoeff] call BIS_fnc_vectorMultiply;" \n " _vectDiv = _vectDiv + 1;" \n " _canSee = true;" \n " }; " \n "" \n "};" \n "_sanityCheck = 85;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class hearing___target { itemno = 23; priority = 80.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 80 && !_moving && (_shotDist > 0 && _shotDist < _hearDist) && _hearCoeff > 0 && !_inSafe"/*%FSM*/; action=/*%FSM*/"_trgt = (_zFiredNear select 0);" \n "_hearTrgtPos = getPosATL _trgt;" \n "_hearVect = _zedPos vectorDiff _hearTrgtPos;" \n "_hearVect = [_hearVect,_hearCoeff] call BIS_fnc_vectorMultiply;" \n "_vectDiv = _vectDiv + 1;" \n "_zombie setVariable [""zFiredNear"", nil];" \n "_sanityCheck = 80;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class do_attack { itemno = 8; priority = 60.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 60 && _sight > 0.6 && _trgtDist < _attackDist && diag_tickTime - _lastAttack > 3 && !_inSafe"/*%FSM*/; action=/*%FSM*/"_doAttack = true;" \n "_doScream = true;" \n "_sanityCheck = 60;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class stuck { itemno = 20; priority = 30.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 30 && _moving && _attempts > 6 && _zedSpeed < 0.4" \n "" \n "" \n ""/*%FSM*/; action=/*%FSM*/"" \n " if (!(_moveTo isEqualTo [0,0,0])) then {" \n "" \n "// _moveTo = [_moveTo, floor(random 2), floor(random 360)] call BIS_fnc_relPos;" \n " _zombie moveTo _zedPos;" \n " _attempts = 0;" \n " //systemChat format[""UnSticking: %1"", diag_tickTime];" \n " };" \n "" \n "_sanityCheck = 30;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class final_checks___r { itemno = 14; priority = 10.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 10;"/*%FSM*/; action=/*%FSM*/"" \n "_sAnger =_sAnger min 100 max 0;" \n "_sFear =_sFear min 100 max 0;" \n "" \n "if(_vectDiv > 0)then{" \n "_vectTot = _smellVect vectorAdd _sightVect vectorAdd _hearVect vectorAdd _spottedVect vectorAdd _wanderVect;" \n "_moveTo = _zedPos vectorDiff ([_vectTot,_vectDiv,false] call EPOCH_fnc_vectorDivide);" \n "_doMoan = true;" \n "//_moveTo = [_moveTo, floor(random 2), floor(random 360)] call BIS_fnc_relPos;" \n "};" \n "" \n "" \n "if(_zedPos distance _spottedPos < 3)then{" \n "_spottedPos = [0,0,0];" \n "};" \n "" \n "if(_zombie getVariable [""EPOCH_callGroan"",false])then{_zombie setVariable [""EPOCH_callGroan"",false];_callGroan = true; _doGroan = true;};" \n "if(_zombie getVariable [""EPOCH_callBoom"",false])then{_zombie setVariable [""EPOCH_callBoom"",false];_callBoom = true; _doBoom = true;};" \n "" \n "" \n "if(_doDebug)then{" \n "_plyrVel = velocity player;" \n "_plyrVelSpeed = (_plyrVel select 0) + (_plyrVel select 1);" \n "_plyRelDir = (player getRelDir _zedPos) - 180; " \n "hintSilent format [""ZOMBIE (%4)\nStalk: %1 / %2\nDist To Move: %3 | Plyr:%6\nSee: %5 (%20)\nAnger: %7\nFear: %8\nHit: %9\nNear: %10\nSmell: %11\nMoved(ing):%12(%17)\nAttempts: %15\nPlyr Vel: %13\nRDir: %14\nSpeed: %16\nVectors: %18\nFPS: %19"",_minStalkDist,_maxStalkDist,_moveTo distance _zombie,_debugDo, _canSee,_zombie distance _trgt,_sAnger,_sFear,_sHit,_zFiredNear,_canSmellCount,moveToCompleted _zombie, _plyrVelSpeed,_plyRelDir,_attempts,_zedSpeed,_moving,_vectDiv,diag_FPS,_sight];" \n "[_zombie,_zedPos,wind,""Sign_Arrow_Direction_Pink_F""] call EPOCH_fncHordeMemberVelPointer;" \n "[""target"",0.8,_moveTo]call EPOCH_fnc_DebugMarker;" \n "[""zed"",0.8,_zedPos]call EPOCH_fnc_DebugMarker;" \n "};" \n "" \n "_sHit = [objNull, 0];" \n "_zFiredNear = [objNull, 0];" \n "_sanityCheck = 0;" \n "" \n "" \n "" \n ""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class end { name = "end"; itemno = 18; init = /*%FSM*/"if (!isNull _zombie) then {" \n "deleteVehicle _zombie;//Move to cleanup" \n "};" \n "" \n "" \n "" \n "" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { }; }; /*%FSM*/ /*%FSM*/ class spin { name = "spin"; itemno = 24; init = /*%FSM*/"_t = diag_tickTime;" \n "_zombie setVelocityTransformation [_aslPos,_aslPos,_unitV,_unitV,_unitvDir,_vDir,_unitvUp,_unitvUp,2];"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class wait { itemno = 25; priority = 0.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"diag_tickTime - _t > 0.6;"/*%FSM*/; action=/*%FSM*/"[_zombie,_trgt] call EPOCH_client_bitePlayer;"/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class ____FAKE____ { name = "____FAKE____"; itemno = 27; init = /*%FSM*/""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class imaginary_target { itemno = 10; priority = 70.000000; to="checking_status"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_sanityCheck > 70 && _vectDiv < 1"/*%FSM*/; action=/*%FSM*/"_rndPos = [_zedPos, random 360, ((random 4) max 1)] call BIS_fnc_relPos;" \n "_wanderVect = _zedPos vectorDiff _rndPos;" \n "_vectDiv = _vectDiv + 1;" \n "_sanityCheck = 70;"/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ }; initState="brainz"; finalStates[] = { "end", }; }; /*%FSM*/