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

/*
@return
購入数
合計購入数
*/
cev[CEV_GAME_STORE] .name(">>>ゲーム販売") {
    defv {
        r_buy = TV_RETURN
        r_num

        selectIdx = TV_GAME_STORE
        selectMax
        bitFlag

        targetId
        targetPrice

        buyCnt

        iptUp
        iptDown
        iptDec

        alpha
        beta
        ax
        ay
    }

    deft {
        strLine = TS_STORE
    }

    def {
        LAY_MESSAGE = 6

        PIC_CHOICES = 2
        PIC_SELECT
        PIC_TEXT
        PIC_MONEY

        BUY_TEXT        = "他に買いたいものはあるかな？"
        PURCHASED_TEXT  = "既に購入されているね。"
        NOT_ENOUGH_TEXT = "お金が足りないよ！"

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

        ROW_WIDTH = 288
        ROW_HEIGHT = 16
        ROW_PADDING = 16
        SCROLL_ROW = 5
        CHOICE_X = 16
        CHOICE_Y = 32
        MONEY_X = 304
        MONEY_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 = clamp(numberOfGame, 2, MG_SIZE)
    selectIdx = 0
    buyCnt = 0
    //入力抑制
    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 | BIT_FLAG_MONEY)
                //商品リスト
                @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 "choices text ->"
                strLine.asg("")
                __loop MG_LIST $arr $mgIdx bl {
                    __loop $arr $var $idx bl {
                        //値段を一時記録
                        __if $idx == MG_INDEX_PRICE bl {
                            $PRICE = $var
                            $PRICE += 0
                        }
                        //スイッチIDを一時記録
                        __if $idx == MG_INDEX_SWITCH bl {
                            $SWITCH = __id($var)
                            $SWITCH += 0
                        }
                        //一行分入力する
                        __if $idx == MG_INDEX_NAME bl {
                            $NAME = $var

                            //購入済みの場合、青色になり、マークがつく
                            @if s[$SWITCH].isOn bl {
                                strLine .cat("\c[17]$k ")
                            //金が足りない場合、青色になる
                            } .elif `sys.money >= $PRICE bl {
                                strLine .cat("\c[0]   ")
                            } .else bl {
                                strLine .cat("\c[17]   ")
                            }
                            //"[値段] : [名前]"
                            strLine .cat(__str($PRICE) .min(4))
                            strLine .cat(__str(" : ", $NAME, NEWLINE))
                        }
                    }
                }
                @comment "<- choices text"
                //位置
                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
                //スイッチID、値段、説明文を入力する
                @comment "switch ->"
                strLine.asg("")
                __loop MG_LIST $arr $mgIdx bl {
                    __loop $arr $var $idx bl {
                        //スイッチIDを一時記録
                        __if $idx == MG_INDEX_SWITCH bl {
                            $SWITCH = __id($var)
                            $SWITCH += 0
                        }
                        //値段を一時記録
                        __if $idx == MG_INDEX_PRICE bl {
                            $PRICE = $var
                            $PRICE += 0
                        }
                        //スイッチIDと値段と説明文を入力する
                        __if $idx == MG_INDEX_TEXT bl {
                            @if selectIdx == $mgIdx bl {
                                v[__id(targetId)..__id(targetPrice)] = [$SWITCH, $PRICE]
                                strLine.asg($var)
                            }
                        }
                    }
                }
                @pic.strpic [PIC_TEXT] strLine .pos(HEAD_X, HEAD_Y) .topLeft .scale(100) .trans(0) .size(ROW_WIDTH, HEAD_HEIGHT) baseStrPicCmd
                @comment "<- end switch"
            }
            //所持金を表示する
            @if `bitFlag & BIT_FLAG_MONEY bl {
                bitOff(bitFlag, BIT_FLAG_MONEY)
                alpha = sys.money
                @pic.strpic [PIC_MONEY] __str("\", alpha, " \c[1]PT\c[0]") .pos(MONEY_X, MONEY_Y) .topRight .scale(100) .trans(0) .size(0, 0) baseStrPicCmd
            }
        }

        //入力
        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 {
            //選択している項目の値段とスイッチ
            //メッセージ
            strLine .asg("")
            //選択対象が無効
            @if targetId <= 0 bl {
                //何もしない
            //購入済み
            } .elif s[targetId].isOn bl {
                @se.play "Cancel2" .opt(100, 100, 50)
                strLine .asg(PURCHASED_TEXT)
            //購入する
            } .elif `sys.money >= targetPrice bl {
                @se.play "register" .opt(100, 100, 50)
                //所持金と選択肢を更新する
                bitOn(bitFlag, BIT_FLAG_SHOW | BIT_FLAG_MONEY)
                strLine .asg(BUY_TEXT)
                //購入処理
                @party.money .sub(targetPrice)
                s[targetId].on
                //購入数
                buyCnt += 1

            //所持金が足りない
            } .else bl {
                @se.play "Cancel2" .opt(100, 100, 50)
                strLine .asg(NOT_ENOUGH_TEXT)
            }
            //メッセージを表示する
            @pic.strpic [PIC_TEXT] strLine .pos(HEAD_X, HEAD_Y) .topLeft .scale(100) .trans(0) .size(ROW_WIDTH, HEAD_HEIGHT) baseStrPicCmd

        //上
        } .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
        }
    }
    //終了処理
    //今までの購入数を数える
    r_num = 0
    @loop MG_SIZE .dst(alpha) bl {
        alpha += MG_SWITCH_HEAD 
        @if s[alpha] .isOn bl {
            r_num += 1
        }
    }

    //引数をセットする
    r_buy = buyCnt
    //ピクチャを消去する
    erasePictures(PIC_CHOICES, PIC_MONEY)
    //変数を片付ける
    initArray(selectIdx, TV_NUMBER, 0)
    //文字列変数を初期化する
    strLine.asg("")
}