2.6.1

November 14, 2024

Added

  • .mid file parser now reads pitch bend range controller change messages

Fixed

  • pd→graphics→setPixel() now draws to pushed context instead screen

  • Fixed regression: can once again use nil in modulator setters to clear them

  • fixed inverted rect in LCD_addUpdateRect()! warnings on stdout when text is drawn outside screen bounds

  • fixed serial input slowness causing

  • docs: removed unused gfx.kWrapTruncateEnd

  • fixed language constant mismatch between playdate.getSystemLanguage() and gfx.font language constants (notably, causing DemonQuest85 to throw an error on startup)

  • [MacOS] Fixed the Quicklook plugin for Playdate files

2.6.0

October 21, 2024

Added

  • Added a new "Gather Diagnostic" feature to aid Support in diagnosing system errors

  • API: Added additional width/height, wrap and truncation to Lua drawText()

  • API: Added C API drawTextInRect()

  • Pitch bend info from midi files is now used

  • Added snd.instrument:setPitchBend() and setPitchBendRange() to Lua API

  • Added snd.channel.getDry/WetLevelSignal()

  • Docs: Added install instructions for the SDK

  • The documentation for playdate.graphics.sprite:setAnimator() now indicates that the animator should specify its start and end value using playdate.geometry.points

  • Added signal→newSignalForValue() and synth→clearEnvelope() to C API playdate→sound

Changed

  • "Input Test" and "Send Crash Report" have moved to the new Diagnostic group in Settings

  • The "Device Metrics" option has been moved into the System Settings group

  • Docs: Updated Caps font tool documentation

Fixed

  • Fixed possible crash due when using imagetable:setImage()

  • delayline tap should be stereo if its delayline is

  • Fixed R/L levels for panned mono channels

  • Fixed possible crash on device startup

  • Fixed concurrency issue in C API scoreboard callbacks

  • pdutil is now correctly compiled for x86 on macOS

  • Fileplayers without valid sources no longer crash in certain situations

  • Simulator: Mac: Debugger will now correctly step in to a function from a different file

  • Simulator: Mac/Windows/Linux: Debugger no longer will attempt to resolve a file for internal symbols

  • Fixed playback issues in sample-based synths with short sustain ranges

  • Synth instrument notes scheduled for the future are no longer dropped

  • Can now use C functions for menu items when Lua is active

  • firmware_symbolizer.py no longer assumes it’s being run on macOS

2.5.0

May 23, 2024

Added

  • C API: added graphics→getBitmapTableInfo() for accessing the table’s image count and width

  • C API: added graphics→getBitmapPixel()

  • C API: added shouldFreeData flag to sound→sample→newSampleFromData() to let sample take ownership of data buffer

  • C API: graphics→setDrawMode() now returns the previous setting

  • C API: added graphics→setPixel()

  • Lua: Added playdate.restart() function to restart current game

  • Lua: Added channel level signals to sound lib

Changed

  • Docs: gfx.imagetable:load() now says it loads a new image table, not a new image

  • Docs: added a note stating sound→effect→delayline→setLength() isn’t safe to call while the delay line is in use

  • Docs: explained that playdate.file.exists(path) requires file extension

  • JSON encoder no longer escapes forward slashes

  • Simulators: Removed various update Device Firmware menu items

  • Simulator: Linux: No longer excessively refreshes Device availability on some systems

  • Simulator: Windows/Linux improved http request timeouts

  • C API: sequence→getTempo() returns a float, not int

Fixed

  • Fixed a crash in "Unwrap All" when an OS notification was showing in the Launcher

  • Fixed crash that could occur in some situations when selecting Catalog from the System menu

  • Fixed Replay Intro still running if you choose cancel on the Restart dialog

  • Fixed an issue that could cause the system menu time to be cropped when the battery is very low

  • Instrument voice no longer will scope out while playing

  • Fixed crash loop on device when simulator is showing memory map in device stats

  • Rotated/scaled sprites now update when their source has changed

  • synth:copy() on sample-based synth followed by setWaveform() no longer crashes

  • envelope:trigger() now works as expected

  • Fixed random crash when an empty imagetable is freed after not having all its images set

  • pdc now handles multisegment pdex.elf files

  • import now uses custom environment when called from playdate.file.run/load() with env arg set

  • Fixed typos in 2D vector and affine transform equality test functions

  • Fixed: Keyboard now draws correctly if drawOffset is not (0, 0)

  • Added USB serial RX buffer initialization to fix random serial connection issues

  • Simulator: Mac: fixed possible deadlock when canceling mic recording

  • Simulator: Linux/Windows: Lua Memory sort by size column not sorting as expected

  • Fixed case of readline() in __stub.lua

  • Fixed crashes when using certain sprite APIs when no sprites have been added

  • Docs: Mention the Keyboard doesn’t work at scales other than 1x

  • Docs: Remove example code links on the website docs

  • C Docs: remove playdate→graphics→setSpriteDrawFunction()

  • C Docs: fixed: default refresh rate is 20 rather than 30

  • C Docs: fixed formatting goof making playdate→system→setButtonCallback() function disappear

2.4.2

March 19, 2024

Added

  • Games that are incompatible with the current OS are now listed in Settings → Games, instead of being hidden

  • If the Catalog executable has been corrupted and the user attempts to launch it from the System Menu, the system will now guide the user to download a new version of Catalog

2.4.1

March 7, 2024

Fixed

  • removed null terminator from string passed to playdate.keyPressed

  • reverted change to drawEllipseInRect() that shifted drawn area

  • mkdir, stat, delete, and rename functions now work as expected for paths in the /Shared folder

  • Nova extension: resolved an issue preventing the extension from finding a Lua project’s main.lua and pdxinfo files automatically

  • fixed leaking sound sources

2.4.0

March 1, 2024

Added

  • Nova extension: Support for specifying a completely custom build phase using Nova’s task pipelines for more advanced building options

  • Experimental feature: added read/write access for all games to top-level /Shared folder

  • Added callback for receiving messages via the serial port msg command: playdate.serialMessageReceived() in Lua and pd→system→setSerialMessageCallback() in C

  • C API: added userdata to sound API callbacks

  • Simulator: Windows/Linux: Holding option key while paused and pressing play will render one frame at a time

  • Added direct access to affineTransform’s parameters

  • pdc: added --check-fonts flag to help spot errors in font files

  • Added playdate.setButtonQueueSize() and pd→system→setButtonCallback(), an optional button event queue and callback for more precise button handling

  • C API: added pd→system→parseString()

  • C API: added pd→system→vaFormatString()

  • Added MicSource enum to pd→sound→setMicCallback() to specify internal/headset/autodetect source

  • Added optional source arg ("internal" or "headset") to snd.micinput.startListening()

  • Added sample:decompress() and pd→sound→sample→decompress() so the sample can be used in a synth

  • Added BSD Zero license to Lua and C examples and C build files

  • C API: added copyUserdata callback function to synth→setGenerator()

  • C API: added synth→copy()

Changed

  • Simulators: Updated game controller profiles

  • pdc now sets the mod time for copied files to the source’s so that rsync doesn’t think it changed

  • Docs: Changed lua example code from links to SDK paths

