using System.Text; using UnityEngine; using UnityEngine.UI; namespace TKS.OutGame { /// /// 전투 결과 패널(기획서 §6) — 별 3(클리어 · 전원 생존 · n턴 이내) · 골드 · 경험(출전 전원) · 보옥(첫 클리어 · 보스) · 장비 드랍. /// 전투 HUD 의 승리/패배 판(sortingOrder 100) 위에 덮는다 · 탭 처리는 기존 그대로(SlingshotInput → 월드맵 복귀). /// public class BattleResultPanel { readonly OutGameRoot root; readonly GameObject go; readonly Text title; readonly Text stars; readonly Text conds; readonly Text rewards; public bool Visible { get { return go.activeSelf; } } public string RewardsText { get { return rewards.text; } } public BattleResultPanel(OutGameRoot r, RectTransform canvas) { root = r; var dim = UiKit.Fill("Result", canvas); UiKit.Paint(dim, new Color(0f, 0f, 0f, 0.55f), false); go = dim.gameObject; var panel = UiKit.Box("Panel", dim, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 40f), new Vector2(920f, 1180f), UiKit.Paper); UiKit.Border(panel, UiKit.Line, 4f); var head = UiKit.TopBand("Head", panel.transform, 0f, 170f); UiKit.Paint(head, UiKit.Dark); title = UiKit.FillLabel(head, "", 96, UiKit.White); stars = UiKit.Label(panel.transform, "", 120, UiKit.Star, TextAnchor.MiddleCenter, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -190f), new Vector2(800f, 150f)); conds = UiKit.Label(panel.transform, "", 34, UiKit.Ink, TextAnchor.UpperLeft, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -350f), new Vector2(760f, 180f), false); conds.lineSpacing = 1.15f; var line = UiKit.Box("Line", panel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -540f), new Vector2(800f, 4f), UiKit.Slot, false); line.raycastTarget = false; rewards = UiKit.Label(panel.transform, "", 38, UiKit.Ink, TextAnchor.UpperLeft, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -566f), new Vector2(760f, 460f), false); rewards.lineSpacing = 1.15f; UiKit.Label(panel.transform, "화면을 탭하면 월드맵으로", 34, UiKit.InkSoft, TextAnchor.MiddleCenter, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), new Vector2(0f, 36f), new Vector2(800f, 60f), false); go.SetActive(false); } public void SetVisible(bool on) { if (go.activeSelf != on) go.SetActive(on); } public void Fill(StageReward r) { var s = root.Session; title.text = (r.win ? "승리" : "패배") + " " + r.chapter + "-" + r.stage + (r.boss ? " 보스" : "") + ""; stars.text = r.win ? UiKit.Stars(r.stars, 3) : UiKit.Stars(0, 3); if (r.win) { conds.text = Mark(r.conds[0]) + " 클리어\n" + Mark(r.conds[1]) + " 아군 전원 생존\n" + Mark(r.conds[2]) + " " + r.starTurns + "턴 이내 클리어 (" + r.turns + "턴)"; rewards.text = RewardText(s, r); } else { conds.text = "아군이 전멸했습니다\n군량 " + r.stamina + " 소모 · 별 없음"; rewards.text = "보상 없음\n영웅 레벨업 · 승급 · 편성을 바꿔 다시 도전"; } } static string Mark(bool ok) { return ok ? "○" : "×"; } /// 보상 줄(결과 화면 · 소탕 팝업 공용). public static string RewardText(OutGameSession s, StageReward r) { var e = s.Db.Economy; var sb = new StringBuilder(); sb.Append("골드 +").Append(r.gold.ToString("N0")).Append(r.first ? " (첫 클리어)" : " (반복 ×" + e.RepeatRewardMult + ")"); sb.Append("\n경험 +").Append(r.exp).Append(" 출전 ").Append(r.expTo.Count).Append("명"); if (r.gem > 0) sb.Append("\n보옥 +").Append(r.gem).Append(r.boss ? " (첫 클리어 + 보스)" : " (첫 클리어)"); if (!string.IsNullOrEmpty(r.gearId)) { var g = s.Db.Gear.Get(r.gearId); sb.Append("\n장비 ").Append(g != null ? g.nameKo + " (" + UiKit.GradeKo(g.grade) + ")" : r.gearId).Append(" 획득"); } else sb.Append("\n장비 드랍 없음"); if (r.sweep) sb.Append("\n군량 ").Append(r.stamina).Append(" 소모 · 소탕(전투 없음)"); var ready = new StringBuilder(); foreach (var id in r.expTo) { var lv = s.Save.Level(id); if (HeroRules.CanLevelUp(s.Db, s.Save, lv) != null) continue; if (ready.Length > 0) ready.Append(" · "); ready.Append(s.Def(id).nameKo); } if (ready.Length > 0) sb.Append("\n레벨업 가능: ").Append(ready).Append(""); return sb.ToString(); } } }