101 lines
5.7 KiB
C#
101 lines
5.7 KiB
C#
using UnityEngine;
|
||
|
||
namespace TKS.EditorTools
|
||
{
|
||
/// <summary>
|
||
/// BalanceConfig 자산의 최초 1회 시드 값(프로토타입 초안). 이후 수치 조정은 자산(Inspector)에서 한다 — 코드가 SOT 가 아니다.
|
||
/// 전장 = 가로 20 × 세로 32 (x −10~10 · y −16~16) · 화면에는 세로 18 만 보여 스크롤한다. 아군은 아래(y −13) · 적은 전위/중군/후군으로 흩어 배치.
|
||
/// 아트 id = Resources/Units/<id>/ (아군 = 스켈레탈 세션 리그 프레임 liubei·guanyu·zhangfei · 적 = 일러 세션 납품 이름 <세력>_<병종> · 없으면 도형).
|
||
/// 챕터·스테이지는 시드하지 않는다 — Assets/Data/Stages/*.csv 가 SOT(StageImporter · 2026-11-05 145 스테이지). 여기는 배치 규칙·장수 배율 출발값만.
|
||
/// </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, 0f, 0.42f), // 궁병 사거리 = slingMaxDistance (attackRange 미사용 · #1080)
|
||
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.archerRangeRatio = 0.2f; // PD 2026-11-04: 사거리(슬링샷 범위) 밖 +20 % 안의 적에게 다가가 사격
|
||
c.archerMeleeDealtRatio = 0.5f; // PD 2026-11-04 #1080: 궁수 근접 전투 피해 50 %
|
||
c.archerMeleeTakenRatio = 1.5f; // PD 2026-11-04 #1080: 궁수 근접 피격 +50 %
|
||
c.collisionPushRatio = 1f; // PD 2026-11-04 #1080: 보병 알까기 밀어내기 = 남은 거리 그대로
|
||
c.collisionSelfBounceRatio = 0.5f; // PD 2026-11-04 #1081: 보병 자신도 반대로 튕김(남은 거리의 절반 · 손맛 조정 대상)
|
||
c.unitArtHeight = 1.5f;
|
||
c.boardArt = "battlefield_01"; // 원화 세션 1차 납품(2026-11-04) · Resources/Board/
|
||
c.minDragDistance = 0.35f;
|
||
c.finalHitTolerance = 0.15f;
|
||
c.moveSpeed = 9f;
|
||
|
||
c.boardSize = new Vector2(20f, 32f);
|
||
c.cameraViewHeight = 18f;
|
||
c.cameraMinViewHeight = 10f;
|
||
c.cameraMaxViewHeight = 36f;
|
||
c.playerSpawnPoints = new[]
|
||
{
|
||
new Vector2(-4f, -13f), new Vector2(-2f, -13f), new Vector2(0f, -13f), new Vector2(2f, -13f), new Vector2(4f, -13f),
|
||
};
|
||
|
||
c.heroes = new[]
|
||
{
|
||
Hero("유비", UnitType.Infantry, 1.1f, 1.0f, "liubei"),
|
||
Hero("관우", UnitType.Spear, 1.1f, 1.25f, "guanyu"),
|
||
Hero("장비", UnitType.Cavalry, 1.0f, 1.2f, "zhangfei"),
|
||
Hero("조운", UnitType.Cavalry, 1.1f, 1.1f, "zhaoyun"), // 원화 세션 재디자인(2026-11-04 #1081)
|
||
Hero("황충", UnitType.Archer, 1.0f, 1.25f, "huangzhong"), // 원화 세션 재디자인(2026-11-04 #1081)
|
||
};
|
||
|
||
// 적 배치 규칙 = 구 시드 4 스테이지(황건적의 난·호로관·적벽·오장원)의 전위 y −6~−4.5 · 중군 −2~5 · 후군 7~9 · 장수 10~13 · 가로 간격 2.5~3 을 규칙화
|
||
c.formation = new BalanceConfig.FormationRule
|
||
{
|
||
frontY = -5.5f, middleY = 0.5f, rearY = 7.5f, commandY = 11f,
|
||
colGap = 2.6f, rowGap = 1.8f, maxPerRow = 5, rowStagger = 0.5f,
|
||
frontShare = 0.4f, rearShare = 0.15f,
|
||
};
|
||
// 장수 배율 출발값(밸런스 세션 조정) · 보스 = 구 시드 보스 4인(1.3~1.6 / 1.2~1.5)의 가운데 값 · 장각·여포·조조는 generals.csv 에 구 값 승계
|
||
c.bossGeneralHpMult = 1.5f;
|
||
c.bossGeneralAtkMult = 1.3f;
|
||
c.eliteGeneralHpMult = 1.25f;
|
||
c.eliteGeneralAtkMult = 1.15f;
|
||
c.chapters = new BalanceConfig.ChapterDef[0];
|
||
c.stages = new BalanceConfig.StageDef[0];
|
||
}
|
||
|
||
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, string art)
|
||
{
|
||
return new BalanceConfig.HeroDef { name = name, type = t, hpMult = hpMult, atkMult = atkMult, art = art };
|
||
}
|
||
|
||
}
|
||
}
|