ra2-eva-cursor-hooks 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/assets/audio/README.md +74 -0
  2. package/assets/audio/eva_allied/TRANSCRIPTIONS.txt +131 -0
  3. package/assets/audio/eva_allied/ceva001.wav +0 -0
  4. package/assets/audio/eva_allied/ceva002.wav +0 -0
  5. package/assets/audio/eva_allied/ceva003.wav +0 -0
  6. package/assets/audio/eva_allied/ceva004.wav +0 -0
  7. package/assets/audio/eva_allied/ceva005.wav +0 -0
  8. package/assets/audio/eva_allied/ceva006.wav +0 -0
  9. package/assets/audio/eva_allied/ceva007.wav +0 -0
  10. package/assets/audio/eva_allied/ceva008.wav +0 -0
  11. package/assets/audio/eva_allied/ceva009.wav +0 -0
  12. package/assets/audio/eva_allied/ceva010.wav +0 -0
  13. package/assets/audio/eva_allied/ceva011.wav +0 -0
  14. package/assets/audio/eva_allied/ceva012.wav +0 -0
  15. package/assets/audio/eva_allied/ceva013.wav +0 -0
  16. package/assets/audio/eva_allied/ceva014.wav +0 -0
  17. package/assets/audio/eva_allied/ceva015.wav +0 -0
  18. package/assets/audio/eva_allied/ceva016.wav +0 -0
  19. package/assets/audio/eva_allied/ceva017.wav +0 -0
  20. package/assets/audio/eva_allied/ceva018.wav +0 -0
  21. package/assets/audio/eva_allied/ceva019.wav +0 -0
  22. package/assets/audio/eva_allied/ceva020.wav +0 -0
  23. package/assets/audio/eva_allied/ceva021.wav +0 -0
  24. package/assets/audio/eva_allied/ceva022.wav +0 -0
  25. package/assets/audio/eva_allied/ceva023.wav +0 -0
  26. package/assets/audio/eva_allied/ceva024.wav +0 -0
  27. package/assets/audio/eva_allied/ceva025.wav +0 -0
  28. package/assets/audio/eva_allied/ceva026.wav +0 -0
  29. package/assets/audio/eva_allied/ceva027.wav +0 -0
  30. package/assets/audio/eva_allied/ceva028.wav +0 -0
  31. package/assets/audio/eva_allied/ceva029.wav +0 -0
  32. package/assets/audio/eva_allied/ceva030.wav +0 -0
  33. package/assets/audio/eva_allied/ceva031.wav +0 -0
  34. package/assets/audio/eva_allied/ceva032.wav +0 -0
  35. package/assets/audio/eva_allied/ceva033.wav +0 -0
  36. package/assets/audio/eva_allied/ceva035.wav +0 -0
  37. package/assets/audio/eva_allied/ceva036.wav +0 -0
  38. package/assets/audio/eva_allied/ceva037.wav +0 -0
  39. package/assets/audio/eva_allied/ceva038.wav +0 -0
  40. package/assets/audio/eva_allied/ceva039.wav +0 -0
  41. package/assets/audio/eva_allied/ceva040.wav +0 -0
  42. package/assets/audio/eva_allied/ceva041.wav +0 -0
  43. package/assets/audio/eva_allied/ceva042.wav +0 -0
  44. package/assets/audio/eva_allied/ceva043.wav +0 -0
  45. package/assets/audio/eva_allied/ceva044.wav +0 -0
  46. package/assets/audio/eva_allied/ceva045.wav +0 -0
  47. package/assets/audio/eva_allied/ceva046.wav +0 -0
  48. package/assets/audio/eva_allied/ceva047.wav +0 -0
  49. package/assets/audio/eva_allied/ceva048.wav +0 -0
  50. package/assets/audio/eva_allied/ceva049.wav +0 -0
  51. package/assets/audio/eva_allied/ceva050.wav +0 -0
  52. package/assets/audio/eva_allied/ceva051.wav +0 -0
  53. package/assets/audio/eva_allied/ceva052.wav +0 -0
  54. package/assets/audio/eva_allied/ceva053.wav +0 -0
  55. package/assets/audio/eva_allied/ceva054.wav +0 -0
  56. package/assets/audio/eva_allied/ceva055.wav +0 -0
  57. package/assets/audio/eva_allied/ceva056.wav +0 -0
  58. package/assets/audio/eva_allied/ceva057.wav +0 -0
  59. package/assets/audio/eva_allied/ceva058.wav +0 -0
  60. package/assets/audio/eva_allied/ceva059.wav +0 -0
  61. package/assets/audio/eva_allied/ceva060.wav +0 -0
  62. package/assets/audio/eva_allied/ceva061.wav +0 -0
  63. package/assets/audio/eva_allied/ceva062.wav +0 -0
  64. package/assets/audio/eva_allied/ceva063.wav +0 -0
  65. package/assets/audio/eva_allied/ceva064.wav +0 -0
  66. package/assets/audio/eva_allied/ceva065.wav +0 -0
  67. package/assets/audio/eva_allied/ceva066.wav +0 -0
  68. package/assets/audio/eva_allied/ceva067.wav +0 -0
  69. package/assets/audio/eva_allied/ceva068.wav +0 -0
  70. package/assets/audio/eva_allied/ceva069.wav +0 -0
  71. package/assets/audio/eva_allied/ceva070.wav +0 -0
  72. package/assets/audio/eva_allied/ceva071.wav +0 -0
  73. package/assets/audio/eva_allied/ceva072.wav +0 -0
  74. package/assets/audio/eva_allied/ceva073.wav +0 -0
  75. package/assets/audio/eva_allied/ceva074.wav +0 -0
  76. package/assets/audio/eva_allied/ceva075.wav +0 -0
  77. package/assets/audio/eva_allied/ceva076.wav +0 -0
  78. package/assets/audio/eva_allied/ceva077.wav +0 -0
  79. package/assets/audio/eva_allied/ceva078.wav +0 -0
  80. package/assets/audio/eva_allied/ceva079.wav +0 -0
  81. package/assets/audio/eva_allied/ceva080.wav +0 -0
  82. package/assets/audio/eva_allied/ceva081.wav +0 -0
  83. package/assets/audio/eva_allied/ceva082.wav +0 -0
  84. package/assets/audio/eva_allied/ceva083.wav +0 -0
  85. package/assets/audio/eva_allied/ceva084.wav +0 -0
  86. package/assets/audio/eva_allied/ceva085.wav +0 -0
  87. package/assets/audio/eva_allied/ceva086.wav +0 -0
  88. package/assets/audio/eva_allied/ceva087.wav +0 -0
  89. package/assets/audio/eva_allied/ceva088.wav +0 -0
  90. package/assets/audio/eva_allied/ceva089.wav +0 -0
  91. package/assets/audio/eva_allied/ceva090.wav +0 -0
  92. package/assets/audio/eva_allied/ceva091.wav +0 -0
  93. package/assets/audio/eva_allied/ceva092.wav +0 -0
  94. package/assets/audio/eva_allied/ceva093.wav +0 -0
  95. package/assets/audio/eva_allied/ceva094.wav +0 -0
  96. package/assets/audio/eva_allied/ceva095.wav +0 -0
  97. package/assets/audio/eva_allied/ceva096.wav +0 -0
  98. package/assets/audio/eva_allied/ceva097.wav +0 -0
  99. package/assets/audio/eva_allied/ceva098.wav +0 -0
  100. package/assets/audio/eva_allied/ceva099.wav +0 -0
  101. package/assets/audio/eva_allied/ceva100.wav +0 -0
  102. package/assets/audio/eva_allied/ceva101.wav +0 -0
  103. package/assets/audio/eva_allied/ceva102.wav +0 -0
  104. package/assets/audio/eva_allied/ceva103.wav +0 -0
  105. package/assets/audio/eva_allied/ceva104.wav +0 -0
  106. package/assets/audio/eva_allied/ceva105.wav +0 -0
  107. package/assets/audio/eva_allied/ceva106.wav +0 -0
  108. package/assets/audio/eva_allied/ceva107.wav +0 -0
  109. package/assets/audio/eva_allied/ceva108.wav +0 -0
  110. package/assets/audio/eva_allied/ceva109.wav +0 -0
  111. package/assets/audio/eva_allied/ceva120.wav +0 -0
  112. package/assets/audio/eva_allied/ceva121.wav +0 -0
  113. package/assets/audio/eva_allied/ceva122.wav +0 -0
  114. package/assets/audio/eva_allied/cevau06.wav +0 -0
  115. package/assets/audio/eva_allied/cevau07.wav +0 -0
  116. package/assets/audio/eva_allied/cevau08.wav +0 -0
  117. package/assets/audio/eva_allied/cevau13.wav +0 -0
  118. package/assets/audio/eva_allied/cevau15.wav +0 -0
  119. package/assets/audio/eva_allied/cevau19.wav +0 -0
  120. package/assets/audio/eva_allied/cevau20.wav +0 -0
  121. package/assets/audio/eva_allied/cevau22.wav +0 -0
  122. package/assets/audio/eva_allied/cevau23.wav +0 -0
  123. package/assets/audio/eva_allied/cevau24.wav +0 -0
  124. package/assets/audio/eva_allied/cevau25.wav +0 -0
  125. package/assets/audio/eva_allied/cevau26.wav +0 -0
  126. package/assets/audio/eva_allied/cevau27.wav +0 -0
  127. package/assets/audio/eva_allied/cevau31.wav +0 -0
  128. package/assets/audio/eva_allied/cevau36.wav +0 -0
  129. package/assets/audio/eva_allied/cevau37.wav +0 -0
  130. package/assets/audio/eva_allied/cevau38.wav +0 -0
  131. package/assets/audio/eva_allied/transcriptions.json +130 -0
  132. package/assets/audio/eva_soviet/TRANSCRIPTIONS.txt +133 -0
  133. package/assets/audio/eva_soviet/csof001.wav +0 -0
  134. package/assets/audio/eva_soviet/csof002.wav +0 -0
  135. package/assets/audio/eva_soviet/csof003.wav +0 -0
  136. package/assets/audio/eva_soviet/csof004.wav +0 -0
  137. package/assets/audio/eva_soviet/csof005.wav +0 -0
  138. package/assets/audio/eva_soviet/csof006.wav +0 -0
  139. package/assets/audio/eva_soviet/csof007.wav +0 -0
  140. package/assets/audio/eva_soviet/csof008.wav +0 -0
  141. package/assets/audio/eva_soviet/csof009.wav +0 -0
  142. package/assets/audio/eva_soviet/csof010.wav +0 -0
  143. package/assets/audio/eva_soviet/csof011.wav +0 -0
  144. package/assets/audio/eva_soviet/csof012.wav +0 -0
  145. package/assets/audio/eva_soviet/csof013.wav +0 -0
  146. package/assets/audio/eva_soviet/csof014.wav +0 -0
  147. package/assets/audio/eva_soviet/csof015.wav +0 -0
  148. package/assets/audio/eva_soviet/csof016.wav +0 -0
  149. package/assets/audio/eva_soviet/csof017.wav +0 -0
  150. package/assets/audio/eva_soviet/csof018.wav +0 -0
  151. package/assets/audio/eva_soviet/csof019.wav +0 -0
  152. package/assets/audio/eva_soviet/csof020.wav +0 -0
  153. package/assets/audio/eva_soviet/csof021.wav +0 -0
  154. package/assets/audio/eva_soviet/csof022.wav +0 -0
  155. package/assets/audio/eva_soviet/csof023.wav +0 -0
  156. package/assets/audio/eva_soviet/csof024.wav +0 -0
  157. package/assets/audio/eva_soviet/csof025.wav +0 -0
  158. package/assets/audio/eva_soviet/csof026.wav +0 -0
  159. package/assets/audio/eva_soviet/csof027.wav +0 -0
  160. package/assets/audio/eva_soviet/csof028.wav +0 -0
  161. package/assets/audio/eva_soviet/csof029.wav +0 -0
  162. package/assets/audio/eva_soviet/csof030.wav +0 -0
  163. package/assets/audio/eva_soviet/csof031.wav +0 -0
  164. package/assets/audio/eva_soviet/csof032.wav +0 -0
  165. package/assets/audio/eva_soviet/csof033.wav +0 -0
  166. package/assets/audio/eva_soviet/csof035.wav +0 -0
  167. package/assets/audio/eva_soviet/csof036.wav +0 -0
  168. package/assets/audio/eva_soviet/csof037.wav +0 -0
  169. package/assets/audio/eva_soviet/csof038.wav +0 -0
  170. package/assets/audio/eva_soviet/csof039.wav +0 -0
  171. package/assets/audio/eva_soviet/csof040.wav +0 -0
  172. package/assets/audio/eva_soviet/csof041.wav +0 -0
  173. package/assets/audio/eva_soviet/csof042.wav +0 -0
  174. package/assets/audio/eva_soviet/csof043.wav +0 -0
  175. package/assets/audio/eva_soviet/csof044.wav +0 -0
  176. package/assets/audio/eva_soviet/csof045.wav +0 -0
  177. package/assets/audio/eva_soviet/csof046.wav +0 -0
  178. package/assets/audio/eva_soviet/csof047.wav +0 -0
  179. package/assets/audio/eva_soviet/csof048.wav +0 -0
  180. package/assets/audio/eva_soviet/csof049.wav +0 -0
  181. package/assets/audio/eva_soviet/csof050.wav +0 -0
  182. package/assets/audio/eva_soviet/csof051.wav +0 -0
  183. package/assets/audio/eva_soviet/csof052.wav +0 -0
  184. package/assets/audio/eva_soviet/csof053.wav +0 -0
  185. package/assets/audio/eva_soviet/csof054.wav +0 -0
  186. package/assets/audio/eva_soviet/csof055.wav +0 -0
  187. package/assets/audio/eva_soviet/csof056.wav +0 -0
  188. package/assets/audio/eva_soviet/csof057.wav +0 -0
  189. package/assets/audio/eva_soviet/csof058.wav +0 -0
  190. package/assets/audio/eva_soviet/csof059.wav +0 -0
  191. package/assets/audio/eva_soviet/csof060.wav +0 -0
  192. package/assets/audio/eva_soviet/csof061.wav +0 -0
  193. package/assets/audio/eva_soviet/csof062.wav +0 -0
  194. package/assets/audio/eva_soviet/csof063.wav +0 -0
  195. package/assets/audio/eva_soviet/csof064.wav +0 -0
  196. package/assets/audio/eva_soviet/csof065.wav +0 -0
  197. package/assets/audio/eva_soviet/csof066.wav +0 -0
  198. package/assets/audio/eva_soviet/csof067.wav +0 -0
  199. package/assets/audio/eva_soviet/csof068.wav +0 -0
  200. package/assets/audio/eva_soviet/csof069.wav +0 -0
  201. package/assets/audio/eva_soviet/csof070.wav +0 -0
  202. package/assets/audio/eva_soviet/csof071.wav +0 -0
  203. package/assets/audio/eva_soviet/csof072.wav +0 -0
  204. package/assets/audio/eva_soviet/csof073.wav +0 -0
  205. package/assets/audio/eva_soviet/csof074.wav +0 -0
  206. package/assets/audio/eva_soviet/csof075.wav +0 -0
  207. package/assets/audio/eva_soviet/csof076.wav +0 -0
  208. package/assets/audio/eva_soviet/csof077.wav +0 -0
  209. package/assets/audio/eva_soviet/csof078.wav +0 -0
  210. package/assets/audio/eva_soviet/csof079.wav +0 -0
  211. package/assets/audio/eva_soviet/csof080.wav +0 -0
  212. package/assets/audio/eva_soviet/csof081.wav +0 -0
  213. package/assets/audio/eva_soviet/csof082.wav +0 -0
  214. package/assets/audio/eva_soviet/csof083.wav +0 -0
  215. package/assets/audio/eva_soviet/csof084.wav +0 -0
  216. package/assets/audio/eva_soviet/csof085.wav +0 -0
  217. package/assets/audio/eva_soviet/csof086.wav +0 -0
  218. package/assets/audio/eva_soviet/csof087.wav +0 -0
  219. package/assets/audio/eva_soviet/csof088.wav +0 -0
  220. package/assets/audio/eva_soviet/csof089.wav +0 -0
  221. package/assets/audio/eva_soviet/csof090.wav +0 -0
  222. package/assets/audio/eva_soviet/csof091.wav +0 -0
  223. package/assets/audio/eva_soviet/csof092.wav +0 -0
  224. package/assets/audio/eva_soviet/csof093.wav +0 -0
  225. package/assets/audio/eva_soviet/csof094.wav +0 -0
  226. package/assets/audio/eva_soviet/csof095.wav +0 -0
  227. package/assets/audio/eva_soviet/csof096.wav +0 -0
  228. package/assets/audio/eva_soviet/csof097.wav +0 -0
  229. package/assets/audio/eva_soviet/csof098.wav +0 -0
  230. package/assets/audio/eva_soviet/csof099.wav +0 -0
  231. package/assets/audio/eva_soviet/csof100.wav +0 -0
  232. package/assets/audio/eva_soviet/csof101.wav +0 -0
  233. package/assets/audio/eva_soviet/csof102.wav +0 -0
  234. package/assets/audio/eva_soviet/csof103.wav +0 -0
  235. package/assets/audio/eva_soviet/csof104.wav +0 -0
  236. package/assets/audio/eva_soviet/csof105.wav +0 -0
  237. package/assets/audio/eva_soviet/csof106.wav +0 -0
  238. package/assets/audio/eva_soviet/csof107.wav +0 -0
  239. package/assets/audio/eva_soviet/csof108.wav +0 -0
  240. package/assets/audio/eva_soviet/csof109.wav +0 -0
  241. package/assets/audio/eva_soviet/csof120.wav +0 -0
  242. package/assets/audio/eva_soviet/csof121.wav +0 -0
  243. package/assets/audio/eva_soviet/csof122.wav +0 -0
  244. package/assets/audio/eva_soviet/csofu04.wav +0 -0
  245. package/assets/audio/eva_soviet/csofu06.wav +0 -0
  246. package/assets/audio/eva_soviet/csofu07.wav +0 -0
  247. package/assets/audio/eva_soviet/csofu08.wav +0 -0
  248. package/assets/audio/eva_soviet/csofu09.wav +0 -0
  249. package/assets/audio/eva_soviet/csofu10.wav +0 -0
  250. package/assets/audio/eva_soviet/csofu11.wav +0 -0
  251. package/assets/audio/eva_soviet/csofu15.wav +0 -0
  252. package/assets/audio/eva_soviet/csofu16.wav +0 -0
  253. package/assets/audio/eva_soviet/csofu18.wav +0 -0
  254. package/assets/audio/eva_soviet/csofu19.wav +0 -0
  255. package/assets/audio/eva_soviet/csofu20.wav +0 -0
  256. package/assets/audio/eva_soviet/csofu21.wav +0 -0
  257. package/assets/audio/eva_soviet/csofu25.wav +0 -0
  258. package/assets/audio/eva_soviet/csofu26.wav +0 -0
  259. package/assets/audio/eva_soviet/csofu27.wav +0 -0
  260. package/assets/audio/eva_soviet/csofu30.wav +0 -0
  261. package/assets/audio/eva_soviet/csofu31.wav +0 -0
  262. package/assets/audio/eva_soviet/csofu33.wav +0 -0
  263. package/assets/audio/eva_soviet/transcriptions.json +132 -0
  264. package/bin/install.js +249 -0
  265. package/package.json +33 -0
  266. package/src/index.ts +122 -0
  267. package/src/player.ts +230 -0
  268. package/src/sounds.ts +176 -0
  269. package/src/types.ts +241 -0
