/*%FSM*/ /*%FSM*/ /* item0[] = {"phantom",0,4346,-50.000000,-325.000000,50.000000,-275.000000,0.000000,"phantom"}; item1[] = {"_",8,218,75.000000,-200.000000,125.000000,-175.000000,0.000000,""}; item2[] = {"instinct",2,250,150.000000,-200.000000,250.000000,-150.000000,0.000000,"instinct"}; item3[] = {"action",2,250,150.000000,-50.000000,250.000000,0.000000,0.000000,"action"}; item4[] = {"dispose",4,218,50.000000,-150.000000,150.000000,-100.000000,90.000000,"dispose"}; item5[] = {"_",8,218,175.000000,200.000000,225.000000,225.000000,0.000000,""}; item6[] = {"reset_vars",2,250,-50.000000,-200.000000,50.000000,-150.000000,0.000000,"reset vars"}; item7[] = {"_",8,218,-25.000000,-250.000000,25.000000,-225.000000,0.000000,""}; item8[] = {"complete",4,218,-50.000000,-125.000000,50.000000,-75.000000,100.000000,"complete"}; item9[] = {"end",1,250,400.000000,-100.000000,500.000000,-50.000000,0.000000,"end"}; item10[] = {"dispose",4,218,275.000000,-100.000000,375.000000,-50.000000,95.000000,"dispose"}; item11[] = {"instinct_done",4,218,150.000000,-125.000000,250.000000,-75.000000,100.000000,"instinct done"}; item12[] = {"door",4,218,-50.000000,25.000000,50.000000,75.000000,30.000000,"door"}; item13[] = {"phantom_door",2,250,-50.000000,175.000000,50.000000,225.000000,0.000000,"phantom door"}; item14[] = {"door",4,218,225.000000,-350.000000,325.000000,-300.000000,60.000000,"door"}; item15[] = {"appear",4,218,125.000000,-325.000000,225.000000,-275.000000,70.000000,"appear"}; item16[] = {"appear",4,218,75.000000,25.000000,175.000000,75.000000,10.000000,"appear"}; item17[] = {"do_apparition",2,250,75.000000,125.000000,175.000000,175.000000,0.000000,"do apparition"}; item18[] = {"bite",4,218,325.000000,-250.000000,425.000000,-200.000000,40.000000,"bite"}; item19[] = {"bite",4,218,225.000000,25.000000,325.000000,75.000000,20.000000,"bite"}; item20[] = {"do_bite",2,250,225.000000,125.000000,325.000000,175.000000,0.000000,"do bite"}; item21[] = {"checks",4,218,50.000000,-275.000000,150.000000,-225.000000,80.000000,"checks"}; item22[] = {"sound",4,218,275.000000,-300.000000,375.000000,-250.000000,50.000000,"sound"}; item23[] = {"sound",4,218,350.000000,25.000000,450.000000,75.000000,0.000000,"sound"}; item24[] = {"do_sound",2,250,350.000000,175.000000,450.000000,225.000000,0.000000,"do sound"}; item25[] = {"window",4,218,300.000000,-200.000000,400.000000,-150.000000,50.000000,"window"}; item26[] = {"window",4,218,-175.000000,25.000000,-75.000000,75.000000,30.000000,"window"}; item27[] = {"smash_window",2,250,-175.000000,250.000000,-75.000000,300.000000,0.000000,"smash window"}; link0[] = {0,7}; link1[] = {1,2}; link2[] = {2,4}; link3[] = {2,11}; link4[] = {2,14}; link5[] = {2,15}; link6[] = {2,18}; link7[] = {2,21}; link8[] = {2,22}; link9[] = {2,25}; link10[] = {3,8}; link11[] = {3,10}; link12[] = {3,12}; link13[] = {3,16}; link14[] = {3,19}; link15[] = {3,23}; link16[] = {3,26}; link17[] = {4,2}; link18[] = {5,3}; link19[] = {6,1}; link20[] = {7,6}; link21[] = {8,6}; link22[] = {10,9}; link23[] = {11,3}; link24[] = {12,13}; link25[] = {13,5}; link26[] = {14,2}; link27[] = {15,2}; link28[] = {16,17}; link29[] = {17,5}; link30[] = {18,2}; link31[] = {19,20}; link32[] = {20,5}; link33[] = {21,2}; link34[] = {22,2}; link35[] = {23,24}; link36[] = {24,5}; link37[] = {25,2}; link38[] = {26,27}; link39[] = {27,5}; globals[] = {25.000000,1,0,0,16777215,640,480,1,182,6316128,1,-249.798294,620.231628,477.075989,-365.297302,755,731,1}; window[] = {2,-1,-1,-1,-1,650,125,1150,125,3,773}; *//*%FSM*/ class FSM { fsmName = "phantom"; class States { /*%FSM*/ class phantom { name = "phantom"; init = /*%FSM*/"" \n "//settings" \n "_phantomLife = 884;" \n "_phantomChance = 100;// Percentage of this figure to trigger haunting - Lower for more events" \n "_haunting = 6;//Check every x ticks." \n "" \n "//vars" \n "_plyr = player;" \n "this = objNull;" \n "_inHouse = false;" \n "_tStart = diag_tickTime;" \n "_callDispose = false;" \n "_house = objNull;" \n "" \n "//doors" \n "_doDoor = false;" \n "_act = """";" \n "_obj = objNull;" \n "_numDoors = 0;" \n "_house = """";" \n "" \n "//apparition" \n "_doAppear = false;" \n "_count = 0;" \n "_object = objNull;" \n "_source01 = objNull;" \n "" \n "//attack" \n "_doBite = false;" \n "" \n "//Window" \n "_doWindow = false;" \n "" \n "//Sound" \n "_doSound = false;" \n "_soundNames = [""concrete_int_walk"",""concrete_walk"",""debris_walk"",""dirt_walk_new"",""gravel_walk"",""metal_int_walk"",""metal_walk"",""new_dry_grass_walk"",""new_grass_walk"",""rock_walk"",""roof_tiles_walk"",""roof_tin_walk"",""sand_walk"",""steel_walk"",""stony_walk"",""tarmac_walk"",""tiles_int_walk"",""wood_walk_ext"",""wood_walk_int""];" \n "" \n "" \n "" \n "" \n "" \n "" \n "" \n "" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class _ { priority = 0.000000; to="reset_vars"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/""/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class instinct { name = "instinct"; init = /*%FSM*/""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class instinct_done { priority = 100.000000; to="action"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_decisionMade;"/*%FSM*/; action=/*%FSM*/"_t = diag_tickTime;" \n ""/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class dispose { priority = 90.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"!alive _plyr || _callDispose;"/*%FSM*/; action=/*%FSM*/"_doDispose = true;" \n "_decisionMade = true;" \n "_actionDone = false;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class checks { priority = 80.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"!_decisionMade && diag_tickTime - _t > _haunting;"/*%FSM*/; action=/*%FSM*/"_posPlyr = visiblePosition player;" \n "_house = nearestBuilding player;" \n "_housePos = getPosATL _house;" \n "_bound = boundingBox _house;" \n " " \n "_xBound = _bound select 1 select 0;" \n "_yBound = _bound select 1 select 1;" \n "_zBound = _bound select 1 select 2;" \n " " \n "_xBound = _xBound - ((_xBound / 100) * 16);" \n "_yBound = _yBound - ((_yBound / 100) * 16);" \n "_zBound = _zBound - ((_zBound / 100) * 16);" \n " " \n "_xDiff = abs ((_housePos select 0) - (_posPlyr select 0));" \n "_yDiff = abs ((_housePos select 1) - (_posPlyr select 1));" \n "_zDiff = abs ((_housePos select 2) - (_posPlyr select 2));" \n "" \n " " \n "if (_xDiff < _xBound && _yDiff < _yBound && _zDiff < _zBound) then {" \n "_inHouse = true;" \n "}else{" \n "_inHouse = false;" \n "};" \n "" \n "" \n "if (diag_tickTime - _tStart > _phantomLife) then {" \n "_callDispose = true;" \n "};" \n "" \n "_rnd = floor random _phantomChance;" \n "" \n "_t = diag_tickTime;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class appear { priority = 70.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_rnd > 6 && _rnd < 10 && _inHouse;"/*%FSM*/; action=/*%FSM*/"_doAppear = true;" \n "_decisionMade = true;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class door { priority = 60.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_rnd > 3.5 && _rnd < 6 && _inHouse;"/*%FSM*/; action=/*%FSM*/"_doDoor = true;" \n "_decisionMade = true;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class sound { priority = 50.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_rnd > 1.5 && _rnd < 3.5 && _inHouse;"/*%FSM*/; action=/*%FSM*/"_doSound = true;" \n "_decisionMade = true;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class window { priority = 50.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_rnd > 10 && _rnd < 13.5 && _inHouse;"/*%FSM*/; action=/*%FSM*/"_doWindow = true;" \n "_decisionMade = true;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class bite { priority = 40.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_rnd < 1.5 && _inHouse;"/*%FSM*/; action=/*%FSM*/"_doBite = true;" \n "_decisionMade = true;"/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class action { name = "action"; init = /*%FSM*/""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class complete { priority = 100.000000; to="reset_vars"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_actionDone && ((call compile _criteria) || (diag_tickTime > (_t + _sWait)));"/*%FSM*/; action=/*%FSM*/"" \n "if (!isNil ""_criteriaMetAction"") then {" \n "call _criteriaMetAction;" \n "};" \n "" \n "" \n ""/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class dispose { priority = 95.000000; to="end"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doDispose;"/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class window { priority = 30.000000; to="smash_window"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doWindow;"/*%FSM*/; action=/*%FSM*/"_doWindow = false;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class door { priority = 30.000000; to="phantom_door"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doDoor;"/*%FSM*/; action=/*%FSM*/"_doDoor = false;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class bite { priority = 20.000000; to="do_bite"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doBite;"/*%FSM*/; action=/*%FSM*/"_doBite = false;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class appear { priority = 10.000000; to="do_apparition"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doAppear;"/*%FSM*/; action=/*%FSM*/"_doAppear = false;"/*%FSM*/; }; /*%FSM*/ /*%FSM*/ class sound { priority = 0.000000; to="do_sound"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/"_doSound;"/*%FSM*/; action=/*%FSM*/"_doSound = false;"/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class reset_vars { name = "reset_vars"; init = /*%FSM*/"//Default Vars" \n "_actionDone = false;" \n "_decisionMade = false;" \n "_sWait = 0;" \n "_doDispose = false;" \n "_t = diag_tickTime;" \n "" \n "//Brain Vars" \n "_criteria =""(false)"";" \n "_criteriaMetAction = nil;" \n "" \n "" \n "//phantom Vars" \n "_dCond = false;" \n "_rnd = random _phantomChance;" \n "" \n "" \n "" \n "" \n "" \n "" \n "" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class _ { priority = 0.000000; to="instinct"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/""/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class end { name = "end"; init = /*%FSM*/"""PHANTOM"" call EPOCH_unitSpawnDecrease;"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { }; }; /*%FSM*/ /*%FSM*/ class phantom_door { name = "phantom_door"; init = /*%FSM*/" _obj = (getpos _plyr nearestObject ""House"");" \n "_condIn = """";" \n "if!(isNull _obj) then {" \n " _house = typeof _obj;" \n " _numDoors = getNumber (configfile >> ""CfgVehicles"" >> _house >> ""numberOfDoors""); " \n " _doorRnd = (floor random _numDoors) + 1;" \n "" \n " if (_numDoors>0) then {" \n "" \n "_dCond = call compile getText(configFile >> ""CfgVehicles"" >> _house >> ""UserActions"" >> format[""OpenDoor_%1"",_doorRnd] >> ""Condition""); " \n " _act = getText(configFile >> ""CfgVehicles"" >> _house >> ""UserActions"" >> format[""OpenDoor_%1"",_doorRnd] >> ""Statement""); " \n "" \n "if (!_dCond) then {" \n "_dCond = call compile getText(configFile >> ""CfgVehicles"" >> _house >> ""UserActions"" >> format[""CloseDoor_%1"",_doorRnd] >> ""Condition""); " \n " _act = getText(configFile >> ""CfgVehicles"" >> _house >> ""UserActions"" >> format[""CloseDoor_%1"",_doorRnd] >> ""Statement""); " \n "};" \n "" \n "if (_dCond) then {" \n " [_act,_obj] spawn {" \n " this = _this select 1;" \n " call compile (_this select 0);" \n " };" \n "};" \n " " \n " };" \n " " \n "" \n "};" \n "" \n "_sWait = 1.5;" \n "_actionDone = true;" \n "_t = diag_tickTime;" \n "_criteria = ""(false)"";" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class _ { priority = 0.000000; to="action"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/""/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class do_apparition { name = "do_apparition"; init = /*%FSM*/"[]spawn {" \n "_count = floor random 2;" \n "" \n "while{_count > -1}do{" \n " _dir = getDir player;" \n "_nukeHolderPos = [getposATL player, (random 4) max 0.5, _dir] call BIS_fnc_relPos;" \n "_object = ""Logic"" createVehicleLocal _nukeHolderPos;" \n "_source01 = ""#particlesource"" createVehicleLocal _nukeHolderPos;" \n "_source01 setParticleCircle [2, [0.2, 0.2, 0.2]];" \n "_source01 setParticleRandom [1, [0, 0, 0], [0.2, 0.2, 0.2], 0, 0.25, [1, 0, 1, 0.1], 0, 0.2];" \n "_source01 setParticleParams [[""A3\data_f\ParticleEffects\Universal\Refract.p3d"", 1, 0, 1], """", ""Billboard"", 1, 1, [0, 0, 0], [1, 1, 1], 0, 0.05, 0.04, 0, [1.2, 2, 4], [[0.1, 0.1, 0.1, 1], [0.25, 0.25, 0.25, 0.5], [0.5, 0.5, 0.5, 0]], [0.08], 0, 0, """", """", _object];" \n "_source01 setDropInterval 0.8;" \n "uiSleep 2.8;" \n "_count = _count - 1;" \n "deleteVehicle _object;" \n "deleteVehicle _source01;" \n "};" \n "" \n "};" \n "" \n "_sWait = 1.5;" \n "_actionDone = true;" \n "_t = diag_tickTime;" \n "_criteria = ""(false)"";" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class _ { priority = 0.000000; to="action"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/""/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class do_bite { name = "do_bite"; init = /*%FSM*/"_plyr call EPOCH_client_bitePlayer;" \n "" \n "" \n "_sWait = 1.5;" \n "_actionDone = true;" \n "_t = diag_tickTime;" \n "_criteria = ""(false)"";" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class _ { priority = 0.000000; to="action"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/""/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class do_sound { name = "do_sound"; init = /*%FSM*/"" \n "_soundName = _soundNames select (floor random (count _soundNames));" \n "" \n "[_house,_soundName] spawn{" \n "" \n "_count = floor (random 7) max 3;" \n "_dirTo = (random 360);" \n "_sndLoc = ATLToASL ([player, 12, _dirTo] call BIS_fnc_relPos);" \n " for ""_i"" from 1 to _count step 1 do{" \n "_sound = format[""A3\Sounds_F\characters\footsteps\%2_%1.wss"", (floor random 7) + 1,_this select 1]; " \n " playSound3D [_sound, player,false,_sndLoc,0.6,1,0]; " \n "uiSleep 0.6;" \n " };" \n "};" \n "" \n "_sWait = 1.5;" \n "_actionDone = true;" \n "_t = diag_tickTime;" \n "_criteria = ""(false)"";"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class _ { priority = 0.000000; to="action"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/""/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ /*%FSM*/ class smash_window { name = "smash_window"; init = /*%FSM*/" _obj = (getpos _plyr nearestObject ""House"");" \n "_condIn = """";" \n "if!(isNull _obj) then {" \n " _house = typeof _obj;" \n " _numWindows = getNumber (configfile >> ""CfgVehicles"" >> _house >> ""numberOfWindows""); " \n " _windowRnd = (floor random _numWindows) + 1;" \n "" \n " if (_numWindows>0) then {" \n " _glsHitPoint = format[""Glass_%1_hitpoint"",_windowRnd];" \n " _obj setHitPointDamage [_glsHitPoint,1];" \n "" \n "" \n " };" \n " " \n "" \n "};" \n "" \n "_sWait = 1.5;" \n "_actionDone = true;" \n "_t = diag_tickTime;" \n "_criteria = ""(false)"";" \n ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { /*%FSM*/ class _ { priority = 0.000000; to="action"; precondition = /*%FSM*/""/*%FSM*/; condition=/*%FSM*/""/*%FSM*/; action=/*%FSM*/""/*%FSM*/; }; /*%FSM*/ }; }; /*%FSM*/ }; initState="phantom"; finalStates[] = { "end" }; }; /*%FSM*/