isaacscript-common 6.6.0 → 6.6.1-dev.2

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 (820) hide show
  1. package/cachedClasses.d.ts +1 -0
  2. package/cachedClasses.js +59 -0
  3. package/cachedClasses.lua +2 -0
  4. package/callbacks/customRevive.js +153 -0
  5. package/callbacks/customRevive.lua +2 -0
  6. package/callbacks/itemPickup.js +64 -0
  7. package/callbacks/itemPickup.lua +2 -0
  8. package/callbacks/postAmbush.js +54 -0
  9. package/callbacks/postAmbush.lua +2 -0
  10. package/callbacks/postBombExploded.js +20 -0
  11. package/callbacks/postBombExploded.lua +2 -0
  12. package/callbacks/postBombInitLate.js +28 -0
  13. package/callbacks/postBombInitLate.lua +2 -0
  14. package/callbacks/postBoneSwing.js +49 -0
  15. package/callbacks/postBoneSwing.lua +2 -0
  16. package/callbacks/postCollectibleEmpty.js +32 -0
  17. package/callbacks/postCollectibleEmpty.lua +2 -0
  18. package/callbacks/postCollectibleInitFirst.js +27 -0
  19. package/callbacks/postCollectibleInitFirst.lua +2 -0
  20. package/callbacks/postCursedTeleport.js +120 -0
  21. package/callbacks/postCursedTeleport.lua +2 -0
  22. package/callbacks/postCustomDoorEnter.js +205 -0
  23. package/callbacks/postCustomDoorEnter.lua +2 -0
  24. package/callbacks/postDiceRoomActivated.js +39 -0
  25. package/callbacks/postDiceRoomActivated.lua +2 -0
  26. package/callbacks/postDoorRender.js +20 -0
  27. package/callbacks/postDoorRender.lua +2 -0
  28. package/callbacks/postDoorUpdate.js +20 -0
  29. package/callbacks/postDoorUpdate.lua +2 -0
  30. package/callbacks/postEffectInitLate.js +28 -0
  31. package/callbacks/postEffectInitLate.lua +2 -0
  32. package/callbacks/postEffectStateChanged.js +31 -0
  33. package/callbacks/postEffectStateChanged.lua +2 -0
  34. package/callbacks/postEsauJr.js +70 -0
  35. package/callbacks/postEsauJr.lua +2 -0
  36. package/callbacks/postFamiliarInitLate.js +28 -0
  37. package/callbacks/postFamiliarInitLate.lua +2 -0
  38. package/callbacks/postFamiliarStateChanged.js +31 -0
  39. package/callbacks/postFamiliarStateChanged.lua +2 -0
  40. package/callbacks/postFlip.js +59 -0
  41. package/callbacks/postFlip.lua +2 -0
  42. package/callbacks/postGreedModeWave.js +31 -0
  43. package/callbacks/postGreedModeWave.lua +2 -0
  44. package/callbacks/postGridEntity.js +107 -0
  45. package/callbacks/postGridEntity.lua +2 -0
  46. package/callbacks/postGridEntityCollision.js +49 -0
  47. package/callbacks/postGridEntityCollision.lua +2 -0
  48. package/callbacks/postGridEntityRender.js +20 -0
  49. package/callbacks/postGridEntityRender.lua +2 -0
  50. package/callbacks/postHolyMantleRemoved.js +33 -0
  51. package/callbacks/postHolyMantleRemoved.lua +2 -0
  52. package/callbacks/postItemDischarged.js +94 -0
  53. package/callbacks/postItemDischarged.lua +2 -0
  54. package/callbacks/postKnifeInitLate.js +28 -0
  55. package/callbacks/postKnifeInitLate.lua +2 -0
  56. package/callbacks/postLaserInitLate.js +28 -0
  57. package/callbacks/postLaserInitLate.lua +2 -0
  58. package/callbacks/postNPCInitLate.js +28 -0
  59. package/callbacks/postNPCInitLate.lua +2 -0
  60. package/callbacks/postNPCStateChanged.js +31 -0
  61. package/callbacks/postNPCStateChanged.lua +2 -0
  62. package/callbacks/postNewRoomEarly.js +69 -0
  63. package/callbacks/postNewRoomEarly.lua +2 -0
  64. package/callbacks/postPickupCollect.js +37 -0
  65. package/callbacks/postPickupCollect.lua +2 -0
  66. package/callbacks/postPickupInitFirst.js +52 -0
  67. package/callbacks/postPickupInitFirst.lua +2 -0
  68. package/callbacks/postPickupInitLate.js +28 -0
  69. package/callbacks/postPickupInitLate.lua +2 -0
  70. package/callbacks/postPickupStateChanged.js +31 -0
  71. package/callbacks/postPickupStateChanged.lua +2 -0
  72. package/callbacks/postPitRender.js +20 -0
  73. package/callbacks/postPitRender.lua +2 -0
  74. package/callbacks/postPitUpdate.js +20 -0
  75. package/callbacks/postPitUpdate.lua +2 -0
  76. package/callbacks/postPlayerChangeHealth.js +43 -0
  77. package/callbacks/postPlayerChangeHealth.lua +2 -0
  78. package/callbacks/postPlayerChangeType.js +31 -0
  79. package/callbacks/postPlayerChangeType.lua +2 -0
  80. package/callbacks/postPlayerCollectible.js +74 -0
  81. package/callbacks/postPlayerCollectible.lua +2 -0
  82. package/callbacks/postPlayerFatalDamage.js +74 -0
  83. package/callbacks/postPlayerFatalDamage.lua +2 -0
  84. package/callbacks/postPlayerInitLate.js +28 -0
  85. package/callbacks/postPlayerInitLate.lua +2 -0
  86. package/callbacks/postPlayerReordered.js +109 -0
  87. package/callbacks/postPlayerReordered.lua +2 -0
  88. package/callbacks/postPoopRender.js +20 -0
  89. package/callbacks/postPoopRender.lua +2 -0
  90. package/callbacks/postPoopUpdate.js +20 -0
  91. package/callbacks/postPoopUpdate.lua +2 -0
  92. package/callbacks/postPressurePlateRender.js +20 -0
  93. package/callbacks/postPressurePlateRender.lua +2 -0
  94. package/callbacks/postPressurePlateUpdate.js +20 -0
  95. package/callbacks/postPressurePlateUpdate.lua +2 -0
  96. package/callbacks/postProjectileInitLate.js +28 -0
  97. package/callbacks/postProjectileInitLate.lua +2 -0
  98. package/callbacks/postPurchase.js +39 -0
  99. package/callbacks/postPurchase.lua +2 -0
  100. package/callbacks/postRockRender.js +20 -0
  101. package/callbacks/postRockRender.lua +2 -0
  102. package/callbacks/postRockUpdate.js +20 -0
  103. package/callbacks/postRockUpdate.lua +2 -0
  104. package/callbacks/postRoomClearChanged.js +41 -0
  105. package/callbacks/postRoomClearChanged.lua +2 -0
  106. package/callbacks/postSacrifice.js +38 -0
  107. package/callbacks/postSacrifice.lua +2 -0
  108. package/callbacks/postSlotDestroyed.js +64 -0
  109. package/callbacks/postSlotDestroyed.lua +2 -0
  110. package/callbacks/postSlotInitUpdate.js +49 -0
  111. package/callbacks/postSlotInitUpdate.lua +2 -0
  112. package/callbacks/postSlotRender.js +48 -0
  113. package/callbacks/postSlotRender.lua +2 -0
  114. package/callbacks/postSpikesRender.js +20 -0
  115. package/callbacks/postSpikesRender.lua +2 -0
  116. package/callbacks/postSpikesUpdate.js +20 -0
  117. package/callbacks/postSpikesUpdate.lua +2 -0
  118. package/callbacks/postTNTRender.js +20 -0
  119. package/callbacks/postTNTRender.lua +2 -0
  120. package/callbacks/postTNTUpdate.js +20 -0
  121. package/callbacks/postTNTUpdate.lua +2 -0
  122. package/callbacks/postTearInitLate.js +28 -0
  123. package/callbacks/postTearInitLate.lua +2 -0
  124. package/callbacks/postTearInitVeryLate.js +32 -0
  125. package/callbacks/postTearInitVeryLate.lua +2 -0
  126. package/callbacks/postTransformation.js +37 -0
  127. package/callbacks/postTransformation.lua +2 -0
  128. package/callbacks/postTrinketBreak.js +64 -0
  129. package/callbacks/postTrinketBreak.lua +2 -0
  130. package/callbacks/preBerserkDeath.js +35 -0
  131. package/callbacks/preBerserkDeath.lua +2 -0
  132. package/callbacks/preNewLevel.js +45 -0
  133. package/callbacks/preNewLevel.lua +2 -0
  134. package/callbacks/reorderedCallbacks.js +136 -0
  135. package/callbacks/reorderedCallbacks.lua +2 -0
  136. package/callbacks/subscriptions/postAmbushFinished.js +20 -0
  137. package/callbacks/subscriptions/postAmbushFinished.lua +2 -0
  138. package/callbacks/subscriptions/postAmbushStarted.js +20 -0
  139. package/callbacks/subscriptions/postAmbushStarted.lua +2 -0
  140. package/callbacks/subscriptions/postBombInitLate.js +20 -0
  141. package/callbacks/subscriptions/postBombInitLate.lua +2 -0
  142. package/callbacks/subscriptions/postBoneExploded.js +20 -0
  143. package/callbacks/subscriptions/postBoneExploded.lua +2 -0
  144. package/callbacks/subscriptions/postBoneSwing.js +16 -0
  145. package/callbacks/subscriptions/postBoneSwing.lua +2 -0
  146. package/callbacks/subscriptions/postCollectibleEmpty.js +21 -0
  147. package/callbacks/subscriptions/postCollectibleEmpty.lua +2 -0
  148. package/callbacks/subscriptions/postCollectibleInitFirst.js +21 -0
  149. package/callbacks/subscriptions/postCollectibleInitFirst.lua +2 -0
  150. package/callbacks/subscriptions/postCursedTeleport.js +16 -0
  151. package/callbacks/subscriptions/postCursedTeleport.lua +2 -0
  152. package/callbacks/subscriptions/postCustomDoorEnter.js +21 -0
  153. package/callbacks/subscriptions/postCustomDoorEnter.lua +2 -0
  154. package/callbacks/subscriptions/postCustomRevive.js +21 -0
  155. package/callbacks/subscriptions/postCustomRevive.lua +2 -0
  156. package/callbacks/subscriptions/postDiceRoomActivated.js +21 -0
  157. package/callbacks/subscriptions/postDiceRoomActivated.lua +2 -0
  158. package/callbacks/subscriptions/postDoorRender.js +22 -0
  159. package/callbacks/subscriptions/postDoorRender.lua +2 -0
  160. package/callbacks/subscriptions/postDoorUpdate.js +22 -0
  161. package/callbacks/subscriptions/postDoorUpdate.lua +2 -0
  162. package/callbacks/subscriptions/postEffectInitLate.js +20 -0
  163. package/callbacks/subscriptions/postEffectInitLate.lua +2 -0
  164. package/callbacks/subscriptions/postEffectStateChanged.js +20 -0
  165. package/callbacks/subscriptions/postEffectStateChanged.lua +2 -0
  166. package/callbacks/subscriptions/postEsauJr.js +16 -0
  167. package/callbacks/subscriptions/postEsauJr.lua +2 -0
  168. package/callbacks/subscriptions/postFamiliarInitLate.js +20 -0
  169. package/callbacks/subscriptions/postFamiliarInitLate.lua +2 -0
  170. package/callbacks/subscriptions/postFamiliarStateChanged.js +20 -0
  171. package/callbacks/subscriptions/postFamiliarStateChanged.lua +2 -0
  172. package/callbacks/subscriptions/postFirstEsauJr.js +16 -0
  173. package/callbacks/subscriptions/postFirstEsauJr.lua +2 -0
  174. package/callbacks/subscriptions/postFirstFlip.js +16 -0
  175. package/callbacks/subscriptions/postFirstFlip.lua +2 -0
  176. package/callbacks/subscriptions/postFlip.js +16 -0
  177. package/callbacks/subscriptions/postFlip.lua +2 -0
  178. package/callbacks/subscriptions/postGameStartedReordered.js +16 -0
  179. package/callbacks/subscriptions/postGameStartedReordered.lua +2 -0
  180. package/callbacks/subscriptions/postGreedModeWave.js +16 -0
  181. package/callbacks/subscriptions/postGreedModeWave.lua +2 -0
  182. package/callbacks/subscriptions/postGridEntityBroken.js +28 -0
  183. package/callbacks/subscriptions/postGridEntityBroken.lua +2 -0
  184. package/callbacks/subscriptions/postGridEntityCollision.js +28 -0
  185. package/callbacks/subscriptions/postGridEntityCollision.lua +2 -0
  186. package/callbacks/subscriptions/postGridEntityInit.js +28 -0
  187. package/callbacks/subscriptions/postGridEntityInit.lua +2 -0
  188. package/callbacks/subscriptions/postGridEntityRemove.js +26 -0
  189. package/callbacks/subscriptions/postGridEntityRemove.lua +2 -0
  190. package/callbacks/subscriptions/postGridEntityRender.js +28 -0
  191. package/callbacks/subscriptions/postGridEntityRender.lua +2 -0
  192. package/callbacks/subscriptions/postGridEntityStateChanged.js +28 -0
  193. package/callbacks/subscriptions/postGridEntityStateChanged.lua +2 -0
  194. package/callbacks/subscriptions/postGridEntityUpdate.js +28 -0
  195. package/callbacks/subscriptions/postGridEntityUpdate.lua +2 -0
  196. package/callbacks/subscriptions/postHolyMantleRemoved.js +25 -0
  197. package/callbacks/subscriptions/postHolyMantleRemoved.lua +2 -0
  198. package/callbacks/subscriptions/postItemDischarged.js +21 -0
  199. package/callbacks/subscriptions/postItemDischarged.lua +2 -0
  200. package/callbacks/subscriptions/postItemPickup.js +25 -0
  201. package/callbacks/subscriptions/postItemPickup.lua +2 -0
  202. package/callbacks/subscriptions/postKnifeInitLate.js +20 -0
  203. package/callbacks/subscriptions/postKnifeInitLate.lua +2 -0
  204. package/callbacks/subscriptions/postLaserInitLate.js +20 -0
  205. package/callbacks/subscriptions/postLaserInitLate.lua +2 -0
  206. package/callbacks/subscriptions/postNPCInitLate.js +20 -0
  207. package/callbacks/subscriptions/postNPCInitLate.lua +2 -0
  208. package/callbacks/subscriptions/postNPCStateChanged.js +24 -0
  209. package/callbacks/subscriptions/postNPCStateChanged.lua +2 -0
  210. package/callbacks/subscriptions/postNewLevelReordered.js +16 -0
  211. package/callbacks/subscriptions/postNewLevelReordered.lua +2 -0
  212. package/callbacks/subscriptions/postNewRoomEarly.js +16 -0
  213. package/callbacks/subscriptions/postNewRoomEarly.lua +2 -0
  214. package/callbacks/subscriptions/postNewRoomReordered.js +16 -0
  215. package/callbacks/subscriptions/postNewRoomReordered.lua +2 -0
  216. package/callbacks/subscriptions/postPEffectUpdateReordered.js +25 -0
  217. package/callbacks/subscriptions/postPEffectUpdateReordered.lua +2 -0
  218. package/callbacks/subscriptions/postPickupCollect.js +20 -0
  219. package/callbacks/subscriptions/postPickupCollect.lua +2 -0
  220. package/callbacks/subscriptions/postPickupInitFirst.js +20 -0
  221. package/callbacks/subscriptions/postPickupInitFirst.lua +2 -0
  222. package/callbacks/subscriptions/postPickupInitLate.js +20 -0
  223. package/callbacks/subscriptions/postPickupInitLate.lua +2 -0
  224. package/callbacks/subscriptions/postPickupStateChanged.js +20 -0
  225. package/callbacks/subscriptions/postPickupStateChanged.lua +2 -0
  226. package/callbacks/subscriptions/postPitRender.js +22 -0
  227. package/callbacks/subscriptions/postPitRender.lua +2 -0
  228. package/callbacks/subscriptions/postPitUpdate.js +22 -0
  229. package/callbacks/subscriptions/postPitUpdate.lua +2 -0
  230. package/callbacks/subscriptions/postPlayerChangeHealth.js +25 -0
  231. package/callbacks/subscriptions/postPlayerChangeHealth.lua +2 -0
  232. package/callbacks/subscriptions/postPlayerChangeType.js +20 -0
  233. package/callbacks/subscriptions/postPlayerChangeType.lua +2 -0
  234. package/callbacks/subscriptions/postPlayerCollectibleAdded.js +21 -0
  235. package/callbacks/subscriptions/postPlayerCollectibleAdded.lua +2 -0
  236. package/callbacks/subscriptions/postPlayerCollectibleRemoved.js +21 -0
  237. package/callbacks/subscriptions/postPlayerCollectibleRemoved.lua +2 -0
  238. package/callbacks/subscriptions/postPlayerFatalDamage.js +29 -0
  239. package/callbacks/subscriptions/postPlayerFatalDamage.lua +2 -0
  240. package/callbacks/subscriptions/postPlayerInitLate.js +25 -0
  241. package/callbacks/subscriptions/postPlayerInitLate.lua +2 -0
  242. package/callbacks/subscriptions/postPlayerInitReordered.js +25 -0
  243. package/callbacks/subscriptions/postPlayerInitReordered.lua +2 -0
  244. package/callbacks/subscriptions/postPlayerRenderReordered.js +25 -0
  245. package/callbacks/subscriptions/postPlayerRenderReordered.lua +2 -0
  246. package/callbacks/subscriptions/postPlayerUpdateReordered.js +25 -0
  247. package/callbacks/subscriptions/postPlayerUpdateReordered.lua +2 -0
  248. package/callbacks/subscriptions/postPoopRender.js +22 -0
  249. package/callbacks/subscriptions/postPoopRender.lua +2 -0
  250. package/callbacks/subscriptions/postPoopUpdate.js +22 -0
  251. package/callbacks/subscriptions/postPoopUpdate.lua +2 -0
  252. package/callbacks/subscriptions/postPressurePlateRender.js +22 -0
  253. package/callbacks/subscriptions/postPressurePlateRender.lua +2 -0
  254. package/callbacks/subscriptions/postPressurePlateUpdate.js +22 -0
  255. package/callbacks/subscriptions/postPressurePlateUpdate.lua +2 -0
  256. package/callbacks/subscriptions/postProjectileInitLate.js +21 -0
  257. package/callbacks/subscriptions/postProjectileInitLate.lua +2 -0
  258. package/callbacks/subscriptions/postPurchase.js +16 -0
  259. package/callbacks/subscriptions/postPurchase.lua +2 -0
  260. package/callbacks/subscriptions/postRockRender.js +22 -0
  261. package/callbacks/subscriptions/postRockRender.lua +2 -0
  262. package/callbacks/subscriptions/postRockUpdate.js +22 -0
  263. package/callbacks/subscriptions/postRockUpdate.lua +2 -0
  264. package/callbacks/subscriptions/postRoomClearChanged.js +20 -0
  265. package/callbacks/subscriptions/postRoomClearChanged.lua +2 -0
  266. package/callbacks/subscriptions/postSacrifice.js +25 -0
  267. package/callbacks/subscriptions/postSacrifice.lua +2 -0
  268. package/callbacks/subscriptions/postSlotAnimationChanged.js +20 -0
  269. package/callbacks/subscriptions/postSlotAnimationChanged.lua +2 -0
  270. package/callbacks/subscriptions/postSlotDestroyed.js +26 -0
  271. package/callbacks/subscriptions/postSlotDestroyed.lua +2 -0
  272. package/callbacks/subscriptions/postSlotInit.js +20 -0
  273. package/callbacks/subscriptions/postSlotInit.lua +2 -0
  274. package/callbacks/subscriptions/postSlotRender.js +20 -0
  275. package/callbacks/subscriptions/postSlotRender.lua +2 -0
  276. package/callbacks/subscriptions/postSlotUpdate.js +20 -0
  277. package/callbacks/subscriptions/postSlotUpdate.lua +2 -0
  278. package/callbacks/subscriptions/postSpikesRender.js +22 -0
  279. package/callbacks/subscriptions/postSpikesRender.lua +2 -0
  280. package/callbacks/subscriptions/postSpikesUpdate.js +22 -0
  281. package/callbacks/subscriptions/postSpikesUpdate.lua +2 -0
  282. package/callbacks/subscriptions/postTNTRender.js +22 -0
  283. package/callbacks/subscriptions/postTNTRender.lua +2 -0
  284. package/callbacks/subscriptions/postTNTUpdate.js +22 -0
  285. package/callbacks/subscriptions/postTNTUpdate.lua +2 -0
  286. package/callbacks/subscriptions/postTearInitLate.js +20 -0
  287. package/callbacks/subscriptions/postTearInitLate.lua +2 -0
  288. package/callbacks/subscriptions/postTearInitVeryLate.js +20 -0
  289. package/callbacks/subscriptions/postTearInitVeryLate.lua +2 -0
  290. package/callbacks/subscriptions/postTransformation.js +20 -0
  291. package/callbacks/subscriptions/postTransformation.lua +2 -0
  292. package/callbacks/subscriptions/postTrinketBreak.js +21 -0
  293. package/callbacks/subscriptions/postTrinketBreak.lua +2 -0
  294. package/callbacks/subscriptions/preBerserkDeath.js +26 -0
  295. package/callbacks/subscriptions/preBerserkDeath.lua +2 -0
  296. package/callbacks/subscriptions/preCustomRevive.js +29 -0
  297. package/callbacks/subscriptions/preCustomRevive.lua +2 -0
  298. package/callbacks/subscriptions/preItemPickup.js +25 -0
  299. package/callbacks/subscriptions/preItemPickup.lua +2 -0
  300. package/callbacks/subscriptions/preNewLevel.js +16 -0
  301. package/callbacks/subscriptions/preNewLevel.lua +2 -0
  302. package/classes/DefaultMap.js +145 -0
  303. package/classes/DefaultMap.lua +2 -0
  304. package/classes/ModUpgraded.js +57 -0
  305. package/classes/ModUpgraded.lua +2 -0
  306. package/constants.js +143 -0
  307. package/constants.lua +2 -0
  308. package/constantsFirstLast.js +156 -0
  309. package/constantsFirstLast.lua +2 -0
  310. package/enums/AmbushType.js +6 -0
  311. package/enums/AmbushType.lua +2 -0
  312. package/enums/CornerType.js +8 -0
  313. package/enums/CornerType.lua +2 -0
  314. package/enums/DecorationVariant.js +11 -0
  315. package/enums/DecorationVariant.lua +2 -0
  316. package/enums/HealthType.js +18 -0
  317. package/enums/HealthType.lua +2 -0
  318. package/enums/ModCallbackCustom.js +1213 -0
  319. package/enums/ModCallbackCustom.lua +2 -0
  320. package/enums/PocketItemType.js +10 -0
  321. package/enums/PocketItemType.lua +2 -0
  322. package/enums/RockAltType.js +9 -0
  323. package/enums/RockAltType.lua +2 -0
  324. package/enums/SerializationType.js +7 -0
  325. package/enums/SerializationType.lua +2 -0
  326. package/enums/SlotDestructionType.js +6 -0
  327. package/enums/SlotDestructionType.lua +2 -0
  328. package/enums/private/CopyableIsaacAPIClassType.js +9 -0
  329. package/enums/private/CopyableIsaacAPIClassType.lua +2 -0
  330. package/enums/private/SaveDataKey.js +8 -0
  331. package/enums/private/SaveDataKey.lua +2 -0
  332. package/enums/private/SerializationBrand.js +41 -0
  333. package/enums/private/SerializationBrand.lua +2 -0
  334. package/features/characterHealthConversion.js +86 -0
  335. package/features/characterHealthConversion.lua +2 -0
  336. package/features/characterStats.js +52 -0
  337. package/features/characterStats.lua +2 -0
  338. package/features/collectibleItemPoolType.js +45 -0
  339. package/features/collectibleItemPoolType.lua +2 -0
  340. package/features/customGridEntity.js +148 -0
  341. package/features/customGridEntity.lua +2 -0
  342. package/features/customStage/backdrop.js +191 -0
  343. package/features/customStage/backdrop.lua +9 -7
  344. package/features/customStage/customStageConstants.js +2 -0
  345. package/features/customStage/customStageConstants.lua +2 -0
  346. package/features/customStage/exports.js +147 -0
  347. package/features/customStage/exports.lua +8 -1
  348. package/features/customStage/gridEntities.js +138 -0
  349. package/features/customStage/gridEntities.lua +2 -0
  350. package/features/customStage/init.js +104 -0
  351. package/features/customStage/init.lua +4 -9
  352. package/features/customStage/metadata.json +1 -0
  353. package/features/customStage/metadata.lua +2 -0
  354. package/features/customStage/shadows.d.ts +0 -1
  355. package/features/customStage/shadows.js +63 -0
  356. package/features/customStage/shadows.lua +31 -19
  357. package/features/customStage/streakText.d.ts +1 -1
  358. package/features/customStage/streakText.js +35 -0
  359. package/features/customStage/streakText.lua +14 -3
  360. package/features/customStage/util.js +36 -0
  361. package/features/customStage/util.lua +2 -0
  362. package/features/customStage/v.js +18 -0
  363. package/features/customStage/v.lua +2 -0
  364. package/features/customStage/versusScreen.js +184 -0
  365. package/features/customStage/versusScreen.lua +8 -1
  366. package/features/debugDisplay/debugDisplay.js +183 -0
  367. package/features/debugDisplay/debugDisplay.lua +2 -0
  368. package/features/debugDisplay/exports.js +441 -0
  369. package/features/debugDisplay/exports.lua +2 -0
  370. package/features/debugDisplay/v.d.ts +18 -0
  371. package/features/debugDisplay/v.js +61 -0
  372. package/features/debugDisplay/v.lua +2 -0
  373. package/features/deployJSONRoom.js +532 -0
  374. package/features/deployJSONRoom.lua +2 -0
  375. package/features/disableAllSound.js +63 -0
  376. package/features/disableAllSound.lua +2 -0
  377. package/features/disableInputs.js +130 -0
  378. package/features/disableInputs.lua +2 -0
  379. package/features/extraConsoleCommands/commandsDisplay.js +236 -0
  380. package/features/extraConsoleCommands/commandsDisplay.lua +2 -0
  381. package/features/extraConsoleCommands/commandsSubroutines.js +109 -0
  382. package/features/extraConsoleCommands/commandsSubroutines.lua +2 -0
  383. package/features/extraConsoleCommands/exports.js +53 -0
  384. package/features/extraConsoleCommands/exports.lua +2 -0
  385. package/features/extraConsoleCommands/init.js +239 -0
  386. package/features/extraConsoleCommands/init.lua +2 -0
  387. package/features/extraConsoleCommands/listCommands.js +1081 -0
  388. package/features/extraConsoleCommands/listCommands.lua +2 -0
  389. package/features/extraConsoleCommands/v.js +25 -0
  390. package/features/extraConsoleCommands/v.lua +2 -0
  391. package/features/fadeInRemover.js +51 -0
  392. package/features/fadeInRemover.lua +2 -0
  393. package/features/fastReset.js +61 -0
  394. package/features/fastReset.lua +2 -0
  395. package/features/forgottenSwitch.js +33 -0
  396. package/features/forgottenSwitch.lua +2 -0
  397. package/features/pause.js +68 -0
  398. package/features/pause.lua +2 -0
  399. package/features/persistentEntities.js +120 -0
  400. package/features/persistentEntities.lua +2 -0
  401. package/features/playerInventory.js +89 -0
  402. package/features/playerInventory.lua +2 -0
  403. package/features/ponyDetection.js +63 -0
  404. package/features/ponyDetection.lua +2 -0
  405. package/features/preventCollectibleRotation.js +81 -0
  406. package/features/preventCollectibleRotation.lua +2 -0
  407. package/features/registerHotkey.js +91 -0
  408. package/features/registerHotkey.lua +2 -0
  409. package/features/roomClearFrame.js +42 -0
  410. package/features/roomClearFrame.lua +2 -0
  411. package/features/runInNFrames.js +189 -0
  412. package/features/runInNFrames.lua +2 -0
  413. package/features/runNextRoom.js +34 -0
  414. package/features/runNextRoom.lua +2 -0
  415. package/features/saveDataManager/exports.js +183 -0
  416. package/features/saveDataManager/exports.lua +2 -0
  417. package/features/saveDataManager/load.js +69 -0
  418. package/features/saveDataManager/load.lua +2 -0
  419. package/features/saveDataManager/main.js +131 -0
  420. package/features/saveDataManager/main.lua +2 -0
  421. package/features/saveDataManager/maps.js +9 -0
  422. package/features/saveDataManager/maps.lua +2 -0
  423. package/features/saveDataManager/merge.js +139 -0
  424. package/features/saveDataManager/merge.lua +2 -0
  425. package/features/saveDataManager/save.js +43 -0
  426. package/features/saveDataManager/save.lua +2 -0
  427. package/features/saveDataManager/saveDataManagerConstants.js +4 -0
  428. package/features/saveDataManager/saveDataManagerConstants.lua +2 -0
  429. package/features/saveDataManager/serializationBrand.js +12 -0
  430. package/features/saveDataManager/serializationBrand.lua +2 -0
  431. package/features/sirenHelpers.js +90 -0
  432. package/features/sirenHelpers.lua +2 -0
  433. package/features/stageHistory.js +43 -0
  434. package/features/stageHistory.lua +2 -0
  435. package/features/taintedLazarusPlayers.js +92 -0
  436. package/features/taintedLazarusPlayers.lua +2 -0
  437. package/featuresInitialized.js +16 -0
  438. package/featuresInitialized.lua +2 -0
  439. package/functions/ambush.js +35 -0
  440. package/functions/ambush.lua +2 -0
  441. package/functions/array.js +423 -0
  442. package/functions/array.lua +2 -0
  443. package/functions/benchmark.js +28 -0
  444. package/functions/benchmark.lua +2 -0
  445. package/functions/bitwise.js +74 -0
  446. package/functions/bitwise.lua +2 -0
  447. package/functions/bombs.js +11 -0
  448. package/functions/bombs.lua +2 -0
  449. package/functions/boss.js +137 -0
  450. package/functions/boss.lua +2 -0
  451. package/functions/cacheFlag.js +11 -0
  452. package/functions/cacheFlag.lua +2 -0
  453. package/functions/cards.js +217 -0
  454. package/functions/cards.lua +2 -0
  455. package/functions/challenges.js +9 -0
  456. package/functions/challenges.lua +2 -0
  457. package/functions/character.js +102 -0
  458. package/functions/character.lua +2 -0
  459. package/functions/charge.js +202 -0
  460. package/functions/charge.lua +2 -0
  461. package/functions/chargeBar.js +44 -0
  462. package/functions/chargeBar.lua +2 -0
  463. package/functions/collectibleCacheFlag.js +68 -0
  464. package/functions/collectibleCacheFlag.lua +2 -0
  465. package/functions/collectibleSet.js +108 -0
  466. package/functions/collectibleSet.lua +2 -0
  467. package/functions/collectibleTag.js +65 -0
  468. package/functions/collectibleTag.lua +2 -0
  469. package/functions/collectibles.js +469 -0
  470. package/functions/collectibles.lua +2 -0
  471. package/functions/color.d.ts +1 -1
  472. package/functions/color.js +60 -0
  473. package/functions/color.lua +2 -0
  474. package/functions/debug.js +60 -0
  475. package/functions/debug.lua +2 -0
  476. package/functions/deepCopy.js +361 -0
  477. package/functions/deepCopy.lua +2 -0
  478. package/functions/deepCopyTests.js +308 -0
  479. package/functions/deepCopyTests.lua +2 -0
  480. package/functions/direction.js +41 -0
  481. package/functions/direction.lua +2 -0
  482. package/functions/doors.js +326 -0
  483. package/functions/doors.lua +2 -0
  484. package/functions/easing.js +142 -0
  485. package/functions/easing.lua +2 -0
  486. package/functions/eden.js +32 -0
  487. package/functions/eden.lua +2 -0
  488. package/functions/effects.js +11 -0
  489. package/functions/effects.lua +2 -0
  490. package/functions/entity.js +324 -0
  491. package/functions/entity.lua +2 -0
  492. package/functions/entitySpecific.js +481 -0
  493. package/functions/entitySpecific.lua +2 -0
  494. package/functions/entityTypes.js +6 -0
  495. package/functions/entityTypes.lua +2 -0
  496. package/functions/enums.js +151 -0
  497. package/functions/enums.lua +2 -0
  498. package/functions/familiars.js +85 -0
  499. package/functions/familiars.lua +2 -0
  500. package/functions/flag.js +137 -0
  501. package/functions/flag.lua +2 -0
  502. package/functions/flying.js +88 -0
  503. package/functions/flying.lua +2 -0
  504. package/functions/globals.js +230 -0
  505. package/functions/globals.lua +2 -0
  506. package/functions/gridEntity.js +488 -0
  507. package/functions/gridEntity.lua +2 -0
  508. package/functions/gridEntitySpecific.js +109 -0
  509. package/functions/gridEntitySpecific.lua +2 -0
  510. package/functions/input.js +95 -0
  511. package/functions/input.lua +2 -0
  512. package/functions/isaacAPIClass.js +48 -0
  513. package/functions/isaacAPIClass.lua +2 -0
  514. package/functions/jsonHelpers.js +40 -0
  515. package/functions/jsonHelpers.lua +2 -0
  516. package/functions/jsonRoom.js +132 -0
  517. package/functions/jsonRoom.lua +2 -0
  518. package/functions/kColor.d.ts +1 -1
  519. package/functions/kColor.js +63 -0
  520. package/functions/kColor.lua +2 -0
  521. package/functions/language.js +13 -0
  522. package/functions/language.lua +2 -0
  523. package/functions/level.js +20 -0
  524. package/functions/level.lua +2 -0
  525. package/functions/log.js +567 -0
  526. package/functions/log.lua +2 -0
  527. package/functions/map.js +45 -0
  528. package/functions/map.lua +2 -0
  529. package/functions/math.js +103 -0
  530. package/functions/math.lua +2 -0
  531. package/functions/mergeTests.js +213 -0
  532. package/functions/mergeTests.lua +2 -0
  533. package/functions/minimap.js +80 -0
  534. package/functions/minimap.lua +2 -0
  535. package/functions/nextStage.js +290 -0
  536. package/functions/nextStage.lua +2 -0
  537. package/functions/npc.js +101 -0
  538. package/functions/npc.lua +2 -0
  539. package/functions/pickupVariants.js +47 -0
  540. package/functions/pickupVariants.lua +2 -0
  541. package/functions/pickups.js +219 -0
  542. package/functions/pickups.lua +2 -0
  543. package/functions/pills.js +160 -0
  544. package/functions/pills.lua +2 -0
  545. package/functions/player.js +808 -0
  546. package/functions/player.lua +2 -0
  547. package/functions/playerCenter.js +50 -0
  548. package/functions/playerCenter.lua +2 -0
  549. package/functions/playerDataStructures.js +114 -0
  550. package/functions/playerDataStructures.lua +2 -0
  551. package/functions/playerHealth.js +321 -0
  552. package/functions/playerHealth.lua +2 -0
  553. package/functions/playerIndex.js +160 -0
  554. package/functions/playerIndex.lua +2 -0
  555. package/functions/pocketItems.js +124 -0
  556. package/functions/pocketItems.lua +2 -0
  557. package/functions/positionVelocity.js +136 -0
  558. package/functions/positionVelocity.lua +2 -0
  559. package/functions/random.js +73 -0
  560. package/functions/random.lua +2 -0
  561. package/functions/revive.js +140 -0
  562. package/functions/revive.lua +2 -0
  563. package/functions/rng.d.ts +1 -1
  564. package/functions/rng.js +117 -0
  565. package/functions/rng.lua +2 -0
  566. package/functions/roomData.js +174 -0
  567. package/functions/roomData.lua +2 -0
  568. package/functions/roomGrid.js +81 -0
  569. package/functions/roomGrid.lua +2 -0
  570. package/functions/roomShape.js +99 -0
  571. package/functions/roomShape.lua +2 -0
  572. package/functions/rooms.js +487 -0
  573. package/functions/rooms.lua +2 -0
  574. package/functions/run.js +53 -0
  575. package/functions/run.lua +2 -0
  576. package/functions/saveFile.js +104 -0
  577. package/functions/saveFile.lua +2 -0
  578. package/functions/seeds.js +18 -0
  579. package/functions/seeds.lua +2 -0
  580. package/functions/serialization.js +52 -0
  581. package/functions/serialization.lua +2 -0
  582. package/functions/set.js +99 -0
  583. package/functions/set.lua +2 -0
  584. package/functions/sound.js +9 -0
  585. package/functions/sound.lua +2 -0
  586. package/functions/spawnCollectible.js +66 -0
  587. package/functions/spawnCollectible.lua +2 -0
  588. package/functions/sprite.js +80 -0
  589. package/functions/sprite.lua +2 -0
  590. package/functions/stage.js +172 -0
  591. package/functions/stage.lua +2 -0
  592. package/functions/string.js +37 -0
  593. package/functions/string.lua +2 -0
  594. package/functions/table.js +143 -0
  595. package/functions/table.lua +2 -0
  596. package/functions/tears.js +31 -0
  597. package/functions/tears.lua +2 -0
  598. package/functions/transformations.js +101 -0
  599. package/functions/transformations.lua +2 -0
  600. package/functions/trinketCacheFlag.js +46 -0
  601. package/functions/trinketCacheFlag.lua +2 -0
  602. package/functions/trinketGive.js +121 -0
  603. package/functions/trinketGive.lua +2 -0
  604. package/functions/trinkets.js +169 -0
  605. package/functions/trinkets.lua +2 -0
  606. package/functions/tstlClass.js +125 -0
  607. package/functions/tstlClass.lua +2 -0
  608. package/functions/types.js +27 -0
  609. package/functions/types.lua +2 -0
  610. package/functions/ui.js +124 -0
  611. package/functions/ui.lua +2 -0
  612. package/functions/utils.js +172 -0
  613. package/functions/utils.lua +2 -0
  614. package/functions/vector.js +68 -0
  615. package/functions/vector.lua +2 -0
  616. package/index.js +140 -0
  617. package/index.lua +2 -0
  618. package/initCustomCallbacks.js +133 -0
  619. package/initCustomCallbacks.lua +2 -0
  620. package/initFeatures.js +51 -0
  621. package/initFeatures.lua +2 -0
  622. package/interfaces/AddCallbackParameterCustom.js +2 -0
  623. package/interfaces/AddCallbackParameterCustom.lua +2 -0
  624. package/interfaces/ChargeBarSprites.js +2 -0
  625. package/interfaces/ChargeBarSprites.lua +2 -0
  626. package/interfaces/Corner.js +2 -0
  627. package/interfaces/Corner.lua +2 -0
  628. package/interfaces/CustomGridEntityData.js +2 -0
  629. package/interfaces/CustomGridEntityData.lua +2 -0
  630. package/interfaces/CustomStage.js +2 -0
  631. package/interfaces/CustomStage.lua +2 -0
  632. package/interfaces/CustomStageLua.d.ts +64 -24
  633. package/interfaces/CustomStageLua.js +13 -0
  634. package/interfaces/CustomStageLua.lua +2 -0
  635. package/interfaces/JSONRoomsFile.js +2 -0
  636. package/interfaces/JSONRoomsFile.lua +2 -0
  637. package/interfaces/PlayerHealth.js +2 -0
  638. package/interfaces/PlayerHealth.lua +2 -0
  639. package/interfaces/PocketItemDescription.js +2 -0
  640. package/interfaces/PocketItemDescription.lua +2 -0
  641. package/interfaces/SaveData.js +2 -0
  642. package/interfaces/SaveData.lua +2 -0
  643. package/interfaces/TrinketSituation.js +2 -0
  644. package/interfaces/TrinketSituation.lua +2 -0
  645. package/interfaces/private/TSTLClassMetatable.js +2 -0
  646. package/interfaces/private/TSTLClassMetatable.lua +2 -0
  647. package/maps/PHDPillConversions.js +20 -0
  648. package/maps/PHDPillConversions.lua +2 -0
  649. package/maps/cardMap.js +208 -0
  650. package/maps/cardMap.lua +2 -0
  651. package/maps/characterMap.js +86 -0
  652. package/maps/characterMap.lua +2 -0
  653. package/maps/collectibleDescriptionMap.js +728 -0
  654. package/maps/collectibleDescriptionMap.lua +2 -0
  655. package/maps/collectibleNameMap.js +727 -0
  656. package/maps/collectibleNameMap.lua +2 -0
  657. package/maps/defaultPlayerStatMap.js +14 -0
  658. package/maps/defaultPlayerStatMap.lua +2 -0
  659. package/maps/falsePHDPillConversions.js +34 -0
  660. package/maps/falsePHDPillConversions.lua +2 -0
  661. package/maps/gridEntityTypeToBrokenStateMap.js +29 -0
  662. package/maps/gridEntityTypeToBrokenStateMap.lua +2 -0
  663. package/maps/gridEntityXMLMap.js +128 -0
  664. package/maps/gridEntityXMLMap.lua +2 -0
  665. package/maps/pillEffectMap.js +88 -0
  666. package/maps/pillEffectMap.lua +2 -0
  667. package/maps/roomShapeToTopLeftWallGridIndexMap.js +14 -0
  668. package/maps/roomShapeToTopLeftWallGridIndexMap.lua +2 -0
  669. package/maps/roomTypeMap.js +39 -0
  670. package/maps/roomTypeMap.lua +2 -0
  671. package/maps/trinketDescriptionMap.js +196 -0
  672. package/maps/trinketDescriptionMap.lua +2 -0
  673. package/maps/trinketNameMap.js +195 -0
  674. package/maps/trinketNameMap.lua +2 -0
  675. package/objects/LRoomShapeToRectangles.js +33 -0
  676. package/objects/LRoomShapeToRectangles.lua +2 -0
  677. package/objects/backdropTypeToRockAltType.js +66 -0
  678. package/objects/backdropTypeToRockAltType.lua +2 -0
  679. package/objects/bossNamePNGFileNames.js +112 -0
  680. package/objects/bossNamePNGFileNames.lua +2 -0
  681. package/objects/bossPortraitPNGFileNames.js +115 -0
  682. package/objects/bossPortraitPNGFileNames.lua +2 -0
  683. package/objects/callbackRegisterFunctions.js +170 -0
  684. package/objects/callbackRegisterFunctions.lua +2 -0
  685. package/objects/cardDescriptions.js +104 -0
  686. package/objects/cardDescriptions.lua +2 -0
  687. package/objects/cardNames.js +104 -0
  688. package/objects/cardNames.lua +2 -0
  689. package/objects/cardTypes.js +103 -0
  690. package/objects/cardTypes.lua +2 -0
  691. package/objects/challengeNames.js +51 -0
  692. package/objects/challengeNames.lua +2 -0
  693. package/objects/characterNames.js +46 -0
  694. package/objects/characterNames.lua +2 -0
  695. package/objects/coinSubTypeToValue.js +13 -0
  696. package/objects/coinSubTypeToValue.lua +2 -0
  697. package/objects/colors.d.ts +1 -0
  698. package/objects/colors.js +24 -0
  699. package/objects/colors.lua +2 -0
  700. package/objects/directionNames.js +9 -0
  701. package/objects/directionNames.lua +2 -0
  702. package/objects/directionToDegrees.js +9 -0
  703. package/objects/directionToDegrees.lua +2 -0
  704. package/objects/directionToVector.js +10 -0
  705. package/objects/directionToVector.lua +2 -0
  706. package/objects/doorSlotFlagToDoorSlot.js +13 -0
  707. package/objects/doorSlotFlagToDoorSlot.lua +2 -0
  708. package/objects/doorSlotToDirection.js +13 -0
  709. package/objects/doorSlotToDirection.lua +2 -0
  710. package/objects/doorSlotToDoorSlotFlag.js +13 -0
  711. package/objects/doorSlotToDoorSlotFlag.lua +2 -0
  712. package/objects/isaacAPIClassTypeToBrand.js +9 -0
  713. package/objects/isaacAPIClassTypeToBrand.lua +2 -0
  714. package/objects/isaacAPIClassTypeToCopyFunction.js +12 -0
  715. package/objects/isaacAPIClassTypeToCopyFunction.lua +2 -0
  716. package/objects/languageNames.js +11 -0
  717. package/objects/languageNames.lua +2 -0
  718. package/objects/oppositeDoorSlots.js +13 -0
  719. package/objects/oppositeDoorSlots.lua +2 -0
  720. package/objects/pillEffectClasses.js +56 -0
  721. package/objects/pillEffectClasses.lua +2 -0
  722. package/objects/pillEffectNames.js +55 -0
  723. package/objects/pillEffectNames.lua +2 -0
  724. package/objects/pillEffectTypes.js +55 -0
  725. package/objects/pillEffectTypes.lua +2 -0
  726. package/objects/playerNamePNGFileNames.js +55 -0
  727. package/objects/playerNamePNGFileNames.lua +2 -0
  728. package/objects/playerPortraitPNGFileNames.js +52 -0
  729. package/objects/playerPortraitPNGFileNames.lua +2 -0
  730. package/objects/roomShapeBounds.js +46 -0
  731. package/objects/roomShapeBounds.lua +2 -0
  732. package/objects/roomShapeCorners.js +268 -0
  733. package/objects/roomShapeCorners.lua +2 -0
  734. package/objects/roomShapeLayoutSizes.js +39 -0
  735. package/objects/roomShapeLayoutSizes.lua +2 -0
  736. package/objects/roomShapeToBottomRightPosition.js +22 -0
  737. package/objects/roomShapeToBottomRightPosition.lua +2 -0
  738. package/objects/roomShapeToDoorSlotCoordinates.js +109 -0
  739. package/objects/roomShapeToDoorSlotCoordinates.lua +2 -0
  740. package/objects/roomShapeToDoorSlots.js +69 -0
  741. package/objects/roomShapeToDoorSlots.lua +2 -0
  742. package/objects/roomShapeToDoorSlotsToGridIndexDelta.js +113 -0
  743. package/objects/roomShapeToDoorSlotsToGridIndexDelta.lua +2 -0
  744. package/objects/roomShapeToGridWidth.js +18 -0
  745. package/objects/roomShapeToGridWidth.lua +2 -0
  746. package/objects/roomShapeToTopLeftPosition.js +23 -0
  747. package/objects/roomShapeToTopLeftPosition.lua +2 -0
  748. package/objects/roomShapeVolumes.js +30 -0
  749. package/objects/roomShapeVolumes.lua +2 -0
  750. package/objects/roomTypeGotoPrefixes.js +33 -0
  751. package/objects/roomTypeGotoPrefixes.lua +2 -0
  752. package/objects/roomTypeNames.js +34 -0
  753. package/objects/roomTypeNames.lua +2 -0
  754. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.js +12 -0
  755. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.lua +2 -0
  756. package/objects/stageTypeSuffixes.js +10 -0
  757. package/objects/stageTypeSuffixes.lua +2 -0
  758. package/objects/stageTypeToLetter.js +12 -0
  759. package/objects/stageTypeToLetter.lua +2 -0
  760. package/objects/transformationNames.js +18 -0
  761. package/objects/transformationNames.lua +2 -0
  762. package/objects/versusScreenBackgroundColors.js +36 -0
  763. package/objects/versusScreenBackgroundColors.lua +2 -0
  764. package/objects/versusScreenDirtSpotColors.js +36 -0
  765. package/objects/versusScreenDirtSpotColors.lua +2 -0
  766. package/package.json +1 -1
  767. package/patchErrorFunctions.js +67 -0
  768. package/patchErrorFunctions.lua +2 -0
  769. package/sets/LRoomShapesSet.js +8 -0
  770. package/sets/LRoomShapesSet.lua +2 -0
  771. package/sets/bossSets.js +374 -0
  772. package/sets/bossSets.lua +2 -0
  773. package/sets/charactersThatStartWithAnActiveItemSet.js +15 -0
  774. package/sets/charactersThatStartWithAnActiveItemSet.lua +2 -0
  775. package/sets/charactersWithBlackHeartFromEternalHeartSet.js +6 -0
  776. package/sets/charactersWithBlackHeartFromEternalHeartSet.lua +2 -0
  777. package/sets/charactersWithFreeDevilDealsSet.js +3 -0
  778. package/sets/charactersWithFreeDevilDealsSet.lua +2 -0
  779. package/sets/charactersWithNoRedHeartsSet.js +16 -0
  780. package/sets/charactersWithNoRedHeartsSet.lua +2 -0
  781. package/sets/charactersWithNoSoulHeartsSet.js +13 -0
  782. package/sets/charactersWithNoSoulHeartsSet.lua +2 -0
  783. package/sets/chestPickupVariantsSet.js +16 -0
  784. package/sets/chestPickupVariantsSet.lua +2 -0
  785. package/sets/consoleCommandsSet.js +61 -0
  786. package/sets/consoleCommandsSet.lua +2 -0
  787. package/sets/familiarsThatShootPlayerTearsSet.js +12 -0
  788. package/sets/familiarsThatShootPlayerTearsSet.lua +2 -0
  789. package/sets/lostStyleCharactersSet.js +13 -0
  790. package/sets/lostStyleCharactersSet.lua +2 -0
  791. package/sets/mineShaftRoomSubTypesSet.js +9 -0
  792. package/sets/mineShaftRoomSubTypesSet.lua +2 -0
  793. package/sets/narrowRoomShapesSet.js +8 -0
  794. package/sets/narrowRoomShapesSet.lua +2 -0
  795. package/sets/redHeartSubTypesSet.js +7 -0
  796. package/sets/redHeartSubTypesSet.lua +2 -0
  797. package/sets/sinEntityTypesSet.js +11 -0
  798. package/sets/sinEntityTypesSet.lua +2 -0
  799. package/sets/singleUseActiveCollectibleTypesSet.js +12 -0
  800. package/sets/singleUseActiveCollectibleTypesSet.lua +2 -0
  801. package/sets/storyBossesSet.js +17 -0
  802. package/sets/storyBossesSet.lua +2 -0
  803. package/shaderCrashFix.js +17 -0
  804. package/shaderCrashFix.lua +2 -0
  805. package/types/AnyEntity.js +2 -0
  806. package/types/AnyEntity.lua +2 -0
  807. package/types/CollectibleIndex.js +2 -0
  808. package/types/CollectibleIndex.lua +2 -0
  809. package/types/PickingUpItem.js +38 -0
  810. package/types/PickingUpItem.lua +2 -0
  811. package/types/PlayerIndex.js +2 -0
  812. package/types/PlayerIndex.lua +2 -0
  813. package/types/private/IsaacAPIClass.js +2 -0
  814. package/types/private/IsaacAPIClass.lua +2 -0
  815. package/types/private/SerializedIsaacAPIClass.js +2 -0
  816. package/types/private/SerializedIsaacAPIClass.lua +2 -0
  817. package/types/private/TSTLClass.js +2 -0
  818. package/types/private/TSTLClass.lua +2 -0
  819. package/upgradeMod.js +47 -0
  820. package/upgradeMod.lua +2 -0
