ThreeKingdomsSlingshot/Assets/Scripts/Runtime/Gimmicks/GimmickInstance.cs

97 lines
3.3 KiB
C#
Raw Permalink Normal View History

지형 기믹 레이어(PD #1097 세션 D) + 병종 규칙 개정 2건 · 예측 시뮬레이션 적 AI(PD #1098) - 데이터: Assets/Data/Gimmicks/{gimmicks,stage_gimmicks,tutorial_tips}.csv + Assets/Data/AI/ai_weights.csv(기획 tables/ 사본) → 메뉴 TKS/Import Gimmicks(검증 · 오류 시 자산 불변) → Resources/Gimmicks/GimmickDb(16)·StageGimmickTable(16 + 팁 3) · Resources/AI/AiWeights(32) - 레이어: GimmickLayer(전투 시작 = 스테이지 배치 · 배경 위 유닛 아래 · 원/사각/다각 · 색 도형 + 글자 · 내구 핍 · 강 콜라이더 = 다리 구간 제외 · 겹친 유닛 보정) · 장애물 = 병종별 내구 피해·튕김·창 목책 밀기·바위 굴림·기병 정지 · 투사체 pass/block/destroy · 폭약 광역(아군 포함)+밀기+불 · 책사 광역 덤불 제거 · 강 낙하 - 지대: 경로 스윕(독 1→2→3 % · 늪 ×2 · 불 10 % · 빙판 미끄러짐 · 고지 · 안개 · 군기 · 함정) · 양 진영 턴 시작 훅 - 규칙 개정: 보병 튕김 중 다른 적과 연쇄 1회 · 창병 반작용(spearRecoilRatio · 밀며 전진 폐기) · 기존 테스트 기대값 갱신 - 적 AI: Runtime/AI(Sim 가상 실행 · TacticalAI 후보·점수·난이도·턴 운영 · 1부 보스 액티브) · 조준선 = 가상 실행 예상 궤적·기믹 반응·지대 띠 · TKS/Gimmick Painter · 캡처 GimmickImporter.Capture - 검증: 컴파일 0 · 플레이모드 113/113(신규 26) · console error 0 · 적 10기 턴 결정 62 ms Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 16:20:07 +00:00
using System.Collections.Generic;
using UnityEngine;
namespace TKS
{
/// <summary>전장에 놓인 기믹 1개(정의 + 배치 + 전투 중 상태). 시각 = GimmickView · 콜라이더 = 장애물만.</summary>
public class GimmickInstance
{
public GimmickDef Def;
public GimmickPlacement Src;
public GimmickShape Shape;
public int Hp;
public int MaxHp;
/// <summary>내구 0 = 잔해(통과 가능 · art_broken).</summary>
public bool Broken;
/// <summary>제거됨(책사 광역 덤불 · 발동한 함정).</summary>
public bool Removed;
/// <summary>함정이 드러났다(발동).</summary>
public bool Revealed;
/// <summary>불 지대 남은 라운드(−1 = 영구) · 0 이 되면 Out.</summary>
public int BurnLeft = -1;
/// <summary>불이 꺼짐(잔해만 남음 · 효과 없음).</summary>
public bool Out;
/// <summary>군기 점령 진영(−1 = 중립 · 0 = 아군 · 1 = 적군).</summary>
public int Owner = -1;
/// <summary>전투 중 생긴 기믹(폭발·광역 불).</summary>
public bool Spawned;
/// <summary>배치만 있고 지대는 만들지 않는 생성 규칙(불 spawn_on_splash).</summary>
public bool Template;
public GameObject Go;
public readonly List<Collider2D> Colliders = new List<Collider2D>();
public GimmickView View;
public string Id
{
get { return Def != null ? Def.id : ""; }
}
public GimmickZone Zone
{
get { return Def.zone; }
}
public bool IsBlock
{
get { return Def.kind == GimmickKind.Block; }
}
/// <summary>이동을 막는다(장애물 · 부서지거나 제거되지 않음).</summary>
public bool BlocksMove
{
get { return IsBlock && !Broken && !Removed; }
}
/// <summary>지대 효과가 살아 있다.</summary>
public bool ZoneActive
{
get { return Def.kind == GimmickKind.Zone && !Removed && !Out && !Template; }
}
public bool Rolls
{
get { return Def.id == GimmickIds.Boulder; }
}
public bool IsBridge
{
get { return Def.id == GimmickIds.Bridge; }
}
/// <summary>정의 p(i) · 배치 params 가 있으면 그 값 · 둘 다 비면 fallback.</summary>
public float P(int i, float fallback = 0f)
{
float o = i == 1 ? Src.pOver1 : (i == 2 ? Src.pOver2 : Src.pOver3);
if (!float.IsNaN(o)) return o;
float d = i == 1 ? Def.p1 : (i == 2 ? Def.p2 : Def.p3);
return float.IsNaN(d) ? fallback : d;
}
public void SetCollidersEnabled(bool on)
{
foreach (var c in Colliders)
{
if (c != null) c.enabled = on;
}
}
/// <summary>모양·표시·콜라이더를 d 만큼 옮긴다(목책 밀기 · 바위 굴림).</summary>
public void MoveBy(Vector2 d)
{
Shape = Shape.Translated(d);
if (Go != null) Go.transform.position = new Vector3(Shape.Center.x, Shape.Center.y, 0f);
}
}
}