내 작은 왕국 기획 위키

아트와 LPC 캐릭터

03 만드는 법

이 문서 안에서

사람 캐릭터 78명이 LPC 라이브러리에서 합성·구워지는 규칙과 파이프라인을 정합니다. 캐릭터 밖의 아트는 소리와 에셋 파이프라인마케팅 소재를 봅니다.

한 줄 요약 — LPC 라이브러리는 저작 도구이고, 게임에 실려 나가는 것은 구워진 시트 78벌뿐입니다.


1. 두 겹 구조

무엇게임이 읽는가
저작assets/lpc/(PNG 88,235장, 123.6 MB) + data/characters/*.json아니오
산출assets/sprites/characters/(PNG 141 + JSON 79, 2.22 MB)예 (import.meta.glob eager)

2. 벤더링 원본 (assets/lpc/)

상류 liberatedpixelcup/Universal-LPC-Spritesheet-Character-Generator 커밋 a5c186e0(2026-07-24), 벤더링 2026-07-25. PNG 88,235장 123.6 MB, 아이템 656개. pnpm lpc:catalogcatalog.json(3.5 MB)+catalog-credits.json(361 KB) 생성·커밋. 무결성 검사: layer_1 경로 실재 필수(실패→종료 1).

3. 시트 규격 (src/shared/lpc/constants.ts)

FRAME_SIZE 64, FRAMES_PER_ROW 13, SHEET_WIDTH 832, SHEET_HEIGHT 3456, BODY_TYPES male/female/teen/child/muscular/pregnant, DIRECTIONS up/left/down/right. 블록 15종:

블록시작행방향행컬럼fps지원 키
spellcast0478spellcast
thrust44810thrust, watering
walk8498walk
slash124610slash
shoot1641310shoot
hurt20166hurt
climb21168climb
idle22423idle
jump26458jump
sit30436sit
emote34436emote
run384812run
combat_idle42424combat
backslash46413101hslash, 1hbackslash
halfslash5046101h_halfslash

부분 시트: 요청 블록만 캐논 순서로 쌓음(sheetLayout()). 폭 832 고정, 인덱스 행×13+열. 실제 78명은 walk+hurt(42명), walk+thrust+hurt(29명), walk+shoot+hurt(7명). 마지막이 사냥꾼 7명뿐인 이유는 활 아트가 shoot 블록에만 있어서입니다(§6).

4. zPos — 그리는 순서

전역 zPos 오름차순 정렬(plan.tsplanCharacter). 기본 100.

구간대표 타입과 zPos
몸 뒤(-2~9)wheelchair -2, weapon -1/8/9, shadow 0, shield 2, cape/tail/wings/backpack 5, horns 7, quiver/furry_ears 8, hair/ponytail 9
몸~하의(10~30)body 10, socks 14, shoes 15/25, legs 20, dress 30
상의~갑주(35~90)apron 35/40, clothes 35, sleeves 35/36, overalls 38, vest 45, chainmail 50, jacket 55, arms/armour 60, shoulders 60/75, bauldron/sash 65, gloves/bracers 70, belt 70/80/90, ring 75, necklace 80, neck 90
머리(100~115)head 100, expression 101/106, eyes/ears/nose 105, eyebrows 106, beard 110/111, mustache 111, earrings/facial/wound 115
머리 위~몸 앞(120~150)bandana 120/125, updo 128, furry_ears 130, hat 130/135, visor 132, accessory 139, weapon 140/141/150, ammo 150

5. 팔레트 리컬러

recolorRgba(src/shared/lpc/palette.ts): 투명 건너뜀, 알파 불변, MATCH_TOLERANCE = 1, 첫 매칭 정지. 재질 7종:

material기본 버전base 색팔레트 수
bodyulpclightulpc 22, lpcr 9
clothulpcwhiteulpc 24
hairulpcorangeulpc 26, lpcr 20
eyeulpcblueulpc 8, lpcr 7
metalulpcsteelulpc 8, lpcr 7
woodulpcmapleulpc 4, lpcr 5
alllpcrwhitelpcr 75

컬러키 형식: material.version.color / material.color / version.color / color. 선택값 없거나 "source" 면 스왑 없음.

6. 커스텀(오버사이즈) 애니메이션

64px 초과 동작은 별도 시트. 14종(src/shared/lpc/custom-animations.ts): wheelchair(64), tool_rod(128), slash_128(128), backslash_128(128), halfslash_128(128), thrust_oversize(192), slash_oversize(192), walk_128(128), thrust_128(128), slash_reverse_oversize(192), whip_oversize(192), tool_whip(192), tool_axe(128), tool_hammer(128).

작업 비네트가 재생하는 것은 직군 11종에 6가지입니다. 세 가지는 오버사이즈 블록이고, 나머지 셋은 표준 64px 행입니다 — 오버사이즈여야 할 이유는 연장이 프레임을 넘칠 때뿐입니다.

재생프레임직군왜 이것인가
tool_axe128나무꾼 · 광부도끼·곡괭이 궤적이 64를 넘습니다
tool_hammer128대장장이 · 가구 장인같은 망치질. 두 직군의 차이는 팔이 아니라 입니다(대장간 / 공방)
tool_rod128어부던진 낚싯대
slash_128128전사검격
thrust64농부 · 요리사 · 건축가 · 약초꾼호미·냄비·삽은 오버사이즈 블록이 없습니다. 약초꾼은 맨손 — 여기에 연장을 들려 주면 바구니가 간판인 직군에 농부의 호미를 붙이게 됩니다
shoot64사냥꾼활 아트가 표준 shoot 행에만 있습니다. walk 행에는 없어서, 광장을 걷는 사냥꾼은 맨손이고 비네트의 사냥꾼만 활을 듭니다

10 fps. 사냥꾼 7명은 활이 선언한 walk_128 시트(활 든 걷기)도 함께 구워집니다 — 재생하는 곳은 없지만, 커스텀 블록은 아이템이 선언하면 딸려 오고 def.animations 로 걸러지지 않습니다(1인당 약 16 KB).

7. 캐릭터 굽기 — pnpm lpc:bake

tooling/lpc/bake-characters.mjs. 베이커가 planCharacter()를 부릅니다. plan.warnings 시 종료 코드 1. 크레딧은 부분 베이크라도 전체 재집계.

8. pnpm lpc:* 절차

pnpm lpc:catalog — catalog 생성. pnpm lpc:bake [id] — 시트+CREDITS 갱신. node tooling/lpc/generate-cast.mjs — 시드 랜덤. node tooling/lpc/generate-villagers.mjs --roles R --force — 리스킨.

새 캐릭터: data/characters/<id>.json을 손으로(또는 작업대의 데이터 탭에서) 적고 → 저장(id ^[a-z0-9][a-z0-9-]*$) → pnpm lpc:bake → CREDITS 커밋 → pnpm test → 명부 연결 시 i18n 키 추가.


9. 라이선스 — 이 문서에서 가장 중요한 절

LPC 아트의 라이선스

LPC 라이브러리는 CC-BY-SA 3.0 / OGA-BY 3.0 / GPL 3.0 다중 라이선스로 배포됩니다. 이 프로젝트는 그중 CC-BY-SA 3.0 으로 사용한다고 명시했습니다(assets/lpc/README.md, assets/lpc/VERSION.json, CREDITS.md). 이 선택의 결과가 두 가지입니다.

CREDITS.md 가 46 KB인 이유

CREDITS.md 는 46,739 바이트, 837줄입니다. 그중 <!-- lpc-attribution:start --> 부터 <!-- lpc-attribution:end --> 사이(25~761행)가 41,443 바이트, 파일의 약 89% 입니다. 이 블록은 사람이 쓰지 않습니다. pnpm lpc:bake 가 매번 통째로 다시 씁니다.

현재 값입니다.

항목
크레딧 블록 수123
저자 수41
라이선스 문자열 종류15

15종 전부: CC-BY, CC-BY 3.0, CC-BY 3.0+, CC-BY 4.0, CC-BY 4.0+, CC-BY-SA 3.0, CC-BY-SA 3.0+, CC0, GPL 2.0, GPL 2.0+, GPL 3.0, GPL 3.0+, OGA-BY 3.0, OGA-BY 3.0+, OGA-BY-3.0. (마지막 두 개가 하이픈만 다른 같은 라이선스인 것은 상류 데이터의 표기 흔들림을 그대로 옮긴 결과입니다.)

블록 하나는 상류 파일 경로, 비고, 저자 목록, 라이선스 목록, 출처 URL 여러 개, 그리고 usedBy(어떤 캐릭터가 끌어왔는지)로 이루어집니다. 저자 한 명이 여러 아이템에 걸치므로 상류 `file` 기준으로 dedupe 합니다. 캐릭터 78명이 656 아이템 중 극히 일부만 쓰는데도 블록이 123개가 되는 것은, 캐릭터 base 하나에 여러 저자의 기여가 겹쳐 있기 때문입니다.

같은 데이터가 assets/sprites/characters/ATTRIBUTION.json 에도 JSON 으로 나갑니다.

자동화가 지키는 것

이 방식의 요점은 크레딧이 실제로 실려 나가는 것을 따라간다는 점입니다. 캐릭터에서 모자 하나를 빼면 다음 베이크에서 그 모자의 크레딧 블록이 사라지고, 새 갑옷을 입히면 그 저자가 자동으로 들어옵니다. 손으로 관리하면 반드시 어긋납니다.

지켜야 할 규칙입니다.

캐릭터 밖의 라이선스

대상저자 · 라이선스기록 위치
rpg_town 타일셋Jana Ochse / 2D-Retroperspectives, CC BY 4.0CREDITS.md, assets/tilesets/LICENSE_rpg_town.txt
전투 배경 30장 · 직업/광산 배경 18장이 프로젝트를 위한 오리지널 생성물, 제3자 라이선스 없음. bg-workshop.png(공방)·bg-thicket.png(사냥터) 는 2026-08-10 이미지 모델이 그린 그림으로 교체됨 — 원본 assets/raw/generated-ai/, 재현 scripts/process_generated_art.pyCREDITS.md
가축 닭·소 스프라이트Daniel Eddeland(daneeklu), CC BY 3.0 / GPL 2.0 — LPC style farm animals. 동물마다 걷기·먹기 두 시트를 한 장으로 합침(scripts/build_livestock_art.py, 닭 128×256 · 소 512×1024), 원본은 assets/raw/lpc-farm-animals/. 리샘플 없음 — 프레임 크기(32·128)가 곧 서로의 축척이라 같은 배율로 그려도 소가 더 큽니다CREDITS.md
가축 우리 배경·오두막같은 스크립트가 광장 팔레트로 그린 임시 그림, 제3자 라이선스 없음CREDITS.md
UI 아이콘스크립트 생성 오리지널, 제3자 라이선스 없음CREDITS.md
폰트 GalmuriSIL OFL 1.1. npm 패키지에서 3 face 만 골라 번들, CDN 요청 0src/shared/ui/fonts.css
오디오팩별 CC0 / 로열티프리 / 자체 생성assets/audio/CREDITS.txt
참고자료(OpenGameArt)아래 표assets/raw/CREDITS.txt
몬스터 스프라이트 138종기재 없음 — 미해결아래 참조

오디오와 아이콘의 세부는 소리와 에셋 파이프라인이 다룹니다.

assets/raw/CREDITS.txt — 참고만 한 자료도 기록합니다

assets/raw/ 에는 OpenGameArt 에서 받은 원본 zip 과 추출본이 있습니다. 여기 있는 픽셀아트는 게임에 직접 들어가지 않고 레퍼런스로만 썼으며, 파생 픽셀아트는 새로 그렸다고 기록돼 있습니다. 그럼에도 배포 빌드에 저작자 표시가 필요하다고 그 파일이 명시하고 있으므로, 아래 4건은 스토어 배포물에 들어가야 합니다.

자료저자라이선스쓰인 곳
[LPC] Farmbluecarrot16, Wolthera van Hövell tot Westerflier (TheraHedwig), Ivan VoirolCC-BY 4.0헛간·닭장·풍차·벌통·사일로 등 production-buildings 시트 디자인 참고
[LPC] Medieval Village Decorationsbluecarrot16 외 다수CC-BY-SA 3.0+시장 좌판·상점·마을 장식 디자인 참고
Farming Set (Pixel-Art)ScratchIOCC0작물·채소 아이콘 참고. 표시 의무 없음
[LPC] Fruit Treesbluecarrot16, Joshua Taylor, cynicmusic (castelonia 의뢰)CC-BY-SA 3.0+ / GPL 3.0과실수 성장 단계·과수원 배치 참고

미해결 — 몬스터 팩 라이선스

assets/raw/monster-packs/CREDITS.txt 는 팩 이름 15개(aesthetic-slimes, craftpix-fantasy, craftpix-slimes, craftpix-underwater, debts, elesrech, exclusiveolive, foozle, forest, insects, luizmelo, luizmelo2, matseb, starlines, stealthix)만 나열하고, "소스는 임포트 시점에 `~/Downloads` 에서 복사했다. 배포 전에 각 팩의 라이선스를 확인하라" 고 적어 두었습니다. 저자·라이선스·URL 이 하나도 기록돼 있지 않고, CREDITS.md 에도 몬스터 항목이 없습니다.

즉 현재 배포물에 들어가는 몬스터 스프라이트 138장의 저작·라이선스가 어디에도 기재돼 있지 않습니다. 스토어 등록 전에 반드시 처리해야 할 항목이며 구현 상태에 올려 둡니다. 몬스터가 어느 스테이지에 나오는지는 던전과 몬스터가 다룹니다.

새 에셋을 들일 때

  1. 라이선스를 먼저 확인합니다. 받기 전에 확인합니다. "나중에 확인"이 위 몬스터 팩의 상태를 만들었습니다.
  2. CC-BY-SA 계열을 들이면 파생물도 같은 조건이 됩니다. 이 저장소는 이미 CC-BY-SA 3.0 이므로 캐릭터 아트에는 문제가 없지만, 다른 계보의 에셋에 SA 를 섞을 때는 판단이 필요합니다.
  3. 원본을 assets/raw/ 에 남기고 그 옆 CREDITS.txt 에 출처·저자·라이선스·쓰인 곳을 적습니다. 레퍼런스로만 썼더라도 적습니다.
  4. CREDITS.md 에 사람이 쓰는 절을 추가합니다. 생성 블록 바깥에 씁니다.
  5. LPC 라이브러리를 갱신했으면 VERSION.json 의 커밋 해시와 날짜를 갱신하고 pnpm lpc:catalogpnpm lpc:bake 를 순서대로 돌립니다. 카탈로그 무결성 검사가 실패하면 복사가 덜 된 것입니다.
  6. AI/ML 학습 금지 조항을 확인합니다. 오디오 라이브러리의 Sonniss GDC 2026 번들이 그런 조항을 달고 있습니다(assets/audio/CREDITS.txt). Boolean SFX 는 재판매 금지입니다.

이어서 읽기

이 문서를 가리키는 곳