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,808 @@
1
+ import { ActiveSlot, CacheFlag, Challenge, CollectibleType, FamiliarVariant, NullItemID, PlayerForm, PlayerType, TrinketType, } from "isaac-typescript-definitions";
2
+ import { game, itemConfig } from "../cachedClasses";
3
+ import { HealthType } from "../enums/HealthType";
4
+ import { getLastElement, sumArray } from "./array";
5
+ import { countSetBits, getKBitOfN, getNumBitsOfN } from "./bitwise";
6
+ import { getCharacterMaxHeartContainers, getCharacterName, isVanillaCharacter, } from "./character";
7
+ import { getCollectibleMaxCharges } from "./collectibles";
8
+ import { getCollectibleArray } from "./collectibleSet";
9
+ import { getEnumValues } from "./enums";
10
+ import { getPlayerIndexVanilla, getPlayers } from "./playerIndex";
11
+ import { addTearsStat } from "./tears";
12
+ import { repeat } from "./utils";
13
+ const STAT_CACHE_FLAGS_SET = new Set([
14
+ CacheFlag.DAMAGE,
15
+ CacheFlag.FIRE_DELAY,
16
+ CacheFlag.SHOT_SPEED,
17
+ CacheFlag.RANGE,
18
+ CacheFlag.SPEED,
19
+ CacheFlag.LUCK, // 1 << 10
20
+ ]);
21
+ export function addCollectibleCostume(player, collectibleType) {
22
+ const itemConfigItem = itemConfig.GetCollectible(collectibleType);
23
+ if (itemConfigItem === undefined) {
24
+ return;
25
+ }
26
+ player.AddCostume(itemConfigItem, false);
27
+ }
28
+ /**
29
+ * Helper function to add a stat to a player based on the `CacheFlag` provided. Call this function
30
+ * from the EvaluateCache callback.
31
+ *
32
+ * Note that for `CacheFlag.FIRE_DELAY`, the "amount" argument will be interpreted as the tear stat
33
+ * to add (and not the amount to mutate `EntityPlayer.MaxFireDelay` by).
34
+ *
35
+ * This function supports the following cache flags:
36
+ * - CacheFlag.DAMAGE (1 << 0)
37
+ * - CacheFlag.FIRE_DELAY (1 << 1)
38
+ * - CacheFlag.SHOT_SPEED (1 << 2)
39
+ * - CacheFlag.RANGE (1 << 3)
40
+ * - CacheFlag.SPEED (1 << 4)
41
+ * - CacheFlag.LUCK (1 << 10)
42
+ */
43
+ export function addStat(player, cacheFlag, amount) {
44
+ if (!STAT_CACHE_FLAGS_SET.has(cacheFlag)) {
45
+ error(`You cannot add a stat to a player with the cache flag of: ${cacheFlag}`);
46
+ }
47
+ switch (cacheFlag) {
48
+ // 1 << 0
49
+ case CacheFlag.DAMAGE: {
50
+ player.Damage += amount;
51
+ break;
52
+ }
53
+ // 1 << 1
54
+ case CacheFlag.FIRE_DELAY: {
55
+ addTearsStat(player, amount);
56
+ break;
57
+ }
58
+ // 1 << 2
59
+ case CacheFlag.SHOT_SPEED: {
60
+ player.ShotSpeed += amount;
61
+ break;
62
+ }
63
+ // 1 << 3
64
+ case CacheFlag.RANGE: {
65
+ player.TearHeight += amount;
66
+ break;
67
+ }
68
+ // 1 << 4
69
+ case CacheFlag.SPEED: {
70
+ player.MoveSpeed += amount;
71
+ break;
72
+ }
73
+ // 1 << 10
74
+ case CacheFlag.LUCK: {
75
+ player.Luck += amount;
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ export function addTrinketCostume(player, trinketType) {
81
+ const itemConfigTrinket = itemConfig.GetTrinket(trinketType);
82
+ if (itemConfigTrinket === undefined) {
83
+ return;
84
+ }
85
+ player.AddCostume(itemConfigTrinket, false);
86
+ }
87
+ export function anyPlayerHasCollectible(collectibleType) {
88
+ const players = getPlayers();
89
+ return players.some((player) => player.HasCollectible(collectibleType));
90
+ }
91
+ export function anyPlayerHasTrinket(trinketType) {
92
+ const players = getPlayers();
93
+ return players.some((player) => player.HasTrinket(trinketType));
94
+ }
95
+ /**
96
+ * Helper function to determine if the given character is present.
97
+ *
98
+ * This function is variadic, meaning that you can supply as many characters as you want to check
99
+ * for. Returns true if any of the characters supplied are present.
100
+ */
101
+ export function anyPlayerIs(...matchingCharacters) {
102
+ const matchingCharacterSet = new Set(matchingCharacters);
103
+ const characters = getCharacters();
104
+ return characters.some((character) => matchingCharacterSet.has(character));
105
+ }
106
+ /**
107
+ * Helper function to determine if a player will destroy a rock/pot/skull if they walk over it.
108
+ *
109
+ * The following situations allow for this to be true:
110
+ * - the player has Leo (collectible 302)
111
+ * - the player has Thunder Thighs (collectible 314)
112
+ * - the player is under the effects of Mega Mush (collectible 625)
113
+ * - the player has Stompy (transformation 13)
114
+ */
115
+ export function canPlayerCrushRocks(player) {
116
+ const effects = player.GetEffects();
117
+ return (player.HasCollectible(CollectibleType.LEO) ||
118
+ player.HasCollectible(CollectibleType.THUNDER_THIGHS) ||
119
+ effects.HasCollectibleEffect(CollectibleType.MEGA_MUSH) ||
120
+ player.HasPlayerForm(PlayerForm.STOMPY));
121
+ }
122
+ /**
123
+ * Returns whether or not all of the player's soul-heart-type hearts are black hearts.
124
+ *
125
+ * Note that this function does not consider red heart containers.
126
+ *
127
+ * For example:
128
+ *
129
+ * - If the player has one black heart, this function would return true.
130
+ * - If the player has one soul heart and two black hearts, this function would return false.
131
+ * - If the player has no black hearts, this function will return false.
132
+ * - If the player has one red heart container and three black hearts, this function would return
133
+ * true.
134
+ */
135
+ export function doesPlayerHaveAllBlackHearts(player) {
136
+ const soulHearts = getPlayerSoulHearts(player);
137
+ const blackHearts = getPlayerBlackHearts(player);
138
+ return blackHearts > 0 && soulHearts === 0;
139
+ }
140
+ /**
141
+ * Returns whether or not all of the player's soul-heart-type hearts are soul hearts.
142
+ *
143
+ * Note that this function does not consider red heart containers.
144
+ *
145
+ * For example:
146
+ *
147
+ * - If the player has two soul hearts and one black heart, this function would return false.
148
+ * - If the player has no soul hearts, this function will return false.
149
+ * - If the player has one red heart container and three soul hearts, this function would return
150
+ * true.
151
+ */
152
+ export function doesPlayerHaveAllSoulHearts(player) {
153
+ const soulHearts = getPlayerSoulHearts(player);
154
+ const blackHearts = getPlayerBlackHearts(player);
155
+ return soulHearts > 0 && blackHearts === 0;
156
+ }
157
+ /**
158
+ * Helper function to find the active slot that the player has the corresponding collectible type
159
+ * in. Returns undefined if the player does not have the collectible in any active slot.
160
+ */
161
+ export function getActiveItemSlot(player, collectibleType) {
162
+ const activeSlots = getEnumValues(ActiveSlot);
163
+ return activeSlots.find((activeSlot) => {
164
+ const activeItem = player.GetActiveItem(activeSlot);
165
+ return activeItem === collectibleType;
166
+ });
167
+ }
168
+ /**
169
+ * Helper function to get how long Azazel's Brimstone laser should be. You can pass either an
170
+ * `EntityPlayer` object or a tear height stat.
171
+ *
172
+ * The formula for calculating it is: 32 - 2.5 * player.TearHeight
173
+ */
174
+ export function getAzazelBrimstoneDistance(playerOrTearHeight) {
175
+ let tearHeight = tonumber(playerOrTearHeight);
176
+ if (tearHeight === undefined) {
177
+ const player = playerOrTearHeight;
178
+ tearHeight = player.TearHeight;
179
+ }
180
+ return 32 - 2.5 * tearHeight;
181
+ }
182
+ /** Helper function to get an array containing the characters of all of the current players. */
183
+ export function getCharacters() {
184
+ const players = getPlayers();
185
+ return players.map((player) => player.GetPlayerType());
186
+ }
187
+ export function getClosestPlayer(position) {
188
+ let closestPlayer = null;
189
+ let closestDistance = math.huge;
190
+ for (const player of getPlayers()) {
191
+ const distance = position.Distance(player.Position);
192
+ if (distance < closestDistance) {
193
+ closestPlayer = player;
194
+ closestDistance = distance;
195
+ }
196
+ }
197
+ if (closestPlayer === null) {
198
+ error("Failed to find the closest player.");
199
+ }
200
+ return closestPlayer;
201
+ }
202
+ /**
203
+ * Helper function to get an array of temporary effects for a player. This is helpful so that you
204
+ * don't have to manually create an array from an `EffectsList` object.
205
+ */
206
+ export function getEffectsList(player) {
207
+ const effects = player.GetEffects();
208
+ const effectsList = effects.GetEffectsList();
209
+ const effectArray = [];
210
+ for (let i = 0; i < effectsList.Size; i++) {
211
+ const effect = effectsList.Get(i);
212
+ if (effect !== undefined) {
213
+ effectArray.push(effect);
214
+ }
215
+ }
216
+ return effectArray;
217
+ }
218
+ /**
219
+ * Helper function to return the player with the highest ID, according to the `Isaac.GetPlayer`
220
+ * method.
221
+ */
222
+ export function getFinalPlayer() {
223
+ const players = getPlayers();
224
+ const lastPlayer = getLastElement(players);
225
+ if (lastPlayer === undefined) {
226
+ error("Failed to get the final player since there were 0 players.");
227
+ }
228
+ return lastPlayer;
229
+ }
230
+ /**
231
+ * Helper function to get the first player with the lowest frame count. Useful to find a freshly
232
+ * spawned player after using items like Esau Jr. Don't use this function if two or more players
233
+ * will be spawned on the same frame.
234
+ */
235
+ export function getNewestPlayer() {
236
+ let newestPlayer = null;
237
+ let lowestFrame = math.huge;
238
+ for (const player of getPlayers()) {
239
+ if (player.FrameCount < lowestFrame) {
240
+ newestPlayer = player;
241
+ lowestFrame = player.FrameCount;
242
+ }
243
+ }
244
+ if (newestPlayer === null) {
245
+ error("Failed to find the newest player.");
246
+ }
247
+ return newestPlayer;
248
+ }
249
+ /**
250
+ * Returns the number of slots that the player has remaining for new heart containers, accounting
251
+ * for broken hearts. For example, if the player is Judas and has 1 red heart containers and 2 full
252
+ * soul hearts and 3 broken hearts, then this function would return 6 (i.e. 12 - 1 - 2 - 3).
253
+ */
254
+ export function getPlayerAvailableHeartSlots(player) {
255
+ const maxHeartContainers = getPlayerMaxHeartContainers(player);
256
+ const effectiveMaxHearts = player.GetEffectiveMaxHearts();
257
+ const normalAndBoneHeartContainers = effectiveMaxHearts / 2;
258
+ const soulHearts = player.GetSoulHearts();
259
+ const soulHeartContainers = math.ceil(soulHearts / 2);
260
+ const totalHeartContainers = normalAndBoneHeartContainers + soulHeartContainers;
261
+ const brokenHearts = player.GetBrokenHearts();
262
+ const totalOccupiedHeartSlots = totalHeartContainers + brokenHearts;
263
+ return maxHeartContainers - totalOccupiedHeartSlots;
264
+ }
265
+ /**
266
+ * Returns the number of black hearts that the player has, excluding any soul hearts. For example,
267
+ * if the player has one full black heart, one full soul heart, and one half black heart, this
268
+ * function returns 3.
269
+ *
270
+ * This is different from the `EntityPlayer.GetBlackHearts` method, since that returns a bitmask.
271
+ */
272
+ export function getPlayerBlackHearts(player) {
273
+ const blackHeartsBitmask = player.GetBlackHearts();
274
+ const blackHeartBits = countSetBits(blackHeartsBitmask);
275
+ return blackHeartBits * 2;
276
+ }
277
+ /**
278
+ * Iterates over all players and checks if any are close enough to the specified position.
279
+ *
280
+ * @returns The first player found when iterating upwards from index 0.
281
+ */
282
+ export function getPlayerCloserThan(position, distance) {
283
+ const players = getPlayers();
284
+ return players.find((player) => player.Position.Distance(position) <= distance);
285
+ }
286
+ /**
287
+ * Helper function to return the total amount of collectibles that a player has that match the
288
+ * collectible type(s) provided.
289
+ *
290
+ * This function is variadic, meaning that you can specify N collectible types.
291
+ */
292
+ export function getPlayerCollectibleCount(player, ...collectibleTypes) {
293
+ let numCollectibles = 0;
294
+ for (const collectibleType of collectibleTypes) {
295
+ numCollectibles += player.GetCollectibleNum(collectibleType, true);
296
+ }
297
+ return numCollectibles;
298
+ }
299
+ /**
300
+ * Iterates over every item in the game and returns a map containing the number of each item that
301
+ * the player has.
302
+ */
303
+ export function getPlayerCollectibleMap(player) {
304
+ const collectibleArray = getCollectibleArray();
305
+ const collectibleMap = new Map();
306
+ for (const collectibleType of collectibleArray) {
307
+ const collectibleNum = player.GetCollectibleNum(collectibleType, true);
308
+ if (collectibleNum > 0) {
309
+ collectibleMap.set(collectibleType, collectibleNum);
310
+ }
311
+ }
312
+ return collectibleMap;
313
+ }
314
+ /** Helper function to get the player from a tear, laser, bomb, etc. */
315
+ export function getPlayerFromTear(entity) {
316
+ if (entity.Parent !== undefined) {
317
+ const player = entity.Parent.ToPlayer();
318
+ if (player !== undefined) {
319
+ return player;
320
+ }
321
+ const familiar = entity.Parent.ToFamiliar();
322
+ if (familiar !== undefined &&
323
+ familiar.Variant === FamiliarVariant.INCUBUS) {
324
+ return familiar.Player;
325
+ }
326
+ }
327
+ if (entity.SpawnerEntity !== undefined) {
328
+ const player = entity.SpawnerEntity.ToPlayer();
329
+ if (player !== undefined) {
330
+ return player;
331
+ }
332
+ const familiar = entity.SpawnerEntity.ToFamiliar();
333
+ if (familiar !== undefined &&
334
+ familiar.Variant === FamiliarVariant.INCUBUS) {
335
+ return familiar.Player;
336
+ }
337
+ }
338
+ return undefined;
339
+ }
340
+ /**
341
+ * Returns the number of red hearts that the player has, excluding any rotten hearts. For example,
342
+ * if the player has one full black heart, one full soul heart, and one half black heart, this
343
+ * function returns 3.
344
+ *
345
+ * This is different from the `EntityPlayer.GetHearts` method, since that returns a value that
346
+ * includes rotten hearts.
347
+ */
348
+ export function getPlayerHearts(player) {
349
+ const rottenHearts = player.GetRottenHearts();
350
+ const hearts = player.GetHearts();
351
+ return hearts - rottenHearts * 2;
352
+ }
353
+ /**
354
+ * Helper function that returns the type of the rightmost heart. This does not including golden
355
+ * hearts or broken hearts, since they cannot be damaged directly.
356
+ */
357
+ export function getPlayerLastHeart(player) {
358
+ const hearts = player.GetHearts();
359
+ const effectiveMaxHearts = player.GetEffectiveMaxHearts();
360
+ const soulHearts = player.GetSoulHearts();
361
+ const blackHearts = player.GetBlackHearts();
362
+ const eternalHearts = player.GetEternalHearts();
363
+ const boneHearts = player.GetBoneHearts();
364
+ const rottenHearts = player.GetRottenHearts();
365
+ const soulHeartSlots = soulHearts / 2;
366
+ const lastHeartIndex = boneHearts + soulHeartSlots - 1;
367
+ const isLastHeartBone = player.IsBoneHeart(lastHeartIndex);
368
+ if (isLastHeartBone) {
369
+ const isLastContainerEmpty = hearts <= effectiveMaxHearts - 2;
370
+ if (isLastContainerEmpty) {
371
+ return HealthType.BONE;
372
+ }
373
+ if (rottenHearts > 0) {
374
+ return HealthType.ROTTEN;
375
+ }
376
+ if (eternalHearts > 0) {
377
+ return HealthType.ETERNAL;
378
+ }
379
+ return HealthType.RED;
380
+ }
381
+ if (soulHearts > 0) {
382
+ const numBits = getNumBitsOfN(blackHearts);
383
+ const finalBit = getKBitOfN(numBits - 1, blackHearts);
384
+ const isBlack = finalBit === 1;
385
+ if (isBlack) {
386
+ return HealthType.BLACK;
387
+ }
388
+ // If it is not a black heart, it must be a soul heart.
389
+ return HealthType.SOUL;
390
+ }
391
+ if (eternalHearts > 0) {
392
+ return HealthType.ETERNAL;
393
+ }
394
+ if (rottenHearts > 0) {
395
+ return HealthType.ROTTEN;
396
+ }
397
+ return HealthType.RED;
398
+ }
399
+ /**
400
+ * Returns the maximum heart containers that the provided player can have. Normally, this is 12, but
401
+ * it can change depending on the character (e.g. Keeper) and other things (e.g. Mother's Kiss).
402
+ * This function does not account for Broken Hearts; use the `getPlayerAvailableHeartSlots` helper
403
+ * function for that.
404
+ */
405
+ export function getPlayerMaxHeartContainers(player) {
406
+ const character = player.GetPlayerType();
407
+ const characterMaxHeartContainers = getCharacterMaxHeartContainers(character);
408
+ // 1
409
+ // Magdalene can increase her maximum heart containers with Birthright.
410
+ if (character === PlayerType.MAGDALENE &&
411
+ player.HasCollectible(CollectibleType.BIRTHRIGHT)) {
412
+ const extraMaxHeartContainersFromBirthright = 6;
413
+ return characterMaxHeartContainers + extraMaxHeartContainersFromBirthright;
414
+ }
415
+ // 14, 33
416
+ // Keeper and Tainted Keeper can increase their coin containers with Mother's Kiss and Greed's
417
+ // Gullet.
418
+ if (isKeeper(player)) {
419
+ const numMothersKisses = player.GetTrinketMultiplier(TrinketType.MOTHERS_KISS);
420
+ const hasGreedsGullet = player.HasCollectible(CollectibleType.GREEDS_GULLET);
421
+ const coins = player.GetNumCoins();
422
+ const greedsGulletCoinContainers = hasGreedsGullet
423
+ ? Math.floor(coins / 25)
424
+ : 0;
425
+ return (characterMaxHeartContainers +
426
+ numMothersKisses +
427
+ greedsGulletCoinContainers);
428
+ }
429
+ return characterMaxHeartContainers;
430
+ }
431
+ /**
432
+ * Helper function to get the proper name of the player. Use this instead of the
433
+ * `EntityPlayer.GetName` method because it accounts for Blue Baby, Lazarus II, and Tainted
434
+ * characters.
435
+ */
436
+ export function getPlayerName(player) {
437
+ const character = player.GetPlayerType();
438
+ // Account for modded characters.
439
+ return isModdedPlayer(player)
440
+ ? player.GetName()
441
+ : getCharacterName(character);
442
+ }
443
+ /**
444
+ * Returns the combined value of all of the player's red hearts, soul/black hearts, and bone hearts,
445
+ * minus the value of the player's rotten hearts.
446
+ *
447
+ * This is equivalent to the number of hits that the player can currently take, but does not take
448
+ * into account double damage from champion enemies and/or being on later floors. (For example, on
449
+ * Womb 1, players who have 1 soul heart remaining would die in 1 hit to anything, even though this
450
+ * function would report that they have 2 hits remaining.)
451
+ */
452
+ export function getPlayerNumHitsRemaining(player) {
453
+ const hearts = player.GetHearts();
454
+ const soulHearts = player.GetSoulHearts();
455
+ const boneHearts = player.GetBoneHearts();
456
+ const eternalHearts = player.GetEternalHearts();
457
+ const rottenHearts = player.GetRottenHearts();
458
+ return hearts + soulHearts + boneHearts + eternalHearts - rottenHearts;
459
+ }
460
+ /**
461
+ * Returns the number of soul hearts that the player has, excluding any black hearts. For example,
462
+ * if the player has one full black heart, one full soul heart, and one half black heart, this
463
+ * function returns 2.
464
+ *
465
+ * This is different from the `EntityPlayer.GetSoulHearts` method, since that returns the combined
466
+ * number of soul hearts and black hearts.
467
+ */
468
+ export function getPlayerSoulHearts(player) {
469
+ const soulHearts = player.GetSoulHearts();
470
+ const blackHearts = getPlayerBlackHearts(player);
471
+ return soulHearts - blackHearts;
472
+ }
473
+ /**
474
+ * Helper function to get all of the players that are a certain character.
475
+ *
476
+ * This function is variadic, meaning that you can supply as many characters as you want to check
477
+ * for. Returns true if any of the characters supplied are present.
478
+ */
479
+ export function getPlayersOfType(...characters) {
480
+ const charactersSet = new Set(characters);
481
+ const players = getPlayers();
482
+ return players.filter((player) => {
483
+ const character = player.GetPlayerType();
484
+ return charactersSet.has(character);
485
+ });
486
+ }
487
+ /**
488
+ * Helper function to get only the players that have a certain collectible.
489
+ *
490
+ * This function is variadic, meaning that you can supply as many collectible types as you want to
491
+ * check for. It only returns the players that have all of the collectibles.
492
+ */
493
+ export function getPlayersWithCollectible(...collectibleTypes) {
494
+ const players = getPlayers();
495
+ return players.filter((player) => collectibleTypes.every((collectibleType) => player.HasCollectible(collectibleType)));
496
+ }
497
+ /**
498
+ * Helper function to get only the players that have a certain trinket.
499
+ *
500
+ * This function is variadic, meaning that you can supply as many trinket types as you want to check
501
+ * for. It only returns the players that have all of the trinkets.
502
+ */
503
+ export function getPlayersWithTrinket(...trinketTypes) {
504
+ const players = getPlayers();
505
+ return players.filter((player) => trinketTypes.every((trinketType) => player.HasTrinket(trinketType)));
506
+ }
507
+ /**
508
+ * Helper function to determine how many heart containers that Tainted Magdalene has that will not
509
+ * be automatically depleted over time. By default, this is 2, but this function will return 4 so
510
+ * that it is consistent with the `player.GetHearts` and `player.GetMaxHearts` methods.
511
+ *
512
+ * If Tainted Magdalene has Birthright, she will gained an additional non-temporary heart container.
513
+ *
514
+ * This function does not validate whether or not the provided player is Tainted Magdalene; that
515
+ * should be accomplished before invoking this function.
516
+ */
517
+ export function getTaintedMagdaleneNonTemporaryMaxHearts(player) {
518
+ const maxHearts = player.GetMaxHearts();
519
+ const hasBirthright = player.HasCollectible(CollectibleType.BIRTHRIGHT);
520
+ const maxNonTemporaryMaxHearts = hasBirthright ? 6 : 4;
521
+ return Math.min(maxHearts, maxNonTemporaryMaxHearts);
522
+ }
523
+ /**
524
+ * Returns the total number of collectibles amongst all players. For example, if player 1 has 1 Sad
525
+ * Onion and player 2 has 2 Sad Onions, then this function would return 3.
526
+ */
527
+ export function getTotalPlayerCollectibles(collectibleType) {
528
+ const players = getPlayers();
529
+ const numCollectiblesArray = players.map((player) => player.GetCollectibleNum(collectibleType));
530
+ return sumArray(numCollectiblesArray);
531
+ }
532
+ /** After touching a white fire, a player will turn into The Lost until they clear a room. */
533
+ export function hasLostCurse(player) {
534
+ const effects = player.GetEffects();
535
+ return effects.HasNullEffect(NullItemID.LOST_CURSE);
536
+ }
537
+ /**
538
+ * Returns whether or not the player can hold an additional active item, beyond what they are
539
+ * currently carrying. This takes the Schoolbag into account.
540
+ *
541
+ * If the player is the Tainted Soul, this always returns false, since that character cannot pick up
542
+ * items. (Only Tainted Forgotten can pick up items.)
543
+ */
544
+ export function hasOpenActiveItemSlot(player) {
545
+ if (isCharacter(player, PlayerType.THE_SOUL_B)) {
546
+ return false;
547
+ }
548
+ const activeItemPrimary = player.GetActiveItem(ActiveSlot.PRIMARY);
549
+ const activeItemSecondary = player.GetActiveItem(ActiveSlot.SECONDARY);
550
+ const hasSchoolbag = player.HasCollectible(CollectibleType.SCHOOLBAG);
551
+ if (hasSchoolbag) {
552
+ return (activeItemPrimary === CollectibleType.NULL ||
553
+ activeItemSecondary === CollectibleType.NULL);
554
+ }
555
+ return activeItemPrimary === CollectibleType.NULL;
556
+ }
557
+ export function isActiveSlotEmpty(player, activeSlot) {
558
+ const activeCollectibleType = player.GetActiveItem(activeSlot);
559
+ return activeCollectibleType === CollectibleType.NULL;
560
+ }
561
+ /**
562
+ * Helper function for detecting when a player is Bethany or Tainted Bethany. This is useful if you
563
+ * need to adjust UI elements to account for Bethany's soul charges or Tainted Bethany's blood
564
+ * charges.
565
+ */
566
+ export function isBethany(player) {
567
+ const character = player.GetPlayerType();
568
+ return character === PlayerType.BETHANY || character === PlayerType.BETHANY_B;
569
+ }
570
+ /**
571
+ * Helper function to check if a player is a specific character (i.e. `PlayerType`).
572
+ *
573
+ * This function is variadic, meaning that you can supply as many characters as you want to check
574
+ * for. Returns true if the player is any of the supplied characters.
575
+ */
576
+ export function isCharacter(player, ...characters) {
577
+ const characterSet = new Set(characters);
578
+ const character = player.GetPlayerType();
579
+ return characterSet.has(character);
580
+ }
581
+ /**
582
+ * Helper function to see if a damage source is from a player. Use this instead of comparing to the
583
+ * entity directly because it takes familiars into account.
584
+ */
585
+ export function isDamageFromPlayer(damageSource) {
586
+ const player = damageSource.ToPlayer();
587
+ if (player !== undefined) {
588
+ return true;
589
+ }
590
+ const indirectPlayer = getPlayerFromTear(damageSource);
591
+ return indirectPlayer !== undefined;
592
+ }
593
+ /**
594
+ * Helper function for detecting when a player is Eden or Tainted Eden. Useful for situations where
595
+ * you want to know if the starting stats were randomized, for example.
596
+ */
597
+ export function isEden(player) {
598
+ const character = player.GetPlayerType();
599
+ return character === PlayerType.EDEN || character === PlayerType.EDEN_B;
600
+ }
601
+ export function isFirstPlayer(player) {
602
+ return getPlayerIndexVanilla(player) === 0;
603
+ }
604
+ /**
605
+ * Helper function for detecting when a player is Jacob or Esau. This will only match the
606
+ * non-tainted versions of these characters.
607
+ */
608
+ export function isJacobOrEsau(player) {
609
+ const character = player.GetPlayerType();
610
+ return character === PlayerType.JACOB || character === PlayerType.ESAU;
611
+ }
612
+ /**
613
+ * Helper function for detecting when a player is Keeper or Tainted Keeper. Useful for situations
614
+ * where you want to know if the health is coin hearts, for example.
615
+ */
616
+ export function isKeeper(player) {
617
+ const character = player.GetPlayerType();
618
+ return character === PlayerType.KEEPER || character === PlayerType.KEEPER_B;
619
+ }
620
+ /** Helper function for detecting when a player is The Lost or Tainted Lost. */
621
+ export function isLost(player) {
622
+ const character = player.GetPlayerType();
623
+ return (character === PlayerType.THE_LOST || character === PlayerType.THE_LOST_B);
624
+ }
625
+ export function isModdedPlayer(player) {
626
+ return !isVanillaPlayer(player);
627
+ }
628
+ /** Helper function for detecting if a player is one of the Tainted characters. */
629
+ export function isTainted(player) {
630
+ const character = player.GetPlayerType();
631
+ return isVanillaPlayer(player)
632
+ ? character >= PlayerType.ISAAC_B
633
+ : isTaintedModded(player);
634
+ }
635
+ function isTaintedModded(player) {
636
+ // This algorithm only works for modded characters because the `Isaac.GetPlayerTypeByName` method
637
+ // is bugged.
638
+ // https://github.com/Meowlala/RepentanceAPIIssueTracker/issues/117
639
+ const character = player.GetPlayerType();
640
+ const name = player.GetName();
641
+ const taintedCharacter = Isaac.GetPlayerTypeByName(name, true);
642
+ return character === taintedCharacter;
643
+ }
644
+ /** Helper function for detecting when a player is Tainted Lazarus or Dead Tainted Lazarus. */
645
+ export function isTaintedLazarus(player) {
646
+ const character = player.GetPlayerType();
647
+ return (character === PlayerType.LAZARUS_B || character === PlayerType.LAZARUS_2_B);
648
+ }
649
+ export function isVanillaPlayer(player) {
650
+ const character = player.GetPlayerType();
651
+ return isVanillaCharacter(character);
652
+ }
653
+ /**
654
+ * Helper function to add one or more collectibles to a player.
655
+ *
656
+ * This function is variadic, meaning that you can supply as many collectible types as you want to
657
+ * add.
658
+ */
659
+ export function playerAddCollectible(player, ...collectibleTypes) {
660
+ for (const collectibleType of collectibleTypes) {
661
+ player.AddCollectible(collectibleType);
662
+ }
663
+ }
664
+ /**
665
+ * Helper function to check to see if a player has one or more collectibles.
666
+ *
667
+ * This function is variadic, meaning that you can supply as many collectible types as you want to
668
+ * check for. Returns true if the player has any of the supplied collectible types.
669
+ */
670
+ export function playerHasCollectible(player, ...collectibleTypes) {
671
+ return collectibleTypes.some((collectibleType) => player.HasCollectible(collectibleType));
672
+ }
673
+ /**
674
+ * Helper function to remove a collectible costume from a player. Use this helper function to avoid
675
+ * having to request the collectible from the item config.
676
+ */
677
+ export function removeCollectibleCostume(player, collectibleType) {
678
+ const itemConfigItem = itemConfig.GetCollectible(collectibleType);
679
+ if (itemConfigItem === undefined) {
680
+ return;
681
+ }
682
+ player.RemoveCostume(itemConfigItem);
683
+ }
684
+ /**
685
+ * Helper function to remove the Dead Eye multiplier from a player.
686
+ *
687
+ * Note that each time the `EntityPlayer.ClearDeadEyeCharge` method is called, it only has a chance
688
+ * of working, so this function calls it 100 times to be safe.
689
+ */
690
+ export function removeDeadEyeMultiplier(player) {
691
+ repeat(100, () => {
692
+ player.ClearDeadEyeCharge();
693
+ });
694
+ }
695
+ /**
696
+ * Helper function to remove a trinket costume from a player. Use this helper function to avoid
697
+ * having to request the trinket from the item config.
698
+ */
699
+ export function removeTrinketCostume(player, trinketType) {
700
+ const itemConfigTrinket = itemConfig.GetTrinket(trinketType);
701
+ if (itemConfigTrinket === undefined) {
702
+ return;
703
+ }
704
+ player.RemoveCostume(itemConfigTrinket);
705
+ }
706
+ /**
707
+ * Helper function to set an active collectible to a particular slot. This has different behavior
708
+ * than calling the `player.AddCollectible` method with the `activeSlot` argument, because this
709
+ * function will not shift existing items into the Schoolbag and it handles
710
+ * `ActiveSlot.SLOT_POCKET2`.
711
+ *
712
+ * Note that if an item is set to `ActiveSlot.SLOT_POCKET2`, it will disappear after being used and
713
+ * will be automatically removed upon entering a new room.
714
+ *
715
+ * @param player The player to give the item to.
716
+ * @param collectibleType The collectible type of the item to give.
717
+ * @param activeSlot The slot to set.
718
+ * @param charge Optional. The argument of charges to set. If not specified, the item will be set
719
+ * with maximum charges.
720
+ * @param keepInPools Optional. Whether or not to remove the item from pools. Default is false.
721
+ */
722
+ export function setActiveItem(player, collectibleType, activeSlot, charge, keepInPools = false) {
723
+ const itemPool = game.GetItemPool();
724
+ const primaryCollectibleType = player.GetActiveItem(ActiveSlot.PRIMARY);
725
+ const primaryCharge = player.GetActiveCharge(ActiveSlot.PRIMARY);
726
+ const secondaryCollectibleType = player.GetActiveItem(ActiveSlot.SECONDARY);
727
+ if (charge === undefined) {
728
+ charge = getCollectibleMaxCharges(collectibleType);
729
+ }
730
+ if (!keepInPools) {
731
+ itemPool.RemoveCollectible(collectibleType);
732
+ }
733
+ switch (activeSlot) {
734
+ case ActiveSlot.PRIMARY: {
735
+ // If there is a Schoolbag item, removing the primary item will shift the Schoolbag item to
736
+ // the primary slot.
737
+ if (primaryCollectibleType !== CollectibleType.NULL) {
738
+ player.RemoveCollectible(primaryCollectibleType);
739
+ }
740
+ // If there was a Schoolbag item, adding a new primary item will shift it back into the
741
+ // secondary slot.
742
+ player.AddCollectible(collectibleType, charge, false);
743
+ break;
744
+ }
745
+ case ActiveSlot.SECONDARY: {
746
+ if (primaryCollectibleType !== CollectibleType.NULL) {
747
+ player.RemoveCollectible(primaryCollectibleType);
748
+ }
749
+ if (secondaryCollectibleType !== CollectibleType.NULL) {
750
+ player.RemoveCollectible(secondaryCollectibleType);
751
+ }
752
+ // Add the new item, which will go to the primary slot.
753
+ player.AddCollectible(secondaryCollectibleType, charge, false);
754
+ // Add back the original primary item, if any.
755
+ if (primaryCollectibleType !== CollectibleType.NULL) {
756
+ player.AddCollectible(primaryCollectibleType, primaryCharge, false);
757
+ }
758
+ break;
759
+ }
760
+ case ActiveSlot.POCKET: {
761
+ player.SetPocketActiveItem(collectibleType, activeSlot, keepInPools);
762
+ player.SetActiveCharge(charge, activeSlot);
763
+ break;
764
+ }
765
+ case ActiveSlot.POCKET_SINGLE_USE: {
766
+ player.SetPocketActiveItem(collectibleType, activeSlot, keepInPools);
767
+ break;
768
+ }
769
+ }
770
+ }
771
+ /**
772
+ * Helper function to blindfold the player by using a hack with the challenge variable.
773
+ *
774
+ * The method used in this function was discovered by im_tem.
775
+ *
776
+ * @param player The player to apply or remove the blindfold state from.
777
+ * @param enabled Whether or not to apply or remove the blindfold.
778
+ * @param modifyCostume Optional. Whether to add or remove the blindfold costume. Default is true.
779
+ */
780
+ export function setBlindfold(player, enabled, modifyCostume = true) {
781
+ const character = player.GetPlayerType();
782
+ const challenge = Isaac.GetChallenge();
783
+ if (enabled) {
784
+ game.Challenge = Challenge.SOLAR_SYSTEM; // This challenge has a blindfold
785
+ player.ChangePlayerType(character);
786
+ game.Challenge = challenge;
787
+ // The costume is applied automatically.
788
+ if (!modifyCostume) {
789
+ player.TryRemoveNullCostume(NullItemID.BLINDFOLD);
790
+ }
791
+ }
792
+ else {
793
+ game.Challenge = Challenge.NULL;
794
+ player.ChangePlayerType(character);
795
+ game.Challenge = challenge;
796
+ if (modifyCostume) {
797
+ player.TryRemoveNullCostume(NullItemID.BLINDFOLD);
798
+ }
799
+ }
800
+ }
801
+ /**
802
+ * Helper function to use an active item without showing an animation, keeping the item, or adding
803
+ * any costumes.
804
+ */
805
+ export function useActiveItemTemp(player, collectibleType) {
806
+ player.UseActiveItem(collectibleType, false, false, true, false, -1);
807
+ }
808
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvcGxheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsRUFDVCxlQUFlLEVBQ2YsZUFBZSxFQUNmLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsR0FDWixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGdCQUFnQixFQUNoQixrQkFBa0IsR0FDbkIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN4QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQyxNQUFNLG9CQUFvQixHQUEyQixJQUFJLEdBQUcsQ0FBQztJQUMzRCxTQUFTLENBQUMsTUFBTTtJQUNoQixTQUFTLENBQUMsVUFBVTtJQUNw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