isaacscript-common 3.17.0 → 4.0.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 (425) hide show
  1. package/cachedClasses.ts +39 -0
  2. package/callbacks/customRevive.lua +2 -1
  3. package/callbacks/customRevive.ts +215 -0
  4. package/callbacks/itemPickup.ts +101 -0
  5. package/callbacks/postAmbush.ts +73 -0
  6. package/callbacks/postBombExploded.ts +26 -0
  7. package/callbacks/postBombInitLate.ts +36 -0
  8. package/callbacks/postBoneSwing.ts +64 -0
  9. package/callbacks/postCollectibleInitFirst.ts +40 -0
  10. package/callbacks/postCursedTeleport.lua +2 -1
  11. package/callbacks/postCursedTeleport.ts +185 -0
  12. package/callbacks/postCustomDoorEnter.lua +0 -7
  13. package/callbacks/postCustomDoorEnter.ts +292 -0
  14. package/callbacks/postDiceRoomActivated.ts +60 -0
  15. package/callbacks/postDoorRender.ts +26 -0
  16. package/callbacks/postDoorUpdate.ts +26 -0
  17. package/callbacks/postEffectInitLate.ts +36 -0
  18. package/callbacks/postEffectStateChanged.ts +43 -0
  19. package/callbacks/postEsauJr.lua +2 -1
  20. package/callbacks/postEsauJr.ts +109 -0
  21. package/callbacks/postFamiliarInitLate.ts +36 -0
  22. package/callbacks/postFamiliarStateChanged.ts +43 -0
  23. package/callbacks/postFlip.lua +4 -3
  24. package/callbacks/postFlip.ts +90 -0
  25. package/callbacks/postGreedModeWave.ts +41 -0
  26. package/callbacks/postGridEntity.ts +164 -0
  27. package/callbacks/postGridEntityCollision.ts +69 -0
  28. package/callbacks/postGridEntityRender.ts +26 -0
  29. package/callbacks/postHolyMantleRemoved.ts +55 -0
  30. package/callbacks/postItemDischarged.lua +4 -3
  31. package/callbacks/postItemDischarged.ts +154 -0
  32. package/callbacks/postKnifeInitLate.ts +36 -0
  33. package/callbacks/postLaserInitLate.ts +36 -0
  34. package/callbacks/postNPCInitLate.ts +36 -0
  35. package/callbacks/postNPCStateChanged.ts +42 -0
  36. package/callbacks/postNewRoomEarly.lua +2 -1
  37. package/callbacks/postNewRoomEarly.ts +96 -0
  38. package/callbacks/postPickupCollect.ts +48 -0
  39. package/callbacks/postPickupInitFirst.ts +70 -0
  40. package/callbacks/postPickupInitLate.ts +36 -0
  41. package/callbacks/postPickupStateChanged.ts +43 -0
  42. package/callbacks/postPitRender.ts +26 -0
  43. package/callbacks/postPitUpdate.ts +26 -0
  44. package/callbacks/postPlayerChangeHealth.ts +62 -0
  45. package/callbacks/postPlayerChangeType.ts +56 -0
  46. package/callbacks/postPlayerCollectible.ts +113 -0
  47. package/callbacks/postPlayerFatalDamage.ts +141 -0
  48. package/callbacks/postPlayerInitLate.ts +37 -0
  49. package/callbacks/postPlayerReordered.ts +142 -0
  50. package/callbacks/postPoopRender.ts +26 -0
  51. package/callbacks/postPoopUpdate.ts +26 -0
  52. package/callbacks/postPressurePlateRender.ts +26 -0
  53. package/callbacks/postPressurePlateUpdate.ts +26 -0
  54. package/callbacks/postProjectileInitLate.ts +36 -0
  55. package/callbacks/postPurchase.ts +64 -0
  56. package/callbacks/postRockRender.ts +26 -0
  57. package/callbacks/postRockUpdate.ts +26 -0
  58. package/callbacks/postRoomClearChanged.ts +57 -0
  59. package/callbacks/postSacrifice.lua +3 -2
  60. package/callbacks/postSacrifice.ts +64 -0
  61. package/callbacks/postSlotDestroyed.ts +92 -0
  62. package/callbacks/postSlotInitUpdate.ts +68 -0
  63. package/callbacks/postSlotRender.ts +69 -0
  64. package/callbacks/postSpikesRender.ts +26 -0
  65. package/callbacks/postSpikesUpdate.ts +26 -0
  66. package/callbacks/postTNTRender.ts +26 -0
  67. package/callbacks/postTNTUpdate.ts +26 -0
  68. package/callbacks/postTearInitLate.ts +36 -0
  69. package/callbacks/postTearInitVeryLate.ts +41 -0
  70. package/callbacks/postTransformation.ts +59 -0
  71. package/callbacks/postTrinketBreak.lua +3 -2
  72. package/callbacks/postTrinketBreak.ts +112 -0
  73. package/callbacks/preBerserkDeath.ts +49 -0
  74. package/callbacks/preNewLevel.ts +55 -0
  75. package/callbacks/reorderedCallbacks.lua +1 -0
  76. package/callbacks/reorderedCallbacks.ts +168 -0
  77. package/callbacks/subscriptions/postAmbushFinished.ts +32 -0
  78. package/callbacks/subscriptions/postAmbushStarted.ts +32 -0
  79. package/callbacks/subscriptions/postBombInitLate.ts +32 -0
  80. package/callbacks/subscriptions/postBoneExploded.ts +32 -0
  81. package/callbacks/subscriptions/postBoneSwing.ts +24 -0
  82. package/callbacks/subscriptions/postCollectibleInitFirst.ts +37 -0
  83. package/callbacks/subscriptions/postCursedTeleport.ts +24 -0
  84. package/callbacks/subscriptions/postCustomDoorEnter.ts +45 -0
  85. package/callbacks/subscriptions/postCustomRevive.ts +36 -0
  86. package/callbacks/subscriptions/postDiceRoomActivated.ts +38 -0
  87. package/callbacks/subscriptions/postDoorRender.ts +35 -0
  88. package/callbacks/subscriptions/postDoorUpdate.ts +35 -0
  89. package/callbacks/subscriptions/postEffectInitLate.ts +32 -0
  90. package/callbacks/subscriptions/postEffectStateChanged.ts +40 -0
  91. package/callbacks/subscriptions/postEsauJr.ts +24 -0
  92. package/callbacks/subscriptions/postFamiliarInitLate.ts +32 -0
  93. package/callbacks/subscriptions/postFamiliarStateChanged.ts +40 -0
  94. package/callbacks/subscriptions/postFirstEsauJr.ts +24 -0
  95. package/callbacks/subscriptions/postFirstFlip.ts +24 -0
  96. package/callbacks/subscriptions/postFlip.ts +22 -0
  97. package/callbacks/subscriptions/postGameStartedReordered.ts +24 -0
  98. package/callbacks/subscriptions/postGreedModeWave.ts +24 -0
  99. package/callbacks/subscriptions/postGridEntityBroken.ts +51 -0
  100. package/callbacks/subscriptions/postGridEntityCollision.ts +54 -0
  101. package/callbacks/subscriptions/postGridEntityInit.ts +51 -0
  102. package/callbacks/subscriptions/postGridEntityRemove.ts +52 -0
  103. package/callbacks/subscriptions/postGridEntityRender.ts +51 -0
  104. package/callbacks/subscriptions/postGridEntityStateChanged.ts +55 -0
  105. package/callbacks/subscriptions/postGridEntityUpdate.ts +51 -0
  106. package/callbacks/subscriptions/postHolyMantleRemoved.ts +48 -0
  107. package/callbacks/subscriptions/postItemDischarged.ts +43 -0
  108. package/callbacks/subscriptions/postItemPickup.ts +64 -0
  109. package/callbacks/subscriptions/postKnifeInitLate.ts +32 -0
  110. package/callbacks/subscriptions/postLaserInitLate.ts +32 -0
  111. package/callbacks/subscriptions/postNPCInitLate.ts +32 -0
  112. package/callbacks/subscriptions/postNPCStateChanged.ts +42 -0
  113. package/callbacks/subscriptions/postNewLevelReordered.ts +22 -0
  114. package/callbacks/subscriptions/postNewRoomEarly.ts +22 -0
  115. package/callbacks/subscriptions/postNewRoomReordered.ts +22 -0
  116. package/callbacks/subscriptions/postPEffectUpdateReordered.ts +40 -0
  117. package/callbacks/subscriptions/postPickupCollect.ts +35 -0
  118. package/callbacks/subscriptions/postPickupInitFirst.ts +32 -0
  119. package/callbacks/subscriptions/postPickupInitLate.ts +32 -0
  120. package/callbacks/subscriptions/postPickupStateChanged.ts +40 -0
  121. package/callbacks/subscriptions/postPitRender.ts +35 -0
  122. package/callbacks/subscriptions/postPitUpdate.ts +35 -0
  123. package/callbacks/subscriptions/postPlayerChangeHealth.ts +49 -0
  124. package/callbacks/subscriptions/postPlayerChangeType.ts +40 -0
  125. package/callbacks/subscriptions/postPlayerCollectibleAdded.d.ts +2 -3
  126. package/callbacks/subscriptions/postPlayerCollectibleAdded.lua +2 -7
  127. package/callbacks/subscriptions/postPlayerCollectibleAdded.ts +38 -0
  128. package/callbacks/subscriptions/postPlayerCollectibleRemoved.d.ts +2 -3
  129. package/callbacks/subscriptions/postPlayerCollectibleRemoved.lua +2 -7
  130. package/callbacks/subscriptions/postPlayerCollectibleRemoved.ts +38 -0
  131. package/callbacks/subscriptions/postPlayerFatalDamage.d.ts +1 -1
  132. package/callbacks/subscriptions/postPlayerFatalDamage.ts +68 -0
  133. package/callbacks/subscriptions/postPlayerInitLate.ts +40 -0
  134. package/callbacks/subscriptions/postPlayerInitReordered.ts +40 -0
  135. package/callbacks/subscriptions/postPlayerRenderReordered.ts +40 -0
  136. package/callbacks/subscriptions/postPlayerUpdateReordered.ts +40 -0
  137. package/callbacks/subscriptions/postPoopRender.ts +35 -0
  138. package/callbacks/subscriptions/postPoopUpdate.ts +35 -0
  139. package/callbacks/subscriptions/postPressurePlateRender.ts +37 -0
  140. package/callbacks/subscriptions/postPressurePlateUpdate.ts +37 -0
  141. package/callbacks/subscriptions/postProjectileInitLate.ts +35 -0
  142. package/callbacks/subscriptions/postPurchase.ts +31 -0
  143. package/callbacks/subscriptions/postRockRender.ts +35 -0
  144. package/callbacks/subscriptions/postRockUpdate.ts +35 -0
  145. package/callbacks/subscriptions/postRoomClearChanged.ts +30 -0
  146. package/callbacks/subscriptions/postSacrifice.ts +43 -0
  147. package/callbacks/subscriptions/postSlotAnimationChanged.ts +40 -0
  148. package/callbacks/subscriptions/postSlotDestroyed.ts +55 -0
  149. package/callbacks/subscriptions/postSlotInit.ts +32 -0
  150. package/callbacks/subscriptions/postSlotRender.ts +32 -0
  151. package/callbacks/subscriptions/postSlotUpdate.ts +32 -0
  152. package/callbacks/subscriptions/postSpikesRender.ts +35 -0
  153. package/callbacks/subscriptions/postSpikesUpdate.ts +35 -0
  154. package/callbacks/subscriptions/postTNTRender.ts +35 -0
  155. package/callbacks/subscriptions/postTNTUpdate.ts +35 -0
  156. package/callbacks/subscriptions/postTearInitLate.ts +32 -0
  157. package/callbacks/subscriptions/postTearInitVeryLate.ts +32 -0
  158. package/callbacks/subscriptions/postTransformation.ts +40 -0
  159. package/callbacks/subscriptions/postTrinketBreak.ts +38 -0
  160. package/callbacks/subscriptions/preBerserkDeath.d.ts +1 -1
  161. package/callbacks/subscriptions/preBerserkDeath.ts +42 -0
  162. package/callbacks/subscriptions/preCustomRevive.d.ts +1 -1
  163. package/callbacks/subscriptions/preCustomRevive.ts +46 -0
  164. package/callbacks/subscriptions/preItemPickup.ts +64 -0
  165. package/callbacks/subscriptions/preNewLevel.ts +24 -0
  166. package/classes/DefaultMap.ts +174 -0
  167. package/classes/ModUpgraded.d.ts +8 -4
  168. package/classes/ModUpgraded.lua +5 -8
  169. package/classes/ModUpgraded.ts +84 -0
  170. package/constants.ts +162 -0
  171. package/constantsFirstLast.ts +217 -0
  172. package/enums/AmbushType.ts +4 -0
  173. package/enums/HealthType.ts +16 -0
  174. package/enums/ModCallbackCustom.d.ts +20 -18
  175. package/enums/ModCallbackCustom.ts +1278 -0
  176. package/enums/PocketItemType.ts +8 -0
  177. package/enums/SerializationType.ts +5 -0
  178. package/enums/SlotDestructionType.ts +4 -0
  179. package/enums/private/CopyableIsaacAPIClassType.ts +7 -0
  180. package/enums/private/SaveDataKey.ts +14 -0
  181. package/enums/private/SerializationBrand.ts +42 -0
  182. package/features/characterHealthConversion.lua +2 -9
  183. package/features/characterHealthConversion.ts +111 -0
  184. package/features/characterStats.ts +61 -0
  185. package/features/debugDisplay/debugDisplay.ts +221 -0
  186. package/features/debugDisplay/exports.ts +368 -0
  187. package/features/debugDisplay/v.ts +65 -0
  188. package/features/deployJSONRoom.ts +743 -0
  189. package/features/disableInputs.ts +193 -0
  190. package/features/disableSound.ts +77 -0
  191. package/features/extraConsoleCommands/commandsDisplay.ts +290 -0
  192. package/features/extraConsoleCommands/commandsSubroutines.lua +1 -1
  193. package/features/extraConsoleCommands/commandsSubroutines.ts +139 -0
  194. package/features/extraConsoleCommands/init.ts +334 -0
  195. package/features/extraConsoleCommands/listCommands.ts +1299 -0
  196. package/features/extraConsoleCommands/v.ts +14 -0
  197. package/features/fadeInRemover.ts +60 -0
  198. package/features/fastReset.ts +75 -0
  199. package/features/forgottenSwitch.ts +50 -0
  200. package/features/getCollectibleItemPoolType.ts +66 -0
  201. package/features/persistentEntities.ts +183 -0
  202. package/features/playerInventory.lua +1 -0
  203. package/features/playerInventory.ts +135 -0
  204. package/features/ponyDetection.ts +74 -0
  205. package/features/preventCollectibleRotation.ts +115 -0
  206. package/features/runInNFrames.ts +148 -0
  207. package/features/saveDataManager/constants.ts +4 -0
  208. package/features/saveDataManager/exports.ts +229 -0
  209. package/features/saveDataManager/load.ts +99 -0
  210. package/features/saveDataManager/main.ts +195 -0
  211. package/features/saveDataManager/maps.ts +13 -0
  212. package/features/saveDataManager/merge.ts +194 -0
  213. package/features/saveDataManager/save.ts +74 -0
  214. package/features/saveDataManager/serializationBrand.ts +16 -0
  215. package/features/sirenHelpers.ts +129 -0
  216. package/features/taintedLazarusPlayers.ts +113 -0
  217. package/featuresInitialized.ts +20 -0
  218. package/functions/ambush.ts +47 -0
  219. package/functions/array.ts +410 -0
  220. package/functions/benchmark.ts +36 -0
  221. package/functions/bitwise.ts +24 -0
  222. package/functions/bombs.ts +12 -0
  223. package/functions/boss.ts +227 -0
  224. package/functions/cacheFlag.ts +12 -0
  225. package/functions/cards.lua +1 -1
  226. package/functions/cards.ts +271 -0
  227. package/functions/challenges.ts +13 -0
  228. package/functions/character.ts +126 -0
  229. package/functions/charge.ts +237 -0
  230. package/functions/chargeBar.ts +67 -0
  231. package/functions/collectibleCacheFlag.ts +90 -0
  232. package/functions/collectibleSet.ts +56 -0
  233. package/functions/collectibleTag.ts +89 -0
  234. package/functions/collectibles.ts +659 -0
  235. package/functions/color.d.ts +1 -1
  236. package/functions/color.lua +0 -7
  237. package/functions/color.ts +128 -0
  238. package/functions/debug.lua +2 -2
  239. package/functions/debug.ts +68 -0
  240. package/functions/deepCopy.lua +46 -51
  241. package/functions/deepCopy.ts +535 -0
  242. package/functions/deepCopyTests.ts +386 -0
  243. package/functions/direction.ts +49 -0
  244. package/functions/doors.lua +1 -2
  245. package/functions/doors.ts +347 -0
  246. package/functions/easing.ts +182 -0
  247. package/functions/eden.ts +47 -0
  248. package/functions/effects.ts +20 -0
  249. package/functions/entity.ts +439 -0
  250. package/functions/entitySpecific.ts +889 -0
  251. package/functions/entityTypes.ts +6 -0
  252. package/functions/enums.ts +146 -0
  253. package/functions/familiars.ts +106 -0
  254. package/functions/flag.ts +165 -0
  255. package/functions/flying.ts +117 -0
  256. package/functions/globals.d.ts +3 -3
  257. package/functions/globals.lua +8 -2
  258. package/functions/globals.ts +242 -0
  259. package/functions/gridEntity.ts +511 -0
  260. package/functions/gridEntitySpecific.ts +112 -0
  261. package/functions/input.ts +139 -0
  262. package/functions/isaacAPIClass.ts +67 -0
  263. package/functions/jsonHelpers.ts +45 -0
  264. package/functions/jsonRoom.ts +100 -0
  265. package/functions/kColor.d.ts +1 -1
  266. package/functions/kColor.lua +0 -7
  267. package/functions/kColor.ts +129 -0
  268. package/functions/language.ts +13 -0
  269. package/functions/level.ts +31 -0
  270. package/functions/log.ts +720 -0
  271. package/functions/map.ts +56 -0
  272. package/functions/math.ts +149 -0
  273. package/functions/mergeTests.ts +288 -0
  274. package/functions/npc.ts +148 -0
  275. package/functions/pickupVariants.ts +60 -0
  276. package/functions/pickups.ts +499 -0
  277. package/functions/pills.lua +1 -1
  278. package/functions/pills.ts +205 -0
  279. package/functions/player.lua +9 -20
  280. package/functions/player.ts +1056 -0
  281. package/functions/playerDataStructures.ts +150 -0
  282. package/functions/playerHealth.lua +28 -39
  283. package/functions/playerHealth.ts +382 -0
  284. package/functions/playerIndex.ts +195 -0
  285. package/functions/pocketItems.ts +149 -0
  286. package/functions/positionVelocity.ts +188 -0
  287. package/functions/random.ts +77 -0
  288. package/functions/revive.ts +201 -0
  289. package/functions/rng.d.ts +1 -1
  290. package/functions/rng.lua +0 -7
  291. package/functions/rng.ts +172 -0
  292. package/functions/roomData.ts +199 -0
  293. package/functions/roomGrid.ts +109 -0
  294. package/functions/roomShape.ts +80 -0
  295. package/functions/rooms.lua +1 -3
  296. package/functions/rooms.ts +648 -0
  297. package/functions/run.ts +36 -0
  298. package/functions/saveFile.ts +128 -0
  299. package/functions/seeds.ts +19 -0
  300. package/functions/serialization.lua +0 -3
  301. package/functions/serialization.ts +91 -0
  302. package/functions/set.ts +95 -0
  303. package/functions/sound.ts +9 -0
  304. package/functions/spawnCollectible.ts +104 -0
  305. package/functions/sprite.ts +107 -0
  306. package/functions/stage.ts +125 -0
  307. package/functions/string.ts +47 -0
  308. package/functions/table.ts +189 -0
  309. package/functions/tears.ts +32 -0
  310. package/functions/transformations.lua +1 -3
  311. package/functions/transformations.ts +131 -0
  312. package/functions/trinketCacheFlag.ts +60 -0
  313. package/functions/trinketGive.ts +157 -0
  314. package/functions/trinkets.ts +215 -0
  315. package/functions/tstlClass.ts +157 -0
  316. package/functions/types.ts +36 -0
  317. package/functions/ui.ts +138 -0
  318. package/functions/utils.d.ts +0 -37
  319. package/functions/utils.lua +0 -35
  320. package/functions/utils.ts +189 -0
  321. package/functions/vector.d.ts +1 -1
  322. package/functions/vector.lua +0 -7
  323. package/functions/vector.ts +126 -0
  324. package/index.ts +172 -0
  325. package/initCustomCallbacks.ts +132 -0
  326. package/initFeatures.ts +39 -0
  327. package/interfaces/AddCallbackParameterCustom.ts +188 -0
  328. package/interfaces/ChargeBarSprites.ts +12 -0
  329. package/interfaces/JSONDoor.d.ts +4 -4
  330. package/interfaces/JSONDoor.ts +13 -0
  331. package/interfaces/JSONEntity.d.ts +5 -5
  332. package/interfaces/JSONEntity.ts +16 -0
  333. package/interfaces/JSONRoom.d.ts +9 -9
  334. package/interfaces/JSONRoom.ts +36 -0
  335. package/interfaces/JSONRooms.ts +12 -0
  336. package/interfaces/JSONSpawn.d.ts +3 -3
  337. package/interfaces/JSONSpawn.ts +14 -0
  338. package/interfaces/PlayerHealth.ts +16 -0
  339. package/interfaces/PocketItemDescription.ts +9 -0
  340. package/interfaces/SaveData.ts +29 -0
  341. package/interfaces/TrinketSituation.ts +9 -0
  342. package/interfaces/private/TSTLClassMetatable.ts +8 -0
  343. package/maps/PHDPillConversions.ts +21 -0
  344. package/maps/cardMap.ts +209 -0
  345. package/maps/characterMap.ts +87 -0
  346. package/maps/collectibleDescriptionMap.ts +732 -0
  347. package/maps/collectibleNameMap.ts +731 -0
  348. package/maps/defaultPlayerStatMap.ts +17 -0
  349. package/maps/falsePHDPillConversions.ts +35 -0
  350. package/maps/gridEntityTypeToBrokenStateMap.ts +50 -0
  351. package/maps/gridEntityXMLMap.ts +176 -0
  352. package/maps/pillEffectMap.ts +88 -0
  353. package/maps/roomShapeToTopLeftWallGridIndexMap.ts +18 -0
  354. package/maps/roomTypeMap.ts +40 -0
  355. package/maps/trinketDescriptionMap.ts +200 -0
  356. package/maps/trinketNameMap.ts +198 -0
  357. package/objects/LRoomShapeToRectangles.ts +44 -0
  358. package/objects/callbackRegisterFunctions.ts +187 -0
  359. package/objects/cardDescriptions.ts +105 -0
  360. package/objects/cardNames.ts +105 -0
  361. package/objects/cardTypes.ts +104 -0
  362. package/objects/challengeNames.ts +52 -0
  363. package/objects/characterNames.ts +48 -0
  364. package/objects/coinSubTypeToValue.ts +14 -0
  365. package/objects/colors.ts +16 -0
  366. package/objects/directionNames.ts +11 -0
  367. package/objects/directionToDegrees.ts +11 -0
  368. package/objects/directionToVector.ts +12 -0
  369. package/objects/doorSlotFlagToDoorSlot.ts +16 -0
  370. package/objects/doorSlotToDirection.ts +14 -0
  371. package/objects/isaacAPIClassTypeToBrand.ts +11 -0
  372. package/objects/isaacAPIClassTypeToCopyFunction.ts +18 -0
  373. package/objects/languageNames.ts +13 -0
  374. package/objects/oppositeDoorSlots.ts +15 -0
  375. package/objects/pillEffectClasses.ts +63 -0
  376. package/objects/pillEffectNames.ts +57 -0
  377. package/objects/pillEffectTypes.ts +62 -0
  378. package/objects/roomShapeBounds.ts +71 -0
  379. package/objects/roomShapeLayoutSizes.ts +45 -0
  380. package/objects/roomShapeToBottomRightPosition.ts +25 -0
  381. package/objects/roomShapeToDoorSlots.ts +83 -0
  382. package/objects/roomShapeToDoorSlotsToGridIndexDelta.ts +127 -0
  383. package/objects/roomShapeToGridWidth.ts +21 -0
  384. package/objects/roomShapeToTopLeftPosition.ts +26 -0
  385. package/objects/roomShapeVolumes.ts +38 -0
  386. package/objects/roomTypeNames.ts +36 -0
  387. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.ts +14 -0
  388. package/objects/stageTypeToLetter.ts +15 -0
  389. package/objects/transformationNames.d.ts +0 -1
  390. package/objects/transformationNames.lua +0 -1
  391. package/objects/transformationNames.ts +18 -0
  392. package/package.json +2 -2
  393. package/patchErrorFunctions.ts +92 -0
  394. package/sets/LRoomShapesSet.ts +8 -0
  395. package/sets/bossSets.ts +470 -0
  396. package/sets/charactersThatStartWithAnActiveItemSet.ts +16 -0
  397. package/sets/charactersWithBlackHeartFromEternalHeartSet.ts +7 -0
  398. package/sets/charactersWithFreeDevilDealsSet.ts +4 -0
  399. package/sets/charactersWithNoRedHeartsSet.ts +17 -0
  400. package/sets/charactersWithNoSoulHeartsSet.ts +14 -0
  401. package/sets/chestPickupVariantsSet.ts +16 -0
  402. package/sets/familiarsThatShootPlayerTearsSet.ts +13 -0
  403. package/sets/lostStyleCharactersSet.ts +13 -0
  404. package/sets/mineShaftRoomSubTypesSet.ts +10 -0
  405. package/sets/redHeartSubTypesSet.ts +7 -0
  406. package/sets/sinEntityTypesSet.ts +11 -0
  407. package/sets/singleUseActiveCollectibleTypesSet.ts +13 -0
  408. package/sets/storyBossesSet.ts +17 -0
  409. package/types/AnyEntity.ts +12 -0
  410. package/types/AwaitingTextInput.d.ts +2 -0
  411. package/types/CollectibleIndex.d.ts +1 -1
  412. package/types/CollectibleIndex.ts +16 -0
  413. package/types/PickingUpItem.d.ts +3 -3
  414. package/types/PickingUpItem.ts +89 -0
  415. package/types/PlayerIndex.d.ts +1 -1
  416. package/types/PlayerIndex.ts +13 -0
  417. package/types/private/IsaacAPIClass.d.ts +1 -1
  418. package/types/private/IsaacAPIClass.ts +3 -0
  419. package/types/private/SerializedIsaacAPIClass.d.ts +1 -1
  420. package/types/private/SerializedIsaacAPIClass.ts +3 -0
  421. package/types/private/TSTLClass.d.ts +1 -1
  422. package/types/private/TSTLClass.ts +3 -0
  423. package/upgradeMod.d.ts +2 -2
  424. package/upgradeMod.lua +2 -2
  425. package/upgradeMod.ts +55 -0
