Commit Graph

213 Commits

Author SHA1 Message Date
깃 관리자 70c98dd3a8 fix(BT12-Dev-Clone): SkillFireEvent namespace 정정 (Events 추정 → 부모 namespace 자동 인식)
CS0234 컴파일 오류 fix:
- 본 PM 추정 오류 — SkillFireEvent namespace = EerieVillage.Skills (.Events 영역 X)
- CloneInstance.cs L202 영역 EerieVillage.Skills.Events.SkillFireEvent → SkillFireEvent 단순화
- parent namespace EerieVillage.Skills 자동 인식 (CloneInstance namespace = EerieVillage.Skills.Effectors)

자성: C39-10 위반 (신규 코드 영역 기존 시스템 namespace 사전 실측 X·feedback_new_code_existing_system_dependency_unmeasured 재발)
2026-05-18 15:13:02 +09:00
깃 관리자 171506e16d feat(BT12-Dev-Clone): A10 분신 스킬 4단계 완전 구현
PD 명세 5항목 + PD 결정 4건 정합:
- 위치: facing 반대 1유닛 (CloneInstance.SpawnOrReplace)
- 외형: 반투명 alpha 0.5 (SpriteRenderer 복제)
- 동작: 동일 스킬 미러링 (OnPlayerSkillFired hook + 0.5초 지연 큐)
- 공격력: 50% 반감 (CalculateEffectiveDamage IsCloneFireActive 분기)
- 타이밍: 0.5초 딜레이 (FIRE_DELAY_SECONDS)
- BaseCooldown 25초·MinionLifetime 12초·facing 고정·무적(Collider 미부착)
- Lv 업 메커니즘: 분신 수 X·지속시간+데미지 비율 ↑ (balance 후속)

신규 4 (CloneInstance·CloneEffector·A10_bunsin.asset·CloneSkillTests + .meta)
수정 10 (PlayerSkillInventory·ActiveSkillRuntime·SkillFireEvent·SkillRuntimeFactory·6 Effector)
γ helper: PlayerSkillInventory.GetSpawnAnchor·GetSpawnFacing — 6 Effector 진입점 단일화
2026-05-18 09:39:46 +09:00
깃 관리자 392ef3a11f fix(BT12-Dev): 몬스터 판정 영역 시각화 제거 (PD 지시 2026-05-15)
PD 발화: "몬스터 판정 영역을 제거해줘."

EnemyController.OnDrawGizmos 폐기:
- VisualBounds wire cube (붉은색) 제거
- _collider.bounds wire cube (노란색) 제거
- Application.isPlaying 시점 Editor Scene 보조선만 출력하던 영역 정합

게임 동작 (Update Player ↔ Enemy 충돌 판정·Decrement) 영역 영향 X.
Editor Scene 영역 wire cube 시각만 사라짐.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 16:35:46 +09:00
깃 관리자 2b463245db tweak(BT12-Dev): A06 독 늪 Player fallback Y -0.5 → -0.2 (PD 지시 2026-05-15)
PD 발화: "독늪이 플레이어 위치에서 생성될 경우 플레이어의 Y값에서
-0.5가 아니라 -0.2 아래의 위치에 생겨야할거 같아"

직전 commit 664607a 수치 조정만:
  spawnPos.y = playerPos.y - 0.5 + OffsetXY.y
            ↓
  spawnPos.y = playerPos.y - 0.2 + OffsetXY.y

OffsetXY (PD Inspector 미세 조정 영역)은 그대로 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 13:44:20 +09:00
깃 관리자 664607aff4 fix(BT12-Dev): A06 독 늪 Player fallback y -0.5 (PD 지시 2026-05-15)
PD 보고: "독늪이 플레이어 위치에서 생성될 경우 플레이어의 Y값에서
-0.5정도 아래의 위치에 생겨야할거 같아"

직전 commit 3c5a3bc 의 Player fallback ground Raycast 영역 — Player
ground 위 발판 hit (예: -2.61) → spawn 위치 ground 표면. PD 의도는
Player.y - 0.5 직접 (시각 정합·발 아래 한 키 정도).

분기 정정:
- nearest != null (지상 Enemy 후보): Enemy 위치 ground Raycast (기존 영역)
- nearest == null (공격 가능 적 없음·Player fallback):
  spawnPos = (playerPos.x + OffsetXY.x, playerPos.y - 0.5 + OffsetXY.y)
  · ground Raycast 폐기 · PD 명시 수치 직접

검증 (Play 모드):
- 비박쥐 13기 사망 + 박쥐 1기만 (IsFlying skip)
- Player pos=(-15.14, -2.21) · OffsetXY=(0, -0.4)
- Swamp pos=(-15.14, -3.11) = Player.y - 0.5 + OffsetXY.y(-0.4) 정합

OffsetXY는 PD Inspector 추가 미세 조정 영역 (현 -0.4).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 12:10:53 +09:00
깃 관리자 3c5a3bce31 fix(BT12-Dev): A06 독 늪 IsFlying 강제 재 check (PD 진단 2026-05-15)
PD 추가 보고: "여전히 독 늪이 공중 몬스터의 Y 위치에 발생되고 있어.
공격 가능한 적이 없을 경우(공중 몬스터만 있을 경우 등) 독 늪이
플레이어 X 위치에서 이동 가능한 영역 바닥에 생성 되도록 해줘."

원인: 직전 commit 2516ef9 의 e.IsFlying check 영역 — Enemy.Awake/Start
호출 순서·controller late assign race 시 IsFlying=false 잔존 가능 →
박쥐 nearest 후보 영역 → 박쥐 y 위치 spawn (Raycast hit 후 ground y 사용
하더라도 박쥐가 ground 위에 있다면 박쥐 위치 그대로).

정정: PoisonSwampSpawner.Trigger 루프 영역 e.RecheckFlyingFromAnimator()
강제 호출. Animator.runtimeAnimatorController.name 영역 flyingControllerNames
list 매칭 → IsFlying 즉시 갱신.

검증 시나리오 (Play 모드):
- 비박쥐 Enemy 13기 사망 처리 (Player 주변 박쥐 1기만 남김)
- 박쥐 1기 IsFlying=True 정합
- A06 발사 → spawn pos=(-15.14, -2.61) = Player.x(-15.14) + ground.y(-2.61)
- 박쥐 y=-2.00 위치 영역 spawn 안 됨 (차단 정합)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 12:07:10 +09:00
깃 관리자 2516ef9cb1 fix(BT12-Dev): A06 독 늪 ground 영역만 spawn (PD 지시 2026-05-15)
PD 보고: "독 늪은 공중에 생성 되지 않도록 수정해줘. (플레이어나
몬스터가 밟고 이동할 수 있는 영역에만 생성 가능해야 함)"

정정 PoisonSwampSpawner.Trigger:
1. nearest Enemy 탐색에서 IsFlying=true (박쥐 등) skip
   - 공중 박쥐 위치 spawn 후보 제외
2. spawn 후보 (nearest 또는 Player 위치 + OffsetXY) 에서
   Vector2.down Raycast (거리 20, groundLayerMask Layer 0 + Layer 16)
3. Raycast hit X → return (spawn 차단)
4. Raycast hit O → spawnPos.y = groundHit.point.y (ground 표면 위)

groundLayerMask = (1 << 0) | (1 << 16):
- Layer 0 : Level Tilemap (메인 ground)
- Layer 16: Floating 발판 (Foreground)

