Skip to content

Releases: factory797/quadplay

2026-10-25

Choose a tag to compare

@factory797 factory797 released this 25 Oct 21:02
  • Rasterization primitives of the virtual GPU moved from JavaScript to C compiled to WebAssembly with SIMD.
    On cross-origin isolated pages the GPU worker shares its framebuffer memory with the main thread.
    Exported games include an .htaccess for Apache, and the manual's Deploying Games section
    describes the headers for itch.io, nginx, and other hosts
  • API and language changes:
    • optimized map span rendering and fixed off-by one errors; 4x speedup of Warlock 3D example
    • touch pointer input is now in world space instead of camera space
    • Allowed a larger set of unicode superscripts in code
    • particle_lib particle systems are now explicitly in world space
    • titlecase()
    • splice() and spliced() for arrays and strings
    • CSV data files can now disable typed parsing using "parse_as_strings"
    • Frame hooks specific to a mode are removed when that mode exits via set_mode() or pop_mode(),
      including delay() frame hooks
    • Constants with url fields are now supported for nested objects and arrays
    • Introduced iterated(), a functional version of iterate() that is similar to map() or filter() in other languages
    • draw_sprite_corner_rect() now supports transformed sprites
    • Local save game storage increased dramatically, and guarantees indefinite lifetime
    • iOS for games with saved storage now requires installing the game on the home screen
  • IDE changes:
    • Moved debugger options from the Game menu to the Tools menu
    • The emulator view in the IDE can now be vertically resized to show more
      emulator or more debugger and help info
    • The project pane can now be auto-hiding or pinned in every IDE editor layout
    • Debugger now links to the source line that triggered a mode transition
    • Debugger now prints the game_frames at which a mode transition occurred
    • Sprite sheet dimensions now shown in the resource display of the debugger
    • Resource display now links back to the asseet consuming those resources
    • Code editor now inserts spaces instead of tabs
  • Bug fixes:
    • Nested object/array constants now show descriptions in the constant editor
    • "raw" constant values are now visualized correctly in the constant editor
    • format_number(n, "commas") now rounds before formatting
    • Added workaround for quadplay hot-reloading when Chrome Memory Saver/Edge Sleeping Tabs is enabled in the browser
    • Fixed IDE cursor horizontal misalignment in long code lines
    • Statement resource counter now correctly processes single-line control flow
      as multiple statements
    • Statement resource counter now correctly ignores leading and trailing blank lines
      in files
    • Fixed vertical offset on pane resizing in the IDE
    • Fixed game version change not forcing full reload
    • Fixed iOS Safari audio loss when page is defocused
    • Fixed Go to Definition not working when the function was defined after the usage point in the file
    • Detected missing python-tk for homebrew/apt installs
    • Fixed controller vibration crash on Firefox
    • Fixed iOS touch events for late-2025 iOS/Safari zoom change
  • quadplay Discord linked from Console/gear menu

2025-08-29

Choose a tag to compare

@morgan3d morgan3d released this 30 Aug 11:30
  • New example, "GUI" using cursor_lib.pyxl
  • API and language changes:
    • Released the docs for the experimental HTTP API.
      Note that this API is blocked for safety reasons in the quadplay
      launcher and kiosk mode, but exported games may use it.
    • Added support for numbers as strings in CSV file parsing (example: "=""12345""")
    • Documented CSV parsing options for array-of-structs
    • Renamed scripts/midi_8x8.pyxl to scripts/midi_8x8_lib.pyxl
    • swap()
    • pass_through()
  • Asset changes:
    • New lock, unlock, binocular sprites for shapes.sprite.json
    • cursor-13x13.sprite.json
    • english_common_table.data.json and english_common_array.data.json
    • hit-12.sound.json
  • IDE changes:
    • "Go to API" dropdown list for code files for jumping to constants, variables, functions, and events
    • Blocks surrounded by if DEBUG: no longer count against the statement limit (case insensitive, and any identifier beginning with the prefix DEBUG matches)
    • Launching the IDE in --serve mode on macOS now opens the Firewall settings panel to make it easier to configure security
    • Added full documentation generation for libraries
    • Initialization during declaration of a variable to ∅, false, 0, or "" now does not count against the statement limit
  • Incompatible API changes:
    • play_sound(sound, loop default false, volume default 100%, pan default 0%, pitch default 100%, time default 0, playback_rate default 100%, stopped default false) ->
      play_sound(sound, volume default 100%, pan default 0%, pitch default 100%, time default 0, playback_rate default 100%, loop default false, stopped default false)
  • Bug fixes:
    • Blank lines at the start of the program no longer count against the statements limit
    • Prevented "raw" constants from crashing the constant editor in the IDE
    • All trailing whitespace is trimmed from CSV files on load, so multiple blank lines do not create empty rows
    • Workaround for crypto.randomUUID() is not a function
    • parse() and unparse() now handle escape sequences including double quotes correctly
    • Touching off of the system dropdown menu on mobile for an exported game now closes the menu
    • System dropdown menu on mobile is now larger
    • Pause menu now supports touch controls as well as mouse, gamepad, and keyboard
    • Prevented Safari from caching version.js to ensure the latest version of the runtime is always loaded
    • Fixed a 1px offset in the controllers display on exported games

