WL #983 ① 한손검 주력 회전 중 구르기 허용 — WLSkillCancel moveLockOnly 신설(스킬 동작 중 이동만 막음 · 구르기 허용 · 발동 전 구르기 = 스킵 = 검기 · 시전 연출 없음 · 발동 뒤 noSkip 유지) · Skill_EnergySlash 를 lockMove → moveLockOnly · ② MasterStylizedFX 덮어써진 839 파일은 git 되돌림(커밋 변경 없음) · 리컴파일 오류 0 · 콘솔 오류 0 · Play 미확인

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-10-25 13:20:07 +09:00
parent 8fa1e3acdc
commit f6d24b8b3a
2 changed files with 10 additions and 5 deletions

View File

@ -2,7 +2,9 @@
"enabled": 1,
"skipOnMove": 1,
"lockMove": [
"Skill_JumpAttack",
"Skill_JumpAttack"
],
"moveLockOnly": [
"Skill_EnergySlash"
],
"noSkip": [
@ -31,5 +33,6 @@
"holdMaxSeconds": 1.5,
"_note_970": "#970 PD 「시전하는 모션이 존재하는 스킬은 일정 타이밍(실제 스킬 발동이 확정 된 시점)까지 못움직이게 하고, 움직여 진 경우에는 발동 된 스킬이 스킵되지 않도록 (현재는 시전 직후 움직이면 스킬 이펙트가 스킵되는 현상)」 — castLock 1 = SkillList s_NextAnimation(원본 시전 단계) 또는 f_CastingTime 이 있는 스킬은 lockUntilFire + noSkip 으로(위 목록은 표에 시전 단계가 없는 Skill_ArrowRain 등 그대로) · 잠금 상한 = holdMaxSeconds + 시전 시간",
"castLock": 1,
"_note_982": "#982 PD 「한손검 주력 스킬 검기를 발사한 경우, 플레이어가 이동해도 검기가 사라지지 않아야 하고, 검기를 발사하는 회전하는 동안에는 캐릭터가 움직이지 못해야 해」 — Skill_EnergySlash 를 noSkip(이동 = 스킵이 검기 투사체를 끄던 것) · lockMove(스킬 동작 = 회전 중 이동 · 구르기 입력 무시)에 추가"
"_note_982": "#982 PD 「한손검 주력 스킬 검기를 발사한 경우, 플레이어가 이동해도 검기가 사라지지 않아야 하고, 검기를 발사하는 회전하는 동안에는 캐릭터가 움직이지 못해야 해」 — Skill_EnergySlash 를 noSkip(이동 = 스킵이 검기 투사체를 끄던 것) · lockMove(스킬 동작 = 회전 중 이동 · 구르기 입력 무시)에 추가",
"_note_983": "#983 PD 「검기를 쏘기 전 회전할 때 구르기는 막으면 안돼. (회전 중 구르기로 스킬 발동을 캔슬할 경우 검기를 생성 하지 않아야 함)」 — Skill_EnergySlash 를 lockMove(이동 · 구르기 막음)에서 빼고 moveLockOnly(이동만 막음) · 발동 전 구르기 = 스킵(검기 · 시전 연출 끔) · 발동 뒤 = noSkip(검기 유지)"
}

View File