검증 (Play 모드):
- 시나리오 1 (Player 지면): spawn 1기·pos.y=-2.88 (ground 위)
- 시나리오 2 (Player y=50 공중·모든 Enemy IsFlying): spawn 증가 0 (차단)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 11:08:30 +09:00
깃 관리자 7c0aaf341c feat(BT12-Dev): 공중 몬스터 flyingYOffset Inspector 신설 (PD 지시 2026-05-15)
PD 결정: "B안으로 진행해" (Inspector 단일 수치·전 박쥐 일괄·확장 일관)

EnemyController.flyingYOffset float Inspector (기본 2f) 신설.
IsFlying=true 첫 set 시 transform.position.y += flyingYOffset 자동
적용 (_flyingOffsetApplied flag 영역 중복 적용 차단).

- Awake / Start / MonsterRandomizer.Awake 영역 다중 호출 케이스에서도
  1회만 적용
- Rigidbody2D.position 동시 갱신 (KinematicObject 정합)
- _startY 갱신 (fallThreshold 기준점·IsFlying=true 영역 skip 안전망)

검증 (Play 모드):
- 박쥐 3기 모두 flyingYOffset=2 적용
- pos.y: -2.00·-1.90·-1.90 → 0.00·0.10·0.10 (지면 +2 정합)

PD Inspector flyingYOffset 영역 수치 조절로 박쥐 높이 변경 가능.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 08:33:19 +09:00
깃 관리자 190c96918b refactor(BT12-Dev): IsFlying 속성 SOT EnemyController 단일화 (PD 지적 2026-05-15)
PD 지적: "enemy 랜덤풀에 플라잉 몬스터를 설정하는게 아니라
개별 몬스터 특성에 플라잉 속성을 부여해야하지 않을까?"

직전 commit 60c2e9b 의 2 위치 분산 (MonsterRandomizer.flyingFlags +
EnemyController hardcoded "M002") 정정. SOT 단일화.

설계:
- EnemyController.flyingControllerNames string[] (Inspector 기본
  { "M002" }) — 개별 몬스터 특성 IsFlying 속성 단일 SOT
- EnemyController.RecheckFlyingFromAnimator() public method 신설
  · Animator.runtimeAnimatorController.name 영역 flyingControllerNames
    list 매칭 → IsFlying=true 자동
  · control.gravityModifier=0·velocity=0·ignoreCollisions=true 일괄
- EnemyController.Awake + Start 영역 RecheckFlyingFromAnimator 호출
- MonsterRandomizer.Awake 영역 controller random 후 위임 호출만

폐기:
- MonsterRandomizer.flyingFlags bool[] (분산 SOT 폐기)
- MonsterRandomizer name fallback "M002" hardcoded (분산 폐기)
- EnemyController.Awake 직접 hardcoded "M002" check (분산 폐기)

확장: 후속 공중 몬스터 추가 (예: 까마귀 M005) 시 PD Inspector
flyingControllerNames 배열에 controller name 추가만 하면 자동 적용.

검증 (Play 모드):
- 총 Enemy 16기 · M002 박쥐 3기 모두 IsFlying=True
- M005 등 비박쥐 IsFlying=False · gravMod=1 (지상 정상)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 00:35:47 +09:00
깃 관리자 60c2e9bf09 fix(BT12-Dev): 박쥐 IsFlying Animator name 자동 감지 (PD 진단 2026-05-15)
PD 추가 보고 + 스크린샷: "여전히 박쥐 몬스터가 공중에 떠있지 않고
움직이지도 않아"

진단 결과: Enemy.prefab 영역 MonsterRandomizer 부착 X · Animator
직접 M002.overrideController 부착. 직전 commit 6be8ccd 의
MonsterRandomizer flyingFlags / name fallback 영역 발화 X →
IsFlying=False 잔존 → gravity·collide 정상 적용 → 박쥐 지상 정지.

정정:
- EnemyController.Awake 영역 Animator.runtimeAnimatorController.name
  "M002" 포함 시 IsFlying=true 자동 set
- 기존 MonsterRandomizer name fallback 도 보존 (랜덤 케이스 대비)

검증 (Play 모드):
- Enemy 16기 중 박쥐 3기 모두 IsFlying=True·ignoreCollisions=True·
  gravMod=0 자동 set
- 1기 velocity=(-3.50, 0) patrol 이동 중·2~3기 wait 상태 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 00:31:55 +09:00
깃 관리자 6be8ccd567 fix(BT12-Dev): 박쥐 이동 X 정정 — KinematicObject.ignoreCollisions (PD 지시 2026-05-15)
PD 추가 보고: "공중에 체공하게 한 몬스터가 여전히 이동하지 않아"

원인: 직전 commit 40600da (gravity 0·cliffCheck skip·fallThreshold skip)
후에도 transform.position x 변동 0. velocity=(-3.50, 0) 정상이나 실제
이동 X. KinematicObject.PerformMovement body.Cast 영역 발판·기타
collider hit → distance reduce → body.position += move * 0 → 이동 0.

정정:
1. KinematicObject.ignoreCollisions bool 신설.
   FixedUpdate 영역 ignoreCollisions=true 시 Cast skip:
   body.position += velocity * Time.deltaTime 단순 이동.
2. EnemyController.Awake + Start 영역 IsFlying=true 시 control.ignoreCollisions=true 자동 set.
   Start 영역 보강 — MonsterRandomizer.Awake → IsFlying=true set 시점이
   EnemyController.Awake 이후 케이스 (Unity Awake 호출 순서 무관 보장).

검증 (Play 모드 3초):
- [t=0]  pos=(-15.20, 0.50) ignoreCollisions=True
- [t=3s] pos=(-18.94, 0.50) velocity=(-3.50, 0) — x Δ=-3.74 이동·y 유지

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 00:22:08 +09:00
깃 관리자 40600da46a feat(BT12-Dev): 박쥐 (M002) 날으는 몬스터 — IsFlying flag (PD 지시 2026-05-15)
PD 보고:
1. "Enemy_M002_Bat 몬스터는 날으는 몬스터이기 때문에 y위치를 높이고
   싶은데 자꾸 땅으로 내려오는 현상을 수정해줘."
2. "이 몬스터가 이동하지 못하는 이유를 체크해보고 수정해줘."

원인 진단:
1. KinematicObject.FixedUpdate L107 else 분기 (velocity.y>=0)
   gravityModifier 무시·무조건 Physics2D.gravity 적용
   → 박쥐 gravityModifier=0 해도 천천히 떨어짐
2. EnemyController.UpdatePatrol cliffCheck Raycast 영역 공중 박쥐
   발 밑 ground 없음 → 즉시 TriggerReverse → 1초 cooldown 후 다시
   검출 → 무한 좌우 반전 → 이동 0
3. EnemyController.Update L361 fallThreshold 떨어짐 검출
   → 강제 텔레포트 _startY 복귀

정정:
1. KinematicObject.FixedUpdate else 분기에도 gravityModifier 곱
   gravityModifier=0 → 자연 중력 무효 (Player gravityModifier=1 영역
   영향 X·기존 동작 보존)
2. EnemyController.IsFlying bool 신규 (Inspector)
   - Awake 영역 IsFlying=true → control.gravityModifier=0·velocity=0
   - UpdatePatrol cliffCheck 영역 !IsFlying 분기 (cliff skip)
   - Update 떨어짐 텔레포트 영역 !IsFlying 분기 (skip)
3. MonsterRandomizer.flyingFlags bool[] 신규 (Inspector·동일 length)
   - Awake 영역 random idx · flyingFlags[idx]=true → EnemyController.IsFlying=true 자동 set

검증 (Play 모드):
- IsFlying=true 강제 set + y +3 이동
- [t=0] pos.y=0.50 · gravMod=0
- [t=3s] pos.y=0.50 (유지·떨어짐 X) · velocity=(-3.50, 0) (x patrol 이동·y 0)