2025-08-12

Choose a tag to compare

@morgan3d morgan3d released this 12 Aug 12:42
  • IDE improvements:
    • New Find in files (grep) feature
    • Code editor now has a custom context (right click) menu
    • Added Go to Definition to the context menu
    • Added Preview Export action in the Tools menu
  • API and language changes:
    • evaluate_constant_expression()
    • penultimate_value()
    • pause_menu()
    • string_compress()
    • string_decompress()
    • device_control("get_mouse_state") now includes mouse wheel dxy values
    • local_time() and utc_time() are now constant throughout a frame
    • remove_values() now accepts an optional comparator
    • contains() and find() now accept a string or integer as a comparator key
    • PyxlScript now supports general-purpose pop_mode handlers with no from clause
    • Increased save_local() size per key to 32,768 characters from 16,384
    • Removed push_guest_menu_mode() [use pause_menu("Online -> Guest")]
    • Removed long-deprecated is_NaN() [use is_nan()]
    • Removed long-in-beta launch_game()
  • Libraries:
    • cursor_lib.pyxl now includes scroll box support
  • Assets:
    • Added good-03.sound.json
  • Exported games
    • Added import/export of save games to a local file to the console menu. Automatically appears
      for all quadplay games that use save_local or load_local
    • Option to disable the arcade keyboard menu items for games run from a separate browser (vs. the launcher)
    • Improved UI of the quadplay HTML menu bar above the emulator
    • Only show the Quit/Close option when it will work
  • Bug fixes:
    • Constant colors specified using #RGB/#RGBA in the game.json no longer crash the gui editors. Instead they are automatically converted to objects when edited.
    • todo() statements at top level are now displayed correctly in the TODO debugger tab
    • Tooltips now appear on the code editor buttons
    • Undo and Redo buttons now work again in the code editor
    • Corrected 1/2 texel offset for sprites in Warlock demo that led to gaps in walls
    • draw_text was returning incorrect vertical bounds for multi-line text and aligning to "bottom" poorly as a result.

2025-08-03

Choose a tag to compare

@morgan3d morgan3d released this 03 Aug 21:30
  • New example: "Fill Window"
  • New library: screen_lib.pyxl library
  • API changes:
    • Advanced Conduit network API for MMO and explicit network
      multiplayer state synchronization (see the Conduit section of the manual)
    • device_control("get_display")
    • device_control("enable_feature", "custom_screen_size")
    • "timer" format for format_number()
    • utc_now()
    • utc_time()
    • gamepad.x_frames and gamepad.y_frames
    • CREDITS.version
    • set_random_seed() and make_random() now allow a string as the seed
    • Clarified local_time() documentation
    • Improved random number generator initialization so that sequences with
      similar seeds diverge more quickly
    • Added game.json online_menu option to disable the Online menu item in the System Menu for
      games that should not support Online play or use the Conduit API
    • New QUADPLAY_INFO global constant
    • Incompatible change: Removed gamepad.aa, gamepad.bb, etc. and touch.aa aliases.
      Use the already existing gamepad.a_pressed, etc. instead. Left gamepad.xx and
      gamepad.yy for now because gamepad.x and |sign(gamepad.dx)| is an awkward
      alternative
    • Increased save_local() size per key to 16384 characters from 4096
  • Asset changes:
    • deja-bold-15.font.json
    • novarese-20.font.json
    • novarese-bold-20.font.json
    • silence.sound.json
    • good-00.sound.json
    • good-01.sound.json
    • good-02.sound.json
    • Added english_offensive_table.data.json dictionary
    • Added black star and black heart to deja-6 and deja-7 fonts
    • Repacked kenney-1bit-14x14.png so that it can work with Tiled; redrew a small number of sprites
    • Fixed baseline values on many fonts
  • IDE improvements:
    • Asset import dialog now shows a preview of the contents
    • Moved the toolbar buttons closer to the right edge on mobile
    • Added code-defined constants and variables to the autogenerated program documentation
    • Added game.json-defined constants to the autogenerated program documentation
    • Increased editor selection background contrast
    • Long output in the debug pane now wraps around the file:line marker instead
      of overlapping it
  • Runtime improvements:
    • Added game version number to autogenerated credits
    • All assets and scripts are forced to refresh from the server and bypass
      the browser cache if either the quadplay version or the game version has changed
      since the previous load
    • Background is now black with full-screen boot screen for deployed games
    • Upgraded to peer.js 1.5.5
    • The GPU will cache frames with duplicate commands instead of re-rendering them.
      This is a significant mobile battery optimization for strategy and other games
      that tend to update at a rate lower than the full 60 Hz
    • Reduced memory allocation/garbage collection for using threaded virtual GPU
    • Backspace on the keyboard maps to P1 button (b) in addition to the previous
      Enter and H keys
  • Bug fixes:
    • spritesheet.size_in_sprites was transposed, is now fixed
    • Generated documentation now is restricted to top-level functions and variables
    • ESC now always cancels all open modal IDE dialogs
    • Fullscreen emulator screen was 2px smaller than the actual display
    • Slider tracks are now visible on Safari
    • Version now appears in the IDE's metadata editor
    • Prevented reload by swiping down on the toolbar on iOS Safari

