isaacscript-common 84.0.1 → 84.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/dist/arrays/cachedEnumValues.js +33 -0
  2. package/dist/callbackClasses.js +289 -0
  3. package/dist/callbacks.js +181 -0
  4. package/dist/classes/DefaultMap.js +171 -0
  5. package/dist/classes/ModFeature.js +244 -0
  6. package/dist/classes/ModUpgraded.js +324 -0
  7. package/dist/classes/callbacks/EntityTakeDmgFilter.js +19 -0
  8. package/dist/classes/callbacks/EntityTakeDmgPlayer.js +29 -0
  9. package/dist/classes/callbacks/InputActionFilter.js +24 -0
  10. package/dist/classes/callbacks/InputActionPlayer.js +37 -0
  11. package/dist/classes/callbacks/PostAmbushFinished.js +40 -0
  12. package/dist/classes/callbacks/PostAmbushStarted.js +40 -0
  13. package/dist/classes/callbacks/PostBombExploded.js +24 -0
  14. package/dist/classes/callbacks/PostBombInitFilter.js +21 -0
  15. package/dist/classes/callbacks/PostBombInitLate.js +31 -0
  16. package/dist/classes/callbacks/PostBombRenderFilter.js +21 -0
  17. package/dist/classes/callbacks/PostBombUpdateFilter.js +21 -0
  18. package/dist/classes/callbacks/PostBoneSwing.js +53 -0
  19. package/dist/classes/callbacks/PostCollectibleEmpty.js +50 -0
  20. package/dist/classes/callbacks/PostCursedTeleport.js +119 -0
  21. package/dist/classes/callbacks/PostCustomRevive.js +17 -0
  22. package/dist/classes/callbacks/PostDiceRoomActivated.js +50 -0
  23. package/dist/classes/callbacks/PostDoorRender.js +24 -0
  24. package/dist/classes/callbacks/PostDoorUpdate.js +24 -0
  25. package/dist/classes/callbacks/PostEffectInitFilter.js +21 -0
  26. package/dist/classes/callbacks/PostEffectInitLate.js +31 -0
  27. package/dist/classes/callbacks/PostEffectRenderFilter.js +21 -0
  28. package/dist/classes/callbacks/PostEffectStateChanged.js +34 -0
  29. package/dist/classes/callbacks/PostEffectUpdateFilter.js +21 -0
  30. package/dist/classes/callbacks/PostEntityKillFilter.js +21 -0
  31. package/dist/classes/callbacks/PostEsauJr.js +12 -0
  32. package/dist/classes/callbacks/PostFamiliarInitFilter.js +21 -0
  33. package/dist/classes/callbacks/PostFamiliarInitLate.js +31 -0
  34. package/dist/classes/callbacks/PostFamiliarRenderFilter.js +21 -0
  35. package/dist/classes/callbacks/PostFamiliarStateChanged.js +34 -0
  36. package/dist/classes/callbacks/PostFamiliarUpdateFilter.js +21 -0
  37. package/dist/classes/callbacks/PostFirstEsauJr.js +12 -0
  38. package/dist/classes/callbacks/PostFirstFlip.js +12 -0
  39. package/dist/classes/callbacks/PostFlip.js +12 -0
  40. package/dist/classes/callbacks/PostGameEndFilter.js +21 -0
  41. package/dist/classes/callbacks/PostGameStartedReordered.js +14 -0
  42. package/dist/classes/callbacks/PostGameStartedReorderedLast.js +14 -0
  43. package/dist/classes/callbacks/PostGreedModeWave.js +35 -0
  44. package/dist/classes/callbacks/PostGridEntityBroken.js +14 -0
  45. package/dist/classes/callbacks/PostGridEntityCollision.js +28 -0
  46. package/dist/classes/callbacks/PostGridEntityCustomBroken.js +14 -0
  47. package/dist/classes/callbacks/PostGridEntityCustomCollision.js +24 -0
  48. package/dist/classes/callbacks/PostGridEntityCustomInit.js +14 -0
  49. package/dist/classes/callbacks/PostGridEntityCustomRemove.js +18 -0
  50. package/dist/classes/callbacks/PostGridEntityCustomRender.js +14 -0
  51. package/dist/classes/callbacks/PostGridEntityCustomStateChanged.js +14 -0
  52. package/dist/classes/callbacks/PostGridEntityCustomUpdate.js +14 -0
  53. package/dist/classes/callbacks/PostGridEntityInit.js +14 -0
  54. package/dist/classes/callbacks/PostGridEntityRemove.js +19 -0
  55. package/dist/classes/callbacks/PostGridEntityRender.js +14 -0
  56. package/dist/classes/callbacks/PostGridEntityStateChanged.js +14 -0
  57. package/dist/classes/callbacks/PostGridEntityUpdate.js +14 -0
  58. package/dist/classes/callbacks/PostHolyMantleRemoved.js +43 -0
  59. package/dist/classes/callbacks/PostItemDischarge.js +122 -0
  60. package/dist/classes/callbacks/PostItemPickup.js +14 -0
  61. package/dist/classes/callbacks/PostKeyboardChanged.js +46 -0
  62. package/dist/classes/callbacks/PostKnifeInitFilter.js +21 -0
  63. package/dist/classes/callbacks/PostKnifeInitLate.js +31 -0
  64. package/dist/classes/callbacks/PostKnifeRenderFilter.js +21 -0
  65. package/dist/classes/callbacks/PostKnifeUpdateFilter.js +21 -0
  66. package/dist/classes/callbacks/PostLaserInitFilter.js +21 -0
  67. package/dist/classes/callbacks/PostLaserInitLate.js +31 -0
  68. package/dist/classes/callbacks/PostLaserRenderFilter.js +21 -0
  69. package/dist/classes/callbacks/PostLaserUpdateFilter.js +21 -0
  70. package/dist/classes/callbacks/PostNPCDeathFilter.js +21 -0
  71. package/dist/classes/callbacks/PostNPCInitFilter.js +21 -0
  72. package/dist/classes/callbacks/PostNPCInitLate.js +31 -0
  73. package/dist/classes/callbacks/PostNPCRenderFilter.js +21 -0
  74. package/dist/classes/callbacks/PostNPCStateChanged.js +34 -0
  75. package/dist/classes/callbacks/PostNPCUpdateFilter.js +21 -0
  76. package/dist/classes/callbacks/PostNewLevelReordered.js +14 -0
  77. package/dist/classes/callbacks/PostNewRoomEarly.js +74 -0
  78. package/dist/classes/callbacks/PostNewRoomReordered.js +14 -0
  79. package/dist/classes/callbacks/PostPEffectUpdateReordered.js +14 -0
  80. package/dist/classes/callbacks/PostPickupChanged.js +14 -0
  81. package/dist/classes/callbacks/PostPickupCollect.js +38 -0
  82. package/dist/classes/callbacks/PostPickupInitFilter.js +21 -0
  83. package/dist/classes/callbacks/PostPickupInitFirst.js +33 -0
  84. package/dist/classes/callbacks/PostPickupInitLate.js +31 -0
  85. package/dist/classes/callbacks/PostPickupRenderFilter.js +21 -0
  86. package/dist/classes/callbacks/PostPickupSelectionFilter.js +29 -0
  87. package/dist/classes/callbacks/PostPickupStateChanged.js +34 -0
  88. package/dist/classes/callbacks/PostPickupUpdateFilter.js +21 -0
  89. package/dist/classes/callbacks/PostPitRender.js +24 -0
  90. package/dist/classes/callbacks/PostPitUpdate.js +24 -0
  91. package/dist/classes/callbacks/PostPlayerChangeHealth.js +47 -0
  92. package/dist/classes/callbacks/PostPlayerChangeStat.js +79 -0
  93. package/dist/classes/callbacks/PostPlayerChangeType.js +36 -0
  94. package/dist/classes/callbacks/PostPlayerCollectibleAdded.js +14 -0
  95. package/dist/classes/callbacks/PostPlayerCollectibleRemoved.js +14 -0
  96. package/dist/classes/callbacks/PostPlayerFatalDamage.js +83 -0
  97. package/dist/classes/callbacks/PostPlayerInitFirst.js +41 -0
  98. package/dist/classes/callbacks/PostPlayerInitLate.js +33 -0
  99. package/dist/classes/callbacks/PostPlayerRenderReordered.js +14 -0
  100. package/dist/classes/callbacks/PostPlayerUpdateReordered.js +14 -0
  101. package/dist/classes/callbacks/PostPoopRender.js +24 -0
  102. package/dist/classes/callbacks/PostPoopUpdate.js +24 -0
  103. package/dist/classes/callbacks/PostPressurePlateRender.js +24 -0
  104. package/dist/classes/callbacks/PostPressurePlateUpdate.js +24 -0
  105. package/dist/classes/callbacks/PostProjectileInitFilter.js +21 -0
  106. package/dist/classes/callbacks/PostProjectileInitLate.js +31 -0
  107. package/dist/classes/callbacks/PostProjectileKill.js +52 -0
  108. package/dist/classes/callbacks/PostProjectileRenderFilter.js +21 -0
  109. package/dist/classes/callbacks/PostProjectileUpdateFilter.js +21 -0
  110. package/dist/classes/callbacks/PostPurchase.js +90 -0
  111. package/dist/classes/callbacks/PostRockRender.js +24 -0
  112. package/dist/classes/callbacks/PostRockUpdate.js +24 -0
  113. package/dist/classes/callbacks/PostRoomClearChanged.js +46 -0
  114. package/dist/classes/callbacks/PostSacrifice.js +36 -0
  115. package/dist/classes/callbacks/PostSlotAnimationChanged.js +14 -0
  116. package/dist/classes/callbacks/PostSlotCollision.js +25 -0
  117. package/dist/classes/callbacks/PostSlotDestroyed.js +14 -0
  118. package/dist/classes/callbacks/PostSlotInit.js +14 -0
  119. package/dist/classes/callbacks/PostSlotRender.js +14 -0
  120. package/dist/classes/callbacks/PostSlotUpdate.js +14 -0
  121. package/dist/classes/callbacks/PostSpikesRender.js +24 -0
  122. package/dist/classes/callbacks/PostSpikesUpdate.js +24 -0
  123. package/dist/classes/callbacks/PostTNTRender.js +24 -0
  124. package/dist/classes/callbacks/PostTNTUpdate.js +24 -0
  125. package/dist/classes/callbacks/PostTearInitFilter.js +21 -0
  126. package/dist/classes/callbacks/PostTearInitLate.js +31 -0
  127. package/dist/classes/callbacks/PostTearInitVeryLate.js +35 -0
  128. package/dist/classes/callbacks/PostTearKill.js +52 -0
  129. package/dist/classes/callbacks/PostTearRenderFilter.js +21 -0
  130. package/dist/classes/callbacks/PostTearUpdateFilter.js +21 -0
  131. package/dist/classes/callbacks/PostTransformation.js +47 -0
  132. package/dist/classes/callbacks/PostTrinketBreak.js +70 -0
  133. package/dist/classes/callbacks/PostUsePillFilter.js +76 -0
  134. package/dist/classes/callbacks/PreBerserkDeath.js +41 -0
  135. package/dist/classes/callbacks/PreBombCollisionFilter.js +19 -0
  136. package/dist/classes/callbacks/PreCustomRevive.js +14 -0
  137. package/dist/classes/callbacks/PreEntitySpawnFilter.js +24 -0
  138. package/dist/classes/callbacks/PreFamiliarCollisionFilter.js +19 -0
  139. package/dist/classes/callbacks/PreGetPedestal.js +46 -0
  140. package/dist/classes/callbacks/PreItemPickup.js +14 -0
  141. package/dist/classes/callbacks/PreKnifeCollisionFilter.js +19 -0
  142. package/dist/classes/callbacks/PreNPCCollisionFilter.js +19 -0
  143. package/dist/classes/callbacks/PreNPCUpdateFilter.js +19 -0
  144. package/dist/classes/callbacks/PreNewLevel.js +51 -0
  145. package/dist/classes/callbacks/PreProjectileCollisionFilter.js +19 -0
  146. package/dist/classes/callbacks/PreRoomEntitySpawnFilter.js +26 -0
  147. package/dist/classes/callbacks/PreTearCollisionFilter.js +19 -0
  148. package/dist/classes/features/callbackLogic/CustomGridEntities.js +359 -0
  149. package/dist/classes/features/callbackLogic/CustomRevive.js +170 -0
  150. package/dist/classes/features/callbackLogic/EsauJrDetection.js +70 -0
  151. package/dist/classes/features/callbackLogic/FlipDetection.js +61 -0
  152. package/dist/classes/features/callbackLogic/GameReorderedCallbacks.js +220 -0
  153. package/dist/classes/features/callbackLogic/GridEntityCollisionDetection.js +62 -0
  154. package/dist/classes/features/callbackLogic/GridEntityRenderDetection.js +35 -0
  155. package/dist/classes/features/callbackLogic/GridEntityUpdateDetection.js +147 -0
  156. package/dist/classes/features/callbackLogic/ItemPickupDetection.js +68 -0
  157. package/dist/classes/features/callbackLogic/PickupChangeDetection.js +43 -0
  158. package/dist/classes/features/callbackLogic/PlayerCollectibleDetection.js +193 -0
  159. package/dist/classes/features/callbackLogic/PlayerReorderedCallbacks.js +109 -0
  160. package/dist/classes/features/callbackLogic/SlotDestroyedDetection.js +95 -0
  161. package/dist/classes/features/callbackLogic/SlotRenderDetection.js +48 -0
  162. package/dist/classes/features/callbackLogic/SlotUpdateDetection.js +52 -0
  163. package/dist/classes/features/other/CharacterHealthConversion.js +112 -0
  164. package/dist/classes/features/other/CharacterStats.js +68 -0
  165. package/dist/classes/features/other/CollectibleItemPoolType.js +75 -0
  166. package/dist/classes/features/other/CustomHotkeys.js +144 -0
  167. package/dist/classes/features/other/CustomItemPools.js +128 -0
  168. package/dist/classes/features/other/CustomPickups.js +118 -0
  169. package/dist/classes/features/other/CustomStages.js +471 -0
  170. package/dist/classes/features/other/CustomTrapdoors.js +596 -0
  171. package/dist/classes/features/other/DebugDisplay.js +699 -0
  172. package/dist/classes/features/other/DeployJSONRoom.js +301 -0
  173. package/dist/classes/features/other/DisableAllSound.js +90 -0
  174. package/dist/classes/features/other/DisableInputs.js +249 -0
  175. package/dist/classes/features/other/EdenStartingStatsHealth.js +197 -0
  176. package/dist/classes/features/other/ExtraConsoleCommands.js +292 -0
  177. package/dist/classes/features/other/FadeInRemover.js +67 -0
  178. package/dist/classes/features/other/FastReset.js +88 -0
  179. package/dist/classes/features/other/FlyingDetection.js +64 -0
  180. package/dist/classes/features/other/ForgottenSwitch.js +43 -0
  181. package/dist/classes/features/other/ItemPoolDetection.js +187 -0
  182. package/dist/classes/features/other/ModdedElementDetection.js +399 -0
  183. package/dist/classes/features/other/ModdedElementSets.js +1251 -0
  184. package/dist/classes/features/other/NoSirenSteal.js +88 -0
  185. package/dist/classes/features/other/Pause.js +197 -0
  186. package/dist/classes/features/other/PersistentEntities.js +168 -0
  187. package/dist/classes/features/other/PickupIndexCreation.js +229 -0
  188. package/dist/classes/features/other/PlayerCollectibleTracking.js +102 -0
  189. package/dist/classes/features/other/PonyDetection.js +86 -0
  190. package/dist/classes/features/other/PressInput.js +71 -0
  191. package/dist/classes/features/other/PreventChildEntities.js +60 -0
  192. package/dist/classes/features/other/PreventGridEntityRespawn.js +159 -0
  193. package/dist/classes/features/other/RerunDetection.js +69 -0
  194. package/dist/classes/features/other/RoomClearFrame.js +94 -0
  195. package/dist/classes/features/other/RoomHistory.js +196 -0
  196. package/dist/classes/features/other/RunInNFrames.js +323 -0
  197. package/dist/classes/features/other/RunNextRoom.js +53 -0
  198. package/dist/classes/features/other/RunNextRun.js +60 -0
  199. package/dist/classes/features/other/SaveDataManager.js +383 -0
  200. package/dist/classes/features/other/SpawnRockAltRewards.js +469 -0
  201. package/dist/classes/features/other/StageHistory.js +244 -0
  202. package/dist/classes/features/other/StartAmbush.js +62 -0
  203. package/dist/classes/features/other/TaintedLazarusPlayers.js +115 -0
  204. package/dist/classes/features/other/UnlockAchievementsDetection.js +60 -0
  205. package/dist/classes/features/other/customStages/backdrop.js +195 -0
  206. package/dist/classes/features/other/customStages/constants.js +19 -0
  207. package/dist/classes/features/other/customStages/gridEntities.js +177 -0
  208. package/dist/classes/features/other/customStages/shadows.js +67 -0
  209. package/dist/classes/features/other/customStages/streakText.js +222 -0
  210. package/dist/classes/features/other/customStages/utils.js +65 -0
  211. package/dist/classes/features/other/customStages/v.js +27 -0
  212. package/dist/classes/features/other/customStages/versusScreen.js +227 -0
  213. package/dist/classes/features/other/debugDisplay/DebugDisplayBomb.js +23 -0
  214. package/dist/classes/features/other/debugDisplay/DebugDisplayDoor.js +22 -0
  215. package/dist/classes/features/other/debugDisplay/DebugDisplayEffect.js +23 -0
  216. package/dist/classes/features/other/debugDisplay/DebugDisplayFamiliar.js +23 -0
  217. package/dist/classes/features/other/debugDisplay/DebugDisplayKnife.js +23 -0
  218. package/dist/classes/features/other/debugDisplay/DebugDisplayLaser.js +23 -0
  219. package/dist/classes/features/other/debugDisplay/DebugDisplayNPC.js +23 -0
  220. package/dist/classes/features/other/debugDisplay/DebugDisplayPickup.js +23 -0
  221. package/dist/classes/features/other/debugDisplay/DebugDisplayPit.js +22 -0
  222. package/dist/classes/features/other/debugDisplay/DebugDisplayPlayer.js +25 -0
  223. package/dist/classes/features/other/debugDisplay/DebugDisplayPoop.js +22 -0
  224. package/dist/classes/features/other/debugDisplay/DebugDisplayPressurePlate.js +25 -0
  225. package/dist/classes/features/other/debugDisplay/DebugDisplayProjectile.js +23 -0
  226. package/dist/classes/features/other/debugDisplay/DebugDisplayRock.js +22 -0
  227. package/dist/classes/features/other/debugDisplay/DebugDisplaySlot.js +22 -0
  228. package/dist/classes/features/other/debugDisplay/DebugDisplaySpikes.js +22 -0
  229. package/dist/classes/features/other/debugDisplay/DebugDisplayTNT.js +22 -0
  230. package/dist/classes/features/other/debugDisplay/DebugDisplayTear.js +23 -0
  231. package/dist/classes/features/other/debugDisplay/utils.js +13 -0
  232. package/dist/classes/features/other/extraConsoleCommands/commands.js +1598 -0
  233. package/dist/classes/features/other/extraConsoleCommands/subroutines.js +135 -0
  234. package/dist/classes/features/other/extraConsoleCommands/v.js +30 -0
  235. package/dist/classes/features/other/saveDataManager/constants.js +4 -0
  236. package/dist/classes/features/other/saveDataManager/glowingHourGlass.js +106 -0
  237. package/dist/classes/features/other/saveDataManager/loadFromDisk.js +69 -0
  238. package/dist/classes/features/other/saveDataManager/restoreDefaults.js +69 -0
  239. package/dist/classes/features/other/saveDataManager/saveToDisk.js +46 -0
  240. package/dist/classes/private/CustomCallback.js +59 -0
  241. package/dist/classes/private/Feature.js +39 -0
  242. package/dist/core/cachedClasses.js +61 -0
  243. package/dist/core/constants.js +289 -0
  244. package/dist/core/constantsFirstLast.js +98 -0
  245. package/dist/core/constantsVanilla.js +131 -0
  246. package/dist/core/upgradeMod.js +71 -0
  247. package/dist/customStageMetadata.json +1 -0
  248. package/dist/data/itempools.json +16625 -0
  249. package/dist/decorators.js +21 -0
  250. package/dist/enums/AmbushType.js +9 -0
  251. package/dist/enums/CornerType.js +11 -0
  252. package/dist/enums/HealthType.js +20 -0
  253. package/dist/enums/ISCFeature.js +65 -0
  254. package/dist/enums/LadderSubTypeCustom.js +20 -0
  255. package/dist/enums/ModCallbackCustom.js +2477 -0
  256. package/dist/enums/MysteriousPaperEffect.js +16 -0
  257. package/dist/enums/PlayerStat.js +37 -0
  258. package/dist/enums/PocketItemType.js +13 -0
  259. package/dist/enums/RockAltType.js +23 -0
  260. package/dist/enums/SaveDataKey.js +14 -0
  261. package/dist/enums/SerializationType.js +10 -0
  262. package/dist/enums/SlotDestructionType.js +22 -0
  263. package/dist/enums/private/GridEntityTypeCustom.js +10 -0
  264. package/dist/enums/private/SerializationBrand.js +42 -0
  265. package/dist/enums/private/StageTravelState.js +13 -0
  266. package/dist/enums/private/TrapdoorAnimation.js +9 -0
  267. package/dist/enums/private/UIStreakAnimation.js +10 -0
  268. package/dist/features.js +150 -0
  269. package/dist/functions/ambush.js +26 -0
  270. package/dist/functions/array.js +586 -0
  271. package/dist/functions/arrayLua.js +81 -0
  272. package/dist/functions/benchmark.js +36 -0
  273. package/dist/functions/bitSet128.js +64 -0
  274. package/dist/functions/bitwise.js +82 -0
  275. package/dist/functions/bombs.js +14 -0
  276. package/dist/functions/bosses.js +238 -0
  277. package/dist/functions/cards.js +164 -0
  278. package/dist/functions/challenges.js +117 -0
  279. package/dist/functions/characters.js +182 -0
  280. package/dist/functions/charge.js +251 -0
  281. package/dist/functions/chargeBar.js +54 -0
  282. package/dist/functions/collectibleTag.js +24 -0
  283. package/dist/functions/collectibles.js +581 -0
  284. package/dist/functions/color.js +88 -0
  285. package/dist/functions/console.js +18 -0
  286. package/dist/functions/curses.js +37 -0
  287. package/dist/functions/debugFunctions.js +108 -0
  288. package/dist/functions/decorators.js +113 -0
  289. package/dist/functions/deepCopy.js +406 -0
  290. package/dist/functions/deepCopyTests.js +361 -0
  291. package/dist/functions/dimensions.js +30 -0
  292. package/dist/functions/direction.js +78 -0
  293. package/dist/functions/doors.js +524 -0
  294. package/dist/functions/easing.js +327 -0
  295. package/dist/functions/effects.js +14 -0
  296. package/dist/functions/emptyRoom.js +79 -0
  297. package/dist/functions/entities.js +529 -0
  298. package/dist/functions/entitiesSpecific.js +582 -0
  299. package/dist/functions/entityTypes.js +9 -0
  300. package/dist/functions/enums.js +244 -0
  301. package/dist/functions/external.js +59 -0
  302. package/dist/functions/familiars.js +136 -0
  303. package/dist/functions/flag.js +146 -0
  304. package/dist/functions/frames.js +166 -0
  305. package/dist/functions/globals.js +291 -0
  306. package/dist/functions/gridEntities.js +990 -0
  307. package/dist/functions/gridEntitiesSpecific.js +456 -0
  308. package/dist/functions/gridIndex.js +35 -0
  309. package/dist/functions/hash.js +75 -0
  310. package/dist/functions/hex.js +57 -0
  311. package/dist/functions/input.js +185 -0
  312. package/dist/functions/isaacAPIClass.js +157 -0
  313. package/dist/functions/itemPool.js +118 -0
  314. package/dist/functions/jsonHelpers.js +73 -0
  315. package/dist/functions/jsonRoom.js +184 -0
  316. package/dist/functions/kColor.js +89 -0
  317. package/dist/functions/language.js +16 -0
  318. package/dist/functions/level.js +66 -0
  319. package/dist/functions/levelGrid.js +497 -0
  320. package/dist/functions/log.js +86 -0
  321. package/dist/functions/logEntities.js +308 -0
  322. package/dist/functions/logMisc.js +510 -0
  323. package/dist/functions/map.js +121 -0
  324. package/dist/functions/math.js +149 -0
  325. package/dist/functions/merge.js +159 -0
  326. package/dist/functions/mergeTests.js +313 -0
  327. package/dist/functions/minimap.js +204 -0
  328. package/dist/functions/modFeatures.js +39 -0
  329. package/dist/functions/newArray.js +30 -0
  330. package/dist/functions/nextStage.js +169 -0
  331. package/dist/functions/npcDataStructures.js +146 -0
  332. package/dist/functions/npcs.js +132 -0
  333. package/dist/functions/pickupVariants.js +63 -0
  334. package/dist/functions/pickups.js +168 -0
  335. package/dist/functions/pickupsSpecific.js +376 -0
  336. package/dist/functions/pills.js +200 -0
  337. package/dist/functions/playerCenter.js +53 -0
  338. package/dist/functions/playerCollectibles.js +300 -0
  339. package/dist/functions/playerDataStructures.js +145 -0
  340. package/dist/functions/playerEffects.js +63 -0
  341. package/dist/functions/playerHealth.js +604 -0
  342. package/dist/functions/playerIndex.js +186 -0
  343. package/dist/functions/playerTrinkets.js +149 -0
  344. package/dist/functions/players.js +471 -0
  345. package/dist/functions/pocketItems.js +165 -0
  346. package/dist/functions/positionVelocity.js +158 -0
  347. package/dist/functions/pressurePlate.js +26 -0
  348. package/dist/functions/projectiles.js +57 -0
  349. package/dist/functions/random.js +90 -0
  350. package/dist/functions/readOnly.js +33 -0
  351. package/dist/functions/render.js +36 -0
  352. package/dist/functions/revive.js +151 -0
  353. package/dist/functions/rng.js +140 -0
  354. package/dist/functions/rockAlt.js +50 -0
  355. package/dist/functions/roomData.js +155 -0
  356. package/dist/functions/roomGrid.js +97 -0
  357. package/dist/functions/roomShape.js +143 -0
  358. package/dist/functions/roomShapeWalls.js +187 -0
  359. package/dist/functions/roomTransition.js +43 -0
  360. package/dist/functions/rooms.js +782 -0
  361. package/dist/functions/run.js +121 -0
  362. package/dist/functions/seeds.js +22 -0
  363. package/dist/functions/serialization.js +98 -0
  364. package/dist/functions/set.js +215 -0
  365. package/dist/functions/slots.js +41 -0
  366. package/dist/functions/sort.js +158 -0
  367. package/dist/functions/sound.js +45 -0
  368. package/dist/functions/spawnCollectible.js +112 -0
  369. package/dist/functions/sprites.js +130 -0
  370. package/dist/functions/stage.js +540 -0
  371. package/dist/functions/stats.js +104 -0
  372. package/dist/functions/storyBosses.js +63 -0
  373. package/dist/functions/string.js +194 -0
  374. package/dist/functions/table.js +162 -0
  375. package/dist/functions/tears.js +128 -0
  376. package/dist/functions/transformations.js +89 -0
  377. package/dist/functions/trinketGive.js +145 -0
  378. package/dist/functions/trinkets.js +213 -0
  379. package/dist/functions/tstlClass.js +97 -0
  380. package/dist/functions/types.js +225 -0
  381. package/dist/functions/ui.js +148 -0
  382. package/dist/functions/utils.d.ts +2 -0
  383. package/dist/functions/utils.d.ts.map +1 -1
  384. package/dist/functions/utils.js +195 -0
  385. package/dist/functions/utils.lua +4 -1
  386. package/dist/functions/vector.js +150 -0
  387. package/dist/functions/versusScreen.js +58 -0
  388. package/dist/functions/weighted.js +57 -0
  389. package/dist/index.js +219 -0
  390. package/dist/index.rollup.d.ts +2 -0
  391. package/dist/indexLua.js +220 -0
  392. package/dist/interfaces/ChargeBarSprites.js +2 -0
  393. package/dist/interfaces/Corner.js +2 -0
  394. package/dist/interfaces/CustomStageTSConfig.js +2 -0
  395. package/dist/interfaces/GridEntityCustomData.js +2 -0
  396. package/dist/interfaces/JSONRoomsFile.js +2 -0
  397. package/dist/interfaces/PlayerHealth.js +2 -0
  398. package/dist/interfaces/PlayerStats.js +4 -0
  399. package/dist/interfaces/PocketItemDescription.js +2 -0
  400. package/dist/interfaces/RoomDescription.js +2 -0
  401. package/dist/interfaces/SaveData.js +98 -0
  402. package/dist/interfaces/StageHistoryEntry.js +2 -0
  403. package/dist/interfaces/TSTLClassMetatable.js +2 -0
  404. package/dist/interfaces/TrinketSituation.js +2 -0
  405. package/dist/interfaces/private/AddCallbackParametersCustom.js +4 -0
  406. package/dist/interfaces/private/CustomStage.js +2 -0
  407. package/dist/interfaces/private/CustomTrapdoorDescription.js +2 -0
  408. package/dist/interfaces/private/ModUpgradedInterface.js +2 -0
  409. package/dist/isaacscript-common.lua +5 -2
  410. package/dist/maps/PHDPillConversionsMap.js +23 -0
  411. package/dist/maps/cardNameToTypeMap.js +211 -0
  412. package/dist/maps/characterNameToTypeMap.js +91 -0
  413. package/dist/maps/collectibleNameToTypeMap.js +19 -0
  414. package/dist/maps/defaultPlayerStatMap.js +17 -0
  415. package/dist/maps/entityTypeVariantToBossIDMap.js +11 -0
  416. package/dist/maps/falsePHDPillConversionsMap.js +37 -0
  417. package/dist/maps/gridEntityTypeToBrokenStateMap.js +32 -0
  418. package/dist/maps/gridEntityXMLMap.js +133 -0
  419. package/dist/maps/itemPoolTypeToItemPoolName.js +38 -0
  420. package/dist/maps/keyboardToStringMap.js +71 -0
  421. package/dist/maps/pillNameToEffectMap.js +91 -0
  422. package/dist/maps/roomNameToTypeMap.js +43 -0
  423. package/dist/maps/roomShapeToTopLeftWallGridIndexMap.js +17 -0
  424. package/dist/maps/transformationNameToPlayerFormMap.js +35 -0
  425. package/dist/maps/trinketNameToTypeMap.js +19 -0
  426. package/dist/objects/LRoomShapeToRectangles.js +43 -0
  427. package/dist/objects/backdropTypeToRockAltType.js +68 -0
  428. package/dist/objects/batteryNames.js +13 -0
  429. package/dist/objects/bombNames.js +17 -0
  430. package/dist/objects/bossIDToEntityTypeVariant.js +228 -0
  431. package/dist/objects/bossNamePNGFileNames.js +120 -0
  432. package/dist/objects/bossNames.js +119 -0
  433. package/dist/objects/bossPortraitPNGFileNames.js +123 -0
  434. package/dist/objects/cardDescriptions.js +106 -0
  435. package/dist/objects/cardNames.js +106 -0
  436. package/dist/objects/challengeBosses.js +60 -0
  437. package/dist/objects/challengeCharacters.js +58 -0
  438. package/dist/objects/challengeCollectibleTypes.js +255 -0
  439. package/dist/objects/challengeNames.js +54 -0
  440. package/dist/objects/challengeTrinketType.js +58 -0
  441. package/dist/objects/characterDamageMultipliers.js +49 -0
  442. package/dist/objects/characterNames.js +48 -0
  443. package/dist/objects/characterSpritePNGFileNames.js +50 -0
  444. package/dist/objects/characterStartingCollectibleTypes.js +105 -0
  445. package/dist/objects/characterStartingTrinketTypes.js +90 -0
  446. package/dist/objects/chestNames.js +20 -0
  447. package/dist/objects/coinNames.js +16 -0
  448. package/dist/objects/coinSubTypeToValue.js +15 -0
  449. package/dist/objects/collectibleDescriptions.js +742 -0
  450. package/dist/objects/collectibleNames.js +745 -0
  451. package/dist/objects/colors.js +26 -0
  452. package/dist/objects/directionNames.js +11 -0
  453. package/dist/objects/directionToDegrees.js +11 -0
  454. package/dist/objects/directionToMoveAction.js +11 -0
  455. package/dist/objects/directionToShootAction.js +11 -0
  456. package/dist/objects/directionToVector.js +13 -0
  457. package/dist/objects/doorSlotFlagToDoorSlot.js +15 -0
  458. package/dist/objects/doorSlotToDirection.js +15 -0
  459. package/dist/objects/doorSlotToDoorSlotFlag.js +15 -0
  460. package/dist/objects/gridEntityTypeToANM2Name.js +37 -0
  461. package/dist/objects/heartNames.js +21 -0
  462. package/dist/objects/isaacAPIClassTypeToBrand.js +12 -0
  463. package/dist/objects/isaacAPIClassTypeToFunctions.js +46 -0
  464. package/dist/objects/itemPoolTypeToCollectibleTypesSet.js +57 -0
  465. package/dist/objects/kColors.js +27 -0
  466. package/dist/objects/keyNames.js +13 -0
  467. package/dist/objects/languageNames.js +13 -0
  468. package/dist/objects/oppositeDoorSlots.js +15 -0
  469. package/dist/objects/pillEffectClasses.js +57 -0
  470. package/dist/objects/pillEffectNames.js +57 -0
  471. package/dist/objects/pillEffectTypeToPillEffects.js +23 -0
  472. package/dist/objects/pillEffectTypes.js +57 -0
  473. package/dist/objects/playerNamePNGFileNames.js +57 -0
  474. package/dist/objects/playerPortraitPNGFileNames.js +54 -0
  475. package/dist/objects/roomShapeBounds.js +48 -0
  476. package/dist/objects/roomShapeCorners.js +330 -0
  477. package/dist/objects/roomShapeLayoutSizes.js +41 -0
  478. package/dist/objects/roomShapeToBottomRightPosition.js +25 -0
  479. package/dist/objects/roomShapeToDoorSlotCoordinates.js +111 -0
  480. package/dist/objects/roomShapeToDoorSlots.js +72 -0
  481. package/dist/objects/roomShapeToDoorSlotsToGridIndexDelta.js +118 -0
  482. package/dist/objects/roomShapeToGridWidth.js +20 -0
  483. package/dist/objects/roomShapeToTopLeftPosition.js +26 -0
  484. package/dist/objects/roomShapeVolumes.js +32 -0
  485. package/dist/objects/roomTypeNames.js +35 -0
  486. package/dist/objects/roomTypeSpecialGotoPrefixes.js +35 -0
  487. package/dist/objects/sackNames.js +11 -0
  488. package/dist/objects/slotNames.js +26 -0
  489. package/dist/objects/stageIDNames.js +43 -0
  490. package/dist/objects/stageToMusic.js +91 -0
  491. package/dist/objects/stageToStageID.js +117 -0
  492. package/dist/objects/stageTypeSuffixes.js +14 -0
  493. package/dist/objects/transformationNames.js +20 -0
  494. package/dist/objects/trinketDescriptions.js +199 -0
  495. package/dist/objects/trinketNames.js +202 -0
  496. package/dist/objects/versusScreenBackgroundColors.js +46 -0
  497. package/dist/objects/versusScreenDirtSpotColors.js +46 -0
  498. package/dist/patchErrorFunctions.js +65 -0
  499. package/dist/serialization.js +21 -0
  500. package/dist/sets/LRoomShapesSet.js +11 -0
  501. package/dist/sets/bigRoomShapesSet.js +14 -0
  502. package/dist/sets/bossSets.js +465 -0
  503. package/dist/sets/charactersThatStartWithAnActiveItemSet.js +18 -0
  504. package/dist/sets/charactersWithBlackHeartFromEternalHeartSet.js +9 -0
  505. package/dist/sets/charactersWithFreeDevilDealsSet.js +6 -0
  506. package/dist/sets/charactersWithNoRedHeartsSet.js +19 -0
  507. package/dist/sets/charactersWithNoSoulHeartsSet.js +16 -0
  508. package/dist/sets/consoleCommandsSet.js +64 -0
  509. package/dist/sets/entitiesWithArmorSet.js +59 -0
  510. package/dist/sets/familiarsThatShootPlayerTearsSet.js +15 -0
  511. package/dist/sets/itemConfigCardTypesForCards.js +14 -0
  512. package/dist/sets/lostStyleCharactersSet.js +16 -0
  513. package/dist/sets/mineShaftRoomSubTypesSet.js +12 -0
  514. package/dist/sets/narrowRoomShapesSet.js +11 -0
  515. package/dist/sets/poopGridEntityXMLTypesSet.js +16 -0
  516. package/dist/sets/redHeartSubTypesSet.js +10 -0
  517. package/dist/sets/repentanceBossIDsSet.js +30 -0
  518. package/dist/sets/sinEntityTypesSet.js +14 -0
  519. package/dist/sets/singleUseActiveCollectibleTypesSet.js +15 -0
  520. package/dist/shaderCrashFix.js +24 -0
  521. package/dist/shouldFire.js +226 -0
  522. package/dist/types/AddSubtract.js +2 -0
  523. package/dist/types/AllButFirst.js +2 -0
  524. package/dist/types/AllButLast.js +2 -0
  525. package/dist/types/AnyClass.js +2 -0
  526. package/dist/types/AnyEntity.js +2 -0
  527. package/dist/types/AnyFunction.js +2 -0
  528. package/dist/types/AnyGridEntity.js +2 -0
  529. package/dist/types/CompositionTypeSatisfiesEnum.js +11 -0
  530. package/dist/types/ConversionHeartSubType.js +2 -0
  531. package/dist/types/Decrement.js +2 -0
  532. package/dist/types/ERange.js +2 -0
  533. package/dist/types/EntityID.js +2 -0
  534. package/dist/types/FunctionTuple.js +2 -0
  535. package/dist/types/GridEntityID.js +2 -0
  536. package/dist/types/HasFunction.js +2 -0
  537. package/dist/types/IRange.js +2 -0
  538. package/dist/types/Immutable.js +2 -0
  539. package/dist/types/Increment.js +2 -0
  540. package/dist/types/LowercaseKeys.js +2 -0
  541. package/dist/types/NaturalNumbersLessThan.js +2 -0
  542. package/dist/types/NaturalNumbersLessThanOrEqualTo.js +2 -0
  543. package/dist/types/PickingUpItem.js +44 -0
  544. package/dist/types/PickupIndex.js +2 -0
  545. package/dist/types/PlayerIndex.js +2 -0
  546. package/dist/types/PossibleStatType.js +2 -0
  547. package/dist/types/PublicInterface.js +2 -0
  548. package/dist/types/ReadonlyMap.js +6 -0
  549. package/dist/types/ReadonlyRecord.js +2 -0
  550. package/dist/types/ReadonlySet.js +6 -0
  551. package/dist/types/StartsWithLowercase.js +2 -0
  552. package/dist/types/StartsWithUppercase.js +2 -0
  553. package/dist/types/TSTLClass.js +2 -0
  554. package/dist/types/Tuple.js +2 -0
  555. package/dist/types/TupleKeys.js +2 -0
  556. package/dist/types/TupleToIntersection.js +2 -0
  557. package/dist/types/TupleToUnion.js +2 -0
  558. package/dist/types/TupleWithLengthBetween.js +22 -0
  559. package/dist/types/TupleWithMaxLength.js +27 -0
  560. package/dist/types/UnionToIntersection.js +2 -0
  561. package/dist/types/UppercaseKeys.js +2 -0
  562. package/dist/types/WeightedArray.js +2 -0
  563. package/dist/types/WidenLiteral.js +2 -0
  564. package/dist/types/Writable.js +2 -0
  565. package/dist/types/private/CallbackTuple.js +2 -0
  566. package/dist/types/private/ModUpgradedWithFeatures.js +2 -0
  567. package/package.json +1 -1
  568. package/src/functions/utils.ts +4 -1