Fixed

  • Simulator: Windows: fixed display scaling issue when text scaling is set at 125%

  • Simulators: No longer send debug key presses when paused

  • Simulator: Mac: Don’t disable Console edit field when controlling the device

  • Fixed incorrect idle value in playdate.getStats()

  • Serial port can now receive more than 64 KB/s

  • Fixed leaks and crashes in sound code by adding retain counts to make sharing objects between Lua, C API and sound lib more flexible

  • Fixed rounding problems in gfx→drawEllipseInRect() causing center and 90 degree drawing issues

  • sequence:addTrack() returns the created track now like it’s supposed to

  • fixed snd.envelope:trigger()

  • common.mk added -g to build gcc flags to generate debug symbols

  • Fixed frequency wraparound at 5513 Hz on noise synths

  • C API: fixed possible stack overflow when calling sprite→setImage() when Lua is active

  • Fixed stalled ADPCM playback when file end syncs with audio frame

  • Simulator: Windows/Linux add graphics→display() support

  • Copied sample synths and wavetable synths now work correctly

  • Fixed crash when sequence tracks with control signals assigned are freed

  • Add the pdz extension to the path passed to file.run() or file.load() if it isn’t already there

  • C API: changed pd→sound→loadMidiFile() to pd→sound→loadMIDIFile() for consistency

  • Simulator: Mac: fixed possible exception when plugging in a controller with the preferences window open

  • Fixed animator jitter in axis-aligned linear interpolation

  • Simulator: Mac: No longer refresh Malloc Log window when it’s closed

  • Fixed possible hang in fileplayer caused by switching from mono to stereo file

  • Simulator: Mac: Fixed FPS graph possibly drawing out of bounds in Device Stats window on Sonoma

  • Docs: expanded description of pd→system→formatString()

  • Docs: attempted to clarify difference between tables and userdata

  • Docs: clarified that repeatCount is a property of the animator

  • Docs: fixed inconsistent styling of \n literal

  • Docs: merged duplicate sprite:moveWithCollisions() functions

  • Docs: noted that playdate.setDebugDrawColor() values are in the range 0-1

  • Docs: updated description of playdate.getStats()

  • Docs: removed broken link to animator.lua single file example

  • Docs: fixed return type for fileplayer→getOffset()

  • Docs: noted that MIDINote is a floating point value

  • Docs: added note that we always use forward slashes for path separators

  • Docs: note that you clear the drawing stencil with pd→graphics→setStencil(NULL)

  • Docs: note that you clear modulators by setting them to nil/NULL

  • Docs: LCDSpriteDrawFunction uses PDRect, not LCDRect

  • Docs: added note that sprite draw callback isn’t called if sprite doesn’t have a size set

  • Docs: autolock timeout is now 3 minutes

  • Docs: fixed the remaining places where our previous formatting change had duplicated descriptions

  • Docs: added PDMenuItemCallbackFunction typedef to system menu section

  • Docs: added missing [extend] to geometry.arc:pointOnArc()

  • Docs: fixed link to SoundSource in playdate→sound→removeSource()

  • Docs: fixed return type for a bunch of C API sound functions

2.3.1

February 7, 2024

Fixed

  • Fixed sample overrelease (and subsequent crash) after using C API function pd→sound→sample→loadIntoSample()

  • Fixed performance regression due to tracking of source image changes on scaled sprites

2.3.0

February 5, 2024

Added

  • Added an Unwrap All option the system menu

  • Simulator: Windows/Linux: Samples can now be saved from the Sampler window

Changed

  • Crank noise filtering is now only applied when it’s moving slowly

  • table.getsize() now reports hash size 0 for empty tables

  • Fixed compiler warning in C API JSON example

  • Simulators: Now disable screen record button if the Simulator is paused

  • Simulators: Will no longer attempt to connect to a device if the device is in use by Mirror

  • Simulator: Mac: Now uses a fixed width numeric font in Device Info window

  • Simulator: Mac: Updated Device Info window colors to match Windows/Linux

  • Simulator: Linux: Moved preference file to standard XDG location usually in ~/.config. Note: the ~/.Playdate Simulator folder may be removed and the app preferences will be reset on first launch

  • Simulator: Windows/Linux: The Volume icon now matches the text color if not using device colors and other minor UI tweaks

  • Simulator: Windows/Linux: Upload Game to Device…​ no longer allows uploading folders that don’t end in .pdx

  • Added custom table functions to __stub.lua

  • Optimization: mp3 decoder is now using builtin CLZ op

Fixed

  • Updated documentation for playdate.graphics.animator:valueAtTime(time) to indicate that time should be specified in milliseconds rather than seconds

  • loadIntoBitmapTable() returns an error message if the file is not loaded

  • Fixed formatString leak in C API Sprite Game example

  • Controlling the device crank with the Simulator no longer spams console with OK messages

  • 90 degree rotated image now draws correctly when top of source image is clipped

  • playdate.graphics.drawarc() in CoreLibs/graphics.lua now respects clockwise argument

  • Fixed an out of bounds read causing tiny audio glitch in an extremely rare case

  • Scaled/rotated sprites now redraw when source image is updated

  • Fixed a hang when audio task is loaded down

  • Fixed problem with skipped drawing when using drawTiled() with a stencil

  • snd→fileplayer→setLoopRange() now works correctly when called before play()

  • playdate.timer now continues from paused value when calling timer:start()

  • synth:getEnvelope() no longer causes subsequent error on synth:playNote()

  • Fixed screen redraw weirdness with overlapping sprites and visibility changes

  • Fixed a problem with stale dirty rects causing redundant drawing when sprites go off-screen

  • Non-integral sprite positions now round to negative instead of towards zero so they don’t stutter at the edge of the screen

  • Fixed an overrelease in sample-based synth:copy()

  • Settings > System > Replay Intro no longer replays the intro when returning to the launcher after Cancel is selected

  • Fixed a visual issue when unwrapping games with an incorrectly-sized card image

  • The "New Games" LED indicator light will now turn off more reliably after unlocking and re-locking

  • Fixed several instances in CoreLibs where variables were being leaked

  • Launcher card highlight animation stops on incorrect frame when a loopCount of 1 is specified

  • Simulator: Mac: now pauses while the screenshot save modal dialog is up

  • Simulator: Windows: Fixed malloc pool limit not working

  • Simulator: Windows: Fixed possible error dialog appearing when using the device as a controller

  • Simulator: Mac: Fixed malloc pool item count not updating when in map view

  • Simulator: Mac: audio no longer stops working if mic recording is requested without a mic attached

  • Simulator: Mac: playdate.simulator.getURL/openURL no longer crash if passed null values

2.2.0

January 9, 2024

Added

  • C API: added MINGW target to C_API/buildsupport/playdate_game.cmake

  • Simulators: Various slight interface tweaks, including macOS accent color

  • Simulators: Added cmd/control+G keyboard shortcut to Get Screenshot menu item

  • Inside Playdate: Added note to indicate keyboard is only designed for 1x display scale

Changed

  • sampleplayer:playAt() with volume set overrides the default player volume, set/getVolume() only affect the default volume

  • Simulator: Windows/Linux: no longer open a connection to the microphone until a game requests it

  • C API: Makefile clean now deletes the built dylib/so/dll/bin from the Source folder

  • C API: CMake clean when building for ARM now deletes the .pdx folder

  • C API: Makefile make device and make simulator targets always create a .pdx folder

  • C API: Makefile make pdx target now just runs pdc on the Source folder

  • Inside Playdate: sampleplayer:playAt() now explains that the "when" arg is relative to the audio time base, not an offset into the future

  • Inside Playdate: sampleplayer:playAt() notes that only one note can be queued

  • Inside Playdate with C: added explanation of pixel format in getDebugBitmap()

  • Inside Playdate with C: changed where the macOS SDK installer puts the ARM toolchain from /Applications/ARM to /usr/local/panic

  • Inside Playdate with C: cleared up build targets description

  • Inside Playdate with C: reordered to help with the order of operations when first configuring the build system

