isaacscript-common 6.6.1-dev.1 → 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 (412) hide show
  1. package/cachedClasses.d.ts +1 -0
  2. package/cachedClasses.js +59 -0
  3. package/callbacks/customRevive.js +153 -0
  4. package/callbacks/itemPickup.js +64 -0
  5. package/callbacks/postAmbush.js +54 -0
  6. package/callbacks/postBombExploded.js +20 -0
  7. package/callbacks/postBombInitLate.js +28 -0
  8. package/callbacks/postBoneSwing.js +49 -0
  9. package/callbacks/postCollectibleEmpty.js +32 -0
  10. package/callbacks/postCollectibleInitFirst.js +27 -0
  11. package/callbacks/postCursedTeleport.js +120 -0
  12. package/callbacks/postCustomDoorEnter.js +205 -0
  13. package/callbacks/postDiceRoomActivated.js +39 -0
  14. package/callbacks/postDoorRender.js +20 -0
  15. package/callbacks/postDoorUpdate.js +20 -0
  16. package/callbacks/postEffectInitLate.js +28 -0
  17. package/callbacks/postEffectStateChanged.js +31 -0
  18. package/callbacks/postEsauJr.js +70 -0
  19. package/callbacks/postFamiliarInitLate.js +28 -0
  20. package/callbacks/postFamiliarStateChanged.js +31 -0
  21. package/callbacks/postFlip.js +59 -0
  22. package/callbacks/postGreedModeWave.js +31 -0
  23. package/callbacks/postGridEntity.js +107 -0
  24. package/callbacks/postGridEntityCollision.js +49 -0
  25. package/callbacks/postGridEntityRender.js +20 -0
  26. package/callbacks/postHolyMantleRemoved.js +33 -0
  27. package/callbacks/postItemDischarged.js +94 -0
  28. package/callbacks/postKnifeInitLate.js +28 -0
  29. package/callbacks/postLaserInitLate.js +28 -0
  30. package/callbacks/postNPCInitLate.js +28 -0
  31. package/callbacks/postNPCStateChanged.js +31 -0
  32. package/callbacks/postNewRoomEarly.js +69 -0
  33. package/callbacks/postPickupCollect.js +37 -0
  34. package/callbacks/postPickupInitFirst.js +52 -0
  35. package/callbacks/postPickupInitLate.js +28 -0
  36. package/callbacks/postPickupStateChanged.js +31 -0
  37. package/callbacks/postPitRender.js +20 -0
  38. package/callbacks/postPitUpdate.js +20 -0
  39. package/callbacks/postPlayerChangeHealth.js +43 -0
  40. package/callbacks/postPlayerChangeType.js +31 -0
  41. package/callbacks/postPlayerCollectible.js +74 -0
  42. package/callbacks/postPlayerFatalDamage.js +74 -0
  43. package/callbacks/postPlayerInitLate.js +28 -0
  44. package/callbacks/postPlayerReordered.js +109 -0
  45. package/callbacks/postPoopRender.js +20 -0
  46. package/callbacks/postPoopUpdate.js +20 -0
  47. package/callbacks/postPressurePlateRender.js +20 -0
  48. package/callbacks/postPressurePlateUpdate.js +20 -0
  49. package/callbacks/postProjectileInitLate.js +28 -0
  50. package/callbacks/postPurchase.js +39 -0
  51. package/callbacks/postRockRender.js +20 -0
  52. package/callbacks/postRockUpdate.js +20 -0
  53. package/callbacks/postRoomClearChanged.js +41 -0
  54. package/callbacks/postSacrifice.js +38 -0
  55. package/callbacks/postSlotDestroyed.js +64 -0
  56. package/callbacks/postSlotInitUpdate.js +49 -0
  57. package/callbacks/postSlotRender.js +48 -0
  58. package/callbacks/postSpikesRender.js +20 -0
  59. package/callbacks/postSpikesUpdate.js +20 -0
  60. package/callbacks/postTNTRender.js +20 -0
  61. package/callbacks/postTNTUpdate.js +20 -0
  62. package/callbacks/postTearInitLate.js +28 -0
  63. package/callbacks/postTearInitVeryLate.js +32 -0
  64. package/callbacks/postTransformation.js +37 -0
  65. package/callbacks/postTrinketBreak.js +64 -0
  66. package/callbacks/preBerserkDeath.js +35 -0
  67. package/callbacks/preNewLevel.js +45 -0
  68. package/callbacks/reorderedCallbacks.js +136 -0
  69. package/callbacks/subscriptions/postAmbushFinished.js +20 -0
  70. package/callbacks/subscriptions/postAmbushStarted.js +20 -0
  71. package/callbacks/subscriptions/postBombInitLate.js +20 -0
  72. package/callbacks/subscriptions/postBoneExploded.js +20 -0
  73. package/callbacks/subscriptions/postBoneSwing.js +16 -0
  74. package/callbacks/subscriptions/postCollectibleEmpty.js +21 -0
  75. package/callbacks/subscriptions/postCollectibleInitFirst.js +21 -0
  76. package/callbacks/subscriptions/postCursedTeleport.js +16 -0
  77. package/callbacks/subscriptions/postCustomDoorEnter.js +21 -0
  78. package/callbacks/subscriptions/postCustomRevive.js +21 -0
  79. package/callbacks/subscriptions/postDiceRoomActivated.js +21 -0
  80. package/callbacks/subscriptions/postDoorRender.js +22 -0
  81. package/callbacks/subscriptions/postDoorUpdate.js +22 -0
  82. package/callbacks/subscriptions/postEffectInitLate.js +20 -0
  83. package/callbacks/subscriptions/postEffectStateChanged.js +20 -0
  84. package/callbacks/subscriptions/postEsauJr.js +16 -0
  85. package/callbacks/subscriptions/postFamiliarInitLate.js +20 -0
  86. package/callbacks/subscriptions/postFamiliarStateChanged.js +20 -0
  87. package/callbacks/subscriptions/postFirstEsauJr.js +16 -0
  88. package/callbacks/subscriptions/postFirstFlip.js +16 -0
  89. package/callbacks/subscriptions/postFlip.js +16 -0
  90. package/callbacks/subscriptions/postGameStartedReordered.js +16 -0
  91. package/callbacks/subscriptions/postGreedModeWave.js +16 -0
  92. package/callbacks/subscriptions/postGridEntityBroken.js +28 -0
  93. package/callbacks/subscriptions/postGridEntityCollision.js +28 -0
  94. package/callbacks/subscriptions/postGridEntityInit.js +28 -0
  95. package/callbacks/subscriptions/postGridEntityRemove.js +26 -0
  96. package/callbacks/subscriptions/postGridEntityRender.js +28 -0
  97. package/callbacks/subscriptions/postGridEntityStateChanged.js +28 -0
  98. package/callbacks/subscriptions/postGridEntityUpdate.js +28 -0
  99. package/callbacks/subscriptions/postHolyMantleRemoved.js +25 -0
  100. package/callbacks/subscriptions/postItemDischarged.js +21 -0
  101. package/callbacks/subscriptions/postItemPickup.js +25 -0
  102. package/callbacks/subscriptions/postKnifeInitLate.js +20 -0
  103. package/callbacks/subscriptions/postLaserInitLate.js +20 -0
  104. package/callbacks/subscriptions/postNPCInitLate.js +20 -0
  105. package/callbacks/subscriptions/postNPCStateChanged.js +24 -0
  106. package/callbacks/subscriptions/postNewLevelReordered.js +16 -0
  107. package/callbacks/subscriptions/postNewRoomEarly.js +16 -0
  108. package/callbacks/subscriptions/postNewRoomReordered.js +16 -0
  109. package/callbacks/subscriptions/postPEffectUpdateReordered.js +25 -0
  110. package/callbacks/subscriptions/postPickupCollect.js +20 -0
  111. package/callbacks/subscriptions/postPickupInitFirst.js +20 -0
  112. package/callbacks/subscriptions/postPickupInitLate.js +20 -0
  113. package/callbacks/subscriptions/postPickupStateChanged.js +20 -0
  114. package/callbacks/subscriptions/postPitRender.js +22 -0
  115. package/callbacks/subscriptions/postPitUpdate.js +22 -0
  116. package/callbacks/subscriptions/postPlayerChangeHealth.js +25 -0
  117. package/callbacks/subscriptions/postPlayerChangeType.js +20 -0
  118. package/callbacks/subscriptions/postPlayerCollectibleAdded.js +21 -0
  119. package/callbacks/subscriptions/postPlayerCollectibleRemoved.js +21 -0
  120. package/callbacks/subscriptions/postPlayerFatalDamage.js +29 -0
  121. package/callbacks/subscriptions/postPlayerInitLate.js +25 -0
  122. package/callbacks/subscriptions/postPlayerInitReordered.js +25 -0
  123. package/callbacks/subscriptions/postPlayerRenderReordered.js +25 -0
  124. package/callbacks/subscriptions/postPlayerUpdateReordered.js +25 -0
  125. package/callbacks/subscriptions/postPoopRender.js +22 -0
  126. package/callbacks/subscriptions/postPoopUpdate.js +22 -0
  127. package/callbacks/subscriptions/postPressurePlateRender.js +22 -0
  128. package/callbacks/subscriptions/postPressurePlateUpdate.js +22 -0
  129. package/callbacks/subscriptions/postProjectileInitLate.js +21 -0
  130. package/callbacks/subscriptions/postPurchase.js +16 -0
  131. package/callbacks/subscriptions/postRockRender.js +22 -0
  132. package/callbacks/subscriptions/postRockUpdate.js +22 -0
  133. package/callbacks/subscriptions/postRoomClearChanged.js +20 -0
  134. package/callbacks/subscriptions/postSacrifice.js +25 -0
  135. package/callbacks/subscriptions/postSlotAnimationChanged.js +20 -0
  136. package/callbacks/subscriptions/postSlotDestroyed.js +26 -0
  137. package/callbacks/subscriptions/postSlotInit.js +20 -0
  138. package/callbacks/subscriptions/postSlotRender.js +20 -0
  139. package/callbacks/subscriptions/postSlotUpdate.js +20 -0
  140. package/callbacks/subscriptions/postSpikesRender.js +22 -0
  141. package/callbacks/subscriptions/postSpikesUpdate.js +22 -0
  142. package/callbacks/subscriptions/postTNTRender.js +22 -0
  143. package/callbacks/subscriptions/postTNTUpdate.js +22 -0
  144. package/callbacks/subscriptions/postTearInitLate.js +20 -0
  145. package/callbacks/subscriptions/postTearInitVeryLate.js +20 -0
  146. package/callbacks/subscriptions/postTransformation.js +20 -0
  147. package/callbacks/subscriptions/postTrinketBreak.js +21 -0
  148. package/callbacks/subscriptions/preBerserkDeath.js +26 -0
  149. package/callbacks/subscriptions/preCustomRevive.js +29 -0
  150. package/callbacks/subscriptions/preItemPickup.js +25 -0
  151. package/callbacks/subscriptions/preNewLevel.js +16 -0
  152. package/classes/DefaultMap.js +145 -0
  153. package/classes/ModUpgraded.js +57 -0
  154. package/constants.js +143 -0
  155. package/constantsFirstLast.js +156 -0
  156. package/enums/AmbushType.js +6 -0
  157. package/enums/CornerType.js +8 -0
  158. package/enums/DecorationVariant.js +11 -0
  159. package/enums/HealthType.js +18 -0
  160. package/enums/ModCallbackCustom.js +1213 -0
  161. package/enums/PocketItemType.js +10 -0
  162. package/enums/RockAltType.js +9 -0
  163. package/enums/SerializationType.js +7 -0
  164. package/enums/SlotDestructionType.js +6 -0
  165. package/enums/private/CopyableIsaacAPIClassType.js +9 -0
  166. package/enums/private/SaveDataKey.js +8 -0
  167. package/enums/private/SerializationBrand.js +41 -0
  168. package/features/characterHealthConversion.js +86 -0
  169. package/features/characterStats.js +52 -0
  170. package/features/collectibleItemPoolType.js +45 -0
  171. package/features/customGridEntity.js +148 -0
  172. package/features/customStage/backdrop.js +191 -0
  173. package/features/customStage/customStageConstants.js +2 -0
  174. package/features/customStage/exports.js +147 -0
  175. package/features/customStage/gridEntities.js +138 -0
  176. package/features/customStage/init.js +104 -0
  177. package/features/customStage/metadata.json +1 -0
  178. package/features/customStage/shadows.js +63 -0
  179. package/features/customStage/streakText.js +35 -0
  180. package/features/customStage/util.js +36 -0
  181. package/features/customStage/v.js +18 -0
  182. package/features/customStage/versusScreen.js +184 -0
  183. package/features/debugDisplay/debugDisplay.js +183 -0
  184. package/features/debugDisplay/exports.js +441 -0
  185. package/features/debugDisplay/v.d.ts +18 -0
  186. package/features/debugDisplay/v.js +61 -0
  187. package/features/deployJSONRoom.js +532 -0
  188. package/features/disableAllSound.js +63 -0
  189. package/features/disableInputs.js +130 -0
  190. package/features/extraConsoleCommands/commandsDisplay.js +236 -0
  191. package/features/extraConsoleCommands/commandsSubroutines.js +109 -0
  192. package/features/extraConsoleCommands/exports.js +53 -0
  193. package/features/extraConsoleCommands/init.js +239 -0
  194. package/features/extraConsoleCommands/listCommands.js +1081 -0
  195. package/features/extraConsoleCommands/v.js +25 -0
  196. package/features/fadeInRemover.js +51 -0
  197. package/features/fastReset.js +61 -0
  198. package/features/forgottenSwitch.js +33 -0
  199. package/features/pause.js +68 -0
  200. package/features/persistentEntities.js +120 -0
  201. package/features/playerInventory.js +89 -0
  202. package/features/ponyDetection.js +63 -0
  203. package/features/preventCollectibleRotation.js +81 -0
  204. package/features/registerHotkey.js +91 -0
  205. package/features/roomClearFrame.js +42 -0
  206. package/features/runInNFrames.js +189 -0
  207. package/features/runNextRoom.js +34 -0
  208. package/features/saveDataManager/exports.js +183 -0
  209. package/features/saveDataManager/load.js +69 -0
  210. package/features/saveDataManager/main.js +131 -0
  211. package/features/saveDataManager/maps.js +9 -0
  212. package/features/saveDataManager/merge.js +139 -0
  213. package/features/saveDataManager/save.js +43 -0
  214. package/features/saveDataManager/saveDataManagerConstants.js +4 -0
  215. package/features/saveDataManager/serializationBrand.js +12 -0
  216. package/features/sirenHelpers.js +90 -0
  217. package/features/stageHistory.js +43 -0
  218. package/features/taintedLazarusPlayers.js +92 -0
  219. package/featuresInitialized.js +16 -0
  220. package/functions/ambush.js +35 -0
  221. package/functions/array.js +423 -0
  222. package/functions/benchmark.js +28 -0
  223. package/functions/bitwise.js +74 -0
  224. package/functions/bombs.js +11 -0
  225. package/functions/boss.js +137 -0
  226. package/functions/cacheFlag.js +11 -0
  227. package/functions/cards.js +217 -0
  228. package/functions/challenges.js +9 -0
  229. package/functions/character.js +102 -0
  230. package/functions/charge.js +202 -0
  231. package/functions/chargeBar.js +44 -0
  232. package/functions/collectibleCacheFlag.js +68 -0
  233. package/functions/collectibleSet.js +108 -0
  234. package/functions/collectibleTag.js +65 -0
  235. package/functions/collectibles.js +469 -0
  236. package/functions/color.d.ts +1 -1
  237. package/functions/color.js +60 -0
  238. package/functions/debug.js +60 -0
  239. package/functions/deepCopy.js +361 -0
  240. package/functions/deepCopyTests.js +308 -0
  241. package/functions/direction.js +41 -0
  242. package/functions/doors.js +326 -0
  243. package/functions/easing.js +142 -0
  244. package/functions/eden.js +32 -0
  245. package/functions/effects.js +11 -0
  246. package/functions/entity.js +324 -0
  247. package/functions/entitySpecific.js +481 -0
  248. package/functions/entityTypes.js +6 -0
  249. package/functions/enums.js +151 -0
  250. package/functions/familiars.js +85 -0
  251. package/functions/flag.js +137 -0
  252. package/functions/flying.js +88 -0
  253. package/functions/globals.js +230 -0
  254. package/functions/gridEntity.js +488 -0
  255. package/functions/gridEntitySpecific.js +109 -0
  256. package/functions/input.js +95 -0
  257. package/functions/isaacAPIClass.js +48 -0
  258. package/functions/jsonHelpers.js +40 -0
  259. package/functions/jsonRoom.js +132 -0
  260. package/functions/kColor.d.ts +1 -1
  261. package/functions/kColor.js +63 -0
  262. package/functions/language.js +13 -0
  263. package/functions/level.js +20 -0
  264. package/functions/log.js +567 -0
  265. package/functions/map.js +45 -0
  266. package/functions/math.js +103 -0
  267. package/functions/mergeTests.js +213 -0
  268. package/functions/minimap.js +80 -0
  269. package/functions/nextStage.js +290 -0
  270. package/functions/npc.js +101 -0
  271. package/functions/pickupVariants.js +47 -0
  272. package/functions/pickups.js +219 -0
  273. package/functions/pills.js +160 -0
  274. package/functions/player.js +808 -0
  275. package/functions/playerCenter.js +50 -0
  276. package/functions/playerDataStructures.js +114 -0
  277. package/functions/playerHealth.js +321 -0
  278. package/functions/playerIndex.js +160 -0
  279. package/functions/pocketItems.js +124 -0
  280. package/functions/positionVelocity.js +136 -0
  281. package/functions/random.js +73 -0
  282. package/functions/revive.js +140 -0
  283. package/functions/rng.d.ts +1 -1
  284. package/functions/rng.js +117 -0
  285. package/functions/roomData.js +174 -0
  286. package/functions/roomGrid.js +81 -0
  287. package/functions/roomShape.js +99 -0
  288. package/functions/rooms.js +487 -0
  289. package/functions/run.js +53 -0
  290. package/functions/saveFile.js +104 -0
  291. package/functions/seeds.js +18 -0
  292. package/functions/serialization.js +52 -0
  293. package/functions/set.js +99 -0
  294. package/functions/sound.js +9 -0
  295. package/functions/spawnCollectible.js +66 -0
  296. package/functions/sprite.js +80 -0
  297. package/functions/stage.js +172 -0
  298. package/functions/string.js +37 -0
  299. package/functions/table.js +143 -0
  300. package/functions/tears.js +31 -0
  301. package/functions/transformations.js +101 -0
  302. package/functions/trinketCacheFlag.js +46 -0
  303. package/functions/trinketGive.js +121 -0
  304. package/functions/trinkets.js +169 -0
  305. package/functions/tstlClass.js +125 -0
  306. package/functions/types.js +27 -0
  307. package/functions/ui.js +124 -0
  308. package/functions/utils.js +172 -0
  309. package/functions/vector.js +68 -0
  310. package/index.js +140 -0
  311. package/initCustomCallbacks.js +133 -0
  312. package/initFeatures.js +51 -0
  313. package/interfaces/AddCallbackParameterCustom.js +2 -0
  314. package/interfaces/ChargeBarSprites.js +2 -0
  315. package/interfaces/Corner.js +2 -0
  316. package/interfaces/CustomGridEntityData.js +2 -0
  317. package/interfaces/CustomStage.js +2 -0
  318. package/interfaces/CustomStageLua.js +13 -0
  319. package/interfaces/JSONRoomsFile.js +2 -0
  320. package/interfaces/PlayerHealth.js +2 -0
  321. package/interfaces/PocketItemDescription.js +2 -0
  322. package/interfaces/SaveData.js +2 -0
  323. package/interfaces/TrinketSituation.js +2 -0
  324. package/interfaces/private/TSTLClassMetatable.js +2 -0
  325. package/maps/PHDPillConversions.js +20 -0
  326. package/maps/cardMap.js +208 -0
  327. package/maps/characterMap.js +86 -0
  328. package/maps/collectibleDescriptionMap.js +728 -0
  329. package/maps/collectibleNameMap.js +727 -0
  330. package/maps/defaultPlayerStatMap.js +14 -0
  331. package/maps/falsePHDPillConversions.js +34 -0
  332. package/maps/gridEntityTypeToBrokenStateMap.js +29 -0
  333. package/maps/gridEntityXMLMap.js +128 -0
  334. package/maps/pillEffectMap.js +88 -0
  335. package/maps/roomShapeToTopLeftWallGridIndexMap.js +14 -0
  336. package/maps/roomTypeMap.js +39 -0
  337. package/maps/trinketDescriptionMap.js +196 -0
  338. package/maps/trinketNameMap.js +195 -0
  339. package/objects/LRoomShapeToRectangles.js +33 -0
  340. package/objects/backdropTypeToRockAltType.js +66 -0
  341. package/objects/bossNamePNGFileNames.js +112 -0
  342. package/objects/bossPortraitPNGFileNames.js +115 -0
  343. package/objects/callbackRegisterFunctions.js +170 -0
  344. package/objects/cardDescriptions.js +104 -0
  345. package/objects/cardNames.js +104 -0
  346. package/objects/cardTypes.js +103 -0
  347. package/objects/challengeNames.js +51 -0
  348. package/objects/characterNames.js +46 -0
  349. package/objects/coinSubTypeToValue.js +13 -0
  350. package/objects/colors.d.ts +1 -0
  351. package/objects/colors.js +24 -0
  352. package/objects/directionNames.js +9 -0
  353. package/objects/directionToDegrees.js +9 -0
  354. package/objects/directionToVector.js +10 -0
  355. package/objects/doorSlotFlagToDoorSlot.js +13 -0
  356. package/objects/doorSlotToDirection.js +13 -0
  357. package/objects/doorSlotToDoorSlotFlag.js +13 -0
  358. package/objects/isaacAPIClassTypeToBrand.js +9 -0
  359. package/objects/isaacAPIClassTypeToCopyFunction.js +12 -0
  360. package/objects/languageNames.js +11 -0
  361. package/objects/oppositeDoorSlots.js +13 -0
  362. package/objects/pillEffectClasses.js +56 -0
  363. package/objects/pillEffectNames.js +55 -0
  364. package/objects/pillEffectTypes.js +55 -0
  365. package/objects/playerNamePNGFileNames.js +55 -0
  366. package/objects/playerPortraitPNGFileNames.js +52 -0
  367. package/objects/roomShapeBounds.js +46 -0
  368. package/objects/roomShapeCorners.js +268 -0
  369. package/objects/roomShapeLayoutSizes.js +39 -0
  370. package/objects/roomShapeToBottomRightPosition.js +22 -0
  371. package/objects/roomShapeToDoorSlotCoordinates.js +109 -0
  372. package/objects/roomShapeToDoorSlots.js +69 -0
  373. package/objects/roomShapeToDoorSlotsToGridIndexDelta.js +113 -0
  374. package/objects/roomShapeToGridWidth.js +18 -0
  375. package/objects/roomShapeToTopLeftPosition.js +23 -0
  376. package/objects/roomShapeVolumes.js +30 -0
  377. package/objects/roomTypeGotoPrefixes.js +33 -0
  378. package/objects/roomTypeNames.js +34 -0
  379. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.js +12 -0
  380. package/objects/stageTypeSuffixes.js +10 -0
  381. package/objects/stageTypeToLetter.js +12 -0
  382. package/objects/transformationNames.js +18 -0
  383. package/objects/versusScreenBackgroundColors.js +36 -0
  384. package/objects/versusScreenDirtSpotColors.js +36 -0
  385. package/package.json +1 -1
  386. package/patchErrorFunctions.js +67 -0
  387. package/sets/LRoomShapesSet.js +8 -0
  388. package/sets/bossSets.js +374 -0
  389. package/sets/charactersThatStartWithAnActiveItemSet.js +15 -0
  390. package/sets/charactersWithBlackHeartFromEternalHeartSet.js +6 -0
  391. package/sets/charactersWithFreeDevilDealsSet.js +3 -0
  392. package/sets/charactersWithNoRedHeartsSet.js +16 -0
  393. package/sets/charactersWithNoSoulHeartsSet.js +13 -0
  394. package/sets/chestPickupVariantsSet.js +16 -0
  395. package/sets/consoleCommandsSet.js +61 -0
  396. package/sets/familiarsThatShootPlayerTearsSet.js +12 -0
  397. package/sets/lostStyleCharactersSet.js +13 -0
  398. package/sets/mineShaftRoomSubTypesSet.js +9 -0
  399. package/sets/narrowRoomShapesSet.js +8 -0
  400. package/sets/redHeartSubTypesSet.js +7 -0
  401. package/sets/sinEntityTypesSet.js +11 -0
  402. package/sets/singleUseActiveCollectibleTypesSet.js +12 -0
  403. package/sets/storyBossesSet.js +17 -0
  404. package/shaderCrashFix.js +17 -0
  405. package/types/AnyEntity.js +2 -0
  406. package/types/CollectibleIndex.js +2 -0
  407. package/types/PickingUpItem.js +38 -0
  408. package/types/PlayerIndex.js +2 -0
  409. package/types/private/IsaacAPIClass.js +2 -0
  410. package/types/private/SerializedIsaacAPIClass.js +2 -0
  411. package/types/private/TSTLClass.js +2 -0
  412. package/upgradeMod.js +47 -0
