ThreeKingdomsSlingshot/Assets/Scripts/Editor/BalanceDefaults.cs

101 lines
6.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
namespace TKS.EditorTools
{
/// <summary>
/// BalanceConfig 자산의 최초 1회 시드 값(프로토타입 초안). 이후 수치 조정은 자산(Inspector)에서 한다 — 코드가 SOT 가 아니다.
/// 전장 = 가로 20 × 세로 32 (x −10~10 · y −16~16) · 화면에는 세로 18 만 보여 스크롤한다. 아군은 아래(전열 y −12 · 후열 −14) · 적은 전위/중군/후군으로 흩어 배치.
/// 아트 id = Resources/Units/&lt;id&gt;/ (아군 = 아웃게임 heroes.csv art 열 · 적 = 일러 세션 납품 이름 &lt;세력&gt;_&lt;병종&gt; · 없으면 도형).
/// 챕터·스테이지는 시드하지 않는다 — 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),
Stats(UnitType.Strategist, 65, 24, 3, 4.0f, 0f, 0.42f), // PD 2026-11-05 #1087 ⑤ 제안값 · 사거리 = slingMaxDistance(궁병과 동일)
};
// 상성: 보병 > 창병 > 기병 > 보병 · 원거리(궁병·책사)는 근접 3종에게 약함(받는 피해 1.5) · 원거리가 주는 피해 = 전부 1.0
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.SetMatchup(UnitType.Infantry, UnitType.Strategist, 1.5f); // 책사 열 = 궁병 열과 같은 값으로 출발(PD 확인 대상)
c.SetMatchup(UnitType.Cavalry, UnitType.Strategist, 1.5f);
c.SetMatchup(UnitType.Spear, UnitType.Strategist, 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.arrowRadius = 0.1f; // PD 2026-11-05 #1087 ⑥: 화살 투사체 폭(경로 위 첫 유닛 피격)
c.strategistSplashRadius = 1.5f; // PD 2026-11-05 #1087 ⑤ 제안값: 광역 반경(유닛 지름 약 1.7 개)
c.strategistSplashRatio = 0.6f; // 광역 피해 = 대상별 피해 × 0.6(크리 없음)
c.strategistAllyDamageRatio = 1f; // 광역 아군 피해 = 적과 동일(PD 확인 대상)
c.collisionPushRatio = 1f; // PD 2026-11-04 #1080: 보병 알까기 밀어내기 = 남은 거리 그대로
c.collisionSelfBounceRatio = 0.5f; // PD 2026-11-04 #1081: 보병 자신도 반대로 튕김(남은 거리의 절반 · 손맛 조정 대상)
c.spearPushRatio = 1.5f; // PD 2026-11-10: 창병 = 적을 크게 밀침(남은 거리 × 1.5 · 보병 1.0)
c.spearRecoilRatio = 0.2f; // PD 2026-11-10: 창병 자신은 적게 밀림(밀린 거리 × 0.2 = 남은 거리 × 0.3 · 보병 자기 튕김 0.5) · 옛 0.5(#1098)
c.unitArtHeight = 1.5f;
c.mountedArtMaxTop = 1.3f; // 기마 머리 끝 상한 = 표준 키 × 1.3(PD 2026-11-09)
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;
// 편성 자리(2026-11-05 #1093 시스템 기획 §10 A): 전열 3 = 앞줄 x −4/0/+4 · y −12 · 후열 2 = 뒷줄 x −2/+2 · y −14
// 아군 영웅·병사 정의는 시드하지 않는다 — Assets/Data/OutGame/heroes.csv(HeroDb · TKS/Import OutGame Data)가 SOT
c.playerSpawnPoints = new[]
{
new Vector2(-4f, -12f), new Vector2(0f, -12f), new Vector2(4f, -12f),
new Vector2(-2f, -14f), new Vector2(2f, -14f),
};
// 적 배치 규칙 = 구 시드 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 };
}
}
}