Fixed

  • Fixed 24 hour clock redraw issue in the system menu

  • Fixed possible crash on rev 2 devices when waking up from deep sleep

  • Improved image:drawBlurred() performance on rev 2 hardware

  • sprite:setRotation() no longer messes up a previous sprite:setScale(xscale,yscale) call

  • Fixed compiler warning in C API JSON example

  • Fixed keyboard display issues when the draw offset is not (0, 0)

  • Fixed update rect computation in gfx.fillPolygon()

  • Fixed a problem with skipped drawing when using drawTiled() with a stencil

  • Fixed an error trying to set padded stencil image with unpadded width < 32

  • Fixed a problem with empty tilemap images being considered opaque, leading to sprite drawing glitches

  • Fixed leaking note data in playdate.sound.track

  • Fixed a bad reference in lua→pushSprite()

  • Fixed noise in twopolefilter output when mix is between 0 and 1

  • Fixed a memory management issue in launcher that could lead to crashes

  • Fixed case of readline() for __stub.lua in the docs

  • Fixed hash collision in snd.channel:addEffect() causing effects to potentially scope out and crash while in use

  • Fixed some font glitches in the SDK/Resources/Fonts folder

  • Sustain range in sample-based synths is now aligned correctly, no longer makes clicking noises

  • pd→sound→noteOff(synth,0) now works as expected

  • Fixed rotated image being drawn in the wrong place when center param is off center, x or y scale is -1, and rotation is close to a 90-degree increment

  • Fixed an issue that would cause needless work to be done if the crankIndicator is drawn after not having been drawn for a long time

  • Fixed a leak when using ADPCM files in a sampleplayer

  • C API: snd→effect→getUserdata() now returns userdata that was passed to snd→newEffect()

  • C API: removed broken and confusing LCDMakePattern() macro

  • Simulators: Fixed dangling pointer bug causing C API gfx→drawText() to draw incorrectly or crash after reloading game

  • Simulator: Windows: Simulator now correctly reports crashes

  • Simulator: Windows: Improved reliability of firmware updates

  • Inside Playdate: synth.new() now points out that sustain range values are in sample count units

  • Inside Playdate: fixed misformatting in "Lua assignment operators" section

  • Inside Playdate: Fixed contrast between <code> element and background in Dark Mode

  • Inside Playdate: removed out of date comments in "A Basic Playdate Game in Lua"

  • Inside Playdate: fixed default frame rate in display.setRefreshRate()

  • Inside Playdate: removed extra args from id tag for delayline:addTap and delayline:setFeedback

2.1.1

November 3, 2023

Fixed

  • Simulator: Mac: fixed Console log output not appearing in macOS Sonoma

  • Simulator: Mac: various fixes for interface issues in macOS Sonoma

2.1.0

October 25, 2023

Added

  • Added a new a Notification Light section to Settings

  • Added wavetable synthesis to sound engine

  • Added new playdate.ui.crankIndicator:getBounds() method

  • Added setStartPhase() to LFO

  • C API: added pd→graphics→getTextTracking()

  • C API: added sprite→setCenter() and sprite→getCenter

  • Simulator: Added a dev email list sign-up

  • Docs: sprite draw callback description now explains that the rect args are in sprite-local coordinates

  • Docs: added playdate.timer.paused property

  • Docs: clarified that setColor() and setPattern() are mutually exclusive

Changed

  • Simplified the interface for playdate.ui.crankIndicator, replacing :start() and :update() methods with just a :draw() method, and removed the dependency on playdate.timer

  • Added disk buffer to json encoder, making json.encodeToFile() and playdate.datastore.write() 3x faster on device

Fixed

  • Fixed a memory leak in playdate.ui.gridview

  • playdate.graphics.drawArc() in CoreLibs/graphics.lua now respects arc’s clockwise flag

  • sequence:setTempo() now handles floating point values, sets play offset correctly

  • image:drawFaded() with an inverted image now works as expected

  • Improved __stub.lua file so it is valid Lua

  • playdate.ui.crankIndicator animation speed is now independent of refresh rate

  • playdate.ui.crankIndicator now displays properly at 2x, 4x, and 8x scales

  • Docs: image:addMask() default value is true/opaque instead of transparent

  • Docs: fixed link in coroutine usage example

  • Docs: fixed typo in playdate.sound.envelope:setRelease()

  • Docs: Inside Playdate no longer says SDK contains "The latest firmware image for the console hardware"

  • Docs: fixed sprite:updatesEnabled()

  • Docs: it’s pd→graphics→getDisplayBufferBitmap(), not getDisplayFrameBitmap()

  • Simulator: Windows: improved device eject handling

  • Simulator: Mac: fixed gameWillTerminate() breakpoint getting hit on game startup when debugging with VSCode in some cases

  • Simulator: Mac: Fixed width of last column of Sampler tables

  • Simulator: Mac: OS no longer goes to sleep when using device as controller

  • Simulator: fixed a premature free of a custom system menu on quit

  • Simulator: Windows/Linux: Fixed firmware version string comparison issues

  • Improved image:drawBlurred() performance in some cases

  • File-based system update now works correctly from a crash screen

  • Fixed crash when trying to play a sample player with nothing set to play

  • Fixed bug causing incorrect register values in crashlog.txt

2.0.3

August 23, 2023

Added

  • pdc: added -I/--libpath command line flag and PLAYDATE_LIB_PATH environment var for adding an import path outside the project or SDK

Fixed

  • Fixed an issue where the battery percentage indicator may not reach 100% when the Playdate is fully charged

  • Fixed a CoreLibs grid view edge case calculation that could result in the content width and height being set incorrectly

  • Fixed leaking sound object after closing keyboard

  • pdc: fixed handling of import statements in files accessed via .. paths pointing outside the project root

  • Fixed the size of the card.png image in the Pathfinder example project

  • Fixed a display error that occurred when re-downloading uninstalled games

  • Simulators: Fixed an error when showing the game meta data dialog

  • Fixed a memory leak in playdate.ui.gridview

  • Fixed error trying to set padded stencil image with unpadded width < 32

2.0.2

(Internal-only release)

2.0.1

July 10, 2023

Changed

  • Launcher: list view icons now switch to their highlighted state immediately when the selection changes

  • Launcher: Improved scrolling performance when holding the up or down buttons

  • Simulator: Mac/Windows/Linux the device activity window no longer floats above all OS windows

Fixed

  • Simulator: Windows improved performance in 3x or fullscreen modes

  • Simulator: Window/Linux fixed a regression where the preferences file was not written to disk

  • Simulator: Windows/Linux fix possible crash on quit

  • pdc: fixed problem with files imported more than once via different paths

  • pdc: .. in import path is now handled correctly so that file names in errors aren’t ridiculous

  • pdc: fixed bug requiring lua file extensions when import path contains a period

  • pdc: fixed processing of pdex.elf files with more than one segment

  • pdc: no longer get a missing file build error using nmake on Windows

  • Fixed bug in HTTP library causing outgoing headers to be truncated

  • playdate.graphics.tilemap:draw()'s sourceRect argument is no longer affected by the current draw offset

  • Fixed leaked path string when cleaning up fileplayers

  • Fixed graphical glitch in C API 3D example

  • Fixed rare crash when plugging in headphones

  • A device with a very large number of games installed should no longer crash when viewing Settings > Games

  • Fixed a crash that could occur in Settings > Games when the game list is being refreshed

  • Fixed a floating point precision issue with the sprite collision system that could cause unexpected collision behavior

  • Fixed some visual glitches when switching launcher view modes or opening the system menu while a game unwrap animation is active

  • Screen no longer blanks after exiting from a game to the launcher

  • Fixed an issue that could cause the wrong game to be selected when switching between view modes right after a new game has been downloaded

