{"version":1,"kind":"hwanse-battle-motion-boundary-loop-review","source":"tools/build_battle_motion_boundary_loop_review.py","runtimeUsed":false,"inputs":["out/battle_child_target_renderer_plan_review.json","out/battle_helper_position_motion_review.json","out/battle_helper_visual_behavior_review.json","out/battle_child_target_renderer_gap_review.json"],"status":"motion-boundary-loop-semantics-grounded","summary":{"motionBoundaryRows":7,"helpers":[95,96,97,98],"helperRowCounts":{"95":1,"96":2,"97":2,"98":2},"motionModeCounts":{"0x09":7},"motionAxisCounts":{"x":7},"branchThresholdPxCounts":{"-128.0":7,"480.0":7},"projectionStatusCounts":{"x-only-absolute-trig-with-y-boundary":7},"remainingGapBeforeThisReview":{}},"opcode2dSemantics":{"handlerVaHex":"0x00405a09","relativeGroup0x00":["if mode&0x01: display.x += trigX(+0x8c) * signed(+0x92)","if mode&0x02: display.y -= trigY(+0x8e) * signed(+0x94)","if mode&0x04: display.z(+0x24) += trigY(+0x90) * signed(+0x96)"],"absoluteGroup0x08":["if mode&0x01: display.x = +0x80 + trigX(+0x8c) * signed(+0x92)","if mode&0x02: display.y = +0x84 - trigY(+0x8e) * signed(+0x94)","if mode&0x04: display.z(+0x24) = +0x88 + trigY(+0x90) * signed(+0x96)"],"currentRowsMode":"0x09 = absolute group 0x08 + x axis bit 0x01","currentRowsFormula":"display.x = +0x80 + trigX(+0x8c) * signed(+0x92); display.y unchanged by 0x2d","trigXHelperVaHex":"0x00428070","trigYHelperVaHex":"0x0042819b"},"interpretationNotes":["The seven remaining target renderer gap rows are not unknown frame selections. They are child particles using already decoded direct frames plus a common opcode 0x2d motion loop.","All seven rows use mode 0x09, so the child motion step updates x only from cached base +0x80 and phase/amplitude fields. The y coordinate is still important because the child loop tests y against 480 and -128 fixed16 bounds.","Helpers 95~98 are the 암각·영상승룡파/bingjo-family target renderer stream. Helper 95 emits one target every two ticks; helpers 96~98 emit one leading target and then a denser repeated child stream.","This resolves the semantic shape of apply-motion-step-until-branch. What remains before pixel-perfect rendering is exact phase/amplitude initialization for every child instance, especially parent/root RNG-fed fields."],"rows":[{"helperId":95,"targetVaHex":"0x004b9468","skillLabels":["린샹 암각·영상승룡파 0x15 Lv=1","린샹 빙조권 0x19 Lv=None"],"rendererPlanClass":"motion-boundary-loop","rendererAction":"Spawn frame [186] 17 time(s) every 2 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","frames":[186],"spawnSchedule":{"eventCount":17,"frames":[186],"ticks":[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32],"tickDeltas":[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],"uniformTickDelta":2,"firstTick":0,"lastTick":32,"rootCounterSets":{"0x90":0},"rootSpawnJitterX":null,"expandedPreviewCount":17},"rootLifecycle":{"behaviorClass":"randomized-child-spawn-stream","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"],"ticks":[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32],"targetVaCounts":{"0x004b9468":17},"targetStopReasons":["loop at 0x004b9184"],"transformPatternCounts":{"absolute-trig-motion, child-motion-parameterized, target-coordinate-cache, writes-display-position":17},"coordinateSummaries":["display.x [0x82:8]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"],"notes":["root loop uses RNG ranges and repeated child display spawns"],"syncSignals":["child-actor-flag","actor-flag-sync","wait/yield","spawn-tree-direct-init-frame"]},"targetScope":"spawn.1 0x004b9468","targetCoordinateSummary":"display.x [0x82:8]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","previewTransform":{"offsetX":-8.0,"offsetY":-32.0,"targetAnchorX":true,"targetAnchorY":true,"basis":"display.x/y coordinateSummary","coordinateSummary":"display.x [0x82:8]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"},"positionWrites":[{"vaHex":"0x004b9494","destHex":"0x1c","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":8.0,"summary":"sub display/actor field +0x1c, imm=0x00080000 (8px)","confidence":"confirmed"},{"vaHex":"0x004b949c","destHex":"0x20","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":32.0,"summary":"sub display/actor field +0x20, imm=0x00200000 (32px)","confidence":"confirmed"},{"vaHex":"0x004b9168","destHex":"0x80","sourceHex":"0x1c","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x80, source +0x1c, mode=0xa0","confidence":"confirmed"},{"vaHex":"0x004b916c","destHex":"0x84","sourceHex":"0x20","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x84, source +0x20, mode=0xa0","confidence":"confirmed"}],"motionWrites":[{"vaHex":"0x004b918c","destHex":"0x8c","sourceHex":"0x8e","modeHex":"0xa1","operation":"add","immFixed":null,"summary":"display/child field +0x8c, source +0x8e, mode=0xa1","confidence":"confirmed"}],"motionSteps":[{"vaHex":"0x004b9190","opcode":"0x2d","category":"motion-step","summary":"absolute base + trig motion step mode=0x09 axes=x","modeHex":"0x09","axes":["x"],"modeGroupHex":"0x08","modeLowNibble":"0x9","operation":"not","operandClass":"source-field","modeSemantics":"not(source-field)","modeConfidence":"confirmed"}],"motionModeCounts":{"0x09":1},"motionAxisCounts":{"x":1},"boundaryBranches":[{"vaHex":"0x004b9194","opcode":"0x15","comparison":"<","immHex":"0x01e00000","thresholdPx":480.0,"targetVaHex":"0x004b91ac","role":"screen-bottom-continue-bound","summary":"conditional branch display.y +0x20 < 0x01e00000; target 0x004b91ac","confidence":"confirmed"},{"vaHex":"0x004b91a0","opcode":"0x15","comparison":"<","immHex":"0xff800000","thresholdPx":-128.0,"targetVaHex":"0x004b91b4","role":"offscreen-top-despawn-bound","summary":"conditional branch display.y +0x20 < 0xff800000; target 0x004b91b4","confidence":"confirmed"}],"localRepeatBranches":[],"projectionModel":{"status":"x-only-absolute-trig-with-y-boundary","opcode":"0x2d","handlerVaHex":"0x00405a09","modeHex":"0x09","modeMeaning":"absolute-base x-axis trig motion","xFormula":"display.x = display.+0x80 + trigX(display.+0x8c) * signed(display.+0x92)","yFormula":"mode 0x09 does not update display.y; display.y is only checked by boundary branches","baseFields":{"+0x80":"cached x from +0x1c","+0x84":"cached y from +0x20"},"phaseField":"+0x8c, usually copied/added from +0x8e immediately before 0x2d","amplitudeField":"+0x92 for x-axis motion","rootCounterModel":{"+0x94":"inner burst/phase span copied to +0x8e before repeated child spawns","+0x96":"outer repeat countdown for additional burst cycles","+0x92":"outer-cycle amplitude accumulator; incremented as +0x96 steps down"},"rootJitterX":null,"boundaryPx":{"bottomExclusive":480,"topDespawn":-128},"implementationHint":"Use +0x94 as the inner burst span and +0x96 as the outer repeat count when both are present. For each child, start from the previewTransform offset plus root x-jitter, cache +0x80/+0x84, apply the x-only 0x2d formula per child tick, and remove it when the y branch range fails. Rows with +0x90 local repeat branches also keep a short inner countdown before despawn.","confidence":{"opcodeFormula":"confirmed-from-handler","modeAndAxes":"confirmed-from-decoded-script","yBoundaryValues":"confirmed-fixed16-immediates","phaseAmplitudeCounters":"confirmed-root-counter-writes","exactRuntimeRngSamples":"partial; root x-jitter range is known but exact samples depend on RNG seed"}}},{"helperId":96,"targetVaHex":"0x004b939c","skillLabels":["린샹 암각·영상승룡파 0x16 Lv=2"],"rendererPlanClass":"motion-boundary-loop","rendererAction":"Spawn frame [184] 7 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","frames":[184],"spawnSchedule":{"eventCount":1,"frames":[184],"ticks":[0],"tickDeltas":[],"uniformTickDelta":null,"firstTick":0,"lastTick":0,"rootCounterSets":{"0x90":0,"0x92":0,"0x94":6,"0x96":5},"rootSpawnJitterX":null,"expandedPreviewCount":1},"rootLifecycle":{"behaviorClass":"randomized-child-spawn-stream","directSpawnCount":7,"frameTimeline":["184@0","186@1","186@2","186@3","186@4","186@5","186@6"],"ticks":[0,1,2,3,4,5,6],"targetVaCounts":{"0x004b939c":1,"0x004b94ac":6},"targetStopReasons":["loop at 0x004b9184"],"transformPatternCounts":{"absolute-trig-motion, child-motion-parameterized, target-coordinate-cache, writes-display-position":7},"coordinateSummaries":["display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","display.x [0x82:8]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"],"notes":["root loop uses RNG ranges and repeated child display spawns"],"syncSignals":["wait/yield","spawn-tree-direct-init-frame"]},"targetScope":"spawn.1 0x004b939c","targetCoordinateSummary":"display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","previewTransform":{"offsetX":-40.0,"offsetY":-80.0,"targetAnchorX":true,"targetAnchorY":true,"basis":"display.x/y coordinateSummary","coordinateSummary":"display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"},"positionWrites":[{"vaHex":"0x004b93c8","destHex":"0x1c","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":40.0,"summary":"sub display/actor field +0x1c, imm=0x00280000 (40px)","confidence":"confirmed"},{"vaHex":"0x004b93d0","destHex":"0x20","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":80.0,"summary":"sub display/actor field +0x20, imm=0x00500000 (80px)","confidence":"confirmed"},{"vaHex":"0x004b9168","destHex":"0x80","sourceHex":"0x1c","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x80, source +0x1c, mode=0xa0","confidence":"confirmed"},{"vaHex":"0x004b916c","destHex":"0x84","sourceHex":"0x20","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x84, source +0x20, mode=0xa0","confidence":"confirmed"}],"motionWrites":[{"vaHex":"0x004b918c","destHex":"0x8c","sourceHex":"0x8e","modeHex":"0xa1","operation":"add","immFixed":null,"summary":"display/child field +0x8c, source +0x8e, mode=0xa1","confidence":"confirmed"}],"motionSteps":[{"vaHex":"0x004b9190","opcode":"0x2d","category":"motion-step","summary":"absolute base + trig motion step mode=0x09 axes=x","modeHex":"0x09","axes":["x"],"modeGroupHex":"0x08","modeLowNibble":"0x9","operation":"not","operandClass":"source-field","modeSemantics":"not(source-field)","modeConfidence":"confirmed"}],"motionModeCounts":{"0x09":1},"motionAxisCounts":{"x":1},"boundaryBranches":[{"vaHex":"0x004b9194","opcode":"0x15","comparison":"<","immHex":"0x01e00000","thresholdPx":480.0,"targetVaHex":"0x004b91ac","role":"screen-bottom-continue-bound","summary":"conditional branch display.y +0x20 < 0x01e00000; target 0x004b91ac","confidence":"confirmed"},{"vaHex":"0x004b91a0","opcode":"0x15","comparison":"<","immHex":"0xff800000","thresholdPx":-128.0,"targetVaHex":"0x004b91b4","role":"offscreen-top-despawn-bound","summary":"conditional branch display.y +0x20 < 0xff800000; target 0x004b91b4","confidence":"confirmed"}],"localRepeatBranches":[],"projectionModel":{"status":"x-only-absolute-trig-with-y-boundary","opcode":"0x2d","handlerVaHex":"0x00405a09","modeHex":"0x09","modeMeaning":"absolute-base x-axis trig motion","xFormula":"display.x = display.+0x80 + trigX(display.+0x8c) * signed(display.+0x92)","yFormula":"mode 0x09 does not update display.y; display.y is only checked by boundary branches","baseFields":{"+0x80":"cached x from +0x1c","+0x84":"cached y from +0x20"},"phaseField":"+0x8c, usually copied/added from +0x8e immediately before 0x2d","amplitudeField":"+0x92 for x-axis motion","rootCounterModel":{"+0x94":"inner burst/phase span copied to +0x8e before repeated child spawns","+0x96":"outer repeat countdown for additional burst cycles","+0x92":"outer-cycle amplitude accumulator; incremented as +0x96 steps down"},"rootJitterX":null,"boundaryPx":{"bottomExclusive":480,"topDespawn":-128},"implementationHint":"Use +0x94 as the inner burst span and +0x96 as the outer repeat count when both are present. For each child, start from the previewTransform offset plus root x-jitter, cache +0x80/+0x84, apply the x-only 0x2d formula per child tick, and remove it when the y branch range fails. Rows with +0x90 local repeat branches also keep a short inner countdown before despawn.","confidence":{"opcodeFormula":"confirmed-from-handler","modeAndAxes":"confirmed-from-decoded-script","yBoundaryValues":"confirmed-fixed16-immediates","phaseAmplitudeCounters":"confirmed-root-counter-writes","exactRuntimeRngSamples":"partial; root x-jitter range is known but exact samples depend on RNG seed"}}},{"helperId":96,"targetVaHex":"0x004b94ac","skillLabels":["린샹 암각·영상승룡파 0x16 Lv=2"],"rendererPlanClass":"motion-boundary-loop","rendererAction":"Spawn frame [186] 7 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","frames":[186],"spawnSchedule":{"eventCount":6,"frames":[186],"ticks":[1,2,3,4,5,6],"tickDeltas":[1,1,1,1,1],"uniformTickDelta":1,"firstTick":1,"lastTick":6,"rootCounterSets":{"0x90":0,"0x92":0,"0x94":6,"0x96":5},"rootSpawnJitterX":{"sourceBranchVaHex":"0x004b98c0","spawnTargetVaHex":"0x004b94ac","range":6,"multiplierPx":3.0,"subtractPx":9.0,"formula":"x += rand(range) * multiplierPx - subtractPx","confidence":"static-exe-root-snippet"},"expandedPreviewCount":30},"rootLifecycle":{"behaviorClass":"randomized-child-spawn-stream","directSpawnCount":7,"frameTimeline":["184@0","186@1","186@2","186@3","186@4","186@5","186@6"],"ticks":[0,1,2,3,4,5,6],"targetVaCounts":{"0x004b939c":1,"0x004b94ac":6},"targetStopReasons":["loop at 0x004b9184"],"transformPatternCounts":{"absolute-trig-motion, child-motion-parameterized, target-coordinate-cache, writes-display-position":7},"coordinateSummaries":["display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","display.x [0x82:8]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"],"notes":["root loop uses RNG ranges and repeated child display spawns"],"syncSignals":["wait/yield","spawn-tree-direct-init-frame"]},"targetScope":"spawn.2 0x004b94ac","targetCoordinateSummary":"display.x [0x82:8]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","previewTransform":{"offsetX":-8.0,"offsetY":-32.0,"targetAnchorX":true,"targetAnchorY":true,"basis":"display.x/y coordinateSummary","coordinateSummary":"display.x [0x82:8]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"},"positionWrites":[{"vaHex":"0x004b94d8","destHex":"0x1c","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":8.0,"summary":"sub display/actor field +0x1c, imm=0x00080000 (8px)","confidence":"confirmed"},{"vaHex":"0x004b94e0","destHex":"0x20","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":32.0,"summary":"sub display/actor field +0x20, imm=0x00200000 (32px)","confidence":"confirmed"},{"vaHex":"0x004b9168","destHex":"0x80","sourceHex":"0x1c","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x80, source +0x1c, mode=0xa0","confidence":"confirmed"},{"vaHex":"0x004b916c","destHex":"0x84","sourceHex":"0x20","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x84, source +0x20, mode=0xa0","confidence":"confirmed"}],"motionWrites":[{"vaHex":"0x004b918c","destHex":"0x8c","sourceHex":"0x8e","modeHex":"0xa1","operation":"add","immFixed":null,"summary":"display/child field +0x8c, source +0x8e, mode=0xa1","confidence":"confirmed"}],"motionSteps":[{"vaHex":"0x004b9190","opcode":"0x2d","category":"motion-step","summary":"absolute base + trig motion step mode=0x09 axes=x","modeHex":"0x09","axes":["x"],"modeGroupHex":"0x08","modeLowNibble":"0x9","operation":"not","operandClass":"source-field","modeSemantics":"not(source-field)","modeConfidence":"confirmed"}],"motionModeCounts":{"0x09":1},"motionAxisCounts":{"x":1},"boundaryBranches":[{"vaHex":"0x004b9194","opcode":"0x15","comparison":"<","immHex":"0x01e00000","thresholdPx":480.0,"targetVaHex":"0x004b91ac","role":"screen-bottom-continue-bound","summary":"conditional branch display.y +0x20 < 0x01e00000; target 0x004b91ac","confidence":"confirmed"},{"vaHex":"0x004b91a0","opcode":"0x15","comparison":"<","immHex":"0xff800000","thresholdPx":-128.0,"targetVaHex":"0x004b91b4","role":"offscreen-top-despawn-bound","summary":"conditional branch display.y +0x20 < 0xff800000; target 0x004b91b4","confidence":"confirmed"}],"localRepeatBranches":[],"projectionModel":{"status":"x-only-absolute-trig-with-y-boundary","opcode":"0x2d","handlerVaHex":"0x00405a09","modeHex":"0x09","modeMeaning":"absolute-base x-axis trig motion","xFormula":"display.x = display.+0x80 + trigX(display.+0x8c) * signed(display.+0x92)","yFormula":"mode 0x09 does not update display.y; display.y is only checked by boundary branches","baseFields":{"+0x80":"cached x from +0x1c","+0x84":"cached y from +0x20"},"phaseField":"+0x8c, usually copied/added from +0x8e immediately before 0x2d","amplitudeField":"+0x92 for x-axis motion","rootCounterModel":{"+0x94":"inner burst/phase span copied to +0x8e before repeated child spawns","+0x96":"outer repeat countdown for additional burst cycles","+0x92":"outer-cycle amplitude accumulator; incremented as +0x96 steps down"},"rootJitterX":{"sourceBranchVaHex":"0x004b98c0","spawnTargetVaHex":"0x004b94ac","range":6,"multiplierPx":3.0,"subtractPx":9.0,"formula":"x += rand(range) * multiplierPx - subtractPx","confidence":"static-exe-root-snippet"},"boundaryPx":{"bottomExclusive":480,"topDespawn":-128},"implementationHint":"Use +0x94 as the inner burst span and +0x96 as the outer repeat count when both are present. For each child, start from the previewTransform offset plus root x-jitter, cache +0x80/+0x84, apply the x-only 0x2d formula per child tick, and remove it when the y branch range fails. Rows with +0x90 local repeat branches also keep a short inner countdown before despawn.","confidence":{"opcodeFormula":"confirmed-from-handler","modeAndAxes":"confirmed-from-decoded-script","yBoundaryValues":"confirmed-fixed16-immediates","phaseAmplitudeCounters":"confirmed-root-counter-writes","exactRuntimeRngSamples":"partial; root x-jitter range is known but exact samples depend on RNG seed"}}},{"helperId":97,"targetVaHex":"0x004b93e0","skillLabels":["린샹 암각·영상승룡파 0x17 Lv=3"],"rendererPlanClass":"motion-boundary-loop","rendererAction":"Spawn frame [184] 9 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","frames":[184],"spawnSchedule":{"eventCount":1,"frames":[184],"ticks":[0],"tickDeltas":[],"uniformTickDelta":null,"firstTick":0,"lastTick":0,"rootCounterSets":{"0x90":0,"0x92":0,"0x94":8,"0x96":6},"rootSpawnJitterX":null,"expandedPreviewCount":1},"rootLifecycle":{"behaviorClass":"randomized-child-spawn-stream","directSpawnCount":9,"frameTimeline":["184@0","187@1","187@2","187@3","187@4","187@5","187@6","187@7","187@8"],"ticks":[0,1,2,3,4,5,6,7,8],"targetVaCounts":{"0x004b93e0":1,"0x004b94f0":8},"targetStopReasons":["loop at 0x004b91d8"],"transformPatternCounts":{"absolute-trig-motion, child-motion-parameterized, target-coordinate-cache, writes-display-position":9},"coordinateSummaries":["display.x [0x82:16]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"],"notes":["root loop uses RNG ranges and repeated child display spawns"],"syncSignals":["wait/yield","spawn-tree-direct-init-frame"]},"targetScope":"spawn.1 0x004b93e0","targetCoordinateSummary":"display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","previewTransform":{"offsetX":-40.0,"offsetY":-80.0,"targetAnchorX":true,"targetAnchorY":true,"basis":"display.x/y coordinateSummary","coordinateSummary":"display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"},"positionWrites":[{"vaHex":"0x004b940c","destHex":"0x1c","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":40.0,"summary":"sub display/actor field +0x1c, imm=0x00280000 (40px)","confidence":"confirmed"},{"vaHex":"0x004b9414","destHex":"0x20","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":80.0,"summary":"sub display/actor field +0x20, imm=0x00500000 (80px)","confidence":"confirmed"},{"vaHex":"0x004b91c4","destHex":"0x80","sourceHex":"0x1c","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x80, source +0x1c, mode=0xa0","confidence":"confirmed"},{"vaHex":"0x004b91c8","destHex":"0x84","sourceHex":"0x20","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x84, source +0x20, mode=0xa0","confidence":"confirmed"}],"motionWrites":[{"vaHex":"0x004b91f4","destHex":"0x90","sourceHex":"0x00","modeHex":"0x80","operation":"set","immFixed":6.103515625e-05,"summary":"display/child field +0x90, imm=0x00000004 (6.10352e-05px), mode=0x80","confidence":"confirmed"},{"vaHex":"0x004b925c","destHex":"0x8c","sourceHex":"0x8e","modeHex":"0xa1","operation":"add","immFixed":null,"summary":"display/child field +0x8c, source +0x8e, mode=0xa1","confidence":"confirmed"},{"vaHex":"0x004b927c","destHex":"0x90","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":1.52587890625e-05,"summary":"display/child field +0x90, imm=0x00000001 (1.52588e-05px), mode=0x82","confidence":"confirmed"}],"motionSteps":[{"vaHex":"0x004b9260","opcode":"0x2d","category":"motion-step","summary":"absolute base + trig motion step mode=0x09 axes=x","modeHex":"0x09","axes":["x"],"modeGroupHex":"0x08","modeLowNibble":"0x9","operation":"not","operandClass":"source-field","modeSemantics":"not(source-field)","modeConfidence":"confirmed"}],"motionModeCounts":{"0x09":1},"motionAxisCounts":{"x":1},"boundaryBranches":[{"vaHex":"0x004b9264","opcode":"0x15","comparison":"<","immHex":"0x01e00000","thresholdPx":480.0,"targetVaHex":"0x004b927c","role":"screen-bottom-continue-bound","summary":"conditional branch display.y +0x20 < 0x01e00000; target 0x004b927c","confidence":"confirmed"},{"vaHex":"0x004b9270","opcode":"0x15","comparison":"<","immHex":"0xff800000","thresholdPx":-128.0,"targetVaHex":"0x004b92a0","role":"offscreen-top-despawn-bound","summary":"conditional branch display.y +0x20 < 0xff800000; target 0x004b92a0","confidence":"confirmed"}],"localRepeatBranches":[{"vaHex":"0x004b9284","opcode":"0x14","comparison":"!=","immHex":null,"thresholdPx":null,"targetVaHex":"0x004b9254","role":"local-repeat-countdown","summary":"word conditional branch local-backward-loop if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b9254","confidence":"confirmed"}],"projectionModel":{"status":"x-only-absolute-trig-with-y-boundary","opcode":"0x2d","handlerVaHex":"0x00405a09","modeHex":"0x09","modeMeaning":"absolute-base x-axis trig motion","xFormula":"display.x = display.+0x80 + trigX(display.+0x8c) * signed(display.+0x92)","yFormula":"mode 0x09 does not update display.y; display.y is only checked by boundary branches","baseFields":{"+0x80":"cached x from +0x1c","+0x84":"cached y from +0x20"},"phaseField":"+0x8c, usually copied/added from +0x8e immediately before 0x2d","amplitudeField":"+0x92 for x-axis motion","rootCounterModel":{"+0x94":"inner burst/phase span copied to +0x8e before repeated child spawns","+0x96":"outer repeat countdown for additional burst cycles","+0x92":"outer-cycle amplitude accumulator; incremented as +0x96 steps down"},"rootJitterX":null,"boundaryPx":{"bottomExclusive":480,"topDespawn":-128},"implementationHint":"Use +0x94 as the inner burst span and +0x96 as the outer repeat count when both are present. For each child, start from the previewTransform offset plus root x-jitter, cache +0x80/+0x84, apply the x-only 0x2d formula per child tick, and remove it when the y branch range fails. Rows with +0x90 local repeat branches also keep a short inner countdown before despawn.","confidence":{"opcodeFormula":"confirmed-from-handler","modeAndAxes":"confirmed-from-decoded-script","yBoundaryValues":"confirmed-fixed16-immediates","phaseAmplitudeCounters":"confirmed-root-counter-writes","exactRuntimeRngSamples":"partial; root x-jitter range is known but exact samples depend on RNG seed"}}},{"helperId":97,"targetVaHex":"0x004b94f0","skillLabels":["린샹 암각·영상승룡파 0x17 Lv=3"],"rendererPlanClass":"motion-boundary-loop","rendererAction":"Spawn frame [187] 9 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","frames":[187],"spawnSchedule":{"eventCount":8,"frames":[187],"ticks":[1,2,3,4,5,6,7,8],"tickDeltas":[1,1,1,1,1,1,1],"uniformTickDelta":1,"firstTick":1,"lastTick":8,"rootCounterSets":{"0x90":0,"0x92":0,"0x94":8,"0x96":6},"rootSpawnJitterX":{"sourceBranchVaHex":"0x004b9b84","spawnTargetVaHex":"0x004b94f0","range":8,"multiplierPx":3.0,"subtractPx":12.0,"formula":"x += rand(range) * multiplierPx - subtractPx","confidence":"static-exe-root-snippet"},"expandedPreviewCount":48},"rootLifecycle":{"behaviorClass":"randomized-child-spawn-stream","directSpawnCount":9,"frameTimeline":["184@0","187@1","187@2","187@3","187@4","187@5","187@6","187@7","187@8"],"ticks":[0,1,2,3,4,5,6,7,8],"targetVaCounts":{"0x004b93e0":1,"0x004b94f0":8},"targetStopReasons":["loop at 0x004b91d8"],"transformPatternCounts":{"absolute-trig-motion, child-motion-parameterized, target-coordinate-cache, writes-display-position":9},"coordinateSummaries":["display.x [0x82:16]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","display.x [0x82:40]; display.y [0x82:80]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"],"notes":["root loop uses RNG ranges and repeated child display spawns"],"syncSignals":["wait/yield","spawn-tree-direct-init-frame"]},"targetScope":"spawn.2 0x004b94f0","targetCoordinateSummary":"display.x [0x82:16]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","previewTransform":{"offsetX":-16.0,"offsetY":-32.0,"targetAnchorX":true,"targetAnchorY":true,"basis":"display.x/y coordinateSummary","coordinateSummary":"display.x [0x82:16]; display.y [0x82:32]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"},"positionWrites":[{"vaHex":"0x004b951c","destHex":"0x1c","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":16.0,"summary":"sub display/actor field +0x1c, imm=0x00100000 (16px)","confidence":"confirmed"},{"vaHex":"0x004b9524","destHex":"0x20","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":32.0,"summary":"sub display/actor field +0x20, imm=0x00200000 (32px)","confidence":"confirmed"},{"vaHex":"0x004b91c4","destHex":"0x80","sourceHex":"0x1c","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x80, source +0x1c, mode=0xa0","confidence":"confirmed"},{"vaHex":"0x004b91c8","destHex":"0x84","sourceHex":"0x20","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x84, source +0x20, mode=0xa0","confidence":"confirmed"}],"motionWrites":[{"vaHex":"0x004b91f4","destHex":"0x90","sourceHex":"0x00","modeHex":"0x80","operation":"set","immFixed":6.103515625e-05,"summary":"display/child field +0x90, imm=0x00000004 (6.10352e-05px), mode=0x80","confidence":"confirmed"},{"vaHex":"0x004b925c","destHex":"0x8c","sourceHex":"0x8e","modeHex":"0xa1","operation":"add","immFixed":null,"summary":"display/child field +0x8c, source +0x8e, mode=0xa1","confidence":"confirmed"},{"vaHex":"0x004b927c","destHex":"0x90","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":1.52587890625e-05,"summary":"display/child field +0x90, imm=0x00000001 (1.52588e-05px), mode=0x82","confidence":"confirmed"}],"motionSteps":[{"vaHex":"0x004b9260","opcode":"0x2d","category":"motion-step","summary":"absolute base + trig motion step mode=0x09 axes=x","modeHex":"0x09","axes":["x"],"modeGroupHex":"0x08","modeLowNibble":"0x9","operation":"not","operandClass":"source-field","modeSemantics":"not(source-field)","modeConfidence":"confirmed"}],"motionModeCounts":{"0x09":1},"motionAxisCounts":{"x":1},"boundaryBranches":[{"vaHex":"0x004b9264","opcode":"0x15","comparison":"<","immHex":"0x01e00000","thresholdPx":480.0,"targetVaHex":"0x004b927c","role":"screen-bottom-continue-bound","summary":"conditional branch display.y +0x20 < 0x01e00000; target 0x004b927c","confidence":"confirmed"},{"vaHex":"0x004b9270","opcode":"0x15","comparison":"<","immHex":"0xff800000","thresholdPx":-128.0,"targetVaHex":"0x004b92a0","role":"offscreen-top-despawn-bound","summary":"conditional branch display.y +0x20 < 0xff800000; target 0x004b92a0","confidence":"confirmed"}],"localRepeatBranches":[{"vaHex":"0x004b9284","opcode":"0x14","comparison":"!=","immHex":null,"thresholdPx":null,"targetVaHex":"0x004b9254","role":"local-repeat-countdown","summary":"word conditional branch local-backward-loop if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b9254","confidence":"confirmed"}],"projectionModel":{"status":"x-only-absolute-trig-with-y-boundary","opcode":"0x2d","handlerVaHex":"0x00405a09","modeHex":"0x09","modeMeaning":"absolute-base x-axis trig motion","xFormula":"display.x = display.+0x80 + trigX(display.+0x8c) * signed(display.+0x92)","yFormula":"mode 0x09 does not update display.y; display.y is only checked by boundary branches","baseFields":{"+0x80":"cached x from +0x1c","+0x84":"cached y from +0x20"},"phaseField":"+0x8c, usually copied/added from +0x8e immediately before 0x2d","amplitudeField":"+0x92 for x-axis motion","rootCounterModel":{"+0x94":"inner burst/phase span copied to +0x8e before repeated child spawns","+0x96":"outer repeat countdown for additional burst cycles","+0x92":"outer-cycle amplitude accumulator; incremented as +0x96 steps down"},"rootJitterX":{"sourceBranchVaHex":"0x004b9b84","spawnTargetVaHex":"0x004b94f0","range":8,"multiplierPx":3.0,"subtractPx":12.0,"formula":"x += rand(range) * multiplierPx - subtractPx","confidence":"static-exe-root-snippet"},"boundaryPx":{"bottomExclusive":480,"topDespawn":-128},"implementationHint":"Use +0x94 as the inner burst span and +0x96 as the outer repeat count when both are present. For each child, start from the previewTransform offset plus root x-jitter, cache +0x80/+0x84, apply the x-only 0x2d formula per child tick, and remove it when the y branch range fails. Rows with +0x90 local repeat branches also keep a short inner countdown before despawn.","confidence":{"opcodeFormula":"confirmed-from-handler","modeAndAxes":"confirmed-from-decoded-script","yBoundaryValues":"confirmed-fixed16-immediates","phaseAmplitudeCounters":"confirmed-root-counter-writes","exactRuntimeRngSamples":"partial; root x-jitter range is known but exact samples depend on RNG seed"}}},{"helperId":98,"targetVaHex":"0x004b9424","skillLabels":["린샹 암각·영상승룡파 0x18 Lv=4"],"rendererPlanClass":"motion-boundary-loop","rendererAction":"Spawn frame [185] 13 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","frames":[185],"spawnSchedule":{"eventCount":1,"frames":[185],"ticks":[0],"tickDeltas":[],"uniformTickDelta":null,"firstTick":0,"lastTick":0,"rootCounterSets":{"0x90":0,"0x92":0,"0x94":8,"0x96":12},"rootSpawnJitterX":null,"expandedPreviewCount":1},"rootLifecycle":{"behaviorClass":"randomized-child-spawn-stream","directSpawnCount":13,"frameTimeline":["185@0","188@1","188@2","188@3","188@4","188@5","188@6","188@7","188@8","188@9","188@10","188@11","188@12"],"ticks":[0,1,2,3,4,5,6,7,8,9,10,11,12],"targetVaCounts":{"0x004b9424":1,"0x004b9534":12},"targetStopReasons":["loop at 0x004b92c4"],"transformPatternCounts":{"absolute-trig-motion, child-motion-parameterized, target-coordinate-cache, writes-display-position":13},"coordinateSummaries":["display.x [0x82:16]; display.y [0x82:48]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","display.x [0x82:56]; display.y [0x82:112]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"],"notes":["root loop uses RNG ranges and repeated child display spawns"],"syncSignals":["wait/yield","spawn-tree-direct-init-frame"]},"targetScope":"spawn.1 0x004b9424","targetCoordinateSummary":"display.x [0x82:56]; display.y [0x82:112]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","previewTransform":{"offsetX":-56.0,"offsetY":-112.0,"targetAnchorX":true,"targetAnchorY":true,"basis":"display.x/y coordinateSummary","coordinateSummary":"display.x [0x82:56]; display.y [0x82:112]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"},"positionWrites":[{"vaHex":"0x004b9450","destHex":"0x1c","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":56.0,"summary":"sub display/actor field +0x1c, imm=0x00380000 (56px)","confidence":"confirmed"},{"vaHex":"0x004b9458","destHex":"0x20","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":112.0,"summary":"sub display/actor field +0x20, imm=0x00700000 (112px)","confidence":"confirmed"},{"vaHex":"0x004b92b0","destHex":"0x80","sourceHex":"0x1c","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x80, source +0x1c, mode=0xa0","confidence":"confirmed"},{"vaHex":"0x004b92b4","destHex":"0x84","sourceHex":"0x20","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x84, source +0x20, mode=0xa0","confidence":"confirmed"}],"motionWrites":[{"vaHex":"0x004b92e0","destHex":"0x90","sourceHex":"0x00","modeHex":"0x80","operation":"set","immFixed":4.57763671875e-05,"summary":"display/child field +0x90, imm=0x00000003 (4.57764e-05px), mode=0x80","confidence":"confirmed"},{"vaHex":"0x004b9348","destHex":"0x8c","sourceHex":"0x8e","modeHex":"0xa1","operation":"add","immFixed":null,"summary":"display/child field +0x8c, source +0x8e, mode=0xa1","confidence":"confirmed"},{"vaHex":"0x004b9368","destHex":"0x90","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":1.52587890625e-05,"summary":"display/child field +0x90, imm=0x00000001 (1.52588e-05px), mode=0x82","confidence":"confirmed"}],"motionSteps":[{"vaHex":"0x004b934c","opcode":"0x2d","category":"motion-step","summary":"absolute base + trig motion step mode=0x09 axes=x","modeHex":"0x09","axes":["x"],"modeGroupHex":"0x08","modeLowNibble":"0x9","operation":"not","operandClass":"source-field","modeSemantics":"not(source-field)","modeConfidence":"confirmed"}],"motionModeCounts":{"0x09":1},"motionAxisCounts":{"x":1},"boundaryBranches":[{"vaHex":"0x004b9350","opcode":"0x15","comparison":"<","immHex":"0x01e00000","thresholdPx":480.0,"targetVaHex":"0x004b9368","role":"screen-bottom-continue-bound","summary":"conditional branch display.y +0x20 < 0x01e00000; target 0x004b9368","confidence":"confirmed"},{"vaHex":"0x004b935c","opcode":"0x15","comparison":"<","immHex":"0xff800000","thresholdPx":-128.0,"targetVaHex":"0x004b938c","role":"offscreen-top-despawn-bound","summary":"conditional branch display.y +0x20 < 0xff800000; target 0x004b938c","confidence":"confirmed"}],"localRepeatBranches":[{"vaHex":"0x004b9370","opcode":"0x14","comparison":"!=","immHex":null,"thresholdPx":null,"targetVaHex":"0x004b9340","role":"local-repeat-countdown","summary":"word conditional branch local-backward-loop if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b9340","confidence":"confirmed"}],"projectionModel":{"status":"x-only-absolute-trig-with-y-boundary","opcode":"0x2d","handlerVaHex":"0x00405a09","modeHex":"0x09","modeMeaning":"absolute-base x-axis trig motion","xFormula":"display.x = display.+0x80 + trigX(display.+0x8c) * signed(display.+0x92)","yFormula":"mode 0x09 does not update display.y; display.y is only checked by boundary branches","baseFields":{"+0x80":"cached x from +0x1c","+0x84":"cached y from +0x20"},"phaseField":"+0x8c, usually copied/added from +0x8e immediately before 0x2d","amplitudeField":"+0x92 for x-axis motion","rootCounterModel":{"+0x94":"inner burst/phase span copied to +0x8e before repeated child spawns","+0x96":"outer repeat countdown for additional burst cycles","+0x92":"outer-cycle amplitude accumulator; incremented as +0x96 steps down"},"rootJitterX":null,"boundaryPx":{"bottomExclusive":480,"topDespawn":-128},"implementationHint":"Use +0x94 as the inner burst span and +0x96 as the outer repeat count when both are present. For each child, start from the previewTransform offset plus root x-jitter, cache +0x80/+0x84, apply the x-only 0x2d formula per child tick, and remove it when the y branch range fails. Rows with +0x90 local repeat branches also keep a short inner countdown before despawn.","confidence":{"opcodeFormula":"confirmed-from-handler","modeAndAxes":"confirmed-from-decoded-script","yBoundaryValues":"confirmed-fixed16-immediates","phaseAmplitudeCounters":"confirmed-root-counter-writes","exactRuntimeRngSamples":"partial; root x-jitter range is known but exact samples depend on RNG seed"}}},{"helperId":98,"targetVaHex":"0x004b9534","skillLabels":["린샹 암각·영상승룡파 0x18 Lv=4"],"rendererPlanClass":"motion-boundary-loop","rendererAction":"Spawn frame [188] 13 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","frames":[188],"spawnSchedule":{"eventCount":12,"frames":[188],"ticks":[1,2,3,4,5,6,7,8,9,10,11,12],"tickDeltas":[1,1,1,1,1,1,1,1,1,1,1],"uniformTickDelta":1,"firstTick":1,"lastTick":12,"rootCounterSets":{"0x90":0,"0x92":0,"0x94":8,"0x96":12},"rootSpawnJitterX":{"sourceBranchVaHex":"0x004b9e48","spawnTargetVaHex":"0x004b9534","range":8,"multiplierPx":4.0,"subtractPx":16.0,"formula":"x += rand(range) * multiplierPx - subtractPx","confidence":"static-exe-root-snippet"},"expandedPreviewCount":96},"rootLifecycle":{"behaviorClass":"randomized-child-spawn-stream","directSpawnCount":13,"frameTimeline":["185@0","188@1","188@2","188@3","188@4","188@5","188@6","188@7","188@8","188@9","188@10","188@11","188@12"],"ticks":[0,1,2,3,4,5,6,7,8,9,10,11,12],"targetVaCounts":{"0x004b9424":1,"0x004b9534":12},"targetStopReasons":["loop at 0x004b92c4"],"transformPatternCounts":{"absolute-trig-motion, child-motion-parameterized, target-coordinate-cache, writes-display-position":13},"coordinateSummaries":["display.x [0x82:16]; display.y [0x82:48]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","display.x [0x82:56]; display.y [0x82:112]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"],"notes":["root loop uses RNG ranges and repeated child display spawns"],"syncSignals":["wait/yield","spawn-tree-direct-init-frame"]},"targetScope":"spawn.2 0x004b9534","targetCoordinateSummary":"display.x [0x82:16]; display.y [0x82:48]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]","previewTransform":{"offsetX":-16.0,"offsetY":-48.0,"targetAnchorX":true,"targetAnchorY":true,"basis":"display.x/y coordinateSummary","coordinateSummary":"display.x [0x82:16]; display.y [0x82:48]; motion.targetX [0xa0:0x1c]; motion.targetY [0xa0:0x20]"},"positionWrites":[{"vaHex":"0x004b9560","destHex":"0x1c","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":16.0,"summary":"sub display/actor field +0x1c, imm=0x00100000 (16px)","confidence":"confirmed"},{"vaHex":"0x004b9568","destHex":"0x20","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":48.0,"summary":"sub display/actor field +0x20, imm=0x00300000 (48px)","confidence":"confirmed"},{"vaHex":"0x004b92b0","destHex":"0x80","sourceHex":"0x1c","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x80, source +0x1c, mode=0xa0","confidence":"confirmed"},{"vaHex":"0x004b92b4","destHex":"0x84","sourceHex":"0x20","modeHex":"0xa0","operation":"set","immFixed":null,"summary":"set display/actor field +0x84, source +0x20, mode=0xa0","confidence":"confirmed"}],"motionWrites":[{"vaHex":"0x004b92e0","destHex":"0x90","sourceHex":"0x00","modeHex":"0x80","operation":"set","immFixed":4.57763671875e-05,"summary":"display/child field +0x90, imm=0x00000003 (4.57764e-05px), mode=0x80","confidence":"confirmed"},{"vaHex":"0x004b9348","destHex":"0x8c","sourceHex":"0x8e","modeHex":"0xa1","operation":"add","immFixed":null,"summary":"display/child field +0x8c, source +0x8e, mode=0xa1","confidence":"confirmed"},{"vaHex":"0x004b9368","destHex":"0x90","sourceHex":"0x00","modeHex":"0x82","operation":"sub","immFixed":1.52587890625e-05,"summary":"display/child field +0x90, imm=0x00000001 (1.52588e-05px), mode=0x82","confidence":"confirmed"}],"motionSteps":[{"vaHex":"0x004b934c","opcode":"0x2d","category":"motion-step","summary":"absolute base + trig motion step mode=0x09 axes=x","modeHex":"0x09","axes":["x"],"modeGroupHex":"0x08","modeLowNibble":"0x9","operation":"not","operandClass":"source-field","modeSemantics":"not(source-field)","modeConfidence":"confirmed"}],"motionModeCounts":{"0x09":1},"motionAxisCounts":{"x":1},"boundaryBranches":[{"vaHex":"0x004b9350","opcode":"0x15","comparison":"<","immHex":"0x01e00000","thresholdPx":480.0,"targetVaHex":"0x004b9368","role":"screen-bottom-continue-bound","summary":"conditional branch display.y +0x20 < 0x01e00000; target 0x004b9368","confidence":"confirmed"},{"vaHex":"0x004b935c","opcode":"0x15","comparison":"<","immHex":"0xff800000","thresholdPx":-128.0,"targetVaHex":"0x004b938c","role":"offscreen-top-despawn-bound","summary":"conditional branch display.y +0x20 < 0xff800000; target 0x004b938c","confidence":"confirmed"}],"localRepeatBranches":[{"vaHex":"0x004b9370","opcode":"0x14","comparison":"!=","immHex":null,"thresholdPx":null,"targetVaHex":"0x004b9340","role":"local-repeat-countdown","summary":"word conditional branch local-backward-loop if left:display.word[+0x90] != right:imm.word=0x0000 -> 0x004b9340","confidence":"confirmed"}],"projectionModel":{"status":"x-only-absolute-trig-with-y-boundary","opcode":"0x2d","handlerVaHex":"0x00405a09","modeHex":"0x09","modeMeaning":"absolute-base x-axis trig motion","xFormula":"display.x = display.+0x80 + trigX(display.+0x8c) * signed(display.+0x92)","yFormula":"mode 0x09 does not update display.y; display.y is only checked by boundary branches","baseFields":{"+0x80":"cached x from +0x1c","+0x84":"cached y from +0x20"},"phaseField":"+0x8c, usually copied/added from +0x8e immediately before 0x2d","amplitudeField":"+0x92 for x-axis motion","rootCounterModel":{"+0x94":"inner burst/phase span copied to +0x8e before repeated child spawns","+0x96":"outer repeat countdown for additional burst cycles","+0x92":"outer-cycle amplitude accumulator; incremented as +0x96 steps down"},"rootJitterX":{"sourceBranchVaHex":"0x004b9e48","spawnTargetVaHex":"0x004b9534","range":8,"multiplierPx":4.0,"subtractPx":16.0,"formula":"x += rand(range) * multiplierPx - subtractPx","confidence":"static-exe-root-snippet"},"boundaryPx":{"bottomExclusive":480,"topDespawn":-128},"implementationHint":"Use +0x94 as the inner burst span and +0x96 as the outer repeat count when both are present. For each child, start from the previewTransform offset plus root x-jitter, cache +0x80/+0x84, apply the x-only 0x2d formula per child tick, and remove it when the y branch range fails. Rows with +0x90 local repeat branches also keep a short inner countdown before despawn.","confidence":{"opcodeFormula":"confirmed-from-handler","modeAndAxes":"confirmed-from-decoded-script","yBoundaryValues":"confirmed-fixed16-immediates","phaseAmplitudeCounters":"confirmed-root-counter-writes","exactRuntimeRngSamples":"partial; root x-jitter range is known but exact samples depend on RNG seed"}}}]}