using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace TKS.OutGame { /// /// 연무장(로비 출정 우측 · 기획 S13 · 목업 img09 · PD #1093 C) — 첫 페이지 = 모드 카드 4(규칙 · 보상 · 입장) → 카드 탭 = 모드 페이지: /// ① 천하제일 탑(다음 층 · 적 템플릿 · 배율 · 보상 · 입장권 + 광고) ② 일일 던전 3(요일 · 남은 입장 · 보상) ③ 투기장(메달 · 주간 순위 · 샘플 상대 10 · 메달 상점) /// ④ 적장 토벌(이번 주 보스 · 누적 피해 · 하루 1). 도전 = OutGameRoot.StartMode → BattleManager.StartMode(적 편성 · 배율 · 제한 턴) → 결과 패널 → 탭 = 이 페이지로. /// public class ArenaScreen : OutGameScreen { public static readonly string[] ModeNames = { "천하제일 탑", "일일 던전 3", "투기장", "적장 토벌" }; static readonly string[] Ribbons = { "ribbon_blue", "ribbon_purple", "ribbon_red", "ribbon_orange" }; // 카드 리본(설계서 §3⑧ · 테마 스킨 id) int page; RectTransform root; /// 0 = 카드 · 1 탑 · 2 던전 · 3 투기장 · 4 적장 토벌. public int Page { get { return page; } } public override void Build() { if (UISkin.On) UiKit.Paint(UiKit.Fill("ListBg", Rt), UiKit.Col("list_bg", UiKit.Bg), false); // 목록형 바탕(Fable §5-3) Header("연무장", "탑 · 일일 던전 · 투기장 · 적장 토벌", true); root = Body(); } public void SetPage(int p) { page = Mathf.Clamp(p, 0, 4); Refresh(); } public override void OnShow() { S.Do(() => { ArenaRules.RollDaily(S.Db, S.Save, S.Now); ArenaRules.EnsureSeason(S.Db, S.Save, S.Now, S.Rng); ArenaRules.RaidBoss(S.Db, S.Save, S.Now); return null; }); } public override bool OnBack() { if (page == 0) return false; SetPage(0); return true; } public override void Refresh() { UiKit.Clear(root); switch (page) { case 0: BuildCards(); break; case 1: BuildTower(); break; case 2: BuildDungeons(); break; case 3: BuildArena(); break; case 4: BuildRaid(); break; } } // ---------- 카드 4 ---------- void BuildCards() { var db = S.Db; var d = S.Save; var e = db.Economy; var now = S.Now; string boss = db.Heroes.Get(ArenaRules.RaidBoss(db, d, now)) != null ? db.Heroes.Get(ArenaRules.RaidBoss(db, d, now)).nameKo : ""; string[,] text = { { "100층 · 층마다 고정 편성 적 · 10층마다 보스", "보옥 · 도면 · 10층마다 보물 금 상자", "입장권 하루 " + e.TowerTicketsDaily + "(광고 +" + e.TowerAdTickets + ") · 진행 저장", "다음 " + ArenaRules.TowerNext(db, d) + "층 · 입장권 " + d.arena.towerTickets }, { "군량고(골드) · 대장간(승급 장비·운철) · 사당(스킬서·영웅 조각) — 요일 순환", "던전별 재화", "각 하루 " + (db.Dungeons.dungeons.Count > 0 ? db.Dungeons.dungeons[0].entriesPerDay : 0) + "(패스 +1 준비 중)", "오늘 열림 " + OpenCount(now) + "곳" }, { "비동기 5v5 · 상대 편성은 AI 가 조작(적 AI 재사용) · 주간 랭킹", "투기장 메달 → 영웅 조각 상점", "하루 " + db.Arena.EntriesPerDay, "메달 " + d.arena.medals + " · " + ArenaRules.Rank(d) + "위 · 남은 " + ArenaRules.ArenaLeft(db, d, now) }, { "주간 보스(여포·조조 …) · 누적 피해", "보물 명장 상자", "하루 " + e.RaidDaily, "이번 주 " + boss + " · 누적 " + d.arena.raidDamage.ToString("N0") }, }; float w = 508f, h = 700f; if (UISkin.Has("card4_bg") && UISkin.Has("btn_l_yellow")) { CardsKit(text, w, h); return; } for (int i = 0; i < 4; i++) { int k = i; float x = 24f + (i % 2) * (w + 16f); float y = -18f - (i / 2) * (h + 20f); var card = UiKit.Btn("Card" + i, root, "", 30, UiKit.Paper, UiKit.Ink, new Vector2(0f, 1f), new Vector2(0f, 1f), new Vector2(x, y), new Vector2(w, h), () => SetPage(k + 1)); if (UISkin.Has("card4_bg") && UISkin.Has(Ribbons[i])) { // 카드(설계서 §3⑧) = 팩 CardFrame04 카드색 + 빛 + 테두리 · 글자 판 · 리본 제목 var ci = card.GetComponent(); UISkin.Apply(ci, "card4_bg"); ci.color = UiKit.Col("arena_" + i, UiKit.Paper); UiKit.Layer(card.transform, "Glow", "card4_glow", UiKit.Col("arena_glow", UiKit.White), 0f, 0f, 0f, h * 0.5f); UiKit.Layer(card.transform, "Inner", "panel12", UiKit.Col("arena_inner", UiKit.Paper), 14f, 112f, 14f, 100f); UiKit.Layer(card.transform, "Border", "card4_border", UiKit.Col("card_border", UiKit.Line)); var rib = UiKit.Skin(UiKit.Rect("Ribbon", card.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, 4f), new Vector2(w - 40f, 96f)), Ribbons[i], UiKit.White); var rt = UiKit.Title(UiKit.FillLabel(rib.transform, ModeNames[i] + (i == 3 ? " (이벤트)" : ""), 42, UiKit.White, TextAnchor.MiddleCenter, true, 40f), true); rt.rectTransform.offsetMin = new Vector2(rt.rectTransform.offsetMin.x, 16f); } else { UiKit.Border(card.GetComponent(), UiKit.Line, 3f); var head = UiKit.TopBand("Head", card.transform, 0f, 110f); UiKit.Paint(head, UiKit.Red); UiKit.FillLabel(head, ModeNames[i] + (i == 3 ? "\n(이벤트)" : ""), 44, UiKit.White); } string[] tags = { "규칙", "보상", "입장" }; for (int t = 0; t < 3; t++) { float ty = -128f - t * 160f; var tag = UiKit.Box("Tag" + t, card.transform, new Vector2(0f, 1f), new Vector2(0f, 1f), new Vector2(20f, ty), new Vector2(96f, 44f), UiKit.Dark); tag.raycastTarget = false; UiKit.FillLabel(tag.transform, tags[t], 24, UiKit.White); UiKit.Label(card.transform, text[i, t], 28, UiKit.Ink, TextAnchor.UpperLeft, new Vector2(0f, 1f), new Vector2(0f, 1f), new Vector2(20f, ty - 52f), new Vector2(w - 40f, 104f), false); } var st = UiKit.Box("Status", card.transform, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 16f), new Vector2(w - 32f, 70f), UiKit.Dark); st.raycastTarget = false; UiKit.FillLabel(st.transform, text[i, 3], 26, UiKit.Red); } } // 카드 그림 · 요약 · 보상 아이콘(테마 id · Fable §4-6 · 일러 N4 전까지 픽토그램 임시) static readonly string[] Arts = { "arena_art_0", "arena_art_1", "arena_art_2", "arena_art_3" }; static readonly string[] Briefs = { "층마다 고정 편성 · 10층마다 보스", "요일 순환 재화 던전", "비동기 5v5 · 주간 랭킹", "주간 보스 · 누적 피해" }; static readonly string[][] RewardIcons = { new[] { "cur_gem", "cur_blueprint", "chest_gold" }, new[] { "cur_gold", "cur_iron", "cur_skillbook" }, new[] { "gear_flag", "cur_shard" }, new[] { "chest_general" }, }; static readonly string[] EntryIcons = { "cur_ticket", "lobby_event", "sword", "fire" }; /// /// 모드 카드(Fable 제안서 §4-6 · #1104) = CardFrame04 카드색 + 리본 제목(유지) · 위 일러 자리(픽토그램 220 흰 25 %) + 요약 한 줄 · /// 아래 어두운 판에 칩 2줄(입장 = 아이콘 + 값 · 보상 = 아이템 칸 72) · 상태 칩 · 규칙 문장 → ⓘ 팝업 · 이벤트 = 오른쪽 위 뱃지. /// void CardsKit(string[,] text, float w, float h) { var d = S.Save; var db = S.Db; var now = S.Now; string[] entry = { "입장권 " + d.arena.towerTickets + " / " + db.Economy.TowerTicketsDaily, "오늘 " + OpenCount(now) + "곳 · 각 " + (db.Dungeons.dungeons.Count > 0 ? db.Dungeons.dungeons[0].entriesPerDay : 0) + "회", "남은 " + ArenaRules.ArenaLeft(db, d, now) + " / " + db.Arena.EntriesPerDay, "하루 " + db.Economy.RaidDaily + "회", }; var soft = UiKit.Col("text_soft", UiKit.InkSoft); for (int i = 0; i < 4; i++) { int k = i; float x = 24f + (i % 2) * (w + 16f); float y = 18f + (i / 2) * (h + 20f); var ci = UiKit.Skin(UiKit.At(root, "Card" + i, x, y, w, h), "card4_bg", UiKit.Col("arena_" + i, UiKit.Paper), true); var card = ci.transform; card.gameObject.AddComponent