isaacscript-common 4.0.2 → 4.0.5

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 (370) hide show
  1. package/callbacks/postPlayerCollectible.lua +4 -2
  2. package/functions/collectibleSet.d.ts +37 -2
  3. package/functions/collectibleSet.lua +62 -15
  4. package/functions/player.lua +3 -4
  5. package/package.json +2 -2
  6. package/cachedClasses.ts +0 -39
  7. package/callbacks/customRevive.ts +0 -215
  8. package/callbacks/itemPickup.ts +0 -101
  9. package/callbacks/postAmbush.ts +0 -73
  10. package/callbacks/postBombExploded.ts +0 -26
  11. package/callbacks/postBombInitLate.ts +0 -36
  12. package/callbacks/postBoneSwing.ts +0 -64
  13. package/callbacks/postCollectibleInitFirst.ts +0 -40
  14. package/callbacks/postCursedTeleport.ts +0 -185
  15. package/callbacks/postCustomDoorEnter.ts +0 -292
  16. package/callbacks/postDiceRoomActivated.ts +0 -60
  17. package/callbacks/postDoorRender.ts +0 -26
  18. package/callbacks/postDoorUpdate.ts +0 -26
  19. package/callbacks/postEffectInitLate.ts +0 -36
  20. package/callbacks/postEffectStateChanged.ts +0 -43
  21. package/callbacks/postEsauJr.ts +0 -109
  22. package/callbacks/postFamiliarInitLate.ts +0 -36
  23. package/callbacks/postFamiliarStateChanged.ts +0 -43
  24. package/callbacks/postFlip.ts +0 -90
  25. package/callbacks/postGreedModeWave.ts +0 -41
  26. package/callbacks/postGridEntity.ts +0 -164
  27. package/callbacks/postGridEntityCollision.ts +0 -69
  28. package/callbacks/postGridEntityRender.ts +0 -26
  29. package/callbacks/postHolyMantleRemoved.ts +0 -55
  30. package/callbacks/postItemDischarged.ts +0 -154
  31. package/callbacks/postKnifeInitLate.ts +0 -36
  32. package/callbacks/postLaserInitLate.ts +0 -36
  33. package/callbacks/postNPCInitLate.ts +0 -36
  34. package/callbacks/postNPCStateChanged.ts +0 -42
  35. package/callbacks/postNewRoomEarly.ts +0 -96
  36. package/callbacks/postPickupCollect.ts +0 -48
  37. package/callbacks/postPickupInitFirst.ts +0 -70
  38. package/callbacks/postPickupInitLate.ts +0 -36
  39. package/callbacks/postPickupStateChanged.ts +0 -43
  40. package/callbacks/postPitRender.ts +0 -26
  41. package/callbacks/postPitUpdate.ts +0 -26
  42. package/callbacks/postPlayerChangeHealth.ts +0 -62
  43. package/callbacks/postPlayerChangeType.ts +0 -56
  44. package/callbacks/postPlayerCollectible.ts +0 -113
  45. package/callbacks/postPlayerFatalDamage.ts +0 -141
  46. package/callbacks/postPlayerInitLate.ts +0 -37
  47. package/callbacks/postPlayerReordered.ts +0 -142
  48. package/callbacks/postPoopRender.ts +0 -26
  49. package/callbacks/postPoopUpdate.ts +0 -26
  50. package/callbacks/postPressurePlateRender.ts +0 -26
  51. package/callbacks/postPressurePlateUpdate.ts +0 -26
  52. package/callbacks/postProjectileInitLate.ts +0 -36
  53. package/callbacks/postPurchase.ts +0 -64
  54. package/callbacks/postRockRender.ts +0 -26
  55. package/callbacks/postRockUpdate.ts +0 -26
  56. package/callbacks/postRoomClearChanged.ts +0 -57
  57. package/callbacks/postSacrifice.ts +0 -64
  58. package/callbacks/postSlotDestroyed.ts +0 -92
  59. package/callbacks/postSlotInitUpdate.ts +0 -68
  60. package/callbacks/postSlotRender.ts +0 -69
  61. package/callbacks/postSpikesRender.ts +0 -26
  62. package/callbacks/postSpikesUpdate.ts +0 -26
  63. package/callbacks/postTNTRender.ts +0 -26
  64. package/callbacks/postTNTUpdate.ts +0 -26
  65. package/callbacks/postTearInitLate.ts +0 -36
  66. package/callbacks/postTearInitVeryLate.ts +0 -41
  67. package/callbacks/postTransformation.ts +0 -59
  68. package/callbacks/postTrinketBreak.ts +0 -112
  69. package/callbacks/preBerserkDeath.ts +0 -49
  70. package/callbacks/preNewLevel.ts +0 -55
  71. package/callbacks/reorderedCallbacks.ts +0 -168
  72. package/callbacks/subscriptions/postAmbushFinished.ts +0 -32
  73. package/callbacks/subscriptions/postAmbushStarted.ts +0 -32
  74. package/callbacks/subscriptions/postBombInitLate.ts +0 -32
  75. package/callbacks/subscriptions/postBoneExploded.ts +0 -32
  76. package/callbacks/subscriptions/postBoneSwing.ts +0 -24
  77. package/callbacks/subscriptions/postCollectibleInitFirst.ts +0 -37
  78. package/callbacks/subscriptions/postCursedTeleport.ts +0 -24
  79. package/callbacks/subscriptions/postCustomDoorEnter.ts +0 -45
  80. package/callbacks/subscriptions/postCustomRevive.ts +0 -36
  81. package/callbacks/subscriptions/postDiceRoomActivated.ts +0 -38
  82. package/callbacks/subscriptions/postDoorRender.ts +0 -35
  83. package/callbacks/subscriptions/postDoorUpdate.ts +0 -35
  84. package/callbacks/subscriptions/postEffectInitLate.ts +0 -32
  85. package/callbacks/subscriptions/postEffectStateChanged.ts +0 -40
  86. package/callbacks/subscriptions/postEsauJr.ts +0 -24
  87. package/callbacks/subscriptions/postFamiliarInitLate.ts +0 -32
  88. package/callbacks/subscriptions/postFamiliarStateChanged.ts +0 -40
  89. package/callbacks/subscriptions/postFirstEsauJr.ts +0 -24
  90. package/callbacks/subscriptions/postFirstFlip.ts +0 -24
  91. package/callbacks/subscriptions/postFlip.ts +0 -22
  92. package/callbacks/subscriptions/postGameStartedReordered.ts +0 -24
  93. package/callbacks/subscriptions/postGreedModeWave.ts +0 -24
  94. package/callbacks/subscriptions/postGridEntityBroken.ts +0 -51
  95. package/callbacks/subscriptions/postGridEntityCollision.ts +0 -54
  96. package/callbacks/subscriptions/postGridEntityInit.ts +0 -51
  97. package/callbacks/subscriptions/postGridEntityRemove.ts +0 -52
  98. package/callbacks/subscriptions/postGridEntityRender.ts +0 -51
  99. package/callbacks/subscriptions/postGridEntityStateChanged.ts +0 -55
  100. package/callbacks/subscriptions/postGridEntityUpdate.ts +0 -51
  101. package/callbacks/subscriptions/postHolyMantleRemoved.ts +0 -48
  102. package/callbacks/subscriptions/postItemDischarged.ts +0 -43
  103. package/callbacks/subscriptions/postItemPickup.ts +0 -64
  104. package/callbacks/subscriptions/postKnifeInitLate.ts +0 -32
  105. package/callbacks/subscriptions/postLaserInitLate.ts +0 -32
  106. package/callbacks/subscriptions/postNPCInitLate.ts +0 -32
  107. package/callbacks/subscriptions/postNPCStateChanged.ts +0 -42
  108. package/callbacks/subscriptions/postNewLevelReordered.ts +0 -22
  109. package/callbacks/subscriptions/postNewRoomEarly.ts +0 -22
  110. package/callbacks/subscriptions/postNewRoomReordered.ts +0 -22
  111. package/callbacks/subscriptions/postPEffectUpdateReordered.ts +0 -40
  112. package/callbacks/subscriptions/postPickupCollect.ts +0 -35
  113. package/callbacks/subscriptions/postPickupInitFirst.ts +0 -32
  114. package/callbacks/subscriptions/postPickupInitLate.ts +0 -32
  115. package/callbacks/subscriptions/postPickupStateChanged.ts +0 -40
  116. package/callbacks/subscriptions/postPitRender.ts +0 -35
  117. package/callbacks/subscriptions/postPitUpdate.ts +0 -35
  118. package/callbacks/subscriptions/postPlayerChangeHealth.ts +0 -49
  119. package/callbacks/subscriptions/postPlayerChangeType.ts +0 -40
  120. package/callbacks/subscriptions/postPlayerCollectibleAdded.ts +0 -38
  121. package/callbacks/subscriptions/postPlayerCollectibleRemoved.ts +0 -38
  122. package/callbacks/subscriptions/postPlayerFatalDamage.ts +0 -68
  123. package/callbacks/subscriptions/postPlayerInitLate.ts +0 -40
  124. package/callbacks/subscriptions/postPlayerInitReordered.ts +0 -40
  125. package/callbacks/subscriptions/postPlayerRenderReordered.ts +0 -40
  126. package/callbacks/subscriptions/postPlayerUpdateReordered.ts +0 -40
  127. package/callbacks/subscriptions/postPoopRender.ts +0 -35
  128. package/callbacks/subscriptions/postPoopUpdate.ts +0 -35
  129. package/callbacks/subscriptions/postPressurePlateRender.ts +0 -37
  130. package/callbacks/subscriptions/postPressurePlateUpdate.ts +0 -37
  131. package/callbacks/subscriptions/postProjectileInitLate.ts +0 -35
  132. package/callbacks/subscriptions/postPurchase.ts +0 -31
  133. package/callbacks/subscriptions/postRockRender.ts +0 -35
  134. package/callbacks/subscriptions/postRockUpdate.ts +0 -35
  135. package/callbacks/subscriptions/postRoomClearChanged.ts +0 -30
  136. package/callbacks/subscriptions/postSacrifice.ts +0 -43
  137. package/callbacks/subscriptions/postSlotAnimationChanged.ts +0 -40
  138. package/callbacks/subscriptions/postSlotDestroyed.ts +0 -55
  139. package/callbacks/subscriptions/postSlotInit.ts +0 -32
  140. package/callbacks/subscriptions/postSlotRender.ts +0 -32
  141. package/callbacks/subscriptions/postSlotUpdate.ts +0 -32
  142. package/callbacks/subscriptions/postSpikesRender.ts +0 -35
  143. package/callbacks/subscriptions/postSpikesUpdate.ts +0 -35
  144. package/callbacks/subscriptions/postTNTRender.ts +0 -35
  145. package/callbacks/subscriptions/postTNTUpdate.ts +0 -35
  146. package/callbacks/subscriptions/postTearInitLate.ts +0 -32
  147. package/callbacks/subscriptions/postTearInitVeryLate.ts +0 -32
  148. package/callbacks/subscriptions/postTransformation.ts +0 -40
  149. package/callbacks/subscriptions/postTrinketBreak.ts +0 -38
  150. package/callbacks/subscriptions/preBerserkDeath.ts +0 -42
  151. package/callbacks/subscriptions/preCustomRevive.ts +0 -46
  152. package/callbacks/subscriptions/preItemPickup.ts +0 -64
  153. package/callbacks/subscriptions/preNewLevel.ts +0 -24
  154. package/classes/DefaultMap.ts +0 -174
  155. package/classes/ModUpgraded.ts +0 -84
  156. package/constants.ts +0 -162
  157. package/constantsFirstLast.ts +0 -217
  158. package/enums/AmbushType.ts +0 -4
  159. package/enums/HealthType.ts +0 -16
  160. package/enums/ModCallbackCustom.ts +0 -1278
  161. package/enums/PocketItemType.ts +0 -8
  162. package/enums/SerializationType.ts +0 -5
  163. package/enums/SlotDestructionType.ts +0 -4
  164. package/enums/private/CopyableIsaacAPIClassType.ts +0 -7
  165. package/enums/private/SaveDataKey.ts +0 -14
  166. package/enums/private/SerializationBrand.ts +0 -42
  167. package/features/characterHealthConversion.ts +0 -111
  168. package/features/characterStats.ts +0 -61
  169. package/features/debugDisplay/debugDisplay.ts +0 -221
  170. package/features/debugDisplay/exports.ts +0 -368
  171. package/features/debugDisplay/v.ts +0 -65
  172. package/features/deployJSONRoom.ts +0 -743
  173. package/features/disableInputs.ts +0 -193
  174. package/features/disableSound.ts +0 -77
  175. package/features/extraConsoleCommands/commandsDisplay.ts +0 -290
  176. package/features/extraConsoleCommands/commandsSubroutines.ts +0 -139
  177. package/features/extraConsoleCommands/init.ts +0 -334
  178. package/features/extraConsoleCommands/listCommands.ts +0 -1299
  179. package/features/extraConsoleCommands/v.ts +0 -14
  180. package/features/fadeInRemover.ts +0 -60
  181. package/features/fastReset.ts +0 -75
  182. package/features/forgottenSwitch.ts +0 -50
  183. package/features/getCollectibleItemPoolType.ts +0 -66
  184. package/features/persistentEntities.ts +0 -183
  185. package/features/playerInventory.ts +0 -135
  186. package/features/ponyDetection.ts +0 -74
  187. package/features/preventCollectibleRotation.ts +0 -115
  188. package/features/runInNFrames.ts +0 -148
  189. package/features/saveDataManager/constants.ts +0 -4
  190. package/features/saveDataManager/exports.ts +0 -229
  191. package/features/saveDataManager/load.ts +0 -99
  192. package/features/saveDataManager/main.ts +0 -195
  193. package/features/saveDataManager/maps.ts +0 -13
  194. package/features/saveDataManager/merge.ts +0 -194
  195. package/features/saveDataManager/save.ts +0 -74
  196. package/features/saveDataManager/serializationBrand.ts +0 -16
  197. package/features/sirenHelpers.ts +0 -129
  198. package/features/taintedLazarusPlayers.ts +0 -113
  199. package/featuresInitialized.ts +0 -20
  200. package/functions/ambush.ts +0 -47
  201. package/functions/array.ts +0 -410
  202. package/functions/benchmark.ts +0 -36
  203. package/functions/bitwise.ts +0 -24
  204. package/functions/bombs.ts +0 -12
  205. package/functions/boss.ts +0 -227
  206. package/functions/cacheFlag.ts +0 -12
  207. package/functions/cards.ts +0 -271
  208. package/functions/challenges.ts +0 -13
  209. package/functions/character.ts +0 -126
  210. package/functions/charge.ts +0 -237
  211. package/functions/chargeBar.ts +0 -67
  212. package/functions/collectibleCacheFlag.ts +0 -90
  213. package/functions/collectibleSet.ts +0 -56
  214. package/functions/collectibleTag.ts +0 -89
  215. package/functions/collectibles.ts +0 -659
  216. package/functions/color.ts +0 -128
  217. package/functions/debug.ts +0 -68
  218. package/functions/deepCopy.ts +0 -535
  219. package/functions/deepCopyTests.ts +0 -386
  220. package/functions/direction.ts +0 -49
  221. package/functions/doors.ts +0 -347
  222. package/functions/easing.ts +0 -182
  223. package/functions/eden.ts +0 -47
  224. package/functions/effects.ts +0 -20
  225. package/functions/entity.ts +0 -439
  226. package/functions/entitySpecific.ts +0 -889
  227. package/functions/entityTypes.ts +0 -6
  228. package/functions/enums.ts +0 -146
  229. package/functions/familiars.ts +0 -106
  230. package/functions/flag.ts +0 -165
  231. package/functions/flying.ts +0 -117
  232. package/functions/globals.ts +0 -242
  233. package/functions/gridEntity.ts +0 -511
  234. package/functions/gridEntitySpecific.ts +0 -112
  235. package/functions/input.ts +0 -139
  236. package/functions/isaacAPIClass.ts +0 -67
  237. package/functions/jsonHelpers.ts +0 -45
  238. package/functions/jsonRoom.ts +0 -100
  239. package/functions/kColor.ts +0 -129
  240. package/functions/language.ts +0 -13
  241. package/functions/level.ts +0 -31
  242. package/functions/log.ts +0 -720
  243. package/functions/map.ts +0 -56
  244. package/functions/math.ts +0 -149
  245. package/functions/mergeTests.ts +0 -288
  246. package/functions/npc.ts +0 -148
  247. package/functions/pickupVariants.ts +0 -60
  248. package/functions/pickups.ts +0 -499
  249. package/functions/pills.ts +0 -205
  250. package/functions/player.ts +0 -1056
  251. package/functions/playerDataStructures.ts +0 -150
  252. package/functions/playerHealth.ts +0 -382
  253. package/functions/playerIndex.ts +0 -195
  254. package/functions/pocketItems.ts +0 -149
  255. package/functions/positionVelocity.ts +0 -188
  256. package/functions/random.ts +0 -77
  257. package/functions/revive.ts +0 -201
  258. package/functions/rng.ts +0 -172
  259. package/functions/roomData.ts +0 -199
  260. package/functions/roomGrid.ts +0 -109
  261. package/functions/roomShape.ts +0 -80
  262. package/functions/rooms.ts +0 -648
  263. package/functions/run.ts +0 -36
  264. package/functions/saveFile.ts +0 -128
  265. package/functions/seeds.ts +0 -19
  266. package/functions/serialization.ts +0 -91
  267. package/functions/set.ts +0 -95
  268. package/functions/sound.ts +0 -9
  269. package/functions/spawnCollectible.ts +0 -104
  270. package/functions/sprite.ts +0 -107
  271. package/functions/stage.ts +0 -125
  272. package/functions/string.ts +0 -47
  273. package/functions/table.ts +0 -189
  274. package/functions/tears.ts +0 -32
  275. package/functions/transformations.ts +0 -131
  276. package/functions/trinketCacheFlag.ts +0 -60
  277. package/functions/trinketGive.ts +0 -157
  278. package/functions/trinkets.ts +0 -215
  279. package/functions/tstlClass.ts +0 -157
  280. package/functions/types.ts +0 -36
  281. package/functions/ui.ts +0 -138
  282. package/functions/utils.ts +0 -189
  283. package/functions/vector.ts +0 -126
  284. package/index.ts +0 -172
  285. package/initCustomCallbacks.ts +0 -132
  286. package/initFeatures.ts +0 -39
  287. package/interfaces/AddCallbackParameterCustom.ts +0 -188
  288. package/interfaces/ChargeBarSprites.ts +0 -12
  289. package/interfaces/JSONDoor.ts +0 -13
  290. package/interfaces/JSONEntity.ts +0 -16
  291. package/interfaces/JSONRoom.ts +0 -36
  292. package/interfaces/JSONRooms.ts +0 -12
  293. package/interfaces/JSONSpawn.ts +0 -14
  294. package/interfaces/PlayerHealth.ts +0 -16
  295. package/interfaces/PocketItemDescription.ts +0 -9
  296. package/interfaces/SaveData.ts +0 -29
  297. package/interfaces/TrinketSituation.ts +0 -9
  298. package/interfaces/private/TSTLClassMetatable.ts +0 -8
  299. package/maps/PHDPillConversions.ts +0 -21
  300. package/maps/cardMap.ts +0 -209
  301. package/maps/characterMap.ts +0 -87
  302. package/maps/collectibleDescriptionMap.ts +0 -732
  303. package/maps/collectibleNameMap.ts +0 -731
  304. package/maps/defaultPlayerStatMap.ts +0 -17
  305. package/maps/falsePHDPillConversions.ts +0 -35
  306. package/maps/gridEntityTypeToBrokenStateMap.ts +0 -50
  307. package/maps/gridEntityXMLMap.ts +0 -176
  308. package/maps/pillEffectMap.ts +0 -88
  309. package/maps/roomShapeToTopLeftWallGridIndexMap.ts +0 -18
  310. package/maps/roomTypeMap.ts +0 -40
  311. package/maps/trinketDescriptionMap.ts +0 -200
  312. package/maps/trinketNameMap.ts +0 -198
  313. package/objects/LRoomShapeToRectangles.ts +0 -44
  314. package/objects/callbackRegisterFunctions.ts +0 -187
  315. package/objects/cardDescriptions.ts +0 -105
  316. package/objects/cardNames.ts +0 -105
  317. package/objects/cardTypes.ts +0 -104
  318. package/objects/challengeNames.ts +0 -52
  319. package/objects/characterNames.ts +0 -48
  320. package/objects/coinSubTypeToValue.ts +0 -14
  321. package/objects/colors.ts +0 -16
  322. package/objects/directionNames.ts +0 -11
  323. package/objects/directionToDegrees.ts +0 -11
  324. package/objects/directionToVector.ts +0 -12
  325. package/objects/doorSlotFlagToDoorSlot.ts +0 -16
  326. package/objects/doorSlotToDirection.ts +0 -14
  327. package/objects/isaacAPIClassTypeToBrand.ts +0 -11
  328. package/objects/isaacAPIClassTypeToCopyFunction.ts +0 -18
  329. package/objects/languageNames.ts +0 -13
  330. package/objects/oppositeDoorSlots.ts +0 -15
  331. package/objects/pillEffectClasses.ts +0 -63
  332. package/objects/pillEffectNames.ts +0 -57
  333. package/objects/pillEffectTypes.ts +0 -62
  334. package/objects/roomShapeBounds.ts +0 -71
  335. package/objects/roomShapeLayoutSizes.ts +0 -45
  336. package/objects/roomShapeToBottomRightPosition.ts +0 -25
  337. package/objects/roomShapeToDoorSlots.ts +0 -83
  338. package/objects/roomShapeToDoorSlotsToGridIndexDelta.ts +0 -127
  339. package/objects/roomShapeToGridWidth.ts +0 -21
  340. package/objects/roomShapeToTopLeftPosition.ts +0 -26
  341. package/objects/roomShapeVolumes.ts +0 -38
  342. package/objects/roomTypeNames.ts +0 -36
  343. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.ts +0 -14
  344. package/objects/stageTypeToLetter.ts +0 -15
  345. package/objects/transformationNames.ts +0 -18
  346. package/patchErrorFunctions.ts +0 -92
  347. package/sets/LRoomShapesSet.ts +0 -8
  348. package/sets/bossSets.ts +0 -470
  349. package/sets/charactersThatStartWithAnActiveItemSet.ts +0 -16
  350. package/sets/charactersWithBlackHeartFromEternalHeartSet.ts +0 -7
  351. package/sets/charactersWithFreeDevilDealsSet.ts +0 -4
  352. package/sets/charactersWithNoRedHeartsSet.ts +0 -17
  353. package/sets/charactersWithNoSoulHeartsSet.ts +0 -14
  354. package/sets/chestPickupVariantsSet.ts +0 -16
  355. package/sets/familiarsThatShootPlayerTearsSet.ts +0 -13
  356. package/sets/lostStyleCharactersSet.ts +0 -13
  357. package/sets/mineShaftRoomSubTypesSet.ts +0 -10
  358. package/sets/redHeartSubTypesSet.ts +0 -7
  359. package/sets/sinEntityTypesSet.ts +0 -11
  360. package/sets/singleUseActiveCollectibleTypesSet.ts +0 -13
  361. package/sets/storyBossesSet.ts +0 -17
  362. package/types/AnyEntity.ts +0 -12
  363. package/types/AwaitingTextInput.d.ts +0 -2
  364. package/types/CollectibleIndex.ts +0 -16
  365. package/types/PickingUpItem.ts +0 -89
  366. package/types/PlayerIndex.ts +0 -13
  367. package/types/private/IsaacAPIClass.ts +0 -3
  368. package/types/private/SerializedIsaacAPIClass.ts +0 -3
  369. package/types/private/TSTLClass.ts +0 -3
  370. package/upgradeMod.ts +0 -55
