Change Log
This page lists the changes to the IsaacScript framework.
May 13th, 2023
- Added REPENTOGON support. Since this hack changes vanilla classes, you must install a separate package if you want to use it called
isaac-typescript-definitions-repentogon
. Since using REPENTOGON functionality will cause run-time errors on vanilla, you should very carefully gate your mod behind a REPENTOGON check with a clear error message. (Thanks 4Grabs) - Added the following helper functions:
isRepentogon
January 8th, 2023
- Added the following helper functions:
isNormalPillColor
- Added the following enums:
ModCallbackRepentogon
(Thanks 4Grabs)
- Added the following helper types:
ObjectValues
- Added the following custom command:
goldenPill
- Added the following lint rules:
isaacscript/no-unnecessary-assignment
January 1st, 2023
- Added the following custom commands:
megaSatan
- Renamed the following helper functions:
validateInterfaceMatchesEnum
-->interfaceSatisfiesEnum
December 17th, 2023
isaacscript-common
now provides JavaScript files alongside Lua files. (isaac-typescript-definitions
already does this.)isaac-lua-polyfills
now provides more polyfills such that you can importisaacscript-common
in JavaScript code without any run-time errors.- Added the following helper functions:
getMainCharacter
- Changed the following helper functions:
eRange
- The reverse functionality has been removed.iRange
- The reverse functionality has been removed.
- Renamed the following helper functions:
characterCanHaveRedHearts
-->canCharacterHaveRedHearts
characterCanHaveSoulHearts
-->canCharacterHaveSoulHearts
characterCanTakeFreeDevilDeals
-->canCharacterTakeFreeDevilDeals
characterGetsBlackHeartFromEternalHeart
-->doesCharacterGetBlackHeartFromEternalHeart
characterStartsWithActiveItem
-->doesCharacterStartWithActiveItem
December 10th, 2023
- Added the following helper functions:
getAllBosses
getAllNonStoryBosses
getArrayDuplicateElements
getBossIDsForStage
getBossIDsForStageID
getBossStageIDs
getEdenStartingActiveCollectible
getEdenStartingPassiveCollectible
getEdenStartingCollectibles
isArrayElementsUnique
- Added the following types:
ReadonlyRecord
- Added the following lint rules:
prefer-readonly-parameter-types
strict-void-functions
strict-undefined-functions
no-undefined-return-type
- Deleted the following helper functions:
getBossSet
getAllBossesSet
- Added the following custom commands:
horse
December 1st, 2023
- Most of the functions from
isaacscript-common
that return arrays now return read-only versions of those arrays. - Added the following helper functions:
isValidCardType
isValidPillEffect
isValidTrinketType
parseIntSafe
- Removed the following constants:
FIRST_ROOM_TYPE
FIRST_STAGE
LAST_ROOM_TYPE
LAST_STAGE
- Added the following lint rules:
no-mutable-return
November 17th, 2023
- Added the following helper functions:
getChests
is2x1RoomShape
objectKeysToSet
objectKeysToReadonlySet
objectToMap
objectToReadonlyMap
objectValuesToSet
objectValuesToReadonlySet
removeAllChests
uncapitalizeFirstLetter
- Renamed the following helper functions:
stageTypeToLetter
-->getStageTypeSuffix
- Removed the following helper functions:
goToStage
(usesetStage
instead)isRoomDangerous
(useRoom.IsClear
instead, since it is more performant)
- Added the following enums:
AngelicBabySubType
(Thanks popjam)DarkEsauSubType
(Thanks popjam)DeepGaperSubType
(Thanks popjam)DragonFlySubType
(Thanks popjam)LeperSubType
(Thanks popjam)MazeRoamerSubType
(Thanks popjam)MomsHeartSubType
(Thanks popjam)MotherBallSubType
(Thanks popjam)MorningStarSubType
(Thanks popjam)QuakeGrimaceSubType
(Thanks popjam)RottenGaperSubType
(Thanks popjam)
- Added the following types:
StoryBossID
November 10th, 2023
- The location of the plugins in the "isaacscript" package have changed. See the new "tsconfig.json" template.
- Scripts in new mods no longer use Bash and are now native TypeScript scripts.
- The
isaacscript-common-node
library is released, which contains helper functions for Bash-like scripts. - The
canRunUnlockAchievements
helper function must now be activated withISCFeature.UNLOCK_ACHIEVEMENTS_DETECTION
. - The following enums are no longer const enums and have to be explicitly imported:
EncyclopediaItemPoolType
ModConfigMenuOptionType
StageAPILayoutButtonVariant
StageAPILayoutCornyPoopSubtype
StageAPILayoutGridType
StageAPILayoutPitfallVariant
StageAPILayoutPoopSubtype
StageAPILayoutRockSubtype
StageAPILayoutSpikesOnOffVariant
- CI in new mods now runs build and lint in a separate jobs so that they run faster.
- Added the following helper functions:
getAdjustedPrice
getRoomClearRenderFrame
hasCard
shouldWhoreOfBabylonBeActive
- Changed the following helper functions:
spawnCollectible
(is now pure)preventCollectibleRotation
(is now pure)
- Functions from
ISCFeature.MODDED_ELEMENT_SETS
now return arrays instead of sets. - Removed the following helper functions:
spawnCollectibleUnsafe
(use thespawnCollectible
function instead)
- Added the following enums:
NPCID
(Thanks popjam)
November 2nd, 2023
- Helper functions that deal with randomness now require you to pass the seed. If you want unseeded behavior, then you must explicitly pass
undefined
. - Added the following helper functions:
asRoomType
crc32
getDefaultCollectibleTypesInItemPool
getDefaultItemPoolsForCollectibleType
getItemPoolName
inGrid
isActiveEnemy
isCollectibleTypeInDefaultItemPool
logItemPoolTypes
- Added the following enums:
ConquestState
FamineState
PestilenceState
UltraGreedState
UltraGreedierState
WarState
WarWithoutHorseState
- Removed the following helper types:
Expand
October 18th, 2023
- Added the following helper functions:
getChallengeCollectibleTypes
getChallengeTrinketType
isFamiliarCollectible
isRoomDangerous
parseSemanticVersion
splitNumber
October 9th, 2023
- IsaacScript now requires that TypeScript and other development-related dependencies are placed in the "devDependencies" array in the "package.json" file (instead of the "dependencies" array). This is to prevent TypeScript-related functions from sneaking into VSCode's auto-complete list.
- Added the following helper functions:
assertNotNull
clearChallenge
getBossName
getChallengeBoss
getChallengeCharacter
getElapsedGameFramesSince
getElapsedRenderFramesSince
getElapsedRoomFramesSince
getElapsedTimeSince
getGridEntityANM2Path
getRockPNGPath
getSurroundingGridIndexes
getVanillaCollectibleTypesOfQuality
getVanillaPillEffectsOfType
hasHoming
inBigRoom
isAfterGameFrame
isAfterRenderFrame
isAfterRoomFrame
isBeforeGameFrame
isBeforeRenderFrame
isBeforeRoomFrame
isBigRoom
isBigRoomShape
isGridIndexAdjacentToDoor
isStoryBossID
onAnyChallenge
onChallenge
onGameFrame
onOrAfterGameFrame
onOrAfterRenderFrame
onOrAfterRoomFrame
onOrBeforeGameFrame
onOrBeforeRenderFrame
onOrBeforeRoomFrame
onRenderFrame
onRoomFrame
runNextRun
setChallenge
setRunSeed
- Renamed the following helper functions:
removeCollectibleFromItemTracker
-->rebirthItemTrackerRemoveCollectible
getMoveActions
-->getMoveButtonActions
getShootActions
-->getShootButtonActions
- Removed the following helper functions:
isGreedMode
(useGame.IsGreedMode
instead)
- Added the following constants:
MAX_QUALITY
- Renamed the following constants:
MOVEMENT_ACTIONS
-->MOVEMENT_BUTTON_ACTIONS
MOVEMENT_ACTIONS_SET
-->MOVEMENT_BUTTON_ACTIONS_SET
SHOOTING_ACTIONS
-->SHOOTING_BUTTON_ACTIONS
SHOOTING_ACTIONS_SET
-->SHOOTING_BUTTON_ACTIONS_SET
- Added the following enums:
CarpetSubType
- Added the following helper types:
WidenLiteral
- Added the following custom commands:
xl
(alias for "labyrinth")
October 2nd, 2023
- Added the following helper functions:
anyEasterEggEnabled
(alias foranySeedEffectEnabled
)anySeedEffectEnabled
getCharacterStartingTrinketType
getBatteryName
getBombName
getBossID
getBossIDFromEntityTypeVariant
getBossNamePNGFilePath
getBossPortraitPNGFilePath
getBossRushDoor
getCharacterNamePNGFilePath
getCharacterPortraitPNGFilePath
getCharacterSpritePNGFilePath
getChestName
getCoinName
getCollectibleTypesOfQuality
getEntityTypeVariantFromBossID
getEnumNames
getHeartName
getKeyName
getNormalTrinketType
getPlayerCollectiblesOfQuality
getPlayerTrinkets
getSackName
getSeedEffects
getSlotName
getVanillaWallGridIndexSetForRoomShape
inCrawlSpaceWithBlackMarketEntrance
inDogmaRoom
isBossRushDoor
isCrawlSpaceWithBlackMarketEntrance
isDogmaRoom
isRepentanceBoss
onVictoryLap
setGridEntityType
- Changed the following helper functions:
arrayRemoveInPlace
now returns the removed elements.arrayRemoveIndexInPlace
now returns the removed elements.getAllBossesSet
now returns a set ofBossID
and does not include the four ultra horsemen.getBossSet
now returns a set ofBossID
and does not include the four ultra horsemen.getCombinedBossSet
now returns a set ofBossID
and does not include the four ultra horsemen.
- Renamed the following helper functions:
getEnglishLevelName
-->getLevelName
getPlayerInventory
-->getPlayerCollectibleTypes
getPlayerLastPassiveCollectible
-->getPlayerLastPassiveCollectibleType
getCharacterStartingCollectibles
-->getCharacterStartingCollectibleTypes
isPassiveCollectible
-->isPassiveOrFamiliarCollectible
- Added the following constants:
CHEST_PICKUP_VARIANTS
CHEST_PICKUP_VARIANTS_SET
COLLECTIBLE_NAME_TO_TYPE_MAP
TRINKET_NAME_TO_TYPE_MAP
QUALITIES
- Added the following helper types:
CompositionTypeSatisfiesEnum
- Renamed the following features:
ISCFeature.PLAYER_INVENTORY
-->ISCFeature.PLAYER_COLLECTIBLE_TRACKING
ISCFeature.EDEN_STARTING_STATS
-->ISCFeature.EDEN_STARTING_STATS_HEALTH
September 25th, 2023
- Added the following helper functions:
getPillEffects
getPillEffectsSet
anyPlayerHasCollectibleEffect
anyPlayerHasTrinketEffect
anyPlayerHasNullEffect
getObjectPartialMatch
getMegaSatanDoor
getModdedPillEffects
getModdedPillEffectsSet
getVoidDoor
inRedKeyRoom
isGridEntityXMLType
(for thePRE_ROOM_ENTITY_SPAWN
callback)isMainCharacter
isMegaSatanDoor
isVoidDoor
- Renamed the following helper functions:
isPoopGridEntityType
-->isPoopGridEntityXMLType
getCardArray
-->getCardTypes
getCardSet
-->getCardTypesSet
getCollectibleArray
-->getCollectibleTypes
getCollectibleSet
-->getCollectibleTypesSet
getCollectiblesForTransformation
-->getCollectibleTypesForTransformation
getCollectiblesWithCacheFlag
-->getCollectibleTypesWithCacheFlag
getCollectiblesWithTag
-->getCollectibleTypesWithTag
getEdenActiveCollectibles
-->getEdenActiveCollectibleTypes
getEdenPassiveCollectibles
-->getEdenPassiveCollectibleTypes
getFlyingCollectibles
-->getFlyingCollectibleTypes
getFlyingTrinkets
-->getFlyingTrinketTypes
getModdedCardArray
-->getModdedCardTypes
getModdedCardSet
-->getModdedCardTypesSet
getModdedCollectibleArray
-->getModdedCollectibleTypes
getModdedCollectibleSet
-->getModdedCollectibleTypesSet
getModdedTrinketArray
-->getModdedTrinketTypes
getModdedTrinketSet
-->getModdedTrinketTypesSet
getRandomEdenActiveCollectible
-->getRandomEdenActiveCollectibleType
getRandomEdenPassiveCollectible
-->getRandomEdenPassiveCollectibleType
getTrinketArray
-->getTrinketTypes
getTrinketSet
-->getTrinketTypesSet
getTrinketsWithCacheFlag
-->getTrinketsTypesWithCacheFlag
- Removed the following helper functions:
getAllCardTypes
(usegetCardTypes
instead)getAllDimensions
(use theDIMENSIONS
constant instead)getAllPillEffects
(usegetPillEffects
instead)getVanillaCardArray
(use theVANILLA_CARD_TYPES
constant instead)getVanillaCardSet
(use theVANILLA_CARD_TYPES_SET
constant instead)getVanillaCollectibleArray
(use theVANILLA_COLLECTIBLE_TYPES
constant instead)getVanillaCollectibleTypeRange
(use theVANILLA_COLLECTIBLE_TYPE_RANGE
constant instead)getVanillaCollectibleSet
(use theVANILLA_COLLECTIBLE_TYPES_SET
constant instead)getVanillaPillEffects
(use theVANILLA_PILL_EFFECTS
constant instead)getVanillaTrinketArray
(use theVANILLA_TRINKET_TYPES
constant instead)getVanillaTrinketTypeRange
(use theVANILLA_TRINKET_TYPE_RANGE
constant instead)getVanillaTrinketSet
(use theVANILLA_TRINKET_TYPES_SET
constant instead)
- Added the following constants:
DIMENSIONS
FLYING_CHARACTERS
MAIN_CHARACTERS
NUM_VANILLA_CHALLENGES
VANILLA_CARD_TYPE_RANGE
VANILLA_CARD_TYPES
VANILLA_CARD_TYPES_SET
VANILLA_COLLECTIBLE_TYPE_RANGE
VANILLA_COLLECTIBLE_TYPES
VANILLA_COLLECTIBLE_TYPES_SET
VANILLA_PILL_EFFECT_RANGE
VANILLA_PILL_EFFECTS
VANILLA_PILL_EFFECTS_SET
VANILLA_TRINKET_TYPE_RANGE
VANILLA_TRINKET_TYPES
VANILLA_TRINKET_TYPES_SET
- Changed the following constants:
NUM_PILLS_IN_POOL
-->NUM_PILL_COLORS_IN_POOL
- Added the following helper types:
ERange
TupleKeys
- Renamed the following helper types:
Range
-->IRange
September 18th, 2023
- Added the following helper functions:
asFloat
asInt
getLowestEnumValue
- Removed the following helper functions:
getLastElement
(TSTL supports theArray.at
method now)
- Added the following custom commands:
collectible
(alias for thespawnCollectible
command)goldTrinket
(alias for thespawnGoldenTrinket
command)goldenTrinket
(alias for thespawnGoldenTrinket
command)spawnCollectibleAt
spawnTrinketAt
spawnGoldTrinket
(alias for thespawnGoldenTrinket
command)spawnGoldenTrinketAt
trinket
(alias for thespawnTrinket
command)
September 11th, 2023
- The save data manager now supports rewinding a
persistent
object if__rewindWithGlowingHourGlass
is specified. - The "Extra Console Commands" feature will now work properly if two or more mods have it enabled.
- Added the following helper functions:
getHighestArrayElement
getLevelBossIDs
getLowestArrayElement
hasAnyTrinket
hasPiercing
hasSpectral
hasTrinket
inRoomShape
isMissedTear
isPoopGridEntityType
isRoomShape
levelHasBossID
rebirthItemTrackerWriteToFile
removeAllConsoleCommands
useCardTemp
- Renamed the following helper functions:
addStat
-->addPlayerStat
- Added the following enums:
DebugCommand
PortalTeleportSubType
September 4th, 2023
- Added the following helper functions:
getMoveActions
getShootActions
isChestVariant
isFinalFloor
isInteger
isRedHeartSubType
isStageWithNaturalDevilRoom
isStageWithRandomBossCollectible
isStageWithSecretExitToDownpour
isStageWithSecretExitToMausoleum
isStageWithSecretExitToMines
isStageWithShovelTrapdoors
isStageWithStoryBoss
onStageWithStoryBoss
- Added the following constants:
MOVEMENT_ACTIONS_SET
SHOOTING_ACTIONS_SET
- Renamed the following helper functions:
onStageWithShovelWorking
-->onStageWithShovelTrapdoors
August 27th, 2023
- Added the following helper function:
assertDefined
(for more concise type-narrowing)isEnumValue
renderTextOnEntity
renderScaledTextOnEntity
- Added the following constants:
MODIFIER_KEYS
MOVEMENT_ACTIONS
SHOOTING_ACTIONS
August 20th, 2023
- Added the following helper types:
TupleWithLengthBetween
August 10th, 2023
- Added the following helper functions:
filterMap
is2x1Room
isBeastRoom
isBossRoomOf
isCrawlSpace
isDeathCertificateArea
isDevilsCrownTreasureRoom
isDoubleTrouble
isGenesisRoom
isHomeCloset
isLRoom
isMegaSatanRoom
isMinibossRoomOf
isMirrorRoom
isRoomType
isSecretExit
isSecretShop
- Renamed the following helper functions:
initArray
-->newArray
isLRoom
-->isLRoomShape
- Changed the following helper functions:
newRoom
- AddedensureDeadEnd
andcustomRoomData
optional arguments.getNewRoomCandidate
- AddedensureDeadEnd
optional argument.getNewRoomCandidatesForLevel
- AddedensureDeadEnd
optional argument.getNewRoomCandidatesBesideRoom
- AddedensureDeadEnd
optional argument.
August 3rd, 2023
eslint-config-isaacscript
is rewritten from scratch. It no longer relies on any upstream configs and is now documented officially on the website.
June 30th, 2023
- Added the following helper functions:
defaultMapGetNPC
defaultMapSetNPC
mapDeleteNPC
mapGetNPC
mapHasNPC
mapSetNPC
setAddNPC
setDeleteNPC
setHasNPC
June 5th, 2023
- Added the following helper functions:
pocketItemsEquals
getPillColorFromEffect
logTableShallow
April 24th, 2023
- Added the following helper functions:
doesGridEntityExist
getPlayerStats
getEdenStartingStat
getEdenStartingStats
- Added the following custom console commands:
spikes
(spawns a spikes grid entity next to the player)
March 28th, 2023
- Added the following helper functions:
areInputsEnabled
- Added the following custom console commands:
poop
(spawns a poop grid entity next to the player)
March 21st, 2023
- Added the following helper functions:
newSprite
March 13th, 2023
- Added the following helper functions:
getUsableActiveItemSlots
logDisplayFlags
getClosestVectorTo
vectorToRoomGridIndex
- Renamed the following helper functions:
roomGridIndexToXY
-->roomGridIndexToVector
- Changed the following helper functions:
getCustomGridEntities
(returns an array of objects instead of tuples)getStageHistory
(returns an array of objects instead of tuples)getNewRoomCandidatesBesideRoom
(returns an array of objects instead of tuples)getNewRoomCandidatesForLevel
(returns an array of objects instead of tuples)getNewRoomCandidate
(returns an array of objects instead of tuples)anyPlayerHasCollectible
(now takes an optional param ofignoreModifiers
)anyPlayerHasTrinket
(now takes an optional param ofignoreModifiers
)
- Added the following custom callbacks:
POST_TEAR_KILL
(Thanks 4Grabs)POST_PROJECTILE_KILL
(Thanks 4Grabs)
- Added the following constants:
STARTING_ROOM_GRID_INDEX
March 6th, 2023
- Added the following helper functions:
onStageOrHigher
onStageOrLower
getFirstCard
getFirstPill
mapDeletePlayer
hasDoorType
- Changed the following helper functions:
spawnPersistentEntity
- Now returns an object instead of a tuple.
- Removed the following helper functions:
getCollectibleIndex
(usegetPickupIndex
instead)
- Added the following custom callbacks:
POST_USE_PILL_FILTER
(which also passes the pill color)POST_GAME_END_FILTER
- Removed the following custom callbacks:
POST_COLLECTIBLE_INIT_FIRST
(usePOST_PICKUP_INIT_FIRST
instead)
- The
pills
command will now spawn horse pills in addition to normal pills.
February 24th, 2023
- Added the following helper functions:
removeCollectible
getCharacterStartingCollectibles
hasCollectibleInActiveSlot
getScreenBottomY
getScreenRightX
removeCollectibleFromPools
removeTrinketFromPools
isMultiplayer
getRoomDescriptorsForType
levelHasRoomType
inFirstRoom
deleteLastRoomDescription
stableSort
hideRoomOnMinimap
isSecretRoomType
onStage
onStageType
onEffectiveStage
onStageWithSecretExitToDownpour
onStageWithSecretExitToMines
onStageWithSecretExitToMausoleum
onStageWithShovelWorking
onStageWithRandomBossCollectible
setHas
- Renamed the following helper functions:
playerAddCollectible
-->addCollectible
playerHasCollectible
-->hasCollectible
playerHasForm
-->hasForm
getActiveItemSlot
-->getActiveItemSlots
getLastEnumValue
-->getHighestEnumValue
asNpcState
-->asNPCState
- Changed the following helper functions:
getFlyingCollectibles
- The argument is changed frompruneConditionalItems
toincludeConditionalItems
.
- Many logging helper functions now take an optional
name
argument. - Renamed the following enums:
NpcState
-->NPCState
- Added the following constants:
RESOLUTION_FULL_SCREEN
RESOLUTION_1600_900
TIME_GAME_OPENED
MAPPING_COLLECTIBLES
- Added the following custom callbacks:
POST_ENTITY_KILL_FILTER
POST_FAMILIAR_INIT_FILTER
POST_FAMILIAR_UPDATE_FILTER
POST_FAMILIAR_RENDER_FILTER
PRE_FAMILIAR_COLLISION_FILTER
POST_EFFECT_INIT_FILTER
POST_EFFECT_UPDATE_FILTER
POST_EFFECT_RENDER_FILTER
POST_LASER_INIT_FILTER
POST_LASER_UPDATE_FILTER
POST_LASER_RENDER_FILTER
POST_KNIFE_INIT_FILTER
POST_KNIFE_UPDATE_FILTER
POST_KNIFE_RENDER_FILTER
PRE_KNIFE_COLLISION_FILTER
POST_TEAR_INIT_FILTER
POST_TEAR_UPDATE_FILTER
POST_TEAR_RENDER_FILTER
PRE_TEAR_COLLISION_FILTER
POST_PROJECTILE_INIT_FILTER
POST_PROJECTILE_UPDATE_FILTER
POST_PROJECTILE_RENDER_FILTER
PRE_PROJECTILE_COLLISION_FILTER
POST_BOMB_INIT_FILTER
POST_BOMB_UPDATE_FILTER
POST_BOMB_RENDER_FILTER
PRE_BOMB_COLLISION_FILTER
- Changed the following custom callbacks:
POST_GAME_STARTED_REORDERED
andPOST_GAME_STARTED_REORDERED_LAST
now require a third argument ofisContinued: boolean | undefined
. (This is mandatory in order to prevent users from shooting themselves in the foot with respect to logic unexpectedly being executed on continued runs.)POST_NEW_ROOM_EARLY
- ProvidesroomType
as the first argument. Can now filter byRoomType
.POST_NEW_ROOM_REORDERED
- ProvidesroomType
as the first argument. Can now filter byRoomType
.POST_NEW_LEVEL_REORDERED
- Providesstage
as the first argument andstageType
as the second argument. Can now filter byLevelStage
andStageType
.
- Added the following helper types:
Range
NaturalNumbersLessThan
NaturalNumbersEqualToOrLessThan
Tuple
TupleWithMaxLength
Increment
Decrement
- Added the following custom commands:
flies
(to get max blue flies)
- Added the following lint rules for IsaacScript mods:
require-v-registration
- Checks forv
constants that are not registered with the save data manager.
- Disabled the following lint rules for IsaacScript mods:
class-methods-use-this
(since it is idiomatic to havev
outside of the class)
February 17th, 2023
- Functions that return
Vector
,Color
, andKColor
will now return read-only versions. - The "toggleDisplay" helper functions now accept an optional "force" argument.
- Added the following helper functions:
sortObjectArrayByKey
getStageID
getRandomItemPool
setAllDisplayFlags
clearRoomDisplayFlags
- Renamed the following helper functions:
twoDimensionalSort
-->sortTwoDimensionalArray
setDisplayFlags
-->setFloorDisplayFlags
- Added the following method to the
ModUpgraded
class:AddPriorityCallbackCustom
- Works in the same way thatAddPriorityCallback
does.
- Renamed the following types:
ModUpgradedBase
-->ModUpgraded
ModUpgraded
-->ModUpgradedWithFeatures
- Added the following custom callbacks:
POST_KEYBOARD_PRESSED
- The
require-capital-read-only
lint rule will now work with objects. - Added the following lint rules:
@typescript-eslint/no-confusing-void-expression
n/file-extension-in-import
(TypeScript projects only)
February 7th, 2023
package.json
IsaacScript mods now require that "isaacscript-tsconfig" is listed as a dependency in your "package.json" file. In other words, type one of the following commands:
# If you use npm:
npm install --save isaacscript-tsconfig
# If you use Yarn:
yarn add isaacscript-tsconfig
# If you use pnpm:
pnpm add isaacscript-tsconfig
Other
- Added a GitHub action for uploading mods to the Steam Workshop.
isaacscript
has new commands:check
will check your template files (for an IsaacScript mod) to see if they are up to date.init-ts
will bootstrap a TypeScript project.publish-ts
will publish a TypeScript project.check-ts
will check your template files (for an TypeScript project) to see if they are up to date.
- The
cspell-check-unused-words
tool can now be used to check for unused words in your "cspell.jsonc" file. - Removed support for
steamcmd
from thepublish
command. - Added the following helper functions:
isFoundSoul
January 31st, 2023
- The custom stages feature now accepts
music
as an option in thetsconfig.json
file. - Collectible helper functions that take an argument of
CollectibleType
now also accept the collectible itself. - Added the following helper functions:
getMusicForStage
setCollectiblePedestalType
doesAnyEntityExist
newReadonlyVector
newReadonlyColor
newReadonlyKColor
getReversedMap
- Removed the following helper types:
HasAllEnumKeys
(useRecord
instead)
- Added the following helper constructors:
ReadonlyMap
ReadonlySet
- Added the following custom console commands:
music
January 22nd, 2023
- The functions from
ISCFeature.RUN_IN_N_FRAMES
now take an optional parameter to cancel the function if a new room is loaded. - The
log
functions no longer take aself
argument, so they can be used more easily while debugging. - The
log
function now takes an optional parameter to disable the function prefix. - Added the following helper functions:
isSlotMachine
logAndPrint
setSpriteOpacity
setEntityOpacity
isMoveActionPressed
isMoveActionTriggered
isShootActionPressed
isShootActionTriggered
isTSTLClass
initModFeatures
doesVectorHaveLength
getNumRoomsVisited
getMysteriousPaperEffectForFrame
- Removed the following helper functions:
printConsole
(useprint
instead)isUserDefinedTSTLClass
- Added the following enums:
LarryJrSubType
HollowSubType
MonstroSubType
ChubSubType
CarrionQueenSubType
GurdySubType
Monstro2SubType
MomSubType
PinSubType
FrailSubType
FamineSubType
PestilenceSubType
WarSubType
DeathSubType
DukeOfFliesSubType
HuskSubType
PeepSubType
BloatSubType
FistulaSubType
GeminiSubType
GurdyJrSubType
WidowSubType
GurglingSubType
HauntSubType
DingleSubType
MegaMawSubType
GateSubType
MegaFattySubType
CageSubType
PolycephalusSubType
StainSubType
BrownieSubType
ForsakenSubType
LittleHornSubType
RagManSubType
- Renamed the following enums:
DukeVariant
-->DukeOfFliesVariant
- Added
isaacscript-common-ts
, a library that has several helper functions and can be consumed by TypeScript projects. (isaacscript-common
is compiled to Lua, so it cannot be used for this purpose.) - Added the following linting rules:
require-capital-read-only
- Some linting rules have been renamed:
require-const-assertions
-->require-capital-const-assertions
- Some linting rules have been changed:
require-capital-const-assertions
- Now applies to arrays.
January 13th, 2023
- Added the following helper functions:
playerHasForm
directionToMoveAction
directionToShootAction
onStageWithNaturalDevilRoom
- Changed the following helper functions:
getClosestEntityTo
now takes an optionalfilterFunc
argument.
- Added the following constants:
GAME_FRAMES_PER_MINUTE
RENDER_FRAMES_PER_MINUTE
- Added the following custom callbacks:
ENTITY_TAKE_DMG_PLAYER
INPUT_ACTION_FILTER
INPUT_ACTION_PLAYER
POST_PICKUP_INIT_FILTER
POST_PICKUP_UPDATE_FILTER
POST_PICKUP_RENDER_FILTER
POST_PICKUP_SELECTION_FILTER
PRE_ENTITY_SPAWN_FILTER
PRE_ROOM_ENTITY_SPAWN_FILTER
- Added the following lint rules:
import/no-default-export
isaacscript/no-empty-line-comments
isaacscript/no-throw
jsdoc/require-param
(with specific context)
- Changed the following lint rules:
isaacscript/no-implicit-map-set-loops
-->isaacscript/no-explicit-map-set-loops
- The
complete-sentences-jsdoc
andcomplete-sentences-line-comments
lint rules will now catch sentences that end with a double period.
January 6th, 2023
- The
ModFeature
class now has ashouldCallbackMethodsFire
property that you can override if you want to have all of your callback methods run conditionally. spawn
and all of the related helper functions will now accept a grid index in place of a position vector.- Added the following helper functions:
dequeueItem
isActionPressed
isActionTriggered
inRange
December 26th, 2022
- Added the following helper functions:
getEnglishLevelName
December 17th, 2022
- Persistent entities will now no longer respawn when they are removed.
- Added the following custom commands:
secretShop
(to warp to the Secret Shop)
December 8th, 2022
- The IsaacScript framework now includes all of the features from the latest vanilla patches.
- Several card functions have been moved to the
ModdedElementSets
feature, sinceItemConfigCardType
no longer has to be hard-coded. - Added the following helper functions:
isPaused
(part ofPause
)
- Added the following constants:
ITEM_CONFIG_CARD_TYPES_FOR_CARDS
November 15th, 2022
- The
upgradeMod
function now takes an optional parameter containing the custom callbacks that you will be subscribing to in the future (for the purposes of early initializing them). - Added the following helper functions:
pressInput
removeCollectibleFromAllPlayers
- Renamed the following helper functions:
getVanillaTrinketTypes
-->getVanillaTrinketTypeRange
November 6th, 2022
- Added the following helper functions:
getGridEntitiesInRadius
(Thanks NFrost)getGridEntityCollisionPoints
(Thanks NFrost)getConstituentsFromEntityID
getConstituentsFromGridEntityID
spawnEntityID
inRoomType
- Added the following custom callbacks:
POST_NPC_INIT_FILTER
POST_NPC_UPDATE_FILTER
ENTITY_TAKE_DMG_FILTER
(Thanks 4Grabs)PRE_NPC_UPDATE_FILTER
(Thanks 4Grabs)POST_NPC_RENDER_FILTER
(Thanks 4Grabs)POST_NPC_DEATH_FILTER
(Thanks 4Grabs)PRE_NPC_COLLISION_FILTER
(Thanks 4Grabs)
- Added the following types:
EntityID
GridEntityID
October 10th, 2022
isaacscript-common
has been rewritten to only enable the custom features that you are actually using (rather than all of them). The idea here is to keep the library blazing fast and allow it to scale well into the future as more features are added.- Breaking:
- All of the extra feature functions in
isaacscript-common
are now attached to theModUpgraded
object (instead of being normal functions that you import). The idea here is to eliminate run-time errors from non-upgraded mods. See the website for more details.
- All of the extra feature functions in
- Added the following helper functions:
removeUrnRewards
removeEntitiesSpawnedFromGridEntity
spawnRockAltRewardUrn
spawnRockAltRewardMushroom
spawnRockAltRewardSkull
spawnRockAltRewardPolyp
spawnRockAltRewardBucketDownpour
spawnRockAltRewardBucketDross
getPlayerCollectiblesWithTag
getPlayerCollectiblesForTransformation
getEdenActiveCollectibles
getRandomEdenActiveCollectible
spawnCollectibleUnsafe
isPlayerAbleToAim
- Renamed the following helper functions:
hasSirenStolenFamiliar
-->isFamiliarStolenBySiren
getCollectiblesForCacheFlag
-->getCollectibleTypesWithCacheFlag
getTrinketsForCacheFlag
-->getTrinketsWithCacheFlag
getPlayerCollectiblesForCacheFlag
-->getPlayerCollectiblesWithCacheFlag
getPlayerTrinketsForCacheFlag
-->getPlayerTrinketsWithCacheFlag
getCollectibleTypesWithTag
-->getCollectiblesWithTag
getCollectibleTypesForTransformation
-->getCollectiblesForTransformation
getEdenPassives
-->getEdenPassiveCollectibles
getRandomEdenPassive
-->getRandomEdenPassiveCollectible
- Removed the following helper functions:
isIsaacScriptCommonClass
isVanillaTSTLClass
getPlayerNumCollectiblesWithTag
(usegetPlayerCollectiblesWithTag
instead)getPlayerNumCollectiblesForTransformation
(usegetPlayerCollectiblesForTransformation
instead)enableDevFeatures
- Added the following helper types:
AnyClass
HasFunction
TupleToUnion
TupleToIntersection
Writable
September 30th, 2022
- Added the
@Callback
and@CustomCallback
method decorators, which automatically subscribe the decorated method to the corresponding callback. This unlocks a new style of Isaac mods where you do not have to manage adding callbacks directly. In order for this to work properly, your mod features should be represented by classes that extend from theModFeature
class. - Added the following helper functions:
isGreedMode
validateInterfaceMatchesEnum
newObjectWithEnumKeys
getPlayerFromPtr
saveDataManagerRemove
getTSTLClassConstructor
isTableEmpty
logTableKeys
getRandomIndexFromWeightedArray
merge
- The helper functions relating to charge now have an
activeSlot
parameter that defaults toActiveSlot.PRIMARY
. - Added the following helper types:
HasAllEnumKeys
UnionToIntersection
AllButFirst
AllButLast
LowercaseKeys
UppercaseKeys
StartsWithLowercase
StartsWithUppercase
AnyFunction
September 22th, 2022
- The save data manager will now restore any data on a
run
orlevel
object when the Glowing Hourglass is used to what it was when the room was entered. - The custom door feature of the standard library is removed. (It may be reimplemented in the future if needed.)
- Added the following helper functions:
isTearFromPlayer
isTearFromFamiliar
setEntityDamageFlash
hasArmor
defaultMapGetHash
defaultMapSetHash
(just an alias formapSetHash
)mapSetHash
setAdd
isVanillaWallGridIndex
inHomeCloset
getGridIndexesBetween
setConditionalHotkey
unsetConditionalHotkey
preventGridEntityRespawn
getTime
setTracebackFunctionsGlobal
(for easier debugging)getParentFunctionDescription
spawnCollectibleFromPool
getAmbushType
- Renamed the following helper functions:
getPlayerFromTear
-->getPlayerFromEntity
registerHotkey
-->setHotkey
irange
-->iRange
erange
-->eRange
- Changed the following helper functions:
iRange
andeRange
now take an optionalincrement
argument.
- Added the following enums:
LadderSubTypeCustom
- Renamed the following enums:
LadderSubType
-->TallLadderSubType
- Added the following custom commands:
transformation
playerForm
(alias fortransformation
)getCharge
- The
damage
,tears
, andspeed
custom commands now take optional arguments to set the player's stat to the specific amount.
September 13th, 2022
- Added the following helper functions:
getWeightedRandom
(Thanks popjam)hasUnusedDoorSlot
September 4th, 2022
isaac-typescript-definitions
andisaacscript-common
can now be imported by Lua mods. See the documentation.isaacscript init
now has a--dev
flag for setting up a mod that will be testing out a development version ofisaacscript-common
. For more information, see the README.isaacscript.json
now has a schema file.- IsaacScript now provides the
isaac-lua-polyfill
package, which assists in unit testing your mods using e.g. Jest. Thanks to Aleksander Ciesielski for this. - Added the following helper functions:
removeAllNonAlphanumericCharacters
addRoomDisplayFlag
setRoomVisible
canPickEternalHearts
getCollectibleChargeType
- Added the following enums:
CollectibleSpriteLayer
- Added the following constants:
K_COLORS
(a collection of pre-definedKColor
objects)
- Added the following custom callbacks:
PRE_PICKUP_COLLISION
(Thanks popjam)
- Added the following custom commands:
hush
(to warp to the Blue Womb Boss Room)spawnCollectible
(to spawn a collectible by name)spawnTrinket
(to spawn a collectible by name)
August 25th, 2022
- TSTL plugins are now compiled and located inside of the
isaacscript
package. See the newtsconfig.json
template for more information. This means that you no longer need to have to have a "plugins" directory in your mod. You can also remove your dependencies of@types/node
andts-node
in the "package.json" file. - Added the following helper functions:
logCollectibleTypes
onFirstFloor
getTeleporters
removeAllTeleporters
spawnTeleporter
spawnTeleporterWithVariant
inSecretExit
isBlueWombDoor
getBlueWombDoor
getEntityFromPtrHash
logPtrHash
logPtrHashes
isDyingDump
getPlayersWithControllerIndex
getPlayersOnKeyboard
- Added the following enums:
GridEntityFireplaceVariant
- Added the following constants:
TELEPORTER_ACTIVATION_DISTANCE
- Added the following custom commands:
dadsNote
(to warp to the Mausoleum 2 Boss Room with Dad's Note in it)reloadRoom
darkness
(for permanent Curse of Darkness)labyrinth
(for permanent Curse of the Labyrinth)lost
(for permanent Curse of the Lost)unknown
(for permanent Curse of the Unknown)cursed
(for permanent Curse of the Cursed)maze
(for permanent Curse of the Maze)blind
(for permanent Curse of the Blind)giant
(for permanent Curse of the Giant)
- Removed the following custom commands:
eh
(useeternalHearts
instead)bh
(useblackHearts
instead)
August 18th, 2022
- The
Card
enum is now renamed toCardType
in order to be more consistent with theCollectibleType
and theTrinketType
enums. Many helper functions have also changed accordingly, likeisVanillaCard
-->isVanillaCardType
. - Added the following helper functions:
removeAllActiveItems
removeAllPlayerTrinkets
getPartialMatch
isVanillaCardType
isVanillaCollectibleType
isModdedCollectibleType
isVanillaTrinketType
isModdedTrinketType
isVanillaPillEffect
isModdedPillEffect
getTrinketGfxFilename
newCollectibleSprite
newTrinketSprite
getCurseIDByName
removeAllTrapdoors
removeAllCrawlSpaces
spawnTrapdoor
spawnTrapdoorWithVariant
spawnCrawlspace
spawnCrawlspaceWithVariant
- Renamed the following helper functions:
isGoldenTrinket
-->isGoldenTrinketType
- Changed the following helper functions:
getAllBosses
now takes an optionalincludeStoryBosses
parameter.
- Added the following constant-related helper functions:
getFirstModdedCollectibleType
getLastCollectibleType
getNumCollectibleTypes
getNumModdedCollectibleTypes
getFirstModdedTrinketType
getLastTrinketType
getNumTrinketTypes
getNumModdedTrinketTypes
getFirstModdedCardType
getLastCardType
getNumCards
getNumModdedCards
getFirstModdedPillEffect
getLastPillEffect
getNumPillEffects
getNumModdedPillEffects
- The constants relating to the aforementioned helper functions have been deleted, since they must be retrieved at run-time after at least one callback has been fired.
- Added the following custom commands:
getChallenge
August 11th, 2022
- Added the following helper functions:
spawnCustomTrapdoorToVanilla
getAdjacentExistingRoomGridIndexes
getAdjacentNonExistingRoomGridIndexes
wouldDamageTaintedMagdaleneNonTemporaryHeartContainers
removeCharactersBefore
getModdedTrinketArray
getModdedTrinketSet
getTrinketArray
getVanillaTrinketArray
getVanillaTrinketSet
getDoorSlotEnterPosition
disableInputs
canRunUnlockAchievements
- Renamed the following helper functions:
removeAllGridExcept
-->removeAllGridEntitiesExcept
- Changed the following helper functions:
getRoomShapeNeighborGridIndexDeltas
-->getRoomShapeAdjacentGridIndexDeltas
getRoomShapeNeighborGridIndexes
-->getRoomShapeAdjacentGridIndexes
getRoomNeighbors
-->getRoomAdjacentGridIndexes
getRoomShapeNeighborGridIndexDeltas
-->getRoomShapeAdjacentGridIndexDeltas
- Added the following custom callbacks:
POST_SLOT_COLLISION
- Added the following custom commands:
bossNextRoom
(to go to the room next to the boss)
August 4rd, 2022
- IsaacScript now supports custom stages.
- The save data manager now supports serializing/deserializing
BitSet128
objects. - The save data manager will now throw a custom compiler error if you try to register variables that are not serializable.
- Added the following helper functions:
isCollectibleInItemPool
getAdjacentRoomGridIndexes
isDeadEnd
getRoomShapeNeighborGridIndexes
getNewRoomCandidatesBesideRoom
getNewRoomCandidatesForLevel
getNewRoomCandidate
hasCurse
newRoom
setRoomData
getRoomDataForTypeVariant
setBackdrop
reloadRoom
getPlayerStat
asNumber
asString
asCollectibleType
asTrinketType
asCard
asPillColor
asPillEffect
asPlayerType
enableDevFeatures
isCustomGridEntity
getCustomGridEntityType
doorSlotFlagsToDoorSlots
- Renamed the following helper functions:
isRoomInsideMap
-->isRoomInsideGrid
getRoomsInGrid
-->getRoomsInsideGrid
getDoorSlotFlags
-->doorSlotsToDoorSlotFlags
- Changed the following helper functions:
spawnCustomGridEntity
now supports using any vanilla grid entity type and variant as a base.keyboardToString
now requires an argument ofuppercase
.todo
now supports a variadic amount of arguments.
- Added the following constants:
ALL_DISPLAY_FLAGS
- Added the following enums:
StatType
- Added the following interfaces:
StatTypeType
- Added the following types:
Immutable
(used for recursively immutable objects/arrays/maps/sets)PossibleStatType
- Added the following custom callbacks:
POST_PLAYER_CHANGE_STAT
POST_GRID_ENTITY_CUSTOM_INIT
POST_GRID_ENTITY_CUSTOM_REMOVE
POST_GRID_ENTITY_CUSTOM_STATE_CHANGED
- Changed the following custom callbacks:
POST_PLAYER_CHANGE_HEALTH
now passes the old value and the new value (in addition to the difference).
July 27th, 2022
- A new version of TSTL has been released that speeds up compilation by a factor of 2. Make sure to upgrade!
- Added the following helper functions:
getCharacterDamageMultiplier
getOtherPlayers
isEntity
isBomb
isEffect
isFamiliar
isKnife
isLaser
isNPC
isPickup
isPlayer
isProjectile
isTear
isGridEntity
isDoor
isPit
isPoop
isPressurePlate
isRock
isSpikes
isTNT
getRoomHistory
getPreviousRoomDescription
getLatestRoomDescription
getPickupIndex
onAscent
sumMap
sumSet
getRandomVector
getRandomColor
getRandomKColor
smeltTrinkets
serializeIsaacAPIClass
fireProjectilesInCircle
spawnRockAltReward
isDaddyLongLegsChildStompEntity
- Renamed the following helper functions:
spawnCustomGrid
-->spawnCustomGridEntity
removeCustomGrid
-->removeCustomGridEntity
isBomb
-->isBombPickup
isPoop
-->isPoopPickup
logEffects
-->logPlayerEffects
- Changed the following helper functions:
fireProjectiles
now accepts an undefined NPC for the cases where you do not want the projectiles to come from anything in particular.
- Added the following enums:
UrnVariant
MushroomVariant
SkullVariant
PolypVariant
BucketVariant
- Added the following custom callbacks:
POST_PLAYER_INIT_FIRST
(use this for e.g. custom character initialization)POST_GRID_ENTITY_CUSTOM_UPDATE
POST_GRID_ENTITY_CUSTOM_RENDER
POST_GRID_ENTITY_CUSTOM_COLLISION
POST_GRID_ENTITY_CUSTOM_BROKEN
- Removed the following custom callbacks:
POST_PLAYER_INIT_REORDERED
(usePOST_PLAYER_INIT_FIRST
orPOST_GAME_STARTED_REORDERED
instead)
- Changed the following custom callbacks:
POST_FLIP
andPOST_FIRST_FLIP
now pass the old player object in addition to the new one.
- Added the following custom commands:
angelRoom
(alias forangel
)bossRoom
(alias forboss
)devilRoom
(alias fordevil
)errorRoom
(alias forerror
)iAmErrorRoom
(alias foriAmError
)sacrificeRoom
(alias forsacrifice
)secretRoom
(alias forsecret
)superSecretRoom
(alias forsuperSecret
)startRoom
(alias forfool
)startingRoom
(alias forfool
)treasureRoom
(alias fortreasure
)ultraSecretRoom
(alias forultraSecret
)tests
(alias forrunTests
)
- Removed the following custom commands:
h
mh
rh
sh
July 20th, 2022
- The shader crash fix will now be automatically be applied to any upgraded mods. (The method was originally discovered by AgentCucco.)
- Breaking:
- The
removeAllNPCs
function now takes "entityType", "variant", and "subType" parameters, which moves the location of the "cap" parameter.
- The
- Added the following helper functions:
getRoomShapeDoorSlot
getJSONRoomDoorSlotFlags
getGotoCommand
getPlayerFamiliars
movePlayersToCenter
runNextRoom
reorderedCallbacksSetStage
isNarrowRoom
getRoomShapeCorners
pause
unpause
getEntityIDFromConstituents
getGridEntityIDFromConstituents
getScreenTopCenterPos
getScreenBottomCenterPos
getRockAltType
setUnseeded
getBombPickups
removeAllBombPickups
spawnBombPickup
spawnBombPickupWithSeed
removeAllRedHearts
removeGridEntities
removeAllPits
removeAllPoops
removeAllPressurePlates
removeAllRocks
removeAllSpikes
removeAllTNT
spawnDoor
spawnPit
spawnPoop
spawnPressurePlate
spawnRock
spawnSpikes
spawnTNT
logEntities
logEntity
logGridEntities
logGridEntity
restartNextRenderFrame
- Renamed the following helper functions:
removeGrid
-->removeGridEntity
spawnGrid
-->spawnGridEntity
spawnGridWithVariant
-->spawnGridEntityWithVariant
logEntities
-->logAllEntities
logGridEntities
-->logAllGridEntities
- Removed the following helper functions:
getGotoCommandPrefix
(usegetGotoCommand
instead)getDefaultColor
(useColorDefault
)getDefaultKColor
(useKColorDefault
instead)
- Changed the following helper functions:
- All of the
get
grid entity helper functions now take a variant parameter. - The JSON helper functions now use a custom JSON parser, which is 11.8 times faster than the vanilla parser.
- All of the
- Added the following constants:
NEW_RUN_PLAYER_STARTING_POSITION
NEW_FLOOR_STARTING_POSITION_NORMAL_MODE
NEW_FLOOR_STARTING_POSITION_GREED_MODE
ColorDefault
KColorDefault
fonts
(which contains all 7 pre-loaded vanilla fonts)
- Added the following custom console commands:
flight
unseed
gridCosts
runTests
- The
grid
andgrid2
custom console commands have been switched. - The
no-unsafe-plusplus
,prefer-plusplus
, andprefer-postfix-plusplus
ESLint rules have been added to the standard linting configuration.
July 12th, 2022
- Breaking:
addRoomClearCharge
now has an argument ofbigRoomDoubleCharge
(instead of the old argument ofignoreBigRoomDoubleCharge
), so you will need to invert the boolean.arrayRemove
will now only remove the first matching element (instead of every matching element). UsearrayRemoveAll
for that behavior instead.- Renamed
ISAAC_FRAMES_PER_SECOND
-->RENDER_FRAMES_PER_SECOND
- Renamed
getDoorEnterPositionOffset
-->getDoorSlotEnterPositionOffset
- Added the following helper functions:
playerHasHealthLeft
clearFloorDisplayFlags
isRoomShapeDoubleCharge
getRoomShapeCharges
getRoomShapeDoorSlotCoordinates
getGridEntitiesExcept
spawnCustomGrid
removeCustomGrid
addCharge
arrayRemoveAll
arrayRemoveAllInPlace
- Changed the following helper functions:
- All of the
spawn
helper functions now have the option to pass an RNG object instead of a seed. addRoomClearCharge
andaddRoomClearChargeToSlot
now take an optional argument ofplaySoundEffect
.registerHotkey
now will accept a function that returns aKeyboard
in addition to aKeyboard
.
- All of the
- Added the following custom callbacks:
POST_COLLECTIBLE_EMPTY
July 5th, 2022
- Breaking changes:
- The values of
ChallengeRoomSubType.NORMAL
andChallengeRoomSubType.BOSS
changed, since they were bugged.
- The values of
- Added the following helper functions:
validateEnumContiguous
getMatchingGridEntities
getTrapdoors
getCrawlSpaces
getRoomClearGameFrame
getRoomClearRoomFrame
anyPlayerUsingPony
getStageHistory
hasVisitedStage
calculateStageType
calculateStageTypeRepentance
getRoomsInGrid
getRoomDisplayFlags
setRoomDisplayFlags
getFloorDisplayFlags
setFloorDisplayFlags
setDisplayFlags
setStage
isVanillaConsoleCommand
registerHotkey
unregisterHotkey
getGotoCommandPrefix
convertBinaryToDecimal
convertDecimalToBinary
doorSlotToDoorSlotFlag
swapArrayElements
arrayToBitFlags
setToBitFlags
getDoorSlotFlags
getArrayCombinations
getSetCombinations
swapArrayElements
arrayToBitFlags
setToBitFlags
setIntervalGameFrames
setIntervalRenderFrames
- Renamed the following helper functions:
isPonyActive
-->isPlayerUsingPony
inCrawlspace
-->inCrawlSpace
pickingUpItemIsNull
-->isPickingUpItemNull
pickingUpItemIsCollectible
-->isPickingUpItemCollectible
pickingUpItemIsTrinket
-->isPickingUpItemTrinket
- Added the following custom commands:
mana
- Removed the following helper functions:
getCollectibleTypeRange
(usegetCollectibleArray
instead)
June 28th, 2022
- The change log is now located on the official website.
- IsaacScript now requires a dependency of "@types/node", "typescript", and "ts-node" in your "package.json" file. (This is so that TSTL can properly use plugins.) If any dependencies are missing when you run the tool, it will helpfully tell you the appropriate command to run to fix the problem.
- The IsaacScript watcher icon now turns green when the mod is compiling.
- Breaking changes:
- Any callback definition with
void
inside of a union has been renamed toundefined
in order to have more consistent code and satisfy the TypeScript ESLint rules. This means that you may need to addreturn undefined;
to some of your callback functions is order to satisfy the compiler. (Doing so explicitly acknowledges that this is the type of callback that expects a return value.) - The
removeAllGridExcept
andremoveAllMatchingGridEntities
functions now return an array of the grid entities that are removed. - The
consistent-return
ESLint rule has been turned off in favor of thenoImplicitReturns
compiler flag. (The latter is type-aware, which results in a more comprehensive check.) - The
default-case
ESLint rule has been turned off in favor of theswitch-exhaustiveness-check
ESLint rule. Subsequently, theensureAllCases
helper function has been removed, since it is no longer needed. You can clean up all of the boilerplate default cases from your switches, as TypeScript + ESLint will now automatically be able to derive if you did not handle a switch case. - The
strict
configure from@typescript-eslint
has been enabled.
- Any callback definition with
- Added the following helper functions:
getBombRadiusFromDamage
getPlayerFromTear
isDamageFromPlayer
playerConvertBlackHeartsToSoulHearts
playerConvertSoulHeartsToBlackHearts
doesEntityExist
spawnPersistentEntity
(for creating pickup-like entities)removePersistentEntity
(for removing entities spawned withspawnPersistentEntity
)getPHDPillEffect
getFalsePHDPillEffect
doesPlayerHaveAllSoulHearts
doesPlayerHaveAllBlackHearts
getEntityFields
logTableDifferences
isCloseEnoughToTriggerDiceFloor
setCollectibleGlitched
startAmbush
isTable
isUserdata
isBoolean
isNumber
isString
isFunction
newPlayerHealth
getCollectibleArray
getVanillaCollectibleArray
getModdedCollectibleArray
- Renamed the following helper functions:
getCurrentRoomDescriptorReadOnly
-->getRoomDescriptorReadOnly
getCurrentDimension
-->getDimension
iterateTableDeterministically
-->iterateTableInOrder
- Removed the following helper functions:
ensureAllCases
- This is no longer needed with the new linting rules. See the above explanation.
- Added the following constants:
NUM_PILLS_IN_POOL
MIN_PLAYER_SPEED_STAT
MIN_PLAYER_SHOT_SPEED_STAT
- Added the following enums:
DiceFloorSubType
- Added the following custom callbacks:
POST_PICKUP_INIT_FIRST
POST_PLAYER_COLLECTIBLE_ADDED
POST_PLAYER_COLLECTIBLE_REMOVED
POST_AMBUSH_STARTED
POST_AMBUSH_FINISHED
POST_BOMB_EXPLODED
- The inventory feature now uses the
POST_PLAYER_COLLECTIBLE_ADDED
callback, so it will now properly account for items given via the console and via code. - The inventory feature now uses the
POST_PLAYER_COLLECTIBLE_REMOVED
callback, so it will now properly account for items that are removed.
June 21st, 2022
- Breaking changes:
DefaultMap
now takes the default value/function as the first argument and the initializer array as the second argument.- The
removeEntities
andremoveAllX
functions now return an array of the entities that are removed.
- Added the following helper functions:
isPrimitive
getTSTLClassName
isTSTLMap
isTSTLSet
isDefaultMap
twoDimensionalSort
iterateTableDeterministically
getOppositeDoorSlot
angleToDirection
- Renamed the following helper functions:
getIsaacAPIClassType
-->getIsaacAPIClassName
- Added the following lint rules:
no-invalid-default-map
isaacscript init
no longer creates abundleEntry.ts
file. If you use thenoImplicitGlobalVariables
compiler flag, then this is unnecessary. For more information, see the newtsconfig.json
template file.
June 4th, 2022
- IsaacScript now supports pnpm. (Thanks KatTheFox)
Color.Default
is now deprecated and will cause compiler errors. Use theColorDefault
constant from the standard library instead, which is guaranteed to be safe. (Alternatively, you can create your own constant that is local to your mod.)
May 28th, 2022
package.json
IsaacScript mods now require that "typescript-to-lua" is listed as a dependency in your "package.json" file. In other words, type one of the following commands:
# If you use npm:
npm install --save typescript-to-lua
# If you use Yarn:
yarn add typescript-to-lua
# If you use pnpm:
pnpm add typescript-to-lua
Other
- All of the IsaacScript packages are now contained in a monorepo. The other various repositories have been deleted.
- The linting meta-package now uses
eslint-plugin-isaacscript
, which contains a bunch of new rules that will make your code safer. - IsaacScript now supports the Yarn package manager. It will use Yarn by default if it detects that you have it installed.
- IsaacScript now shows how many seconds it took to compile the mod.
- Added the following helper functions:
saveDataManagerReset
(to force the save data manager to reset a specific set of variables)isHiddenCollectible
getEdenPassives
getRandomEdenPassive
mapHasPlayer
- Renamed the following helper functions:
preventCollectibleRotate
-->preventCollectibleRotation
- Added the following custom console commands:
gridEntities
- Spawns every kind of grid entity. Useful for debugging.
- Added the following enums:
PitState
- Fixed the Encyclopedia definitions. (Thanks 4Grabs)
May 21st, 2022
- All functions that take a specific kind of type (e.g.
EntityType
,PlayerVariant
, etc.) are now no longer in a union withint
. This makes the API much more type-safe than before. The flip side of this is that you must change any self-defined enums likeCollectibleTypeCustom
to an object instead. See the docs for more details. Vector.Zero
andVector.One
are now deprecated and will cause compiler errors. Use theVectorZero
andVectorOne
constants from the standard library instead, which are guaranteed to be safe. (Alternatively, you can create your own constants that are local to your mod.)DefaultMap
no longer passes the key to the factory function. This means you can clean up the unused_key
argument in all of your default maps. In the rare case that you are actually using the key in the factory, you can pass it explicitly as a normal argument.- Added the following helper functions:
fillLevelWithRedRooms
getAllDimensions
getAllCards
getModdedCards
getVanillaCards
getAllPillEffects
getModdedPillEffects
getVanillaPillEffects
getAllPillColors
getNormalPillColors
getHorsePillColors
getCollectibleTypeRange
getVanillaCollectibleTypeRange
getModdedCollectibleTypes
getTrinketTypes
getVanillaTrinketTypes
getModdedTrinketTypes
getDoorEnterPosition
getDoorEnterPositionOffset
getNormalPillColorFromHorse
getPits
getPlayersWithTrinket
getPoops
getPressurePlates
getRandomEnumValue
getRocks
getRoomNeighbors
getRoomShapeNeighborGridIndexDeltas
getSpikes
getTNT
inMineShaft
isHeart
isCoin
isKey
isBomb
isPoop
isSack
isPill
isBattery
isCollectible
isCardPickup
isTrinket
isValidCollectibleType
pickingUpItemIsCollectible
pickingUpItemIsTrinket
roomGridIndexToXY
- Added a
Zero
constant for every flag enum. (e.g.EntityFlagZero
,TearFlagZero
, and so on.) - The "max" constants are changed, with many new ones added:
- Collectibles:
FIRST_COLLECTIBLE_TYPE
LAST_COLLECTIBLE_TYPE
LAST_VANILLA_COLLECTIBLE_TYPE
FIRST_MODDED_COLLECTIBLE_TYPE
NUM_VANILLA_COLLECTIBLE_TYPES
NUM_MODDED_COLLECTIBLE_TYPES
NUM_COLLECTIBLE_TYPES
- Trinkets:
NUM_TRINKET_TYPES
NUM_VANILLA_TRINKET_TYPES
NUM_MODDED_TRINKET_TYPES
FIRST_TRINKET_TYPE
LAST_TRINKET_TYPE
LAST_VANILLA_TRINKET_TYPE
FIRST_MODDED_TRINKET_TYPE
- Cards:
NUM_CARDS
NUM_VANILLA_CARDS
NUM_MODDED_CARDS
FIRST_CARD
LAST_CARD
LAST_VANILLA_CARD
FIRST_MODDED_CARD
- Pill effects:
NUM_PILL_EFFECTS
NUM_VANILLA_PILL_EFFECTS
NUM_MODDED_PILL_EFFECTS
FIRST_PILL_EFFECT
LAST_PILL_EFFECT
LAST_VANILLA_PILL_EFFECT
FIRST_MODDED_PILL_EFFECT
- Pill colors:
FIRST_PILL_COLOR
LAST_NORMAL_PILL_COLOR
FIRST_HORSE_PILL_COLOR
LAST_HORSE_PILL_COLOR
NUM_NORMAL_PILL_COLORS
- Players:
FIRST_CHARACTER
LAST_VANILLA_CHARACTER
FIRST_MODDED_CHARACTER
- Other:
FIRST_STAGE
LAST_STAGE
FIRST_ROOM_TYPE
LAST_ROOM_TYPE
- Collectibles:
- Added the appropriate
HORSE_
enum values to thePillColor
enum. - Added the following custom callbacks:
POST_GRID_ENTITY_RENDER
POST_DOOR_RENDER
POST_DOOR_UPDATE
POST_PIT_RENDER
POST_PIT_UPDATE
POST_POOP_RENDER
POST_POOP_UPDATE
POST_PRESSURE_PLATE_RENDER
POST_PRESSURE_PLATE_UPDATE
POST_ROCK_RENDER
POST_ROCK_UPDATE
POST_SPIKES_RENDER
POST_SPIKES_UPDATE
POST_TNT_RENDER
POST_TNT_UPDATE
- You can now register several player-based custom callbacks using
PlayerVariant
andPlayerType
as optional 2nd and 3rd arguments, respectively (e.g.PRE_BERSERK_DEATH
). - You can now register all custom grid entity callbacks using an optional 3rd argument of grid entity variant.
- Added the following custom console commands:
map
- Reveals the entire map, including Ultra Secret Rooms.doorDisplay
- Show debugging information next to every door.pitDisplay
- Show debugging information next to every pit.poopDisplay
- Show debugging information next to every poop.pressurePlateDisplay
- Show debugging information next to every pressure plate.rockDisplay
- Show debugging information next to every rock.spikesDisplay
- Show debugging information next to every spikes.tntDisplay
- Show debugging information next to every TNT.
May 14th, 2022
IsaacScript has now reached version 2! We've come a long way with many features, and there's more yet to come. Version 2 comes with breaking changes, but as always, upgrading your mod is optional.
Breaking Changes
- All enums are now local instead of global. The global declarations have been removed, which forces you to use the local ones. Doing this has several advantages, at the small cost of having to auto-import more things. See the docs for more info.
- Bit flags are now represented as a
BitFlags
type. This means that the Isaac API now has real type safety for all bit flags! See the docs for more info. - Renamed the following helper functions:
range
-->irange
- Renamed the following enums:
PillEffectClass
-->ItemConfigPillEffectClass
PillEffectType
-->ItemConfigPillEffectType
- Removed the following enums:
CardType
(since it was almost the same thing asItemConfigCardType
)
- When registering the
POST_PEFFECT_UPDATE_REORDERED
callback, the second argument is now aPlayerVariant
instead of aPlayerType
. It now takes aPlayerType
as a third argument.
Non-Breaking Changes
isaac-typescript-definitions
now ships with an official Isaac word dictionary that can be imported into CSpell. See the new template for more information.- Added the following helper constants since the corollary enum values were purged:
NUM_CARDS
/MAX_CARD
/NUM_VANILLA_CARDS
/MAX_VANILLA_CARD
NUM_COLLECTIBLE_TYPES
/MAX_COLLECTIBLE_TYPE
/NUM_VANILLA_COLLECTIBLE_TYPES
/MAX_VANILLA_COLLECTIBLE_TYPE
NUM_PILL_EFFECTS
/MAX_PILL_EFFECT
/NUM_VANILLA_PILL_EFFECTS
/MAX_VANILLA_PILL_EFFECT
NUM_TRINKET_TYPES
/MAX_TRINKET_TYPE
/NUM_VANILLA_TRINKET_TYPES
/MAX_VANILLA_TRINKET_TYPE
- Added the following helper functions:
doorSlotFlagToDoorSlot
erange
(for exclusive ranges)getArrayIndexes
getEnumEntries
getGridEntityID
getRoomTypeName
isModdedPlayer
isVanillaPlayer
logLevelStateFlags
removeAllCharacters
removeSubstring
- Added the following enums:
DoorSlotFlag
- Added the following custom callbacks:
POST_GREED_MODE_WAVE
POST_HOLY_MANTLE_REMOVED
April 28th, 2022
- Added many new custom console commands, including
playerDisplay
,npcDisplay
, and so on for rendering custom text on top of an entity for debugging purposes. See theisaacscript-common
documentation for the full list. - Added the following helper functions:
defaultMapSetPlayer
todo
printEnabled
- Renamed the following helper functions:
getPlayerNumTransformationCollectibles
-->getPlayerNumCollectiblesForTransformation
- Added custom callbacks:
POST_FAMILIAR_STATE_CHANGED
POST_PICKUP_STATE_CHANGED
POST_EFFECT_STATE_CHANGED
POST_NPC_STATE_CHANGED
POST_ITEM_DISCHARGE
April 21st, 2022
- Added the following helper functions:
getBossSet
(for getting the set of vanilla bosses)getCombinedBossSet
(for getting the set of vanilla bosses)getAllBossesSet
spawnBoss
spawnBossWithSeed
getUnusedDoorSlots
getRoomsOfDimension
registerCharacterHealthConversion
(for making custom characters like Blue Baby or Tainted Judas)getCollectibleTags
getPlayerCollectibleCount
getCollectibleTypesWithTag
getPlayerNumCollectiblesWithTag
ItemConfigTag
is no longer a constant enum and must be imported. You can now iterate over this enum in your code.
April 14th, 2022
- Added the following helper functions:
playerHasCollectible
playerAddCollectible
arrayRemoveIndex
arrayRemoveIndexInPlace
April 2nd, 2022
- Added the
--yes
flag toisaacscript init
. - Added the following helper functions:
vectorToString
spawn
spawnWithSeed
getCoinValue
- Added the helper functions of
spawnPickup
,spawnPickupWithSeed
, and so on for every specific type of entity. - Added the helper functions of
removeAllPickups
, and so on for every specific type of entity. - Added every easing function from easings.net.
- Added the
VectorZero
andVectorOne
constants. (These are safer to use than the vanillaVector.Zero
andVector.One
constants.)
March 26th, 2022
- Added the changes for vanilla patch 1.7.8a. Several values missing from the vanilla enums are added a well.
- The API's
Random
function should never be used directly. Use thegetRandomSeed
helper function instead to prevent crashes. - If you have
gh
installed (i.e. the GitHub CLI), IsaacScript will now prompt you to automatically create a new GitHub repository when initializing a new mod. - The IsaacScript save data manager will now automatically serialize the
RNG
class. Thus, you can now useRNG
objects instead of seeds in your data structures. This is more convenient than using seeds because thegetRandom
series of functions will automatically "next" the seed. Also, it is slightly safer because you avoid initializing a seed to 0. - The IsaacScript save data manager will now automatically serialize the
Color
class and theKColor
class. - Added the following helper functions:
enableFastReset
(useful for debugging)disableFastReset
(useful for debugging)removeFadeIn
(useful for debugging)restoreFadeIn
(useful for debugging)getDefaultPlayerStat
registerCharacterStats
(for the new character stats management feature)getEnumKeys
getActiveItemSlot
isFirstSlotPocketActiveItem
getPlayerHearts
getRedHearts
isRedHeart
getCoins
getKeys
characterStartsWithActiveItem
getDirectionName
validateCustomEnum
addStat
logError
getRandomSeed
isUserdataObject
isRNG
copyRNG
isColor
getDoorSlotsForRoomShape
isDoorSlotInRoomShape
getRoomAllowedDoors
copyValuesToTable
getNumbersFromTable
getStringsFromTable
getBooleansFromTable
setSeed
setAllRNGToSeed
setAllRNGToStartSeed
isSin
getGridIndexDelta
logUserdata
isCharacter
texelEquals
spriteEquals
collectibleSpriteEquals
copySerializableIsaacAPIClass
isSerializedIsaacAPIClass
colorEquals
kColorEquals
rngEquals
vectorEquals
roomExists
getRoomShape
isDoorSlotValidAtGridIndex
isDoorSlotValidAtGridIndexForRedRoom
directionToDegrees
getRoomShapeBottomRightPosition
getRoomShapeTopLeftPosition
getRoomShapeBounds
getRoomShapeLayoutSize
getRoomShapeVolume
newChargeBarSprites
renderChargeBar
isLRoom
gridIndexToGridPosition
isValidGridPosition
getRoomShapeWidth
benchmark
- Renamed the following helper functions:
getLastHeart
-->getPlayerLastHeart
getSoulHearts
-->getPlayerSoulHearts
getBlackHearts
-->getPlayerBlackHearts
initRNG
-->newRNG
gridToPos
-->gridCoordinatesToWorldPosition
- Added the
getRandomFromSeed
series of functions. You can use these if you don't want to convert your data structures to useRNG
objects. - Deleted the
getRandomFromRNG
series of functions. ThegetRandom
series of functions now takeRNG
objects. - Added the following constants:
TAINTED_SAMSON_BERSERK_CHARGE_FROM_TAKING_DAMAGE
MAX_TAINTED_SAMSON_BERSERK_CHARGE
LEVEL_GRID_ROW_LENGTH
LEVEL_GRID_COLUMN_HEIGHT
- Added the following enums:
BloodExplosionSubType
CurseRoomSubType
- Added
PICKUP_MISSING_SHOVEL
to thePickupVariant
enum. (It is missing in the vanilla enum.) - Added the following custom callbacks:
POST_COLLECTIBLE_INIT_FIRST
March 19th, 2022
- The standard library now comes with many helpful console commands. Activate them by calling
enableExtraConsoleCommands
. You can also useaddConsoleCommand
to add your own commands andremoveConsoleCommand
to remove ones that overlap with your own commands. See the documentation for the specific list of commands. - Added the following helper functions:
getMapPartialMatch
restart
logSounds
logEntities
logGridEntities
addPlayerHealthType
getPlayerHealthType
getCharacterName
getPlayerInventory
(to get a list of all of the player's collectibles)addCollectible
isActiveSlotDoubleCharged
isActiveSlotEmpty
doorSlotToDirection
initCustomDoor
spawnCustomDoor
getTaintedLazarusSubPlayer
setTrinketSprite
capitalizeFirstLetter
isActiveCollectible
getCollectibleIndex
- Added the following constants:
CARD_MAP
CHARACTER_MAP
PILL_EFFECT_MAP
MAX_SPEED_STAT
ROOM_TYPE_MAP
ROOM_TYPE_NAME_MAP
CHARACTER_NAME_MAP
DIRECTION_NAMES
- Added the following custom callbacks:
POST_SLOT_ANIMATION_CHANGED
POST_CUSTOM_DOOR_ENTER
ROOM_CLEAR_CHANGED
March 12th, 2022
- Added
game
,itemConfig
,musicManager
, andsfxManager
cached classes to the standard library. You can use these instead of invoking the constructor yourself for a miniscule performance increase. - Added the following helper functions:
isEden
logPlayerHealth
enableAllSound
disableAllSound
getTaintedMagdaleneNonTemporaryMaxHearts
defaultMapGetPlayer
(to make it easier to work with maps that usePlayerIndex
as an index)mapGetPlayer
(to make it easier to work with maps that usePlayerIndex
as an index)mapSetPlayer
(to make it easier to work with maps that usePlayerIndex
as an index)setAddPlayer
(to make it easier to work with sets that usePlayerIndex
as an index)setDeletePlayer
(to make it easier to work with sets that usePlayerIndex
as an index)setHasPlayer
(to make it easier to work with sets that usePlayerIndex
as an index)mapGetNextSeed
(to make it easier to work with maps that haveSeed
values)defaultMapGetNextSeed
(to make it easier to work with maps that haveSeed
values)canPlayerCrushRocks
- Removed
TRINKET_GOLDEN_FLAG
andTRINKET_ID_MASK
from theTrinketType
enum. They are now exposed as constants. - Removed
PILL_GIANT_FLAG
andPILL_COLOR_MASK
from thePillColor
enum. These are now exposed as constants. - Added
USE_ECHO_CHAMBER
to theUseFlag
enum. (This is missing in the vanilla enum.)
March 5th, 2022
- Added the following helper functions:
willReviveFromHeartbreak
isPonyActive
inSecretShop
logRoom
countSetBits
getSoulHearts
(this is different from the vanilla function)getBlackHearts
(this is different from the vanilla function)getHearts
inMegaSatanRoom
countEntities
getSortedSetValues
getRandomSetElement
getCardType
getMaxCards
getMaxPillEffects
isCardType
isTarotCard
isSuitCard
isSpecialCard
isTarotReverseCard
isModdedCard
getRandomCardType
getEntityID
clearCollectibleSprite
getCollectiblePedestalType
- Renamed the following helper functions:
combineArray
-->combineArrays
- Removed the following helper functions:
getRandomHeartSubType
- Added the following constants:
CARD_TYPE_MAP
- Added the following enums:
ShopSubType
TreasureRoomSubType
ChallengeRoomSubType
LibrarySubType
DungeonSubType
IsaacsRoomSubType
SecretExitSubType
DownpourRoomSubType
MinesRoomSubType
CollectiblePedestalType
- Renamed the following enums:
BackwardsPathRoomSubType
-->BackwardsRoomSubType
- The signature for the
POST_PURCHASE
custom callback has changed to the following:
function postPurchase(player: EntityPlayer, pickup: EntityPickup): void {}
February 26th, 2022
- The
Isaac.GetPlayer
method will no longer return undefined. (You can now delete any undefined-related checks.) - Added the
EntitySubPlayer
class to prevent bugs withRNG
. (EntityPlayer.GetSubPlayer
is defined as returning this.) - Added the
DefaultMap
class. Use this instead of aMap
if you need a data structure that will automatically instantiate default values. See the documentation for more information. - Added the following helper functions:
checkFamiliar
checkFamiliarFromCollectibles
isShootAction
isMoveAction
removeDoor
removeDoors
removeAllDoors
getDoorsToRoomIndex
repeat
getEffectsList
isGridEntityBreakableByExplosion
isGridEntityBroken
getAllPlayers
getGridEntitiesMap
removeAllSlots
- Renamed the following helper functions:
tableClear
-->clearTable
- Various array functions to be more consistent with map/set functions.
- The disable inputs feature now supports multiple mod features at once. The functions now require a key that matches the name of the calling mod feature.
- The
getPlayerIndex
function now takes adifferentiateForgottenAndSoul
argument, which is false by default. - Added the following constants:
NUM_DIMENSIONS
CHEST_PICKUP_VARIANTS
- Added the following enums:
LostSoulState
PoopState
SpiderWebState
SpikesOnOffState
LockState
TNTState
PoopState
StairsState
- Added the following custom callbacks:
POST_BONE_SWING
POST_GRID_ENTITY_CHANGE_STATE
POST_GRID_ENTITY_BROKEN
- The signature of the
POST_PLAYER_CHANGE_TYPE
custom callback has changed to:
function postPlayerChangeType(
player: EntityPlayer,
oldCharacter: PlayerType | int,
newCharacter: PlayerType | int,
) {}
February 19th, 2022
isaacscript
now requires a Git version of at least 2.30.isaacscript
now supports a--verbose
flag for additional output.- Added the following helper functions:
setCollectiblesRerolledForItemTracker
(Thanks Gamonymous)getRandomArrayElementAndRemove
range
saveDataManagerLoad
isTainted
trimPrefix
getPlayerName
stringContains
isVanillaCharacter
isModdedCharacter
getPillEffectClass
getPillEffectType
collectibleHasCacheFlag
getCollectiblesForCacheFlag
getPlayerCollectiblesForCacheFlag
isCircleIntersectingRectangle
inRectangle
getCollidingEntitiesWithGridEntity
deleteSetsFromSet
getFlyingCollectibles
isTransformationFlying
hasFlyingTransformation
trinketHasCacheFlag
getTrinketsForCacheFlag
getFlyingTrinkets
getPlayerTrinketsForCacheFlag
isFlyingCharacter
runNextRenderFrame
runInNRenderFrames
stopAllSoundEffects
- Renamed the following helper functions:
runNextFrame
-->runNextGameFrame
runInNFrames
-->runInNGameFrames
- Refactored transformation related helper functions to be more private, to be lazy initialized, and to use sets instead of arrays.
- Added the following constants:
SECOND_IN_MILLISECONDS
MINUTE_IN_MILLISECONDS
PILL_EFFECT_CLASS_MAP
PILL_EFFECT_TYPE_MAP
DEFAULT_PILL_EFFECT_CLASS
DEFAULT_PILL_EFFECT_TYPE
- Added the following enums:
PillEffectType
PillEffectClass
MotherSubType
PickupNullSubType
- Added the following custom callbacks:
POST_GRID_ENTITY_COLLISION
February 12th, 2022
- TSTL has been upgraded such that the lualib does not create any global variables.
- Added the following helper functions:
getCollectibleQuality
getCharacters
combineSets
getDefaultGlobals
getNewGlobals
logNewGlobals
addSetsToSet
useActiveItemTemp
- Renamed the following helper functions:
getPlayerNumAllHearts
-->getPlayerNumHitsRemaining
February 5th, 2022
- Added the
canTakeFreeDevilDeals
helper function. - Added the
CHARACTERS_WITH_FREE_DEVIL_DEALS
constant. - Added the
BloodClotSubType
enum. (Thanks KatTheFox)
January 29th, 2022
- Added the
STORY_BOSSES
constant. - Added the
isStoryBoss
helper function.
January 22nd, 2022
- Added the
isRepentanceStage
helper function.
January 14th, 2022
- Added the following helper functions:
isDamageToPlayerFatal
getHeartRowLength
- Added the following custom callbacks:
PRE_BERSERK_DEATH
January 7th, 2022
- Added the
MAX_VANILLA_CHARACTER
constant.
December 31st, 2021
- Updated the
TrapdoorVariant
enum. - Added the
spawnVoidPortal
helper function.
December 26th, 2021
- Updated TSTL to version 1.3.0.
- The
Level.ChangeRoom
method will now throw a compiler error, since it does not update thefxlayers
correctly. (Game.ChangeRoom
should be used instead.) - Added the following helper functions:
openDoorFast
closeDoorFast
- The
changeRoom
andteleport
helper functions now check to see if the room exists first to prevent crashes. - Added the following enums:
BrokenWatchState
December 19th, 2021
- New projects created with
isaacscript init
will now automatically include XML linting in thelint.sh
script + CI. (This linter found bugs in the production versions of Babies Mod & Forgotten Fables, so it seems useful.) - New projects created with
isaacscript init
will now automatically includepull.rebase=true
in the ".gitattributes" file. (This prevents merge commits by default.) isaacscript publish
will now use the Nicalis mod uploader tool when it detects thatsteamcmd
is not available. (Previously, it would error and do nothing.)- Added the following helper functions:
logAllSeedEffects
logTemporaryEffects
getFilteredEntities
(Thanks KatTheFox)fireProjectiles
(Thanks KatTheFox)rerollEnemy
(Thanks KatTheFox)characterGetsBlackHeartFromEternalHeart
- Added the following constants:
CHARACTERS_WITH_BLACK_HEART_FROM_ETERNAL_HEART
- Added the
AnyEntity
type, which is the composition ofEntity,
EntityBomb
,EntityPickup
, and so on.
December 12th, 2021
Prettier
eslint-plugin-prettier
is no longer used in favor of using Prettier directly. Doing this has pros and cons, but has more pros than cons.
As a result of the change, you will no longer see linting errors in VSCode for formatting-related issues. (Of course, all of the formatting-related issues will still be fixed automatically upon saving the file, same as it was before.)
If you decide to upgrade isaacscript-lint
in your existing projects, you should also perform the following steps to keep Prettier working:
-
Install the Prettier VSCode extension.
-
Add the Prettier VSCode extension to
extensions.json
:
"esbenp.prettier-vscode", // The TypeScript formatter
- Add the following lines to the
"[javascript]"
and"[typescript]"
sections of thesettings.json
file:
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
- Add the following to the
lint.sh
file:
# Use Prettier to check formatting
npx prettier --log-level=warn --check .
Other
- The
isaacscript
tool now uses a different prompt library, which fixes the bug where prompts would be repeated in a Git Bash shell. - The
isaacscript
tool will now automatically initialize a Git repository for new projects. Having the GitHub CLI installed is recommended, since it helps the tool guess what your GitHub username is. - Rewrote & simplified the "Getting Started" page.
- Added the following helper functions:
temporarilyRemoveTrinket
(which removes all trinkets)smeltTrinket
getTransformationName
getCurrentRoomDescReadOnly
isRedKeyRoom
arrayCombine
arrayCopy
getChallengeName
- Renamed the following helper functions:
temporarilyRemoveTrinkets
-->temporarilyRemoveTrinket
(because it only removes a single trinket)
- The
getEntities
and related helper functions now return a boolean, indicating if they removed one or more entities. - The
clearSprite
helper function now clears all layers by default. - The
getDoors
helper function is now variadic. - Added the following constants:
TRANSFORMATION_NAME_MAP
CHALLENGE_NAME_MAP
- Added the following custom callbacks:
POST_TRINKET_BREAK
POST_PEFFECT_UPDATE_REORDERED
December 5th, 2021
- Updated the TypeScript definitions for vanilla patch 1.7.7.
- Fixed the bug where the monkey patch was not working on TSTL v1.2.0.
- The
upgradeMod
function will now monkey-patch theerror
function to provide tracebacks if the--luadebug
flag is turned on. - The
upgradeMod
function will now monkey-patch theprint
function to work like it normally does if the--luadebug
flag is turned on. - Added the following helper functions:
isSingleUseCollectible
setCollectibleEmpty
clearSprite
getRoomListIndex
getTopLeftWall
getTopLeftWallGridIndex
isRoomInsideMap
lockDoor
inMinibossRoomOf
getAllRoomGridIndexes
isAllRoomsClear
isLuaDebugEnabled
goToStage
stageTypeToLetter
getRooms
copyMap
getStartSeedString
getStage
getStageType
getPlayerAvailableHeartSlots
getCharacterMaxHeartContainers
getPlayerMaxHeartContainers
isFamiliarThatShootsPlayerTears
isEntityMoving
- Renamed the
getRoomIndex
helper function togetRoomSafeGridIndex
. This should no longer be used as an index for data structures that store data per room because it does not work properly between dimensions;getRoomListIndex
should be used instead. - Added optional
variant
,subType
, andcap
arguments to all of the remove entity helper functions. - The
pngPath
to thesetCollectibleSprite
helper function is now optional; if not specified, it will remove the item graphic from the pedestal. - The
anyPlayerIs
helper function is now variadic. - Added the following constants:
COLORS
FINAL_STAGE
BLIND_ITEM_PNG_PATH
EMPTY_PNG_PATH
FAMILIARS_THAT_SHOOT_PLAYER_TEARS
- Added the following enums:
MinibossID
SkinColor
(from vanilla patch 1.7.7)CrawlspaceVariant
(alias forStairsVariant
)
- Added the following custom callbacks:
POST_NEW_ROOM_EARLY
PRE_NEW_LEVEL
POST_TEAR_INIT_VERY_LATE
- The save data manager now uses the
POST_NEW_ROOM_EARLY
callback instead of thePOST_NEW_ROOM
callback, which means that you can use it in situations where you previously would not be able to.
November 28th, 2021
isaacscript publish
now accepts a--dry-run
flag that will skip committing to GitHub and invokingsteamcmd
.isaacscript publish
will now print out the standard output of the pre-publish script and the post-publish script, if any.isaacscript publish
now accepts an--only-upload
flag that will only upload the mod to the Steam Workshop without doing anything else.- Added the following helper functions:
isGoldenTrinket
printConsole
findFreePosition
isPassiveCollectible
isTaintedLazarus
logVector
getRoomItemPoolType
inBossRoomOf
getCollectibleItemPoolType
closeAllDoors
spawnCollectible
setGridEntityInvisible
preventCollectibleRotate
removeCollectiblePickupDelay
isDevilsCrownTreasureRoom
getCollectibleDescription
getTrinketDescription
getCardDescription
getEntityPositions
setEntityPositions
getEntityVelocities
setEntityVelocities
roomUpdateSafe
setActiveItem
getFirstCardOrPill
getCollectibleGfxFilename
characterCanHaveRedHearts
characterCanHaveSoulHearts
- Added the following helper functions related to the new JSON rooms feature:
deployJSONRoom
deployRandomJSONRoom
emptyRoom
setRoomCleared
setRoomUncleared
convertXMLGridEntityType
getJSONRoomOfVariant
getJSONRoomsOfSubType
getRandomJSONRoom
- Renamed the following helper functions:
changeCollectibleSubType
-->setCollectibleSubType
isNotCardOrRune
-->isPocketItemObject
- The following helper functions are now variadic:
arrayRemove
arrayRemoveInPlace
- The following helper functions now accept an optional
exceptions
argument:getRandomArrayElement
getRandomHeartSubType
getRandomCard
getRandomRune
- Removed the following helper functions:
inBlueBabyRoom
inLambRoom
inItLivesRoom
- Added the following constants:
CHARACTERS_WITH_AN_ACTIVE_ITEM
DEFAULT_ITEM_POOL_TYPE
ROOM_TYPE_TO_ITEM_POOL_TYPE_MAP
GENESIS_ROOM_SUB_TYPE
COLLECTIBLE_DESCRIPTION_MAP
TRINKET_DESCRIPTION_MAP
CARD_DESCRIPTION_MAP
LOST_STYLE_PLAYER_TYPES
CARDS
CARD_SET
RUNES
RUNE_SET
POCKET_ITEM_OBJECTS
POCKET_ITEM_OBJECT_SET
- Added the following enums:
PoofSubType
- Renamed the following enums:
BossIDs
-->BossID
- Added the
slot
field to thePocketItemDescription
enum.
November 21st, 2021
- The TypeScript definitions show now reflect the API for vanilla patch v1.7.6. (Thanks KatTheFox)
- Added function definitions for the global functions provided by the Racing+ sandbox.
- Added the following helper functions:
removeGridEntity
removeAllMatchingGridEntities
getLanguageName
getBombs
getEffects
getFamiliars
getKnives
getLasers
getPickups
getProjectiles
getTears
removeAllBombs
removeAllEffects
removeAllFamiliars
removeAllKnives
removeAllLasers
removeAllNPCs
removeAllPickups
removeAllProjectiles
removeAllTears
removeAllGridEntitiesExceptFor
addRoomClearCharges
addRoomClearCharge
addRoomClearChargeToSlot
playChargeSoundEffect
copyColor
copyKColor
copyVector
getDefaultColor
getDefaultKColor
getOneVector
(using this is safer than using theVector.One
variable because the variable can be overwritten or modified)getZeroVector
(using this is safer than using theVector.Zero
variable because the variable can be overwritten or modified)isPostBossVoidPortal
isSelfDamage
removeAllCollectibles
getHeartsUIWidth
getCollectibleDevilHeartPrice
getCollectibleItemType
addCollectibleCostume
addTrinketCostume
setLogFunctionsGlobal
(for easier debugging)setEntityRandomColor
getRandomHeartSubType
getRandomCard
isCard
isNotCardOrRune
isRune
getRandomRune
isAllPressurePlatesPushed
isAliveExceptionNPC
isRaglingDeathPatch
isBethany
getCollectibles
getEntities
getTrinkets
getSlots
getAzazelBrimstoneDistance
isMoveActionPressedOnAnyInput
isMoveActionTriggeredOnAnyInput
isShootActionPressedOnAnyInput
isShootActionTriggeredOnAnyInput
isDyingEggyWithNoSpidersLeft
- Renamed the following helper functions:
removeCostumeCollectible
-->removeCollectibleCostume
removeCostumeTrinket
-->removeTrinketCostume
- Removed the
getLanguage
helper function. (You should now useOptions.Language
instead, which returns the language abbreviation / resource suffix.) - The
getHUDOffsetVector
helper function will now use the vanillaHUDOffset
setting (instead of the ModConfigMenu setting). - The
getAliveBosses
andgetAliveNPCs
helper functions will now use an internal blacklist to exclude certain entities, such as Death's scythes or Big Horn holes. - The
getNPCs
helper function now accepts optional arguments to match entity type, variant, and sub-type. It also accepts an optional argument to exclude friendly NPCs. - Added the following constants:
BOMB_EXPLODE_FRAME
UI_HEART_WIDTH
MAX_NUM_FAMILIARS
AZAZEL_DEFAULT_BRIMSTONE_DISTANCE
EGGY_STATE_FRAME_OF_FINAL_SPIDER
- Added the following enums:
RenderMode
RoomDescriptorDisplayType
(to match the vanilla counterpart)RoomDescriptorFlag
(to match the vanilla counterpart)LanguageAbbreviation
(which corresponds to the string returned inOptions.Language
)
- Added
POOL_ULTRA_SECRET
to theItemPoolType
enum. - Added the following custom callbacks:
POST_SLOT_DESTROYED
POST_GRID_ENTITY_INIT
andPOST_GRID_ENTITY_REMOVE
now will fire on either thePOST_UPDATE
frame or thePOST_RENDER
frame, whichever happens first (instead of just thePOST_UPDATE
frame). (This allows grid entities to be removed before any sprite shows up on the screen.)
November 14th, 2021
- Added the updates from vanilla patch v1.7.5.
- The
TemporaryEffects.RemoveCollectibleEffect
,TemporaryEffects.RemoveNullEffect
, andTemporaryEffects.RemoveTrinketEffect
methods will now throw compiler errors since they are broken in patch v1.7.5. ItemConfigItem.Name
,ItemConfigCard.Name
, andItemConfigPillEffect.Name
will only work for modded items, so it is recommended to use the helper functions ofgetCollectibleName
,getTrinketName
,getCardName
, andgetPillEffectName
until the next patch.Isaac.CountEntities
is now a legal method.- Added the following helper functions:
getPlayerHealth
setPlayerHealth
setFamiliarNoSirenSteal
(Thanks KatTheFox)hasSirenStolenFamiliar
(Thanks KatTheFox)getFinalPlayer
getClosestEntityTo
getCardName
getPillEffectName
removeAllPlayerHealth
getLanguage
- Renamed the following helper functions:
removeItemFromItemTracker
-->removeCollectibleFromItemTracker
- The
getItemName
helper function has been split up intogetCollectibleName
andgetTrinketName
. - Added the following constants:
COLLECTIBLE_NAME_MAP
TRINKET_NAME_MAP
CARD_NAME_MAP
PILL_EFFECT_NAME_MAP
MAX_PLAYER_HEART_CONTAINERS
- Added the following enums:
PoopEntityVariant
PoopSpellType
(from vanilla)LaserSubType
(from vanilla)
- Renamed the following enums:
PoopVariant
-->PoopGridEntityVariant
- Added more entries to the
LaserVariant
enum. - Added
COLLECTIBLE_GLASS_EYE
,COLLECTIBLE_STYE
, andCOLLECTIBLE_MOMS_RING
to the vanillaCollectibleType
enum. - Added the following custom callbacks:
POST_BOMB_INIT_LATE
POST_EFFECT_INIT_LATE
POST_FAMILIAR_INIT_LATE
POST_KNIFE_INIT_LATE
POST_NPC_INIT_LATE
POST_PROJECTILE_INIT_LATE
POST_TEAR_INIT_LATE
November 7th, 2021
IsaacScript will now insert the following at the beginning of every transpiled "main.lua" file so that people reading the code will be less confused:
--[[
This Isaac mod was created with the IsaacScript tool.
The Lua code in this file is not actually the source code for the program. Rather, it was
automatically generated from higher-level TypeScript code, and might be hard to read. If you want to
understand how the code in this mod works, you should read the actual TypeScript source code
directly instead of trying to read this file. Usually, the link to the source code can be found in
the mod's description on the Steam Workshop. If not, you can ask the mod author directly if the
source code is publicly available.
IsaacScript provides a lot of advantages over using raw Lua. For more information about the tool,
see the official website: https://isaacscript.github.io/
--]]
- IsaacScript will now correctly handle symlinks and alternate versions of VSCode. (Thanks KatTheFox)
- Added the following helper functions:
getRandomArrayIndex
arrayRemoveInPlace
getMaxTrinketID
getTrinketSet
spawnGiantPoop
spawnGridEntity
spawnGridEntityWithVariant
getAliveNPCs
directionToVector
(Thanks KatTheFox)removeCostumeCollectible
removeCostumeTrinket
arrayShuffle
arrayShuffleInPlace
- Renamed the following helper functions:
initArray
-->arrayInit
(to be more consistent with the other array functions)
- The
seed
argument forgetRandomFloat
,getRandomInt
,initRNG
,getRandomArrayElement
, andgetRandomArrayIndex
functions are now optional and will useRandom()
if no seed is specified. - Added the following enums:
RockState
PokyVariant
GaperVariant
GusherVariant
PooterVariant
ClottyVariant
MulliganVariant
ShopkeeperVariant
LarryJrVariant
HiveVariant
ChargerVariant
GlobinVariant
BoomFlyVariant
MawVariant
HostVariant
ChubVariant
HopperVariant
BoilVariant
SpittyVariant
LeaperVariant
MrMawVariant
BabyVariant
GutsVariant
KnightVariant
StoneHeadVariant
Monstro2Variant
SlothVariant
LustVariant
WrathVariant
GluttonyVariant
GreedVariant
EnvyVariant
PrideVariant
DopleVariant
LeechVariant
MemBrainVariant
ParaBiteVariant
EyeVariant
SuckerVariant
WarVariant
DukeVariant
LokiVariant
FistulaVariant
MomsHeartVariant
GurgleVariant
WalkingBoilVariant
HeartVariant
MaskVariant
WidowVariant
DaddyLongLegsVariant
ConstantStoneShooterVariant
BabyLongLegsVariant
CrazyLongLegsVariant
FattyVariant
SwingerVariant
DipVariant
SquirtVariant
SkinnyVariant
BonyVariant
HomunculusVariant
TumorVariant
NerveEndingVariant
GurglingVariant
GrubVariant
WallCreepVariant
RageCreepVariant
RoundWormVariant
ConjoinedFattyVariant
PolycephalusVariant
MegaSatanVariant
MoveableTNTVariant
UltraCoinVariant
StoneyVariant
PortalVariant
LeperVariant
MrMineVariant
RagManVariant
UltraGreedVariant
RagMegaVariant
BloodPuppyVariant
SubHorfVariant
PoltyVariant
PreyVariant
RockSpiderVariant
FlyBombVariant
DannyVariant
GyroVariant
FacelessVariant
MoleVariant
BigBonyVariant
GuttyFattyVariant
ExorcistVariant
WhipperVariant
PeeperFattyVariant
RevenantVariant
CanaryVariant
Gaper2Variant
Charger2Variant
EvisVariant
DumpVariant
NeedleVariant
CultistVariant
VisFattyVariant
GoatVariant
VisageVariant
SirenVariant
ScourgeVariant
ChimeraVariant
SingeVariant
RaglichVariant
ClutchVariant
GenericPropVariant
ConstantStoneShooterSubType
- Added the following constants:
ONE_BY_ONE_ROOM_GRID_SIZE
October 31st, 2021
- IsaacScript will now warn you if your mods directory is a symlink.
- Added the following helper functions:
logTable
nextSeed
getGridEntities
now accepts a variadic amount of arguments (instead of just one).- Swapped the order of the arguments of
runInNFrames
so that it matches the ordering of thesetTimeout
function.
October 24th, 2021
- Added several parts of the
isaacscript-common
library to the docs that were previously undocumented, including constants and features. - Renamed the
getScreen
helper functions to have aPos
suffix so that they match the naming convention of the vanilla functions. - Added the following enums:
RockVariant
PitVariant
- Added a
GRID_ENTITY_XML_MAP
constant (for converting betweenGridEntityXMLType
andGridEntityType
/ variant).
October 17th, 2021
- The IsaacScript watcher emoji eyes have been changed to the TypeScript logo.
isaacscript.json
now has two new optional options:customTargetModDirectoryName
- By default, the target mod directory name will be the same as the project directory name. This setting allows you to customize it.enableIsaacScriptWatcherAutoRestart
- When your code is recompiled, IsaacScript watcher can restart the game to ensure that any run-related variables are properly reset. This is set to true by default.
- The StageAPI definitions and the MinimapAPI definitions are now more complete. (Thanks KatTheFox)
CardConfigList.Get
will now cause a compiler error, since it returns useless userdata.- Added the following helper functions:
getLastHeart
(Thanks KatTheFox)getCircleDiscretizedPoints
October 10th, 2021
- Added the following helper functions:
getKBitOfN
getNumBitsOfN
getRoomName
setBlindfold
- Added the following constants:
ISAAC_FRAMES_PER_SECOND
GAME_FRAMES_PER_SECOND
- Added TypeScript definitions for the socket library.
October 3rd, 2021
- Added the following helper functions:
logColor
logKColor
September 26th, 2021
- Added the
hexToKColor
helper function.
September 14th, 2021
- IsaacScript will now monkey patch your Lua code (after it is copied) to fix the
Map
/Set
blowing-away issue.- This means that if you were disabling luaBundle for production builds, you can stop doing that.
- And you can also un-namespace your mod directory if you did that as well.
- I will remove the monkey patch code once TSTL fixes the bug upstream.
- There is a regression in the latest version of TSTL. If your
main.lua
file is no longer created inside of the mod directory, the fix is to do this: https://github.com/IsaacScript/isaacscript/commit/d3dc85b8cdacb58b108641669fdb670492a296be - A particular bug that the monkey patch won't fix is that implicitly iterating over a
Map
(instead ofMap.entries()
), or iterating over aSet
(instead ofSet.values()
) won't work anymore. Thus, you should change all of your code to be explicit. isaacscript-lint
now contains a rule that warns on implicitMap
orSet
iteration. It comes with an auto-fixer so that all you have to do is save the file to fix the code.- The save data manager now supports TSTL classes.
- Added a new linter rule to disallow void return types on unexported functions.
- Added the following helper functions:
logMap
logSet
logArray
changeCollectibleSubType
inStartingRoom
- The
getRoomIndexesForType
helper function now returns aSet
(instead of an array). - The
getDoors
helper function now takes an optional argument ofroomType
. - The
getGridEntities
helper function now takes an optional argument ofgridEntityType
to narrow the returned array. - Added the following enums:
DeathsHeadVariant
RaglingVariant
VisVariant
DeathVariant
PeepVariant
BegottenVariant
MamaGurdyVariant
BigHornVariant
LittleHornVariant
ChargerVariant
September 7th, 2021
bundleEntry.ts
- Before,
isaacscript init
set your bundle entry point in thetsconfig.json
file to be./src/main.ts
. - Now,
isaacscript init
sets your bundle entry point tobundleEntry.ts
, which in turn runsmain.ts
.
The reason for this is that any functions and variables that you declare in a TSTL bundle entry point will automatically become global variables. And you should (almost) never be creating any global variables. So, if you declare any functions or variables in your main.ts
file, you can "fix" it by performing the following steps:
- In
tsconfig.json
, set"luaBundleEntry": "./src/bundleEntry.ts"
- Create
./src/bundleEntry.ts
and paste in the contents of this file. - Put everything in your
main.ts
file into aexport default function main()
function
luaBundle
I found an issue where if multiple IsaacScript mods are turned on at the same time, and they use maps, an issue with TSTL can cause map-related run-time errors to occur. Eventually, this bug should be fixed upstream, we just have to wait for them to fix it.
In the meantime, if you experience any map related errors with your production mod, the solution is to 1) turn luaBundle
off in tsconfig.json, and 2) rename bundleEntry.ts
to main.ts
(see below).
Note that you don't want to do this in development, because having your mod split up into separate files will prevent isaacscript-watcher
from hot-reloading your mod. Just change it before pushing out a production build.
That's all you technically need to do, but there is an additional gotcha. In Lua land, there is no concept of relative paths, which means that if you happen to have a file that is named exactly the same as someone else's file (like "globals.ts" or "util.ts"), it can cause conflicts. (This isn't just a problem for IsaacScript mods, it applies to everyone making Isaac mods. It doesn't normally apply to IsaacScript mods though because everything is usually packed into a singe main.lua
.)
So as an additional measure, you can namespace your entire mod into a subdirectory with the name of your mod:
forgotten-fables/
└── src/ (TypeScript source code)
├── main.ts (with 1 line that just imports and runs "forgotten-fables/main")
└── forgotten-fables/
├── main.ts (exporting a function to run)
└── the rest of the code
This way, ./mod1/util.lua
won't "match" ./mod2/util.lua
, for example. Depending on how long it takes for TSTL to fix the bug, I can create tooling to automate most of this.
null
--> undefined
In the TypeScript definitions, all instances of null
are now replaced with undefined
.
Initially, I used null
to represent nil
, but this was an incorrect way to model the API because null
is supposed to be an instantiated value that "exists" (even though it is transpiled to the same thing). In the future, TypeScriptToLua might transpile null to a real value, so I want to do this change now before that happens.
If you are upgrading to the latest version, this might be a breaking change, because code like the following:
const player2 = Isaac.GetPlayer(1); // player2 type is "EntityPlayer | null"
if (player2 === null) {
return;
}
player2.AddHearts(1); // player2 type is "EntityPlayer"
Needs to be changed to:
const player2 = Isaac.GetPlayer(1); // player2 type is "EntityPlayer | undefined"
if (player2 === undefined) {
return;
}
player2.AddHearts(1); // player2 type is "EntityPlayer"
You can still use null
in your own variables, but make sure that it is for variables that you want to model as having an actual null-type defined value.
Other
- Added the following helper functions:
addTearsStat
getPlayerFromIndex
getVisibleHearts
getTotalCharge
isLost
getDeathAnimationName
getRoomIndexesForType
keyboardToString
controllerToString
inItLivesRoom
inBlueBabyRoom
inLambRoom
round
setCollectibleBlind
setCollectibleSprite
isChest
inDimension
- Removed the following helper functions:
getPlayerFromEntityPtr
(sinceEntityPtr
is not serializable,PlayerIndex
should be used instead)
- Renamed the following helper functions:
isQuestItem
-->isQuestCollectible
- Added the following constants:
SINGLE_USE_ACTIVE_COLLECTIBLE_TYPES
MAX_ROOM_INDEX
- Added the following enums:
DaddyLongLegsState
ReapCreepState
BigHornState
DeathState
TrapdoorVariant
StairsVariant
PitfallVariant
- Added the following custom callbacks:
POST_SLOT_INIT
POST_SLOT_UPDATE
POST_SLOT_RENDER
- Added MinimapAPI definitions.
August 31st, 2021
- Added the following helper functions:
hasLostCurse
getPlayerCollectibleMap
getCollectibleList
temporarilyRemoveTrinkets
giveTrinketsBack
vectorToDirection
(Thanks KatTheFox)teleport
(use this instead ofGame.StartRoomTransition
so that you don't forget to setLevel.LeaveDoor
)forgottenSwitch
(requires an upgraded mod)getClosestPlayer
enableAllInputs
disableAllInputs
enableAllInputsExceptFor
disableAllInputsExceptFor
disableMovementInputs
disableShootingInputs
getBosses
arrayInArray
getAliveBosses
isKeeper
hasOpenActiveItemSlot
getTransformationsForItem
removeItemFromItemTracker
getPlayerFromEntityPtr
getPlayersOfType
getNewestPlayer
getCollectibleInitCharges
getCollectibleMaxCharges
isKeyboardPressed
runNextFrame
runInNFrames
logEntity
- Renamed the following helper functions:
getCollectibleList
-->getCollectibleSet
(it now returns aSet
instead of an array)getRoomNPCs
-->getNPCs
- Added the following constants:
GOLDEN_TRINKET_SHIFT
TRANSFORMATION_TO_TAG_MAP
TRANSFORMATION_TO_ITEMS_MAP
ITEM_TO_TRANSFORMATION_MAP
- Added the following enums:
PurgatorySubType
(Thanks KatTheFox)DisplayFlag
HeavenLightDoorSubType
IsaacVariant
(Thanks KatTheFox)
- Added the following custom callbacks:
PRE_CUSTOM_REVIVE
POST_CUSTOM_REVIVE
POST_PLAYER_RENDER_REORDERED
POST_PURCHASE
- The save data manager will now properly handle TypeScriptToLua Sets.
- The save data manager now supports maps within maps.
- The save data manager now merges by iterating over the new table instead of the old object. This is necessary to capture values with a data type of
something | null
. - The
addFlag
,removeFlag
, andhasFlag
functions are now variadic, meaning that you can pass N flags to them at a time.
August 24th, 2021
- Added the following helper functions:
isQuestItem
in2x1Room
inLRoom
anyEntityCloserThan
removeAllEntities
removeAllMatchingEntities
getSurroundingGridEntities
getRepentanceDoor
isRepentanceDoor
isDoorToDownpour
isDoorToMines
isDoorToMausoleum
isDoorToMausoleumAscent
isDoorToMomsHeart
getCurrentDimension
getEffectiveStage
isDevilRoomDoor
isAngelRoomDoor
getDevilRoomDoor
getAngelRoomDoor
getDevilOrAngelRoomDoor
logAllGameStateFlags
getRoomData
getRoomDataType
getRoomVariant
getRoomStageID
getRoomSubType
inGenesisRoom
isChildPlayer
removeDeadEyeMultiplier
willPlayerRevive
(the vanillaEntityPlayer.WillPlayerRevive
function is broken and that you should use this helper function instead)willMysteriousPaperRevive
getFinalFrameOfAnimation
willReviveFromSpiritShackles
isJacobOrEsau
inBeastRoom
- Added the following constants:
DISTANCE_OF_GRID_SQUARE
DOOR_HITBOX_DISTANCE
MAX_PLAYER_SPEED_IN_UNITS
CHARACTERS_WITH_NO_RED_HEARTS
GENESIS_ROOM_VARIANT
GRID_INDEX_CENTER_OF_1X1_ROOM
MAX_PLAYER_POCKET_ITEM_SLOTS
MAX_PLAYER_TRINKET_SLOTS
- Renamed the following constants:
DISTANCE_OF_GRID_SQUARE
-->DISTANCE_OF_GRID_TILE
(since that is the terminology that the game uses)
- Added the following enums:
LadderSubType
PinVariant
DarkEsauVariant
PlayerItemAnimation
CollectibleAnimation
PocketItemSlot
TrinketSlot
ControllerIndex
- Added the following custom callbacks:
POST_PICKUP_INIT_LATE
POST_PICKUP_COLLECT
POST_PLAYER_CHANGE_HEALTH
POST_PLAYER_FATAL_DAMAGE
POST_LASER_INIT_LATE
POST_PLAYER_INIT_LATE
GridEntity.Desc
is added back to the definitions, but only for the purposes of throwing a compiler error. (It is assigned anever
type.) As per the developers, modders should always useGridEntity.GetSaveState
instead of accessingGridEntity.Desc
directly.GetPtrHash
now accepts aRoomDescriptor
or aRoomDescriptorReadOnly
.- The
getRandomArrayElement
helper function now throws an error if you provide it an array with 0 elements. - You can now pass an optional 2nd argument to the
upgradeMod
function to enable verbose logging at the beginning and end of every callback that fires. This can be useful to troubleshoot code that is causing the game to crash. - Changed the return type of the
GetPtrHash
function from anint
to aPtrHash
, which is simply a branded number for better type safety and code clarity. - The Save Data Manager will now automatically handle the special case where you are using number keys for a TSTL Map.
- Without any special handling, the JSON serializer will interpret it as an array and insert N null elements for each skipped entry. This can lead to hundreds of thousands of null elements, which can crash the game.
- The manager converts all number keys to strings when serializing, and then converts them back when deserializing.
- Changed the type of
RoomDescriptor.Data
fromRoomConfig
toRoomConfig | null
, since it doesn't exist for some rooms until you enter them. You can also set it to null to delete an already-initialized room in certain circumstances. - The
getEnumValues
helper function will now automatically sort the returned array.
August 17th, 2021
- Added the following helper functions:
isArray
isEven
isOdd
getPlayerIndexVanilla
isFirstPlayer
getMaxCollectibleID
collectibleHasTag
tableClear
initTransformationTracking
getPlayerNumTransformationCollectibles
isGlitchedCollectible
inAngelShop
isVector
onFinalFloor
getPlayerCloserThan
getPocketItems
hasOpenTrinketSlot
hasOpenPocketItemSlot
arrayToString
arraySum
isSecretRoomDoor
isHiddenSecretRoomDoor
- Added the following constants:
BEAST_ROOM_SUB_TYPE
FIRST_TMTRAINER_COLLECTIBLE_TYPE
MAX_NUM_DOORS
MAX_NUM_INPUTS
MAX_VANILLA_COLLECTIBLE_TYPE
- Renamed the following constants:
FIRST_TMTRAINER_COLLECTIBLE_TYPE
-->FIRST_GLITCHED_COLLECTIBLE_TYPE
- Added the following custom callbacks:
POST_PLAYER_INIT_REORDERED
POST_PLAYER_UPDATE_REORDERED
- Added the following enums:
DevilRoomSubType
AngelRoomSubType
BackwardsPathRoomSubType
HomeRoomSubType
TeleporterState
SatanVariant
- The save data manager now supports maps:
- Maps will automatically be converted to
LuaTable
upon saving to disk, and then automatically converted back when loading from disk. - Use
Map
instead ofLuaTable
to prevent the manager from thinking that a data structure is "old" and shouldn't be merged.
- Maps will automatically be converted to
- The save data manager will now accept Vectors (and it will serialize/deserialize them properly).
- The
TemporaryEffects.AddCollectibleEffect
method now throws a compiler error, since it reliably causes the game to crash. - Using
Level.GetCurrentRoomDesc
now throws a compiler error. (Level.GetRoomByIdx
should always be used instead.)
August 10th, 2021
- Added many more helper functions to
isaacscript-common
, sorted by subcategory:- Array:
arrayEquals
arrayRemove
getRandomArrayElement
initArray
arrayEmpty
- Entity:
getRoomNPCs
- Flag:
addFlag
hasFlag
removeFlag
- Grid Entity:
getDoors
getGridEntities
openAllDoors
- Input:
isActionPressedOnAnyInput
isActionTriggeredOnAnyInput
- JSON:
jsonEncode
jsonDecode
- Log:
log
logAllEntityFlags
logAllDamageFlags
logAllFlags
logAllProjectileFlags
logAllUseFlags
- Math:
sign
tanh
- Player:
anyPlayerCloserThan
anyPlayerHasCollectible
anyPlayerHasTrinket
anyPlayerIs
getOpenTrinketSlot
getPlayerIndex
getPlayer
getTotalPlayerCollectibles
getPlayerNumAllHearts
- Random:
getRandom
getRandomFloat
getRandomInt
- Stage:
onChest
onDarkRoom
onRepentanceStage
onCathedral
onSheol
- Tears:
getFireDelay
getTearsStat
- UI:
getHUDOffsetVector
getScreenBottomLeft
getScreenBottomRight
getScreenCenter
getScreenTopLeft
getScreenTopRight
- Util:
changeRoom
deepCopy
ensureAllCases
getAngleDifference
getEnumValues
getItemName
getRoomIndex
gridToPos
inCrawlspace
initRNG
lerp
lerpAngleDegrees
onSetSeed
- Array:
- All of the functions are automatically documented online using the TypeDoc generator.
- Added a Save Data Manager system that you can automatically use in your IsaacScript mods.
- The manager does two things:
- Resets variables at appropriate times.
- Automatically saves/loads from the "save#.dat" file to make everything persistent.
- Using the manager is great because it keeps all your variables locally & properly scoped and abstracts away all the complexity of having to use JSON.
- You can force the save data manager to write to disk with the
saveDataManagerSave
function. - You can use the
saveDataManagerSetGlobal
function to put all of the save data variables on a global variable "g" for debugging purposes.
- The manager does two things:
- Added
REPENTANCE
definition. (Thanks Siramok) - Added some more Mod Config Menu definitions. (Thanks Siramok)
- Added new custom callbacks that you can use in your mods:
POST_GAME_STARTED_REORDERED
POST_NEW_LEVEL_REORDERED
POST_NEW_ROOM_REORDERED
PRE_ITEM_PICKUP
POST_ITEM_PICKUP
POST_PLAYER_CHANGE_TYPE
POST_FLIP
POST_FIRST_FLIP
POST_ESAU_JR
POST_FIRST_ESAU_JR
POST_TRANSFORMATION
POST_GRID_ENTITY_INIT
POST_GRID_ENTITY_UPDATE
POST_GRID_ENTITY_REMOVE
POST_SACRIFICE
POST_CURSED_TELEPORT
- The custom callbacks are documented here.
- Added the
GridPath
enums.
August 3rd, 2021
- Released the
isaacscript-common
package, which includes helper functions that you can use in your IsaacScript mods. Right now there are not that many functions, but I plan to increase this in the future. They are documented here. - Breaking changes:
- The
isaacscript
package is no longer a meta-package that provides everything else. (It was getting too big and hard to handle.) - This means that instead of having 1 dependency of just
isaacscript
, new IsaacScript mods created withinit
are initialized with 4 dependencies:isaacscript
- The monitoring program.isaacscript-lint
- The linting config.isaacscript-common
- Optional helper functions that you can use in your mods.isaac-typescript-definitions
- Provides the types for all the Isaac API classes, likeEntityPlayer
and so forth.
- If you are upgrading your existing mod to the latest version of IsaacScript, simply add the 3 extra dependencies to your "package.json" file, and everything should work the way it did before.
- Remember that you can use
npx isaacscript update
to update all of your dependencies at once.
- The
- Added Algolia search to the IsaacScript website.
- Added the following enums:
DogmaVariant
PressurePlateVariant
PressurePlateState
StatueVariant
- Added definitions for
ModConfigMenu
. - The ESLint config no longer complains about
@category
in JSDoc. - Added a new ESLint rule:
eslint-plugin-no-template-curly-in-string-fix
July 27th, 2021
- Fixed the wrong type in the
INPUT_ACTION
callback. (Thanks to KatTheFox) - Fixed some bugs in the
RoomConfig
class. (Thanks Somdudewillson) - Added definitions for External Item Descriptions. (Thanks Somdudewillson)
- Added definitions for Music Mod Callback. (Thanks KatTheFox)
- Added definitions for StageAPI. (Thanks Somdudewillson)
- Added the following enums:
RotgutVariant
MotherVariant
HauntVariant
AngelVariant
FallenVariant
DingleVariant
LambVariant
BeastVariant
MomVariant
- Turned off the following ESLint rules:
jsdoc/require-param
jsdoc/require-returns
jsdoc/require-param-type
jsdoc/require-returns-type
- The
isaacscript.json
file no longer contains aprojectName
field. Instead, IsaacScript will always read the project name from the current working directory.- (You should remove the
projectName
field from theisaacscript.json
file in your current projects when you upgrade your dependencies.)
- (You should remove the
- The
isaacscript.json
file now contains only per-user settings. Thus, it should not be committed to a repository. If noisaacscript.json
file exists, IsaacScript will create one upon the first invocation in a new directory. (Previously, it would throw an error and exit.) - The
isaacscript.json
file is now automatically added to the.gitignore
file for new projects.- (You should add it to the
.gitignore
in your current projects when you upgrade your dependencies.)
- (You should add it to the
- The
monitor
command will now output the mod target directory upon first invocation. - Changed the type of EntityPtr.Ref from
Readonly<Entity>
toEntity | null
. - The linter meta-package now includes
cspell
so that you can spell check from command-line and/or CI. isaacscript init
will now create the following additional files:ci.yml
- for GitHub Actionsprettier.config.mjs
- to ensure trailing commas and LF line endingsbuild.sh
- helper script to compile the project (used in CI)lint.sh
- helper script to lint and spell check the project (used in CI)publish.sh
- helper script to runnpx isaacscript publish
run.sh
- helper script to runnpx isaacscript
update.sh
- helper script to automatically update project dependenciesnuke.sh
- helper script to automatically reinstall project dependencies
July 20th, 2021
- Added JSDoc lint rules from the recommended config.
July 3rd, 2021
- Added a linting rule that catches the following bug:
myArray.push()
- Added a new linting plugin that changes all ESLint rules to warnings, so that you can more-easily disambiguate them from TypeScript compiler errors.
- For vectors, the methods of
__add
,__sub
, and so forth have been deprecated in favor ofadd
,sub
, and so on. The former can cause the game to crash in Repentance.
June 26th, 2021
- The
Isaac.GetPlayer
method now returnsEntityPlayer
instead ofEntityPlayer | null
. This means that you can remove type narrowing and/or non-null assertions from your code. - Added
KnifeVariant
enum. - The
USE_ITEM
andPRE_USE_ITEM
callbacks can now return void. - Changed several callbacks to use
void
instead ofnull
in order to simplify the signatures and have less friction for new users. This might be a breaking change for some users if you are using these callbacks in exported functions, but the fix is simple: just changenull
tovoid
.
May 15th, 2021
- The framework was updated to work properly with Repentance.
October 20th, 2020
- The first version of IsaacScript is released (for Afterbirth+).