Releases: morgan3d/quadplay
Beta update 47
New built-in game “Beyond Control”
New example “Planet Generator” for 2.5D procedural content
New example “Clouds” of per-pixel graphics
New example “Entity” of different entity features
New scoreboard-5 font
New splash-00 sound
New sparks-00 through sparks-04 sounds
New explode-10 sound
New powerup-11 sound
New shoot-11 sound
New shoot-12 sound
New loop-prometheus sound
New loop-forest sound
New loop-escalator sound
New loop-beat sound
New loop-wind sound
New beast-soldier-32x32 spritesheet
New shapes-32x32 spritesheet
New dots, stripes, wood, and carbon console vinyl wraps
Added gamepad.prompt["##"] for a replacement string for the player number
Added .debug.game layer (see the Debug JSON section)
debug_watch() now allows multiple identical expressions at different locations
debug_watch() and debug_print() output are now hyperlinks to the source location that produced them
Added 320×180 support for targeting Switch, PiBoy, 720p, 1080p, and 1440p
Added support for TileKit
Added optional stick index argument to device_control("get_analog_axes", ...)
Added font.spacing and font.glyph_size
Packed suchet-12 font characters more tightly to conserve memory
Optimized rendering of successive rectangles using the same z value
Optimized the 2D noise() function variant (now runs in 3/4 the time)
Incompatible changes:
Made the order of arguments for draw_tri() consistent with other drawing functions
local_time().daySecond ⟶ local_time().day_second
xz_to_xyz() now swizzles z → y
Games must now opt in with a game.json dual_dpad setting for the P1 right stick to override the P2 D-pad for dual digital stick input in single-player games
The entity.pivot now affects rendering as well as collision detection, overriding the sprite's pivot (it defaults to the sprite's pivot)
The start mode is now specified with start_mode in the game JSON file instead of an asterisk
sequence() now accepts bare numbers indicating frames to skip
sequence() now supports an end_callback
Made the default radius for random_truncated_gaussian() 2.5 standard deviations
Changed the region of a sprite JSON file to take "corner" instead of "pos" (the old version is accepted as a synonym for backwards compatibility at the moment)
The sprite viewer in the IDE now autoscales for tall sprites
stop_audio() now allows the argument to be nil
Added SOURCE_LOCATION zero-argument operator
set_random_seed() now defaults to a random seed based on the time
random_value(), shuffle(), and shuffled() now take an optional random number generator argument
IDE can now create new sound assets
IDE can now change the order of execution of scripts
IDE can now remove scripts (removed scripts are not deleted on disk)
IDE can now rename scripts
IDE project window now rolls out on hover in debug mode
gamepad_array[] elements now print as their name instead of properties
Increased the contrast of the text in ghost mode
Reordered quick links on the top of the manual
Rewrote the Project File section of the manual to clarify the asset vs. constant distinction
Increased the contrast on the sprite editor info data
The Import Asset dialog will now automatically default to a useful variable name
The Import Asset dialog can now import raw PNG, TMX, and MP3 files
Sprite JSON files now default to assuming a single sprite that is the size of the spritesheet if none is specified
Fonts now only count as 1/2 pixels towards the sprite pixel limit because they are compressed
Internally renamed variables and files for easier refactoring and future PyxlScript features
The fullscreen layout button now returns to full screen if tapped when already selected
IDE code editor now highlights compile-time error lines in red
Editor divider pane layout now persists over reload
Added Dualshock4 controller to the officially tested list
Added support for the 8bitdo M30 SEGA Genesis style controller
Added support for the Raphnet adapter and SEGA Genesis and Mega Drive retro bit controllers
Added device_control() "load" and "save" commands for JSON files
Added touch.screen_x, touch.screen_y, touch.screen_xy, touch.screen_dx, touch.screen_dy, and touch.screen_dxy accessors for screen-space (instead of camera-space) positions
Added rgba(rgb, a), rgba(hsv, a), xyz(xy, z), xyz(xz, y), hsva(hsv, a), hsva(rgb, a)
Added transform_ws_to_ss() and transform_ss_to_ws()
Added {br} line break markup
Added ABS() intrinsic
Added sprite.animation property
Added Sega Genesis and Mega Drive controller support
Added ⑤ ⑥ ⓩ characters to font mapping and all fonts
Added design document template for New Doc menu
Added named argument version of draw_corner_rect()
Added table constants that use external CSV files
Added "multiply" blend mode for draw_sprite(), useful for colored lighting
Added support for transposed spritesheets in the IDE sprite viewer
Added support for regions in the IDE sprite viewer
Added a global volume control on the Console menu
Added buttons to copy stats summaries from the Stats pane
Added X_Arcade controller icon and mapping for the X-Arcade USB controller
Added PiBoy controller icon and mapping for the PiBoy DMG
Added device_control("console.dir", ...) for web browser console access
Fixed new game filename shortener to keep the beginning instead of the end of names
Fixed iterator container-mutation check when changing modes
Fixed draw_sprite() API links in the manual
Fixed touch.xy coordinates under translation transformations
Fixed recursive push_mode() and pop_mode() not preserving draw_previous_mode() state
Fixed export.py script to set read file permissions on the contents of the zipfile
Fixed constant editor vector vertical nudge value to default sign based on y_up setting
Fixed analog axis snapping when near 8-direction points
Fixed sprite editor not updating after JSON edits
Fixed gutters on sprites
Fixed initial entity.size to be based on scale for rectangular shaped entities that have initial sprites
Fixed broken images in Markdeep design documents after edits
Fixed incorrect image scaling when embedded in itch.io at 1080p
Fixed a bug that prevented debug_watch() on values containing string literals
Fixed IDE edits to asset JSON files not persisting after load
Fixed incorrect line numbers when using default expressions
Fixed 3-space indenting in .game.json files
Fixed internal assertion failure for make_spline() with negative time values
clone() and deep_clone() on constants now clones the value and makes it mutable, while on assets (other than maps) and built-in objects returns the original object.
Beta update 46
New font: hauer-12
New font: robot-18
IDE code editor now highlights error lines in red
Color constant editor preview now shows the exact 16-bit color
Color constant editor preview now visualizes alpha channel
Made local: and preserving_transform: lines free versus total source statement limit
Added gamepad_array[] reordering dialog to support arcade configurations. Access this from the Controls tab of the debugger.
Added a breakdown of code size by file in the Stats window of the debugger.
Added a breakdown of sprite pixels by file in the Stats window of the debugger.
Fixed macOS quadplay script when quadplay and the home directory are on different volumes.
Fixed the bottom line not appearing on the editor on some browsers
Fixed binding on the animation example ninja duck key
Fixed text_width() being too small by one space between letters
Fixed a physics system crash on rare contact breaking situation
Fixed an API upgrade bug on object removal in Serpitron during showdowns
Fixed the mode graph clipping on the bottom
Made the mode graph scrollable
Beta update 45
Made function definition lines, todo(), and assert() free versus the total source statement limit
Optimized debug_print() to make it practical to print large amounts of data
The confirm argument to set_pause_menu() can now be a string that specifies additional message text
Made assets print in debug_print() and debug_watch() as their variable name
Assets with the same source URL are now guaranteed to produce live objects that are == to each other, except for maps, which are guaranteed to be != because they are mutable
Made clone() and deep_clone() work properly on assets and constants
The pan argument to play_sound() can now be an xy() value for positional sound
Updated X-Arcade instructions to reflect the latest 9.14 firmware
Changed physical modern console controller mapping so that triggers are aliases for shoulders (previously P1's triggers were P2's A and B buttons)
Added map.spritesheet convenience helper
Added support for arbitrary properties on sprites in the sprite.json
Added kenney-cartography-64x64.sprite.json
Added sprite.orientation_id to distinguish unique orientations
Added any_button_release()
Added explode-12.sound.json
Added spawn_particles_from_map_ws_coord() to scripts/particle.pyxl
Optimized in-IDE game start time
The export.py script now ignores temporary and backup files
The export.py script now makes all output files world readable
Fixed a slight blue bias in alpha blending
Fixed alpha blending on sprites that are transposed at load
Fixed map coordinate documentation to match the practice, which is that map coordinates are at tile corners if there is no offset on the map.
Fixed too-aggressive caching of map loading from IDE
Fixed draw_map() case using named arguments for replacement_array
Fixed transform_map_space_to_ws() and transform_ws_to_map_space() to map integer map coordinates to the centers of map tiles, as specified in the manual
Fixed constant references to assets
Fixed RPG demo crash
Fixed vehicle demo button prompts
Beta update 44
Incompatible change: draw_text() multiline y_align = "center" and y_align = "bottom" now adjust to the entire text block and not the first line
Incompatible change: Renamed ##-Coin.sound.json to coin-##.sound.json, ##-Shoot.sound.json to shoot-##.sound.json, ##-Jump.sound.json to jump-##.sound.json, ##-Explode.sound.json to explode-##.sound.json, ##-Powerup.sound.json to powerup-##.sound.json, ##-Hit.sound.json to hit-##.sound.json, ##-Wild.sound.json to wild-##.sound.json
New font: suchet-12
Support for custom properties on TMX maps
Auto-generated TODO lists in the IDE from todo() statements in code
Errors will now open the appropriate file and line in the IDE
Changed document editor layout to show 50% preview and 50% source editor
Load a new script faster after creation
Active debugger tab persists over reloading
System pause menu now pauses game sound effects
Syntax highlighting in the IDE for parse() and random_within_cube()
Added Shift+F6 hotkey for label generation
Added a context menu for modes in the project view of the IDE
Added sequence.BREAK and sequence.NEXT options
Added five-argument version of lerp()
Added LERP() intrinsic
Added starts_with() and ends_with() functions for strings
Added “go to line” command (Ctrl-G/⌘-G) for the IDE
Added engine-00.sound.json and engine-01.sound.json
Fixed Windows paths in URLs
Fixed Add Existing Asset... on Windows
Fixed rectangle alpha blending
Fixed random_within_sphere() crashing
Fixed asset json editor changes being overwritten by caches
Fixed alpha channel of screenshots
Fixed emulator alignment on Safari
Fixed constant parsing for pi in game.json files
Fixed map preview rendering (was broken by the previous update)
Fixed scalepix tool (was broken by the previous update)
Fixed new game-level constants reverting to zero on Chrome
Fixed project asset/constant scrolling to allow full variable names to be seen
Fixed automath sometimes leaving the cursor off by one character
Beta update 43
Incompatible change: it is now illegal to mutate the container being iterated over by a for...in loop. Use for x in clone(container): as a workaround if you need mutation, which is still relatively fast.
Incompatible change: + - / * += -= /= = operators are now illegal to use on arrays (they are still overloaded for objects)
Incompatible change: for loops now evaluate the upper bound only once, before the loop body begins
Incompatible change: renamed Blip.sound.json to blip*.sound.json
Temporary Network Multiplayer workaround solution (to be replaced with a more straightforward method at release)
Changed screenshot filename format to international date format to sort correctly
Added IDE option to restart a paused game automatically when focus switching back to the browser from an external editor or other tab
Optimized nonrotated opaque sprite drawing by up to 2x and halved memory usage by reducing GPU implementation to true 16 bit
Optimized Safari sprite drawing using forced integer coordinates for up to 4x performance increases in specific cases
Optimized rotated and scaled opaque sprite drawing by 10% by handling this case separate from tinting, alpha test, and opacity
Optimized thick line rendering by reducing virtual CPU Logic overhead
Optimized default for and for...in loops under the new semantics
Scripts loaded from quad://scripts/ no longer count against the total program size
The game.json file is now directly editable in the IDE
Errors now report the filename with the URL truncated if it matches the game URL
The game.json structure for docs stores only raw URLs now, not metadata
Made the project pane wider to make it easier to see long variable names
Disabled browser navigation hotkeys to prevent accidentally leaving the IDE
Disabled Chrome browser two-finger back gesture to prevent accidentally leaving games or the IDE
Added syntax highlighting to inline code in the manual
Added IDE_USER constant
Added iterate() function
Added lerp_angle()
Added perceptual_lerp_color()
Added examples/perceptual_color
Added explode-11.sound.json
Added xy, dx, dy, and dxy values to device_control("get_mouse_state")
Added syntax highlighting for touch in the IDE
Added syntax highlighting for the type-testing functions is_array(), is_object(), etc. in the IDE
for loops now test for illegal containers
Added mouse support to the fluid simulation demo
Added more error checking to entity functions
Added todo() debugging statement
Added "reference" constant type
Added scripts/particle.pyxl reusable script
Added sounds/shoot-10.sound.json
Tooltips in the project listing of the IDE now show the full names of variables and scripts as well as URLs and descriptions
Improved error checking for find_path()
Made the Debug mode use a 1.5x scale emulator on displays of 1600 pixels wide or less (factoring in pixel doubling for retina displays) and 2.0x scaling at higher resolutions
Linked the game folder display in the IDE to opening the folder on disk
Fixed missing clamping of RGB colors outside the 0-1 range during rendering
Fixed HSV to and from RGB conversion
Fixed line number errors for programs with long lines
Fixed the bottom rows of the code editor being cropped
Fixed automath operating on non-pyxl files
Renamed get_map_sprite_by_draw_coord() ⟶ get_map_sprite_by_ws_coord()
Renamed get_map_pixel_color_by_draw_coord() ⟶ get_map_pixel_color_by_ws_coord()
Beta update 42
Incompatible change: Removed subscripts as array indices. They are still valid characters for strings.
Incompatible change: renamed “sound” ⟶ “audio” and “audio clip” ⟶ “sound” in the API
Made Delta autocorrect to Δ without requiring a following space in the IDE
Made rename and add asset/constant update faster
Search and Replace in the editor now triggers autosave
IDE open dialog now includes game descriptions and icons
P1's right stick and triggers no longer provide input to P2 unless P2 does not have a physical controller
New sound loop-chilltech.sound.json
New sound music-vice.sound.json
RPS game now times out after about 15 seconds when a player hasn't chosen
Serpitron game now has shorter showdown levels in 2-player games
Moved the code editor below the map/sprite/font view in the IDE
Added Vaporwave 3D example program
Added “New Asset...” dialog in the IDE for creating new sprites
Added source_url field for sprites to support export processesqu
Added autocorrect support for additional capital Greek letters ΓΔΘΛΞΠΣΦΨΩ
Added transform_es_to_es()
Added right-click menu for music assets
Added new Twin Analog stick example for dual stick shooters
Added Arcade (quadplay native), Arcade_X (Xbox labels), and Arcade_PS (PlayStation labels) controller options
Added X-Arcade controller information to the manual
Added buttons (as well as D-pad) choices for RPS game to better conceal player movements on an arcade controller
Renamed map transformation functions to transform_ws_to_map_space(), transform_map_space_to_ws(), transform_ws_z_to_map_layer(), and transform_map_layer_to_ws_z()
Changed default tab/indentation size to four spaces to reduce conflicts with Python editors
The quantize tool now allows toggling the “dither” option after dropping the image
Made quantize tool display using nearest neighbor interpolation
Improved Safari performance by warming the sprite blitter JIT during the quadplay logo screen
Improved Safari performance for Beat the Gobblins by eliminating large alpha-masked sprites
Improved Safari performance by removing explicit nearest-neighbor upscaling and using CSS zoom
Improved Safari load time on dual-core processors by spreading out asynchronous requests in time
Improved lerp() and clamp() performance
Fixed compilation of fractional degrees and percentages
Fixed map occlusion culling (was showing empty tiles)
Fixed loading quad:// games from the command line
Fixed blurring on Safari by using CSS zoom instead of CSS scale on that platform and adjusting layout to compensate
Fixed Safari mouse and touch event scaling
Fixed Debug UI layout not allowing full horizontal scrolling of the editor
Fixed button prompt alignment in Broderick-7 font
Beta update 41
Added named argument versions of all drawing routines
The new game's title now appears in the game and JSON when creating a new game in the IDE
IDE now automatically reloads externally changed files from disk when it regains focus
Faster saves on constant changes in the IDE
Added “Show in Finder/Explorer” for assets in the IDE
Added “Open with...” support for Photoshop, Krita, Aseprite, GIMP, Audacity, and Tiled in the IDE
Avoided IDE touching unchanged source files on disk to improve external editor interop
Added top runner sprites to complete the Action Spy set
Added support in the quadplay script for Windows systems with multiple drives
Added 'y' and 'z' superscript characters to fonts and the compiler (there are no subscripts for these because they do not appear in Unicode)
Documented backdoor mouse support via device_control()
Changed the mouse cursor to a crosshair over the emulator screen
Fixed relative paths when creating a new game from the IDE
Fixed animation.frames, which was completely broken in the previous release
Supported hierarchical directory structure under ~/my_games/
Implemented “automath” autocorrect-style typing of Unicode symbols in the text editor
Assets now appear in consistent alphabetical order in the project view of the IDE
New “Z-Car” wireframe 3D example
Beta update 40
Added set_camera() and get_camera() and global camera support to all drawing functions for camera rotation, translation, and zoom
Added occlusion culling optimizations to draw_map() for eliminating completely covered tiles
New sportscar sprites
New attack helicopter (“chopper”) sprites
New tank sprites
New road tile sprites
New suchet-9 font
Removed browser context menu from most UI surfaces (it is still present on links and text boxes)
Constants can now be deleted from a project
Assets can now be renamed in a project
Added pos, angle, and scale arguments to draw_map()
Implemented z clipping for draw_map()
Added examples/vehicles sample
Renamed “draw” space to “world” space and introduced “camera” space
Removed screen-space touch events
Changed all device_control() arguments to snake case
map.json z_scale is now permitted to be 0
Increased the built-in epsilon value by 10x and decreased the sprite draw call order-preserving offset by 1000x to ensure that epsilons can override sprite draw call order
Made Ctrl/Cmd-S do nothing, to avoid accidentally saving the browser page when using the IDE (since the game autosaves)
Fixed map preview rendering of flipped sprites
Fixed set_clip() with pos = nil
Added autocorrect for math symbols option to the Tools menu
Beta 39
Added ⓔ and ⓕ buttons, which are mapped to shoulder buttons on physical controllers
Added a new playable game, “Across the Lake”
New games can now be created from the browser based IDE using “New Game...”
Games can now be loaded from the browser based IDE using “Open Game...”
Changed lifetime and duration arguments to various APIs to frames in for consistency with the sprite and other settings, and the name “frame hook”
Fixed Ctrl/Command+C not copying in the IDE
Added an Animation section for sprites
Added animation.frame() for accessing animations by game frames instead of sprite index
Added button prompts to all fonts
Incompatible change: Renamed "flip_y" to "y_up" in .map.json and .game.json files
Fixed editor making relative URLs inside .sprite.json and other asset files absolute
The IDE now uses $HOME/my_quadplay as the root for new games
any_button_press() now responds to any touch as well
Increased the QR code size in the host tab to make it easier to scan
Changed the way that the width of the white space character is computed for fonts. It now uses the largest width of the "il¹;[" characters
2x performance optimization for alpha blending large sprites with no rotation or scale
Added get_sound_status() function
The IDE now puts badges on constants that are uneditable because the .game.json file is on a remote server or built-in
quadplay script no longer prints all internal messages
Changed default startup mode to Emulator for non-IDE mobile, Maximal for non-IDE desktop, and IDE for IDE present
Beta 38
Kiosk mode now completely fills the screen, removing all quadplay UI
Pressing play or reload now saves all documents immediately
Prevented frame rate changes during the first 1000 ms of a new mode to allow the JIT to catch up
Ghost mode for livestreaming the development environment
Pressing Play now restores keyboard focus to the game
Added touch example program
Added arrows for nudging vector constants in the IDE
Added sliders for color constants in the IDE
Fixed syntax highlighting for with, entity_add_child, and entity_remove_child
Improved frame rate scaling to avoid dropping to 30 Hz during transient browser hitches
Changed the player 1 keyboard mapping to B,H,V,G for the main buttons to make room for new virtual “shoulder” buttons
Changed mapping of game reload to Ctrl+R on Safari to prevent browser reload of the page, and clarified all hotkeys with improved tooltips.
Added PS5 controller mappings and graphics
Optimized sequential rendering of multiple sprites with the same z value and clipping region
Argument object version of draw_map()
draw_map() now accepts optional pos, scale, and angle arguments
Recorded GIFs now download in the same way as recorded PNGs
Added generalized transform_to() and transform_from() routines for points
Added support for Xbox Series X controller
Added a second row of 4x wide glyphs to the font format
Redrew all fonts with new glyphs for ⓔ, ⦸, ⓝ, ⓗ, alt, left shift, right shift, and tab