Forge categories
13
Melee-only prototype → melee + ranged + body customize forges (Q / R / E).
Case study · Personal project · May 2026 – Present
Draw-to-manifest sandbox in Unreal Engine 5 — the better you draw, the better it works.
Beyond Art is a third-person creative sandbox where player sketches become playable weapons, ranged gear, and body customizations. A hybrid vision + ink-metrics judge validates drawings and scores stats. The game ships on itch.io while the judge runs as a separate cloud service — so gameplay builds and AI logic update independently.
Baselines from the first playable slice (local melee forge + slow vision score) versus the shipped Mode B build on itch.io.
Forge categories
13
Melee-only prototype → melee + ranged + body customize forges (Q / R / E).
Playable object classes
215+
Sword / generic weapon → swords, axes, spears, daggers, pistols, rifles, bows, bazookas, legs, arms, and aliases.
Score-step latency
10–90s<1s
Ollama validate waits and Gemini score hangs → hybrid path scores with instant ink metrics after validate.
End-to-end “Judging…”
Hang / 60–180s~few sec
Stuck confirm UX and raised HTTP timeouts → validate + instant score; ink fallback when cloud Gemini fails.
Public Windows builds
02
No external players → itch.io channels 0.1.0 and 0.1.1 (~634 MB each).
Who can run the judge
1 PCAnyone
Mode A disk path on the author machine → Mode B HTTPS + Base64 to Render for packaged players.
Download package size
~1.15 GB634 MB
Raw Shipping folder over itch’s 1 GB web cap → butler-compressed Windows zip players can fetch.
Cloud Gemini reliability
Fail-closedPlayable
Datacenter IP blocks → soft-accept + local ink validate so melee / ranged / body still ship stats.
Distribution measured as public Windows builds on itch.io (versions 0.1.0 and 0.1.1). Swap in dashboard download / view / play counts when you want an exact player metric.
Most sandboxes give you a menu of items. Beyond Art gives you a blank canvas. Want to smash a building? Draw a sword, axe, or boxing gloves. Want to run faster? Draw legs. Want a ranged loadout? Draw a pistol, rifle, or bow — then draw the projectile art.
Three ideas stacked into one fantasy:
“The better you draw, the better it works” — the entire product promise in one sentence.
Invalid drawings are hard-blocked with a friendly message (empty canvas, obvious rectangles, wrong subject). Valid drawings always produce something usable, with stats clamped so balance doesn’t explode.
RT_DrawCanvas (additive / composite brush materials).Export Render Target → disk PNG under Saved/DrawingJudge/.LoadPngFileAsBase64 via FileSDK + Low Entry).
The game never embeds API keys. Unreal talks only to a small Python service —
judge_bridge.py — over HTTP/HTTPS JSON.
UE game → HTTPS POST (image_base64 + metadata)
→ Judge Bridge (Render / local)
→ Gemini Flash (or Ollama / local ink)
→ JSON stats back to Blueprints
local — instant ink heuristics (fast Blueprint testing).gemini — Google Gemini Flash vision (primary cloud path).ollama — local moondream / vision models for offline AI.openai — optional ChatGPT vision.Confirm runs two async HTTP calls (not one giant request):
POST /judge/validateimage_base64 (or local image_path), expected_subject, description, context.bValid, reject_reason, confidence, detected_subject.POST /judge/scoreink_area / context.damage + durability.stat_value.{
"image_base64": "<png bytes as base64>",
"image_path": "C:/.../weapon.png",
"expected_subject": "sword",
"description": "sword",
"context": "weapon"
}
GET /judge/ping gates online vs offline fallback so the game stays playable
if the bridge is down.
Local Mode A sent a disk image_path to a Python process on the same PC.
Packaged builds can’t do that for strangers. Mode B:
https://artgame-judge.onrender.com.GEMINI_API_KEY lives only in Render environment variables.Free-tier Gemini often works from a residential IP but fails from cloud datacenter IPs (403 / empty candidates). The bridge therefore:
Deployed as a Docker web service on Render (Dockerfile + render.yaml),
health check on /judge/ping, auto-deploy from GitHub
(Saarth09/ArtGame_Judge).
Http Request + bind On Request Complete; orchestration via custom events."true"/"false") for reliable field reads.DefaultEngine.ini [HTTP] activity timeouts raised to 180s for cold starts + vision latency.weapon / ranged / body_legs / body_arms route finish/fallback equip functions.Ink rectangle prefilter treated stick swords (span all four bbox sides) as boxes. Tightened border-ratio rules; Gemini soft-accept + cloud fallback.
Score path waited on flaky Gemini JSON. Switched score to hybrid ink metrics; ensure Blueprint routes ranged → ranged finish equip.
Same key/code; Gemini blocked from cloud IPs. Reproduced with live POST; shipped ink fallback so packaged players aren’t bricked.
UE 5.8 bans mid MSVC toolchains. Updated Visual Studio / MSVC 14.50+ so Shipping Win64 packages with FileSDK / Low Entry C++ plugins.
Web upload capped at 1 GB; ~1.15 GB package → butler / itch app channel push (windows), email verification, Public visibility.
| Change | What you ship |
|---|---|
| Gameplay, UI, levels, art | New UE Shipping package → butler push to itch (:windows) |
| Judge prompts, Gemini, validate rules | Git push judge repo → Render auto-deploy (no game rebuild) |
| Players | Internet required for judge; first hit may wait on free-tier cold start |
Live download: saarth09.itch.io/beyondart. Steam is feasible later with the same Shipping build; Mode B judge stays on Render.
Solo project end-to-end: design, UE gameplay/UI, Python judge service, cloud deploy, packaging, and distribution.
Playable Windows build public on itch.io. Core loop live: draw → validate → score → equip for melee, ranged, and body. Ongoing: balance tuning, more object classes, grip polish, and optional Steam release.