Tray - Generated Packing Puzzles in Wood, for GameMaker
A downloadable asset pack
A packing puzzle for your GameMaker game, every one generated and every one solvable. A shaped tray sits on the table and its pieces wait in a box beside it, turned every which way; the player picks them up, turns and flips them, and fits every one back. Every piece is marquetry - its own wood, an inlaid motif, a line of stringing - drawn in pure GML. No image files.
Locked chests, puzzle boxes, a craftsman's test, a tavern pastime: Tray is a minigame you open from your own game and read the result of. The tray (a rectangle, a cross, a diamond, a round, a notched or an arch) is cut into pieces of three to six squares, all different even turned over, so the pieces always go back - and a solver grades each one by how many different ways it fills.
my_puzzle = tra_puzzle_for("chest in the old mill", "normal");
my_table = tra_scene_create(my_puzzle, { hints: 3 });
// Step: tra_scene_step(my_table);
// Draw GUI: tra_scene_draw(my_table, 0, 0, display_get_gui_width(), display_get_gui_height());
// when tra_scene_done(my_table): tra_scene_result(my_table).moves, .hints (undefined if they left)
What your players see
- Ten woods: walnut, maple, cherry, oak, ebony, ash, rosewood, yew, olive and holly, each with its own colour and figure - cathedral arches, maple's fiddleback, oak's silver flecks, rosewood's streaks, the knots of olive and yew. The grain runs along the piece and turns and flips with it.
- Ten inlays in four materials: star, lozenge, rosette, bars, chevron, dot, ring, cross, leaf and wave, set into a cut in brass, mother-of-pearl, holly or ebony (pale on dark woods, ebony on pale ones), with stringing run inside every edge and bevels lit from one lamp.
- A table that is all furniture: an ebonised case with corner fans and a brass fillet, the tray sunk into it and lined with baize, scored in squares, the walls casting a soft shadow on the cloth; a parts box; a brass title plate, plaques and a tally card.
- Where it lands: a carried piece casts a dashed ghost on the cloth, gold where it fits, red where it does not.
- The finished panel: when the last piece goes in, a band of polish runs across the tray and it is shown framed under a lamp, with the moves, the hints and how many ways that tray fills.
Built to plug in
- A struct you step and draw into any rectangle; it reads the keyboard and the mouse itself (lift and carry with the arrows, or drag with the mouse and turn with the right button or the wheel), or takes your own bindings through
tra_input(...). - 626 trays graded by the solver ship in a book, so
tra_puzzle_for(seed, difficulty, shape)deals one at once from any number or string;tra_generategrades a fresh tray from any seed, spread over frames. - Hints from the solver: one piece of a solution that keeps what the player has put down, or the piece that has to come out. The search is spread over frames, so a hint never freezes your game.
- Each step raises events (select, pick, drop, turn, refuse, hint, solve, leave) so your game plays its own sounds. Tray ships no audio.
- The rules, the solver and the drawing all work without the screen too, for a puzzle UI of your own.
- Baked once and drawn scaled: a frame of play costs at most 0.25 to 0.29 ms; lifting a piece re-bakes only its shadow (17.8 to 24.7 ms), a turn re-bakes the piece (46 ms); the shared workbench bakes in 0.9 s the first time (move it to a loading screen with
tra_room_prepare()). Measured on our machine, VM runtime.
Tested
- Igor package build clean on the shipped source, and proven able to fail.
- 43 in-engine assertions on a real built exe, held to our RPG Maker MZ original run in Node: 144 carvings and 48 solves to the node, all 626 trays of the book replayed, and 106 drawn things with exactly the original's drawing operations (86,581 of them); whole trays driven through the scene by keyboard, mouse and hints.
- 34 more in a blank project that installed the package the way you will and ran the Readme's own code.
- 140 adversarial calls against the 35 documented functions with zero crashes.
Requirements
GameMaker 2024.14 or newer (built and tested against runtime 2024.14.4.268, VM). Pure GML: no extensions, no DLLs, no shaders, no sprites. Import the .yymps, open rm_tra_demo, press Play: choose a tray shape and a difficulty, deal a tray and fill it; the trays you fill are listed. Tray makes no sound.
One commercial licence, unlimited games, no attribution required. Everything the package draws in your game is yours to ship, including on your store page and in your trailers.
Paid, from the same studio
- Tray for RPG Maker MZ ($9.99): the original, with its own plugin command and scene.
- Pastime ($19.99): a cabinet of minigames, each drawing its own board, for GameMaker.
- Anvil ($12.99): a forging minigame, the blade drawn as the player shaped it, for GameMaker.
- Wanted ($12.99): every bounty prints its own poster, for GameMaker.
More GameMaker systems at csaf.itch.io.
AI disclosure: the code, the generated artwork and the interface text in this package were produced with AI assistance. Every store image, the cover and the GIF were rendered by the product itself. Type: Libre Baskerville (SIL OFL 1.1), notices included.
| Published | 6 days ago |
| Status | Released |
| Category | Assets |
| Author | CSAF — Core Systems Asset Factory |
| Made with | GameMaker |
| Tags | GameMaker, gml, minigame, packing, polyomino, puzzle-game, sourcecode, tetromino, wood, wooden |
| Languages | English |
| AI Disclosure | AI Assisted, Code, Graphics, Text |
Purchase
In order to download this asset pack you must purchase it at or above the minimum price of $9.99 USD. You will get access to the following files:
Development log
- Tray is out for GameMaker6 days ago







Leave a comment
Log in with itch.io to leave a comment.