2.0.0

June 12, 2023

Added

  • Adds List View to the launcher; a more compact view of installed games

  • A new binary format for C components of Games to support Rev B hardware

  • Adds extended characters to the Roobert font

  • Adds C API function for clearing icache

  • Simulator: Sampler: C game sampler interface an has improved layout

  • Simulator: Sampler: C game OS symbols are now more accurate

  • Simulator: Sampler: C games now includes OS and Game symbols at the same time

  • Simulator: Sampling C games now color codes game symbols

Changed

  • Fileplayer’s stopOnUnderflow flag now defaults to false

Fixed

  • Sideloaded games without build numbers are no longer offered for re-download continuously

  • Fixed potential buffer overflow in json encoding

  • Fixed a crash that could occur if a game on disk is missing a build number

  • Fixed zero-byte pdex.bin and unnecessary recompile due to dependency issues in common.mk

  • Simulator: Mac: fixes possible crash when sampling Lua games with an invalid Lua stack frame

  • Simulator: Mac: fixes sound not working for some people

  • Simulator: Mac: no longer prompt for mic access at launch

  • Simulator: mic input now buffers 256 byte frames to match device

  • pdc: now shows an error message if a resource fails to copy

1.13.6

May 1, 2023

Changed

  • pdc now errs if fnt file has duplicate character entries

  • playdate.graphics.font:drawText() and playdate.graphics.drawText() now both return width, height values

  • Provide a "Wi-Fi not available" message for some server errors

Fixed

  • sprite:setImage() no longer resets the sprite’s scale

  • Better error handling when turning on Automatic time setting

  • Kerning now works correctly when right-hand character is on a different page from the left and not page 0

  • Added minimum animator duration of 0.001 to avoid division by zero

  • Fixed crash when Launcher cache file has unexpected values

  • Simulator no longer fails an assert after sequence finishes playing

  • snd.instrument.new(synth) now returns the instrument, not the synth you passed in

  • Fixed crash in fillPolygon() in certain cases

  • Fixed a case where the device could become stuck when locked

1.13.5

Apr 19, 2023

Changed

  • Updated group names to be consistent in Launcher and Games screen

  • Direct reader to font:drawText() as an alternative to gfx.drawText() in docs

  • Update Simulator Controller DB mapping

  • Add fps to launchImages documentation

Fixed

  • fixed regression in 1.13.3 causing gfx.sprite.new(tilemap) to fail

  • Mac installer will no longer fail if there are symlinks in previous SDK folder

  • Fixed buttons getting stuck in "down" state if system menu is opened while held

  • pdc import path handling now uses forward slashes on Windows

  • fixed position of images with lopsided left/right padding drawn at 90 or 270 degree rotation

  • Fixed image corruption when setting a mask image with mismatched rowbytes

  • Fixed regression where sprite:setImage() ignores scale factors

  • Fixed leak when calling setMenuImage() multiple times in a row

  • Windows/Linux Simulator: possible deadlock on quit

  • Macos Simulator: indeterminate progress bar doesn’t move in floating status window

  • Windows/Linux Simulator: Possible crash in debugger

  • Windows/Linux Simulator: possible crash with failed pd_malloc in specific situation

  • Simulators: Debugger hangs after lua stack overflow

1.13.4

Apr 10, 2023

Changed

  • Simulator: Mac/Windows/Linux: Added friendly error message when trying to load Catalog games

Fixed

  • Fixed the Clock drifting backward across reboots

  • Fixed an uncommon crash when making requests to Playdate servers

  • Improved read/write reliability when using Playdate disk via USB

  • Fixed some memory leaks when performing background Wi-Fi syncs

  • pdc: fixed regression in transparency handling in animated gifs

  • Removes callback functions from VSCode stub file

  • Fixes varargs in VSCode stub file

  • Fixed muted audio after plugging and unplugging headphones when headphone change callback is set

  • Fixed problem with mic input getting data zeroed out

  • Simulator: Windows/Linux: getDebugBitmap() is now implemented

  • Settings: Changing time to 'update automatically' should trigger a network time sync

  • Fixed gain on delay line taps so that they’re actually audible

  • Fixed crash after changing delay line tap delay time

1.13.3

Apr 4, 2023

Changed

  • Fixed performance regression: Sprites are tables again

Fixed

  • Fixed difficulty spike in Flipper Lifter that arose from performance regression

  • Fixed battery drain that occurred while device was locked if no Access Point was available

1.13.2

Mar 6, 2023

Added

  • Adds a “new” group to the top of the Settings > Games screen when there are pending downloads

  • Adds auto-refresh when launching into Games screen

Fixed

  • Fixed a possible hang in Spellcorked

  • Fixes an issue that would cause the Launcher to refuse to scroll after unlocking the device

  • Fixes a crash when the device is locked during a game’s launch animation

  • Fixed game card layout issues that could occur if device was locked immediately after a reboot

  • Fix crash that can occur when a game uses the filesystem while also downloading to a file

  • Fixed an issue updating a game if Settings was launched while the game’s card was animating

  • Fixed a hang returning from the system menu after a fileplayer is paused in playdate.gameWillPause() and restarted in playdate.gameWillResume()

  • Fixed issue with looping sample players stopping spontaneously

1.13.1

Feb 22nd, 2023

Fixed

  • Settings app: Studio now displayed on game detail screen

  • table.indexOfElement() can now find userdatas (e.g. sprites, as of 1.13.0)

  • Fixed stack error in playdate→lua→callFunction()

  • Fixed issue with sprite x/y/width/height properties not updating correctly, leading to miscalculated collision rects and displaced sprites

  • Setting sprite subclass’s image in its init function by passing it to super.init() now works again

  • Fixed integer overflow in snd.sequence:goToStep() causing it to not work correctly for large step offsets

  • snd.removeEffect() works again

  • Simulator: Windows/Linux: Upload game to device now launches with the correct path

  • Simulator: Windows/Linux: Breakpoints weren’t working as expected

  • Simulator: Windows/Linux: Fixed possible crash reloading the Simulator

1.13.0

Feb 9th, 2023

Added

  • The system will now prompt the player to plug in when the battery percentage falls below 10%

  • The Launcher will now show a notification at the top of the game list if a system update is available

  • Perform automatic retries for failed firmware update

  • Added user instructions on-screen when in disk mode

  • Added time functions to C API to match Lua

  • Lua warn() function now logs a message to the Console

  • Simulator: Windows/Linux: Can now use a debugger to debug Lua games using the debug adapter protocol

  • Simulator: Mac/Windows/Linux: Debugger now supports Log Point messages

  • Simulator: Mac/Windows/Linux: While in a debugger, a Lua exception backtrace is logged to the debug console before the breakpoint is hit

  • Simulator: Mac/Windows/Linux: Debugger autocomplete now triggers on . and : characters

  • Simulator: Windows/Linux: can now change the Console font

  • Simulator: Windows/Linux: can now disable sending crash reports

  • Added smart quotes to system fonts

  • Added playdate.shouldDisplay24HourTime()

  • pd→lua→getArgObject() can now be used with all Playdate object types

  • Renamed pd→lua→set/getObjectValue to pd→lua→set/getUserValue

  • Added new vector constructor, playdate.geometry.vector2D.newPolar(length, angle)

  • Updated sprite docs to indicate that tags are limited to the range of 0 to 255

  • Added curvature parameter to synth envelopes for better plucked/percussive type sounds

  • Added playdate.getFPS() to complement playdate.drawFPS()

  • CoreLibs/keyboard.lua now has key repeat functionality

  • Added rate scaling and velocity sensitivity to synth envelopes

  • Simulator: Mac/Windows/Linux: Added "Wrap Current Game" for testing wrapping patterns

  • Simulator: Mac/Windows/Linux: can now update device firmware for diagnostic purposes

  • Added snd.track:removeNote() and snd.track:clearNotes()

  • Added snd.sequence.setLoops(count) variant, which loops the full sequence

  • snd.sequence:addTrack() with no args now creates and returns a new track

  • Docs: added playdate→sound→sequence→get/setCurrentStep()

  • Simulator: Windows/Linux: now logs messages to stdout

  • Added optional "extend" flag to pointOnLine/Arc/Polygon() functions to allow returned point outside of line/arc/polygon

  • Add an escape hatch for firmware update failures due to eMMC issues