PD 후속: Enemy.prefab Inspector MonsterRandomizer.flyingFlags 영역
박쥐 (M002) idx 영역 true 설정 필요.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 00:18:06 +09:00
깃 관리자 b86cecf4a1 fix(BT12-Dev): A11 정령불 hit 모션·flash 발화 (PD 지시 2026-05-14)
PD 보고: "정령불의 피격 범위에 있는 적은 EnableRepeatDamage가
체크되어있는데도 피해를 받지 않고 있어"

직접 진단 — Play 모드 [SpiritFire][Tick] Debug.Log 측정:
- 박스 center·size 정합 · OverlapBox enemyHit=1·dmg=5 6회 호출 확인
- A11 hit·damage 자체는 정상 동작

진짜 원인: DecrementBypassInvuln (DoT 함수·hit 모션·flash 발화 X)
호출. Enemy maxHP=99999 → 매 초 5 감소 = 시각상 변화 X·hit flash X
→ PD 인식상 "피해 X".

정정:
- DecrementBypassInvuln → DecrementBypassInvulnWithHit
- A05·Laser·Lightning·MeleeArea 동일 패턴 (hit 모션 + 붉은 flash 1f)
- A06 PoisonedEnemyMarker 영역 DoT 표현 의도라 DecrementBypassInvuln 유지

부속:
- 진단 Debug.Log 회수 (목적 달성)

검증 (Play 모드 직전 측정·진단 회수 전):
- center=(-13.81, -2.28) totalHit=3 enemyHit=1 dmg=5 (6회 연속 출력)
- A11 매 DotInterval 1초 hit 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 23:58:51 +09:00
깃 관리자 5f7001a9a9 fix(BT12-Dev): A11 정령불 OffsetDistance 적용 (PD 지시 2026-05-14)
PD 보고: "정령불은 피격 범위의 offset distance가 적용되지 않고 있어"

원인: SpiritFireInstance.Update center = Player.position 그대로·
박스 시각 dbg.localPosition = zero. OffsetDistance 적용 누락.

정정 (A05·Laser 동일 패턴·signX + Vector2):
1. SpiritFireSpawner.Trigger 영역 facing sign + OffsetDistance Vector2
   offset 계산 → Init 인자로 전달 (Init signature 확장).
2. SpiritFireInstance._offset 신규 필드.
3. 박스 시각 localPosition = (_offset.x / lpx, _offset.y / lpy)
   (Player.lossyScale 보정).
4. 판정 center = Player.position + _offset (Update 매 frame).

검증 (Play 모드):
- test OffsetDistance (0, 1.5) 적용
- 박스 worldPos Δ from Player = (0, 1.50) ✓
- localPosition (0, 0.88) — Player.lossyScale.y=1.7 보정 정합

PD Inspector 실측: OffsetDistance=(0, 2)·HitboxSize=(3.4, 1.0)
정합 적용.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 23:28:13 +09:00
깃 관리자 e2b446e0f4 feat(BT12-Dev): A06·A11 판정 박스 시각화 + A11 OverlapBox 전환 + 페이드 (PD 지시 2026-05-14)
PD 발화 2건:
1. "독 늪 소환의 판정(중독 효과 발생 가능한 범위)와 정령불의
   판정 범위도 박스 형태로 보여줘 (정령불의 범위에 있는 적은
   정령불이 유지되는 동안 일정한 피해 간격마다 피해를 입어야 해)"
2. "정령불 이펙트는 소멸되기 0.5초 전부터 알파값을 증가시키고
   크기를 최대 현재 크기 기준으로 최대 50%까지 줄어들며 사라지도록
   해줘."

A06 독 늪 (PoisonSwampInstance):
- PoisonSwampHitbox_Debug 자식 GO 신규 — BoxCollider2D.size 일관
  SpriteRenderer (1, 0, 0, 0.35) · sortingOrder 100 · ShowDebugVisuals 토글

A11 정령불 (SpiritFireSpawner / Instance):
- OverlapCircle → OverlapBox (HitboxSize 사용·박스 시각 ↔ 판정 정합)
- AuraRadius 의존 제거 · _radius (float) → _boxSize (Vector2)
- SpiritFireHitbox_Debug Player 자식 GO — Player 이동 동조
- 피해 간격 = DotInterval (기본 1초·Inspector 조절)
- 소멸 0.5초 전 페이드 (PD 의도 "투명도 증가" = alpha 1→0):
  · FADE_DURATION=0.5 · alphaMul = 1-t · scaleMul = 1-0.5t
  · Renderer·MaterialPropertyBlock·_baseAlphas 캐싱 (Projectile 동일 패턴)
  · _TintColor 또는 _Color 자동 분기

PlayerSkillInventory.StaleSpawnNames:
- PoisonSwampHitbox_Debug·SpiritFireHitbox_Debug·MeleeHitbox_Debug2 추가
- 게임 재실행 시 cleanup catch 정합

검증 (Play 모드):
- A06 발사 → PoisonSwampHitbox_Debug visible=True (parent FX_Venom_Swamp)
- A11 발사 → SpiritFireHitbox_Debug visible=True (parent Player·scale 2.5,2.5)
- A11 HitboxSize=(2.5, 2.5)·DotInterval=1·MinionLifetime=8 정합

SOT (스킬_이펙트_확정_v1.md) §4 변경 이력 갱신.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 23:14:05 +09:00
깃 관리자 1a1de0c0f3 feat(BT12-Dev): 2차 판정 박스 옵션 + A12 정화의 빛 상·하 (PD 지시 2026-05-14)
PD 요청:
1. 정화의 빛 (A12) 판정 범위 2개 필요
2. 모든 스킬 영역 — 체크박스로 추가 판정 범위 지정 가능

ActiveSkillData 신규 필드 (Header "2차 판정 박스 (선택)"):
- bool EnableSecondHitbox  체크박스 (기본 false)
- Vector2 SecondHitboxSize (기본 (1.5, 1.0))
- Vector2 SecondOffsetDistance (기본 (0, 0))

MeleeAreaSpawner.cs 분리·일반화:
- SpawnHitboxVisual static helper 신규 (1차·2차 박스 공통)
- DoOverlapBoxAt static helper 신규 (1차·2차 판정 공통)
- Trigger 영역 EnableSecondHitbox 분기 → 2차 박스·이펙트 위치 spawn
- DoOverlapBoxFromPlayer 영역 EnableSecondHitbox 분기 → 2차 판정 위치 OverlapBox
- facing sign 1차·2차 동일 적용 (좌/우 일관 반전)

A12_jeonghwauibit.asset placeholder (PD Inspector 미세 조정 가능):
- HitboxSize: (4,4) → (1.5, 5) 1차 vertical 줄기
- OffsetDistance: (0,0) → (0, 3) Player 위쪽 3
- EnableSecondHitbox: 1
- SecondHitboxSize: (1.5, 5) 2차 vertical 줄기
- SecondOffsetDistance: (0, -3) Player 아래쪽 3

검증 (Play 모드):
- A12 발사 → MeleeHitbox_Debug + MeleeHitbox_Debug2 동시 spawn
- 1차 pos.y = Player(-2.18) + offset.y(+3) = 0.82 ✓
- 2차 pos.y = Player(-2.18) + offset.y(-3) = -5.18 ✓
- 각 박스 scale = (1.5, 5) vertical 줄기 정합

