ThreeKingdomsSlingshot/Assets/Scripts/OutGame/OutGameCaptureDriverC.cs

165 lines
6.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace TKS.OutGame
{
/// <summary>
/// 아웃게임 2차 화면 검증 캡처(PD #1093 C · 에디터 DataImporter.CaptureC 가 SessionState 로 출력 폴더를 넘기면 생성 · 세이브 = 메모리 전용 신규 유저).
/// 캡처용 재화·진행을 넣은 뒤 훈련 · 순찰 · 개발 · 보물 보유/세트/상자 · 탑 · 던전 · 투기장 · 도감 10장 + log · 끝나면 스스로 종료.
/// </summary>
public class OutGameCaptureDriverC : MonoBehaviour
{
public const string DirKey = "TKS_OUTGAME_C_CAPTURE_DIR";
public string OutputDir;
public int Width = 720;
public int Height = 1280;
readonly List<string> log = new List<string>();
int shot = 1;
#if UNITY_EDITOR
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
static void AutoSpawn()
{
string dir = UnityEditor.SessionState.GetString(DirKey, "");
if (string.IsNullOrEmpty(dir)) return;
UnityEditor.SessionState.EraseString(DirKey);
var d = new GameObject("OutGameCaptureDriverC").AddComponent<OutGameCaptureDriverC>();
d.OutputDir = dir;
}
#endif
IEnumerator Start()
{
Directory.CreateDirectory(OutputDir);
yield return null;
yield return null;
var root = OutGameRoot.Instance;
var cam = Camera.main;
if (root == null || cam == null)
{
Log("FAIL: OutGameRoot 또는 카메라 없음");
Finish(1);
yield break;
}
var s = root.Session;
var db = s.Db;
var d = s.Save;
Log("memoryOnly=" + SaveStore.MemoryOnly + " newUser=" + s.IsNewUser + " heroes(db)=" + db.Heroes.heroes.Count + " treasures(db)=" + db.Treasures.items.Count);
// 캡처용 진행(메모리 세이브만): 재화 · 훈련(보병 HP·공 Max · 방 9) · 순찰 7시간 · 개발 일부 · 상자 열기로 보물 · 상자 보유 · 포인트
d.gold = 120000;
d.gem = 3000;
d.inv.blueprint = 30;
d.inv.iron = 300;
var inf = UnitType.Infantry;
for (int i = 0; i < db.Training.MaxLevel; i++)
{
TrainingRules.Level(db, d, inf, 0);
TrainingRules.Level(db, d, inf, 1);
if (i < db.Training.MaxLevel - 1) TrainingRules.Level(db, d, inf, 2);
}
d.patrol.startAt = SaveStore.Iso(s.Now.AddHours(-7));
var first = db.Dev.InBranch(db.Dev.Branches[0]);
for (int i = 0; i < first[0].lvMax; i++) DevRules.Upgrade(db, d, first[0].id);
for (int i = 0; i < 4 && first.Count > 1; i++) DevRules.Upgrade(db, d, first[1].id);
var rng = new System.Random(1093);
Counts.Set(d.inv.chests, "gold", 6);
Counts.Set(d.inv.chests, "silver", 10);
for (int i = 0; i < 6; i++) TreasureRules.Open(db, d, "gold", rng);
for (int i = 0; i < 10; i++) TreasureRules.Open(db, d, "silver", rng);
foreach (var t in d.inv.treasures)
if (t.star == 0 && rng.NextDouble() < 0.6) t.star = 1 + rng.Next(3);
Counts.Set(d.inv.chests, "bronze", 4);
Counts.Set(d.inv.chests, "silver", 18);
Counts.Set(d.inv.chests, "gold", 3);
Counts.Set(d.inv.chests, "general", 1);
d.inv.chestPoints = 35;
TreasureRules.AddCount(d, BattleEvents.Battles, 45);
s.Commit();
Log("seed: gold=" + d.gold + " treasures=" + d.inv.treasures.Count + " infantry rank=" + TrainingRules.Rank(d, inf) + " dev=" + DevRules.TotalLevels(d));
root.Show(root.Domestic);
root.Domestic.SetTrainType(inf);
root.Domestic.SetPage(0);
yield return Shot(cam, "domestic_training");
root.Domestic.SetPage(1);
var y = PatrolRules.Preview(db, d, PatrolRules.Hours(db, d, s.Now), 1f);
Log("patrol hours=" + PatrolRules.Hours(db, d, s.Now).ToString("0.00") + " gold=" + y.gold + " exp=" + y.exp + " gear=" + y.gear + " chests=" + y.chests);
yield return Shot(cam, "domestic_patrol");
root.Domestic.SetPage(2);
root.Domestic.SetBranch(0);
Log("dev nodes(branch 0)=" + root.Domestic.NodeCount + " gold_gain=" + DevRules.Mod(db, d, DevRules.GoldGain));
yield return Shot(cam, "domestic_dev");
root.Show(root.Treasures);
root.Treasures.SetPage(0);
Log("treasure grid=" + root.Treasures.GridCount + " owned=" + d.inv.treasures.Count + " atk%=" + TreasureRules.StatPct(db, d, "atk").ToString("0.##"));
yield return Shot(cam, "treasure_owned");
root.Treasures.SetPage(1);
yield return Shot(cam, "treasure_sets");
root.Treasures.SetPage(2);
root.Treasures.SelectChest("gem");
yield return Shot(cam, "treasure_chests");
root.Arena.SetPage(0);
root.Show(root.Arena);
yield return Wait();
root.Arena.SetPage(1);
Log("tower next=" + ArenaRules.TowerNext(db, d) + " tickets=" + d.arena.towerTickets);
yield return Shot(cam, "arena_tower");
root.Arena.SetPage(2);
yield return Shot(cam, "arena_dungeons");
root.Arena.SetPage(3);
Log("arena samples=" + d.arena.samples.Count + " rank=" + ArenaRules.Rank(d));
yield return Shot(cam, "arena_pvp");
root.Show(root.HeroList);
HeroDetailScreen.ShowCodex(root);
Log("codex heroes=" + db.Heroes.heroes.Count);
yield return Shot(cam, "hero_codex");
Finish(0);
}
static IEnumerator Wait()
{
yield return null;
yield return new WaitForSecondsRealtime(0.3f);
}
IEnumerator Shot(Camera cam, string name)
{
yield return Wait();
string file = Path.Combine(OutputDir, shot.ToString("00") + "_" + name + ".png");
shot++;
yield return CaptureUtil.Capture(cam, Width, Height, file);
Log("shot " + file);
}
void Log(string s)
{
log.Add(s);
Debug.Log("[OutGameCaptureC] " + s);
try
{
File.WriteAllLines(Path.Combine(OutputDir, "capture_log.txt"), log.ToArray());
}
catch
{
}
}
void Finish(int code)
{
Log("finish code=" + code);
#if UNITY_EDITOR
UnityEditor.EditorApplication.Exit(code);
#else
Application.Quit(code);
#endif
}
}
}