Changed

  • The Delete Game Data button is now always visible, even before the size has been calculated

  • Output to device speaker is now both channels mixed, not just left channel

  • Increase Wi-Fi Sync Period to 10 hours from 6

  • Updated description of buildNumber in pdxinfo to indicate it is required for sideloaded games

  • animation.blinker refinements: stop() no longer sets loop to false; you can now pass default property values to .new() and :start(); setting the .default on a stopped blinker now updates the .on state.

  • Simulator: Linux: moved desktop file to /usr/share/applications

  • Simulator: Mac/Windows/Linux: changed game loading behavior to better match the device

  • Simulator: Windows/Linux: playdate.keyPressed(key) now passes in lower case strings to match the Mac Simulator

  • Removed tonewheel.lua from Single File Examples for being uninteresting

Fixed

  • Playdate should show error screen on runloop timeout, not the crash screen

  • Fixed menu navigation strangeness in Settings when holding up or down while locking the device

  • Fixed a visual glitch in the System Menu that could occur when extra menu items had been added

  • Fix a crash when a screenshot fails to save to disk

  • Fixed screenshots for games with a : in their name

  • Fix the clock getting "stuck" if the unlock UI dismisses while a button is held

  • Fixed jumpy accelerometer values in weird unknown case

  • Fix crash when waking up from Shipping Mode

  • Uninstalled games now show the correct status when being re-installed

  • Add better checks for failed firmware updates

  • Headphone output should switch immediately on plug / unplug

  • Fix case where the Low power clock may not draw correctly when there’s a low battery

  • The system menu background image now displays properly if playdate.display.setMosaic() or playdate.display.setOffset() or playdate.display.setOffset() have been set

  • Fixed reference errors when passing image from Lua to C then back to Lua

  • Added missing arguments to the documentation for playdate.ui.gridview:setSelection()

  • pdc: fixed harmless out of bounds read on wav files

  • Simulator: Mac: debug adapter protocol now sends success response to launch request

  • Simulator: Mac: debug adapter protocol no longer advertises it supports the terminate request

  • Simulator: Mac: debugger variables no longer appear with error messages in Visual Studio Code

  • Simulator: Mac: debugger breakpoints are now marked as verified

  • Fixed mismatched arguments between drawLocalizedTextInRect() and drawTextInRect() and a crash in drawLocalizedTextInRect()

  • Data folders and files in the pdx starting with "Data" now work as expected

  • Added running tally to allocator to avoid mallinfo() call, fixing case where it was taking up all available GC time

  • Fixed ignored font argument in drawTextInRect() when using the rect variation

  • getElapsedTime() now represents game time instead of clock time, pausing when game is paused

  • The macOS installer would fail if there were other copies of some system commands

  • Fixed cache thrashing in image blurring functions

  • Sprites are now able to be bounce-collided with more than once during a moveWithCollisions() call

  • Fixed SpriteCollisionMasks example code so that sprites bounce off of wall sprites and remain in frame

  • C API default drawing context is now correctly reset before game launch

  • Lua profiler: samples' frametime is now shown with the correct frame, not off by one

  • sprite:checkCollisions() returning different values than sprite:moveWithCollisions()

  • Fixed weirdness with pushing a synth from C to Lua

  • C docs: fixed synth→getParameterCount() function name, changed "0-based" to "1-based" in synth→setParameter()

  • Device: run serial command doesn’t work with a game with spaces in the name

  • logfunc() no longer divides by zero when string ends with newline character

  • Inconsistencies in readings from the high-resolution timer on-device

  • Clarified documentation for playdate.getPowerStatus()

  • Fixed alignment problem in image scaling algorithm

  • Updated docs for playdate→sprite→getPosition() to indicate it returns floats rather than ints

  • Text no longer clips to 400x240 on offscreen images

  • Fixes incorrect behavior when using the sourceRect argument when calling playdate.graphics.image:draw() after a draw offset has been set.

  • Fixed crash using Lua memory browser with classes registered from C

  • Sprites shouldn’t be added to all sprites table until they’re added to the scene

  • Perform daily NTP sync if Wi-Fi is used

  • Docs: playdate→sound→instrument→newSequence() should be newInstrument()

  • Fixed problem with sequencer:goToStep() going to the wrong step

  • Windows SDK installer will now prompt to install Visual C++ runtime if needed

  • Fixed leak in video player

  • Fixed typo in playdate.graphics.sprite.new() docs: "onscreeen" → "onscreen"

  • playdate.graphics.sprite:overlappingSprites() and playdate.graphics.sprite.allOverlappingSprites() could return incorrect results for sprites using negative coordinates

  • C SDK: Updated several files to allow compiling with C++ < 20

  • C SDK: Fixed possible CMake/Make build errors on Linux

  • C SDK: Slightly simplified ARM building in CMake examples

  • Synths can now play samples created with pd→sound→sample→newSampleFromData() or snd.sample:getSubsample()

  • Fixed an issue causing the wrong touch point to be returned by sprite:moveWithCollisions() and sprite:moveWithCollisions()

  • Simulator: Mac: Fixed possible crash with the Quicklook plugin

  • Fixed a case where the compiler was messing up register usage in compound assignments

  • CoreLibs animator now works correctly with easing functions that overshoot and bounce back

  • Docs: updated default minimum GC time to 1 ms

  • Simulator: Linux: fixed getTime() API

  • Asheville Sans 14 Bold’s asterisk has an extra pixel

  • playdate.geometry vector * transform no longer throws bogus type error

  • C API free() shim should ignore NULL argument

  • C API docs: sprite→free() should be sprite→freeSprite()

  • Simulator: Mac/Windows/Linux: fixed missing allocations in Malloc Log list view

  • Fixed leak when nesting pushContext()/lockFocus() calls with target images

  • Removed incorrect kerning entries in Sasser Slab and Sasser Slab Italic

  • pdc now notices changes to image sequence when deciding whether to recompile image table

  • Fixed sample-based synth playing past end of data

  • Sampleplayer now starts from beginning of play range instead of always offset 0

  • Fixed (again) pushing values from C API while in a Lua coroutine

  • pdc: fixed crash trying to compile an animated gif without a global color table

  • Fixed crash on device when file:readline() sees a \r character

  • Simulator: Windows/Linux: Possible crash when closing main window with active checking for update call

  • Fixed memory access error on device when playing VBR mp3 files with frames < 38 bytes long

  • C docs: sample→loadFile() should be sample→load(), sampleplayer→newSamplePlayer() should be sampleplayer→newPlayer()

  • Simulator: Windows/Linux: Copy Screenshot to clipboard now works as expected

  • Docs: removed incorrect frame arg from LCDSpriteDrawFunction

  • Removed crashy unused code in arcs.lua single file example

  • Fixed typo in playdate.graphics.tilemap:setTileAtPosition documentation

  • Simulator: Windows/Linux: Fixed possible crash when closing Controller preferences editor

  • Simulator: Mac/Windows/Linux: Games/ folder is no longer being created at the wrong location

  • Simulator: Mac: Unresponsive to controller input after pushing buttons mapped to "Crank Clockwise"

  • Simulator: Windows: can now connect to device if COM port is greater than 9

  • Fixed crash when playdate.sound.track is collected, lua error when instrument is collected

  • drawRoundRect() API radius of 0 will now draw a squared corner

  • Fixed glitch in last frame of multiple line segment animator

  • Simulator: Windows: fixed possible crashes when using certain file APIs

  • fixed glitch in fileplayer:getOffset() between when the input hits the loop point and the output loops

  • Fix registration flow on Windows / Linux Simulator

