ThreeKingdomsSlingshot/Tools/make_ib_camp_textures.py

32 lines
1.5 KiB
Python
Raw Permalink Normal View History

스킬 이펙트 1차 + IB(쿠로네코) 연출 시험 — 돌진·조준 UI·타격감 (PD 2026-11-10) - 기본 공격(돌진) = IB 이펙트 그대로 시험: 앞 빛 물결 · 속도 꼬리(진영색 4색 · 멈춘 자리에서 0.12초 흐려짐) · WL 흙먼지 · 기준점 dash(아래로 갈수록 발 쪽) · 히트 이펙트 제거(PD 지정 대기) - 슬링샷 방향 결정 UI = IB GameTouchArrow 이식(IbAimArrow · IB 유닛 반지름 0.496 기준 비율) + 진행 중 캐릭터 연출(IbUnitMarks: 발밑 원 · 몸 빛 · 조준 중 속성 방울) · 값 표 Resources/Skills/ib_ui.csv - 기병: 복귀 영역(채운 원 · PreviewCavalryReturn) · 복귀 때 돌아서기(UnitView.TurnAround) - 타격감: HitFeel + CameraController.Shake · 표 hit_feel.csv(IB 흔들림 값은 디컴파일에 없어 추정값) - 액티브 스킬 1차 연출(Fable 제안 56 스킬 · 사본 Resources/Fx/TKS_Fx_Sk_*) · SkillVfx 확장(s_camp · f_fwd · f_drift · f_fade · s_over · b_flat · 트레일 페이드) · 셀화 셰이더 포트 - 2D 돌진 시험본(Dash2D · Aura2D test_aura) · 이전 시험 행은 skill_vfx.csv 에 # 주석 - 여포 크기: dz_boss_lvbu 몸 높이 819 → 718(깃털 제외 · 말 탄 유닛 머리 끝 상한 때문에 작아졌음) - 원본 = Assets/VFX/IB(쿠로네코 · GUID 유지 · Tools/wl_vfx_import.py --skip-scripts) · 사본 도구 Tools/make_ib_fx_copies.cs · make_ib_camp_textures.py · build_dash2d.cs - 테스트 PlayMode 118/118 통과 · 자동 재직렬화(png meta · UITheme · ProjectSettings) 제외 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 04:19:44 +00:00
"""IB 속도 꼬리 그림(Tail_Basic02 · 파랑이 그림에 들어 있음) → 진영색 그림 4장(PD 2026-11-10 「진영 색을 입히고」).
원본 Assets/VFX/IB/FGResources/Effect/Image/Tail_Basic02.png 는 그대로 두고 Assets/VFX/IB/_TKS/Tail_Basic02_<진영>.png 로 새로 만든다.
방법 = 채도 있는 픽셀만 색상(H)을 진영색으로 · 채도·밝기 유지(흰 심 그대로). 진영색 원본 = Tools/dash2d_camps.csv.
실행: python -I -X utf8 Tools/make_ib_camp_textures.py
"""
import colorsys
import csv
import os
from PIL import Image
HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(HERE)
SRC = os.path.join(ROOT, "Assets", "VFX", "IB", "FGResources", "Effect", "Image", "Tail_Basic02.png")
OUT = os.path.join(ROOT, "Assets", "VFX", "IB", "_TKS")
os.makedirs(OUT, exist_ok=True)
camps = list(csv.DictReader(open(os.path.join(HERE, "dash2d_camps.csv"), encoding="utf-8-sig")))
im = Image.open(SRC).convert("RGBA")
alpha = im.getchannel("A")
h, s, v = im.convert("RGB").convert("HSV").split()
for cp in camps:
hx = cp["s_hex"].lstrip("#")
r, g, b = (int(hx[i:i + 2], 16) / 255.0 for i in (0, 2, 4))
ch = colorsys.rgb_to_hsv(r, g, b)[0]
nh = h.point(lambda x: int(round(ch * 255)) % 256)
hsv = Image.merge("HSV", (nh, s, v))
# 채도 낮은 픽셀(흰 심)은 색상과 무관하게 거의 흰색으로 남는다
rgb = hsv.convert("RGB")
out = Image.merge("RGBA", (*rgb.split(), alpha))
out.save(os.path.join(OUT, "Tail_Basic02_%s.png" % cp["s_camp"]))
print("ok", sorted(os.listdir(OUT)))