@ -31,6 +31,7 @@ namespace WL.Combat.Weapon
public int enabled = 1;
public int skipOnMove = 1; // 1 = 스킬 동작 중 이동 · 구르기 = 스킵(기본)
public string[] lockMove = new string[0]; // 발동 중 이동 · 구르기 입력을 무시하는 스킬(eEffect 이름)
public string[] moveLockOnly = new string[0]; // #983 스킬 동작 중 이동 입력만 무시 · 구르기는 허용(발동 전 구르기 = 스킵 = 투사체 없음 · 발동 뒤는 noSkip 대로) — PD 「검기를 쏘기 전 회전할 때 구르기는 막으면 안돼」
public string[] noSkip = new string[0]; // 이동 · 구르기로 끊겨도 이펙트를 남기는 스킬
public string[] holdMove = new string[0]; // #911 발동 뒤 공격 이펙트(이 PC 의 원본 스킬 투사체)가 끝날 때까지 이동 입력 무시 · 구르기는 허용(= 스킵)
public string[] endWithMotion = new string[0]; // #914 스킬 동작이 입력 없이 끝나면(대기로) 그 스킬 이펙트도 바로 끈다 — 남은 이펙트 때문에 서 있지 않게
@ -53,7 +54,7 @@ namespace WL.Combat.Weapon
static PCActor s_pc;
static string s_effect = "";
static float s_castAt, s_cap = 1.5f; // s_cap = 발동까지 잠금 상한(holdMaxSeconds + 시전 시간 · #970)
static bool s_active, s_fired, s_heldAtCast, s_lock, s_hold, s_lockFire, s_noSkip; // s_lockFire = #942 발동까지 잠금 · s_noSkip = 이동해도 이펙트 유지(목록 또는 #970 시전 동작)
static bool s_active, s_fired, s_heldAtCast, s_lock, s_hold, s_lockFire, s_noSkip, s_moveOnly; // s_lockFire = #942 발동까지 잠금 · s_noSkip = 이동해도 이펙트 유지(목록 또는 #970 시전 동작)
static int s_pendingBrake = -1; // -1 없음 · 0 = Set_AutoBraking(false) · 1 = Set_AutoBraking(true)
static GameObject s_runner;
static FieldInfo s_fDicSkill;
@ -105,7 +106,7 @@ namespace WL.Combat.Weapon
s_pc = pc; s_effect = e.skill != null ? e.skill.e_Skill.ToString() : "";
s_castAt = Time.time; s_active = true; s_fired = false;
s_heldAtCast = pc.JoystickStatus == 1;
s_lock = Has(c.lockMove, s_effect);
s_lock = Has(c.lockMove, s_effect); s_moveOnly = Has(c.moveLockOnly, s_effect);
s_hold = Has(c.holdMove, s_effect);
bool castMotion = c.castLock != 0 && HasCastMotion(e.skill); // #970 시전 동작이 있는 스킬 = 발동까지 잠금 + 발동 뒤 이동해도 유지
s_lockFire = Has(c.lockUntilFire, s_effect) || castMotion;
@ -163,7 +164,7 @@ namespace WL.Combat.Weapon
s_hold = false;
}
if (!s_active || !ReferenceEquals(pc, s_pc) || pc.Get_CurAnim() != eAnim.Skill) return false;
if (s_lock) return true;
if (s_lock || s_moveOnly) return true; // #983 moveLockOnly = 이동만(BlockDodge 는 보지 않음 = 구르기 허용)
var c = Cfg;
if (s_lockFire && !s_fired && Time.time - s_castAt < s_cap) return true; // #942 발동 전엔 새 이동 입력도 무시
return c.holdUntilFire != 0 && s_heldAtCast && !s_fired && Time.time - s_castAt < s_cap;
@ -236,6 +237,7 @@ namespace WL.Combat.Weapon
bool byInput = cur == eAnim.Run || cur == eAnim.Dodge;
var c = Cfg;
if (byInput && c.skipOnMove != 0 && !s_noSkip) Skip(pc, s_effect, cur == eAnim.Dodge ? "구르기" : "이동");
else if (cur == eAnim.Dodge && s_moveOnly && !s_fired) Skip(pc, s_effect, "발동 전 구르기"); // #983 회전 중 구르기로 캔슬 = 검기 · 시전 연출 없음
else if (byInput && s_noSkip) { SkipsAvoided++; LastLog = "유지 " + s_effect + " · " + (cur == eAnim.Dodge ? "구르기" : "이동") + (s_fired ? " · 발동 뒤" : " · 발동 전"); }
else if (!byInput && Has(c.endWithMotion, s_effect)) { MotionEnds++; Skip(pc, s_effect, "동작 끝"); } // #914 동작 끝 = 이펙트 끝(이동 잠금 holdMove 도 함께 풀림)
if (s_pendingBrake >= 0 && !Blocking(pc)) ApplyBrake(pc);