2026-11-03 19:10:10 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
namespace TKS.EditorTools
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// BalanceConfig 자산의 최초 1회 시드 값(프로토타입 초안). 이후 수치 조정은 자산(Inspector)에서 한다 — 코드가 SOT 가 아니다.
|
2026-11-03 19:29:16 +00:00
|
|
|
|
/// 전장 = 가로 20 × 세로 32 (x −10~10 · y −16~16) · 화면에는 세로 18 만 보여 스크롤한다. 아군은 아래(y −13) · 적은 전위/중군/후군으로 흩어 배치.
|
2026-11-03 19:10:10 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
2026-11-03 19:29:16 +00:00
|
|
|
|
c.boardSize = new Vector2(20f, 32f);
|
|
|
|
|
|
c.cameraViewHeight = 18f;
|
|
|
|
|
|
c.cameraMinViewHeight = 10f;
|
|
|
|
|
|
c.cameraMaxViewHeight = 36f;
|
2026-11-03 19:10:10 +00:00
|
|
|
|
c.playerSpawnPoints = new[]
|
|
|
|
|
|
{
|
2026-11-03 19:29:16 +00:00
|
|
|
|
new Vector2(-4f, -13f), new Vector2(-2f, -13f), new Vector2(0f, -13f), new Vector2(2f, -13f), new Vector2(4f, -13f),
|
2026-11-03 19:10:10 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
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[]
|
|
|
|
|
|
{
|
2026-11-03 19:29:16 +00:00
|
|
|
|
Stage("황건적의 난", "184년", 0.5f, 11f,
|
|
|
|
|
|
// 전위
|
|
|
|
|
|
E("황건적 보병", UnitType.Infantry, -3f, -6f),
|
|
|
|
|
|
E("황건적 보병", UnitType.Infantry, 3f, -6f),
|
|
|
|
|
|
E("황건적 창병", UnitType.Spear, 0f, -4.5f),
|
|
|
|
|
|
// 중군
|
|
|
|
|
|
E("황건적 궁병", UnitType.Archer, -4f, 1f),
|
|
|
|
|
|
E("황건적 궁병", UnitType.Archer, 4f, 1f),
|
|
|
|
|
|
E("황건적 보병", UnitType.Infantry, 0f, 2.5f),
|
|
|
|
|
|
// 후군
|
|
|
|
|
|
E("황건적 창병", UnitType.Spear, -2.5f, 8f),
|
|
|
|
|
|
Boss("장각", UnitType.Infantry, 0f, 10f, 1.3f, 1.2f)),
|
|
|
|
|
|
Stage("호로관 전투", "190년", 0.6f, 11f,
|
|
|
|
|
|
E("동탁군 창병", UnitType.Spear, -2.5f, -5f),
|
|
|
|
|
|
E("동탁군 창병", UnitType.Spear, 2.5f, -5f),
|
|
|
|
|
|
E("동탁군 기병", UnitType.Cavalry, -6f, -1f),
|
|
|
|
|
|
E("동탁군 기병", UnitType.Cavalry, 6f, -1f),
|
|
|
|
|
|
E("동탁군 보병", UnitType.Infantry, 0f, 1f),
|
|
|
|
|
|
E("동탁군 궁병", UnitType.Archer, -3f, 3f),
|
|
|
|
|
|
E("동탁군 궁병", UnitType.Archer, 3f, 3f),
|
|
|
|
|
|
E("동탁군 기병", UnitType.Cavalry, 0f, 7f),
|
|
|
|
|
|
Boss("여포", UnitType.Cavalry, 0f, 11f, 1.6f, 1.5f)),
|
|
|
|
|
|
Stage("적벽대전", "208년", 0.65f, 12f,
|
|
|
|
|
|
E("조조군 보병", UnitType.Infantry, -5f, -6f),
|
|
|
|
|
|
E("조조군 보병", UnitType.Infantry, 0f, -5f),
|
|
|
|
|
|
E("조조군 보병", UnitType.Infantry, 5f, -6f),
|
|
|
|
|
|
E("조조군 기병", UnitType.Cavalry, -3f, 0f),
|
|
|
|
|
|
E("조조군 기병", UnitType.Cavalry, 3f, 0f),
|
|
|
|
|
|
E("조조군 궁병", UnitType.Archer, -4f, 5f),
|
|
|
|
|
|
E("조조군 궁병", UnitType.Archer, 4f, 5f),
|
|
|
|
|
|
E("조조군 창병", UnitType.Spear, 0f, 7f),
|
|
|
|
|
|
Boss("조조", UnitType.Infantry, 0f, 12f, 1.5f, 1.3f)),
|
|
|
|
|
|
Stage("오장원 전투", "234년", 0.7f, 12f,
|
|
|
|
|
|
E("위군 창병", UnitType.Spear, -3f, -6f),
|
|
|
|
|
|
E("위군 창병", UnitType.Spear, 3f, -6f),
|
|
|
|
|
|
E("위군 보병", UnitType.Infantry, -7f, -2f),
|
|
|
|
|
|
E("위군 보병", UnitType.Infantry, 7f, -2f),
|
|
|
|
|
|
E("위군 기병", UnitType.Cavalry, -2f, 2f),
|
|
|
|
|
|
E("위군 기병", UnitType.Cavalry, 2f, 2f),
|
|
|
|
|
|
E("위군 궁병", UnitType.Archer, -4f, 7f),
|
|
|
|
|
|
E("위군 궁병", UnitType.Archer, 4f, 7f),
|
|
|
|
|
|
E("위군 창병", UnitType.Spear, 0f, 9f),
|
|
|
|
|
|
Boss("사마의", UnitType.Infantry, 0f, 13f, 1.6f, 1.3f)),
|
2026-11-03 19:10:10 +00:00
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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 };
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-11-03 19:29:16 +00:00
|
|
|
|
static BalanceConfig.StageDef Stage(string title, string subtitle, float accuracy, float aggro, params BalanceConfig.EnemySpawn[] enemies)
|
2026-11-03 19:10:10 +00:00
|
|
|
|
{
|
2026-11-03 19:29:16 +00:00
|
|
|
|
return new BalanceConfig.StageDef { title = title, subtitle = subtitle, aiAccuracy = accuracy, aiAggroRange = aggro, enemies = new List<BalanceConfig.EnemySpawn>(enemies) };
|
2026-11-03 19:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|