(
    ----------------------------------------------------------------
    -- 1. シーンをクリーンアップ＆ヘルパーを6つ配置（一列配置）
    ----------------------------------------------------------------
    delete objects
    local spacing     = 20.0      -- ヘルパー間の間隔（固定距離）
    local zHeight     = 0.0
    local helperSize  = 10.0
    local targetDist  = 20.0      -- 系列間の固定距離
    
    -- A系列とB系列を2行で並べる（リンク順に一直線配置）
    local posArr = #(
        [0,            spacing, zHeight],  -- Helper_A1（親）
        [spacing,      spacing, zHeight],  -- Helper_A2（A1の子）
        [spacing * 2,  spacing, zHeight],  -- Helper_A3（A2の子）
        [0,            0,       zHeight],  -- Helper_B1（親）
        [spacing,      0,       zHeight],  -- Helper_B2（B1の子）
        [spacing * 2,  0,       zHeight],  -- Helper_B3（B2の子）
        [0,            -spacing, zHeight], -- Helper_C1（親）
        [spacing,      -spacing, zHeight], -- Helper_C2（C1の子）
        [spacing * 2,  -spacing, zHeight]  -- Helper_C3（C2の子）
    )

    -- ヘルパー生成（名前をA/B/C系列に変更）
    local hpA1 = Point name:"Helper_A1" pos:posArr[1] size:helperSize cross:true box:false wirecolor:red
    local hpA2 = Point name:"Helper_A2" pos:posArr[2] size:helperSize cross:true box:false wirecolor:green
    local hpA3 = Point name:"Helper_A3" pos:posArr[3] size:helperSize cross:true box:false wirecolor:blue
    local hpB1 = Point name:"Helper_B1" pos:posArr[4] size:helperSize cross:true box:false wirecolor:yellow
    local hpB2 = Point name:"Helper_B2" pos:posArr[5] size:helperSize cross:true box:false wirecolor:orange
    local hpB3 = Point name:"Helper_B3" pos:posArr[6] size:helperSize cross:true box:false wirecolor:white
    local hpC1 = Point name:"Helper_C1" pos:posArr[7] size:helperSize cross:true box:false wirecolor:blue
    local hpC2 = Point name:"Helper_C2" pos:posArr[8] size:helperSize cross:true box:false wirecolor:blue
    local hpC3 = Point name:"Helper_C3" pos:posArr[9] size:helperSize cross:true box:false wirecolor:blue

    -- リンク設定（階層構造）
    hpA2.parent = hpA1  -- Helper_A2をHelper_A1にリンク
    hpA3.parent = hpA2  -- Helper_A3をHelper_A2にリンク
    hpB2.parent = hpB1  -- Helper_B2をHelper_B1にリンク
    hpB3.parent = hpB2  -- Helper_B3をHelper_B2にリンク
    hpC2.parent = hpC1  -- Helper_C2をHelper_C1にリンク
    hpC3.parent = hpC2  -- Helper_C3をHelper_C2にリンク

    -- 親を不動に設定（フリーズ）
    hpA1.isFrozen = true
    hpB1.isFrozen = true
    hpC1.isFrozen = true

    format "Helpers created and linked in three straight lines.\n"
    format "A-series: Helper_A1 -> Helper_A2 -> Helper_A3\n"
    format "B-series: Helper_B1 -> Helper_B2 -> Helper_B3\n"
    format "C-series: Helper_C1 -> Helper_C2 -> Helper_C3\n"
    format "Parents (A1, B1, C1) are frozen and immovable.\n"

    ----------------------------------------------------------------
    -- 2. 移動イベント時の距離補正処理
    ----------------------------------------------------------------
    global isAdjusting = false  -- 再帰防止フラグ
    global adjustingOperation = ""  -- 現在の調整操作を追跡

    -- A系列のヘルパーが動いた時の処理
    fn onASeriesMoved movedHelper =
    (
        if not isAdjusting then
        (
            isAdjusting = true
            
            case movedHelper of
            (
                hpA2: ( -- A2が動いた場合
                    adjustingOperation = "A2 moved"
                    
                    -- A1は不動なので、A2の位置をA1から固定距離に制限
                    local offset = hpA2.pos - hpA1.pos
                    local expectedOffset = normalize(offset) * spacing
                    if length offset != spacing then
                    (
                        hpA2.pos = hpA1.pos + expectedOffset
                    )
                    
                    -- B系列を調整（B2の位置をA2に合わせる）
                    local dir = normalize(hpB2.pos - hpA2.pos)
                    local oldB2Pos = hpB2.pos
                    hpB2.pos = hpA2.pos + dir * targetDist
                    
                    -- B2が動いたのでB3も調整（連鎖的な調整）
                    local offset3 = hpB3.pos - hpB2.pos
                    local expectedOffset3 = normalize(offset3) * spacing
                    if length offset3 != spacing then
                    (
                        hpB3.pos = hpB2.pos + expectedOffset3
                    )
                    
                    -- C系列を調整（C2の位置をA2に合わせる）
                    local dirC = normalize(hpC2.pos - hpA2.pos)
                    local oldC2Pos = hpC2.pos
                    hpC2.pos = hpA2.pos + dirC * targetDist * 2  -- CはAから2倍の距離など調整
                    local offsetC3 = hpC3.pos - hpC2.pos
                    local expectedOffsetC3 = normalize(offsetC3) * spacing
                    if length offsetC3 != spacing then
                    (
                        hpC3.pos = hpC2.pos + expectedOffsetC3
                    )
                )
                
                hpA3: ( -- A3が動いた場合
                    adjustingOperation = "A3 moved"
                    
                    -- A2を調整（親を子の動きに合わせる、距離を固定）
                    local offset = hpA3.pos - hpA2.pos
                    local expectedOffset = normalize(offset) * spacing
                    if length offset != spacing then
                    (
                        hpA2.pos = hpA3.pos - expectedOffset
                    )
                    
                    -- A2が動いたのでA1からの距離を制限（A1は不動）
                    local offset2 = hpA2.pos - hpA1.pos
                    local expectedOffset2 = normalize(offset2) * spacing
                    if length offset2 != spacing then
                    (
                        hpA2.pos = hpA1.pos + expectedOffset2
                        -- A2が調整されたのでA3も再調整
                        hpA3.pos = hpA2.pos + expectedOffset
                    )
                    
                    -- A2が調整されたらB2も調整（重要な修正ポイント）
                    local dir2 = normalize(hpB2.pos - hpA2.pos)
                    hpB2.pos = hpA2.pos + dir2 * targetDist
                    
                    -- B3の位置をA3に合わせて調整
                    local dir3 = normalize(hpB3.pos - hpA3.pos)
                    hpB3.pos = hpA3.pos + dir3 * targetDist
                    
                    -- B2が動いたのでB3も調整（距離を保つ）
                    local offsetB3 = hpB3.pos - hpB2.pos
                    local expectedOffsetB3 = normalize(offsetB3) * spacing
                    if length offsetB3 != spacing then
                    (
                        hpB3.pos = hpB2.pos + expectedOffsetB3
                    )
                    
                    -- C系列を調整
                    local dirC2 = normalize(hpC2.pos - hpA2.pos)
                    hpC2.pos = hpA2.pos + dirC2 * targetDist * 2
                    local dirC3 = normalize(hpC3.pos - hpA3.pos)
                    hpC3.pos = hpA3.pos + dirC3 * targetDist * 2
                    local offsetC3 = hpC3.pos - hpC2.pos
                    if length offsetC3 != spacing then
                    (
                        hpC3.pos = hpC2.pos + normalize(offsetC3) * spacing
                    )
                )
            )
            
            isAdjusting = false
        )
    )

    -- B系列のヘルパーが動いた時の処理
    fn onBSeriesMoved movedHelper =
    (
        if not isAdjusting then
        (
            isAdjusting = true
            
            case movedHelper of
            (
                hpB2: ( -- B2が動いた場合
                    adjustingOperation = "B2 moved"
                    
                    -- B1は不動なので、B2の位置をB1から固定距離に制限
                    local offset = hpB2.pos - hpB1.pos
                    local expectedOffset = normalize(offset) * spacing
                    if length offset != spacing then
                    (
                        hpB2.pos = hpB1.pos + expectedOffset
                    )
                    
                    -- A系列を調整（A2の位置をB2に合わせる）
                    local dir = normalize(hpA2.pos - hpB2.pos)
                    local oldA2Pos = hpA2.pos
                    hpA2.pos = hpB2.pos + dir * targetDist
                    
                    -- A2が動いたのでA3も調整（連鎖的な調整）
                    local offset3 = hpA3.pos - hpA2.pos
                    local expectedOffset3 = normalize(offset3) * spacing
                    if length offset3 != spacing then
                    (
                        hpA3.pos = hpA2.pos + expectedOffset3
                    )
                    
                    -- C系列を調整
                    local dirC = normalize(hpC2.pos - hpB2.pos)
                    hpC2.pos = hpB2.pos + dirC * targetDist
                    local offsetC3 = hpC3.pos - hpC2.pos
                    if length offsetC3 != spacing then
                    (
                        hpC3.pos = hpC2.pos + normalize(offsetC3) * spacing
                    )
                )
                
                hpB3: ( -- B3が動いた場合
                    adjustingOperation = "B3 moved"
                    
                    -- B2を調整（親を子の動きに合わせる、距離を固定）
                    local offset = hpB3.pos - hpB2.pos
                    local expectedOffset = normalize(offset) * spacing
                    if length offset != spacing then
                    (
                        hpB2.pos = hpB3.pos - expectedOffset
                    )
                    
                    -- B2が動いたのでB1からの距離を制限（B1は不動）
                    local offset2 = hpB2.pos - hpB1.pos
                    local expectedOffset2 = normalize(offset2) * spacing
                    if length offset2 != spacing then
                    (
                        hpB2.pos = hpB1.pos + expectedOffset2
                        -- B2が調整されたのでB3も再調整
                        hpB3.pos = hpB2.pos + expectedOffset
                    )
                    
                    -- B2が調整されたらA2も調整（重要な修正ポイント）
                    local dir2 = normalize(hpA2.pos - hpB2.pos)
                    hpA2.pos = hpB2.pos + dir2 * targetDist
                    
                    -- A3の位置をB3に合わせて調整
                    local dir3 = normalize(hpA3.pos - hpB3.pos)
                    hpA3.pos = hpB3.pos + dir3 * targetDist
                    
                    -- A2が動いたのでA3も調整（距離を保つ）
                    local offsetA3 = hpA3.pos - hpA2.pos
                    local expectedOffsetA3 = normalize(offsetA3) * spacing
                    if length offsetA3 != spacing then
                    (
                        hpA3.pos = hpA2.pos + expectedOffsetA3
                    )
                    
                    -- C系列を調整
                    local dirC2 = normalize(hpC2.pos - hpB2.pos)
                    hpC2.pos = hpB2.pos + dirC2 * targetDist
                    local dirC3 = normalize(hpC3.pos - hpB3.pos)
                    hpC3.pos = hpB3.pos + dirC3 * targetDist
                    local offsetC3 = hpC3.pos - hpC2.pos
                    if length offsetC3 != spacing then
                    (
                        hpC3.pos = hpC2.pos + normalize(offsetC3) * spacing
                    )
                )
            )
            
            isAdjusting = false
        )
    )

    -- C系列のヘルパーが動いた時の処理
    fn onCSeriesMoved movedHelper =
    (
        if not isAdjusting then
        (
            isAdjusting = true
            
            case movedHelper of
            (
                hpC2: ( -- C2が動いた場合
                    adjustingOperation = "C2 moved"
                    
                    -- C1は不動なので、C2の位置をC1から固定距離に制限
                    local offset = hpC2.pos - hpC1.pos
                    local expectedOffset = normalize(offset) * spacing
                    if length offset != spacing then
                    (
                        hpC2.pos = hpC1.pos + expectedOffset
                    )
                    
                    -- B系列を調整（B2の位置をC2に合わせる）
                    local dir = normalize(hpB2.pos - hpC2.pos)
                    local oldB2Pos = hpB2.pos
                    hpB2.pos = hpC2.pos + dir * targetDist
                    
                    -- B2が動いたのでB3も調整
                    local offset3 = hpB3.pos - hpB2.pos
                    local expectedOffset3 = normalize(offset3) * spacing
                    if length offset3 != spacing then
                    (
                        hpB3.pos = hpB2.pos + expectedOffset3
                    )
                    
                    -- A系列を調整（A2の位置をC2に合わせる）
                    local dirA = normalize(hpA2.pos - hpC2.pos)
                    local oldA2Pos = hpA2.pos
                    hpA2.pos = hpC2.pos + dirA * targetDist * 2  -- AはCから2倍の距離など調整
                    
                    -- A2が動いたのでA3も調整
                    local offsetA3 = hpA3.pos - hpA2.pos
                    local expectedOffsetA3 = normalize(offsetA3) * spacing
                    if length offsetA3 != spacing then
                    (
                        hpA3.pos = hpA2.pos + expectedOffsetA3
                    )
                )
                
                hpC3: ( -- C3が動いた場合
                    adjustingOperation = "C3 moved"
                    
                    -- C2を調整（親を子の動きに合わせる、距離を固定）
                    local offset = hpC3.pos - hpC2.pos
                    local expectedOffset = normalize(offset) * spacing
                    if length offset != spacing then
                    (
                        hpC2.pos = hpC3.pos - expectedOffset
                    )
                    
                    -- C2が動いたのでC1からの距離を制限（C1は不動）
                    local offset2 = hpC2.pos - hpC1.pos
                    local expectedOffset2 = normalize(offset2) * spacing
                    if length offset2 != spacing then
                    (
                        hpC2.pos = hpC1.pos + expectedOffset2
                        -- C2が調整されたのでC3も再調整
                        hpC3.pos = hpC2.pos + expectedOffset
                    )
                    
                    -- C2が調整されたらB2も調整
                    local dir2 = normalize(hpB2.pos - hpC2.pos)
                    hpB2.pos = hpC2.pos + dir2 * targetDist
                    
                    -- B3の位置をC3に合わせて調整
                    local dir3 = normalize(hpB3.pos - hpC3.pos)
                    hpB3.pos = hpC3.pos + dir3 * targetDist
                    
                    -- B2が動いたのでB3も調整
                    local offsetB3 = hpB3.pos - hpB2.pos
                    local expectedOffsetB3 = normalize(offsetB3) * spacing
                    if length offsetB3 != spacing then
                    (
                        hpB3.pos = hpB2.pos + expectedOffsetB3
                    )
                    
                    -- A系列を調整
                    local dirA2 = normalize(hpA2.pos - hpC2.pos)
                    hpA2.pos = hpC2.pos + dirA2 * targetDist * 2
                    local dirA3 = normalize(hpA3.pos - hpC3.pos)
                    hpA3.pos = hpC3.pos + dirA3 * targetDist * 2
                    local offsetA3 = hpA3.pos - hpA2.pos
                    if length offsetA3 != spacing then
                    (
                        hpA3.pos = hpA2.pos + normalize(offsetA3) * spacing
                    )
                )
            )
            
            isAdjusting = false
        )
    )

    -- Change Handler登録（親のハンドラを無効化）
    when transform hpA2 changes do onASeriesMoved hpA2
    when transform hpA3 changes do onASeriesMoved hpA3
    when transform hpB2 changes do onBSeriesMoved hpB2
    when transform hpB3 changes do onBSeriesMoved hpB3
    when transform hpC2 changes do onCSeriesMoved hpC2
    when transform hpC3 changes do onCSeriesMoved hpC3

    format "\nSetup complete with improved syncing between series.\n"
    format "Parents (A1, B1, C1) are frozen and immovable.\n"
    format "All helpers will now maintain proper distances across all series.\n"
)
--変数名に予約語は絶対に使わない
--when transformで外部のローカル変数参照はできない
やりなおして