109 lines
5.4 KiB
C#
109 lines
5.4 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;
|
|||
|
|
|
|||
|
|
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 ? "승리" : "패배") + " <size=44>" + r.chapter + "-" + r.stage + (r.boss ? " 보스" : "") + "</size>";
|
|||
|
|
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<size=32>영웅 레벨업 · 승급 · 편성을 바꿔 다시 도전</size>";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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 (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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|