1.12.3

Aug 16th, 2022

Fixed

  • Improved battery performance and energy percentage accuracy

  • Improved button de-bouncing

1.12.2

July 12th, 2022

Fixed

  • Fixed crash that occurs when playing ADPCM file at rate greater than 1

1.12.1

July 5th, 2022

Added

  • Added wrapping pattern templates to Inside Playdate

Fixed

  • Fixed "bad loadlen" warning, possible hang at the end of VBR mp3 playback

  • Fixed a regression introduced in the SDK 1.12.0 release that would cause incorrect rects to be returned from tilemap:getCollisionRects() and sprite.addWallSprites()

  • sampleplayer:setOffset() works correctly with ADPCM files. Again.

  • Animator start time delay is no longer doubled

  • Changed README.md on macOS to tell users to get the Nova extension from the extension repository rather than from the SDK

  • Looping sound sequences work again

  • Fixed a case where RAM can fail to initialize after being in Disk Mode

1.12.0

June 15th, 2022

Added

  • Added function arguments to the Nova Playdate extension autocomplete

  • Added "__stub.lua" API reference file for improved autocomplete in 3rd party editors

  • Added animator:progress() to CoreLibs/animator

  • Added animator.reverses flag to CoreLibs/animator to enable ping-ponging

  • Added animator:reset() to CoreLibs/animator

  • Added animator:valueAtTime(t) to CoreLibs/animator

  • Added pd→sound→signal for custom PDSynthSignals

  • Added gfx.font.getGlyph()

  • Added showhidden flag to Lua file.listFiles() and C file→listFiles()

  • Added sprite:setStencilPattern(row1, row2, …​) variant to match gfx.setStencilPattern

  • pdc now reads green in a source image as transparent if the image doesn’t already have transparent pixels

  • C API: Added pd→graphics→makeFontFromData() to turn a data blob into a font

  • C API: added LCDOpaquePattern() macro

  • Simulator: Mac/Windows/Linux: support for drag and drop images to preview them on the device

  • Simulator: Windows/Linux: Added button to send Console commands to the device

  • Simulator: Mac: When Controlling device with the Simulator the Console prompt icon now indicates commands are going to the device

  • Simulator: Mac/Windows/Linux: Added help menu item

  • Simulator: Mac/Windows/Linux: Added content warning fields to meta data window

  • Inside Playdate with C: added PDSynthInstrument to list of SoundSource subtypes

  • Added 2 second hold time after docking crank for recalibrating crank angle

Changed

  • pd→graphics→getBitmapData() now returns full width and height, flattens padding if you’re accessing the data

  • Changed "hasMask" arg in pd→graphics→getBitmapData to "mask", returning a pointer to the mask data (or NULL) instead of just a flag

  • Microphone recording LED is now orange and dimmer

  • Removed old compatibility code from playdate.graphics.animation.loop

  • pd→sound→channel→newChannel() now adds the channel to the sound engine, to match the Lua equivalent

  • synth:playNote(0) is now a synonym for synth:noteOff(), in case that’s useful?

  • Renamed luaL_Val in pd_api_lua.h to lua_val

  • Simulator: Mac/Windows/Linux: C API null argument error is now logged to the Console and stops game

  • Simulator: Mac: When running a C game, the Memory button will now open Malloc Log

  • Simulator: Mac: Malloc Log Group by Call Tree and Auto refresh are now off by default

  • Simulator: Mac/Windows/Linux: Updated button artwork

  • Simulator: Mac/Windows/Linux: button key equivalents are now under the buttons instead of inside of them

  • Simulator: Mac/Windows/Linux: no longer pauses when C API update callback returns 0, to match the device and the docs

  • Inside Playdate with C: Minor clarifications to building on Windows and other tweaks

Fixed

  • Playdate sometimes gets stuck on boot logo after needing to plug in to boot

  • Clock not updating or syncing after re-watching the Intro Animation

  • Fixed inaccurate frame timing when Playdate has been on for several days

  • Word clock now correctly rounds up to the next day (and potentially month) when the time is just before midnight

  • Entry to low-power mode is now less susceptible to voltage spikes

  • Fixes an issue that can cause drawTextInRect() to hang on unusually long words

  • Fixed an issue with the CoreLibs function playdate.graphics.drawTextInRect() that could cause text to be drawn outside of the bounds of the specified rect.

  • Fixed gfx.setStencilPattern(alpha)

  • High resolution timer is no longer truncated to nearest millisecond

  • pdc: -m no longer complains about missing main.lua

  • pdc: shouldn’t give warning when copying pdv files

  • pdc: Windows: fixed -k check for card-highlighted\animation.txt

  • Added round end caps to drawn bounds in drawWideLine

  • playdate.graphics.sprite.getCollisionRects() now correctly handles invalid tileIDs

  • Fixed possible crash calling micinput.stopRecording() when not recording

  • pd→sound→synth→setGenerator() now works

  • pd→sound→lfo→setGlobal() now works correctly, updates the lfo in the background whether it’s in use or not

  • Adjusting the delay on an active playdate.graphics.animation.loop now works as expected

  • Fixed obscure graphics corruption bug

  • Mac Installer now removes the quarantine bit during installation

  • Microphone recording LED is turned off when locking the device

  • Fixed a drawing problem on the Settings > Games game detail screen that could cause the version number to wrap to the next line

  • animator:ended() no longer returns true during last loop of repeating animation

  • Device: isDir() value is now 1 or 0

  • Bootloader doesn’t update plug state quick enough, gets stuck on Playdate screen after low power

  • Sprites now respect the setRedrawsOnImageChange flag

  • sequence:setLoops() now uses the loop count argument instead of always looping endlessly

  • Fixed getLength() and getOffset() for mp3 fileplayers

  • Dynamically-built imagetables now work as expected :fingers_crossed:

  • Fixed crash trying to play ADPCM files with negative rate

  • Fixed a visual issue with the default game launch animation

  • Fixed odd case where sprites leave trails

  • Fixed precision issue in file:seek() for offsets > 16MB

  • Fixed problem with repeating tilemap ids when calling playdate.graphics.tilemap:getCollisionRects() or playdate.graphics.sprite.addWallSprites()

  • Fixed incorrect length on adpcm sampleplayers

  • Simulator: Windows: Unicode filenames inside of a game now work correctly

  • Simulator: Windows: Deleting folders recursively now works as expected

  • Simulator: Windows: Fixed crash when attempting to delete a game

  • Simulator: Linux: listFiles() no longer may incorrectly filter or show . and .. files

  • Simulator: Mac: 2x Display menu item has a checkmark when enabled

  • Simulator: Windows/Linux: Improvements to Console log output formatting

  • Simulator: Windows/Linux: Fixed possible crash when getting meta data

  • Simulator: Linux/Windows: Fixed possible crash when using wifi API

  • Simulator: Linux/Windows: Improved reliability of wifi calls

  • Simulator: Windows/Linux: fixed getTime().milliseconds returning 0

  • Simulator: Windows/Linux: fixed possible crash on quit

  • Simulator: Mac/Windows/Linux: Fixed crash when debugDraw is called during a yielded update() with an active graphics context stack

  • Inside Playdate: playdate.timer.allTimers() should have a function icon

  • Inside Playdate: lineSegment.fast_intersection should have dot, not colon

  • Sample code: Fixed drawing glitch in Level 1-1 demo when player hits a ? box

  • Sample code: C API 3D demo no longer throws float→double warnings

