mission.fsm 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. /*%FSM<COMPILE "C:\Program Files (x86)\Bohemia Interactive\Tools\FSM Editor Personal Edition\scriptedFSM.cfg, Enemy Mortar Team">*/
  2. /*%FSM<HEAD>*/
  3. /*
  4. item0[] = {"Enemy_Artillery",0,250,200.000000,-50.000000,300.000000,0.000000,0.000000,"Enemy Artillery"};
  5. item1[] = {"Here_we_go_",8,218,200.000000,25.000000,300.000000,75.000000,0.000000,"Here we go!"};
  6. item2[] = {"Create_artillery",2,250,200.000000,100.000000,300.000000,150.000000,0.000000,"Create artillery" \n "piece / PROCESS"};
  7. item3[] = {"Ready_to_attack",4,4314,325.000000,100.000000,425.000000,150.000000,0.000000,"Ready to attack?"};
  8. item4[] = {"Dead_",4,218,75.000000,100.000000,175.000000,150.000000,1.000000,"Dead?"};
  9. item5[] = {"Finding_a_target",2,250,450.000000,100.000000,550.000000,150.000000,0.000000,"Finding a" \n "target..."};
  10. item6[] = {"Loop_back_to_the",8,218,450.000000,325.000000,550.000000,375.000000,0.000000,"Loop back to" \n "the timer..."};
  11. item7[] = {"Success__Tactical",2,250,-50.000000,100.000000,50.000000,150.000000,0.000000,"Success!" \n "Tactical retreat!"};
  12. item8[] = {"Time_to_run___",8,218,-50.000000,175.000000,50.000000,225.000000,0.000000,"Time to run..."};
  13. item9[] = {"Set_distance_tim",2,250,-50.000000,250.000000,50.000000,300.000000,0.000000,"Set distance" \n "timer"};
  14. item10[] = {"Ready_to_check_",4,218,-50.000000,325.000000,50.000000,375.000000,0.000000,"Ready to check?"};
  15. item11[] = {"So____are_they_far",2,250,-175.000000,325.000000,-75.000000,375.000000,0.000000,"So... are they" \n "far away?"};
  16. item12[] = {"Not_yet_",8,218,-175.000000,250.000000,-75.000000,300.000000,0.000000,"Not yet!"};
  17. item13[] = {"Yep_",4,218,-175.000000,400.000000,-75.000000,450.000000,1.000000,"Yep!"};
  18. item14[] = {"",7,210,245.999985,346.000000,254.000000,354.000000,0.000000,""};
  19. item15[] = {"Clean_up_and_qui",1,250,-175.000000,475.000000,-75.000000,525.000000,0.000000,"Clean up" \n "and quit"};
  20. item16[] = {"Ready_to_fire_",4,218,450.000000,175.000000,550.000000,225.000000,0.000000,"Ready to fire!"};
  21. item17[] = {"FIRE_",2,250,450.000000,250.000000,550.000000,300.000000,0.000000,"FIRE!"};
  22. item18[] = {"Find_another_tar",4,218,450.000000,25.000000,550.000000,75.000000,1.000000,"Find" \n "another" \n "target"};
  23. link0[] = {0,1};
  24. link1[] = {1,2};
  25. link2[] = {2,3};
  26. link3[] = {2,4};
  27. link4[] = {3,5};
  28. link5[] = {4,7};
  29. link6[] = {5,16};
  30. link7[] = {5,18};
  31. link8[] = {6,14};
  32. link9[] = {7,8};
  33. link10[] = {8,9};
  34. link11[] = {9,10};
  35. link12[] = {10,11};
  36. link13[] = {11,12};
  37. link14[] = {11,13};
  38. link15[] = {12,9};
  39. link16[] = {13,15};
  40. link17[] = {14,2};
  41. link18[] = {16,17};
  42. link19[] = {17,6};
  43. link20[] = {18,5};
  44. globals[] = {25.000000,1,0,0,0,640,480,1,21,6316128,1,-310.133392,664.945313,897.038208,-459.170135,701,975,1};
  45. window[] = {0,-1,-1,-1,-1,1277,284,2164,156,1,719};
  46. *//*%FSM</HEAD>*/
  47. class FSM
  48. {
  49. fsmName = "Enemy Mortar Team";
  50. class States
  51. {
  52. /*%FSM<STATE "Enemy_Artillery">*/
  53. class Enemy_Artillery
  54. {
  55. name = "Enemy_Artillery";
  56. init = /*%FSM<STATEINIT""">*/"_pos = _this select 0;" \n
  57. "_code = _this select 1;" \n
  58. "" \n
  59. "_first_run = true;" \n
  60. "_items_to_delete = [];" \n
  61. "_artillery = objNull;" \n
  62. "_found_target = false;" \n
  63. "_target = objNull;" \n
  64. "_target_pos = [0,0,0];" \n
  65. "" \n
  66. "_ammo = ""32Rnd_155mm_Mo_shells"";"/*%FSM</STATEINIT""">*/;
  67. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  68. class Links
  69. {
  70. /*%FSM<LINK "Here_we_go_">*/
  71. class Here_we_go_
  72. {
  73. priority = 0.000000;
  74. to="Create_artillery";
  75. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  76. condition=/*%FSM<CONDITION""">*/""/*%FSM</CONDITION""">*/;
  77. action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
  78. };
  79. /*%FSM</LINK>*/
  80. };
  81. };
  82. /*%FSM</STATE>*/
  83. /*%FSM<STATE "Create_artillery">*/
  84. class Create_artillery
  85. {
  86. name = "Create_artillery";
  87. init = /*%FSM<STATEINIT""">*/"if (_first_run) then" \n
  88. "{" \n
  89. " //Create our vehicle" \n
  90. " _artillery = ""O_MBT_02_arty_F"" createVehicle _pos;" \n
  91. " _artillery setFuel 0;" \n
  92. " _artillery setDir (random 360);" \n
  93. " _artillery addEventHandler[""Fired"", { _artillery setVehicleAmmo 1; }];" \n
  94. "" \n
  95. " //Put a crew inside" \n
  96. " createVehicleCrew _artillery;" \n
  97. "" \n
  98. " //Lock it" \n
  99. " _artillery setVehicleLock ""LOCKED"";" \n
  100. "" \n
  101. " //Create some barriers around the artillery" \n
  102. " _distance = 10;" \n
  103. " _dir = 0;" \n
  104. "" \n
  105. " for ""_c"" from 0 to 7 do" \n
  106. " {" \n
  107. " _barrier_pos = [_pos, _distance, _dir] call BIS_fnc_relPos;" \n
  108. " _barrier = ""Land_HBarrier_3_F"" createVehicle _barrier_pos;" \n
  109. " _barrier setDir _dir;" \n
  110. " _dir = _dir + 45;" \n
  111. "" \n
  112. " _items_to_delete = _items_to_delete + [_barrier];" \n
  113. " };" \n
  114. "" \n
  115. " //Create some units to defend" \n
  116. " _defenders = [EAST, 2, _pos] call AW_fnc_spawnEnemy;" \n
  117. " [_defenders, [[""patrol"", true, 50]]] call AW_fnc_setBehaviour;" \n
  118. "" \n
  119. " //Set _first_run to FALSE so we never create it again!" \n
  120. " _first_run = false;" \n
  121. "};" \n
  122. "" \n
  123. "//Set a timer for our next attack" \n
  124. "_timeout = if (PARAMS_priorityMinTimeBeforeAttack > PARAMS_priorityMaxTimeBeforeAttack) then" \n
  125. "{" \n
  126. " (time + PARAMS_priorityMaxTimeBeforeAttack + (random (PARAMS_priorityMinTimeBeforeAttack + PARAMS_priorityMaxTimeBeforeAttack)))" \n
  127. "} else {" \n
  128. " (time + PARAMS_priorityMinTimeBeforeAttack + (random (PARAMS_priorityMaxTimeBeforeAttack - PARAMS_priorityMinTimeBeforeAttack)))" \n
  129. "};" \n
  130. "" \n
  131. "//Set found target to FALSE" \n
  132. "_found_target = false;"/*%FSM</STATEINIT""">*/;
  133. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  134. class Links
  135. {
  136. /*%FSM<LINK "Dead_">*/
  137. class Dead_
  138. {
  139. priority = 1.000000;
  140. to="Success__Tactical";
  141. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  142. condition=/*%FSM<CONDITION""">*/"!alive _artillery || ({ alive _x } count (crew _artillery)) == 0"/*%FSM</CONDITION""">*/;
  143. action=/*%FSM<ACTION""">*/"hint ""It's dead, Jim."";"/*%FSM</ACTION""">*/;
  144. };
  145. /*%FSM</LINK>*/
  146. /*%FSM<LINK "Ready_to_attack">*/
  147. class Ready_to_attack
  148. {
  149. priority = 0.000000;
  150. to="Finding_a_target";
  151. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  152. condition=/*%FSM<CONDITION""">*/"time > _timeout && alive _artillery"/*%FSM</CONDITION""">*/;
  153. action=/*%FSM<ACTION""">*/"_found_target = false;" \n
  154. "_target = objNull;" \n
  155. "_target_pos = [0,0,0];" \n
  156. "" \n
  157. "//Get our primary ammo" \n
  158. "_shots_to_fire = (3 + (ceil (random 3)));"/*%FSM</ACTION""">*/;
  159. };
  160. /*%FSM</LINK>*/
  161. };
  162. };
  163. /*%FSM</STATE>*/
  164. /*%FSM<STATE "Finding_a_target">*/
  165. class Finding_a_target
  166. {
  167. name = "Finding_a_target";
  168. init = /*%FSM<STATEINIT""">*/"_timeout = (time + 1);"/*%FSM</STATEINIT""">*/;
  169. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  170. class Links
  171. {
  172. /*%FSM<LINK "Find_another_tar">*/
  173. class Find_another_tar
  174. {
  175. priority = 1.000000;
  176. to="Finding_a_target";
  177. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  178. condition=/*%FSM<CONDITION""">*/"!_found_target && time > _timeout"/*%FSM</CONDITION""">*/;
  179. action=/*%FSM<ACTION""">*/"_target = (playableUnits select (floor (random (count playableUnits))));" \n
  180. "_target_pos = getPos _target;" \n
  181. "" \n
  182. "//If the unit is not in a vehicle and is an enemy AND is in range of our guns" \n
  183. "if (vehicle _target == _target && side _target == WEST && (_target distance _artillery) > 1000 && _target_pos inRangeOfArtillery [[_artillery], (_ammo_choices select 0)]) exitWith" \n
  184. "{" \n
  185. " _found_target = true;" \n
  186. "};"/*%FSM</ACTION""">*/;
  187. };
  188. /*%FSM</LINK>*/
  189. /*%FSM<LINK "Ready_to_fire_">*/
  190. class Ready_to_fire_
  191. {
  192. priority = 0.000000;
  193. to="FIRE_";
  194. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  195. condition=/*%FSM<CONDITION""">*/"_found_target"/*%FSM</CONDITION""">*/;
  196. action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
  197. };
  198. /*%FSM</LINK>*/
  199. };
  200. };
  201. /*%FSM</STATE>*/
  202. /*%FSM<STATE "Success__Tactical">*/
  203. class Success__Tactical
  204. {
  205. name = "Success__Tactical";
  206. init = /*%FSM<STATEINIT""">*/"[_defenders, [[""retreat"", _pos, 1000]]] call AW_fnc_setBehaviour;" \n
  207. ""/*%FSM</STATEINIT""">*/;
  208. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  209. class Links
  210. {
  211. /*%FSM<LINK "Time_to_run___">*/
  212. class Time_to_run___
  213. {
  214. priority = 0.000000;
  215. to="Set_distance_tim";
  216. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  217. condition=/*%FSM<CONDITION""">*/""/*%FSM</CONDITION""">*/;
  218. action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
  219. };
  220. /*%FSM</LINK>*/
  221. };
  222. };
  223. /*%FSM</STATE>*/
  224. /*%FSM<STATE "Set_distance_tim">*/
  225. class Set_distance_tim
  226. {
  227. name = "Set_distance_tim";
  228. init = /*%FSM<STATEINIT""">*/"_timeout = (time + (5 + random(15)));"/*%FSM</STATEINIT""">*/;
  229. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  230. class Links
  231. {
  232. /*%FSM<LINK "Ready_to_check_">*/
  233. class Ready_to_check_
  234. {
  235. priority = 0.000000;
  236. to="So____are_they_far";
  237. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  238. condition=/*%FSM<CONDITION""">*/"time > _timeout"/*%FSM</CONDITION""">*/;
  239. action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
  240. };
  241. /*%FSM</LINK>*/
  242. };
  243. };
  244. /*%FSM</STATE>*/
  245. /*%FSM<STATE "So____are_they_far">*/
  246. class So____are_they_far
  247. {
  248. name = "So____are_they_far";
  249. init = /*%FSM<STATEINIT""">*/""/*%FSM</STATEINIT""">*/;
  250. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  251. class Links
  252. {
  253. /*%FSM<LINK "Yep_">*/
  254. class Yep_
  255. {
  256. priority = 1.000000;
  257. to="Clean_up_and_qui";
  258. precondition = /*%FSM<CONDPRECONDITION""">*/"_distance = 500;" \n
  259. "_farAway = true;" \n
  260. "" \n
  261. "{" \n
  262. " if (!_farAway) exitWith {};" \n
  263. "" \n
  264. " if (typeName _x == ""GROUP"") then" \n
  265. " {" \n
  266. " _leader = leader _x;" \n
  267. "" \n
  268. " {" \n
  269. " if ((_x distance _leader) < _distance) exitWith { _farAway = false; };" \n
  270. " } forEach playableUnits;" \n
  271. " };" \n
  272. "} forEach _defenders;"/*%FSM</CONDPRECONDITION""">*/;
  273. condition=/*%FSM<CONDITION""">*/"_farAway"/*%FSM</CONDITION""">*/;
  274. action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
  275. };
  276. /*%FSM</LINK>*/
  277. /*%FSM<LINK "Not_yet_">*/
  278. class Not_yet_
  279. {
  280. priority = 0.000000;
  281. to="Set_distance_tim";
  282. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  283. condition=/*%FSM<CONDITION""">*/""/*%FSM</CONDITION""">*/;
  284. action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
  285. };
  286. /*%FSM</LINK>*/
  287. };
  288. };
  289. /*%FSM</STATE>*/
  290. /*%FSM<STATE "Clean_up_and_qui">*/
  291. class Clean_up_and_qui
  292. {
  293. name = "Clean_up_and_qui";
  294. init = /*%FSM<STATEINIT""">*/"_artillery call AW_fnc_collectGarbage;" \n
  295. "_defenders call AW_fnc_collectGarbage;" \n
  296. "_items_to_delete call AW_fnc_collectGarbage;" \n
  297. "" \n
  298. ""/*%FSM</STATEINIT""">*/;
  299. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  300. class Links
  301. {
  302. };
  303. };
  304. /*%FSM</STATE>*/
  305. /*%FSM<STATE "FIRE_">*/
  306. class FIRE_
  307. {
  308. name = "FIRE_";
  309. init = /*%FSM<STATEINIT""">*/"_artillery doArtilleryFire [_target_pos, _ammo, _shots_to_fire];"/*%FSM</STATEINIT""">*/;
  310. precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
  311. class Links
  312. {
  313. /*%FSM<LINK "Loop_back_to_the">*/
  314. class Loop_back_to_the
  315. {
  316. priority = 0.000000;
  317. to="Create_artillery";
  318. precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
  319. condition=/*%FSM<CONDITION""">*/""/*%FSM</CONDITION""">*/;
  320. action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
  321. };
  322. /*%FSM</LINK>*/
  323. };
  324. };
  325. /*%FSM</STATE>*/
  326. };
  327. initState="Enemy_Artillery";
  328. finalStates[] =
  329. {
  330. "Clean_up_and_qui",
  331. };
  332. };
  333. /*%FSM</COMPILE>*/