EerieVillage/Assets/Scripts/Skills/Test/TestSkillFireOn1to5.cs

120 lines
5.4 KiB
C#

using UnityEngine;
using UnityEngine.InputSystem;
using EerieVillage.Skills.Effectors;
namespace EerieVillage.Skills.Test
{
/// <summary>
/// PD 지시 (2026-05-13) 테스트용 — 키보드 1~5 키 영역 각 ActiveSkill 즉시 발사.
/// 1: A02 화염부 (파이어볼·Projectile)
/// 2: A04 뇌격부 (번개 충격·MeleeArea)
/// 3: A05 학익진 (Fan Slash·MeleeArea)
/// 4: 레이저 (Dragonfire Laser·MeleeArea)
/// 5: A13 천둥발 (Lightningball·Projectile Piercing)
/// </summary>
[RequireComponent(typeof(PlayerSkillInventory))]
public class TestSkillFireOn1to5 : MonoBehaviour
{
[Tooltip("키 1 (현재 A02 화염부)")] public ActiveSkillData Skill1;
[Tooltip("키 2 (현재 A04 뇌격부)")] public ActiveSkillData Skill2;
[Tooltip("키 3 (A05 학익진)")] public ActiveSkillData Skill3;
[Tooltip("키 4 (레이저)")] public ActiveSkillData Skill4;
[Tooltip("키 5 (A13 천둥발)")] public ActiveSkillData Skill5;
PlayerSkillInventory _inventory;
ActiveSkillRuntime[] _runtimes = new ActiveSkillRuntime[5];
readonly ProjectileSpawner _projSpawner = new ProjectileSpawner();
readonly LightningStrikeSpawner _lightningSpawner = new LightningStrikeSpawner();
readonly MeleeAreaSpawner _meleeSpawner = new MeleeAreaSpawner();
readonly LaserSpawner _laserSpawner = new LaserSpawner();
// PD 지시 2026-05-13 Phase B — 1키 A06 독 늪·2키 A11 정령불 매핑
readonly PoisonSwampSpawner _poisonSwampSpawner = new PoisonSwampSpawner();
readonly SpiritFireSpawner _spiritFireSpawner = new SpiritFireSpawner();
// BT12-Dev-Clone (2026-05-18) — A10 분신 Effector
readonly CloneEffector _cloneEffector = new CloneEffector();
void Awake()
{
EnsureRuntimes();
}
// PD 지시 2026-05-13 — Awake 시점 Inspector reference 미정합 가능성 대비 lazy init.
void EnsureRuntimes()
{
if (_inventory == null) _inventory = GetComponent<PlayerSkillInventory>();
// BT12-Dev-Clone (2026-05-18) — PD 지시: 1번키 영역 A10 분신 영역 강제 매핑.
// Inspector 영역 Skill1 영역 영역 영역 영역 영역 무관·항상 A10_bunsin.asset 영역 강제.
if (Skill1 == null || Skill1.CardId != "A10")
{
var a10 = Resources.Load<ActiveSkillData>("Skills/Active/A10_bunsin");
if (a10 != null)
{
Skill1 = a10;
_runtimes[0] = null; // 재 init 영역
}
}
ActiveSkillData[] datas = { Skill1, Skill2, Skill3, Skill4, Skill5 };
for (int i = 0; i < 5; i++)
{
if (_runtimes[i] != null) continue;
if (datas[i] == null) continue;
_runtimes[i] = new ActiveSkillRuntime(datas[i]);
_runtimes[i].OnEquip(_inventory);
}
}
void Update()
{
EnsureRuntimes();
if (Keyboard.current == null) return;
if (Keyboard.current.digit1Key.wasPressedThisFrame) Fire(0);
else if (Keyboard.current.digit2Key.wasPressedThisFrame) Fire(1);
else if (Keyboard.current.digit3Key.wasPressedThisFrame) Fire(2);
else if (Keyboard.current.digit4Key.wasPressedThisFrame) Fire(3);
else if (Keyboard.current.digit5Key.wasPressedThisFrame) Fire(4);
}
void Fire(int idx)
{
var rt = _runtimes[idx];
if (rt == null || _inventory == null) return;
var data = rt.ActiveData;
// 카테고리 분기
if (data.Category == ActiveCategory.Projectile)
{
_projSpawner.Trigger(rt, _inventory);
}
else if (data.Category == ActiveCategory.MeleeArea)
{
// CardId 기반 분기 (SkillFireEvent 동일 패턴)
if (data.CardId == "A04") _lightningSpawner.Trigger(rt, _inventory);
else if (data.CardId == "A_Laser") _laserSpawner.Trigger(rt, _inventory);
else _meleeSpawner.Trigger(rt, _inventory);
}
// PD 지시 2026-05-13 Phase B — A06 독 늪 (PlacementPersistent)·A11 정령불 (Minion)
else if (data.Category == ActiveCategory.PlacementPersistent)
{
_poisonSwampSpawner.Trigger(rt, _inventory);
}
else if (data.Category == ActiveCategory.Minion)
{
// BT12-Dev-Clone (2026-05-18) — A10 분신 CardId 분기 (SkillFireEvent.Execute 동일 패턴)
if (data.CardId == "A10") _cloneEffector.Trigger(rt, _inventory);
else _spiritFireSpawner.Trigger(rt, _inventory);
}
// BT12-Dev-Clone (2026-05-18) — Player 발동 영역 분신 hook 발화
// IsCloneFireActive 분기 — 분신 발동 시 발화 X (무한 재귀 방지)
// Test 영역 직접 Effector.Trigger 영역 ActiveSkillRuntime.Fire 영역 영역 X·OnPlayerSkillFired 발화 X →
// 본 영역 영역 별도 발화 영역 추가 (분신 영역 hook 영역 미러링 발동)
if (!_inventory.IsCloneFireActive)
_inventory.RaisePlayerSkillFired(rt);
}
}
}