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,63 @@
1
+ import { EffectVariant, RoomShape } from "isaac-typescript-definitions";
2
+ import { game } from "../../cachedClasses";
3
+ import { getRandomArrayElement } from "../../functions/array";
4
+ import { spawnEffectWithSeed } from "../../functions/entitySpecific";
5
+ import { ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH } from "./customStageConstants";
6
+ import v from "./v";
7
+ /**
8
+ * Normally, we would make a custom entity to represent a shadow effect, but we don't want to
9
+ * interfere with the "entities2.xml" file in end-user mods. Thus, we must select a vanilla effect
10
+ * to masquerade as a backdrop effect.
11
+ *
12
+ * We arbitrarily choose a ladder for this purpose because it will not automatically despawn after
13
+ * time passes, like most other effects.
14
+ */
15
+ const SHADOW_EFFECT_VARIANT = EffectVariant.LADDER;
16
+ /** The animation comes from StageAPI. */
17
+ const ROOM_SHAPE_TO_SHADOW_ANIMATION = {
18
+ [RoomShape.SHAPE_1x1]: "1x1",
19
+ [RoomShape.IH]: "1x1",
20
+ [RoomShape.IV]: "1x1",
21
+ [RoomShape.SHAPE_1x2]: "1x2",
22
+ [RoomShape.IIV]: "1x2",
23
+ [RoomShape.SHAPE_2x1]: "2x1",
24
+ [RoomShape.IIH]: "2x1",
25
+ [RoomShape.SHAPE_2x2]: "2x2",
26
+ [RoomShape.LTL]: "2x2",
27
+ [RoomShape.LTR]: "2x2",
28
+ [RoomShape.LBL]: "2x2",
29
+ [RoomShape.LBR]: "2x2", // 12
30
+ };
31
+ const FADED_BLACK = Color(0, 0, 0, 0.25);
32
+ const shadowSprite = Sprite();
33
+ shadowSprite.Load(`${ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH}/stage-shadow.anm2`, true);
34
+ export function setShadows(customStage) {
35
+ if (customStage.shadows === undefined) {
36
+ return;
37
+ }
38
+ const room = game.GetRoom();
39
+ const roomShape = room.GetRoomShape();
40
+ const centerPos = room.GetCenterPos();
41
+ const animation = ROOM_SHAPE_TO_SHADOW_ANIMATION[roomShape];
42
+ const shadows = customStage.shadows[animation];
43
+ if (shadows === undefined) {
44
+ return;
45
+ }
46
+ // We spawn an effect instead of simply rendering a static sprite so that the effect will properly
47
+ // slide in during a room transition animation. (It looks stupid if the shadow stays statically
48
+ // rendering throughout this animation.)
49
+ const shadowEffect = spawnEffectWithSeed(SHADOW_EFFECT_VARIANT, 0, centerPos, 1);
50
+ const sprite = shadowEffect.GetSprite();
51
+ sprite.Load(`${ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH}/stage-shadow.anm2`, false);
52
+ const decorationSeed = room.GetDecorationSeed();
53
+ const shadow = getRandomArrayElement(shadows, decorationSeed);
54
+ sprite.ReplaceSpritesheet(0, shadow.pngPath);
55
+ sprite.LoadGraphics();
56
+ sprite.SetFrame(animation, 0);
57
+ sprite.Color =
58
+ shadow.color === undefined
59
+ ? FADED_BLACK
60
+ : Color(shadow.color.r, shadow.color.g, shadow.color.b, shadow.color.a);
61
+ v.room.showingShadows = true;
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZG93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2Uvc2hhZG93cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7QUFJcEI7Ozs7Ozs7R0FPRztBQUNILE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztBQUVuRCx5Q0FBeUM7QUFDekMsTUFBTSw4QkFBOEIsR0FFaEM7SUFDRixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLO0lBQzVCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUs7SUFDckIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSztJQUNyQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLO0lBQzVCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUs7SUFDdEIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSztJQUM1QixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLO0lBQ3RCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUs7SUFDNUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSztJQUN0QixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLO0lBQ3RCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUs7SUFDdEIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUs7Q0FDckIsQ0FBQztBQUVYLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV6QyxNQUFNLFlBQVksR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUM5QixZQUFZLENBQUMsSUFBSSxDQUNmLEdBQUcsaUNBQWlDLG9CQUFvQixFQUN4RCxJQUFJLENBQ0wsQ0FBQztBQUVGLE1BQU0sVUFBVSxVQUFVLENBQUMsV0FBd0I7SUFDakQsSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtRQUNyQyxPQUFPO0tBQ1I7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QyxNQUFNLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtRQUN6QixPQUFPO0tBQ1I7SUFFRCxrR0FBa0c7SUFDbEcsK0ZBQStGO0lBQy9GLHdDQUF3QztJQUN4QyxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FDdEMscUJBQXFCLEVBQ3JCLENBQUMsRUFDRCxTQUFTLEVBQ1QsQ0FBUyxDQUNWLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLGlDQUFpQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDOUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxLQUFLO1FBQ1YsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQ3hCLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUMvQixDQUFDIn0=
@@ -0,0 +1,35 @@
1
+ import { fonts, game } from "../../cachedClasses";
2
+ import { KColorDefault } from "../../constants";
3
+ import { getScreenBottomCenterPos } from "../../functions/ui";
4
+ import { todo } from "../../functions/utils";
5
+ import v from "./v";
6
+ /** This must match the name of the shader in "shaders.xml". */
7
+ const EMPTY_SHADER_NAME = "IsaacScript-RenderAboveHUD";
8
+ /** This matches the offset that the vanilla game uses. */
9
+ const STREAK_TEXT_BOTTOM_OFFSET = Vector(0, -60);
10
+ // ModCallback.POST_RENDER (2)
11
+ export function streakTextPostRender(customStage) {
12
+ if (!v.run.showingStreakText) {
13
+ return;
14
+ }
15
+ const isPaused = game.IsPaused();
16
+ if (isPaused) {
17
+ return;
18
+ }
19
+ const font = fonts.upheaval;
20
+ const length = font.GetStringWidthUTF8(customStage.name);
21
+ const bottomCenterPos = getScreenBottomCenterPos();
22
+ const position = bottomCenterPos.add(STREAK_TEXT_BOTTOM_OFFSET);
23
+ const adjustedX = position.X - length / 2;
24
+ font.DrawString(customStage.name, adjustedX, position.Y, KColorDefault);
25
+ }
26
+ // ModCallback.INPUT_ACTION (13)
27
+ // TODO
28
+ // ModCallback.GET_SHADER_PARAMS (22)
29
+ export function streakTextGetShaderParams(shaderName) {
30
+ if (shaderName !== EMPTY_SHADER_NAME) {
31
+ return;
32
+ }
33
+ todo();
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFrVGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2Uvc3RyZWFrVGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0MsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBRXBCLCtEQUErRDtBQUMvRCxNQUFNLGlCQUFpQixHQUFHLDRCQUE0QixDQUFDO0FBRXZELDBEQUEwRDtBQUMxRCxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVqRCw4QkFBOEI7QUFDOUIsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQXdCO0lBQzNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFO1FBQzVCLE9BQU87S0FDUjtJQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqQyxJQUFJLFFBQVEsRUFBRTtRQUNaLE9BQU87S0FDUjtJQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxNQUFNLGVBQWUsR0FBRyx3QkFBd0IsRUFBRSxDQUFDO0lBQ25ELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNoRSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxnQ0FBZ0M7QUFDaEMsT0FBTztBQUVQLHFDQUFxQztBQUNyQyxNQUFNLFVBQVUseUJBQXlCLENBQUMsVUFBa0I7SUFDMUQsSUFBSSxVQUFVLEtBQUssaUJBQWlCLEVBQUU7UUFDcEMsT0FBTztLQUNSO0lBRUQsSUFBSSxFQUFFLENBQUM7QUFDVCxDQUFDIn0=
@@ -0,0 +1,36 @@
1
+ import { sumArray } from "../../functions/array";
2
+ import { log } from "../../functions/log";
3
+ import { getRandomFloat } from "../../functions/random";
4
+ import { getRandomSeed } from "../../functions/rng";
5
+ /**
6
+ * Helper function to get a random custom stage room from an array of custom stage rooms.
7
+ *
8
+ * Note that this function does not simply choose a random element in the provided array; it will
9
+ * properly account for each room weight using the algorithm from:
10
+ * https://stackoverflow.com/questions/1761626/weighted-random-numbers
11
+ */
12
+ export function getRandomCustomStageRoom(roomsMetadata, seedOrRNG = getRandomSeed(), verbose = false) {
13
+ const totalWeight = getTotalWeightOfCustomStageRooms(roomsMetadata);
14
+ if (verbose) {
15
+ log(`Total weight of the custom stage rooms provided: ${totalWeight}`);
16
+ }
17
+ const chosenWeight = getRandomFloat(0, totalWeight, seedOrRNG);
18
+ if (verbose) {
19
+ log(`Randomly chose weight for custom stage room: ${chosenWeight}`);
20
+ }
21
+ return getCustomStageRoomWithChosenWeight(roomsMetadata, chosenWeight);
22
+ }
23
+ function getTotalWeightOfCustomStageRooms(roomsMetadata) {
24
+ const weights = roomsMetadata.map((roomMetadata) => roomMetadata.weight);
25
+ return sumArray(weights);
26
+ }
27
+ function getCustomStageRoomWithChosenWeight(roomsMetadata, chosenWeight) {
28
+ for (const roomMetadata of roomsMetadata) {
29
+ if (chosenWeight < roomMetadata.weight) {
30
+ return roomMetadata;
31
+ }
32
+ chosenWeight -= roomMetadata.weight;
33
+ }
34
+ error(`Failed to get a custom stage room with chosen weight: ${chosenWeight}`);
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2UvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHcEQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxhQUFpRCxFQUNqRCxZQUF3QixhQUFhLEVBQUUsRUFDdkMsT0FBTyxHQUFHLEtBQUs7SUFFZixNQUFNLFdBQVcsR0FBRyxnQ0FBZ0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sRUFBRTtRQUNYLEdBQUcsQ0FBQyxvREFBb0QsV0FBVyxFQUFFLENBQUMsQ0FBQztLQUN4RTtJQUVELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELElBQUksT0FBTyxFQUFFO1FBQ1gsR0FBRyxDQUFDLGdEQUFnRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsT0FBTyxrQ0FBa0MsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQVMsZ0NBQWdDLENBQ3ZDLGFBQWlEO0lBRWpELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsU0FBUyxrQ0FBa0MsQ0FDekMsYUFBaUQsRUFDakQsWUFBbUI7SUFFbkIsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7UUFDeEMsSUFBSSxZQUFZLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUN0QyxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUVELFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDO0tBQ3JDO0lBRUQsS0FBSyxDQUNILHlEQUF5RCxZQUFZLEVBQUUsQ0FDeEUsQ0FBQztBQUNKLENBQUMifQ==
@@ -0,0 +1,18 @@
1
+ const v = {
2
+ run: {
3
+ currentCustomStage: null,
4
+ showingStreakText: false,
5
+ showingBossVersusScreen: false,
6
+ },
7
+ room: {
8
+ showingShadows: false,
9
+ },
10
+ };
11
+ export default v;
12
+ /** Indexed by custom stage name. */
13
+ export const customStagesMap = new Map();
14
+ /** Indexed by room variant. */
15
+ export const customStageCachedRoomData = new Map();
16
+ /** Indexed by entity ID. */
17
+ export const customBossPNGPaths = new Map();
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2Uvdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsR0FBRztJQUNSLEdBQUcsRUFBRTtRQUNILGtCQUFrQixFQUFFLElBQTBCO1FBQzlDLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsdUJBQXVCLEVBQUUsS0FBSztLQUMvQjtJQUVELElBQUksRUFBRTtRQUNKLGNBQWMsRUFBRSxLQUFLO0tBQ3RCO0NBQ0YsQ0FBQztBQUNGLGVBQWUsQ0FBQyxDQUFDO0FBRWpCLG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7QUFFOUQsK0JBQStCO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0FBRTlFLDRCQUE0QjtBQUM1QixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFHdEMsQ0FBQyJ9
@@ -0,0 +1,184 @@
1
+ import { BossID, PlayerType, RoomType, SoundEffect, StageID, } from "isaac-typescript-definitions";
2
+ import { game, sfxManager } from "../../cachedClasses";
3
+ import { arrayRemove } from "../../functions/array";
4
+ import { getBosses } from "../../functions/boss";
5
+ import { getEntityID } from "../../functions/entity";
6
+ import { erange } from "../../functions/utils";
7
+ import { BOSS_NAME_PNG_FILE_NAMES } from "../../objects/bossNamePNGFileNames";
8
+ import { BOSS_PORTRAIT_PNG_FILE_NAMES } from "../../objects/bossPortraitPNGFileNames";
9
+ import { PLAYER_NAME_PNG_FILE_NAMES } from "../../objects/playerNamePNGFileNames";
10
+ import { PLAYER_PORTRAIT_PNG_FILE_NAMES } from "../../objects/playerPortraitPNGFileNames";
11
+ import { VERSUS_SCREEN_BACKGROUND_COLORS } from "../../objects/versusScreenBackgroundColors";
12
+ import { VERSUS_SCREEN_DIRT_SPOT_COLORS } from "../../objects/versusScreenDirtSpotColors";
13
+ import { pause, unpause } from "../pause";
14
+ import { ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH } from "./customStageConstants";
15
+ import v, { customBossPNGPaths } from "./v";
16
+ const DEFAULT_CHARACTER = PlayerType.ISAAC;
17
+ const DEFAULT_STAGE_ID = StageID.BASEMENT;
18
+ const VERSUS_SCREEN_ANIMATION_NAME = "Scene";
19
+ /** The layers range from 0 to 13. */
20
+ const NUM_VERSUS_SCREEN_ANM2_LAYERS = 14;
21
+ const BACKGROUND_ANM2_LAYER = 0;
22
+ const BOSS_DIRT_SPOT_ANM2_LAYER = 2;
23
+ const PLAYER_DIRT_SPOT_ANM2_LAYER = 3;
24
+ const BOSS_PORTRAIT_ANM2_LAYER = 4;
25
+ const PLAYER_PORTRAIT_ANM2_LAYER = 5;
26
+ const PLAYER_NAME_ANM2_LAYER = 6;
27
+ const BOSS_NAME_ANM2_LAYER = 7;
28
+ const OVERLAY_ANM2_LAYER = 11;
29
+ /**
30
+ * We only need to render either the normal player portrait layer or the alternate player portrait
31
+ * layer. Rendering both will cause the player not to shake.
32
+ */
33
+ const PLAYER_PORTRAIT_ALT_ANM2_LAYER = 12;
34
+ /** These are the non-special layers that we will render last. */
35
+ const OTHER_ANM2_LAYERS = arrayRemove(erange(NUM_VERSUS_SCREEN_ANM2_LAYERS), BACKGROUND_ANM2_LAYER, BOSS_DIRT_SPOT_ANM2_LAYER, PLAYER_DIRT_SPOT_ANM2_LAYER, OVERLAY_ANM2_LAYER, PLAYER_PORTRAIT_ALT_ANM2_LAYER);
36
+ /** Most of the PNG files related to the versus screen are located in this directory. */
37
+ const PNG_PATH_PREFIX = "gfx/ui/boss";
38
+ /**
39
+ * Player portraits are not located in the same directory as everything else, since they are re-used
40
+ * from the animation where the player travels to a new stage.
41
+ */
42
+ const PLAYER_PORTRAIT_PNG_PATH_PREFIX = "gfx/ui/stage";
43
+ const VANILLA_VERSUS_PLAYBACK_SPEED = 0.5;
44
+ const versusScreenSprite = Sprite();
45
+ versusScreenSprite.Load("gfx/ui/boss/versusscreen.anm2", false);
46
+ // In vanilla, the "overlay.png" file has a white background. We must convert it to a PNG that uses
47
+ // a transparent background in order for the background behind it to be visible. We use the same
48
+ // "overlay.png" file as StageAPI uses for this purpose.
49
+ versusScreenSprite.ReplaceSpritesheet(OVERLAY_ANM2_LAYER, `${ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH}/overlay.png`);
50
+ versusScreenSprite.LoadGraphics();
51
+ /**
52
+ * Unfortunately, we must split the background layer into an entirely different sprite so that we
53
+ * can color it with the `Color` property.
54
+ */
55
+ const versusScreenBackgroundSprite = Sprite();
56
+ versusScreenBackgroundSprite.Load("gfx/ui/boss/versusscreen.anm2", true);
57
+ /**
58
+ * Unfortunately, we must split the dirt layer into an entirely different sprite so that we can
59
+ * color it with the `Color` property.
60
+ */
61
+ const versusScreenDirtSpotSprite = Sprite();
62
+ versusScreenDirtSpotSprite.Load("gfx/ui/boss/versusscreen.anm2", true);
63
+ export function playVersusScreenAnimation(customStage, force = false) {
64
+ const room = game.GetRoom();
65
+ const roomType = room.GetType();
66
+ const hud = game.GetHUD();
67
+ if (roomType !== RoomType.BOSS && !force) {
68
+ return;
69
+ }
70
+ v.run.showingBossVersusScreen = true;
71
+ pause();
72
+ hud.SetVisible(false);
73
+ const [playerNamePNGPath, playerPortraitPNGPath] = getPlayerPNGPaths();
74
+ versusScreenSprite.ReplaceSpritesheet(PLAYER_NAME_ANM2_LAYER, playerNamePNGPath);
75
+ versusScreenSprite.ReplaceSpritesheet(PLAYER_PORTRAIT_ANM2_LAYER, playerPortraitPNGPath);
76
+ const [bossNamePNGPath, bossPortraitPNGPath] = getBossPNGPaths();
77
+ versusScreenSprite.ReplaceSpritesheet(BOSS_NAME_ANM2_LAYER, bossNamePNGPath);
78
+ versusScreenSprite.ReplaceSpritesheet(BOSS_PORTRAIT_ANM2_LAYER, bossPortraitPNGPath);
79
+ versusScreenSprite.LoadGraphics();
80
+ let backgroundColor = VERSUS_SCREEN_BACKGROUND_COLORS[DEFAULT_STAGE_ID];
81
+ if (customStage.versusScreen?.backgroundColor !== undefined) {
82
+ const { r, g, b, a } = customStage.versusScreen.backgroundColor;
83
+ backgroundColor = Color(r, g, b, a);
84
+ }
85
+ versusScreenBackgroundSprite.Color = backgroundColor;
86
+ let dirtSpotColor = VERSUS_SCREEN_DIRT_SPOT_COLORS[DEFAULT_STAGE_ID];
87
+ if (customStage.versusScreen?.dirtSpotColor !== undefined) {
88
+ const { r, g, b } = customStage.versusScreen.dirtSpotColor;
89
+ dirtSpotColor = Color(r, g, b);
90
+ }
91
+ versusScreenDirtSpotSprite.Color = dirtSpotColor;
92
+ for (const sprite of [
93
+ versusScreenBackgroundSprite,
94
+ versusScreenDirtSpotSprite,
95
+ versusScreenSprite,
96
+ ]) {
97
+ sprite.Play(VERSUS_SCREEN_ANIMATION_NAME, true);
98
+ sprite.PlaybackSpeed = VANILLA_VERSUS_PLAYBACK_SPEED;
99
+ }
100
+ }
101
+ /** Use the character of the 0th player. */
102
+ function getPlayerPNGPaths() {
103
+ const player = Isaac.GetPlayer();
104
+ const character = player.GetPlayerType();
105
+ let playerNamePNGFileName = PLAYER_NAME_PNG_FILE_NAMES[character];
106
+ if (playerNamePNGFileName === undefined) {
107
+ playerNamePNGFileName = PLAYER_NAME_PNG_FILE_NAMES[DEFAULT_CHARACTER];
108
+ }
109
+ const playerNamePNGPath = `${PNG_PATH_PREFIX}/${playerNamePNGFileName}`;
110
+ let playerPortraitFileName = PLAYER_PORTRAIT_PNG_FILE_NAMES[character];
111
+ if (playerNamePNGFileName === undefined) {
112
+ playerPortraitFileName = PLAYER_PORTRAIT_PNG_FILE_NAMES[DEFAULT_CHARACTER];
113
+ }
114
+ const playerPortraitPNGPath = `${PLAYER_PORTRAIT_PNG_PATH_PREFIX}/${playerPortraitFileName}`;
115
+ return [playerNamePNGPath, playerPortraitPNGPath];
116
+ }
117
+ /** Use the boss of the first boss found. */
118
+ function getBossPNGPaths() {
119
+ const bosses = getBosses();
120
+ const firstBoss = bosses[0];
121
+ // Prefer the PNG paths specified by the end-user, if any.
122
+ if (firstBoss !== undefined) {
123
+ const entityID = getEntityID(firstBoss);
124
+ const pngPaths = customBossPNGPaths.get(entityID);
125
+ if (pngPaths !== undefined) {
126
+ return pngPaths;
127
+ }
128
+ }
129
+ // If this is not a vanilla boss, default to showing question marks.
130
+ const bossID = firstBoss === undefined ? 0 : firstBoss.GetBossID();
131
+ if (bossID === 0) {
132
+ const questionMarkSprite = `${PNG_PATH_PREFIX}/${BOSS_NAME_PNG_FILE_NAMES[BossID.BLUE_BABY]}`;
133
+ const bossNamePNGPath = questionMarkSprite;
134
+ const bossPortraitPNGPath = questionMarkSprite;
135
+ return [bossNamePNGPath, bossPortraitPNGPath];
136
+ }
137
+ // If this is a vanilla boss, it will have a boss ID, and we can use the corresponding vanilla
138
+ // files.
139
+ const bossNamePNGFileName = BOSS_NAME_PNG_FILE_NAMES[bossID];
140
+ const bossNamePNGPath = `${PNG_PATH_PREFIX}/${bossNamePNGFileName}`;
141
+ const bossPortraitPNGFileName = BOSS_PORTRAIT_PNG_FILE_NAMES[bossID];
142
+ const bossPortraitPNGPath = `${PNG_PATH_PREFIX}/${bossPortraitPNGFileName}`;
143
+ return [bossNamePNGPath, bossPortraitPNGPath];
144
+ }
145
+ function finishVersusScreenAnimation() {
146
+ const hud = game.GetHUD();
147
+ v.run.showingBossVersusScreen = false;
148
+ unpause();
149
+ hud.SetVisible(true);
150
+ // The sound effect only plays once the versus cutscene is over.
151
+ sfxManager.Play(SoundEffect.CASTLE_PORTCULLIS);
152
+ }
153
+ // ModCallback.POST_RENDER (2)
154
+ export function versusScreenPostRender() {
155
+ if (!v.run.showingBossVersusScreen) {
156
+ return;
157
+ }
158
+ const isPaused = game.IsPaused();
159
+ if (isPaused) {
160
+ return;
161
+ }
162
+ if (versusScreenSprite.IsFinished(VERSUS_SCREEN_ANIMATION_NAME)) {
163
+ finishVersusScreenAnimation();
164
+ return;
165
+ }
166
+ const room = game.GetRoom();
167
+ const centerPos = room.GetCenterPos();
168
+ const position = Isaac.WorldToRenderPosition(centerPos);
169
+ // First, we render the background.
170
+ versusScreenBackgroundSprite.RenderLayer(BACKGROUND_ANM2_LAYER, position);
171
+ versusScreenBackgroundSprite.Update();
172
+ // Second, we render the overlay.
173
+ versusScreenSprite.RenderLayer(OVERLAY_ANM2_LAYER, position);
174
+ // Third, we render the dirt.
175
+ versusScreenDirtSpotSprite.RenderLayer(BOSS_DIRT_SPOT_ANM2_LAYER, position);
176
+ versusScreenDirtSpotSprite.RenderLayer(PLAYER_DIRT_SPOT_ANM2_LAYER, position);
177
+ versusScreenDirtSpotSprite.Update();
178
+ // Lastly, we render everything else.
179
+ for (const layerID of OTHER_ANM2_LAYERS) {
180
+ versusScreenSprite.RenderLayer(layerID, position);
181
+ }
182
+ versusScreenSprite.Update();
183
+ }
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc3VzU2NyZWVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mZWF0dXJlcy9jdXN0b21TdGFnZS92ZXJzdXNTY3JlZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLFdBQVcsRUFDWCxPQUFPLEdBQ1IsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM3RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLENBQUMsRUFBRSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sS0FBSyxDQUFD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
@@ -0,0 +1,183 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { ModCallbackCustom } from "../../enums/ModCallbackCustom";
3
+ import { isReflectionRender } from "../../functions/utils";
4
+ import { saveDataManager } from "../saveDataManager/exports";
5
+ import v, { debugDisplayTextCallbacks, setDebugDisplayEnabled } from "./v";
6
+ /**
7
+ * The debug display feature is only initialized when the extra console commands feature is
8
+ * initialized.
9
+ */
10
+ export function debugDisplayInit(mod) {
11
+ setDebugDisplayEnabled();
12
+ saveDataManager("debugDisplay", v, () => false);
13
+ mod.AddCallback(ModCallback.POST_FAMILIAR_RENDER, postFamiliarRender); // 25
14
+ mod.AddCallback(ModCallback.POST_NPC_RENDER, postNPCRender); // 28
15
+ mod.AddCallback(ModCallback.POST_PLAYER_RENDER, postPlayerRender); // 32
16
+ mod.AddCallback(ModCallback.POST_PICKUP_RENDER, postPickupRender); // 36
17
+ mod.AddCallback(ModCallback.POST_TEAR_RENDER, postTearRender); // 41
18
+ mod.AddCallback(ModCallback.POST_PROJECTILE_RENDER, postProjectileRender); // 45
19
+ mod.AddCallback(ModCallback.POST_LASER_RENDER, postLaserRender); // 49
20
+ mod.AddCallback(ModCallback.POST_KNIFE_RENDER, postKnifeRender); // 52
21
+ mod.AddCallback(ModCallback.POST_EFFECT_RENDER, postEffectRender); // 56
22
+ mod.AddCallback(ModCallback.POST_BOMB_RENDER, postBombRender); // 59
23
+ mod.AddCallbackCustom(ModCallbackCustom.POST_SLOT_RENDER, postSlotRender);
24
+ mod.AddCallbackCustom(ModCallbackCustom.POST_ROCK_RENDER, postRockRender);
25
+ mod.AddCallbackCustom(ModCallbackCustom.POST_PIT_RENDER, postPitRender);
26
+ mod.AddCallbackCustom(ModCallbackCustom.POST_SPIKES_RENDER, postSpikesRender);
27
+ mod.AddCallbackCustom(ModCallbackCustom.POST_TNT_RENDER, postTNTRender);
28
+ mod.AddCallbackCustom(ModCallbackCustom.POST_POOP_RENDER, postPoopRender);
29
+ mod.AddCallbackCustom(ModCallbackCustom.POST_DOOR_RENDER, postDoorRender);
30
+ mod.AddCallbackCustom(ModCallbackCustom.POST_PRESSURE_PLATE_RENDER, postPressurePlateRender);
31
+ }
32
+ function renderTextOnEntity(entity, text) {
33
+ if (isReflectionRender()) {
34
+ return;
35
+ }
36
+ const position = Isaac.WorldToScreen(entity.Position);
37
+ Isaac.RenderText(text, position.X, position.Y, 1, 1, 1, 1);
38
+ }
39
+ // ModCallback.POST_FAMILIAR_RENDER (25)
40
+ function postFamiliarRender(familiar) {
41
+ if (!v.run.familiar) {
42
+ return;
43
+ }
44
+ const text = debugDisplayTextCallbacks.familiar(familiar);
45
+ renderTextOnEntity(familiar, text);
46
+ }
47
+ // ModCallback.POST_NPC_RENDER (28)
48
+ function postNPCRender(npc) {
49
+ if (!v.run.npc) {
50
+ return;
51
+ }
52
+ const text = debugDisplayTextCallbacks.npc(npc);
53
+ renderTextOnEntity(npc, text);
54
+ }
55
+ // ModCallback.POST_PLAYER_RENDER (32)
56
+ function postPlayerRender(player) {
57
+ if (!v.run.player) {
58
+ return;
59
+ }
60
+ const text = debugDisplayTextCallbacks.player(player);
61
+ renderTextOnEntity(player, text);
62
+ }
63
+ // ModCallback.POST_PICKUP_RENDER (36)
64
+ function postPickupRender(pickup) {
65
+ if (!v.run.pickup) {
66
+ return;
67
+ }
68
+ const text = debugDisplayTextCallbacks.pickup(pickup);
69
+ renderTextOnEntity(pickup, text);
70
+ }
71
+ // ModCallback.POST_TEAR_RENDER (41)
72
+ function postTearRender(tear) {
73
+ if (!v.run.tear) {
74
+ return;
75
+ }
76
+ const text = debugDisplayTextCallbacks.tear(tear);
77
+ renderTextOnEntity(tear, text);
78
+ }
79
+ // ModCallback.POST_PROJECTILE_RENDER (45)
80
+ function postProjectileRender(projectile) {
81
+ if (!v.run.projectile) {
82
+ return;
83
+ }
84
+ const text = debugDisplayTextCallbacks.projectile(projectile);
85
+ renderTextOnEntity(projectile, text);
86
+ }
87
+ // ModCallback.POST_LASER_RENDER (49)
88
+ function postLaserRender(laser) {
89
+ if (!v.run.laser) {
90
+ return;
91
+ }
92
+ const text = debugDisplayTextCallbacks.laser(laser);
93
+ renderTextOnEntity(laser, text);
94
+ }
95
+ // ModCallback.POST_KNIFE_RENDER (52)
96
+ function postKnifeRender(knife) {
97
+ if (!v.run.knife) {
98
+ return;
99
+ }
100
+ const text = debugDisplayTextCallbacks.knife(knife);
101
+ renderTextOnEntity(knife, text);
102
+ }
103
+ // ModCallback.POST_EFFECT_RENDER (56)
104
+ function postEffectRender(effect) {
105
+ if (!v.run.effect) {
106
+ return;
107
+ }
108
+ const text = debugDisplayTextCallbacks.effect(effect);
109
+ renderTextOnEntity(effect, text);
110
+ }
111
+ // ModCallback.POST_BOMB_RENDER (59)
112
+ function postBombRender(bomb) {
113
+ if (!v.run.bomb) {
114
+ return;
115
+ }
116
+ const text = debugDisplayTextCallbacks.bomb(bomb);
117
+ renderTextOnEntity(bomb, text);
118
+ }
119
+ // ModCallbackCustom.POST_SLOT_RENDER
120
+ function postSlotRender(slot) {
121
+ if (!v.run.slot) {
122
+ return;
123
+ }
124
+ const text = debugDisplayTextCallbacks.slot(slot);
125
+ renderTextOnEntity(slot, text);
126
+ }
127
+ // ModCallbackCustom.POST_ROCK_RENDER
128
+ function postRockRender(rock) {
129
+ if (!v.run.rock) {
130
+ return;
131
+ }
132
+ const text = debugDisplayTextCallbacks.rock(rock);
133
+ renderTextOnEntity(rock, text);
134
+ }
135
+ // ModCallbackCustom.POST_PIT_RENDER
136
+ function postPitRender(pit) {
137
+ if (!v.run.pit) {
138
+ return;
139
+ }
140
+ const text = debugDisplayTextCallbacks.pit(pit);
141
+ renderTextOnEntity(pit, text);
142
+ }
143
+ // ModCallbackCustom.POST_SPIKES_RENDER
144
+ function postSpikesRender(spikes) {
145
+ if (!v.run.spikes) {
146
+ return;
147
+ }
148
+ const text = debugDisplayTextCallbacks.spikes(spikes);
149
+ renderTextOnEntity(spikes, text);
150
+ }
151
+ // ModCallbackCustom.POST_TNT_RENDER
152
+ function postTNTRender(tnt) {
153
+ if (!v.run.tnt) {
154
+ return;
155
+ }
156
+ const text = debugDisplayTextCallbacks.tnt(tnt);
157
+ renderTextOnEntity(tnt, text);
158
+ }
159
+ // ModCallbackCustom.POST_POOP_RENDER
160
+ function postPoopRender(poop) {
161
+ if (!v.run.poop) {
162
+ return;
163
+ }
164
+ const text = debugDisplayTextCallbacks.poop(poop);
165
+ renderTextOnEntity(poop, text);
166
+ }
167
+ // ModCallbackCustom.POST_DOOR_RENDER
168
+ function postDoorRender(door) {
169
+ if (!v.run.door) {
170
+ return;
171
+ }
172
+ const text = debugDisplayTextCallbacks.door(door);
173
+ renderTextOnEntity(door, text);
174
+ }
175
+ // ModCallbackCustom.POST_PRESSURE_PLATE_RENDER
176
+ function postPressurePlateRender(pressurePlate) {
177
+ if (!v.run.pressurePlate) {
178
+ return;
179
+ }
180
+ const text = debugDisplayTextCallbacks.pressurePlate(pressurePlate);
181
+ renderTextOnEntity(pressurePlate, text);
182
+ }
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWdEaXNwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mZWF0dXJlcy9kZWJ1Z0Rpc3BsYXkvZGVidWdEaXNwbGF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxDQUFDLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBZ0I7SUFDL0Msc0JBQXNCLEVBQUUsQ0FBQztJQUN6QixlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsS0FBSztJQUM1RSxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLO0lBQ2xFLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLO0lBQ3hFLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLO0lBQ3hFLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLGNBQWMs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