후속: Laser·Lightning·Projectile spawner 영역 SecondHitbox 적용은
PD 요청 발생 시점에 동일 패턴 (Helper extract → 2차 분기) 정합.
공통 필드는 본 commit 으로 일괄 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 22:25:02 +09:00
깃 관리자 e02dd69b3f test(BT12-Dev): Enemy HP 99999 + 기본 공격 파이어볼 제거 (PD 지시 2026-05-14)
PD 요청 2건:
1. 몬스터 HP 99999 (테스트용·1 hit kill 회피)
2. 기본 공격 파이어볼 발사 X

정정:

1. Enemy.prefab Health
   - maxHearts: 250000 → 24999 (99999 / QuartersPerHeart 4)
   - maxHP: 1000000 → 99999
   - RandomMaxHPRange: (99999, 99999) 신규 부착
   - Health.Awake L373 RandomMaxHPRange 우선 분기 활용 →
     fallback random(30~41) 회피·정확 99999 보장.

2. StartingCardIds 빈 배열 적용 2 경로:
   - Scripts/Skills/Runtime/PlayerSkillInventory.cs 기본값
     new string[] { "A02" } → new string[] { }
   - Scenes/Ingame.unity Player GameObject Inspector override
     "- A02" → [] (빈 배열)

검증 (Play 모드):
- StartingCardIds count=0
- active skill slots=0 (자동 발사 안 됨)
- Enemy[0] maxHP=99999 maxHearts=24999 IsAlive=True

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 22:19:02 +09:00
깃 관리자 1ab60ed0c3 fix(BT12-Dev): A06 독 늪 등 Effector trigger collider 통과 (PD 진단 2026-05-14)
PD 보고 + Console 로그 결정적:
"[Projectile][WallHit-OnTrigger] cardId=A02 other=PoisonSwamp_Collider
 parent=FX_Venom_Swamp(Clone) layer=0(Default) isTrigger=True
 pos=(-7.30, -0.30, 0.00) dist=5.00/8"

원인: 직전 commit 708ba08 isWall = (Layer 0) 정정 후에도 A06 독 늪
PoisonSwamp_Collider (Layer 0 + isTrigger=true) 가 Wall 판정 통과 →
빠른 투사체 (A02 dist=5/8 = 62.5%) 조기 SelfDestruct.
느린 A13 정상은 0.1초 grace 통과 + 짧은 거리 우연 회피.

정정:
- isWall = (Layer 0) && !other.isTrigger
- Level Tilemap (non-trigger) 만 Wall 차단
- Effector spawn trigger collider (A06 독 늪·CinemachineConfiner·
  Token·DeathZone·기타 Layer 0 Trigger) 모두 통과

Wall OverlapPoint (Update L186) 영역 이미 filter.useTriggers=false 로
trigger 제외 정합 — 변경 불필요.

진단 Debug.Log 2건 회수 (목적 달성).

검증 (PD Play 확인 필요):
- A02 (속도 6)·A08·A14·A15 빠른 투사체 MaxRange 까지 정상 비행
- 독 늪 범위 통과
- Level Tilemap 벽 충돌 시 SelfDestruct 유지

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 22:08:50 +09:00
깃 관리자 4c00378d78 feat(BT12-Dev): 박스 시각화 ON + 맵 경계 멈춤 진단 로그 (PD 지시 2026-05-14)
PD 보고 2건:
1. "투사체 판정 범위를 다시 보여줘"
2. "파이어볼이나 저주의 화살과 같은 투사체 형태는 여전히 맵이
   연결되는 경계선을 넘지 못하고 제자리에서 멈추다가 소멸하고 있어.
   (단, 속도가 느린 투사체는 정상적으로 날아감)"

정정:
1. HitboxDebug.ShowDebugVisuals false → true
   - Range_Debug (파란 박스)·ProjectileHitbox_Debug (붉은 박스)·
     LaserHitbox_Debug·MeleeHitbox_Debug·Hitbox_Debug 일괄 노출.
   - SpriteRenderer.enabled toggle 만 — GameObject·LiveHitboxSync 부착 정상.

2. Projectile.OnTriggerEnter2D Wall hit 시 + Update Wall OverlapPoint
   hit 시 진단 Debug.Log 추가:
   - [Projectile][WallHit-OnTrigger] cardId·other.name·parent·layer·
     isTrigger·pos·dist/maxRange
   - [Projectile][WallHit-OverlapPoint] cardId·hit.name·parent·layer·
     pos·dist/maxRange

PD Play 후 Console "[Projectile][WallHit-*]" 로그 + 박스 시각으로
어떤 collider 가 빠른 투사체 (A02·A08·A14·A15) 를 차단하는지
정확 식별. 본 PM 후속 정정 시 회수 의무.

원인 가설: 직전 commit 708ba08 Layer 16 제외 후에도 잔존 →
다른 collider (CinemachineConfiner Trigger·InfiniteHorizontalGround
Left/Right 자식·Background segment 등) hit 가능성.
A13 (속도 2.5) 정상·A02 (속도 6)·A08 영역 차단 — 빠른 투사체에서만
재현 패턴 정합.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 22:06:15 +09:00
깃 관리자 708ba087ed fix(BT12-Dev): Floating 발판 통과 정정 — Wall 판정 Layer 0 only (PD 지시 2026-05-14)
PD 보고: "화면 스크롤이 되는 위치에 투사체가 날아가다가
충돌되면서 원래 사거리만큼 날아가지 못하는 현상 수정해줘"

원인: Projectile.OnTriggerEnter2D L272 isWall 판정에 Layer 16
(Foreground·Floating 발판) 포함. 화면 스크롤 시 노출되는
Floating_T*_* 발판 18개 (BoxCollider2D non-trigger) 와 Projectile
(trigger collider) 통과 순간 OnTriggerEnter2D 발화 → SelfDestruct.

정정:
- isWall = (otherLayer == 0)  // Level Tilemap 만 (Layer 16 제외)
- Floating 발판은 Player·Enemy 점프 통과 의도이며 Projectile 도
  통과 정합.

Wall OverlapPoint (Update L186) 영역 WallLayerMask = (1<<0) 으로
이미 Layer 0 만 catch — 정합 유지.

검증 (Play 모드):
- A02 MaxRange=8 Speed=6
- FX_Fireball_Bullet(Clone) spawn 정합
- isWall 판정 Layer 0 only — Floating Layer 16 통과 보장

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 22:00:22 +09:00
깃 관리자 7c894c60da fix(BT12-Dev): 잔존 cleanup Scene root 재귀 + Projectile.Awake 자기 destroy (PD 지시 2026-05-14)
PD 추가 진단 (스크린샷 + 발화): "게임 플레이 후 스크롤 되는 맵에
여전히 남아있는 상태야. 아마 스크롤 되며 연장되는 맵 영역이
초기화 되지 않는 것으로 예상 돼"

이전 commit ea239fe (3중 진입점 + FX clone prefix) 의 catch 누락
가능성 차단:

1. PlayerSkillInventory.DoCleanupStalePooledSpawns 영역
   Resources.FindObjectsOfTypeAll → Scene.GetRootGameObjects + 재귀
   변경. hideFlags hidden GO 누락 우려 제거·정확도 향상.
   CollectStaleRecursive 신규 — 자식 트리 재귀 탐색.
   IsStaleByName 헬퍼 — 이름 매칭 통합.

2. Projectile.Awake 신규 — _data == null && _runtime == null 상태
   (= Initialize 미호출 잔존) 시 1 frame 유예 후 자기 destroy.
   PlayerSkillInventory cleanup 누락 케이스 자체 정리 (2중 방어).
   InfiniteHorizontalBackground·기타 컴포넌트 자식 부착된 잔존도
   본 자가 destroy 로 catch.

측정 (Play 진입 직후):
- AfterSceneLoad static cleanup removed=0
- Awake cleanup removed=0
→ 이전 Play 잔존 = 0건 (Scene load·Awake 시점)
→ Hierarchy 영역 시각상 spawn = 자동 발사 진행 결과

