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