From 5a3e26082178f6773c8f2c4c9b52f5bda75bbba8 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Wed, 10 Dec 2025 15:17:50 -0600 Subject: [PATCH] simplify docs --- README.md | 8 +- docs/api/actor.md | 11 - docs/api/console.md | 37 - docs/api/index.md | 5 - docs/api/modules/actor.md | 87 -- docs/api/modules/camera.md | 46 - docs/api/modules/cmd.md | 7 - docs/api/modules/color.md | 7 - docs/api/modules/debug.md | 76 -- docs/api/modules/dmon.md | 39 - docs/api/modules/doc.md | 38 - docs/api/modules/draw2d.md | 228 ---- docs/api/modules/enet.md | 45 - docs/api/modules/event.md | 25 - docs/api/modules/geometry.md | 221 ---- docs/api/modules/graphics.md | 278 ----- docs/api/modules/imgui.md | 1244 --------------------- docs/api/modules/input.md | 68 -- docs/api/modules/io.md | 243 ---- docs/api/modules/js.md | 175 --- docs/api/modules/json.md | 15 - docs/api/modules/loop.md | 3 - docs/api/modules/math.md | 115 -- docs/api/modules/miniz.md | 27 - docs/api/modules/nota.md | 30 - docs/api/modules/os.md | 101 -- docs/api/modules/packer.md | 44 - docs/api/modules/render.md | 96 -- docs/api/modules/resources.md | 68 -- docs/api/modules/sound.md | 11 - docs/api/modules/spline.md | 9 - docs/api/modules/time.md | 103 -- docs/api/modules/tween.md | 58 - docs/api/modules/util.md | 192 ---- docs/api/modules/video.md | 5 - docs/api/prosperon.md | 35 - docs/api/types/PHYSFS_File.md | 55 - docs/api/types/SDL_Camera.md | 27 - docs/api/types/SDL_Cursor.md | 4 - docs/api/types/SDL_GPUBuffer.md | 3 - docs/api/types/SDL_GPUCommandBuffer.md | 231 ---- docs/api/types/SDL_GPUComputePass.md | 83 -- docs/api/types/SDL_GPUComputePipeline.md | 5 - docs/api/types/SDL_GPUCopyPass.md | 4 - docs/api/types/SDL_GPUDevice.md | 236 ---- docs/api/types/SDL_GPUFence.md | 5 - docs/api/types/SDL_GPUGraphicsPipeline.md | 5 - docs/api/types/SDL_GPURenderPass.md | 159 --- docs/api/types/SDL_GPUSampler.md | 4 - docs/api/types/SDL_GPUShader.md | 5 - docs/api/types/SDL_GPUTexture.md | 3 - docs/api/types/SDL_GPUTransferBuffer.md | 5 - docs/api/types/SDL_Renderer.md | 333 ------ docs/api/types/SDL_Surface.md | 68 -- docs/api/types/SDL_Texture.md | 16 - docs/api/types/SDL_Thread.md | 15 - docs/api/types/SDL_Window.md | 126 --- docs/api/types/datastream.md | 67 -- docs/api/types/enet_host.md | 66 -- docs/api/types/enet_peer.md | 102 -- docs/api/types/font.md | 66 -- docs/api/types/rtree.md | 84 -- docs/api/types/sprite.md | 68 -- docs/api/types/timer.md | 29 - docs/api/types/transform.md | 214 ---- docs/api/use.md | 7 - docs/{cell.md => cellscript.md} | 7 +- docs/dos.ttf | Bin 79584 -> 0 bytes docs/dull/Array.md | 661 ----------- docs/dull/ArrayBuffer.md | 7 - docs/dull/Function.md | 27 - docs/dull/Map.md | 120 -- docs/dull/Object.md | 87 -- docs/dull/Set.md | 104 -- docs/dull/String.md | 793 ------------- docs/dull/Symbol.md | 9 - docs/dull/WeakMap.md | 59 - docs/dull/WeakSet.md | 43 - docs/dull/array.md | 661 ----------- docs/dull/dull.png | Bin 224019 -> 0 bytes docs/dull/globals/Array.md | 47 - docs/dull/globals/Error.md | 7 - docs/dull/globals/Function.md | 7 - docs/dull/globals/Math.md | 458 -------- docs/dull/globals/Number.md | 99 -- docs/dull/globals/Object.md | 331 ------ docs/dull/globals/String.md | 49 - docs/dull/globals/Symbol.md | 59 - docs/dull/index.md | 15 - docs/exporting.md | 3 - docs/index.md | 34 +- docs/input.md | 54 - docs/mkdocs.yml | 41 - docs/{actors.md => programs.md} | 0 docs/prosperon.gif | Bin 78175 -> 0 bytes docs/quickstart.md | 133 --- docs/rendering.md | 36 - docs/requirements.txt | 17 - docs/resources.md | 17 - docs/style.css | 133 --- docs/tutorial.md | 67 -- 101 files changed, 16 insertions(+), 10064 deletions(-) delete mode 100644 docs/api/actor.md delete mode 100644 docs/api/console.md delete mode 100644 docs/api/index.md delete mode 100644 docs/api/modules/actor.md delete mode 100644 docs/api/modules/camera.md delete mode 100644 docs/api/modules/cmd.md delete mode 100644 docs/api/modules/color.md delete mode 100644 docs/api/modules/debug.md delete mode 100644 docs/api/modules/dmon.md delete mode 100644 docs/api/modules/doc.md delete mode 100644 docs/api/modules/draw2d.md delete mode 100644 docs/api/modules/enet.md delete mode 100644 docs/api/modules/event.md delete mode 100644 docs/api/modules/geometry.md delete mode 100644 docs/api/modules/graphics.md delete mode 100644 docs/api/modules/imgui.md delete mode 100644 docs/api/modules/input.md delete mode 100644 docs/api/modules/io.md delete mode 100644 docs/api/modules/js.md delete mode 100644 docs/api/modules/json.md delete mode 100644 docs/api/modules/loop.md delete mode 100644 docs/api/modules/math.md delete mode 100644 docs/api/modules/miniz.md delete mode 100644 docs/api/modules/nota.md delete mode 100644 docs/api/modules/os.md delete mode 100644 docs/api/modules/packer.md delete mode 100644 docs/api/modules/render.md delete mode 100644 docs/api/modules/resources.md delete mode 100644 docs/api/modules/sound.md delete mode 100644 docs/api/modules/spline.md delete mode 100644 docs/api/modules/time.md delete mode 100644 docs/api/modules/tween.md delete mode 100644 docs/api/modules/util.md delete mode 100644 docs/api/modules/video.md delete mode 100644 docs/api/prosperon.md delete mode 100644 docs/api/types/PHYSFS_File.md delete mode 100644 docs/api/types/SDL_Camera.md delete mode 100644 docs/api/types/SDL_Cursor.md delete mode 100644 docs/api/types/SDL_GPUBuffer.md delete mode 100644 docs/api/types/SDL_GPUCommandBuffer.md delete mode 100644 docs/api/types/SDL_GPUComputePass.md delete mode 100644 docs/api/types/SDL_GPUComputePipeline.md delete mode 100644 docs/api/types/SDL_GPUCopyPass.md delete mode 100644 docs/api/types/SDL_GPUDevice.md delete mode 100644 docs/api/types/SDL_GPUFence.md delete mode 100644 docs/api/types/SDL_GPUGraphicsPipeline.md delete mode 100644 docs/api/types/SDL_GPURenderPass.md delete mode 100644 docs/api/types/SDL_GPUSampler.md delete mode 100644 docs/api/types/SDL_GPUShader.md delete mode 100644 docs/api/types/SDL_GPUTexture.md delete mode 100644 docs/api/types/SDL_GPUTransferBuffer.md delete mode 100644 docs/api/types/SDL_Renderer.md delete mode 100644 docs/api/types/SDL_Surface.md delete mode 100644 docs/api/types/SDL_Texture.md delete mode 100644 docs/api/types/SDL_Thread.md delete mode 100644 docs/api/types/SDL_Window.md delete mode 100644 docs/api/types/datastream.md delete mode 100644 docs/api/types/enet_host.md delete mode 100644 docs/api/types/enet_peer.md delete mode 100644 docs/api/types/font.md delete mode 100644 docs/api/types/rtree.md delete mode 100644 docs/api/types/sprite.md delete mode 100644 docs/api/types/timer.md delete mode 100644 docs/api/types/transform.md delete mode 100644 docs/api/use.md rename docs/{cell.md => cellscript.md} (89%) delete mode 100644 docs/dos.ttf delete mode 100644 docs/dull/Array.md delete mode 100644 docs/dull/ArrayBuffer.md delete mode 100644 docs/dull/Function.md delete mode 100644 docs/dull/Map.md delete mode 100644 docs/dull/Object.md delete mode 100644 docs/dull/Set.md delete mode 100644 docs/dull/String.md delete mode 100644 docs/dull/Symbol.md delete mode 100644 docs/dull/WeakMap.md delete mode 100644 docs/dull/WeakSet.md delete mode 100644 docs/dull/array.md delete mode 100644 docs/dull/dull.png delete mode 100644 docs/dull/globals/Array.md delete mode 100644 docs/dull/globals/Error.md delete mode 100644 docs/dull/globals/Function.md delete mode 100644 docs/dull/globals/Math.md delete mode 100644 docs/dull/globals/Number.md delete mode 100644 docs/dull/globals/Object.md delete mode 100644 docs/dull/globals/String.md delete mode 100644 docs/dull/globals/Symbol.md delete mode 100644 docs/dull/index.md delete mode 100644 docs/exporting.md delete mode 100644 docs/input.md delete mode 100644 docs/mkdocs.yml rename docs/{actors.md => programs.md} (100%) delete mode 100644 docs/prosperon.gif delete mode 100644 docs/quickstart.md delete mode 100644 docs/rendering.md delete mode 100644 docs/requirements.txt delete mode 100644 docs/resources.md delete mode 100644 docs/style.css delete mode 100644 docs/tutorial.md diff --git a/README.md b/README.md index 458997d6..f872122d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1 @@ -Thank you for using Prosperon! - -Provided are prosperon builds for all available platforms. Simply run prosperon for your platform in a game folder to play! - -To get started, take a dive into the provided example games in the examples folder. You can either copy the prosperon executable into an example directory and run it there, or run `prosperon path/to/example` from the project root. - -You can take a look through the docs folder for the prosperon manual to learn all about it. The manual is available on the web at [docs.prosperon.dev](https://docs.prosperon.dev). +Read the docs to get started. diff --git a/docs/api/actor.md b/docs/api/actor.md deleted file mode 100644 index fdafbd98..00000000 --- a/docs/api/actor.md +++ /dev/null @@ -1,11 +0,0 @@ -# actor - -### toString() function - -### spawn(script, config, callback) function - -### clear() function - -### kill() function - -### delay(fn, seconds) function diff --git a/docs/api/console.md b/docs/api/console.md deleted file mode 100644 index a1a65453..00000000 --- a/docs/api/console.md +++ /dev/null @@ -1,37 +0,0 @@ -# console - -The console object provides various logging, debugging, and output methods. - -### print() function - -### spam(msg) function - -Output a spam-level message for very verbose logging. - -### debug(msg) function - -Output a debug-level message. - -### info(msg) function - -Output info level message. - -### warn(msg) function - -Output warn level message. - -### log(msg) function - -Output directly to in game console. - -### error(e) function - -Output error level message, and print stacktrace. - -### panic(e) function - -Output a panic-level message and exit the program. - -### assert(op, str = `assertion failed [value '${op}']`) function - -If the condition is false, print an error and panic. diff --git a/docs/api/index.md b/docs/api/index.md deleted file mode 100644 index 97e9273b..00000000 --- a/docs/api/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# Appendix B - api - -This is a complete list of accessible functions and parameters that are built into Prosperon. For the most part, developers will concern themselves with the modules, all of which can be imported with `use`. - -Types document particular javascript objects with a specific object in their prototype chain, which can allow access to an underlying C data structure. A lot of these are used only internally by Prosperon, but brave developers can pick around in the module internals to see how they're used and do their own thing if they want! \ No newline at end of file diff --git a/docs/api/modules/actor.md b/docs/api/modules/actor.md deleted file mode 100644 index 5f3d9b8b..00000000 --- a/docs/api/modules/actor.md +++ /dev/null @@ -1,87 +0,0 @@ -# actor - - -A set of utilities for iterating over a hierarchy of actor-like objects, as well -as managing tag-based lookups. Objects are assumed to have a "objects" property, -pointing to children or sub-objects, forming a tree. - - -### all_objects(fn, startobj) function - - -Iterate over each object (and its sub-objects) in the hierarchy, calling fn for each one. - - -**fn**: A callback function that receives each object. If it returns a truthy value, iteration stops and that value is returned. - -**startobj**: The root object at which iteration begins, default is the global "world". - - -**Returns**: The first truthy value returned by fn, or undefined if none. - - -### find_object(fn, startobj) function - - -Intended to find a matching object within the hierarchy. - - -**fn**: A callback or criteria to locate a particular object. - -**startobj**: The root object at which search begins, default "world". - - -**Returns**: Not yet implemented. - - -### tag_add(tag, obj) function - - -Associate the given object with the specified tag. Creates a new tag set if it does not exist. - - -**tag**: A string tag to associate with the object. - -**obj**: The object to add under this tag. - - -**Returns**: None - - -### tag_rm(tag, obj) function - - -Remove the given object from the specified tag’s set, if it exists. - - -**tag**: The tag to remove the object from. - -**obj**: The object to remove from the tag set. - - -**Returns**: None - - -### tag_clear_guid(obj) function - - -Remove the object from all tag sets. - - -**obj**: The object whose tags should be cleared. - - -**Returns**: None - - -### objects_with_tag(tag) function - - -Retrieve all objects currently tagged with the specified tag. - - -**tag**: A string tag to look up. - - -**Returns**: An array of objects associated with the given tag. - diff --git a/docs/api/modules/camera.md b/docs/api/modules/camera.md deleted file mode 100644 index 741ed994..00000000 --- a/docs/api/modules/camera.md +++ /dev/null @@ -1,46 +0,0 @@ -# camera - -### list() function - -Return an array of available camera device IDs. - - - -**Returns**: An array of camera IDs, or undefined if no cameras are available. - - -### open(id) function - -Open a camera device with the given ID. - - - -**id**: The camera ID to open. - - -**Returns**: A camera object on success, or throws an error if the camera cannot be opened. - - -### name(id) function - -Return the name of the camera with the given ID. - - - -**id**: The camera ID to query. - - -**Returns**: A string with the camera's name, or throws an error if the name cannot be retrieved. - - -### position(id) function - -Return the physical position of the camera with the given ID. - - - -**id**: The camera ID to query. - - -**Returns**: A string indicating the camera position ("unknown", "front", or "back"). - diff --git a/docs/api/modules/cmd.md b/docs/api/modules/cmd.md deleted file mode 100644 index 46f5e07f..00000000 --- a/docs/api/modules/cmd.md +++ /dev/null @@ -1,7 +0,0 @@ -# cmd - -### length number - -### name string - -### prototype object diff --git a/docs/api/modules/color.md b/docs/api/modules/color.md deleted file mode 100644 index d12a896f..00000000 --- a/docs/api/modules/color.md +++ /dev/null @@ -1,7 +0,0 @@ -# color - -### Color object - -### esc object - -### ColorMap object diff --git a/docs/api/modules/debug.md b/docs/api/modules/debug.md deleted file mode 100644 index c3017e44..00000000 --- a/docs/api/modules/debug.md +++ /dev/null @@ -1,76 +0,0 @@ -# debug - -### stack_depth() function - -Return the current stack depth. - - - -**Returns**: A number representing the stack depth. - - -### build_backtrace() function - -Build and return a backtrace of the current call stack. - - - -**Returns**: An object representing the call stack backtrace. - - -### closure_vars(fn) function - -Return the closure variables for a given function. - - - -**fn**: The function object to inspect. - - -**Returns**: An object containing the closure variables. - - -### local_vars(depth) function - -Return the local variables for a specific stack frame. - - - -**depth**: The stack frame depth to inspect. - - -**Returns**: An object containing the local variables at the specified depth. - - -### fn_info(fn) function - -Return metadata about a given function. - - - -**fn**: The function object to inspect. - - -**Returns**: An object with metadata about the function. - - -### backtrace_fns() function - -Return an array of functions in the current backtrace. - - - -**Returns**: An array of function objects from the call stack. - - -### dump_obj(obj) function - -Return a string representation of a given object. - - - -**obj**: The object to dump. - - -**Returns**: A string describing the object's contents. - diff --git a/docs/api/modules/dmon.md b/docs/api/modules/dmon.md deleted file mode 100644 index b14958ec..00000000 --- a/docs/api/modules/dmon.md +++ /dev/null @@ -1,39 +0,0 @@ -# dmon - -### watch() function - -Start watching the root directory, recursively. - -This function begins monitoring the specified directory and its subdirectories recursively for events such as file creation, deletion, modification, or movement. Events are queued and can be retrieved by calling poll. - -:throws: An error if dmon is already watching. - - -**Returns**: None - - -### unwatch() function - -Stop watching the currently monitored directory. - -This function halts filesystem monitoring for the directory previously set by watch. It clears the watch state, allowing a new watch to be started. - -:throws: An error if no directory is currently being watched. - - -**Returns**: None - - -### poll(callback) function - -Retrieve and process queued filesystem events. - -This function dequeues all pending filesystem events and invokes the provided callback for each one. The callback receives an event object with properties: 'action' (string: "create", "delete", "modify", or "move"), 'root' (string: watched directory), 'file' (string: affected file path), and 'old' (string: previous file path for move events, empty if not applicable). - - - -**callback**: A function to call for each event, receiving an event object as its argument. - - -**Returns**: None - diff --git a/docs/api/modules/doc.md b/docs/api/modules/doc.md deleted file mode 100644 index ff7fae21..00000000 --- a/docs/api/modules/doc.md +++ /dev/null @@ -1,38 +0,0 @@ -# doc - - -Provides a consistent way to create documentation for prosperon elements. Objects are documented by adding docstrings directly to object-like things (functions, objects, ...), or to an object's own "doc object". - -Docstrings are set to the symbol `cell.DOC` - -```js -// Suppose we have a module that returns a function -function greet(name) { log.console("Hello, " + name) } - -// We can attach a docstring -greet.doc = ` -Greets the user by name. -` - -// A single function is a valid return! -return greet -``` - -```js -// Another way is to add a docstring object to an object -var greet = { -hello() { log.console('hello!') } -} - -greet[cell.DOC] = {} -greet[cell.DOC][cell.DOC] = 'An object full of different greeter functions' -greet[cell.DOC].hello = 'A greeter that says, "hello!"' -``` - - -**name**: The name of the person to greet. - - -### writeDocFile(obj, title) function - -Return a markdown string for a given obj, with an optional title. diff --git a/docs/api/modules/draw2d.md b/docs/api/modules/draw2d.md deleted file mode 100644 index d1e27197..00000000 --- a/docs/api/modules/draw2d.md +++ /dev/null @@ -1,228 +0,0 @@ -# draw2d - - -A collection of 2D drawing functions that operate in screen space. Provides primitives -for lines, rectangles, text, sprite drawing, etc. - - -### point(pos, size, color) function - - - - -**pos**: A 2D position ([x, y]) where the point should be drawn. - -**size**: The size of the point (not currently affecting rendering). - -**color**: The color of the point, defaults to Color.blue. - - -**Returns**: None - - -### line(points, color, thickness, pipeline) function - - - - -**points**: An array of 2D positions representing the line vertices. - -**color**: The color of the line, default Color.white. - -**thickness**: The line thickness, default 1. - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### cross(pos, size, color, thickness, pipe) function - - - - -**pos**: The center of the cross as a 2D position ([x, y]). - -**size**: Half the size of each cross arm. - -**color**: The color of the cross, default Color.red. - -**thickness**: The thickness of each line, default 1. - -**pipe**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### arrow(start, end, color, wingspan, wingangle, pipe) function - - - - -**start**: The start position of the arrow ([x, y]). - -**end**: The end (tip) position of the arrow ([x, y]). - -**color**: The color, default Color.red. - -**wingspan**: The length of each arrowhead 'wing', default 4. - -**wingangle**: Wing rotation in degrees, default 10. - -**pipe**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### rectangle(rect, color, pipeline) function - - - - -**rect**: A rectangle object with {x, y, width, height}. - -**color**: The fill color, default Color.white. - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### tile(image, rect, color, tile, pipeline) function - - -:raises Error: If no image is provided. - - -**image**: An image object or string path to a texture. - -**rect**: A rectangle specifying draw location/size ({x, y, width, height}). - -**color**: The color tint, default Color.white. - -**tile**: A tiling definition ({repeat_x, repeat_y}), default tile_def. - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### slice9(image, rect, slice, color, info, pipeline) function - - -:raises Error: If no image is provided. - - -**image**: An image object or string path to a texture. - -**rect**: A rectangle specifying draw location/size, default [0, 0]. - -**slice**: The pixel inset or spacing for the 9-slice (number or object). - -**color**: The color tint, default Color.white. - -**info**: A slice9 info object controlling tiling of edges/corners. - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### image(image, rect, rotation, color, pipeline) function - - -:raises Error: If no image is provided. - - -**image**: An image object or string path to a texture. - -**rect**: A rectangle specifying draw location/size, default [0,0]; width/height default to image size. - -**rotation**: Rotation in degrees (not currently used). - -**color**: The color tint, default none. - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: A sprite object that was created for this draw call. - - -### images(image, rects, config) function - - -:raises Error: If no image is provided. - - -**image**: An image object or string path to a texture. - -**rects**: An array of rectangle objects ({x, y, width, height}) to draw. - -**config**: (Unused) Additional config data if needed. - - -**Returns**: An array of sprite objects created and queued for rendering. - - -### sprites(sprites, sort, pipeline) function - - - - -**sprites**: An array of sprite objects to draw. - -**sort**: Sorting mode or order, default 0. - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### circle(pos, radius, color, inner_radius, pipeline) function - - - - -**pos**: Center of the circle ([x, y]). - -**radius**: The circle radius. - -**color**: The fill color of the circle, default none. - -**inner_radius**: (Unused) Possibly ring thickness, default 1. - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - - -### text(text, rect, font, size, color, wrap, pipeline) function - - - - -**text**: The string to draw. - -**rect**: A rectangle specifying draw position (and possibly wrapping area). - -**font**: A font object or string path, default sysfont. - -**size**: (Unused) Possibly intended for scaling the font size. - -**color**: The text color, default Color.white. - -**wrap**: Pixel width for text wrapping, default 0 (no wrap). - -**pipeline**: (Optional) A pipeline or rendering state object. - - -**Returns**: None - diff --git a/docs/api/modules/enet.md b/docs/api/modules/enet.md deleted file mode 100644 index dd395cb1..00000000 --- a/docs/api/modules/enet.md +++ /dev/null @@ -1,45 +0,0 @@ -# enet - -### initialize() function - - -Initialize the ENet library. Must be called before using any ENet functionality. -Throws an error if initialization fails. - - - -**Returns**: None - - -### deinitialize() function - - -Deinitialize the ENet library, cleaning up all resources. Call this when you no longer -need any ENet functionality. - - - -**Returns**: None - - -### create_host(address) function - - -Create an ENet host for either a client-like unbound host or a server bound to a specific -address and port: - -- If no argument is provided, creates an unbound "client-like" host with default settings -(maximum 32 peers, 2 channels, unlimited bandwidth). -- If you pass an "ip:port" string (e.g. "127.0.0.1:7777"), it creates a server bound to -that address. The server supports up to 32 peers, 2 channels, and unlimited bandwidth. - -Throws an error if host creation fails for any reason. - -omit to create an unbound client-like host. - - -**address**: (optional) A string in 'ip:port' format to bind the host (server), or - - -**Returns**: An ENetHost object. - diff --git a/docs/api/modules/event.md b/docs/api/modules/event.md deleted file mode 100644 index 2b4a6e13..00000000 --- a/docs/api/modules/event.md +++ /dev/null @@ -1,25 +0,0 @@ -# event - -### push_event(event) function - -Push a custom user event into SDL's queue, passing a callback function. - - - -**event**: A function to call when this event is consumed. - - -**Returns**: None - - -### engine_input(callback) function - -Poll all system events (keyboard, mouse, etc.) and call the given function with each event object. - - - -**callback**: A function that executes on each event consumed from the poll. - - -**Returns**: None - diff --git a/docs/api/modules/geometry.md b/docs/api/modules/geometry.md deleted file mode 100644 index 26f2fb2b..00000000 --- a/docs/api/modules/geometry.md +++ /dev/null @@ -1,221 +0,0 @@ -# geometry - - -A collection of geometry-related functions for circles, spheres, boxes, polygons, -and rectangle utilities. Some functionality is implemented in C and exposed here. - - -### rect_intersection(a, b) function - - -Return the intersection of two rectangles. The result may be empty if no intersection. - - -**a**: The first rectangle as {x, y, w, h}. - -**b**: The second rectangle as {x, y, w, h}. - - -**Returns**: A rectangle that is the intersection of the two. May have zero width/height if no overlap. - - -### rect_intersects(a, b) function - - - - -**a**: Rectangle {x,y,w,h}. - -**b**: Rectangle {x,y,w,h}. - - -**Returns**: A boolean indicating whether the two rectangles overlap. - - -### rect_expand(a, b) function - - -Merge or combine two rectangles, returning their bounding rectangle. - - -**a**: Rectangle {x,y,w,h}. - -**b**: Rectangle {x,y,w,h}. - - -**Returns**: A new rectangle that covers the bounds of both input rectangles. - - -### rect_inside(inner, outer) function - - - - -**inner**: A rectangle to test. - -**outer**: A rectangle that may contain 'inner'. - - -**Returns**: True if 'inner' is completely inside 'outer', otherwise false. - - -### rect_random(rect) function - - - - -**rect**: A rectangle {x,y,w,h}. - - -**Returns**: A random point within the rectangle (uniform distribution). - - -### cwh2rect(center, wh) function - - -Helper: convert a center point and width/height vector to a rect object. - - -**center**: A 2D point [cx, cy]. - -**wh**: A 2D size [width, height]. - - -**Returns**: A rectangle {x, y, w, h} with x,y set to center and w,h set to the given size. - - -### rect_point_inside(rect, point) function - - - - -**rect**: A rectangle {x,y,w,h}. - -**point**: A 2D point [px, py]. - - -**Returns**: True if the point lies inside the rectangle, otherwise false. - - -### rect_pos(rect) function - - - - -**rect**: A rectangle {x,y,w,h}. - - -**Returns**: A 2D vector [x,y] giving the rectangle's position. - - -### rect_move(rect, offset) function - - - - -**rect**: A rectangle {x,y,w,h}. - -**offset**: A 2D vector to add to the rectangle's position. - - -**Returns**: A new rectangle with updated x,y offset. - - -### box(w, h) function - - -Construct a box centered at the origin with the given width and height. This overrides the box object above. - - -**w**: The width of the box. - -**h**: The height of the box. - - -**Returns**: An array of four 2D points representing the corners of a rectangle centered at [0,0]. - - -### sphere object - - -Sphere-related geometry functions: -- volume(r): Return the volume of a sphere with radius r. -- random(r, theta, phi): Return a random point on or inside a sphere. - - -### circle object - - -Circle-related geometry functions: -- area(r): Return the area of a circle with radius r. -- random(r, theta): Return a random 2D point on a circle; uses sphere.random internally and extracts x,z. - - -### ngon(radius, n) function - - -Generates a regular n-gon by calling geometry.arc with full 360 degrees. - - -**radius**: The radius of the n-gon from center to each vertex. - -**n**: Number of sides/vertices. - - -**Returns**: An array of 2D points forming a regular n-gon. - - -### arc(radius, angle, n, start) function - - -Generate an arc (or partial circle) of n points, each angle spread equally over 'angle' degrees from 'start'. - - -**radius**: The distance from center to the arc points. - -**angle**: The total angle (in degrees) over which points are generated, capped at 360. - -**n**: Number of segments (if <=1, empty array is returned). - -**start**: Starting angle (in degrees), default 0. - - -**Returns**: An array of 2D points along the arc. - - -### corners2points(ll, ur) function - - -Similar to box.points, but calculates differently. - - -**ll**: Lower-left 2D coordinate. - -**ur**: Upper-right 2D coordinate (relative offset in x,y). - - -**Returns**: A four-point array of corners [ll, lower-right, upper-right, upper-left]. - - -### sortpointsccw(points) function - - -Sort an array of points in CCW order based on their angles from the centroid. - - -**points**: An array of 2D points. - - -**Returns**: A new array of the same points, sorted counterclockwise around their centroid. - - -### points2cm(points) function - - - - -**points**: An array of 2D points. - - -**Returns**: The centroid (average x,y) of the given points. - diff --git a/docs/api/modules/graphics.md b/docs/api/modules/graphics.md deleted file mode 100644 index 165270c5..00000000 --- a/docs/api/modules/graphics.md +++ /dev/null @@ -1,278 +0,0 @@ -# graphics - - -Provides functionality for loading and managing images, fonts, textures, and sprite meshes. -Includes both JavaScript and C-implemented routines for creating geometry buffers, performing -rectangle packing, etc. - - -### make_sprite_mesh(sprites) function - - -:param oldMesh (optional): An existing mesh object to reuse/resize if possible. -Given an array of sprites, build a single geometry mesh for rendering them. - - -**sprites**: An array of sprite objects, each containing .rect (or transform), .src (UV region), .color, etc. - - -**Returns**: A GPU mesh object with pos, uv, color, and indices buffers for all sprites. - - -### make_sprite_queue(sprites, camera, pipeline, sort) function - - -Given an array of sprites, optionally sort them, then build a queue of pipeline commands. -Each group with a shared image becomes one command. - - -**sprites**: An array of sprite objects. - -**camera**: (unused in the C code example) Typically a camera or transform for sorting? - -**pipeline**: A pipeline object for rendering. - -**sort**: An integer or boolean for whether to sort sprites; if truthy, sorts by layer & texture. - - -**Returns**: An array of pipeline commands: geometry with mesh references, grouped by image. - - -### make_text_buffer(text, rect, angle, color, wrap, font) function - - -Generate a GPU buffer mesh of text quads for rendering with a font, etc. - - -**text**: The string to render. - -**rect**: A rectangle specifying position and possibly wrapping. - -**angle**: Rotation angle (unused or optional). - -**color**: A color for the text (could be a vec4). - -**wrap**: The width in pixels to wrap text, or 0 for no wrap. - -**font**: A font object created by graphics.make_font or graphics.get_font. - - -**Returns**: A geometry buffer mesh (pos, uv, color, indices) for rendering text. - - -### rectpack(width, height, sizes) function - - -Perform a rectangle packing using the stbrp library. Return positions for each rect. - - -**width**: The width of the area to pack into. - -**height**: The height of the area to pack into. - -**sizes**: An array of [w,h] pairs for the rectangles to pack. - - -**Returns**: An array of [x,y] coordinates placing each rect, or null if they don't fit. - - -### make_rtree() function - - -Create a new R-Tree for geometry queries. - - -**Returns**: An R-Tree object for quickly querying many rectangles or sprite bounds. - - -### make_texture(data) function - - -Convert raw image bytes into an SDL_Surface object. - - -**data**: Raw image bytes (PNG, JPG, etc.) as an ArrayBuffer. - - -**Returns**: An SDL_Surface object representing the decoded image in RAM, for use with GPU or software rendering. - - -### make_gif(data) function - - -Load a GIF, returning its frames. If it's a single-frame GIF, the result may have .surface only. - - -**data**: An ArrayBuffer containing GIF data. - - -**Returns**: An object with frames[], each frame having its own .surface. Some also have a .texture for GPU use. - - -### make_aseprite(data) function - - -Load an Aseprite/ASE file from an array of bytes, returning frames or animations. - - -**data**: An ArrayBuffer containing Aseprite (ASE) file data. - - -**Returns**: An object containing frames or animations, each with .surface. May also have top-level .surface for a single-layer case. - - -### cull_sprites(sprites, camera) function - - -Filter an array of sprites to only those visible in the provided camera’s view. - - -**sprites**: An array of sprite objects (each has rect or transform). - -**camera**: A camera or bounding rectangle defining the view area. - - -**Returns**: A new array of sprites that are visible in the camera's view. - - -### rects_to_sprites(rects, image) function - - -Convert an array of rect coords into sprite objects referencing a single image. - - -**rects**: An array of rect coords or objects. - -**image**: An image object (with .texture). - - -**Returns**: An array of sprite objects referencing the 'image' and each rect for UV or position. - - -### make_surface(dimensions) function - - -Create a blank surface in RAM. - - -**dimensions**: The size object {width, height}, or an array [w,h]. - - -**Returns**: A blank RGBA surface with the given dimensions, typically for software rendering or icons. - - -### make_cursor(opts) function - - - - -**opts**: An object with {surface, hotx, hoty} or similar. - - -**Returns**: An SDL_Cursor object referencing the given surface for a custom mouse cursor. - - -### make_font(data, size) function - - -Load a font from TTF/OTF data at the given size. - - -**data**: TTF/OTF file data as an ArrayBuffer. - -**size**: Pixel size for rendering glyphs. - - -**Returns**: A font object with surface, texture, and glyph data, for text rendering with make_text_buffer. - - -### make_sprite() function - - -Create a new sprite object, storing default properties. - - -**Returns**: A new sprite object, which typically has .rect, .color, .layer, .image, etc. - - -### make_line_prim(points, thickness, startCap, endCap, color) function - - -Build a GPU mesh representing a thick polyline from an array of points, using parsl or a similar library under the hood. - - -**points**: An array of [x,y] points forming the line. - -**thickness**: The thickness (width) of the polyline. - -**startCap**: (Unused) Possibly the type of cap for the start. - -**endCap**: (Unused) Possibly the type of cap for the end. - -**color**: A color to apply to the line. - - -**Returns**: A geometry mesh object suitable for rendering the line via a pipeline command. - - -### is_image(obj) function - - - - -**obj**: An object to check. - - -**Returns**: True if 'obj' has a .texture and a .rect property, indicating it's an image object. - - -### texture(path) function - - -Load or retrieve a cached image, converting it into a GPU texture. If 'path' is already an object, it’s returned directly. - - -**path**: A string path to an image file or an already-loaded image object. - - -**Returns**: An image object with {surface, texture, frames?, etc.} depending on the format. - - -### tex_hotreload(file) function - - -Reload the image for the given file, updating the cached copy in memory and GPU. - - -**file**: The file path that was changed on disk. - - -**Returns**: None - - -### get_font(path, size) function - - -Load a font from file if not cached, or retrieve from cache if already loaded. - - -**path**: A string path to a font file, optionally with ".size" appended. - -**size**: Pixel size of the font, if not included in 'path'. - - -**Returns**: A font object with .surface and .texture for rendering text. - - -### queue_sprite_mesh(queue) function - - -Builds a single geometry mesh for all sprite-type commands in the queue, storing first_index/num_indices -so they can be rendered in one draw call. - - -**queue**: An array of draw commands, some of which are {type:'sprite'} objects. - - -**Returns**: An array of references to GPU buffers [pos,uv,color,indices]. - diff --git a/docs/api/modules/imgui.md b/docs/api/modules/imgui.md deleted file mode 100644 index 4d129a85..00000000 --- a/docs/api/modules/imgui.md +++ /dev/null @@ -1,1244 +0,0 @@ -# imgui - -### windowpos() function - -Return the position of the current ImGui window as an ImVec2. - - - -**Returns**: A 2-element array [x, y] representing the top-left corner of the current window in screen coordinates. - - -### plot2pixels(coords) function - -Convert a point from plot coordinates to pixel coordinates in the current ImPlot. - - - -**coords**: A 2-element array [x, y] in plot coordinates. - - -**Returns**: A 2-element array [x, y] in pixel coordinates, mapped from the current ImPlot. - - -### plotpos() function - -Return the top-left corner of the current ImPlot region in screen (pixel) coordinates. - - - -**Returns**: A 2-element array [x, y] representing the position of the current ImPlot in screen coordinates. - - -### plotlimits() function - -Retrieve the current plot’s axis limits (min/max) for both X and Y axes. - - - -**Returns**: An object { x: { min, max }, y: { min, max } } describing the current plot’s visible axis ranges. - - -### setaxes(xAxis, yAxis) function - -Switch the active axes in ImPlot (useful if multiple axes exist). - - - -**xAxis**: The x-axis index (0..2). - -**yAxis**: The y-axis index (0..2). - - -**Returns**: None - - -### setupaxis(axis) function - -Setup the specified axis in the current ImPlot (e.g., for customizing tick labels). - - - -**axis**: The numeric index of the axis (0..2). - - -**Returns**: None - - -### inplot(coords) function - -Check if the given point is within the current ImPlot's visible region. - - - -**coords**: A 2-element array [x, y] in plot coordinates. - - -**Returns**: True if the point is within the visible plot region, otherwise false. - - -### window(title, callback) function - -Create a new ImGui window with the given title and invoke the callback to render inside it. - - - -**title**: The text displayed as the window title. - -**callback**: A function called to render the contents of the window. - - -**Returns**: A boolean indicating if the window is still active (open) after rendering. - - -### menu(label, callback) function - -Create a new menu entry in a menu bar or menu. The callback is invoked to populate the menu if opened. - - - -**label**: The label of the menu (visible in the menubar). - -**callback**: A function called to render menu items when the menu is open. - - -**Returns**: None - - -### sameline(offset) function - -Place the next widget on the same line, optionally specifying a horizontal offset. - - - -**offset**: A float offset from the current cursor position. If omitted, defaults to 0. - - -**Returns**: None - - -### int(label, value) function - -Display an integer input box with a label. - - - -**label**: The label text for the input. - -**value**: The initial integer value. - - -**Returns**: The updated integer value after user edits. - - -### pushid(id) function - -Push an integer ID onto the ImGui ID stack. - - - -**id**: An integer used to differentiate widgets/items with the same label. - - -**Returns**: None - - -### popid() function - -Pop an ID off the ImGui ID stack. - - - -**Returns**: None - - -### slider(label, value, minValue, maxValue) function - -Create a float slider (or multi-float sliders if given an array) within the specified range. - - - -**label**: The slider label text. - -**value**: A single float or an array of floats (e.g., [r,g,b,a]). - -**minValue**: The minimum slider value. - -**maxValue**: The maximum slider value. - - -**Returns**: The updated float or array of floats after user adjustment. - - -### intslider(label, value, minValue, maxValue) function - -Create an integer slider (or multiple integer sliders if given a typed array) in the specified range. - - - -**label**: The slider label text. - -**value**: A single integer or a typed array of integers (for multi-component sliders). - -**minValue**: The minimum integer value. - -**maxValue**: The maximum integer value. - - -**Returns**: The updated integer or array of integers after user adjustment. - - -### menubar(callback) function - -Begin rendering a menubar. The callback is invoked to create menu items. Ends automatically. - - - -**callback**: A function that creates menu items within the menubar. - - -**Returns**: None - - -### mainmenubar(callback) function - -Create the main menu bar at the top of the screen. The callback is invoked for populating it. - - - -**callback**: A function to render items in the main menu bar. - - -**Returns**: None - - -### menuitem(label, shortcut, callback, selected) function - -Create a menu item that can optionally be toggled. If selected, calls the provided callback. - - - -**label**: The text label of the menu item. - -**shortcut**: An optional shortcut text to display (e.g. "Ctrl+S"). - -**callback**: A function called if the user clicks or activates this item. - -**selected**: A boolean indicating whether this menu item is toggled or not. - - -**Returns**: A boolean reflecting the toggled state. - - -### radio(label, active) function - -Create a radio button. - - - -**label**: The text label for the radio button. - -**active**: Whether this radio button is currently selected. - - -**Returns**: True if this radio button is now selected by the user, otherwise false. - - -### image(texture) function - -Render a texture as an image at a default size (100x100). - - - -**texture**: The GPU texture to display. - - -**Returns**: None - - -### imagebutton(label, texture, callback) function - -Create an ImageButton widget which displays a texture; calls the callback when clicked. - - - -**label**: A string identifier (not visually used). - -**texture**: The GPU texture to display on the button. - -**callback**: A function called when the button is clicked. - - -**Returns**: None - - -### textinput(label, text) function - -Show a single-line text input widget. - - - -**label**: The label text next to the input box. - -**text**: The current text. If undefined, the box starts empty. - - -**Returns**: The updated text string after user editing. - - -### textbox(label, text) function - -Show a multi-line text input widget. - - - -**label**: The label text next to the input box. - -**text**: The current multi-line text. If undefined, starts empty. - - -**Returns**: The updated text after user editing. - - -### button(label, callback) function - -Create a button. The callback fires if the user clicks it. - - - -**label**: The text displayed on the button. - -**callback**: The function called on click. - - -**Returns**: None - - -### checkbox(label, checked) function - -Create a checkbox to toggle a boolean value. - - - -**label**: The text label for the checkbox. - -**checked**: The current boolean state. - - -**Returns**: The updated boolean state after user toggle. - - -### text(text) function - -Render a line of text in the ImGui window. - - - -**text**: The string to display. - - -**Returns**: None - - -### plot(title, callback) function - -Begin a new ImPlot region with the specified title. Calls the callback to render plot contents. - - - -**title**: The title (label) of the plot. - -**callback**: A function that sets up and draws within the ImPlot region. - - -**Returns**: None - - -### lineplot(label, data, shaded, lastPoint) function - -Plot a line graph in the current ImPlot. - - - -**label**: The label for the line plot. - -**data**: An array of [x,y] points or a single array of y-values. - -**shaded**: Boolean indicating if the area under the line should be filled. - -**lastPoint**: (Optional) Additional point or frame usage. (Currently partial/placeholder in code.) - - -**Returns**: None - - -### scatterplot(label, data, shaded, lastPoint) function - -Plot a scatter graph in the current ImPlot. - - - -**label**: The label for the scatter plot. - -**data**: An array of [x,y] points or a single array of y-values. - -**shaded**: Typically unused for scatter. - -**lastPoint**: (Optional) Additional param if needed. - - -**Returns**: None - - -### stairplot(label, data, shaded, lastPoint) function - -Plot a stair-step graph in the current ImPlot. - - - -**label**: The label for the stair plot. - -**data**: An array of [x,y] points or a single array of y-values. - -**shaded**: A boolean to fill under the stair-step line. - -**lastPoint**: (Optional) Extended data usage if needed. - - -**Returns**: None - - -### digitalplot(label, data, shaded, lastPoint) function - -Plot a digital (step-like) graph in the current ImPlot. - - - -**label**: The label for the digital plot. - -**data**: An array of [x,y] points or a single array of y-values. - -**shaded**: Typically not used for digital plots. - -**lastPoint**: (Optional) Extended data usage if needed. - - -**Returns**: None - - -### barplot(label, data, width) function - -Plot a bar chart in the current ImPlot. - - - -**label**: The label for the bar series. - -**data**: An array of [x,y] points or just an array of y-values. - -**width**: The width of each bar in plot units. - - -**Returns**: None - - -### textplot(text, coords) function - -Render text at the specified coordinates in plot space. - - - -**text**: The string to render. - -**coords**: A 2-element array [x, y] in plot coordinates. - - -**Returns**: None - - -### histogramplot(label, data) function - -Plot a histogram from the given data array/typed array in the current ImPlot. - - - -**label**: The label for the histogram. - -**data**: A typed array (or numeric array) containing the values to bin/display. - - -**Returns**: None - - -### plotaxes(xLabel, yLabel) function - -Set up labels for the X and Y axes of the current ImPlot. - - - -**xLabel**: The label for the x-axis. - -**yLabel**: The label for the y-axis. - - -**Returns**: None - - -### plotmousepos() function - -Get the mouse cursor’s position in the current plot’s coordinate system. - - - -**Returns**: A 2-element array [x, y] representing the mouse position in plot coordinates. - - -### plothovered() function - -Check if the mouse is hovering over the current ImPlot. - - - -**Returns**: True if the plot area is hovered, otherwise false. - - -### axeslimits(xMin, xMax, yMin, yMax) function - -Set up the visible axis limits in the current ImPlot. - - - -**xMin**: The left (min) bound of the x-axis. - -**xMax**: The right (max) bound of the x-axis. - -**yMin**: The bottom (min) bound of the y-axis. - -**yMax**: The top (max) bound of the y-axis. - - -**Returns**: None - - -### prepend(commandBuffer) function - -Prepare ImGui draw data for rendering, typically called after ImGui::Render(). - - - -**commandBuffer**: The SDL GPU command buffer where draw data will be queued. - - -**Returns**: None - - -### fitaxis(axis) function - -Fit either the x-axis or y-axis to its data range on the next plot frame. - - - -**axis**: 0 for X-axis, 1 for Y-axis. - - -**Returns**: None - - -### columns(count) function - -Switch the layout to use a specified number of columns. - - - -**count**: The number of columns to layout in the current region. - - -**Returns**: None - - -### nextcolumn() function - -Advance to the next column in a multi-column layout. - - - -**Returns**: None - - -### collapsingheader(label) function - -Create a collapsible header. Returns true if it is open (expanded). - - - -**label**: The text label of the header. - - -**Returns**: True if the header is expanded, otherwise false. - - -### tree(label, callback) function - -Create a tree node. If opened, calls the callback for nested content. - - - -**label**: The label for the tree node. - -**callback**: A function called if the node is expanded. - - -**Returns**: None - - -### listbox(label, items, selectedIndex) function - -Create a list box widget to select from a list of strings. - - - -**label**: The label next to the list box. - -**items**: An array of strings to display. - -**selectedIndex**: The currently selected index. - - -**Returns**: The updated selected index after user selection. - - -### axisfmt(axis, callback) function - -Set a custom formatter for a specified y-axis in ImPlot. - - - -**axis**: The y-axis index (0..2) to format. - -**callback**: A function(value) => string that converts axis values to text. - - -**Returns**: None - - -### tabbar(label, callback) function - -Begin a tab bar container. The callback is invoked to create tabs. - - - -**label**: The identifier label of the tab bar. - -**callback**: A function that creates tab items. - - -**Returns**: None - - -### tab(label, callback) function - -Create a tab item. If selected, calls the callback for tab content. - - - -**label**: The name of the tab. - -**callback**: A function to render the tab’s content if active. - - -**Returns**: None - - -### open_popup(label) function - -Open a popup by its identifier. - - - -**label**: The identifier of the popup to open. - - -**Returns**: None - - -### modal(label, callback) function - -Begin a modal popup. The callback is invoked to display contents if the modal is open. - - - -**label**: The identifier of the modal popup. - -**callback**: A function for rendering the modal’s UI if open. - - -**Returns**: None - - -### popup(label, callback) function - -Begin a popup. The callback is invoked if the popup is open. - - - -**label**: The identifier of the popup. - -**callback**: A function for rendering the popup’s UI. - - -**Returns**: None - - -### close_popup() function - -Close the current popup. - - - -**Returns**: None - - -### context(label, callback) function - -Create a popup context menu. The callback is invoked if the menu opens. - - - -**label**: The identifier for the context menu. - -**callback**: A function that renders menu items in the context. - - -**Returns**: None - - -### table(label, columns, callback, sortCallback) function - -Create a table with multiple columns. Optionally enable sorting and pass a sort callback. - - - -**label**: The identifier for the table. - -**columns**: The number of columns. - -**callback**: A function to populate the table (rows/cells). - -**sortCallback**: An optional function(columnIndex, ascending) called if user sorts a column. - - -**Returns**: None - - -### tablenextcolumn() function - -Move to the next column in a table row. - - - -**Returns**: None - - -### tablenextrow() function - -Move to the next row in a table. - - - -**Returns**: None - - -### tableheadersrow() function - -Create a row of headers in the current table (should be called once after column setup). - - - -**Returns**: None - - -### tableangledheadersrow() function - -Create an angled header row (for advanced usage). Typically not used as often. - - - -**Returns**: None - - -### tablesetupcolumn(label) function - -Setup configuration for a single column in the table. - - - -**label**: The label/header text for this column. - - -**Returns**: None - - -### dnd(type, payload, callback) function - -Begin a drag source for custom data payload. - - - -**type**: A string identifier for the drag-drop payload type. - -**payload**: A numeric payload stored in the drag-drop. - -**callback**: (Currently unused) Placeholder if you want to do extra on drag start. - - -**Returns**: None - - -### dndtarget(type, callback) function - -Create a drop target for matching drag-drop payload type. Invokes callback on drop. - - - -**type**: A string identifier for the drag-drop payload type to accept. - -**callback**: A function(payloadNumber) called when a matching payload is dropped. - - -**Returns**: None - - -### color(label, color) function - -Create a color editor (3 or 4 floats). Returns the updated color. - - - -**label**: The label for the color editor. - -**color**: An array [r,g,b] or [r,g,b,a]. - - -**Returns**: Updated color array after user input. - - -### startnode(callback, linkCreatedCallback, nodeHoveredCallback, linkHoveredCallback) function - -Begin a node editor session with ImNodes. The callback defines nodes. -Additional callbacks handle link creation and hover events. - - - -**callback**: A function to define node editor contents (adding nodes, etc). - -**linkCreatedCallback**: A function(startAttr, endAttr) called when a new link is created. - -**nodeHoveredCallback**: A function(nodeId) called when a node is hovered. - -**linkHoveredCallback**: A function(linkId) called when a link is hovered. - - -**Returns**: None - - -### node(nodeId, callback) function - -Begin a node with a unique ID, then call the callback to define its contents. - - - -**nodeId**: A unique integer ID for this node. - -**callback**: A function that populates the node’s UI. - - -**Returns**: None - - -### nodein(attributeId, callback) function - -Create an input attribute in the current node. - - - -**attributeId**: The attribute ID for this input. - -**callback**: A function that defines the UI within the input attribute. - - -**Returns**: None - - -### nodeout(attributeId, callback) function - -Create an output attribute in the current node. - - - -**attributeId**: The attribute ID for this output. - -**callback**: A function that defines the UI within the output attribute. - - -**Returns**: None - - -### nodelink(linkId, startAttributeId, endAttributeId) function - -Link two node attributes by their IDs. - - - -**linkId**: A unique integer ID for this link. - -**startAttributeId**: The attribute ID where the link starts. - -**endAttributeId**: The attribute ID where the link ends. - - -**Returns**: None - - -### nodemini(size) function - -Show a minimap for the current node editor. - - - -**size**: A float controlling the minimap size ratio. - - -**Returns**: None - - -### mousehoveringrect(min, max) function - -Check if the mouse is hovering within the given rectangle. - - - -**min**: A 2-element array [x, y] for the top-left corner. - -**max**: A 2-element array [x, y] for the bottom-right corner. - - -**Returns**: True if the mouse is within that rectangle, otherwise false. - - -### mouseclicked(button) function - -Check if a specific mouse button was clicked (went from up to down) this frame. - - - -**button**: An integer for the mouse button index (0 = left, 1 = right, etc). - - -**Returns**: True if the button was clicked, otherwise false. - - -### mousedown(button) function - -Check if the specified mouse button is currently held down. - - - -**button**: The mouse button index. - - -**Returns**: True if the button is down, otherwise false. - - -### mousereleased(button) function - -Check if the specified mouse button was released this frame. - - - -**button**: The mouse button index. - - -**Returns**: True if the button was released, otherwise false. - - -### mousedragging(button) function - -Check if the mouse is being dragged with the specified button. - - - -**button**: The mouse button index. - - -**Returns**: True if the mouse is dragging, otherwise false. - - -### mousedelta() function - -Get the mouse movement delta (difference) for the current frame. - - - -**Returns**: A 2-element array [dx, dy] representing the mouse movement. - - -### rect(pMin, pMax, color) function - -Draw a rectangle outline in the current window’s draw list. - - - -**pMin**: A 2-element array [x, y] for the top-left corner. - -**pMax**: A 2-element array [x, y] for the bottom-right corner. - -**color**: A 4-element array [r, g, b, a] specifying the outline color. - - -**Returns**: None - - -### rectfilled(pMin, pMax, color) function - -Draw a filled rectangle in the current window’s draw list. - - - -**pMin**: [x, y] for the top-left corner. - -**pMax**: [x, y] for the bottom-right corner. - -**color**: [r, g, b, a] fill color. - - -**Returns**: None - - -### line(p1, p2, color) function - -Draw a line between two points in the current window’s draw list. - - - -**p1**: [x, y] start position. - -**p2**: [x, y] end position. - -**color**: [r, g, b, a] line color. - - -**Returns**: None - - -### bezierquad(p1, p2, p3, color, thickness) function - -Draw a quadratic bezier curve. - - - -**p1**: [x, y] start point. - -**p2**: [x, y] control point. - -**p3**: [x, y] end point. - -**color**: [r, g, b, a] color. - -**thickness**: Line thickness. - - -**Returns**: None - - -### beziercubic(p1, p2, p3, p4, color, thickness) function - -Draw a cubic bezier curve. - - - -**p1**: [x, y] start point. - -**p2**: [x, y] first control point. - -**p3**: [x, y] second control point. - -**p4**: [x, y] end point. - -**color**: [r, g, b, a] color. - -**thickness**: Line thickness. - - -**Returns**: None - - -### point(center, radius, color) function - -Draw a filled circle (point) in the current window’s draw list. - - - -**center**: [x, y] center of the circle. - -**radius**: The radius of the circle. - -**color**: [r, g, b, a] fill color. - - -**Returns**: None - - -### drawtext(text, position, color) function - -Draw text at the given screen position with a specified color. - - - -**text**: The string to draw. - -**position**: [x, y] in screen coordinates. - -**color**: [r, g, b, a] text color. - - -**Returns**: None - - -### cursorscreenpos() function - -Get the current ImGui cursor screen position. - - - -**Returns**: A 2-element array [x, y] in screen coordinates. - - -### setcursorscreenpos(position) function - -Set the ImGui cursor screen position. - - - -**position**: A 2-element array [x, y] in screen coordinates. - - -**Returns**: None - - -### contentregionavail() function - -Return the available space in the current window’s content region. - - - -**Returns**: A 2-element array [width, height] of available space. - - -### dummy(size) function - -Add a dummy item (invisible) of the specified size to the layout. - - - -**size**: A 2-element array [width, height]. - - -**Returns**: None - - -### invisiblebutton(label, size) function - -Create an invisible button that occupies a given size and can catch clicks. - - - -**label**: The identifier for the button. - -**size**: [width, height] specifying the button area. - - -**Returns**: None - - -### width(width) function - -Set the width of the next item in the layout. - - - -**width**: The width (in pixels) for the next item. - - -**Returns**: None - - -### setclipboard(text) function - -Set the system clipboard text. - - - -**text**: The string to put into the clipboard. - - -**Returns**: None - - -### newframe() function - -Start a new ImGui frame. Should be called once per frame before rendering UI elements. - - - -**Returns**: None - - -### endframe(commandBuffer, renderPass) function - -Finalize and render the ImGui draw data to the specified command buffer and render pass. - - - -**commandBuffer**: The SDL GPU command buffer to render into. - -**renderPass**: The SDL GPU render pass used to draw ImGui data. - - -**Returns**: None - - -### wantmouse() function - -Check if ImGui wants to capture the mouse (e.g., if a window or widget needs mouse events). - - - -**Returns**: True if ImGui is capturing the mouse, otherwise false. - - -### wantkeys() function - -Check if ImGui wants to capture the keyboard (e.g., if a text input is active). - - - -**Returns**: True if ImGui is capturing the keyboard, otherwise false. - - -### init(gpuDevice, window) function - -Initialize ImGui with SDL and SDL_gpu, creating the ImGui context and configuring it. - - - -**gpuDevice**: The SDL_GPUDevice object. - -**window**: The SDL_Window object to attach ImGui onto. - - -**Returns**: None - - -### render_menu(render) function - -### prosperon_menu() function diff --git a/docs/api/modules/input.md b/docs/api/modules/input.md deleted file mode 100644 index f31580f4..00000000 --- a/docs/api/modules/input.md +++ /dev/null @@ -1,68 +0,0 @@ -# input - -### mouse_show(show) function - -Show or hide the mouse cursor. Pass true to show, false to hide. - - - -**show**: Boolean. True to show, false to hide. - - -**Returns**: None - - -### mouse_lock(lock) function - -Capture or release the mouse, confining it within the window if locked. - - - -**lock**: Boolean. True to lock, false to unlock. - - -**Returns**: None - - -### cursor_set(cursor) function - -Set the given cursor (created by os.make_cursor) as the active mouse cursor. - - - -**cursor**: The cursor to set. - - -**Returns**: None - - -### keyname(keycode) function - -Given a numeric keycode, return the corresponding key name (e.g., from SDL). - - - -**keycode**: A numeric SDL keycode. - - -**Returns**: A string with the key name. - - -### keymod() function - -Return an object describing the current modifier keys, e.g. {shift:true, ctrl:true}. - - - -**Returns**: An object with boolean fields for each modifier key. - - -### mousestate() function - -Return an object describing the current mouse state, including x,y coordinates -and booleans for pressed buttons (left, middle, right, x1, x2). - - - -**Returns**: Object { x, y, left, middle, right, x1, x2 } - diff --git a/docs/api/modules/io.md b/docs/api/modules/io.md deleted file mode 100644 index 23cbdb35..00000000 --- a/docs/api/modules/io.md +++ /dev/null @@ -1,243 +0,0 @@ -# io - -### rm(path) function - -Remove the file or empty directory at the given path. - - - -**path**: The file or empty directory to remove. Must be empty if a directory. - - -**Returns**: None - - -### mkdir(path) function - -Create a directory at the given path. - - - -**path**: The directory path to create. - - -**Returns**: None - - -### stat(path) function - -Return an object describing file metadata for the given path. The object includes -filesize, modtime, createtime, and accesstime. Throw an error if the path does not exist. - - - -**path**: The file or directory to retrieve metadata for. - - -**Returns**: An object with metadata (filesize, modtime, createtime, accesstime). - - -### globfs(patterns) function - -Return an array of files that do not match any of the provided glob patterns. It -recursively enumerates the filesystem within PHYSFS. Each pattern is treated as an -"ignore" rule, similar to .gitignore usage. - - - -**patterns**: An array of glob patterns to ignore. Any file matching one of these is skipped. - - -**Returns**: An array of matching file paths. - - -### match(pattern, string) function - -Return boolean indicating whether the given wildcard pattern matches the provided -string. Dots must match dots. Case is not ignored. - -Patterns can incorporate: -'?' - Matches exactly one character (except leading dots or slashes). -'*' - Matches zero or more characters (excluding path separators). -'**' - Matches zero or more characters, including path separators. -'[abc]' - A bracket expression; matches any single character from the set. Ranges like [a-z], [0-9] also work. -'[[:alpha:]]' - POSIX character classes can be used inside brackets. -'\' - Backslash escapes the next character. -'!' - If placed immediately inside brackets (like [!abc]), it negates the set. - - - -**pattern**: The wildcard pattern to compare. - -**string**: The string to test against the wildcard pattern. - - -**Returns**: True if matched, otherwise false. - - -### exists(path) function - -Return a boolean indicating whether the file or directory at the given path exists. - - - -**path**: The file or directory path to check. - - -**Returns**: True if the path exists, otherwise false. - - -### mount(archiveOrDir, mountPoint) function - -Mount a directory or archive at the specified mount point. An undefined mount -point mounts to '/'. Throw on error. - - - -**archiveOrDir**: The directory or archive to mount. - -**mountPoint**: The path at which to mount. If omitted or undefined, '/' is used. - - -**Returns**: None - - -### unmount(path) function - -Unmount a previously mounted directory or archive. Throw on error. - - - -**path**: The directory or archive mount point to unmount. - - -**Returns**: None - - -### slurp(path) function - -Read the entire file at the given path as a string. Throw on error. - - - -**path**: The file path to read from. - - -**Returns**: A string with the file’s contents. - - -### slurpbytes(path) function - -Read the entire file at the given path as a raw ArrayBuffer. Throw on error. - - - -**path**: The file path to read from. - - -**Returns**: An ArrayBuffer containing the file’s raw bytes. - - -### slurpwrite(data, path) function - -Write data (string or ArrayBuffer) to the given file path. Overwrite if it exists. -Throw on error. - - - -**data**: The data to write (string or ArrayBuffer). - -**path**: The file path to write to. - - -**Returns**: None - - -### writepath(path) function - -Set the write directory. Subsequent writes will go here by default. Throw on error. - - - -**path**: The directory path to set as writable. - - -**Returns**: None - - -### basedir() function - -Return the application's base directory (where the executable is located). - - - -**Returns**: A string with the base directory path. - - -### prefdir(org, app) function - -Get the user-and-app-specific path where files can be written. - - - -**org**: The name of your organization. - -**app**: The name of your application. - - -**Returns**: A string with the user's directory path. - - -### realdir(path) function - -Return the actual, real directory (on the host filesystem) that contains the given -file path. Return undefined if not found. - - - -**path**: The file path whose real directory is requested. - - -**Returns**: A string with the real directory path, or undefined. - - -### open(path) function - -Open a file for writing, returning a file object that can be used for further -operations. Throw on error. - - - -**path**: The file path to open for writing. - - -**Returns**: A file object for subsequent write operations. - - -### searchpath() function - -Return an array of all directories in the current paths. - - - -**Returns**: An array of directory paths in the search path. - - -### enumerate(path, recurse) function - -Return an array of files within the given directory, optionally recursing into -subdirectories. - - - -**path**: The directory to list. - -**recurse**: Whether to recursively include subdirectories (true or false). - - -**Returns**: An array of file (and directory) paths found. - - -### mount_core() function - -### is_directory() function diff --git a/docs/api/modules/js.md b/docs/api/modules/js.md deleted file mode 100644 index af7b08f2..00000000 --- a/docs/api/modules/js.md +++ /dev/null @@ -1,175 +0,0 @@ -# js - - -Provides functions for introspecting and configuring the QuickJS runtime engine. -Includes debug info, memory usage, GC controls, code evaluation, etc. - - -### cycle_hook(callback) function - - -or undefined to remove the callback. - -Register or remove a hook function that QuickJS calls once per execution cycle. If the callback -is set, it receives a single argument (an optional object/value describing the cycle). If callback -is undefined, the hook is removed. - - -**callback**: A function to call each time QuickJS completes a "cycle" (internal VM loop), - - -**Returns**: None - - -### dump_shapes() function - - -Use this for internal debugging of object shapes. - - -**Returns**: A debug string describing the internal shape hierarchy used by QuickJS. - - -### dump_atoms() function - - -known by QuickJS. Helpful for diagnosing memory usage or potential key collisions. - - -**Returns**: A debug string listing all currently registered atoms (internal property keys/symbols) - - -### dump_class() function - - -Shows how many objects of each class exist, useful for advanced memory or performance profiling. - - -**Returns**: A debug string describing the distribution of JS object classes in the QuickJS runtime. - - -### dump_objects() function - - -useful for debugging memory leaks or object lifetimes. - - -**Returns**: A debug string listing certain internal QuickJS objects and their references, - - -### dump_type_overheads() function - - -Displays memory usage breakdown for different internal object types. - - -**Returns**: A debug string describing the overheads for various JS object types in QuickJS. - - -### stack_info() function - - -Internal debugging utility to examine call stack details. - - -**Returns**: An object or string describing the runtime's current stack usage and capacity. - - -### calc_mem(value) function - - - -Compute the approximate size of a single JS value in memory. This is a best-effort estimate. - - -**value**: A JavaScript value to analyze. - - -**Returns**: Approximate memory usage (in bytes) of that single value. - - -### mem() function - - -including total allocated bytes, object counts, and more. - -Retrieve an overview of the runtime’s memory usage. - - -**Returns**: An object containing a comprehensive snapshot of memory usage for the current QuickJS runtime, - - -### mem_limit(bytes) function - - - -Set the upper memory limit for the QuickJS runtime. Exceeding this limit may cause operations to -fail or throw errors. - - -**bytes**: The maximum memory (in bytes) QuickJS is allowed to use. - - -**Returns**: None - - -### gc_threshold(bytes) function - - - -Set the threshold (in bytes) for QuickJS to perform an automatic GC pass when memory usage surpasses it. - - -**bytes**: The threshold (in bytes) at which the engine triggers automatic garbage collection. - - -**Returns**: None - - -### max_stacksize(bytes) function - - - -Set the maximum stack size for QuickJS. If exceeded, the runtime may throw a stack overflow error. - - -**bytes**: The maximum allowed stack size (in bytes) for QuickJS. - - -**Returns**: None - - -### memstate() function - - - -Gives a quick overview of the memory usage, including malloc size and other allocations. - - -**Returns**: A simpler memory usage object (malloc sizes, etc.) for the QuickJS runtime. - - -### gc() function - - - -Force an immediate, full garbage collection pass, reclaiming unreachable memory. - - -**Returns**: None - - -### eval(src, filename) function - - - -Execute a string of JavaScript code in the current QuickJS context. - - -**src**: A string of JavaScript source code to evaluate. - -**filename**: (Optional) A string for the filename or label, used in debugging or stack traces. - - -**Returns**: The result of evaluating the given source code. - diff --git a/docs/api/modules/json.md b/docs/api/modules/json.md deleted file mode 100644 index 572292b6..00000000 --- a/docs/api/modules/json.md +++ /dev/null @@ -1,15 +0,0 @@ -# json - -### encode(val,space,replacer,whitelist) function - -Produce a JSON text from a Javascript object. If a record value, at any level, contains a json() method, it will be called, and the value it returns (usually a simpler record) will be JSONified. - -If the record does not have a json() method, and if whitelist is a record, then only the keys that are associated with true in the whitelist are included. - -If the space input is true, then line breaks and extra whitespace will be included in the text. - -### decode(text,reviver) function - -The text text is parsed, and the resulting value (usually a record or an array) is returned. - -The optional reviver input is a method that will be called for every key and value at every level of the result. Each value will be replaced by the result of the reviver function. This can be used to reform data-only records into method-bearing records, or to transform date strings into seconds. diff --git a/docs/api/modules/loop.md b/docs/api/modules/loop.md deleted file mode 100644 index cf3e6540..00000000 --- a/docs/api/modules/loop.md +++ /dev/null @@ -1,3 +0,0 @@ -# loop - -### step() function diff --git a/docs/api/modules/math.md b/docs/api/modules/math.md deleted file mode 100644 index 0574abc0..00000000 --- a/docs/api/modules/math.md +++ /dev/null @@ -1,115 +0,0 @@ -# math - -### dot() function - -Compute the dot product between two numeric arrays, returning a scalar. Extra elements are ignored. - -### project() function - -Project one vector onto another, returning a new array of the same dimension. - -### rotate() function - -Rotate a 2D point (or array of length 2) by the given angle (in turns) around an optional pivot. - -### midpoint() function - -Compute the midpoint of two arrays of numbers. Only the first two entries are used if 2D is intended. - -### reflect() function - -Reflect a vector across a plane normal. Both arguments must be numeric arrays. - -### distance() function - -Compute the Euclidean distance between two numeric arrays of matching length. - -### direction() function - -Compute the normalized direction vector from the first array to the second. - -### angle() function - -Given a 2D vector, return its angle from the X-axis in radians or some chosen units. - -### norm() function - -Return a normalized copy of the given numeric array. For 2D/3D/4D or arbitrary length. - -### angle_between() function - -Compute the angle between two vectors (2D/3D/4D). - -### lerp() function - -Linear interpolation between two numbers: lerp(a, b, t). - -### gcd() function - -Compute the greatest common divisor of two integers. - -### lcm() function - -Compute the least common multiple of two integers. - -### clamp() function - -Clamp a number between low and high. clamp(value, low, high). - -### angledist() function - -Compute the signed distance between two angles in 'turn' units, e.g. 0..1 range. - -### jitter() function - -Apply a random +/- percentage noise to a number. Example: jitter(100, 0.05) -> ~95..105. - -### mean() function - -Compute the arithmetic mean of an array of numbers. - -### sum() function - -Sum all elements of an array of numbers. - -### sigma() function - -Compute standard deviation of an array of numbers. - -### median() function - -Compute the median of an array of numbers. - -### length() function - -Return the length of a vector (i.e. sqrt of sum of squares). - -### from_to() function - -Return an array of points from a start to an end, spaced out by a certain distance. - -### rand() function - -Return a random float in [0,1). - -### randi() function - -Return a random 32-bit integer. - -### srand() function - -Seed the random number generator with the given integer, or with current time if none. - -### TAU number - -### deg2rad(deg) function - -### rad2deg(rad) function - -### turn2rad(x) function - -### rad2turn(x) function - -### turn2deg(x) function - -### deg2turn(x) function diff --git a/docs/api/modules/miniz.md b/docs/api/modules/miniz.md deleted file mode 100644 index 7a8ee0f8..00000000 --- a/docs/api/modules/miniz.md +++ /dev/null @@ -1,27 +0,0 @@ -# miniz - -### read(data) function - -Create a zip reader from the given ArrayBuffer containing an entire ZIP archive. -Return undefined if the data is invalid. - - - -**data**: An ArrayBuffer with the entire ZIP file. - - -**Returns**: A 'zip reader' object with methods for reading from the archive (mod, exists, slurp). - - -### write(path) function - -Create a zip writer that writes to the specified file path. Overwrites the file if -it already exists. Return undefined on error. - - - -**path**: The file path where the ZIP archive will be written. - - -**Returns**: A 'zip writer' object with methods for adding files to the archive (add_file). - diff --git a/docs/api/modules/nota.md b/docs/api/modules/nota.md deleted file mode 100644 index 545e72a0..00000000 --- a/docs/api/modules/nota.md +++ /dev/null @@ -1,30 +0,0 @@ -# nota - -### encode(value) function - -Convert a JavaScript value into a NOTA-encoded ArrayBuffer. - -This function serializes JavaScript values (such as numbers, strings, booleans, arrays, objects, or ArrayBuffers) into the NOTA binary format. The resulting ArrayBuffer can be stored or transmitted and later decoded back into a JavaScript value. - -:throws: An error if no argument is provided. - - -**value**: The JavaScript value to encode (e.g., number, string, boolean, array, object, or ArrayBuffer). - - -**Returns**: An ArrayBuffer containing the NOTA-encoded data. - - -### decode(buffer) function - -Decode a NOTA-encoded ArrayBuffer into a JavaScript value. - -This function deserializes a NOTA-formatted ArrayBuffer into its corresponding JavaScript representation, such as a number, string, boolean, array, object, or ArrayBuffer. If the input is invalid or empty, it returns undefined. - - - -**buffer**: An ArrayBuffer containing NOTA-encoded data to decode. - - -**Returns**: The decoded JavaScript value (e.g., number, string, boolean, array, object, or ArrayBuffer), or undefined if no argument is provided. - diff --git a/docs/api/modules/os.md b/docs/api/modules/os.md deleted file mode 100644 index 5ad4494e..00000000 --- a/docs/api/modules/os.md +++ /dev/null @@ -1,101 +0,0 @@ -# os - -### make_transform() function - -Create a new transform object that can be used for 2D/3D positioning, scaling, and rotation. - -### clean_transforms() function - -Force an update on all transforms to remove dangling references or perform house-keeping. - -### platform() function - -Return a string with the underlying platform name, like 'Windows', 'Linux', or 'macOS'. - -### arch() function - -Return the CPU architecture string for this system (e.g. 'x64', 'arm64'). - -### totalmem() function - -Return the total system RAM in bytes. - -### freemem() function - -Return the amount of free system RAM in bytes, if known. - -### hostname() function - -Return the system's hostname, or an empty string if not available. - -### version() function - -Return the OS or kernel version string, if the platform provides it. - -### kill() function - -Send a signal (e.g., 'SIGINT', 'SIGTERM', etc.) to the current process. - -### exit() function - -Exit the application with the specified exit code. - -### now() function - -Return current time (in seconds as a float) with high resolution. - -### openurl() function - -Open the provided URL in the default web browser, if possible. - -### make_timer() function - -Create a new timer object that will call a specified function after a certain delay. - -### update_timers() function - -Advance all timers by the provided time delta (in seconds). - -### sleep() function - -Block execution for the specified number of seconds. - -### battery_pct() function - -Return the battery level (percentage) or negative if unknown. - -### battery_voltage() function - -Return the current battery voltage in volts, if available. - -### battery_seconds() function - -Return the estimated remaining battery time in seconds, or negative if unknown. - -### power_state() function - -Return a string describing power status: 'on battery', 'charging', 'charged', etc. - -### on() function - -Register a global callback for certain engine-wide or system-level events. - -### rt_info() function - -Return internal QuickJS runtime info, such as object counts. - -### rusage() function - -Return resource usage stats for this process, if the platform supports it. - -### mallinfo() function - -Return detailed memory allocation info (arena size, free blocks, etc.) on some platforms. - -### env() function - -Fetch the value of a given environment variable, or undefined if it doesn't exist. - -### system() function - -Execute a shell command using the system() call. Returns the command's exit code. diff --git a/docs/api/modules/packer.md b/docs/api/modules/packer.md deleted file mode 100644 index 5db63459..00000000 --- a/docs/api/modules/packer.md +++ /dev/null @@ -1,44 +0,0 @@ -# packer - -### getAllFiles(dir) function - - -Return a list of all files in the given directory that are not matched by .prosperonignore, -skipping directories. - - - -**dir**: The directory to search. - - -**Returns**: An array of file paths found. - - -### gatherStats(filePaths) function - - -Analyze a list of files and categorize them as modules, programs, images, or other. - - - -**filePaths**: An array of file paths to analyze. - - -**Returns**: An object { modules, programs, images, other, total } with counts. - - -### pack(dir, outPath) function - - -Create a ZIP archive of all files (skipping those matched by .prosperonignore) in the -specified directory and write it to outPath. This uses the miniz module. - - - -**dir**: The directory to zip. - -**outPath**: The path (including filename) for the resulting ZIP file. - - -**Returns**: None (synchronous). Throws an Error if the directory does not exist. - diff --git a/docs/api/modules/render.md b/docs/api/modules/render.md deleted file mode 100644 index 93e65537..00000000 --- a/docs/api/modules/render.md +++ /dev/null @@ -1,96 +0,0 @@ -# render - -### _main object - -A handle for low-level GPU operations via SDL GPU. Freed on GC. - - -### device object - -### stencil_writer(...args) function - -### fillmask(ref) function - -Draw a fullscreen shape using a 'screenfill' shader to populate the stencil buffer with a given reference. - - - -**ref**: The stencil reference value to write. - - -**Returns**: None - - -### mask(image, pos, scale, rotation, ref) function - -Draw an image to the stencil buffer, marking its area with a specified reference value. - - - -**image**: A texture or string path (which is converted to a texture). - -**pos**: The translation (x, y) for the image placement. - -**scale**: Optional scaling applied to the texture. - -**rotation**: Optional rotation in radians (unused by default). - -**ref**: The stencil reference value to write. - - -**Returns**: None - - -### viewport(rect) function - -Set the GPU viewport to the specified rectangle. - - - -**rect**: A rectangle [x, y, width, height]. - - -**Returns**: None - - -### scissor(rect) function - -Set the GPU scissor region to the specified rectangle (alias of render.viewport). - - - -**rect**: A rectangle [x, y, width, height]. - - -**Returns**: None - - -### queue(cmd) function - -Enqueue one or more draw commands. These commands are batched until render_camera is called. - - - -**cmd**: Either a single command object or an array of command objects. - - -**Returns**: None - - -### setup_draw() function - -Switch the current queue to the primary scene render queue, then invoke 'prosperon.draw' if defined. - - - -**Returns**: None - - -### setup_hud() function - -Switch the current queue to the HUD render queue, then invoke 'prosperon.hud' if defined. - - - -**Returns**: None - diff --git a/docs/api/modules/resources.md b/docs/api/modules/resources.md deleted file mode 100644 index a0af8811..00000000 --- a/docs/api/modules/resources.md +++ /dev/null @@ -1,68 +0,0 @@ -# resources - -### scripts object - -### images object - -### sounds object - -### fonts object - -### lib object - -### canonical(file) function - -### find_image(...args) function - -### find_sound(...args) function - -### find_script(...args) function - -### find_font(...args) function - -### getAllFiles(dir) function - - -Return a list of recognized files in the given directory that are not matched by -.prosperonignore, skipping directories. Recognized extensions include scripts, -images, sounds, fonts, and libs. - - - -**dir**: The directory to search. - - -**Returns**: An array of recognized file paths. - - -### gatherStats(filePaths) function - - -Analyze a list of recognized files and categorize them by scripts, images, sounds, -fonts, libs, or other. Return a stats object with these counts and the total. - - - -**filePaths**: An array of file paths to analyze. - - -**Returns**: { scripts, images, sounds, fonts, lib, other, total } - - -### pack(dir, outPath) function - - -Create a ZIP archive of all recognized files (skipping those matched by .prosperonignore) -in the specified directory and write it to outPath. Recognized extensions are scripts, -images, sounds, fonts, or libs. - -:raises Error: If the directory does not exist. - - -**dir**: The directory to zip. - -**outPath**: The path (including filename) for the resulting ZIP file. - - -**Returns**: None - diff --git a/docs/api/modules/sound.md b/docs/api/modules/sound.md deleted file mode 100644 index d7cd2afc..00000000 --- a/docs/api/modules/sound.md +++ /dev/null @@ -1,11 +0,0 @@ -# sound - -### undefined string - -### pcm(file) function - -### play(file) function - -### cry(file) function - -### music(file, fade = 0.5) function diff --git a/docs/api/modules/spline.md b/docs/api/modules/spline.md deleted file mode 100644 index b070ddcb..00000000 --- a/docs/api/modules/spline.md +++ /dev/null @@ -1,9 +0,0 @@ -# spline - -### catmull() function - -Perform Catmull-Rom spline sampling on an array of 2D points, returning an array of samples. - -### bezier() function - -Perform a Bezier spline (or catmull) sampling on 2D points, returning an array of sampled points. diff --git a/docs/api/modules/time.md b/docs/api/modules/time.md deleted file mode 100644 index 158567a9..00000000 --- a/docs/api/modules/time.md +++ /dev/null @@ -1,103 +0,0 @@ -# time - -The main time object, handling date/time utilities in earth-seconds. - -### now() function - -Return the current system time in seconds (implemented in C extension). - -### computer_dst() function - -Return true if local system time is currently in DST (implemented in C extension). - -### computer_zone() function - -Return local time zone offset from UTC in hours (implemented in C extension). - -### second number - -Number of seconds in a (real) second (always 1). - -### minute number - -Number of seconds in a minute (60). - -### hour number - -Number of seconds in an hour (3600). - -### day number - -Number of seconds in a day (86400). - -### week number - -Number of seconds in a week (604800). - -### weekdays object - -Names of the days of the week, Sunday through Saturday. - -### monthstr object - -Full names of the months of the year, January through December. - -### epoch number - -Base epoch year, from which day 0 is calculated (default 1970). - -### hour2minute() function - -Return the ratio of hour to minute in seconds, e.g. 3600 / 60 => 60. - -### day2hour() function - -Return the ratio of day to hour in seconds, e.g. 86400 / 3600 => 24. - -### minute2second() function - -Return the ratio of minute to second in seconds, e.g. 60 / 1 => 60. - -### week2day() function - -Return the ratio of week to day in seconds, e.g. 604800 / 86400 => 7. - -### strparse object - -Mapping of format tokens (yyyy, mm, dd, etc.) to time fields (year, month, day...). - -### isleap(year) function - -Return true if a given year is leap, based on whether it has 366 days. - -### yearsize(y) function - -Given a year, return 365 or 366 depending on leap-year rules. - -### timecode(t, fps = 24) function - -Convert seconds into a "S:frames" timecode string, with optional FPS (default 24). - -### monthdays object - -An array of days in each month for a non-leap year. - -### zones object - -Table of recognized time zone abbreviations, with offsets (e.g., "-12" -> "IDLW"). - -### record(num, zone = this.computer_zone() function - -Convert a timestamp (in seconds) into a record with fields like day, month, year, etc. - -### number(rec) function - -Convert a record back into a numeric timestamp (seconds). - -### fmt string - -Default format string for time.text(), containing tokens like 'yyyy', 'dd', 'hh', etc. - -### text(num, fmt = this.fmt, zone) function - -Format a numeric or record time into a string using a format pattern, e.g. 'hh:nn:ss'. diff --git a/docs/api/modules/tween.md b/docs/api/modules/tween.md deleted file mode 100644 index f987a249..00000000 --- a/docs/api/modules/tween.md +++ /dev/null @@ -1,58 +0,0 @@ -# tween - -### Tween object - - -An object providing methods to create and control tweens with additional features -like looping, custom easing, multiple stages, etc. - -Properties: -- default: A template object with loop/time/ease/whole/cb properties. -Methods: -- start(obj, target, tvals, options): Create a tween over multiple target values. -- make: Alias of start. - - -### Ease object - - -This object provides multiple easing functions that remap a 0..1 input to produce -a smoothed or non-linear output. They can be used standalone or inside tweens. - -Available functions: -- linear(t) -- in(t), out(t), inout(t) -- quad.in, quad.out, quad.inout -- cubic.in, cubic.out, cubic.inout -- quart.in, quart.out, quart.inout -- quint.in, quint.out, quint.inout -- expo.in, expo.out, expo.inout -- bounce.in, bounce.out, bounce.inout -- sine.in, sine.out, sine.inout -- elastic.in, elastic.out, elastic.inout - -All easing functions expect t in [0..1] and return a remapped value in [0..1]. - - -### tween(from, to, time, fn, cb) function - - - -Creates a simple tween that linearly interpolates from "from" to "to" over "time" -and calls "fn" with each interpolated value. Once finished, "fn" is called with "to", -then "cb" is invoked if provided, and the tween is cleaned up. - - -**from**: The starting object or value to interpolate from. - -**to**: The ending object or value to interpolate to. - -**time**: The total duration of the tween in milliseconds or some time unit. - -**fn**: A callback function that receives the interpolated value at each update. - -**cb**: (Optional) A callback invoked once the tween completes. - - -**Returns**: A function that, when called, cleans up and stops the tween. - diff --git a/docs/api/modules/util.md b/docs/api/modules/util.md deleted file mode 100644 index 7f6f951c..00000000 --- a/docs/api/modules/util.md +++ /dev/null @@ -1,192 +0,0 @@ -# util - - -A collection of general-purpose utility functions for object manipulation, merging, -deep copying, safe property access, etc. - - -### guid() function - - -Return a random 32-character hexadecimal UUID-like string (not guaranteed RFC4122-compliant). - - -**Returns**: A random 32-character string (hex). - - -### insertion_sort(arr, cmp) function - - -In-place insertion sort of an array using cmp(a,b)->Number for ordering. - - -**arr**: The array to be sorted in-place. - -**cmp**: Comparison function cmp(a,b)->Number. - - -**Returns**: The same array, sorted in-place. - - -### deepfreeze(obj) function - - -Recursively freeze an object and all of its nested objects so they cannot be modified. - - -**obj**: The object to recursively freeze. - - -**Returns**: None - - -### dainty_assign(target, source) function - - -Copy non-function properties from source into matching keys of target without overwriting -keys that don't exist in target. Arrays are deep-copied, and objects are recursively assigned. - - -**target**: The target object whose keys may be updated. - -**source**: The source object containing new values. - - -**Returns**: None - - -### get(obj, path, defValue) function - - -Safely retrieve a nested property from obj at path (array or dot-string). -Returns defValue if the property is undefined. - - -**obj**: The object to traverse. - -**path**: A string like "a.b.c" or an array of path segments. - -**defValue**: The default value if the property is undefined. - - -**Returns**: The nested property or defValue. - - -### isEmpty(o) function - - -Return true if the object has no own properties, otherwise false. - - -**o**: The object to check. - - -**Returns**: Boolean indicating if the object is empty. - - -### dig(obj, path, def) function - - -Ensure a nested path of objects exists inside obj; create objects if missing, and set -the final path component to def. - - -**obj**: The root object to modify. - -**path**: A dot-string specifying nested objects to create. - -**def**: The value to store in the final path component, default {}. - - -**Returns**: The assigned final value. - - -### access(obj, name) function - - -Traverse obj by dot-separated path name, returning the final value or undefined -if any step is missing. - - -**obj**: The object to traverse. - -**name**: A dot-string path (e.g. "foo.bar.baz"). - - -**Returns**: The value at that path, or undefined if missing. - - -### mergekey(o1, o2, k) function - - -Helper for merge, updating key k from o2 into o1. Arrays are deep-copied and objects are -recursively merged. - - -**o1**: The target object. - -**o2**: The source object. - -**k**: The key to merge. - - -**Returns**: None - - -### merge(target, objs) function - - -Merge all passed objects into target, copying or merging each key as needed. -Arrays are deep-copied, objects are recursively merged, etc. - - -**target**: The target object. - -**objs**: One or more objects to merge into target. - - -**Returns**: The updated target object. - - -### copy(proto, objs) function - - -Create a new object with proto as its prototype, then mix in additional objects’ properties. - - -**proto**: The prototype object for the new object. - -**objs**: One or more objects whose properties will be mixed in. - - -**Returns**: The newly created object. - - -### obj_lerp(a, b, t) function - - -Linearly interpolate between two objects a and b by factor t, assuming each property -supports .lerp(). - - -**a**: The start object (its properties must have .lerp()). - -**b**: The end object (matching properties). - -**t**: Interpolation factor (0..1). - - -**Returns**: A new object with interpolated properties. - - -### normalizeSpacing(spacing) function - - -Normalize any spacing input into a {l, r, t, b} object. - - -**spacing**: A number, an array of length 2 or 4, or an object with l/r/t/b. - - -**Returns**: An object {l, r, t, b}. - diff --git a/docs/api/modules/video.md b/docs/api/modules/video.md deleted file mode 100644 index 92ac692c..00000000 --- a/docs/api/modules/video.md +++ /dev/null @@ -1,5 +0,0 @@ -# video - -### make_video() function - -Decode a video file (MPEG, etc.) from an ArrayBuffer, returning a datastream object. diff --git a/docs/api/prosperon.md b/docs/api/prosperon.md deleted file mode 100644 index f13284c8..00000000 --- a/docs/api/prosperon.md +++ /dev/null @@ -1,35 +0,0 @@ -# prosperon - -### c_types object - -### argv object - -### version string - -### revision string - -### engine_start() function - -### DOC symbol - -### on(type, callback) function - -### dispatch(type, data) function - -### PATH object - -### appupdate(...args) function - -### update(...args) function - -### physupdate(...args) function - -### gui(...args) function - -### hud(...args) function - -### draw(...args) function - -### imgui(...args) function - -### app(...args) function diff --git a/docs/api/types/PHYSFS_File.md b/docs/api/types/PHYSFS_File.md deleted file mode 100644 index 46803890..00000000 --- a/docs/api/types/PHYSFS_File.md +++ /dev/null @@ -1,55 +0,0 @@ -# PHYSFS_File - -A file handle opened via PhysFS for writing or reading. Freed automatically when references go away. - - -### close() function - -Close this file handle. Throws on error. - - - -**Returns**: None - - -### write(data) function - -Write data (string or ArrayBuffer) to the file. Throws on error. - - - -**data**: The data to write (string or ArrayBuffer). - - -**Returns**: None - - -### buffer(size) function - -Enable an internal write buffer of the given size on this file. - - - -**size**: Size in bytes of the buffer. - - -**Returns**: None - - -### tell() function - -Return the current position in the file. - - - -**Returns**: A numeric offset. - - -### eof() function - -Return whether the file pointer is at end-of-file. - - - -**Returns**: True if at EOF, false otherwise. - diff --git a/docs/api/types/SDL_Camera.md b/docs/api/types/SDL_Camera.md deleted file mode 100644 index de33f0fd..00000000 --- a/docs/api/types/SDL_Camera.md +++ /dev/null @@ -1,27 +0,0 @@ -# SDL_Camera - -A handle to a physical camera device. Freed when references drop or camera is closed. - - -### frame() function - -Acquire the latest camera frame (as an SDL_Surface). Returns undefined if no -new frame is available yet. Throws on error. - - - -**Returns**: SDL_Surface or undefined. - - -### release_frame(surface) function - -Release a frame surface previously acquired via camera.frame(). Must be -done for each acquired frame. - - - -**surface**: The surface to release. - - -**Returns**: None - diff --git a/docs/api/types/SDL_Cursor.md b/docs/api/types/SDL_Cursor.md deleted file mode 100644 index 8731d8f4..00000000 --- a/docs/api/types/SDL_Cursor.md +++ /dev/null @@ -1,4 +0,0 @@ -# SDL_Cursor - -An SDL cursor handle. Freed automatically on GC. No direct methods. - diff --git a/docs/api/types/SDL_GPUBuffer.md b/docs/api/types/SDL_GPUBuffer.md deleted file mode 100644 index 6c54bdf5..00000000 --- a/docs/api/types/SDL_GPUBuffer.md +++ /dev/null @@ -1,3 +0,0 @@ -# SDL_GPUBuffer - -### name() function diff --git a/docs/api/types/SDL_GPUCommandBuffer.md b/docs/api/types/SDL_GPUCommandBuffer.md deleted file mode 100644 index cebb8fa2..00000000 --- a/docs/api/types/SDL_GPUCommandBuffer.md +++ /dev/null @@ -1,231 +0,0 @@ -# SDL_GPUCommandBuffer - -A command buffer that accumulates rendering, copy, and compute operations. Freed after submission or GC. - - -### render_pass(passDesc) function - -Begin a render pass with color/depth attachments. Provide an object with -'color_targets' and optional 'depth_stencil'. Returns an SDL_GPURenderPass handle. - - - -**passDesc**: {color_targets:[...], depth_stencil:...} - - -**Returns**: SDL_GPURenderPass - - -### compute_pass(storageTextures, storageBuffers) function - -Begin a compute pass reading/writing given arrays of textures and buffers. - - - -**storageTextures**: array of read/write textures - -**storageBuffers**: array of read/write buffers - - -**Returns**: SDL_GPUComputePass - - -### swapchain_pass(clearColor) function - -Begin a render pass that directly targets the swapchain (the window). Clears -with the specified color. - - - -**clearColor**: [r,g,b,a] - - -**Returns**: SDL_GPURenderPass - - -### acquire_swapchain() function - -Acquire the current swapchain texture from the window. Internal usage. - - - -**Returns**: SDL_GPUTexture handle - - -### bind_vertex_buffer(slot, buffer) function - -Bind a GPU buffer as the vertex buffer at a given slot. - - - -**slot**: Integer slot index. - -**buffer**: The SDL_GPUBuffer. - - -**Returns**: None - - -### bind_index_buffer(buffer, offset) function - -Bind a GPU buffer as the index buffer (16-bit or 32-bit). - - - -**buffer**: The SDL_GPUBuffer. - -**offset**: Optional offset in bytes. - - -**Returns**: None - - -### bind_fragment_sampler(slot, texture, sampler) function - -Bind a texture+sampler pair to a particular fragment shader slot. - - - -**slot**: Index of the sampler binding. - -**texture**: The SDL_GPUTexture - -**sampler**: The SDL_GPUSampler - - -**Returns**: None - - -### push_vertex_uniform_data(slot, data) function - -Push raw data to a vertex shader uniform block. - - - -**slot**: The uniform buffer slot. - -**data**: An ArrayBuffer with the data to upload. - - -**Returns**: None - - -### push_fragment_uniform_data(slot, data) function - -Push raw data to a fragment shader uniform block. - - - -**slot**: The uniform buffer slot index. - -**data**: An ArrayBuffer with uniform data. - - -**Returns**: None - - -### push_compute_uniform_data(slot, data) function - -Push raw data to a compute shader uniform buffer. - - - -**slot**: The uniform buffer slot. - -**data**: An ArrayBuffer with the data. - - -**Returns**: None - - -### submit() function - -Submit this command buffer to the GPU and return a fence for synchronization. - - - -**Returns**: An SDL_GPUFence - - -### cancel() function - -Cancel (discard) this command buffer without submitting. - - - -**Returns**: None - - -### camera(cameraTransform, uniformSlot) function - -Write a camera transform (projection/view) to a uniform slot for 3D or 2D usage. - - - -**cameraTransform**: A camera object or transform with .pos, fov, etc. - -**uniformSlot**: The integer uniform buffer slot to which data is pushed. - - -**Returns**: None - - -### hud(sizeVec2, uniformSlot) function - -Write an orthographic full-screen "HUD" matrix to a uniform slot. Typically used -for 2D overlays. - - - -**sizeVec2**: [width, height] of the viewport area. - -**uniformSlot**: The integer uniform buffer slot. - - -**Returns**: None - - -### push_debug_group(name) function - -Push a named debug group marker onto the GPU command list (for debuggers/profilers). - - - -**name**: The debug label string. - - -**Returns**: None - - -### pop_debug_group() function - -Pop the most recent debug group marker. - - - -**Returns**: None - - -### debug_label(label) function - -Insert a one-off debug label at the current spot in the command list. - - - -**label**: The debug label string - - -**Returns**: None - - -### blit(blitDesc) function - -Blit one GPU texture to another with optional flip mode, filter, and clear operations. - - - -**blitDesc**: { src:{texture,mip_level, etc}, dst:{texture,...}, load_op, flip, filter, clear_color:[r,g,b,a] } - - -**Returns**: None - diff --git a/docs/api/types/SDL_GPUComputePass.md b/docs/api/types/SDL_GPUComputePass.md deleted file mode 100644 index 99ea7abf..00000000 --- a/docs/api/types/SDL_GPUComputePass.md +++ /dev/null @@ -1,83 +0,0 @@ -# SDL_GPUComputePass - -A compute pass for dispatching compute pipelines. Freed after end() or GC. - - -### dispatch(x, y, z) function - -Dispatch the compute pipeline with the specified threadgroup counts. - - - -**x**: Number of groups in X dimension - -**y**: Number of groups in Y dimension - -**z**: Number of groups in Z dimension - - -**Returns**: None - - -### end() function - -End this compute pass. - - - -**Returns**: None - - -### pipeline(computePipeline) function - -Bind a compute pipeline in this pass. - - - -**computePipeline**: The SDL_GPUComputePipeline - - -**Returns**: None - - -### samplers(arrayOfSamplerBindings, firstSlot) function - -Bind a set of texture/sampler pairs for compute usage. - - - -**arrayOfSamplerBindings**: e.g. [ {texture, sampler}, ...] - -**firstSlot**: The starting sampler slot. - - -**Returns**: None - - -### storage_buffers(arrayOfBuffers, firstSlot) function - -Bind an array of storage buffers for the compute shader. - - - -**arrayOfBuffers**: The buffers - -**firstSlot**: Starting binding slot. - - -**Returns**: None - - -### storage_textures(arrayOfTextures, firstSlot) function - -Bind an array of storage textures for the compute shader. - - - -**arrayOfTextures**: The textures - -**firstSlot**: Starting binding slot - - -**Returns**: None - diff --git a/docs/api/types/SDL_GPUComputePipeline.md b/docs/api/types/SDL_GPUComputePipeline.md deleted file mode 100644 index 4ae86226..00000000 --- a/docs/api/types/SDL_GPUComputePipeline.md +++ /dev/null @@ -1,5 +0,0 @@ -# SDL_GPUComputePipeline - -Encapsulates a compute shader program plus associated resource layouts. -Created via device.compute_pipeline(...). - diff --git a/docs/api/types/SDL_GPUCopyPass.md b/docs/api/types/SDL_GPUCopyPass.md deleted file mode 100644 index 10096344..00000000 --- a/docs/api/types/SDL_GPUCopyPass.md +++ /dev/null @@ -1,4 +0,0 @@ -# SDL_GPUCopyPass - -A pass for CPU<->GPU or GPU<->GPU copy operations. No direct JS API besides internal usage. - diff --git a/docs/api/types/SDL_GPUDevice.md b/docs/api/types/SDL_GPUDevice.md deleted file mode 100644 index 809e1f26..00000000 --- a/docs/api/types/SDL_GPUDevice.md +++ /dev/null @@ -1,236 +0,0 @@ -# SDL_GPUDevice - -A handle for low-level GPU operations via SDL GPU. Freed on GC. - - -### claim_window(window) function - -Claim an existing SDL_Window so this GPU device can render to it. - - - -**window**: The SDL_Window to attach. - - -**Returns**: None - - -### make_pipeline(pipelineDesc) function - -Create a new graphics pipeline from a descriptor object specifying shaders, -blend states, vertex format, etc. - - - -**pipelineDesc**: An object containing pipeline fields (vertexShader, blend, etc.). - - -**Returns**: A SDL_GPUGraphicsPipeline handle. - - -### compute_pipeline(desc) function - -Create a compute pipeline from a descriptor (shader code, threadgroup sizes, etc.). - - - -**desc**: An object with shader code, thread counts, etc. - - -**Returns**: SDL_GPUComputePipeline handle. - - -### set_swapchain(composition, presentMode) function - -Specify how the swapchain (final rendered image) is composed, e.g. 'sdr', 'hdr', -and present mode like 'vsync' or 'immediate'. - - - -**composition**: E.g. 'sdr', 'linear', or 'hdr'. - -**presentMode**: E.g. 'vsync', 'immediate', 'mailbox'. - - -**Returns**: None - - -### sort_sprite(a, b) function - -A comparator function used for sorting sprite objects by layer, y, and texture. -Usually used internally. - - - -**a**: A sprite object. - -**b**: Another sprite object. - - -**Returns**: <0, 0, or >0 for sort ordering. - - -### make_sampler(samplerDesc) function - -Create a sampler object specifying filtering, wrapping, anisotropy, etc. - - - -**samplerDesc**: An object with min_filter, mag_filter, etc. - - -**Returns**: SDL_GPUSampler handle. - - -### load_texture(surface, compressionLevel) function - -Upload an SDL_Surface into a GPU texture, optionally compressing with DXT. Freed automatically. - - - -**surface**: An SDL_Surface. - -**compressionLevel**: 0=none, 1=DXT1 or DXT5, 2=high quality, etc. - - -**Returns**: SDL_GPUTexture - - -### texture(desc) function - -Create a GPU texture with the specified format usage. - - - -**desc**: Object with {width, height, layers, type, format, usage, etc.} - - -**Returns**: SDL_GPUTexture - - -### make_quad() function - -Return a simple 2-triangle quad geometry covering [0,1]x[0,1]. -Useful for post-processing passes. - - - -**Returns**: A mesh {pos, uv, color, indices}. - - -### driver() function - -Return the name of the underlying GPU driver in use (e.g. 'OpenGL'). - - - -**Returns**: A string with driver name. - - -### make_shader(desc) function - -Compile raw shader code (vertex or fragment) in e.g. SPIR-V, MSL, or DXIL format. - - - -**desc**: {code:ArrayBuffer, stage:'vertex'|'fragment', format:'spv'|..., entrypoint:'main', ...} - - -**Returns**: SDL_GPUShader object - - -### acquire_cmd_buffer() function - -Obtain a new command buffer for recording GPU commands. Must be submitted or canceled. - - - -**Returns**: SDL_GPUCommandBuffer handle - - -### upload(cmdBuffer, buffers, transferBuffer) function - -Upload CPU data into a list of GPU buffers, optionally reusing or returning a -transfer buffer. Typically you provide (cmdBuf, arrayOfTypedArrays, [transferBuffer]). - - - -**cmdBuffer**: The command buffer in which to record copy commands. - -**buffers**: An array of typed-array data to upload, each must have a 'gpu' property or so. - -**transferBuffer**: Optional existing GPU transfer buffer to reuse. - - -**Returns**: The transfer buffer used or newly created. - - -### wait_for_fences(fences, waitAll) function - -Wait on an array of GPU fence objects, optionally requiring all or any. - - - -**fences**: An array of SDL_GPUFence objects. - -**waitAll**: Boolean, true to wait for all fences, false for any. - - -**Returns**: True if fences signaled, false on timeout or error. - - -### query_fence(fence) function - -Check if the given fence has been signaled yet. Non-blocking. - - - -**fence**: SDL_GPUFence handle - - -**Returns**: True if signaled, false if still pending - - -### shader_format() function - -Return an array of supported GPU shader binary formats (like 'spv', 'dxbc', etc.). - - - -**Returns**: Array of strings naming supported formats. - - -### slice9(texture, dstRect, edges) function - -Generate a 9-slice tiling geometry in one shot. For advanced usage with GPU pipeline. - - - -**texture**: An SDL_GPUTexture - -**dstRect**: The rectangle {x, y, w, h} - -**edges**: {l, r, t, b} edge sizes - - -**Returns**: A mesh object - - -### tile(texture, srcRect, dstRect, tileInfo) function - -Generate geometry to tile a texture portion inside a dest rect. -Often used for repeating backgrounds. - - - -**texture**: The SDL_GPUTexture - -**srcRect**: The portion to tile in pixels - -**dstRect**: Where to fill - -**tileInfo**: e.g. {repeat_x:true, repeat_y:true} - - -**Returns**: A mesh object - diff --git a/docs/api/types/SDL_GPUFence.md b/docs/api/types/SDL_GPUFence.md deleted file mode 100644 index d356e74d..00000000 --- a/docs/api/types/SDL_GPUFence.md +++ /dev/null @@ -1,5 +0,0 @@ -# SDL_GPUFence - -A GPU fence for synchronization. Created upon commandBuffer.submit(). -Wait or query it with device.wait_for_fences or device.query_fence. - diff --git a/docs/api/types/SDL_GPUGraphicsPipeline.md b/docs/api/types/SDL_GPUGraphicsPipeline.md deleted file mode 100644 index 388e0ae8..00000000 --- a/docs/api/types/SDL_GPUGraphicsPipeline.md +++ /dev/null @@ -1,5 +0,0 @@ -# SDL_GPUGraphicsPipeline - -Encapsulates vertex+fragment shaders, blend/cull states, and vertex attribute layouts. -Created via device.make_pipeline(...). - diff --git a/docs/api/types/SDL_GPURenderPass.md b/docs/api/types/SDL_GPURenderPass.md deleted file mode 100644 index df258a7c..00000000 --- a/docs/api/types/SDL_GPURenderPass.md +++ /dev/null @@ -1,159 +0,0 @@ -# SDL_GPURenderPass - -A single pass of drawing commands with color/depth attachments. Freed after end() or GC. - - -### bind_pipeline(pipeline) function - -Bind a previously created graphics pipeline (shaders, states, vertex layouts, etc.). - - - -**pipeline**: The SDL_GPUGraphicsPipeline - - -**Returns**: None - - -### viewport(rect) function - -Set the viewport for clipping or scaling draws, in pass-local coordinates. - - - -**rect**: {x,y,w,h} - - -**Returns**: None - - -### scissor(rect) function - -Set a scissor rectangle for discarding pixels outside it. - - - -**rect**: {x,y,w,h} - - -**Returns**: None - - -### draw(primitiveType, baseVertex, firstVertex, vertexCount) function - -Issue a non-indexed draw call. - - - -**primitiveType**: e.g. SDL_GPU_PRIMITIVETYPE_TRIANGLELIST - -**baseVertex**: Starting vertex offset. - -**firstVertex**: The first vertex to draw. - -**vertexCount**: How many vertices to draw. - - -**Returns**: None - - -### draw_indexed(primitiveType, baseVertex, firstIndex, indexCount, instanceCount) function - -Issue an indexed draw call from the bound index buffer. - - - -**primitiveType**: The primitive type constant. - -**baseVertex**: Offset in the vertex buffer. - -**firstIndex**: Which index to start from. - -**indexCount**: Number of indices to draw. - -**instanceCount**: For instanced drawing, or 1 if normal. - - -**Returns**: None - - -### end() function - -End this render pass, finalizing the draw operations. - - - -**Returns**: None - - -### bind_index_buffer(buffer, elementSize16bit) function - -Bind an index buffer inside this pass, possibly overriding the global one. - - - -**buffer**: The SDL_GPUBuffer - -**elementSize16bit**: If 2, uses 16-bit indices; if 4, uses 32-bit indices - - -**Returns**: None - - -### bind_buffers(firstSlot, arrayOfBuffers) function - -Bind multiple vertex buffers at consecutive slots. - - - -**firstSlot**: The starting vertex buffer slot. - -**arrayOfBuffers**: An array of GPUBuffer objects - - -**Returns**: None - - -### bind_samplers(vertexOrFragment, firstSlot, samplerBindings) function - -Bind multiple texture/sampler pairs to either vertex or fragment slots. - - - -**vertexOrFragment**: Boolean, true for vertex stage, false for fragment. - -**firstSlot**: The first sampler slot to bind. - -**samplerBindings**: An array of {texture, sampler}. - - -**Returns**: None - - -### bind_storage_buffers(firstSlot, buffers) function - -Bind one or more storage buffers for read/write in the pipeline. - - - -**firstSlot**: Starting buffer slot index. - -**buffers**: An array of SDL_GPUBuffer objects. - - -**Returns**: None - - -### bind_storage_textures(firstSlot, textures) function - -Bind one or more storage textures for read/write in the pipeline. - - - -**firstSlot**: Starting texture slot index. - -**textures**: An array of SDL_GPUTexture objects. - - -**Returns**: None - diff --git a/docs/api/types/SDL_GPUSampler.md b/docs/api/types/SDL_GPUSampler.md deleted file mode 100644 index 521e0080..00000000 --- a/docs/api/types/SDL_GPUSampler.md +++ /dev/null @@ -1,4 +0,0 @@ -# SDL_GPUSampler - -Defines how a texture is sampled (filter mode, address mode, anisotropy, compare op, etc.). - diff --git a/docs/api/types/SDL_GPUShader.md b/docs/api/types/SDL_GPUShader.md deleted file mode 100644 index 6aa5de6b..00000000 --- a/docs/api/types/SDL_GPUShader.md +++ /dev/null @@ -1,5 +0,0 @@ -# SDL_GPUShader - -A single compiled shader (vertex or fragment) in a GPU-friendly format -(e.g., SPIR-V, MSL). Combined into a pipeline for drawing. - diff --git a/docs/api/types/SDL_GPUTexture.md b/docs/api/types/SDL_GPUTexture.md deleted file mode 100644 index fa1b2161..00000000 --- a/docs/api/types/SDL_GPUTexture.md +++ /dev/null @@ -1,3 +0,0 @@ -# SDL_GPUTexture - -### name() function diff --git a/docs/api/types/SDL_GPUTransferBuffer.md b/docs/api/types/SDL_GPUTransferBuffer.md deleted file mode 100644 index 58124193..00000000 --- a/docs/api/types/SDL_GPUTransferBuffer.md +++ /dev/null @@ -1,5 +0,0 @@ -# SDL_GPUTransferBuffer - -A staging buffer used for copying data to or from GPU buffers/textures. Typically -allocated/used internally by device.upload(...). - diff --git a/docs/api/types/SDL_Renderer.md b/docs/api/types/SDL_Renderer.md deleted file mode 100644 index 69041077..00000000 --- a/docs/api/types/SDL_Renderer.md +++ /dev/null @@ -1,333 +0,0 @@ -# SDL_Renderer - -A 2D rendering context using the SDL renderer API. Freed automatically. - - -### draw_color(color) function - -Set the render draw color for subsequent primitive calls (rect, line, etc.). - - - -**color**: [r, g, b, a] in 0..1. - - -**Returns**: None - - -### present() function - -Display whatever has been rendered (swap buffers). Must be called each frame. - - - -**Returns**: None - - -### clear() function - -Clear the current render target with the renderer's draw color. - - - -**Returns**: None - - -### rect(rectOrArray, color) function - -Draw one or more outlines of rectangles. - - - -**rectOrArray**: A single rect {x,y,w,h} or an array of rects. - -**color**: Optional [r,g,b,a]. If provided, overrides current draw color. - - -**Returns**: None - - -### fillrect(rectOrArray, color) function - -Fill one or more rectangles with the renderer's current color or an optional override. - - - -**rectOrArray**: A single rect {x,y,w,h} or an array of rects. - -**color**: Optional [r,g,b,a]. - - -**Returns**: None - - -### line(points, color) function - -Draw a sequence of lines connecting points in an array. - - - -**points**: An array of [x,y] points. Lines connect consecutive points. - -**color**: Optional [r,g,b,a]. - - -**Returns**: None - - -### point(points, color) function - -Draw a list of points (pixels). - - - -**points**: An array of [x,y] positions. - -**color**: Optional [r,g,b,a]. - - -**Returns**: None - - -### load_texture(surface) function - -Create an SDL_Texture from a given SDL_Surface for use with this renderer. - - - -**surface**: An SDL_Surface. - - -**Returns**: An SDL_Texture object. - - -### texture(tex, dstRect, srcRect, color) function - -Draw a texture onto the render target. - - - -**tex**: The SDL_Texture to draw. - -**dstRect**: The destination rect {x, y, w, h}. - -**srcRect**: Optional portion of the texture to draw {x, y, w, h}. - -**color**: Optional color mod [r,g,b,a]. - - -**Returns**: None - - -### slice9(tex, dstRect, edges, srcRect) function - -Draw a texture with 9-slice scaling. The argument includes edges {l, r, t, b} -for the corners/borders that remain unscaled. The rest is tiled or stretched. - - - -**tex**: The SDL_Texture. - -**dstRect**: Destination region {x, y, w, h}. - -**edges**: {l, r, t, b} for corner sizes in pixels. - -**srcRect**: Optional portion in the texture. - - -**Returns**: None - - -### tile(tex, dstRect, srcRect, scale) function - -Tile a texture repeatedly within the specified region. Optionally use a srcRect. - - - -**tex**: The SDL_Texture to tile. - -**dstRect**: The region to fill {x, y, w, h}. - -**srcRect**: Optional portion of texture. - -**scale**: A float scale factor for each tile. - - -**Returns**: None - - -### get_image(rect) function - -Read back the rendered pixels into a new SDL_Surface. If rect is undefined, capture entire output. - - - -**rect**: Optional {x,y,w,h}. - - -**Returns**: An SDL_Surface with the requested region's pixels. - - -### fasttext(text, pos, color) function - -Draw debug text using an internal fast path. Typically used for quick debugging overlays. - - - -**text**: The string to draw. - -**pos**: The [x, y] position to draw text. - -**color**: Optional [r,g,b,a]. - - -**Returns**: None - - -### geometry(texture, meshObject) function - -Render custom geometry from a mesh object {pos, uv, color, indices, count} with an optional texture. - - - -**texture**: The SDL_Texture or undefined. - -**meshObject**: The geometry data with typed arrays. - - -**Returns**: None - - -### scale(scaleVec2) function - -Set a scaling factor for all subsequent rendering on this renderer. - - - -**scaleVec2**: [sx, sy] scaling factors. - - -**Returns**: None - - -### logical_size(size) function - -Set a "logical" size that the renderer will scale to. -For example, (320, 240) can auto-scale up to the window resolution. - - - -**size**: [width, height]. - - -**Returns**: None - - -### viewport(rect) function - -Set the clipping viewport for rendering. Pass undefined to use the full render target. - - - -**rect**: {x, y, w, h}, or undefined. - - -**Returns**: None - - -### clip(rect) function - -Set or clear the clipping rectangle for drawing. Pass undefined to clear. - - - -**rect**: {x, y, w, h} or undefined. - - -**Returns**: None - - -### vsync(flag) function - -Enable or disable vertical sync. This may have no effect depending on the driver. - - - -**flag**: True or false. - - -**Returns**: None - - -### coords(pos) function - -Convert window coordinates to this renderer's coordinate space. - - - -**pos**: [x, y] in window space. - - -**Returns**: [x, y] in renderer coordinate space. - - -### camera(cameraTransform, centered) function - -Set up a basic 2D camera matrix from a given transform. If 'centered' is true, -the origin is the center of the viewport, else top-left. - - - -**cameraTransform**: The transform whose pos is used. - -**centered**: Boolean true or false. - - -**Returns**: None - - -### get_viewport() function - -Return the current viewport rect. - - - -**Returns**: {x, y, w, h} - - -### screen2world(pos) function - -Convert a screen coordinate to world space based on the current camera transform. - - - -**pos**: [x, y] screen coords - - -**Returns**: [wx, wy] in world space - - -### target(texture) function - -Set or clear the current render target texture. Pass undefined to reset to the default/window. - - - -**texture**: An SDL_Texture or undefined - - -**Returns**: None - - -### make_sprite_mesh(sprites) function - -Generate a mesh from an array of sprite objects, combining their positions, UVs, -and colors into a single geometry block. - - - -**sprites**: An array of sprite-like objects. - - -**Returns**: A 'mesh' object with pos, uv, color, indices, etc. - diff --git a/docs/api/types/SDL_Surface.md b/docs/api/types/SDL_Surface.md deleted file mode 100644 index bb0662d8..00000000 --- a/docs/api/types/SDL_Surface.md +++ /dev/null @@ -1,68 +0,0 @@ -# SDL_Surface - -A software (CPU) image in memory. Freed when references vanish. Typically converted -to SDL_Texture for drawing, or used as raw pixel data. - - -### blit(dstRect, srcSurface, srcRect) function - -Blit (copy) another surface onto this surface, scaling if needed. - - - -**dstRect**: Destination {x, y, w, h} - -**srcSurface**: The source SDL_Surface - -**srcRect**: {x, y, w, h} portion from source - - -**Returns**: None - - -### scale(newSize) function - -Return a new SDL_Surface scaled to [width, height] using linear filtering. - - - -**newSize**: [width, height] - - -**Returns**: A new SDL_Surface with the scaled result. - - -### fill(color) function - -Fill the entire surface with a single color. - - - -**color**: [r, g, b, a] in 0..1 - - -**Returns**: None - - -### rect(rect, color) function - -Fill a sub-rectangle of the surface with a color. - - - -**rect**: {x, y, w, h} - -**color**: [r, g, b, a] - - -**Returns**: None - - -### dup() function - -Make a copy of this surface in RGBA format. - - - -**Returns**: A new SDL_Surface copy. - diff --git a/docs/api/types/SDL_Texture.md b/docs/api/types/SDL_Texture.md deleted file mode 100644 index 9b1c9289..00000000 --- a/docs/api/types/SDL_Texture.md +++ /dev/null @@ -1,16 +0,0 @@ -# SDL_Texture - -A 2D GPU-accelerated texture for rendering with SDL_Renderer. Freed automatically. - - -### mode(mode) function - -Set texture scale mode or filtering mode (nearest/linear). - - - -**mode**: A string or numeric mode to set (e.g., 'linear'). - - -**Returns**: None - diff --git a/docs/api/types/SDL_Thread.md b/docs/api/types/SDL_Thread.md deleted file mode 100644 index f1cc239e..00000000 --- a/docs/api/types/SDL_Thread.md +++ /dev/null @@ -1,15 +0,0 @@ -# SDL_Thread - -A handle to an SDL-created thread. Freed on GC after join. - -Note: The engine generally doesn't expose custom usage for threads. - - -### wait() function - -Block until this thread terminates. - - - -**Returns**: None - diff --git a/docs/api/types/SDL_Window.md b/docs/api/types/SDL_Window.md deleted file mode 100644 index 9a6d57d9..00000000 --- a/docs/api/types/SDL_Window.md +++ /dev/null @@ -1,126 +0,0 @@ -# SDL_Window - -An application window, created via prosperon.engine_start or SDL calls. Freed on GC. - - -### fullscreen() function - -Toggle fullscreen mode for this window (SDL_WINDOW_FULLSCREEN). - - - -**Returns**: None - - -### make_renderer(name) function - -Create an SDL_Renderer for 2D rendering tied to this window. - - - -**name**: The renderer driver name, e.g. "opengl" (may be optional). - - -**Returns**: An SDL_Renderer object. - - -### make_gpu(debug, driverName) function - -Create an SDL_GPUDevice for low-level GPU rendering on this window. - - - -**debug**: If true, enable debugging in the GPU device. - -**driverName**: The GPU back-end driver, e.g. "opengl". - - -**Returns**: An SDL_GPUDevice. - - -### keyboard_shown() function - -Return whether the on-screen keyboard is visible (mobile/tablet). - - - -**Returns**: True if shown, false otherwise. - - -### theme() function - -Currently returns undefined. Placeholder for retrieving OS window theme info. - - - -**Returns**: undefined - - -### safe_area() function - -Return a rect describing any OS-specific "safe" region for UI, e.g. on iPhone with a notch. - - - -**Returns**: A rect object {x, y, w, h}. - - -### bordered(flag) function - -Enable or disable window borders. - - - -**flag**: True to show borders, false to hide. - - -**Returns**: None - - -### set_icon(surface) function - -Set the window's icon from an SDL_Surface. - - - -**surface**: An SDL_Surface holding the icon. - - -**Returns**: None - - -### title accessor - -Get or set the window's title text in the title bar. - - - -**newTitle**: (when setting) A string title. - - -**Returns**: The current title if getting, or None if setting. - - -### size accessor - -Get or set the window's size as [width, height]. - - - -**newSize**: (when setting) e.g. [640, 480] - - -**Returns**: The current [width, height] or None if setting. - - -### mouse_grab(flag) function - -Grab or ungrab the mouse for this window (so the pointer won't leave). - - - -**flag**: True to grab mouse input, false to release. - - -**Returns**: None - diff --git a/docs/api/types/datastream.md b/docs/api/types/datastream.md deleted file mode 100644 index 89204b0a..00000000 --- a/docs/api/types/datastream.md +++ /dev/null @@ -1,67 +0,0 @@ -# datastream - -A streaming media handle, typically for MPEG video. Freed automatically. - - -### time() function - -Return the current playback time in seconds. - - - -**Returns**: Current time as a float in seconds. - - -### seek(seconds) function - -Seek to the specified time (in seconds). - - - -**seconds**: The time to jump to in the stream. - - -**Returns**: None - - -### advance(seconds) function - -Advance by a certain number of seconds, decoding video as needed. - - - -**seconds**: The amount of time to skip forward. - - -**Returns**: None - - -### duration() function - -Return the total duration of the video stream, in seconds, if known. - - - -**Returns**: Float seconds duration, or 0 if unknown. - - -### framerate() function - -Return the framerate (FPS) of the stream if known. - - - -**Returns**: Float frames per second, or 0 if unknown. - - -### callback accessor - -A function to call whenever a new frame is decoded. If not set, no callback is invoked. - - - -**fn**: (when setting) A function that receives (surface). - - -**Returns**: The existing function or undefined if none. - diff --git a/docs/api/types/enet_host.md b/docs/api/types/enet_host.md deleted file mode 100644 index b402735f..00000000 --- a/docs/api/types/enet_host.md +++ /dev/null @@ -1,66 +0,0 @@ -# enet_host - -### service(callback, timeout) function - - -Poll for and process any available network events (connect, receive, disconnect, or none) -from this host, calling the provided callback for each event. This function loops until -no more events are available in the current timeframe. - -Event object properties: -- type: String, one of "connect", "receive", "disconnect", or "none". -- peer: (present if type = "connect") The ENetPeer object for the new connection. -- channelID: (present if type = "receive") The channel on which the data was received. -- data: (present if type = "receive") The received data as a *plain JavaScript object*. -If the JSON parse fails or the data isn't an object, a JavaScript error is thrown. - -object as its single argument. - - -**callback**: A function called once for each available event, receiving an event - -**timeout**: (optional) Timeout in milliseconds. Defaults to 0 (non-blocking). - - -**Returns**: None - - -### connect(host, port) function - - -Initiate a connection from this host to a remote server. Throws an error if the -connection cannot be started. - - - -**host**: The hostname or IP address of the remote server (e.g. "example.com" or "127.0.0.1"). - -**port**: The port number to connect to. - - -**Returns**: An ENetPeer object representing the connection. - - -### flush() function - - -Flush all pending outgoing packets for this host immediately. - - - -**Returns**: None - - -### broadcast(data) function - - -Broadcast a JavaScript object to all connected peers on channel 0. The object is -serialized to JSON, and the packet is sent reliably. Throws an error if serialization fails. - - - -**data**: A JavaScript object to broadcast to all peers. - - -**Returns**: None - diff --git a/docs/api/types/enet_peer.md b/docs/api/types/enet_peer.md deleted file mode 100644 index e372d75f..00000000 --- a/docs/api/types/enet_peer.md +++ /dev/null @@ -1,102 +0,0 @@ -# enet_peer - -### send(data) function - - -Send a JavaScript object to this peer on channel 0. The object is serialized to JSON and -sent reliably. Throws an error if serialization fails. - - - -**data**: A JavaScript object to send. - - -**Returns**: None - - -### disconnect() function - - -Request a graceful disconnection from this peer. The connection will close after -pending data is sent. - - - -**Returns**: None - - -### disconnect_now() function - - -Immediately terminate the connection to this peer, discarding any pending data. - - - -**Returns**: None - - -### disconnect_later() function - - -Request a disconnection from this peer after all queued packets are sent. - - - -**Returns**: None - - -### reset() function - - -Reset this peer's connection, immediately dropping it and clearing its internal state. - - - -**Returns**: None - - -### ping() function - - -Send a ping request to this peer to measure latency. - - - -**Returns**: None - - -### throttle_configure(interval, acceleration, deceleration) function - - -Configure the throttling behavior for this peer, controlling how ENet adjusts its sending -rate based on packet loss or congestion. - - - -**interval**: The interval (ms) between throttle adjustments. - -**acceleration**: The factor to increase sending speed when conditions improve. - -**deceleration**: The factor to decrease sending speed when conditions worsen. - - -**Returns**: None - - -### timeout(timeout_limit, timeout_min, timeout_max) function - - -Set timeout parameters for this peer, determining how long ENet waits before considering -the connection lost. - - - -**timeout_limit**: The total time (ms) before the peer is disconnected. - -**timeout_min**: The minimum timeout (ms) used for each timeout attempt. - -**timeout_max**: The maximum timeout (ms) used for each timeout attempt. - - -**Returns**: None - diff --git a/docs/api/types/font.md b/docs/api/types/font.md deleted file mode 100644 index 8a7bf576..00000000 --- a/docs/api/types/font.md +++ /dev/null @@ -1,66 +0,0 @@ -# font - -A bitmap or TTF-based font object storing glyph data. -Used for measuring/drawing text. Freed when GC sees no references. - - -### linegap accessor - -Get or set the font's additional line spacing above the built-in metrics. - - - -**value**: (when setting) The new line gap. - - -**Returns**: The current line gap (when getting), or None (when setting). - - -### height accessor - -(read only) - -The baseline-to-baseline height in pixels. - - - -**Returns**: The font's total height in px. - - -### ascent accessor - -(read only) - -How far above the baseline the font extends. - - - -**Returns**: A scalar float for ascent. - - -### descent accessor - -(read only) - -How far below baseline the font extends. - - - -**Returns**: A scalar float for descent. - - -### text_size(text, letterSpacing, wrap) function - -Measure a piece of text's width/height when rendered with this font. - - - -**text**: The string to measure. - -**letterSpacing**: Extra spacing between characters. - -**wrap**: If nonzero, word-wrap to this maximum width. - - -**Returns**: [width, height] as a float array. - diff --git a/docs/api/types/rtree.md b/docs/api/types/rtree.md deleted file mode 100644 index d936737c..00000000 --- a/docs/api/types/rtree.md +++ /dev/null @@ -1,84 +0,0 @@ -# rtree - -An R-tree for spatial lookups. Insert bounding boxes, query by bounding box, etc. - - -### add(obj) function - -Insert an object that has a 'rect' property {x, y, w, h} into the tree. - - - -**obj**: The object to add (must have rectAtom). - - -**Returns**: None - - -### delete(obj) function - -Remove an object from the tree. Must match the same rect as used when adding. - - - -**obj**: The object to remove. - - -**Returns**: None - - -### query(rect) function - -Return an array of objects whose bounding boxes intersect the given rect. - - - -**rect**: {x, y, w, h} bounding region to query. - - -**Returns**: Array of objects that overlap that region. - - -### size accessor - -(read only) - -Indicates how many items are stored in the rtree. - - - -**Returns**: Integer count of items in the tree. - - -### forEach(callback) function - -Call a function for every item in the rtree. - - - -**callback**: A function called with no arguments, or possibly (item). - - -**Returns**: None - - -### has(obj) function - -Return true if the specified object is in the tree, false otherwise. - - - -**obj**: The object to check. - - -**Returns**: True if found, else false. - - -### values() function - -Return an array of all items currently in the rtree. - - - -**Returns**: Array of all stored objects. - diff --git a/docs/api/types/sprite.md b/docs/api/types/sprite.md deleted file mode 100644 index 27354d1a..00000000 --- a/docs/api/types/sprite.md +++ /dev/null @@ -1,68 +0,0 @@ -# sprite - -A 'sprite' is a simple struct for 2D drawing. It stores a rectangle (pos + size), -UV coordinates, color, and layer, as well as an associated 'image' object. The sprite -can be drawn via GPU or SDL_Renderer. Freed when no JS references remain. - - -### set_affine(transform) function - -Update this sprite's position and size from a transform's pos and scale. - - - -**transform**: The transform whose pos/scale will overwrite the sprite's rect. - - -**Returns**: None - - -### set_rect(rect) function - -Set the sprite's rect (x, y, w, h) directly. - - - -**rect**: An object or array specifying x, y, width, and height. - - -**Returns**: None - - -### set_image(image) function - -Assign or replace the sprite's underlying image. Automatically updates UV if -the image has a 'rect' property. - - - -**image**: A JS object representing the image (with .texture, .rect, etc.). - - -**Returns**: None - - -### layer accessor - -Get or set the sprite's z-layer integer. Sprites with higher layers typically -draw on top of lower layers. - - - -**value**: (when setting) An integer specifying the layer. - - -**Returns**: The current layer (when getting), or None (when setting). - - -### color accessor - -Get or set the sprite's color tint as [r, g, b, a]. - - - -**value**: (when setting) An array [r, g, b, a] in the 0.0..1.0 range. - - -**Returns**: The current color array (when getting), or None (when setting). - diff --git a/docs/api/types/timer.md b/docs/api/types/timer.md deleted file mode 100644 index 6a39a91e..00000000 --- a/docs/api/types/timer.md +++ /dev/null @@ -1,29 +0,0 @@ -# timer - -A scheduled callback or countdown. Freed automatically once no longer referenced -or once it completes. - - -### remain accessor - -Get or set how many seconds remain before the timer triggers. - - - -**value**: (when setting) A float specifying new time remaining. - - -**Returns**: The current time left (when getting), or None (when setting). - - -### fn accessor - -Get or set the function called when the timer expires. - - - -**value**: (when setting) The function. - - -**Returns**: The function or undefined if none is set. - diff --git a/docs/api/types/transform.md b/docs/api/types/transform.md deleted file mode 100644 index 1f94fdf0..00000000 --- a/docs/api/types/transform.md +++ /dev/null @@ -1,214 +0,0 @@ -# transform - -A hierarchical transform storing 3D or 2D position, rotation (as a quaternion), -and scale. Can have a parent transform. Freed automatically on GC. - - -### pos accessor - -Get or set the transform's position as a 3D vector [x, y, z]. - - - -**value**: (when setting) [x, y, z]. - - -**Returns**: The current position vector (when getting), or None (when setting). - - -### scale accessor - -Get or set the transform's scale as a 3D vector [x, y, z]. -For 2D usage, z is often 1. - - - -**value**: (when setting) [sx, sy, sz]. - - -**Returns**: The current scale (when getting), or None (when setting). - - -### rotation accessor - -Get or set the transform's rotation as a quaternion [x, y, z, w]. -Angles in degrees or radians must first be converted prior to making a quaternion. - - - -**value**: (when setting) [qx, qy, qz, qw]. - - -**Returns**: The current quaternion (when getting), or None (when setting). - - -### parent accessor - -Get or set the transform's parent. If set, this transform becomes a child of -the parent (re-parenting). Must be another transform object or undefined. - - - -**value**: (when setting) Another transform or undefined. - - -**Returns**: The current parent transform (when getting), or None (when setting). - - -### change_hook accessor - -A user-supplied function that's called whenever the transform's local matrix changes. -If undefined, no hook is called. - - - -**value**: (when setting) A function. - - -**Returns**: The current function or undefined. - - -### trs(pos, quat, scale) function - -Set the transform's position, rotation, and scale in one call. - - - -**pos**: [x,y,z] for position, or undefined to keep existing. - -**quat**: [qx,qy,qz,qw] for rotation, or undefined. - -**scale**: [sx,sy,sz] for scale, or undefined. - - -**Returns**: None - - -### phys2d(velocity, angularVel, dt) function - -Apply simple 2D velocity and angular velocity to this transform. - - - -**velocity**: [vx, vy] added to 'pos' each frame. - -**angularVel**: A scalar for rotation in (radians/second). - -**dt**: The time delta in seconds. - - -**Returns**: None - - -### move(delta) function - -Translate this transform by the specified vector. - - - -**delta**: [dx, dy, dz] to add to .pos - - -**Returns**: None - - -### rotate(axis, angle) function - -Rotate this transform by an axis+angle. - - - -**axis**: [ax, ay, az] the axis of rotation. - -**angle**: The angle in turns or radians (depending on usage). - - -**Returns**: None - - -### angle(axis) function - -Return the transform's rotation about a specified axis (x, y, or z). -For example, angle([1,0,0]) returns the roll about the X-axis. - - - -**axis**: Which axis [1,0,0] or [0,1,0] or [0,0,1]. - - -**Returns**: The numeric angle in 'turns' or radians, depending on usage. - - -### lookat(target) function - -Rotate this transform so it looks toward the given world position. - - - -**target**: [x, y, z] position in world coords. - - -**Returns**: None - - -### direction(localDir) function - -Rotate a vector by this transform's rotation, effectively "transforming" -a direction from local space to world space. - - - -**localDir**: [dx, dy, dz] in local transform coordinates. - - -**Returns**: [dx', dy', dz'] direction in world space. - - -### unit() function - -Reset position, rotation, and scale to [0,0,0], identity rotation, and [1,1,1]. - - - -**Returns**: None - - -### rect(rect) function - -Set this transform's pos and scale from a 2D rect object {x, y, w, h}. - - - -**rect**: Object with .x, .y, .w, .h - - -**Returns**: None - - -### array() function - -Return this transform's matrix as a 16-element float array in column-major order. - - - -**Returns**: An array of 16 floats. - - -### torect() function - -Convert transform's 2D position/scale to a rect {x, y, w, h}. -Rotation is currently ignored. - - - -**Returns**: A rect object {x, y, w, h}. - - -### children() function - -Return an array of child transforms belonging to this transform. - - - -**Returns**: An array of transform objects. - diff --git a/docs/api/use.md b/docs/api/use.md deleted file mode 100644 index cf3ad058..00000000 --- a/docs/api/use.md +++ /dev/null @@ -1,7 +0,0 @@ -# use - -### length number - -### name string - -### prototype object diff --git a/docs/cell.md b/docs/cellscript.md similarity index 89% rename from docs/cell.md rename to docs/cellscript.md index bdc8c9c4..bf9a8f5a 100644 --- a/docs/cell.md +++ b/docs/cellscript.md @@ -1,6 +1,6 @@ # Cell Language -Cell is a JavaScript variant used in the Prosperon game engine. While very similar to JavaScript, it has several important differences that make it more suitable for game development and actor-based programming. +Cell is a JavaScript variant used in cell. While very similar to JavaScript, it has several important differences that make it more suitable for actor-based programming. ## Key Differences from JavaScript @@ -173,8 +173,3 @@ var text = time.text() // Human-readable time setTimeout(() => console.log(i), 100) // Works as expected } ``` - -## See Also -- [Actor Model](actor.md) - Cell's actor-based programming model -- [Module System](modules.md) - How to use and create modules -- [API Reference](api/index.md) - Complete API documentation \ No newline at end of file diff --git a/docs/dos.ttf b/docs/dos.ttf deleted file mode 100644 index 6aaf28c59b0f530d3599326f1345ffaafd956063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79584 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 KiGLnG75_ITQ-hiS diff --git a/docs/dull/Array.md b/docs/dull/Array.md deleted file mode 100644 index a7050d4c..00000000 --- a/docs/dull/Array.md +++ /dev/null @@ -1,661 +0,0 @@ -# Array - -### length number - -### at(index) function - -Return the item at index 'index', supporting negative indices to count from -the end. If 'index' is out of range, returns undefined. - - - -**index**: The index of the element to return (can be negative). - - -**Returns**: The element at the given index, or undefined. - - -### with(index, value) function - -Return a shallow copy of the array, but with the element at 'index' replaced -by 'value'. If 'index' is negative, it counts from the end. Throws if out of range. - - - -**index**: The zero-based index (can be negative) to replace. - -**value**: The new value for the specified position. - - -**Returns**: A new array with the updated element. - - -### concat(items) function - -Return a new array that is the result of concatenating this array with -any additional arrays or values provided. - - - -**items**: One or more arrays or values to concatenate. - - -**Returns**: A new array with the items appended. - - -### every(callback, thisArg) function - -Return true if the provided callback function returns a truthy value for -every element in the array; otherwise false. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: True if all elements pass the test, otherwise false. - - -### some(callback, thisArg) function - -Return true if the provided callback function returns a truthy value for at -least one element in the array; otherwise false. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: True if at least one element passes the test, otherwise false. - - -### forEach(callback, thisArg) function - -Call the provided callback function once for each element in the array. -Does not produce a return value. - - - -**callback**: A function(element, index, array). - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: None - - -### map(callback, thisArg) function - -Create a new array with the results of calling a provided callback function -on every element in this array. - - - -**callback**: A function(element, index, array) => newElement. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: A new array of transformed elements. - - -### filter(callback, thisArg) function - -Create a new array containing all elements for which the provided callback -function returns a truthy value. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: A new array of elements that passed the test. - - -### reduce(callback, initialValue) function - -Apply a callback function against an accumulator and each element in the -array (from left to right) to reduce it to a single value. - - - -**callback**: A function(accumulator, element, index, array) => newAccumulator. - -**initialValue**: Optional. The initial value for the accumulator. - - -**Returns**: The single resulting value. - - -### reduceRight(callback, initialValue) function - -Similar to reduce(), except it processes elements from right to left. - - - -**callback**: A function(accumulator, element, index, array) => newAccumulator. - -**initialValue**: Optional. The initial value for the accumulator. - - -**Returns**: The single resulting value. - - -### fill(value, start, end) function - -Fill the array with a static value from 'start' index up to (but not including) -'end' index. Modifies the original array. - - - -**value**: The value to fill. - -**start**: The starting index (default 0). - -**end**: The ending index (default array.length). - - -**Returns**: The modified array (with filled values). - - -### find(callback, thisArg) function - -Return the first element in the array that satisfies the provided callback -function. If none is found, return undefined. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The first matching element, or undefined if not found. - - -### findIndex(callback, thisArg) function - -Return the index of the first element in the array that satisfies the -provided callback function. If none is found, return -1. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The index of the first matching element, or -1 if not found. - - -### findLast(callback, thisArg) function - -Return the last element in the array that satisfies the provided callback -function, searching from right to left. If none is found, return undefined. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The last matching element, or undefined if not found. - - -### findLastIndex(callback, thisArg) function - -Return the index of the last element in the array that satisfies the -provided callback function, searching from right to left. If none is found, -return -1. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The index of the last matching element, or -1 if not found. - - -### indexOf(searchElement, fromIndex) function - -Return the first index at which a given element can be found. If not present, -return -1. - - - -**searchElement**: The item to locate in the array. - -**fromIndex**: The index at which to start searching (default 0). - - -**Returns**: The index of the found element, or -1 if not found. - - -### lastIndexOf(searchElement, fromIndex) function - -Return the last index at which a given element can be found, or -1 if not -present. Searches backward from 'fromIndex'. - - - -**searchElement**: The item to locate in the array. - -**fromIndex**: The index at which to start searching backward (default array.length - 1). - - -**Returns**: The last index of the found element, or -1 if not found. - - -### includes(searchElement, fromIndex) function - -Return a boolean indicating whether the array contains the given element, -comparing elements using the SameValueZero algorithm. - - - -**searchElement**: The value to search for. - -**fromIndex**: The position in the array to start searching (default 0). - - -**Returns**: True if the element is found, otherwise false. - - -### join(separator) function - -Join all elements of the array into a string, separated by 'separator'. - - - -**separator**: The delimiter string to separate elements (default ','). - - -**Returns**: A string of array elements joined by the separator. - - -### toString() function - -Return a string representing the elements of the array, separated by commas. -Overrides Object.prototype.toString. - - - -**Returns**: A comma-separated string of array elements. - - -### toLocaleString() function - -Return a localized string representing the array and its elements, calling -each element's toLocaleString if available. - - - -**Returns**: A locale-sensitive, comma-separated string of array elements. - - -### pop() function - -Remove the last element from the array and return it. This changes the length -of the array. - - - -**Returns**: The removed element, or undefined if the array is empty. - - -### push(items) function - -Append one or more elements to the end of the array and return the new length -of the array. - - - -**items**: One or more items to append. - - -**Returns**: The new length of the array. - - -### shift() function - -Remove the first element from the array and return it. This changes the length -of the array. - - - -**Returns**: The removed element, or undefined if the array is empty. - - -### unshift(items) function - -Insert one or more elements at the start of the array and return the new -length of the array. - - - -**items**: One or more elements to insert at the start. - - -**Returns**: The new length of the array. - - -### reverse() function - -Reverse the elements of the array in place and return the modified array. - - - -**Returns**: The reversed array. - - -### toReversed() function - -Return a shallow copy of the array in reverse order, without modifying the original array. - - - -**Returns**: A new reversed array. - - -### sort(compareFunction) function - -Sort the array in place, returning it. By default, sorts elements as strings in ascending order. An optional compareFunction may be used for custom sorting. - - - -**compareFunction**: A function(a, b) => number, defining sort order. - - -**Returns**: The sorted array. - - -### toSorted(compareFunction) function - -Return a shallow copy of the array, sorted according to the optional compare -function, without modifying the original array. - - - -**compareFunction**: A function(a, b) => number, defining sort order. - - -**Returns**: A new sorted array. - - -### slice(start, end) function - -Return a shallow copy of a portion of the array into a new array object, selected from 'start' to 'end' (end not included). - - - -**start**: The beginning index (0-based). Negative values count from the end. - -**end**: The end index (exclusive). Negative values count from the end. - - -**Returns**: A new array containing the extracted elements. - - -### splice(start, deleteCount, items) function - -Change the contents of the array by removing or replacing existing elements and/or adding new elements in place. Returns an array of removed elements. - - - -**start**: The index at which to start changing the array. - -**deleteCount**: Number of elements to remove. - -**items**: Elements to add in place of the removed elements. - - -**Returns**: An array containing the removed elements (if any). - - -### toSpliced(start, deleteCount, items) function - -Return a shallow copy of the array, with a splice-like operation applied at 'start' removing 'deleteCount' elements and adding 'items'. Does not mutate the original array. - - - -**start**: The index at which to start the splice operation. - -**deleteCount**: Number of elements to remove. - -**items**: Elements to add in place of the removed elements. - - -**Returns**: A new array with the splice applied. - - -### copyWithin(target, start, end) function - -Copy a sequence of array elements within the array, overwriting existing values. This operation is performed in place and returns the modified array. - - - -**target**: The index at which to copy the sequence to. - -**start**: The beginning index of the sequence to copy. - -**end**: The end index (exclusive) of the sequence to copy (default array.length). - - -**Returns**: The modified array. - - -### flatMap(callback, thisArg) function - -Return a new array formed by applying a callback function to each element and then flattening the result by one level. - - - -**callback**: A function(element, index, array) => array or value. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: A new array with the flattened results. - - -### flat(depth) function - -Return a new array with all sub-array elements concatenated into it recursively up to the specified depth. - - - -**depth**: The maximum depth to flatten (default 1). - - -**Returns**: A new flattened array. - - -### values() function - -Return a new Array Iterator object that contains the values for each index in the array. - - - -**Returns**: An iterator over the array's elements. - - -### keys() function - -Return a new Array Iterator object that contains the keys (indexes) for each index in the array. - - - -**Returns**: An iterator over the array's indices. - - -### entries() function - -Return a new Array Iterator object that contains key/value pairs for each index in the array. Each entry is [index, value]. - - - -**Returns**: An iterator over [index, value] pairs. - - -### add(other) function - -Non-standard. Add corresponding elements of the current array and 'other' element-wise, returning a new array. Behavior depends on data types. - - - -**other**: Another array or scalar to add to each element. - - -**Returns**: A new array with element-wise sum results. - - -### sub(other) function - -Non-standard. Subtract corresponding elements of 'other' from the current array element-wise, returning a new array. Behavior depends on data types. - - - -**other**: Another array or scalar to subtract from each element. - - -**Returns**: A new array with element-wise difference results. - - -### div(other) function - -Non-standard. Divide each element of the current array by the corresponding element of 'other' (or a scalar) element-wise, returning a new array. Behavior depends on data types. - - - -**other**: Another array or scalar for the division. - - -**Returns**: A new array with element-wise division results. - - -### scale() function - -### lerp() function - -### x accessor - -### y accessor - -### xy accessor - -### r accessor - -### g accessor - -### b accessor - -### a accessor - -### rgb accessor - -### rgba accessor - -### filter!(fn) function - -Perform an in-place filter of this array using the provided callback 'fn'. -Any element for which 'fn' returns a falsy value is removed. The array is modified -and then returned. - - - -**fn**: A callback function(element, index, array) => boolean. - - -**Returns**: The filtered (modified) array. - - -### delete(item) function - -Remove the first occurrence of 'item' from the array, if it exists. -Returns undefined. - - - -**item**: The item to remove. - - -**Returns**: undefined - - -### copy() function - -Return a deep copy of this array by applying 'deep_copy' to each element. -The resulting array is entirely new. - - - -**Returns**: A new array that is a deep copy of the original. - - -### equal(b) function - -Check if this array and array 'b' have the same elements in the same order. -If they are of different lengths, return false. Otherwise compare them via JSON. - - - -**b**: Another array to compare against. - - -**Returns**: True if they match, false otherwise. - - -### last() function - -Return the last element of this array. If the array is empty, returns undefined. - - - -**Returns**: The last element of the array, or undefined if empty. - - -### wrapped(x) function - -Return a copy of the array with the first 'x' elements appended to the end. -Does not modify the original array. - - - -**x**: The number of leading elements to re-append. - - -**Returns**: A new array with the leading elements wrapped to the end. - - -### wrap_idx(x) function - -Wrap the integer 'x' around this array's length, ensuring the resulting index -lies within [0, this.length - 1]. - - - -**x**: The index to wrap. - - -**Returns**: A wrapped index within this array's bounds. - - -### mirrored(x) function - -Return a new array that appends a reversed copy (excluding the last element) -of itself to the end. For example, [1,2,3] -> [1,2,3,2,1]. If the array has length -<= 1, a copy of it is returned directly. - - - -**Returns**: A new "mirrored" array. - diff --git a/docs/dull/ArrayBuffer.md b/docs/dull/ArrayBuffer.md deleted file mode 100644 index b2f69e5e..00000000 --- a/docs/dull/ArrayBuffer.md +++ /dev/null @@ -1,7 +0,0 @@ -# ArrayBuffer - -### byteLength accessor - -(read only) - -### slice() function diff --git a/docs/dull/Function.md b/docs/dull/Function.md deleted file mode 100644 index 6632088f..00000000 --- a/docs/dull/Function.md +++ /dev/null @@ -1,27 +0,0 @@ -# Function - -### length number - -### name string - -### caller accessor - -### arguments accessor - -### call() function - -### apply() function - -### bind() function - -### toString() function - -### fileName accessor - -(read only) - -### lineNumber accessor - -(read only) - -### hashify() function diff --git a/docs/dull/Map.md b/docs/dull/Map.md deleted file mode 100644 index 0c95588f..00000000 --- a/docs/dull/Map.md +++ /dev/null @@ -1,120 +0,0 @@ -# Map - -A Map object holds key-value pairs, where any value (both objects and primitive values) may be used as either a key or a value. Insertion order is remembered, which allows iteration in that order. - -### set(key, value) function - -Add or update an entry in the Map with the specified key and value. - - - -**key**: The key of the element to add or update. - -**value**: The value associated with the key. - - -**Returns**: The Map object (for chaining). - - -### get(key) function - -Return the value associated with the specified key, or undefined if no -such key exists. - - - -**key**: The key of the element to retrieve. - - -**Returns**: The value associated with the key, or undefined if not found. - - -### has(key) function - -Return a boolean indicating whether the Map contains an element with the -specified key. - - - -**key**: The key to test for presence in the Map. - - -**Returns**: True if the key is found, otherwise false. - - -### delete(key) function - -Remove the specified key and its associated value from the Map, if it exists. - - - -**key**: The key to remove. - - -**Returns**: True if an element was removed, otherwise false. - - -### clear() function - -Remove all entries from the Map, leaving it empty. - - - -**Returns**: None - - -### size accessor - -(read only) - -A read-only property returning the number of key-value pairs in the Map. - - - -**Returns**: The number of entries in the Map. - - -### forEach(callbackFn, thisArg) function - -Execute a provided callback function once per each key-value pair in the Map, -in insertion order. - - - -**callbackFn**: A function(value, key, map) to execute on each entry. - -**thisArg**: Optional. A value to use as 'this' when executing callbackFn. - - -**Returns**: None - - -### values() function - -Return a new Iterator object that contains the values for each element -in the Map, in insertion order. - - - -**Returns**: An iterator of the Map's values. - - -### keys() function - -Return a new Iterator object that contains the keys for each element in -the Map, in insertion order. - - - -**Returns**: An iterator of the Map's keys. - - -### entries() function - -Return a new Iterator object that contains the [key, value] pairs for -each element in the Map, in insertion order. - - - -**Returns**: An iterator of [key, value] pairs. - diff --git a/docs/dull/Object.md b/docs/dull/Object.md deleted file mode 100644 index b85511c6..00000000 --- a/docs/dull/Object.md +++ /dev/null @@ -1,87 +0,0 @@ -# Object - -### toString() function - -Return a string representing this object. By default, it returns a string of the form '[object ]', where is the object's class. - - - -**Returns**: A string that describes the object. - - -### toLocaleString() function - -Return a localized string representation of this object, calling toString() by default or a locale-specific override if defined. - - - -**Returns**: A locale-sensitive string representation of the object. - - -### valueOf() function - -Return the primitive value of this object if one exists. Typically, an object returns itself, while a wrapped type (e.g. Number, String) may return the underlying primitive value. - - - -**Returns**: The primitive value of the object, or the object itself. - - -### hasOwnProperty(prop) function - -Return a boolean indicating whether the object has a property with the specified name (key) as its own direct property, as opposed to inheriting it. It does not check the prototype chain. - - - -**prop**: The name or Symbol of the property to test. - - -**Returns**: True if the property is found directly on the object, otherwise false. - - -### isPrototypeOf(obj) function - -Return true if the object appears anywhere in the prototype chain of the specified object, otherwise false. - - - -**obj**: The object whose prototype chain will be checked. - - -**Returns**: True if this object is in 'obj's prototype chain, otherwise false. - - -### propertyIsEnumerable(prop) function - -Return a boolean indicating whether the specified property is enumerable, i.e., whether it shows up in a for...in loop or Object.keys() on the object. - - - -**prop**: The name or Symbol of the property to test. - - -**Returns**: True if the property is found and enumerable, otherwise false. - - -### __proto__ accessor - -### __defineGetter__() function - -### __defineSetter__() function - -### __lookupGetter__() function - -### __lookupSetter__() function - -### mixin(obj) function - -Mix properties from 'obj' into the current object. If 'obj' is a string, -it first calls 'use(obj)' to retrieve the object. - - - -**obj**: The object (or string reference to an object) to mix in. - - -**Returns**: None - diff --git a/docs/dull/Set.md b/docs/dull/Set.md deleted file mode 100644 index ae5e3168..00000000 --- a/docs/dull/Set.md +++ /dev/null @@ -1,104 +0,0 @@ -# Set - -A Set object lets you store unique values of any type, whether primitive values or object references. It remembers insertion order for iteration. - -### add(value) function - -Add a new element with the given value to the Set, if it’s not already present. - - - -**value**: The value to add. - - -**Returns**: The Set object (for chaining). - - -### has(value) function - -Return a boolean indicating whether the Set contains the specified value. - - - -**value**: The value to check for presence in the Set. - - -**Returns**: True if the value is found, otherwise false. - - -### delete(value) function - -Remove the specified value from the Set if it exists. - - - -**value**: The value to remove. - - -**Returns**: True if the value was present and removed, otherwise false. - - -### clear() function - -Remove all elements from the Set, leaving it empty. - - - -**Returns**: None - - -### size accessor - -(read only) - -A read-only property returning the number of elements in the Set. - - - -**Returns**: The number of unique values in the Set. - - -### forEach(callbackFn, thisArg) function - -Execute a provided callback function once for each value in the Set, -in insertion order. - - - -**callbackFn**: A function(value, valueAgain, set) to execute on each element. - -**thisArg**: Optional. A value to use as 'this' when executing callbackFn. - - -**Returns**: None - - -### values() function - -Alias for values() in a Set. Return a new Iterator object containing all -the values (as keys) in the Set, in insertion order. - - - -**Returns**: An iterator of the Set's values. - - -### keys() function - -Alias for values() in a Set. Return a new Iterator object containing all -the values (as keys) in the Set, in insertion order. - - - -**Returns**: An iterator of the Set's values. - - -### entries() function - -Return a new Iterator object containing [value, value] pairs for each value -in the Set, in insertion order. This maintains API consistency with Map objects. - - - -**Returns**: An iterator of [value, value] pairs. - diff --git a/docs/dull/String.md b/docs/dull/String.md deleted file mode 100644 index f444dc6a..00000000 --- a/docs/dull/String.md +++ /dev/null @@ -1,793 +0,0 @@ -# String - -### length number - -### at(index) function - -Return the character (or surrogate pair) at the specified index, with support -for negative indices (counting from the end). If the index is out of range, -returns undefined. - - - -**index**: The position of the character to return (can be negative). - - -**Returns**: A string of length 1 representing the character, or undefined if out of range. - - -### charCodeAt(index) function - -Return a number indicating the UTF-16 code unit value at the given index. -If the index is out of range, returns NaN. - - - -**index**: An integer between 0 and string length - 1. - - -**Returns**: An integer in the range [0, 65535] or NaN if out of range. - - -### charAt(index) function - -Return a string consisting of the single UTF-16 code unit at the given index. -If the index is out of range, returns an empty string. - - - -**index**: The zero-based index of the desired character. - - -**Returns**: The single-character string at the specified index, or '' if out of range. - - -### concat(stringN) function - -Concatenate the provided string arguments to the current string and return a -new string. - - - -**stringN**: One or more strings to concatenate. - - -**Returns**: A new string formed by joining the caller with the provided arguments. - - -### codePointAt(position) function - -Return a non-negative integer that is the Unicode code point value at the -given position. Supports code points above 0xFFFF. Returns undefined if index -is out of range. - - - -**position**: The index in the string (can be surrogate pairs). - - -**Returns**: The code point value, or undefined if out of range. - - -### isWellFormed() function - -Return a boolean indicating whether the string is valid Unicode. -If it contains unpaired surrogate code points, return false. - - - -**Returns**: True if the string is well-formed UTF-16, otherwise false. - - -### toWellFormed() function - -Return a new string in which any unpaired surrogate code points have been -replaced by the Unicode replacement character U+FFFD. - - - -**Returns**: A well-formed UTF-16 version of the string. - - -### indexOf(searchValue, fromIndex) function - -Return the zero-based index of the first occurrence of 'searchValue' in the -string, starting at 'fromIndex'. If not found, return -1. - - - -**searchValue**: The substring to search for. - -**fromIndex**: The index at which to begin searching (default 0). - - -**Returns**: The index of the first match, or -1 if not found. - - -### lastIndexOf(searchValue, fromIndex) function - -Return the zero-based index of the last occurrence of 'searchValue' in the -string, searching backwards from 'fromIndex'. If not found, return -1. - - - -**searchValue**: The substring to search for. - -**fromIndex**: The index at which to begin the backward search (defaults to string length - 1). - - -**Returns**: The index of the last match, or -1 if not found. - - -### includes(searchString, position) function - -Return a boolean indicating whether 'searchString' appears within this string. -An optional position can be provided to start searching. - - - -**searchString**: The substring to search for. - -**position**: The position from which to begin searching (default 0). - - -**Returns**: True if the substring is found, otherwise false. - - -### endsWith(searchString, length) function - -Return a boolean indicating whether the string ends with 'searchString'. -An optional 'length' can be provided to treat the string as if it were only -that long. - - - -**searchString**: The substring to search for at the end. - -**length**: An optional length to truncate the string before testing. - - -**Returns**: True if the string ends with 'searchString', otherwise false. - - -### startsWith(searchString, position) function - -Return a boolean indicating whether the string begins with 'searchString'. -An optional position can be provided to start checking at that index. - - - -**searchString**: The substring to search for at the start. - -**position**: The index in the string to start searching (default 0). - - -**Returns**: True if the string starts with 'searchString', otherwise false. - - -### match(regexp) function - -Use a regular expression to match the string. If 'regexp' is not a RegExp, it -is converted to one. Return an array of matches or null if none found. - - - -**regexp**: The pattern to match (RegExp or string). - - -**Returns**: An array of matches or null. - - -### matchAll(regexp) function - -Return an iterator of all RegExp match objects found within the string. -If 'regexp' is not a global or sticky RegExp, a TypeError is thrown. - - - -**regexp**: The global/sticky RegExp to match over this string. - - -**Returns**: An iterator of match arrays. - - -### search(regexp) function - -Use a regular expression to search for a match within the string. Return the -index of the first match, or -1 if no match is found. - - - -**regexp**: A RegExp or string. If a string, it is converted to RegExp. - - -**Returns**: The index of the first match, or -1 if not found. - - -### split(separator, limit) function - -Split the string into an array of substrings using 'separator' (RegExp or -string). An optional 'limit' can be provided to limit the number of splits. - - - -**separator**: A string or RegExp used to divide the string. - -**limit**: Maximum number of splits to include in the result array. - - -**Returns**: An array of the split substrings. - - -### substring(start, end) function - -Return the substring between 'start' and 'end'. Indices outside the range -are clamped. If 'end' < 'start', they swap. - - - -**start**: The starting index (0-based). - -**end**: The ending index (exclusive). - - -**Returns**: The extracted substring. - - -### substr(start, length) function - -Return the substring from 'start' for 'length' characters. Negative 'start' -counts from the end. This method is deprecated but still supported in many -engines. - - - -**start**: The starting index. - -**length**: The number of characters to extract. - - -**Returns**: The extracted substring. - - -### slice(start, end) function - -Extract a section of the string from 'start' up to (but not including) 'end', -and return it as a new string. Supports negative indices. - - - -**start**: The starting index. Negative values count from the end. - -**end**: The ending index (exclusive). Negative values count from the end. - - -**Returns**: The extracted slice. - - -### repeat(count) function - -Construct and return a new string which contains the specified number of copies -of the calling string, concatenated together. - - - -**count**: The number of times to repeat the string (must be >= 0). - - -**Returns**: A new repeated string. - - -### replace(searchValue, replaceValue) function - -Return a new string where the first match (or all matches if 'searchValue' -is a global RegExp) of 'searchValue' is replaced by 'replaceValue'. -If 'searchValue' is a string, only the first occurrence is replaced. - - - -**searchValue**: A string or RegExp to match. - -**replaceValue**: The replacement string or function. - - -**Returns**: A new string with the matched substring(s) replaced. - - -### replaceAll(searchValue, replaceValue) function - -Return a new string where all (non-overlapping) occurrences of 'searchValue' -are replaced by 'replaceValue'. If 'searchValue' is a string, each exact match -is replaced. - - - -**searchValue**: A string or RegExp with the 'g' flag. - -**replaceValue**: The replacement string or function. - - -**Returns**: A new string with all matches replaced. - - -### padEnd(maxLength, padString) function - -Pad the string from the end with the given 'padString' so its length reaches -'maxLength'. The result is a new string. - - - -**maxLength**: The desired length of the resulting string. - -**padString**: The string to pad with (default ' '). - - -**Returns**: A new string padded at the end. - - -### padStart(maxLength, padString) function - -Pad the string from the start with the given 'padString' so its length reaches -'maxLength'. The result is a new string. - - - -**maxLength**: The desired length of the resulting string. - -**padString**: The string to pad with (default ' '). - - -**Returns**: A new string padded at the start. - - -### trim() function - -Return a new string with whitespace trimmed from the start and end of this -string. - - - -**Returns**: The trimmed string. - - -### trimEnd() function - -Alias for trimEnd(). Remove trailing whitespace from the string. - - - -**Returns**: The string without trailing whitespace. - - -### trimRight() function - -Alias for trimEnd(). Remove trailing whitespace from the string. - - - -**Returns**: The string without trailing whitespace. - - -### trimStart() function - -Alias for trimStart(). Remove leading whitespace from the string. - - - -**Returns**: The string without leading whitespace. - - -### trimLeft() function - -Alias for trimStart(). Remove leading whitespace from the string. - - - -**Returns**: The string without leading whitespace. - - -### toString() function - -Return a string representing the specified object (itself). Usually called -implicitly. Overrides Object.prototype.toString. - - - -**Returns**: The string itself. - - -### valueOf() function - -Return the primitive string value of this String object. - - - -**Returns**: The primitive string value. - - -### __quote() function - -(Non-standard) Return a quoted representation of the string, typically for -debug or serialization. Implementation details may vary. - - - -**Returns**: A quoted version of the string. - - -### localeCompare(compareString) function - -Return a number indicating whether this string is less than, equal to, or -greater than 'compareString' in sort order, according to the current locale. - - - -**compareString**: The string to compare against. - - -**Returns**: A negative number if less, 0 if the same, or a positive number if greater. - - -### toLowerCase() function - -Return a new string with all alphabetic characters converted to lowercase. - - - -**Returns**: The lowercase version of this string. - - -### toUpperCase() function - -Return a new string with all alphabetic characters converted to uppercase. - - - -**Returns**: The uppercase version of this string. - - -### toLocaleLowerCase() function - -Return a locale-aware lowercase version of this string, using the host's -current locale or the specified locale if supported. - - - -**Returns**: The locale-sensitive lowercase string. - - -### toLocaleUpperCase() function - -Return a locale-aware uppercase version of this string, using the host's -current locale or the specified locale if supported. - - - -**Returns**: The locale-sensitive uppercase string. - - -### anchor(name) function - -Return a string representing an HTML element with a 'name' attribute -set to the current string. - - - -**name**: The name attribute for the anchor. - - -**Returns**: An HTML ... string. - - -### big() function - -Return a string representing an HTML element containing the current -string. - - - -**Returns**: An HTML ... string. - - -### blink() function - -Return a string representing an HTML element containing the current -string (historical, not recommended). - - - -**Returns**: An HTML ... string. - - -### bold() function - -Return a string representing an HTML element containing the current -string in bold. - - - -**Returns**: An HTML ... string. - - -### fixed() function - -Return a string representing an HTML element containing the current -string in fixed-width font. - - - -**Returns**: An HTML ... string. - - -### fontcolor(color) function - -Return a string representing an HTML element with a 'color' attribute, -containing the current string. - - - -**color**: The color value for the 'font' element. - - -**Returns**: An HTML ... string. - - -### fontsize(size) function - -Return a string representing an HTML element with a 'size' attribute, -containing the current string. - - - -**size**: The size value for the 'font' element. - - -**Returns**: An HTML ... string. - - -### italics() function - -Return a string representing an HTML element containing the current -string in italics. - - - -**Returns**: An HTML ... string. - - -### link(url) function - -Return a string representing an HTML element with an 'href' attribute set -to the current string. - - - -**url**: The URL for the 'href' attribute. - - -**Returns**: An HTML ... string. - - -### small() function - -Return a string representing an HTML element containing the current -string. - - - -**Returns**: An HTML ... string. - - -### strike() function - -Return a string representing an HTML element containing the current -string with strike-through. - - - -**Returns**: An HTML ... string. - - -### sub() function - -Return a string representing an HTML element containing the current -string as subscript. - - - -**Returns**: An HTML ... string. - - -### sup() function - -Return a string representing an HTML element containing the current -string as superscript. - - - -**Returns**: An HTML ... string. - - -### rm(index, endidx) function - -Remove characters from this string between 'index' (inclusive) -and 'endidx' (exclusive). If 'endidx' is omitted, it defaults to 'index + 1'. - - - -**index**: The starting index to remove. - -**endidx**: The ending index (exclusive). - - -**Returns**: A new string with the specified characters removed. - - -### tolast(val) function - -Return the substring of this string up to the last occurrence of 'val'. -If 'val' is not found, the entire string is returned. - - - -**val**: The substring to locate from the end. - - -**Returns**: A substring up to the last occurrence of 'val'. - - -### dir() function - -Return everything before the last slash ('/') in the string. -If no slash is found, return an empty string. - - - -**Returns**: The directory portion of the path. - - -### next(char, from) function - -Search for the next occurrence of 'char' in this string, starting at 'from'. -If 'char' is an array, any of those characters qualifies. Return the matching index, -or -1 if none is found. - - - -**char**: A character (or array of characters) to locate. - -**from**: The index to start from. - - -**Returns**: The index of the next occurrence, or -1 if not found. - - -### prev(char, from, count) function - -Search for the previous occurrence of 'char' before index 'from'. -If 'count' is greater than 1, skip multiple occurrences going backward. -Return the found index or 0 if not found. - - - -**char**: The character to locate. - -**from**: The index to start from (defaults to the end of the string). - -**count**: How many occurrences to skip backward (default 0). - - -**Returns**: The index of the previous occurrence, or 0 if not found. - - -### strip_ext() function - -Return the string up to (but not including) the last '.' character. -If '.' is not found, the entire string is returned. - - - -**Returns**: The string without its last extension. - - -### ext() function - -Return the substring after the last '.' in this string. -If '.' is not found, return an empty string. - - - -**Returns**: The file extension or an empty string. - - -### up_path() function - -Go up one directory level from the current path, preserving the file name at the end. - - - -**Returns**: A new path string one directory up, with the base filename preserved. - - -### fromlast(val) function - -Return the substring that appears after the last occurrence of 'val'. -If 'val' is not found, an empty string is returned. - - - -**val**: The substring to locate. - - -**Returns**: The substring after the last occurrence of 'val'. - - -### tofirst(val) function - -Return the substring from the start of this string up to the first occurrence -of 'val' (excluded). If 'val' is not found, the entire string is returned. - - - -**val**: The substring to locate. - - -**Returns**: A substring up to the first occurrence of 'val'. - - -### fromfirst(val) function - -Return the substring after the first occurrence of 'val'. -If 'val' is not found, the entire string is returned. - - - -**val**: The substring to locate. - - -**Returns**: The substring after 'val', or the entire string if 'val' not found. - - -### name() function - -Return the "name" portion of the path without extension. -If no slash is found, it's up to the last '.' in the entire string. -If there is a slash, it's from the last slash up to (but not including) the last '.'. - - - -**Returns**: The name portion of the path without extension. - - -### set_name(name) function - -Set the base name (excluding extension) of the path to 'name', preserving -the original directory and extension. - - - -**name**: The new name to use. - - -**Returns**: A new path string with the updated name. - - -### base() function - -Return the portion of this string after the last '/' character. -If no '/' is present, the entire string is returned. - - - -**Returns**: The base name of the path. - - -### updir() function - -Go up one directory from the current path, removing the last directory name. -If the path ends with a slash, remove it first. Then remove the final directory. - - - -**Returns**: A new string representing one directory level up. - diff --git a/docs/dull/Symbol.md b/docs/dull/Symbol.md deleted file mode 100644 index 3d6393eb..00000000 --- a/docs/dull/Symbol.md +++ /dev/null @@ -1,9 +0,0 @@ -# Symbol - -### toString() function - -### valueOf() function - -### description accessor - -(read only) diff --git a/docs/dull/WeakMap.md b/docs/dull/WeakMap.md deleted file mode 100644 index 2541a47d..00000000 --- a/docs/dull/WeakMap.md +++ /dev/null @@ -1,59 +0,0 @@ -# WeakMap - -A WeakMap object is a collection of key/value pairs in which keys must be -objects. References to key objects in a WeakMap are held weakly, meaning -they do not prevent garbage collection if there are no other references -to the object. WeakMap keys are not iterable. - -### set(key, value) function - -Set the value for the specified key in the WeakMap. The key must be an object. - - - -**key**: The object key. - -**value**: The value associated with the key. - - -**Returns**: The WeakMap object (for chaining). - - -### get(key) function - -Return the value associated with 'key' in the WeakMap, or undefined if -no such key exists. The key must be an object. - - - -**key**: The object key. - - -**Returns**: The value associated with the key, or undefined if not present. - - -### has(key) function - -Return a boolean indicating whether an element with the specified key -exists in the WeakMap. The key must be an object. - - - -**key**: The object key to check. - - -**Returns**: True if the key is found, otherwise false. - - -### delete(key) function - -Remove the specified key and its associated value from the WeakMap, -if it exists. - - - -**key**: The object key to remove. - - -**Returns**: True if an element was removed, otherwise false. - diff --git a/docs/dull/WeakSet.md b/docs/dull/WeakSet.md deleted file mode 100644 index 88c6b239..00000000 --- a/docs/dull/WeakSet.md +++ /dev/null @@ -1,43 +0,0 @@ -# WeakSet - -A WeakSet object is a collection of unique objects (no primitive values). -References to objects in a WeakSet are held weakly, so they do not prevent -garbage collection if there are no other references to the object. WeakSet -elements are not iterable. - -### add(value) function - -Add a new object to the WeakSet if it is not already present. The value -must be an object. - - - -**value**: The object to add. - - -**Returns**: The WeakSet object (for chaining). - - -### has(value) function - -Return a boolean indicating whether an object is present in the WeakSet. - - - -**value**: The object to check. - - -**Returns**: True if the object is in the WeakSet, otherwise false. - - -### delete(value) function - -Remove the specified object from the WeakSet, if it exists. - - - -**value**: The object to remove. - - -**Returns**: True if the object was present and removed, otherwise false. - diff --git a/docs/dull/array.md b/docs/dull/array.md deleted file mode 100644 index a7050d4c..00000000 --- a/docs/dull/array.md +++ /dev/null @@ -1,661 +0,0 @@ -# Array - -### length number - -### at(index) function - -Return the item at index 'index', supporting negative indices to count from -the end. If 'index' is out of range, returns undefined. - - - -**index**: The index of the element to return (can be negative). - - -**Returns**: The element at the given index, or undefined. - - -### with(index, value) function - -Return a shallow copy of the array, but with the element at 'index' replaced -by 'value'. If 'index' is negative, it counts from the end. Throws if out of range. - - - -**index**: The zero-based index (can be negative) to replace. - -**value**: The new value for the specified position. - - -**Returns**: A new array with the updated element. - - -### concat(items) function - -Return a new array that is the result of concatenating this array with -any additional arrays or values provided. - - - -**items**: One or more arrays or values to concatenate. - - -**Returns**: A new array with the items appended. - - -### every(callback, thisArg) function - -Return true if the provided callback function returns a truthy value for -every element in the array; otherwise false. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: True if all elements pass the test, otherwise false. - - -### some(callback, thisArg) function - -Return true if the provided callback function returns a truthy value for at -least one element in the array; otherwise false. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: True if at least one element passes the test, otherwise false. - - -### forEach(callback, thisArg) function - -Call the provided callback function once for each element in the array. -Does not produce a return value. - - - -**callback**: A function(element, index, array). - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: None - - -### map(callback, thisArg) function - -Create a new array with the results of calling a provided callback function -on every element in this array. - - - -**callback**: A function(element, index, array) => newElement. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: A new array of transformed elements. - - -### filter(callback, thisArg) function - -Create a new array containing all elements for which the provided callback -function returns a truthy value. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: A new array of elements that passed the test. - - -### reduce(callback, initialValue) function - -Apply a callback function against an accumulator and each element in the -array (from left to right) to reduce it to a single value. - - - -**callback**: A function(accumulator, element, index, array) => newAccumulator. - -**initialValue**: Optional. The initial value for the accumulator. - - -**Returns**: The single resulting value. - - -### reduceRight(callback, initialValue) function - -Similar to reduce(), except it processes elements from right to left. - - - -**callback**: A function(accumulator, element, index, array) => newAccumulator. - -**initialValue**: Optional. The initial value for the accumulator. - - -**Returns**: The single resulting value. - - -### fill(value, start, end) function - -Fill the array with a static value from 'start' index up to (but not including) -'end' index. Modifies the original array. - - - -**value**: The value to fill. - -**start**: The starting index (default 0). - -**end**: The ending index (default array.length). - - -**Returns**: The modified array (with filled values). - - -### find(callback, thisArg) function - -Return the first element in the array that satisfies the provided callback -function. If none is found, return undefined. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The first matching element, or undefined if not found. - - -### findIndex(callback, thisArg) function - -Return the index of the first element in the array that satisfies the -provided callback function. If none is found, return -1. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The index of the first matching element, or -1 if not found. - - -### findLast(callback, thisArg) function - -Return the last element in the array that satisfies the provided callback -function, searching from right to left. If none is found, return undefined. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The last matching element, or undefined if not found. - - -### findLastIndex(callback, thisArg) function - -Return the index of the last element in the array that satisfies the -provided callback function, searching from right to left. If none is found, -return -1. - - - -**callback**: A function(element, index, array) => boolean. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: The index of the last matching element, or -1 if not found. - - -### indexOf(searchElement, fromIndex) function - -Return the first index at which a given element can be found. If not present, -return -1. - - - -**searchElement**: The item to locate in the array. - -**fromIndex**: The index at which to start searching (default 0). - - -**Returns**: The index of the found element, or -1 if not found. - - -### lastIndexOf(searchElement, fromIndex) function - -Return the last index at which a given element can be found, or -1 if not -present. Searches backward from 'fromIndex'. - - - -**searchElement**: The item to locate in the array. - -**fromIndex**: The index at which to start searching backward (default array.length - 1). - - -**Returns**: The last index of the found element, or -1 if not found. - - -### includes(searchElement, fromIndex) function - -Return a boolean indicating whether the array contains the given element, -comparing elements using the SameValueZero algorithm. - - - -**searchElement**: The value to search for. - -**fromIndex**: The position in the array to start searching (default 0). - - -**Returns**: True if the element is found, otherwise false. - - -### join(separator) function - -Join all elements of the array into a string, separated by 'separator'. - - - -**separator**: The delimiter string to separate elements (default ','). - - -**Returns**: A string of array elements joined by the separator. - - -### toString() function - -Return a string representing the elements of the array, separated by commas. -Overrides Object.prototype.toString. - - - -**Returns**: A comma-separated string of array elements. - - -### toLocaleString() function - -Return a localized string representing the array and its elements, calling -each element's toLocaleString if available. - - - -**Returns**: A locale-sensitive, comma-separated string of array elements. - - -### pop() function - -Remove the last element from the array and return it. This changes the length -of the array. - - - -**Returns**: The removed element, or undefined if the array is empty. - - -### push(items) function - -Append one or more elements to the end of the array and return the new length -of the array. - - - -**items**: One or more items to append. - - -**Returns**: The new length of the array. - - -### shift() function - -Remove the first element from the array and return it. This changes the length -of the array. - - - -**Returns**: The removed element, or undefined if the array is empty. - - -### unshift(items) function - -Insert one or more elements at the start of the array and return the new -length of the array. - - - -**items**: One or more elements to insert at the start. - - -**Returns**: The new length of the array. - - -### reverse() function - -Reverse the elements of the array in place and return the modified array. - - - -**Returns**: The reversed array. - - -### toReversed() function - -Return a shallow copy of the array in reverse order, without modifying the original array. - - - -**Returns**: A new reversed array. - - -### sort(compareFunction) function - -Sort the array in place, returning it. By default, sorts elements as strings in ascending order. An optional compareFunction may be used for custom sorting. - - - -**compareFunction**: A function(a, b) => number, defining sort order. - - -**Returns**: The sorted array. - - -### toSorted(compareFunction) function - -Return a shallow copy of the array, sorted according to the optional compare -function, without modifying the original array. - - - -**compareFunction**: A function(a, b) => number, defining sort order. - - -**Returns**: A new sorted array. - - -### slice(start, end) function - -Return a shallow copy of a portion of the array into a new array object, selected from 'start' to 'end' (end not included). - - - -**start**: The beginning index (0-based). Negative values count from the end. - -**end**: The end index (exclusive). Negative values count from the end. - - -**Returns**: A new array containing the extracted elements. - - -### splice(start, deleteCount, items) function - -Change the contents of the array by removing or replacing existing elements and/or adding new elements in place. Returns an array of removed elements. - - - -**start**: The index at which to start changing the array. - -**deleteCount**: Number of elements to remove. - -**items**: Elements to add in place of the removed elements. - - -**Returns**: An array containing the removed elements (if any). - - -### toSpliced(start, deleteCount, items) function - -Return a shallow copy of the array, with a splice-like operation applied at 'start' removing 'deleteCount' elements and adding 'items'. Does not mutate the original array. - - - -**start**: The index at which to start the splice operation. - -**deleteCount**: Number of elements to remove. - -**items**: Elements to add in place of the removed elements. - - -**Returns**: A new array with the splice applied. - - -### copyWithin(target, start, end) function - -Copy a sequence of array elements within the array, overwriting existing values. This operation is performed in place and returns the modified array. - - - -**target**: The index at which to copy the sequence to. - -**start**: The beginning index of the sequence to copy. - -**end**: The end index (exclusive) of the sequence to copy (default array.length). - - -**Returns**: The modified array. - - -### flatMap(callback, thisArg) function - -Return a new array formed by applying a callback function to each element and then flattening the result by one level. - - - -**callback**: A function(element, index, array) => array or value. - -**thisArg**: Optional. A value to use as 'this' within the callback. - - -**Returns**: A new array with the flattened results. - - -### flat(depth) function - -Return a new array with all sub-array elements concatenated into it recursively up to the specified depth. - - - -**depth**: The maximum depth to flatten (default 1). - - -**Returns**: A new flattened array. - - -### values() function - -Return a new Array Iterator object that contains the values for each index in the array. - - - -**Returns**: An iterator over the array's elements. - - -### keys() function - -Return a new Array Iterator object that contains the keys (indexes) for each index in the array. - - - -**Returns**: An iterator over the array's indices. - - -### entries() function - -Return a new Array Iterator object that contains key/value pairs for each index in the array. Each entry is [index, value]. - - - -**Returns**: An iterator over [index, value] pairs. - - -### add(other) function - -Non-standard. Add corresponding elements of the current array and 'other' element-wise, returning a new array. Behavior depends on data types. - - - -**other**: Another array or scalar to add to each element. - - -**Returns**: A new array with element-wise sum results. - - -### sub(other) function - -Non-standard. Subtract corresponding elements of 'other' from the current array element-wise, returning a new array. Behavior depends on data types. - - - -**other**: Another array or scalar to subtract from each element. - - -**Returns**: A new array with element-wise difference results. - - -### div(other) function - -Non-standard. Divide each element of the current array by the corresponding element of 'other' (or a scalar) element-wise, returning a new array. Behavior depends on data types. - - - -**other**: Another array or scalar for the division. - - -**Returns**: A new array with element-wise division results. - - -### scale() function - -### lerp() function - -### x accessor - -### y accessor - -### xy accessor - -### r accessor - -### g accessor - -### b accessor - -### a accessor - -### rgb accessor - -### rgba accessor - -### filter!(fn) function - -Perform an in-place filter of this array using the provided callback 'fn'. -Any element for which 'fn' returns a falsy value is removed. The array is modified -and then returned. - - - -**fn**: A callback function(element, index, array) => boolean. - - -**Returns**: The filtered (modified) array. - - -### delete(item) function - -Remove the first occurrence of 'item' from the array, if it exists. -Returns undefined. - - - -**item**: The item to remove. - - -**Returns**: undefined - - -### copy() function - -Return a deep copy of this array by applying 'deep_copy' to each element. -The resulting array is entirely new. - - - -**Returns**: A new array that is a deep copy of the original. - - -### equal(b) function - -Check if this array and array 'b' have the same elements in the same order. -If they are of different lengths, return false. Otherwise compare them via JSON. - - - -**b**: Another array to compare against. - - -**Returns**: True if they match, false otherwise. - - -### last() function - -Return the last element of this array. If the array is empty, returns undefined. - - - -**Returns**: The last element of the array, or undefined if empty. - - -### wrapped(x) function - -Return a copy of the array with the first 'x' elements appended to the end. -Does not modify the original array. - - - -**x**: The number of leading elements to re-append. - - -**Returns**: A new array with the leading elements wrapped to the end. - - -### wrap_idx(x) function - -Wrap the integer 'x' around this array's length, ensuring the resulting index -lies within [0, this.length - 1]. - - - -**x**: The index to wrap. - - -**Returns**: A wrapped index within this array's bounds. - - -### mirrored(x) function - -Return a new array that appends a reversed copy (excluding the last element) -of itself to the end. For example, [1,2,3] -> [1,2,3,2,1]. If the array has length -<= 1, a copy of it is returned directly. - - - -**Returns**: A new "mirrored" array. - diff --git a/docs/dull/dull.png b/docs/dull/dull.png deleted file mode 100644 index dbaa5f426c63a0ec3ac02fc81faa87a39f456e32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224019 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

3bL79Nv?CD>W9J>>cGj%sq!BbTKu9UIlv+rl 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 ^*INfFE7k`p(gv6&F}1HLHZa^J+mSpdAa#0gXp? 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

yFL+ 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

JVt@cq4p}z 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 z=zjw${{|SPIz3number - -### name string - -### prototype object - -### isArray(value) function - -Determine if the given value is an Array. Returns true if the argument is an array, otherwise false. - - - -**value**: The value to be checked. - - -**Returns**: True if 'value' is an array, otherwise false. - - -### from(arrayLike, mapFn, thisArg) function - -Create a new array from an array-like or iterable object. An optional map function can be invoked on each element before it is added to the new array. - - - -**arrayLike**: An array-like or iterable object to convert. - -**mapFn**: Optional. A function to call on every element of the new array. - -**thisArg**: Optional. A value to use as 'this' within the map function. - - -**Returns**: A new array populated with elements processed from arrayLike. - - -### of(elements) function - -Create a new array with a variable number of arguments, regardless of the number or type of the arguments. Unlike the Array constructor, there is no special treatment for a single numeric argument. - - - -**elements**: A variable number of arguments which become array elements. - - -**Returns**: A new array containing the provided arguments. - diff --git a/docs/dull/globals/Error.md b/docs/dull/globals/Error.md deleted file mode 100644 index c8764757..00000000 --- a/docs/dull/globals/Error.md +++ /dev/null @@ -1,7 +0,0 @@ -# Error - -### length number - -### name string - -### prototype object diff --git a/docs/dull/globals/Function.md b/docs/dull/globals/Function.md deleted file mode 100644 index f6d9f62a..00000000 --- a/docs/dull/globals/Function.md +++ /dev/null @@ -1,7 +0,0 @@ -# Function - -### length number - -### name string - -### prototype() function diff --git a/docs/dull/globals/Math.md b/docs/dull/globals/Math.md deleted file mode 100644 index 362ca5d8..00000000 --- a/docs/dull/globals/Math.md +++ /dev/null @@ -1,458 +0,0 @@ -# Math - -### min(values) function - -Return the smallest of the zero or more given numbers. If no arguments are provided, the result is Infinity. If any value is NaN, the result is NaN. - - - -**values**: One or more numeric values. - - -**Returns**: The smallest numeric value, Infinity if no arguments, or NaN if any argument cannot be converted to a number. - - -### max(values) function - -Return the largest of the zero or more given numbers. If no arguments are provided, the result is -Infinity. If any value is NaN, the result is NaN. - - - -**values**: One or more numeric values. - - -**Returns**: The largest numeric value, -Infinity if no arguments, or NaN if any argument cannot be converted to a number. - - -### abs(x) function - -Return the absolute value of the given number. For example, -5 becomes 5. - - - -**x**: A numeric value. - - -**Returns**: The absolute value of x. - - -### floor(x) function - -Return the greatest integer less than or equal to x, effectively rounding down to the nearest integer. - - - -**x**: A numeric value. - - -**Returns**: The largest integer <= x. - - -### ceil(x) function - -Return the smallest integer greater than or equal to x, effectively rounding up to the nearest integer. - - - -**x**: A numeric value. - - -**Returns**: The smallest integer >= x. - - -### round(x) function - -Return x rounded to the nearest integer. If the fractional portion is 0.5 or -greater, rounds up; otherwise, rounds down. Ties away from zero in modern ECMAScript. - - - -**x**: A numeric value. - - -**Returns**: x rounded to the nearest integer. - - -### sqrt(x) function - -Return the positive square root of x. If x is negative, the result is NaN. - - - -**x**: A non-negative numeric value. - - -**Returns**: The positive square root of x, or NaN if x is negative. - - -### acos(x) function - -Return the arccosine (in radians) of x, in the range [0, π]. If x is outside -the range [-1, 1], the result is NaN. - - - -**x**: A numeric value in [-1, 1]. - - -**Returns**: The arccosine of x in radians, or NaN if out of range. - - -### asin(x) function - -Return the arcsine (in radians) of x, in the range [-π/2, π/2]. If x is -outside [-1, 1], the result is NaN. - - - -**x**: A numeric value in [-1, 1]. - - -**Returns**: The arcsine of x in radians, or NaN if out of range. - - -### atan(x) function - -Return the arctangent (in radians) of x, in the range [-π/2, π/2]. - - - -**x**: A numeric value. - - -**Returns**: The arctangent of x in radians. - - -### atan2(y, x) function - -Return the arctangent of the quotient of its arguments (y / x), in the range -(-π, π]. This takes into account the signs of both x and y to determine -the correct quadrant. - - - -**y**: The y coordinate. - -**x**: The x coordinate. - - -**Returns**: The angle in radians between the positive x-axis and the point (x, y). - - -### cos(x) function - -Return the cosine of x, where x is in radians. - - - -**x**: A numeric value in radians. - - -**Returns**: The cosine of x, in the range [-1, 1]. - - -### exp(x) function - -Return e^x, where e is Euler's number (approximately 2.71828). - - - -**x**: A numeric exponent. - - -**Returns**: The value of e raised to x. - - -### log(x) function - -Return the natural logarithm (base e) of x. If x is <= 0, the result is NaN. - - - -**x**: A positive numeric value. - - -**Returns**: The natural logarithm of x. - - -### pow(base, exponent) function - -Return base raised to the power exponent, i.e. base^exponent. If base is -negative and exponent is not an integer, result is NaN. - - - -**base**: The base number. - -**exponent**: The exponent number. - - -**Returns**: base raised to exponent. - - -### sin(x) function - -Return the sine of x, where x is in radians. - - - -**x**: A numeric value in radians. - - -**Returns**: The sine of x, in the range [-1, 1]. - - -### tan(x) function - -Return the tangent of x, where x is in radians. If x is (π/2 + nπ), the -result is ±Infinity or NaN. - - - -**x**: A numeric value in radians. - - -**Returns**: The tangent of x. - - -### trunc(x) function - -Return the integer part of x by removing any fractional digits. Does not -round, just truncates. - - - -**x**: A numeric value. - - -**Returns**: x truncated toward zero. - - -### sign(x) function - -Return the sign of x, indicating whether x is positive, negative, or zero. -Returns 1 if x > 0, -1 if x < 0, 0 if x is 0, and NaN if x is NaN. - - - -**x**: A numeric value. - - -**Returns**: 1, -1, 0, -0, or NaN, depending on x. - - -### cosh(x) function - -Return the hyperbolic cosine of x, (e^x + e^-x) / 2. - - - -**x**: A numeric value. - - -**Returns**: The hyperbolic cosine of x. - - -### sinh(x) function - -Return the hyperbolic sine of x, (e^x - e^-x) / 2. - - - -**x**: A numeric value. - - -**Returns**: The hyperbolic sine of x. - - -### tanh(x) function - -Return the hyperbolic tangent of x, (e^x - e^-x) / (e^x + e^-x). - - - -**x**: A numeric value. - - -**Returns**: The hyperbolic tangent of x. - - -### acosh(x) function - -Return the inverse hyperbolic cosine of x, defined as ln(x + sqrt(x^2 - 1)). -If x < 1, the result is NaN. - - - -**x**: A numeric value >= 1. - - -**Returns**: The inverse hyperbolic cosine of x. - - -### asinh(x) function - -Return the inverse hyperbolic sine of x, defined as ln(x + sqrt(x^2 + 1)). - - - -**x**: A numeric value. - - -**Returns**: The inverse hyperbolic sine of x. - - -### atanh(x) function - -Return the inverse hyperbolic tangent of x, defined as 1/2 * ln((1 + x) / (1 - x)). -If |x| >= 1, the result is NaN. - - - -**x**: A numeric value in the range (-1, 1). - - -**Returns**: The inverse hyperbolic tangent of x. - - -### expm1(x) function - -Return e^x - 1, for small values of x this provides higher precision than -Math.exp(x) - 1. - - - -**x**: A numeric exponent. - - -**Returns**: e^x - 1. - - -### log1p(x) function - -Return the natural logarithm of (1 + x). More accurate than Math.log(1 + x) -for small x. - - - -**x**: A numeric value > -1. - - -**Returns**: ln(1 + x). - - -### log2(x) function - -Return the base-2 logarithm of x. If x <= 0, the result is NaN. - - - -**x**: A positive numeric value. - - -**Returns**: The base-2 logarithm of x. - - -### log10(x) function - -Return the base-10 logarithm of x. If x <= 0, the result is NaN. - - - -**x**: A positive numeric value. - - -**Returns**: The base-10 logarithm of x. - - -### cbrt(x) function - -Return the cube root of x, including negative values. - - - -**x**: A numeric value (can be negative). - - -**Returns**: The cube root of x. - - -### hypot(values) function - -Return the square root of the sum of squares of its arguments, i.e. -sqrt(x1^2 + x2^2 + ...). If any value is ±Infinity, returns Infinity. If -any value is NaN, returns NaN. - - - -**values**: One or more numeric values. - - -**Returns**: The square root of the sum of squares of the arguments. - - -### random() function - -Return a pseudo-random floating-point number in the range [0, 1). -The result is usually seeded by an engine-defined source of randomness. - - - -**Returns**: A number >= 0 and < 1. - - -### fround(x) function - -Return the nearest 32-bit single-precision float representation of x. - - - -**x**: A numeric value. - - -**Returns**: The 32-bit float representation of x. - - -### imul(a, b) function - -Return the result of a 32-bit integer multiplication of two values. -Effectively (a * b) | 0 in many implementations. - - - -**a**: A numeric value. - -**b**: A numeric value. - - -**Returns**: The 32-bit integer result of multiplying a by b. - - -### clz32(x) function - -Return the number of leading zero bits in the 32-bit binary representation -of x. If x is 0, returns 32. - - - -**x**: A numeric value, treated as a 32-bit unsigned integer. - - -**Returns**: The count of leading zero bits, in the range [0, 32]. - - -### E number - -### LN10 number - -### LN2 number - -### LOG2E number - -### LOG10E number - -### PI number - -### SQRT1_2 number - -### SQRT2 number diff --git a/docs/dull/globals/Number.md b/docs/dull/globals/Number.md deleted file mode 100644 index 481f2663..00000000 --- a/docs/dull/globals/Number.md +++ /dev/null @@ -1,99 +0,0 @@ -# Number - -### length number - -### name string - -### prototype object - -### parseInt(string, radix) function - -Parse a string argument and return an integer of the specified radix (base). -If the string does not start with a valid integer, return NaN. Leading -whitespace is ignored. - - - -**string**: The string to parse as an integer. - -**radix**: An integer between 2 and 36 indicating the base of the number in the string. - - -**Returns**: The parsed integer, or NaN if the input is not a valid integer. - - -### parseFloat(string) function - -Parse a string argument and return a floating-point number. If the string does not represent a valid number, return NaN. Leading whitespace is ignored, and the string can include a decimal point or exponent. - - - -**string**: The string to parse as a floating-point number. - - -**Returns**: The parsed number, or NaN if invalid. - - -### isNaN(value) function - -Determine if a value is the special numeric value NaN, without converting the argument. Unlike the global isNaN(), this returns false for non-numeric values. - - - -**value**: The value to test. - - -**Returns**: True if the value is NaN, otherwise false. - - -### isFinite(value) function - -Determine if a value is a finite number. Unlike the global isFinite(), this returns false for non-numeric values without attempting to convert them. - - - -**value**: The value to test. - - -**Returns**: True if the value is a finite number, otherwise false. - - -### isInteger(value) function - -Check if the given value is a finite number and also an integer (no fractional part). Returns false for non-numeric values or NaN. - - - -**value**: The value to test. - - -**Returns**: True if value is an integer, otherwise false. - - -### isSafeInteger(value) function - -Check if the given value is a safe integer. A safe integer is one that can be exactly represented as an IEEE-754 double-precision number (i.e., between -9007199254740991 and 9007199254740991 inclusive). - - - -**value**: The value to test. - - -**Returns**: True if value is an integer within the safe range, otherwise false. - - -### MAX_VALUE number - -### MIN_VALUE number - -### NaN number - -### NEGATIVE_INFINITY number - -### POSITIVE_INFINITY number - -### EPSILON number - -### MAX_SAFE_INTEGER number - -### MIN_SAFE_INTEGER number diff --git a/docs/dull/globals/Object.md b/docs/dull/globals/Object.md deleted file mode 100644 index 16f49aaa..00000000 --- a/docs/dull/globals/Object.md +++ /dev/null @@ -1,331 +0,0 @@ -# Object - -### length number - -### name string - -### prototype object - -### create(proto, propertiesObject) function - -Create a new object, using the specified prototype object and optional property descriptors. - - - -**proto**: The object to be used as the prototype. - -**propertiesObject**: Optional. An object specifying properties to be added. - - -**Returns**: A new object with the given prototype and properties. - - -### getPrototypeOf(obj) function - -Return the prototype of the specified object. If no prototype is found (e.g. the object has null as its prototype), return null. - - - -**obj**: The object whose prototype is to be returned. - - -**Returns**: The prototype of 'obj', or null. - - -### setPrototypeOf(obj, proto) function - -Set the prototype of the specified object to the provided value. Throws a TypeError if the object is non-extensible and the prototype is changed. - - - -**obj**: The object whose prototype is set. - -**proto**: The new prototype or null. - - -**Returns**: The object 'obj' after setting its prototype. - - -### defineProperty(obj, prop, descriptor) function - -Define or modify a property on an object using a property descriptor, returning the object. Throws a TypeError if the descriptor is invalid. - - - -**obj**: The object on which to define or modify a property. - -**prop**: The name or Symbol of the property. - -**descriptor**: A property descriptor object (e.g., {value, writable, get, set, ...}). - - -**Returns**: The object with the newly defined or updated property. - - -### defineProperties(obj, props) function - -Define new or modify existing properties on an object, given an object of property descriptors. Returns the modified object. - - - -**obj**: The object on which to define or modify properties. - -**props**: An object mapping property names to property descriptors. - - -**Returns**: The modified object. - - -### getOwnPropertyNames(obj) function - -Return an array of all own (non-Symbol) property names found directly on the given object, in the same order as a for...in loop would return. - - - -**obj**: The object whose own property names are returned. - - -**Returns**: An array of strings that correspond to the properties. - - -### getOwnPropertySymbols(obj) function - -Return an array of all own Symbol properties found directly on the given object. - - - -**obj**: The object to retrieve Symbol keys from. - - -**Returns**: An array of Symbol keys. - - -### groupBy(obj, fn) function - -Non-standard / Proposed. Group the own properties of an object according to the return value of a grouping function. Typically returns a new object whose keys are the group identifiers. - - - -**obj**: The object to group. - -**fn**: A function(key, value) => groupingKey, applied to each property. - - -**Returns**: An object where properties are grouped by the returned keys. - - -### keys(obj) function - -Return an array of the object's own enumerable (non-Symbol) property names, in the same order that a normal loop would. - - - -**obj**: The object whose property names are to be returned. - - -**Returns**: An array of property names. - - -### values(obj) function - -Return an array of the object's own enumerable (non-Symbol) property values, in the same order as Object.keys(). - - - -**obj**: The object whose property values are to be returned. - - -**Returns**: An array of property values. - - -### entries(obj) function - -Return an array of [key, value] pairs for the object's own enumerable (non-Symbol) properties, in the same order as Object.keys(). - - - -**obj**: The object whose [key, value] pairs are to be returned. - - -**Returns**: An array of [key, value] pairs. - - -### isExtensible(obj) function - -Return a boolean indicating whether new properties can be added to the specified object. - - - -**obj**: The object to test. - - -**Returns**: True if the object is extensible, otherwise false. - - -### preventExtensions(obj) function - -Prevent new properties from ever being added to an object. Existing properties are not affected. - - - -**obj**: The object to mark as non-extensible. - - -**Returns**: The non-extensible object. - - -### getOwnPropertyDescriptor(obj, prop) function - -Return the property descriptor for a named property on the specified object, if it exists, otherwise undefined. - - - -**obj**: The object in which to look for the property. - -**prop**: The name or Symbol of the property. - - -**Returns**: The property descriptor, or undefined if not found. - - -### getOwnPropertyDescriptors(obj) function - -Return an object containing all own property descriptors for the given object, keyed by property names (and Symbols). - - - -**obj**: The object to retrieve property descriptors from. - - -**Returns**: An object mapping property keys to property descriptors. - - -### is(value1, value2) function - -Compare two values for strict equality, like '===' but without special treatment for +0 and -0, and treating NaN as equal to NaN. - - - -**value1**: A value to compare. - -**value2**: Another value to compare. - - -**Returns**: True if both values are the same, otherwise false. - - -### assign(target, sources) function - -Copy all enumerable own properties from one or more source objects to a target object, returning the modified target. - - - -**target**: The object to receive properties. - -**sources**: One or more objects containing properties to copy. - - -**Returns**: The updated target object. - - -### seal(obj) function - -Seal an object, preventing new properties from being added and marking all existing properties as non-configurable. Values of present properties can still be changed if they are writable. - - - -**obj**: The object to seal. - - -**Returns**: The sealed object. - - -### freeze(obj) function - -Freeze an object, preventing new properties from being added, existing properties from being removed, or current properties from being changed (to the extent permitted by property descriptors). - - - -**obj**: The object to freeze. - - -**Returns**: The frozen object. - - -### isSealed(obj) function - -Check if an object is sealed. A sealed object has no configurable properties and is non-extensible. - - - -**obj**: The object to test. - - -**Returns**: True if the object is sealed, otherwise false. - - -### isFrozen(obj) function - -Check if an object is frozen. A frozen object is sealed and all data properties are non-writable. - - - -**obj**: The object to test. - - -**Returns**: True if the object is frozen, otherwise false. - - -### __getClass() function - -### fromEntries(entries) function - -Transform a list of key-value pairs into an object. The iterable argument should yield pairs [key, value], which become properties on the resulting object. - - - -**entries**: An iterable of [key, value] pairs. - - -**Returns**: A new object formed from the given entries. - - -### hasOwn(obj, prop) function - -Return a boolean indicating whether the specified property exists on the object as a direct own property (similar to hasOwnProperty, but directly on Object). - - - -**obj**: The object on which to check the property. - -**prop**: The name or Symbol of the property to check. - - -**Returns**: True if the property is found on 'obj', otherwise false. - - -### id(obj) function - -Non-standard. Return a unique identifier for the given object, assigning one if necessary. The same object will always yield the same ID. - - - -**obj**: The object to retrieve or assign a unique ID. - - -**Returns**: A unique identifier (string or number) associated with the object. - - -### mixin(target, source) function - -Copy all property descriptors from 'source' into 'target'. - - - -**target**: The object that will receive properties. - -**source**: The object whose properties are to be copied. - - -**Returns**: The updated 'target' object. - diff --git a/docs/dull/globals/String.md b/docs/dull/globals/String.md deleted file mode 100644 index c87e18d5..00000000 --- a/docs/dull/globals/String.md +++ /dev/null @@ -1,49 +0,0 @@ -# String - -### length number - -### name string - -### prototype object - -### fromCharCode(codeUnits) function - -Return a string created from the specified sequence of UTF-16 code units. -Each argument is treated as a code unit in the range [0, 65535]. - - - -**codeUnits**: A series of numbers representing UTF-16 code units. - - -**Returns**: A string constructed by mapping each code unit to a character. - - -### fromCodePoint(codePoints) function - -Return a string created from the specified sequence of code points, -including those above U+FFFF (which will become surrogate pairs). -Throws a RangeError for invalid code points. - - - -**codePoints**: A series of numbers representing Unicode code points. - - -**Returns**: A string constructed from the given code points. - - -### raw(template, substitutions) function - -A tag function of template literals that returns a raw where escape sequences (e.g., '\n', '\u00A9') are not processed. -Commonly used to retrieve the unprocessed text of a template. - - - -**template**: A template literal, or an object with a 'raw' property. - -**substitutions**: Additional values to substitute (if any). - - -**Returns**: The combined raw string from the template. - diff --git a/docs/dull/globals/Symbol.md b/docs/dull/globals/Symbol.md deleted file mode 100644 index 097d76e3..00000000 --- a/docs/dull/globals/Symbol.md +++ /dev/null @@ -1,59 +0,0 @@ -# Symbol - -### length number - -### name string - -### prototype object - -### for(key) function - -Search the global symbol registry for a symbol with the given key. If found, return that symbol; otherwise, create a new symbol with that key and add it to the registry, then return the new symbol. - - - -**key**: A string key used to identify the symbol in the global registry. - - -**Returns**: A symbol associated with the given key in the global registry. - - -### keyFor(sym) function - -Retrieve a shared symbol’s key from the global symbol registry. If the symbol is not in the global registry, return undefined. - - - -**sym**: The symbol to find the key for. - - -**Returns**: The string key if 'sym' is a global symbol, otherwise undefined. - - -### toPrimitive symbol - -### iterator symbol - -### match symbol - -### matchAll symbol - -### replace symbol - -### search symbol - -### split symbol - -### toStringTag symbol - -### isConcatSpreadable symbol - -### hasInstance symbol - -### species symbol - -### unscopables symbol - -### asyncIterator symbol - -### operatorSet symbol diff --git a/docs/dull/index.md b/docs/dull/index.md deleted file mode 100644 index 5e5e87f8..00000000 --- a/docs/dull/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Appendix A - The Dull Programming Language: Extensions to Javascript - -![image](dull.png) - -The language is dubbed "dull". Dull, because it is a less featureful Javascript. Where does it differ? - -- No promises, async, await, generators ... -- No import/export syntax; 'use' instead -- No proxies - -We gave it this name to make very clear this is NOT the javascript of the web. This is its own thing, with its own ideas. - -Eventually, it could be JIT'd, but another trait of dull is that it is easy to integrate C code into. That is preferred over doing stuff strictly in dull. - -Dull has C-like syntax, because that makes it trivial to push code from it into a real C file. \ No newline at end of file diff --git a/docs/exporting.md b/docs/exporting.md deleted file mode 100644 index ade95f29..00000000 --- a/docs/exporting.md +++ /dev/null @@ -1,3 +0,0 @@ -# Building & Releasing - -To build and release your game, simply put all of your game assets in the folder into a zip (not including prosperon itself!) named `game.zip`, and ship it in the same folder as the `prosperon` executable for the given platform. `game.zip` is mounted, if present, before any other path, so it will be explored first for assets; in effect, anything in the folder is a 'mod' for a present `game.zip`! diff --git a/docs/index.md b/docs/index.md index d04be64b..ef3dc770 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,32 +1,26 @@ -# Preface: The Prosperon Vision +# Preface: The Cell Environment ![image](wizard.png) -Prosperon is based around a Javascript-like language, DullJS, termed henceforth "dull", engineered to be the quickest way to make computer games. "Dull" will be explored in more detail, but for all intents and purposes it **is** Javascript, with a handful of ES6 features removed. We've given it its own name to crush from the outset any idea that what you're dealing with a web styled Javascript environment! +Cell is an actor based scripting language. -## The Vision -The less lines of code it takes to do something, the less your program does. The less your program does, the faster it is, and the fewer bugs it has. And, the less the developer needs to keep in their head, the less bugs and more understandable a program is. +The idea is to author c code and orchestrate it using cell script, in an actor based environment, and deploy it on many platforms. -Prosperon is designed to achieve a minimal number of lines of code when creating a game. Prosperon is designed to be the **best** way to make computer games, quickly. +## Building code +There are two ways to run cell: -1. **Flexible API** -A lot of the API usage is informed from 'duck typing'. If something "looks" like a camera - it can be used like one! If something "looks" like a sprite, it can be used like one! This means that if you create an enemy in the game, you may be able to pass it in to render, while in other more strict languages, you might need to create an intermediate "sprite" object. +The dev environment is highly dynamic and available only on platforms with dynamic library loading. It lets you spawn actors and test quickly. -2. **Uniformity** -Javascript has the brilliant object idea, which is used and abused everywhere in prosperon. Objects allow for a huge variety of ideas to be expressed, and act as an ideal transferring tool between the disparate parts of a computer game. Dull, our dumbed down javascript, uses objects and closures to a greater extent than modern javascript, **without** losing any of the features. There is less syntax to remember, meaning it is quicker to get code down. +Cake is a static builder for cell, which lets you bundle a package into a static executable for a variety of target platforms. -3. **Highly reflective** -Built in tools to give an overview of your game. Prosperon can tell you where and how many certain entities are created, how much space they use, and so on. Prosperon can generate an textual overview of your game, resulting in documentation. +## Packages +Cell doesn't assume an underlying file system. -4. **Text based** -Prosperon is totally text based. It uses a script based scene structure, where scripts spawn each other and concatenate onto each other to create objects in a scene in a flexible way. This allows for a first class experience with SCM tools, and allows for easy multi user collaboration. +Packages are the fundamental cell unit. A package is made up of a variety of cell script files and potentially C files. When bundling, everything in a package is bundled together; when running in dev, everything in a package is loaded dynamically. -4. **Gradual Performance** -There are fast paths on nearly everything for well defined objects. For most use cases, the flexible, duck typing works. But in specific circumstances, where speed is required, it's possible. +Cell code is written with cellscript. -5. **Interactive** -Whenever there is a question of feature, Prosperon chooses the interactive path. Games are interactive. That means you want it to be totally dynamic and fast. Prosperon is designed to favor, for example, generated MIDI music, which you might be able to sync to goblin death animations, over static MP3 files. +## Modules and programs +A module returns a single object. This can be a function, an object of functions, a number, a string, whatever. It is included with the "use" keyword, ie, use('/'). -## Installation - -Just grab the prosperon build for your platform, drop it in a folder, and run it. Prosperon is a tiny executable, so it's recommended to version it with your project. +A program doesn't return anything. A program is an actor, with its own memory space. Actors do not share memory. Actors can send messages to each other. \ No newline at end of file diff --git a/docs/input.md b/docs/input.md deleted file mode 100644 index 705fb689..00000000 --- a/docs/input.md +++ /dev/null @@ -1,54 +0,0 @@ -# Program events and an example input system - -Prosperon provides a handy `input` module. Input is done in a highly generic and customizable manner. *players* can take control of any object (actor or otherwise) in Prosperon, after which it is referred to as a *pawn* of a player. If the object has a defined *input* object, it is a valid pawn. One player can have many pawns, but each pawn may have only one player. - -Pawns are added as a stack, with the newest ones getting priority, and handled first. It is possible for pawns to block input to lower pawns on the stack. - -``` -*newest* -car <== When a key is pressed, this is the first pawn to handle input -player -ui <== /block/ is set to true here, so editor recieves no input! -editor -*oldest* -``` - -The default player can be obtained with `Player.players[0]`. Players are all local, and the highest number is determined by platform. - -The **input** object defines a number of keys or actions, with their values being functions. - -## Editor input -The editor input style defines keystrokes. It is good for custom editors, or any sort of game that requires many hotkeys. Keystrokes are case sensitive and can be augmented with auxiliary keys. - -| symbol | key | -|--------|-------| -| C | ctrl | -| M | alt | -| S | super | - -``` -var input = use('input') -var orc = this.spawn('orc'); -orc.inputs = {}; -orc.inputs.a = function() { ... }; -orc.inputs.A = function() { ... }; /* This is only called with a capital A! */ -orc.inputs['C-a'] = function() { ... }; /* Control-a */ -input.players[0].control(orc); /* player 0 is now in control of the orc */ -``` - -The input object can be modified to customize how it handles input. - -| property | type | effect | -|----------------|----------|--------------------------------------| -| post | function | called after any input is processed | -| =release_post= | function | called after any input is released | -| fallthru | bool | false if input should stop with this | -| block | bool | true if input should stop with this | - -The input can be modified by setting properties on the associated function. - -| property | type | effect | -|----------|----------|--------------------------------------------------------| -| released | function | Called when the input is released | -| rep | bool | true if holding the input should repeatedly trigger it | -| down | function | called while the input is down | diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml deleted file mode 100644 index 94f42211..00000000 --- a/docs/mkdocs.yml +++ /dev/null @@ -1,41 +0,0 @@ -site_name: Prosperon Documentation - -plugins: - - search - - awesome-pages - - mike - -extra_css: - - style.css - -theme: - name: material - navigation_depth: 3 - logo: prosperon.gif - favicon: favicon.gif - features: - - content.action.view - - navigation.prune - - navigation.indexes - - search.suggest - - search.highlight - - toc.follow - icon: - view: material/eye - palette: - scheme: youtube - -extra: - social: - - icon: fontawesome/brands/x-twitter - link: https://x.com/@pockleworld - analytics: - provider: google - property: G-85ECSFGCBV - version: - default: latest - provider: mike - -markdown_extensions: - - admonition - - tables diff --git a/docs/actors.md b/docs/programs.md similarity index 100% rename from docs/actors.md rename to docs/programs.md diff --git a/docs/prosperon.gif b/docs/prosperon.gif deleted file mode 100644 index f585db7a8ac21921cf3659804c6ef6c7298134fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78175 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

qigVU2A} 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 diff --git a/docs/quickstart.md b/docs/quickstart.md deleted file mode 100644 index 87a862bf..00000000 --- a/docs/quickstart.md +++ /dev/null @@ -1,133 +0,0 @@ -# Quickstart - -This quickstart walks through running Cell programs, exploring examples, and creating your first module and program. It assumes the `./cell` executable is present at the repo root (already built or downloaded). - -## 1) Initialize a Project Shop (.cell) - -Create the project structure used for module management and bytecode cache: - -- `./cell init` - -This creates `.cell/` with `cell.toml`, `lock.toml`, `modules/`, `build/`, and `patches/`. - -## 2) Run Built‑in Examples - -Examples under `examples/` are programs (`*.ce`) you can run directly: - -- NAT portal server (introduction service): - - `./cell examples/nat` -- NAT client (contacts a portal): - - `./cell examples/nat_client` -- Non‑blocking HTTP download actor: - - `./cell examples/http_download_actor` - -Tip: Use these as references for portals, contacts, and non‑blocking I/O. - -## 3) Run the Accio Game - -Accio lives under `accio/`. The program is `accio/accio.ce` and supports modes via arguments: - -- Start menu: `./cell accio start` -- Load a level: `./cell accio level game/1.json` -- Analyze assets: `./cell accio analyze` -- Clean level data: `./cell accio clean` - -Arguments after the program path are available inside the program via `arg` (e.g., `arg[0] == 'start'`). - -## 4) Your First Module (.cm) and Program (.ce) - -Create a module that returns a frozen API object, and a program that uses it. - -- File: `examples/hello.cm` (module) - -```javascript -// Returns a value (frozen by the engine) -return { - greet: function(name) { - return `Hello, ${name}!` - } -} -``` - -- File: `examples/hello.ce` (program) - -```javascript -var hello = use('examples/hello') - -log.console(hello.greet('Cell')) - -$_.receiver(function(msg) { - if (msg.type == 'ping') { - send(msg, {type:'pong'}) - } -}) - -$_.delay(_ => $_.stop(), 0.1) -``` - -Run it: - -- `./cell examples/hello` - -Notes: -- Modules are `*.cm` and must return a value. The engine deep‑freezes return values, so mutate via new objects or closures rather than in‑place. -- Programs are `*.ce` and must not return a value. They run top‑to‑bottom when spawned and can register handlers via `$_.receiver()` and schedule work via `$_.delay()` or `$_.clock()`. - -## 5) Spawning Child Programs (Actors) - -Programs can spawn other programs and receive lifecycle events. - -- File: `examples/spawner.ce` - -```javascript -$_.receiver(function(e) { - if (e.type == 'greet' && e.actor) { - log.console('Child greeted me') - } -}) - -$_.start(function(info) { - if (info.type == 'greet') { - log.console('Spawned child actor') - } -}, 'examples/hello.ce') - -$_.delay(_ => $_.stop(), 0.5) -``` - -Run it: - -- `./cell examples/spawner` - -## 6) Module Shop Basics - -The module shop manages vendored dependencies under `.cell/modules/` and caches compiled bytecode under `.cell/build/`. - -Common commands (all are programs under `scripts/`): - -- Initialize (if you haven’t already): - - `./cell init` -- See available commands: - - `./cell help` -- Configure system/actor settings: - - `./cell config list` - - `./cell config set system.reply_timeout 60` - - `./cell config actor prosperon/_sdl_video set resolution 1280x720` -- Download or vendor dependencies (from `.cell/cell.toml`): - - `./cell mod download` - -## 7) How Module Resolution Works - -- `use('path')` checks: - 1) The current module’s directory for `path.cm` while loading. - 2) The mounted roots (the program’s directory is mounted) for `path.cm`. - 3) Embedded/native modules if no script file is found. -- Modules compile to `.cell/build/.o` and reuse the cache if newer than the source. -- Scripted modules can extend embedded modules via prototype; if the script returns nothing, the embedded module is used as‑is. - -## 8) Next Steps - -- Language details: `docs/cell.md` -- Actors, programs, and messaging: `docs/actors.md` -- Rendering, input, and resources: `docs/rendering.md`, `docs/input.md`, `docs/resources.md` -- Full API reference: `docs/api/` diff --git a/docs/rendering.md b/docs/rendering.md deleted file mode 100644 index eb4c6a09..00000000 --- a/docs/rendering.md +++ /dev/null @@ -1,36 +0,0 @@ -# Rendering, the camera & the world - -Prosperon is rendered via a single camera, defined on `prosperon.camera`. Examine the `camera` object in the API for detail about its properties. - -The camera has a width and a height, which defines the resolution of the rendered game. The camera also has a transform `prosperon.camera.transform`, which should be used to move it. The camera's position can also be set via `prosperon.camera.pos`. - -## Coordinate System -There are two important coordinate systems in Prosperon: world and hud. Both coordinate systems are measured in pixels, with X+ going to the right, and Y+ going up. - -**World space** is the game world, and is what the camera "sees". The center of the camera is the coordinate it is viewing; so, for example, if the camera is at position [100,100], the pixel at the center of the screen is whatever pixel is at world space [100,100]. - -**Hud space** can be thought of as the screen itself, or the lens of the camera. The bottom left of the viewing window is [0,0], and the top right is [camera.width, camera.height]. - -## The render module & queues -Internally, prosperon keeps a rendering queue as draw commands are issued throughout the frame. It keeps two: 'draw' and 'hud'. At the end of the frame, draw commands are sorted and issued to the GPU: first the 'draw' queue, and then the 'hud' queue, so that it overlays. - -The render module contains functionality for low level rendering. It includes commands like 'scissor' and 'viewport', it is more recommended to use the 'draw2d' module to do the majority of the drawing. - -## Draw2d -The easiest way to draw with prosperon is to use the 'draw2d' module. Prosperon defines two events via `prosperon.on`: `draw` and `hud`. During a frame, the `render` module sets its internal queue to `draw`, and then the `draw` event is issued. Then it does the same for `hud`. The 'draw2d' module is a high level way to issue drawing commands to the current queue. So, a simple example: - -``` -var draw = use('draw2d') -// main.js -var rect = {x:0,y:0,width:100,height:100} // a 100x100 square at [0,0] -this.draw = function() { - draw.rectangle(rect) // this will draw with the bottom left corner at the center of the screen -} - -this.hud = function() { - draw.rectangle(rect) // this draws a rectangle at the botomm left corner of the screen -} -``` - -## Imgui -Prosperon includes imgui. Another event is the `imgui` event, where you can issue imguie commands via the 'imgui' module. Examine the 'imgui' API for more info. diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index cb3d0016..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,17 +0,0 @@ -mkdocs==1.6.0 -mkdocs-material==9.5.28 -mkdocs-awesome-pages-plugin==2.10.1 -pymdown-extensions==10.7 -Markdown==3.5.2 -mergedeep==1.3.4 -bracex==2.5.post1 -PyYAML==6.0.1 -click==8.1.7 -colorama==0.4.6 -Jinja2==3.1.3 -natsort==8.4.0 -packaging==23.2 -Pygments==2.17.2 -requests==2.32.3 -ghp-import==2.1.0 -watchdog==4.0.0 diff --git a/docs/resources.md b/docs/resources.md deleted file mode 100644 index 29a63373..00000000 --- a/docs/resources.md +++ /dev/null @@ -1,17 +0,0 @@ -# Resources & Data - -Prosperon, being text based, encourages you to reference assets - images, sounds, etc - as strings. - -## Module Loading and Discovery - -Prosperon uses a set of **search paths** to locate modules. Each path in this list is consulted in order, and the first matching module file is loaded. -**prosperon.PATH** is an array which is a list of directories in which it looks for resources. Developers can add or remove entries from this list, controlling where the engine will search. Assets are searched from `prosperon.PATH[0]` first. - -**Extension Matching:** Assets should be referenced without a file extension. Based on the context of what asset is being searched for, a list of file extensions are iterated through to find the asset. When setting a sprite's texture, for example, first a 'png' may be searched for, then a 'gif', and so on. If a specific extension is requested, that specific extension - and only that one - will be searched for. it's very useful to not specify extensions at all, because that enables prosperon to optimize assets and replace them with backend specific ones, and the game will still work. - -Prosperon **caches** each loaded assets. When a sprite references a 'png', if another one does, it uses the same GPU texture. - -## Mounts -Prosperon uses the idea of file mounting for all io operations. To start with, the write directory is set to the folder prosperon is ran from. That same folder is also mounted as a read directory, as well as the executable itself, which contains a zip file of the engine's core assets. - -Folders or archives like zip records can be mounted, allowing for an easy way to overwrite specific files with new ones. Because prosperon deals with file systems and strings for its operations, this makes modding easy. For example, a mod `mod.zip` may have a file `sprites/bug.png`. Once mounted, when your game loads `bug` as a sprite, that would be grabbed instead of your game's natives `bug`. diff --git a/docs/style.css b/docs/style.css deleted file mode 100644 index 00bf5123..00000000 --- a/docs/style.css +++ /dev/null @@ -1,133 +0,0 @@ -[data-md-color-scheme="youtube"] { - --md-primary-fg-color: #3876AD; - --md-accent-fg-color: #94DBE8 -} - -a:link a:visited a:hover a:active { - color: green; -} - -#content { - margin-top: 50px; -} - -html { - scroll-padding-top:50px; -} - -h1 { - color: red -} - -#text-table-of-contents { - background-color: #ffffec; - border: solid; - border-width: 2px; - border-color: #61bcd7; - padding: 10px; -} - -.scholium { - background-color: #F5F5DE; - border: solid; - padding: 10px; - margin: 20px; - border-width: 2px; - border-color: #75FB4C; -} - -.scholium p { - margin: 0; -} - -.floathead { - position: fixed; - width: 100%; - top: 0; - left: 0; - z-index: 100; - display flex; - align-items: center; - justify-content: center; - background-color: #3876AD; -} - -.floathead a { - float: left; /* Float links side by side */ - line-height: 100%; - margin-left: 20px; - margin-top: auto; - margin-bottom: auto; - height: 3rem; - line-height: 3rem; - text-align: center; /* Center-align text */ - font-size: 24px; - color: #61bcd7; -} - -#content { - max-width: 800px; -} - -.floathead a:hover { - color: white; -} - -h1 { - color: #61BCD7; -} - -#org-div-home-and-up { - position: sticky; - top: 20px; -} - -code { - font-family: code; - color: #61bcd7; -} - -.example { - margin: 10px 20px; - padding: 20px; - font-family: code; - font-size: 16px; - line-height: 1em; - display: inline-block; -} - -.code { - padding: 2px 5px; - background-color: rgba(var(--bs-body-bg-rgb), 0.75); - border: solid 1px var(--bs-border-color); - color: var(--bs-body-color); - white-space: pre-wrap; - word-wrap: break-word; -} - -.title { - font-family: arial; -} - -@font-face { - font-family: "code"; - src: url(dos.ttf); -} - -.navbar { - background-color: #1678b2; -} - -.navbar-brand span { - margin-top: 10px; - margin-left: 10px; - margin-right: 10px; -} - -.terminal-prompt { - background-image: url(/prosperon_orb_horizontal.gif); - background-size: contain; - background-repeat: no-repeat; -} - -.wm-page-toc-tree li:first-of-type{display:none} diff --git a/docs/tutorial.md b/docs/tutorial.md deleted file mode 100644 index cc9a2d4b..00000000 --- a/docs/tutorial.md +++ /dev/null @@ -1,67 +0,0 @@ -# A Tutorial Introduction - -Let's make your first game. When prosperon is launched, it looks in the folder it's in for a ```config.js``` and ```main.js```. These are your first two examples of a module and a program. - -A module is a file that returns a single value. It could be any value: a number, a function, a string. Usually, it's an object. Values are **frozen** before returning, so they cannot be modified. A module is ran once and cached, so any program that accesses a module subsequently is simply getting the already cached object. Modules can import other modules. Circular references are not allowed. - -The ```config.js``` module must return a single object that describes your game. It sets up the window name, starting size, etc. Below is the default config, demonstrating all of the values that can be set on it. - -| Key | Default Value | Type | Description | -|--------------------|----------------------------------------------------------------|---------|-----------------------------------------------------------------------------------------------------------------------| -| **title** | `Prosperon [\${prosperon.version}-\${prosperon.revision}]` | string | Title of the game window, typically including version information. | -| **width** | `1280` | number | Initial width of the game window. | -| **height** | `720` | number | Initial height of the game window. | -| **icon** | `graphics.make_texture(io.slurp('icons/moon.gif'))` | object | Icon texture for the game window, loaded from the provided file. | -| **high_dpi** | `0` | number | Enables (1) or disables (0) High DPI support for the window. | -| **alpha** | `1` | number | Alpha channel setting for the window (0 to disable, 1 to enable transparency). | -| **fullscreen** | `0` | number | Sets whether the window should launch in fullscreen (1) or windowed (0). | -| **sample_count** | `1` | number | Multisampling count for rendering. Increasing this can improve image quality at the cost of performance. | -| **enable_clipboard** | `true` | boolean | Enables clipboard functionality within the application. | -| **enable_dragndrop** | `true` | boolean | Enables drag-and-drop functionality for files into the window. | -| **max_dropped_files** | `1` | number | Maximum number of files that can be dropped into the window at once. | -| **swap_interval** | `1` | number | Controls vertical synchronization (VSync). Commonly 1 for enabling or 0 for disabling VSync. | -| **name** | `"Prosperon"` | string | Human-readable name of the application. | -| **version** | `prosperon.version + "-" + prosperon.revision` | string | Version string for the application, dynamically built from Prosperon's version info. | -| **identifier** | `"world.pockle.prosperon"` | string | Package or bundle identifier for your game/application. | -| **creator** | `"Pockle World LLC"` | string | Name of the creator or organization behind the application. | -| **copyright** | `"Copyright Pockle World 2025"` | string | Copyright declaration for the application. | -| **type** | `"application"` | string | The general content type or category of this project. | -| **url** | `"https://github.com/johnbrethauer/prosperon"` | string | URL link associated with the project, such as a repository or official homepage. | - - -With the engine configured, prosperon starts ```main.js``` as the first **actor** of the game. Actors are created from files that **do not** return a value. An actor executes the statements in its script. Initialization should happen here. An actor can pull in other chunks of code by importing modules. Modules are imported with the ```use``` statement. ```use``` returns the value the module returned, and it can be assigned to any variable. To use the internal ```io``` module, for example, you might say ```var io = use('cellfs')```. - -Actors exist until they are explicitly killed, by invoking their ```kill``` function. Because the actor created from ```main.js``` is the root actor for the entire game, when it is killed, the program exits. In an actor script file, ```this``` is set to the actor being spawned from the script. - -## Our first program -With that out of the way, we can establish our first simple program. - -In the folder with your ```prosperon``` executable, create a ```config.js``` and set it to be the following: - -``` -return { - title: "Hello World", - width: 500, - height:500 -} -``` - -This will cause prosperon to launch a 500x500 window with the title 'Hello World'. In your ```main.js```, write the following: - -``` -log.console("Hello world") - -this.delay(_ => { - this.kill(); -}, 3) -``` - -**delay** is a function on all actors in prosperon. It executes a given function after a number of seconds. In this case, after 3 seconds, the root actor kills itself, closing the window. - -## The prosperon global -The global object called `prosperon` has a variety of engine specific settings on it that can be set to influence how the engine behaves. For example, `prosperon.argv` contains a list of the command line arguments given to prosperon; `prosperon.PATH` is an array of paths to resolve resources such as modules and images. `prosperon` is fully documented in the API section. - -## Getting help -The `prosperon` global has a 'doc' function, which can be invoked on any engine object to see a description of it and its members. For example, to learn about `prosperon`, try printing out `cell.DOC(prosperon)` in your `main.js`. - -Writing documentation for your own modules and game components will be explored in the chapter on actors & modules. \ No newline at end of file