전투 EXE 분석 통합

세부 검토 HTML/MD를 하나로 합친 사용자용 허브. 구조화 근거는 `out/battle_*.json`으로 보존한다.

요약

93 JSON evidence files
93전투 JSON 근거
6통합 그룹
1사용자용 전투 분석 허브
JSON세부 근거 보존 형식

핵심 결론

confirmed battle pipeline

전투 계산 파이프라인

hit unit 8바이트 schema, target scope, result-family dispatch, HP/MP apply, 상태 성공 gate, critical/guard/miss branch를 모두 분리했다.

battle_damage_formula_trace_review.json

상태/모드/취기

+0x2a 자세/상태, +0x65 취기, +0x18 주량, +0x1a 주량 경험치, +0x69 곤드레만드레 pending flag까지 정리했다.

battle_status_transition_review.json

Support/Status 전투 행

도주, 방어, 회복, 술, 도발, 눈요기, 수경은 공격 애니메이션 누락이 아니라 result-family/status 정책 행으로 분리했다.

battle_support_status_policy_review.json

전투 액션/이펙트 VM

phase display table, frame gate, helper child script, spawn-tree, caster position/motion opcode를 전투 러너가 참고할 수 있는 수준으로 색인화했다.

battle_display_vm_static_decode.json

전투 기술 구현 gap 해소

전투 기술 unresolved flag는 0으로 정리했다. 도주/방어/회복/술/도발/눈요기/수경 같은 support/status 25행은 gap이 아니라 별도 정책 행으로 complete pattern에서 관리한다.

battle_skill_implementation_gap_review.json

몬스터/공용 기술 페이로드

몬스터/공용 기술은 actor +0x59 shared action id에서 payload/result-family로 이어지고, actor +0x5a는 몬스터 CNS local display slot으로 분리된다.

battle_monster_shared_action_effect_review.json

몬스터 행동 선택자

몬스터 행동 선택자는 descriptor/vtable VM script의 opcode 0x10 pair로 확정됐다. `10 c0 59 xx`가 shared action id, `10 c0 5a yy`가 visible slot을 세팅하고, 공유 descriptor의 조건부 action id는 actor id 분기로 해소된다.

battle_monster_action_selection_review.json

몬스터 액션 카탈로그

선택자(+0x59/+0x5a), 공용 payload, CNS local display slot을 결합해 몬스터별 행동 RNG 가중치와 프레임/사운드/이동 슬롯을 한 파일로 묶었다.

battle_monster_action_catalog.json

몬스터 행동 표시/이펙트

몬스터 행동의 local frame, helper call, effect/result WLK, repeat loop, movement를 정적 카탈로그로 재집계했고 helper graph/frameScript preview까지 연결했다.

battle_monster_action_effect_review.json

계산 공식

runner/engine reference

Normal damage

atk = floor(attacker.attack * attacker.attackCoef * skillDamageCoef / 10000)
def = floor(target.defense * target.defenseCoef / 100)
base = floor((atk * 2 - def) / 3) + rand(floor(attacker.level / 2)) - rand(floor(target.level / 2))
damage = floor(base * target.familyResistance[damageFamily] / 100)
if damage < 3: damage = rand(3) + 1

Critical / alternate damage

base = floor((atk * 2 - def) / 2) + rand(floor(attacker.level / 2)) - rand(floor(target.level / 2))
damage = floor(base * target.familyResistance[damageFamily] / 100)
if damage < 3: damage = rand(5) + 1
critical is presented by flash + dedicated WLK + higher damage, not by text

Ataho drunk hazard

after alcohol-family result: 취기 += inc, 주량경험치 += inc
if 주량경험치 > 100 and 주량 < 100: 주량 += 1; 주량경험치 = 0
status by 취기: >0 얼근히, >33 만취, >66 정신없이, >100 대호
post-action cleanup: if rand(100) + 주량 < 취기 then 곤드레만드레

전투 수치/공식 근거 위치

canonical links

계산식/시뮬레이션

사용자용 계산식과 전투 수치 대입은 전투 공식 계산기에서 관리한다.

battle_formula_calculator.html

숫자 후보 triage

구 battle review의 직접 앵커 호환 지점이다. 현재 triage 세부 근거는 구조화 JSON과 통합 목록에서 추적한다.

battle_analysis_summary.json

핵심 데이터/레코드

10 files

기술 payload, actor 스탯 레이아웃, 대상 선택, result-family 스키마처럼 전투 계산과 직접 연결되는 근거.