1.11.1

May 19th, 2022

Added

  • Games can now optionally show content warnings the first time they are launched

  • SDK: C API: now checks for NULL pointers and logs a warning message

  • SDK: C API: now allows possible optional out arguments to be passed NULL pointers

  • Inside Playdate: explain more about how we use custom file types inside the pdx

  • Simulator: Windows/Mac: computer will no longer sleep the display when using the device as a controller

  • Simulator: Windows/Linux: added a hot key for Upload Game to Device

  • Device: Added a better error message when registering a device with an unrecognized serial number

Changed

  • Inside Playdate: removed redundant setClipRect() call in A Basic Playdate Game in Lua

Fixed

  • Stuck display after unlocking device

  • Side-loaded games zipped using Windows zip may not install properly

  • Crank alignment not being saved to disk correctly in some cases

  • Bug that caused some screenshots to not be saved if a Screenshots folder was not present

  • Issue that could cause games to become uninstalled if the system attempted to download an update while the game was open

  • System menu callback crash if called during a playdate.wait()

  • Potential crash when adding and removing menu items to the system menu

  • Potential heap corruption when using Scoreboards

  • Simulator: Mac: fixed mic recording when using certain mic hardware

  • SDK: Windows: CMake: script wouldn't open games in the Simulator with spaces correctly

  • Simulator: Mac: playdate.setDebugDrawColor() is now reset before loading pdx, not after

  • Simulator: Windows: fixed deleting folders using the API

  • Simulator: Windows: Fixed screenshot saving

  • playdate->system->getAccelerometer() crashes when passed NULL for unneeded axes

  • Simulator: Mac: improved Wi-Fi check in Registration dialog

  • Simulator: Linux: fixed crash when closing the main window when paused and in the background

1.11.0

May 9th, 2022

Added

  • Added playdate.menu:getMenuItems()

  • Simulator: Mac/Windows/Linux: Added the ability to lock thumb stick controller position

  • Simulator: Mac/Windows/Linux: Added dock/undock crank controller button action

  • Simulator: Windows/Linux: Improved error messages when attempting to load an invalid pdx

  • Added "Reboot to Data Disk" to the Settings > System menu

  • Launcher posts alert about old version of Casual Birder instead of launching it

Changed

  • New Lua crash dialog: shows falling blocks UI; user needs to press B to see backtrace

  • When leaving the Settings > Games screen while downloads are in progress the alert dialog now defaults to "Stay"

  • New game unwrap animations are now shown even if the Reduce Flashing setting is turned on

  • Simulator: Windows/Linux: Don’t attempt to re-open apps across SDK releases

Fixed

  • Simulator: Windows/Linux: better support for unicode throughout the app

  • Simulator: Windows/Linux: Console log format now matches the Mac Sim and is less verbose

  • Crank is now correctly mirrored in Upside Down mode

  • Game screenshots work: now using game name instead of bundleID in screenshot filename, and truncating it if it’s too long

  • playdate.ui.crankIndicator now ignores the current draw offset

  • Simulator: Mac/Linux: now puts screenshots in the SDK’s /Disk/Screenshots folder instead of inside the pdx if it’s running from outside /Disk/Games

  • Simulator: Mac/Windows/Linux: fixed possible crash when registering Simulator

1.10.0

April 18, 2022

Added

  • Device LED is now red when recording from mic

  • Added a return value to fileplayer→loadIntoPlayer() indicating whether the given file exists

  • Better management of battery charging to help increase battery longevity

  • Added sprite:setRedrawsOnImageChange() to disable automatic redraw after calling sprite:setImage()

  • IP and MAC addresses are now shown in the Device Info screen in Settings

  • Simulator: added limit of 64 simultaneous open files to match the limit on the hardware

  • The sample is now passed to the snd.micinput.recordToSample()

  • pdc: added note when compiler copies unrecognized file to pdx, -k flag for skipping unrecognized files (and -q for turning off the notice)

  • Datastore.writeImage() gif encoding now supports transparency

  • Simulator: Windows/Linux: map mouse scroll wheel to crank

  • Simulator: Windows/Linux: add update notification dialog

  • Simulator: Windows/Linux: can now retry loading a game on a failed initial load

  • Simulator: Windows/Linux: add Malloc Log tool

  • Added implementations of _malloc_r etc. to setup.c so that libc functions that allocate heap magically work

  • Added warnings to indicate System games cannot be run from outside the System folder

  • The device intro animation can now be replayed from the Settings > System menu

  • Runloop stall error screen now shows Lua stack trace, if it’s available

  • C API: added gfx→setStencilImage() and sprite→setStencilImage() with "tile" flag

  • Added support for reverting to a factory/recovery firmware image

  • Added playdate.getButtonState()

  • Added pd→sound→lfo→setGlobal()

  • Added pd→sound→track→getSignalForController()

Changed

  • Removed unused, undocumented playdate.getFrameTime()

  • Game’s data folder isn’t created until something will be written into it

  • MenuItem:getTitle() returns the original title, not the lower-cased version

  • Device should not be lockable while downloading a firmware update

  • Use a smoothed battery voltage for low power modes

  • More accurate battery measurements with disabled charge/usb power while reading

  • Screenshots are now saved on the data disk in a root-level Screenshots folde

  • Factory reset will only prompt to remove account if the device is registered

  • Added serial number and device-specific QR code to the factory reset screen

  • Simulator: Mac: controller configuration is now located in the Preferences window

  • Replaced fisr() in C API 3D demo with sqrtf(), or vsqrt instruction on ARM

  • GCC will now be used on linux on our Makefile

  • Simulator: Mac/Linux/Windows: Accelerometer is no longer constrained to unit circle, in order to simulate shake events

  • Lua docs no longer describe multiple return values as "tuples"

  • Improved instructional text on Account Registration setup screen

  • Floats that are converted to doubles now get a warning at build time

  • Lua error screen timeout increased to 5 minutes

  • We don’t need to clean the DCache on every audio interrupt

  • Don’t allow new heap allocations when performing emergency GC

  • Pressing B at the main menu in Settings now returns to the Launcher

  • pd→sound→synth→setGenerator() still doesn’t work, but no longer crashes

  • Calling gfx:lockFocus(image) instead of gfx.lockFocus(image) now throws an error

