{"version":1,"kind":"battle-sparkle-motion-review","status":"static-exe-sparkle-loop-count-and-shared-child-frame-script","source":["out/battle_helper_child_script_review.json","out/battle_skill_complete_pattern_review.json","out/battle_mouko_special_sparkle_review.json","Hwanse2.exe display VM scripts 0x004b4fac/0x004b5138/0x004b517c/0x004b5b4c"],"summary":{"mode4ChildSpawnTotalCount":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]},"interpretationNotes":["mode4 계열과 쾌진격 helper 29/30/31은 모두 0x004b5138 child와 0x004b517c frame script를 공유한다.","쾌진격 2/3/4단은 helper init에서 +0x96 stepCount가 각각 1/2/10으로 들어간다. 따라서 신기 쾌진격을 4개 고정 파티클로 보는 것은 EXE 근거와 맞지 않는다.","정적 EXE로 확정 가능한 것은 helper 반복 수, child frame stream, gate, RNG range, branch 구조다. 런타임 RNG seed와 최종 화면 좌표는 아직 preview projection으로만 표현한다.","btl_efc#30..37 내부의 여러 밝은 점은 CNS 프레임 픽셀/컴포넌트이며, EXE가 한 child에서 여러 sprite copy를 추가로 그린다는 증거는 아직 없다."],"mode4":{"branchVaHex":"0x004b5b4c","childStartVaHex":"0x004b5138","childContextVaHex":"0x004b517c","frameSequence":[30,31,32,33,34,35,36,37],"gateSequence":[2,2,2,2,2,2,2,2],"childSpawnTotalCount":4,"repeatLoopCount":4,"visibleSkillKeys":[{"ownerKey":"ataho","skillName":"맹호스페셜","skillIdHex":"0x19","level":4,"key":"ataho:0x19:4","tick":60},{"ownerKey":"rinshan","skillName":"선렬각","skillIdHex":"0x10","level":4,"key":"rinshan:0x10:4","tick":22}],"branchRowsOfInterest":[{"vaHex":"0x004b5be4","opcode":"0x07","category":"spawn-child-vm","summary":"spawn child display VM type=2 runner=0x00402321 target=0x004b5138 into +0x58"},{"vaHex":"0x004b5bf4","opcode":"0x2b","category":"effect-resource-handle","summary":"resolve effect/resource handle id=0x3000 through 0x427730 into display object +0x58"},{"vaHex":"0x004b5c0c","opcode":"0x2b","category":"effect-resource-handle","summary":"resolve effect/resource handle id=0x0060 through 0x427730 into display object +0x58"},{"vaHex":"0x004b5c30","opcode":"0x2d","category":"trig-motion","summary":"trigonometric motion update axes=x,y mode=additive; angle fields +0x8c/+0x8e/+0x90, amplitude +0x92/+0x94/+0x96"},{"vaHex":"0x004b5cac","opcode":"0x06","category":"repeat-loop","summary":"repeat/control count=4, target=0x004b5be4; static walk records it but does not expand loop body"}],"frameFragmentReview":[{"frame":30,"rect":{"x":512,"y":0,"w":16,"h":16},"nonTransparentPixelCount":21,"componentCount":1,"components":[{"pixelCount":21,"bounds":{"x":6,"y":6,"w":5,"h":5}}],"visualFragmentNote":"single EXE child sprite frame"},{"frame":31,"rect":{"x":528,"y":0,"w":16,"h":16},"nonTransparentPixelCount":18,"componentCount":1,"components":[{"pixelCount":18,"bounds":{"x":4,"y":4,"w":9,"h":6}}],"visualFragmentNote":"single EXE child sprite frame"},{"frame":32,"rect":{"x":544,"y":0,"w":16,"h":16},"nonTransparentPixelCount":11,"componentCount":3,"components":[{"pixelCount":9,"bounds":{"x":7,"y":7,"w":3,"h":3}},{"pixelCount":1,"bounds":{"x":6,"y":10,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":5,"y":11,"w":1,"h":1}}],"visualFragmentNote":"single EXE child sprite frame; apparent multiple spark fragments are pixels/components inside this frame"},{"frame":33,"rect":{"x":560,"y":0,"w":16,"h":16},"nonTransparentPixelCount":25,"componentCount":7,"components":[{"pixelCount":15,"bounds":{"x":6,"y":5,"w":5,"h":7}},{"pixelCount":2,"bounds":{"x":11,"y":2,"w":2,"h":1}},{"pixelCount":2,"bounds":{"x":14,"y":4,"w":1,"h":2}},{"pixelCount":2,"bounds":{"x":2,"y":11,"w":1,"h":2}},{"pixelCount":2,"bounds":{"x":4,"y":14,"w":2,"h":1}},{"pixelCount":1,"bounds":{"x":13,"y":3,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":3,"y":13,"w":1,"h":1}}],"visualFragmentNote":"single EXE child sprite frame; apparent multiple spark fragments are pixels/components inside this frame"},{"frame":34,"rect":{"x":576,"y":0,"w":16,"h":16},"nonTransparentPixelCount":27,"componentCount":7,"components":[{"pixelCount":21,"bounds":{"x":6,"y":6,"w":5,"h":5}},{"pixelCount":1,"bounds":{"x":6,"y":4,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":5,"y":5,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":4,"y":6,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":12,"y":10,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":11,"y":11,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":10,"y":12,"w":1,"h":1}}],"visualFragmentNote":"single EXE child sprite frame; apparent multiple spark fragments are pixels/components inside this frame"},{"frame":35,"rect":{"x":592,"y":0,"w":16,"h":16},"nonTransparentPixelCount":36,"componentCount":1,"components":[{"pixelCount":36,"bounds":{"x":2,"y":2,"w":12,"h":13}}],"visualFragmentNote":"single EXE child sprite frame"},{"frame":36,"rect":{"x":608,"y":0,"w":16,"h":16},"nonTransparentPixelCount":15,"componentCount":5,"components":[{"pixelCount":9,"bounds":{"x":7,"y":7,"w":3,"h":3}},{"pixelCount":2,"bounds":{"x":3,"y":8,"w":2,"h":1}},{"pixelCount":2,"bounds":{"x":8,"y":14,"w":1,"h":2}},{"pixelCount":1,"bounds":{"x":8,"y":1,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":13,"y":8,"w":1,"h":1}}],"visualFragmentNote":"single EXE child sprite frame; apparent multiple spark fragments are pixels/components inside this frame"},{"frame":37,"rect":{"x":624,"y":0,"w":16,"h":16},"nonTransparentPixelCount":18,"componentCount":6,"components":[{"pixelCount":13,"bounds":{"x":6,"y":6,"w":5,"h":5}},{"pixelCount":1,"bounds":{"x":6,"y":6,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":10,"y":6,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":6,"y":10,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":10,"y":10,"w":1,"h":1}},{"pixelCount":1,"bounds":{"x":11,"y":11,"w":1,"h":1}}],"visualFragmentNote":"single EXE child sprite frame; apparent multiple spark fragments are pixels/components inside this frame"}],"exeConfirmed":["0xbc movementMode=4 branch target 0x004b5b4c","0x004b5b4c spawns child display VM 0x004b5138","0x004b517c emits btl_efc#30..37 gate 2","0x004b5cac repeat count is total child body executions"],"previewOnly":["exact runtime RNG seed","exact target-side screen coordinates"]},"qaejin":[{"ownerKey":"smashu","ownerName":"스마슈","skillName":"쾌진격","skillIdHex":"0x0a","level":2,"key":"smashu:0x0a","helperId":29,"childScriptVaHex":"0x004b51c0","stepCount":1,"stepCountWrite":{"vaHex":"0x004b51c0","destHex":"0x96","destLabel":"motion.stepCount +0x96","value":1,"valueHex":"0x0001","summary":"word motion.stepCount +0x96 = 0x0001"},"spawnTargetVaHex":"0x004b5138","frameScriptVaHex":"0x004b517c","frameSequence":[30,31,32,33,34,35,36,37],"gateSequence":[2,2,2,2,2,2,2,2],"randomRanges":[{"vaHex":"0x004b5064","randomRange":16,"randomRangeHex":"0x0010"},{"vaHex":"0x004b5078","randomRange":4096,"randomRangeHex":"0x1000"},{"vaHex":"0x004b50a8","randomRange":4096,"randomRangeHex":"0x1000"}],"spawnRows":[{"vaHex":"0x004b5044","targetVaHex":"0x004b5138","childObjectType":2,"summary":"spawn child display VM type=2 runner=0x00402321 target=0x004b5138 into +0x58"}],"branchTargets":[{"vaHex":"0x004b50f8","category":"branch","targetVaHex":"0x004b5030","comparison":"!=","summary":"word conditional branch unresolved if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b5030"},{"vaHex":"0x004b510c","category":"conditional-branch","targetVaHex":"0x004b502c","comparison":"bit-test","summary":"conditional branch field +0x5c bit-test 0x00000200; target 0x004b502c"}],"rowsOfInterest":[{"vaHex":"0x004b502c","opcode":"0x11","category":"child-write","summary":"display/child field +0x90, source +0x96, mode=0xa0","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5030","opcode":"0x12","category":"write","summary":"set display/actor field +0xa8, source +0xa0, mode=0xa0","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5044","opcode":"0x07","category":"spawn-child-vm","summary":"spawn child display VM type=2 runner=0x00402321 target=0x004b5138 into +0x58","targetVaHex":"0x004b5138","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5064","opcode":"0x2b","category":"random-range","summary":"rng(range=16) -> +0x58","targetVaHex":null,"randomRange":16,"randomRangeHex":"0x0010","comparison":null},{"vaHex":"0x004b5078","opcode":"0x2b","category":"random-range","summary":"rng(range=4096) -> +0x58","targetVaHex":null,"randomRange":4096,"randomRangeHex":"0x1000","comparison":null},{"vaHex":"0x004b508c","opcode":"0x2d","category":"motion-step","summary":"relative trig step motion step mode=0x03 axes=x+y","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50a8","opcode":"0x2b","category":"random-range","summary":"rng(range=4096) -> +0x58","targetVaHex":null,"randomRange":4096,"randomRangeHex":"0x1000","comparison":null},{"vaHex":"0x004b50dc","opcode":"0x2d","category":"motion-step","summary":"relative trig step motion step mode=0x03 axes=x+y","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50f0","opcode":"0x11","category":"child-write","summary":"display/child field +0x90, imm=0x00000001 (1.52588e-05px), mode=0x82","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50f8","opcode":"0x14","category":"branch","summary":"word conditional branch unresolved if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b5030","targetVaHex":"0x004b5030","randomRange":null,"randomRangeHex":null,"comparison":"!="},{"vaHex":"0x004b5104","opcode":"0x02","category":"countdown-wait","summary":"countdown wait frames=1","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b510c","opcode":"0x15","category":"conditional-branch","summary":"conditional branch field +0x5c bit-test 0x00000200; target 0x004b502c","targetVaHex":"0x004b502c","randomRange":null,"randomRangeHex":null,"comparison":"bit-test"}],"exeConfirmed":["helper child script VA","motion.stepCount +0x96 initial value","spawn child display VM 0x004b5138","branch 0x004b50f8 loops to 0x004b5030 while +0x90 != 0","random ranges and trig-motion opcodes used inside the loop","child frame script 0x004b517c emits btl_efc#30..37 gate 2"],"previewOnly":["exact runtime RNG seed","exact screen-space particle coordinates","browser particle scatter visualization"]},{"ownerKey":"smashu","ownerName":"스마슈","skillName":"쾌진격","skillIdHex":"0x0b","level":3,"key":"smashu:0x0b","helperId":30,"childScriptVaHex":"0x004b51d4","stepCount":2,"stepCountWrite":{"vaHex":"0x004b51d4","destHex":"0x96","destLabel":"motion.stepCount +0x96","value":2,"valueHex":"0x0002","summary":"word motion.stepCount +0x96 = 0x0002"},"spawnTargetVaHex":"0x004b5138","frameScriptVaHex":"0x004b517c","frameSequence":[30,31,32,33,34,35,36,37],"gateSequence":[2,2,2,2,2,2,2,2],"randomRanges":[{"vaHex":"0x004b5064","randomRange":16,"randomRangeHex":"0x0010"},{"vaHex":"0x004b5078","randomRange":4096,"randomRangeHex":"0x1000"},{"vaHex":"0x004b50a8","randomRange":4096,"randomRangeHex":"0x1000"}],"spawnRows":[{"vaHex":"0x004b5044","targetVaHex":"0x004b5138","childObjectType":2,"summary":"spawn child display VM type=2 runner=0x00402321 target=0x004b5138 into +0x58"}],"branchTargets":[{"vaHex":"0x004b50f8","category":"branch","targetVaHex":"0x004b5030","comparison":"!=","summary":"word conditional branch unresolved if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b5030"},{"vaHex":"0x004b510c","category":"conditional-branch","targetVaHex":"0x004b502c","comparison":"bit-test","summary":"conditional branch field +0x5c bit-test 0x00000200; target 0x004b502c"}],"rowsOfInterest":[{"vaHex":"0x004b502c","opcode":"0x11","category":"child-write","summary":"display/child field +0x90, source +0x96, mode=0xa0","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5030","opcode":"0x12","category":"write","summary":"set display/actor field +0xa8, source +0xa0, mode=0xa0","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5044","opcode":"0x07","category":"spawn-child-vm","summary":"spawn child display VM type=2 runner=0x00402321 target=0x004b5138 into +0x58","targetVaHex":"0x004b5138","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5064","opcode":"0x2b","category":"random-range","summary":"rng(range=16) -> +0x58","targetVaHex":null,"randomRange":16,"randomRangeHex":"0x0010","comparison":null},{"vaHex":"0x004b5078","opcode":"0x2b","category":"random-range","summary":"rng(range=4096) -> +0x58","targetVaHex":null,"randomRange":4096,"randomRangeHex":"0x1000","comparison":null},{"vaHex":"0x004b508c","opcode":"0x2d","category":"motion-step","summary":"relative trig step motion step mode=0x03 axes=x+y","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50a8","opcode":"0x2b","category":"random-range","summary":"rng(range=4096) -> +0x58","targetVaHex":null,"randomRange":4096,"randomRangeHex":"0x1000","comparison":null},{"vaHex":"0x004b50dc","opcode":"0x2d","category":"motion-step","summary":"relative trig step motion step mode=0x03 axes=x+y","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50f0","opcode":"0x11","category":"child-write","summary":"display/child field +0x90, imm=0x00000001 (1.52588e-05px), mode=0x82","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50f8","opcode":"0x14","category":"branch","summary":"word conditional branch unresolved if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b5030","targetVaHex":"0x004b5030","randomRange":null,"randomRangeHex":null,"comparison":"!="},{"vaHex":"0x004b5104","opcode":"0x02","category":"countdown-wait","summary":"countdown wait frames=1","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b510c","opcode":"0x15","category":"conditional-branch","summary":"conditional branch field +0x5c bit-test 0x00000200; target 0x004b502c","targetVaHex":"0x004b502c","randomRange":null,"randomRangeHex":null,"comparison":"bit-test"}],"exeConfirmed":["helper child script VA","motion.stepCount +0x96 initial value","spawn child display VM 0x004b5138","branch 0x004b50f8 loops to 0x004b5030 while +0x90 != 0","random ranges and trig-motion opcodes used inside the loop","child frame script 0x004b517c emits btl_efc#30..37 gate 2"],"previewOnly":["exact runtime RNG seed","exact screen-space particle coordinates","browser particle scatter visualization"]},{"ownerKey":"smashu","ownerName":"스마슈","skillName":"쾌진격","skillIdHex":"0x0c","level":4,"key":"smashu:0x0c","helperId":31,"childScriptVaHex":"0x004b51e8","stepCount":10,"stepCountWrite":{"vaHex":"0x004b51e8","destHex":"0x96","destLabel":"motion.stepCount +0x96","value":10,"valueHex":"0x000a","summary":"word motion.stepCount +0x96 = 0x000a"},"spawnTargetVaHex":"0x004b5138","frameScriptVaHex":"0x004b517c","frameSequence":[30,31,32,33,34,35,36,37],"gateSequence":[2,2,2,2,2,2,2,2],"randomRanges":[{"vaHex":"0x004b5064","randomRange":16,"randomRangeHex":"0x0010"},{"vaHex":"0x004b5078","randomRange":4096,"randomRangeHex":"0x1000"},{"vaHex":"0x004b50a8","randomRange":4096,"randomRangeHex":"0x1000"}],"spawnRows":[{"vaHex":"0x004b5044","targetVaHex":"0x004b5138","childObjectType":2,"summary":"spawn child display VM type=2 runner=0x00402321 target=0x004b5138 into +0x58"}],"branchTargets":[{"vaHex":"0x004b50f8","category":"branch","targetVaHex":"0x004b5030","comparison":"!=","summary":"word conditional branch unresolved if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b5030"},{"vaHex":"0x004b510c","category":"conditional-branch","targetVaHex":"0x004b502c","comparison":"bit-test","summary":"conditional branch field +0x5c bit-test 0x00000200; target 0x004b502c"}],"rowsOfInterest":[{"vaHex":"0x004b502c","opcode":"0x11","category":"child-write","summary":"display/child field +0x90, source +0x96, mode=0xa0","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5030","opcode":"0x12","category":"write","summary":"set display/actor field +0xa8, source +0xa0, mode=0xa0","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5044","opcode":"0x07","category":"spawn-child-vm","summary":"spawn child display VM type=2 runner=0x00402321 target=0x004b5138 into +0x58","targetVaHex":"0x004b5138","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b5064","opcode":"0x2b","category":"random-range","summary":"rng(range=16) -> +0x58","targetVaHex":null,"randomRange":16,"randomRangeHex":"0x0010","comparison":null},{"vaHex":"0x004b5078","opcode":"0x2b","category":"random-range","summary":"rng(range=4096) -> +0x58","targetVaHex":null,"randomRange":4096,"randomRangeHex":"0x1000","comparison":null},{"vaHex":"0x004b508c","opcode":"0x2d","category":"motion-step","summary":"relative trig step motion step mode=0x03 axes=x+y","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50a8","opcode":"0x2b","category":"random-range","summary":"rng(range=4096) -> +0x58","targetVaHex":null,"randomRange":4096,"randomRangeHex":"0x1000","comparison":null},{"vaHex":"0x004b50dc","opcode":"0x2d","category":"motion-step","summary":"relative trig step motion step mode=0x03 axes=x+y","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50f0","opcode":"0x11","category":"child-write","summary":"display/child field +0x90, imm=0x00000001 (1.52588e-05px), mode=0x82","targetVaHex":"","randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b50f8","opcode":"0x14","category":"branch","summary":"word conditional branch unresolved if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b5030","targetVaHex":"0x004b5030","randomRange":null,"randomRangeHex":null,"comparison":"!="},{"vaHex":"0x004b5104","opcode":"0x02","category":"countdown-wait","summary":"countdown wait frames=1","targetVaHex":null,"randomRange":null,"randomRangeHex":null,"comparison":null},{"vaHex":"0x004b510c","opcode":"0x15","category":"conditional-branch","summary":"conditional branch field +0x5c bit-test 0x00000200; target 0x004b502c","targetVaHex":"0x004b502c","randomRange":null,"randomRangeHex":null,"comparison":"bit-test"}],"exeConfirmed":["helper child script VA","motion.stepCount +0x96 initial value","spawn child display VM 0x004b5138","branch 0x004b50f8 loops to 0x004b5030 while +0x90 != 0","random ranges and trig-motion opcodes used inside the loop","child frame script 0x004b517c emits btl_efc#30..37 gate 2"],"previewOnly":["exact runtime RNG seed","exact screen-space particle coordinates","browser particle scatter visualization"]}]}