2025-06-15

Choose a tag to compare

@morgan3d morgan3d released this 16 Jun 06:39
  • Redesigned the deployed HTML game toolbar to be more minimal and easier for users to understand
  • Made intro animations (pause message and quadplay boot animation) skippable with any user input
  • Increased loading speed by async loading more of the implementation
  • Increased exported game loading speed by factoring more IDE code out of the emulator
  • Merged inactive pause and background pause and the sleep versions into a single setting
  • Fixed quadplay sleep problems during intro sequence for deployed games
  • Fixed dice_set_initial_positions() in dice_lib.pyxl failing with NaN results for narrow dice trays
  • Changed highscores to high_scores in the game.json specification
    to be consistent with other quadplay naming conventions
  • Added show_start_animation option for exported games (defaults to true)
  • Added mobile_touch_gamepad option for exported games (defaults to true)
  • Removed support for legacy game.json files that use * to denote the start mode
  • Added support for .csv.zip and .txt.zip compressed text files
  • Added set_table option for CSV constants and assets for creating
    a set data structure of unique keys from a CSV file
  • Rewrote asset loader for speed and code maintainability
  • Added jszip library dependency
  • IDE button colors now match the emulator theme
  • IDE tab colors now match the emulator theme
  • Added english_all_table.data.json dictionary
  • Added english_all_array.data.json word list
  • Added english_sensitive_table.data.json dictionary
  • Improved ivanhoe-12 font readability
  • Added ivanhoe-bold-12 font

2025-05-31

Choose a tag to compare

@morgan3d morgan3d released this 31 May 23:31
  • Added sprite editor option to see both the raw PNG and the processed sprite sheet
  • Fixed a data table error loading the Beyond Control game
  • Rotated the Mode diagram in the IDE to run vertically
  • The Mode diagram blocks and arrows are now hyperlinked back to the relevant code
  • The active mode is now highlighted in the Mode diagram
  • Debugger tabs now match the IDE's color theme instead of using a fixed blue color
  • Fixed buttons in the top right of the IDE not functioning in fullscreen mode on MacOS using Chromium browsers
  • Standalone exported games use fewer files, take less bandwidth, and load slightly faster due to removing IDE dependencies
  • Exported games now use their label image as the browser icon instead of quadplay's icon
  • The exporter is now available in the IDE via the Games menu

2025-04-19

Choose a tag to compare

