# -*- 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()