@@ -0,0 +1,132 @@
1
+ {
2
+ "csof001.wav": "Warning, nuclear silo detected.",
3
+ "csof002.wav": "Warning, nuclear missile launched.",
4
+ "csof003.wav": "Nuclear missile ready.",
5
+ "csof004.wav": "Warning, iron curtain detected.",
6
+ "csof005.wav": "Warning, iron curtain activated.",
7
+ "csof006.wav": "Iron Curtain ready.",
8
+ "csof007.wav": "Warning, chronosphere detected.",
9
+ "csof008.wav": "Warning, chronosphere activated.",
10
+ "csof009.wav": "Chronosphere ready.",
11
+ "csof010.wav": "Weather control device detected.",
12
+ "csof011.wav": "Warning, lightning storm created.",
13
+ "csof012.wav": "Lightning storm ready.",
14
+ "csof013.wav": "Mission accomplished.",
15
+ "csof014.wav": "Mission failed.",
16
+ "csof015.wav": "Battle control terminated.",
17
+ "csof016.wav": "Establishing battlefield control. Stand by.",
18
+ "csof017.wav": "Primary objective achieved.",
19
+ "csof018.wav": "Secondary objective achieved.",
20
+ "csof019.wav": "Tertiary objective achieved.",
21
+ "csof020.wav": "Critical unit lost.",
22
+ "csof021.wav": "Critical structure lost.",
23
+ "csof022.wav": "You are victorious.",
24
+ "csof023.wav": "You have lost.",
25
+ "csof024.wav": "You have resigned.",
26
+ "csof025.wav": "Player resigned.",
27
+ "csof026.wav": "Player defeated.",
28
+ "csof027.wav": "20 minutes remaining.",
29
+ "csof028.wav": "10 minutes remaining.",
30
+ "csof029.wav": "5 minutes remaining.",
31
+ "csof030.wav": "4 minutes remaining.",
32
+ "csof031.wav": "3 minutes remaining.",
33
+ "csof032.wav": "2 minutes remaining.",
34
+ "csof033.wav": "1 minute remaining.",
35
+ "csof035.wav": "Timer started.",
36
+ "csof036.wav": "Timer stopped.",
37
+ "csof037.wav": "Ore miner under attack.",
38
+ "csof038.wav": "Reinforcements have arrived.",
39
+ "csof039.wav": "New terrain discovered.",
40
+ "csof040.wav": "Incoming transmission.",
41
+ "csof041.wav": "Beacon detected.",
42
+ "csof042.wav": "Beacon placed.",
43
+ "csof043.wav": "Alliance formed.",
44
+ "csof044.wav": "Alliance broken.",
45
+ "csof045.wav": "Our ally is under attack.",
46
+ "csof046.wav": "Bridge repaired.",
47
+ "csof047.wav": "Unable to comply, building in progress.",
48
+ "csof048.wav": "Construction complete.",
49
+ "csof049.wav": "New construction options.",
50
+ "csof050.wav": "Insufficient funds.",
51
+ "csof051.wav": "Cancelled.",
52
+ "csof052.wav": "Building.",
53
+ "csof053.wav": "Low power.",
54
+ "csof054.wav": "Our base is under attack.",
55
+ "csof055.wav": "Primary building selected.",
56
+ "csof056.wav": "On hold.",
57
+ "csof057.wav": "Repairing.",
58
+ "csof058.wav": "Structure sold.",
59
+ "csof059.wav": "Base defenses offline.",
60
+ "csof060.wav": "Building offline.",
61
+ "csof061.wav": "Building online.",
62
+ "csof062.wav": "Unit ready.",
63
+ "csof063.wav": "Cannot deploy here.",
64
+ "csof064.wav": "Unit lost.",
65
+ "csof065.wav": "Select target.",
66
+ "csof066.wav": "Training.",
67
+ "csof067.wav": "Armor upgraded.",
68
+ "csof068.wav": "Firepower upgraded.",
69
+ "csof069.wav": "Speed upgraded.",
70
+ "csof070.wav": "Unit repaired.",
71
+ "csof071.wav": "Unit sold.",
72
+ "csof072.wav": "Building captured.",
73
+ "csof073.wav": "Building infiltrated.",
74
+ "csof074.wav": "New technology acquired.",
75
+ "csof075.wav": "Enemy base powered down.",
76
+ "csof076.wav": "Unit firepower upgraded.",
77
+ "csof077.wav": "Unit armor upgraded.",
78
+ "csof078.wav": "Unit speed upgraded.",
79
+ "csof079.wav": "Unit promoted.",
80
+ "csof080.wav": "Unit upgraded.",
81
+ "csof081.wav": "Firepower technology stolen, all units gain firepower upgrade.",
82
+ "csof082.wav": "Armor technology stolen, all units gain armor upgrade.",
83
+ "csof083.wav": "New mission objective received.",
84
+ "csof084.wav": "Upgrade in progress.",
85
+ "csof085.wav": "Upgrade complete.",
86
+ "csof086.wav": "Ore miner offline.",
87
+ "csof087.wav": "Enemy power restored.",
88
+ "csof088.wav": "Building infiltrated, technology stolen.",
89
+ "csof089.wav": "Building infiltrated, radar sabotaged.",
90
+ "csof090.wav": "Building infiltrated, cash stolen.",
91
+ "csof091.wav": "Building infiltrated, power sabotaged.",
92
+ "csof092.wav": "Technology stolen.",
93
+ "csof093.wav": "Radar sabotaged.",
94
+ "csof094.wav": "Cash stolen.",
95
+ "csof095.wav": "Power sabotaged.",
96
+ "csof096.wav": "Warning, enemy air armada detected.",
97
+ "csof097.wav": "Warning, enemy fleet detected.",
98
+ "csof098.wav": "Warning, enemy armor battalion detected.",
99
+ "csof099.wav": "Warning, enemy infantry battalion detected.",
100
+ "csof100.wav": "New rally point established.",
101
+ "csof101.wav": "Alliance requested.",
102
+ "csof102.wav": "Requesting alliance.",
103
+ "csof103.wav": "Enemy alliance formed.",
104
+ "csof104.wav": "New objective received.",
105
+ "csof105.wav": "Tech building captured.",
106
+ "csof106.wav": "Tech building lost.",
107
+ "csof107.wav": "Structure garrisoned.",
108
+ "csof108.wav": "Structure abandoned.",
109
+ "csof109.wav": "War miner offline.",
110
+ "csof120.wav": "Battle control online.",
111
+ "csof121.wav": "Reinforcements ready.",
112
+ "csof122.wav": "Weather control device offline.",
113
+ "csofu04.wav": "Soviet technology at its finest, terror drones can enter and destroy enemy vehicles from the inside.",
114
+ "csofu06.wav": "The V3 launcher has extreme range capabilities coupled with devastating damage potential. Destruction guaranteed. Just don't leave it undefended.",
115
+ "csofu07.wav": "The appropriately named Apocalypse Tank is war in a can. It can attack any ground or air targets and be expected to be the last unit standing.",
116
+ "csofu08.wav": "They may be slow, but the Kirov airships can take great punishment and deliver even more.",
117
+ "csofu09.wav": "The Sea Scorpion is a fast attack sea raider. It cannot win the war for you, but you cannot win the war without it. It is your only anti-air defense on the water.",
118
+ "csofu10.wav": "I don't agree with this kind of experimentation, but you cannot deny the results. A giant squid can immobilize and eventually destroy any sea vessel.",
119
+ "csofu11.wav": "The Typhoon attack sub is undetectable by normal Allied units, but look out for Allied dolphins and destroyers.",
120
+ "csofu15.wav": "Tesla troopers have powerful weapons but they are useless against buildings. They also make excellent base defense as they can overpower Tesla coils with their weapons.",
121
+ "csofu16.wav": "The Soviet engineer can repair buildings or capture enemy buildings if you can get them past defenses.",
122
+ "csofu18.wav": "Crazy Ivan can plant bombs on enemy buildings, or perhaps a conscript would agree to carry them for you.",
123
+ "csofu19.wav": "The Allies cannot match our nuclear power. Deploy a Desolator to sterilize an area.",
124
+ "csofu20.wav": "Our most top secret weapon, the Psi-Corps trooper is useful for quickly turning Allied units to our side.",
125
+ "csofu21.wav": "Commander, this Allied GI is a well-trained soldier capable of quickly deploying a heavy machine gun when stationed within buildings or deployed with his sandbag nest.",
126
+ "csofu25.wav": "These arrogant Allied spies believe their disguises will allow them to infiltrate our buildings. They will soon find that the only thing they can infiltrate is our faithful dog's stomachs.",
127
+ "csofu26.wav": "The Allied Rocketeers are men who hurl themselves through the air thanks to some jetpacks strapped to them in the hopes of wounding one of our tanks or buildings. Fools.",
128
+ "csofu27.wav": "Commander, beware these Chrono Legionnaires. They use some unknown technology to teleport themselves anywhere and then simply erase our forces.",
129
+ "csofu30.wav": "Comrade, this Prism Tank of the Allies is a dangerous threat to our massed forces. Its directed energy weapon has no trouble harming many of our forces in a single shot.",
130
+ "csofu31.wav": "Another annoying trick of the Allies. The Mirage Tank can mask itself as almost any object nearby it and then remain concealed and fire upon us.",
131
+ "csofu33.wav": "The Allied Harrier is an airborne threat to any of our forces who do not have adequate anti-air support. It does not stand up well to flak, Commander."
132
+ }
package/bin/install.js ADDED
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Red Alert 2 EVA Cursor Hooks Installer
5
+ * Installs EVA voice lines as Cursor IDE hooks
6
+ *
7
+ * Usage: npx ra2-eva-cursor-hooks
8
+ */
9
+
10
+ const fs = require("fs");
11
+ const path = require("path");
12
+ const os = require("os");
13
+
14
+ // ANSI colors
15
+ const colors = {
16
+ red: "\x1b[0;31m",
17
+ green: "\x1b[0;32m",
18
+ yellow: "\x1b[1;33m",
19
+ blue: "\x1b[0;34m",
20
+ reset: "\x1b[0m",
21
+ };
22
+
23
+ function log(color, message) {
24
+ console.log(`${color}${message}${colors.reset}`);
25
+ }
26
+
27
+ function copyRecursive(src, dest) {
28
+ const stat = fs.statSync(src);
29
+
30
+ if (stat.isDirectory()) {
31
+ fs.mkdirSync(dest, { recursive: true });
32
+ const entries = fs.readdirSync(src);
33
+ for (const entry of entries) {
34
+ copyRecursive(path.join(src, entry), path.join(dest, entry));
35
+ }
36
+ } else {
37
+ fs.copyFileSync(src, dest);
38
+ }
39
+ }
40
+
41
+ function countFiles(dir, extension) {
42
+ let count = 0;
43
+ const entries = fs.readdirSync(dir);
44
+ for (const entry of entries) {
45
+ if (entry.endsWith(extension)) {
46
+ count++;
47
+ }
48
+ }
49
+ return count;
50
+ }
51
+
52
+ function main() {
53
+ // Banner
54
+ log(colors.blue, "╔═══════════════════════════════════════════════════════╗");
55
+ log(
56
+ colors.blue,
57
+ `║ ${colors.red}RED ALERT 2${colors.blue} EVA Cursor Hooks Installer ║`
58
+ );
59
+ log(colors.blue, "╚═══════════════════════════════════════════════════════╝");
60
+ console.log();
61
+
62
+ // Paths
63
+ const homeDir = os.homedir();
64
+ const cursorDir = path.join(homeDir, ".cursor");
65
+ const targetDir = path.join(cursorDir, "hooks", "ra2-eva");
66
+ const hooksJsonPath = path.join(cursorDir, "hooks.json");
67
+
68
+ // Source paths (relative to this script's package)
69
+ const packageRoot = path.join(__dirname, "..");
70
+ const srcDir = path.join(packageRoot, "src");
71
+ const assetsDir = path.join(packageRoot, "assets");
72
+
73
+ // Step 1: Remove existing installation
74
+ log(colors.yellow, "[1/5] Removing existing installation...");
75
+ if (fs.existsSync(targetDir)) {
76
+ fs.rmSync(targetDir, { recursive: true, force: true });
77
+ }
78
+
79
+ // Step 2: Create directory structure
80
+ log(colors.yellow, "[2/5] Creating directory structure...");
81
+ fs.mkdirSync(targetDir, { recursive: true });
82
+
83
+ // Step 3: Copy TypeScript source files
84
+ log(colors.yellow, "[3/5] Copying TypeScript source files...");
85
+ const srcFiles = ["index.ts", "player.ts", "sounds.ts", "types.ts"];
86
+ for (const file of srcFiles) {
87
+ const srcPath = path.join(srcDir, file);
88
+ const destPath = path.join(targetDir, file);
89
+ if (fs.existsSync(srcPath)) {
90
+ fs.copyFileSync(srcPath, destPath);
91
+ }
92
+ }
93
+
94
+ // Step 4: Copy audio assets
95
+ log(colors.yellow, "[4/5] Copying audio assets...");
96
+ const assetsTargetDir = path.join(targetDir, "assets");
97
+ copyRecursive(assetsDir, assetsTargetDir);
98
+
99
+ const alliedDir = path.join(assetsTargetDir, "audio", "eva_allied");
100
+ const sovietDir = path.join(assetsTargetDir, "audio", "eva_soviet");
101
+ const alliedCount = fs.existsSync(alliedDir)
102
+ ? countFiles(alliedDir, ".wav")
103
+ : 0;
104
+ const sovietCount = fs.existsSync(sovietDir)
105
+ ? countFiles(sovietDir, ".wav")
106
+ : 0;
107
+
108
+ console.log(
109
+ ` Allied EVA sounds: ${colors.green}${alliedCount}${colors.reset}`
110
+ );
111
+ console.log(
112
+ ` Soviet EVA sounds: ${colors.green}${sovietCount}${colors.reset}`
113
+ );
114
+
115
+ // Step 5: Configure hooks.json
116
+ log(colors.yellow, "[5/5] Configuring hooks.json...");
117
+
118
+ const hookCommand = `bun run ${targetDir}/index.ts`;
119
+ const hookEvents = [
120
+ "sessionStart",
121
+ "sessionEnd",
122
+ "preToolUse",
123
+ "postToolUse",
124
+ "postToolUseFailure",
125
+ "beforeShellExecution",
126
+ "afterShellExecution",
127
+ "beforeReadFile",
128
+ "afterFileEdit",
129
+ "beforeMCPExecution",
130
+ "afterMCPExecution",
131
+ "beforeSubmitPrompt",
132
+ "subagentStart",
133
+ "subagentStop",
134
+ "stop",
135
+ "preCompact",
136
+ "afterAgentThought",
137
+ ];
138
+
139
+ // Load existing hooks.json or create new
140
+ let hooksConfig = { version: 1, hooks: {} };
141
+ if (fs.existsSync(hooksJsonPath)) {
142
+ try {
143
+ const existing = JSON.parse(fs.readFileSync(hooksJsonPath, "utf8"));
144
+ hooksConfig = existing;
145
+ if (!hooksConfig.hooks) {
146
+ hooksConfig.hooks = {};
147
+ }
148
+ } catch (e) {
149
+ // If parsing fails, start fresh
150
+ hooksConfig = { version: 1, hooks: {} };
151
+ }
152
+ }
153
+
154
+ // Add RA2 EVA hooks
155
+ for (const event of hookEvents) {
156
+ hooksConfig.hooks[event] = [{ command: hookCommand }];
157
+ }
158
+
159
+ fs.writeFileSync(hooksJsonPath, JSON.stringify(hooksConfig, null, 2));
160
+
161
+ // Success message
162
+ console.log();
163
+ log(
164
+ colors.green,
165
+ "╔═══════════════════════════════════════════════════════╗"
166
+ );
167
+ log(
168
+ colors.green,
169
+ "║ Installation Complete! ║"
170
+ );
171
+ log(
172
+ colors.green,
173
+ "╚═══════════════════════════════════════════════════════╝"
174
+ );
175
+ console.log();
176
+ console.log(`Installed to: ${colors.blue}${targetDir}${colors.reset}`);
177
+ console.log(`Hooks config: ${colors.blue}${hooksJsonPath}${colors.reset}`);
178
+ console.log();
179
+ log(colors.yellow, "Faction selection:");
180
+ console.log(
181
+ ` • Odd hours (1,3,5...): ${colors.blue}Allied EVA${colors.reset} (English)`
182
+ );
183
+ console.log(
184
+ ` • Even hours (0,2,4...): ${colors.red}Soviet EVA${colors.reset} (Russian accent)`
185
+ );
186
+ console.log();
187
+
188
+ const currentHour = new Date().getHours();
189
+ const faction = currentHour % 2 === 1 ? "Allied" : "Soviet";
190
+ const factionColor = currentHour % 2 === 1 ? colors.blue : colors.red;
191
+ console.log(
192
+ `Current hour: ${currentHour} → ${factionColor}${faction}${colors.reset} faction active`
193
+ );
194
+ console.log();
195
+ log(colors.yellow, "Prerequisites:");
196
+ console.log(" • Bun runtime must be installed (https://bun.sh)");
197
+ console.log(" • Run: curl -fsSL https://bun.sh/install | bash");
198
+ console.log();
199
+ log(colors.yellow, "To activate:");
200
+ console.log(" Restart Cursor or reload the window");
201
+ console.log();
202
+ log(colors.yellow, "To uninstall:");
203
+ console.log(" npx ra2-eva-cursor-hooks --uninstall");
204
+ console.log();
205
+ log(colors.green, "Establishing battlefield control. Stand by.");
206
+ }
207
+
208
+ // Handle --uninstall flag
209
+ if (process.argv.includes("--uninstall")) {
210
+ const homeDir = os.homedir();
211
+ const targetDir = path.join(homeDir, ".cursor", "hooks", "ra2-eva");
212
+ const hooksJsonPath = path.join(homeDir, ".cursor", "hooks.json");
213
+
214
+ log(colors.yellow, "Uninstalling RA2 EVA Cursor Hooks...");
215
+
216
+ if (fs.existsSync(targetDir)) {
217
+ fs.rmSync(targetDir, { recursive: true, force: true });
218
+ log(colors.green, `Removed: ${targetDir}`);
219
+ }
220
+
221
+ if (fs.existsSync(hooksJsonPath)) {
222
+ try {
223
+ const config = JSON.parse(fs.readFileSync(hooksJsonPath, "utf8"));
224
+ if (config.hooks) {
225
+ // Remove RA2 hooks
226
+ for (const key of Object.keys(config.hooks)) {
227
+ const hooks = config.hooks[key];
228
+ if (Array.isArray(hooks)) {
229
+ config.hooks[key] = hooks.filter(
230
+ (h) => !h.command?.includes("ra2-eva")
231
+ );
232
+ if (config.hooks[key].length === 0) {
233
+ delete config.hooks[key];
234
+ }
235
+ }
236
+ }
237
+ fs.writeFileSync(hooksJsonPath, JSON.stringify(config, null, 2));
238
+ log(colors.green, "Cleaned up hooks.json");
239
+ }
240
+ } catch (e) {
241
+ // Ignore errors
242
+ }
243
+ }
244
+
245
+ log(colors.green, "Uninstallation complete. Battle control terminated.");
246
+ process.exit(0);
247
+ }
248
+
249
+ main();
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "ra2-eva-cursor-hooks",
3
+ "version": "1.0.0",
4
+ "description": "Red Alert 2 EVA voice lines for Cursor IDE hooks - nostalgic audio feedback for your coding sessions",
5
+ "keywords": [
6
+ "cursor",
7
+ "cursor-ide",
8
+ "hooks",
9
+ "red-alert-2",
10
+ "eva",
11
+ "audio",
12
+ "sound",
13
+ "nostalgia"
14
+ ],
15
+ "author": "Toubat",
16
+ "license": "MIT",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/toubatbrian/cursor-hooks.git"
20
+ },
21
+ "bin": {
22
+ "ra2-eva-cursor-hooks": "./bin/install.js",
23
+ "ra2-eva": "./bin/install.js"
24
+ },
25
+ "files": [
26
+ "bin/",
27
+ "src/",
28
+ "assets/"
29
+ ],
30
+ "engines": {
31
+ "node": ">=18.0.0"
32
+ }
33
+ }
package/src/index.ts ADDED
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Red Alert 2 EVA Cursor Hooks
4
+ *
5
+ * Plays nostalgic Red Alert 2 EVA voice lines for Cursor agent events.
6
+ * Alternates between Allied (odd hours) and Soviet (even hours) voices.
7
+ */
8
+
9
+ import { stdin } from "bun";
10
+ import { getFaction, playHookSound } from "./player";
11
+ import type {
12
+ BeforeReadFileOutput,
13
+ BeforeShellExecutionOutput,
14
+ BeforeSubmitPromptOutput,
15
+ HookInput,
16
+ PreCompactOutput,
17
+ PreToolUseOutput,
18
+ SessionStartOutput,
19
+ StopOutput,
20
+ SubagentStartOutput,
21
+ SubagentStopOutput,
22
+ } from "./types";
23
+
24
+ /**
25
+ * Parse hook input from stdin
26
+ */
27
+ async function parseHookInput<T>(): Promise<T> {
28
+ const text = await stdin.text();
29
+ return JSON.parse(text) as T;
30
+ }
31
+
32
+ /**
33
+ * Build the appropriate response for each hook type
34
+ */
35
+ function buildResponse(hookName: string): Record<string, unknown> {
36
+ switch (hookName) {
37
+ // Hooks that need to allow the action to proceed
38
+ case "sessionStart": {
39
+ const response: SessionStartOutput = { continue: true };
40
+ return response;
41
+ }
42
+
43
+ case "preToolUse": {
44
+ const response: PreToolUseOutput = { decision: "allow" };
45
+ return response;
46
+ }
47
+
48
+ case "beforeShellExecution":
49
+ case "beforeMCPExecution": {
50
+ const response: BeforeShellExecutionOutput = { permission: "allow" };
51
+ return response;
52
+ }
53
+
54
+ case "beforeReadFile": {
55
+ const response: BeforeReadFileOutput = { permission: "allow" };
56
+ return response;
57
+ }
58
+
59
+ case "beforeSubmitPrompt": {
60
+ const response: BeforeSubmitPromptOutput = { continue: true };
61
+ return response;
62
+ }
63
+
64
+ case "subagentStart": {
65
+ const response: SubagentStartOutput = { decision: "allow" };
66
+ return response;
67
+ }
68
+
69
+ // Hooks that can optionally trigger follow-ups
70
+ case "subagentStop": {
71
+ const response: SubagentStopOutput = {};
72
+ return response;
73
+ }
74
+
75
+ case "stop": {
76
+ const response: StopOutput = {};
77
+ return response;
78
+ }
79
+
80
+ case "preCompact": {
81
+ const response: PreCompactOutput = {};
82
+ return response;
83
+ }
84
+
85
+ // Observation-only hooks (no output needed)
86
+ case "sessionEnd":
87
+ case "postToolUse":
88
+ case "postToolUseFailure":
89
+ case "afterShellExecution":
90
+ case "afterMCPExecution":
91
+ case "afterFileEdit":
92
+ default:
93
+ return {};
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Main hook handler
99
+ */
100
+ async function main(): Promise<void> {
101
+ const input = await parseHookInput<HookInput>();
102
+ const hookName = input.hook_event_name;
103
+
104
+ // Log to stderr (doesn't interfere with JSON output)
105
+ const faction = getFaction();
106
+ const hour = new Date().getHours();
107
+ console.error(`[EVA] Hook: ${hookName}`);
108
+ console.error(`[EVA] ${faction.toUpperCase()} faction (hour: ${hour})`);
109
+
110
+ // Play the appropriate sound (fire and forget)
111
+ await playHookSound(input);
112
+
113
+ // Build and return the appropriate response
114
+ const response = buildResponse(hookName);
115
+ process.stdout.write(JSON.stringify(response) + "\n");
116
+ }
117
+
118
+ main().catch((error) => {
119
+ console.error("[EVA] Hook failed:", error);
120
+ // Return empty object on error to not block Cursor
121
+ process.stdout.write("{}\n");
122
+ });