isaacscript-common 4.0.1-dev.0 → 4.0.4

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 (378) hide show
  1. package/callbacks/postCursedTeleport.lua +2 -1
  2. package/callbacks/postEsauJr.lua +2 -1
  3. package/callbacks/postFlip.lua +4 -3
  4. package/callbacks/postItemDischarged.lua +4 -3
  5. package/callbacks/postNewRoomEarly.lua +2 -1
  6. package/callbacks/postSacrifice.lua +3 -2
  7. package/callbacks/postTrinketBreak.lua +3 -2
  8. package/callbacks/reorderedCallbacks.lua +1 -0
  9. package/classes/ModUpgraded.d.ts +5 -1
  10. package/classes/ModUpgraded.lua +2 -2
  11. package/features/playerInventory.lua +1 -0
  12. package/functions/player.lua +9 -14
  13. package/package.json +2 -2
  14. package/cachedClasses.ts +0 -39
  15. package/callbacks/customRevive.ts +0 -215
  16. package/callbacks/itemPickup.ts +0 -101
  17. package/callbacks/postAmbush.ts +0 -73
  18. package/callbacks/postBombExploded.ts +0 -26
  19. package/callbacks/postBombInitLate.ts +0 -36
  20. package/callbacks/postBoneSwing.ts +0 -64
  21. package/callbacks/postCollectibleInitFirst.ts +0 -40
  22. package/callbacks/postCursedTeleport.ts +0 -183
  23. package/callbacks/postCustomDoorEnter.ts +0 -292
  24. package/callbacks/postDiceRoomActivated.ts +0 -60
  25. package/callbacks/postDoorRender.ts +0 -26
  26. package/callbacks/postDoorUpdate.ts +0 -26
  27. package/callbacks/postEffectInitLate.ts +0 -36
  28. package/callbacks/postEffectStateChanged.ts +0 -43
  29. package/callbacks/postEsauJr.ts +0 -107
  30. package/callbacks/postFamiliarInitLate.ts +0 -36
  31. package/callbacks/postFamiliarStateChanged.ts +0 -43
  32. package/callbacks/postFlip.ts +0 -88
  33. package/callbacks/postGreedModeWave.ts +0 -41
  34. package/callbacks/postGridEntity.ts +0 -164
  35. package/callbacks/postGridEntityCollision.ts +0 -69
  36. package/callbacks/postGridEntityRender.ts +0 -26
  37. package/callbacks/postHolyMantleRemoved.ts +0 -55
  38. package/callbacks/postItemDischarged.ts +0 -149
  39. package/callbacks/postKnifeInitLate.ts +0 -36
  40. package/callbacks/postLaserInitLate.ts +0 -36
  41. package/callbacks/postNPCInitLate.ts +0 -36
  42. package/callbacks/postNPCStateChanged.ts +0 -42
  43. package/callbacks/postNewRoomEarly.ts +0 -90
  44. package/callbacks/postPickupCollect.ts +0 -48
  45. package/callbacks/postPickupInitFirst.ts +0 -70
  46. package/callbacks/postPickupInitLate.ts +0 -36
  47. package/callbacks/postPickupStateChanged.ts +0 -43
  48. package/callbacks/postPitRender.ts +0 -26
  49. package/callbacks/postPitUpdate.ts +0 -26
  50. package/callbacks/postPlayerChangeHealth.ts +0 -62
  51. package/callbacks/postPlayerChangeType.ts +0 -56
  52. package/callbacks/postPlayerCollectible.ts +0 -113
  53. package/callbacks/postPlayerFatalDamage.ts +0 -141
  54. package/callbacks/postPlayerInitLate.ts +0 -37
  55. package/callbacks/postPlayerReordered.ts +0 -142
  56. package/callbacks/postPoopRender.ts +0 -26
  57. package/callbacks/postPoopUpdate.ts +0 -26
  58. package/callbacks/postPressurePlateRender.ts +0 -26
  59. package/callbacks/postPressurePlateUpdate.ts +0 -26
  60. package/callbacks/postProjectileInitLate.ts +0 -36
  61. package/callbacks/postPurchase.ts +0 -64
  62. package/callbacks/postRockRender.ts +0 -26
  63. package/callbacks/postRockUpdate.ts +0 -26
  64. package/callbacks/postRoomClearChanged.ts +0 -57
  65. package/callbacks/postSacrifice.ts +0 -62
  66. package/callbacks/postSlotDestroyed.ts +0 -92
  67. package/callbacks/postSlotInitUpdate.ts +0 -68
  68. package/callbacks/postSlotRender.ts +0 -69
  69. package/callbacks/postSpikesRender.ts +0 -26
  70. package/callbacks/postSpikesUpdate.ts +0 -26
  71. package/callbacks/postTNTRender.ts +0 -26
  72. package/callbacks/postTNTUpdate.ts +0 -26
  73. package/callbacks/postTearInitLate.ts +0 -36
  74. package/callbacks/postTearInitVeryLate.ts +0 -41
  75. package/callbacks/postTransformation.ts +0 -59
  76. package/callbacks/postTrinketBreak.ts +0 -110
  77. package/callbacks/preBerserkDeath.ts +0 -49
  78. package/callbacks/preNewLevel.ts +0 -55
  79. package/callbacks/reorderedCallbacks.ts +0 -166
  80. package/callbacks/subscriptions/postAmbushFinished.ts +0 -32
  81. package/callbacks/subscriptions/postAmbushStarted.ts +0 -32
  82. package/callbacks/subscriptions/postBombInitLate.ts +0 -32
  83. package/callbacks/subscriptions/postBoneExploded.ts +0 -32
  84. package/callbacks/subscriptions/postBoneSwing.ts +0 -24
  85. package/callbacks/subscriptions/postCollectibleInitFirst.ts +0 -37
  86. package/callbacks/subscriptions/postCursedTeleport.ts +0 -24
  87. package/callbacks/subscriptions/postCustomDoorEnter.ts +0 -45
  88. package/callbacks/subscriptions/postCustomRevive.ts +0 -36
  89. package/callbacks/subscriptions/postDiceRoomActivated.ts +0 -38
  90. package/callbacks/subscriptions/postDoorRender.ts +0 -35
  91. package/callbacks/subscriptions/postDoorUpdate.ts +0 -35
  92. package/callbacks/subscriptions/postEffectInitLate.ts +0 -32
  93. package/callbacks/subscriptions/postEffectStateChanged.ts +0 -40
  94. package/callbacks/subscriptions/postEsauJr.ts +0 -24
  95. package/callbacks/subscriptions/postFamiliarInitLate.ts +0 -32
  96. package/callbacks/subscriptions/postFamiliarStateChanged.ts +0 -40
  97. package/callbacks/subscriptions/postFirstEsauJr.ts +0 -24
  98. package/callbacks/subscriptions/postFirstFlip.ts +0 -24
  99. package/callbacks/subscriptions/postFlip.ts +0 -22
  100. package/callbacks/subscriptions/postGameStartedReordered.ts +0 -24
  101. package/callbacks/subscriptions/postGreedModeWave.ts +0 -24
  102. package/callbacks/subscriptions/postGridEntityBroken.ts +0 -51
  103. package/callbacks/subscriptions/postGridEntityCollision.ts +0 -54
  104. package/callbacks/subscriptions/postGridEntityInit.ts +0 -51
  105. package/callbacks/subscriptions/postGridEntityRemove.ts +0 -52
  106. package/callbacks/subscriptions/postGridEntityRender.ts +0 -51
  107. package/callbacks/subscriptions/postGridEntityStateChanged.ts +0 -55
  108. package/callbacks/subscriptions/postGridEntityUpdate.ts +0 -51
  109. package/callbacks/subscriptions/postHolyMantleRemoved.ts +0 -48
  110. package/callbacks/subscriptions/postItemDischarged.ts +0 -43
  111. package/callbacks/subscriptions/postItemPickup.ts +0 -64
  112. package/callbacks/subscriptions/postKnifeInitLate.ts +0 -32
  113. package/callbacks/subscriptions/postLaserInitLate.ts +0 -32
  114. package/callbacks/subscriptions/postNPCInitLate.ts +0 -32
  115. package/callbacks/subscriptions/postNPCStateChanged.ts +0 -42
  116. package/callbacks/subscriptions/postNewLevelReordered.ts +0 -22
  117. package/callbacks/subscriptions/postNewRoomEarly.ts +0 -22
  118. package/callbacks/subscriptions/postNewRoomReordered.ts +0 -22
  119. package/callbacks/subscriptions/postPEffectUpdateReordered.ts +0 -40
  120. package/callbacks/subscriptions/postPickupCollect.ts +0 -35
  121. package/callbacks/subscriptions/postPickupInitFirst.ts +0 -32
  122. package/callbacks/subscriptions/postPickupInitLate.ts +0 -32
  123. package/callbacks/subscriptions/postPickupStateChanged.ts +0 -40
  124. package/callbacks/subscriptions/postPitRender.ts +0 -35
  125. package/callbacks/subscriptions/postPitUpdate.ts +0 -35
  126. package/callbacks/subscriptions/postPlayerChangeHealth.ts +0 -49
  127. package/callbacks/subscriptions/postPlayerChangeType.ts +0 -40
  128. package/callbacks/subscriptions/postPlayerCollectibleAdded.ts +0 -38
  129. package/callbacks/subscriptions/postPlayerCollectibleRemoved.ts +0 -38
  130. package/callbacks/subscriptions/postPlayerFatalDamage.ts +0 -68
  131. package/callbacks/subscriptions/postPlayerInitLate.ts +0 -40
  132. package/callbacks/subscriptions/postPlayerInitReordered.ts +0 -40
  133. package/callbacks/subscriptions/postPlayerRenderReordered.ts +0 -40
  134. package/callbacks/subscriptions/postPlayerUpdateReordered.ts +0 -40
  135. package/callbacks/subscriptions/postPoopRender.ts +0 -35
  136. package/callbacks/subscriptions/postPoopUpdate.ts +0 -35
  137. package/callbacks/subscriptions/postPressurePlateRender.ts +0 -37
  138. package/callbacks/subscriptions/postPressurePlateUpdate.ts +0 -37
  139. package/callbacks/subscriptions/postProjectileInitLate.ts +0 -35
  140. package/callbacks/subscriptions/postPurchase.ts +0 -31
  141. package/callbacks/subscriptions/postRockRender.ts +0 -35
  142. package/callbacks/subscriptions/postRockUpdate.ts +0 -35
  143. package/callbacks/subscriptions/postRoomClearChanged.ts +0 -30
  144. package/callbacks/subscriptions/postSacrifice.ts +0 -43
  145. package/callbacks/subscriptions/postSlotAnimationChanged.ts +0 -40
  146. package/callbacks/subscriptions/postSlotDestroyed.ts +0 -55
  147. package/callbacks/subscriptions/postSlotInit.ts +0 -32
  148. package/callbacks/subscriptions/postSlotRender.ts +0 -32
  149. package/callbacks/subscriptions/postSlotUpdate.ts +0 -32
  150. package/callbacks/subscriptions/postSpikesRender.ts +0 -35
  151. package/callbacks/subscriptions/postSpikesUpdate.ts +0 -35
  152. package/callbacks/subscriptions/postTNTRender.ts +0 -35
  153. package/callbacks/subscriptions/postTNTUpdate.ts +0 -35
  154. package/callbacks/subscriptions/postTearInitLate.ts +0 -32
  155. package/callbacks/subscriptions/postTearInitVeryLate.ts +0 -32
  156. package/callbacks/subscriptions/postTransformation.ts +0 -40
  157. package/callbacks/subscriptions/postTrinketBreak.ts +0 -38
  158. package/callbacks/subscriptions/preBerserkDeath.ts +0 -42
  159. package/callbacks/subscriptions/preCustomRevive.ts +0 -46
  160. package/callbacks/subscriptions/preItemPickup.ts +0 -64
  161. package/callbacks/subscriptions/preNewLevel.ts +0 -24
  162. package/classes/DefaultMap.ts +0 -174
  163. package/classes/ModUpgraded.ts +0 -77
  164. package/constants.ts +0 -162
  165. package/constantsFirstLast.ts +0 -217
  166. package/enums/AmbushType.ts +0 -4
  167. package/enums/HealthType.ts +0 -16
  168. package/enums/ModCallbackCustom.ts +0 -1278
  169. package/enums/PocketItemType.ts +0 -8
  170. package/enums/SerializationType.ts +0 -5
  171. package/enums/SlotDestructionType.ts +0 -4
  172. package/enums/private/CopyableIsaacAPIClassType.ts +0 -7
  173. package/enums/private/SaveDataKey.ts +0 -14
  174. package/enums/private/SerializationBrand.ts +0 -42
  175. package/features/characterHealthConversion.ts +0 -111
  176. package/features/characterStats.ts +0 -61
  177. package/features/debugDisplay/debugDisplay.ts +0 -221
  178. package/features/debugDisplay/exports.ts +0 -368
  179. package/features/debugDisplay/v.ts +0 -65
  180. package/features/deployJSONRoom.ts +0 -743
  181. package/features/disableInputs.ts +0 -193
  182. package/features/disableSound.ts +0 -77
  183. package/features/extraConsoleCommands/commandsDisplay.ts +0 -290
  184. package/features/extraConsoleCommands/commandsSubroutines.ts +0 -139
  185. package/features/extraConsoleCommands/init.ts +0 -334
  186. package/features/extraConsoleCommands/listCommands.ts +0 -1299
  187. package/features/extraConsoleCommands/v.ts +0 -14
  188. package/features/fadeInRemover.ts +0 -60
  189. package/features/fastReset.ts +0 -75
  190. package/features/forgottenSwitch.ts +0 -50
  191. package/features/getCollectibleItemPoolType.ts +0 -66
  192. package/features/persistentEntities.ts +0 -183
  193. package/features/playerInventory.ts +0 -133
  194. package/features/ponyDetection.ts +0 -74
  195. package/features/preventCollectibleRotation.ts +0 -115
  196. package/features/runInNFrames.ts +0 -148
  197. package/features/saveDataManager/constants.ts +0 -4
  198. package/features/saveDataManager/exports.ts +0 -229
  199. package/features/saveDataManager/load.ts +0 -99
  200. package/features/saveDataManager/main.ts +0 -195
  201. package/features/saveDataManager/maps.ts +0 -13
  202. package/features/saveDataManager/merge.ts +0 -194
  203. package/features/saveDataManager/save.ts +0 -74
  204. package/features/saveDataManager/serializationBrand.ts +0 -16
  205. package/features/sirenHelpers.ts +0 -129
  206. package/features/taintedLazarusPlayers.ts +0 -113
  207. package/featuresInitialized.ts +0 -20
  208. package/functions/ambush.ts +0 -47
  209. package/functions/array.ts +0 -410
  210. package/functions/benchmark.ts +0 -36
  211. package/functions/bitwise.ts +0 -24
  212. package/functions/bombs.ts +0 -12
  213. package/functions/boss.ts +0 -227
  214. package/functions/cacheFlag.ts +0 -12
  215. package/functions/cards.ts +0 -271
  216. package/functions/challenges.ts +0 -13
  217. package/functions/character.ts +0 -126
  218. package/functions/charge.ts +0 -237
  219. package/functions/chargeBar.ts +0 -67
  220. package/functions/collectibleCacheFlag.ts +0 -90
  221. package/functions/collectibleSet.ts +0 -56
  222. package/functions/collectibleTag.ts +0 -89
  223. package/functions/collectibles.ts +0 -659
  224. package/functions/color.ts +0 -128
  225. package/functions/debug.ts +0 -68
  226. package/functions/deepCopy.ts +0 -535
  227. package/functions/deepCopyTests.ts +0 -386
  228. package/functions/direction.ts +0 -49
  229. package/functions/doors.ts +0 -347
  230. package/functions/easing.ts +0 -182
  231. package/functions/eden.ts +0 -47
  232. package/functions/effects.ts +0 -20
  233. package/functions/entity.ts +0 -439
  234. package/functions/entitySpecific.ts +0 -889
  235. package/functions/entityTypes.ts +0 -6
  236. package/functions/enums.ts +0 -146
  237. package/functions/familiars.ts +0 -106
  238. package/functions/flag.ts +0 -165
  239. package/functions/flying.ts +0 -117
  240. package/functions/globals.ts +0 -242
  241. package/functions/gridEntity.ts +0 -511
  242. package/functions/gridEntitySpecific.ts +0 -112
  243. package/functions/input.ts +0 -139
  244. package/functions/isaacAPIClass.ts +0 -67
  245. package/functions/jsonHelpers.ts +0 -45
  246. package/functions/jsonRoom.ts +0 -100
  247. package/functions/kColor.ts +0 -129
  248. package/functions/language.ts +0 -13
  249. package/functions/level.ts +0 -31
  250. package/functions/log.ts +0 -720
  251. package/functions/map.ts +0 -56
  252. package/functions/math.ts +0 -149
  253. package/functions/mergeTests.ts +0 -288
  254. package/functions/npc.ts +0 -148
  255. package/functions/pickupVariants.ts +0 -60
  256. package/functions/pickups.ts +0 -499
  257. package/functions/pills.ts +0 -205
  258. package/functions/player.ts +0 -1060
  259. package/functions/playerDataStructures.ts +0 -150
  260. package/functions/playerHealth.ts +0 -382
  261. package/functions/playerIndex.ts +0 -195
  262. package/functions/pocketItems.ts +0 -149
  263. package/functions/positionVelocity.ts +0 -188
  264. package/functions/random.ts +0 -77
  265. package/functions/revive.ts +0 -201
  266. package/functions/rng.ts +0 -172
  267. package/functions/roomData.ts +0 -199
  268. package/functions/roomGrid.ts +0 -109
  269. package/functions/roomShape.ts +0 -80
  270. package/functions/rooms.ts +0 -648
  271. package/functions/run.ts +0 -36
  272. package/functions/saveFile.ts +0 -128
  273. package/functions/seeds.ts +0 -19
  274. package/functions/serialization.ts +0 -91
  275. package/functions/set.ts +0 -95
  276. package/functions/sound.ts +0 -9
  277. package/functions/spawnCollectible.ts +0 -104
  278. package/functions/sprite.ts +0 -107
  279. package/functions/stage.ts +0 -125
  280. package/functions/string.ts +0 -47
  281. package/functions/table.ts +0 -189
  282. package/functions/tears.ts +0 -32
  283. package/functions/transformations.ts +0 -131
  284. package/functions/trinketCacheFlag.ts +0 -60
  285. package/functions/trinketGive.ts +0 -157
  286. package/functions/trinkets.ts +0 -215
  287. package/functions/tstlClass.ts +0 -157
  288. package/functions/types.ts +0 -36
  289. package/functions/ui.ts +0 -138
  290. package/functions/utils.ts +0 -189
  291. package/functions/vector.ts +0 -126
  292. package/index.ts +0 -172
  293. package/initCustomCallbacks.ts +0 -132
  294. package/initFeatures.ts +0 -39
  295. package/interfaces/AddCallbackParameterCustom.ts +0 -188
  296. package/interfaces/ChargeBarSprites.ts +0 -12
  297. package/interfaces/JSONDoor.ts +0 -13
  298. package/interfaces/JSONEntity.ts +0 -16
  299. package/interfaces/JSONRoom.ts +0 -36
  300. package/interfaces/JSONRooms.ts +0 -12
  301. package/interfaces/JSONSpawn.ts +0 -14
  302. package/interfaces/PlayerHealth.ts +0 -16
  303. package/interfaces/PocketItemDescription.ts +0 -9
  304. package/interfaces/SaveData.ts +0 -29
  305. package/interfaces/TrinketSituation.ts +0 -9
  306. package/interfaces/private/TSTLClassMetatable.ts +0 -8
  307. package/maps/PHDPillConversions.ts +0 -21
  308. package/maps/cardMap.ts +0 -209
  309. package/maps/characterMap.ts +0 -87
  310. package/maps/collectibleDescriptionMap.ts +0 -732
  311. package/maps/collectibleNameMap.ts +0 -731
  312. package/maps/defaultPlayerStatMap.ts +0 -17
  313. package/maps/falsePHDPillConversions.ts +0 -35
  314. package/maps/gridEntityTypeToBrokenStateMap.ts +0 -50
  315. package/maps/gridEntityXMLMap.ts +0 -176
  316. package/maps/pillEffectMap.ts +0 -88
  317. package/maps/roomShapeToTopLeftWallGridIndexMap.ts +0 -18
  318. package/maps/roomTypeMap.ts +0 -40
  319. package/maps/trinketDescriptionMap.ts +0 -200
  320. package/maps/trinketNameMap.ts +0 -198
  321. package/objects/LRoomShapeToRectangles.ts +0 -44
  322. package/objects/callbackRegisterFunctions.ts +0 -187
  323. package/objects/cardDescriptions.ts +0 -105
  324. package/objects/cardNames.ts +0 -105
  325. package/objects/cardTypes.ts +0 -104
  326. package/objects/challengeNames.ts +0 -52
  327. package/objects/characterNames.ts +0 -48
  328. package/objects/coinSubTypeToValue.ts +0 -14
  329. package/objects/colors.ts +0 -16
  330. package/objects/directionNames.ts +0 -11
  331. package/objects/directionToDegrees.ts +0 -11
  332. package/objects/directionToVector.ts +0 -12
  333. package/objects/doorSlotFlagToDoorSlot.ts +0 -16
  334. package/objects/doorSlotToDirection.ts +0 -14
  335. package/objects/isaacAPIClassTypeToBrand.ts +0 -11
  336. package/objects/isaacAPIClassTypeToCopyFunction.ts +0 -18
  337. package/objects/languageNames.ts +0 -13
  338. package/objects/oppositeDoorSlots.ts +0 -15
  339. package/objects/pillEffectClasses.ts +0 -63
  340. package/objects/pillEffectNames.ts +0 -57
  341. package/objects/pillEffectTypes.ts +0 -62
  342. package/objects/roomShapeBounds.ts +0 -71
  343. package/objects/roomShapeLayoutSizes.ts +0 -45
  344. package/objects/roomShapeToBottomRightPosition.ts +0 -25
  345. package/objects/roomShapeToDoorSlots.ts +0 -83
  346. package/objects/roomShapeToDoorSlotsToGridIndexDelta.ts +0 -127
  347. package/objects/roomShapeToGridWidth.ts +0 -21
  348. package/objects/roomShapeToTopLeftPosition.ts +0 -26
  349. package/objects/roomShapeVolumes.ts +0 -38
  350. package/objects/roomTypeNames.ts +0 -36
  351. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.ts +0 -14
  352. package/objects/stageTypeToLetter.ts +0 -15
  353. package/objects/transformationNames.ts +0 -18
  354. package/patchErrorFunctions.ts +0 -92
  355. package/sets/LRoomShapesSet.ts +0 -8
  356. package/sets/bossSets.ts +0 -470
  357. package/sets/charactersThatStartWithAnActiveItemSet.ts +0 -16
  358. package/sets/charactersWithBlackHeartFromEternalHeartSet.ts +0 -7
  359. package/sets/charactersWithFreeDevilDealsSet.ts +0 -4
  360. package/sets/charactersWithNoRedHeartsSet.ts +0 -17
  361. package/sets/charactersWithNoSoulHeartsSet.ts +0 -14
  362. package/sets/chestPickupVariantsSet.ts +0 -16
  363. package/sets/familiarsThatShootPlayerTearsSet.ts +0 -13
  364. package/sets/lostStyleCharactersSet.ts +0 -13
  365. package/sets/mineShaftRoomSubTypesSet.ts +0 -10
  366. package/sets/redHeartSubTypesSet.ts +0 -7
  367. package/sets/sinEntityTypesSet.ts +0 -11
  368. package/sets/singleUseActiveCollectibleTypesSet.ts +0 -13
  369. package/sets/storyBossesSet.ts +0 -17
  370. package/types/AnyEntity.ts +0 -12
  371. package/types/AwaitingTextInput.d.ts +0 -2
  372. package/types/CollectibleIndex.ts +0 -16
  373. package/types/PickingUpItem.ts +0 -89
  374. package/types/PlayerIndex.ts +0 -13
  375. package/types/private/IsaacAPIClass.ts +0 -3
  376. package/types/private/SerializedIsaacAPIClass.ts +0 -3
  377. package/types/private/TSTLClass.ts +0 -3
  378. package/upgradeMod.ts +0 -55