후속: PD Refresh + Play → 화면 잔존 재확인 필요.
잔존 시 Console "[PlayerSkillInventory] ... removed=N" 로그 +
스크린샷 으로 본 PM 추가 진단.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 21:11:38 +09:00
깃 관리자 ea239fef54 fix(BT12-Dev): 잔존 spawn cleanup 강화 — 3중 진입점 + FX clone catch (PD 지시 2026-05-14)
PD 추가 보고: "여전히 씬을 실행할 때 이전에 생성 된 풀링 오브젝트가 남아있어"

직전 commit 01865b8 Awake cleanup 1회만 호출 — 진입점 보강.

강화 사항:
1. RuntimeInitializeOnLoadMethod(AfterSceneLoad) 정적 cleanup 추가
   — Awake 보다 선행하는 Scene load 직후 진입점.
2. Awake cleanup 무조건 Debug.Log (removed=0 케이스도 호출 확인 가능).
3. DelayedCleanupCoroutine — Awake 후 1·3·10 frame 추가 cleanup
   (다른 컴포넌트 Awake/Start spawn 케이스 catch).
4. StaleClonePrefixes 신규 — FX clone 7종 prefix 매칭
   (FX_Fireball_Bullet·FX_Lightningball·FX_Dragonfire·FX_Thunder·
    FX_SLASH·FX_PinkMagicArrow·Projectile_*).
5. DoCleanupStalePooledSpawns static 메서드 통합 — useImmediate 옵션
   (정적 호출 시 DestroyImmediate·Awake 호출 시 Destroy).

측정 (Play 진입 직후):
- AfterSceneLoad static cleanup removed=0
- Awake cleanup removed=0
→ 이전 Play 잔존은 0건. Hierarchy 영역 보이는 spawn 은
   현재 Play 의 정상 자동 발사 결과 (BaseCooldown Tick spawn) 로 추정.

후속: PD 재현 시나리오 (Stop→Play 또는 Editor crash 후 재실행 등)
직접 확인 필요. Console 영역 "[PlayerSkillInventory] ... removed=" 로그로
cleanup 호출·잔존 카운트 확인 가능.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 18:24:44 +09:00
깃 관리자 01865b88fb feat(BT12-Dev): 게임 재실행 시 잔존 spawn 강제 cleanup (PD 지시 2026-05-14)
PD 보고: "게임 플레이 중 종료했다가 다시 시작할 경우 이전 게임
플레이 중 생성 된 투사체가 여전히 남아있어. 게임을 재실행할 때
기존에 생성 된 풀링 오브젝트가 소멸될 수 있도록 수정해줘."

PlayerSkillInventory.Awake 시점 CleanupStalePooledSpawns 호출:
- Projectile 및 파생 (HomingProjectile·PiercingProjectile) component
  부착 GameObject 전수 destroy
- 박스 시각화 name 5종 (Hitbox_Debug·ProjectileHitbox_Debug·
  LaserHitbox_Debug·MeleeHitbox_Debug·Range_Debug) destroy
- Resources.FindObjectsOfTypeAll + scene.IsValid filter
  (asset prefab 제외)
- removed 카운트 Debug.Log

기존 HideFlags.DontSave (60e28e3) 정합 외 추가 보험:
- DontDestroyOnLoad 경로 (코드베이스 검색 0건 — 방어 코드)
- Scene 영구 저장 누락 케이스
- 메모리 잔존 (Editor crash 후 재시작 등)

검증 (Play 모드):
- A02·A05 발사 후 spawn 카운트 6
- CleanupStalePooledSpawns 직접 호출 + 1 frame 후 카운트 0

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:43:52 +09:00
깃 관리자 b52c99d714 fix(BT12-Dev): 적 조준 하단 보정 0.5 → 0.25 (PD 지시 2026-05-14)
PD 보고 — 0.5 하단 보정 영역 너무 하단. 이전 (0)·1차 (0.5) 중간 0.25 영역 변경.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 00:26:13 +09:00
깃 관리자 eb33e6414b feat(BT12-Dev): 피격 이펙트 sortingOrder +100·적 추적 각도 하단 보정 (PD 지시 2026-05-14)
작업 1 — 피격 이펙트 상위 sortingOrder:
- Projectile.OnTriggerEnter2D OnHitFx — Renderer.sortingOrder += 100
- LightningStrikeSpawner OnHitFx + ExtraHitFx — 동일
- MeleeAreaSpawner fxGo — 동일
- LaserSpawner fx — 동일
- Enemy SpriteRenderer 영역 위·뒤쪽 가림 회피

작업 2 — 적 추적 각도 하단 보정:
- ProjectileSpawner.Trigger TargetEnemyOnFire 영역 toEnemy.y -= 0.5
- 적 transform.position 영역 상단 영역·hitbox 영역 영역 영역 적중 정합
- A08 영역 영역 영역 영역 영역 영역 적 hitbox 영역 영역 영역 적중

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 00:23:40 +09:00
깃 관리자 55ee4f390b feat(BT12-Dev): A08 캐스팅 제거·Player spawn·가장 가까운 적 방향 발사 (PD 지시 2026-05-14)
작업 1 — 캐스팅 이펙트 제거:
- A08.asset OffsetDistance.x 1.5 → 0 (Player 위치 spawn)
- A08.asset CastFxPrefab null

작업 2 — 가장 가까운 적 방향 발사:
- ActiveSkillData.TargetEnemyOnFire (bool) 신규 필드
- ProjectileSpawner.Trigger — TargetEnemyOnFire=true 시 FindObjectsByType<EnemyController> 영역 nearest 검출·facing = (enemyPos - playerPos).normalized
- 적 0명 시 PlayerController.Facing fallback (기존 정합)
- A08.asset TargetEnemyOnFire=1

벽·발판 관통 X — Projectile.Update 영역 Layer 0·16 OverlapPoint 영역 영역 영역 정합 (변경 X).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 00:07:25 +09:00
깃 관리자 2ee5084230 fix(BT12-Dev): Projectile 자연 fade SelfDestruct (PD 지시 2026-05-14)
원인: SelfDestruct 영역 즉시 Destroy(gameObject) → ParticleSystem 영역 진행 영역 trail·glow particle 즉시 사라짐 → 발사 영역 영역 영역 매번 시각 cut → "뚝뚝 끊기는" 인식.

fix:
- _fadeOutStarted flag — 중복 호출 차단
- Collider2D·_debugBoxTransform disable — 판정 종료
- _speed = 0 — 이동 정지
- ParticleSystem.Stop(true, StopEmitting) — emission 정지·기존 particle 자연 fade
- Destroy(gameObject, 0.5f) — 0.5s 후 Destroy (기존 particle lifetime 영역 자연 fade 완료)
- FADE_START_RATIO 0.8 → 0.85 (sprite fadeout 영역 영역 영역·자연 영역 영역)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 00:02:47 +09:00
깃 관리자 6ed6efe6a2 fix(BT12-Dev): fx ParticleSystem.scalingMode = Hierarchy 전수 적용 (PD 지시 2026-05-13)
원인: fx.transform.localScale *= HitFxScale 영역 적용·그러나 ParticleSystem.MainModule.scalingMode 영역 = Local·Shape 영역 영역 영역 root scale 영역 영역 X·ParticleSystem 영역 자체 size 영역 영역 영역 영역.

fix: 모든 fx spawn 영역 ParticleSystem foreach 영역 영역 ScalingMode = Hierarchy 설정 + Play(true) 동시. Hierarchy 영역 = parent Transform scale 영역 정합 적용.

