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

cev[CEV_SELECT_ARCADE_BGM] .name(">>>BGM選択") {
    defv {
        selectIdx = TV_SELECT_BGM
        selectMax
        bitFlag

        iptUp
        iptDown
        iptDec

        alpha
        beta
        ax
        ay
    }

    deft {
        strLine = TS_SELECT_BGM
    }

    def {
        LAY_MESSAGE = 6

        PIC_CHOICES = 2
        PIC_SELECT
        PIC_TEXT

        HEAD_TEXT = "BGMを選択してください。"

        BIT_FLAG_INIT  = 1 << 0
        BIT_FLAG_SHOW  = 1 << 1
        BIT_FLAG_MOVE  = 1 << 2

        ROW_WIDTH = 288
        ROW_HEIGHT = 16
        ROW_PADDING = 16
        SCROLL_ROW = 5
        CHOICE_X = 16
        CHOICE_Y = 32
        HEAD_X = 16
        HEAD_Y = 0
        HEAD_HEIGHT = 32
    }

    def {
        baseStrPicCmd = {
            .chromakey(1)
            .font("", 12)
            .spacing(0, 4)
            .skin ""
            .mapLayer(LAY_MESSAGE)
            .eraseWhenTransfer
            .affectedByTint
            .affectedByFlash
            .affectedByShake
        }
    }
    
    //初期化
    initArray(selectIdx, TV_NUMBER, 0)
    bitFlag = BIT_FLAG_INIT
    selectMax = max(lerp(0, BGM_SIZE, numberOfGame, MG_SIZE), 4)//解禁されたゲームの数で決まる
    selectIdx = clamp(arcadeBGM, 0, selectMax)

    //入力抑制
    iptDec = 2

    //ループ開始
    @loop bl {
        //待機
        @wait(0)
        //ビットフラグ
        @if `bitFlag bl {
            //ピクチャ初期化
            @if `bitFlag & BIT_FLAG_INIT bl {
                bitOff(bitFlag, BIT_FLAG_INIT)
                bitOn(bitFlag, BIT_FLAG_SHOW | BIT_FLAG_MOVE)
                //説明文
                @pic.strpic [PIC_TEXT] HEAD_TEXT .pos(HEAD_X, HEAD_Y) .topLeft .scale(100) .trans(0) .size(ROW_WIDTH, HEAD_HEIGHT) baseStrPicCmd
                //BGMリスト
                @pic.strpic [PIC_CHOICES] "" .pos(CHOICE_X, CHOICE_Y) .topLeft .scale(100) .trans(0) .size(ROW_WIDTH, ROW_HEIGHT) baseStrPicCmd
                //カーソル
                @pic.strpic [PIC_SELECT] ""  .pos(CHOICE_X, ROW_HEIGHT) .topLeft .size(ROW_WIDTH - 10, ROW_HEIGHT) .scale(100) .trans(100) .rgbs(200, 200, 200, 100) .overlay baseStrPicCmd 
            }
            //選択肢を表示する
            @if `bitFlag & BIT_FLAG_SHOW bl {
                bitOff(bitFlag, BIT_FLAG_SHOW)
                @comment "switch ->"
                strLine.asg("")
                __loop BGM_LIST $arr $bgmIdx bl {
                    __loop $arr $var $idx bl {
                        //一行分入力する
                        __if $idx == BGM_INDEX_NAME bl {
                            $NAME = $var
                            strLine .cat(__str($NAME, NEWLINE))
                        }
                    }
                }
                @comment "<- end switch"
                //位置
                V2_set(ax,
                    CHOICE_X,
                    min(CHOICE_Y - (selectIdx - SCROLL_ROW) * ROW_HEIGHT, CHOICE_Y)
                )
                //サイズ
                alpha = ROW_WIDTH
                beta = selectMax * ROW_HEIGHT + ROW_PADDING
                //ピクチャを更新する
                @pic.strpic [PIC_CHOICES] strLine .pos(ax, ay) .topLeft .scale(100) .trans(0) .size(alpha, beta) baseStrPicCmd
            }
            //カーソルが移動した
            @if `bitFlag & BIT_FLAG_MOVE bl {
                bitOff(bitFlag, BIT_FLAG_MOVE)
                //選択位置がループする
                selectIdx = (selectIdx + selectMax) % selectMax
                //ピクチャ移動
                V2_set(ax,
                    CHOICE_X,
                    min(CHOICE_Y - (selectIdx - SCROLL_ROW) * ROW_HEIGHT, CHOICE_Y)
                )
                @pic.move [PIC_CHOICES] .pos(ax, ay) .topLeft .scale(100) .trans(0) .time(1) .keepBlend .keepRgbs
                V2_set(ax,
                    CHOICE_X + 4,
                    ay + selectIdx * ROW_HEIGHT + 8
                )
                @pic.move [PIC_SELECT] .pos(ax, ay) .topLeft .scale(100) .trans(10) .keepBlend .keepRgbs
            }
        }

        //入力
        getAnyKey(alpha, FALSE)
        iptUp   = alpha == KEY_UP   ? iptUp   + 1 : 0
        iptDown = alpha == KEY_DOWN ? iptDown + 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 selectIdx != arcadeBGM bl {
                @se.play "Decision1" .opt(80, 100, 50)
                arcadeBGM = selectIdx
                playArcadeBGM(100)
            }
        //上
        } .elif `iptUp   == 1 || (iptUp   >= KEY_REPEAT_STOP && iptUp   % KEY_REPEAT_INTERVAL == 0) 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 {
            @se.play "Cursor1" .opt(80, 80, 50)
            bitOn(bitFlag, BIT_FLAG_MOVE)
            selectIdx += 1
        }
    }
    //終了処理
    //ピクチャを消去する
    erasePictures(PIC_CHOICES, PIC_TEXT)
    //変数を片付ける
    initArray(selectIdx, TV_NUMBER, 0)
    //文字列変数を初期化する
    strLine.asg("")
}