@morgan3d morgan3d released this 19 Apr 08:17
  • Added convex_hull()
  • Added linstep()
  • Added spritesheet.size_in_sprites
  • Renamed get_sprite_pixel_color() to sprite_pixel_color()
  • random_within_region() now works as expected on objects that have a scalar instead of xy scale property
  • sprite_transfer_orientation() now can operate on a spritesheet target as well as a sprite
  • Added support compressing PNGs on macOS with ImageOptim and on Windows with PNGGauntlet
  • Added support for Visual Studio 2022 and Krita on Windows
  • Added external editor support for .md, .html, .txt documents
  • Regions and entities may now have entity.shape as a convex polygon specified as an array of xy() values. Updated entity.shape, entity.size, make_entity(), ray_intersect() draw_bounds(), random_within_region(), entity_area(), entity_intertia(), entity_mass() to support this implementation.
  • Added entity_apply_fluid_force()
  • Added sounds/shoot-14.sound.json
  • Added device_control("get_analog_triggers", ...) support for directly reading analog triggers on game controllers that have analog triggers
  • Added device_control("rumble", ...) support for game controllers that have haptics
  • Added random_within_tri()
  • Added entity_projected_length()
  • Added entity_point_vel()
  • Changed entity_apply_force() and entity_apply_impulse() to specify the position at which they act in entity space
  • Sleeping physics objects now maintain contacts
  • Made unparse() pretty-print output by recognizing common objects such as xy() and common conventions such as angles and fractions
  • Sprite editor now shows the current pixel position and pixel value
  • Enabling the Tools / Show Physics menu option now also visualizes forces (experimental)
  • Enabling the Tools / Show Entity Bounds menu option now also shows entity names
  • Explicit zoom slider for sprite editor
  • Fixed sequence() begin_callback and end_callback not running if callback was not also specified
  • Fixed external application launching on Windows
  • Fixed physics_simulate() to call entity_update_children() as previously specified
  • Fixed negated torques in entity_apply_force()
  • Fixed parsing of degrees with decimal points
  • Fixed help system for quadplay API on Windows (newline issue)
  • Rewrote the coordinate systems section of the manual and added a coordinate system example program
  • Reorganized the manual to document spritesheet properties and group sprite functions
  • Reduced help system loading time significantly by only loading the quadplay API and not the full manual
  • Renamed scripts/particle.pyxl to scripts/particle_lib.pyxl
  • Hotreloading of the game's generated documentation now preserves scroll position
  • Upgraded to ace.js 1.37.1
  • Upgraded to matter.js 0.20.0

2025-01-01

Choose a tag to compare

@morgan3d morgan3d released this 01 Jan 22:18
  • Added git support for remote changes occuring during the sync process
  • Added context-sensitive help showing the API documentation for the function
    under the mouse and on typing a function call
  • Added autogenerated documentation for the game's scripts in the
    style of the manual
  • Added presets for number formats in the new constant dialog
  • Added transform_ws_z_to_ss_z()
  • Added RGB_ADD() intrinsic
  • Added scripts/cursor_lib.pyxl general UI cursor library
  • Added sprites/spaceship128.png, sprites/spaceship64.png, and sprites/spaceship32.png
  • Added support for translucent dice in scripts/dice_lib.pyxl
  • Renamed scripts/dice.pxyl to scripts/dice_lib.pyxl
  • Renamed scripts/mat3x3.pxyl to scripts/mat3x3_lib.pyxl
  • Renamed scripts/platformer.pxyl to scripts/platformer_lib.pyxl
  • The manual's contents sidebar now hides when the page is narrow
  • Improved the visibility of indenting guides and fold widgets in the editor
  • Removed the visible .pyxl extension on scripts in the IDE
  • Added support for Adobe Photoshop 2025
  • Extended .sprite.json palette_swap feature with bit masking of
    alpha values during remapping
  • Fixed autodetection of source_url for non-Aseprite sources
  • Fixed swapped red and blue channels on sprite.mean_color
  • Fixed the map editor disappearing in full-screen Edit mode
  • Fixed make_random() crash
  • Fixed pane resizing getting stuck on design documents

2024-12-06

Choose a tag to compare

@morgan3d morgan3d released this 07 Dec 03:51
  • Support for git directly within the IDE. If the game is in a git repo, "Sync Git" button appears that automates the most common operations
  • Put scrollbars on text editors on Windows

2024-10-25

Choose a tag to compare

@morgan3d morgan3d released this 26 Oct 04:09
2ab58a3
  • The sprite editor hot-reloads on browser focus change
  • Eliminated permission dialogs for MIDI in games that do not use MIDI
  • The New Game command no longer produces an extra .game.json junk file from the template
  • Altered the way that the kiosk thread is launched on Raspberry Pi OS to avoid blocking the terminal or leaving zombie processes
  • Added meta tags for messaging and social media links to quadplay games. These will now show improved previews in applications such as iMessage and Facebook.
  • On new sprite asset import, the source_url will automatically be set if a Krita, Aseprite, or Photoshop file with a matching name is detected
  • New sprites are immediately shown in the editor on import
  • Fix: If specified, source_url will now override the PNG file for an image when opening in an external editor
  • Stopped using update numbers, switching to pure dates