@@ -0,0 +1,160 @@
1
+ import { CollectibleType, PlayerType } from "isaac-typescript-definitions";
2
+ import { game } from "../cachedClasses";
3
+ const DEFAULT_COLLECTIBLE_TYPE = CollectibleType.SAD_ONION;
4
+ const EXCLUDED_CHARACTERS = new Set([
5
+ PlayerType.ESAU,
6
+ PlayerType.THE_SOUL_B, // 40
7
+ ]);
8
+ /**
9
+ * Helper function to get every player with no restrictions, by using `Game.GetNumPlayers` and
10
+ * `Isaac.GetPlayer`.
11
+ *
12
+ * This function is almost never what you want to use. For most purposes, use the `getPlayers`
13
+ * helper function instead to get a filtered list of players.
14
+ */
15
+ export function getAllPlayers() {
16
+ const numPlayers = game.GetNumPlayers();
17
+ const players = [];
18
+ for (let i = 0; i < numPlayers; i++) {
19
+ const player = Isaac.GetPlayer(i);
20
+ players.push(player);
21
+ }
22
+ return players;
23
+ }
24
+ export function getPlayerFromIndex(playerIndex) {
25
+ const players = getPlayers();
26
+ return players.find((player) => getPlayerIndex(player) === playerIndex);
27
+ }
28
+ /**
29
+ * Mods often have to track variables relating to the player. In naive mods, information will only
30
+ * be stored about the first player. However, in order to be robust, mods must handle up to 4
31
+ * players playing at the same time. This means that information must be stored on a map data
32
+ * structure. Finding a good index for these types of map data structures is difficult:
33
+ *
34
+ * - We cannot use the index from `Isaac.GetPlayer(i)` since this fails in the case where there are
35
+ * two players and the first player leaves the run.
36
+ * - We cannot use `EntityPlayer.ControllerIndex` as an index because it fails in the case of Jacob
37
+ * & Esau or Tainted Forgotten. It also fails in the case of a player changing their controls
38
+ * mid-run.
39
+ * - We cannot use `EntityPlayer.GetData().index` because it does not persist across saving and
40
+ * continuing.
41
+ * - We cannot use `GetPtrHash()` as an index because it does not persist across exiting and
42
+ * relaunching the game.
43
+ * - We cannot use `EntityPlayer.InitSeed` because it is not consistent with additional players
44
+ * beyond the first.
45
+ *
46
+ * Instead, we use the `EntityPlayer.GetCollectibleRNG` method with an arbitrary value of Sad Onion
47
+ * (1). This works even if the player does not have any Sad Onions.
48
+ *
49
+ * Since the RNG value is the same for both Tainted Lazarus and Dead Tainted Lazarus, we revert to
50
+ * using the RNG of The Inner Eye (2) for Dead Tainted Lazarus.
51
+ *
52
+ * Note that by default, this returns the same index for both The Forgotten and The Soul. (Even
53
+ * though they are technically different characters, they share the same inventory and InitSeed.) If
54
+ * this is not desired, pass true for the `differentiateForgottenAndSoul` argument, and the RNG of
55
+ * Spoon Bender (3) will be used for The Soul.
56
+ */
57
+ export function getPlayerIndex(player, differentiateForgottenAndSoul = false) {
58
+ // Sub-players use separate RNG values for some reason, so we need to always use the main player:
59
+ // https://github.com/Meowlala/RepentanceAPIIssueTracker/issues/443
60
+ // We can safely ignore the player's character because regardless of whether the main player ends
61
+ // up being The Forgotten or The Soul, the collectible RNG values will be the same. The
62
+ // `EntityPlayer.IsSubPlayer` method can return true for Dead Tainted Lazarus during the
63
+ // PostPlayerInit callback, but since we fall back to the player in the case of
64
+ // "getSubPlayerParent" returning undefined, we do not need to explicitly check for this case.
65
+ let playerToUse = player;
66
+ const isSubPlayer = player.IsSubPlayer();
67
+ if (isSubPlayer) {
68
+ // The "getSubPlayerParent" function will return undefined in the situation where we are on Dead
69
+ // Tainted Lazarus in the PostPlayerInit callback.
70
+ const playerParent = getSubPlayerParent(player);
71
+ if (playerParent !== undefined) {
72
+ playerToUse = playerParent;
73
+ }
74
+ }
75
+ const collectibleType = getPlayerIndexCollectibleType(player, differentiateForgottenAndSoul);
76
+ const collectibleRNG = playerToUse.GetCollectibleRNG(collectibleType);
77
+ const seed = collectibleRNG.GetSeed();
78
+ return seed;
79
+ }
80
+ function getPlayerIndexCollectibleType(player, differentiateForgottenAndSoul) {
81
+ const character = player.GetPlayerType();
82
+ switch (character) {
83
+ // 17
84
+ case PlayerType.THE_SOUL: {
85
+ return differentiateForgottenAndSoul
86
+ ? CollectibleType.SPOON_BENDER
87
+ : DEFAULT_COLLECTIBLE_TYPE;
88
+ }
89
+ // 38
90
+ case PlayerType.LAZARUS_2_B: {
91
+ return CollectibleType.INNER_EYE;
92
+ }
93
+ default: {
94
+ return DEFAULT_COLLECTIBLE_TYPE;
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * Helper function to return the index of this player with respect to the output of the
100
+ * `Isaac.GetPlayer` method.
101
+ *
102
+ * Note that if you storing information about a player in a data structure, you never want to use
103
+ * this index; use the `getPlayerIndex` function instead.
104
+ */
105
+ export function getPlayerIndexVanilla(playerToFind) {
106
+ const numPlayers = game.GetNumPlayers();
107
+ const playerToFindHash = GetPtrHash(playerToFind);
108
+ for (let i = 0; i < numPlayers; i++) {
109
+ const player = Isaac.GetPlayer(i);
110
+ const playerHash = GetPtrHash(player);
111
+ if (playerHash === playerToFindHash) {
112
+ return i;
113
+ }
114
+ }
115
+ return undefined;
116
+ }
117
+ /**
118
+ * This function always excludes players with a non-undefined parent, since they are not real
119
+ * players (e.g. the Strawman Keeper).
120
+ *
121
+ * If this is not desired, use the `getAllPlayers` helper function instead.
122
+ *
123
+ * @param performCharacterExclusions Whether or not to exclude characters that are not directly
124
+ * controlled by the player (i.e. Esau & Tainted Soul). Default is
125
+ * false.
126
+ */
127
+ export function getPlayers(performCharacterExclusions = false) {
128
+ const players = getAllPlayers();
129
+ const nonChildPlayers = players.filter((player) => !isChildPlayer(player));
130
+ const nonChildPlayersFiltered = nonChildPlayers.filter((player) => {
131
+ const character = player.GetPlayerType();
132
+ return !EXCLUDED_CHARACTERS.has(character);
133
+ });
134
+ return performCharacterExclusions ? nonChildPlayersFiltered : nonChildPlayers;
135
+ }
136
+ /**
137
+ * Helper function to get a parent `EntityPlayer` object for a given `EntitySubPlayer` object. This
138
+ * is useful because calling the `EntityPlayer.GetSubPlayer` method on a sub-player object will
139
+ * return undefined.
140
+ */
141
+ export function getSubPlayerParent(subPlayer) {
142
+ const subPlayerPtrHash = GetPtrHash(subPlayer);
143
+ const players = getPlayers();
144
+ return players.find((player) => {
145
+ const thisPlayerSubPlayer = player.GetSubPlayer();
146
+ if (thisPlayerSubPlayer === undefined) {
147
+ return false;
148
+ }
149
+ const thisPlayerSubPlayerPtrHash = GetPtrHash(thisPlayerSubPlayer);
150
+ return thisPlayerSubPlayerPtrHash === subPlayerPtrHash;
151
+ });
152
+ }
153
+ /**
154
+ * Some players are "child" players, meaning that they have a non-undefined Parent property. (For
155
+ * example, the Strawman Keeper.)
156
+ */
157
+ export function isChildPlayer(player) {
158
+ return player.Parent !== undefined;
159
+ }
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVySW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9wbGF5ZXJJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd4QyxNQUFNLHdCQUF3QixHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUM7QUFFM0QsTUFBTSxtQkFBbUIsR0FBNEIsSUFBSSxHQUFHLENBQUM7SUFDM0QsVUFBVSxDQUFDLElBQUk7SUFDZixVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUs7Q0FDN0IsQ0FBQyxDQUFDO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWE7SUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRXhDLE1BQU0sT0FBTyxHQUFtQixFQUFFLENBQUM7SUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNuQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdEI7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxXQUF3QjtJQUV4QixNQUFNLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUM3QixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FB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
@@ -175,3 +175,5 @@ function ____exports.getPlayerIndexVanilla(self, playerToFind)
175
175
  return nil
176
176
  end
177
177
  return ____exports
178
+
179
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL3BsYXllckluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztNQW1HUywrQkEvRkgsMEJBRUE7QUFOTiw2Q0FBNEM7QUFBbkM7QUFBaUI7QUFDMUIsMEJBQXFCO0FBQVo7Ozs7OztBQWlCVDtBQUNRLHVCQUFhLEtBQUs7QUFFbEIsb0JBQTBCOztBQUN2QixrQkFBSTtjQUFHLElBQUk7QUFDWiwyQkFBUyxnQkFBZ0I7QUFDL0Isb0NBQWE7QUFGaUI7OztBQUtoQyxXQUFPO0FBVFQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnREEsMENBQ0UsUUFDQTtPQUFBO1FBQUEsZ0NBQWdDOztBQVU1Qix3QkFBYztBQUNaLHdCQUFjLE9BQU87T0FDdkI7QUFHSSw2QkFBZSxvQ0FBbUI7V0FDcEM7QUFDRiwwQkFBYzs7O0FBSVosNEJBQWtCLG1DQUN0QixRQUNBO0FBRUksMkJBQWlCLFlBQVksa0JBQWtCO0FBQy9DLGlCQUFPLGVBQWU7QUFFNUIsV0FBTztBQTlCVDtBQWlDQSxTQUFTLG9DQUNQLFFBQ0E7QUFFTSxzQkFBWSxPQUFPOzs2QkFFakI7MkNBRUQ7OztBQUNILHVCQUFPLGtDQUNILGdDQUNBOzs7bURBSUQ7OztBQUNILHVCQUFPOzs7OztBQUlQLHVCQUFPOzs7Ozs7Ozs7Ozs7O0FBdUNiLHNDQUEyQjtPQUFBO1FBQUEsNkJBQTZCOztBQUNoRCxvQkFBVTtBQUNWLDRCQUFrQjtRQUFBO1FBQWUsZUFBQyxRQUFXLFdBQUMsK0JBQWMsT0FBM0I7O0FBQ2pDLG9DQUEwQjtRQUFBO1FBQXVCLGVBQUM7QUFDaEQsOEJBQVksT0FBTztBQUN6Qix1QkFBUSxvQkFBb0IsSUFBSTtRQUZxQjs7QUFLdkQsV0FBTywrQkFBNkIsMkJBQTBCO0FBUmhFOzs7O0FBZ0JBLDhDQUNFO0FBRU0sNkJBQW1CLFdBQVc7QUFDOUIsb0JBQVU7QUFFaEIsV0FBTztRQUFBO1FBQWEsZUFBQztBQUNiLHdDQUFzQixPQUFPO2VBQy9CO0FBQ0YsdUJBQU87O0FBR0gsK0NBQTZCLFdBQVc7QUFDOUMsbUJBQU8sOEJBQStCO1FBUHBCOztBQU50Qjs7O0FBcUJBLHlDQUE4QjtBQUM1QixXQUFPO0FBRFQ7QUEvTE0sMkJBQTJCO0FBRTNCLHNCQUErQyxVQUFJLEtBQUksQ0FDM0QsaUJBQ0E7QUFzQkYsOENBQ0U7QUFFTSxvQkFBVTtBQUNoQixXQUFPO1FBQUE7UUFBYSxlQUFDLFFBQVcsdUNBQWUsV0FBWSxXQUF2Qzs7QUFKdEI7Ozs7OztBQXFHQSxpREFDRTtBQUVNLHVCQUFhLEtBQUs7QUFDbEIsNkJBQW1CLFdBQVc7O0FBRTNCLGtCQUFJO2NBQUcsSUFBSTtBQUNaLDJCQUFTLGdCQUFnQjtBQUN6QiwrQkFBYSxXQUFXO2VBQzFCLGNBQWU7QUFDakIsdUJBQU87O0FBSnFCOzs7QUFRaEM7QUFkRiIsImZpbGUiOiJwbGF5ZXJJbmRleC5sdWEiLCJzb3VyY2VSb290IjoiIn0=
@@ -0,0 +1,124 @@
1
+ import { ActiveSlot, Card, CollectibleType, PillColor, PlayerType, PocketItemSlot, } from "isaac-typescript-definitions";
2
+ import { PocketItemType } from "../enums/PocketItemType";
3
+ import { getEnumValues } from "./enums";
4
+ import { isCharacter } from "./player";
5
+ /**
6
+ * Helper function to get the `PocketItemSlot` that the player's pocket active collectible item is
7
+ * in, if any. Returns undefined if the player does not have a pocket active item.
8
+ */
9
+ export function getActivePocketItemSlot(player) {
10
+ const pocketItems = getPocketItems(player);
11
+ for (const pocketItem of pocketItems) {
12
+ if (pocketItem.type === PocketItemType.ACTIVE_ITEM) {
13
+ return pocketItem.slot;
14
+ }
15
+ }
16
+ return undefined;
17
+ }
18
+ export function getFirstCardOrPill(player) {
19
+ const pocketItems = getPocketItems(player);
20
+ return pocketItems.find((pocketItem) => pocketItem.type === PocketItemType.CARD ||
21
+ pocketItem.type === PocketItemType.PILL);
22
+ }
23
+ /**
24
+ * Use this helper function as a workaround for the `EntityPlayer.GetPocketItem` method not working
25
+ * correctly.
26
+ *
27
+ * Note that due to API limitations, there is no way to determine the location of a Dice Bag trinket
28
+ * dice. Furthermore, when the player has a Dice Bag trinket dice and a pocket active at the same
29
+ * time, there is no way to determine the location of the pocket active item. If this function
30
+ * cannot determine the identity of a particular slot, it will mark the type of the slot as
31
+ * `PocketItemType.UNDETERMINABLE`.
32
+ */
33
+ export function getPocketItems(player) {
34
+ const pocketItem = player.GetActiveItem(ActiveSlot.POCKET);
35
+ const hasPocketItem = pocketItem !== CollectibleType.NULL;
36
+ const pocketItem2 = player.GetActiveItem(ActiveSlot.POCKET_SINGLE_USE);
37
+ const hasPocketItem2 = pocketItem2 !== CollectibleType.NULL;
38
+ const maxPocketItems = player.GetMaxPocketItems();
39
+ const pocketItemSlots = getEnumValues(PocketItemSlot);
40
+ const pocketItems = [];
41
+ let pocketItemIdentified = false;
42
+ let pocketItem2Identified = false;
43
+ for (const slot of pocketItemSlots) {
44
+ const card = player.GetCard(slot);
45
+ const pillColor = player.GetPill(slot);
46
+ if (card !== Card.NULL) {
47
+ pocketItems.push({
48
+ slot,
49
+ type: PocketItemType.CARD,
50
+ subType: card,
51
+ });
52
+ }
53
+ else if (pillColor !== PillColor.NULL) {
54
+ pocketItems.push({
55
+ slot,
56
+ type: PocketItemType.PILL,
57
+ subType: pillColor,
58
+ });
59
+ }
60
+ else if (hasPocketItem && !hasPocketItem2 && !pocketItemIdentified) {
61
+ pocketItemIdentified = true;
62
+ pocketItems.push({
63
+ slot,
64
+ type: PocketItemType.ACTIVE_ITEM,
65
+ subType: pocketItem,
66
+ });
67
+ }
68
+ else if (!hasPocketItem && hasPocketItem2 && !pocketItem2Identified) {
69
+ pocketItem2Identified = true;
70
+ pocketItems.push({
71
+ slot,
72
+ type: PocketItemType.DICE_BAG_DICE,
73
+ subType: pocketItem2,
74
+ });
75
+ }
76
+ else if (hasPocketItem && hasPocketItem2) {
77
+ pocketItems.push({
78
+ slot,
79
+ type: PocketItemType.UNDETERMINABLE,
80
+ subType: 0,
81
+ });
82
+ }
83
+ else {
84
+ pocketItems.push({
85
+ slot,
86
+ type: PocketItemType.EMPTY,
87
+ subType: 0,
88
+ });
89
+ }
90
+ // eslint-disable-next-line isaacscript/strict-enums
91
+ if (slot + 1 === maxPocketItems) {
92
+ break;
93
+ }
94
+ }
95
+ return pocketItems;
96
+ }
97
+ /**
98
+ * Returns whether or not the player can hold an additional pocket item, beyond what they are
99
+ * currently carrying. This takes into account items that modify the max number of pocket items,
100
+ * like Starter Deck.
101
+ *
102
+ * If the player is the Tainted Soul, this always returns false, since that character cannot pick up
103
+ * items. (Only Tainted Forgotten can pick up items.)
104
+ */
105
+ export function hasOpenPocketItemSlot(player) {
106
+ if (isCharacter(player, PlayerType.THE_SOUL_B)) {
107
+ return false;
108
+ }
109
+ const pocketItems = getPocketItems(player);
110
+ return pocketItems.some((pocketItem) => pocketItem.type === PocketItemType.EMPTY);
111
+ }
112
+ /**
113
+ * Helper function to determine whether or not the player's "active" pocket item slot is set to
114
+ * their pocket active item.
115
+ */
116
+ export function isFirstSlotPocketActiveItem(player) {
117
+ const pocketItems = getPocketItems(player);
118
+ const firstPocketItem = pocketItems[0];
119
+ if (firstPocketItem === undefined) {
120
+ return false;
121
+ }
122
+ return firstPocketItem.type === PocketItemType.ACTIVE_ITEM;
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ja2V0SXRlbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9wb2NrZXRJdGVtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLElBQUksRUFDSixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixjQUFjLEdBQ2YsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXZDOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsTUFBb0I7SUFFcEIsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFO1FBQ3BDLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsV0FBVyxFQUFFO1lBQ2xELE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQztTQUN4QjtLQUNGO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsTUFBb0I7SUFFcEIsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FDckIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUNiLFVBQVUsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLElBQUk7UUFDdkMsVUFBVSxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsSUFBSSxDQUMxQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxjQUFj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
@@ -102,3 +102,5 @@ function ____exports.isFirstSlotPocketActiveItem(self, player)
102
102
  return firstPocketItem.type == PocketItemType.ACTIVE_ITEM
103
103
  end
104
104
  return ____exports
105
+
106
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL3BvY2tldEl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FPTztBQU5MO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVGLDJCQUErQjtBQUF0QjtBQUVULGtCQUE4QjtBQUFyQjtBQUNULG1CQUE0QjtBQUFuQjs7Ozs7Ozs7O0FBd0NULDBDQUErQjtBQUN2Qix1QkFBYSxPQUFPLGNBQWM7QUFDbEMsMEJBQWdCLGNBQWU7QUFFL0Isd0JBQWMsT0FBTyxjQUFjO0FBQ25DLDJCQUFpQixlQUFnQjtBQUVqQywyQkFBaUIsT0FBTztBQUN4Qiw0QkFBa0IsbUJBQWM7QUFFaEMsd0JBQXVDO0FBQ3pDLGlDQUF1QjtBQUN2QixrQ0FBd0I7QUFDNUIsY0FBVyxlQUFRO0FBQ1gscUJBQU8sT0FBTyxRQUFRO0FBQ3RCLDBCQUFZLE9BQU8sUUFBUTtXQUU3QixRQUFTO0FBQ1gsNENBQWlCLENBQ2YsYUFDQSxPQUFNLHFCQUNOLFVBQVM7ZUFFRixhQUFjO0FBQ3ZCLDRDQUFpQixDQUNmLGFBQ0EsT0FBTSxxQkFDTixVQUFTO2VBRUYsc0JBQWtCLHVCQUFtQjtBQUM5QyxtQ0FBdUI7QUFDdkIsNENBQWlCLENBQ2YsYUFDQSxPQUFNLDRCQUNOLFVBQVM7ZUFFRixJQUFDLGtCQUFpQix1QkFBbUI7QUFDOUMsb0NBQXdCO0FBQ3hCLDRDQUFpQixDQUNmLGFBQ0EsT0FBTSw4QkFDTixVQUFTO2VBRUYsa0JBQWlCO0FBQzFCLDRDQUFpQixDQUNmLGFBQ0EsT0FBTSwrQkFDTixVQUFTOztBQUdYLDRDQUFpQixDQUNmLGFBQ0EsT0FBTSxzQkFDTixVQUFTOztXQUtULE9BQU8sS0FBTTtBQUNmOzs7QUFJSixXQUFPO0FBL0RUOzs7QUFsQ0EsbURBQ0U7QUFFTSx3QkFBYyxnQ0FBZTtBQUNuQyxjQUFXLHFCQUFjO1dBQ25CLG1CQUFvQjtBQUN0QixtQkFBTzs7O0FBSVg7QUFWRjtBQWFBLDhDQUNFO0FBRU0sd0JBQWMsZ0NBQWU7QUFDbkMsV0FBTztRQUFBO1FBQ0wsZUFBQyxZQUNDLDBCQUFvQix1QkFDcEIsbUJBQW9CLG1CQUZ0Qjs7QUFMSjs7Ozs7OztBQStGQSxpREFBc0M7T0FDaEMsaUJBQVksUUFBUTtBQUN0QixlQUFPOztBQUdILHdCQUFjLGdDQUFlO0FBQ25DLFdBQU87UUFBQTtRQUNMLGVBQUMsWUFBZSwwQkFBb0Isb0JBQXBDOztBQVBKOzs7QUFlQSx1REFBNEM7QUFDcEMsd0JBQWMsZ0NBQWU7QUFDN0IsNEJBQWtCLFlBQVk7T0FDaEM7QUFDRixlQUFPOztBQUdULFdBQU8sd0JBQXlCO0FBUGxDIiwiZmlsZSI6InBvY2tldEl0ZW1zLmx1YSIsInNvdXJjZVJvb3QiOiIifQ==
@@ -0,0 +1,136 @@
1
+ import { EffectVariant, HeavenLightDoorSubType, } from "isaac-typescript-definitions";
2
+ import { game } from "../cachedClasses";
3
+ import { DISTANCE_OF_GRID_TILE } from "../constants";
4
+ import { getEntities } from "./entity";
5
+ import { getEffects } from "./entitySpecific";
6
+ import { getPlayerCloserThan } from "./player";
7
+ import { getPlayers } from "./playerIndex";
8
+ const MAX_FIND_FREE_POSITION_ATTEMPTS = 100;
9
+ export function anyEntityCloserThan(entities, position, distance) {
10
+ return entities.some((entity) => position.Distance(entity.Position) <= distance);
11
+ }
12
+ /** Iterates over all players and checks if any player is close enough to the specified position. */
13
+ export function anyPlayerCloserThan(position, distance) {
14
+ const players = getPlayers();
15
+ return players.some((player) => player.Position.Distance(position) <= distance);
16
+ }
17
+ /**
18
+ * Helper function to get a room position that is not overlapping with a grid entity, a heaven door,
19
+ * or a player. The `Room.FindFreePickupSpawnPosition` method will return locations that overlap
20
+ * with heaven doors and partially overlap with players, if the thing being spawned is bigger than a
21
+ * tile (like a Blood Donation Machine). Use this function instead if you want to account for those
22
+ * specific situations.
23
+ *
24
+ * @param startingPosition The position to start searching from. If this position is not overlapping
25
+ * with anything, then it will be returned.
26
+ * @param avoidActiveEntities Optional. Default is false.
27
+ */
28
+ export function findFreePosition(startingPosition, avoidActiveEntities = false) {
29
+ const room = game.GetRoom();
30
+ const heavenDoors = getEffects(EffectVariant.HEAVEN_LIGHT_DOOR, HeavenLightDoorSubType.HEAVEN_DOOR);
31
+ for (let i = 0; i < MAX_FIND_FREE_POSITION_ATTEMPTS; i++) {
32
+ const position = room.FindFreePickupSpawnPosition(startingPosition, i, avoidActiveEntities);
33
+ const closePlayer = getPlayerCloserThan(position, DISTANCE_OF_GRID_TILE);
34
+ if (closePlayer !== undefined) {
35
+ continue;
36
+ }
37
+ const isCloseHeavenDoor = anyEntityCloserThan(heavenDoors, position, DISTANCE_OF_GRID_TILE);
38
+ if (isCloseHeavenDoor) {
39
+ continue;
40
+ }
41
+ return position;
42
+ }
43
+ // We failed to find a free position in N iterations.
44
+ return room.FindFreePickupSpawnPosition(startingPosition);
45
+ }
46
+ /**
47
+ * Helper function to get a map containing the positions of every entity in the current room.
48
+ *
49
+ * This is useful for rewinding entity positions at a later time. Also see `setEntityPositions`.
50
+ *
51
+ * @param entities Optional. If provided, will only get the positions of the provided entities. Use
52
+ * this with cached entities to avoid invoking the `Isaac.GetRoomEntities` method
53
+ * multiple times.
54
+ */
55
+ export function getEntityPositions(entities) {
56
+ if (entities === undefined) {
57
+ entities = getEntities();
58
+ }
59
+ const entityPositions = new Map();
60
+ for (const entity of entities) {
61
+ const ptrHash = GetPtrHash(entity);
62
+ entityPositions.set(ptrHash, entity.Position);
63
+ }
64
+ return entityPositions;
65
+ }
66
+ /**
67
+ * Helper function to get a map containing the velocities of every entity in the current room.
68
+ *
69
+ * This is useful for rewinding entity velocities at a later time. Also see `setEntityVelocities`.
70
+ *
71
+ * @param entities Optional. If provided, will only get the velocities of the provided entities. Use
72
+ * this with cached entities to avoid invoking the `Isaac.GetRoomEntities` method
73
+ * multiple times.
74
+ */
75
+ export function getEntityVelocities(entities) {
76
+ if (entities === undefined) {
77
+ entities = getEntities();
78
+ }
79
+ const entityVelocities = new Map();
80
+ for (const entity of entities) {
81
+ const ptrHash = GetPtrHash(entity);
82
+ entityVelocities.set(ptrHash, entity.Velocity);
83
+ }
84
+ return entityVelocities;
85
+ }
86
+ /**
87
+ * Helper function to set the position of every entity in the room based on a map of positions. If
88
+ * an entity is found that does not have matching element in the provided map, then that entity will
89
+ * be skipped.
90
+ *
91
+ * This function is useful for rewinding entity positions at a later time. Also see
92
+ * `getEntityPositions`.
93
+ *
94
+ * @param entityPositions The map providing the positions for every entity.
95
+ * @param entities Optional. If provided, will only set the positions of the provided entities. Use
96
+ * this with cached entities to avoid invoking the `Isaac.GetRoomEntities` method
97
+ * multiple times.
98
+ */
99
+ export function setEntityPositions(entityPositions, entities) {
100
+ if (entities === undefined) {
101
+ entities = getEntities();
102
+ }
103
+ for (const entity of entities) {
104
+ const ptrHash = GetPtrHash(entity);
105
+ const entityPosition = entityPositions.get(ptrHash);
106
+ if (entityPosition !== undefined) {
107
+ entity.Position = entityPosition;
108
+ }
109
+ }
110
+ }
111
+ /**
112
+ * Helper function to set the velocity of every entity in the room based on a map of velocities. If
113
+ * an entity is found that does not have matching element in the provided map, then that entity will
114
+ * be skipped.
115
+ *
116
+ * This function is useful for rewinding entity velocities at a later time. Also see
117
+ * `getEntityVelocities`.
118
+ *
119
+ * @param entityVelocities The map providing the velocities for every entity.
120
+ * @param entities Optional. If provided, will only set the velocities of the provided entities. Use
121
+ * this with cached entities to avoid invoking the `Isaac.GetRoomEntities` method
122
+ * multiple times.
123
+ */
124
+ export function setEntityVelocities(entityVelocities, entities) {
125
+ if (entities === undefined) {
126
+ entities = getEntities();
127
+ }
128
+ for (const entity of entities) {
129
+ const ptrHash = GetPtrHash(entity);
130
+ const entityVelocity = entityVelocities.get(ptrHash);
131
+ if (entityVelocity !== undefined) {
132
+ entity.Velocity = entityVelocity;
133
+ }
134
+ }
135
+ }
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25WZWxvY2l0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL3Bvc2l0aW9uVmVsb2NpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGFBQWEsRUFDYixzQkFBc0IsR0FDdkIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE1BQU0sK0JBQStCLEdBQUcsR0FBRyxDQUFDO0FBRTVDLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsUUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsUUFBYTtJQUViLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FDbEIsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRCxvR0FBb0c7QUFDcEcsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxRQUFnQixFQUNoQixRQUFlO0lBRWYsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDN0IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUNqQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUMz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
@@ -152,3 +152,5 @@ function ____exports.setEntityVelocities(self, entityVelocities, entities)
152
152
  end
153
153
  end
154
154
  return ____exports
155
+
156
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL3Bvc2l0aW9uVmVsb2NpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FHTztBQUZMO0FBQ0E7QUFFRiwwQkFBcUI7QUFBWjtBQUNULHNCQUFzQztBQUE3QjtBQUNULG1CQUE0QjtBQUFuQjtBQUNULDJCQUEyQjtBQUFsQjtBQUNULG1CQUFvQztBQUEzQjtBQUNULHdCQUEyQjtBQUFsQjtBQUVILHdDQUFrQztBQUV4QywrQ0FDRSxVQUNBLFVBQ0E7QUFFQSxXQUFPO1FBQUE7UUFDTCxlQUFDLFFBQVcsZ0JBQVMsU0FBUyxvQkFBb0IsUUFBbEQ7O0FBTko7O0FBV0EsK0NBQ0UsVUFDQTtBQUVNLG9CQUFVO0FBQ2hCLFdBQU87UUFBQTtRQUNMLGVBQUMsUUFBVyx1QkFBZ0IsU0FBUyxhQUFhLFFBQWxEOztBQU5KOzs7Ozs7Ozs7O0FBcUJBLDRDQUNFLGtCQUNBO09BQUE7UUFBQSxzQkFBc0I7O0FBRWhCLGlCQUFPLEtBQUs7QUFDWix3QkFBYyxnQkFDbEIsaUNBQ0E7O0FBR08sa0JBQUk7Y0FBRyxJQUFJOztBQUNaLGlDQUFXLEtBQUssNEJBQ3BCLGtCQUNBLEdBQ0E7QUFHSSxvQ0FBYyx5QkFBb0IsVUFBVTttQkFDOUM7QUFDRjs7QUFHSSwwQ0FBb0IscUNBQ3hCLGFBQ0EsVUFDQTttQkFFRTtBQUNGOztBQUdGLHVCQUFPOzs7QUFyQjRDOzs7QUF5QnJELFdBQU8sS0FBSyw0QkFBNEI7QUFuQzFDOzs7Ozs7OztBQStDQSw4Q0FBbUM7T0FDN0I7QUFDRixtQkFBVzs7QUFHUCw0QkFBa0IsVUFBSTtBQUM1QixjQUFXLGlCQUFVO0FBQ2Isd0JBQVUsV0FBVztRQUMzQixnQkFBZ0IsSUFBSSxTQUFTOztBQUcvQixXQUFPO0FBWFQ7Ozs7Ozs7O0FBdUJBLCtDQUFvQztPQUM5QjtBQUNGLG1CQUFXOztBQUdQLDZCQUFtQixVQUFJO0FBQzdCLGNBQVcsaUJBQVU7QUFDYix3QkFBVSxXQUFXO1FBQzNCLGlCQUFpQixJQUFJLFNBQVM7O0FBR2hDLFdBQU87QUFYVDs7Ozs7Ozs7Ozs7O0FBMkJBLDhDQUNFLGlCQUNBO09BRUk7QUFDRixtQkFBVzs7QUFHYixjQUFXLGlCQUFVO0FBQ2Isd0JBQVUsV0FBVztBQUNyQiwrQkFBaUIsZ0JBQWdCLElBQUk7V0FDdkM7QUFDRiw4QkFBa0I7OztBQVp4Qjs7Ozs7Ozs7Ozs7O0FBOEJBLCtDQUNFLGtCQUNBO09BRUk7QUFDRixtQkFBVzs7QUFHYixjQUFXLGlCQUFVO0FBQ2Isd0JBQVUsV0FBVztBQUNyQiwrQkFBaUIsaUJBQWlCLElBQUk7V0FDeEM7QUFDRiw4QkFBa0I7OztBQVp4QiIsImZpbGUiOiJwb3NpdGlvblZlbG9jaXR5Lmx1YSIsInNvdXJjZVJvb3QiOiIifQ==
@@ -0,0 +1,73 @@
1
+ import { getRandomSeed, isRNG, newRNG } from "./rng";
2
+ /**
3
+ * This returns a random float between 0 and 1. It is inclusive on the low end, but exclusive on the
4
+ * high end. (This is because the `RNG.RandomFloat` method will never return a value of exactly 1.)
5
+ *
6
+ * @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
7
+ * `RNG.Next` method will be called. Default is `getRandomSeed()`.
8
+ */
9
+ export function getRandom(seedOrRNG = getRandomSeed()) {
10
+ const rng = isRNG(seedOrRNG) ? seedOrRNG : newRNG(seedOrRNG);
11
+ return rng.RandomFloat();
12
+ }
13
+ /**
14
+ * This returns a random float between min and max.
15
+ *
16
+ * For example:
17
+ *
18
+ * ```ts
19
+ * const realNumberBetweenOneAndThree = getRandomFloat(1, 3);
20
+ * ```
21
+ *
22
+ * @param min The lower bound for the random number (inclusive).
23
+ * @param max The upper bound for the random number (exclusive).
24
+ * @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
25
+ * `RNG.Next` method will be called. Default is `getRandomSeed()`.
26
+ */
27
+ export function getRandomFloat(min, max, seedOrRNG = getRandomSeed()) {
28
+ if (min > max) {
29
+ const oldMin = min;
30
+ const oldMax = max;
31
+ min = oldMax;
32
+ max = oldMin;
33
+ }
34
+ // From: https://stackoverflow.com/questions/40431966
35
+ return min + getRandom(seedOrRNG) * (max - min);
36
+ }
37
+ /**
38
+ * This returns a random integer between min and max. It is inclusive on both ends.
39
+ *
40
+ * Note that this function will invoke the `Next` method on the `RNG` object before returning the
41
+ * random number.
42
+ *
43
+ * For example:
44
+ *
45
+ * ```ts
46
+ * const oneTwoOrThree = getRandomInt(1, 3);
47
+ * ```
48
+ *
49
+ * @param min The lower bound for the random number (inclusive).
50
+ * @param max The upper bound for the random number (inclusive).
51
+ * @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
52
+ * `RNG.Next` method will be called. Default is `getRandomSeed()`.
53
+ * @param exceptions Optional. An array of elements that will be skipped over when getting the
54
+ * random integer. For example, a min of 1, a max of 4, and an exceptions array of
55
+ * `[2]` would cause the function to return either 1, 3, or 4. Default is an empty
56
+ * array.
57
+ */
58
+ export function getRandomInt(min, max, seedOrRNG = getRandomSeed(), exceptions = []) {
59
+ const rng = isRNG(seedOrRNG) ? seedOrRNG : newRNG(seedOrRNG);
60
+ if (min > max) {
61
+ const oldMin = min;
62
+ const oldMax = max;
63
+ min = oldMax;
64
+ max = oldMin;
65
+ }
66
+ const exceptionsSet = new Set(exceptions);
67
+ let randomInt;
68
+ do {
69
+ randomInt = rng.RandomInt(max - min + 1) + min;
70
+ } while (exceptionsSet.has(randomInt));
71
+ return randomInt;
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvcmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLFlBQXdCLGFBQWEsRUFBRTtJQUMvRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsR0FBUSxFQUNSLEdBQVEsRUFDUixZQUF3QixhQUFhLEVBQUU7SUFFdkMsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFO1FBQ2IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNuQixHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ2IsR0FBRyxHQUFHLE1BQU0sQ0FBQztLQUNkO0lBRUQscURBQXFEO0lBQ3JELE9BQU8sR0FBRyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsR0FBUSxFQUNSLEdBQVEsRUFDUixZQUF3QixhQUFhLEVBQUUsRUFDdkMsYUFBcUMsRUFBRTtJQUV2QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdELElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRTtRQUNiLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbkIsR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUNiLEdBQUcsR0FBRyxNQUFNLENBQUM7S0FDZDtJQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTFDLElBQUksU0FBYyxDQUFDO0lBQ25CLEdBQUc7UUFDRCxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztLQUNoRCxRQUFRLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7SUFFdkMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyJ9
@@ -85,3 +85,5 @@ function ____exports.getRandomInt(self, min, max, seedOrRNG, exceptions)
85
85
  return randomInt
86
86
  end
87
87
  return ____exports
88
+
89
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL3JhbmRvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsZ0JBQTZDO0FBQXBDO0FBQWU7QUFBTzs7Ozs7O0FBUy9CLHFDQUEwQjtPQUFBO1FBQUEsWUFBd0I7O0FBQzFDLGdCQUFNLFdBQU0sZUFBYSxhQUFZLFlBQU87QUFDbEQsV0FBTyxJQUFJO0FBRmI7Ozs7Ozs7Ozs7Ozs7QUFtQkEsMENBQ0UsS0FDQSxLQUNBO09BQUE7UUFBQSxZQUF3Qjs7T0FFcEIsTUFBTTtBQUNGLHVCQUFTO0FBQ1QsdUJBQVM7QUFDZixjQUFNO0FBQ04sY0FBTTs7QUFJUixXQUFPLE1BQU0sMkJBQVUsYUFBYyxPQUFNO0FBYjdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFDQSx3Q0FDRSxLQUNBLEtBQ0EsV0FDQTtPQURBO1FBQUEsWUFBd0I7O09BQ3hCO1FBQUEsYUFBcUM7O0FBRS9CLGdCQUFNLFdBQU0sZUFBYSxhQUFZLFlBQU87T0FFOUMsTUFBTTtBQUNGLHVCQUFTO0FBQ1QsdUJBQVM7QUFDZixjQUFNO0FBQ04sY0FBTTs7QUFHRiwwQkFBZ0IsVUFBSSxLQUFJO0FBRTFCOzs7QUFFRix3QkFBWSxJQUFJLFVBQVUsTUFBTSxNQUFNLEtBQUs7O1VBQ3BDLGtCQUFjLElBQUk7QUFFM0IsV0FBTztBQXRCVCIsImZpbGUiOiJyYW5kb20ubHVhIiwic291cmNlUm9vdCI6IiJ9