Releases: KristalTeam/Kristal
v0.9.0
A very big update to Kristal, over a year since the previous release. Thanks to all our contributors for continuing to maintain the project. Merry Christmas!
Changelog
- Update to LÖVE 11.5
- LTS Parity
- Add hours to file select menu and save menus
- Remove single pixel from susie hurt sprite (!!!!!!)
- Recruit system
- Border registry in
scripts/borders
for dynamic borders - Shader asset registry in
assets/shaders
for better organization - Legend cutscenes
- Registered in
scripts/legends
- Activated with
Game:fadeIntoLegend
orGame:startLegend
- Registered in
- New UI component system
- Dark Inventory is no longer attached to the Ball of Junk
- Add Chapter 1 Game Over screen
- Add per-battle party stat buffs
- Discord Rich Presence support
- Add support for BMFont fonts
- Add
dependencies
andoptionalDependencies
settings to libraries - Main Menu restructuring
- Rename
Menu
toMainMenu
- Extract all menu states to standalone classes
- Move
Menu:printShadow
toDraw.printShadow
- Rename
- Dynamic Dark Transition 🎉
- Increase Noelle HP cap to 999 (theoretical Deltarune limit) from 166 (achievable Deltarune limit)
- Add alternate animations/sprites to Noelle actor triggered by setting the Noelle party member's
weird
flag - Say hi to our new example mod shopkeeper Amelia :3 (only accessible with debug for now...)
- Add mouse input functions
Input.mouseDown
,Input.mousePressed
,Input.mouseReleased
,Object:clicked
- Change enemies to dodge ("miss" message) when taking 0 damage or less
- Add
damageUnderflowFix
engine setting which can be disabled to make enemies heal from negative damage instead
- Add
- Adjust enemy conditional status text behaviour
- Add
tired_text
- Add
low_health_percentage
used to determine whether to displaylow_health_text
- Add
prioritySpareableText
engine setting to determine priority between tired / low-health text and spareable text
- Add
- Change default
Object:shake
params to match most Deltarune shaking - Implement some Lua operators (
+
,*
,[]
) for strings - Add
Actor.soul_offset
andActor:getSoulOffset
for overworld soul placement - Add weapon attack stat comparison to the Equip menu
- Add
onWheelMoved
mod callback - Change left/up player movement to override right/down movement for Deltarune accuracy
- Add
usetile
property to interactables to conveniently display a Tile Object - Add
getDamage
function to all relevant Deltarune spells for easy hooking - Add restart engine hotkey (
Ctrl+Shift+Alt+R
) - Add toggle noclip debug hotkey (
Ctrl+N
) - Add character
alert
function to characters, battlers, and cutscenes - Add
previewMusicLoop
mod option - Add
Music:setLooping
function - Remove
Input.getText
return_sprite
argument- Add
Input.getTexture
function for this behaviour
- Add
- Add engine debug option for verbose asset loading
- Add
EnemyBattler:removeAct
function - Change file select to skip save select if mod setting
useSaves
is set tohas_saves
- Add
nameLimit
mod setting to define save file character limits - Better light world item implementation
- Add mod and encounter callbacks for battle menus
Mod:onBattleMenuCancel
/Encounter:onMenuCancel
Mod:onBattleEnemySelect
/Encounter:onEnemySelect
Mod:onBattleEnemyCancel
/Encounter:onEnemyCancel
Mod:onBattlePartySelect
/Encounter:onPartySelect
Mod:onBattlePartyCancel
/Encounter:onPartyCancel
- Tweak logic for default overworld object layer
- Add
Actor.font
andActor:getFont
to specify default speech fontspeech_bubble_font_size
andgetSpeechBubbleFontSize
for speech bubbles
- More Utils functions
isNaN
to check if a number is NaNxor
returns an XOR boolean result on an arbitrary number of inputssquishAndTrunc
for fitting text on-screen with squishing (horizontal scaling)
- Add fade parameter to
Game:enter
- Add
onMapBorder
mod callback to customize which border is set by a map - Add a keyboard with lowercase alphabet
- Allow negative amount in
EnemyBattler:addMercy
- Overhaul DarkMenu to make it easier to add buttons via events
- Add debug option to change party
- Add argument to
onDodge
which checks whether you attacked or not - Add
sound
andpitch
properties to map transition event- Replaces
stairs
property (used "escaped" sound)
- Replaces
- Add custom keybinds for mods (using the
keybinds
mod setting) - Add
Wave.arena_rotation
andWave:setArenaRotation
- Add
Shop:removeTalk
function - Add
PartyMember:replaceSpell
function - Move all mod callback strings to
KRISTAL_EVENT
table - Add
setWindowTitleAndIcon
mod setting - Add
Draw.printAlign
function - Add more overworld enemy settings for chasing and pacing
- Chapter 1 equipment inventory accuracy (12 slots instead of 48)
- Add
ChaserEnemy:onAlerted
callback - Add
Kristal.fetch
for HTTPS requests usinghttps
library - Add
EnemyBattler.dmg_sprite_offset
variable - Add BrokenCake, Lancer, Rouxls Kaard and Starwalker key items
- Add
Character.party
variable - Add
stronger_absent
andgetStrongerAbsent
to Party Members to determine which characters "get stronger" while not in the party - Add hotkey to save screenshot (
F9
) - Add argument to wavy text for speed
- Add
Soul:onGraze
callback - Add
getDialogueTextStyle
mod callback
Congratulations! You reached the end of the cherry-picked changelog only listing the additions! There are also countless fixes and more small changes/additions, but...
Full Commit History: v0.8.1...v0.9.0
Instructions
Windows: Download and extract kristal-x.x.x-win.zip
, and run kristal.exe
to play
Others: Download and extract kristal-x.x.x-love.zip
, and run kristal.love
with LÖVE to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.8.1
Changelog
- Many Deltarune accuracy fixes
- Added text choicers (undertale-style choicers, seen at the start of Chapter 1)
- Added ability to use spells from the Power menu in the overworld (requires both
keepTensionAfterBattle
andoverworldSpells
config options enabled) - Added UT Accurate Save Menu for Light World by @DiamondBor in #29
- Added
Sprite
event for maps - Added option for save points to not heal (
heals
boolean property) - Made gear ability icon color in the equip menu customizable (
bonus_color
item variable) - Added basic flag viewer/editor in the debug menu
- Added Hot Chocolate and Bouquet light world items
- Added missing Chapter 1 Ralsei sprites by @DiamondBor in #25
- Added more LW sprites for kris, susie and noelle, added missing key items by @DiamondBor in #26
- Added Box of Heart Candy & Cards LW items by @DiamondBor in #28
- Removed dark transition option for mods, along with
Kristal.stageTransitionExists
function - Added Event interaction buffer by @MrOinky in #32
- Improve some stuff regarding standalone builds by @Dobby233Liu in #31
- Moved
TARGET_MOD
tosrc/engine/vendcust.lua
- Moved
- Added git finder for showing the commit hash on the main menu when running the engine with git
- Various tweaks by @Dobby233Liu in #30
- Added 2nd page to credits menu by @DiamondBor in #27
- World music continues into shop if shop_music is nil by @Simbel0 in #24
- Error handler tweaks by @MrOinky in #33
- Fixed soulshine animation speed by @IDunno1 in #34
- Added callbacks
- Mod:
onMapMusic
,onActionSelect
,onBattleMenuSelect
,
onBattleAction
,onBattleActionBegin
,onBattleActionEnd
,onBattleActionEndAnimation
,
onBattleActionCommit
,onBattleActionUndo
- Encounters:
onActionSelect
,onMenuSelect
,getSoulSpawnLocation
,
getVictoryMoney
,getVictoryXP
,getVictoryText
- Items:
onMenuOpen
,onMenuClose
,onMenuUpdate
,onMenuDraw
- Mod:
Full Changelog: v0.8.0...v0.8.1
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.8.0
A months-overdue release of changes, additions, and fixes to Kristal.
Breaking changes
fadeTo
andfadeOutAndRemove
now take 'time' arguments instead of 'speed'- Added
fadeToSpeed
andfadeOutSpeedAndRemove
- Removed
getSpeed
, addedgetSpeedDir
andgetSpeedXY
- Removed
setRelativePos
bc honestly who was using that - Map load now happens after
Mod:load
Timer:everyInstant()
now calls its function exactly 'count' number of times, instead of one extra time- Change arguments for SpeechBubble from
text, x, y, speaker, right, style
totext, x, y, options, speaker
- Change arguments for Battler:spawnSpeechBubble() from
text, right, style
totext, options
- Renamed dialogue text
line_advance_callback
toline_callback
, made it get called on first line, and made it receive the line index - Renamed
resetGraphicsTransform
toresetGraphics
- Made
Cutscene:fadeOut
/fadeIn
not automatically wait - Renamed
Utils.padSpacing
toUtils.padString
- Reaction data tables are now formatted like
{text, x, y, face, actor}
(changed from the previous arrangement of{actor, face, x, y, text}
)Textbox:addReaction(id, text, x, y, face, actor)
andSmallFaceText(text, x, y, face, actor)
have been similarly changed
- Removed
shake_x
andshake_y
variables from Objects - Added
Object:shake(x, y, friction, delay)
andObject:stopShake()
There are many additions and changes that are hard to list here in a release!
Check the commits for a full changelog: v0.7.1...v0.8.0
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.7.1
A small update to Kristal that includes some important fixes.
Changelog
Additions:
- Tiled 1.9 feature support
- Tilesets can be defined to scale up to the map grid size, allowing unresized 20x20 tilesets
- Image Collection tilesets can now define sub-images
- New debug menus
- Portrait selector, for viewing and copying portrait paths
- Wave selector, for testing waves in battles
- Sound test, for previewing sound effects
- Added
darkfountain
andfountainfloor
events, and afountainshadow
controller - Added a few sounds and sprites
- Added some more palette options
Mod:getPaletteColor(index)
,Mod:getUISkin()
callbacks
Changes:
color
andhighlight
options for choicers- Disable NPC
turn
option by default - More Chapter 1 UI accuracy
- New Chapter 1 TP bar config option (boxes it)
- Drop Dog stat change to 2% in Chapter 1, sorry dog hunters
- Portraits can now animate while talking
- Lots of fixes
Full Changelog: v0.7.0...v0.7.1
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.7.0
An update to Kristal that includes controller support, screen borders, warp doors, and some various changes.
Changelog
Additions:
- Added controller support and rebinding
- Added screen borders, which can be enabled in the options menu
- Mods can change the dynamic border using
Game:setBorder()
or theborder
map property - Custom drawing can be added using the
Mod:onBorderDraw
callback
- Mods can change the dynamic border using
- Added warp door event
- Added indent customization for text (the
*
at the start of text)- Settable for an actor via the
indent_string
actor variable - Settable per-text with the
[indent]
text modifier
- Settable for an actor via the
- Added
disable_mercy
variable to enemies - Added built-in
last_x
andlast_y
variables to Objects - Miscellaneous functions:
Cutscene:during(func)
to add an update function to the current cutsceneGame:setPartyMembers(...)
,Cutscene:playSound()
,Music:setPitch()
,BattleCutscene:closeText()
,
Utils.wave()
,Event:addFlag()
- Many useful callbacks:
Encounter:onCharacterTurn(battler, from_undo)
,PartyMember:onActionSelect(battler, undo)
,
Encounter:onReturnToWorld(events)
,Encounter:getPartyPosition(index)
,
PartyMember:onActionBox(box, overworld)
,Encounter:onGameOver()
,Map:onGameOver()
Mod:getConfig(key)
,Spell:onSelect(user, target)
,Spell:onDeselect(user, target)
,
Actor:createSprite()
Changes:
- Tension bar colors are now customizeable via the PALETTES table
- Moved
face/noelle_lw
sprites toface/noelle
folder - Added
death
argument toWave:onEnd
- World music now plays in encounters with music set to nil
- Renamed
EnemyTextbox
class toSpeechBubble
- Removed
Battle:spawnEnemyTextbox()
, replaced with[Party|Enemy]Battler:spawnSpeechBubble()
- Renamed
onTextboxSpawn()
,onTextboxRemove()
toonBubbleSpawn()
,onBubbleRemove()
- Removed
- Renamed
BattleCutscene:enemyText()
toBattleCutscene:battlerText()
- Return encounter after cutscene:startEncounter()
- Removed
love.graphics.drawCanvas
, replaced withDraw.drawCanvas
- Renamed
Draw.drawCutout
toDraw.drawPart
(also addedDraw.drawCanvasPart
) - Fixed some floor/ceil issues
- Fixed shader issues on some platforms, thanks to @Dobby233Liu
New Contributors:
- @prokube made their first contribution in #10
- @Dobby233Liu made their first contribution in #13
..and more I likely missed in this list! See the full changelog: v0.6.0...v0.7.0
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.6.0
A long overdue update to Kristal. This update includes a lot of various small changes.
Changelog
Additions:
- Added "Create a new mod" button to the mod menu, which easily creates an example mod template
- Added fixed FPS options (default 60)
- Added right-click context menu to debug selection
- Added copying and pasting objects to debug selection
- Added support for the Tiled features Tile Objects, and Image Collection Tilesets (also tile rotation/flipping)
- Added video assets folder & Video object
Changes:
- Significantly changed camera behaviour
- Camera will now always snap to its follow target while attached
- Make sure to run
cutscene:detachCamera
at the start of your cutscenes, andcutscene:attachCamera
at the end
- The functions which modify TP have been moved to
Game
- The default max tension has been lowered to 100, from 250. Because of this, the "exact" versions of the tension modification functions have been removed, and the normal ones no longer multiply by 2.5.
- Ctrl+Shift+R now reloads from last save, Ctrl+Alt+R full reloads
- Merged Ralsei actor into one actor (just
ralsei
, no moreralsei_ch1
) require
no longer works inside mods to load mod scripts, usemodRequire(path)
orlibRequire(lib_id, path)
- Renamed
onStart
callback from spawning things via wave toonWaveSpawn
- Swapped the
id
andname
arguments ofDebugSystem:registerMenu
- Renamed
Object:isDebugSelectable
toObject:canDebugSelect
- Renamed
Object:getDebugInformation
toObject:getDebugInfo
- Changed
wait
argument ofWorldCutscene:startEncounter
to anoptions
table argument (pass in{wait = false}
to avoid waiting) - Use Player
auto_moving
variable to determine whether followers should keep moving on their own, for theSLIDE
state - Renamed
Event:postLoad
toonLoad
, addedpostLoad
for later
... and much more! See the full changelog: v0.5.1...v0.6.0
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.5.1
Changelog
Changes:
- Renamed
WorldCutscene:switchMap
toWorldCutscene:loadMap
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.5.0
A significant update to Kristal. This update includes a lot of various small changes, as well as the start of a big debug system.
Changelog
Additions:
- Added Debug Menu (ctrl+`, bindable), for easier mod debugging!
- Added Object Selection (ctrl+o or middle-click), to look at object information and drag them around
- Added
equipment
mod option, to easily adjust starting equipment - Added custom mouse cursor and some mouse-related config options
- Added enemy speech bubble customization
- Added config options for most chapter-specific game differences
- Added
[image]
,[offset]
, and[sound]
text modifiers - Added text alignment option
- Added fast-forward debug key (F5)
- Added
Object.timescale
variable - Added
controllers
layer, and ToggleController (toggle
), which shows/hides objects with a flag - Added events:
cameratarget
: locks your camera at a position inside this region (subject to change)hideparty
: fades out followers when inside this regioncybertrash
: same aschest
but Cyber City styledforcefield
: block the player from going somewhere for vague plot reasons👍pushblock
: it wants to be pushed around (but not into a certifiedblockcollision
layer shape)tilebutton
: it wants to be stepped on
- Added callbacks:
Object:onStart
whenever spawned by a WaveObject:getDebugInformation
,Object:isDebugSelectable
,Object:getDebugRectangle
for debug selection- Too many to list for
Actor
- Added various functions:
Object:slideTo
,Object:slideToSpeed
,Object:slidePath
Character:walkPath
,Character:convertToEnemy
Camera:panTo
WorldCutscene:getEvent
,WorldCutscene:getEvents
,WorldCutscene:slidePath
,WorldCutscene:walkPath
World:getEvent
,World:getEvents
Map:getEvent
,Map:getEvents
,Map:getImageLayer
Game:addFollower
,Game:removeFollower
Utils.shuffle
,Utils.mergeMultiple
,Utils.reverse
,Utils.roundToZero
,Utils.roundFromZero
Input.getMousePosition
Changes:
- Removed all
dt
arguments, use globalDT
orDTMULT
instead - Removed
snd_
prefix from all built-in sounds - Script events are now only removed if
once
is true, settemp
to not perma-remove - Replaced
interactscript
andreadable
events withinteractable
- World
transition
function has been renamed tomapTransition
transitionImmediate
renamed toswitchMap
in cutscenes,loadMap
in World
- Made battle name sprites optional
- GameOver has been moved into an Object
- Accurate Light World death screen and save menu
- Use
Kristal.getTime()
or globalRUNTIME
instead oflove.timer.getTime()
aura
property for enemies, to disable the glowing red effectmapflag
property forsetflag
event, to set a map flag instead of a game flag- Item
check
variable to quickly define check text (LW only) - Item
light
variable to define whether the item goes into your light or dark world inventory - Image fonts are now scalable with font size in text
- Allow binding modifiers to keys (like
ctrl+shift+a
) - Console is now accessible anywhere in the engine, and console key is rebindable
- Many adjustments to console text input
... And a lot more I certainly missed because it's been too long since the last release!
Full Changelog: v0.4.1...v0.5.0
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.4.1
Changelog
Fixes:
- Fixed setActSprite offsets being incorrect with the new offsets
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.
v0.4.0
A significant update to Kristal. Most notably this update adds a nearly-complete Light World, as well as all Deltarune items.
Changelog
Additions:
- Light world
- Added light world textbox style (using a UIBox (formerly DarkBox) skin)
- Added light world menu, including items, stats, and the cellphone
- Added systems for converting between light world and dark world items
- Party members have light world stats/LV
- Added almost all Deltarune items to the engine
- Added more values to
HealItem
, addedTensionItem
class
- Added more values to
- Added mini shop menu
- Added Storage menu
- Added enemy transitioning out of battle
- Supported multiple enemies transitioning in
- Added 'auto_spare' option for enemies
- Added lots of getter functions for data classes
- Added item flags, as well as
Item:save
andItem:load
functions - Added
globals
anddrawfx
scripts folders (basically same as objects, just renamed) - Added talk sprite support
Changes:
- Inverted all Actor offsets
- Moved Dark Transition into an Object (WIP)
- Autowrapping text!!!!!!!
- Changed item and spell
target
values - Removed
EnemyBattler.defeat_type
, addedEnemyBattler.exit_on_defeat
boolean instead - Replaced
keepFollowerPositions
withinterpolateFollowers
wait
argument forWorldCutscene:startEncounter
- Various changes to most
Inventory
functions, as well as inventory storage ids shop
setting for mod.json to start game in shop- Textboxes now automatically move to the top of the screen
- Renamed
scene
property tocutscene
- Renamed Map:unload to Map:onExit
Fixes:
- Fixed inputting marker into
WorldCutscene:panTo
- Fixed shop backgrounds
- Fixed master volume not saving
- Fixed Sprite screen wrapping
- ...and more
Full Changelog: v0.3.2...v0.4.0
Instructions
Windows: Download and extract the .zip
, and run kristal.exe
to play
Others: Download and install Love2D, and run the .love
with Love2D to play
Check out the documentation for how to use this engine, and download example-mod.zip
for mod structure, as well as overworld and battle examples.