근거 JSONEvidence상태요약크기
battle_action_mapping.jsonstatic-inferredplayer-skill-payload-table-grounded-phase-formula-groundedhwanse-battle-action-mapping264,059 B
battle_monster_shared_action_effect_review.jsonstaticstatic-shared-monster-action-payload-and-result-family-groundedsharedActionRows: 125; sharedHitUnits: 177; targetScopeDistribution: [{'value': 10, 'valueHex': '0x0a', 'label': '적 1명', 'count': 105}, {'value': 6, 'valueHex': '0x06', 'label': '적 전체', 'count': 61}, {'value': 1, 'valueHex': '0x01', 'label': '자기/준비', 'count': 11}]; resultFamilyDistribution: [{'value': 16, 'valueHex': '0x10', 'label': '', 'count': 60, 'class': 'damage', 'classLabel': '공격/상태 판정', 'dispatchRole': 'common damage/status formula path', 'functionVaHex': '0x0043414d'}, {'value': 18, 'va216,905 B
battle_monster_action_selection_review.jsonstaticstatic-vm-script-producer-groundedconfirmed: ['몬스터/공용 기술 실행은 actor +0x59 shared action id -> 0x004d2494 shared action payload -> hit unit -> result-family dispatch로 이어진다.', 'enemy 표시 단계는 actor +0x5a + 0x0a를 display selector로 사용한다. 즉 +0x59 payload id와 +0x5a visual slot은 별도 필드다.', '0x433402/0x433545 target selector는 이미 설정된 actor +0x59를 소비한다. monster action id를 생산하지 않는다.', '직접 field-write 스캔에서 actor +0x59를 생산하는 경로는 player/menu selector, player skill growth, manual/player execution 쪽뿐이다.', 'generic VM opcode 0x10은 active object([ctx1,767,695 B
battle_monster_action_catalog.jsonstaticstatic-monster-action-selection-and-display-slot-joinedDescriptor script3 VM bytecode selects both shared action id (+0x59) and local visible slot (+0x5a).; The visible slot is joined to the monster CNS display table through display phase = 0x0a + slot.; Opcode 0x2b/0x0a confirms script3 choice tables as RNG jump tables; repeated pointers are exact table weights.; Slot-first conditional blocks are resolved by active object +0x05 actor-table-id checks, so shared CNS descriptors can select actor-specific action ids.2,337,359 B
battle_skill_records.jsonstatic-inferredbattle-action-payload-grounded-monster-binding-resolved-by-action-catalogbattle skill records134,944 B
battle_actor_stat_layout_review.jsonstatic-inferredactor-stat-layout-grounded전투 actor 초기화 루틴은 0x00457c60 기반 0x38-byte row prefix 8바이트를 actor +0x00으로 복사한다.; HP view로 내보낸 out/enemy_stat_table row는 actual actor row +0x08에서 시작한다. 따라서 exported +0x06은 actor +0x1c attack, exported +0x0a는 actor +0x20 defense처럼 8바이트 보정이 필요하다.; exported +0x34 name id는 current actor row 내부가 아니라 다음 actual row prefix의 +0x04 marker다. 이름 anchor로는 유효하지만 current actor struct 필드는 아니다.; 플레이어 row 장비/레벨업 루틴 대조로 actor +0x26은 운 축으로 승격됐다. +0x28은 상태창/장비 운 보정 대상이 아니며 0x4343db critical/alternate 판정과 0x4344ab 상태 성공112,348 B
battle_player_actor_stat_layout_review.jsonstatic-inferredplayer-actor-exp-luck-grounded플레이어 전투 actor 초기화는 파티 slot -> character index -> 0x00457750 + index*0xd8 row를 찾아 첫 0x48바이트를 actor로 복사한다.; player row/actor +0x14는 현재 EXP다. 승리 보상 루프가 0x42157b 산출값을 살아있는 player actor +0x14에 더한다.; row +0x48/+0x49는 현재 무기/방어구 내부 id이고, 장비 포인터 테이블 0x0048b1dc[id]를 통해 장비 상세 레코드를 읽는다.; 장비 상세 레코드 +0x10..+0x14는 공격/방어/기술/순발/운 보정이며, player base +0xbe/+0xc2/+0xc4/+0xc6/+0xc8에 더해 actor +0x1c/+0x20/+0x22/+0x24/+0x26에 기록된다.14,741 B
battle_selected_target_latch_review.jsonstatic-inferredbattle-selected-target-latch-resolved0x0059e347 자체의 직접 producer는 0x0040fb1c/0x0040fb21 한 곳으로 닫힌다.; 그 producer는 0x0059e33e current actor/object index를 0x0059e347에 복사한다.; 이 복사는 target-scope bit 0x08이 없는 경로, 즉 nested target-selection UI가 필요 없는 기본 대상 경로에서만 수행된다.; target-scope bit 0x08이 있으면 0x0040fa6d는 e347을 쓰지 않고 stream +4 nested selection script로 들어간다.32,110 B
battle_result_family_dispatch_review.jsonstatic-inferredn/a8-byte hit unit의 byte[5]는 result-family id다. 0x00433f0e가 이를 target actor +0x6b에 복사한 뒤 0x00546970[id]를 호출한다.; byte[3]은 현재 추출된 452개 hit unit에서 전부 0x00이므로 reserved/unused로 둔다.; byte[4]는 action payload의 target scope id다. 현재 값은 0x01 self/setup, 0x05 all allies, 0x06 all enemies, 0x09 one ally, 0x0a one enemy로만 갈라진다.; byte[4]는 0x00433649에서 직접 읽히고 0x00433545/0x004335c6에서 actor +0x67 target selector로 복사된다.255,952 B
battle_mode_coefficient_review.jsonstatic-inferredmode-coefficients-grounded-tail-metadata전투 자세/상태 이름과 6개 계수 byte는 0x0048bcaa 포인터 테이블에서 확정적으로 읽힌다.; 기본 자세 5개는 보통/돌격/방어/선제/반격이며, 사용자 설명과 EXE 수치가 일치한다.; 돌격은 공격 115, 방어 90, 명중 110, 회피 80이다. 방어는 공격 80, 방어 150이다.; 선제는 행동순서 계수 120, 반격은 행동순서 계수 10이라 turn order 설명과 맞는다.21,934 B

데미지/회복/상태 변화

12 files

HP/MP 적용, 자세/상태 계수, 명중/회피/크리티컬/상태 성공, 회복 아이템, 전투 종료 보상.

근거 JSONEvidence상태요약크기
battle_damage_formula_trace_review.jsonstatic-inferredpartial-formula-traceconfirmed: ['0x433f0e가 hit unit payload를 선택하고 unit byte 0..2/5/7을 전투 결과 필드로 넘기는 지점이다.', 'hit unit byte[3]은 현재 추출된 모든 unit에서 0x00으로 고정되어 reserved/unused로 둔다.', 'hit unit byte[4]는 target scope id다. 0x01 self/setup, 0x05 all allies, 0x06 all enemies, 0x09 one ally, 0x0a one enemy로 분리된다.', '0x433649는 payload hit-unit byte[4]를 읽고, 0x433545/0x4335c6은 이를 runtime actor +0x67 target selector에 쓴다.', '0x40fa6d는 target scope bit 0x08로 selected-target branch를 가르고, 0x40f57c action setup은 selected target latch77,896 B
battle_stat_flag_status_semantics_review.jsonstatic-inferredstat-flag-semantics-grounded-critical-presentation-supported+0x08/+0x0a/+0x0e/+0x10/+0x59/+0x62/+0x6b/+0x6c/+0x6d/+0x6e는 동작 기준으로 확정.; +0x14는 플레이어 현재 EXP / 적 EXP reward base로 확정. 승리 루프는 KO 적의 +0x14를 공식에 넣고 살아있는 플레이어 +0x14에 결과를 더한다.; +0x1c/+0x20/+0x22/+0x24/+0x26은 플레이어 장비/레벨업 루틴과 전투 공식 사용처가 맞물려 공격력/방어력/기술력/순발력/운으로 확정.; +0x28은 대부분 100인 별도 기본 계수라 운으로 단정하지 않는다. 상태창에 표시되지 않는 숨은 attacker-side 상태/크리티컬 발동률 계수로 확정한다.26,175 B
battle_support_status_policy_review.jsonstatic-inferredconfirmedrows: 25; owners: {'아타호': 13, '린샹': 7, '스마슈': 5}; policyClasses: {'아타호 술 상태': 10, '전투 흐름': 3, '자세/명령': 4, '회복': 9, '린샹 고유 상태': 1, '상태 해제': 1, '원소 방어': 1, '스마슈 고유 상태': 1}; families: {'0x26': 1, '0x28': 2, '0x29': 2, '0x2a': 1, '0x2c': 1, '0x01': 3, '0x02': 3, '0x20': 4, '0x21': 4, '0x24': 1, '0x25': 1, '0x23': 1, '0x27': 1, '0x2e': 1, '0x22': 1, '0x2f': 1, '0x2d': 1, '0x03': 1}42,120 B
battle_status_transition_review.jsonstatic-inferredn/aactor +0x2a는 전투 자세와 상태이상을 모두 담는 확정 필드다.; 1..5는 플레이어가 전투 중 PgUp/PgDn으로 순환시키는 자세다.; 6..20은 공격 부가효과가 아니라 아타호 술취함, 스마슈 눈요기, 린샹 도발 전용 루틴이 직접 쓰는 캐릭터 고유 상태다.; 21..27은 일반 상태이상/행동불가 계열이다. 이 중 21..26은 +0x6c 공격 부가효과에서 올 수 있고, 27 기절은 HP 0 경로에서 온다.48,706 B
battle_recovery_item_effect_review.jsonstatic-inferredconfirmed consumable effect dispatch and revive flag clear소모품 전투 효과는 actor +0x59를 index로 삼아 0x00546a38 함수 포인터 테이블을 호출한다.; index 1..6은 약초/해독초/리프레시 워터/마법의 물약/고급한방약/마수석과 일치한다.; 리프레시 워터와 마수석은 target +0x62 bit 0x80을 검사한 뒤 +0x62=0x01로 덮어써 bit 0x40/0x80을 동시에 해제한다.; 따라서 기절 HP0에서 세워진 0x40과 표시/비활성 전환에서 세워진 0x80은 부활 아이템 효과 함수에서 해제되는 것으로 볼 수 있다.19,547 B
battle_end_reward_review.jsonstatic-inferredbattle-end-exp-gold-grounded-item-drop-handler-grounded-inactive전투 종료 보상은 KO된 enemy actor 기준으로 돌아간다. +0x62 bit 0x40이 KO 플래그다.; 경험치는 KO enemy마다 살아있는 player actor에게 fan-out된다. +0x62 bit 0x80 actor는 보상 fan-out에서 제외된다.; 경험치 공식은 적 EXP base(+0x14), player/enemy level(+0x06) 차이, 장비/아이템 class penalty를 사용하며 최종 보상은 1 미만으로 떨어지지 않는다.; 골드는 enemy actor +0x44에서 읽어 global money 0x4576e0에 더하고 999999로 cap한다.10,889 B
battle_per_hit_result_flag_review.jsonstatic-inferredper-hit-result-flags-grounded-critical-presentation-supportedBits 0x08/0x10/0x20 are per-hit result bits cleared at hit-unit reset by +0x62 &= 0xc3.; 0x20 is the strongest conclusion: target full miss / HP-apply skip. 0x4340ae returns before HP/recovery apply.; 0x08 is a guard/glancing chip-damage target result: the normal formula is skipped and attacker +0x6e becomes random(3)+1.; 0x10 belongs to the attacker and selects the critical/alternate damage path and alternate result sound/effect; the result layer clears it after consumption.17,647 B
battle_result_flag_lifecycle_review.jsonstatic-inferredn/aactor +0x62는 상태이상 전용 필드가 아니라 long-lived actor flags와 per-hit result flags가 섞인 바이트다.; hit-unit setup의 &=0xc3 마스크가 핵심이다. 0x01/0x02/0x40/0x80은 보존되고, 0x04/0x08/0x10/0x20은 매 hit마다 지워진다.; 따라서 전투 러너/엔진에서는 0x08/0x10/0x20을 데미지/사운드/결과 표시의 1타성 플래그로 취급하고, 0x01/0x02/0x40/0x80은 actor 상태 생명주기로 별도 관리해야 한다.; 0x10은 MISS처럼 텍스트를 띄우는 경로가 아니라 alternate damage, 전용 결과음/helper, 섬광성 presentation으로 소비되는 critical branch로 승격됐다.32,639 B
battle_one_turn_flag_review.jsonstatic-inferredn/aactor +0x62 bit 0x01 is a short-lived actor latch, not a damage/critical bit.; It is produced by one-turn status results, paralysis cure, and revive consumables.; The action-script gate at 0x40db36 tests mask 0x83, so 0x01 shares skip/branch behavior with timed lock 0x02 and inactive/display-skip 0x80.; The battle-order cleanup at 0x40d95b clears 0x01 after restoring +0x2a from +0x66 and clearing +0x64/+0x66.15,116 B
battle_timed_lock_flag_review.jsonstatic-inferredn/aactor +0x62 bit 0x02 is a timed command/action lock flag.; Most 0x02 producers pair it with +0x64 timer and +0x66 prior-status backup.; The common recovery path at 0x43512e decrements +0x64 and clears only bit 0x02 with &=0xfd after timer/random recovery.; The action-script gate at 0x40db36 tests mask 0x83, so 0x02 actors branch away from the normal action stream like 0x01 and 0x80 actors.12,967 B
battle_knockout_inactive_flag_review.jsonstatic-inferredn/aactor +0x62 bit 0x40 is the HP-zero / knockout state.; actor +0x62 bit 0x80 is not the HP-zero state itself; it is the inactive/display-wait skip state set after phase-4 knockout display scheduling.; The display transition checks (+0x62 & 0xc0)==0x40, schedules +0x5b=1/+0x5c=0x20/+0x60=4, then ORs bit 0x80.; 0x80 actors are skipped by display wait, action gate, battle-order cleanup, and fan-out paths.21,558 B
battle_sukyeong_element_guard_review.jsonstatic-inferredn/aresult-family 0x2f는 수경 레코드에서만 사용된다.; 0x00546970[0x2f]는 0x00434e29 루틴을 가리킨다.; 0x00434e29는 target actor +0x2f, +0x30, +0x31을 각각 0으로 clear한다.; damage formula는 target actor +0x1c + hitUnit.family를 가변 index로 읽는다. 따라서 family 0x13/0x14/0x15는 각각 actor +0x2f/+0x30/+0x31에 대응한다.26,702 B

표시/사운드/결과 연출

10 files

데미지 숫자, MISS/guard/critical 표시, 결과음, actor 표시 상태와 wait/slot 생명주기.

근거 JSONEvidence상태요약크기
battle_result_display_branch_review.jsonstatic-inferredtarget-result-display-branches-groundedTarget result object script 0x00454578 tests actor sideFlags(+0x62) bit 0x20 first, then bit 0x08.; The 0x20 branch selects WLK id 12, helper operand 0x05(dec 5), and target frame 0. This is the display/sound branch paired with the full miss / HP-apply skip bit.; The 0x08 branch selects WLK id 11, helper operand 0x16(dec 22), and target frame 0. This is the display/sound branch paired with the guard/glancing chip-damage bit.; The normal branch falls through to helper operand 0x02(dec 2) and targ11,304 B
battle_result_helper_label_review.jsonstatic-inferredresult-helper-special-branch-visuals-groundedreviewedHelpers: 3; helperOperands: ['0x02', '0x05', '0x16']; helperDecimalIds: [2, 5, 22]; promotedFrameScripts: 123,790 B
battle_damage_digit_display_review.jsonstatic-inferreddamage-digit-display-groundedDamage values are rendered through function 0x0042119b.; For damage-number mode, 0x0042129f adds frame base 0x36 and 0x004212a2 adds selector sprite base 0x00100000, producing selector base 0x00100036.; The render loop divides the value by 10, uses the remainder as digit, and calls render primitive 0x004175d3 with selector base + digit.; The selector range 0x00100036..0x0010003f maps to btl_etc frames 54..63, rectangles x=192..264 y=64, 8x16.18,853 B
battle_critical_presentation_review.jsonstatic-inferredcritical-palette-flash-script-groundedhwanse-battle-critical-presentation-review13,148 B
battle_status_success_sound_review.jsonstatic-inferredno-dedicated-status-success-sound-in-status-routinesroutineCount: 3; callCount: 13; audioCallCount: 0; displaySpawnCallCount: 028,764 B
battle_sound_role_review.jsonstatic-inferredsound-roles-separated-by-opcode-and-result-operandsskillRows: 156; uniqueBattleWlkNos: 26; effectCueCalls0x24: 218; resultNormalCalls0xc2: 230260,763 B
battle_sound_effect_review.jsonstatic-inferredseparates-0x24-effect-sound-from-0xc2-raw-result-sounddecodedSkillRows: 156; rowsWithEffectSoundOpcode24: 94; rowsWithRawSoundOpcodeC2: 133; rowsWithAltResultSoundRows: 100416,649 B
battle_actor_display_state_review.jsonstatic-inferredn/abattle actor display state review30,745 B
battle_actor_display_wait_semantics_review.jsonstatic-inferredactor-display-wait-loop-groundedwaitRows: 4; slotFieldRows: 9; bitRows: 4; evidenceBlocks: 626,692 B
battle_actor_display_slot_lifecycle_review.jsonstatic-inferredn/abattle actor display slot lifecycle review21,261 B

액션/애니메이션 VM

26 files

display VM, frame gate, helper opcode/body/child/frameScript, 이펙트 spawn-tree와 위치/이동 규칙.

근거 JSONEvidence상태요약크기
battle_display_vm_static_decode.jsonstatic-inferredstatic-vm-walk-for-promoted-and-phase-table-player-actionshwanse-battle-display-vm-static-decode2,183,708 B
battle_fallback_record_review.jsonstatic-inferredpayload-only-fallback-rows-promoted-through-phase-display-tablerows: 55; allHaveDisplayTablePointer: True; idleEndRows: 55; unknownStopRows: 045,630 B
battle_monster_action_frame_probe.jsonstatic-inferredstatic-monster-local-slot-reader-with-vm-script-producerhwanse-battle-monster-action-frame-probe2,571,371 B
battle_monster_action_effect_review.jsonstaticstatic-monster-action-presentation-effect-coverageactionRows: 294; presentationClassCounts: [{'value': 'local-frame-ready', 'count': 140}, {'value': 'damage-helper-effect-static-decoded', 'count': 74}, {'value': 'local-frame-motion-ready', 'count': 52}, {'value': 'local-frame-repeat-ready', 'count': 19}, {'value': 'support-helper-effect-static-decoded', 'count': 6}, {'value': 'recovery-no-local-frame', 'count': 3}]; visualClassCounts: [{'value': 'simple-frame', 'count': 92}, {'value': 'multi-frame', 'count': 61}, {'value': 'movement', 'count': 1,765,886 B
battle_skill_pattern_review.jsonstatic-inferredclassifies-hit-count-speed-and-visual-scaling-patternsdecodedSkillRows: 156; familyGroups: 28; classificationCounts: {'visual-scaling': 9, 'constant-fixed-family': 5, 'hit-count-scaling': 10, 'mixed-fixed-family': 2, 'speed-scaling': 2}; cautionGroupCount: 15352,716 B
battle_movement_pattern_review.jsonstatic-inferredscope-plus-display-vm-movement-patternsdecodedActionRows: 156; targetClassCounts: {'enemy-single': 69, 'self': 22, 'self-then-enemy-single': 5, 'enemy-all': 54, 'self-then-enemy-all': 3, 'ally-single': 2, 'ally-all': 1}; positionClassCounts: {'single-target-front-basic-implicit': 5, 'target-front-direct-placement': 21, 'self-support': 22, 'single-target-ranged-caster-effect': 5, 'target-approach-motion': 7, 'single-target-front-local-combo-inferred': 15, 'target-pierce-motion': 5, 'single-target-ranged-engine-effect': 11, 'self-prep-624,496 B
battle_caster_position_rule_review.jsonstatic-inferredper-skill-caster-position-rulesruleRows: 156; familyGroups: 74; casterRuleCounts: {'target-front-basic-implicit': 5, 'target-front-direct': 19, 'self-support': 21, 'target-front-implicit-local-combo': 20, 'home-approach-target': 7, 'target-front-then-pierce': 3, 'target-fixed-side-direct': 5, 'self-prep-target-front-local-combo': 2, 'caster-local-all-target-action': 24, 'screen-or-ranged-all-target-effect': 22, 'self-prep-screen-all-target-effect': 3, 'caster-ranged-effect': 7, 'all-target-no-promoted-position': 1, 'clone-spr246,597 B
battle_frame_gate_review.jsonstatic-inferredactor-repeat-gates-expanded-helper-gates-indexedrows: 156; rowsWithRepeatLoopExpansion: 18; rowsWithEngineWaitBarrier: 144; rowsWithHelperFrameScript: 52707,145 B
battle_display_wait_opcode_review.jsonstatic-inferredstatic-display-wait-opcodes-groundedwaitRows: 276; opcodeCounts: {'0xbf': 217, '0xc1': 59}; semanticClassCounts: {'actor-flag-barrier': 24, 'actor-flag-busy-barrier': 44, 'inverse-actor-flag-barrier': 4, 'pierce-motion-actor-flag-barrier': 8, 'pre-result-actor-flag-barrier': 23, 'result-reaction-barrier': 173}; c1ModeCounts: {'0': 55, '1': 4}503,474 B
battle_display_opcode_semantics_review.jsonstaticremaining-display-opcodes-auditedauditedOpcodes: 8; grounded: 8; partiallyGrounded: 0; decodedRows: 40166,037 B
battle_hit_window_gap_review.jsonstatic-inferredmain-actor-hit-window-coverage-and-sound-only-gapsrows: 156; hitEvents: 230; confirmedHitEvents: 230; resultSoundOnlyEvents: 0191,145 B
battle_action_event_timeline_review.jsonstatic-inferredmain-actor-vm-gate-order-hit-sound-helper-timelinerows: 156; rowsWithResultSound: 133; rowsWithEffectSound: 94; rowsWithHelperCall: 961,512,757 B
battle_effect_object_review.jsonstatichelper-child-spawn-frameScript-anchor-reviewhelpers: 85; helpersWithDirectFrameScript: 20; helpersWithSpawnTree: 55; helpersWithRandomRange: 381,399,612 B
battle_effect_semantics_review.jsonstatic-inferredeffect-render-track-classificationrows: 156; renderTrackCounts: {'actor-melee-or-dash': 55, 'support-or-status': 25, 'ranged-projectile-or-beam': 16, 'self-prep-actor-hit': 2, 'caster-action-screen-hit': 24, 'screen-wide-effect': 23, 'spawned-child-display-flow': 9, 'simple-screen-hit': 1, 'display-list-cleanup-flow': 1}; implementationStateCounts: {'actor-frame-inferred': 5, 'actor-frame-mostly-promoted': 49, 'needs-ui/status-effect-policy': 25, 'needs-child-helper-script-runner': 34, 'actor-frame-self-prep': 2, 'actor-frame-pl160,543 B
battle_helper_opcode_review.jsonstatic-inferredgroups-helper-like-battle-vm-opcodesdecodedRows: 156; rowsWithHelperId0xbd: 96; uniqueHelperIds0xbd: 69; rowsWithEffectWlk0x24: 94222,116 B
battle_helper_body_review.jsonstatic0xbd-dispatch-table-and-function-body-evidenceusedHelperIds: 85; playerHelperIds: 69; monsterHelperIds: 42; uniqueFunctionBodies: 38249,344 B
battle_helper_child_script_review.jsonstaticchild-display-script-static-decodehelperRows: 85; helpersWithDecodedChildScript: 85; helpersWithAnyFrameWrite: 25; helpersWithRandomRange: 311,430,973 B
battle_helper_frame_script_review.jsonstatichelper-frame-script-static-decodeframeScriptTargets: 24; helpersWithFrameScriptTargets: 20; skillsWithFrameScriptTargets: 51; targetsWithFrameWrites: 24148,818 B
battle_helper_effect_runtime_review.jsonstaticconfirmed-helper-static-factshelpers: 77; skillsIndexed: 61; helpersWithRandomRange: 27; helpersWithFrameScript: 18230,421 B
battle_helper_sync_timing_review.jsonstaticconfirmed-gate-order-synchelpers: 85; helpersWithFrameScriptTimeline: 20; helpersWithCombinedActorFlags: 70; helpersWithChildActorFlags: 55818,717 B
battle_helper_resource_flow_review.jsonstaticrandom-motion-control-flow-static-reviewhelperRows: 77; helpersWithRandomRange: 27; helpersWithMotionStep: 18; helpersWithClearDisplayList: 11491,991 B
battle_helper_position_motion_review.jsonstatichelper-position-motion-field-reviewhelpers: 85; helpersWithPositionOrMotion: 84; helpersWithMotionStep: 34; fieldWriteCounts: {'0x1c': 217, '0x20': 219, '0x68': 17, '0x6c': 31, '0x74': 80, '0x80': 68, '0x84': 113, '0x88': 24, '0x8c': 121, '0x8e': 47, '0x90': 110, '0x92': 63, '0x94': 64, '0x96': 76, '0xa8': 155}1,071,256 B
battle_helper_transform_solver_review.jsonstaticstatic-helper-transform-coveragemonsterActionRows: 294; helperCalls: 139; helperCallsWithPreviewScript: 102; previewScripts: 219573,545 B
battle_helper_spawn_tree_review.jsonstaticspawn-tree-helper-decodehelpersWithSpawnTree: 55; spawnNodes: 124; uniqueSpawnTargets: 42; uniqueSpawnLocalFrameScriptTargets: 21794,940 B
battle_helper_visual_behavior_review.jsonstatic-inferredexe-derived-helper-visual-behaviorhelpers: 85; helpersWithVisualEvidence: 85; behaviorClassCounts: {'actor-flag-sync': 10, 'multi-frameScript-effect': 16, 'init-frame-effect': 7, 'direct-frame-spawn': 21, 'randomized-child-spawn-stream': 21, 'nested-frameScript-spawn-effect': 5, 'single-frameScript-flash': 2, 'repeated-direct-frame-spawn': 3}; helpersWithBlinkFlag: 01,528,229 B
battle_skill_implementation_gap_review.jsonstatic-inferredno-unresolved-implementation-gapsrowsWithFlags: 0; supportPolicyRowsOutsideGap: 25; presentationPolicyRows: 0; runnerImplementationGapRows: 01,687 B

전투 리소스/후보 데이터

5 files

전투 배경, 적 스프라이트 후보, 이벤트 후보, 브라우저 smoke 결과처럼 계산식과 직접 무관한 보조 데이터.

근거 JSONEvidence상태요약크기
battle_backgrounds.jsonstatic-inferredn/abattle backgrounds116,859 B
battle_enemy_candidates.jsonstatic-inferredsprite-proximity-candidate-not-enemy-rowbattle enemy candidates274,431 B
battle_event_candidates.jsonstatic-inferredBattle-like event dialogue blocks with btl_* resources.battle event candidates22,405 B
battle_action_handler_context.jsonstatic-inferredbattle-action-handler-grounded-entry-dispatch-missingbattle action handler context7,529 B
battle_background_review_browser_smoke.jsonbrowser-smokepassedbattle background review browser smoke5,337 B

기타 JSON 근거

30 files

통합 그룹에 직접 배치하지 않은 남은 전투 JSON 근거.

근거 JSONEvidence상태요약크기
battle_analysis_summary.jsonstatic-inferredn/ahwanse-battle-analysis-summary74,377 B
battle_bakuten_effect_review.jsonstatic-inferredstatic-exe-proof-for-bakuten-blade-helper-motionlevels: 4; levelsWithHelper: 3; effectFrame: btl_efc#179; effectRect: {'x': 192, 'y': 224, 'w': 48, 'h': 64, 'index': 179, 'asset': 'btl_efc', 'frame': 179}6,698 B
battle_child_lifecycle_draw_order_review.jsonstaticstatic-child-lifecycle-reviewedskillRows: 58; helpersWithDirectSpawn: 63; totalDirectSpawnEvents: 279; rendererReadinessCounts: {'renderer-needs-lifecycle-work': 93}273,528 B
battle_child_spawn_stream_review.jsonstaticstatic-child-spawn-stream-reviewedreviewRows: 59; uniqueHelpers: 49; ownerCounts: {'린샹': 22, '스마슈': 17, '아타호': 20}; requirementCounts: {'child motion loop present': 5, 'palette transform effect; no CNS frame stream': 1, 'random placement/range present': 46, 'runner must instantiate child objects over time': 28}129,715 B
battle_child_target_renderer_gap_review.jsonstaticrenderer-plan-consumed-with-partial-motion-semanticstargetRendererPlanRows: 11; rendererPlanClassCounts: {'counter-held-direct-frame': 3, 'motion-boundary-loop': 7, 'nested-child-spawner': 1}; implementationRequirementCounts: {'apply-boundary-loop-lifetime': 7, 'apply-counter-held-lifetime': 3, 'apply-motion-step-until-branch': 7, 'apply-nested-repeat-counter': 1, 'consume-target-renderer-plan-json': 11, 'recursive-child-spawn-lifetime': 1}; fulfilledRequirementCounts: {'apply-boundary-loop-lifetime': 7, 'apply-counter-held-lifetime': 3, 'apply-m13,362 B
battle_child_target_renderer_plan_review.jsonstaticrenderer-parameter-plan-staticuniqueHelperTargetPlans: 11; rendererPlanClassCounts: {'counter-held-direct-frame': 3, 'motion-boundary-loop': 7, 'nested-child-spawner': 1}; helperCounts: {'105': 1, '106': 1, '107': 1, '79': 1, '95': 1, '96': 2, '97': 2, '98': 2}; unresolvedRendererActions: 051,447 B
battle_child_target_script_expansion_review.jsonstaticstatic-target-script-expandedtargetScriptStopReasonEvents: 79; promotedTargetScriptEvents: 79; remainingUnclassifiedEvents: 0; targetScriptClassCounts: {'counter-held-direct-frame': 12, 'motion-boundary-loop': 63, 'nested-child-spawner': 4}117,030 B
battle_dragon_effect_motion_review.jsonstatic-inferredstatic-exe-dragon-child-spawn-stream-confirmedhelperIds: [95, 96, 97, 98]; levels: [1, 2, 3, 4]; spawnCountsByLevel: [{'level': 1, 'skillIdHex': '0x15', 'helperId': 95, 'directSpawnCount': 17, 'frameTimeline': ['186@0', '186@2', '186@4', '186@6', '186@8', '186@10', '186@12', '186@14', '186@16', '186@18', '186@20', '186@22', '186@24', '186@26', '186@28', '186@30', '186@32']}, {'level': 2, 'skillIdHex': '0x16', 'helperId': 96, 'directSpawnCount': 7, 'frameTimeline': ['184@0', '186@1', '186@2', '186@3', '186@4', '186@5', '186@6']}, {'level': 348,000 B
battle_effect_animation_pattern_review.jsonstaticeffect-helper-animation-patterns-joined-by-skillskillRows: 156; helperRows: 85; skillsWithHelpers: 96; skillsWithEffectFrames: 921,225,985 B
battle_effect_capture_checklist.jsonstatic-inferredwaiting-for-capturesmanifestPath: data/battle_effect_capture_manifest.json; manifestExists: False; firstPassRows: 8; firstPassReady: 052,819 B
battle_effect_pixel_compare_report.jsonstatic-inferredwaiting-for-capturesmanifestExists: False; manifestEntries: 0; firstPassRowsExpected: 8; firstPassRowsCompared: 0498 B
battle_effect_pixel_oracle_plan.jsonstatic-inferredcapture-oracle-not-builtremainingGap: original-runtime pixel/particle choreography oracle; webVisualAssertionStatus: visual-assertions-pass; webVisualAssertionRows: 52; requiredFullOracleRows: 5267,314 B
battle_effect_runner_binding_review.jsonstatic-inferredrunner-binding-reviewedeffectSkillRows: 156; skillsWithEffectFrames: 92; skillsWithReviewFlags: 0; skillsWithExecutionRequirements: 527,729 B
battle_effect_visual_assertion_review.jsonstatic-inferredvisual-assertions-passrequirementRows: 52; representativeEffectRows: 13; requirementGroups: 4; effectClassGroups: 331,102 B
battle_formula_calculator_notes.jsonstatic-inferredcalculator-facing-evidencehwanse-battle-formula-calculator-notes3,272 B
battle_hishokaku_effect_review.jsonstatic-inferredstatic-exe-proof-for-hishokaku-dash-and-0xbc-child-effectlevels: 4; levelsWithHelper: 0; levelsWithDustProjection: 2; levelsWithGroundedEffectFrameStream: 2246,668 B
battle_hogyeok_effect_review.jsonstatic-inferredstatic-exe-proof-for-hogyeok-target-overlaid-effectlevels: 4; levelsWithVisualHelper: 3; levelsWithBlink: 0; targetOverlayProofRows: 36,918 B
battle_monster_movement_pattern_review.jsonstaticstatic-monster-movement-patterns-groundedactionRows: 294; movementClassCounts: [{'value': 'stationary-local-frame', 'count': 163}, {'value': 'stationary-helper-effect', 'count': 64}, {'value': 'dash-or-charge-then-return', 'count': 30}, {'value': 'direct-placement-local', 'count': 17}, {'value': 'local-offset-pose', 'count': 11}, {'value': 'direct-placement-helper-effect', 'count': 5}, {'value': 'nonzero-motion-other-window', 'count': 4}]; topMovementSignatures: [{'value': '-', 'count': 220}, {'value': 'pre-result:direct-placement/m0/s542,386 B
battle_motion_boundary_loop_review.jsonstaticmotion-boundary-loop-semantics-groundedmotionBoundaryRows: 7; helpers: [95, 96, 97, 98]; helperRowCounts: {'95': 1, '96': 2, '97': 2, '98': 2}; motionModeCounts: {'0x09': 7}43,934 B
battle_mouko_special_sparkle_review.jsonstatic-inferredstatic-exe-proof-for-0xbc-mode4-sparkle-child-effectmode4CallCount: 2; moukoSpecialCall: {'ownerKey': 'ataho', 'ownerName': '아타호', 'skillName': '맹호스페셜', 'skillIdHex': '0x19', 'level': 4, 'key': 'ataho:0x19:4', 'tick': 60, 'movementOpcode': {'tick': 60, 'kind': 'movement', 'vaHex': '0x004d69cc', 'opcode': '0xbc', 'summary': 'interpolated child motion mode=4, selector=2, stepDivisor=4: one target-side edge placement; side depends on actor kind.', 'selector': 2, 'divisor': 4, 'movementMode': 4}, 'resultSoundAtSameTick': {'tick': 60, 'kind': 'result-196,996 B
battle_player_display_start_audit.jsonstatic-inferredstrict-player-display-start-auditplayerRows: 156; evidenceClassCounts: {'phase-table direct': 53, 'branch-family override': 103}; startSourceCounts: {'display-table-phase-pointer': 53, 'entry-spec-family-start': 97, 'display-start-override': 6}; findingCounts: {}571,796 B
battle_result_layer_trace_review.jsonstatic-inferredtarget-result-layer-static-groundedtargetScriptRows: 31; targetBlocks: 7; runtimeResultRows: 0; targetDamageRows: 042,306 B
battle_roar_effect_review.jsonstatic-inferredstatic-exe-proof-for-mengho-roar-effectlevels: 4; levelsWithVisualHelper: 3; levelsWithBlink: 0; btlEfcFrame190Rect: {'x': 480, 'y': 208, 'w': 80, 'h': 80, 'frame': 190, 'asset': 'btl_efc'}4,079 B
battle_skill_complete_pattern_review.jsonstatic-inferredaggregated-skill-pattern-evidencerows: 156; rowsWithHelper: 96; rowsWithHelperLifecycle: 60; rowsWithChildMotionLoop: 51,852,314 B
battle_skill_goal_audit.jsonstatic-inferredcompletecriteria: 4; complete: 4; notComplete: 0; missingOrIncomplete: []8,422 B
battle_skill_timeline_browser_smoke.jsonbrowser-smokeokhwanse-battle-skill-timeline-browser-smoke193,079 B
battle_skill_timeline_browser_summary.jsonstatic-inferredreadyhwanse-battle-skill-timeline-browser-summary12,119 B
battle_skill_timeline_canonical.jsonstaticcanonical-exe-evidence-bundleplayerRows: 156; monsterRows: 294; totalRows: 450; alignmentCounts: {'start-confirmed': 53, 'visual-confirmed': 397}4,511,157 B
battle_skill_timeline_status.jsonstatic-inferredplayer-skill-timeline-confirmationplayerRows: 156; statusCounts: {'confirmed': 156}; visualAlignmentCounts: {'phase-table-start-confirmed': 53, 'family-start-confirmed': 97, 'display-start-corrected': 6}; reasonCounts: {}141,124 B
battle_sparkle_motion_review.jsonstatic-inferredstatic-exe-sparkle-loop-count-and-shared-child-frame-scriptmode4ChildSpawnTotalCount: 4; qaejinHelperStepCounts: [{'skillIdHex': '0x0a', 'level': 2, 'helperId': 29, 'stepCount': 1}, {'skillIdHex': '0x0b', 'level': 3, 'helperId': 30, 'stepCount': 2}, {'skillIdHex': '0x0c', 'level': 4, 'helperId': 31, 'stepCount': 10}]; sharedSparkleFrames: [30, 31, 32, 33, 34, 35, 36, 37]; sharedSparkleGates: [2, 2, 2, 2, 2, 2, 2, 2]19,154 B