TIC-80 v1.2.0
TIC-80 v1.2.0 is a major update since v1.1.2837, adding new scripting options, platform ports, editor and input fixes, and a rebuilt release pipeline.
What's new
- YueScript support added as a scripting language, with contributor credits.
- New language/runtime updates: Lua 5.4, Python bindings v2.1.0, Fennel 1.5.0, Janet, Squirrel, QuickJS, pocketpy v2.0.4, and a Nim WASM template.
- FFT support:
fftandfftsrestored for Python, plus general FFT support. - Editor/API additions:
remap(), flood fill paint, sprite import BPP option, Rubyscrollx/scrollyinmouse(), Wrenmap()with no args,resume reload, autosave Surf carts, JSON options saving, flags editbox, informative screenshot names,rmalias fordel, console wrapped-line indentation, cursor-position search, and Alt caret. - Music editor: more piano-roll notes and a DAW-like keyboard layout, note preview routed to the active editor channel, better track switching, and Caps Lock hex input.
- Touch/gamepad: mobile touch controls for HTML export, gamepad shortcut to Surf/exit Surf, and gamepad state reset.
- PCM sound channel: 128 samples per frame written straight into RAM, played at 7680 Hz,
poked from any language with no new API to learn. - Menu behavior: the pause menu now follows where the run came from, not what the cartridge declares. ESC in a player's run always opens it (a
gametag adds the game's own items), while a run started from the studio,Ctrl+Rorrun, steps back to the editor or console.devmodeis gone. - Byte Battle feature added.
Platform
- Nintendo Switch port added; libretro NSwitch build fixed.
- 3DS port revamped, with updated toolchain and CI fixes.
- Android:
.tic/.pngfile associations, external keyboard arrow keys, Ctrl shortcut fixes, SDL 2.32.10, and Gradle 9.0.0. - Linux:
.tic/.pngassociations, F-Droid badge, openSUSE instructions, and ARM link fix. - macOS: horizontal scroll direction fix, OpenGL backend, arm64 CI, macOS-15-intel image, and updated build instructions.
- Web/WASM: touch controls, Safari arrow keys,
btnp/fgetreturn type, config saving, and templates after thelld --stack-firstchange. - libretro: monolithic static build, frametime/cursor fixes, updated state handling, zlib option, and PNG extension support.
- Baremetal: Raspberry Pi fixes and circle-stdlib update.
Bug fixes
- Fixed memory leaks in TIC/BOOT/BDR callbacks and fs/console/studio; fixed buffer overflow and
strncatissues. - Fixed crashes from ESC during popup hide, custom
--scale, tab completion, #2595, and palette out-of-bounds. - Input: stuck keys on focus loss, Android arrow keys, French AZERTY layout, Alt+1 layouts, Safari arrows, F1 hotkey conflict, and mouse cursor mapping with tab width.
- Editors: sprite hotkeys, map editor tile/tool behavior, bookmarks whitespace, horizontal scrolling with Shift/trackpads, command history visibility, alias autocomplete, and command-line parsing.
- Scripting: Janet/Scheme keyword commas, Python issues #2841/#2856, Wren bindings, Ruby mouse coordinates, Lua traces, deprecated Lua/Fennel features,
tic_modulo,pmemset, andtic_api_memcpy. - Graphics/audio: ttri low bpp, bpp2 import, tilesheet segment offsets, negative texture rounding, font chromakey order, and miniaudio updates.
- File/config: WASM config saving, options JSON,
tic_fs_changediroverflow, Windows XP folder error, and whitespace trimming on save.
Build & infrastructure
- Tag-driven release pipeline with Android signing secrets, itch.io publishing, and self-hosted
/create. - CMake refactored into submodules, with configurable script languages, system libraries, BUILD_SURF/WREN/zlib options, debug options, and fixed optimization flag ordering.
- Updated GitHub Actions, macOS images, Ubuntu 24.04/MSYS2/MINGW/openSUSE docs, Zig 0.14.0-dev, and docker toolchains.
- Vendor updates: SDL 2.32.10, miniaudio, libpng 1.6.43, zlib 1.3.1, zip v0.3.6, QuickJS, Janet, Squirrel, pocketpy, Fennel, and Python bindings.
- Replaced the
msf_gifsubmodule with a single header; addedTHIRD_PARTY_LICENSES/LICENSES; removed sokol support; applied cleanup and.clang-format.
Statistics: 286 commits, 218 pull requests, 64 contributors.
What's Changed
- Increase in possible notes for playing on piano roll, new keyboard layout (like in popular DAWs) by @jejikeh in #2336
- [Python] Fix incorrect signature of
printby @blueloveTH in #2340 - zig: Replace
addSharedLibrarywithaddExecutableby @peterhellberg in #2351 - Upgrade Python language bindings to
v1.3.0by @blueloveTH in #2353 - #2335: added REVERT_SCROLL option to the config by @nesbox in #2355
- #2345: fixed crash with custom --scale parameter by @nesbox in #2356
- fix high fps bug for >60Hz displays by @borbware in #2354
- api/wasm:
writeToStoragedefaults totrue, updatewasmtic_pmemsignature fromi(ii)toi(iI)by @peterhellberg in #2362 - Alt caret by @bonjorno7 in #2373
- #2358: fixed horizontal scroll in the code editor by @nesbox in #2376
- Upgrade Python language bindings to
v1.3.1by @blueloveTH in #2382 - Trim whitespace on save by @bonjorno7 in #2377
- fix horizontal scrolling when using trackpads. by @Wang-Yue in #2393
- Gamepad shortcut to Surf by @LettucePie in #2387
- Use OpenGL backend for macOS by @Wang-Yue in #2390
- Fix typo in max scale calculation by @Wang-Yue in #2391
- Fix horizontal scrolling when press the shift key by @Wang-Yue in #2400
- enumerate all music tab values in switch by @Wang-Yue in #2395
- size_t should print with %zu by @Wang-Yue in #2396
- return 0 when pos is not a valid tab character for removeTab by @Wang-Yue in #2397
- remove unsequenced modification and access by @Wang-Yue in #2398
- pointers should be printed with %p by @Wang-Yue in #2399
- fix memory leak of mainmenu in studio.c by @Wang-Yue in #2404
- Fix memory leak of script in console.c by @Wang-Yue in #2405
- Fix memory leak of script in fs.c by @Wang-Yue in #2406
- fix memory leak of buffer in fs.c by @Wang-Yue in #2407
- Autosave option for keeping carts from Surf by @LettucePie in #2410
- Update Python's time() to return a float instead of an int by @MineRobber9000 in #2412
- Use memmove in tic_api_memcpy by @mbikovitsky in #2417
- add
--target=wasm32-unknown-unknownto README.md by @phocks in #2420 - Upgrade Python language bindings to
v1.3.5by @blueloveTH in #2413 - Make WREN a configurable build option. by @Wang-Yue in #2418
- Split CMake into submodules by @nesbox in #2421
- Added cmake build options for all the supported scripts by @nesbox in #2423
- Fix typo in cmake message by @Wang-Yue in #2424
- Add "self" to the lua syntax by @lipx1508 in #2425
- naett: Allow disabling when curl isn't available by @RobLoach in #2432
- #2383: fixed track number switching by @nesbox in #2442
- Add "rm" as an alias for "del" by @squidink7 in #2449
- Update build.zig by @Angluca in #2460
- Upgrade Python language bindings to
v1.4.1by @blueloveTH in #2459 - Add BPP arg to sprites import by @TheDrawingCoder-Gamer in #2452
- #2444: fixed name for screenshots by @nesbox in #2463
- console: Indent all wrapped lines by @foxeng in #2451
- add remap function by @TheDrawingCoder-Gamer in #2453
- fix 2 bpp import by @TheDrawingCoder-Gamer in #2464
- Makes Rust template
PrintOptionsandFontOptionsstructs fields public by @turbohz in #2474 - Upgrade Python language bindings to v
1.4.2by @blueloveTH in #2477 - PCM sound channel by @nesbox in #2488
- Upgrade Python language bindings to v
1.4.5by @blueloveTH in #2513 - #2257: build languages as shared libs by @nesbox in #2519
- Fix missing dash in build.yml by @aliceisjustplaying in #2525
- #2526: added flags editbox by @nesbox in #2527
- Compile for MacOS arm64 in CI as well by @aliceisjustplaying in #2528
- Fix tab-completion crash with load/save/etc. by @aliceisjustplaying in #2533
- Add various debug options to CMake by @aliceisjustplaying in #2534
- Update zlib to 1.3.1 so TIC-80 compiles with Clang 18 by @aliceisjustplaying in #2535
- Update libpng to 1.6.43 so TIC-80 compiles with Clang 18 by @aliceisjustplaying in #2536
- Update glew in sdl-gpu so AddressSanitizer doesn't error out on it; switch to my fork for it by @aliceisjustplaying in #2537
- Fix autocomplete on command aliases by @aliceisjustplaying in #2538
- bump Janet version to v1.34 by @AlecTroemel in #2539
- Gamepad shortcut to exit surf by @LettucePie in #2542
- README improvements by @aliceisjustplaying in #2543
- Readme improvements (Fedora 40) by @aliceisjustplaying in #2546
- Readme improvements (Ubuntu 22.04, 24.04) by @aliceisjustplaying in #2548
#includemach-o/dyld.hon macOS for_NSGetExecutablePathby @aliceisjustplaying in #2551- SDL: don't ignore briefly pressed keys by @dharrington in #2553
- Fix the error 'folder doesn't exist' under Windows XP (win32 build) by @aliceisjustplaying in #2558
- Scripts as shared libs by @nesbox in #2568
- Fix
surfon win32 builds by @aliceisjustplaying in #2567 - Fix typo in build.yml by @aliceisjustplaying in #2569
- Help improvements by @Skeptim in #2570
- fix horribly broken command line parsing by @Gargaj in #2578
- adds gamepad state being reset by @LettucePie in #2579
- #1950: added 'devmode: on' metatag to disable game menu by @nesbox in #2581
- Readme improvements for Windows by @aliceisjustplaying in #2585
- Add infos in README to the unofficial linux/arm64 nightly builds by @aliceisjustplaying in #2586
- #2584: add 'of' js keyword by @nesbox in #2587
- libretro: Update libretro.h header files by @RobLoach in #2588
- libretro: Replace clock() with frame time callback by @RobLoach in #2589
- libretro: Update the libretro state values by @RobLoach in #2590
- libretro: Use memset() to set the initial TIC-80 state by @RobLoach in #2591
- libretro: Update the list of static language libraries by @RobLoach in #2592
- Hotkeys topic in help by @Skeptim in #2594
- Fix for Arrow keys not working on android. by @Pedrocasf in #2593
- libretro: Add
BUILD_WITH_ZLIBoption to allow disabling zlib link by @RobLoach in #2596 - Save options as json to .local folder by @nesbox in #2597
- Update MSYS2/MINGW build instructions; misc updates by @aliceisjustplaying in #2598
- #2595: crash fix by @nesbox in #2599
- #include mach-o/dyld.h when on macOS for _NSGetExecutablePath (needed for Clang 18) by @aliceisjustplaying in #2600
- Debug scripts for Windows + macOS by @aliceisjustplaying in #2601
- Feature: Byte Battle by @aliceisjustplaying in #2602
- #1950: removed devmode and game menu by default, game menu will be shown if the 'game' tag exists in the tags section by @nesbox in #2603
- .gitignore updates by @aliceisjustplaying in #2605
- add .clang-format by @aliceisjustplaying in #2606
- Feature: FFT support by @aliceisjustplaying in #2607
- Implement "resume reload" command. by @technomancy in #2609
- Mention reload argument in resume help text. by @technomancy in #2610
- Add a check to draw.c:getPalette so it does not write out of bounds past the mapping static array into whatever static happens to come after: Fixes #2611 segfault by @OvermindDL1 in #2619
- Update Fennel to version 1.5.0. by @technomancy in #2620
- Fix wren bindings by @aliceisjustplaying in #2623
- Fix
elliandellibbindings in wren by @aliceisjustplaying in #2625 - fix sprite editor hotkeys when selecting by @Miguel-hrvs in #2626
- Fix changing tile in map editor changes tool + not needing to hold shift to show tiles by @Miguel-hrvs in #2631
- Fix ci 3ds and rpi builds by @Miguel-hrvs in #2638
- Avoid command from history not fully visible at the bottom by @Miguel-hrvs in #2627
- Fix changing tile in map editor changes tool for real by @Miguel-hrvs in #2637
- fix bookmarks include whitespaces at the beginning of the name by @Miguel-hrvs in #2642
- fix cart.png palette inconsistency with custom config by @Miguel-hrvs in #2643
- add Nim Wasm template by @janAkali in #2645
- Fix f1 hotkey conflict by @Miguel-hrvs in #2646
- fix some strncat vulnerabilities by @Miguel-hrvs in #2648
- font() chromakey argument order in python fixed (#2634) by @Gaiko-sw in #2653
- Readme dependencies typo fixed by @Gaiko-sw in #2651
- Fix buffer overflow in
tic_fs_changedirby @aliceisjustplaying in #2658 - Update debug_macos.sh by @aliceisjustplaying in #2659
- Proposal: remove support for
sokolby @aliceisjustplaying in #2662 - Fix TIC-80 when using a French AZERTY layout by @aliceisjustplaying in #2663
- Cleanup: remove all trailing spaces from the source code by @aliceisjustplaying in #2664
- Revert to correct
demos/bunny/wasmmark/wasmmark.wasmby @aliceisjustplaying in #2666 - Fix issue with alt+1 on certain layouts by @aliceisjustplaying in #2665
- Search from cursor position + go to the top if ended going down with … by @Miguel-hrvs in #2671
- debug-linux.sh by @aliceisjustplaying in #2672
- Update
sdl-gpu; unbreak Wayland (partially) by @aliceisjustplaying in #2673 - Update to Zig 0.14.0-dev, run through
$ zig fmtby @Des-Nerger in #2675 - fix tic_modulo by @anescient in #2676
- fix incorrect rounding on negative texture coordinates by @anescient in #2679
- break out fs_isdir and use it to test fs argument by @anescient in #2680
- add map() with no args to wren api class by @anescient in #2687
- add scrollx and scrolly to ruby mouse() by @anescient in #2692
- flood fill paint function by @anescient in #2683
- Update lua to latest v5.4 by @Miguel-hrvs in #2693
- Update squirrel to master branch by @Miguel-hrvs in #2694
- Fix ruby mouse coordinates by @anescient in #2698
- update to latest circle-stdlib by @Miguel-hrvs in #2697
- Use debug.traceback for stack traces in Lua-based carts. by @technomancy in #2705
- Upgrade janet to current master head by @AlecTroemel in #2709
- Update 3ds docker toolchain by @Miguel-hrvs in #2701
- Use O3 + flto with all but msvc by @Miguel-hrvs in #2696
- Add openSUSE instructions and refactor README by @fentras in #2712
- update pocketpy from v1.x to v2.0.1 by @PrimedErwin in #2714
- fix bpp2 by @TheDrawingCoder-Gamer in #2715
- Enable janet in mingw by @Miguel-hrvs in #2722
- Swap LUA_COMPAT_5_2 for LUA_COMPAT_5_3, since we're in Lua 5.4 now by @MineRobber9000 in #2728
- updated pkpy to v2.0.4 by @PrimedErwin in #2730
- Lua API: Explicitly zero local array by @YoshiRulz in #2740
- use -O2 and add arm64 build by @Miguel-hrvs in #2745
- Fix OPT_END() missing without BUILD_EDITORS flag by @kawaii-Code in #2748
- Allow build with system libraries by @iyzsong in #2758
- Fix deprecated features for lua/fennel by @iyzsong in #2759
- Update Ubuntu 24.04 build instructions by @marcosvpj in #2764
- Baremetal Pi fix by @josei in #2763
- QuickJS update by @nesbox in #2776
- Add F-Droid download badge by @rugk in #2783
- doc: Fix Linux/ARM link as it is broken by @rugk in #2787
- Upgrade Python language bindings to
v2.1.0by @blueloveTH in #2795 - Fix debug scripts by @aliceisjustplaying in #2809
- Refactor
python.cand fix bugs by @blueloveTH in #2801 - Update SDL to release-2.32.10 (pipewire fix) by @imsys in #2827
- Informative screenshot filenames by @imsys in #2826
- Libretro cursorfix by @imsys in #2822
- Fix saving options to JSON by @Softkandi in #2790
- Update macOS build instructions by @WillGreen in #2788
- [libretro] Fixes frametime (and weird bugs) by @imsys in #2829
- Replace msf_gif submodule with single header (–711 MiB) + macOS build fix by @imsys in #2833
- [Android standalone] update SDL files to v2.32.10 by @imsys in #2831
- [Android] Associate .tic files to TIC-80 app by @imsys in #2834
- [Linux] Associates .tic and .png to TIC-80 by @imsys in #2835
- [Android standalone] fix association of .tic and .png to TIC-80 app by @imsys in #2837
- Informs retroarch that PNG extension is also supported by @imsys in #2832
- [Android] Update gradle and gradlew to v9.0.0 by @imsys in #2836
- [web export] Fix Safari Arrow keys in HTML export/webapp by @CarlQLange in #2838
- [.github/workflows] macos-arm64 -DCMAKE_POLICY_VERSION_MINIMUM=3.5 by @imsys in #2846
- sokol branch 258 tile esc key mouse flicker fix by @Miguel-hrvs in #2849
- [demo] Fix minor mismatch between Fennel and other demo carts by @ckoparkar in #2851
- Fix faulty implementation of pmemset by @aaneeley in #2852
- Add YueScript as an additional scripting language by @Kaleidosium in #2743
- Add credits for YueScript support contributors by @Kaleidosium in #2854
- Fix build with Pro=On + Editors=Off (#2862) by @MikanHako1024 in #2863
- Revamp the 3DS port by @carstene1ns in #2864
- Migrate to macos-15-intel github action image by @carstene1ns in #2865
- Add Nintendo Switch port by @carstene1ns in #2866
- [cmake/mruby.cmake] Replace
exec_program(deprecated) by @Rhys-T in #2869 - Fix WASM btnp and fget return type by @t-mw in #2875
- Fix old python issues #2841 and #2856 by @blueloveTH in #2878
- Update vendor/zip from v0.1.19 to v0.3.6 by @Kaleidosium in #2883
- [CMake] Fix optimization flag ordering to respect user-specified -O flags by @imsys in #2885
- Fix crash when pressing ESC during code editor popup hide animation (Fixes #2881) by @TetherIO in #2887
- Bump miniaudio version by @sknebel in #2888
- Fixes libretro NSwitch build by @imsys in #2891
- docs: clarify map remap callback behavior across language bindings by @RDeckard in #2894
- Fix music editor hex input with Caps Lock on by @RDeckard in #2895
- [Fix] [Android] prevent extra character insertion on Ctrl shortcuts by @RDeckard in #2896
- [Fix] [Android] restore external keyboard arrow keys by tightening joystick classification by @RDeckard in #2897
- [Fix] [Console] generate help version runtime strings from CMake sources by @RDeckard in #2898
- [Fix] [Music] Route note preview to the active editor channel by @RDeckard in #2899
- [Fix] [SDL] Reset keyboard state on focus loss to avoid stuck keys by @RDeckard in #2900
- Restore
fftandfftsfunctions for python by @MartinRykfors in #2902 - Add THIRD_PARTY_LICENSES documentation and LICENSES directory by @TetherIO in #2904
- Baremetal build fix by @imsys in #2907
- Creates the BUILD_SURF build option by @imsys in #2889
- [Fix] [Code] align mouse cursor mapping with tab width by @RDeckard in #2901
- [Fix] [macOS] correct horizontal scroll direction by @RDeckard in #2903
- Implement monolithic static libretro build by @imsys in #2905
- Fix WASM templates after lld --stack-first default change by @RayenChalouati in #2906
- Fix saving config in web version (wasm) by @imsys in #2909
- Upgrade GitHub Actions by @imsys in #2910
- Sort files alphabetically when surfing. by @imsys in #2911
- Allows for '.' in lua outlines. by @CDVoidwalker in #2914
- Fix ttri in low bpp, use segment offsets in tilesheet accessors by @ddelemeny in #2921
- Added mobile touch controls for html export from @matstc by @RobinScaletta in #2924
- Update GitHub username for Andrei Rudenko by @AndreiRudenko in #2929
- Fix missing comma in JanetKeywords and SchemeKeywords arrays by @imsys in #2954
- Fix Memory Leak in TIC/BOOT/BDR .. Callback Functions When Variable i… by @hadamak in #2966
- Release pipeline: tag-driven builds, itch.io, self-host /create by @nesbox in #2991
- release notes: our summary first, GitHub's pull request list after by @nesbox in #2996
- release: the tag path hands the android signing secrets to the build by @nesbox in #2997
New Contributors
- @jejikeh made their first contribution in #2336
- @peterhellberg made their first contribution in #2351
- @bonjorno7 made their first contribution in #2373
- @Wang-Yue made their first contribution in #2393
- @LettucePie made their first contribution in #2387
- @MineRobber9000 made their first contribution in #2412
- @mbikovitsky made their first contribution in #2417
- @phocks made their first contribution in #2420
- @lipx1508 made their first contribution in #2425
- @squidink7 made their first contribution in #2449
- @Angluca made their first contribution in #2460
- @TheDrawingCoder-Gamer made their first contribution in #2452
- @foxeng made their first contribution in #2451
- @turbohz made their first contribution in #2474
- @aliceisjustplaying made their first contribution in #2525
- @dharrington made their first contribution in #2553
- @Skeptim made their first contribution in #2570
- @Gargaj made their first contribution in #2578
- @Pedrocasf made their first contribution in #2593
- @OvermindDL1 made their first contribution in #2619
- @Miguel-hrvs made their first contribution in #2626
- @janAkali made their first contribution in #2645
- @Gaiko-sw made their first contribution in #2653
- @Des-Nerger made their first contribution in #2675
- @anescient made their first contribution in #2676
- @fentras made their first contribution in #2712
- @PrimedErwin made their first contribution in #2714
- @YoshiRulz made their first contribution in #2740
- @kawaii-Code made their first contribution in #2748
- @iyzsong made their first contribution in #2758
- @marcosvpj made their first contribution in #2764
- @josei made their first contribution in #2763
- @rugk made their first contribution in #2783
- @imsys made their first contribution in #2827
- @Softkandi made their first contribution in #2790
- @WillGreen made their first contribution in #2788
- @CarlQLange made their first contribution in #2838
- @ckoparkar made their first contribution in #2851
- @aaneeley made their first contribution in #2852
- @Kaleidosium made their first contribution in #2743
- @MikanHako1024 made their first contribution in #2863
- @carstene1ns made their first contribution in #2864
- @Rhys-T made their first contribution in #2869
- @t-mw made their first contribution in #2875
- @TetherIO made their first contribution in #2887
- @sknebel made their first contribution in #2888
- @RDeckard made their first contribution in #2894
- @MartinRykfors made their first contribution in #2902
- @RayenChalouati made their first contribution in #2906
- @CDVoidwalker made their first contribution in #2914
- @RobinScaletta made their first contribution in #2924
- @hadamak made their first contribution in #2966
Full Changelog: v1.1.2837...v1.2.0