Files
test/Documentation/SKILL_CAST_BLOCKING_ANALYSIS.md
2026-03-13 16:03:47 +07:00

5.1 KiB

Skill Cast Blocking During Flash Move - Log Analysis

Location of Skill Cast Cancellation

Based on analysis of EC.log, here's where skill casting is blocked/cancelled when the character is performing a flash move:


Key Finding: Blocking Location

Line 16548 in EC.log:

[10:57:02.992] <!> [SKILL_CAST_DEBUG] ApplySkillShortcut: BLOCKED - CanDo(CANDO_SPELLMAGIC) returned false, skillID=1

Context:

  • Flash move is active: Line 16546 shows WORK_FLASHMOVE(ID:14) running at PRIORITY_2
  • Skill casting attempt: Player tries to cast skill ID=1
  • Blocking point: The check CanDo(CANDO_SPELLMAGIC) returns false during flash move
  • Result: Skill casting is blocked before it even reaches CanCastSkillImmediately() check

Complete Blocking Sequence

1. Flash Move Starts

Line 15110:

[10:56:58.297] <!> 217:30:7:385 CECHPWork::WORK_FLASHMOVE started, priority=2

2. Flash Move Active (Multiple Confirmations)

Lines 15114-15298:

[10:56:58.308] <!> [SKILL_CAST_DEBUG] HasWorkRunningOnPriority: priority=2, result=1, currentPriority=2, WorkIDs=[WORK_FLASHMOVE(ID:14)]

(Repeated many times, confirming flash move is running)

3. Skill Casting Attempt During Flash Move

Line 16548:

[10:57:02.992] <!> [SKILL_CAST_DEBUG] ApplySkillShortcut: BLOCKED - CanDo(CANDO_SPELLMAGIC) returned false, skillID=1

Just before blocking (Line 16546):

[10:57:02.978] <!> [SKILL_CAST_DEBUG] HasWorkRunningOnPriority: priority=2, result=1, currentPriority=2, WorkIDs=[WORK_FLASHMOVE(ID:14)]

Blocking Mechanism

The blocking happens at TWO levels:

Level 1: Early Block (CanDo Check)

  • Location: ApplySkillShortcut() method
  • Check: CanDo(CANDO_SPELLMAGIC)
  • When: Before entering main casting path
  • Why: Flash move disables spell magic capability
  • Result: Skill casting blocked immediately

Level 2: Priority Check (CanCastSkillImmediately)

  • Location: CanCastSkillImmediately() method
  • Check: !IsSpellingMagic() && !HasWorkRunningOnPriority(PRIORITY_2)
  • When: After entering main casting path (if Level 1 passes)
  • Why: Any work at PRIORITY_2 blocks skill casting
  • Result: Additional blocking layer

Note: In the log, we see Level 1 blocking (CanDo check), which happens before Level 2. This is the first line of defense.


Log Evidence Summary

Successful Skill Cast (No Flash Move)

Lines 15046-15056:

[10:56:58.163] <!> [SKILL_CAST_DEBUG] ApplySkillShortcut: Entering main casting path, skillID=58, ...
[10:56:58.163] <!> [SKILL_CAST_DEBUG] CanCastSkillImmediately: skillID=58, IsSpellingMagic=0, HasWorkOnPriority2=0, WorkAtPriority2=[], result=1
[10:56:58.163] <!> [SKILL_CAST_DEBUG] ApplySkillShortcut: Setting prep skill and calling CastSkill, skillID=58
[10:56:58.163] <!> [SKILL_CAST_DEBUG] CastSkill: Entry, skillID=58, idTarget=1090, IsSpellingMagic=0

Result: Skill casts successfully (no flash move active)

Blocked Skill Cast (During Flash Move)

Lines 16546-16548:

[10:57:02.978] <!> [SKILL_CAST_DEBUG] HasWorkRunningOnPriority: priority=2, result=1, currentPriority=2, WorkIDs=[WORK_FLASHMOVE(ID:14)]
[10:57:02.992] <!> [SKILL_CAST_DEBUG] ApplySkillShortcut: BLOCKED - CanDo(CANDO_SPELLMAGIC) returned false, skillID=1

Result: Skill casting blocked (flash move active)


How to Read the Logs

Step 1: Find Flash Move Start

Search for:

WORK_FLASHMOVE started

Step 2: Confirm Flash Move is Active

Look for repeated entries:

HasWorkRunningOnPriority: priority=2, result=1, WorkIDs=[WORK_FLASHMOVE(ID:14)]

Step 3: Find Skill Casting Attempt

Search for:

ApplySkillShortcut: BLOCKED

or

ApplySkillShortcut: Entering main casting path

Step 4: Check Blocking Reason

  • Early block: BLOCKED - CanDo(CANDO_SPELLMAGIC) returned false
  • Priority block: CanCastSkillImmediately: ... result=0 (if it reaches this check)

Key Insights

  1. Flash move disables spell magic capability - This is why CanDo(CANDO_SPELLMAGIC) returns false
  2. Blocking happens early - Before CanCastSkillImmediately() is even called
  3. Work system priority - Flash move runs at PRIORITY_2, which blocks skill casting
  4. Silent blocking - No error message, skill just doesn't cast (C++ behavior)

Code Flow

ApplySkillShortcut()
  ↓
CanDo(CANDO_SPELLMAGIC) check
  ↓ (if false → BLOCKED, return false)
  ↓ (if true → continue)
Enter main casting path
  ↓
CanCastSkillImmediately() check
  ↓ (if false → BLOCKED, return false)
  ↓ (if true → continue)
CastSkill()

In the log: Blocking happens at the first check (CanDo), so we never see CanCastSkillImmediately being called during flash move in this particular case.


Conclusion

The skill cast is cancelled/blocked at:

  • Primary location: ApplySkillShortcut()CanDo(CANDO_SPELLMAGIC) check
  • Secondary location: CanCastSkillImmediately()HasWorkRunningOnPriority(PRIORITY_2) check
  • Log evidence: Line 16548 in EC.log shows the blocking message
  • Reason: Flash move disables spell magic capability and runs at PRIORITY_2