@@ -1,743 +0,0 @@
1
- // Basement Renovator can create custom rooms that are saved to XML files. These XML files can be
2
- // converted to JSON so that they can be imported by TypeScript code. Then, existing rooms can be
3
- // manually replaced with a custom room by manually removing everything in the room and rebuilding
4
- // it from scratch based on the JSON data.
5
-
6
- import {
7
- CollectibleType,
8
- EffectVariant,
9
- EntityCollisionClass,
10
- EntityFlag,
11
- EntityGridCollisionClass,
12
- EntityType,
13
- GridEntityType,
14
- GridEntityXMLType,
15
- ModCallback,
16
- PickupVariant,
17
- PitfallVariant,
18
- RoomType,
19
- } from "isaac-typescript-definitions";
20
- import { game } from "../cachedClasses";
21
- import { DefaultMap } from "../classes/DefaultMap";
22
- import { ModUpgraded } from "../classes/ModUpgraded";
23
- import { ModCallbackCustom } from "../enums/ModCallbackCustom";
24
- import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
25
- import { emptyArray } from "../functions/array";
26
- import {
27
- removeAllMatchingEntities,
28
- spawn,
29
- spawnWithSeed,
30
- } from "../functions/entity";
31
- import {
32
- getNPCs,
33
- removeAllBombs,
34
- removeAllPickups,
35
- } from "../functions/entitySpecific";
36
- import {
37
- convertXMLGridEntityType,
38
- getGridEntities,
39
- removeAllGridExcept,
40
- removeGrid,
41
- setGridEntityInvisible,
42
- spawnGridWithVariant,
43
- } from "../functions/gridEntity";
44
- import { getRandomJSONRoom } from "../functions/jsonRoom";
45
- import { log } from "../functions/log";
46
- import { getRandomSeed, isRNG, newRNG } from "../functions/rng";
47
- import { getRoomListIndex } from "../functions/roomData";
48
- import { gridCoordinatesToWorldPosition } from "../functions/roomGrid";
49
- import { setRoomCleared, setRoomUncleared } from "../functions/rooms";
50
- import { spawnCollectible } from "../functions/spawnCollectible";
51
- import { erange } from "../functions/utils";
52
- import { JSONRoom } from "../interfaces/JSONRoom";
53
- import { runNextGameFrame } from "./runInNFrames";
54
- import { saveDataManager } from "./saveDataManager/exports";
55
-
56
- interface PersistentEntityDescription {
57
- gridIndex: int;
58
- entityType: EntityType;
59
- variant: int;
60
- subType: int;
61
- }
62
-
63
- const FEATURE_NAME = "JSON room deployer";
64
-
65
- const NPC_TYPES_TO_NOT_REMOVE: ReadonlySet<EntityType> = new Set([
66
- EntityType.DARK_ESAU,
67
- ]);
68
-
69
- const PERSISTENT_ENTITY_TYPES: ReadonlySet<EntityType> = new Set([
70
- EntityType.WALL_HUGGER,
71
- ]);
72
-
73
- const v = {
74
- level: {
75
- deployedRoomListIndexes: new Set<int>(),
76
-
77
- /** Indexed by room list index. */
78
- roomToPersistentEntitiesMap: new DefaultMap<
79
- int,
80
- PersistentEntityDescription[]
81
- >(() => []),
82
-
83
- /** Indexed by room list index. */
84
- roomToDecorationGridIndexesMap: new DefaultMap<int, int[]>(() => []),
85
- },
86
-
87
- room: {
88
- manuallyUsingShovel: false,
89
- },
90
- };
91
-
92
- /** @internal */
93
- export function deployJSONRoomInit(mod: ModUpgraded): void {
94
- saveDataManager("deployJSONRoom", v);
95
-
96
- mod.AddCallback(
97
- ModCallback.PRE_USE_ITEM,
98
- preUseItemWeNeedToGoDeeper,
99
- CollectibleType.WE_NEED_TO_GO_DEEPER,
100
- ); // 23
101
-
102
- mod.AddCallbackCustom(
103
- ModCallbackCustom.POST_NEW_ROOM_REORDERED,
104
- postNewRoomReordered,
105
- );
106
- }
107
-
108
- // ModCallback.PRE_USE_ITEM (23)
109
- // CollectibleType.WE_NEED_TO_GO_DEEPER (84)
110
- function preUseItemWeNeedToGoDeeper(
111
- _collectibleType: CollectibleType,
112
- _rng: RNG,
113
- player: EntityPlayer,
114
- ): boolean | undefined {
115
- if (v.room.manuallyUsingShovel) {
116
- return undefined;
117
- }
118
-
119
- const roomListIndex = getRoomListIndex();
120
- if (!v.level.deployedRoomListIndexes.has(roomListIndex)) {
121
- return undefined;
122
- }
123
-
124
- // If the player uses the shovel in a JSON room, then it will always reveal a crawlspace. This is
125
- // because the room is filled with invisible decorations to prevent any grid entities from
126
- // respawning. In order to restore the normal shovel functionality, we cancel the shovel use,
127
- // remove all the decorations, wait a frame, manually use the shovel again, and then respawn the
128
- // decorations. (We can't do it all on this frame because updating the room causes two invocations
129
- // of the shovel to happen.)
130
- const decorations = getGridEntities(GridEntityType.DECORATION);
131
- for (const decoration of decorations) {
132
- removeGrid(decoration, false);
133
- }
134
-
135
- const playerPtr = EntityPtr(player);
136
- runNextGameFrame(() => {
137
- const futureEntity = playerPtr.Ref;
138
- if (futureEntity === undefined) {
139
- return;
140
- }
141
-
142
- const futurePlayer = futureEntity.ToPlayer();
143
- if (futurePlayer === undefined) {
144
- return;
145
- }
146
-
147
- v.room.manuallyUsingShovel = true;
148
- futurePlayer.UseActiveItem(CollectibleType.WE_NEED_TO_GO_DEEPER);
149
- v.room.manuallyUsingShovel = false;
150
-
151
- const decorationGridIndexes =
152
- v.level.roomToDecorationGridIndexesMap.getAndSetDefault(roomListIndex);
153
- emptyArray(decorationGridIndexes);
154
- fillRoomWithDecorations();
155
- });
156
-
157
- // Cancel the effect.
158
- return true;
159
- }
160
-
161
- // ModCallbackCustom.POST_NEW_ROOM_REORDERED
162
- function postNewRoomReordered() {
163
- const roomListIndex = getRoomListIndex();
164
-
165
- if (!v.level.deployedRoomListIndexes.has(roomListIndex)) {
166
- return;
167
- }
168
-
169
- setDecorationsInvisible();
170
- respawnPersistentEntities();
171
- }
172
-
173
- /**
174
- * Every time we re-enter a deployed room, the sprites for all of the decorations will come back, so
175
- * we have to remove them again.
176
- */
177
- function setDecorationsInvisible() {
178
- const room = game.GetRoom();
179
- const roomListIndex = getRoomListIndex();
180
-
181
- const decorationGridIndexes =
182
- v.level.roomToDecorationGridIndexesMap.getAndSetDefault(roomListIndex);
183
-
184
- for (const gridIndex of decorationGridIndexes) {
185
- const gridEntity = room.GetGridEntity(gridIndex);
186
- if (gridEntity !== undefined) {
187
- // Other grid entities may have spawned, like trapdoors or crawlspaces. Thus, only make
188
- // decorations invisible.
189
- const gridEntityType = gridEntity.GetType();
190
- if (gridEntityType === GridEntityType.DECORATION) {
191
- setGridEntityInvisible(gridEntity);
192
- }
193
- }
194
- }
195
- }
196
-
197
- /** Some entities must be manually respawned every time the player re-enters the room. */
198
- function respawnPersistentEntities() {
199
- const room = game.GetRoom();
200
- const roomListIndex = getRoomListIndex();
201
-
202
- const persistentEntities =
203
- v.level.roomToPersistentEntitiesMap.getAndSetDefault(roomListIndex);
204
-
205
- for (const persistentEntity of persistentEntities) {
206
- const position = room.GetGridPosition(persistentEntity.gridIndex);
207
- spawn(
208
- persistentEntity.entityType,
209
- persistentEntity.variant,
210
- persistentEntity.subType,
211
- position,
212
- );
213
- }
214
- }
215
-
216
- /**
217
- * Helper function to deconstruct a vanilla room and set up a custom room in its place.
218
- * Specifically, this will clear the current room of all entities and grid entities, and then spawn
219
- * all of the entries and grid entities in the provided JSON room.
220
- *
221
- * This function is meant to be used in the PostNewRoom callback.
222
- *
223
- * For example:
224
- *
225
- * ```ts
226
- *
227
- * import customRooms from "./customRooms";
228
- *
229
- * const firstJSONRoom = customRooms.rooms.room[0];
230
- * deployJSONRoom(firstJSONRoom);
231
- * ```
232
- *
233
- * @param jsonRoom The JSON room to deploy. *
234
- * @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
235
- * `RNG.Next` method will be called. Default is `getRandomSeed()`.
236
- * @param verbose Optional. If specified, will write entries to the "log.txt" file that describe
237
- * what the function is doing. Default is false.
238
- */
239
- export function deployJSONRoom(
240
- jsonRoom: JSONRoom,
241
- seedOrRNG: Seed | RNG = getRandomSeed(),
242
- verbose = false,
243
- ): void {
244
- errorIfFeaturesNotInitialized(FEATURE_NAME);
245
-
246
- const rng = isRNG(seedOrRNG) ? seedOrRNG : newRNG(seedOrRNG);
247
-
248
- if (verbose) {
249
- log("Starting to empty the room of entities and grid entities.");
250
- }
251
- emptyRoom(false);
252
- if (verbose) {
253
- log("Finished emptying the room of entities and grid entities.");
254
- }
255
-
256
- if (verbose) {
257
- log("Starting to spawn all of the new entities and grid entities.");
258
- }
259
- spawnAllEntities(jsonRoom, rng, verbose);
260
- if (verbose) {
261
- log("Finished spawning all of the new entities and grid entities.");
262
- }
263
-
264
- fixPitGraphics();
265
- fillRoomWithDecorations();
266
- }
267
-
268
- /**
269
- * Helper function to deconstruct a vanilla room and set up a custom room in its place.
270
- * Specifically, this will clear the current room of all entities and grid entities, and then spawn
271
- * all of the entries and grid entities in one of the provided JSON rooms.
272
- *
273
- * This function is meant to be used in the PostNewRoom callback.
274
- *
275
- * Note that this function does not simply choose a random element in the provided array; it will
276
- * properly account for each room weight using the algorithm from:
277
- * https://stackoverflow.com/questions/1761626/weighted-random-numbers
278
- *
279
- * For example:
280
- *
281
- * ```ts
282
- * import customRooms from "./customRooms";
283
- *
284
- * const jsonRooms = customRooms.rooms.room;
285
- * deployRandomJSONRoom(jsonRooms);
286
- * ```
287
- *
288
- * @param jsonRooms An array of JSON rooms to randomly select from. In practice, this will be
289
- * something like.
290
- * @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
291
- * `RNG.Next` method will be called. Default is `getRandomSeed()`.
292
- * @param verbose Optional. If specified, will write entries to the "log.txt" file that describe
293
- * what the function is doing. Default is false.
294
- */
295
- export function deployRandomJSONRoom(
296
- jsonRooms: JSONRoom[],
297
- seedOrRNG: Seed | RNG = getRandomSeed(),
298
- verbose = false,
299
- ): void {
300
- errorIfFeaturesNotInitialized(FEATURE_NAME);
301
-
302
- const rng = isRNG(seedOrRNG) ? seedOrRNG : newRNG(seedOrRNG);
303
-
304
- const randomJSONRoom = getRandomJSONRoom(jsonRooms, rng, verbose);
305
- if (verbose) {
306
- log(
307
- `Randomly chose JSON room ${randomJSONRoom.$.type}.${randomJSONRoom.$.variant}.${randomJSONRoom.$.subtype} with name: ${randomJSONRoom.$.name}`,
308
- );
309
- }
310
-
311
- return deployJSONRoom(randomJSONRoom, rng, verbose);
312
- }
313
-
314
- /**
315
- * Helper function to remove all naturally spawning entities and grid entities from a room. Notably,
316
- * this will not remove players (1), tears (2), familiars (3), lasers (7), knives (8), projectiles
317
- * (9), blacklisted NPCs such as Dark Esau, charmed NPCs, friendly NPCs, persistent NPCs, most
318
- * effects (1000), doors, and walls.
319
- *
320
- * @param fillWithDecorations Optional. Set to true to fill every grid tile with an invisible
321
- * decoration, which prevents vanilla entities in the room from
322
- * respawning the next time that the player enters. Default is false.
323
- */
324
- export function emptyRoom(fillWithDecorations: boolean): void {
325
- errorIfFeaturesNotInitialized(FEATURE_NAME);
326
-
327
- const roomListIndex = getRoomListIndex();
328
-
329
- v.level.deployedRoomListIndexes.add(roomListIndex);
330
-
331
- removeAllBombs(); // 4
332
- removeAllPickups(); // 5
333
- removeAllMatchingEntities(EntityType.SLOT); // 6
334
- removeSpecificNPCs();
335
- removeAllMatchingEntities(EntityType.EFFECT, EffectVariant.DEVIL);
336
- removeAllMatchingEntities(EntityType.EFFECT, EffectVariant.ANGEL);
337
-
338
- removeAllGridExcept(
339
- GridEntityType.WALL, // 15
340
- GridEntityType.DOOR, // 16
341
- );
342
-
343
- setRoomCleared();
344
-
345
- if (fillWithDecorations) {
346
- fillRoomWithDecorations();
347
- }
348
- }
349
-
350
- /**
351
- * We remove entities in the PostNewRoom callback instead of in the PreRoomEntitySpawn callback so
352
- * that they will not re-appear when we re-enter the room.
353
- */
354
- function removeSpecificNPCs() {
355
- const room = game.GetRoom();
356
-
357
- for (const npc of getNPCs()) {
358
- if (NPC_TYPES_TO_NOT_REMOVE.has(npc.Type)) {
359
- continue;
360
- }
361
-
362
- if (
363
- npc.HasEntityFlags(EntityFlag.CHARM) ||
364
- npc.HasEntityFlags(EntityFlag.FRIENDLY) ||
365
- npc.HasEntityFlags(EntityFlag.PERSISTENT)
366
- ) {
367
- continue;
368
- }
369
-
370
- npc.ClearEntityFlags(EntityFlag.APPEAR);
371
- npc.Remove();
372
-
373
- // When fire places are removed, they will leave behind a "path" that will prevent future grid
374
- // entities from being spawned on the same tile. Thus, reset the path for this tile if this is a
375
- // fire place.
376
- if (npc.Type === EntityType.FIREPLACE) {
377
- const gridIndex = room.GetGridIndex(npc.Position);
378
- room.SetGridPath(gridIndex, 0);
379
- }
380
- }
381
- }
382
-
383
- /**
384
- * We removed most normal entities, which should prevent them from respawning when the player
385
- * re-enters the room. However, this is not the case for grid entities; even if they are removed,
386
- * they will come back when the player re-enters the room.
387
- *
388
- * In order to prevent this from happening, we can spawn a grid entity on every tile that does not
389
- * already have a grid entity. The natural grid entity to choose for this purpose is a decoration,
390
- * since it is non-interacting.
391
- *
392
- * Another option besides decorations would be to use a pressure plates with a state of 1, which is
393
- * a state that is normally unused by the game and makes it invisible & persistent. However, pickups
394
- * will not be able to spawn on pressure plates, which lead to various bugs (e.g. pickups spawning
395
- * on top of pits). Thus, we use a decoration and remove its sprite to make it invisible.
396
- */
397
- function fillRoomWithDecorations() {
398
- const room = game.GetRoom();
399
- const gridSize = room.GetGridSize();
400
- const roomListIndex = getRoomListIndex();
401
-
402
- const decorationGridIndexes =
403
- v.level.roomToDecorationGridIndexesMap.getAndSetDefault(roomListIndex);
404
-
405
- for (const gridIndex of erange(gridSize)) {
406
- const existingGridEntity = room.GetGridEntity(gridIndex);
407
- if (existingGridEntity !== undefined) {
408
- continue;
409
- }
410
-
411
- const position = room.GetGridPosition(gridIndex);
412
- const decoration = Isaac.GridSpawn(GridEntityType.DECORATION, 0, position);
413
-
414
- if (decoration !== undefined) {
415
- setGridEntityInvisible(decoration);
416
- }
417
-
418
- decorationGridIndexes.push(gridIndex);
419
- }
420
- }
421
-
422
- function spawnAllEntities(jsonRoom: JSONRoom, rng: RNG, verbose = false) {
423
- let shouldUnclearRoom = false;
424
-
425
- for (const jsonSpawn of jsonRoom.spawn) {
426
- const xString = jsonSpawn.$.x;
427
- const x = tonumber(xString);
428
- if (x === undefined) {
429
- error(
430
- `Failed to convert the following x coordinate to a number (for a spawn): ${xString}`,
431
- );
432
- }
433
-
434
- const yString = jsonSpawn.$.y;
435
- const y = tonumber(yString);
436
- if (y === undefined) {
437
- error(
438
- `Failed to convert the following y coordinate to a number (for a spawn): ${yString}`,
439
- );
440
- }
441
-
442
- if (jsonSpawn.entity.length > 1) {
443
- error("Stacked entities are not implemented for JSON rooms.");
444
- }
445
-
446
- const firstXMLEntity = jsonSpawn.entity[0];
447
- if (firstXMLEntity === undefined) {
448
- error('Failed to get the first JSON entity from an "entity" array.');
449
- }
450
-
451
- const entityTypeString = firstXMLEntity.$.type;
452
- const entityType = tonumber(entityTypeString);
453
- if (entityType === undefined) {
454
- error(
455
- `Failed to convert the entity type to a number: ${entityTypeString}`,
456
- );
457
- }
458
-
459
- const variantString = firstXMLEntity.$.variant;
460
- const variant = tonumber(variantString);
461
- if (variant === undefined) {
462
- error(`Failed to convert the entity variant to a number: ${variant}`);
463
- }
464
-
465
- const subTypeString = firstXMLEntity.$.subtype;
466
- const subType = tonumber(subTypeString);
467
- if (subType === undefined) {
468
- error(`Failed to convert the entity sub-type to a number: ${subType}`);
469
- }
470
-
471
- // Note that XML entity type 1000 is a rock, not an effect.
472
- if (entityType >= 1000) {
473
- if (verbose) {
474
- log(`Spawning grid entity ${entityType}.${variant} at: (${x}, ${y})`);
475
- }
476
- spawnGridEntityForJSONRoom(
477
- entityType as GridEntityXMLType,
478
- variant,
479
- x,
480
- y,
481
- );
482
- } else {
483
- if (verbose) {
484
- log(
485
- `Spawning normal entity ${entityType}.${variant}.${subType} at: (${x}, ${y})`,
486
- );
487
- }
488
- const entity = spawnNormalEntityForJSONRoom(
489
- entityType as EntityType,
490
- variant,
491
- subType,
492
- x,
493
- y,
494
- rng,
495
- );
496
- const npc = entity.ToNPC();
497
- if (npc !== undefined && npc.CanShutDoors) {
498
- shouldUnclearRoom = true;
499
- }
500
- }
501
- }
502
-
503
- // After emptying the room, we manually cleared the room. However, if the room layout contains an
504
- // battle NPC, then we need to reset the clear state and close the doors again.
505
- if (shouldUnclearRoom) {
506
- if (verbose) {
507
- log(
508
- "Setting the room to be uncleared since there were one or more battle NPCs spawned.",
509
- );
510
- }
511
- setRoomUncleared();
512
- } else if (verbose) {
513
- log("Leaving the room cleared since there were no battle NPCs spawned.");
514
- }
515
- }
516
-
517
- function spawnGridEntityForJSONRoom(
518
- gridEntityXMLType: GridEntityXMLType,
519
- gridEntityXMLVariant: int,
520
- x: int,
521
- y: int,
522
- ) {
523
- const room = game.GetRoom();
524
-
525
- const gridEntityTuple = convertXMLGridEntityType(
526
- gridEntityXMLType,
527
- gridEntityXMLVariant,
528
- );
529
- if (gridEntityTuple === undefined) {
530
- return undefined;
531
- }
532
- const [gridEntityType, variant] = gridEntityTuple;
533
- const position = gridCoordinatesToWorldPosition(x, y);
534
- const gridIndex = room.GetGridIndex(position);
535
-
536
- const gridEntity = spawnGridWithVariant(gridEntityType, variant, gridIndex);
537
- if (gridEntity === undefined) {
538
- return gridEntity;
539
- }
540
-
541
- // Prevent poops from playing an appear animation, since that is not supposed to normally happen
542
- // when entering a new room.
543
- if (gridEntityType === GridEntityType.POOP) {
544
- const sprite = gridEntity.GetSprite();
545
- sprite.Play("State1", true);
546
- sprite.SetLastFrame();
547
- }
548
-
549
- return gridEntity;
550
- }
551
-
552
- function spawnNormalEntityForJSONRoom(
553
- entityType: EntityType,
554
- variant: int,
555
- subType: int,
556
- x: int,
557
- y: int,
558
- rng: RNG,
559
- ) {
560
- const room = game.GetRoom();
561
- const roomType = room.GetType();
562
- const position = gridCoordinatesToWorldPosition(x, y);
563
- const seed = rng.Next();
564
-
565
- let entity: Entity;
566
- if (
567
- entityType === EntityType.PICKUP &&
568
- (variant as PickupVariant) === PickupVariant.COLLECTIBLE
569
- ) {
570
- const options = roomType === RoomType.ANGEL;
571
- entity = spawnCollectible(
572
- subType as CollectibleType,
573
- position,
574
- seed,
575
- options,
576
- );
577
- } else {
578
- entity = spawnWithSeed(entityType, variant, subType, position, seed);
579
- }
580
-
581
- // For some reason, Pitfalls do not spawn with the correct collision classes.
582
- if (
583
- entityType === EntityType.PITFALL &&
584
- (variant as PitfallVariant) === PitfallVariant.PITFALL
585
- ) {
586
- entity.EntityCollisionClass = EntityCollisionClass.ENEMIES;
587
- entity.GridCollisionClass = EntityGridCollisionClass.WALLS;
588
- }
589
-
590
- storePersistentEntity(entity);
591
-
592
- return entity;
593
- }
594
-
595
- /**
596
- * Some entities must be manually respawned every time the player re-enters the room. If we just
597
- * spawned one such entity, then record it for later.
598
- */
599
- function storePersistentEntity(entity: Entity) {
600
- if (!PERSISTENT_ENTITY_TYPES.has(entity.Type)) {
601
- return;
602
- }
603
-
604
- const room = game.GetRoom();
605
- const gridIndex = room.GetGridIndex(entity.Position);
606
- const roomListIndex = getRoomListIndex();
607
-
608
- const persistentEntity: PersistentEntityDescription = {
609
- gridIndex,
610
- entityType: entity.Type,
611
- variant: entity.Variant,
612
- subType: entity.SubType,
613
- };
614
-
615
- const persistentEntities =
616
- v.level.roomToPersistentEntitiesMap.getAndSetDefault(roomListIndex);
617
- persistentEntities.push(persistentEntity);
618
- }
619
-
620
- /**
621
- * By default, when spawning multiple pits next to each other, the graphics will not "meld"
622
- * together. Thus, now that all of the entities in the room are spawned, we must iterate over the
623
- * pits in the room and manually fix their sprites, if necessary.
624
- */
625
- function fixPitGraphics() {
626
- const room = game.GetRoom();
627
- const gridWidth = room.GetGridWidth();
628
- const pitMap = getPitMap();
629
-
630
- for (const [gridIndex, gridEntity] of pitMap.entries()) {
631
- const gridIndexLeft = gridIndex - 1;
632
- const L = pitMap.has(gridIndexLeft);
633
- const gridIndexRight = gridIndex + 1;
634
- const R = pitMap.has(gridIndexRight);
635
- const gridIndexUp = gridIndex - gridWidth;
636
- const U = pitMap.has(gridIndexUp);
637
- const gridIndexDown = gridIndex + gridWidth;
638
- const D = pitMap.has(gridIndexDown);
639
- const gridIndexUpLeft = gridIndex - gridWidth - 1;
640
- const UL = pitMap.has(gridIndexUpLeft);
641
- const gridIndexUpRight = gridIndex - gridWidth + 1;
642
- const UR = pitMap.has(gridIndexUpRight);
643
- const gridIndexDownLeft = gridIndex + gridWidth - 1;
644
- const DL = pitMap.has(gridIndexDownLeft);
645
- const gridIndexDownRight = gridIndex + gridWidth + 1;
646
- const DR = pitMap.has(gridIndexDownRight);
647
-
648
- const pitFrame = getPitFrame(L, R, U, D, UL, UR, DL, DR);
649
- const sprite = gridEntity.GetSprite();
650
- sprite.SetFrame(pitFrame);
651
- }
652
- }
653
-
654
- function getPitMap() {
655
- const pitMap = new Map<int, GridEntity>();
656
- for (const gridEntity of getGridEntities(GridEntityType.PIT)) {
657
- const gridIndex = gridEntity.GetGridIndex();
658
- pitMap.set(gridIndex, gridEntity);
659
- }
660
-
661
- return pitMap;
662
- }
663
-
664
- /** The logic in this function is copied from Basement Renovator. */
665
- function getPitFrame(
666
- L: boolean,
667
- R: boolean,
668
- U: boolean,
669
- D: boolean,
670
- UL: boolean,
671
- UR: boolean,
672
- DL: boolean,
673
- DR: boolean,
674
- ) {
675
- let F = 0;
676
-
677
- // First, check for bitwise frames. (It works for all combinations of just left/up/right/down.)
678
- if (L) {
679
- F |= 1;
680
- }
681
- if (U) {
682
- F |= 2;
683
- }
684
- if (R) {
685
- F |= 4;
686
- }
687
- if (D) {
688
- F |= 8;
689
- }
690
-
691
- // Then, check for other combinations.
692
- if (U && L && !UL && !R && !D) {
693
- F = 17;
694
- }
695
- if (U && R && !UR && !L && !D) {
696
- F = 18;
697
- }
698
- if (L && D && !DL && !U && !R) {
699
- F = 19;
700
- }
701
- if (R && D && !DR && !L && !U) {
702
- F = 20;
703
- }
704
- if (L && U && R && D && !UL) {
705
- F = 21;
706
- }
707
- if (L && U && R && D && !UR) {
708
- F = 22;
709
- }
710
- if (U && R && D && !L && !UR) {
711
- F = 25;
712
- }
713
- if (L && U && D && !R && !UL) {
714
- F = 26;
715
- }
716
-
717
- if (L && U && R && D && !DL && !DR) {
718
- F = 24;
719
- }
720
- if (L && U && R && D && !UR && !UL) {
721
- F = 23;
722
- }
723
- if (L && U && R && UL && !UR && !D) {
724
- F = 27;
725
- }
726
- if (L && U && R && UR && !UL && !D) {
727
- F = 28;
728
- }
729
- if (L && U && R && !D && !UR && !UL) {
730
- F = 29;
731
- }
732
- if (L && R && D && DL && !U && !DR) {
733
- F = 30;
734
- }
735
- if (L && R && D && DR && !U && !DL) {
736
- F = 31;
737
- }
738
- if (L && R && D && !U && !DL && !DR) {
739
- F = 32;
740
- }
741
-
742
- return F;
743
- }