BurningTimesAi/공유/기획/FirstRising/맵/tools/map_tune5.py

74 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
# 맵 정의 조정(2026-09-28 BT38): 오염된 던전(PlagueCatacomb)의 바닥을 던전 타일로 바꾼다.
# PD "오염된 던전의 바닥 텍스쳐가 너무 크고 퀄리티가 다른 맵에 비해 떨어지는 느낌이야 … 좀 더 자연스러운 던전 타일처럼 수정해줘"
# 원인(실측) 셋:
# ① 바닥을 덮은 큰 바닥돌 — 안쪽 장식 띠 '안쪽 깨진 바닥돌'이 10 m 짜리 바닥 판(GroundTileCATAM)을 '높이 0.04~0.1 m'에 맞춰 놓았는데,
# 판의 높이가 0.02 m 라 2~4.9 배로 커져(폭 21~69 m · 46장) 바닥 전체를 덮었다. 무늬도 그만큼 커지고 흐려졌다 → 띠와 풀을 걷어낸다
# ② 지형 층 — 바탕 = 무늬 없는 바위 8 m(512 픽셀 · 1 m 에 64 픽셀) · 공터 = 깨진 타일 4.7 m(512 픽셀 · 1 m 에 109 픽셀)
# → 팩의 던전 타일을 1024 픽셀 사본으로 만들어 4 m 로 깐다(1 m 에 256 픽셀 · 돌 한 장 0.5~1 m). 길 = 온전한 타일 · 공터 = 얼룩진 타일 · 강조 = 점액이 고인 타일.
# 세 타일은 줄눈 배치가 같아 층이 바뀌어도 줄눈이 이어진다. 바탕은 무늬가 다른 흙 · 자갈(5 m)로 두고 얼룩으로 덧칠해 4 m 마다의 되풀이를 깬다
# ③ 돌판 다리(독액 수로 위 상판) — 같은 10 m 바닥 판이라 돌 한 장이 2~3 m → 바닥과 같은 타일을 입힌 판(FRMap_dun_deck)으로 바꾼다
# 텍스처는 texderive_dungeon.py, 다리 판은 tools/unity_eval/make_dun_deck.cs 가 만든다. 여러 번 돌려도 같다.
# 실행: python map_tune5.py [--no-backup] → 그 뒤 유니티에서 맵을 다시 짓는다(소품이 바뀌므로 Repaint 만으로는 안 된다)
import io, json, os, shutil, sys, time
ROOT = r"C:\BurningTimes\FirstRising\Assets\BurningTimes\Maps"
NAME = "PlagueCatacomb"
TEX = "Assets/BurningTimes/Maps/PlagueCatacomb/Textures/"
DECK = "Assets/BurningTimes/Maps/PlagueCatacomb/Deck/FRMap_dun_deck.prefab"
BACKUP = r"E:\BurningTimes\공유\개발팀_백업\FirstRising\maps_json_" + time.strftime("%Y%m%d_%H%M")
def layer(name, role, tex, tile, tint, nscale=0.6):
return {"name": name, "role": role, "albedo": TEX + tex + ".png", "normal": TEX + tex + "_N.png", "tile": tile, "normalScale": nscale, "tint": list(tint), "smooth": 0.0}
def overlay(name, scale, cover, soft, open_, route, area, boss, seed):
return {"layer": name, "scale": scale, "cover": cover, "soft": soft, "open": open_, "route": route, "area": area, "boss": boss, "seed": seed}
def main():
path = os.path.join(ROOT, NAME, NAME + ".map.json")
if "--no-backup" not in sys.argv:
os.makedirs(BACKUP, exist_ok=True)
shutil.copy2(path, os.path.join(BACKUP, NAME + ".map.json"))
print("backup", BACKUP)
raw = io.open(path, "rb").read()
bom = raw.startswith(b"\xef\xbb\xbf")
d = json.loads(raw.decode("utf-8-sig"))
g = d["ground"]
before = [(l["name"], l["tile"], os.path.basename(l["albedo"])) for l in g["layers"]]
# 층의 차례 = 바탕 · 길 · 공터 · 강조(길 · 공터의 floor 번호가 이 차례를 가리킨다 — 차례는 바꾸지 않는다)
g["layers"] = [
layer("Catacomb_Dirt", "base", "FRMap_dun_dirt", 5.0, (0.86, 0.90, 0.78)), # 방 밖 · 벽 밑 + 타일 위의 흙 얼룩
layer("Catacomb_Tile", "path", "FRMap_dun_tile", 4.0, (1.12, 1.12, 1.02)), # 통로: 온전한 타일(동선이 읽히게 가장 밝게)
layer("Catacomb_TileWorn", "plaza", "FRMap_dun_tile_worn", 4.0, (0.94, 0.98, 0.86)), # 방 · 보스 자리: 얼룩진 타일
layer("Catacomb_TileSlime", "accent", "FRMap_dun_tile_slime", 4.0, (1.00, 1.00, 0.95)), # 오염 저수조 · 감옥 · 독액 가: 줄눈에 점액이 고인 타일
]
g["overlays"] = [
overlay("Catacomb_Dirt", 8.0, 0.30, 0.07, 0.60, 0.35, 0.85, 0.75, 19), # 흙 얼룩 — 무늬가 달라 되풀이를 깬다(가장자리는 좁게: 타일 위에 흙이 '쌓인' 모습)
overlay("Catacomb_Tile", 6.0, 0.30, 0.12, 0.50, 0.00, 0.85, 0.85, 33), # 덜 더러운 타일 — 줄눈이 이어지므로 가장자리를 넓게 푼다
overlay("Catacomb_TileSlime", 4.4, 0.12, 0.10, 0.50, 0.22, 0.75, 0.60, 47),
]
# ① 큰 바닥돌 걷어내기
gone_band = [b["name"] for b in d["bands"] if b["pool"] == "inner_slab"]
d["bands"] = [b for b in d["bands"] if b["pool"] != "inner_slab"]
gone_pool = [p["name"] for p in d["pools"] if p["name"] == "inner_slab"]
d["pools"] = [p for p in d["pools"] if p["name"] != "inner_slab"]
print("걷어낸 띠:", gone_band, "· 풀:", gone_pool)
# ③ 돌판 다리의 판 — 풀 'slab' 을 새 판 하나로
for p in d["pools"]:
if p["name"] != "slab":
continue
old = [os.path.basename(i["path"]) for i in p["items"]]
p["items"] = [{"path": DECK, "fit": "l", "a": 10.0, "b": 10.0, "occ": 0.0, "w": 1, "fade": False, "anchor": "c", "sink": 0.0, "block": "pass", "tilt": 0.0, "yoff": 0.0}]
print("돌판 다리의 판:", old, "→", os.path.basename(DECK))
text = json.dumps(d, ensure_ascii=False, indent=2)
io.open(path, "w", encoding="utf-8-sig" if bom else "utf-8", newline="\n").write(text + "\n")
print("앞:", before)
print("뒤:", [(l["name"], l["tile"], os.path.basename(l["albedo"])) for l in g["layers"]])
print("덧칠:", [(o["layer"], o["cover"], o["soft"]) for o in g["overlays"]])
main()