بنقرة واحدة
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.