TIC-80 v1.4.0
Following v1.3.1, TIC-80 v1.4.0 refreshes the studio with a new menu bar and better sprite/music editing tools, adds line numbers and new drawing/input APIs, expands language support, and modernizes the desktop, web, and Android platform layers.
What's new
- Studio UI: New menu bar replaces the toolbar, export options are grouped by type, and menu/submenu behavior is more predictable.
- Line numbers: Optional line-number gutter with a toggle; visibility is preserved when toggling the gutter.
- Sprite editor: Palette presets, a tools menu, and an initial random brush.
- Music editor: Remembers its active tab and gets reworked tracker shortcuts plus general improvements.
- Drawing/input APIs: Added
btnr/keyr; added and fixedrrect/rrectbrounded-rectangle drawing across languages. - Languages: Gravity support; JavaScript runtime migrated to quickjs-ng; MiniScript 2.0.0; mruby 4.0.0; YueScript 0.34.3; Squirrel fixes and improvements.
- Editor/console polish: Improved comment-line shortcut; console commands answer cleanly; command history is more robust.
Platform
- Desktop player moved onto the sokol layer, with three desktop gamepad backends, better Windows gamepad/Switch Joy-Con report handling, XInput-unplaced pad support, restored CRT mask, and detached console for Windows GUI launches.
- Web player gets a WebGPU build; web clipboard fills ahead of the paste click.
- Android: Ruby returns to the APK; keyboard input works without
TOUCH_INPUT_SUPPORT. - WASM: fixed
wasmtic_paintexport, Zig signature/compile errors, and wasm macro formatting. - Sokol layer now owns typed text; platform input and window behavior are more consistent.
Bug fixes
- Fixed undo placing the cursor in the wrong place.
- Fixed line-number visibility and gutter lag.
- Prevented mouse movement from changing the active compact-mode menu; kept submenus visible unless another parent item is hovered.
- Fixed
clip()with no arguments in Python and Scheme. - Fixed languages requiring too many arguments for
rrect/rrectb. - Fixed Scheme
sfx()ignoring note/octave/speed from the SFX editor. - Fixed the Squirrel TIC/BOOT stack leak.
- Fixed console command/answer boundaries; history survives allocation failure and bounds stored deltas.
- Trimmed trailing filesystem slashes when creating studio.
- Included browser hotfix items for the add dialog,
alone=1, and Ctrl+R.
Build & infrastructure
- CI split into checks and artifact builds; added an API conformance suite at the C boundary, plus broader conformance coverage and Forth measurement.
- Added tests for
btnr/keyr. - Enforced MSVC
/W4,-Wall -Wextra -Werror,.clang-formatlinting, and analyzer/tidy checks for owned sources. - Modularized studio menu, console, strip/splash helpers, and boot cart handling.
- Forth leaves release builds; pforth binary is placed in the CMake sub-build directory.
- Updated README build instructions; pinned naett; updated vendored engines and dependencies.
Statistics: 78 commits, 63 pull requests, 11 contributors.
On tic80.com
The site moved on too:
- A WebGPU player. In browsers that support WebGPU, a game page now loads a second player build that uses it; everywhere else the existing WebGL one still runs. Nothing to switch on.
- Your saved game gets its own name and icon on iOS. Adding the player page to the home screen on an iPhone or iPad names the app after the game and gives it the game's cover as the icon.
- Cartridge names are unique per account. Two live cartridges of yours can
no longer share a name; the older duplicates were renamed with their id, and
old
/play/{id}links redirect to the game's own page. - Forth cartridges are no longer accepted. The engine dropped pForth from its release builds, so an upload of a Forth cartridge is refused.
What's Changed
- feat(js): migrate JavaScript runtime to quickjs-ng by @Kaleidosium in https://github.com/nesbox/TIC-80/pull/3056
- chore(deps): bump YueScript to 0.34.3 by @Kaleidosium in https://github.com/nesbox/TIC-80/pull/3057
- tests: the API conformance suite — every call recorded at the C boundary by @nesbox in https://github.com/nesbox/TIC-80/pull/3065
- [WASM - Zig] Fix signature and compile errors by @codingglitch in https://github.com/nesbox/TIC-80/pull/3061
- add missing wasmtic_paint export by @DOCtorActoAntohich in https://github.com/nesbox/TIC-80/pull/3062
- Fix Squirrel TIC and BOOT stack leak by @HarshDhru23 in https://github.com/nesbox/TIC-80/pull/3064
- sokol: the CRT mask lands on the window's pixels again by @nesbox in https://github.com/nesbox/TIC-80/pull/3067
- naett: pin to 5f695cf, the Linux worker stops waiting out a second per request by @nesbox in https://github.com/nesbox/TIC-80/pull/3068
- boot: the cart an app carries becomes a module by @nesbox in https://github.com/nesbox/TIC-80/pull/3069
- studio: the strip's shared helpers become modules, and so does the splash by @nesbox in https://github.com/nesbox/TIC-80/pull/3070
- studio: the console becomes a module by @nesbox in https://github.com/nesbox/TIC-80/pull/3072
- Fix [#3004]: Scheme sfx() ignores note/octave/speed from SFX editor by @theluckystrike in https://github.com/nesbox/TIC-80/pull/3073
- sokol: the gamepad abstraction gains the three desktop backends by @nesbox in https://github.com/nesbox/TIC-80/pull/3071
- build: -Wall -Wextra -Werror for the sources we own by @nesbox in https://github.com/nesbox/TIC-80/pull/3074
- build: msvc /W4 for the sources we own by @nesbox in https://github.com/nesbox/TIC-80/pull/3075
- sokol: Windows reads the pads XInput does not place by @nesbox in https://github.com/nesbox/TIC-80/pull/3076
- android: fix keyboard input without TOUCH_INPUT_SUPPORT by @iyzsong in https://github.com/nesbox/TIC-80/pull/3077
- format: the .clang-format describes the code, and the lint job holds a change to it by @nesbox in https://github.com/nesbox/TIC-80/pull/3078
- tidy: the analyzer checks the tree, and the findings that were bugs are fixed by @nesbox in https://github.com/nesbox/TIC-80/pull/3079
- sokol: the desktop moves to the sokol layer by @nesbox in https://github.com/nesbox/TIC-80/pull/3084
- Add semicolons after macros to fix bad formatting in wasm.c by @swoolcock in https://github.com/nesbox/TIC-80/pull/3085
- Adds rrect and rrectb functions by @swoolcock in https://github.com/nesbox/TIC-80/pull/3086
- Line numbers by @swoolcock in https://github.com/nesbox/TIC-80/pull/3088
- Gravity language support by @swoolcock in https://github.com/nesbox/TIC-80/pull/3083
- Implement rrect/rrectb for Gravity by @swoolcock in https://github.com/nesbox/TIC-80/pull/3089
- Initial implementation of random brush by @swoolcock in https://github.com/nesbox/TIC-80/pull/3087
- ci: checks.yml takes the checks, build.yml keeps the artifacts by @nesbox in https://github.com/nesbox/TIC-80/pull/3090
- conformance: coverage semantics, and nine more languages measured by @nesbox in https://github.com/nesbox/TIC-80/pull/3092
- Add a button to toggle line numbers by @swoolcock in https://github.com/nesbox/TIC-80/pull/3091
- conformance: forth measured, and the RRECT/RRECTB the measuring found missing by @nesbox in https://github.com/nesbox/TIC-80/pull/3093
- sokol: a WebGPU build of the browser player by @nesbox in https://github.com/nesbox/TIC-80/pull/3096
- Fix gutter lag by @swoolcock in https://github.com/nesbox/TIC-80/pull/3094
- sokol: the web clipboard fills ahead of the paste click by @nesbox in https://github.com/nesbox/TIC-80/pull/3097
- android: ruby returns to the APK by @nesbox in https://github.com/nesbox/TIC-80/pull/3098
- mruby: the vendored engine moves to 4.0.0 by @nesbox in https://github.com/nesbox/TIC-80/pull/3099
- Update build instructions in README.md by @Kacper-aka-Lep in https://github.com/nesbox/TIC-80/pull/3100
- Fix some languages requiring too many arguments to rrect/rrectb by @swoolcock in https://github.com/nesbox/TIC-80/pull/3102
- Trim trailing slashes in filesystem path when creating studio by @swoolcock in https://github.com/nesbox/TIC-80/pull/3103
- Various squirrel fixes and improvements by @swoolcock in https://github.com/nesbox/TIC-80/pull/3105
- studio: the menu bar replaces the toolbar by @nesbox in https://github.com/nesbox/TIC-80/pull/3101
- Put the pforth binary in the cmake sub-build directory by @swoolcock in https://github.com/nesbox/TIC-80/pull/3106
- Fix clip() with no arguments in Python and Scheme by @r3wretrhy in https://github.com/nesbox/TIC-80/pull/3108
- studio: the sprite editor gets its tools menu by @nesbox in https://github.com/nesbox/TIC-80/pull/3109
- Keep submenus visible unless the user hovers another parent menu item by @swoolcock in https://github.com/nesbox/TIC-80/pull/3110
- Music tracker improvements by @swoolcock in https://github.com/nesbox/TIC-80/pull/3111
- studio: the menu becomes a module by @nesbox in https://github.com/nesbox/TIC-80/pull/3113
- studio: group the export menu by type by @nesbox in https://github.com/nesbox/TIC-80/pull/3115
- history: survive allocation failure, and bound the stored deltas by @nesbox in https://github.com/nesbox/TIC-80/pull/3116
- console: a command ends where its answer does by @nesbox in https://github.com/nesbox/TIC-80/pull/3117
- Add btnr and keyr API and tests by @swoolcock in https://github.com/nesbox/TIC-80/pull/3112
- Update MiniScript for 2.0.0 release by @MineRobber9000 in https://github.com/nesbox/TIC-80/pull/3118
- Music tracker shortcut rework by @swoolcock in https://github.com/nesbox/TIC-80/pull/3119
- Prevent mouse move from changing the active menu when in compact mode by @swoolcock in https://github.com/nesbox/TIC-80/pull/3121
- sokol: the layer owns typed text by @nesbox in https://github.com/nesbox/TIC-80/pull/3123
- studio: the music editor remembers its tab by @nesbox in https://github.com/nesbox/TIC-80/pull/3124
- studio: palette presets in the sprite editor by @nesbox in https://github.com/nesbox/TIC-80/pull/3125
- sokol: Windows reads the Switch full-state and Joy-Con reports by @nesbox in https://github.com/nesbox/TIC-80/pull/3126
- sokol: detach the console for a Windows GUI launch by @nesbox in https://github.com/nesbox/TIC-80/pull/3127
- Fix undo putting cursor in the wrong place by @swoolcock in https://github.com/nesbox/TIC-80/pull/3129
- Make sure line number visibility is retained if toggling the gutter by @swoolcock in https://github.com/nesbox/TIC-80/pull/3130
- Improve comment line shortcut by @swoolcock in https://github.com/nesbox/TIC-80/pull/3131
- build: Forth leaves the release builds by @nesbox in https://github.com/nesbox/TIC-80/pull/3133
New Contributors
- @codingglitch made their first contribution in https://github.com/nesbox/TIC-80/pull/3061
- @DOCtorActoAntohich made their first contribution in https://github.com/nesbox/TIC-80/pull/3062
- @HarshDhru23 made their first contribution in https://github.com/nesbox/TIC-80/pull/3064
- @theluckystrike made their first contribution in https://github.com/nesbox/TIC-80/pull/3073
- @Kacper-aka-Lep made their first contribution in https://github.com/nesbox/TIC-80/pull/3100
- @r3wretrhy made their first contribution in https://github.com/nesbox/TIC-80/pull/3108
Full Changelog: https://github.com/nesbox/TIC-80/compare/v1.3.1...v1.4.0