admin and Claude Opus 5
010b6a7f6c
A state can transition to itself: make transition and a second click on the same state connects a self transition, taking it fires On state exited and then On state entered every time, for local and global machines, while Set state into the current state stays silent as before; only states may connect to themselves, every other node is still refused, one self transition per state; the loop is drawn over the middle of the top edge with its arrow pointing down and its name at the apex, the preview already shows it while armed, and the inspector lists it once under Transitions out; new test hook transitionLabelAt, e2e 26e5 ( #163 )
...
game-maker / gate (push) Successful in 1m56s
game-maker / suite (push) Successful in 6m45s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 16:10:02 +02:00
admin and Claude Opus 5
cc285af10a
Tabs are open documents: Scene, Game and Plugins stay as fixed tabs, every other asset opens in its own tab (double click or Enter in the asset panel, on creation, from the list button), several assets of one kind can be open at once, a tab is labelled with its kind dimmed before the name, cut at 160 px and renamed with its asset, closes with its x or a middle click and goes away when its asset is deleted; a tab always shows its own document instead of following the selection, the picker in the tab head is gone, zoom and scroll are kept per document for the session and dropped on close, a double click on a call node stays in the same tab with breadcrumbs per tab; one editor per kind is switched between documents, the placement rules live in the pure module documents.ts, and the test hook showTab stays as a compatibility path; new e2e module 44 documents ( #171 )
...
game-maker / gate (push) Successful in 1m59s
game-maker / suite (push) Successful in 6m53s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 15:49:54 +02:00
admin and Claude Opus 5
4f546c0e08
Number fields drop trailing zeros: formatNumber still rounds to at most 3 decimals and then removes zeros at the end, so 100.000 reads 100 and 0.500 reads 0.5, everywhere (inspector, graph and shader nodes, duration and fps in the animation and tile tabs); a field's own decimals is now an upper limit, stored values are unchanged, -0 still shows as 0, and the graph's separate integer rule is gone ( #172 )
...
game-maker / gate (push) Successful in 1m55s
game-maker / suite (push) Successful in 6m50s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 14:29:00 +02:00
admin and Claude Opus 5
47eea2f6e4
Each tilemap layer has its own Z: an offset added to the Z of the placed tilemap, like a child's Z to its parent, default 0 keeps the previous order (layers right after their map, in list order), a negative Z sorts a layer below the map, on a tie layers keep their list order and follow the hierarchy against other objects; editor scene and game use the same order through the new pure function drawSlots, a tilemap draws into one container per layer, and the tilemap panel gains a Z field for the selected layer with one undo step per change ( #174 )
...
game-maker / gate (push) Successful in 1m58s
game-maker / suite (push) Successful in 6m50s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 14:03:20 +02:00
admin and Claude Opus 5
5385d9e152
The one-way tolerance angle is a field: a one-way collider and a one-way tile gain One-way angle (0 to 90 degrees, default 45), a contact blocks when its normal is within that angle of the blocking side, without a value the limit is bit-identical to before, and the rule holds for Move, Raycast and dynamic bodies in Rapier; tiles with different angles never merge into one rectangle, the scene view draws the angle as a cone in the middle of the thick side, and the inspector shows Blocks from and One-way angle only while One-way is on, through the new schema option shownWith ( #159 )
...
game-maker / gate (push) Successful in 1m55s
game-maker / suite (push) Successful in 6m50s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 13:13:29 +02:00
admin and Claude Opus 5
d4ea04d4d6
The scene view outlines a tilemap's collision only along its outer edges: where two pieces meet, their shared stretch runs once in each direction and is not drawn, so an autotile lake is one outline without cross strokes at the quarters, merged rectangles of plain tiles and one-way tiles follow the same rule, the bridges from splitting concave outlines disappear and a piece doubled on two layers is outlined once; fill and collision stay as they were, and the result is cached per tilemap and rebuilt only when its collision data changes ( #173 )
...
game-maker / gate (push) Successful in 1m56s
game-maker / suite (push) Successful in 6m54s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 12:54:53 +02:00
admin and Claude Opus 5
6a31f5e0ad
One-way platforms, raycast and collision stay with contact data: a collider can be one-way with a side it blocks from (turning with its object, drawn thick in the scene view) and a tile can be one-way from above, one-way cells never merge with solid tiles, a contact blocks only when its normal is within 45 degrees of the blocking side, the new node Ignore one-way lets an object drop through for a while, and it all holds for Move and for dynamic bodies in Rapier, where the decision is made before each step because the hook may not touch the engine ( #155 ); the new Raycast node answers hit, object, collider, point, normal and distance in our own f64 geometry, the same in editor run and play, and the editor run draws each ray for 0.25 s ( #153 ); On collision stay gains an interval with its own clock per pair, and stay and enter gain the contact point next to normal and impulse ( #149 ); fixes that every Rapier collider of a tilemap had the shape of its last cell
...
game-maker / gate (push) Successful in 1m55s
game-maker / suite (push) Successful in 6m50s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 11:36:11 +02:00
admin and Claude Opus 5
947a6b1977
Collision outlines for autotiles: a frame holds several outlines (click adds a corner to the active one, Ctrl/Cmd-click starts a new one, clicking another outline makes it active, Delete removes the active outline and never the frame in collision mode), an autotile's outlines are drawn over the whole block, cut at the quarters and each cell takes the pieces of exactly the quarters its image is made of, so edges, outer corners and notches follow automatically; a tile of the block with nothing drawn blocks fully, cells of only full quarters merge back into rectangles, collision scale does not apply to an outlined autotile, and the previous format with one flat outline still loads ( #141 )
...
game-maker / gate (push) Successful in 1m53s
game-maker / suite (push) Successful in 6m41s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-19 01:56:20 +02:00
admin and Claude Opus 5
32057a96fc
Physics stage 2: colliders gain the shapes capsule and polygon, a polygon keeps its corners in the property points, turns, scales and mirrors with its object and is edited in the scene view (drag a corner, click an edge to insert one, double-click to delete, at least three stay, each step one undo step), a concave polygon is split into convex parts, a self-intersecting one is drawn red and collides with nothing, Rapier gets a capsule and one convex collider per part on the same body, and Move and the editor run use our own f64 geometry for the new shapes, where on a tie between two normals the one that blocks the move least wins, so a box no longer stops at the foot of a slope ( #151 ); first version of a collision outline per texture frame, edited in the texture tab with the new Collision toggle, which a plain tile blocks with instead of its rectangle ( #141 , to be reworked)
...
game-maker / gate (push) Successful in 1m52s
game-maker / suite (push) Successful in 6m41s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 22:56:25 +02:00
admin and Claude Opus 5
1b5e386b60
Move with collision reacts along the contact normal: it travels to the surface, stays flush and slides the rest of the move along it with Coulomb friction (the mean of both colliders, a tile counts as 0.5), a circle now rolls over an edge instead of catching on it, pushed dynamic bodies move off along the normal, Move gains the outputs hit, normal x and normal y, an object without its own collider moves freely, and editor run and play share the same path through Solids; contact point and normal come from our own f64 geometry (contactBetween), because Rapier's castShape lands 3e-6 px inside the wall in f32 ( #150 )
...
game-maker / gate (push) Successful in 1m48s
game-maker / suite (push) Successful in 6m23s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 21:52:11 +02:00
admin and Claude Opus 5
328f978d3c
Set gravity survives a re-read of the model during play: World.setSceneProp remembers what the run itself set on the scene and syncFromModel lays it back over the copied scene props, so a project event mid-play no longer resets the gravity to the saved 980; the unit test re-reads the model mid-run and e2e 41c forces a project event right after play starts ( #147 )
...
game-maker / gate (push) Successful in 1m46s
game-maker / suite (push) Failing after 5m35s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 20:08:09 +02:00
admin and Claude Opus 5
0ff3c8b742
Physics stage 1b: six new nodes act on dynamic bodies in play (Apply force over the frame, independent of the frame rate, Apply impulse, Set velocity, Set angular velocity, Get velocity, Set gravity for the rest of the run), a node on an object without a dynamic body and moving a dynamic body directly each log a hint once per object, and Move with collision now pushes dynamic bodies with a mass-dependent push while the mover stays flush; Move keeps its own move-and-slide instead of Rapier's character controller, which measurably snags on seams between colliders ( #147 )
...
game-maker / gate (push) Successful in 1m46s
game-maker / suite (push) Failing after 5m35s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 19:19:21 +02:00
admin and Claude Opus 5
78899b1ace
Physics stage 1a runs on Rapier: a new Rigidbody child object (body type, mass, gravity scale, damping, fixed rotation, CCD) makes its parent fall, bounce and come to rest in play, colliders gain friction, bounciness and density, the scene gains gravity (0, 980), the new PhysicsSystem steps at a fixed 60 Hz with interpolation in world coordinates and treats a tilemap as static ground, On collision enter gains normal and impulse, play waits for Rapier and does not start without it, and the editor run keeps the old CollisionSystem; the existing collision tests run against both systems unchanged ( #146 )
...
game-maker / gate (push) Successful in 1m46s
game-maker / suite (push) Successful in 6m17s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 18:11:43 +02:00
admin and Claude Opus 5
d02bcca266
Rapier 2D (@dimforge/rapier2d-compat 0.20) comes in as the physics engine: the editor loads it once in the background right after opening a project from its own chunk, so the main bundle grows by 0.19 KB gzip and the first frame does not wait; loadPhysics, physicsStatus and the 100 px = 1 m conversion live in src/runtime/physics/engine.ts, __gm.physics() reports the state, unit tests pin free fall and a box resting on a box, and e2e module 41 pins that Rapier is ready from its own chunk without console noise ( #145 )
...
game-maker / gate (push) Successful in 1m46s
game-maker / suite (push) Successful in 6m12s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 16:56:47 +02:00
admin and Claude Opus 5
6d7d0005cf
The tab headers are one TabHeader, the node board and the tile board pan and zoom through one helper, reordering tile pictures and tilemap layers goes through one moveItem, and a tilemap cell is one named type ( #85 )
...
game-maker / gate (push) Successful in 1m42s
game-maker / suite (push) Successful in 6m9s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 16:01:12 +02:00
admin and Claude Opus 5
c91c18f495
The loader keeps no migrations any more: an asset of the old type autotile (before #131 ) is an unknown type and dropped, and a tilemap layer with the cell map of the first version (before #134 ) loads empty; every project is saved in the current format, and the two tests now pin that the old shapes are not read ( #137 )
...
game-maker / gate (push) Successful in 1m49s
game-maker / suite (push) Successful in 6m19s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 15:12:07 +02:00
admin and Claude Opus 5
bffa508ee7
A tile gains Collision scale: below 1 each blocking cell pulls in on the sides without a blocking neighbour and stays flush towards its neighbours, so a wall of bushes becomes a narrower wall without gaps and the inner corner of an L closes cleanly; above 1 the cell grows at its open sides; on several layers the largest value counts, and the merged rectangles work in fractions of a cell with exactly the old result at 1 ( #140 )
...
game-maker / gate (push) Successful in 1m43s
game-maker / suite (push) Successful in 6m27s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 15:00:07 +02:00
admin and Claude Opus 5
4728f4fab5
A placed tilemap grows and shrinks at every edge: the new GRID EDGES block in the inspector adds or removes one column or row at Left, Top, Right or Bottom as one undo step, shifting the cells of all layers and moving the placement through its own matrix so the content stays in place on screen; removed painted cells are kept outside the grid and return when the edge grows again, and the Columns and Rows fields of a placement keep the content in place too ( #136 )
...
game-maker / gate (push) Successful in 1m43s
game-maker / suite (push) Successful in 6m8s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 13:58:03 +02:00
admin and Claude Opus 5
0b32d3cbf3
The tilemap panel gains Fill and Pick: Fill floods the connected cells of the active layer that carry the same tile (edge neighbours only, bounded by the grid) as one undo step, Pick takes the tile of the clicked cell on the active layer, and holding Alt picks while any tool is active ( #133 )
...
game-maker / gate (push) Successful in 1m41s
game-maker / suite (push) Successful in 6m7s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 12:31:19 +02:00
admin and Claude Opus 5
c2fd536aaf
The texture field only offers pictures: each texture with its frames, no animations any more; an animation id left in an older project shows as a missing reference ( #143 )
...
game-maker / gate (push) Successful in 1m40s
game-maker / suite (push) Successful in 6m8s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 12:14:01 +02:00
admin and Claude Opus 5
5046ddb810
The tilemap painting tools move out of the inspector into their own panel beside the scene view, shown only while exactly one placed tilemap is selected in the scene tab; the free viewports keep their content in place on screen when they are resized ( #142 )
...
game-maker / gate (push) Canceled after 0s
game-maker / suite (push) Canceled after 0s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 11:46:23 +02:00
admin and Claude Opus 5
f53279d065
The active tilemap layer can be renamed from the painting section, and a Show setting fades or hides the other layers in the scene view while the tilemap is selected ( #138 )
...
game-maker / gate (push) Successful in 1m40s
game-maker / suite (push) Successful in 6m4s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 10:56:32 +02:00
admin and Claude Opus 5
bfbcbe604c
The tile list in the tilemap section is a palette of pictures: each tile shows its lone tile (the four convex corners for floor and wall, the picture itself for none) with its name below, laid out with the image-picker grid ( #139 )
...
game-maker / gate (push) Successful in 1m41s
game-maker / suite (push) Successful in 6m15s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 10:15:51 +02:00
admin and Claude Opus 5
4c411c1ff3
Tilemaps can block movement: a tile gains a Solid switch, the solid cells of all layers are merged into rectangles and the placed tilemap takes part in the collision system as one body, reported as other in collision events ( #132 )
...
game-maker / gate (push) Successful in 1m41s
game-maker / suite (push) Successful in 6m3s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 09:47:03 +02:00
admin and Claude Opus 5
10b49fac46
Tilemap cells are stored compactly in the project file: each layer keeps a tile list, an origin and one run-length encoded string per row; older projects with a cell map still load ( #134 )
...
game-maker / gate (push) Successful in 1m40s
game-maker / suite (push) Successful in 5m59s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 09:17:49 +02:00
admin and Claude Opus 5
732f6518ae
The autotile asset is renamed to tile and gains a plain None (1 × 1) kind, which is now the default; older projects load their autotiles as floor tiles ( #131 )
...
game-maker / gate (push) Successful in 1m40s
game-maker / suite (push) Successful in 5m56s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 08:01:07 +02:00
admin and Claude Opus 5
a65132bb5a
Scrolling content is narrowed by the scrollbar width while the scrollbar is shown, so it no longer sits under the bar
...
game-maker / gate (push) Successful in 1m38s
game-maker / suite (push) Successful in 5m55s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 07:29:58 +02:00
admin and Claude Opus 5
33a7b1b63e
Tilemaps are a new placeable asset type that is painted with autotiles in the scene view, with layers, brush, eraser and rectangle, and is drawn at runtime and in the export ( #128 )
...
game-maker / gate (push) Successful in 1m38s
game-maker / suite (push) Successful in 5m51s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-18 06:41:47 +02:00
admin and Claude Opus 5
0607221423
Autotile floor tiles take their inner quadrants rotated by half a tile and their inner corners from the upper right block tile, matching RPG Maker MZ ( #118 )
...
game-maker / gate (push) Successful in 1m39s
game-maker / suite (push) Successful in 5m47s
The corner tables are now derived from rmmz_core.js (Tilemap._addAutotile,
FLOOR_AUTOTILE_TABLE, WALL_AUTOTILE_TABLE): the fill quadrants are taken
rotated by half a tile so that neighbouring tiles meet with the quarters that
sit next to each other on the sheet, and the inner corners come from the upper
right tile of the block, not the upper left one. A test pins the model against
both MZ tables, generated from rmmz_core.js rather than typed out.
The animation check in e2e module 39 read its four pixels one by one and could
straddle a frame change; step and pixels are now read in a single call.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 22:28:11 +02:00
admin and Claude Opus 5
1a9f07c4ac
Autotiles are a new asset type with a tab that shows every tile of the floor (2x3) or wall (2x2) block and an animated sample pattern ( #118 )
...
game-maker / gate (push) Successful in 1m50s
game-maker / suite (push) Successful in 5m59s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 21:35:29 +02:00
admin and Claude Opus 5
c17b2b5426
Plugins are switched on and off in a Plugins tab, the server keeps the state in data/plugins/plugins.json, and switched-off plugins are never delivered ( #114 )
...
game-maker / gate (push) Successful in 1m38s
game-maker / suite (push) Successful in 5m43s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 20:15:51 +02:00
admin and Claude Opus 5
57a97ba94f
Plugins in data/plugins are loaded at startup and can add a tab with a read-only node board, and the demo plugin shows every asset as a node ( #113 )
...
game-maker / gate (push) Successful in 1m38s
game-maker / suite (push) Successful in 5m43s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 19:00:03 +02:00
admin and Claude Opus 5
2a390e52ff
The scene view and the animation preview share one camera, the three form dialogs one base, and keys are found through one set of helpers ( #85 )
...
game-maker / gate (push) Successful in 1m36s
game-maker / suite (push) Successful in 5m41s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 14:19:53 +02:00
admin and Claude Opus 5
bf02c9e8b3
Timeline keys can be copied and pasted at the playhead, duplicated with Ctrl+drag, and frames inserted or removed from a right-click menu ( #102 )
...
game-maker / gate (push) Successful in 1m34s
game-maker / suite (push) Successful in 5m38s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 12:53:56 +02:00
admin and Claude Opus 5
195fc94e08
Animations blend out on Stop and at the end of Once (reset), and Play can restart a running animation ( #106 )
...
game-maker / gate (push) Successful in 1m33s
game-maker / suite (push) Successful in 5m37s
Stop animation gets a blend (s) port that fades the animation back to what
lies underneath. Play animation gets blend out (s) for Once (reset) and a
restart port that starts a running, paused or fading animation from frame 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 11:50:10 +02:00
admin and Claude Opus 5
8a377d9239
Play animation's blend is given in seconds, not in frames of the new animation ( #106 )
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 11:14:15 +02:00
admin and Claude Opus 5
04dc254b3d
Play animation can blend into the new animation over a number of frames ( #106 )
...
game-maker / gate (push) Successful in 1m33s
game-maker / suite (push) Successful in 5m34s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 10:03:53 +02:00
admin and Claude Opus 5
beeea355d9
Animation rows can target behavior variables and shader parameters ( #104 )
...
game-maker / gate (push) Successful in 1m33s
game-maker / suite (push) Successful in 5m38s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 09:04:29 +02:00
admin and Claude Opus 5
b278605c53
Keys carry an easing for the span to the next key: linear, step, ease in, ease out, ease in-out ( #101 )
...
game-maker / gate (push) Successful in 1m32s
game-maker / suite (push) Successful in 5m36s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 07:27:44 +02:00
admin and Claude Opus 5
cc14988338
Ping-pong turns on the last key, and stepped rows hold the key they last passed ( #112 )
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 07:08:44 +02:00
admin and Claude Opus 5
f68941fa3a
An animation reaches the scene's own background and objects inside placed containers ( #109 )
...
game-maker / gate (push) Successful in 1m33s
game-maker / suite (push) Successful in 5m37s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-17 06:48:21 +02:00
admin and Claude Fable 5.1
89c46c30a0
An animation is previewed above its timeline: the root at the playhead, drawn but never written ( #99 )
...
game-maker / gate (push) Successful in 1m47s
game-maker / suite (push) Failing after 4m55s
The Animation tab shows the root asset over the timeline, with every row's value at the
playhead written onto a copy of it – the sprite, text or container placed at the origin as a
scene would place it, a scene as itself. Rows reach the root through that placed object and its
children through the object's instance edits, the route a placed container's content takes,
so the ids match what the runtime gives them. The runtime player and the preview evaluate a row
through one function (trackWriteAt), relative rows included; past the end of a once-reset pass
the preview shows the starting values, as the player would. Play, pause and the ruler drive the
preview through the timeline's playhead; a drag pans, the wheel zooms, Centre frames it. The
document is never touched and undo never hears of scrubbing.
On animation finished no longer describes itself as hearing "a sprite of the owner".
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-16 21:00:18 +02:00
admin and Claude Opus 5
4ed2edd0f0
An animation is a value a graph can pick, and playing a running one makes it win again ( #97 )
...
Play, Pause and Stop animation take the animation on a port instead of a
fixed setting, fed by the new Animation literal or a list item tagged
`$animation`. Playing an animation already running keeps its frame but
counts it as started last, so turning back to a walk that never stopped
shows that walk. The actor demo walks through one Play animation over
`ItemAt(walk, facing)` again and stops every animation to stand.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-16 20:47:31 +02:00
admin and Claude Opus 5
5af0a1c83a
An animation's rows are edited on a timeline: double click sets a key, keys are banded, dragged and deleted, the ruler scrubs ( #98 )
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-16 20:38:34 +02:00
admin and Claude Opus 5
193378e6a9
An animation is a timeline of rows over one asset, played on an object rather than worn as a picture ( #97 )
...
Part (a) of the animation rework: model, commands, saving, runtime and nodes.
- AnimationAsset holds a root (sprite, text, container or scene) and rows; a row keys one
property of the root or of an object inside it, keys sit on whole frames.
- The last key decides the length (its frame counts as a frame of its own). The playhead runs
between frames, so numbers and colors blend every tick even at 10 fps; everything else holds.
- Playback gains `once-reset`, which puts back what was there before the start. A row can be
relative, adding to where its target stood.
- Play / Pause / Stop animation act on an object; each instance plays on its own, the later
start wins on a shared property, and a behavior writing the same property still writes last.
- A sprite no longer wears an animation through `texture`. "Create animation from texture"
builds a sprite plus a texture row keyed frame by frame instead.
- The Animation tab shows a placeholder until the timeline editor (part b) lands.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-16 20:02:25 +02:00
admin and Claude Opus 5
bf0be66c9d
A frame with borders tiles unless told to stretch
...
game-maker / gate (push) Successful in 1m32s
game-maker / suite (push) Successful in 5m47s
The fill of a sliced frame defaulted to `Stretch`. It is `Repeat` now, and the Fill dropdown lists
`Repeat` first.
The saved document keeps writing only the fill that differs from the default, so the key it
carries is now `stretch`, and a frame without it repeats. A frame saved before with the key
absent and meaning stretch would therefore tile; none of the stored projects has one - both sliced
frames on the server carry `fill: "repeat"` explicitly, so they draw as before.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-16 18:13:11 +02:00
admin and Claude Opus 5
94a0a578ed
A border drawn in pixels is as wide as the texture says a pixel is, so a small sheet can frame a large sprite ( #96 )
...
A sliced frame drew its borders one source pixel to one sprite unit. Pixel-art sheets are small:
a 16px corner on a 400-unit button is a thin line, and the only way around it was a larger image.
The texture now carries `Nine-slice scale` (default 1), next to `Filter`. It sets how many sprite
units one border pixel takes, for every sliced frame of that texture. The UVs stay as they are -
a corner shows the same pixels, only larger or smaller. When the sprite is too small for both
borders they are still scaled down together, now starting from the scaled size. With `Repeat`
the tile size scales too, otherwise a doubled border would sit beside a pattern of the old size.
The value is a schema row, so inspector field, saving and undo come without their own code.
Anything that is not a size above 0 reads as 1, and documents without it draw as before.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-16 18:09:43 +02:00
admin and Claude Fable 5.1
cc6db5f350
Three stores, three importers and three pickers that differ only in their type are one of each ( #85 )
...
game-maker / gate (push) Successful in 1m33s
game-maker / suite (push) Successful in 5m46s
Refactoring round one: HttpFontStore/HttpSoundStore/HttpTextureStore collapse into a generic
HttpFileStore over a FileStore contract; fontImport/soundImport/textureImport share assetImport
with an ImportKind per sort; ImagePicker/FontPicker/SoundPicker sit on FilePicker and describe
only their row. The group/comment drag logic leaves GraphCanvas for annotationDrag.ts (with its
own unit test), declaredRows.ts replaces the duplicated row build in particles.ts and shaders.ts,
and dead code in font/sound/compile/emission/transform/actions is gone. README: asset list,
check count 958, the two-job CI, the Scenes wiki page.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-16 17:38:54 +02:00
admin and Claude Opus 5
36ccc7626f
A box drawn around a part of the graph is part of it, so a fit frames it and a band catches it ( #95 )
...
game-maker / suite (push) Successful in 6m22s
Fit measured the nodes alone: a group drawn around them was cut off, and a graph holding nothing
but a comment framed the empty origin. It now frames both sorts together.
The rubber band ignored boxes entirely. It catches them now, into the *same* selection as the
nodes — `nodeIds` and `annotationIds` side by side — so one drag moves all of it, one Delete
removes all of it, and one undo takes it back. A box counts only when the band holds all of it,
where a node counts on touching: a group wraps the nodes it holds and therefore overlaps every
band drawn over any of them, and since it drags those nodes along, catching it by accident would
be felt at once.
A node inside a selected group is moved once, not twice — `travellers()` collects everything one
gesture carries and lets each thing appear in it a single time.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-16 14:23:56 +02:00
admin and Claude Opus 5
be8f2331de
A frame that keeps its corners can be stretched to any size ( #41 )
...
game-maker / suite (push) Successful in 6m21s
TextureFrame carries optional `border` (left/right/top/bottom) and
`fill` (stretch | repeat); absent keys mean "not sliced", so no format
bump and undo restores the plain frame instead of four zeroes.
The sliced sprite builds its own geometry instead of the shared
UNIT_QUAD: a 4x4 grid, and for `repeat` one quad per tile carrying the
frame cell's real UVs -- tiling in the geometry, not in the sampler, so
a frame out of a sheet cannot pull its neighbour in. Above 64 tiles per
axis it stretches, to bound the buffer.
A sprite narrower than left+right scales both borders down together
until the middle is exactly 0, so the corners meet at a seam and never
overlap.
The texture editor gets four draggable border lines plus the same four
numbers in the inspector. Hit order is resize handles, then the lines,
then the frame body -- handleAt reports 'move' anywhere inside a frame,
so lines placed after it were unreachable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-16 12:04:09 +02:00