#apply
#include "../_include.txt"
#include "../../define/_vector2.txt"

cev[CEV_SELECT_BALL] .name(">>>ピンボールの玉を選択") {
    defv {
        selectIdx = TV_SELECT_BALL
        selectMax
        bitFlag

        iptUp
        iptRight
        iptDown
        iptLeft
        iptDec

        pid
        cell

        alpha
        beta
        ax
        ay
    }

    def {
        LAY_MESSAGE = 6

        PATH_ITEM = "pb/bas"

        PIC_CHOICES = 10
        PIC_SELECT
        PIC_ITEM//+0_+15

        HEAD_TEXT = "\c[7]玉を選択してください。\c[0]"

        BIT_FLAG_MOVE  = 1 << 0

        PANEL_X = 0
        PANEL_Y = 160
        PANEL_WIDTH = 320
        PANEL_HEIGHT = 80

        ITEM_X = 24
        ITEM_Y = 38
        ITEM_WIDTH = 24
        ITEM_WRAP = 6
        
        CURSOR_SIZE = 24

        MAX_BALL_PATTERN = 12
    }

    def {
        baseStrPicCmd = {
            .chromakey(1)
            .font("", 12)
            .spacing(0, 4)
            .skin ""
            .mapLayer(LAY_MESSAGE)
            .eraseWhenTransfer
            .affectedByTint
            .affectedByFlash
            .affectedByShake
        }

        itemPicCmd = bl {
            PATH_ITEM
            .grid(MAX_BALL_PATTERN, 1)
            .chromakey(1)
            .eraseWhenTransfer
            .affectedByTint
            .affectedByFlash
            .affectedByShake
        }
    }
    
    //初期化
    initArray(selectIdx, TV_NUMBER, 0)
    bitFlag = 0
    selectMax = MAX_BALL_PATTERN - 1
    selectIdx = clamp(pbBallPattern, 0, selectMax)

    //入力抑制
    iptDec = 2

    //リスト
    @pic.strpic [PIC_CHOICES] HEAD_TEXT .pos(PANEL_X, PANEL_Y) .topLeft .scale2(100, 100) .trans(0) .size(PANEL_WIDTH, PANEL_HEIGHT) baseStrPicCmd
    @pic.strpic [PIC_SELECT] ""  .pos(0, 0) .topLeft .size(CURSOR_SIZE, CURSOR_SIZE) .scale(100) .trans(100) .rgbs(200, 200, 200, 100) .overlay baseStrPicCmd

    //選択肢
    @loop MAX_BALL_PATTERN .dst(alpha) bl {
        pid = PIC_ITEM + alpha
        cell = 1 + alpha
        V2_set(ax,
            PANEL_X + ITEM_X + alpha % ITEM_WRAP * ITEM_WIDTH,
            PANEL_Y + ITEM_Y + alpha / ITEM_WRAP * ITEM_WIDTH
        )

        @if `pbBallPatternFlag & (1 << alpha) bl {
            @pic.show[pid] .pos(ax, ay) .center .cell(cell) itemPicCmd
        } .else bl {
            @pic.show[pid] .pos(ax, ay) .center .cell(cell) .rgbs(0, 0, 0, 100) itemPicCmd
        }
    }

    //カーソル初期位置
    V2_set(ax,
        PANEL_X + ITEM_X + selectIdx % ITEM_WRAP * ITEM_WIDTH,
        PANEL_Y + ITEM_Y + selectIdx / ITEM_WRAP * ITEM_WIDTH
    )
    @pic.move[PIC_SELECT] .pos(ax, ay) .center .trans(0) .keepBlend .keepRgbs

    //ループ開始
    @loop bl {
        //待機
        @wait(0)

        //カーソルが移動した
        @if `bitFlag & BIT_FLAG_MOVE bl {
            bitOff(bitFlag, BIT_FLAG_MOVE)
            //選択位置
            selectIdx = clamp(selectIdx, 0, selectMax)
            //カーソルピクチャを移動させる
            V2_set(ax,
                PANEL_X + ITEM_X + selectIdx % ITEM_WRAP * ITEM_WIDTH,
                PANEL_Y + ITEM_Y + selectIdx / ITEM_WRAP * ITEM_WIDTH
            )
            @pic.move[PIC_SELECT] .pos(ax, ay) .center .trans(0) .keepBlend .keepRgbs .time(1)
        }

        //入力
        getAnyKey(alpha, FALSE)
        iptUp    = alpha == KEY_UP    ? iptUp     + 1 : 0
        iptRight = alpha == KEY_RIGHT ? iptRight  + 1 : 0
        iptDown  = alpha == KEY_DOWN  ? iptDown   + 1 : 0
        iptLeft  = alpha == KEY_LEFT  ? iptLeft   + 1 : 0
        iptDec   = alpha == KEY_DECISION ? iptDec + 1 : 0

        //キャンセル
        @if alpha == KEY_CANCEL bl {
            @se.play "Cancel2" .opt(100, 100, 50)
            @break
        //決定する
        } .elif iptDec == 1 bl {
            //取得していないと選択できない
            @if `pbBallPatternFlag & (1 << selectIdx) bl {
                @se.play "Decision1" .opt(80, 100, 50)
                pbBallPattern = selectIdx
                @wait(1)
                @break

            } .else bl {
                @se.play "Cancel2" .opt(100, 100, 50)
            }
        //上
        } .elif `iptUp   == 1 || (iptUp >= KEY_REPEAT_STOP && iptUp   % KEY_REPEAT_INTERVAL == 0) bl {
            @if selectIdx >= ITEM_WRAP bl {
                @se.play "Cursor1" .opt(80, 80, 50)
                bitOn(bitFlag, BIT_FLAG_MOVE)
                selectIdx -= ITEM_WRAP
            }
        //右
        } .elif `iptRight == 1 || (iptRight >= KEY_REPEAT_STOP && iptRight % KEY_REPEAT_INTERVAL == 0) bl {
            @if `selectIdx % ITEM_WRAP < ITEM_WRAP - 1 && selectIdx < selectMax bl {
                @se.play "Cursor1" .opt(80, 80, 50)
                bitOn(bitFlag, BIT_FLAG_MOVE)
                selectIdx += 1
            }
        //下
        } .elif `iptDown == 1 || (iptDown >= KEY_REPEAT_STOP && iptDown % KEY_REPEAT_INTERVAL == 0) bl {
            @if `selectIdx <= selectMax - ITEM_WRAP bl {
                @se.play "Cursor1" .opt(80, 80, 50)
                bitOn(bitFlag, BIT_FLAG_MOVE)
                selectIdx += ITEM_WRAP
            }
        //左
        } .elif `iptLeft == 1 || (iptLeft >= KEY_REPEAT_STOP && iptLeft % KEY_REPEAT_INTERVAL == 0) bl {
            @if `selectIdx % ITEM_WRAP > 0 bl {
                @se.play "Cursor1" .opt(80, 80, 50)
                bitOn(bitFlag, BIT_FLAG_MOVE)
                selectIdx -= 1
            }
        }
    }
    //終了処理
    erasePictures(PIC_ITEM + 0, PIC_ITEM + 15)
    @pic.erase[PIC_SELECT]
    @pic.erase[PIC_CHOICES]
    //変数を片付ける
    initArray(selectIdx, TV_NUMBER, 0)
}