163 lines
8.6 KiB
C#
163 lines
8.6 KiB
C#
using System.Text;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
namespace TKS.OutGame
|
||
{
|
||
/// <summary>
|
||
/// 전투 결과 패널(기획서 §6) — 별 3(클리어 · 전원 생존 · n턴 이내) · 골드 · 경험(출전 전원) · 보옥(첫 클리어 · 보스) · 장비 드랍.
|
||
/// 전투 HUD 의 승리/패배 판(sortingOrder 100) 위에 덮는다 · 탭 처리는 기존 그대로(SlingshotInput → 월드맵 복귀).
|
||
/// </summary>
|
||
public class BattleResultPanel
|
||
{
|
||
readonly OutGameRoot root;
|
||
readonly GameObject go;
|
||
readonly Text title;
|
||
readonly Text stars;
|
||
readonly Text conds;
|
||
readonly Text rewards;
|
||
readonly Text hint;
|
||
readonly Image ribbon;
|
||
readonly RectTransform starRow;
|
||
readonly Image[] starImg = new Image[3];
|
||
|
||
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, UISkin.Col("dim", new Color(0f, 0f, 0f, 0.55f)), false);
|
||
go = dim.gameObject;
|
||
Image panel;
|
||
if (UISkin.Has("popup"))
|
||
{
|
||
// 팩 팝업 틀 + 제목 리본(승리 = 붉은 · 패배 = 회색) + 별 아이콘 3
|
||
panel = UiKit.Skin(UiKit.Rect("Panel", dim, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 20f), new Vector2(920f, 1180f)), "popup", UiKit.Paper);
|
||
var rib = UiKit.Rect("Ribbon", panel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 0.5f), new Vector2(0f, 10f), new Vector2(1000f, 200f));
|
||
ribbon = UiKit.Skin(rib, "ribbon", Color.white);
|
||
title = UiKit.Title(UiKit.FillLabel(rib, "", 88, UiKit.White, TextAnchor.MiddleCenter, true, 150f), true);
|
||
title.rectTransform.offsetMin = new Vector2(150f, 34f);
|
||
starRow = UiKit.Rect("StarRow", panel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(0f, -150f), new Vector2(600f, 190f));
|
||
for (int i = 0; i < 3; i++)
|
||
{
|
||
float s = i == 1 ? 190f : 150f;
|
||
starImg[i] = UiKit.Icon(starRow, "star_on", new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2((i - 1) * 180f, i == 1 ? 14f : -10f), s);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
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;
|
||
hint = 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;
|
||
hint.text = "화면을 탭하면 월드맵으로";
|
||
title.text = (r.win ? "승리" : "패배") + " <size=44>" + r.chapter + "-" + r.stage + (r.boss ? " 보스" : "") + "</size>";
|
||
stars.text = r.win ? UiKit.Stars(r.stars, 3) : UiKit.Stars(0, 3);
|
||
ShowStars(r.win ? r.stars : 0, r.win);
|
||
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<size=32>영웅 레벨업 · 승급 · 편성을 바꿔 다시 도전</size>";
|
||
}
|
||
}
|
||
|
||
/// <summary>연무장 결과(탑 · 던전 · 투기장 · 적장 토벌 · PD #1093 C) — 별 없음 · 결과 줄 · 탭 = 연무장.</summary>
|
||
public void FillMode(ModeResult r)
|
||
{
|
||
hint.text = "화면을 탭하면 연무장으로";
|
||
if (r == null)
|
||
{
|
||
title.text = "연무장";
|
||
stars.text = conds.text = rewards.text = "";
|
||
return;
|
||
}
|
||
title.text = r.kind == ArenaRules.Raid ? "토벌 종료" : r.win ? "승리" : "패배";
|
||
stars.text = "";
|
||
ShowStars(-1, r.win || r.kind == ArenaRules.Raid);
|
||
conds.text = "<size=44>" + r.title + "</size>";
|
||
rewards.text = string.Join("\n", r.lines.ToArray());
|
||
}
|
||
|
||
/// <summary>별 아이콘(n < 0 = 숨김) · 리본 색(승리 붉은 · 패배 회색) · 테마가 없으면 글자 별만.</summary>
|
||
void ShowStars(int n, bool win)
|
||
{
|
||
if (starRow == null) return;
|
||
stars.gameObject.SetActive(false);
|
||
starRow.gameObject.SetActive(n >= 0);
|
||
for (int i = 0; i < 3; i++)
|
||
if (starImg[i] != null) starImg[i].sprite = UISkin.Icon(i < n ? "star_on" : "star_off") ?? starImg[i].sprite;
|
||
if (ribbon != null && !UISkin.Apply(ribbon, win ? "ribbon" : "ribbon_gray")) ribbon.color = win ? Color.white : UiKit.Disabled;
|
||
}
|
||
|
||
static string Mark(bool ok)
|
||
{
|
||
return ok ? "<color=#3a6a30>○</color>" : "<color=#a03a22>×</color>";
|
||
}
|
||
|
||
/// <summary>보상 줄(결과 화면 · 소탕 팝업 공용).</summary>
|
||
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 ? " <size=28>(첫 클리어)</size>" : " <size=28>(반복 ×" + e.RepeatRewardMult + ")</size>");
|
||
sb.Append("\n경험 +").Append(r.exp).Append(" <size=28>출전 ").Append(r.expTo.Count).Append("명</size>");
|
||
if (r.gem > 0) sb.Append("\n보옥 +").Append(r.gem).Append(r.boss ? " <size=28>(첫 클리어 + 보스)</size>" : " <size=28>(첫 클리어)</size>");
|
||
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<size=30>장비 드랍 없음</size>");
|
||
if (!string.IsNullOrEmpty(r.chest) && s.Db.Chests != null && s.Db.Chests.Get(r.chest) != null) sb.Append("\n").Append(s.Db.Chests.Get(r.chest).nameKo).Append(" 획득 <size=28>(보물 > 상자)</size>");
|
||
if (r.sweep) sb.Append("\n<size=30>군량 ").Append(r.stamina).Append(" 소모 · 소탕(전투 없음)</size>");
|
||
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<color=#a03a22><size=30>레벨업 가능: ").Append(ready).Append("</size></color>");
|
||
return sb.ToString();
|
||
}
|
||
}
|
||
}
|