Fixed

  • Fix integer overflow on some SDK-internal data structure capacities

  • Fixed slow number parsing in json decoder

  • Simulator: Mac/Linux/Windows: Fixed accelerometer z value when using device as controller

  • Menu button volume shortcuts button presses no longer leak through to games

  • Simulator: Mac: Games opened in the Simulator will now be added to the Open Recent menu

  • pd→lua→callFunction() no longer drops called function’s return values

  • Long Wi-Fi names now scroll in the Wi-Fi password entry screen

  • Move high score caches out of the game’s data directory

  • Clarify "Wi-Fi not yet configured" message

  • Arguments are no longer cast to ints in geom.point:offset(x,y), geom.polygon.new(x1,y1,x2,y2..), and the geom.distanceFromPointToPoint(x1,y1,x2,y2) functions

  • The game list is now reset when a device is unregistered

  • pdc: \n and \t are now properly translated in strings files

  • pd→file→open() with kFileReadData (and not kFileRead) doesn’t read files from Data folder

  • Simulator: Mac: Device info status queries could stack up if device was temporarily unresponsive.

  • Game download will retry if an invalid partial download is in place

  • Simulator: Mac: Will no longer process input when the simulator is paused.

  • If the menu is open, game audio shouldn’t start after unlocking the device

  • Menu glitch if button is pressed repeatedly

  • SSL Connections shouldn’t fail if device time is incorrectly set

  • Simulator: Mac: No longer clear the registration fields when window is focused.

  • C API: renamed confusing playdate→system→setAutoLock() argument

  • Fixed scaling on PO synths so they’re audible again, added synth.lua single file example back in

  • Simulator: Mac: If Wi-Fi is not configured when attempting to register the Simulator, the error now explains why registration failed.

  • Simulator: Windows: Fixed running from non-primary drive

  • pdc can now handle multiple imports inside one statement (for example in a table constructor)

  • pdc: U+xxxx sequences in fnt files are never marked as whitespace

  • Inside Playdate: updated fnt section to note we support "U+xxxx" sequences and all Unicode up to U+3FFFF

  • Docs: Fixed formatting in playdate→lua→indexMetatable()

  • Added note that playNote() only queues one note, use playdate.sound.sequence for sequences

  • Support timestamps in the filesystem

  • Added explanation of bitmap data format in playdate→graphics→getBitmapData()

  • The exit full screen prompt was drawn in the incorrect location when in full screen mode.

  • Incorrect menu titles immediately after forgetting a Wi-Fi network

  • Fixed duplicated setMaskImage/getMaskImage text

  • CMakeFiles: fixed common.mk fix for No rule to make target 'build/pdex.bin', needed by 'device'

  • Docs: fixed description of fileplayer:getOffset()

  • Heap overflow in gfx.getDisplayImage()

  • Fixes an issue that could leave the device in a stuck state when pressing buttons rapidly while the system menu is closing.

  • Fix a crash due to using Sound Channels and a File/SamplePlayer completing

  • Fixed fileplayer looping (again)

  • Documentation: updated tilemap:getCollisions() description to indicate return value is in tilemap coordinates

  • Simulator: Mac: fixed double error message when load fails

  • Fix FilePlayer when used with an MP3 Stream Source

  • Simulator: Mac: Search function in Lua memory viewer now recurses through tables again

  • Fix a pdc hang that can occur when we get file errors on read

  • Fixed hang that could occur when playdate.graphics.drawTextInRect() was called with a very narrow width argument

  • Fixed regression in mp3 playback breaking decoding for some files

  • Fixed crash due to stack overflow if mp3 decoding fails

  • Release internal references when removing sprites in bulk

  • setBackgroundDrawingCallback() now properly returns the newly created sprite

  • Fix a potential frame skip when using an inverted framebuffer

  • Lua glue now correctly tracks references to multiple playing sound sequences

  • Docs: fixed description of playMIDINote

  • Fileplayer’s getLength() function (both C and Lua) needs to open the file if it isn’t already

  • Docs: leftButtonDown should say "presses" instead of "releases"

  • Docs: fixed typo in fileplayer→loadIntoPlayer()

  • Removed hidden variation selector on double exclamation point character in Asheville Sans 14 Light fnt file

  • Fixed case where markDirty() wasn’t causing an uncovered sprite to redraw

  • Fixed edge cases in polygon:containsPoint()

  • pdc: Mac: -sdkpath is being side stepped

  • Sprite:setStencilPattern() now tiles the stencil image to the entire screen

  • Fixed crash in image:transformedImage() with specific image sizes

  • Calling setImage() on a copied sprite now works as expected

  • Simulator: Windows: improved window layout when using 150% scale factor

  • clipped fillRect() can get bounds wrong

  • Sprites with the same z index should be drawn in the order they were added

  • Mac: the QuickLook icon thumbnail could be positioned off center.

  • Simulator: Windows/Linux: improved simulating refresh rate 0

  • Simulator: Windows: no longer drop frames when interacting with UI

  • Simulator: Windows: C games failed to run out of the Games folder

  • Simulator: Windows: README now mentions the x64 bit C++ runtime

  • Simulator: Windows/Linux: improved WIFI check when registering the Simulator

1.9.3

March 18, 2022

Added

  • Simulator: limit number of open file handles to match hardware

  • CMakeLists files provided for all C examples

  • Document performance considerations around floating point operations in Inside Playdate with C

Changed

  • fileplayer now leaves file closed until data is needed

Fixed

  • Launcher: Fixes a problem that would sometimes cause an new game to animate in over top of an existing game

  • Launcher: Fixes an issue that could sometime cause an unwrap animation to be out of sync with the audio

  • Launcher: Fixes a visual glitch that could occur when the A button was rapidly pressed as the Launcher was starting up

  • Correct support info in Inside Playdate with C

1.9.2

March 16, 2022

Changed

  • Added flag for tiling stencils in setStencilImage instead of always tiling images < screen size

Fixed

  • Fixed missing text glitch while menu animates in

  • Crash when exiting the game list during a game download

1.9.1

March 9, 2022

Added

  • Better logging of firmware update failures

  • Individual values can now be passed to playdate.geometry.polygon:containsPoint, playdate.geometry.rect:containsRect, and playdate.geometry.rect:containsPoint

  • Added gfx.imagetable:setImage(pos, image)

  • Simulator: Windows/Linux Register Simulator dialog now has link to the website

  • Added SoundFormat and helper macros to Inside Playdate with C

Changed

  • Unified keyboard shortcuts in all the Simulators

  • Increase Autolock timeout to 3 minutes

  • Inside Playdate: factored parameters out of list of easing functions

  • If the toolchain fails to download it will be retried

  • Removed error when using error-diffusing dither types in gfx.setDitherPattern()

Fixed

  • Simulator: Mac: Command-right/left arrow no longer rotates the Simulator unexpectedly when in the Console.

  • Fixed a bug where a text formatting character could appear in drawn text

  • snd.getCurrentTime() no longer stops when Simulator volume is set to 0

  • MacOS SDK installer no longer requires Rosetta

  • Changed delay effect mix in Drum Machine example so you hear the notes at the right time

  • Fixed Input Test error when the crank angle is exactly 345 degrees

  • Fixed backward incompatibilities with older games

  • eventHandler declaration in pd_api.h now includes Windows export tag

  • Simulator: Mac: fixed some drawing and timing glitches in animated gif export

  • Simulator: Windows: now correctly include the game controller map

  • sprite:setScale() and :setRotation() now handle opaque images with padding

  • sprite:setScale() and :setRotation() now copy image’s invert flag

  • Update FPU settings in CMake builds

  • Simulator: Windows/Linux: Fixed a crash when using unmapped thumb sticks

  • Simulator: Windows/Linux: Fixed an issue where Playdate settings would not be saved correctly

  • Simulator: Linux: fixed compatiblity with libpng on certain distros which could lead to a crash

  • Fixed bounds checking in imagetable:getImage(x,y)

  • Fix game crashes if /Data doesn’t exist

1.9.0

February 28, 2022

First public release!