전수 적용 (7 파일):
- Projectile.OnTriggerEnter2D — OnHitFx
- ProjectileSpawner.Trigger — CastFx + ProjectilePrefab
- MeleeAreaSpawner.Trigger — fxGo
- LightningStrikeSpawner — OnHitFx + ExtraHitFx
- LaserSpawner.Trigger — fx
- PoisonSwampSpawner — swampGo + Marker.Tick fx
- SpiritFireSpawner — shieldGo

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:58:39 +09:00
깃 관리자 eab215db65 fix(BT12-Dev): A08 캐스팅 끝 spawn + Hit FX Player 위치 회피 grace (PD 지시 2026-05-13)
작업 1 — 캐스팅 이펙트 끝 지점 영역 투사체 발사:
- A08.asset OffsetDistance.x: 0 → 1.5
- ProjectileSpawner.Trigger 영역 spawnPos = playerPos + facing × 1.5 영역 캐스팅 끝 지점
- (FX_PinkArrow_Shoot 캐스팅 길이 영역 1.5 unit 추정·PD 측정 후 미세 조정 가능)

작업 2 — Hit FX 발사 시 Player 위치 발생 회피:
- 원인 추정: spawn 위치 = Player 위치 + OffsetDistance·작업 1 이전 OffsetDistance=0 영역 Player 위치 spawn → Player 근접 Enemy 즉시 hit → OnHit FX = Enemy 위치 ≈ Player 위치 → "Player에게 발생" 인식
- 작업 1 영역 spawn 위치 영역 Player 영역 1.5 우측 이동 → 자동 정정
- Projectile.OnTriggerEnter2D 영역 spawn 직후 0.1초 grace period 추가 (Time.unscaledTime - _spawnTime < 0.1f 영역 return) — 즉시 hit 차단·OnHitFx Player 위치 표시 회피

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:55:48 +09:00
깃 관리자 7ad3319e7c fix(BT12-Dev): A08 시전 이펙트 facing 방향 정합 + 진단 Log 회수 (PD 지시 2026-05-13)
원인: CastFx Instantiate 영역 = Quaternion.Euler(0, 0, data.FxRotation) (=0) 영역. FX_PinkArrow_Shoot sprite left 기본 → 시전 영역 sprite left 표시·Player right 발사 방향과 반대.

fix:
- ProjectileSpawner.Trigger CastFx — facing angle + ProjectileAngleOffset + FxRotation 적용 (Projectile 본체 동일 패턴)
- 진단 Debug.Log 2종 회수 ([ProjectileSpawner] card·CastFx spawned·[Projectile] OnHit) — fileID 정정 완료·root 원인 확정 후 revert

A08 영역 ProjectileAngleOffset=180 영역 정합 (sprite left → right) → CastFx·Projectile 동일 방향.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:51:27 +09:00
깃 관리자 9879425efb fix(BT12-Dev): ProjectileSpawner CS1056 interpolated string escape fix (PD 보고 2026-05-13)
원인: 직전 aa6cef1 영역 Debug.Log interpolated string 영역 `\"NULL\"` escape 사용·C# interpolated string escape 미지원 → 컴파일 에러.

fix: ternary 결과 영역 변수 분리 (castName·projName·hitName).

본 PM 자성 #15 — Edit 후 컴파일 사전 검증 누락. Unity Editor 영역 컴파일 영역 영역 영역 본 PM 영역 X 영역 영역 = PD 영역 보고 후 영역. C# string escape 영역 사전 측정 의무.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:32:10 +09:00
깃 관리자 aa6cef1a7f fix(BT12-Dev): A08 시전·피격 FX 진단 Debug.Log (PD 보고 2026-05-13·회수 의무)
A08.asset 영역 ProjectilePrefab·OnHitFxPrefab·CastFxPrefab GUID 정합 측정 정합·코드 정합. 그러나 PD 영역 시전·피격 X 보고 → 실측 진단 필요.

진단 Log 2종 (회수 의무·PD Console 측정 후 본 PM revert):
- ProjectileSpawner.Trigger — [ProjectileSpawner] card·CastFx·ProjPrefab·OnHitFx 매핑 측정·CastFx spawn 확인
- Projectile.OnHit — [Projectile] OnHit card·OnHitFx spawn name·pos 확인

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:29:57 +09:00
깃 관리자 71c3b7d5da fix(BT12-Dev): A08 저주의 화살 sprite 방향 반대 fix (PD 지시 2026-05-13)
원인: FX_PinkMagicArrow prefab sprite 기본 방향 left·Projectile.Initialize 영역 atan2(facing)·우향 발사 시 sprite left 보임.

fix:
- ActiveSkillData.ProjectileAngleOffset (float, Range -360~360) 신규 필드 — prefab sprite 기본 방향 보정용
- Projectile.Initialize — angle = atan2 + ProjectileAngleOffset
- A08.asset — ProjectileAngleOffset 180 설정 (FX_PinkMagicArrow left → right 보정)

박스(판정) 영역 = 동시 회전·HitboxSize 대칭 가정 영역 영향 X.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:26:34 +09:00
깃 관리자 68843a8c44 fix(BT12-Dev): A12·A08·전수 FX ParticleSystem.Play(true) 명시 호출 (PD 지시 2026-05-13)
직전 b1b476a 영역 PoisonSwamp·SpiritFire 영역만 명시 Play 적용·나머지 4 Spawner + Projectile 영역 누락.

전수 적용:
- MeleeAreaSpawner.Trigger — OnHitFx (A05·A12 등) 영역 Play
- LightningStrikeSpawner.Trigger — OnHitFx·DelayedExtraHitFx Play
- LaserSpawner.Trigger — fx (A_Laser OnHit) Play
- ProjectileSpawner.Trigger — ProjectilePrefab (A02·A08 FX_PinkMagicArrow 등)·CastFxPrefab (A08 FX_PinkArrow_Shoot) Play
- Projectile.OnTriggerEnter2D — OnHitFx (A02·A08 등) Play

원인: 신규 import prefab 영역 playOnAwake 영역 정합 X 가능성 또는 Instantiate 시점 영역 Awake 호출 X·명시 Play 안전망 누락.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:22:02 +09:00
깃 관리자 ebd0808034 feat(BT12-Dev): A11 정령불 frame 기반 playback 제어 (PD 지시 2026-05-13)
FX_Rotating shield.anim 측정 정합 (m_SampleRate 60·m_StopTime 2.8166666·총 169 frame).

PD 명시 영역 제어:
- intro: 1~88 frame (0~1.4667s)
- loop: 89~105 frame 반복 (17 frame·0.2833s)
- outro: 남은 frame (106~169 → 1.7500~2.8167s·1.0667s) — duration 종료 전 자동 재생

SpiritFireInstance.Init:
- Animator 캐싱·updateMode = UnscaledTime
- speed=1 (normalizedTime 직접 제어)

SpiritFireInstance.Update:
- elapsed < introEnd → linear sample
- elapsed < outroStart → loop range modulo
- elapsed >= outroStart → outro linear (duration - outroLength 영역)
- Animator.Play(STATE_HASH, 0, normalizedTime) 매 frame 호출

STATE_HASH = Animator.StringToHash("Base Layer.FX_Rotating shield")

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:18:45 +09:00
깃 관리자 b1b476a061 fix(BT12-Dev Phase B): FX 재생 X — ParticleSystem 명시 Play + Collider 자식 분리 (PD 보고 2026-05-13)
원인 추정:
- PoisonSwampInstance 영역 BoxCollider2D·Rigidbody2D 영역 FX root 직접 부착 → ParticleSystem 영역 영향 가능
- Instantiate playOnAwake 정합·그러나 명시 Play() 호출 안전망 영역 누락