@@ -0,0 +1,604 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wouldDamageTaintedMagdaleneNonTemporaryHeartContainers = exports.setPlayerHealth = exports.removeAllPlayerHealth = exports.playerHasHealthLeft = exports.playerConvertSoulHeartsToBlackHearts = exports.playerConvertBlackHeartsToSoulHearts = exports.newPlayerHealth = exports.getTaintedMagdaleneNonTemporaryMaxHearts = exports.getPlayerSoulHearts = exports.getPlayerMaxHeartContainers = exports.getPlayerLastHeart = exports.getPlayerHearts = exports.getPlayerHealthType = exports.getPlayerHealth = exports.getPlayerBlackHearts = exports.getPlayerAvailableHeartSlots = exports.doesPlayerHaveAllSoulHearts = exports.doesPlayerHaveAllBlackHearts = exports.canPickEternalHearts = exports.addPlayerHealthType = void 0;
4
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
5
+ const constants_1 = require("../core/constants");
6
+ const HealthType_1 = require("../enums/HealthType");
7
+ const bitwise_1 = require("./bitwise");
8
+ const characters_1 = require("./characters");
9
+ const charge_1 = require("./charge");
10
+ const playerCollectibles_1 = require("./playerCollectibles");
11
+ const players_1 = require("./players");
12
+ const utils_1 = require("./utils");
13
+ function addPlayerHealthType(player, healthType, numHearts) {
14
+ switch (healthType) {
15
+ case HealthType_1.HealthType.RED: {
16
+ player.AddHearts(numHearts);
17
+ break;
18
+ }
19
+ case HealthType_1.HealthType.SOUL: {
20
+ player.AddSoulHearts(numHearts);
21
+ break;
22
+ }
23
+ case HealthType_1.HealthType.ETERNAL: {
24
+ player.AddEternalHearts(numHearts);
25
+ break;
26
+ }
27
+ case HealthType_1.HealthType.BLACK: {
28
+ player.AddBlackHearts(numHearts);
29
+ break;
30
+ }
31
+ case HealthType_1.HealthType.GOLDEN: {
32
+ player.AddGoldenHearts(numHearts);
33
+ break;
34
+ }
35
+ case HealthType_1.HealthType.BONE: {
36
+ player.AddBoneHearts(numHearts);
37
+ break;
38
+ }
39
+ case HealthType_1.HealthType.ROTTEN: {
40
+ player.AddRottenHearts(numHearts);
41
+ break;
42
+ }
43
+ case HealthType_1.HealthType.BROKEN: {
44
+ player.AddBrokenHearts(numHearts);
45
+ break;
46
+ }
47
+ case HealthType_1.HealthType.MAX_HEARTS: {
48
+ player.AddMaxHearts(numHearts, false);
49
+ break;
50
+ }
51
+ }
52
+ }
53
+ exports.addPlayerHealthType = addPlayerHealthType;
54
+ /**
55
+ * Helper function to see if the provided player can pick up an eternal heart. (If a player already
56
+ * has an eternal heart and full heart containers, they are not able to pick up any additional
57
+ * eternal hearts.)
58
+ *
59
+ * This function's name matches the existing `EntityPlayer` methods.
60
+ */
61
+ function canPickEternalHearts(player) {
62
+ const eternalHearts = player.GetEternalHearts();
63
+ const maxHearts = player.GetMaxHearts();
64
+ const heartLimit = player.GetHeartLimit();
65
+ return eternalHearts === 0 || maxHearts !== heartLimit;
66
+ }
67
+ exports.canPickEternalHearts = canPickEternalHearts;
68
+ /**
69
+ * Returns whether all of the player's soul-heart-type hearts are black hearts.
70
+ *
71
+ * Note that this function does not consider red heart containers.
72
+ *
73
+ * For example:
74
+ *
75
+ * - If the player has one black heart, this function would return true.
76
+ * - If the player has one soul heart and two black hearts, this function would return false.
77
+ * - If the player has no black hearts, this function will return false.
78
+ * - If the player has one red heart container and three black hearts, this function would return
79
+ * true.
80
+ */
81
+ function doesPlayerHaveAllBlackHearts(player) {
82
+ const soulHearts = getPlayerSoulHearts(player);
83
+ const blackHearts = getPlayerBlackHearts(player);
84
+ return blackHearts > 0 && soulHearts === 0;
85
+ }
86
+ exports.doesPlayerHaveAllBlackHearts = doesPlayerHaveAllBlackHearts;
87
+ /**
88
+ * Returns whether all of the player's soul-heart-type hearts are soul hearts.
89
+ *
90
+ * Note that this function does not consider red heart containers.
91
+ *
92
+ * For example:
93
+ *
94
+ * - If the player has two soul hearts and one black heart, this function would return false.
95
+ * - If the player has no soul hearts, this function will return false.
96
+ * - If the player has one red heart container and three soul hearts, this function would return
97
+ * true.
98
+ */
99
+ function doesPlayerHaveAllSoulHearts(player) {
100
+ const soulHearts = getPlayerSoulHearts(player);
101
+ const blackHearts = getPlayerBlackHearts(player);
102
+ return soulHearts > 0 && blackHearts === 0;
103
+ }
104
+ exports.doesPlayerHaveAllSoulHearts = doesPlayerHaveAllSoulHearts;
105
+ /**
106
+ * Returns the number of slots that the player has remaining for new heart containers, accounting
107
+ * for broken hearts. For example, if the player is Judas and has 1 red heart containers and 2 full
108
+ * soul hearts and 3 broken hearts, then this function would return 6 (i.e. 12 - 1 - 2 - 3).
109
+ */
110
+ function getPlayerAvailableHeartSlots(player) {
111
+ const maxHeartContainers = getPlayerMaxHeartContainers(player);
112
+ const effectiveMaxHearts = player.GetEffectiveMaxHearts();
113
+ const normalAndBoneHeartContainers = effectiveMaxHearts / 2;
114
+ const soulHearts = player.GetSoulHearts();
115
+ const soulHeartContainers = Math.ceil(soulHearts / 2);
116
+ const totalHeartContainers = normalAndBoneHeartContainers + soulHeartContainers;
117
+ const brokenHearts = player.GetBrokenHearts();
118
+ const totalOccupiedHeartSlots = totalHeartContainers + brokenHearts;
119
+ return maxHeartContainers - totalOccupiedHeartSlots;
120
+ }
121
+ exports.getPlayerAvailableHeartSlots = getPlayerAvailableHeartSlots;
122
+ /**
123
+ * Returns the number of black hearts that the player has, excluding any soul hearts. For example,
124
+ * if the player has one full black heart, one full soul heart, and one half black heart, this
125
+ * function returns 3.
126
+ *
127
+ * This is different from the `EntityPlayer.GetBlackHearts` method, since that returns a bitmask.
128
+ */
129
+ function getPlayerBlackHearts(player) {
130
+ const blackHeartsBitmask = player.GetBlackHearts();
131
+ const blackHeartBits = (0, bitwise_1.countSetBits)(blackHeartsBitmask);
132
+ return blackHeartBits * 2;
133
+ }
134
+ exports.getPlayerBlackHearts = getPlayerBlackHearts;
135
+ /**
136
+ * Helper function to get an object representing the player's health. You can use this in
137
+ * combination with the `setPlayerHealth` function to restore the player's health back to a certain
138
+ * configuration at a later time.
139
+ *
140
+ * This is based on the `REVEL.StoreHealth` function in the Revelations mod.
141
+ */
142
+ function getPlayerHealth(player) {
143
+ const character = player.GetPlayerType();
144
+ let maxHearts = player.GetMaxHearts();
145
+ let hearts = getPlayerHearts(player); // We use the helper function to remove rotten hearts
146
+ let soulHearts = player.GetSoulHearts();
147
+ let boneHearts = player.GetBoneHearts();
148
+ const goldenHearts = player.GetGoldenHearts();
149
+ const eternalHearts = player.GetEternalHearts();
150
+ const rottenHearts = player.GetRottenHearts();
151
+ const brokenHearts = player.GetBrokenHearts();
152
+ const subPlayer = player.GetSubPlayer();
153
+ const soulCharges = player.GetEffectiveSoulCharge();
154
+ const bloodCharges = player.GetEffectiveBloodCharge();
155
+ // The Forgotten and The Soul has special health, so we need to account for this.
156
+ if (character === isaac_typescript_definitions_1.PlayerType.FORGOTTEN && subPlayer !== undefined) {
157
+ // The Forgotten does not have red heart containers.
158
+ maxHearts = boneHearts * 2;
159
+ boneHearts = 0;
160
+ // The Forgotten will always have 0 soul hearts; we need to get the soul heart amount from the
161
+ // sub player.
162
+ soulHearts = subPlayer.GetSoulHearts();
163
+ }
164
+ else if (character === isaac_typescript_definitions_1.PlayerType.SOUL && subPlayer !== undefined) {
165
+ // The Soul will always have 0 bone hearts; we need to get the bone heart amount from the sub
166
+ // player. We need to store it as "maxHearts" instead of "boneHearts".
167
+ maxHearts = subPlayer.GetBoneHearts() * 2;
168
+ hearts = subPlayer.GetHearts();
169
+ }
170
+ // This is the number of individual hearts shown in the HUD, minus heart containers.
171
+ const extraHearts = Math.ceil(soulHearts / 2) + boneHearts;
172
+ // Since bone hearts can be inserted anywhere between soul hearts, we need a separate counter to
173
+ // track which soul heart we're currently at.
174
+ let currentSoulHeart = 0;
175
+ const soulHeartTypes = [];
176
+ for (let i = 0; i < extraHearts; i++) {
177
+ let isBoneHeart = player.IsBoneHeart(i);
178
+ if (character === isaac_typescript_definitions_1.PlayerType.FORGOTTEN && subPlayer !== undefined) {
179
+ isBoneHeart = subPlayer.IsBoneHeart(i);
180
+ }
181
+ if (isBoneHeart) {
182
+ soulHeartTypes.push(isaac_typescript_definitions_1.HeartSubType.BONE);
183
+ }
184
+ else {
185
+ // We need to add 1 here because only the second half of a black heart is considered black.
186
+ let isBlackHeart = player.IsBlackHeart(currentSoulHeart + 1);
187
+ if (character === isaac_typescript_definitions_1.PlayerType.FORGOTTEN && subPlayer !== undefined) {
188
+ isBlackHeart = subPlayer.IsBlackHeart(currentSoulHeart + 1);
189
+ }
190
+ if (isBlackHeart) {
191
+ soulHeartTypes.push(isaac_typescript_definitions_1.HeartSubType.BLACK);
192
+ }
193
+ else {
194
+ soulHeartTypes.push(isaac_typescript_definitions_1.HeartSubType.SOUL);
195
+ }
196
+ // Move to the next heart.
197
+ currentSoulHeart += 2;
198
+ }
199
+ }
200
+ return {
201
+ maxHearts,
202
+ hearts,
203
+ eternalHearts,
204
+ soulHearts,
205
+ boneHearts,
206
+ goldenHearts,
207
+ rottenHearts,
208
+ brokenHearts,
209
+ soulCharges,
210
+ bloodCharges,
211
+ soulHeartTypes,
212
+ };
213
+ }
214
+ exports.getPlayerHealth = getPlayerHealth;
215
+ function getPlayerHealthType(player, healthType) {
216
+ switch (healthType) {
217
+ // 5.10.1
218
+ case HealthType_1.HealthType.RED: {
219
+ // We use the standard library helper function since the `EntityPlayer.GetHearts` method
220
+ // returns a value that includes rotten hearts.
221
+ return getPlayerHearts(player);
222
+ }
223
+ // 5.10.3
224
+ case HealthType_1.HealthType.SOUL: {
225
+ // We use the standard library helper function since the `EntityPlayer.GetSoulHearts` method
226
+ // returns a value that includes black hearts.
227
+ return getPlayerSoulHearts(player);
228
+ }
229
+ // 5.10.4
230
+ case HealthType_1.HealthType.ETERNAL: {
231
+ return player.GetEternalHearts();
232
+ }
233
+ // 5.10.6
234
+ case HealthType_1.HealthType.BLACK: {
235
+ // We use the standard library helper function since the `EntityPlayer.GetBlackHearts` method
236
+ // returns a bit mask.
237
+ return getPlayerBlackHearts(player);
238
+ }
239
+ // 5.10.7
240
+ case HealthType_1.HealthType.GOLDEN: {
241
+ return player.GetGoldenHearts();
242
+ }
243
+ // 5.10.11
244
+ case HealthType_1.HealthType.BONE: {
245
+ return player.GetBoneHearts();
246
+ }
247
+ // 5.10.12
248
+ case HealthType_1.HealthType.ROTTEN: {
249
+ return player.GetRottenHearts();
250
+ }
251
+ case HealthType_1.HealthType.BROKEN: {
252
+ return player.GetBrokenHearts();
253
+ }
254
+ case HealthType_1.HealthType.MAX_HEARTS: {
255
+ return player.GetMaxHearts();
256
+ }
257
+ }
258
+ }
259
+ exports.getPlayerHealthType = getPlayerHealthType;
260
+ /**
261
+ * Returns the number of red hearts that the player has, excluding any rotten hearts. For example,
262
+ * if the player has one full black heart, one full soul heart, and one half black heart, this
263
+ * function returns 3.
264
+ *
265
+ * This is different from the `EntityPlayer.GetHearts` method, since that returns a value that
266
+ * includes rotten hearts.
267
+ */
268
+ function getPlayerHearts(player) {
269
+ const rottenHearts = player.GetRottenHearts();
270
+ const hearts = player.GetHearts();
271
+ return hearts - rottenHearts * 2;
272
+ }
273
+ exports.getPlayerHearts = getPlayerHearts;
274
+ /**
275
+ * Helper function that returns the type of the rightmost heart. This does not including golden
276
+ * hearts or broken hearts, since they cannot be damaged directly.
277
+ */
278
+ function getPlayerLastHeart(player) {
279
+ const hearts = player.GetHearts();
280
+ const effectiveMaxHearts = player.GetEffectiveMaxHearts();
281
+ const soulHearts = player.GetSoulHearts();
282
+ const blackHearts = player.GetBlackHearts();
283
+ const eternalHearts = player.GetEternalHearts();
284
+ const boneHearts = player.GetBoneHearts();
285
+ const rottenHearts = player.GetRottenHearts();
286
+ const soulHeartSlots = soulHearts / 2;
287
+ const lastHeartIndex = boneHearts + soulHeartSlots - 1;
288
+ const isLastHeartBone = player.IsBoneHeart(lastHeartIndex);
289
+ if (isLastHeartBone) {
290
+ const isLastContainerEmpty = hearts <= effectiveMaxHearts - 2;
291
+ if (isLastContainerEmpty) {
292
+ return HealthType_1.HealthType.BONE;
293
+ }
294
+ if (rottenHearts > 0) {
295
+ return HealthType_1.HealthType.ROTTEN;
296
+ }
297
+ if (eternalHearts > 0) {
298
+ return HealthType_1.HealthType.ETERNAL;
299
+ }
300
+ return HealthType_1.HealthType.RED;
301
+ }
302
+ if (soulHearts > 0) {
303
+ const numBits = (0, bitwise_1.getNumBitsOfN)(blackHearts);
304
+ const finalBit = (0, bitwise_1.getKBitOfN)(numBits - 1, blackHearts);
305
+ const isBlack = finalBit === 1;
306
+ if (isBlack) {
307
+ return HealthType_1.HealthType.BLACK;
308
+ }
309
+ // If it is not a black heart, it must be a soul heart.
310
+ return HealthType_1.HealthType.SOUL;
311
+ }
312
+ if (eternalHearts > 0) {
313
+ return HealthType_1.HealthType.ETERNAL;
314
+ }
315
+ if (rottenHearts > 0) {
316
+ return HealthType_1.HealthType.ROTTEN;
317
+ }
318
+ return HealthType_1.HealthType.RED;
319
+ }
320
+ exports.getPlayerLastHeart = getPlayerLastHeart;
321
+ /**
322
+ * Returns the maximum heart containers that the provided player can have. Normally, this is 12, but
323
+ * it can change depending on the character (e.g. Keeper) and other things (e.g. Mother's Kiss).
324
+ * This function does not account for Broken Hearts; use the `getPlayerAvailableHeartSlots` helper
325
+ * function for that.
326
+ */
327
+ function getPlayerMaxHeartContainers(player) {
328
+ const character = player.GetPlayerType();
329
+ const characterMaxHeartContainers = (0, characters_1.getCharacterMaxHeartContainers)(character);
330
+ // 1
331
+ // Magdalene can increase her maximum heart containers with Birthright.
332
+ if (character === isaac_typescript_definitions_1.PlayerType.MAGDALENE &&
333
+ player.HasCollectible(isaac_typescript_definitions_1.CollectibleType.BIRTHRIGHT)) {
334
+ const extraMaxHeartContainersFromBirthright = 6;
335
+ return characterMaxHeartContainers + extraMaxHeartContainersFromBirthright;
336
+ }
337
+ // 14, 33
338
+ // Keeper and Tainted Keeper can increase their coin containers with Mother's Kiss and Greed's
339
+ // Gullet.
340
+ if ((0, players_1.isKeeper)(player)) {
341
+ const numMothersKisses = player.GetTrinketMultiplier(isaac_typescript_definitions_1.TrinketType.MOTHERS_KISS);
342
+ const hasGreedsGullet = player.HasCollectible(isaac_typescript_definitions_1.CollectibleType.GREEDS_GULLET);
343
+ const coins = player.GetNumCoins();
344
+ const greedsGulletCoinContainers = hasGreedsGullet
345
+ ? Math.floor(coins / 25)
346
+ : 0;
347
+ return (characterMaxHeartContainers +
348
+ numMothersKisses +
349
+ greedsGulletCoinContainers);
350
+ }
351
+ return characterMaxHeartContainers;
352
+ }
353
+ exports.getPlayerMaxHeartContainers = getPlayerMaxHeartContainers;
354
+ /**
355
+ * Returns the number of soul hearts that the player has, excluding any black hearts. For example,
356
+ * if the player has one full black heart, one full soul heart, and one half black heart, this
357
+ * function returns 2.
358
+ *
359
+ * This is different from the `EntityPlayer.GetSoulHearts` method, since that returns the combined
360
+ * number of soul hearts and black hearts.
361
+ */
362
+ function getPlayerSoulHearts(player) {
363
+ const soulHearts = player.GetSoulHearts();
364
+ const blackHearts = getPlayerBlackHearts(player);
365
+ return soulHearts - blackHearts;
366
+ }
367
+ exports.getPlayerSoulHearts = getPlayerSoulHearts;
368
+ /**
369
+ * Helper function to determine how many heart containers that Tainted Magdalene has that will not
370
+ * be automatically depleted over time. By default, this is 2, but this function will return 4 so
371
+ * that it is consistent with the `player.GetHearts` and `player.GetMaxHearts` methods.
372
+ *
373
+ * If Tainted Magdalene has Birthright, she will gained an additional non-temporary heart container.
374
+ *
375
+ * This function does not validate whether the provided player is Tainted Magdalene; that should be
376
+ * accomplished before invoking this function.
377
+ */
378
+ function getTaintedMagdaleneNonTemporaryMaxHearts(player) {
379
+ const maxHearts = player.GetMaxHearts();
380
+ const hasBirthright = player.HasCollectible(isaac_typescript_definitions_1.CollectibleType.BIRTHRIGHT);
381
+ const maxNonTemporaryMaxHearts = hasBirthright ? 6 : 4;
382
+ return Math.min(maxHearts, maxNonTemporaryMaxHearts);
383
+ }
384
+ exports.getTaintedMagdaleneNonTemporaryMaxHearts = getTaintedMagdaleneNonTemporaryMaxHearts;
385
+ /** Returns a `PlayerHealth` object with all zeros. */
386
+ function newPlayerHealth() {
387
+ return {
388
+ maxHearts: 0,
389
+ hearts: 0,
390
+ eternalHearts: 0,
391
+ soulHearts: 0,
392
+ boneHearts: 0,
393
+ goldenHearts: 0,
394
+ rottenHearts: 0,
395
+ brokenHearts: 0,
396
+ soulCharges: 0,
397
+ bloodCharges: 0,
398
+ soulHeartTypes: [],
399
+ };
400
+ }
401
+ exports.newPlayerHealth = newPlayerHealth;
402
+ /**
403
+ * Helper function to remove all of a player's black hearts and add the corresponding amount of soul
404
+ * hearts.
405
+ */
406
+ function playerConvertBlackHeartsToSoulHearts(player) {
407
+ const playerHealth = getPlayerHealth(player);
408
+ removeAllPlayerHealth(player);
409
+ const newSoulHeartTypes = playerHealth.soulHeartTypes.map((soulHeartType) => soulHeartType === isaac_typescript_definitions_1.HeartSubType.BLACK ? isaac_typescript_definitions_1.HeartSubType.SOUL : soulHeartType);
410
+ const playerHealthWithSoulHearts = {
411
+ ...playerHealth,
412
+ soulHeartTypes: newSoulHeartTypes,
413
+ };
414
+ setPlayerHealth(player, playerHealthWithSoulHearts);
415
+ }
416
+ exports.playerConvertBlackHeartsToSoulHearts = playerConvertBlackHeartsToSoulHearts;
417
+ /**
418
+ * Helper function to remove all of a player's soul hearts and add the corresponding amount of black
419
+ * hearts.
420
+ */
421
+ function playerConvertSoulHeartsToBlackHearts(player) {
422
+ const playerHealth = getPlayerHealth(player);
423
+ removeAllPlayerHealth(player);
424
+ const newSoulHeartTypes = playerHealth.soulHeartTypes.map((soulHeartType) => soulHeartType === isaac_typescript_definitions_1.HeartSubType.SOUL ? isaac_typescript_definitions_1.HeartSubType.BLACK : soulHeartType);
425
+ const playerHealthWithBlackHearts = {
426
+ ...playerHealth,
427
+ soulHeartTypes: newSoulHeartTypes,
428
+ };
429
+ setPlayerHealth(player, playerHealthWithBlackHearts);
430
+ }
431
+ exports.playerConvertSoulHeartsToBlackHearts = playerConvertSoulHeartsToBlackHearts;
432
+ /**
433
+ * Helper function to see if the player is out of health.
434
+ *
435
+ * Specifically, this function will return false if the player has 0 red hearts, 0 soul/black
436
+ * hearts, and 0 bone hearts.
437
+ */
438
+ function playerHasHealthLeft(player) {
439
+ const hearts = player.GetHearts();
440
+ const soulHearts = player.GetSoulHearts();
441
+ const boneHearts = player.GetBoneHearts();
442
+ return hearts > 0 || soulHearts > 0 || boneHearts > 0;
443
+ }
444
+ exports.playerHasHealthLeft = playerHasHealthLeft;
445
+ function removeAllPlayerHealth(player) {
446
+ const goldenHearts = player.GetGoldenHearts();
447
+ const eternalHearts = player.GetEternalHearts();
448
+ const boneHearts = player.GetBoneHearts();
449
+ const brokenHearts = player.GetBrokenHearts();
450
+ // To avoid bugs, we have to remove the exact amount of certain types of hearts. We remove Golden
451
+ // Hearts first so that they don't break.
452
+ player.AddGoldenHearts(goldenHearts * -1);
453
+ player.AddEternalHearts(eternalHearts * -1);
454
+ player.AddBoneHearts(boneHearts * -1);
455
+ player.AddBrokenHearts(brokenHearts * -1);
456
+ player.AddMaxHearts(constants_1.MAX_PLAYER_HEART_CONTAINERS * -2, true);
457
+ player.AddSoulHearts(constants_1.MAX_PLAYER_HEART_CONTAINERS * -2);
458
+ // If we are The Soul, the `EntityPlayer.AddBoneHearts` method will not remove Forgotten's bone
459
+ // hearts, so we need to explicitly handle this.
460
+ if ((0, players_1.isCharacter)(player, isaac_typescript_definitions_1.PlayerType.SOUL)) {
461
+ const forgotten = player.GetSubPlayer();
462
+ if (forgotten !== undefined) {
463
+ const forgottenBoneHearts = forgotten.GetBoneHearts();
464
+ forgotten.AddBoneHearts(forgottenBoneHearts * -1);
465
+ }
466
+ }
467
+ }
468
+ exports.removeAllPlayerHealth = removeAllPlayerHealth;
469
+ /**
470
+ * Helper function to set a player's health to a specific state. You can use this in combination
471
+ * with the `getPlayerHealth` function to restore the player's health back to a certain
472
+ * configuration at a later time.
473
+ *
474
+ * Based on the `REVEL.LoadHealth` function in the Revelations mod.
475
+ */
476
+ function setPlayerHealth(player, playerHealth) {
477
+ const character = player.GetPlayerType();
478
+ const subPlayer = player.GetSubPlayer();
479
+ // Before we add or remove any health, we have to take away Alabaster Box, if present. (Removing
480
+ // soul hearts from the player will remove Alabaster Box charges.)
481
+ const alabasterBoxDescriptions = [];
482
+ const alabasterBoxActiveSlots = (0, playerCollectibles_1.getActiveItemSlots)(player, isaac_typescript_definitions_1.CollectibleType.ALABASTER_BOX);
483
+ for (const activeSlot of alabasterBoxActiveSlots) {
484
+ const totalCharge = (0, charge_1.getTotalCharge)(player, activeSlot);
485
+ (0, playerCollectibles_1.setActiveItem)(player, isaac_typescript_definitions_1.CollectibleType.NULL, activeSlot);
486
+ alabasterBoxDescriptions.push({ activeSlot, totalCharge });
487
+ }
488
+ removeAllPlayerHealth(player);
489
+ // Add the red heart containers.
490
+ if (character === isaac_typescript_definitions_1.PlayerType.SOUL && subPlayer !== undefined) {
491
+ // Adding health to The Soul is a special case.
492
+ subPlayer.AddMaxHearts(playerHealth.maxHearts, false);
493
+ }
494
+ else {
495
+ player.AddMaxHearts(playerHealth.maxHearts, false);
496
+ }
497
+ // Add the eternal hearts.
498
+ player.AddEternalHearts(playerHealth.eternalHearts);
499
+ // Add the soul / black / bone hearts.
500
+ let soulHeartsRemaining = playerHealth.soulHearts;
501
+ for (const [i, soulHeartType] of playerHealth.soulHeartTypes.entries()) {
502
+ const isHalf = playerHealth.soulHearts + playerHealth.boneHearts * 2 < (i + 1) * 2;
503
+ let addAmount = 2;
504
+ if (isHalf ||
505
+ soulHeartType === isaac_typescript_definitions_1.HeartSubType.BONE ||
506
+ soulHeartsRemaining < 2) {
507
+ // Fix the bug where a half soul heart to the left of a bone heart will be treated as a full
508
+ // soul heart.
509
+ addAmount = 1;
510
+ }
511
+ switch (soulHeartType) {
512
+ case isaac_typescript_definitions_1.HeartSubType.SOUL: {
513
+ player.AddSoulHearts(addAmount);
514
+ soulHeartsRemaining -= addAmount;
515
+ break;
516
+ }
517
+ case isaac_typescript_definitions_1.HeartSubType.BLACK: {
518
+ player.AddBlackHearts(addAmount);
519
+ soulHeartsRemaining -= addAmount;
520
+ break;
521
+ }
522
+ case isaac_typescript_definitions_1.HeartSubType.BONE: {
523
+ player.AddBoneHearts(addAmount);
524
+ break;
525
+ }
526
+ }
527
+ }
528
+ /**
529
+ * Fill in the red heart containers.
530
+ *
531
+ * Rotten Hearts must be filled in first in order for this to work properly, since they conflict
532
+ * with half red hearts.
533
+ *
534
+ * We multiply by two because the `EntityPlayer.GetRottenHearts` function returns the actual
535
+ * number of rotten hearts, but the `EntityPlayer.AddRottenHearts` works like the other heart
536
+ * functions in that a value of 1 is equivalent to a half-heart.
537
+ */
538
+ player.AddRottenHearts(playerHealth.rottenHearts * 2);
539
+ if (character === isaac_typescript_definitions_1.PlayerType.MAGDALENE_B) {
540
+ // Adding 1 heart to Tainted Magdalene will actually add two hearts.
541
+ (0, utils_1.repeat)(playerHealth.hearts, () => {
542
+ if (player.HasFullHearts()) {
543
+ return;
544
+ }
545
+ const hearts = player.GetHearts();
546
+ const maxHearts = player.GetMaxHearts();
547
+ if (hearts === maxHearts - 1) {
548
+ player.AddHearts(1);
549
+ return;
550
+ }
551
+ player.AddHearts(1);
552
+ player.AddHearts(-1);
553
+ });
554
+ }
555
+ else {
556
+ player.AddHearts(playerHealth.hearts);
557
+ }
558
+ player.AddGoldenHearts(playerHealth.goldenHearts);
559
+ player.AddBrokenHearts(playerHealth.brokenHearts);
560
+ // Set the Bethany / Tainted Bethany charges.
561
+ if (character === isaac_typescript_definitions_1.PlayerType.BETHANY) {
562
+ player.SetSoulCharge(playerHealth.soulCharges);
563
+ }
564
+ else if (character === isaac_typescript_definitions_1.PlayerType.BETHANY_B) {
565
+ player.SetBloodCharge(playerHealth.bloodCharges);
566
+ }
567
+ // Re-add the Alabaster Box, if present.
568
+ for (const { activeSlot, totalCharge } of alabasterBoxDescriptions) {
569
+ (0, playerCollectibles_1.setActiveItem)(player, isaac_typescript_definitions_1.CollectibleType.ALABASTER_BOX, activeSlot, totalCharge);
570
+ }
571
+ }
572
+ exports.setPlayerHealth = setPlayerHealth;
573
+ /**
574
+ * Helper function to see if a certain damage amount would deal "permanent" damage to Tainted
575
+ * Magdalene.
576
+ *
577
+ * Tainted Magdalene has "permanent" health and "temporary" health. When standing still and doing
578
+ * nothing, all of Tainted Magdalene's temporary health will eventually go away.
579
+ *
580
+ * Before using this function, it is expected that you check to see if the player is Tainted
581
+ * Magdalene first, or else it will give a nonsensical result.
582
+ */
583
+ function wouldDamageTaintedMagdaleneNonTemporaryHeartContainers(player, damageAmount) {
584
+ // Regardless of the damage amount, damage to a player cannot remove a soul heart and a red heart
585
+ // at the same time.
586
+ const soulHearts = player.GetSoulHearts();
587
+ if (soulHearts > 0) {
588
+ return false;
589
+ }
590
+ // Regardless of the damage amount, damage to a player cannot remove a bone heart and a red heart
591
+ // at the same time.
592
+ const boneHearts = player.GetBoneHearts();
593
+ if (boneHearts > 0) {
594
+ return false;
595
+ }
596
+ // Account for rotten hearts eating away at more red hearts than usual.
597
+ const hearts = player.GetHearts();
598
+ const rottenHearts = player.GetRottenHearts();
599
+ const effectiveDamageAmount = damageAmount + Math.min(rottenHearts, damageAmount);
600
+ const heartsAfterDamage = hearts - effectiveDamageAmount;
601
+ const nonTemporaryMaxHearts = getTaintedMagdaleneNonTemporaryMaxHearts(player);
602
+ return heartsAfterDamage < nonTemporaryMaxHearts;
603
+ }
604
+ exports.wouldDamageTaintedMagdaleneNonTemporaryHeartContainers = wouldDamageTaintedMagdaleneNonTemporaryHeartContainers;