The heart of Tiled support: load a map and draw it.
- rt_tmap model (Tmap/TmLayer/TmTileset in tiled.ludic): map header + ordered
layers (dense int32 GID arrays, heap-allocated to w*h, lifting the 96x64 cap)
+ tilesets. Built from the intermediate Value tree, so the TMX and TMJ paths
both feed it.
- GID resolver (Tiled.resolve): gid -> (tileset, localId, flipH/V/D); the three
flip flags masked off before the local-id lookup, returned alongside. gid==0
is empty.
- Image-backed render (Tiled.draw): every visible tile layer in file order,
blitting each tile from its tileset image with flips applied at draw.
- Compatibility projection (Tiled.project / auto on load): a designated
collision layer projects to the legacy byte tilemap ('#' solid, '=' one-way
via the oneway property, ' ' empty) so Grid.*/Path.*/esys_move are unchanged.
- Tiled.load resolves external tilesets + images relative to the map file and
auto-projects a collision/solids/walls layer.
- The grid and physics_tiles demos now run off a loaded map (grid_maze.tmx /
physics_map.tmx) instead of hand-authored Map.row strings, byte-identically.
Two compiler fixes fell out of this (see the changeset):
- emit_index_addr set g_addr_ty before evaluating the index, so slice[obj.field]
came back mis-typed; set it last, like the raw-pointer branches.
- @strcmp was declared by both the world table and the fs prelude; centralise
it in the head prelude so a game that uses Fs/Path links.
Proven by library/tiled_p1.ludic (14 assertions: loads+renders Kenney map
identically from .tmx and .tmj, flip mirroring) + the converted grid/
physics_tiles demos. x test: 92 passed; self-host bootstrap fixpoint intact.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
700 lines
12 KiB
JSON
700 lines
12 KiB
JSON
{
|
|
"annotations": [
|
|
"annot-queries",
|
|
"annot-computed",
|
|
"annot-onstart",
|
|
"annot-onquit",
|
|
"annot-onspawn",
|
|
"annot-ondespawn",
|
|
"annot-onattach",
|
|
"annot-ondetach",
|
|
"annot-onenable",
|
|
"annot-ondisable",
|
|
"annot-on",
|
|
"annot-public",
|
|
"annot-handles",
|
|
"annot-export",
|
|
"annot-reads",
|
|
"annot-writes",
|
|
"annot-sync",
|
|
"annot-owned",
|
|
"annot-server",
|
|
"annot-predicted",
|
|
"annot-toserver",
|
|
"annot-toclients",
|
|
"annot-system",
|
|
"annot-enginesystem",
|
|
"annot-namespace"
|
|
],
|
|
"builtins": [
|
|
"fn-print",
|
|
"fn-string",
|
|
"fn-quit",
|
|
"fn-save",
|
|
"fn-load",
|
|
"fn-len",
|
|
"fn-push",
|
|
"fn-min",
|
|
"fn-max",
|
|
"fn-abs",
|
|
"fn-clamp",
|
|
"fn-fixed",
|
|
"fn-floor",
|
|
"fn-bytes",
|
|
"fn-words",
|
|
"fn-ui_build",
|
|
"fn-arg_count",
|
|
"fn-arg",
|
|
"fn-exit",
|
|
"fn-run",
|
|
"fn-getenv",
|
|
"fn-read_char",
|
|
"fn-file_write",
|
|
"fn-file_stdout",
|
|
"fn-file_stderr",
|
|
"fn-ok",
|
|
"fn-err",
|
|
"fn-is_ok",
|
|
"fn-is_err",
|
|
"fn-some",
|
|
"fn-none",
|
|
"fn-is_some",
|
|
"fn-is_none",
|
|
"fn-unwrap_or"
|
|
],
|
|
"collision": [
|
|
"collision-rects",
|
|
"collision-point_rect",
|
|
"collision-circles",
|
|
"collision-rect_circle"
|
|
],
|
|
"color": [
|
|
"color-rgb",
|
|
"color-rgba",
|
|
"color-lerp",
|
|
"color-darken",
|
|
"color-lighten",
|
|
"color-with_alpha"
|
|
],
|
|
"control": [
|
|
"kw-if",
|
|
"kw-while",
|
|
"kw-for",
|
|
"kw-in",
|
|
"kw-match",
|
|
"kw-machine",
|
|
"kw-state",
|
|
"kw-become",
|
|
"kw-try"
|
|
],
|
|
"ease": [
|
|
"ease-in",
|
|
"ease-out",
|
|
"ease-in_out",
|
|
"ease-back",
|
|
"ease-bounce"
|
|
],
|
|
"ecs": [
|
|
"kw-spawn",
|
|
"kw-despawn",
|
|
"kw-query",
|
|
"kw-self",
|
|
"kw-enable",
|
|
"kw-disable",
|
|
"kw-attach",
|
|
"kw-detach",
|
|
"fn-world_get",
|
|
"fn-world_set",
|
|
"fn-world_has",
|
|
"fn-world_count",
|
|
"fn-world_spawn",
|
|
"fn-world_size",
|
|
"fn-world_save",
|
|
"fn-world_load",
|
|
"fn-world_field_id",
|
|
"fn-world_prop_id",
|
|
"fn-world_model_id",
|
|
"fn-world_kind",
|
|
"fn-world_register_prop",
|
|
"fn-world_attach_dyn",
|
|
"fn-world_detach_dyn",
|
|
"fn-world_query_next"
|
|
],
|
|
"events": [
|
|
"kw-event",
|
|
"kw-emit",
|
|
"kw-cancel",
|
|
"kw-cancellable"
|
|
],
|
|
"input": [
|
|
"input-key"
|
|
],
|
|
"list": [
|
|
"list-len",
|
|
"list-push",
|
|
"list-clear",
|
|
"list-first",
|
|
"list-last",
|
|
"list-pop",
|
|
"list-swap",
|
|
"list-contains",
|
|
"list-index_of",
|
|
"list-reverse",
|
|
"list-insert",
|
|
"list-remove_at",
|
|
"list-remove",
|
|
"list-sort"
|
|
],
|
|
"map": [
|
|
"map-size",
|
|
"map-row",
|
|
"map-tile"
|
|
],
|
|
"math": [
|
|
"math-min",
|
|
"math-max",
|
|
"math-abs",
|
|
"math-clamp",
|
|
"math-sign",
|
|
"math-floor",
|
|
"math-ceil",
|
|
"math-round",
|
|
"math-lerp",
|
|
"math-inverse_lerp",
|
|
"math-remap",
|
|
"math-sqrt",
|
|
"math-sin",
|
|
"math-cos",
|
|
"math-tan",
|
|
"math-hypot",
|
|
"math-dist",
|
|
"math-dist2",
|
|
"math-deg_to_rad",
|
|
"math-rad_to_deg",
|
|
"math-posmod",
|
|
"math-wrap",
|
|
"math-ping_pong",
|
|
"math-snapped",
|
|
"math-move_toward",
|
|
"math-smoothstep",
|
|
"math-atan2",
|
|
"math-asin",
|
|
"math-acos"
|
|
],
|
|
"memory": [
|
|
"memory-bytes",
|
|
"memory-words",
|
|
"memory-copy",
|
|
"memory-fill",
|
|
"memory-peek",
|
|
"memory-poke"
|
|
],
|
|
"network": [
|
|
"network-send",
|
|
"network-poll",
|
|
"network-serialize",
|
|
"network-apply",
|
|
"network-owner",
|
|
"network-set_owner",
|
|
"network-is_server",
|
|
"network-is_owner",
|
|
"network-local_id"
|
|
],
|
|
"operators": [
|
|
"op-arith",
|
|
"op-compare",
|
|
"op-logical",
|
|
"op-bitwise",
|
|
"op-range",
|
|
"op-assign",
|
|
"op-access",
|
|
"op-interp",
|
|
"op-literals",
|
|
"op-comment"
|
|
],
|
|
"phases": [
|
|
"phase-fixedupdate",
|
|
"phase-input",
|
|
"phase-lateupdate",
|
|
"phase-render",
|
|
"phase-start",
|
|
"phase-update"
|
|
],
|
|
"random": [
|
|
"random-range",
|
|
"random-chance",
|
|
"random-seed",
|
|
"random-value",
|
|
"random-int",
|
|
"random-sign"
|
|
],
|
|
"save": [
|
|
"save-write",
|
|
"save-read"
|
|
],
|
|
"scenes": [
|
|
"kw-scene",
|
|
"kw-layer",
|
|
"kw-on",
|
|
"kw-enter",
|
|
"kw-exit",
|
|
"kw-start"
|
|
],
|
|
"screen": [
|
|
"screen-clear",
|
|
"screen-fill_rectangle",
|
|
"screen-draw_rectangle",
|
|
"screen-put_pixel",
|
|
"screen-draw_text",
|
|
"screen-draw_number",
|
|
"screen-show",
|
|
"screen-width",
|
|
"screen-height",
|
|
"screen-status",
|
|
"screen-line",
|
|
"screen-circle",
|
|
"screen-fill_circle",
|
|
"screen-triangle",
|
|
"screen-fill_triangle",
|
|
"screen-sprite",
|
|
"screen-sprite_scaled"
|
|
],
|
|
"structure": [
|
|
"kw-program",
|
|
"kw-property",
|
|
"kw-model",
|
|
"kw-handler",
|
|
"kw-phase",
|
|
"kw-const",
|
|
"kw-var",
|
|
"kw-let",
|
|
"kw-function",
|
|
"kw-return",
|
|
"kw-import",
|
|
"kw-extern",
|
|
"kw-ui",
|
|
"kw-enum"
|
|
],
|
|
"system": [
|
|
"system-run",
|
|
"system-read_char",
|
|
"system-file_open",
|
|
"system-file_read",
|
|
"system-file_write",
|
|
"system-file_seek",
|
|
"system-file_tell",
|
|
"system-file_close"
|
|
],
|
|
"text": [
|
|
"text-length",
|
|
"text-char_at",
|
|
"text-slice",
|
|
"text-starts_with",
|
|
"text-ends_with",
|
|
"text-contains",
|
|
"text-index_of",
|
|
"text-equals",
|
|
"text-concat",
|
|
"text-to_int",
|
|
"text-from_int",
|
|
"text-upper",
|
|
"text-lower",
|
|
"text-trim",
|
|
"text-repeat",
|
|
"text-pad_left",
|
|
"text-pad_right",
|
|
"text-split",
|
|
"text-join",
|
|
"text-replace"
|
|
],
|
|
"time": [
|
|
"time-frame",
|
|
"time-delta",
|
|
"time-elapsed",
|
|
"time-now",
|
|
"time-since"
|
|
],
|
|
"types": [
|
|
"type-bool",
|
|
"type-byte",
|
|
"type-entity",
|
|
"type-fixed",
|
|
"type-fixeds",
|
|
"type-int",
|
|
"type-pointer",
|
|
"type-pointers",
|
|
"type-slices",
|
|
"type-string",
|
|
"type-void",
|
|
"type-words",
|
|
"type-vector",
|
|
"type-ivec2",
|
|
"type-rect"
|
|
],
|
|
"world": [
|
|
"world-get",
|
|
"world-set",
|
|
"world-has",
|
|
"world-count",
|
|
"world-size",
|
|
"world-spawn",
|
|
"world-save",
|
|
"world-load",
|
|
"world-prop_id",
|
|
"world-field_id",
|
|
"world-model_id",
|
|
"world-kind",
|
|
"world-register_prop",
|
|
"world-attach",
|
|
"world-detach",
|
|
"world-query_next"
|
|
],
|
|
"vector": [
|
|
"vector-make",
|
|
"vector-zero",
|
|
"vector-x",
|
|
"vector-y",
|
|
"vector-add",
|
|
"vector-sub",
|
|
"vector-scale",
|
|
"vector-dot",
|
|
"vector-length",
|
|
"vector-distance",
|
|
"vector-normalize",
|
|
"vector-lerp",
|
|
"vector-rotate",
|
|
"vector-angle",
|
|
"vector-from_angle"
|
|
],
|
|
"ivec2": [
|
|
"ivec2-make",
|
|
"ivec2-zero",
|
|
"ivec2-x",
|
|
"ivec2-y",
|
|
"ivec2-add",
|
|
"ivec2-sub",
|
|
"ivec2-scale",
|
|
"ivec2-dot",
|
|
"ivec2-equal",
|
|
"ivec2-manhattan",
|
|
"ivec2-to_vector"
|
|
],
|
|
"rect": [
|
|
"rect-make",
|
|
"rect-x",
|
|
"rect-y",
|
|
"rect-w",
|
|
"rect-h",
|
|
"rect-right",
|
|
"rect-bottom",
|
|
"rect-center",
|
|
"rect-contains",
|
|
"rect-intersects"
|
|
],
|
|
"bigint": [
|
|
"bigint-from",
|
|
"bigint-parse",
|
|
"bigint-add",
|
|
"bigint-sub",
|
|
"bigint-mul",
|
|
"bigint-neg",
|
|
"bigint-pow",
|
|
"bigint-div",
|
|
"bigint-mod",
|
|
"bigint-cmp",
|
|
"bigint-eq",
|
|
"bigint-is_zero",
|
|
"bigint-to_int",
|
|
"bigint-str"
|
|
],
|
|
"decimal": [
|
|
"decimal-from",
|
|
"decimal-parse",
|
|
"decimal-add",
|
|
"decimal-sub",
|
|
"decimal-mul",
|
|
"decimal-neg",
|
|
"decimal-cmp",
|
|
"decimal-eq",
|
|
"decimal-scale",
|
|
"decimal-rescale",
|
|
"decimal-str"
|
|
],
|
|
"dict": [
|
|
"dict-new",
|
|
"dict-set",
|
|
"dict-get",
|
|
"dict-get_or",
|
|
"dict-has",
|
|
"dict-remove",
|
|
"dict-size",
|
|
"dict-clear",
|
|
"dict-keys"
|
|
],
|
|
"set": [
|
|
"set-new",
|
|
"set-add",
|
|
"set-has",
|
|
"set-remove",
|
|
"set-size",
|
|
"set-clear",
|
|
"set-members"
|
|
],
|
|
"job": [
|
|
"job-defer",
|
|
"job-run",
|
|
"job-fulfill",
|
|
"job-fail",
|
|
"job-cancel",
|
|
"job-pump",
|
|
"job-done",
|
|
"job-ok",
|
|
"job-failed",
|
|
"job-cancelled",
|
|
"job-result",
|
|
"job-error",
|
|
"job-pending",
|
|
"job-free"
|
|
],
|
|
"promise": [
|
|
"promise-all",
|
|
"promise-race",
|
|
"promise-count_done",
|
|
"promise-all_done"
|
|
],
|
|
"sync": [
|
|
"sync-mutex",
|
|
"sync-lock",
|
|
"sync-unlock",
|
|
"sync-try_lock",
|
|
"sync-atomic",
|
|
"sync-get",
|
|
"sync-set",
|
|
"sync-add",
|
|
"sync-cas",
|
|
"sync-channel",
|
|
"sync-send",
|
|
"sync-recv",
|
|
"sync-can_recv",
|
|
"sync-len",
|
|
"sync-cpu_count"
|
|
],
|
|
"huge": [
|
|
"huge-from",
|
|
"huge-add",
|
|
"huge-sub",
|
|
"huge-mul",
|
|
"huge-neg",
|
|
"huge-cmp",
|
|
"huge-sign",
|
|
"huge-mantissa",
|
|
"huge-exp",
|
|
"huge-str"
|
|
],
|
|
"angle": [
|
|
"angle-from_degrees",
|
|
"angle-to_degrees",
|
|
"angle-wrap",
|
|
"angle-sin",
|
|
"angle-cos",
|
|
"angle-add",
|
|
"angle-diff",
|
|
"angle-lerp"
|
|
],
|
|
"percent": [
|
|
"percent-clamp",
|
|
"percent-of",
|
|
"percent-lerp",
|
|
"percent-apply"
|
|
],
|
|
"duration": [
|
|
"duration-seconds",
|
|
"duration-minutes",
|
|
"duration-hours",
|
|
"duration-days",
|
|
"duration-as_seconds",
|
|
"duration-as_minutes",
|
|
"duration-as_hours",
|
|
"duration-as_days"
|
|
],
|
|
"date": [
|
|
"date-new",
|
|
"date-year",
|
|
"date-month",
|
|
"date-day",
|
|
"date-weekday",
|
|
"date-is_leap",
|
|
"date-days_in_month",
|
|
"date-to_epoch",
|
|
"date-add_days",
|
|
"date-diff_days"
|
|
],
|
|
"datetime": [
|
|
"datetime-from",
|
|
"datetime-date",
|
|
"datetime-add",
|
|
"datetime-year",
|
|
"datetime-month",
|
|
"datetime-day",
|
|
"datetime-weekday",
|
|
"datetime-hour",
|
|
"datetime-minute",
|
|
"datetime-second",
|
|
"datetime-format",
|
|
"datetime-parse"
|
|
],
|
|
"clock": [
|
|
"clock-now",
|
|
"clock-set",
|
|
"clock-advance",
|
|
"clock-reset"
|
|
],
|
|
"crypto": [
|
|
"crypto-sha256",
|
|
"crypto-hmac_sha256",
|
|
"crypto-verify_hmac",
|
|
"crypto-hex",
|
|
"crypto-ct_equal",
|
|
"crypto-random_bytes",
|
|
"crypto-random_hex",
|
|
"crypto-random_u32",
|
|
"crypto-base64"
|
|
],
|
|
"uuid": [
|
|
"uuid-new",
|
|
"uuid-v4",
|
|
"uuid-new_v7",
|
|
"uuid-v7",
|
|
"uuid-parse",
|
|
"uuid-is_valid",
|
|
"uuid-to_text",
|
|
"uuid-equals",
|
|
"uuid-nil"
|
|
],
|
|
"noise": [
|
|
"noise-value2",
|
|
"noise-perlin2",
|
|
"noise-simplex2",
|
|
"noise-fbm2",
|
|
"noise-cellular2",
|
|
"noise-cellular2_id",
|
|
"noise-unit"
|
|
],
|
|
"log": [
|
|
"log-trace",
|
|
"log-debug",
|
|
"log-info",
|
|
"log-warn",
|
|
"log-error",
|
|
"log-set_level",
|
|
"log-level"
|
|
],
|
|
"os": [
|
|
"os-args",
|
|
"os-arg_count",
|
|
"os-arg",
|
|
"os-env",
|
|
"os-env_or",
|
|
"os-has_env",
|
|
"os-set_env",
|
|
"os-unset_env",
|
|
"os-exit",
|
|
"os-platform",
|
|
"os-arch",
|
|
"os-stdout_write",
|
|
"os-stderr_write",
|
|
"os-save_dir",
|
|
"os-config_dir",
|
|
"os-cache_dir",
|
|
"os-temp_dir"
|
|
],
|
|
"unicode": [
|
|
"unicode-len",
|
|
"unicode-byte_len",
|
|
"unicode-is_valid_utf8",
|
|
"unicode-char_at",
|
|
"unicode-chars",
|
|
"unicode-upper",
|
|
"unicode-lower",
|
|
"unicode-truncate",
|
|
"unicode-grapheme_len"
|
|
],
|
|
"path": [
|
|
"path-join",
|
|
"path-dir",
|
|
"path-base",
|
|
"path-ext",
|
|
"path-stem",
|
|
"path-normalize"
|
|
],
|
|
"fs": [
|
|
"fs-exists",
|
|
"fs-is_dir",
|
|
"fs-read_text",
|
|
"fs-write_text",
|
|
"fs-append_text",
|
|
"fs-remove",
|
|
"fs-size",
|
|
"fs-mkdir",
|
|
"fs-copy",
|
|
"fs-list"
|
|
],
|
|
"mime": [
|
|
"mime-of",
|
|
"mime-sniff"
|
|
],
|
|
"regex": [
|
|
"regex-compile",
|
|
"regex-valid",
|
|
"regex-matches",
|
|
"regex-test",
|
|
"regex-find",
|
|
"regex-exec",
|
|
"regex-next",
|
|
"regex-replace",
|
|
"regex-group",
|
|
"regex-group_count",
|
|
"regex-start",
|
|
"regex-end",
|
|
"regex-ok"
|
|
],
|
|
"grid": [
|
|
"grid-line",
|
|
"grid-blocked",
|
|
"grid-line_of_sight",
|
|
"grid-flood",
|
|
"grid-a_star"
|
|
],
|
|
"xml": [
|
|
"xml-parse",
|
|
"xml-tag",
|
|
"xml-text",
|
|
"xml-attr",
|
|
"xml-attr_int",
|
|
"xml-has",
|
|
"xml-attr_count",
|
|
"xml-child_count",
|
|
"xml-child",
|
|
"xml-find",
|
|
"xml-count"
|
|
],
|
|
"base64": [
|
|
"base64-decode",
|
|
"base64-encode"
|
|
],
|
|
"tiled": [
|
|
"tiled-read",
|
|
"tiled-read_tsx",
|
|
"tiled-load",
|
|
"tiled-gid",
|
|
"tiled-resolve",
|
|
"tiled-width",
|
|
"tiled-height",
|
|
"tiled-layer_count",
|
|
"tiled-layer_name",
|
|
"tiled-draw",
|
|
"tiled-project",
|
|
"tiled-tree",
|
|
"tiled-tile_prop"
|
|
]
|
|
}
|