fix:
- PoisonSwampSpawner.Trigger — FX root 영역 GetComponentsInChildren<ParticleSystem>(true) 영역 명시 ps.Play(true)
- PoisonSwampInstance — BoxCollider2D·Rigidbody2D 영역 자식 GO 분리 (PoisonSwamp_Collider)·FX root 영역 visualRoot 보관·duration 종료 시 함께 Destroy
- PoisonedEnemyMarker.Tick — FX_Venom_Spray 영역 동일 ParticleSystem.Play(true) 명시 호출
- SpiritFireSpawner.Trigger — 동일 명시 Play(true) 호출

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:10:32 +09:00
깃 관리자 f292eb4fb3 feat(BT12-Dev Phase B): A06 독 늪·A11 정령불 신규 + 1키·2키 매핑 (PD 지시 2026-05-13)
신규 Effector 2종:
- PoisonSwampSpawner — Category C (PlacementPersistent)
  · 가장 가까운 적 위치 spawn·6초 유지·BoxCollider2D isTrigger·Kinematic Rigidbody2D
  · PoisonSwampInstance — OnTriggerStay 영역 적 마킹·PoisonedEnemyMarker 부착·duration 5초 갱신
  · PoisonedEnemyMarker — 매 초 10 피해·FX_Venom_Spray 자식 spawn (DotFxPrefab)·duration 만료 시 자가 소멸
- SpiritFireSpawner — Category D (Minion)
  · Player 자식 spawn·8초 유지·OverlapCircle radius 2.5
  · SpiritFireInstance — 매 초 근접 적 5 피해·Time.unscaledTime 영역 lifecycle

SkillFireEvent.Execute switch 확장:
- PlacementPersistent case → PoisonSwampSpawner
- Minion case → SpiritFireSpawner

A06 독 늪 .asset 신규 — Category 2·BaseCooldown 10·BaseDamage 10·OnHitFxPrefab=FX_Venom_Swamp·OnDotFxPrefab=FX_Venom_Spray
A11 정령불 .asset 신규 — Category 3·BaseCooldown 15·BaseDamage 5·MinionLifetime 8·OnHitFxPrefab=FX_Rotating shield

SkillRuntimeFactory.AvailableCardIds — A06·A11 추가 (7→9종)
TestSkillFireOn1to5 — PoisonSwamp·SpiritFire 인스턴스 신규·Category 분기 추가 (CardId 기반 MeleeArea 분기 정합)

PD Inspector 영역 — Player.prefab TestSkillFireOn1to5 Skill1=A06·Skill2=A11 .asset drag&drop 필요.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:06:59 +09:00
깃 관리자 5077f5dd3f feat(BT12-Dev Phase A): A12 정화의 빛 신규·A08 저주의 화살 이펙트 적용 (PD 지시 2026-05-13)
신규 ActiveSkillData 필드:
- CastFxPrefab — 시전 FX (발사 시점 Player 위치 spawn·비주얼 전용)
- ProjectileSpawner.Trigger 영역 CastFxPrefab spawn 처리 (HitFxScale·FxRotation·FxAutoDestroyUnscaled 2초 cap)

A08 저주의 화살 이펙트 적용 (.asset 수정):
- ProjectilePrefab = FX_PinkMagicArrow
- OnHitFxPrefab = FX_PinkMagicArrow_Hit
- CastFxPrefab = FX_PinkArrow_Shoot
- MaxRange 6·ProjectileSpeed 8 (단거리 빠른 발사)
- OffsetDistance float 0.5 → Vector2 (0,0) (직전 필드 전환 정합)

A12 정화의 빛 신규 (.asset 신규):
- Category 1 (MeleeArea·MeleeAreaSpawner 발동)
- BaseCooldown 5·BaseDamage 15·HitboxSize 4×4·AttributeTags 4 (Frost)
- OnHitFxPrefab = FX_Icelight_Seal

SkillRuntimeFactory.AvailableCardIds — A08·A12 추가 (카드 풀 5→7종)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:01:24 +09:00
깃 관리자 ebedf6d9ee fix(BT12-Dev): A04 번개 충격 적 유무 무관 자동 발동 (PD 지시 2026-05-13)
원인: LightningStrikeSpawner.Trigger 영역 candidates.Count == 0 시 즉시 return → 적 0명 영역 발동 X.
fix: candidates 0 시 Player 위치 영역 fallback (primaryPos = inventory.transform.position) → 일정 쿨타임 자동 발동.

A05 MeleeAreaSpawner·A_Laser LaserSpawner = Player 위치 기준 발동·적 무관 영역 이미 정합.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:28:19 +09:00
깃 관리자 26b0666912 feat(BT12-Dev): MeleeArea 실전 발사 연결 + FX AutoDestroy unscaledTime (PD 지시 2026-05-13)
작업 1 — 스킬 배워도 이펙트 X fix:
- SkillFireEvent.Execute — MeleeArea case 추가 (CardId 분기·TestSkillFireOn1to5 동일 패턴)
  - A04 → LightningStrikeSpawner
  - A_Laser → LaserSpawner
  - 기타 → MeleeAreaSpawner

작업 2 — 맵 이동 중 이펙트 잔상 재발 fix:
- 원인: Object.Destroy(fxGo, t) 영역 second timer 영역 Time.timeScale 영향·timeScale=0 (LevelUp) 영역 호출 정지
- 신규: FxAutoDestroyUnscaled MonoBehaviour — Update 영역 unscaledTime lifetime check 자가 Destroy
- ProjectileSpawner·Projectile·MeleeAreaSpawner·LaserSpawner·LightningStrikeSpawner 모두 영역 Object.Destroy(fx, t) → FxAutoDestroyUnscaled.Attach
- LightningStrikeSpawner.DelayedExtraHitFx — WaitForSeconds → WaitForSecondsRealtime (timeScale=0 영역 정합)

본 PM 자성 #12 — feedback_new_code_existing_system_dependency_unmeasured 위반. Object.Destroy(go, t) 영역 timeScale 영향 사전 측정 누락 (Unity 표준 API).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:26:40 +09:00
깃 관리자 41fa4e4ce7 chore(BT12-Dev): 진단 Debug.Log 회수 (PD 정합 작동 확인 후)
회수 5종:
- ProjectileSpawner.Trigger — [ProjectileSpawner] Trigger
- Projectile.Initialize — [Projectile][Initialize]
- Projectile.SelfDestruct — [Projectile][SelfDestruct]
- Projectile.OnDestroy (메서드 자체) — [Projectile][OnDestroy]
- EnemyController.Update — [EnemyHit][Intersect]·[EnemyHit][Decrement]

보존:
- Projectile.Update lifetime backup SelfDestruct (Log 영역 제거·동작 영역 유지·잔존 차단)
- Initialize 시 CancelInvoke (안전망 유지)

feedback_pm_root_diagnosis_priority 정합 — 근본 원인 (Time.timeScale=0 영역 Invoke 정지·NullReferenceException race) 확정·fix 정합 후 진단 Log revert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:24:05 +09:00
깃 관리자 705d943e38 fix(BT12-Dev): Projectile unscaledTime — Time.timeScale=0 영역 영구 잔존 차단 (PD 지시 2026-05-13)
근본 원인:
- Time.timeScale=0 (LevelUp 카드 선택 모드) 영역 Time.time 정지 → Invoke(SelfDestruct, lifetime) 영역 호출 X → 영원 잔존
- _spawnTime = Time.time 영역 = lifetime backup check 영역 영역 X

