diff --git a/Sources/epoch_code/System/EPOCH_zombie_brain.fsm b/Sources/epoch_code/System/EPOCH_zombie_brain.fsm new file mode 100644 index 00000000..b68620f1 --- /dev/null +++ b/Sources/epoch_code/System/EPOCH_zombie_brain.fsm @@ -0,0 +1,834 @@ +class FSM +{ + fsmName = "zombie"; + class States + { + class brainz + { + name = "brainz"; + itemno = ; + init = "_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_Man_Base_F"",""Epoch_Female_base_F""];" \n + "_vehArray = [""Car""];" \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 + "_zRange = getNumber (getMissionConfig ""CfgEpochRyanZombie"" >> ""range"");" \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 + "_jammerRange = getNumber(_config >> ""buildingJammerRange"");" \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 + "//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 + "_say3D_PVS = [player, _zombie,(EPOCH_sounds find _sound), Epoch_personalToken];" \n + "_say3D_PVS 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 + "_jammerRange = 75;" \n + "axeZed = _zombie;" \n + "_debugDo = ""START"";" \n + "_mkrName = """";" \n + "};" \n + ""; + precondition = ""; + class Links + { + class Wait_random + { + itemno = ; + priority = 10.000000; + to="reset_vars"; + precondition = ""; + condition="(diag_tickTime - _t) > _welcomeWait;"; + action="call _randomGroan;"; + }; + }; + }; + class instinct + { + name = "instinct"; + itemno = ; + init = "//systemchat format[""I %1"",diag_tickTime];" \n + "" \n + "" \n + "" \n + ""; + precondition = ""; + class Links + { + class dispose + { + itemno = ; + priority = 200.000000; + to="pre_dispose"; + precondition = ""; + condition="_doDispose || !(alive _zombie)"; + action="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"";"; + }; + class dispose_1 + { + itemno = ; + priority = 100.000000; + to="instinct"; + precondition = ""; + condition="!(alive _zombie) || _traderDispose || _trgtDist > _zRange;"; + action="_doDispose = true;"; + }; + class attack + { + itemno = ; + priority = 90.000000; + to="spin"; + precondition = ""; + condition="_doAttack"; + action="_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;"; + }; + class scream + { + itemno = ; + priority = 80.000000; + to="instinct"; + precondition = ""; + condition="_doScream"; + action="_random = selectRandom _zScreams;" \n + "playSound format [""%1"",_random];" \n + "_doScream = false;" \n + "_debugDo = ""SCREAM"";" \n + "//systemChat ""Scream"";"; + }; + class moan + { + itemno = ; + priority = 70.000000; + to="instinct"; + precondition = ""; + condition="_doMoan && diag_tickTime - _lastMoan > 8"; + action="_random = selectRandom _zMoans;" \n + "playSound format [""%1"",_random];" \n + "_doMoan = false;" \n + "_lastMoan = _t;" \n + "_debugDo = ""SOUNDS"";"; + }; + class move + { + itemno = ; + priority = 60.000000; + to="instinct"; + precondition = ""; + condition="!(_moveTo isEqualTo [0,0,0])"; + action="if(_walkHandle < 0)then{" \n + "_walkHandle = [""EPOCH_zombie_walking"",_fsmPath,[_zombie]] call EPOCH_fnc_dynamicFSM;" \n + "};" \n + "_walkHandle setFSMVariable [""_nextPos"", _moveTo];" \n + "_moveTo = [0,0,0];" \n + "_debugDo = ""MOVE"";"; + }; + class check + { + itemno = ; + priority = 5.000000; + to="checking_status"; + precondition = ""; + condition="diag_tickTime > _u + _checkFreq"; + action="_sanityCheck = 100;" \n + "_debugDo = ""CHECK"";" \n + "" \n + ""; + }; + }; + }; + class pre_dispose + { + name = "pre_dispose"; + itemno = ; + init = "_nrTrgts = _zedPos nearEntities [_trgtArr, 480];" \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 + "};"; + precondition = ""; + class Links + { + class wait_dispose + { + itemno = ; + priority = 0.000000; + to="end"; + precondition = ""; + condition="diag_tickTime - _t > 480;"; + action=""; + }; + }; + }; + class reset_vars + { + name = "reset_vars"; + itemno = ; + init = "//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 + "//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 + ""; + precondition = ""; + class Links + { + class dispose + { + itemno = ; + priority = 200.000000; + to="pre_dispose"; + precondition = ""; + condition="_doDispose || !(alive _zombie)"; + action="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"";"; + }; + class _ + { + itemno = ; + priority = 0.000000; + to="instinct"; + precondition = ""; + condition="true"; + action=""; + }; + }; + }; + class checking_status + { + name = "checking_status"; + itemno = ; + init = ""; + precondition = ""; + class Links + { + class done + { + itemno = ; + priority = 100.000000; + to="reset_vars"; + precondition = ""; + condition="_sanityCheck < 1" \n + ""; + action="_debugDo = ""CHECKED"";"; + }; + class pre_vars___check + { + itemno = ; + priority = 95.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 95;"; + action="//Zed" \n + "_zedPos = getPosATL _zombie;" \n + "_zedSpeed = speed _zombie;" \n + "" \n + "//Target" \n + "_trgtDist = _trgt distance _zombie;" \n + "_trgtPos = getPosATL _trgt;" \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 + "_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 + "_sanityCheck = 95;"; + }; + class smell + { + itemno = ; + priority = 90.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 90 && !_moving && _smellCoeff > 0"; + action="_nrstTrgt = objNull;" \n + "_nrTrgts = _zedPos nearEntities [_trgtArr, _smellDist];" \n + "_avPos = [0,0,0];" \n + "_upwindPos = [0,0,0];" \n + "" \n + "{" \n + " _upwindPos = [_x, _smellDist, winddir] call BIS_fnc_relPos;" \n + " if(_zombie distance _upwindPos < _smellDist + 1)then{" \n + " _canSmellCount = _canSmellCount + 1;" \n + " _avPos = _avPos vectorAdd getPosATL _x;" \n + " };" \n + "} forEach _nrTrgts;" \n + "" \n + "" \n + "if(_canSmellCount > 0)then{" \n + "_smellVect = _zedPos vectorDiff ([_avPos,_canSmellCount] call EPOCH_fnc_vectorDivide);" \n + "_smellVect = [_smellVect,_smellCoeff] call BIS_fnc_vectorMultiply;" \n + "_vectDiv = _vectDiv + 1;" \n + "};" \n + "" \n + "" \n + "_sanityCheck = 90;"; + }; + class sight___target + { + itemno = ; + priority = 85.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 85 && _sightCoeff > 0"; + action="_nrTrgts = _zedPos nearEntities [_trgtArr, _sightDist];" \n + "" \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 + "_sight = [_zombie, ""VIEW""] checkVisibility [eyePos _zombie,aimPos _trgt];" \n + "" \n + " {" \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 + " } 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 = [_sightVect,_sightCoeff] call BIS_fnc_vectorMultiply;" \n + " _vectDiv = _vectDiv + 1;" \n + " _canSee = true;" \n + " }; " \n + "" \n + "};" \n + "_sanityCheck = 85;"; + }; + class hearing___target + { + itemno = ; + priority = 80.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 80 && !_moving && (_shotDist > 0 && _shotDist < _hearDist) && _hearCoeff > 0"; + action="_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;"; + }; + class do_attack + { + itemno = ; + priority = 70.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 70 && _sight > 0.6 && _trgtDist < _attackDist && diag_tickTime - _lastAttack > 3"; + action="_doAttack = true;" \n + "_doScream = true;" \n + "_sanityCheck = 70;"; + }; + class stuck + { + itemno = ; + priority = 30.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 30 && _moving && _attempts > 6 && _zedSpeed < 0.4" \n + "" \n + "" \n + ""; + action="" \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 _moveTo;" \n + " _attempts = 0;" \n + " systemChat format[""UnSticking: %1"", diag_tickTime];" \n + " };" \n + "" \n + "_sanityCheck = 30;"; + }; + class final_checks___r + { + itemno = ; + priority = 10.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 10;"; + action="" \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;" \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 + ""; + }; + }; + }; + class end + { + name = "end"; + itemno = ; + init = "if (!isNull _zombie) then {" \n + "deleteVehicle _zombie;//Move to cleanup" \n + "};" \n + "" \n + "" \n + "" \n + "" \n + ""; + precondition = ""; + class Links + { + }; + }; + class spin + { + name = "spin"; + itemno = ; + init = "_t = diag_tickTime;" \n + "_zombie setVelocityTransformation [_aslPos,_aslPos,_unitV,_unitV,_unitvDir,_vDir,_unitvUp,_unitvUp,2];"; + precondition = ""; + class Links + { + class wait + { + itemno = ; + priority = 0.000000; + to="instinct"; + precondition = ""; + condition="diag_tickTime - _t > 0.6;"; + action="_zombie switchMove ""AwopPercMstpSgthWnonDnon_throw"";"; + }; + }; + }; + class ____FAKE____ + { + name = "____FAKE____"; + itemno = ; + init = ""; + precondition = ""; + class Links + { + class check_threat + { + itemno = ; + priority = 80.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 80;"; + action="_avDist = 0;" \n + "_tDist = 0;" \n + "_wepCount = 0;" \n + "_addThreat = 0;" \n + "" \n + "_nrTrgtCount = (count _nrTrgts);" \n + "if (_nrTrgtCount>0) then {" \n + "{" \n + "" \n + "" \n + " if!((currentWeapon _x) == """") then {" \n + " _tDist = _tDist + (_x distance _zombie);" \n + "" \n + " if!(lineIntersects [aimPos _zombie, eyePos _x, _zombie, _x]) then {" \n + " _wepCount = _wepCount + 1;" \n + " };" \n + "" \n + " };" \n + "" \n + "" \n + "}forEach _nrTrgts;" \n + "" \n + "_avDist = _tDist / _nrTrgtCount;" \n + "_addThreat = _wepCount;" \n + "" \n + "" \n + "};" \n + "" \n + "" \n + "_sanityCheck = 80;" \n + ""; + }; + class nearest_target + { + itemno = ; + priority = 75.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 75 && !_moving && !(_spottedPos isEqualTo [0,0,0]);" \n + "" \n + "" \n + ""; + action="_spottedVect = _zedPos vectorDiff _spottedPos;" \n + "_spottedVect = [_spottedVect,_sightCoeff] call BIS_fnc_vectorMultiply;" \n + "_vectDiv = _vectDiv + 1;" \n + "_sanityCheck = 75;" \n + "" \n + ""; + }; + class check_target + { + itemno = ; + priority = 60.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 60;" \n + "" \n + "" \n + ""; + action="" \n + "_trgtDist = _zombie distance _trgt;" \n + "_canSee = (([_zombie, ""VIEW""] checkVisibility [eyePos _zombie,aimPos _trgt] >= 0.5) && _trgtDist < _smellDist);" \n + "_trgtPos = getPosATL _trgt;" \n + "" \n + "if(_trgt getVariable [""EPOCH_callGroan"",false])then{_trgt setVariable [""EPOCH_callGroan"",false];_callGroan = true; _doGroan = true;};" \n + "if(_trgt getVariable [""EPOCH_callBoom"",false])then{_trgt setVariable [""EPOCH_callBoom"",false];_callBoom = true; _doBoom = true;};" \n + "" \n + "_sanityCheck = 60;" \n + "" \n + ""; + }; + class feeling + { + itemno = ; + priority = 50.000000; + to="checking_status"; + precondition = ""; + condition="_sanityCheck > 50;" \n + "" \n + "" \n + ""; + action="" \n + "if (_zFiredNear select 1 > 0 && _zFiredNear select 1 < 50) then {" \n + "_sAnger = _sAnger + ( random 2 * _angerCoeff);" \n + "_sFear = _sFear + (random 2 * _fearCoeff);" \n + "if (isPlayer (_sHit select 0)) then {" \n + "_trgt = _sHit select 0;" \n + "};" \n + "};" \n + "" \n + "if (_sHit select 1>0) then {" \n + "_sAnger = _sAnger + (random 14 * _angerCoeff);" \n + "_sFear = _sFear + (random 14 * _fearCoeff);" \n + "if (isPlayer (_sHit select 0)) then {" \n + "_trgt = _sHit select 0;" \n + "};" \n + "};" \n + "" \n + "//Can see target grrr" \n + "if (_canSee) then {" \n + "_sAnger = _sAnger + (random 2 * _angerCoeff);" \n + "};" \n + "" \n + "//can see armed targets" \n + "if (_addThreat > 0) then {" \n + "_sFear = _sFear + (_addThreat * _fearCoeff);" \n + "};" \n + "" \n + "//calm down calm down" \n + "//if (diag_tickTime > _f + 28) then {" \n + "_sAnger = _sAnger - (random _sHardness * _calmAngerCoeff);" \n + "_sFear = _sFear - (random _sHardness * _calmFearCoeff);" \n + "_f = diag_tickTime;" \n + "//};" \n + "" \n + "" \n + "_sanityCheck = 50;" \n + "" \n + ""; + }; + }; + }; + }; + initState="brainz"; + finalStates[] = + { + "end", + }; +};