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();
}
}
}