fix:
- _spawnTime = Time.unscaledTime (timeScale 무관)
- Update 영역 lifetime check — Time.unscaledTime - _spawnTime > _lifetime 영역 강제 SelfDestruct
- Wall grace period — Time.unscaledTime 영역 정합
- Invoke 폐기·CancelInvoke 추가 안전 (Initialize 영역 잔존 Invoke 차단)

본 PM 자성 #11 — Time.time vs Time.unscaledTime 영역 사전 측정 누락. Projectile 영역 lifecycle 영역 timeScale 영역 영향 영역 사전 측정 의무 누락.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:21:25 +09:00
깃 관리자 b1931afa15 fix(BT12-Dev): 사망 팝업 타이밍·y -0.6·투사체 lifetime 강화 (PD 지시 2026-05-13)
작업 1 — 죽는 모션 종료 시점 팝업 UI:
- LevelUpManager — Player 사망 상태 영역 HandleLevelUp 호출 시 _pendingLevels 영역 저장
- Update 영역 매 frame Player IsAlive·!_isLevelUpActive check → pending 영역 ShowLevelUpUI 표시
- 죽는 모션 동안 LevelUp 즉시 표시 X·부활 후 표시

작업 2 — Player 사망 모션 y -0.3 추가 (누적 -0.6):
- PlayerDeath.Execute — new Vector3(0f, -0.6f, 0f)

작업 3 — 투사체 잔상 강화 fix + 진단:
- Projectile.Update — lifetime + 0.5 backup 강제 SelfDestruct (Invoke 누락 안전망)
- Projectile.Initialize — [Projectile][Initialize] 진단 Log (회수 의무)
- ProjectileSpawner.Trigger — [ProjectileSpawner] 진단 Log (회수 의무)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:18:31 +09:00
깃 관리자 1437720e50 fix(BT12-Dev): Projectile NullReferenceException + 잔존 fix (PD 보고 2026-05-13)
원인: ProjectileSpawner.Trigger 영역 BoxCollider2D.isTrigger=true 활성 (단계 2) 직후·Initialize (단계 3) 이전 OnTriggerEnter2D 발화 가능 → _runtime=null → NullReferenceException line 187 → SelfDestruct 미호출 → 영구 잔존.

fix:
1. OnTriggerEnter2D 영역 `_runtime == null || _data == null` defensive return
2. Update 영역 `_data == null` 시 즉시 SelfDestruct (잔존 차단)

본 PM 자성 #10 — race condition 사전 측정 누락. ProjectileSpawner.Trigger 영역 collider 부착 시점·Initialize 호출 시점 영역 사이 OnTriggerEnter2D 발화 가능성 사전 측정 X.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:12:51 +09:00
깃 관리자 69a18052a0 fix(BT12-Dev): Player 죽는 모션·부활 물리·투사체 진단 (PD 지시 2026-05-13)
작업 1 — Player 죽는 모션 X fix:
- PlayerDeath.Execute — SetTrigger("hurt") → SetTrigger("hit") (Player.controller parameter 정합: velocityX·velocityY·grounded·attack·dead·hit·combatidle·resurrect·hurt 없음)
- animator.updateMode = AnimatorUpdateMode.UnscaledTime 추가 (EnemyDeath 영역 동일·timeScale=0 영향 차단)

작업 2 — 부활 모션 중 움직임 fix:
- PlayerSpawn.Execute — Rigidbody2D.simulated=true 복원 폐기 (즉시 X)
- EnablePlayerInput.Execute — Rigidbody2D.simulated=true 복원 추가 (2초 후·부활 모션 종료 시점)
- using UnityEngine 추가 (CS0246 회피)

작업 3 — 투사체 잔상 진단 (회수 의무):
- Projectile.SelfDestruct — [Projectile][SelfDestruct] Debug.Log
- Projectile.OnDestroy — [Projectile][OnDestroy] Debug.Log (Destroy 외 경로 검출용)
- PD Console 측정 결과 영역 본 PM 근본 fix 후 revert

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:10:11 +09:00
깃 관리자 c052d78114 fix(BT12-Dev): PlayerSpawn.cs CS0246 컴파일 에러 — using UnityEngine 누락 (PD 보고 2026-05-13)
이전 commit 3a672f0 영역 Rigidbody2D 참조 추가 시 using UnityEngine 영역 누락.
fix: 첫 줄에 using UnityEngine 추가.

본 PM 자성 #8 — 신규 type 영역 (Rigidbody2D) 사용 영역 namespace using 영역 사전 검증 누락.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:04:44 +09:00
깃 관리자 3a672f0591 fix(BT12-Dev): Player 사망 제자리·부활 모션·무적 + FX 잔상 safety cap (PD 지시 2026-05-13)
작업 1 — Player 사망 사라지는 현상 fix:
- PlayerDeath.Execute — Rigidbody2D.simulated=false (gravity 정지·제자리 사망·낙사 차단)

작업 2·3 — 제자리 부활·부활 모션·2초 무적 깜박:
- PlayerSpawn.Execute — Teleport 폐기 (spawn point 영역 → 제자리)
- player.health.Resurrect() 호출 (currentHP=maxHP·invulnerableUntil=2초·Animator dead=false·resurrect Trigger)
- Rigidbody2D.simulated=true 복원
- PlayerInvulnerabilityFlash 영역 IsInvulnerable 자동 깜박 (2초)
- 2초 후 EnablePlayerInput (조작 가능)

작업 4 — FX 잔상 safety cap 5초:
- LaserSpawner.Trigger — fx Object.Destroy 누락 fix (LaserSpawner 영역 본 영역 영역 영역 직접 원인 가능)
- LightningStrikeSpawner.AutoDestroyFx — cap
- MeleeAreaSpawner.Trigger — cap
- Projectile.AutoDestroyOnParticleEnd — cap

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:02:43 +09:00
깃 관리자 ebd7086a53 fix(BT12-Dev): 투사체끼리 충돌 X·통과 정합 (PD 지시 2026-05-13)
Projectile.OnTriggerEnter2D 영역 동족 Projectile skip (Wall·Enemy 판정 이전).

원인: fallback Projectile GO 영역 default Layer 0 영역 → 다른 Projectile 영역 isWall=true 판정 → 양쪽 SelfDestruct.
fix: other.GetComponent<Projectile>() != null 시 즉시 return.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 19:55:17 +09:00
깃 관리자 56a4a362a5 fix(BT12-Dev): 사망 y -0.5→-0.3 + 게임 시작 파이어볼 정지 fix (PD 지시 2026-05-13)
작업 1 — 사망 모션 y -0.5 → -0.3 (EnemyDeath·PlayerDeath)

작업 2 — 게임 시작 시 파이어볼 투사체 정지·잔존 fix:
- ProjectileSpawner.Trigger — facing.sqrMagnitude < 0.01f 시 Vector2.right fallback
- 원인: Player.Facing 영역 (0,0) 영역 → _direction = (0,0) → _speed × deltaTime × (0,0) = 0 → 정지

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 19:53:59 +09:00
깃 관리자 32ab76fcde feat(BT12-Dev): 스킬 선택 UI 아이콘 fallback 추가 (PD 지시 2026-05-13)
SkillCardSlot.Bind 영역 card.Icon == null fallback:
- _icon — 동적 원 sprite (32×32 알파) + 속성별 색상 (Fire 주황·Frost 하늘·Dark 보라·Lightning 노랑·Physical 흰)
- _glowEffect — 동일 sprite + alpha 0.3 (동심원 빛 효과 정합)
- GetFallbackIconSprite·GetColorByAttribute static helper (정적 캐싱)
- card.Icon 설정 시 정상 sprite 사용 (PD 후속 정식 아이콘 자산 추가 시 자동 정합)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 19:51:27 +09:00