using System.Collections.Generic; using UnityEngine; namespace TKS.EditorTools { /// /// BalanceConfig 자산의 최초 1회 시드 값(프로토타입 초안). 이후 수치 조정은 자산(Inspector)에서 한다 — 코드가 SOT 가 아니다. /// 전장 = 가로 12 × 세로 16 (x −6~6 · y −8~8). 아군은 아래쪽(y −5.5), 적은 위쪽 절반. /// public static class BalanceDefaults { public static void Apply(BalanceConfig c) { c.unitStats = new[] { Stats(UnitType.Infantry, 100, 30, 10, 4.5f, 0f, 0.45f), Stats(UnitType.Cavalry, 110, 28, 8, 6.5f, 0f, 0.45f), Stats(UnitType.Archer, 70, 26, 4, 4.0f, 4.0f, 0.42f), Stats(UnitType.Spear, 100, 30, 10, 4.5f, 2.2f, 0.45f), }; // 상성: 보병 > 창병 > 기병 > 보병 · 궁병은 모두에게 약함(받는 피해 1.5) c.matchup = new float[UnitTypeInfo.Count * UnitTypeInfo.Count]; for (int i = 0; i < c.matchup.Length; i++) c.matchup[i] = 1f; c.SetMatchup(UnitType.Infantry, UnitType.Spear, 1.5f); c.SetMatchup(UnitType.Infantry, UnitType.Cavalry, 0.7f); c.SetMatchup(UnitType.Spear, UnitType.Cavalry, 1.5f); c.SetMatchup(UnitType.Spear, UnitType.Infantry, 0.7f); c.SetMatchup(UnitType.Cavalry, UnitType.Infantry, 1.5f); c.SetMatchup(UnitType.Cavalry, UnitType.Spear, 0.7f); c.SetMatchup(UnitType.Infantry, UnitType.Archer, 1.5f); c.SetMatchup(UnitType.Cavalry, UnitType.Archer, 1.5f); c.SetMatchup(UnitType.Spear, UnitType.Archer, 1.5f); c.defenseFactor = 0.5f; c.counterRatio = 0.5f; c.critMultiplier = 2f; c.damageVariance = 0.1f; c.overwatchDamageRatio = 1f; c.bossHpMult = 1.6f; c.bossRadiusMult = 1.25f; c.cavalryKnockback = 0.35f; c.minDragDistance = 0.35f; c.finalHitTolerance = 0.15f; c.moveSpeed = 9f; c.boardSize = new Vector2(12f, 16f); c.playerSpawnPoints = new[] { new Vector2(-4f, -5.5f), new Vector2(-2f, -5.5f), new Vector2(0f, -5.5f), new Vector2(2f, -5.5f), new Vector2(4f, -5.5f), }; c.heroes = new[] { Hero("유비", UnitType.Infantry, 1.1f, 1.0f), Hero("관우", UnitType.Spear, 1.1f, 1.25f), Hero("장비", UnitType.Cavalry, 1.0f, 1.2f), Hero("조운", UnitType.Cavalry, 1.1f, 1.1f), Hero("황충", UnitType.Archer, 1.0f, 1.25f), }; c.stages = new[] { Stage("황건적의 난", "184년", 0.5f, E("황건적 보병", UnitType.Infantry, -3.5f, 2.5f), E("황건적 보병", UnitType.Infantry, 3.5f, 2.5f), E("황건적 창병", UnitType.Spear, 0f, 2.0f), E("황건적 궁병", UnitType.Archer, -2f, 5f), E("황건적 궁병", UnitType.Archer, 2f, 5f), Boss("장각", UnitType.Infantry, 0f, 6.5f, 1.3f, 1.2f)), Stage("호로관 전투", "190년", 0.6f, E("동탁군 창병", UnitType.Spear, -2f, 2.2f), E("동탁군 창병", UnitType.Spear, 2f, 2.2f), E("동탁군 기병", UnitType.Cavalry, -4f, 3.5f), E("동탁군 기병", UnitType.Cavalry, 4f, 3.5f), E("동탁군 궁병", UnitType.Archer, -2.5f, 5.5f), E("동탁군 궁병", UnitType.Archer, 2.5f, 5.5f), Boss("여포", UnitType.Cavalry, 0f, 4.5f, 1.6f, 1.5f)), Stage("적벽대전", "208년", 0.65f, E("조조군 보병", UnitType.Infantry, -4f, 2.5f), E("조조군 보병", UnitType.Infantry, 0f, 2.0f), E("조조군 보병", UnitType.Infantry, 4f, 2.5f), E("조조군 궁병", UnitType.Archer, -2.5f, 5f), E("조조군 궁병", UnitType.Archer, 2.5f, 5f), E("조조군 기병", UnitType.Cavalry, 0f, 4.2f), Boss("조조", UnitType.Infantry, 0f, 6.8f, 1.5f, 1.3f)), Stage("오장원 전투", "234년", 0.7f, E("위군 창병", UnitType.Spear, -2.5f, 2.2f), E("위군 창병", UnitType.Spear, 2.5f, 2.2f), E("위군 보병", UnitType.Infantry, -4.5f, 3.5f), E("위군 보병", UnitType.Infantry, 4.5f, 3.5f), E("위군 기병", UnitType.Cavalry, -1.5f, 4.5f), E("위군 기병", UnitType.Cavalry, 1.5f, 4.5f), E("위군 궁병", UnitType.Archer, 0f, 6f), Boss("사마의", UnitType.Infantry, 0f, 7.2f, 1.6f, 1.3f)), }; } static BalanceConfig.UnitStats Stats(UnitType t, int hp, int atk, int def, float sling, float range, float radius) { return new BalanceConfig.UnitStats { type = t, maxHp = hp, atk = atk, def = def, slingMaxDistance = sling, attackRange = range, radius = radius }; } static BalanceConfig.HeroDef Hero(string name, UnitType t, float hpMult, float atkMult) { return new BalanceConfig.HeroDef { name = name, type = t, hpMult = hpMult, atkMult = atkMult }; } static BalanceConfig.EnemySpawn E(string name, UnitType t, float x, float y) { return new BalanceConfig.EnemySpawn { name = name, type = t, position = new Vector2(x, y), hpMult = 1f, atkMult = 1f, isBoss = false }; } static BalanceConfig.EnemySpawn Boss(string name, UnitType t, float x, float y, float hpMult, float atkMult) { return new BalanceConfig.EnemySpawn { name = name, type = t, position = new Vector2(x, y), hpMult = hpMult, atkMult = atkMult, isBoss = true }; } static BalanceConfig.StageDef Stage(string title, string subtitle, float accuracy, params BalanceConfig.EnemySpawn[] enemies) { return new BalanceConfig.StageDef { title = title, subtitle = subtitle, aiAccuracy = accuracy, enemies = new List(enemies) }; } } }