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,10 @@
1
+ export var PocketItemType;
2
+ (function (PocketItemType) {
3
+ PocketItemType[PocketItemType["EMPTY"] = 0] = "EMPTY";
4
+ PocketItemType[PocketItemType["CARD"] = 1] = "CARD";
5
+ PocketItemType[PocketItemType["PILL"] = 2] = "PILL";
6
+ PocketItemType[PocketItemType["ACTIVE_ITEM"] = 3] = "ACTIVE_ITEM";
7
+ PocketItemType[PocketItemType["DICE_BAG_DICE"] = 4] = "DICE_BAG_DICE";
8
+ PocketItemType[PocketItemType["UNDETERMINABLE"] = 5] = "UNDETERMINABLE";
9
+ })(PocketItemType || (PocketItemType = {}));
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ja2V0SXRlbVR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2VudW1zL1BvY2tldEl0ZW1UeXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGNBT1g7QUFQRCxXQUFZLGNBQWM7SUFDeEIscURBQUssQ0FBQTtJQUNMLG1EQUFJLENBQUE7SUFDSixtREFBSSxDQUFBO0lBQ0osaUVBQVcsQ0FBQTtJQUNYLHFFQUFhLENBQUE7SUFDYix1RUFBYyxDQUFBO0FBQ2hCLENBQUMsRUFQVyxjQUFjLEtBQWQsY0FBYyxRQU96QiJ9
@@ -0,0 +1,9 @@
1
+ export var RockAltType;
2
+ (function (RockAltType) {
3
+ RockAltType[RockAltType["URN"] = 0] = "URN";
4
+ RockAltType[RockAltType["MUSHROOM"] = 1] = "MUSHROOM";
5
+ RockAltType[RockAltType["SKULL"] = 2] = "SKULL";
6
+ RockAltType[RockAltType["POLYP"] = 3] = "POLYP";
7
+ RockAltType[RockAltType["BUCKET"] = 4] = "BUCKET";
8
+ })(RockAltType || (RockAltType = {}));
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm9ja0FsdFR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2VudW1zL1JvY2tBbHRUeXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLFdBTVg7QUFORCxXQUFZLFdBQVc7SUFDckIsMkNBQUcsQ0FBQTtJQUNILHFEQUFRLENBQUE7SUFDUiwrQ0FBSyxDQUFBO0lBQ0wsK0NBQUssQ0FBQTtJQUNMLGlEQUFNLENBQUE7QUFDUixDQUFDLEVBTlcsV0FBVyxLQUFYLFdBQVcsUUFNdEIifQ==
@@ -0,0 +1,7 @@
1
+ export var SerializationType;
2
+ (function (SerializationType) {
3
+ SerializationType[SerializationType["NONE"] = 0] = "NONE";
4
+ SerializationType[SerializationType["SERIALIZE"] = 1] = "SERIALIZE";
5
+ SerializationType[SerializationType["DESERIALIZE"] = 2] = "DESERIALIZE";
6
+ })(SerializationType || (SerializationType = {}));
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VyaWFsaXphdGlvblR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2VudW1zL1NlcmlhbGl6YXRpb25UeXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGlCQUlYO0FBSkQsV0FBWSxpQkFBaUI7SUFDM0IseURBQUksQ0FBQTtJQUNKLG1FQUFTLENBQUE7SUFDVCx1RUFBVyxDQUFBO0FBQ2IsQ0FBQyxFQUpXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFJNUIifQ==
@@ -0,0 +1,6 @@
1
+ export var SlotDestructionType;
2
+ (function (SlotDestructionType) {
3
+ SlotDestructionType[SlotDestructionType["NORMAL"] = 0] = "NORMAL";
4
+ SlotDestructionType[SlotDestructionType["COLLECTIBLE_PAYOUT"] = 1] = "COLLECTIBLE_PAYOUT";
5
+ })(SlotDestructionType || (SlotDestructionType = {}));
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xvdERlc3RydWN0aW9uVHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZW51bXMvU2xvdERlc3RydWN0aW9uVHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzdCLGlFQUFNLENBQUE7SUFDTix5RkFBa0IsQ0FBQTtBQUNwQixDQUFDLEVBSFcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUc5QiJ9
@@ -0,0 +1,9 @@
1
+ /** This must match the enumeration in the JSDoc comments for `deepCopy` and `merge`. */
2
+ export var CopyableIsaacAPIClassType;
3
+ (function (CopyableIsaacAPIClassType) {
4
+ CopyableIsaacAPIClassType["COLOR"] = "Color";
5
+ CopyableIsaacAPIClassType["K_COLOR"] = "KColor";
6
+ CopyableIsaacAPIClassType["RNG"] = "RNG";
7
+ CopyableIsaacAPIClassType["VECTOR"] = "Vector";
8
+ })(CopyableIsaacAPIClassType || (CopyableIsaacAPIClassType = {}));
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29weWFibGVJc2FhY0FQSUNsYXNzVHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZW51bXMvcHJpdmF0ZS9Db3B5YWJsZUlzYWFjQVBJQ2xhc3NUeXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdGQUF3RjtBQUN4RixNQUFNLENBQU4sSUFBWSx5QkFLWDtBQUxELFdBQVkseUJBQXlCO0lBQ25DLDRDQUFlLENBQUE7SUFDZiwrQ0FBa0IsQ0FBQTtJQUNsQix3Q0FBVyxDQUFBO0lBQ1gsOENBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUxXLHlCQUF5QixLQUF6Qix5QkFBeUIsUUFLcEMifQ==
@@ -0,0 +1,8 @@
1
+ export var SaveDataKey;
2
+ (function (SaveDataKey) {
3
+ SaveDataKey["PERSISTENT"] = "persistent";
4
+ SaveDataKey["RUN"] = "run";
5
+ SaveDataKey["LEVEL"] = "level";
6
+ SaveDataKey["ROOM"] = "room";
7
+ })(SaveDataKey || (SaveDataKey = {}));
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2F2ZURhdGFLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2VudW1zL3ByaXZhdGUvU2F2ZURhdGFLZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksV0FLWDtBQUxELFdBQVksV0FBVztJQUNyQix3Q0FBeUIsQ0FBQTtJQUN6QiwwQkFBVyxDQUFBO0lBQ1gsOEJBQWUsQ0FBQTtJQUNmLDRCQUFhLENBQUE7QUFDZixDQUFDLEVBTFcsV0FBVyxLQUFYLFdBQVcsUUFLdEIifQ==
@@ -0,0 +1,41 @@
1
+ /**
2
+ * During serialization, we write an arbitrary string key to the object with a value of an empty
3
+ * string. This is used during deserialization to instantiate the correct type of object.
4
+ *
5
+ * Note that we do not bother branding TSTL classes because we have no way to invoke the proper
6
+ * constructor during deserialization.
7
+ */
8
+ export var SerializationBrand;
9
+ (function (SerializationBrand) {
10
+ // Specific TSTL class brands:
11
+ SerializationBrand["DEFAULT_MAP"] = "__TSTL_DEFAULT_MAP";
12
+ SerializationBrand["MAP"] = "__TSTL_MAP";
13
+ SerializationBrand["SET"] = "__TSTL_SET";
14
+ // Specific Isaac API class brands:
15
+ SerializationBrand["COLOR"] = "__COLOR";
16
+ SerializationBrand["K_COLOR"] = "__K_COLOR";
17
+ SerializationBrand["RNG"] = "__RNG";
18
+ SerializationBrand["VECTOR"] = "__VECTOR";
19
+ /**
20
+ * This is set to the value that represents the default value (instead of an empty string like the
21
+ * other brands are).
22
+ *
23
+ * Default maps that use a factory function are unserializable, but do not throw runtime errors
24
+ * because the merge function can derive the factory function from the already-instantiated
25
+ * object.
26
+ */
27
+ SerializationBrand["DEFAULT_MAP_VALUE"] = "__TSTL_DEFAULT_MAP_VALUE";
28
+ /**
29
+ * The JSON library is unable to distinguish between a maps with number keys and an array. It will
30
+ * assume that both of these are an array. Thus, in the case of a map with number keys, it will
31
+ * insert null in every empty spot, leading to crashes.
32
+ *
33
+ * For example, a map with keys of 5 and 10 would be converted to the following array: `[null,
34
+ * null, null, null, "myValueForKey5", null, null, null, null, "myValueForKey10"]`
35
+ *
36
+ * The deep copier works around this by converting number keys to strings. It inserts this brand
37
+ * to keep track of the mutation.
38
+ */
39
+ SerializationBrand["OBJECT_WITH_NUMBER_KEYS"] = "__TSTL_OBJECT_WITH_NUMBER_KEYS";
40
+ })(SerializationBrand || (SerializationBrand = {}));
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VyaWFsaXphdGlvbkJyYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9lbnVtcy9wcml2YXRlL1NlcmlhbGl6YXRpb25CcmFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQU4sSUFBWSxrQkFrQ1g7QUFsQ0QsV0FBWSxrQkFBa0I7SUFDNUIsOEJBQThCO0lBQzlCLHdEQUFrQyxDQUFBO0lBQ2xDLHdDQUFrQixDQUFBO0lBQ2xCLHdDQUFrQixDQUFBO0lBRWxCLG1DQUFtQztJQUNuQyx1Q0FBaUIsQ0FBQTtJQUNqQiwyQ0FBcUIsQ0FBQTtJQUNyQixtQ0FBYSxDQUFBO0lBQ2IseUNBQW1CLENBQUE7SUFFbkI7Ozs7Ozs7T0FPRztJQUNILG9FQUE4QyxDQUFBO0lBRTlDOzs7Ozs7Ozs7O09BVUc7SUFDSCxnRkFBMEQsQ0FBQTtBQUM1RCxDQUFDLEVBbENXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFrQzdCIn0=
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Easily create custom characters that have the same health mechanic as Blue Baby (red heart
3
+ * containers --> soul hearts) or Black Judas (red heart containers --> black hearts).
4
+ *
5
+ * @module
6
+ */
7
+ import { HeartSubType, ModCallback, PickupVariant, } from "isaac-typescript-definitions";
8
+ import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
9
+ import { isRedHeart } from "../functions/pickups";
10
+ const FEATURE_NAME = "characterHealthConversion";
11
+ const characterHealthReplacementMap = new Map();
12
+ /** @internal */
13
+ export function characterHealthConversionInit(mod) {
14
+ mod.AddCallback(ModCallback.POST_PEFFECT_UPDATE, postPEffectUpdate); // 4
15
+ mod.AddCallback(ModCallback.PRE_PICKUP_COLLISION, prePickupCollisionHeart, PickupVariant.HEART); // 38
16
+ }
17
+ // ModCallback.POST_PEFFECT_UPDATE (4)
18
+ function postPEffectUpdate(player) {
19
+ const character = player.GetPlayerType();
20
+ const conversionHeartSubType = characterHealthReplacementMap.get(character);
21
+ if (conversionHeartSubType === undefined) {
22
+ return;
23
+ }
24
+ convertRedHeartContainers(player, conversionHeartSubType);
25
+ removeRedHearts(player);
26
+ }
27
+ function convertRedHeartContainers(player, heartSubType) {
28
+ const maxHearts = player.GetMaxHearts();
29
+ if (maxHearts === 0) {
30
+ return;
31
+ }
32
+ player.AddMaxHearts(maxHearts * -1, false);
33
+ switch (heartSubType) {
34
+ case HeartSubType.SOUL: {
35
+ player.AddSoulHearts(maxHearts);
36
+ break;
37
+ }
38
+ case HeartSubType.BLACK: {
39
+ player.AddBlackHearts(maxHearts);
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * We also have to check for normal red hearts, so that the player is not able to fill bone hearts
46
+ * (by e.g. picking up a healing item like Breakfast).
47
+ */
48
+ function removeRedHearts(player) {
49
+ const hearts = player.GetHearts();
50
+ if (hearts > 0) {
51
+ player.AddHearts(hearts * -1);
52
+ }
53
+ }
54
+ // ModCallback.PRE_PICKUP_COLLISION (38)
55
+ // PickupVariant.HEART (10)
56
+ function prePickupCollisionHeart(pickup, collider) {
57
+ if (!isRedHeart(pickup)) {
58
+ return undefined;
59
+ }
60
+ const player = collider.ToPlayer();
61
+ if (player === undefined) {
62
+ return undefined;
63
+ }
64
+ const character = player.GetPlayerType();
65
+ const conversionHeartSubType = characterHealthReplacementMap.get(character);
66
+ if (conversionHeartSubType === undefined) {
67
+ return undefined;
68
+ }
69
+ // Prevent internal code from running, which will prevent the player from picking up the heart,
70
+ // but will still allow the heart to bounce off of the player.
71
+ return false;
72
+ }
73
+ /**
74
+ * Helper function to make a character that has the same health mechanic as Blue Baby (red heart
75
+ * containers --> soul hearts) or Dark Judas (red heart containers --> black hearts).
76
+ *
77
+ * Call this function once at the beginning of your mod to declare the health conversion type.
78
+ */
79
+ export function registerCharacterHealthConversion(playerType, conversionHeartSubType) {
80
+ errorIfFeaturesNotInitialized(FEATURE_NAME);
81
+ if (characterHealthReplacementMap.has(playerType)) {
82
+ error(`Failed to register a character of type ${playerType} because there is already an existing registered character with that type.`);
83
+ }
84
+ characterHealthReplacementMap.set(playerType, conversionHeartSubType);
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmFjdGVySGVhbHRoQ29udmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY2hhcmFjdGVySGVhbHRoQ29udmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osV0FBVyxFQUNYLGFBQWEsR0FFZCxNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUlqRCxNQUFNLDZCQUE2QixHQUFHLElBQUksR0FBRyxFQUcxQyxDQUFDO0FBRUosZ0JBQWdCO0FBQ2hCLE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxHQUFRO0lBQ3BELEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJO0lBQ3pFLEdBQUcsQ0FBQyxXQUFXLENBQ2IsV0FBVyxDQUFDLG9CQUFvQixFQUNoQyx1QkFBdUIsRUFDdkIsYUFBYSxDQUFDLEtBQUssQ0FDcEIsQ0FBQyxDQUFDLEtBQUs7QUFDVixDQUFDO0FBRUQsc0NBQXNDO0FBQ3RDLFNBQVMsaUJBQWlCLENBQUMsTUFBb0I7SUFDN0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sc0JBQXNCLEdBQUcsNkJBQTZCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVFLElBQUksc0JBQXNCLEtBQUssU0FBUyxFQUFFO1FBQ3hDLE9BQU87S0FDUjtJQUVELHlCQUF5QixDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQzFELGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FDaEMsTUFBb0IsRUFDcEIsWUFBb0M7SUFFcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtRQUNuQixPQUFPO0tBQ1I7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUzQyxRQUFRLFlBQVksRUFBRTtRQUNwQixLQUFLLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU07U0FDUDtRQUVELEtBQUssWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsTUFBTTtTQUNQO0tBQ0Y7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxlQUFlLENBQUMsTUFBb0I7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNkLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0I7QUFDSCxDQUFDO0FBRUQsd0NBQXdDO0FBQ3hDLDJCQUEyQjtBQUMzQixTQUFTLHVCQUF1QixDQUFDLE1BQW9CLEVBQUUsUUFBZ0I7SUFDckUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN2QixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNuQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7UUFDeEIsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekMsTUFBTSxzQkFBc0IsR0FBRyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUUsSUFBSSxzQkFBc0IsS0FBSyxTQUFTLEVBQUU7UUFDeEMsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCwrRkFBK0Y7SUFDL0YsOERBQThEO0lBQzlELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlDQUFpQyxDQUMvQyxVQUFzQixFQUN0QixzQkFBOEM7SUFFOUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFNUMsSUFBSSw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDakQsS0FBSyxDQUNILDBDQUEwQyxVQUFVLDRFQUE0RSxDQUNqSSxDQUFDO0tBQ0g7SUFFRCw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDeEUsQ0FBQyJ9
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Easily create custom characters that have base stats different from that of Isaac.
3
+ *
4
+ * @module
5
+ */
6
+ import { ModCallback, } from "isaac-typescript-definitions";
7
+ import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
8
+ import { getDefaultPlayerStat } from "../functions/cacheFlag";
9
+ import { addStat } from "../functions/player";
10
+ const FEATURE_NAME = "characterStats";
11
+ const charactersStatMap = new Map();
12
+ /** @internal */
13
+ export function characterStatsInit(mod) {
14
+ mod.AddCallback(ModCallback.EVALUATE_CACHE, evaluateCache); // 8
15
+ }
16
+ // ModCallback.EVALUATE_CACHE (8)
17
+ function evaluateCache(player, cacheFlag) {
18
+ const character = player.GetPlayerType();
19
+ const statMap = charactersStatMap.get(character);
20
+ if (statMap === undefined) {
21
+ return;
22
+ }
23
+ const stat = statMap.get(cacheFlag);
24
+ const defaultStat = getDefaultPlayerStat(cacheFlag);
25
+ if (stat === undefined || defaultStat === undefined) {
26
+ return;
27
+ }
28
+ const delta = stat - defaultStat;
29
+ addStat(player, cacheFlag, delta);
30
+ }
31
+ /**
32
+ * Helper function to manage the stats for a vanilla or custom character. Call this function once at
33
+ * the beginning of your mod to declare the starting stats.
34
+ *
35
+ * You must provide this function with a map of CacheFlag to the default stat amount. For example,
36
+ * the default amount of damage is 3.5. To make a custom character start with 4.5 damage:
37
+ *
38
+ * ```ts
39
+ * const fooDefaultStats = new Map<CacheFlag, number>([
40
+ * [CacheFlag.DAMAGE, 4.5],
41
+ * ])
42
+ * registerCharacterStats(PlayerTypeCustom.FOO, fooDefaultStats);
43
+ * ```
44
+ *
45
+ * Note that the format for the `CacheFlag.FIRE_DELAY` value should be in the tears stat format, not
46
+ * the `MaxFireDelay` format.
47
+ */
48
+ export function registerCharacterStats(playerType, statMap) {
49
+ errorIfFeaturesNotInitialized(FEATURE_NAME);
50
+ charactersStatMap.set(playerType, statMap);
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmFjdGVyU3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2ZlYXR1cmVzL2NoYXJhY3RlclN0YXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBRUwsV0FBVyxHQUVaLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDO0FBR3RDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7QUFFekQsZ0JBQWdCO0FBQ2hCLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFRO0lBQ3pDLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUk7QUFDbEUsQ0FBQztBQUVELGlDQUFpQztBQUNqQyxTQUFTLGFBQWEsQ0FBQyxNQUFvQixFQUFFLFNBQW9CO0lBQy9ELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1FBQ3pCLE9BQU87S0FDUjtJQUVELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7UUFDbkQsT0FBTztLQUNSO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUVqQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFVBQXNCLEVBQ3RCLE9BQWdFO0lBRWhFLDZCQUE2QixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzVDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQyJ9
@@ -0,0 +1,45 @@
1
+ // The item pool type of a collectible is not stored on the collectible. Thus, we scan for incoming
2
+ // item pool types in the PreGetCollectible callback, and then assume that the next spawned
3
+ // collectible has this item pool type.
4
+ import { ModCallback, PickupVariant, } from "isaac-typescript-definitions";
5
+ import { game } from "../cachedClasses";
6
+ import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
7
+ import { getEntityID } from "../functions/entity";
8
+ import { isCollectible } from "../functions/pickupVariants";
9
+ import { getRoomItemPoolType } from "../functions/rooms";
10
+ import { saveDataManager } from "./saveDataManager/exports";
11
+ const FEATURE_NAME = "collectibleItemPoolType";
12
+ const v = {
13
+ run: {
14
+ collectibleItemPoolTypeMap: new Map(),
15
+ },
16
+ };
17
+ /** @internal */
18
+ export function collectibleItemPoolTypeInit(mod) {
19
+ saveDataManager(FEATURE_NAME, v);
20
+ mod.AddCallback(ModCallback.POST_PICKUP_INIT, postPickupInitCollectible, PickupVariant.COLLECTIBLE); // 34
21
+ }
22
+ // ModCallback.POST_PICKUP_INIT (34)
23
+ // PickupVariant.COLLECTIBLE (100)
24
+ function postPickupInitCollectible(pickup) {
25
+ const itemPool = game.GetItemPool();
26
+ const ptrHash = GetPtrHash(pickup);
27
+ const lastItemPoolType = itemPool.GetLastPool();
28
+ v.run.collectibleItemPoolTypeMap.set(ptrHash, lastItemPoolType);
29
+ }
30
+ /**
31
+ * Helper function to get the item pool type that a given collectible came from. Since there is no
32
+ * native method in the API to get this, we listen in the PreGetCollectible callback for item pool
33
+ * types, and then assume that the next spawned collectible will match.
34
+ */
35
+ export function getCollectibleItemPoolType(collectible) {
36
+ errorIfFeaturesNotInitialized(FEATURE_NAME);
37
+ if (!isCollectible(collectible)) {
38
+ const entityID = getEntityID(collectible);
39
+ error(`The "getCollectibleItemPoolType" function was given a non-collectible: ${entityID}`);
40
+ }
41
+ const ptrHash = GetPtrHash(collectible);
42
+ const itemPoolType = v.run.collectibleItemPoolTypeMap.get(ptrHash);
43
+ return itemPoolType === undefined ? getRoomItemPoolType() : itemPoolType;
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlibGVJdGVtUG9vbFR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2ZlYXR1cmVzL2NvbGxlY3RpYmxlSXRlbVBvb2xUeXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1HQUFtRztBQUNuRywyRkFBMkY7QUFDM0YsdUNBQXVDO0FBRXZDLE9BQU8sRUFFTCxXQUFXLEVBQ1gsYUFBYSxHQUNkLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVELE1BQU0sWUFBWSxHQUFHLHlCQUF5QixDQUFDO0FBRS9DLE1BQU0sQ0FBQyxHQUFHO0lBQ1IsR0FBRyxFQUFFO1FBQ0gsMEJBQTBCLEVBQUUsSUFBSSxHQUFHLEVBQXlCO0tBQzdEO0NBQ0YsQ0FBQztBQUVGLGdCQUFnQjtBQUNoQixNQUFNLFVBQVUsMkJBQTJCLENBQUMsR0FBUTtJQUNsRCxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWpDLEdBQUcsQ0FBQyxXQUFXLENBQ2IsV0FBVyxDQUFDLGdCQUFnQixFQUM1Qix5QkFBeUIsRUFDekIsYUFBYSxDQUFDLFdBQVcsQ0FDMUIsQ0FBQyxDQUFDLEtBQUs7QUFDVixDQUFDO0FBRUQsb0NBQW9DO0FBQ3BDLGtDQUFrQztBQUNsQyxTQUFTLHlCQUF5QixDQUFDLE1BQW9CO0lBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFaEQsQ0FBQyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLFdBQXlCO0lBRXpCLDZCQUE2QixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRTVDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLEtBQUssQ0FDSCwwRUFBMEUsUUFBUSxFQUFFLENBQ3JGLENBQUM7S0FDSDtJQUVELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRSxPQUFPLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUMzRSxDQUFDIn0=
@@ -0,0 +1,148 @@
1
+ import { GridEntityType, } from "isaac-typescript-definitions";
2
+ import { game } from "../cachedClasses";
3
+ import { DefaultMap } from "../classes/DefaultMap";
4
+ import { DecorationVariant } from "../enums/DecorationVariant";
5
+ import { ModCallbackCustom } from "../enums/ModCallbackCustom";
6
+ import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
7
+ import { removeGrid, spawnGridWithVariant } from "../functions/gridEntity";
8
+ import { getRoomListIndex } from "../functions/roomData";
9
+ import { isVector } from "../functions/vector";
10
+ import { saveDataManager } from "./saveDataManager/exports";
11
+ const FEATURE_NAME = "customGridEntity";
12
+ const v = {
13
+ level: {
14
+ /** Indexed by room list index and grid index. */
15
+ customGridEntities: new DefaultMap(() => new Map()),
16
+ },
17
+ };
18
+ /** @internal */
19
+ export function customGridEntityInit(mod) {
20
+ saveDataManager(FEATURE_NAME, v);
21
+ mod.AddCallbackCustom(ModCallbackCustom.POST_NEW_ROOM_REORDERED, postNewRoomReordered);
22
+ }
23
+ // ModCallbackCustom.POST_NEW_ROOM_REORDERED
24
+ function postNewRoomReordered() {
25
+ // When we re-enter a room, the graphics for any custom entities will be reverted back to that of
26
+ // a normal decoration. Thus, we must re-apply the anm2.
27
+ const roomListIndex = getRoomListIndex();
28
+ const roomCustomGridEntities = v.level.customGridEntities.get(roomListIndex);
29
+ if (roomCustomGridEntities === undefined) {
30
+ return;
31
+ }
32
+ const room = game.GetRoom();
33
+ for (const [gridIndex, data] of roomCustomGridEntities.entries()) {
34
+ const decoration = room.GetGridEntity(gridIndex);
35
+ if (decoration === undefined) {
36
+ roomCustomGridEntities.delete(gridIndex);
37
+ continue;
38
+ }
39
+ const sprite = decoration.GetSprite();
40
+ sprite.Load(data.anm2, true);
41
+ sprite.Play(data.defaultAnimation, true);
42
+ }
43
+ }
44
+ /**
45
+ * Helper function to spawn a custom grid entity.
46
+ *
47
+ * This is an IsaacScript feature because the vanilla game does not support any custom grid
48
+ * entities. Under the hood, IsaacScript accomplishes this by using decorations with an arbitrary
49
+ * non-zero variant to represent custom grid entities.
50
+ *
51
+ * Once a custom grid entity is spawned, you can take advantage of the custom grid callbacks such as
52
+ * `POST_GRID_ENTITY_CUSTOM_UPDATE`.
53
+ *
54
+ * @param gridEntityTypeCustom An integer that identifies what kind of grid entity you are creating.
55
+ * It should correspond to a local enum value in your mod. The integer
56
+ * can be any unique value and will not correspond to the actual grid
57
+ * entity type used. (This integer is used in the various custom grid
58
+ * entity callbacks.)
59
+ * @param gridIndexOrPosition The grid index or position in the room that you want to spawn the grid
60
+ * entity at. If a position is specified, the closest grid index will be
61
+ * used.
62
+ * @param anm2 The path to the ANM2 file to use for the sprite.
63
+ * @param defaultAnimation The name of the animation to play after the sprite is initialized and
64
+ * after the player re-enters a room with this grid entity in it.
65
+ * @param gridCollisionClass The collision class that you want the custom grid entity to have.
66
+ */
67
+ export function spawnCustomGrid(gridEntityTypeCustom, gridIndexOrPosition, anm2, defaultAnimation, gridCollisionClass) {
68
+ errorIfFeaturesNotInitialized(FEATURE_NAME);
69
+ const room = game.GetRoom();
70
+ const roomListIndex = getRoomListIndex();
71
+ const gridIndex = isVector(gridIndexOrPosition)
72
+ ? room.GetGridIndex(gridIndexOrPosition)
73
+ : gridIndexOrPosition;
74
+ const existingGridEntity = room.GetGridEntity(gridIndex);
75
+ const isExistingDecoration = existingGridEntity !== undefined &&
76
+ existingGridEntity.GetType() === GridEntityType.DECORATION &&
77
+ existingGridEntity.GetVariant() ===
78
+ DecorationVariant.CUSTOM_GRID_ENTITY;
79
+ const decoration = isExistingDecoration
80
+ ? existingGridEntity
81
+ : spawnGridWithVariant(GridEntityType.DECORATION, DecorationVariant.CUSTOM_GRID_ENTITY, gridIndexOrPosition);
82
+ if (decoration === undefined) {
83
+ error("Failed to spawn a decoration for a custom grid entity.");
84
+ }
85
+ const sprite = decoration.GetSprite();
86
+ sprite.Load(anm2, true);
87
+ sprite.Play(defaultAnimation, true);
88
+ const customGridEntityData = {
89
+ gridEntityTypeCustom,
90
+ roomListIndex,
91
+ gridIndex,
92
+ anm2,
93
+ defaultAnimation,
94
+ gridCollisionClass,
95
+ };
96
+ const roomCustomGridEntities = v.level.customGridEntities.getAndSetDefault(roomListIndex);
97
+ roomCustomGridEntities.set(gridIndex, customGridEntityData);
98
+ return decoration;
99
+ }
100
+ /**
101
+ * Helper function to remove a custom grid entity created by the `spawnCustomGrid` function.
102
+ *
103
+ * @param gridIndexOrPositionOrGridEntity You can specify the custom grid entity to remove by
104
+ * providing the grid index, the room position, or the grid entity
105
+ * itself.
106
+ * @param updateRoom Optional. Whether or not to update the room after the grid entity is removed.
107
+ * Default is true. This is generally a good idea because if the room is not
108
+ * updated, you will be unable to spawn another grid entity on the same tile until
109
+ * a frame has passed. However, doing this is expensive, since it involves a call
110
+ * to `Isaac.GetRoomEntities`, so set it to false if you need to invoke this
111
+ * function multiple times.
112
+ * @returns The grid entity that was removed. Returns undefined if no grid entity was found at the
113
+ * given location or if the given grid entity was not a custom grid entity.
114
+ */
115
+ export function removeCustomGrid(gridIndexOrPositionOrGridEntity, updateRoom = true) {
116
+ const room = game.GetRoom();
117
+ const roomListIndex = getRoomListIndex();
118
+ let decoration;
119
+ if (typeof gridIndexOrPositionOrGridEntity === "number") {
120
+ const gridIndex = gridIndexOrPositionOrGridEntity;
121
+ const gridEntity = room.GetGridEntity(gridIndex);
122
+ if (gridEntity === undefined) {
123
+ return undefined;
124
+ }
125
+ decoration = gridEntity;
126
+ }
127
+ else if (isVector(gridIndexOrPositionOrGridEntity)) {
128
+ const position = gridIndexOrPositionOrGridEntity;
129
+ const gridEntity = room.GetGridEntityFromPos(position);
130
+ if (gridEntity === undefined) {
131
+ return undefined;
132
+ }
133
+ decoration = gridEntity;
134
+ }
135
+ else {
136
+ decoration = gridIndexOrPositionOrGridEntity;
137
+ }
138
+ const gridIndex = decoration.GetGridIndex();
139
+ const roomCustomGridEntities = v.level.customGridEntities.getAndSetDefault(roomListIndex);
140
+ const exists = roomCustomGridEntities.has(gridIndex);
141
+ if (!exists) {
142
+ return undefined;
143
+ }
144
+ roomCustomGridEntities.delete(gridIndex);
145
+ removeGrid(decoration, updateRoom);
146
+ return decoration;
147
+ }
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tR3JpZEVudGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tR3JpZEVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztBQUV4QyxNQUFNLENBQUMsR0FBRztJQUNSLEtBQUssRUFBRTtRQUNMLGlEQUFpRDtRQUNqRCxrQkFBa0IsRUFBRSxJQUFJLFVBQVUsQ0FDaEMsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FDaEI7S0FDRjtDQUNGLENBQUM7QUFFRixnQkFBZ0I7QUFDaEIsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQWdCO0lBQ25ELGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFakMsR0FBRyxDQUFDLGlCQUFpQixDQUNuQixp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