@@ -0,0 +1,139 @@
1
+ import {
2
+ ButtonAction,
3
+ Controller,
4
+ ControllerIndex,
5
+ Keyboard,
6
+ } from "isaac-typescript-definitions";
7
+ import { MAX_NUM_INPUTS } from "../constants";
8
+ import { copySet } from "./set";
9
+ import { trimPrefix } from "./string";
10
+ import { erange } from "./utils";
11
+
12
+ const MODIFIER_KEYS: readonly Keyboard[] = [
13
+ Keyboard.LEFT_SHIFT, // 340
14
+ Keyboard.LEFT_CONTROL, // 341
15
+ Keyboard.LEFT_ALT, // 342
16
+ Keyboard.LEFT_SUPER, // 343
17
+ Keyboard.RIGHT_SHIFT, // 344
18
+ Keyboard.RIGHT_CONTROL, // 345
19
+ Keyboard.RIGHT_ALT, // 346
20
+ Keyboard.RIGHT_SUPER, // 347
21
+ ];
22
+
23
+ const MOVEMENT_ACTIONS: readonly ButtonAction[] = [
24
+ ButtonAction.LEFT, // 0
25
+ ButtonAction.RIGHT, // 1
26
+ ButtonAction.UP, // 2
27
+ ButtonAction.DOWN, // 3
28
+ ];
29
+
30
+ const MOVEMENT_ACTIONS_SET: ReadonlySet<ButtonAction> = new Set(
31
+ MOVEMENT_ACTIONS,
32
+ );
33
+
34
+ const SHOOTING_ACTIONS: readonly ButtonAction[] = [
35
+ ButtonAction.SHOOT_LEFT, // 4
36
+ ButtonAction.SHOOT_RIGHT, // 5
37
+ ButtonAction.SHOOT_UP, // 6
38
+ ButtonAction.SHOOT_DOWN, // 7
39
+ ];
40
+
41
+ const SHOOTING_ACTIONS_SET: ReadonlySet<ButtonAction> = new Set(
42
+ SHOOTING_ACTIONS,
43
+ );
44
+
45
+ /** Helper function to get the enum name for the specified `Controller` value. */
46
+ export function controllerToString(controller: Controller): string {
47
+ const key = Controller[controller];
48
+ if (key === undefined) {
49
+ return "unknown";
50
+ }
51
+
52
+ return trimPrefix(key, "BUTTON_");
53
+ }
54
+
55
+ export function getMoveActions(): Set<ButtonAction> {
56
+ return copySet(MOVEMENT_ACTIONS_SET);
57
+ }
58
+
59
+ export function getShootActions(): Set<ButtonAction> {
60
+ return copySet(SHOOTING_ACTIONS_SET);
61
+ }
62
+
63
+ /** Iterates over all inputs to determine if a particular button is pressed (i.e. held down). */
64
+ export function isActionPressedOnAnyInput(buttonAction: ButtonAction): boolean {
65
+ const validInputs = erange(MAX_NUM_INPUTS);
66
+ return validInputs.some((input) =>
67
+ Input.IsActionPressed(buttonAction, input),
68
+ );
69
+ }
70
+
71
+ /**
72
+ * Iterates over all inputs to determine if a particular button is triggered (i.e. held down and
73
+ * then released).
74
+ */
75
+ export function isActionTriggeredOnAnyInput(
76
+ buttonAction: ButtonAction,
77
+ ): boolean {
78
+ const validInputs = erange(MAX_NUM_INPUTS);
79
+ return validInputs.some((input) =>
80
+ Input.IsActionTriggered(buttonAction, input),
81
+ );
82
+ }
83
+
84
+ /**
85
+ * Helper function to see if a particular keyboard key is being pressed down by the player.
86
+ *
87
+ * This function is variadic, meaning you can pass as many keyboard values as you want to check for.
88
+ * This function will return true if any of the values are pressed.
89
+ */
90
+ export function isKeyboardPressed(...keys: Keyboard[]): boolean {
91
+ return keys.some((key) =>
92
+ Input.IsButtonPressed(key, ControllerIndex.KEYBOARD),
93
+ );
94
+ }
95
+
96
+ /**
97
+ * Helper function to check if one or more modifier keys are being pressed down on the keyboard.
98
+ *
99
+ * A modifier key is defined as shift, control, alt, or Windows.
100
+ */
101
+ export function isModifierKeyPressed(): boolean {
102
+ return isKeyboardPressed(...MODIFIER_KEYS);
103
+ }
104
+
105
+ export function isMoveAction(buttonAction: ButtonAction): boolean {
106
+ return MOVEMENT_ACTIONS_SET.has(buttonAction);
107
+ }
108
+
109
+ export function isMoveActionPressedOnAnyInput(): boolean {
110
+ return MOVEMENT_ACTIONS.some((moveAction) =>
111
+ isActionPressedOnAnyInput(moveAction),
112
+ );
113
+ }
114
+
115
+ export function isMoveActionTriggeredOnAnyInput(): boolean {
116
+ return MOVEMENT_ACTIONS.some((moveAction) =>
117
+ isActionTriggeredOnAnyInput(moveAction),
118
+ );
119
+ }
120
+
121
+ export function isShootAction(buttonAction: ButtonAction): boolean {
122
+ return SHOOTING_ACTIONS_SET.has(buttonAction);
123
+ }
124
+
125
+ export function isShootActionPressedOnAnyInput(): boolean {
126
+ return SHOOTING_ACTIONS.some((shootAction) =>
127
+ isActionPressedOnAnyInput(shootAction),
128
+ );
129
+ }
130
+
131
+ export function isShootActionTriggeredOnAnyInput(): boolean {
132
+ return SHOOTING_ACTIONS.some((shootAction) =>
133
+ isActionTriggeredOnAnyInput(shootAction),
134
+ );
135
+ }
136
+
137
+ export function keyboardToString(keyboard: Keyboard): string {
138
+ return Keyboard[keyboard] ?? "unknown";
139
+ }
@@ -0,0 +1,67 @@
1
+ import { IsaacAPIClass } from "../types/private/IsaacAPIClass";
2
+ import { isString, isUserdata } from "./types";
3
+
4
+ /**
5
+ * Helper function to get the name of a class from the Isaac API. This is contained within the
6
+ * "__type" metatable key.
7
+ *
8
+ * For example, a `Vector` class is has a name of "Vector".
9
+ *
10
+ * Returns undefined if the object is not of type `userdata` or if the "__type" metatable key does
11
+ * not exist.
12
+ */
13
+ export function getIsaacAPIClassName(object: unknown): string | undefined {
14
+ if (!isUserdata(object)) {
15
+ return undefined;
16
+ }
17
+
18
+ const metatable = getmetatable(object) as
19
+ | LuaTable<AnyNotNil, unknown>
20
+ | undefined;
21
+ if (metatable === undefined) {
22
+ return undefined;
23
+ }
24
+
25
+ const classType = metatable.get("__type");
26
+ if (!isString(classType)) {
27
+ return undefined;
28
+ }
29
+
30
+ return classType;
31
+ }
32
+
33
+ /**
34
+ * Helper function to check if something is an instantiated class from the Isaac API. (All classes
35
+ * from the Isaac API have a type of "userdata" in Lua with a metatable key of "__type" equal to the
36
+ * name of the class.)
37
+ */
38
+ export function isIsaacAPIClass(object: unknown): object is IsaacAPIClass {
39
+ const isaacAPIClassType = getIsaacAPIClassName(object);
40
+ return isaacAPIClassType !== undefined;
41
+ }
42
+
43
+ export function isIsaacAPIClassOfType(
44
+ object: unknown,
45
+ classType: string,
46
+ ): boolean {
47
+ const isaacAPIClassType = getIsaacAPIClassName(object);
48
+ return (
49
+ isaacAPIClassType === classType ||
50
+ isaacAPIClassType === `const ${classType}`
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Helper function to check if an instantiated Isaac API class is equal to another one of the same
56
+ * type. You must provide the list of keys to check for.
57
+ */
58
+ export function isaacAPIClassEquals(
59
+ object1: unknown,
60
+ object2: unknown,
61
+ keys: string[],
62
+ ): boolean {
63
+ const table1 = object1 as LuaTable<AnyNotNil, unknown>;
64
+ const table2 = object2 as LuaTable<AnyNotNil, unknown>;
65
+
66
+ return keys.every((key) => table1.get(key) === table2.get(key));
67
+ }
@@ -0,0 +1,45 @@
1
+ import * as json from "json";
2
+ import { logError } from "./log";
3
+
4
+ function tryDecode(this: void, jsonString: string) {
5
+ return json.decode(jsonString) as LuaTable;
6
+ }
7
+
8
+ function tryEncode(this: void, luaTable: unknown) {
9
+ return json.encode(luaTable);
10
+ }
11
+
12
+ /**
13
+ * Converts a JSON string to a Lua table.
14
+ *
15
+ * In most cases, this function will be used for reading data from a "save#.dat" file. If decoding
16
+ * fails, it will return a blank Lua table instead of throwing an error. (This allows execution to
17
+ * continue in cases where users have no current save data or have manually removed their existing
18
+ * save data.)
19
+ */
20
+ export function jsonDecode(jsonString: string): LuaTable<AnyNotNil, unknown> {
21
+ const [ok, luaTableOrErrMsg] = pcall(tryDecode, jsonString);
22
+ if (!ok) {
23
+ // Instead of throwing an error, continue execution of the callback.
24
+ logError(`Failed to convert the JSON string to a Lua table: ${jsonString}`);
25
+ return new LuaTable();
26
+ }
27
+
28
+ return luaTableOrErrMsg;
29
+ }
30
+
31
+ /**
32
+ * Converts a Lua table to a JSON string.
33
+ *
34
+ * In most cases, this function will be used for writing data to a "save#.dat" file. If encoding
35
+ * fails, it will throw an error to prevent writing a blank string or corrupted data to a user's
36
+ * "save#.dat" file.
37
+ */
38
+ export function jsonEncode(luaTable: unknown): string {
39
+ const [ok, jsonStringOrErrMsg] = pcall(tryEncode, luaTable);
40
+ if (!ok) {
41
+ error(`Failed to convert the Lua table to JSON: ${jsonStringOrErrMsg}`);
42
+ }
43
+
44
+ return jsonStringOrErrMsg;
45
+ }
@@ -0,0 +1,100 @@
1
+ import { JSONRoom } from "../interfaces/JSONRoom";
2
+ import { sumArray } from "./array";
3
+ import { log } from "./log";
4
+ import { getRandomFloat } from "./random";
5
+ import { getRandomSeed } from "./rng";
6
+
7
+ export function getJSONRoomOfVariant(
8
+ jsonRooms: JSONRoom[],
9
+ variant: int,
10
+ ): JSONRoom | undefined {
11
+ const jsonRoomsOfVariant = jsonRooms.filter((jsonRoom) => {
12
+ const roomVariantString = jsonRoom.$.variant;
13
+ const roomVariant = tonumber(roomVariantString);
14
+ return roomVariant === variant;
15
+ });
16
+
17
+ // The room variant acts as an ID for the room. We assume that there should only be a single room
18
+ // per variant.
19
+ if (jsonRoomsOfVariant.length === 0) {
20
+ return undefined;
21
+ }
22
+
23
+ if (jsonRoomsOfVariant.length === 1) {
24
+ return jsonRoomsOfVariant[0];
25
+ }
26
+
27
+ return error(
28
+ `Found ${jsonRoomsOfVariant.length} JSON rooms with a variant of ${variant}, when there should only be 1.`,
29
+ );
30
+ }
31
+
32
+ export function getJSONRoomsOfSubType(
33
+ jsonRooms: JSONRoom[],
34
+ subType: int,
35
+ ): JSONRoom[] {
36
+ return jsonRooms.filter((jsonRoom) => {
37
+ const roomSubTypeString = jsonRoom.$.subtype;
38
+ const roomSubType = tonumber(roomSubTypeString);
39
+ return roomSubType === subType;
40
+ });
41
+ }
42
+
43
+ /**
44
+ * Helper function to get a random JSON room from an array of JSON rooms.
45
+ *
46
+ * Note that this function does not simply choose a random element in the provided array; it will
47
+ * properly account for each room weight using the algorithm from:
48
+ * https://stackoverflow.com/questions/1761626/weighted-random-numbers
49
+ */
50
+ export function getRandomJSONRoom(
51
+ jsonRooms: JSONRoom[],
52
+ seedOrRNG: Seed | RNG = getRandomSeed(),
53
+ verbose = false,
54
+ ): JSONRoom {
55
+ const totalWeight = getTotalWeightOfJSONRooms(jsonRooms);
56
+ if (verbose) {
57
+ log(`Total weight of the JSON rooms provided: ${totalWeight}`);
58
+ }
59
+
60
+ const chosenWeight = getRandomFloat(0, totalWeight, seedOrRNG);
61
+ if (verbose) {
62
+ log(`Randomly chose weight for JSON room: ${chosenWeight}`);
63
+ }
64
+
65
+ return getJSONRoomWithChosenWeight(jsonRooms, chosenWeight);
66
+ }
67
+
68
+ function getTotalWeightOfJSONRooms(jsonRooms: JSONRoom[]) {
69
+ const weights = jsonRooms.map((jsonRoom) => {
70
+ const roomWeightString = jsonRoom.$.weight;
71
+ const roomWeight = tonumber(roomWeightString);
72
+ if (roomWeight === undefined) {
73
+ error(`Failed to parse the weight of a JSON room: ${roomWeightString}.`);
74
+ }
75
+ return roomWeight;
76
+ });
77
+
78
+ return sumArray(weights);
79
+ }
80
+
81
+ function getJSONRoomWithChosenWeight(
82
+ jsonRooms: JSONRoom[],
83
+ chosenWeight: float,
84
+ ) {
85
+ for (const jsonRoom of jsonRooms) {
86
+ const roomWeightString = jsonRoom.$.weight;
87
+ const roomWeight = tonumber(roomWeightString);
88
+ if (roomWeight === undefined) {
89
+ error(`Failed to parse the weight of a JSON room: ${roomWeightString}`);
90
+ }
91
+
92
+ if (chosenWeight < roomWeight) {
93
+ return jsonRoom;
94
+ }
95
+
96
+ chosenWeight -= roomWeight;
97
+ }
98
+
99
+ return error(`Failed to get a JSON room with chosen weight: ${chosenWeight}`);
100
+ }
@@ -2,7 +2,7 @@
2
2
  /// <reference types="typescript-to-lua/language-extensions" />
3
3
  import { SerializationType } from "../enums/SerializationType";
4
4
  declare type SerializedKColor = LuaTable<string, unknown> & {
5
- __serializedKColorBrand: void;
5
+ readonly __serializedKColorBrand: unique symbol;
6
6
  };
7
7
  interface CopyKColorReturn {
8
8
  [SerializationType.NONE]: KColor;
@@ -13,8 +13,6 @@ local getNumbersFromTable = ____table.getNumbersFromTable
13
13
  local tableHasKeys = ____table.tableHasKeys
14
14
  local ____types = require("functions.types")
15
15
  local isTable = ____types.isTable
16
- local ____utils = require("functions.utils")
17
- local ensureAllCases = ____utils.ensureAllCases
18
16
  --- Helper function to check if something is an instantiated KColor object.
19
17
  function ____exports.isKColor(self, object)
20
18
  return isIsaacAPIClassOfType(nil, object, OBJECT_NAME)
@@ -80,11 +78,6 @@ function ____exports.copyKColor(self, kColor, serializationType)
80
78
  return KColor(r, g, b, a)
81
79
  end
82
80
  end
83
- do
84
- do
85
- return ensureAllCases(nil, serializationType)
86
- end
87
- end
88
81
  until true
89
82
  end
90
83
  --- Returns `KColor(1, 1, 1, 1)`.
@@ -0,0 +1,129 @@
1
+ import { SerializationBrand } from "../enums/private/SerializationBrand";
2
+ import { SerializationType } from "../enums/SerializationType";
3
+ import { isaacAPIClassEquals, isIsaacAPIClassOfType } from "./isaacAPIClass";
4
+ import { copyValuesToTable, getNumbersFromTable, tableHasKeys } from "./table";
5
+ import { isTable } from "./types";
6
+
7
+ type SerializedKColor = LuaTable<string, unknown> & {
8
+ readonly __serializedKColorBrand: unique symbol;
9
+ };
10
+
11
+ interface CopyKColorReturn {
12
+ [SerializationType.NONE]: KColor;
13
+ [SerializationType.SERIALIZE]: SerializedKColor;
14
+ [SerializationType.DESERIALIZE]: KColor;
15
+ }
16
+
17
+ const KEYS = ["Red", "Green", "Blue", "Alpha"];
18
+ const OBJECT_NAME = "KColor";
19
+
20
+ /**
21
+ * Helper function to copy a `KColor` object.
22
+ *
23
+ * @param kColor The KColor object to copy. In the case of deserialization, this will actually be a
24
+ * Lua table instead of an instantiated KColor class.
25
+ * @param serializationType Default is `SerializationType.NONE`.
26
+ */
27
+ export function copyKColor<
28
+ K extends KColor | SerializedKColor,
29
+ S extends SerializationType,
30
+ >(kColor: K, serializationType: S): CopyKColorReturn[S];
31
+ export function copyKColor<K extends KColor | SerializedKColor>(
32
+ kColor: K,
33
+ ): CopyKColorReturn[SerializationType.NONE];
34
+ export function copyKColor(
35
+ kColor: KColor | SerializedKColor,
36
+ serializationType = SerializationType.NONE,
37
+ ): CopyKColorReturn[keyof CopyKColorReturn] {
38
+ switch (serializationType) {
39
+ case SerializationType.NONE: {
40
+ if (!isKColor(kColor)) {
41
+ error(
42
+ `Failed to copy a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`,
43
+ );
44
+ }
45
+
46
+ return KColor(kColor.Red, kColor.Green, kColor.Blue, kColor.Alpha);
47
+ }
48
+
49
+ case SerializationType.SERIALIZE: {
50
+ if (!isKColor(kColor)) {
51
+ error(
52
+ `Failed to serialize a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`,
53
+ );
54
+ }
55
+
56
+ const kColorTable = new LuaTable<string, unknown>();
57
+ copyValuesToTable(kColor, KEYS, kColorTable);
58
+ kColorTable.set(SerializationBrand.K_COLOR, "");
59
+ return kColorTable as SerializedKColor;
60
+ }
61
+
62
+ case SerializationType.DESERIALIZE: {
63
+ if (!isTable(kColor)) {
64
+ error(
65
+ `Failed to deserialize a ${OBJECT_NAME} object since the provided object was not a Lua table.`,
66
+ );
67
+ }
68
+
69
+ const [r, g, b, a] = getNumbersFromTable(
70
+ kColor as LuaTable<string, unknown>,
71
+ OBJECT_NAME,
72
+ ...KEYS,
73
+ );
74
+
75
+ if (r === undefined) {
76
+ error(
77
+ `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: r`,
78
+ );
79
+ }
80
+ if (g === undefined) {
81
+ error(
82
+ `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: g`,
83
+ );
84
+ }
85
+ if (b === undefined) {
86
+ error(
87
+ `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: b`,
88
+ );
89
+ }
90
+ if (a === undefined) {
91
+ error(
92
+ `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: a`,
93
+ );
94
+ }
95
+
96
+ return KColor(r, g, b, a);
97
+ }
98
+ }
99
+ }
100
+
101
+ /** Returns `KColor(1, 1, 1, 1)`. */
102
+ export function getDefaultKColor(): KColor {
103
+ return KColor(1, 1, 1, 1);
104
+ }
105
+
106
+ /** Helper function to check if something is an instantiated KColor object. */
107
+ export function isKColor(object: unknown): object is KColor {
108
+ return isIsaacAPIClassOfType(object, OBJECT_NAME);
109
+ }
110
+
111
+ /**
112
+ * Used to determine is the given table is a serialized `KColor` object created by the save data
113
+ * manager and/or the `deepCopy` function.
114
+ */
115
+ export function isSerializedKColor(
116
+ object: unknown,
117
+ ): object is SerializedKColor {
118
+ if (!isTable(object)) {
119
+ return false;
120
+ }
121
+
122
+ return (
123
+ tableHasKeys(object, ...KEYS) && object.has(SerializationBrand.K_COLOR)
124
+ );
125
+ }
126
+
127
+ export function kColorEquals(kColor1: KColor, kColor2: KColor): boolean {
128
+ return isaacAPIClassEquals(kColor1, kColor2, KEYS);
129
+ }
@@ -0,0 +1,13 @@
1
+ import { LANGUAGE_NAMES } from "../objects/languageNames";
2
+
3
+ /**
4
+ * Helper function to convert the language abbreviation from `Options.Language` to the "full"
5
+ * language name.
6
+ *
7
+ * For example, if the current language is set to Korean, `Options.Language` will be set to "kr",
8
+ * and this function will return "Korean".
9
+ */
10
+ export function getLanguageName(): string {
11
+ const languageAbbreviation = Options.Language;
12
+ return LANGUAGE_NAMES[languageAbbreviation];
13
+ }
@@ -0,0 +1,31 @@
1
+ import { DoorSlot } from "isaac-typescript-definitions";
2
+ import { game } from "../cachedClasses";
3
+ import { getEnumValues } from "./enums";
4
+ import {
5
+ getNumRooms,
6
+ getRooms,
7
+ isDoorSlotValidAtGridIndexForRedRoom,
8
+ } from "./rooms";
9
+
10
+ export function fillLevelWithRedRooms(): void {
11
+ const level = game.GetLevel();
12
+
13
+ let numRooms: int;
14
+ do {
15
+ const rooms = getRooms();
16
+ numRooms = rooms.length;
17
+
18
+ for (const roomDescriptor of rooms) {
19
+ for (const doorSlot of getEnumValues(DoorSlot)) {
20
+ if (
21
+ isDoorSlotValidAtGridIndexForRedRoom(
22
+ doorSlot,
23
+ roomDescriptor.GridIndex,
24
+ )
25
+ ) {
26
+ level.MakeRedRoomDoor(roomDescriptor.GridIndex, doorSlot);
27
+ }
28
+ }
29
+ }
30
+ } while (numRooms !== getNumRooms());
31
+ }