diff --git a/AgentScripts/WL813e_Zones.cs b/AgentScripts/WL813e_Zones.cs
new file mode 100644
index 000000000..a87d0b966
--- /dev/null
+++ b/AgentScripts/WL813e_Zones.cs
@@ -0,0 +1,480 @@
+// 발주서 WL-813e — 군중 존 5개 + 보스 아레나(Anubis) 데이터 적용 검증 프로브
+//
+// 실행 (CLAUDE.md §1: using 금지 · 네임스페이스 풀어 쓰기)
+// 에디트 모드 : unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Edit --timeout 300
+// Play 60s : unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Watch (Play 중에만)
+// unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Result (감시 종료 후 결과)
+//
+// Edit() 가 재는 것 — 전부 AssetDatabase 읽기 전용, 씬/프리팹 변경 0:
+// (a) MonsterAppear.json 새 행 6개(813001~813005 · 813010) 존재·값
+// (b) WL_Nature.prefab 의 MobControlMgr 19개 → SpawnerID 가 실제 행에 붙는가 · 존 5개 재바인딩 확인
+// (c) s_AppearMonster 의 몬스터 ID 가 MonsterList 에 있고 Addressables 프리팹이 실존하는가
+// (d) FieldBossData 1기 — n_MonsterID/n_SpawnerId/RegenTime/isChapterBoss · MapData.m_ChapterPortal null 정합
+// (e) 동시 생존 수 · 인스턴스 풀 총계 (MobControlMgr.Get_Mobs 규칙 재현: Random/Order = ×2 · Phase* = 종류×수)
+// (f) 보스 아레나 좌표의 NavMesh 도달성 (WL_Nature_NavMesh.asset · SamplePosition + CalculatePath) — 813b 미확인 ③
+//
+// 수치·경로는 전부 프로젝트 데이터에서 읽는다(C45). 프로브 상수는 "어디를 보나" 뿐이다.
+
+public static class WL813e_Zones
+{
+ const string kAppearJson = "Assets/ResWork/Table/Export/MonsterAppear.json";
+ const string kListJson = "Assets/ResWork/Table/Export/MonsterList.json";
+ const string kMapPrefab = "Assets/Res_Addr/Map/WL_Nature.prefab";
+ const string kNavAsset = "Assets/WL/Settings/WL_Nature_NavMesh.asset";
+ const string kMobFmt = "Assets/Res_Addr/Mobs/{0}.prefab";
+ const string kOutDir = "AgentScripts/staging/WL813e";
+ const string kEditLog = kOutDir + "/ZONES_EDIT.txt";
+ const string kPlayLog = kOutDir + "/ZONES_PLAY.txt";
+
+ static readonly int[] kZoneIds = { 813001, 813002, 813003, 813004, 813005 };
+ const int kBossRowId = 813010;
+
+ static System.Text.StringBuilder s;
+ static void L(string t) { s.AppendLine(t); UnityEngine.Debug.Log("[WL813e] " + t); }
+
+ /// 텍스트 편집으로 바꾼 프리팹·JSON 을 에디터 캐시에 반영한다(상주 에디터에서 필수).
+ static UnityEngine.GameObject LoadMap()
+ {
+ UnityEditor.AssetDatabase.ImportAsset(kMapPrefab, UnityEditor.ImportAssetOptions.ForceUpdate);
+ UnityEditor.AssetDatabase.ImportAsset(kAppearJson, UnityEditor.ImportAssetOptions.ForceUpdate);
+ return UnityEditor.AssetDatabase.LoadAssetAtPath(kMapPrefab);
+ }
+
+ static string Abs(string rel)
+ {
+ return System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(),
+ rel.Replace('/', System.IO.Path.DirectorySeparatorChar));
+ }
+
+ static string Flush(string path)
+ {
+ try
+ {
+ System.IO.Directory.CreateDirectory(Abs(kOutDir));
+ System.IO.File.WriteAllText(Abs(path), s.ToString(), new System.Text.UTF8Encoding(true));
+ }
+ catch (System.Exception e) { UnityEngine.Debug.LogWarning("[WL813e] 로그 저장 실패: " + e.Message); }
+ return s.ToString();
+ }
+
+ // ── 아주 얕은 JSON 배열 파서 (행 = {"k": "v", ...}) ───────────────────────
+ static System.Collections.Generic.List> ReadRows(string relPath)
+ {
+ var list = new System.Collections.Generic.List>();
+ var txt = System.IO.File.ReadAllText(Abs(relPath), new System.Text.UTF8Encoding(true));
+ foreach (System.Text.RegularExpressions.Match m in
+ System.Text.RegularExpressions.Regex.Matches(txt, "\\{[^{}]*\\}"))
+ {
+ var d = new System.Collections.Generic.Dictionary();
+ foreach (System.Text.RegularExpressions.Match kv in
+ System.Text.RegularExpressions.Regex.Matches(m.Value, "\"([^\"]+)\"\\s*:\\s*\"([^\"]*)\""))
+ d[kv.Groups[1].Value] = kv.Groups[2].Value;
+ if (d.Count > 0) list.Add(d);
+ }
+ return list;
+ }
+
+ static string G(System.Collections.Generic.Dictionary d, string k)
+ {
+ string v; return d.TryGetValue(k, out v) ? v : "";
+ }
+
+ // ══════════════════════════════════════════════════════════════════════
+ public static string Edit()
+ {
+ s = new System.Text.StringBuilder();
+ L("===== WL-813e 존 리듬 + 보스 아레나 데이터 검증 =====");
+ L("playMode=" + UnityEngine.Application.isPlaying + " · unity=" + UnityEngine.Application.unityVersion
+ + " · buildTarget=" + UnityEditor.EditorUserBuildSettings.activeBuildTarget);
+ L("");
+
+ var appear = ReadRows(kAppearJson);
+ var mlist = ReadRows(kListJson);
+ var byAppear = new System.Collections.Generic.Dictionary>();
+ foreach (var r in appear) byAppear[G(r, "n_SpawnerID")] = r;
+ var byMob = new System.Collections.Generic.Dictionary>();
+ foreach (var r in mlist) byMob[G(r, "n_MonsterID")] = r;
+
+ // ── (a) 새 행 ────────────────────────────────────────────────────
+ L("── (a) MonsterAppear 새 행 (전체 " + appear.Count + "행) ──");
+ int newOk = 0;
+ var wanted = new System.Collections.Generic.List(kZoneIds); wanted.Add(kBossRowId);
+ foreach (var id in wanted)
+ {
+ System.Collections.Generic.Dictionary r;
+ if (!byAppear.TryGetValue(id.ToString(), out r)) { L(" [에러] 행 없음 " + id); continue; }
+ newOk++;
+ L(string.Format(" {0} Lv{1} ATK {2} DEF {3} HP {4} · {5} {6} · 최대 {7}마리 · 리젠 {8}s · 순찰 {9} · Exp {10} Gold {11}",
+ id, G(r, "n_AppearMonsterLv"), G(r, "n_MonsterATK"), G(r, "n_MonsterDEF"), G(r, "n_MonsterHP"),
+ G(r, "e_SpawnerType"), G(r, "s_AppearMonster"), G(r, "n_MaxMonsterCount"), G(r, "f_SpawnerDelay"),
+ G(r, "f_PatrolRange"), G(r, "n_DropExp"), G(r, "n_DropGold")));
+ }
+ L(" 새 행 " + newOk + " / " + wanted.Count);
+ L("");
+
+ // ── (b)(c)(e) 맵 프리팹의 스포너 ────────────────────────────────
+ var root = LoadMap();
+ if (root == null) { L("[에러] 맵 프리팹 로드 실패: " + kMapPrefab); return Flush(kEditLog); }
+
+ var mgrs = root.GetComponentsInChildren(true);
+ L("── (b) " + kMapPrefab + " 스포너 " + mgrs.Length + "개 ──");
+ int bound = 0, unbound = 0, zoneHit = 0, alive = 0, pool = 0, mobMissing = 0;
+ for (int i = 0; i < mgrs.Length; i++)
+ {
+ var m = mgrs[i];
+ var p = m.transform.position;
+ System.Collections.Generic.Dictionary r;
+ bool has = byAppear.TryGetValue(m.SpawnerID.ToString(), out r);
+ if (!has) { unbound++; L(string.Format(" [에러] {0} SpawnerID {1} → MonsterAppear 행 없음 (MobActor.cs:62 null → MyValue 에서 NullReference)", m.name, m.SpawnerID)); continue; }
+ bound++;
+ bool isZone = System.Array.IndexOf(kZoneIds, m.SpawnerID) >= 0;
+ if (isZone) zoneHit++;
+
+ int cnt = 0; int.TryParse(G(r, "n_MaxMonsterCount"), out cnt);
+ var ids = G(r, "s_AppearMonster").Split('|');
+ string type = G(r, "e_SpawnerType");
+ int inst = (type == "Phase" || type == "PhaseAllKill") ? ids.Length * cnt : cnt * 2;
+ alive += cnt; pool += inst;
+
+ int miss = 0;
+ for (int k = 0; k < ids.Length; k++)
+ {
+ System.Collections.Generic.Dictionary mr;
+ if (!byMob.TryGetValue(ids[k], out mr)) { miss++; L(" [에러] MonsterList 에 없는 ID " + ids[k]); continue; }
+ var path = string.Format(kMobFmt, G(mr, "s_MonsterPrefab"));
+ if (UnityEditor.AssetDatabase.LoadAssetAtPath(path) == null)
+ { miss++; L(" [에러] 프리팹 없음 " + path); }
+ }
+ mobMissing += miss;
+ L(string.Format(" {0,-3} SpawnerID {1,-7} pos=({2,6:F1},{3,5:F2},{4,6:F1}) range {5} · {6,-12} {7,2}마리 · 종류 {8} · 인스턴스 {9}{10}",
+ m.name, m.SpawnerID, p.x, p.y, p.z, m.MobGenRange, type, cnt, ids.Length, inst, isZone ? " ← 새 존" : ""));
+ }
+ L(string.Format(" 행 연결 {0} / 미연결 {1} · 새 존 {2}/5 · 몹 자산 누락 {3}", bound, unbound, zoneHit, mobMissing));
+ L(string.Format("── (e) 동시 생존 {0}마리 · 인스턴스 풀 {1}개 (MobControlMgr.Get_Mobs 규칙 재현)", alive, pool));
+ L("");
+
+ // ── (d) FieldBossData ───────────────────────────────────────────
+ var bosses = root.GetComponentsInChildren(true);
+ L("── (d) FieldBossData " + bosses.Length + "기 ──");
+ var mapCfg = root.GetComponentInChildren(true);
+ L(" MapData.m_ChapterPortal = " + (mapCfg == null ? "MapData 없음" : (mapCfg.m_ChapterPortal == null ? "null → isChapterBoss 는 반드시 0" : "있음"))
+ + " · spawnRequireReachableFromPlayer = " + (mapCfg == null ? "?" : mapCfg.spawnRequireReachableFromPlayer.ToString()));
+ for (int i = 0; i < bosses.Length; i++)
+ {
+ var b = bosses[i];
+ var p = b.transform.position;
+ System.Collections.Generic.Dictionary mr, ar;
+ bool hasMob = byMob.TryGetValue(b.n_MonsterID.ToString(), out mr);
+ bool hasRow = byAppear.TryGetValue(b.n_SpawnerId.ToString(), out ar);
+ string prefab = hasMob ? string.Format(kMobFmt, G(mr, "s_MonsterPrefab")) : "(MonsterList 행 없음)";
+ bool hasPrefab = hasMob && UnityEditor.AssetDatabase.LoadAssetAtPath(prefab) != null;
+ L(string.Format(" {0} pos=({1:F1},{2:F1},{3:F1}) MonsterID {4} · SpawnerId {5} · Regen {6}s · isChapterBoss {7}",
+ b.name, p.x, p.y, p.z, b.n_MonsterID, b.n_SpawnerId, b.RegenTime, b.isChapterBoss ? 1 : 0));
+ L(" MonsterList 행 " + (hasMob ? "O" : "[에러] X") + " · 프리팹 " + (hasPrefab ? "O " + prefab : "[에러] X " + prefab)
+ + " · MonsterAppear 행 " + (hasRow ? "O" : "[에러] X"));
+ if (hasMob)
+ {
+ float hpRate = 0f, atkRate = 0f, chase = 0f;
+ float.TryParse(G(mr, "f_BaseHPRate"), out hpRate);
+ float.TryParse(G(mr, "f_BaseATKRate"), out atkRate);
+ float.TryParse(G(mr, "f_BaseChaseRange"), out chase);
+ float hp = 0f, atk = 0f;
+ if (hasRow) { float.TryParse(G(ar, "n_MonsterHP"), out hp); float.TryParse(G(ar, "n_MonsterATK"), out atk); }
+ L(string.Format(" 실 HP = {0} × {1} = {2:N0} · 실 ATK = {3} × {4} = {5:N0} · 추적 사거리 {6} (MyValue.cs:370-371)",
+ hpRate, hp, hpRate * hp, atkRate, atk, atkRate * atk, chase));
+ }
+ if (b.isChapterBoss && mapCfg != null && mapCfg.m_ChapterPortal == null)
+ L(" [에러] isChapterBoss=1 인데 m_ChapterPortal 이 null → AfterDie 에서 NullReference (FieldBossData.cs:47-49)");
+ }
+ L("");
+
+ // ── (f) 아레나 NavMesh 도달성 ───────────────────────────────────
+ L("── (f) 아레나 NavMesh 도달성 (813b 미확인 ③) ──");
+ var navData = UnityEditor.AssetDatabase.LoadAssetAtPath(kNavAsset);
+ if (navData == null) L(" [미확인] NavMeshData 없음: " + kNavAsset);
+ else
+ {
+ var inst = UnityEngine.AI.NavMesh.AddNavMeshData(navData);
+ try
+ {
+ var start = root.transform.Find("Portal_Start");
+ UnityEngine.Vector3 pcPos = start != null ? start.position : new UnityEngine.Vector3(115f, 0f, 10f);
+ L(" 플레이어 시작 = " + (start != null ? "Portal_Start " : "(폴백 상수) ") + pcPos.ToString("F1"));
+ UnityEngine.AI.NavMeshHit ph;
+ bool pcOn = UnityEngine.AI.NavMesh.SamplePosition(pcPos, out ph, 5f, UnityEngine.AI.NavMesh.AllAreas);
+ L(" 시작 지점 NavMesh 스냅 = " + (pcOn ? ph.position.ToString("F2") : "[에러] NavMesh 밖"));
+ for (int i = 0; i < bosses.Length; i++)
+ {
+ var bp = bosses[i].transform.position;
+ UnityEngine.AI.NavMeshHit bh;
+ bool on = UnityEngine.AI.NavMesh.SamplePosition(bp, out bh, 5f, UnityEngine.AI.NavMesh.AllAreas);
+ L(" 보스 " + bosses[i].name + " " + bp.ToString("F1") + " → NavMesh "
+ + (on ? "O 스냅 " + bh.position.ToString("F2") + " (거리 " + UnityEngine.Vector3.Distance(bp, bh.position).ToString("F2") + "m)" : "[에러] X"));
+ if (on && pcOn)
+ {
+ var path = new UnityEngine.AI.NavMeshPath();
+ bool okc = UnityEngine.AI.NavMesh.CalculatePath(ph.position, bh.position, UnityEngine.AI.NavMesh.AllAreas, path);
+ float len = 0f;
+ for (int k = 1; k < path.corners.Length; k++) len += UnityEngine.Vector3.Distance(path.corners[k - 1], path.corners[k]);
+ L(" 시작→보스 경로 " + (okc ? path.status.ToString() : "CalculatePath 실패")
+ + " · 코너 " + path.corners.Length + " · 경로장 " + len.ToString("F1") + "m · 직선 "
+ + UnityEngine.Vector3.Distance(ph.position, bh.position).ToString("F1") + "m");
+ }
+ }
+ }
+ finally { UnityEngine.AI.NavMesh.RemoveNavMeshData(inst); }
+ }
+
+ L("");
+ L("===== 요약: 새 행 " + newOk + "/6 · 스포너 연결 " + bound + "/" + mgrs.Length
+ + " · 새 존 " + zoneHit + "/5 · 보스 " + bosses.Length + "기 · 몹 자산 누락 " + mobMissing + " =====");
+ return Flush(kEditLog);
+ }
+
+ // ══════════════════════════════════════════════════════════════════════
+ ///
+ /// 아레나 좌표만 문제인지, 이 맵의 NavMesh 가 원래 섬으로 끊겨 있는지 가른다.
+ /// 시작 지점 → 스포너 19 원점 · 보스 1 좌표의 CalculatePath 상태를 전부 찍는다.
+ /// (MapData.cs:36 — WL_Start 는 NavMesh 위 1144점 중 37% 만 도달 가능하다는 실측이 있다)
+ ///
+ public static string Nav()
+ {
+ s = new System.Text.StringBuilder();
+ L("===== WL-813e NavMesh 도달성 스윕 (" + kNavAsset + ") =====");
+ var root = LoadMap();
+ var navData = UnityEditor.AssetDatabase.LoadAssetAtPath(kNavAsset);
+ if (root == null || navData == null) { L("[에러] 프리팹 또는 NavMeshData 로드 실패"); return Flush(kEditLog); }
+ var inst = UnityEngine.AI.NavMesh.AddNavMeshData(navData);
+ try
+ {
+ var tri = UnityEngine.AI.NavMesh.CalculateTriangulation();
+ L("NavMesh 삼각형 " + (tri.indices.Length / 3) + " · 정점 " + tri.vertices.Length);
+ var start = root.transform.Find("Portal_Start");
+ UnityEngine.Vector3 pcPos = start != null ? start.position : new UnityEngine.Vector3(115f, 0f, 10f);
+ UnityEngine.AI.NavMeshHit ph;
+ if (!UnityEngine.AI.NavMesh.SamplePosition(pcPos, out ph, 5f, UnityEngine.AI.NavMesh.AllAreas))
+ { L("[에러] 시작 지점이 NavMesh 밖"); return Flush(kEditLog); }
+ L("시작 " + pcPos.ToString("F1") + " → 스냅 " + ph.position.ToString("F2"));
+ L("");
+ int comp = 0, part = 0, invalid = 0;
+ var targets = new System.Collections.Generic.List();
+ var pts = new System.Collections.Generic.List();
+ var mgrs = root.GetComponentsInChildren(true);
+ for (int i = 0; i < mgrs.Length; i++) { targets.Add("스포너 " + mgrs[i].name + " (ID " + mgrs[i].SpawnerID + ")"); pts.Add(mgrs[i].transform.position); }
+ var bs = root.GetComponentsInChildren(true);
+ for (int i = 0; i < bs.Length; i++) { targets.Add("보스 " + bs[i].name + " (Mob " + bs[i].n_MonsterID + ")"); pts.Add(bs[i].transform.position); }
+ for (int i = 0; i < pts.Count; i++)
+ {
+ UnityEngine.AI.NavMeshHit h;
+ bool on = UnityEngine.AI.NavMesh.SamplePosition(pts[i], out h, 5f, UnityEngine.AI.NavMesh.AllAreas);
+ string st = "NavMesh 밖";
+ float len = 0f;
+ if (on)
+ {
+ var path = new UnityEngine.AI.NavMeshPath();
+ UnityEngine.AI.NavMesh.CalculatePath(ph.position, h.position, UnityEngine.AI.NavMesh.AllAreas, path);
+ st = path.status.ToString();
+ for (int k = 1; k < path.corners.Length; k++) len += UnityEngine.Vector3.Distance(path.corners[k - 1], path.corners[k]);
+ if (path.status == UnityEngine.AI.NavMeshPathStatus.PathComplete) comp++;
+ else if (path.status == UnityEngine.AI.NavMeshPathStatus.PathPartial) part++;
+ else invalid++;
+ }
+ else invalid++;
+ L(string.Format(" {0,-28} {1,-22} 경로장 {2,6:F1}m · 직선 {3,6:F1}m · 스냅거리 {4:F2}m",
+ targets[i], st, len, UnityEngine.Vector3.Distance(ph.position, pts[i]), on ? UnityEngine.Vector3.Distance(pts[i], h.position) : -1f));
+ }
+ L("");
+ L("PathComplete " + comp + " · PathPartial " + part + " · 불가 " + invalid + " / " + pts.Count);
+ }
+ finally { UnityEngine.AI.NavMesh.RemoveNavMeshData(inst); }
+ return Flush(kOutDir + "/ZONES_NAV.txt");
+ }
+
+ // ══════════════════════════════════════════════════════════════════════
+ ///
+ /// 아레나 후보 탐색 — 초안 후보A (137, −22) 주변 격자에서
+ /// (1) 시작 지점에서 PathComplete 이고 (2) SP1·SP4 원점에서 15m 이상 떨어진 점을
+ /// 후보A 로부터 가까운 순으로 찍는다. 초안의 "군집 간섭 없음" 조건을 유지한 최소 이동을 고른다.
+ ///
+ public static string Arena()
+ {
+ s = new System.Text.StringBuilder();
+ var root = LoadMap();
+ var navData = UnityEditor.AssetDatabase.LoadAssetAtPath(kNavAsset);
+ if (root == null || navData == null) { L("[에러] 로드 실패"); return Flush(kOutDir + "/ZONES_ARENA.txt"); }
+ var ideal = new UnityEngine.Vector3(137f, 0.6f, -22f);
+ const float kStep = 2f, kSpan = 16f, kClear = 15f;
+ var inst = UnityEngine.AI.NavMesh.AddNavMeshData(navData);
+ try
+ {
+ var start = root.transform.Find("Portal_Start");
+ UnityEngine.Vector3 pcPos = start != null ? start.position : new UnityEngine.Vector3(115f, 0f, 10f);
+ UnityEngine.AI.NavMeshHit ph;
+ if (!UnityEngine.AI.NavMesh.SamplePosition(pcPos, out ph, 5f, UnityEngine.AI.NavMesh.AllAreas))
+ { L("[에러] 시작 지점이 NavMesh 밖"); return Flush(kOutDir + "/ZONES_ARENA.txt"); }
+
+ var mgrs = root.GetComponentsInChildren(true);
+ L("===== 아레나 후보 탐색 · 이상점 " + ideal.ToString("F1") + " · ±" + kSpan + "m / " + kStep + "m 격자 =====");
+ L("조건: 시작에서 PathComplete · 모든 스포너 원점에서 " + kClear + "m 이상 · MobGenRange 10 기준 여유 5m");
+ var res = new System.Collections.Generic.List();
+ var keys = new System.Collections.Generic.List();
+ for (float dx = -kSpan; dx <= kSpan; dx += kStep)
+ for (float dz = -kSpan; dz <= kSpan; dz += kStep)
+ {
+ var q = new UnityEngine.Vector3(ideal.x + dx, ideal.y, ideal.z + dz);
+ UnityEngine.AI.NavMeshHit h;
+ if (!UnityEngine.AI.NavMesh.SamplePosition(q, out h, 3f, UnityEngine.AI.NavMesh.AllAreas)) continue;
+ float nearest = 1e9f; string who = "";
+ for (int i = 0; i < mgrs.Length; i++)
+ {
+ float d = UnityEngine.Vector3.Distance(new UnityEngine.Vector3(h.position.x, 0f, h.position.z),
+ new UnityEngine.Vector3(mgrs[i].transform.position.x, 0f, mgrs[i].transform.position.z));
+ if (d < nearest) { nearest = d; who = mgrs[i].name + "(ID " + mgrs[i].SpawnerID + ")"; }
+ }
+ if (nearest < kClear) continue;
+ var path = new UnityEngine.AI.NavMeshPath();
+ UnityEngine.AI.NavMesh.CalculatePath(ph.position, h.position, UnityEngine.AI.NavMesh.AllAreas, path);
+ if (path.status != UnityEngine.AI.NavMeshPathStatus.PathComplete) continue;
+ float len = 0f;
+ for (int k = 1; k < path.corners.Length; k++) len += UnityEngine.Vector3.Distance(path.corners[k - 1], path.corners[k]);
+ float off = UnityEngine.Vector3.Distance(new UnityEngine.Vector3(ideal.x, 0f, ideal.z), new UnityEngine.Vector3(h.position.x, 0f, h.position.z));
+ keys.Add(off);
+ res.Add(string.Format(" ({0,6:F1},{1,5:F2},{2,6:F1}) 후보A 로부터 {3,4:F1}m · 시작에서 경로 {4,5:F1}m · 최근접 스포너 {5,5:F1}m {6} · 스냅 {7:F2}m",
+ h.position.x, h.position.y, h.position.z, off, len, nearest, who,
+ UnityEngine.Vector3.Distance(q, h.position)));
+ }
+ var idx = new System.Collections.Generic.List();
+ for (int i = 0; i < res.Count; i++) idx.Add(i);
+ idx.Sort(delegate (int a, int b) { return keys[a].CompareTo(keys[b]); });
+ L("후보 " + res.Count + "개 (가까운 순 상위 12)");
+ for (int i = 0; i < idx.Count && i < 12; i++) L(res[idx[i]]);
+ }
+ finally { UnityEngine.AI.NavMesh.RemoveNavMeshData(inst); }
+ return Flush(kOutDir + "/ZONES_ARENA.txt");
+ }
+
+ // ══════════════════════════════════════════════════════════════════════
+ // Play 슬롯 60s 실측 — 절두체 내 몹 수 · 처치 간격 · 보스 스폰 · fps
+ // ══════════════════════════════════════════════════════════════════════
+ static System.Text.StringBuilder r;
+ static bool s_on;
+ static float s_t0, s_dur, s_next, s_lastKill, s_bossAt;
+ static int s_ticks, s_frames, s_peakInView, s_sumInView, s_kills, s_peakAlive;
+ static System.Collections.Generic.List s_gaps;
+ static System.Collections.Generic.HashSet s_prev;
+ static System.Collections.Generic.Dictionary s_killBySpawner;
+ static float s_frameAcc;
+
+ const float kWatchSeconds = 60f;
+ const float kSample = 0.2f;
+
+ static void R(string t) { r.AppendLine(t); UnityEngine.Debug.Log("[WL813e] " + t); }
+
+ public static string Watch()
+ {
+ if (!UnityEngine.Application.isPlaying) return "[에러] Play 중이 아니다";
+ if (s_on) return "이미 감시 중 — 남은 " + (s_dur - (UnityEngine.Time.realtimeSinceStartup - s_t0)).ToString("F0") + "s";
+ r = new System.Text.StringBuilder();
+ s_gaps = new System.Collections.Generic.List();
+ s_prev = new System.Collections.Generic.HashSet();
+ s_killBySpawner = new System.Collections.Generic.Dictionary();
+ s_t0 = UnityEngine.Time.realtimeSinceStartup; s_dur = kWatchSeconds; s_next = 0f;
+ s_lastKill = -1f; s_bossAt = -1f;
+ s_ticks = 0; s_frames = 0; s_frameAcc = 0f;
+ s_peakInView = 0; s_sumInView = 0; s_kills = 0; s_peakAlive = 0;
+ s_on = true;
+ UnityEditor.EditorApplication.update -= Tick;
+ UnityEditor.EditorApplication.update += Tick;
+ R("===== WL-813e Play 실측 시작 (" + kWatchSeconds + "s · " + kSample + "s 간격) =====");
+ R("맵 = " + UnityEngine.SceneManagement.SceneManager.GetActiveScene().name
+ + " · PC = " + (MyValue.MyPC == null ? "null" : MyValue.MyPC.transform.position.ToString("F1")));
+ return "감시 시작 " + kWatchSeconds + "s — 끝나면 Result 로 결과를 받는다";
+ }
+
+ static void Tick()
+ {
+ if (!s_on) { UnityEditor.EditorApplication.update -= Tick; return; }
+ if (!UnityEngine.Application.isPlaying) { R("[중단] Play 가 멈췄다"); Stop(); return; }
+ s_frames++; s_frameAcc += UnityEngine.Time.unscaledDeltaTime;
+ float el = UnityEngine.Time.realtimeSinceStartup - s_t0;
+ if (el < s_next) return;
+ s_next = el + kSample;
+ s_ticks++;
+
+ var cam = UnityEngine.Camera.main;
+ UnityEngine.Plane[] planes = null;
+ if (cam != null) planes = UnityEngine.GeometryUtility.CalculateFrustumPlanes(cam);
+
+ var mobs = UnityEngine.Object.FindObjectsByType(UnityEngine.FindObjectsInactive.Exclude, UnityEngine.FindObjectsSortMode.None);
+ var now = new System.Collections.Generic.HashSet();
+ int inView = 0;
+ for (int i = 0; i < mobs.Length; i++)
+ {
+ var m = mobs[i];
+ now.Add(m.GetInstanceID());
+ if (planes != null)
+ {
+ var b = new UnityEngine.Bounds(m.transform.position + UnityEngine.Vector3.up, UnityEngine.Vector3.one * 2f);
+ if (UnityEngine.GeometryUtility.TestPlanesAABB(planes, b)) inView++;
+ }
+ // 보스 판별 = FieldBossData 가 넘긴 스포너 ID (MobActor.Get_Group() → m_SpawnerId · MobActor.cs:635)
+ if (s_bossAt < 0f && m.Get_Group() == kBossRowId)
+ {
+ s_bossAt = el;
+ R(string.Format(" [보스] t={0:F1}s {1} pos={2} HP={3:N0}/{4:N0}", el, m.name, m.transform.position.ToString("F1"), m.Get_HP(), m.Get_MaxHP()));
+ }
+ }
+ if (mobs.Length > s_peakAlive) s_peakAlive = mobs.Length;
+ if (inView > s_peakInView) s_peakInView = inView;
+ s_sumInView += inView;
+
+ // 처치 = 활성 몹 목록에서 사라진 인스턴스 (811b Killed 이벤트가 이 브랜치에 없어 쓰는 프록시)
+ foreach (var id in s_prev)
+ {
+ if (now.Contains(id)) continue;
+ s_kills++;
+ if (s_lastKill >= 0f) s_gaps.Add(el - s_lastKill);
+ s_lastKill = el;
+ }
+ s_prev = now;
+
+ if (s_ticks % 25 == 0)
+ R(string.Format(" t={0,4:F0}s 활성 {1,3} · 절두체 내 {2,2} · 누적 처치 {3,3} · fps {4:F1}",
+ el, mobs.Length, inView, s_kills, s_frames / System.Math.Max(0.001f, s_frameAcc)));
+
+ if (el >= s_dur) Stop();
+ }
+
+ static void Stop()
+ {
+ s_on = false;
+ UnityEditor.EditorApplication.update -= Tick;
+ float el = UnityEngine.Time.realtimeSinceStartup - s_t0;
+ R("");
+ R("===== 결과 (" + el.ToString("F1") + "s · 샘플 " + s_ticks + ") =====");
+ R("절두체 내 몹 수: 평균 " + (s_ticks > 0 ? ((float)s_sumInView / s_ticks) : 0f).ToString("F1") + " · 최대 " + s_peakInView
+ + " (기준서 §B 요소1 = 8~15)");
+ R("동시 활성 몹(맵 전체) 최대 = " + s_peakAlive);
+ float avg = 0f;
+ for (int i = 0; i < s_gaps.Count; i++) avg += s_gaps[i];
+ if (s_gaps.Count > 0) avg /= s_gaps.Count;
+ R("처치 " + s_kills + "회 · 처치 간격 평균 " + avg.ToString("F2") + "s · 표본 " + s_gaps.Count + " (기준서 §B 요소1 = ≤3s)");
+ R("보스 최초 관측 = " + (s_bossAt < 0f ? "관측 안 됨(절두체·거리 밖일 수 있다)" : s_bossAt.ToString("F1") + "s"));
+ R("평균 fps = " + (s_frames / System.Math.Max(0.001f, s_frameAcc)).ToString("F1") + " (프레임 " + s_frames + ")");
+ try
+ {
+ System.IO.Directory.CreateDirectory(Abs(kOutDir));
+ System.IO.File.WriteAllText(Abs(kPlayLog), r.ToString(), new System.Text.UTF8Encoding(true));
+ }
+ catch (System.Exception e) { UnityEngine.Debug.LogWarning("[WL813e] 로그 저장 실패: " + e.Message); }
+ }
+
+ public static string Result()
+ {
+ if (r == null) return "아직 감시한 적이 없다 (Watch 먼저)";
+ if (s_on) return "감시 중 — 남은 " + (s_dur - (UnityEngine.Time.realtimeSinceStartup - s_t0)).ToString("F0") + "s";
+ return r.ToString();
+ }
+
+ public static string StopNow() { if (s_on) { Stop(); return "중단"; } return "감시 중이 아니다"; }
+}
diff --git a/Assets/ResWork/Table/Export/MonsterAppear.json b/Assets/ResWork/Table/Export/MonsterAppear.json
index 5915a4c5a..a4e461bc5 100644
--- a/Assets/ResWork/Table/Export/MonsterAppear.json
+++ b/Assets/ResWork/Table/Export/MonsterAppear.json
@@ -1 +1 @@
-[{"n_SpawnerID": "1", "n_AppearMonsterLv": "1", "n_MonsterATK": "10", "n_MonsterDEF": "-10", "n_MonsterMDEF": "-10", "n_MonsterHP": "300", "s_AppearMonster": "101|102|103|104", "e_SpawnerType": "Random", "f_SpawnerDelay": "4", "n_MaxMonsterCount": "15", "f_PatrolRange": "10", "n_DropExp": "10", "n_DropGold": "1", "n_DropReward": "9700001"}, {"n_SpawnerID": "2", "n_AppearMonsterLv": "2", "n_MonsterATK": "10", "n_MonsterDEF": "2", "n_MonsterMDEF": "2", "n_MonsterHP": "99999", "s_AppearMonster": "105|106|107", "e_SpawnerType": "Order", "f_SpawnerDelay": "3.8", "n_MaxMonsterCount": "10", "f_PatrolRange": "4", "n_DropExp": "15", "n_DropGold": "2", "n_DropReward": "9700001"}, {"n_SpawnerID": "3", "n_AppearMonsterLv": "3", "n_MonsterATK": "99999", "n_MonsterDEF": "3", "n_MonsterMDEF": "3", "n_MonsterHP": "10000", "s_AppearMonster": "1014|1015", "e_SpawnerType": "Order", "f_SpawnerDelay": "3.6", "n_MaxMonsterCount": "10", "f_PatrolRange": "5", "n_DropExp": "20", "n_DropGold": "3", "n_DropReward": "9700001"}, {"n_SpawnerID": "4", "n_AppearMonsterLv": "4", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "111|112|113", "e_SpawnerType": "PhaseAllKill", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "5", "n_AppearMonsterLv": "5", "n_MonsterATK": "5", "n_MonsterDEF": "1", "n_MonsterMDEF": "1", "n_MonsterHP": "100", "s_AppearMonster": "114|115|116|117", "e_SpawnerType": "Phase", "f_SpawnerDelay": "4", "n_MaxMonsterCount": "10", "f_PatrolRange": "3", "n_DropExp": "10", "n_DropGold": "1", "n_DropReward": "9700001"}, {"n_SpawnerID": "6", "n_AppearMonsterLv": "6", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "118|119|120", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "7", "n_AppearMonsterLv": "7", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "121|122|123", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "8", "n_AppearMonsterLv": "8", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "124|125|126|127|128", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "9", "n_AppearMonsterLv": "9", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "129|130|131|132|133", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "10", "n_AppearMonsterLv": "10", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "134|135|136", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "11", "n_AppearMonsterLv": "11", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "137|138|139|140", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "12", "n_AppearMonsterLv": "12", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "141|142|143|144|145", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "13", "n_AppearMonsterLv": "13", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "70", "s_AppearMonster": "146|147|148|149|150|151|152|153|154", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "14", "n_AppearMonsterLv": "14", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "155|156|157", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "15", "n_AppearMonsterLv": "15", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "158|159|160", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "16", "n_AppearMonsterLv": "16", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "161|162|163|164", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "10", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "17", "n_AppearMonsterLv": "17", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "165|166|167", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "10", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "18", "n_AppearMonsterLv": "18", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "168|169|170|171|172", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "19", "n_AppearMonsterLv": "19", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "173|174|175", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "20", "n_AppearMonsterLv": "20", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "176|177|178|179|180|181", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "21", "n_AppearMonsterLv": "21", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "182|183|184|185|186", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "22", "n_AppearMonsterLv": "22", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "187|188|189|190|191", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "23", "n_AppearMonsterLv": "23", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "192|193|194|195|196|197", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "24", "n_AppearMonsterLv": "24", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "198|199|200|201|202|203", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "25", "n_AppearMonsterLv": "25", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "204|205|206|207|208|209|210", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "26", "n_AppearMonsterLv": "26", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "211|212|213|214|215|216|217|218", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "27", "n_AppearMonsterLv": "27", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "219|220|221|222|223|224|225", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "28", "n_AppearMonsterLv": "28", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "226|227|228|229|230|231|232", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "29", "n_AppearMonsterLv": "29", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "233|234|235|236|237|238|239", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "30", "n_AppearMonsterLv": "30", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "240|241|242|243|244|245|246", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "31", "n_AppearMonsterLv": "31", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "247|248|249|250", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "32", "n_AppearMonsterLv": "32", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "251|252|253|254|255|256|257|258|259", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "33", "n_AppearMonsterLv": "33", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "260|261|262|263|264|265|266", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "34", "n_AppearMonsterLv": "34", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "267|268|269|270|271|272|273", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "35", "n_AppearMonsterLv": "35", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "274|275|276|277|278|279|280|281", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "36", "n_AppearMonsterLv": "36", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "282|283|284|285|286|287|288|289|290", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "37", "n_AppearMonsterLv": "37", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "291|292|293|294|295|296|297|298", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "38", "n_AppearMonsterLv": "38", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "299|300|301|302|303|304", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "39", "n_AppearMonsterLv": "39", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "305|306|307|308|309|310|311", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "40", "n_AppearMonsterLv": "40", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "312|313|314|315|316|317|318|319", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "41", "n_AppearMonsterLv": "41", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "320|321|322|323", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "42", "n_AppearMonsterLv": "42", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "324|325|326|327|328|329|330|331|332", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "40", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "43", "n_AppearMonsterLv": "43", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "333|334|335|336|337|338|339|340|341|342|343|344", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "40", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "44", "n_AppearMonsterLv": "44", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "345|346|347", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "10", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "45", "n_AppearMonsterLv": "45", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "2000", "s_AppearMonster": "348|349|350|351", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "46", "n_AppearMonsterLv": "46", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "3000", "s_AppearMonster": "1031", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "1", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}]
\ No newline at end of file
+[{"n_SpawnerID": "1", "n_AppearMonsterLv": "1", "n_MonsterATK": "10", "n_MonsterDEF": "-10", "n_MonsterMDEF": "-10", "n_MonsterHP": "300", "s_AppearMonster": "101|102|103|104", "e_SpawnerType": "Random", "f_SpawnerDelay": "4", "n_MaxMonsterCount": "15", "f_PatrolRange": "10", "n_DropExp": "10", "n_DropGold": "1", "n_DropReward": "9700001"}, {"n_SpawnerID": "2", "n_AppearMonsterLv": "2", "n_MonsterATK": "10", "n_MonsterDEF": "2", "n_MonsterMDEF": "2", "n_MonsterHP": "99999", "s_AppearMonster": "105|106|107", "e_SpawnerType": "Order", "f_SpawnerDelay": "3.8", "n_MaxMonsterCount": "10", "f_PatrolRange": "4", "n_DropExp": "15", "n_DropGold": "2", "n_DropReward": "9700001"}, {"n_SpawnerID": "3", "n_AppearMonsterLv": "3", "n_MonsterATK": "99999", "n_MonsterDEF": "3", "n_MonsterMDEF": "3", "n_MonsterHP": "10000", "s_AppearMonster": "1014|1015", "e_SpawnerType": "Order", "f_SpawnerDelay": "3.6", "n_MaxMonsterCount": "10", "f_PatrolRange": "5", "n_DropExp": "20", "n_DropGold": "3", "n_DropReward": "9700001"}, {"n_SpawnerID": "4", "n_AppearMonsterLv": "4", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "111|112|113", "e_SpawnerType": "PhaseAllKill", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "5", "n_AppearMonsterLv": "5", "n_MonsterATK": "5", "n_MonsterDEF": "1", "n_MonsterMDEF": "1", "n_MonsterHP": "100", "s_AppearMonster": "114|115|116|117", "e_SpawnerType": "Phase", "f_SpawnerDelay": "4", "n_MaxMonsterCount": "10", "f_PatrolRange": "3", "n_DropExp": "10", "n_DropGold": "1", "n_DropReward": "9700001"}, {"n_SpawnerID": "6", "n_AppearMonsterLv": "6", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "118|119|120", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "7", "n_AppearMonsterLv": "7", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "121|122|123", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "8", "n_AppearMonsterLv": "8", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "124|125|126|127|128", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "9", "n_AppearMonsterLv": "9", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "129|130|131|132|133", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "10", "n_AppearMonsterLv": "10", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "134|135|136", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "11", "n_AppearMonsterLv": "11", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "137|138|139|140", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "12", "n_AppearMonsterLv": "12", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "141|142|143|144|145", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "13", "n_AppearMonsterLv": "13", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "70", "s_AppearMonster": "146|147|148|149|150|151|152|153|154", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "14", "n_AppearMonsterLv": "14", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "155|156|157", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "15", "n_AppearMonsterLv": "15", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "158|159|160", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "16", "n_AppearMonsterLv": "16", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "161|162|163|164", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "10", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "17", "n_AppearMonsterLv": "17", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "165|166|167", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "10", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "18", "n_AppearMonsterLv": "18", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "168|169|170|171|172", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "19", "n_AppearMonsterLv": "19", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "173|174|175", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "20", "n_AppearMonsterLv": "20", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "176|177|178|179|180|181", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "21", "n_AppearMonsterLv": "21", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "182|183|184|185|186", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "22", "n_AppearMonsterLv": "22", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "187|188|189|190|191", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "23", "n_AppearMonsterLv": "23", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "192|193|194|195|196|197", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "24", "n_AppearMonsterLv": "24", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "198|199|200|201|202|203", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "20", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "25", "n_AppearMonsterLv": "25", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "204|205|206|207|208|209|210", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "26", "n_AppearMonsterLv": "26", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "211|212|213|214|215|216|217|218", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "27", "n_AppearMonsterLv": "27", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "219|220|221|222|223|224|225", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "28", "n_AppearMonsterLv": "28", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "226|227|228|229|230|231|232", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "29", "n_AppearMonsterLv": "29", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "233|234|235|236|237|238|239", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "30", "n_AppearMonsterLv": "30", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "240|241|242|243|244|245|246", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "31", "n_AppearMonsterLv": "31", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "247|248|249|250", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "32", "n_AppearMonsterLv": "32", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "251|252|253|254|255|256|257|258|259", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "33", "n_AppearMonsterLv": "33", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "260|261|262|263|264|265|266", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "34", "n_AppearMonsterLv": "34", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "267|268|269|270|271|272|273", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "25", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "35", "n_AppearMonsterLv": "35", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "274|275|276|277|278|279|280|281", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "36", "n_AppearMonsterLv": "36", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "282|283|284|285|286|287|288|289|290", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "37", "n_AppearMonsterLv": "37", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "291|292|293|294|295|296|297|298", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "38", "n_AppearMonsterLv": "38", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "299|300|301|302|303|304", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "39", "n_AppearMonsterLv": "39", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "305|306|307|308|309|310|311", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "40", "n_AppearMonsterLv": "40", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "312|313|314|315|316|317|318|319", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "30", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "41", "n_AppearMonsterLv": "41", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "320|321|322|323", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "42", "n_AppearMonsterLv": "42", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "324|325|326|327|328|329|330|331|332", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "40", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "43", "n_AppearMonsterLv": "43", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "333|334|335|336|337|338|339|340|341|342|343|344", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "40", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "44", "n_AppearMonsterLv": "44", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "4", "s_AppearMonster": "345|346|347", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "10", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "45", "n_AppearMonsterLv": "45", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "2000", "s_AppearMonster": "348|349|350|351", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "15", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "46", "n_AppearMonsterLv": "46", "n_MonsterATK": "4", "n_MonsterDEF": "4", "n_MonsterMDEF": "4", "n_MonsterHP": "3000", "s_AppearMonster": "1031", "e_SpawnerType": "Random", "f_SpawnerDelay": "3.4", "n_MaxMonsterCount": "1", "f_PatrolRange": "6", "n_DropExp": "25", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "813001", "n_AppearMonsterLv": "1", "n_MonsterATK": "10", "n_MonsterDEF": "0", "n_MonsterMDEF": "0", "n_MonsterHP": "300", "s_AppearMonster": "101|102|103|104", "e_SpawnerType": "Random", "f_SpawnerDelay": "1.5", "n_MaxMonsterCount": "12", "f_PatrolRange": "8", "n_DropExp": "10", "n_DropGold": "1", "n_DropReward": "9700001"}, {"n_SpawnerID": "813002", "n_AppearMonsterLv": "2", "n_MonsterATK": "12", "n_MonsterDEF": "0", "n_MonsterMDEF": "0", "n_MonsterHP": "450", "s_AppearMonster": "168|169|170|171|172", "e_SpawnerType": "Random", "f_SpawnerDelay": "1.2", "n_MaxMonsterCount": "15", "f_PatrolRange": "8", "n_DropExp": "15", "n_DropGold": "2", "n_DropReward": "9700001"}, {"n_SpawnerID": "813003", "n_AppearMonsterLv": "3", "n_MonsterATK": "14", "n_MonsterDEF": "0", "n_MonsterMDEF": "0", "n_MonsterHP": "600", "s_AppearMonster": "173|174|175|146|147|151", "e_SpawnerType": "Random", "f_SpawnerDelay": "1.2", "n_MaxMonsterCount": "14", "f_PatrolRange": "8", "n_DropExp": "20", "n_DropGold": "3", "n_DropReward": "9700001"}, {"n_SpawnerID": "813004", "n_AppearMonsterLv": "4", "n_MonsterATK": "16", "n_MonsterDEF": "0", "n_MonsterMDEF": "0", "n_MonsterHP": "800", "s_AppearMonster": "118|119|120", "e_SpawnerType": "PhaseAllKill", "f_SpawnerDelay": "2.0", "n_MaxMonsterCount": "8", "f_PatrolRange": "6", "n_DropExp": "30", "n_DropGold": "4", "n_DropReward": "9700001"}, {"n_SpawnerID": "813005", "n_AppearMonsterLv": "5", "n_MonsterATK": "20", "n_MonsterDEF": "0", "n_MonsterMDEF": "0", "n_MonsterHP": "1500", "s_AppearMonster": "1014|1015|1016", "e_SpawnerType": "Order", "f_SpawnerDelay": "3.0", "n_MaxMonsterCount": "5", "f_PatrolRange": "6", "n_DropExp": "60", "n_DropGold": "8", "n_DropReward": "9700001"}, {"n_SpawnerID": "813010", "n_AppearMonsterLv": "6", "n_MonsterATK": "18", "n_MonsterDEF": "0", "n_MonsterMDEF": "0", "n_MonsterHP": "450", "s_AppearMonster": "10006", "e_SpawnerType": "Random", "f_SpawnerDelay": "60", "n_MaxMonsterCount": "1", "f_PatrolRange": "4", "n_DropExp": "500", "n_DropGold": "100", "n_DropReward": "9700001"}]
\ No newline at end of file
diff --git a/Assets/ResWork/Table/Export/_WL813b_BossArena_Draft.json b/Assets/ResWork/Table/Export/_WL813b_BossArena_Draft.json
index 23f683d01..96da470b4 100644
--- a/Assets/ResWork/Table/Export/_WL813b_BossArena_Draft.json
+++ b/Assets/ResWork/Table/Export/_WL813b_BossArena_Draft.json
@@ -1,5 +1,6 @@
{
"_meta": {
+ "적용": "WL-813e 에서 채택. 다만 (1) 아레나 좌표는 후보A (137,0.6,-22) 가 시작 지점에서 NavMesh PathPartial(끊긴 구역)로 실측돼 가장 가까운 도달 가능점 (139,0.8,-20) 으로 2.8m 옮겼고, (2) monsterappear_rows 의 n_MonsterHP 는 1200 대신 450(실 HP 9,000 = 기준서 §B 보스 90s)으로 넣었다. 기록 = Assets/WL/Settings/WL813e_ZoneApply.md. xlsm 동기화는 아직 필요하다.",
"발주": "WL-813b (PD #813) · 트랙 S",
"무엇": "WL_Nature 안에 보스 1종(추천 10006 Anubis)을 세우는 아레나 데이터 초안 — 좌표 · 반경 · 진입 방식 · 필요한 MonsterAppear 행",
"상태": "초안 · 게임이 읽지 않는다. 테이블 로더는 프리팹의 TextAsset 참조만 읽는다(table_missionbase.cs:5,12).",
diff --git a/Assets/ResWork/Table/Export/_WL813b_MonsterAppear_Draft.json b/Assets/ResWork/Table/Export/_WL813b_MonsterAppear_Draft.json
index f503af3c6..618d68e05 100644
--- a/Assets/ResWork/Table/Export/_WL813b_MonsterAppear_Draft.json
+++ b/Assets/ResWork/Table/Export/_WL813b_MonsterAppear_Draft.json
@@ -1,5 +1,6 @@
{
"_meta": {
+ "적용": "WL-813e 에서 rows 5행을 MonsterAppear.json 에 그대로 추가하고 WL_Nature.prefab 의 maplv/1~5 SpawnerID 를 813001~813005 로 재바인딩했다 → 이 초안은 이제 이력 문서다. 적용 기록·롤백·다음 조정 지점 = Assets/WL/Settings/WL813e_ZoneApply.md. xlsm 동기화는 아직 필요하다.",
"발주": "WL-813b (PD #813) · 트랙 S",
"무엇": "WL_Nature 군중 전투 '존 리듬' 프리셋 — MonsterAppear 추가 행 초안",
"상태": "초안 · 게임이 읽지 않는다. 테이블 로더는 폴더를 훑지 않고 프리팹의 TextAsset 참조만 읽는다(Assets/Script/Table/Mission/table_missionbase.cs:5,12) — 이 파일은 어떤 table_* 도 참조하지 않는다.",
diff --git a/Assets/Res_Addr/Map/WL_Nature.prefab b/Assets/Res_Addr/Map/WL_Nature.prefab
index 7fa28ab83..64b9c5298 100644
--- a/Assets/Res_Addr/Map/WL_Nature.prefab
+++ b/Assets/Res_Addr/Map/WL_Nature.prefab
@@ -45,7 +45,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 06269e6c1653db34090895cd16244df9, type: 3}
m_Name:
m_EditorClassIdentifier:
- SpawnerID: 1
+ SpawnerID: 813001
MobGenRange: 10
text_lv: {fileID: 875760665853817538}
--- !u!1 &28255864051587328
@@ -515,7 +515,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 06269e6c1653db34090895cd16244df9, type: 3}
m_Name:
m_EditorClassIdentifier:
- SpawnerID: 2
+ SpawnerID: 813002
MobGenRange: 10
text_lv: {fileID: 1148498265225467706}
--- !u!1 &1273559770134254925
@@ -2649,6 +2649,7 @@ Transform:
- {fileID: 6072744329692217702}
- {fileID: 5625234380910883685}
- {fileID: 8168532711777316576}
+ - {fileID: 8130050000000000002}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &5695711385560286233
@@ -2794,7 +2795,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 06269e6c1653db34090895cd16244df9, type: 3}
m_Name:
m_EditorClassIdentifier:
- SpawnerID: 5
+ SpawnerID: 813005
MobGenRange: 10
text_lv: {fileID: 7565486426041407482}
--- !u!1 &4255569283510092827
@@ -3103,7 +3104,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 06269e6c1653db34090895cd16244df9, type: 3}
m_Name:
m_EditorClassIdentifier:
- SpawnerID: 4
+ SpawnerID: 813004
MobGenRange: 10
text_lv: {fileID: 7694301954248919502}
--- !u!1 &5292814964321027778
@@ -3975,7 +3976,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 06269e6c1653db34090895cd16244df9, type: 3}
m_Name:
m_EditorClassIdentifier:
- SpawnerID: 3
+ SpawnerID: 813003
MobGenRange: 10
text_lv: {fileID: 1399851639559242293}
--- !u!1 &6825731264015073366
@@ -68605,3 +68606,83 @@ Transform:
type: 3}
m_PrefabInstance: {fileID: 9221781064863107696}
m_PrefabAsset: {fileID: 0}
+--- !u!1 &8130050000000000001
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8130050000000000002}
+ m_Layer: 3
+ m_Name: FieldBoss
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8130050000000000002
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8130050000000000001}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 8130050000000000004}
+ m_Father: {fileID: 4502284306717827522}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &8130050000000000003
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8130050000000000004}
+ - component: {fileID: 8130050000000000005}
+ m_Layer: 3
+ m_Name: 1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8130050000000000004
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8130050000000000003}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 139, y: 0.8, z: -20}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 8130050000000000002}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8130050000000000005
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8130050000000000003}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 935c913087b349141aa632be4f8c2689, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ isChapterBoss: 0
+ n_MonsterID: 10006
+ n_SpawnerId: 813010
+ RegenTime: 60
diff --git a/Assets/WL/Settings/WL813e_ZoneApply.md b/Assets/WL/Settings/WL813e_ZoneApply.md
new file mode 100644
index 000000000..39567e319
--- /dev/null
+++ b/Assets/WL/Settings/WL813e_ZoneApply.md
@@ -0,0 +1,109 @@
+# WL-813e — 군중 존 5개 + 보스 아레나(Anubis) 데이터 적용 기록
+
+> 발주 WL-813e (PD #813 · 트랙 S) · 브랜치 `wl/systems/WL-813e-zones-boss` (base `wl/systems/WL-813b-boss-content` @ `a4a053c44`)
+> 규격 = 813b 완료보고 §6 + 초안 2건(`_WL813b_MonsterAppear_Draft.json` · `_WL813b_BossArena_Draft.json`) + 핵앤슬래시 기준서 v1 §B 요소 1·6 · §D-1 813e 행
+> **코드 변경 0** — `Assets/Script/**` 무수정. 보스 프리팹(`Res_Addr/Mobs/FieldBoss/Anubis.prefab`) 인스펙터 값 무수정(813h 가 테이블화).
+
+## 🔴 SOT — xlsm 동기화 필요
+
+데이터 SOT 는 **butler.xlsm (PD 소유)** 다. 아래 6행은 `MonsterAppear.json` 에 직접 추가했으므로,
+**xlsm 의 MonsterAppear 시트에 같은 6행을 넣고 재익스포트하기 전까지는 다음 익스포트에서 사라진다.**
+`WL_Nature.prefab` 의 스포너 재바인딩(1~5 → 813001~813005)도 같이 살아 있어야 짝이 맞는다.
+
+## 1. 반영한 것 (전수)
+
+### (a) `Assets/ResWork/Table/Export/MonsterAppear.json` — 새 행 6개 (기존 46행 **바이트 무변경**)
+
+| SpawnerID | 존 | Lv | ATK | DEF/MDEF | HP | s_AppearMonster | e_SpawnerType | 리젠 s | 최대 | 순찰 | Exp/Gold |
+|---|---|---|---|---|---|---|---|---|---|---|---|
+| 813001 | 존1 첫 교전 | 1 | 10 | 0 | 300 | 101\|102\|103\|104 (Batty 4 · scale 1.5) | Random | 1.5 | 12 | 8 | 10/1 |
+| 813002 | 존2 밀집 최대 | 2 | 12 | 0 | 450 | 168~172 (Porin 5 · scale 1.3) | Random | 1.2 | 15 | 8 | 15/2 |
+| 813003 | 존3 혼합 | 3 | 14 | 0 | 600 | 173\|174\|175\|146\|147\|151 (Racco 3 + Rabby 3) | Random | 1.2 | 14 | 8 | 20/3 |
+| 813004 | 존4 웨이브 관문 | 4 | 16 | 0 | 800 | 118\|119\|120 (Devilu 3) | PhaseAllKill | 2.0 | 8 | 6 | 30/4 |
+| 813005 | 존5 엘리트 | 5 | 20 | 0 | 1500 | 1014\|1015\|1016 (Golem Elite 3 · scale 2.5) | Order | 3.0 | 5 | 6 | 60/8 |
+| 813010 | 보스 아레나 | 6 | 18 | 0 | **450** | 10006 (Anubis) | Random | 60 | 1 | 4 | 500/100 |
+
+- `n_DropReward` 는 6행 모두 기존 백 `9700001`(전 스포너 공용). 새 백은 813f 소관.
+- **813010 만 초안 값에서 바꿨다**: 초안 행은 `n_MonsterHP 1200`(실 HP 20×1200 = 24,000 ≈ 240s)인데
+ 초안 자신의 `_계산` 과 기준서 §B 요소6(보스 **60~120 s** · 첫 보스 90 s 목표)에 어긋난다.
+ → 존1 의 3 s 처치(HP 300)가 함의하는 DPS 100 으로 역산: `450 = 90 s × 100 / f_BaseHPRate 20` → **실 HP 9,000**.
+ ATK 18 은 초안대로(실 ATK 30×18 = 540). 플레이어 무적 유지 중이라 ATK 는 아직 체감에 영향이 없다.
+
+### (b) `Assets/Res_Addr/Map/WL_Nature.prefab` — 6줄 변경 + 새 노드 1기 (총 +86 / −5 줄)
+
+| 무엇 | 변경 |
+|---|---|
+| `WL_Nature/maplv/1~5` 의 `MobControlMgr.SpawnerID` | 1·2·3·4·5 → **813001~813005** (각 1줄) |
+| `WL_Nature` 루트 Transform `m_Children` | FieldBoss 컨테이너 1줄 추가 |
+| `WL_Nature/FieldBoss/1` (신규) | GameObject 2 + Transform 2 + `FieldBossData` 1 = YAML 문서 5개(80줄) |
+
+`FieldBossData` 값: `n_MonsterID 10006` · `n_SpawnerId 813010` · `RegenTime 60` · **`isChapterBoss 0`** · pos **(139, 0.8, −20)**
+- **`isChapterBoss` 는 반드시 0.** WL_Nature 의 `MapData.m_ChapterPortal` 이 null 이라 1이면 `AfterDie` 에서 NullReference (`FieldBossData.cs:47-49`) — 실측 확인.
+- 스포너 ID 6~19 와 다른 12개 맵(WL_Nature02~10 · WL_Start · Map_C01/02)은 **손대지 않았다**(ID 1~19 는 13개 맵 공용 · 813b 교훈).
+
+## 2. 실측 (헤드리스 에디터 · `AgentScripts/WL813e_Zones.cs`)
+
+| 항목 | 값 |
+|---|---|
+| 새 행 인식 | **6 / 6** |
+| 스포너 → 행 연결 | **19 / 19** (미연결 0 = `MobActor.cs:62` null 로 인한 NullReference 자리 0) |
+| 새 존 재바인딩 | **5 / 5** |
+| 몹 프리팹 자산 누락 | **0** (존 21종 + 보스 1종 전부 `Res_Addr/Mobs` 에 실존) |
+| FieldBossData | **1기** · MonsterList 행 O · `Res_Addr/Mobs/FieldBoss/Anubis.prefab` O · MonsterAppear 행 O |
+| 보스 실 스탯 | 실 HP = 20 × 450 = **9,000** · 실 ATK = 30 × 18 = **540** (`MyValue.cs:370-371`) |
+| 동시 생존 · 풀 | **179마리 · 366개** (813b 기준 175 · 375 → 생존 +4 · 인스턴스 −9) |
+| NavMesh 도달성 | 스포너 19 + 보스 1 = **PathComplete 20 / 20** · PathPartial 0 |
+| 컴파일 게이트 | PASS · `error CS` 0 · 콘솔 error **0** |
+
+### 🔴 아레나 좌표를 초안에서 옮긴 이유 (813b 미확인 ③ 해소)
+
+초안 후보A **(137, 0.6, −22)** 는 NavMesh 위(스냅 0.33 m)이긴 하나
+**플레이어 시작 지점(`Portal_Start` 115,0,10)에서 `NavMesh.CalculatePath` = `PathPartial`** 이다 — 끊긴 구역이다.
+같은 스윕에서 스포너 원점 19개는 전부 `PathComplete` 였으므로 프로브 문제가 아니다.
+→ 후보A 주변 ±16 m 를 2 m 격자로 훑어 «시작에서 PathComplete + 모든 스포너 원점에서 15 m 이상» 을 만족하는 92개 중
+**후보A 에서 가장 가까운 (139, 0.8, −20)** 을 채택했다(후보A 로부터 **2.8 m** · 경로장 38.4 m · 스냅 0.01 m · 최근접 스포너 20.1 m).
+초안의 설계 의도(SP1·SP4 사이 · 시작에서 약 38 m · 군집 반경 10 밖)는 그대로 유지된다.
+
+### 미확인
+
+- **Play 실측(절두체 내 몹 수 · 처치 간격 · 보스 스폰 시각 · fps) = 「미확인」.**
+ 이 worktree 헤드리스 에디터에서 `Assets/Resources/PlayFabSharedSettings.asset` 이 임포트되지 않아
+ (`Resources.LoadAll` = **0** · `AssetDatabase.LoadAssetAtPath` 도 null · 강제 재임포트·Refresh 후에도 동일)
+ `ServerInfo.Awake`(`ServerInfo.cs:45`)가 `IndexOutOfRangeException` 으로 죽고 `OnClick_DevLogin` 이 진행되지 않는다.
+ 파일·meta·스크립트 GUID 는 디스크에 정상 존재 → **Library 시딩(robocopy) 잔재**로 보이며 이번 변경과 무관하다.
+ Play 는 Title 에서 시작·정지했고 씬 dirty 0 으로 되돌렸다.
+- 존 리듬의 **절대 HP 값**은 여전히 「제안값」이다. 플레이어 실 DPS 미측정(813m/813 S 트랙) — DPS 가 정해지면
+ `n_MonsterHP = 목표 TTK × DPS / f_BaseHPRate` 로 6행을 한 번에 다시 계산한다.
+- 보스 등장 방식은 **맵 로드 즉시 상시 배치**다(`FieldBossData.Start()`). "존 전멸 → 보스 스폰" 게이트는 코드가 필요해 813d(G)로 넘겼다.
+
+## 3. 롤백
+
+1. `MonsterAppear.json` 에서 `n_SpawnerID` 가 `813001`~`813005`·`813010` 인 **6행 삭제**(기존 46행은 바이트 그대로라 앞부분은 손댈 필요 없다).
+2. `WL_Nature.prefab`: `maplv/1~5` 의 `SpawnerID` 를 `1~5` 로 되돌리고, `FieldBoss` 컨테이너(`&8130050000000000001`~`&8130050000000000005` 문서 5개)와
+ 루트 Transform `m_Children` 의 `{fileID: 8130050000000000002}` 줄을 지운다.
+3. 또는 병합 커밋을 `git revert -m 1`. 다른 맵·다른 스포너 행에 영향 0.
+
+## 4. 다음 바퀴 값 조정 지점
+
+| # | 무엇 | 근거 |
+|---|---|---|
+| 1 | **리젠 방식** — 기준서 §B 요소1 은 «존 전멸 후 4~6 s 일괄 재등장(`PhaseAllKill`)» 인데 이번엔 발주서 §1 이 지정한 초안 값(`Random` 1.2~1.5 s 개별 리젠)을 그대로 넣었다. 존1~3 을 `PhaseAllKill` + `f_SpawnerDelay 4~6` 으로 바꾸면 "비었다 → 다시 찬다" 페이싱이 생긴다. **단** `PhaseAllKill` 은 인스턴스 = 종류×마릿수라 존3(6종×14=84)은 풀이 커진다 → 종류를 3~4 로 줄여야 한다 | 기준서 §B · `MobControlMgr.cs:118-128, 213-224` |
+| 2 | **보스 추적 사거리** — Anubis `f_BaseChaseRange` **50**. 아레나 반경 20 을 넘어 존1(24 m)·존4(20 m)까지 끌려 나온다 → xlsm `MonsterList` 에서 15~20 으로 | 실측 · 초안 코드변경목록 3 |
+| 3 | **드랍** — 존·보스 6행 전부 `n_DropReward 9700001` 공용 백, 보스 `MonsterList.n_DropItem 0`. 보스 3~5건 폭발 드랍은 새 백 필요 | 기준서 §B 요소4 · 813f |
+| 4 | **존5 마릿수** — 5마리는 기준서 «밀집 8~15» 밖이다. 의도적(엘리트 = «8~12 s 짜리 벽»)이지만 기준서 채점 시 요소1 로 세지 말 것 | 기준서 §B 요소1 |
+| 5 | **보스 HP 재계산** — 450 은 DPS 100 「제안」 기반. 실 DPS 측정 후 재산출 | 위 미확인 |
+| 6 | **존4 PhaseAllKill 총 길이** — 3웨이브 × 8마리 × 3 s ≈ 72 s + 웨이브 간 2 s. 모바일 3분 런 기준으로 길면 마릿수를 6 으로 | `MobControlMgr.cs:213-224` |
+
+## 5. 검증 도구
+
+`AgentScripts/WL813e_Zones.cs` (Assets 밖 · 게임 빌드에 안 들어간다)
+
+```
+unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Edit # (a)~(f) 전수
+unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Nav # 스포너·보스 도달성 스윕
+unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Arena # 아레나 후보 재탐색
+unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Watch # Play 60 s 실측(로그인 후)
+unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Result # 결과
+```
+
+출력 원본 = `AgentScripts/staging/WL813e/{ZONES_EDIT,ZONES_NAV,ZONES_ARENA}.txt`
diff --git a/Assets/WL/Settings/WL813e_ZoneApply.md.meta b/Assets/WL/Settings/WL813e_ZoneApply.md.meta
new file mode 100644
index 000000000..5f06aec27
--- /dev/null
+++ b/Assets/WL/Settings/WL813e_ZoneApply.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ef642f4f45ea4c0fa763c0852f384fcc
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: