An entry for the Epic AI MegaJam 2026, by Demon Lord Sword Games. Theme: Director's cut.
A murder mystery on a theatre's turntable stage. Restage the night on the set designer's scale model, take what the device prints to the baroness in a fight of cards, question her, and decide what goes on the record.
Built in Unreal Engine 5.9, Blueprint-only, by one person working with AI tools inside the jam's 93 hours. This log was written as the work happened, one entry per checkpoint, most of them by the AI agent that did the step. Dead ends and failures are left in: each entry says what went wrong and what was not checked. In the entries, "the user" is the developer and "Claude Code" is the agent.
Tools used
Engine: Unreal Engine 5.9.0, a Blank Blueprint-only project. Blueprints, UMG, Paper2D sprites and flipbooks, Niagara particles (three small effects), the engine's packaging, and the Unreal MCP server with the Toolset plugins (editor Python, Blueprint graphs written as text, scene capture, play sessions).
Claude Code (Claude Fable 5.2): the design, every Blueprint and screen, the level, the scripts, the notes of the music and the first draft of the writing.
PixelLab: the character sprites and their animations, the pixel versions of the paintings, the interface pieces.
Meshy: the 3D set pieces and props.
Codex with its image tool: the redraw step between a concept and a sprite.
Midjourney: the art the game's pictures start from, made by the developer in the jam: the eleven paintings (the preamble's pages and the six endings), the painting behind the card pictures, and the concept images the two character sprites were drawn from.
Suno: four music tracks made early in the jam and later replaced. None of them is in the game.
Scripts and other software: Python with Pillow and numpy, the jam kit's sound-effect script, FluidSynth with the GeneralUser GS SoundFont (music rendered from MIDI), ffmpeg, Sprite Fusion Sprite Normals, git.
Outside assets, listed in the credits and not scored: Kenney's CC0 sound packs, the GeneralUser GS SoundFont, the Pixelify Sans font.
Theme: Director's cut. Setup check: engine 5.9.0, VS 2026, SDK, git and the editor's MCP server all ok (106 toolsets, 20 EditorToolset); a Claude Code session called the editor directly for the first time (LevelToolset.GetCurrentLevel answered /Temp/Untitled_1); one warning, C: has 54.1 GB free against the check's 60 GB line.
The design in GAME.md came from another session: talked through with the user before the window (it grew from an April 2026 design document, to be declared) and written to the file after it opened. Line 1: hours 0-3 are trials of what has never been done here (Blueprint graphs as text through the editor DSL tools, the turntable with pegs riding it, a card widget, a first package), then the carousel in grey boxes by hour 14 and the fight by hour 22. Line 2: a packaged build with the joined loop by hour 24, the whole floor start to ending by hour 36, with first art and sound by hour 48. Line 3: day 3 is the Should list in reverse cut order, feature freeze at hour 72, last 6 hours for package, video and submission. Decided Blueprint-only with C++ as the fallback if the DSL trial fails by hour 3. Tools so far: Unreal Engine 5.9 and its MCP server, Claude Code.
Tooling: the user added Meshy (3D models, 1,100 credits on their Pro plan, read with the free balance tool) alongside PixelLab (974 of 2,000 generations left, read from the API with the key in the Python keyring). Nothing generated yet. Plan gains trial T5: one Meshy prop beside one pixel sprite, to see whether the two looks sit together before spending more. Tools so far: Unreal Engine 5.9 and its MCP server, Claude Code, PixelLab, Meshy. Starting the trials.
Claude Code built everything through the editor MCP server: a grey-box stage (engine cylinders for a turntable and three pegs), a controller Blueprint written as text with the Graph DSL tool (it compiled on the second write; the first was refused because a parameter type is spelled Float (double-precision), not Float), and a card widget with a click handler written with the second, different widget DSL. Checked in a play session by calling the events from Python: a peg dropped on the disc rides a quarter turn from (100,50) to (-50,100) and lifts off without a jump. What went wrong: the first spin used mouse movement and was replaced by the disc following the cursor round its centre; the card showed 28 while the variable held 34, because a bound pure node is worked out again after the variable changes. Not checked: a real mouse drag or click, since the tools cannot move the cursor. First package of the project: 455.0 MB zipped.
the project packaged twice with jam.py (about 1.5 minutes each, 455.0 MB zipped, 45% of the 1 GB limit). The second build, unzipped outside the project, started and its log shows the Stage map loading with the game mode made tonight. Nobody has looked at its window yet. Left for the user: drag the turntable and a peg with a real mouse. Next: the carousel in grey boxes, and briefs for the first PixelLab sprite and Meshy prop.
Carousel in grey boxes works in a play session (Claude Code through the editor MCP server)
The set: a pivot with a wooden disc, a balcony slab that turns with it and a prop star that does not; three colour-coded pegs. Rules: each peg has a zone (off stage, on stage, centre, balcony) worked out in the disc's own frame, and a staging is three zones plus the stage angle. Her version (Felix and the baroness at centre, Dawn away, stage as found at 290) and the fall (Felix and Dawn on the balcony, stage at 140 where the balcony meets the star) each print a card; a wrong angle prints nothing; Eiry counts the unexplained traces 5, 3, 0. Looking through the device turns the stage once. Blueprint sources are now text files in SourceBlueprints/ with a helper that writes and compiles them. What went wrong: a call to a function whose parameters were new in the same write was refused, so functions are written first, on their own. The user approved the whole Meshy budget and suggested Midjourney for concepts. Not checked: real mouse input; the zone and angle choices are placeholders for the user to review.
The fight in grey boxes works and is joined to the carousel (Claude Code through the editor MCP server)
BP_Fight holds the rules as about 200 lines of Blueprint source in text: a deck of Press, Ask and Listen plus the cards the carousel printed, draw five and play three, her composure taking the edge off each hit, her next move shown, indignation fed by the false staging, a confession card added each time her resolve crosses a band, and its three-turn clock. A widget shows it; the carousel's button starts it. Checks run in a play session from a script kept in the repo (SourceBlueprints/tests_pie.py): the carousel again, each fight rule on a fixed hand, losing on credibility, losing to the confession clock, and twelve whole fights played by a greedy script. All passed. What went wrong: setting a variable on another Blueprint takes the value first and the target by name, the opposite of what the tool's own notes say. What the twelve fights showed: every one was won in 3 to 5 turns with 11 to 17 credibility left, so the first-pass numbers are far too easy and the clock never bites. Next: tune the numbers in a quick simulation.
A plain-Python copy of the rules (SourceBlueprints/fight_sim.py) plays 4,000 fights per kind of player; a grid of 96 settings was tried and one picked: resolve 80, her reply 4, the confession clock asks for 16. A careful player with the true card now wins 97% in about 7 turns, 82% with only her version, a greedy one 59%, a careless one loses a fifth to the confession. The same numbers in the editor: twelve scripted fights took 7 to 9 turns, one was lost. Two of her moves were redefined because she acts after the players turn: Cut strikes the first card of the next turn, From the top costs one card of the next hand. These are placeholders for the user to change by playing.
The whole floor now plays from the carousel to an ending in grey boxes, driven by script in a play session (Claude Code through the editor MCP server)
New: BP_Court and its screen. The questioning lays a printed card on one of two lines of her account; the fall card on the second line makes her strike it and gives the why; her own version wastes the question; questions are 3 to 5 from the credibility left. The fragments join into a who, how, why card on their own; the player picks guilty or not guilty; four endings follow from the verdict and whether the why was found. All in-game text was written tonight by Claude and is a draft for the user. Checks: six passes through the court with different cards and verdicts, questions running out, and a won fight handing over to the court; plus all the earlier checks again. All passed. Not checked: real mouse input anywhere, and Play again and Quit.
Added trace marks to the grey-box stage and a trace list to the screen, Play again and Quit on the ending, and a draft sheet of art prompts for the user to workshop (ART_PROMPTS.md: Midjourney concepts for the baroness, Meshy prompts for the props, card pictures for PixelLab; nothing run, nothing spent). Third package of the night: 455.2 MB zipped, 46% of the limit; unzipped outside the project it starts and loads the stage with no Blueprint errors in its log. What went wrong: an unzipped build that had been run stayed locked and could not be replaced, so each build now goes to its own folder; the hand of cards overflows its row at small window sizes. Honest state: the whole floor except the baroness sprite runs from the carousel to an ending, but only under a script. No one has played it with a mouse yet. Generations and credits spent so far: none.
Sixteen sound effects written as recipes and made with the kit's sfx.py (clicks, pegs, the stage turning, the card printing, her reply, her cigarette, Cut, the confession, the tear, the gavel, win and lose), imported and played from the game's events. Nobody has heard them: the agent cannot listen, so it read each file's peak level and turned three down. Esc now opens a pause panel with Resume and Quit; a key press sent through the editor's input tool opened it in a play session. The fight's cards wrap their text so the hand fits its row. What went wrong: a variable named Pause clashed with the engine's own Pause on the controller. All checks passed again, run with the editor's game sound switched off so a dozen scripted fights would not play aloud at night, then switched back on.
An honest failure and two findings from running the packaged game
The agent tried to do what no script had: drag the stage with the real mouse, using a desktop automation tool on the packaged build. Nothing moved. The cause was not the game: a Windows Security prompt (allow network access for UnrealGame?) was holding the window, and answering a security prompt is the user's call, so the test stays undone. Finding one: the prompt comes from the engine's trace control listening on a port in Development builds, and the rules require a Development build, so judges will likely see it too. Finding two: three earlier test launches had never been closed, because the game's process is called UnrealGame, not TruthOnStage; they held their folders locked and tripled a package time. Fourth package: 455.3 MB zipped, starts and loads the stage. Spent so far: 0 PixelLab generations, 0 Meshy credits.
no context on the first screen, and no staging printed a card. The play session they left open showed why: Felix and Dawn were on the balcony and the baroness off stage, which is the fall, but the stage also had to stand within 15 degrees of one angle that nothing on screen showed. Rebuilt the carousel with Claude Code through the editor's MCP tools: ten pegholes that figures snap into, a stage that clicks into six positions, three sets on the turntable (romance, battle, execution) split by walls, seven traces, and a third staging that is a red herring. It prints a false card (The headsman) that does no damage in the fight and feeds her indignation. After a look that prints nothing, Eiry now says how many of the four parts of the staging fit a story. Added a four-page text preamble before the carousel. One table (stage_layout.py) feeds both the level and the Blueprint so they cannot drift. Went wrong: a Bash heredoc choked on apostrophes again; the detach call wanted DetachmentRule, not AttachmentRule; the first HUD pass covered the stage with the trace list. Checked by script in a play session, all passing; not yet played by hand.
Walk mode, as a grey box, with Claude Code through the editor's MCP tools
After the preamble the player stands on the stage as it was found, as a white cylinder: W A S D walks, the camera stays behind the figure and swings round the disc with it, the walls and the stage edge stop it (worked out with a little trigonometry in the Blueprint, no physics), and E looks closely at nine things, the seven traces and two bits of dressing. On the model, a trace nobody has looked at is listed only as 'something on the battle set'. The first three requests took about 15 minutes, so this went in the same sitting. A D key held for 0.8 seconds through the editor's input tool walked the figure 135 units, the first time a real key press has been seen to reach the game. Open for the user: who walks (the Investigator was never meant to be shown; Eiry flies and would need one sprite, not a set of walk cycles), keys or click to walk, and whether traces should stay hidden until found. Went wrong: a heredoc quietly turned a doubled backslash into a newline in a patch script, so scratch scripts now go through the Write tool; the checks failed once because walk ran before carousel and left the stage turned. All checks pass on a fresh play session; nothing played by hand yet.
the Investigator is shown after all, as a sprite with a walk cycle, and the fight is staged like a JRPG battle; W A S D stays. Built the whole sprite path before any art exists, so the real sprite is a file swap: a Python script with Pillow (SourceArt/make_standins.py, written by Claude) draws stand-in sheets, an Investigator with a 2-frame idle and an 8-frame walk and a baroness with an idle; JamKit's sprite import brought them in as Paper2D flipbooks with no errors; the walker is now a flipbook that turns to the camera, mirrors left and right and swaps idle for walk; starting the fight blends to a low side-on camera on the battle set with the two figures facing each other and the cards over them. First time a sprite has been seen in the level: sharp, and the unlit sprite material shows both sides. Wrote a PixelLab brief for the real Investigator (about 2 generations, 13 at worst) and three Midjourney options for the user to run. Went wrong: the first fight camera was too close; I wrote the wrong jam hour into three files; and I edited a pre-jam kit doc whose hash is in the pre-jam manifest, then put it back and moved the findings to NOTES.md. The skill's pose library has the best walks but they were measured before the jam from other games' sprites, so they are not used. Cost: 0 PixelLab generations, 0 Meshy credits. All scripted checks pass; nothing played by hand.
User approved Codex for the redraw step of the concept-to-sprite route and suggested pinning a style sprite so every character looks drawn by one hand
Wrote SourceArt/sprite_from_concept.py around their own conversion script (unchanged): the same redraw request plus one paragraph that takes the drawing style from a second image and the character from the first. The pin has to be made in the window, so the plan is to convert the baroness first and pin her sprite for the Investigator. A guard in the user's Claude setup refuses Codex started from the agent's shell; the agent did not work around it, so the user runs the two redraw commands. Ran trial T5 on the standing Meshy budget: a prop star by text to 3D (meshy-t2 smart topology, 1,500 faces, then a texture refine), 15 credits, balance 1,100 to 1,085, under two minutes in all. The GLB imported through the editor's Python in one call with its mesh, material and texture, and the level builder stands it at a set height. The prompt asked for five points with one snapped off and got eight whole ones. Found a second way to take pictures, an off-screen capture from any camera, after the editor's content drawer kept covering the play-session screenshots; its shadows are much darker than the game's. Whether a faceted textured model belongs beside pixel sprites is the user's call. All scripted checks pass with the star in.
The user brought Midjourney concepts for the baroness and the Investigator and said to run the Meshy prompts. Sprites: each concept was redrawn as pixel-style art by Codex's image tool, sent through the user's codex-delegate plugin because its guard refuses Codex from the shell (the plugin's own worker is the door it points to); the Investigator's redraw named the baroness's finished sprite as a style reference so the two look drawn by one hand, the user's idea. Then one PixelLab conversion each (1 generation), and one PixelLab clip for the walk: 16 frames from text alone, a whole two-step cycle that loops, 2 generations. PixelLab's live API now animates 256-pixel frames; the skill notes said 96, so the plan to halve the sprite was dropped. Sets: twelve Meshy models (meshy-t2, texture refine, 15 credits each, 180 in all) made, textured and downloaded in six minutes, then placed by a table in the level builder. To seat the pegholes on the generated balcony the builder drops a grid of lines on the model, takes the commonest height as its floor and squashes it to fit. Went wrong: the texture queue holds ten tasks, so two had to wait; the rampart and backdrop were deeper than expected and came through the dividing walls; PixelLab left its grey matte between the Investigator's boots; Git Bash turned an endpoint name into a file path; the headsman's block came out looking like a chair. Spent: PixelLab 4 generations (970 left), Meshy 195 credits (905 left). All scripted checks pass; nothing played by hand.
User: the 3D assets' textures need a redo in pixel art style, and the sword painting is card art
First try, free: cut each Meshy texture down in a Python script to 64 to 256 pixels and 12 to 24 colours and show it unfiltered. It made the props flat and blocky, but it averaged away the planks and courses of stone, turned Meshy's brush-stroke noise into loose pixels (fixed with a median and a majority filter), and could not line the pixel grid up, because Meshy's texture layouts are scraps turned every which way. So the big flat pieces got a second method: a script draws real pixel tiles (stone, canvas, wood, and the whole stage's boards at 1644 pixels across), and two materials built in Python lay a tile on a model by where each point is in the model's own space, from three sides or from above, at 2.74 pixels a unit, the same as the character sprites. Stage floor, rampart, balcony, block and rail use it; the many-coloured props keep the cut-down textures. Two Meshy models showed their flaws under it: the turntable has a sunken middle that kinked the planks, so the stage is a plain cylinder again; the rampart has a gap at its door, plugged with a stone block. The sword painting went through one PixelLab conversion (1 generation, 969 left) and now shows on the carousel screen when 'I ran him through' prints. Went wrong: a heredoc refused apostrophes for the third time; the first median filter took four minutes; I wrote a jam hour ahead of the clock again. All scripted checks pass; nothing played by hand.
User: redraw the remaining props too, and look at a normal-map tool
The props' own textures cannot be redrawn in place, because Meshy lays them out as scraps, so the pixel art is baked from pictures of the model instead: each prop is stood somewhere empty at its stage size and photographed flat (no perspective, no lighting) from the front, the side and above with the editor's off-screen capture; a Python script shrinks each picture to 2.74 pixels a unit, the sprites' size, and cuts a prop's three views to one list of 24 colours; a material built in Python lays the pictures back on the model by position. The rack's swords and shield, the bower's roses and the star came out as clean pixel art. What went wrong: with three pictures, a face nobody can see from outside takes the colour of whatever stands in front of it (the rack's shelf took the sword hilts'), so thin props now wear their front picture all the way through like a cut-out, and only the deep ones keep three. Cost nothing. The normal-map tool (Sprite Fusion Sprite Normals) is MIT licensed, so it can be used; it is a Rust program built from source and Rust is not on this PC, so nothing was downloaded or built and the choice of how to run it is the user's. All scripted checks pass; nothing played by hand.
The user approved installing Rust so the tool they found could be built: the official installer (checked against the Rust project's published SHA-256, since it has no Windows signature), Rust 1.99.1 in the user's profile with the PATH left alone, then Sprite Fusion Sprite Normals (MIT) cloned, its 1,100 lines read, and built in 35 seconds. One command per sprite sheet gives a normal sheet in the same layout, walk frames included. In the engine a Python script imports the sheet, hangs it on every sprite as its first additional texture, and builds a lit sprite material with two sprite samplers, one for colour and one for the normal. Went wrong: the first material compiled to nothing and both figures drew as grey chequered boxes, the engine's fallback; the normal sampler needed a normal-type default texture and its own parameter name. After that the fight shows both figures shaded by the stage's sun with relief in the coat and gown. Not judged yet: whether they are now too dark, and the walk in motion. All scripted checks pass.
User: normal maps on the set too, and the open sky makes no sense
The stage now stands in a theatre: dark boards underfoot, a red curtain across the back, curtain wings and legs, brass footlights, all plain engine shapes wearing tiles drawn by a Python script. Normal maps: the tool from the last entry was run over the seven tiles (laid out three by three first, so the relief has no seam) and the 24 baked prop views, and the four projection materials were rebuilt with a normal input. Because each picture is laid on along one of a model's own axes, its normal map's right, down and out are known axes, so the material rebuilds the lean in the model's space by swapping and flipping components and hands the engine a world-space normal. Went wrong: a footlight stood right in front of the fight camera's lens; the stage boards drew four to the stage because an old texture-size cap made the editor report half their size; an argument named a clashed with the alpha flag a and stopped a rebuild halfway; at the tool's default strength the boards looked like bark, so flat things now get a gentler setting. In the game's lit view the curtain has folds, the rampart has courses, and the fight finally looks like it happens on a stage. The light is still one harsh sun. All scripted checks pass; nothing played by hand.
The cinematic pass, first round, from the user's note (bokeh, light cones, drifting dust, bloom)
The sun is gone: nine stage lamps light the set, in candelas against a fixed exposure, with the sky hidden so beyond the curtains is black. Height fog with volumetric fog gives the haze. The first try had haze but no cones, because every lamp hung outside the picture; two narrow lamps low at the back corners put two beams across the fight. Dust is 104 tiny balls hanging from two pivots the controller turns slowly, since the editor's tools here cannot build a Niagara system; out of focus they become soft discs, which is most of the look. Bloom, a vignette, glowing footlights. Focus is set on each camera: the fight is sharp on the two figures and soft before and behind. The worry was that blur and bloom would smear the pixel art; in focus it stays crisp. Went wrong: the first lamps burnt the pale boards white (key down from 1,100 to 460 candelas); a heredoc ate a backslash again; the fog's on-switch has one name to set and another to read. Found the console's HighResShot for pictures of the real lit game with no HUD or editor in them. About 90 frames a second in the editor's small viewport; full size and the packaged game not checked. All scripted checks pass; nothing played by hand.
Licence checked (SIL Open Font License 1.1: may be bundled in a game, its notice has to travel with it), Regular and Bold fetched from the font's own repository, imported, and put on every text block. A font face alone drew empty boxes; text needs a font family asset, and Python could only build one by writing it as the text the engine exports and reading that back in. Also fixed: a red engine warning that had been printing on screen since the sky was hidden. And a correction to an earlier entry: the editor does have a Niagara toolset; I missed it in a list I had cut short. The battle screen's art is not started.
The three figures are now turned boxwood with a painted foot, band and stud, each with its own outline (Felix broad with a shoulder ring, Dawn slender with a knot of hair, the baroness in a wide skirt and collar), so they can be told apart without colour. Each is a handful of the engine's basic shapes described in a table and merged into one mesh by the level builder, wearing tiles drawn by script. The pegholes are a drawn brass ring round a dark hole, one picture on a thin disc at the sprites' pixel size, and the three waiting places have the same ring in each figure's colour. Went wrong: the merge tool named its meshes SM_SM_Peg; its pivot setting has a new name in this engine version; the first wood was so pale it glowed under the stage lamps. A line trace confirms a click still finds a merged figure. All scripted checks pass; nothing dragged by hand.
User: add one more peg as a red herring, the baroness' son, with his alibi learned in gameplay and not in the preamble
Aleo Velum is now a fourth figure, green, lanky, in a tall hat, made the same way as the other three (basic shapes merged by the level builder, drawn tiles). His staging, The jealous son, is her version with him in her place; the same two traces allow it, so the device prints it. His alibi is a paper dropped by the witness rail on the execution set, a gaming house's reckoning for his night, found on foot; or the baroness gives it herself, laughing, when his card is played in the fight or laid down in the questioning, where it costs indignation or a question. The preamble only says nobody has placed him that night. Which of this is the user's and which is Claude's call is written down in GAME.md. A staging now has five parts, so Eiry's hint counts out of five. Went wrong: the status line with four figures ran under the trace list until its wrap was narrowed; a picture session read the wrong clue because the walker stood nearer the block than the paper. Scripted checks pass with new ones for all of this; nothing played by hand.
Before: five lines of text over the stage. Now: a plate each for the Investigator and the baroness with a bar and labelled numbers, her next move on a red ribbon with a little picture (a reply, her cigarette, Cut, From the top), the confession clock on a red plate that only appears while it runs, the log as a caption, and a hand of framed cards with pictures. Frames, plates, bars, buttons and eleven icons are drawn by a Python script in the theatre's colours (the icons are typed out as rows of letters). The seven new card pictures are PixelLab's: each is one prop in a pool of light before the red curtain, started from the user's own painting for the sword card with the sword painted out and held to its palette, so the set matches. PixelLab cost: 10 generations (969 to 959 left): 2 trials, 7 kept, 1 retry not used. Went wrong: the first trial held the starting image so hard it returned an empty stage (strength 220; 70 worked); the generator signed two pictures with a scribble, painted out; the editor's Python has no brush library, so brushes are built by hand; the widget tool picked Border's Set Brush from Texture for an Image; a function cannot be handed a texture, so the fight sets a variable on the screen first; plate grain stretched into blotches; a disabled button faded the confession card, which should glare. The old text screen is deleted. Checks pass, with new ones for pictures, frames, bars, clock and clicks. Not touched by a real mouse yet.
User: the layout of the fight screen is approved, but PixelLab should have a dedicated UI endpoint we have not tested; show its output so they can decide between the two. It has two. /create-ui-asset draws a whole kit as one template from a list of labelled shapes; one request with 16 shapes cost 25 generations (959 to 934 left) and came back as a matching set: a card frame with a title strip, picture window and parchment plate, a name plate, a swallow-tailed ribbon, a button, a red plate, a bar track, a caption strip, and nine round badges each showing what its label asked for (mask, flame, shield, card, deck, hourglass, speech bubble, cigarette, clapperboard). A script finds each shape by its outline (the generator moved and resized them), cuts the card's window, and makes the blue-strip and red confession frames from the one frame by recolouring. The fight screen was then taught to wear either set, with the same texture names so the Blueprint does not change, and both were photographed in the game at the same three moments. Went wrong: the kit's badges are bigger than the drawn icons, so the Investigator's plate ran under the ribbon until its row was tightened; dark ink on the leather button could not be read. The second endpoint, /generate-ui-v2 (one element from a concept image), was prepared and not sent. The game still wears the drawn set; the choice is the user's.
User chose B, the PixelLab set, for the fight, so every screen now wears it
The fight switched by importing the other set under the same names. The carousel's screen was rebuilt: its four lines on a plate (Eiry's in blue, the device's in gold), the trace list as a notebook page in ink, three leather buttons, and a tray at the lower right that shows a framed picture for each card the device has printed (before, only one card had a picture). The court's screen was rebuilt: the baroness's account as a page of script whose lines tint under the cursor, the printed cards as full framed cards with pictures and a line each on what they claim, leather buttons for the choices; the pieced card and the endings read off the same page. The pause panel and the preamble took the look in place. No new generations: the parchment pages are made from the card frame's own parchment. Went wrong: making a big page by repeating the parchment's middle mirrored gave rows of ink-blot faces, so the middle is drawn new instead; the notebook page was too short for a trace that wraps; the old screens kept showing as referenced until their Blueprints were compiled and saved a second time. The old plain-text screens and their builders are deleted. All scripted checks pass. No person has played any of this yet.
She is a small glowing orb with feathered wings and no face, from PixelLab: one generation for the picture, one for an eight-frame hover (932 of 2,000 left). A script picks the frames that loop cleanly and makes violet, red and gold copies by turning the orb's hue, since her colour is the feedback: red in the fight while the baroness's composure holds, violet as it slips, blue when nothing is left of it, gold when the device prints a card or her resolve breaks. She is in the world, not on the screen: over the device beside the model, at the Investigator's shoulder on foot, beside them in the fight, bobbing, with a small lamp of her own colour that tints the stage round her. Went wrong: with the plain unlit material she looked grey against the lit canvas (unlit white is dimmer than a lit stage), so she has a material three times brighter than white; seen from the cameras that look down she was edge-on, so she leans back toward them and is drawn double by the model; she first hung far above everyone because I misjudged how tall the figures are in units; a move applied only on the tick was not there yet when a check looked in the same frame; and one of my own screen checks was flaky because a confession left in a test hand could be drawn again. Also noted from the user, not built yet: blood on the stage should be a pixel texture, not an object.
User: the blood on stage should be a pixel texture, not an object; approved
All six trace marks were thin boxes left from the grey box. Now each is a small picture drawn by a script (a blood smear with one ruled edge, a wet red patch with runs for the block, a pale notch, the star's snapped point with a dark tip, and two sets of grooves on true arcs about the middle of the turntable, since those were made while it turned) and laid on the stage as a decal, which paints whatever surface is under it: the red lies on the block's own top, the scuff on the balcony rail. The red on the block is a brighter, glossier red than the blood on purpose: it is stage paint. Went wrong: a decal pointing down laid a test letter F mirrored (pointing up it reads true); five old scuff slivers were still in the level under a name the builder did not know; under the stage lamps the blood read pink and the scrape glowed like chalk, so both were redrawn darker. Figures are set not to take decals, so nobody walks blood onto their feet. No generations spent. All scripted checks pass; no check tests a mark itself, they were looked at.
The user played it by hand for the first time and found two things in minutes that eight hours of scripted checks and stills had not
the walking sprite is blurry, and the numbers are hard to read. The blur had two causes. Motion blur was on by default, now off. The bigger one: the game moved the walker every frame with the teleport flag, which tells the renderer nothing moved, so the temporal anti-aliasing smeared him; without the flag the same walk is sharp (four captures side by side settled it). The numbers: the pixel font's 5 reads as an S, and Claude had been misreading its own screenshots the same way without noticing. A font family can hand the digits to another face, so 0 to 9 are now the engine's Roboto Bold on every screen with no screen changed; the editor kept drawing the old digits from a cache until the screens were pointed at a fresh font asset. Also: the user painted a splash picture of the Investigator facing the baroness; PixelLab's size-picking conversion made it 128 by 71 and lost her face (6 generations), the standard one at 480 by 270 kept everything for 1 generation, and that is now behind the preamble. PixelLab 925 of 2,000 left. Suno prompts for four instrumental tracks were written for the user to workshop. One run of the checks was broken by a real mouse click in the play window.
The user came back from Suno with four pieces made from the prompts drafted an hour before: an unfinished waltz for the carousel, a tango duel for the fight, and two slow question pieces, one now under the court and one under the preamble (which is which is Claude's guess from the names; it cannot hear them). A small Blueprint, BP_Music, does one thing: asked for a track, it fades the old one out and the new one in, quieter than the effects. It is its own actor so the controller, the fight and the court can each call it without knowing each other. Five effects were added from recipes: two footsteps in turn while walking, a two-note rise for looking closely, a paper flick for pages, a small bell when Eiry changes colour. Went wrong: the DSL plugged the audio component into the fade's duration until the target was passed by name; converting the user's original splash file failed twice with a dropped connection because a 1.7 MB PNG made the request too big (a JPEG went through, and the failures were not charged). The splash was converted again from the original, and eight more splash prompts were written in the user's own prompt form for the preamble pages and the four endings. The checks confirm which piece is asked for where, and that the player was playing the right wave; nothing at all was checked by ear.
Three gameplay items from the Should list in one sitting
A third staging, Cornered: the stage as it was found, Felix in the middle of the balcony and Dawn in its corner, prints a fifth card (its picture is one more PixelLab generation, 923 left). The questioning now has four lines of her script: the fall card strikes three of them (how he died, who was there, that the stage turned twice) and only Cornered strikes the fourth, which is the why, so the full truth needs both true stagings and at least four questions. And the baroness plays differently in each of her four bands: more cigarettes when guarded, harder replies when cracking, and when she is nearly broken she confesses again to the gallery and another confession card lands in your discard, because she is trying to lose. Went wrong: the fourth line ran off the bottom of the script page until the page was made taller; the old check for her moves walked a whole fight to reach each one and would have broken, so three variables were made settable and the check now reads all seven beats in each band directly. Scripted fights with a simple policy: 21 of 24 won holding the fall card, 15 of 24 holding only her false staging, so coming to the fight with only her lie is now a real handicap. Nothing was played by hand.
The last two items on the Should list, so every Must and Should is now built
Piecing the card by hand: each line the baroness struck is a piece on the cutting-room floor, and the player lays it on the card or leaves it there; the card says only what is on it. That let the game answer the jam's theme with a cut of the player's own: a why that was won can be left off the record, and two new endings (The director's cut, Half a truth) say plainly that nobody played you, you made the cut. Six endings now. The device's replay acts out the staging: as the stage turns, the baroness goes at Felix and he goes down, or he goes over the balcony rail as it comes round above the prop star, or he closes on Dawn in the corner; then every figure stands where it was put. Went wrong: a bracket missing in the replay script stopped the write, and the same script carried on and started a play session, so the next write ran into the live game and threw errors (stopped, written again, nothing lost); a check still expected the why to join the card by itself; and checks run after printing cards for a picture failed because they assume a fresh session. All scripted checks pass from a fresh session. The largest open risk is unchanged: almost none of this has been played by a person.
Checked without touching their session: the start map is set; the cook reports 0 errors and 0 warnings; the 380 assets depend on nothing editor-only that matters; the editor's log has no game error since the last change. Not checked: Play again on an ending, which reopens the level and has never been pressed by any check, and real keys since hour 10. The packaged game has still never been started by anyone. A slip: Claude muted the editor's game sound for a check of its own a moment after the user had started playing in the editor; it was put back at once. The user's report outranks every check here.
The user played the game through for the first time and sent ten notes; eight are built
On foot: an E key floats over the nearest thing (a script-drawn sprite), a light hangs over each thing not yet looked at, the Gilded Die paper is 1.7 times larger (the user could not find it), and the Investigator's deduction opens in its own box. At the model: when the device prints nothing but 3 or more of 5 parts fit, a red ring lies under each figure that does not fit, and the words say if it is the stage that is wrong. In the fight: tooltips on every number, a plainer 'I ran him through' card, and the two of them speak in paper boxes beside their heads. A title card covers the change into the fight and into the questioning. Tools: Claude Code through the Unreal MCP (Blueprint DSL, widget DSL, editor Python), Pillow. No generations spent. Went wrong: the E key floated at one height for everything and read as belonging to the rail behind the paper (each spot has a height now); red at emissive 9 bloomed pink; the first card rewrite was 97 characters and ran out of its box; centred speech boxes covered the baroness's face. Not built, by the user's word: the device printing the card instead of the stage spin, and the writing pass, which is theirs. Checked by script (0 failures) and in pictures; tooltips were read back but not seen on hover.
The court now marks the card picked to ask with. The set names on the stage are in the screens' own pixel letters (drawn by script; a decal smeared on the rim's slope, so they are flat unlit cards). The prop star and the headsman's block were remade through Meshy's image route from script-drawn reference pictures: the star came right first time (five points, one snapped off, where words alone had given eight whole ones); the block took two tries and is now a plain block, not a chair. 45 Meshy credits, balance 905 to 860. The packaged build was started for the first time, by command line with frame capture: it loads the stage map with 0 errors and ran at about 103 frames a second at 1920x1080 on an RTX 5070, on the preamble page; read from its log and frame times, nobody looked at the window. Went wrong: importing a GLB over the old one kept the old texture, so the star's pixel bake came out black with gold scraps until the texture was imported by itself; the build's log is under Engine/Saved, not where the notes said, which for a minute looked like the game had not started; a check of the key over the star ran after the walker had left the stage and read a stale position. Tools: Claude Code through the Unreal MCP, Meshy, Pillow, the engine's CSV profiler.
The user's second play brought five notes; all are built
The Suno tracks sounded blown out: the four files were measured (peaks -2.9 and -3.8 dBFS, nothing at the ceiling, so not clipped) and the music now plays at 0.36 instead of 0.55; the agent cannot hear, so the user's ear decides. The carousel screen's two top boxes fold away behind script-drawn pixel badges and start folded, with one message at a time top centre. When every figure is right and only the stage is wrong, the turntable shudders in place and will not turn, with its own sound from the recipe script. The false stagings (the headsman, the jealous son) are no longer cards: each one printed makes the baroness start the fight with 2 indignation. Every tooltip was rewritten to say what a thing is, what moves it and what to do about it. The questioning now speaks of claims, proof and challenges, offers only the true stagings, and says what a held card proves. Went wrong: a graph could not hide two boxes that had never been marked as variables; the message box first sat at the bottom, over the figures' homes and the printed cards, and moved to the top; four court checks were still testing the false cards. Tools: Claude Code through the Unreal MCP, Pillow, JamKit sfx.py. No generations spent. Checked by script (0 failures) and in pictures; the shaking itself was not watched, and tooltips were not seen on hover.
The user's third play brought ten notes; nine are built
Fight: the text ribbon is gone and symbols with tooltips sit over each head (what is coming at him and his guard; her next move), every card is reworded ('6 damage to her resolve, minus her composure'), at 0 composure she takes a deep draw and blows it at him, and a Swap button lets him set one card aside a turn and draw another. Animations: PixelLab animate-pixminimax made the Investigator's idle, his kneel when a thing is looked at, and the baroness's idle, 7 generations, 923 to 916 left. On foot: a chime, a gold Eiry and a message when everything is found, Eiry's lamp turned down from 26 to 4 candelas so it stops flattening his normal map, the camera lowered from 38 to about 27 degrees, softer footsteps. The floor tile went from 64 to 512 pixels with boards of many lengths and tones. Went wrong: the first deep draw (composure back to 3, one play lost) dropped the scripted player from about 15 wins in 24 to 0 in 6, so it now restores 2 and costs one card, which measures 20 in 24; centring each kneel frame on its own outline made him slide, so a still clip now stands where its first frame stands; the user's own play session was open in the editor, so nothing was applied until it had sat idle for over seven minutes. Not built: sourced sound effects, which wait on the user's choice of source. Tools: Claude Code through the Unreal MCP, PixelLab, Sprite Fusion Sprite Normals, Pillow, JamKit sfx.py. Checked by script (0 failures) and in stills; not seen moving, not heard.
Sourced sound effects, on the user's word ('Yes, Kenney CC0')
twelve effects (both footsteps, the wooden figures, cards, paper, the gavel, Cut, the pen striking a claim, clicks, the stage that will not turn) now come from thirteen recordings in four of Kenney's CC0 packs. These are outside assets, each listed in CREDITS.md; the rules allow them and the judges do not score them. Eleven effects are still made by the jam's own recipe script. The agent cannot hear, so files were chosen and levelled from measurements: length, lead-in, peak, average level, and where the energy sits (the wooden footsteps sit near 200 Hz; the script's sat near 8,000, which is likely what jarred). ffmpeg, already on the PC, trims the silence before each sound and sets its gain; the game imports them under the old names, so no Blueprint changed. Went wrong: the recipe script refuses a recipe file with a key it does not know, so the replaced recipes moved to a file of their own; a card sound had a tenth of a second of silence before it until the trim was made stricter. Tools: Claude Code, ffmpeg, the Unreal MCP. Every scripted check still passes; nobody has listened yet.
the user asked whether a 4 GB SoundFont on their disk (HiDef, a Roland SC-88Pro-layout bank by stgiga and others, listed on musical-artifacts.com as CC BY 3.0) could be a music option. Found: the file is readable and complete (1,328 presets, 9,361 samples); its own header names no author and no licence, only the editing tools; nothing on this PC plays SoundFonts. So the agent wrote a small SoundFont player in Python with numpy and scipy (zones, loops, tuning, volume envelope, pan, low-pass, one plain reverb; no modulators or LFOs) and a 16-bar test waltz of its own, and rendered 35 seconds for the user to hear. Checked by measurement, since the agent cannot hear: five instruments land within 12 cents of the notes asked for. Open for the user: the page's licence covers the compiler's work, but the samples come from Roland's hardware, and the entrant warrants the rights to everything in the entry. The bank would be an outside asset; music written with it in the window would be new work.
The user set the 4 GB bank aside and chose GeneralUser GS (its licence: use 'without restriction for your own music creation, private or commercial') with FluidSynth to render. Both came from their official sources: FluidSynth 2.6.2's Windows zip from its GitHub release (2.7 MB, SHA-256 matched) and GeneralUser GS 2.0.3 from its author's repository (32.3 MB, with its licence file). They sit in C:/Jam/Tools, outside the project and the game. SourceAudio/midi_tracks.py now writes a tune, given as notes in Python, to a standard MIDI file and has FluidSynth play it through the bank into a WAV. The same 16-bar test waltz went through: 38.7 seconds, and the flute's last note measures 587.8 Hz against a D5 of 587.3. Went wrong: the first render peaked at 0.31, half the level of the Suno pieces, until the gain went from 0.6 to 1.3. Nothing is in the game yet: the user hears the test and decides. The SoundFont is an outside asset with a CREDITS.md row; the notes are the jam's own work. Tools: Claude Code, FluidSynth, GeneralUser GS.
The game's music is now four pieces written note by note by Claude Code and rendered with FluidSynth through GeneralUser GS, on the user's word ('Yes, write the tracks'): a music-box preamble, a D minor waltz for the stage whose theme the preamble plays first, an A minor tango for the fight, and a slow E minor piece with a ticking wood block for the questioning. Each is a seamless loop of 36 to 62 seconds: the piece is rendered three times over and the middle time is kept, so its opening already carries the last bar's ring. The four Suno pieces stay on disk, unused. The agent cannot hear, so faults were hunted by measurement: a script lists semitone clashes held for most of a beat (it found the harp ringing across bar lines and the theme's A sitting on a B flat, fixed with a cadential six-four) and renders each part alone to compare levels (the tango's bass was the loudest thing in it). Went wrong: a patch with an apostrophe in a Bash heredoc would not parse; the first loudness match was by peak, which left the preamble at two thirds of the waltz's level, so pieces are matched by RMS now. Checked: loop lengths to the sample, seams, and that the running game holds the right piece at the preamble, on the stage and in the court. Not checked: whether it is good music. Tools: Claude Code, FluidSynth, GeneralUser GS (an outside asset, in CREDITS.md), numpy.
The user approved three of the four MIDI pieces and asked for the fight tango to be faster with more castanets
It went from 124 to 140 beats a minute (the loop from 62 to 55 seconds) and from 12 castanet clicks to 164: off the beat in every bar, a triplet every second bar, every off-beat in the last strain, a roll into each new strain. Went wrong: brought forward in the mix, the clicks became the loudest moments in the piece, and holding the peak under 0.9 by turning everything down left the tango at 0.074 average level against the others' 0.12. The render now rounds off only what stands over 0.7, which touched 0.001 percent of the samples, and the tango is back level with the rest. Checked by measurement and by script; not heard. Tools: Claude Code, FluidSynth, GeneralUser GS, numpy.
The user painted ten splash pictures from the prompts drafted earlier
four for the preamble's pages and six for the endings. Each went through PixelLab image-to-pixelart (1456x816 to 480x270), 10 generations, 916 to 906 left. The preamble now shows a painting a page with its words on a band along the bottom, and each ending has a screen of its own (painting, title, two paragraphs, Play again and Quit) that the court puts up when the verdict is given. Went wrong: six of the ten PixelLab calls had their connection dropped; the balance showed none were charged, and they went through on later tries with a pause between calls. A check that started a play session straight after stopping one got a plain player controller and failed until it waited for the real one. The first bands for the words covered two fifths of each painting, including the torn piece on the floor that The director's cut is about; they are under a third now. Checked by script and in pictures. Tools: Claude Code through the Unreal MCP, PixelLab, Pillow; the paintings are the user's.
For their writing pass, every line a player can read (313 lines, about 3,550 words) is now one Word document, writing/TruthOnStage_lines.docx: a code, where the line shows, and the line, in eleven sections in reading order. This PC has no Word and no Word library, and an install is the user's call, so Claude Code wrote the .docx by hand as a zip of XML; its parts pass the format's schema, and nobody has opened it in Word yet. A second script reads an edited copy back and writes the changed lines into the Blueprint sources; tested on a copy of the sources with all 296 rows edited the way Word would (split runs, curly quotes, a tracked deletion): 313 of 313 landed and nothing else changed. Tooltips, the game's only tutorial, now show in the game's own caption plate and font instead of the engine's small plain box: 53 of them over three screens. Went wrong: the first design was one tooltip Widget Blueprint, but a Widget Blueprint made in this editor session cannot be called from another screen's graph until the editor restarts, so each screen holds its own boxes; a function with no parameters needs an empty list or its first call is read as the parameters; a harness that moves the real mouse and photographs only the play window showed no tooltip at all, not even a plain one, so the hover is unverified and the user's first look decides; that harness's first picture was of the wrong part of the screen and was deleted unseen. Also: the newest packaged build starts with 0 errors (by script), all six ending screens were seen in pictures, and the credits were checked against the 447 assets (none missing). A Windows Firewall prompt for the Development build is on screen; the agent does not answer security prompts. Tools: Claude Code, the Unreal MCP (widget DSL, editor Python), lxml, Pillow. No generations spent.
Tools used so far, as one running list for the form's 'tools used' field (a draft; the user confirms the lines marked so)
Engine: Unreal Engine 5.9.0, a Blank Blueprint-only project: Blueprints, UMG, Paper2D sprites and flipbooks, the engine's packaging through the Unreal Automation Tool, its CSV profiler, and the Unreal MCP server with the Toolset plugins (editor Python, Blueprint graphs written as text, scene capture, play sessions). AI tools: Claude Code (Claude Fable 5.2) for the design, every Blueprint and screen, the level, the scripts, the notes of the music and the first draft of the writing; PixelLab for the character sprites, their animations, the pixel versions of the paintings and the interface pieces; Meshy for the 3D set pieces and props; Codex with its image tool for the redraw step between a concept and a sprite; the painting tool for the eleven splash paintings (the user to name it); Suno for four music tracks that were replaced and are not in the game (the user to confirm it is listed at all). Scripts and other software: Python with Pillow and numpy (pixel tiles, marks, sprite sheets, measuring audio), the jam kit's sfx.py (sound effects from recipes), FluidSynth with the GeneralUser GS SoundFont (rendering the music from MIDI), ffmpeg (trimming and levelling sounds), Sprite Fusion Sprite Normals (normal maps for the sprites), lxml (checking the writing document), git. Outside assets, listed in CREDITS.md and not scored: Kenney's CC0 sound packs, the GeneralUser GS SoundFont, the Pixelify Sans font.
Lighting pass, on the user's note that the stage itself was too bright
Claude Code measured the game's own pictures (HighResShot in a play session, brightness of boxes with Pillow) while changing lamps live through the editor's Python tool. Went wrong first: a third off every lamp moved the pale disc only from 188 to 179 of 255, because it sits high on the tone curve, and the exposure is fixed. Found by switching lamps off one at a time: in the fight most of the brightness was haze lit by the two beam lamps, then the fairy's own lamp and the footlights; the big lamps overhead hardly reach the figures. Settled: key 460 to 130 candelas, fill 240 to 45, sides 300 to 70, back 320 to 80, beams 320 to 220 with thinner haze, footlights 45 to 40. The disc is now 137 at the model (was 188) and the boards read as wood. All scripted checks pass. Not seen: the packaged game, or any of it by hand.
467.4 MB zipped, 47% of the limit, unzipped to C:\Jam\Builds\Hour33. Not started by script this time: the user is at the PC, and a new build folder puts a game window and a firewall prompt on their screen.
Card motion pass, asked for and approved by the user
cards deal in from the deck, grow under the cursor, can be picked up and carried (let go above a line to play, anywhere else and they go back), fly to the baroness when played and tumble to the discard; leftover cards and the shuffle fly as card backs; her confession comes to the middle and is ripped in two; a printed card rises out of the truth device and flies to the tray. Claude Code wrote it as text graphs through the editor's Blueprint tool: the rules stay instant and the motion is a render transform set every tick, because the tools cannot author animation tracks. Went wrong: the first write used a widget lookup that graphs cannot call, and the failed write silently dropped the fight's actor from the editor's copy of the level (the saved level still had it); a pool of eight card backs overflowed when a hand and a shuffle flew together; the hand flashed in place for one frame before moving. Checked by frames of the play window and by a script driving the real mouse for the drag. No generation spent: the card back and torn halves are cut by script from pieces already made. Not checked: how it feels by hand.
467.4 MB zipped, 47% of the limit, unzipped to C:\Jam\Builds\Hour34. Started once by script: the stage map, the right game mode, 0 errors, 15 warnings (the editor-only toolset's manifests, as before). It sat on the first page of the preamble, so the packaged game's own card motion has not been seen: the user plays tonight.
The dev log gets a website, built but not published
The user: 'Let's switch gears and look at the dev log setup. My cloudflare pages and wrangler should be installed locally.' Claude Code found wrangler 4.149 signed in with Pages access and no project for this jam yet, then wrote devlog/build_site.py: it turns DEVLOG.md into one page (each entry's first sentence becomes its headline, the sentences that say what went wrong or was not checked get a coloured mark, pictures are made smaller), and CREDITS.md into a second page, in the game's own colours and pixel font. Before it finishes it searches what it wrote for an email address, a user folder or anything shaped like a key, and stops if it finds one. Went wrong: that search first flagged twelve of the site's own picture file names as keys, because they are long; links are now left out of it. Checked in a real browser by script at three widths (17 of 17 screens). Nothing is uploaded: publishing is the user's step. Pictures here are the two passes from this morning, the lighting before and after and six moments of the card motion. Next: the user's play of build Hour34 tonight; 59 hours left.
The dev log is published, on the user's word ('Publish it, but the name should be Demon-Lord-Sword-Games')
https://demon-lord-sword-games.pages.dev/ on Cloudflare Pages, uploaded with wrangler by Claude Code from the folder devlog/build_site.py makes. The user also named the one tool the site had not listed: Midjourney, which they used for the eleven paintings, the painting behind the card pictures and the concept images the two character sprites were drawn from. It is on the site's tools list now, and the two credits rows that said 'which tool: the user to say' say Midjourney. Went wrong on the way: the first commit of the site picked up wrangler's local cache, which names the account; it was taken out of the commit and the folder is ignored now. A link to Friday's entries took seconds to arrive, because the page scrolled there smoothly over some 40,000 pixels; smooth scrolling is off. Each later update of the site is a new upload and waits for the user's go-ahead.
The dev log site grows a pictures page and a builds page, on the user's ask ('I want to include indev screenshots you've been taking and also links to the builds of the game'). Claude Code laid all 399 screenshots on disk out on six contact sheets, picked 90 and looked at each, and turned seven runs of card-motion frames into short moving pictures; entries that had no picture of their own now borrow up to four from the hours they cover. Left out: anything showing the editor's panels, and four captures that also showed a Windows security dialog. Builds are 460 MB each and Pages takes 25 MB a file, so five milestone builds (jam hours 1, 12, 15, 25 and 34) were zipped again without their log folders and are uploading to a GitHub release on the user's account, their choice of host; the builds with the replaced Suno music are not among them. Found on the way: the packaged game does not carry the pixel font's licence text yet, so the zips have it added and the submission build needs it too. Went wrong: the site's first upload happened as a Cloudflare incident began (its status page: 'an issue with Workers API availability', from 15:31 UTC), and 45 minutes later the new address still answers with error 523 while the user's older Pages sites answer normally; Cloudflare's own API answered 503 when asked. The page will be uploaded again once the user has said yes to the new version.
The dev log site is live with its pictures and builds pages, on the user's second 'Publish it'
https://demon-lord-sword-games.pages.dev/ . Cloudflare's API was down for about 50 minutes around the first upload (it answered 503 to wrangler, and the new address answered 523 the whole time); a script retried each minute, one upload failed halfway at 10:00 and the next went through at 10:19, and the page answered at once. Checked by fetching the live pages: the log with 54 entries, the pictures page, the builds page with five links, the credits, a picture, a moving clip and the font. The five builds are a public GitHub release on the user's account, published at 15:55 UTC; each download link was tested by its first byte, none was downloaded whole or run from the download. This entry is not on the site yet: each upload waits for the user's go-ahead.
Camera and hits in the fight, and the licences in the build, on the user's 'Continue on to next items'
Claude Code added to the fight's motion file: the camera punches in when a played card lands (more for a printed card), creeps closer over a turn, shakes when her reply takes credibility and leans toward the loser at the end; a cream star bursts behind the landing card and a red one on the Investigator. All of it is the lens angle, a few units of position and a degree and a half of turn, because each camera is focused at a fixed distance and the marks over the figures sit at fixed places on screen. The bursts are two stars drawn by script at 48 pixels and shown at four times that; no generation, and the engine's particles stay untried. Not built: a sweep into the fight, because the view changes behind the title card and would not be seen. Also fixed: the packaged game did not carry the pixel font's licence, which that licence asks for; a Licenses folder is now copied into every build by one line of project config. Went wrong: the first burst was mostly hidden by the card it sits behind, so it was made half again as big, and that size has not been filmed. Build Hour36: 467.5 MB zipped, the two licence files are inside it, it starts by script with 0 errors. Not seen: the lean at the end of a fight, the creep, and any of it by hand; the user plays tonight. 57 hours left.
The user confirmed the team is Demon Lord Sword Games, so the submission zip will be DemonLordSwordGames_TruthOnStage (the builds so far were zipped under a placeholder), and sent the team's logo, a red sword through the letters D, L and S, with 'Run pixelization on the logo and add it to the site'. Claude Code converted it with PixelLab's image-to-pixelart at 256 by 256, the same settings as the paintings: 1 generation, balance 906 to 905, 37 colours, faithful on the first try. It sits beside the name on every page of the dev log, at the top of the first page, and as the browser tab's icon; it is for the site only and is not in the game. Went wrong: the first try never reached PixelLab, because the shell rewrote the endpoint '/image-to-pixelart' into a Windows path; nothing was sent or charged. The user also asked for the writing document on their remote device, and it was sent to them.
A click no longer plays a card, on the user's word
'we should cut click to play and only use dragging past the line.' Claude Code pointed the screen's click at a new event that only acts while a swap is waiting, so a card is now played only by carrying it well above the hand and letting go; a carried card grows and straightens once it is past the line. A click still picks the card for a swap. The scripted fights were untouched, because they call the play rule directly; two checks that clicked a card now check that the click does nothing. Went wrong: the check with the real mouse could not run, because a Windows Security prompt from the last build started was holding the foreground and the agent does not answer those; the new guard and the growth past the line have only been read. One line of text is now wrong, the card's tooltip ('Press it to play it'), and it waits for the user's writing document, since no line of text changes until that is back. Packaged as build Hour37, the first zipped under the team's name, DemonLordSwordGames_TruthOnStage: 467.5 MB, licences inside. Not started by script, to keep from stacking another prompt on the user's screen.
The user sent their edited copy as an Apple Pages file, not Word, with 'Check for typos before integrating'. No Pages reader exists on this PC, so Claude Code wrote one: a .pages file is a zip of Snappy-compressed protobuf streams, and about 200 lines of plain Python (a Snappy decoder, a protobuf walker, the tables' string lists and cell tiles) read all 296 rows on the first run; 274 came back word for word, which is how it was trusted. 22 rows had changed, and the tool written two nights ago put every one back into the Blueprint sources at the first try, because no line of text had been touched since the document went out. Typos found: 'cannnot', a full stop inside a list, two sentences run together, and the card tooltip still telling players to press a card after clicks stopped playing them this morning. Went wrong: the confession card's new text was 75 characters and its last word fell off the bottom of the card, seen in a picture; its first two words were shortened to one and it fits. Left as the user wrote them and reported back: 'tied up in a summary bow' and 'a writ bill'. Found and not fixed: on the questioning page, with all four claims struck, the last claim's second line is cut off. All scripted checks pass. 56 hours left.
with all four of her claims struck out, the last claim's second line fell off the bottom of the page. Found in a picture taken to check the rewritten lines, not by any scripted check. The cause was two empty text blocks on that page, each still taking a line; the screen now folds an empty block away. Checked in pictures of all four states of the page, and every scripted check passes. The user kept two phrases flagged in the typo check as written ('it's authentic'), and bought a domain for the dev log; wrangler has no command to put a domain on a Pages project, so that step is theirs in Cloudflare's dashboard.
Packaged the build with the questioning page fix as Hour39 (unzipped to C:\Jam\Builds\Hour39)
Not started by script: the Windows Security prompt is still on the user's screen. The dev log site was refreshed on the user's word ('Make both fixes') and has 61 entries.
the user bought demon-lord-sword.com, put it on the Pages project in Cloudflare's dashboard themselves (wrangler has no command for it), and the site answered there with a valid certificate before the dashboard had finished saying 'Verifying'. Each page now names its address on that domain, and the GitHub release notes link to it. Then, with the user away, Claude Code checked things nobody had looked at: the fight at 16:10 and at 21:9 (the cameras keep their 16:9 picture, so everything measured from the middle of the screen still lands on the figures, and nothing needed changing), the camera's lean at the end of a fight and its creep over a turn (both seen), and the burst behind a landing card, which turned out to be invisible, cream on a white backdrop, and is gold with a dark rim now. Drafted SUBMISSION.md: the itch page text, the tools list, the pre-jam declaration, a shot list for the video and what is left to do by hand. Exported the prompt log for the user to read before any of it is published. Went wrong: an upload to Cloudflare timed out again and went through on a retry.
The user said 'Yes, try them' to two small effects with a 30-minute limit on learning the engine's particle tool (Niagara), which nobody here had driven before. Claude Code did it all through the editor's MCP server; nothing was drawn or generated. Both effects start from the engine's default particle system (an outside asset, now in the credits) with its numbers changed: a thin wisp that rises from the tip of the baroness's cigarette holder in the fight, and twelve puffs of dust round the rim of the disc when the stage shudders and will not turn. What went wrong: (1) the first wisp was pale and vanished against the white flats; grey-blue at higher opacity shows. (2) The dust had to be one burst, not a fountain that runs for ever, and the tool refused: 'Refusing to set input Loop Behavior: input is hidden by static-switch'. An input the editor hides cannot be set. The switch above it (Life Cycle Mode) had to go from System to Self first; then Once and a half-second length went in. (3) The session hit its usage limit part-way and the work was committed half done, then picked up again. (4) Her holder moves in her standing loop and the wisp does not, so when she draws on it the wisp hangs where the tip was. Left as it is. Then the user, watching the fight: 'slow down the idle animation loops in the fight, they repeat too quickly.' The sheets came in at 8 frames a second, a loop every 2 seconds for the two people and every 0.9 for Eiry. They are now 5 a second (3.2 and 1.4 seconds), set on the flipbooks themselves so the same figure stands the same way on the walk. Checked: the wisp and the dust in pictures from a play session, the loop lengths read back, and all the play checks. Not checked: any of it by hand in a packaged game. Next: package as Hour41. 55.7 hours left.
Two corrections from the user's eye, minutes after the particles went in
They looked at the pictures and said: 'the dust is too clustered together into clumps, rather than placed across the stage naturally. The baroness' smoke doesn't come out of the tip of her pipe, but close to the middle by her hand on the sprite.' Both were right. The smoke: Claude Code had placed it by judging a picture, and when measured it was 7 units off, toward her hand. Worse, her holder moves in her standing loop (to her mouth and back), so no single place is right. Now a script reads the tip straight from her sprite sheet (the rightmost solid pixel in the top half of each of the 16 frames), and every tick the fight moves the wisp to the tip of whichever frame is showing. The dust: twelve puffs round the rim became one burst of about 180 specks over the whole disc, by squashing the particle system's round spawn shape flat. That brought its own failure: the first scattered version could not be seen at all, because dust-coloured specks on pale boards are invisible; the second, brighter, looked like snow. The third is a warm off-white at about a third opacity. Checked: pictures of the fight at two of her frames with the wisp on the tip both times; pictures through a shudder; all the play checks. Not checked: by hand in a packaged game. Hour41, packaged just before this, has the old versions; Hour42 is being packaged with these. 55.5 hours left.
The user asked for "a 3d model of the truth device, used in some animations, literally printing out cards like a polaroid picture. Ideally some interaction with Eiry." Built by Claude Code through the Unreal MCP server. The model: Meshy text to 3D (meshy-t2.5, 5 credits for the shape, 10 for the texture, and 5 for a second, plainer candidate that was not used; 860 credits before, 840 after), a mahogany box camera with a brass lens ring, a crank and little brass feet. It replaces the small spyglass beside the model. Its pixel-art surface is the same free bake as the other props: three flat pictures taken in the editor, cut to 24 colours. What happens now when a look prints a card: after the stage's turn the view goes close on the device, Eiry (already gold) dives into the lens, it flashes, a blank card slides out of its face, she comes out and lifts the card up, and the picture comes up on it. Then the card on the screen takes over from the card in the world at the same place and size and flies to the tray while the view goes back to the model. Three seconds; a click skips it. The five card pictures are the tray card's own frame, painting and title put together by a script, so the world card and the screen card are the same card. What went wrong: (1) this model came in facing the other way from the twelve before it, so the bake photographed its back, a plain wooden panel; the bake now takes that model's face from the other side and mirrors it. (2) The first picture from that side was solid magenta: the backing block for the usual picture stood in front of the lens. (3) Close under the footlights the brass burned out white, so that one prop is painted at half brightness. (4) My six test pictures of the sequence all showed the same moment, because the editor's high-resolution screenshot holds the game's clock; the plain viewport capture does not. (5) The first hand-over could leave one frame with neither card, so the screen card is now placed in the same step that hides the world card. Checked: all 15 play checks pass, with five new lines for the close view, and I looked at stills of the whole sequence for two different cards. Not checked: it in motion at full speed, a real mouse click to skip, and the packaged game. Tools: Unreal Engine 5.9 (Blueprint graphs written as text, UMG, a point light, a second camera), Meshy, Python with Pillow and numpy.
467.9 MB zipped, 47% of the 1 GB limit, unzipped to C:\Jam\Builds\Hour43. It holds the new device and its close view of a card being printed. Nobody has started or played it yet.
The user: 'Add the fizzle.' When a look through the device prints nothing, Eiry now drops to the lens, the device sputters and gives a puff of grey smoke, and she backs off shaking from side to side, 1.1 seconds in the model view. Claude Code wrote it into the same generated graph as the print; the smoke is a third Niagara system copied from the stage dust with new numbers. What went wrong: I rebuilt only the device's own level pieces to add the smoke, which made a new close camera without its focus settings (those are set at the end of the full level build), so I ran the full build again before saving. Checked: 15 of 15 play checks pass with three new lines, and I looked at ten stills of one fizzle. Not checked: the sputter's light is too dim to see in my stills, and nobody has seen it in motion or in a packaged game. It is small on screen.
The user: "I think the pixel textures are lacking in detail and everything reads a bit wooden." Looking at the props up close showed why: the three dividing flats, the largest surfaces on the stage, were bare canvas; the castle wall and the headsman's block wore one repeating tile drawn by a script; and nearly everything was wood, canvas or grey stone. Three things were done, all by Claude Code driving PixelLab, Meshy and the Unreal editor. (1) The flats are painted scenery now, one scene per set across its two flats: a castle and a battlefield at sunset, a garden under the moon, a grey town square at dawn (PixelLab, 9 generations). A new material shows one picture on a flat's front and another on its back, because each flat stands between two sets. (2) The props' surfaces get a PixelLab pass: the flat picture already baked from each model is the starting image and PixelLab paints over it, kept inside the prop's own outline (15 generations for the rack, the rampart, the block and the rail). The rampart has stone courses, a plank door, moss and a pennant; the block is dark oak with iron bands. (3) Six dressing props from Meshy (90 credits), two to a set, for cloth, fire and flowers: a war banner, barrels with spears, a brazier, a basket of straw, an urn of roses, a lamp post; their surfaces went through the same repaint (16 generations). PixelLab 905 generations before and 865 after; Meshy 840 credits before and 750 after. What went wrong: the first backdrop was bands of sky with a castle the size of a thumbnail, because the starting image was held too hard (60; 25 worked). One battlefield had a second sun and one garden had the Earth for a moon; a corner of one picture had a scribble like a signature, which is painted out. The first repaints changed almost nothing: a flat grey wall stays flat grey whatever the words say, so the old stone tile is laid over the grey before it is sent, and the block's picture is darkened first. A request 241 pixels wide was refused (sizes must divide by 4; not charged). The banner's cloth was invisible from the front because it is a single sheet and the material was one-sided. The rose urn came back as a tidy bunch on a model with a wide spray, which left black shards, now filled from the nearest painted pixel. And one of my text replaces hit two functions at once and broke the level builder until I took it out of the wrong one. Checked: 15 of 15 play checks pass; I looked at the model, the walk and the fight in play sessions, and at every flat face straight on in the editor. Not checked: the romance and execution sets in a play session, anything in motion, the packaged game. Not done yet: the other props' repaints, the balcony, the stage's boards, and making metal shine.
469.2 MB zipped, 47% of the 1 GB limit (1.3 MB more than before the 3D pass), unzipped to the builds folder as Hour45. It holds round 1 of the 3D quality pass. Nobody has started or played it yet.
The user: "Continue on to round 2, drop round 3. Let's look into drawing thicker outlines with code. I'm also noting that the current shadows cast by props are fairly light. Maybe some point lighting could help without blowing everything out since we're mostly lit from above." All of it by Claude Code. (1) The remaining props went through the PixelLab repaint (12 generations; 865 before, 853 after): the rose bower, the axe, the blade, the star, the backdrop and the balcony, which now has sandstone blocks, ivy and a flagstone floor. (2) The stage's boards are redrawn by the script: each board has its own tone, grain, knots and nails, with worn and stained patches. (3) Metal shines and fire glows: a script marks, by colour, which pixels of each prop are steel, brass or iron and which are flame or lamp glass, and the material makes the first catch the lamps and the second give light. (4) An ink line round every prop, drawn by a post-process material: props write to a separate depth buffer, and a pixel that shows a prop is darkened when something a couple of pixels away is much further off. It works from any camera, and a character in front of a prop is not drawn over. (5) Shadows. The user suggested point lights; I added three at prop height (the brazier's fire, the lamp post's lantern, a sunset glow behind the battle set), but they were not the main answer. Switching lights off one group at a time in a play session showed the six footlights were what washed the shadows out: floor level, in front, no shadows of their own. They went from 40 to 24, every stage lamp now casts shadows, and the bounced light off the pale boards is turned down. Nothing is lit brighter than before. What went wrong: one repaint came back with made-up words on little signs and was thrown out. The sunset light at 5 candelas burned the fight's backdrop posts white (it is 1.6 now). Polished brass and a polished lens burned the device out in its close view, so the device got less. My first redrawn boards had patches strong enough to look like camouflage. And two of my patch commands did not parse in the shell and changed nothing until I put them in script files. Checked: 15 of 15 play checks pass; I looked at the model, the walk, the fight and the device's close view in play sessions after each change. Not checked: whether the outline shimmers when the stage turns, whether the extra shadows cost frames, the romance and execution sets close up in play, and the packaged game. The model view is noticeably darker round the stage now, which is the user's call.
470.5 MB zipped, 47% of the 1 GB limit, unzipped to the builds folder as Hour46. It holds rounds 1 and 2 of the 3D quality pass. Nobody has started or played it yet.
The user: 'I think the curtain in the background needs a similar touch up.' It was a 64-pixel tile drawn by a script, the same two folds repeated across sixteen metres of velvet with no top and no hem. Claude Code had PixelLab paint one whole drop of curtain, 400 by 400: a swagged valance with gold fringe and tassels, shaded folds, a gold hem (2 generations; 853 before, 851 after). A script sets the drop beside its mirror image so it repeats without a seam, and the tile material was taught that this one tile covers the curtain's full height. What went wrong: the first request dropped its connection, so I read the balance before sending again (it had not been charged); the first picture that did come back was flat stripes because the starting image was held too hard; and a careless text replace left one line of a script indented wrong, which the editor refused to load. Checked: 15 of 15 play checks pass and I looked at the model, the walk and the fight in play sessions. Not checked: the side curtains close up, and the packaged game.
The user picked this from a list of things I could do while they were busy. The close view of a card being printed had one sound, played before anything moved. Claude Code wrote five new ones as recipes for the jam kit's sound script (sines, squares and noise, no recordings): a bright slide as Eiry dives into the lens, a shutter click with a thump, a small motor with a ratchet as the card slides out, four soft notes as the picture comes up, and two coughs and a dying whine for the fizzle. Each is played once as the sequence's clock passes its moment, so a skipped view does not play the rest. The brazier's light now flickers (three sine waves on its strength) and the sunset glow breathes slowly. What went wrong: the shutter measured almost twice as loud as the game's other effects and was turned down; and my first flicker formula added three numbers in one sum, which no other graph in the project does, so I nested it before trying it. Checked: all four cues fire in order (read from the game five times a second), the fire's light read between 4.5 and 6.8 candelas, and 15 of 15 play checks pass. Not checked, and it matters: I cannot hear. Nobody has listened to any of these five sounds.
unzipped to the builds folder as Hour48, 47% of the 1 GB limit. It adds the device's five sounds and the flickering fire to Hour47. Nobody has started, played or listened to it yet.
The user asked for this from a list of things I could run alone. Claude Code read the 16-page Official Rules from start to finish against the kit's notes. The notes hold up, and five points went into the submission checklist: an entry may be submitted only once; the gameplay video counts as part of the entry, so it may show no logo or watermark either; the content rules include 'any illegal activity or substance' at the sponsor's discretion, which is the user's call for a murder mystery with a baroness who smokes; the form names a Team Owner; and the rules say nothing against sharing builds in progress but point at the jam page, which I cannot open because it sits behind a bot check. For the credits I asked the editor's asset registry for everything the start map refers to: 490 of the project's 604 assets are in the game. Every family of them had a credits row. I corrected three rows that named a use that has ended, added one missing row for three stock engine pictures the game's materials lean on, and listed the 114 assets that are in the project but not packed (the replaced Suno music, the first device model, old textures). The licence files do ship in the build. What went wrong: the PDF would not open with my file reader, so I converted it to text with another tool already on the PC; and the packaged build has no loose asset files to list, so the list came from the editor instead. Nothing was deleted. The jam page itself was not re-read: that one is the user's.