@@ -0,0 +1,202 @@
1
+ import { ActiveSlot, CollectibleType, SoundEffect, TrinketType, } from "isaac-typescript-definitions";
2
+ import { game, sfxManager } from "../cachedClasses";
3
+ import { getCollectibleMaxCharges } from "./collectibles";
4
+ import { getPlayers } from "./playerIndex";
5
+ import { getRoomShapeCharges } from "./roomShape";
6
+ /**
7
+ * Helper function to add a charge to the player's active item. Will flash the HUD and play the
8
+ * appropriate sound effect, depending on whether the charge is partially full or completely full.
9
+ *
10
+ * If the player's active item is already fully charged, then this function will return 0 and not
11
+ * flash the HUD or play a sound effect.
12
+ *
13
+ * This function will take the following things into account:
14
+ * - The Battery
15
+ * - AAA Battery
16
+ *
17
+ * @param player The player to grant the charges to.
18
+ * @param activeSlot The slot to grant the charges to.
19
+ * @param numCharges Optional. The amount of charges to grant. Default is 1.
20
+ * @param playSoundEffect Optional. Whether to play a charge-related sound effect. Default is true.
21
+ * @returns The amount of charges that were actually granted. For example, if the active item was
22
+ * only one away from a full charge, but the `numCharges` provided to this function was 2,
23
+ * then this function would return 1.
24
+ */
25
+ export function addCharge(player, activeSlot, numCharges = 1, playSoundEffect = true) {
26
+ const hud = game.GetHUD();
27
+ // Ensure that there is enough space on the active item to store these amount of charges.
28
+ const chargesToAdd = getClampedChargesToAdd(player, activeSlot, numCharges);
29
+ // The AAA Battery trinket might grant an additional charge.
30
+ const modifiedChargesToAdd = getChargesToAddWithAAAModifier(player, activeSlot, chargesToAdd);
31
+ const totalCharge = getTotalCharge(player, activeSlot);
32
+ const newCharge = totalCharge + modifiedChargesToAdd;
33
+ if (newCharge === totalCharge) {
34
+ return 0;
35
+ }
36
+ player.SetActiveCharge(newCharge, activeSlot);
37
+ hud.FlashChargeBar(player, activeSlot);
38
+ if (playSoundEffect) {
39
+ playChargeSoundEffect(player, activeSlot);
40
+ }
41
+ return modifiedChargesToAdd;
42
+ }
43
+ /**
44
+ * Helper function to add a charge to a player's active item(s), emulating what happens when a room
45
+ * is cleared.
46
+ *
47
+ * This function will take the following things into account:
48
+ * - 2x2 rooms and L rooms granting a double charge
49
+ * - The Battery
50
+ * - AAA Battery
51
+ *
52
+ * @param player The player to grant the charges to.
53
+ * @param bigRoomDoubleCharge Optional. If set to false, it will treat the current room as a 1x1
54
+ * room for the purposes of calculating how much charge to grant. Default
55
+ * is true.
56
+ * @param playSoundEffect Optional. Whether to play a charge-related sound effect. Default is true.
57
+ */
58
+ export function addRoomClearCharge(player, bigRoomDoubleCharge = true, playSoundEffect = true) {
59
+ for (const activeSlot of [
60
+ ActiveSlot.PRIMARY,
61
+ ActiveSlot.SECONDARY,
62
+ ActiveSlot.POCKET,
63
+ ]) {
64
+ addRoomClearChargeToSlot(player, activeSlot, bigRoomDoubleCharge, playSoundEffect);
65
+ }
66
+ }
67
+ /**
68
+ * Helper function to add a charge to one of a player's active items, emulating what happens when a
69
+ * room is cleared.
70
+ *
71
+ * This function will take the following things into account:
72
+ * - L rooms and 2x2 rooms granting a double charge
73
+ * - The Battery
74
+ * - AAA Battery
75
+ *
76
+ * @param player The player to grant the charges to.
77
+ * @param activeSlot The active item slot to grant the charges to.
78
+ * @param bigRoomDoubleCharge Optional. If set to false, it will treat the current room as a 1x1
79
+ * room for the purposes of calculating how much charge to grant. Default
80
+ * is true.
81
+ * @param playSoundEffect Optional. Whether to play a charge-related sound effect. Default is true.
82
+ */
83
+ export function addRoomClearChargeToSlot(player, activeSlot, bigRoomDoubleCharge = true, playSoundEffect = true) {
84
+ const room = game.GetRoom();
85
+ const roomShape = room.GetRoomShape();
86
+ const numCharges = bigRoomDoubleCharge ? getRoomShapeCharges(roomShape) : 1;
87
+ addCharge(player, activeSlot, numCharges, playSoundEffect);
88
+ }
89
+ /**
90
+ * We don't want to add more charges than is normally possible, so we must check to see if the
91
+ * player can hold the specified amount of charges in the given slot.
92
+ */
93
+ function getClampedChargesToAdd(player, activeSlot, numCharges) {
94
+ const activeItem = player.GetActiveItem(activeSlot);
95
+ const activeCharge = player.GetActiveCharge(activeSlot);
96
+ const batteryCharge = player.GetBatteryCharge(activeSlot);
97
+ const hasBattery = player.HasCollectible(CollectibleType.BATTERY);
98
+ const maxCharges = getCollectibleMaxCharges(activeItem);
99
+ if (!hasBattery && activeCharge === maxCharges) {
100
+ return 0;
101
+ }
102
+ if (hasBattery && batteryCharge === maxCharges) {
103
+ return 0;
104
+ }
105
+ if (!hasBattery && activeCharge + 1 === maxCharges) {
106
+ // We are only 1 charge away from a full charge, so only add one charge to avoid an overcharge.
107
+ // (It is possible to set orange charges without the player actually having The Battery.)
108
+ return 1;
109
+ }
110
+ if (hasBattery && batteryCharge + 1 === maxCharges) {
111
+ // We are only 1 charge away from a full double-charge, so only add one charge to avoid an
112
+ // overcharge.
113
+ return 1;
114
+ }
115
+ return numCharges;
116
+ }
117
+ /**
118
+ * The AAA Battery should grant an extra charge when the active item is one away from being fully
119
+ * charged.
120
+ */
121
+ function getChargesToAddWithAAAModifier(player, activeSlot, chargesToAdd) {
122
+ const activeItem = player.GetActiveItem(activeSlot);
123
+ const activeCharge = player.GetActiveCharge(activeSlot);
124
+ const batteryCharge = player.GetBatteryCharge(activeSlot);
125
+ const hasBattery = player.HasCollectible(CollectibleType.BATTERY);
126
+ const hasAAABattery = player.HasTrinket(TrinketType.AAA_BATTERY);
127
+ const maxCharges = getCollectibleMaxCharges(activeItem);
128
+ if (!hasAAABattery) {
129
+ return chargesToAdd;
130
+ }
131
+ if (!hasBattery && activeCharge + chargesToAdd === maxCharges - 1) {
132
+ return chargesToAdd + 1;
133
+ }
134
+ if (hasBattery && batteryCharge + chargesToAdd === maxCharges - 1) {
135
+ return chargesToAdd + 1;
136
+ }
137
+ return chargesToAdd;
138
+ }
139
+ /**
140
+ * Helper function to add a charge to every player's active item, emulating what happens when a room
141
+ * is cleared.
142
+ *
143
+ * This function will take the following things into account:
144
+ * - L rooms and 2x2 rooms granting a double charge
145
+ * - The Battery
146
+ * - AAA Battery
147
+ *
148
+ * @param ignoreBigRoomDoubleCharge Optional. If set to true, it will treat the current room as a
149
+ * 1x1 room for the purposes of calculating how much charge to
150
+ * grant. Default is false.
151
+ */
152
+ export function addRoomClearCharges(ignoreBigRoomDoubleCharge = false) {
153
+ for (const player of getPlayers()) {
154
+ addRoomClearCharge(player, ignoreBigRoomDoubleCharge);
155
+ }
156
+ }
157
+ /**
158
+ * Helper function to get the combined normal charge and the battery charge for the player's active
159
+ * item. This is useful because you have to add these two values together when setting the active
160
+ * charge.
161
+ */
162
+ export function getTotalCharge(player, activeSlot) {
163
+ const activeCharge = player.GetActiveCharge(activeSlot);
164
+ const batteryCharge = player.GetBatteryCharge(activeSlot);
165
+ return activeCharge + batteryCharge;
166
+ }
167
+ export function isActiveSlotDoubleCharged(player, activeSlot) {
168
+ const collectibleType = player.GetActiveItem(activeSlot);
169
+ const batteryCharge = player.GetBatteryCharge(activeSlot);
170
+ const maxCharges = getCollectibleMaxCharges(collectibleType);
171
+ return batteryCharge >= maxCharges;
172
+ }
173
+ export function playChargeSoundEffect(player, activeSlot) {
174
+ for (const soundEffect of [
175
+ SoundEffect.BATTERY_CHARGE,
176
+ SoundEffect.BEEP, // 171
177
+ ]) {
178
+ sfxManager.Stop(soundEffect);
179
+ }
180
+ const chargeSoundEffect = shouldPlayFullRechargeSound(player, activeSlot)
181
+ ? SoundEffect.BATTERY_CHARGE
182
+ : SoundEffect.BEEP;
183
+ sfxManager.Play(chargeSoundEffect);
184
+ }
185
+ function shouldPlayFullRechargeSound(player, activeSlot) {
186
+ const activeItem = player.GetActiveItem(activeSlot);
187
+ const activeCharge = player.GetActiveCharge(activeSlot);
188
+ const batteryCharge = player.GetBatteryCharge(activeSlot);
189
+ const hasBattery = player.HasCollectible(CollectibleType.BATTERY);
190
+ const maxCharges = getCollectibleMaxCharges(activeItem);
191
+ // If we do not have The Battery, play the full recharge sound if we are now fully charged.
192
+ if (!hasBattery) {
193
+ // We cannot use the `EntityPlayer.NeedsCharge` method because it does not work properly for
194
+ // items with `chargetype="special"`.
195
+ return activeCharge === maxCharges;
196
+ }
197
+ // If we do have The Battery, play the full recharge sound if we are exactly double charged or
198
+ // exactly single charged.
199
+ return (batteryCharge === maxCharges ||
200
+ (activeCharge === maxCharges && batteryCharge === 0));
201
+ }
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvY2hhcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEdBQ1osTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUN2QixNQUFvQixFQUNwQixVQUFzQixFQUN0QixVQUFVLEdBQUcsQ0FBQyxFQUNkLGVBQWUsR0FBRyxJQUFJO0lBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUUxQix5RkFBeUY7SUFDekYsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUU1RSw0REFBNEQ7SUFDNUQsTUFBTSxvQkFBb0IsR0FBRyw4QkFBOEIsQ0FDekQsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLENBQ2IsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHLG9CQUFvQixDQUFDO0lBQ3JELElBQUksU0FBUyxLQUFLLFdBQVcsRUFBRTtRQUM3QixPQUFPLENBQUMsQ0FBQztLQUNWO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFdkMsSUFBSSxlQUFlLEVBQUU7UUFDbkIscUJBQXFCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQzNDO0lBRUQsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE1BQW9CLEVBQ3BCLG1CQUFtQixHQUFHLElBQUksRUFDMUIsZUFBZSxHQUFHLElBQUk7SUFFdEIsS0FBSyxNQUFNLFVBQVUsSUFBSTtRQUN2QixVQUFVLENBQUMsT0FBTztRQUNsQixVQUFVLENBQUMsU0FBUztRQUNwQixVQUFVLENBQUMsTUFBTTtLQUNsQixFQUFFO1FBQ0Qsd0JBQXdCLENBQ3RCLE1BQU0sRUFDTixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGVBQWUsQ0FDaEIsQ0FBQztLQUNIO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsTUFBb0IsRUFDcEIsVUFBc0IsRUFDdEIsbUJBQW1CLEdBQUcsSUFBSSxFQUMxQixlQUFlLEdBQUcsSUFBSTtJQUV0QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXRDLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FDN0IsTUFBb0IsRUFDcEIsVUFBc0IsRUFDdEIsVUFBZTtJQUVmLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4RCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFeEQsSUFBSSxDQUFDLFVBQVUsSUFBSSxZQUFZLEtBQUssVUFBVSxFQUFFO1FBQzlDLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFFRCxJQUFJLFVBQVUsSUFBSSxhQUFhLEtBQUssVUFBVSxFQUFFO1FBQzlDLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFFRCxJQUFJLENBQUMsVUFBVSxJQUFJLFlBQVksR0FBRyxDQUFDLEtBQUssVUFBVSxFQUFFO1FBQ2xELCtGQUErRjtRQUMvRix5RkFBeUY7UUFDekYsT0FBTyxDQUFDLENBQUM7S0FDVjtJQUVELElBQUksVUFBVSxJQUFJLGFBQWEsR0FBRyxDQUFDLEtBQUssVUFBVSxFQUFFO1FBQ2xELDBGQUEwRjtRQUMxRixjQUFjO1FBQ2QsT0FBTyxDQUFDLENBQUM7S0FDVjtJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLDhCQUE4QixDQUNyQyxNQUFvQixFQUNwQixVQUFzQixFQUN0QixZQUFpQjtJQUVqQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXhELElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDbEIsT0FBTyxZQUFZLENBQUM7S0FDckI7SUFFRCxJQUFJLENBQUMsVUFBVSxJQUFJLFlBQVksR0FBRyxZQUFZLEtBQUssVUFBVSxHQUFHLENBQUMsRUFBRTtRQUNqRSxPQUFPLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDekI7SUFFRCxJQUFJLFVBQVUsSUFBSSxhQUFhLEdBQUcsWUFBWSxLQUFLLFVBQVUsR0FBRyxDQUFDLEVBQUU7UUFDakUsT0FBTyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyx5QkFBeUIsR0FBRyxLQUFLO0lBQ25FLEtBQUssTUFBTSxNQUFNLElBQUksVUFBVSxFQUFFLEVBQUU7UUFDakMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLENBQUM7S0FDdkQ7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLE1BQW9CLEVBQ3BCLFVBQXNCO0lBRXRCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTFELE9BQU8sWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxNQUFvQixFQUNwQixVQUFzQjtJQUV0QixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUU3RCxPQUFPLGFBQWEsSUFBSSxVQUFVLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsTUFBb0IsRUFDcEIsVUFBc0I7SUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSTtRQUN4QixXQUFXLENBQUMsY0FBYztRQUMxQixXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU07S0FDekIsRUFBRTtRQUNELFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDOUI7SUFFRCxNQUFNLGlCQUFpQixHQUFHLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7UUFDdkUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxjQUFjO1FBQzVCLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQ3JCLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsTUFBb0IsRUFDcEIsVUFBc0I7SUFFdEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRSxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4RCwyRkFBMkY7SUFDM0YsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNmLDRGQUE0RjtRQUM1RixxQ0FBcUM7UUFDckMsT0FBTyxZQUFZLEtBQUssVUFBVSxDQUFDO0tBQ3BDO0lBRUQsOEZBQThGO0lBQzlGLDBCQUEwQjtJQUMxQixPQUFPLENBQ0wsYUFBYSxLQUFLLFVBQVU7UUFDNUIsQ0FBQyxZQUFZLEtBQUssVUFBVSxJQUFJLGFBQWEsS0FBSyxDQUFDLENBQUMsQ0FDckQsQ0FBQztBQUNKLENBQUMifQ==
@@ -0,0 +1,44 @@
1
+ const CHARGE_BAR_ANM2 = "gfx/ui/ui_chargebar.anm2";
2
+ /**
3
+ * Constructor for a `ChargeBarSprites` object. For more information, see the `renderChargeBar`
4
+ * helper function.
5
+ */
6
+ export function newChargeBarSprites(maxCharges) {
7
+ const back = Sprite();
8
+ back.Load(CHARGE_BAR_ANM2, true);
9
+ back.Play("BarEmpty", true);
10
+ const meter = Sprite();
11
+ meter.Load(CHARGE_BAR_ANM2, true);
12
+ meter.Play("BarFull", true);
13
+ const meterBattery = Sprite();
14
+ meterBattery.Load(CHARGE_BAR_ANM2, true);
15
+ meterBattery.Play("BarFull", true);
16
+ const lines = Sprite();
17
+ lines.Load(CHARGE_BAR_ANM2, true);
18
+ lines.Play(`BarOverlay${maxCharges}`, true);
19
+ return {
20
+ back,
21
+ meter,
22
+ meterBattery,
23
+ lines,
24
+ maxCharges,
25
+ };
26
+ }
27
+ /**
28
+ * Helper function to render a charge bar on the screen. First, call the `newChargeBarSprites`
29
+ * function to initialize the sprites, and then call this function on every render frame.
30
+ */
31
+ export function renderChargeBar(sprites, position, normalCharges, batteryCharges) {
32
+ sprites.back.Render(position);
33
+ const normalChargesClamp = getChargeBarClamp(normalCharges, sprites.maxCharges);
34
+ sprites.meter.Render(position, normalChargesClamp);
35
+ const batteryChargesClamp = getChargeBarClamp(batteryCharges, sprites.maxCharges);
36
+ sprites.meterBattery.Render(position, batteryChargesClamp);
37
+ sprites.lines.Render(position);
38
+ }
39
+ function getChargeBarClamp(charges, maxCharges) {
40
+ const meterMultiplier = 24 / maxCharges;
41
+ const meterClip = 26 - charges * meterMultiplier;
42
+ return Vector(0, meterClip);
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmdlQmFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvY2hhcmdlQmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sZUFBZSxHQUFHLDBCQUEwQixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFlO0lBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTVCLE1BQU0sWUFBWSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRW5DLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUU1QyxPQUFPO1FBQ0wsSUFBSTtRQUNKLEtBQUs7UUFDTCxZQUFZO1FBQ1osS0FBSztRQUNMLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQXlCLEVBQ3pCLFFBQWdCLEVBQ2hCLGFBQWtCLEVBQ2xCLGNBQW1CO0lBRW5CLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQzFDLGFBQWEsRUFDYixPQUFPLENBQUMsVUFBVSxDQUNuQixDQUFDO0lBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFbkQsTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FDM0MsY0FBYyxFQUNkLE9BQU8sQ0FBQyxVQUFVLENBQ25CLENBQUM7SUFDRixPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUUzRCxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxPQUFZLEVBQUUsVUFBZTtJQUN0RCxNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDO0lBQ3hDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUcsZUFBZSxDQUFDO0lBQ2pELE9BQU8sTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM5QixDQUFDIn0=
@@ -0,0 +1,68 @@
1
+ import { CacheFlag } from "isaac-typescript-definitions";
2
+ import { itemConfig } from "../cachedClasses";
3
+ import { getCollectibleArray } from "./collectibleSet";
4
+ import { getEnumValues } from "./enums";
5
+ import { hasFlag } from "./flag";
6
+ import { copySet, getSortedSetValues } from "./set";
7
+ import { repeat } from "./utils";
8
+ const CACHE_FLAG_TO_COLLECTIBLES_MAP = new Map();
9
+ function initCacheFlagMap() {
10
+ for (const cacheFlag of getEnumValues(CacheFlag)) {
11
+ const collectiblesSet = new Set();
12
+ for (const collectibleType of getCollectibleArray()) {
13
+ if (collectibleHasCacheFlag(collectibleType, cacheFlag)) {
14
+ collectiblesSet.add(collectibleType);
15
+ }
16
+ }
17
+ CACHE_FLAG_TO_COLLECTIBLES_MAP.set(cacheFlag, collectiblesSet);
18
+ }
19
+ }
20
+ export function collectibleHasCacheFlag(collectibleType, cacheFlag) {
21
+ const itemConfigItem = itemConfig.GetCollectible(collectibleType);
22
+ if (itemConfigItem === undefined) {
23
+ return false;
24
+ }
25
+ return hasFlag(itemConfigItem.CacheFlags, cacheFlag);
26
+ }
27
+ /**
28
+ * Returns a set containing every collectible type with the given cache flag, including modded
29
+ * collectibles.
30
+ */
31
+ export function getCollectiblesForCacheFlag(cacheFlag) {
32
+ // Lazy initialize the map.
33
+ if (CACHE_FLAG_TO_COLLECTIBLES_MAP.size === 0) {
34
+ initCacheFlagMap();
35
+ }
36
+ const collectiblesSet = CACHE_FLAG_TO_COLLECTIBLES_MAP.get(cacheFlag);
37
+ if (collectiblesSet === undefined) {
38
+ return new Set();
39
+ }
40
+ return copySet(collectiblesSet);
41
+ }
42
+ /**
43
+ * Returns an array containing every collectible type that the player has that matches the provided
44
+ * CacheFlag.
45
+ *
46
+ * For example, if the cache flag is `CacheFlag.FLYING`, and the player has one Lord of the Pit and
47
+ * two Dead Doves, then this function would return:
48
+ *
49
+ * ```ts
50
+ * [
51
+ * CollectibleType.LORD_OF_THE_PIT,
52
+ * CollectibleType.DEAD_DOVE,
53
+ * CollectibleType.DEAD_DOVE,
54
+ * ]
55
+ * ```
56
+ */
57
+ export function getPlayerCollectiblesForCacheFlag(player, cacheFlag) {
58
+ const collectiblesForCacheFlag = getCollectiblesForCacheFlag(cacheFlag);
59
+ const playerCollectibles = [];
60
+ for (const collectibleType of getSortedSetValues(collectiblesForCacheFlag)) {
61
+ const numCollectibles = player.GetCollectibleNum(collectibleType);
62
+ repeat(numCollectibles, () => {
63
+ playerCollectibles.push(collectibleType);
64
+ });
65
+ }
66
+ return playerCollectibles;
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlibGVDYWNoZUZsYWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9jb2xsZWN0aWJsZUNhY2hlRmxhZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxHQUFHLEVBRzNDLENBQUM7QUFFSixTQUFTLGdCQUFnQjtJQUN2QixLQUFLLE1BQU0sU0FBUyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNoRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztRQUVuRCxLQUFLLE1BQU0sZUFBZSxJQUFJLG1CQUFtQixFQUFFLEVBQUU7WUFDbkQsSUFBSSx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQ3ZELGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDdEM7U0FDRjtRQUVELDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7S0FDaEU7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxlQUFnQyxFQUNoQyxTQUFvQjtJQUVwQixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xFLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtRQUNoQyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxTQUFvQjtJQUVwQiwyQkFBMkI7SUFDM0IsSUFBSSw4QkFBOEIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQzdDLGdCQUFnQixFQUFFLENBQUM7S0FDcEI7SUFFRCxNQUFNLGVBQWUsR0FBRyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEUsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO1FBQ2pDLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQztLQUNsQjtJQUVELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsTUFBb0IsRUFDcEIsU0FBb0I7SUFFcEIsTUFBTSx3QkFBd0IsR0FBRywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV4RSxNQUFNLGtCQUFrQixHQUFzQixFQUFFLENBQUM7SUFDakQsS0FBSyxNQUFNLGVBQWUsSUFBSSxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1FBQzFFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUMzQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sa0JBQWtCLENBQUM7QUFDNUIsQ0FBQyJ9
@@ -0,0 +1,108 @@
1
+ import { itemConfig } from "../cachedClasses";
2
+ import { FIRST_COLLECTIBLE_TYPE, LAST_COLLECTIBLE_TYPE, LAST_VANILLA_COLLECTIBLE_TYPE, } from "../constantsFirstLast";
3
+ import { irange } from "./utils";
4
+ const ALL_COLLECTIBLES_ARRAY = [];
5
+ const VANILLA_COLLECTIBLES_ARRAY = [];
6
+ const MODDED_COLLECTIBLES_ARRAY = [];
7
+ const ALL_COLLECTIBLES_SET = new Set();
8
+ const VANILLA_COLLECTIBLES_SET = new Set();
9
+ const MODDED_COLLECTIBLES_SET = new Set();
10
+ function initCollectibleArraysAndSets() {
11
+ if (ALL_COLLECTIBLES_ARRAY.length !== 0) {
12
+ return;
13
+ }
14
+ const collectibleTypeRange = irange(FIRST_COLLECTIBLE_TYPE, LAST_COLLECTIBLE_TYPE);
15
+ for (const collectibleType of collectibleTypeRange) {
16
+ const itemConfigItem = itemConfig.GetCollectible(collectibleType);
17
+ if (itemConfigItem === undefined) {
18
+ continue;
19
+ }
20
+ ALL_COLLECTIBLES_ARRAY.push(collectibleType);
21
+ if (collectibleType <= LAST_VANILLA_COLLECTIBLE_TYPE) {
22
+ VANILLA_COLLECTIBLES_ARRAY.push(collectibleType);
23
+ }
24
+ else {
25
+ MODDED_COLLECTIBLES_ARRAY.push(collectibleType);
26
+ }
27
+ }
28
+ ALL_COLLECTIBLES_ARRAY.sort();
29
+ VANILLA_COLLECTIBLES_ARRAY.sort();
30
+ MODDED_COLLECTIBLES_ARRAY.sort();
31
+ for (const collectibleType of ALL_COLLECTIBLES_ARRAY) {
32
+ ALL_COLLECTIBLES_SET.add(collectibleType);
33
+ }
34
+ for (const collectibleType of VANILLA_COLLECTIBLES_ARRAY) {
35
+ VANILLA_COLLECTIBLES_SET.add(collectibleType);
36
+ }
37
+ for (const collectibleType of MODDED_COLLECTIBLES_ARRAY) {
38
+ MODDED_COLLECTIBLES_SET.add(collectibleType);
39
+ }
40
+ }
41
+ /**
42
+ * Returns an array containing every valid collectible type in the game, including modded
43
+ * collectibles.
44
+ *
45
+ * Use this if you need to iterate over the collectibles in order. If you need to do O(1) lookups,
46
+ * then use the `getCollectibleArray` helper function instead.
47
+ */
48
+ export function getCollectibleArray() {
49
+ // Lazy initialize the arrays/sets.
50
+ initCollectibleArraysAndSets();
51
+ return ALL_COLLECTIBLES_ARRAY;
52
+ }
53
+ /**
54
+ * Returns a set containing every valid collectible type in the game, including modded collectibles.
55
+ *
56
+ * Use this if you need to do O(1) lookups. If you need to iterate over the collectibles in order,
57
+ * then use the `getCollectibleArray` helper function instead.
58
+ */
59
+ export function getCollectibleSet() {
60
+ // Lazy initialize the arrays/sets.
61
+ initCollectibleArraysAndSets();
62
+ return ALL_COLLECTIBLES_SET;
63
+ }
64
+ /**
65
+ * Returns an array containing every modded collectible type in the game.
66
+ *
67
+ * Use this if you need to iterate over the collectibles in order. If you need to do O(1) lookups,
68
+ * then use the `getModdedCollectibleSet` helper function instead.
69
+ */
70
+ export function getModdedCollectibleArray() {
71
+ // Lazy initialize the arrays/sets.
72
+ initCollectibleArraysAndSets();
73
+ return MODDED_COLLECTIBLES_ARRAY;
74
+ }
75
+ /**
76
+ * Returns a set containing every modded collectible type in the game.
77
+ *
78
+ * Use this if you need to do O(1) lookups. If you need to iterate over the collectibles in order,
79
+ * then use the `getModdedCollectibleArray` helper function instead.
80
+ */
81
+ export function getModdedCollectibleSet() {
82
+ // Lazy initialize the arrays/sets.
83
+ initCollectibleArraysAndSets();
84
+ return MODDED_COLLECTIBLES_SET;
85
+ }
86
+ /**
87
+ * Returns an array containing every valid vanilla collectible type in the game.
88
+ *
89
+ * Use this if you need to iterate over the collectibles in order. If you need to do O(1) lookups,
90
+ * then use the `getVanillaCollectibleSet` helper function instead.
91
+ */
92
+ export function getVanillaCollectibleArray() {
93
+ // Lazy initialize the arrays/sets.
94
+ initCollectibleArraysAndSets();
95
+ return VANILLA_COLLECTIBLES_ARRAY;
96
+ }
97
+ /**
98
+ * Returns a set containing every valid vanilla collectible type in the game.
99
+ *
100
+ * Use this if you need to do O(1) lookups. If you need to iterate over the collectibles in order,
101
+ * then use the `getVanillaCollectibleArray` helper function instead.
102
+ */
103
+ export function getVanillaCollectibleSet() {
104
+ // Lazy initialize the arrays/sets.
105
+ initCollectibleArraysAndSets();
106
+ return VANILLA_COLLECTIBLES_SET;
107
+ }
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlibGVTZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9jb2xsZWN0aWJsZVNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsNkJBQTZCLEdBQzlCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQyxNQUFNLHNCQUFzQixHQUFzQixFQUFFLENBQUM7QUFDckQsTUFBTSwwQkFBMEIsR0FBc0IsRUFBRSxDQUFDO0FBQ3pELE1BQU0seUJBQXlCLEdBQXNCLEVBQUUsQ0FBQztBQUV4RCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7QUFDNUQsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUUzRCxTQUFTLDRCQUE0QjtJQUNuQyxJQUFJLHNCQUFzQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsT0FBTztLQUNSO0lBRUQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQ2pDLHNCQUFzQixFQUN0QixxQkFBcUIsQ0FDRCxDQUFDO0lBQ3ZCLEtBQUssTUFBTSxlQUFlLElBQUksb0JBQW9CLEVBQUU7UUFDbEQsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRSxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsU0FBUztTQUNWO1FBRUQsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLElBQUksZUFBZSxJQUFJLDZCQUE2QixFQUFFO1lBQ3BELDBCQUEwQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0wseUJBQXlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2pEO0tBQ0Y7SUFFRCxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QiwwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVqQyxLQUFLLE1BQU0sZUFBZSxJQUFJLHNCQUFzQixFQUFFO1FBQ3BELG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUMzQztJQUNELEtBQUssTUFBTSxlQUFlLElBQUksMEJBQTBCLEVBQUU7UUFDeEQsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBQy9DO0lBQ0QsS0FBSyxNQUFNLGVBQWUsSUFBSSx5QkFBeUIsRUFBRTtRQUN2RCx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDOUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyxtQ0FBbUM7SUFDbkMsNEJBQTRCLEVBQUUsQ0FBQztJQUUvQixPQUFPLHNCQUFzQixDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsbUNBQW1DO0lBQ25DLDRCQUE0QixFQUFFLENBQUM7SUFFL0IsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCO0lBQ3ZDLG1DQUFtQztJQUNuQyw0QkFBNEIsRUFBRSxDQUFDO0lBRS9CLE9BQU8seUJBQXlCLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QjtJQUNyQyxtQ0FBbUM7SUFDbkMsNEJBQTRCLEVBQUUsQ0FBQztJQUUvQixPQUFPLHVCQUF1QixDQUFDO0FBQ2pDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsbUNBQW1DO0lBQ25DLDRCQUE0QixFQUFFLENBQUM7SUFFL0IsT0FBTywwQkFBMEIsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLG1DQUFtQztJQUNuQyw0QkFBNEIsRUFBRSxDQUFDO0lBRS9CLE9BQU8sd0JBQXdCLENBQUM7QUFDbEMsQ0FBQyJ9
@@ -0,0 +1,65 @@
1
+ import { ItemConfigTag } from "isaac-typescript-definitions";
2
+ import { itemConfig } from "../cachedClasses";
3
+ import { getCollectibleArray } from "./collectibleSet";
4
+ import { getEnumValues } from "./enums";
5
+ import { getFlagName } from "./flag";
6
+ import { getPlayerCollectibleCount } from "./player";
7
+ import { copySet } from "./set";
8
+ const TAG_TO_COLLECTIBLE_TYPES_MAP = new Map();
9
+ function initTagMap() {
10
+ // The tag to collectible types map should be valid for every tag, so we initialize it with empty
11
+ // sets.
12
+ for (const itemConfigTag of getEnumValues(ItemConfigTag)) {
13
+ TAG_TO_COLLECTIBLE_TYPES_MAP.set(itemConfigTag, new Set());
14
+ }
15
+ for (const collectibleType of getCollectibleArray()) {
16
+ for (const itemConfigTag of getEnumValues(ItemConfigTag)) {
17
+ if (!collectibleHasTag(collectibleType, itemConfigTag)) {
18
+ continue;
19
+ }
20
+ const collectibleTypesSet = TAG_TO_COLLECTIBLE_TYPES_MAP.get(itemConfigTag);
21
+ if (collectibleTypesSet === undefined) {
22
+ const flagName = getFlagName(itemConfigTag, ItemConfigTag);
23
+ error(`Failed to get the collectible types for item tag: ${flagName}`);
24
+ }
25
+ collectibleTypesSet.add(collectibleType);
26
+ }
27
+ }
28
+ }
29
+ export function collectibleHasTag(collectibleType, tag) {
30
+ const itemConfigItem = itemConfig.GetCollectible(collectibleType);
31
+ if (itemConfigItem === undefined) {
32
+ return false;
33
+ }
34
+ return itemConfigItem.HasTags(tag);
35
+ }
36
+ /**
37
+ * Helper function to get all of the collectible types in the game that have a certain tag.
38
+ *
39
+ * For example, to get all of the collectible types that count as offensive for the purposes of
40
+ * Tainted Lost:
41
+ *
42
+ * ```ts
43
+ * const offensiveCollectibleTypes = getCollectibleTypesWithTag(ItemConfigTag.OFFENSIVE);
44
+ * ```
45
+ */
46
+ export function getCollectibleTypesWithTag(itemConfigTag) {
47
+ // Lazy initialize the map.
48
+ if (TAG_TO_COLLECTIBLE_TYPES_MAP.size === 0) {
49
+ initTagMap();
50
+ }
51
+ const collectibleTypes = TAG_TO_COLLECTIBLE_TYPES_MAP.get(itemConfigTag);
52
+ if (collectibleTypes === undefined) {
53
+ error(`The item config tag of ${itemConfigTag} is not a valid value of the ItemConfigTag enum.`);
54
+ }
55
+ return copySet(collectibleTypes);
56
+ }
57
+ /** Returns the number of items that a player has towards a particular transformation. */
58
+ export function getPlayerNumCollectiblesWithTag(player, itemConfigTag) {
59
+ const collectibleTypesSet = getCollectibleTypesWithTag(itemConfigTag);
60
+ return getPlayerCollectibleCount(player, ...collectibleTypesSet.values());
61
+ }
62
+ export function isQuestCollectible(collectibleType) {
63
+ return collectibleHasTag(collectibleType, ItemConfigTag.QUEST);
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlibGVUYWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9jb2xsZWN0aWJsZVRhZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1CLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFaEMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsRUFHekMsQ0FBQztBQUVKLFNBQVMsVUFBVTtJQUNqQixpR0FBaUc7SUFDakcsUUFBUTtJQUNSLEtBQUssTUFBTSxhQUFhLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ3hELDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzVEO0lBRUQsS0FBSyxNQUFNLGVBQWUsSUFBSSxtQkFBbUIsRUFBRSxFQUFFO1FBQ25ELEtBQUssTUFBTSxhQUFhLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLEVBQUU7Z0JBQ3RELFNBQVM7YUFDVjtZQUVELE1BQU0sbUJBQW1CLEdBQ3ZCLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsRCxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtnQkFDckMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDM0QsS0FBSyxDQUFDLHFEQUFxRCxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQ3hFO1lBQ0QsbUJBQW1CLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzFDO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixlQUFnQyxFQUNoQyxHQUFrQjtJQUVsQixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xFLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtRQUNoQyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLGFBQTRCO0lBRTVCLDJCQUEyQjtJQUMzQixJQUFJLDRCQUE0QixDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDM0MsVUFBVSxFQUFFLENBQUM7S0FDZDtJQUVELE1BQU0sZ0JBQWdCLEdBQUcsNEJBQTRCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pFLElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1FBQ2xDLEtBQUssQ0FDSCwwQkFBMEIsYUFBYSxrREFBa0QsQ0FDMUYsQ0FBQztLQUNIO0lBRUQsT0FBTyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQseUZBQXlGO0FBQ3pGLE1BQU0sVUFBVSwrQkFBK0IsQ0FDN0MsTUFBb0IsRUFDcEIsYUFBNEI7SUFFNUIsTUFBTSxtQkFBbUIsR0FBRywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RSxPQUFPLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxlQUFnQztJQUNqRSxPQUFPLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakUsQ0FBQyJ9