원클릭으로
sprite-art
How to paint scenes, characters, and animations for SIGNAL's 2D pixel art cinematics
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
How to paint scenes, characters, and animations for SIGNAL's 2D pixel art cinematics
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Use this skill whenever introducing a new Go programming concept that needs to be explained visually to beginners. Triggers when the user asks to explain, illustrate, animate, or teach any Go concept — including but not limited to: variables, functions, packages, imports, structs, interfaces, goroutines, channels, error handling, maps, slices, pointers, closures, or methods. Also triggers when the user says things like "add a new scene", "introduce X concept", "animate how X works", or "show the next concept". Always use this skill before writing any animation code — it defines the entire design system, analogy model, and scene structure that all Go animations must follow.
How to write and extend beginner mode content — pre-level concept briefings for new players
How to add new game content (chapters, bosses, story) to SIGNAL
Audit engine output patterns for common Go pitfalls — ensures every step has targeted feedback for Printf/Println, whitespace, format mismatches, and other gotchas
How to write and tune AI system prompts for Maya's 3-tier LLM backend
How to write zen rules for new SIGNAL levels — idiomatic Go detection, jolts, suggestions, testing
| name | sprite-art |
| description | How to paint scenes, characters, and animations for SIGNAL's 2D pixel art cinematics |
| allowed-tools | Read, Write, Edit, Glob, Grep, Bash |
All visuals are painted programmatically with Canvas 2D — no external image assets. Scenes render in PixiJS during gameplay. Quality bar: rich pixel-art interiors with architectural depth, atmospheric lighting, and well-proportioned characters.
src/lib/sprites/
├── palette.ts # Central color palette (C.metalDark, C.skinMid, etc.)
├── scene-painter.ts # Background environments (cell, corridor, chase, vent, server)
├── character-painter.ts # Maya + Guard sprite frames
└── scenes.ts # Scene definitions (actors, camera, duration)
src/components/story/
├── PixiScene.tsx # WebGL renderer — composites scene + characters
├── CinematicScene.tsx # Full-screen intro/chapter-transition sequences
└── MayaAnimation.tsx # Bottom-right freeze-frame during gameplay
All colors come from palette.ts via the C object. Never hardcode hex values for recurring elements.
| Group | Examples | Use for |
|---|---|---|
C.metalDark/Mid/Light/Highlight | Infrastructure, pipes, beams, ducts | |
C.skinDark/Mid/Light | Maya's exposed skin (forearms, face, neck) | |
C.hoodieDark/Mid/Light/Accent | Maya's open hoodie | |
C.hairDark/Mid/Highlight | Maya's hair | |
C.guardArmor/Dark/Mid/Light/Accent | Guard's tactical armor | |
C.signalMid/Bright | Green accents, Maya's hair streak, wire glow | |
C.dangerBright | Red accents, guard visor, alarm lights | |
C.termBright | Cyan terminal glow |
Warm skin tones (#8a6850, #b08868, #c8a080) — never green-tinted.
Props MUST be sized relative to the character, not with fixed pixel values. Use ch = h * 0.32 as the character reference height, then size everything relative to it:
| Prop | Height | Width | Notes |
|---|---|---|---|
| Locker/cabinet | ch * 1.1 | ch * 0.34 | Slightly taller than character |
| Table | ch * 0.28 | ch * 0.48 | Waist-high |
| Stool | ch * 0.24 | ch * 0.20 | Thigh-high |
| Cot/bed | ch * 0.22 | ch * 0.9 | Low frame, body-length |
| Toilet | ch * 0.28 | ch * 0.24 | Knee-to-waist |
| Crate | ch * 0.20-0.24 | ch * 0.22-0.28 | Knee-high |
| Bucket | ch * 0.16 | ch * 0.13 | Shin-high |
| Food tray | ch * 0.06 | ch * 0.22 | Flat on floor |
This scales correctly at any scene resolution (640x420 test, 1040x600 in-game).
alarm=true. Red overlay, glowing alarm lights.drawLightCone(ctx, x, y, width, height, color) — triangular light wash from ceiling fixturesdrawLightRays(ctx, x, y, w, h, alpha) — visible god-ray beamsdrawSignalWire() with linear gradient glow — the green wire is a recurring motifdrawVignette() and drawAO() for post-processing depthSceneType union in scene-painter.tspaintScene() switchpaintXxx() function following the layer order aboveh * values (like wallBotY = h * 0.50)scenes.ts with actor positions on the floortest-visual/render-scene.html and .tsnpx playwright test test-visual/visual.spec.ts and inspect test-visual/screenshot.pngCharacters are painted at 48x80 pixels then scaled up by CHAR_SCALE (default 3) = 144x240 in scene.
5-head proportional model (SLYNYRD Pixelblog reference):
Key anatomy techniques:
drawTaperedLimb() interpolates width from top to bottomC.signalMid, with shadowBlur glow)C.hoodieAccentC.dangerBright, shadowBlur 8) with highlight streakWalk cycles use pose-based keyframes, NOT sinusoidal math. The WALK_POSES array defines 8 frames:
Frame 0: Right Contact — right foot strikes ahead, body dips
Frame 1: Right Down — weight absorbs onto right, LOWEST point
Frame 2: Right Passing — left leg swings past, body rising, trailing knee bends
Frame 3: Right Up — push off right, HIGHEST point
Frame 4: Left Contact — mirror of frame 0
Frame 5: Left Down — mirror of frame 1
Frame 6: Left Passing — mirror of frame 2
Frame 7: Left Up — mirror of frame 3
Each pose specifies: bob (body height), leftLeg/rightLeg (horizontal offset), leftArm/rightArm (vertical swing), leftKnee/rightKnee (bend amount).
Critical rules:
legDir = -1CharAnimation union typeFRAME_COUNT recorddrawMaya() / drawGuard() with per-frame pose dataWALK_POSES or create a new pose arraycaptured animation: body rotated, arms limp, head drooped, eyes closed. Drawn via drawMayaCaptured() with ctx.rotate().
PixiScene.tsx composites everything at runtime:
(0.5, 1) — feet position, so actor.y is where feet touch floorWith viewport 640x400 and padding 200:
y = 600 * 0.50 = 300. Character feet should be ~360-370.{x: 100, y: 50} shifts viewport origin.ch * multiplier for proportional scaling(0.5, 1). Check actor y matches floor line.#1a-#60+ range for backgrounds. Use #0a-#1a only for voids and deep shadows.ctx.globalAlpha = 1 — always reset after transparent draws.