Repository navigation
Releases: factory797/quadplay
Releases · factory797/quadplay
Release list
2026-10-25
- 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.htaccessfor 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
touchpointer input is now in world space instead of camera space- Allowed a larger set of unicode superscripts in code
particle_libparticle systems are now explicitly in world spacetitlecase()splice()andspliced()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()orpop_mode(),
includingdelay()frame hooks - Constants with url fields are now supported for nested objects and arrays
- Introduced
iterated(), a functional version ofiterate()that is similar tomap()orfilter()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_framesat 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 editorformat_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
- 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.pyxltoscripts/midi_8x8_lib.pyxl swap()pass_through()
- Released the docs for the experimental HTTP API.
- Asset changes:
- New lock, unlock, binocular sprites for
shapes.sprite.json cursor-13x13.sprite.jsonenglish_common_table.data.jsonandenglish_common_array.data.jsonhit-12.sound.json
- New lock, unlock, binocular sprites for
- 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 prefixDEBUGmatches) - 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()andunparse()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.jsto ensure the latest version of the runtime is always loaded - Fixed a 1px offset in the controllers display on exported games
2025-08-12
- 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 mousewheeldxy valueslocal_time()andutc_time()are now constant throughout a frameremove_values()now accepts an optional comparatorcontains()andfind()now accept a string or integer as a comparator key- PyxlScript now supports general-purpose
pop_modehandlers with nofromclause - Increased
save_local()size per key to 32,768 characters from 16,384 - Removed
push_guest_menu_mode()[usepause_menu("Online -> Guest")] - Removed long-deprecated
is_NaN()[useis_nan()] - Removed long-in-beta
launch_game()
- Libraries:
cursor_lib.pyxlnow includes scroll box support
- Assets:
- Added
good-03.sound.json
- Added
- Exported games
- Added import/export of save games to a local file to the console menu. Automatically appears
for all quadplay games that usesave_localorload_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
- Added import/export of save games to a local file to the console menu. Automatically appears
- 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_textwas returning incorrect vertical bounds for multi-line text and aligning to "bottom" poorly as a result.
2025-08-03
- New example: "Fill Window"
- New library:
screen_lib.pyxllibrary - 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 forformat_number()utc_now()utc_time()gamepad.x_framesandgamepad.y_framesCREDITS.versionset_random_seed()andmake_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_menuoption 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_INFOglobal constant - Incompatible change: Removed
gamepad.aa,gamepad.bb, etc. andtouch.aaaliases.
Use the already existinggamepad.a_pressed, etc. instead. Leftgamepad.xxand
gamepad.yyfor now becausegamepad.x and |sign(gamepad.dx)|is an awkward
alternative - Increased
save_local()size per key to 16384 characters from 4096
- Advanced Conduit network API for MMO and explicit network
- Asset changes:
deja-bold-15.font.jsonnovarese-20.font.jsonnovarese-bold-20.font.jsonsilence.sound.jsongood-00.sound.jsongood-01.sound.jsongood-02.sound.json- Added
english_offensive_table.data.jsondictionary - Added black star and black heart to
deja-6anddeja-7fonts - Repacked
kenney-1bit-14x14.pngso that it can work with Tiled; redrew a small number of sprites - Fixed
baselinevalues 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_spriteswas 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
- 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()indice_lib.pyxlfailing withNaNresults for narrow dice trays - Changed
highscorestohigh_scoresin the game.json specification
to be consistent with other quadplay naming conventions - Added
show_start_animationoption for exported games (defaults to true) - Added
mobile_touch_gamepadoption 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_tableoption 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
jsziplibrary dependency - IDE button colors now match the emulator theme
- IDE tab colors now match the emulator theme
- Added
english_all_table.data.jsondictionary - Added
english_all_array.data.jsonword list - Added
english_sensitive_table.data.jsondictionary - Improved
ivanhoe-12font readability - Added
ivanhoe-bold-12font
2025-05-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
- 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
- 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.pyxlgeneral UI cursor library - Added
sprites/spaceship128.png,sprites/spaceship64.png, andsprites/spaceship32.png - Added support for translucent dice in
scripts/dice_lib.pyxl - Renamed
scripts/dice.pxyltoscripts/dice_lib.pyxl - Renamed
scripts/mat3x3.pxyltoscripts/mat3x3_lib.pyxl - Renamed
scripts/platformer.pxyltoscripts/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
.pyxlextension on scripts in the IDE - Added support for Adobe Photoshop 2025
- Extended
.sprite.jsonpalette_swapfeature with bit masking of
alpha values during remapping - Fixed autodetection of
source_urlfor 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
- 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
- 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