@@ -1,115 +0,0 @@
1
- // Keep specific items from being affected by the Glitched Crown, Binge Eater, and the Tainted Isaac
2
- // switching mechanic.
3
-
4
- import {
5
- Card,
6
- CollectibleType,
7
- ModCallback,
8
- PickupVariant,
9
- } from "isaac-typescript-definitions";
10
- import { game } from "../cachedClasses";
11
- import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
12
- import { setCollectibleSubType } from "../functions/collectibles";
13
- import { getEntityID } from "../functions/entity";
14
- import { isCollectible } from "../functions/pickupVariants";
15
- import { saveDataManager } from "./saveDataManager/exports";
16
-
17
- const FEATURE_NAME = "prevent collectible rotation";
18
-
19
- const v = {
20
- room: {
21
- /**
22
- * Index is a string containing the grid index and the InitSeed of the collectible.
23
- * (e.g. "12,1123579202")
24
- *
25
- * (We cannot simply use the InitSeed of the collectible because Diplopia can cause multiple
26
- * collectibles in the room to have the same InitSeed. However, no two collectibles should ever
27
- * be on the same grid index.)
28
- *
29
- * (We cannot use PtrHash as an index because that stays the same when the item is rolled.)
30
- */
31
- trackedCollectibles: new Map<string, CollectibleType>(),
32
- },
33
- };
34
-
35
- /** @internal */
36
- export function preventCollectibleRotationInit(mod: Mod): void {
37
- saveDataManager("preventCollectibleRotation", v);
38
-
39
- mod.AddCallback(
40
- ModCallback.POST_USE_CARD,
41
- useCardSoulOfIsaac,
42
- Card.SOUL_ISAAC,
43
- ); // 5
44
-
45
- mod.AddCallback(
46
- ModCallback.POST_PICKUP_UPDATE,
47
- postPickupUpdateCollectible,
48
- PickupVariant.COLLECTIBLE,
49
- ); // 35
50
- }
51
-
52
- // ModCallback.POST_USE_CARD (5)
53
- // Card.SOUL_ISAAC (81)
54
- function useCardSoulOfIsaac() {
55
- // Soul of Isaac causes items to flip. Delete all tracked items (assuming that the player
56
- // deliberately wants to roll a quest item).
57
- v.room.trackedCollectibles.clear();
58
- }
59
-
60
- // ModCallback.POST_PICKUP_UPDATE (35)
61
- // PickupVariant.COLLECTIBLE (100)
62
- function postPickupUpdateCollectible(pickup: EntityPickup) {
63
- const collectible = pickup as EntityPickupCollectible;
64
-
65
- // Ignore empty pedestals (i.e. items that have already been taken by the player).
66
- if (collectible.SubType === CollectibleType.NULL) {
67
- return;
68
- }
69
-
70
- const index = getMapIndex(collectible);
71
- const trackedCollectibleType = v.room.trackedCollectibles.get(index);
72
- if (
73
- trackedCollectibleType !== undefined &&
74
- collectible.SubType !== trackedCollectibleType
75
- ) {
76
- // This item has switched, so restore it back to the way it was.
77
- setCollectibleSubType(collectible, trackedCollectibleType);
78
- }
79
- }
80
-
81
- /**
82
- * Helper function to prevent a collectible from being affected by Tainted Isaac's rotation
83
- * mechanic. (This mechanic also happens from Glitched Crown and Binge Eater.) This is useful
84
- * because quest items that are manually spawned by mods will be automatically be affected by this
85
- * mechanic.
86
- *
87
- * It is required to pass the intended collectible type to this function since it is possible for
88
- * collectibles to rotate on the first frame that they are spawned.
89
- */
90
- export function preventCollectibleRotation(
91
- collectible: EntityPickup,
92
- collectibleType: CollectibleType,
93
- ): void {
94
- errorIfFeaturesNotInitialized(FEATURE_NAME);
95
-
96
- if (!isCollectible(collectible)) {
97
- const entityID = getEntityID(collectible);
98
- error(
99
- `The "preventCollectibleRotate" function was given a non-collectible: ${entityID}`,
100
- );
101
- }
102
-
103
- const index = getMapIndex(collectible);
104
- v.room.trackedCollectibles.set(index, collectibleType);
105
-
106
- // The item might have already shifted on the first frame that it spawns, so change it back if
107
- // necessary.
108
- postPickupUpdateCollectible(collectible);
109
- }
110
-
111
- function getMapIndex(collectible: EntityPickup) {
112
- const room = game.GetRoom();
113
- const gridIndex = room.GetGridIndex(collectible.Position);
114
- return `${gridIndex},${collectible.InitSeed}`;
115
- }
@@ -1,148 +0,0 @@
1
- import { ModCallback } from "isaac-typescript-definitions";
2
- import { game } from "../cachedClasses";
3
- import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
4
- import { saveDataManager } from "./saveDataManager/exports";
5
-
6
- const FEATURE_NAME = "run in N frames";
7
-
8
- /** The frame count to fire, paired with the corresponding function. */
9
- type FunctionTuple = [int, () => void];
10
-
11
- const v = {
12
- run: {
13
- queuedGameFunctionTuples: [] as FunctionTuple[],
14
- queuedRenderFunctionTuples: [] as FunctionTuple[],
15
- },
16
- };
17
-
18
- /** @internal */
19
- export function runInNFramesInit(mod: Mod): void {
20
- saveDataManager("runInNFrames", v, () => false);
21
-
22
- mod.AddCallback(ModCallback.POST_UPDATE, postUpdate); // 1
23
- mod.AddCallback(ModCallback.POST_RENDER, postRender); // 2
24
- }
25
-
26
- // ModCallback.POST_UPDATE (1)
27
- function postUpdate() {
28
- const gameFrameCount = game.GetFrameCount();
29
-
30
- checkExecuteQueuedFunctions(gameFrameCount, v.run.queuedGameFunctionTuples);
31
- }
32
-
33
- // ModCallback.POST_RENDER (2)
34
- function postRender() {
35
- const renderFrameCount = Isaac.GetFrameCount();
36
-
37
- checkExecuteQueuedFunctions(
38
- renderFrameCount,
39
- v.run.queuedRenderFunctionTuples,
40
- );
41
- }
42
-
43
- function checkExecuteQueuedFunctions(
44
- frameCount: int,
45
- functionTuples: FunctionTuple[],
46
- ) {
47
- const functionsToFire: Array<() => void> = [];
48
- const indexesToRemove: int[] = [];
49
- functionTuples.forEach((functionTuple, i) => {
50
- const [frame, func] = functionTuple;
51
- if (frameCount >= frame) {
52
- functionsToFire.push(func);
53
- indexesToRemove.push(i);
54
- }
55
- });
56
-
57
- for (const indexToRemove of indexesToRemove) {
58
- functionTuples.splice(indexToRemove, 1);
59
- }
60
-
61
- for (const func of functionsToFire) {
62
- func();
63
- }
64
- }
65
-
66
- /**
67
- * Supply a function to run N game frames from now in the PostUpdate callback.
68
- *
69
- * For a usage example, see the documentation for the `runNextGameFrame`, which is used in a similar
70
- * way.
71
- *
72
- * Note that this function will not handle saving and quitting. If a player saving and quitting
73
- * before the deferred function fires would cause a bug in your mod, then you should handle deferred
74
- * functions manually using serializable data.
75
- */
76
- export function runInNGameFrames(func: () => void, gameFrames: int): void {
77
- errorIfFeaturesNotInitialized(FEATURE_NAME);
78
-
79
- const gameFrameCount = game.GetFrameCount();
80
- const functionFireFrame = gameFrameCount + gameFrames;
81
- const tuple: [int, () => void] = [functionFireFrame, func];
82
- v.run.queuedGameFunctionTuples.push(tuple);
83
- }
84
-
85
- /**
86
- * Supply a function to run N render frames from now in the PostRender callback.
87
- *
88
- * For a usage example, see the documentation for the `runNextGameFrame`, which is used in a similar
89
- * way.
90
- *
91
- * Note that this function will not handle saving and quitting. If a player saving and quitting
92
- * before the deferred function fires would cause a bug in your mod, then you should handle deferred
93
- * functions manually using serializable data.
94
- */
95
- export function runInNRenderFrames(func: () => void, renderFrames: int): void {
96
- errorIfFeaturesNotInitialized(FEATURE_NAME);
97
-
98
- const renderFrameCount = Isaac.GetFrameCount();
99
- const functionFireFrame = renderFrameCount + renderFrames;
100
- const tuple: [int, () => void] = [functionFireFrame, func];
101
- v.run.queuedRenderFunctionTuples.push(tuple);
102
- }
103
-
104
- /**
105
- * Supply a function to run on the next PostUpdate callback.
106
- *
107
- * For example:
108
- *
109
- * ```ts
110
- * const NUM_EXPLODER_EXPLOSIONS = 5;
111
- *
112
- * function useItemExploder(player: EntityPlayer) {
113
- * playSound("exploderBegin");
114
- * explode(player, NUM_EXPLODER_EXPLOSIONS);
115
- * }
116
- *
117
- * function explode(player: EntityPlayer, numFramesLeft: int) {
118
- * Isaac.Explode(player, undefined, 1);
119
- * numFramesLeft -= 1;
120
- * if (numFramesLeft === 0) {
121
- * runNextFrame(() => {
122
- * explode(player, numFramesLeft);
123
- * });
124
- * }
125
- * }
126
- * ```
127
- *
128
- * Note that this function will not handle saving and quitting. If a player saving and quitting
129
- * before the deferred function fires would cause a bug in your mod, then you should handle deferred
130
- * functions manually using serializable data.
131
- */
132
- export function runNextGameFrame(func: () => void): void {
133
- errorIfFeaturesNotInitialized(FEATURE_NAME);
134
- runInNGameFrames(func, 1);
135
- }
136
-
137
- /**
138
- * Supply a function to run on the next PostRender callback.
139
- *
140
- * For a usage example, see the documentation for the `runNextGameFrame`, which is used in a similar
141
- * way.
142
- *
143
- * Note that this function will not handle saving and quitting.
144
- */
145
- export function runNextRenderFrame(func: () => void): void {
146
- errorIfFeaturesNotInitialized(FEATURE_NAME);
147
- runInNRenderFrames(func, 1);
148
- }
@@ -1,4 +0,0 @@
1
- /** Set this to true to enable more verbosity in the save data manger. */
2
- export const SAVE_DATA_MANAGER_DEBUG = false;
3
-
4
- export const SAVE_DATA_MANAGER_FEATURE_NAME = "save data manager";
@@ -1,229 +0,0 @@
1
- /* eslint-disable sort-exports/sort-exports */
2
-
3
- import { SaveDataKey } from "../../enums/private/SaveDataKey";
4
- import { SerializationType } from "../../enums/SerializationType";
5
- import { errorIfFeaturesNotInitialized } from "../../featuresInitialized";
6
- import { deepCopy } from "../../functions/deepCopy";
7
- import { isString } from "../../functions/types";
8
- import { SaveData } from "../../interfaces/SaveData";
9
- import { SAVE_DATA_MANAGER_FEATURE_NAME } from "./constants";
10
- import {
11
- forceSaveDataManagerLoad,
12
- forceSaveDataManagerSave,
13
- restoreDefaultSaveData,
14
- } from "./main";
15
- import {
16
- saveDataConditionalFuncMap,
17
- saveDataDefaultsMap,
18
- saveDataMap,
19
- } from "./maps";
20
-
21
- /**
22
- * This is the entry point to the save data manager, a system which provides two major features:
23
- *
24
- * 1. automatic resetting of variables on a new run, on a new level, or on a new room (as desired)
25
- * 2. automatic saving and loading of all tracked data to the "save#.dat" file
26
- *
27
- * You feed this function with an anonymous object containing your variables, and then it will
28
- * automatically manage them for you. (See below for an example.)
29
- *
30
- * The save data manager is meant to be called once for each feature of your mod. In other words,
31
- * you should not put all of the data for your mod on the same object. Instead, scope your variables
32
- * locally to a single file that contains a mod feature, and then call this function to register
33
- * them. For example:
34
- *
35
- * ```ts
36
- * // in file: feature1.ts
37
- * import { saveDataManager } from "isaacscript-common";
38
- *
39
- * // Declare local variables for this file or feature.
40
- * const v = {
41
- * // These variables are never reset; manage them yourself at will.
42
- * persistent: {
43
- * foo1: 0,
44
- * },
45
- *
46
- * // These variables are reset at the beginning of every run.
47
- * run: {
48
- * foo2: 0,
49
- * },
50
- *
51
- * // These variables are reset at the beginning of every level.
52
- * level: {
53
- * foo3: 0,
54
- * },
55
- *
56
- * // These variables are reset at the beginning of every room.
57
- * room: {
58
- * foo4: 0,
59
- * },
60
- * };
61
- * // Every child object is optional; only create the ones that you need.
62
- *
63
- * // Register the variables with the save data manager. (We need to provide a string key that
64
- * // matches the name of this file.)
65
- * function feature1Init() {
66
- * saveDataManager("feature1", v);
67
- * }
68
- *
69
- * // Elsewhere in the file, use your variables.
70
- * function feature1Function() {
71
- * if (v.run.foo1 > 0) {
72
- * // Insert code here.
73
- * }
74
- * }
75
- * ```
76
- *
77
- * - Save data is loaded from disk in the `POST_PLAYER_INIT` callback (i.e. the first callback that
78
- * can possibly run).
79
- * - Save data is recorded to disk in the `PRE_GAME_EXIT` callback.
80
- *
81
- * Note that before using the save data manager, you must call the `upgradeMod` function. (Upgrade
82
- * your mod before registering any of your own callbacks so that the save data manager will run
83
- * before any of your code does.)
84
- *
85
- * If you want the save data manager to load data before the `POST_PLAYER_INIT` callback (i.e. in
86
- * the main menu), then you should explicitly call the `saveDataManagerLoad` function. (The save
87
- * data manager cannot do this on its own because it cannot know when your mod features are finished
88
- * initializing.)
89
- *
90
- * Finally, some features may have variables that need to be automatically reset per run/level, but
91
- * not saved to disk on game exit. (For example, if they contain functions or other non-serializable
92
- * data.) For these cases, set the second argument to `() => false`.
93
- *
94
- * @param key The name of the file or feature that is submitting data to be managed by the save data
95
- * manager. The save data manager will throw an error if the key is already registered.
96
- * @param v An object that corresponds to the `SaveData` interface. The object is conventionally
97
- * called "v" for brevity. ("v" is short for "local variables").
98
- * @param conditionalFunc An optional function to run upon saving this key to disk. For example,
99
- * this allows features to only save data to disk if the feature is enabled.
100
- * Specify a value of `() => false` to completely disable saving this feature
101
- * to disk. Disabling saving to disk is useful if you are using data that is
102
- * not serializable. Alternatively, it could be useful if you want to use the
103
- * save data manager to automatically reset variables on run/level/room, but
104
- * not clutter the the "save#.dat" file with unnecessary keys.
105
- */
106
- export function saveDataManager(
107
- key: string,
108
- v: SaveData,
109
- conditionalFunc?: () => boolean,
110
- ): void {
111
- errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
112
-
113
- if (!isString(key)) {
114
- error(
115
- `The ${SAVE_DATA_MANAGER_FEATURE_NAME} requires that keys are strings. You tried to use a key of type: ${typeof key}`,
116
- );
117
- }
118
-
119
- if (saveDataMap.has(key)) {
120
- error(
121
- `The ${SAVE_DATA_MANAGER_FEATURE_NAME} is already managing save data for a key of: ${key}`,
122
- );
123
- }
124
-
125
- // Add the new save data to the map.
126
- saveDataMap.set(key, v);
127
-
128
- // If the only key in the save data is "room", then we don't have to worry about saving this data
129
- // to disk (because the room would be reloaded upon resuming a continued run).
130
- const saveDataKeys = Object.keys(v);
131
- if (saveDataKeys.length === 1 && saveDataKeys[0] === "room") {
132
- conditionalFunc = () => false;
133
- }
134
-
135
- // Make a copy of the initial save data so that we can use it to restore the default values later
136
- // on.
137
- const saveDataTable = v as LuaTable<AnyNotNil, unknown>;
138
- const saveDataCopy = deepCopy(
139
- saveDataTable,
140
- SerializationType.NONE,
141
- key,
142
- ) as SaveData;
143
- saveDataDefaultsMap.set(key, saveDataCopy);
144
-
145
- // Store the conditional function for later, if present.
146
- if (conditionalFunc !== undefined) {
147
- saveDataConditionalFuncMap.set(key, conditionalFunc);
148
- }
149
- }
150
-
151
- /**
152
- * The save data manager will automatically load variables from disk at the appropriate times (i.e.
153
- * when a new run is started). Use this function to explicitly force the save data manager to load
154
- * all of its variables from disk immediately.
155
- *
156
- * Obviously, doing this will overwrite the current data, so using this function can potentially
157
- * result in lost state.
158
- */
159
- export function saveDataManagerLoad(): void {
160
- errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
161
- forceSaveDataManagerLoad();
162
- }
163
-
164
- /**
165
- * The save data manager will automatically save variables to disk at the appropriate times (i.e.
166
- * when the run is exited). Use this function to explicitly force the save data manager to write all
167
- * of its variables to disk immediately.
168
- */
169
- export function saveDataManagerSave(): void {
170
- errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
171
- forceSaveDataManagerSave();
172
- }
173
-
174
- declare let g: LuaTable<string, SaveData>; // Globals
175
- declare let gd: LuaTable<string, SaveData>; // Globals defaults
176
-
177
- /**
178
- * - Sets the global variable of "g" equal to all of the save data variables for this mod.
179
- * - Sets the global variable of "gd" equal to all of the save data default variables for this mod.
180
- *
181
- * This can make debugging easier, as you can access the variables from the game's debug console.
182
- * e.g. `l print(g.feature1.foo)`
183
- */
184
- export function saveDataManagerSetGlobal(): void {
185
- g = saveDataMap; // eslint-disable-line @typescript-eslint/no-unused-vars
186
- gd = saveDataDefaultsMap; // eslint-disable-line @typescript-eslint/no-unused-vars
187
- }
188
-
189
- /**
190
- * The save data manager will automatically reset variables at the appropriate times (i.e. when a
191
- * player enters a new room). Use this function to explicitly force the save data manager to reset a
192
- * specific variable group.
193
- *
194
- * For example:
195
- *
196
- * ```ts
197
- * const v = {
198
- * room: {
199
- * foo: 123,
200
- * },
201
- * };
202
- *
203
- * saveDataManager("file1", v);
204
- *
205
- * // Then, later on, to explicit reset all of the "room" variables:
206
- * saveDataManagerReset("file1", "room");
207
- * ```
208
- */
209
- export function saveDataManagerReset(
210
- key: string,
211
- childObjectKey: string,
212
- ): void {
213
- errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
214
-
215
- if (!isString(key)) {
216
- error(
217
- `The ${SAVE_DATA_MANAGER_FEATURE_NAME} requires that keys are strings. You tried to use a key of type: ${typeof key}`,
218
- );
219
- }
220
-
221
- const saveData = saveDataMap.get(key) as Record<string, unknown> | undefined;
222
- if (saveData === undefined) {
223
- error(
224
- `The ${SAVE_DATA_MANAGER_FEATURE_NAME} is not managing save data for a key of: ${key}`,
225
- );
226
- }
227
-
228
- restoreDefaultSaveData(key, saveData, childObjectKey as SaveDataKey);
229
- }
@@ -1,99 +0,0 @@
1
- import { jsonDecode } from "../../functions/jsonHelpers";
2
- import { log, logError } from "../../functions/log";
3
- import { iterateTableInOrder } from "../../functions/table";
4
- import { isString, isTable } from "../../functions/types";
5
- import { SaveData } from "../../interfaces/SaveData";
6
- import {
7
- SAVE_DATA_MANAGER_DEBUG,
8
- SAVE_DATA_MANAGER_FEATURE_NAME,
9
- } from "./constants";
10
- import { merge } from "./merge";
11
-
12
- const DEFAULT_MOD_DATA = "{}";
13
-
14
- export function loadFromDisk(
15
- mod: Mod,
16
- oldSaveData: LuaTable<string, SaveData>,
17
- ): void {
18
- if (!mod.HasData()) {
19
- // There is no "save#.dat" file for this save slot.
20
- return;
21
- }
22
-
23
- // First, read the "save#.dat" file into a Lua table.
24
- const jsonString = readSaveDatFile(mod);
25
- const newSaveData = jsonDecode(jsonString);
26
-
27
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
28
- if (SAVE_DATA_MANAGER_DEBUG) {
29
- log('Converted data from the "save#.dat" to a Lua table.');
30
- }
31
-
32
- // Second, iterate over all the fields of the new table.)
33
- iterateTableInOrder(
34
- newSaveData,
35
- (key, value) => {
36
- // All elements of loaded save data should have keys that are strings equal to the name of the
37
- // subscriber/feature. Ignore elements with other types of keys.
38
- if (!isString(key)) {
39
- return;
40
- }
41
-
42
- // All elements of loaded save data should be tables that contain fields corresponding to the
43
- // SaveData interface. Ignore elements that are not tables.
44
- if (!isTable(value)) {
45
- return;
46
- }
47
-
48
- // Ignore elements that represent subscriptions that no longer exist in the current save data.
49
- const oldSaveDataForSubscriber = oldSaveData.get(key);
50
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
51
- if (oldSaveDataForSubscriber === undefined) {
52
- return;
53
- }
54
-
55
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
56
- if (SAVE_DATA_MANAGER_DEBUG) {
57
- log(`Merging in stored data for feature: ${key}`);
58
- }
59
-
60
- // We do not want to blow away the child tables of the existing map, because save data could
61
- // contain out-of-date fields. Instead, merge it one field at a time in a recursive way (and
62
- // convert Lua tables back to TypeScriptToLua Maps, if necessary).
63
- merge(oldSaveDataForSubscriber as LuaTable, value, key);
64
- },
65
- SAVE_DATA_MANAGER_DEBUG,
66
- );
67
-
68
- log(
69
- `The ${SAVE_DATA_MANAGER_FEATURE_NAME} loaded data from the "save#.dat" file.`,
70
- );
71
- }
72
-
73
- function readSaveDatFile(mod: Mod) {
74
- const renderFrameCount = Isaac.GetFrameCount();
75
-
76
- const [ok, jsonStringOrErrMsg] = pcall(tryLoadModData, mod);
77
- if (!ok) {
78
- logError(
79
- `Failed to read from the "save#.dat" file on render frame ${renderFrameCount}: ${jsonStringOrErrMsg}`,
80
- );
81
- return DEFAULT_MOD_DATA;
82
- }
83
-
84
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
85
- if (jsonStringOrErrMsg === undefined) {
86
- return DEFAULT_MOD_DATA;
87
- }
88
-
89
- const jsonStringTrimmed = jsonStringOrErrMsg.trim();
90
- if (jsonStringTrimmed === "") {
91
- return DEFAULT_MOD_DATA;
92
- }
93
-
94
- return jsonStringTrimmed;
95
- }
96
-
97
- function tryLoadModData(this: void, mod: Mod) {
98
- return mod.LoadData();
99
- }