github nesbox/TIC-80 v1.4.0
TIC-80 tiny computer 1.4.0

3 hours ago

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 fixed rrect/rrectb rounded-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_paint export, 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-format linting, 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 #3056
  • chore(deps): bump YueScript to 0.34.3 by @Kaleidosium in #3057
  • tests: the API conformance suite — every call recorded at the C boundary by @nesbox in #3065
  • [WASM - Zig] Fix signature and compile errors by @codingglitch in #3061
  • add missing wasmtic_paint export by @DOCtorActoAntohich in #3062
  • Fix Squirrel TIC and BOOT stack leak by @HarshDhru23 in #3064
  • sokol: the CRT mask lands on the window's pixels again by @nesbox in #3067
  • naett: pin to 5f695cf, the Linux worker stops waiting out a second per request by @nesbox in #3068
  • boot: the cart an app carries becomes a module by @nesbox in #3069
  • studio: the strip's shared helpers become modules, and so does the splash by @nesbox in #3070
  • studio: the console becomes a module by @nesbox in #3072
  • Fix #3004: Scheme sfx() ignores note/octave/speed from SFX editor by @theluckystrike in #3073
  • sokol: the gamepad abstraction gains the three desktop backends by @nesbox in #3071
  • build: -Wall -Wextra -Werror for the sources we own by @nesbox in #3074
  • build: msvc /W4 for the sources we own by @nesbox in #3075
  • sokol: Windows reads the pads XInput does not place by @nesbox in #3076
  • android: fix keyboard input without TOUCH_INPUT_SUPPORT by @iyzsong in #3077
  • format: the .clang-format describes the code, and the lint job holds a change to it by @nesbox in #3078
  • tidy: the analyzer checks the tree, and the findings that were bugs are fixed by @nesbox in #3079
  • sokol: the desktop moves to the sokol layer by @nesbox in #3084
  • Add semicolons after macros to fix bad formatting in wasm.c by @swoolcock in #3085
  • Adds rrect and rrectb functions by @swoolcock in #3086
  • Line numbers by @swoolcock in #3088
  • Gravity language support by @swoolcock in #3083
  • Implement rrect/rrectb for Gravity by @swoolcock in #3089
  • Initial implementation of random brush by @swoolcock in #3087
  • ci: checks.yml takes the checks, build.yml keeps the artifacts by @nesbox in #3090
  • conformance: coverage semantics, and nine more languages measured by @nesbox in #3092
  • Add a button to toggle line numbers by @swoolcock in #3091
  • conformance: forth measured, and the RRECT/RRECTB the measuring found missing by @nesbox in #3093
  • sokol: a WebGPU build of the browser player by @nesbox in #3096
  • Fix gutter lag by @swoolcock in #3094
  • sokol: the web clipboard fills ahead of the paste click by @nesbox in #3097
  • android: ruby returns to the APK by @nesbox in #3098
  • mruby: the vendored engine moves to 4.0.0 by @nesbox in #3099
  • Update build instructions in README.md by @Kacper-aka-Lep in #3100
  • Fix some languages requiring too many arguments to rrect/rrectb by @swoolcock in #3102
  • Trim trailing slashes in filesystem path when creating studio by @swoolcock in #3103
  • Various squirrel fixes and improvements by @swoolcock in #3105
  • studio: the menu bar replaces the toolbar by @nesbox in #3101
  • Put the pforth binary in the cmake sub-build directory by @swoolcock in #3106
  • Fix clip() with no arguments in Python and Scheme by @r3wretrhy in #3108
  • studio: the sprite editor gets its tools menu by @nesbox in #3109
  • Keep submenus visible unless the user hovers another parent menu item by @swoolcock in #3110
  • Music tracker improvements by @swoolcock in #3111
  • studio: the menu becomes a module by @nesbox in #3113
  • studio: group the export menu by type by @nesbox in #3115
  • history: survive allocation failure, and bound the stored deltas by @nesbox in #3116
  • console: a command ends where its answer does by @nesbox in #3117
  • Add btnr and keyr API and tests by @swoolcock in #3112
  • Update MiniScript for 2.0.0 release by @MineRobber9000 in #3118
  • Music tracker shortcut rework by @swoolcock in #3119
  • Prevent mouse move from changing the active menu when in compact mode by @swoolcock in #3121
  • sokol: the layer owns typed text by @nesbox in #3123
  • studio: the music editor remembers its tab by @nesbox in #3124
  • studio: palette presets in the sprite editor by @nesbox in #3125
  • sokol: Windows reads the Switch full-state and Joy-Con reports by @nesbox in #3126
  • sokol: detach the console for a Windows GUI launch by @nesbox in #3127
  • Fix undo putting cursor in the wrong place by @swoolcock in #3129
  • Make sure line number visibility is retained if toggling the gutter by @swoolcock in #3130
  • Improve comment line shortcut by @swoolcock in #3131
  • build: Forth leaves the release builds by @nesbox in #3133

New Contributors

Full Changelog: v1.3.1...v1.4.0

Don't miss a new TIC-80 release

NewReleases is sending notifications on new releases.