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

/*
@return
合計達成数
合計特典取得数
*/
cev[CEV_SHOW_ACHIEVEMENT] .name(">>>実績一覧を表示する") {
    defv {
        r_achieve = TV_RETURN
        r_receive

        selectIdx = TV_SHOW_ACHIEVEMENT
        selectMax
        bitFlag

        iptUp
        iptDown
        iptDec

        targetAchieveId
        targetReceiveId
        targetGiftType
        targetGiftNumber

        alpha
        beta
        ax
        ay
    }

    deft {
        strLine = TS_SHOW_ACHIEVEMENT
        strTargetGiftName
    }

    def {
        LAY_MESSAGE = 6

        PIC_CHOICES = 2
        PIC_SELECT
        PIC_TEXT

        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 = AC_SIZE
    selectIdx = 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)
                //説明文
                @pic.strpic [PIC_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 "choices text ->"
                strLine.asg("")
                __loop AC_LIST $arr $acIdx bl {
                    __loop $arr $var $idx bl {
                        __if $idx == AC_INDEX_ACHIEVED bl {
                            $ACHIEVE_ID = __id($var)
                            $ACHIEVE_ID += 0
                        }
                        __if $idx == AC_INDEX_RECEIVED bl {
                            $RECEIVE_ID = __id($var)
                            $RECEIVE_ID += 0
                        }
                        __if $idx == AC_INDEX_GIFT_TYPE bl {
                            $GIFT_TYPE = $var
                            $GIFT_TYPE += 0
                        }
                        __if $idx == AC_INDEX_GIFT_NUMBER bl {
                            $GIFT_NUMBER = $var
                            $GIFT_NUMBER += 0
                        }
                        //一行分入力する
                        __if $idx == AC_INDEX_NAME bl {
                            $NAME = $var
                            //特典によって文字列が変わる
                            __if $GIFT_TYPE == AC_GIFT_BALL bl {
                                $GIFT_STRING = "〇"
                            } .else bl {
                                $GIFT_STRING = "PT"
                            }
                            //実績を達成すると名前が表示される
                            @if s[$ACHIEVE_ID].isOn bl {
                                //特典を取得済の場合、白色になり、マークがつく
                                @if s[$RECEIVE_ID].isOn bl {
                                    strLine .cat("\c[0]$k ")
                                } .else bl {
                                    strLine .cat("\c[2]   ")
                                }
                                strLine .cat(__str($GIFT_STRING, " ", $NAME, NEWLINE))
                            //達成前は名前が隠される
                            } .else bl {
                                strLine .cat(__str("\c[17]   ", $GIFT_STRING, " ", "？？？？", NEWLINE))
                            }
                        }
                    }
                }
                @label.set "showChoices"
                @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 AC_LIST $arr $acIdx bl {
                    __loop $arr $var $idx bl {
                        __if $idx == AC_INDEX_ACHIEVED bl {
                            $ACHIEVE_ID = __id($var)
                            $ACHIEVE_ID += 0
                        }
                        __if $idx == AC_INDEX_RECEIVED bl {
                            $RECEIVE_ID = __id($var)
                            $RECEIVE_ID += 0
                        }
                        __if $idx == AC_INDEX_GIFT_TYPE bl {
                            $GIFT_TYPE = $var
                            $GIFT_TYPE += 0
                        }
                        __if $idx == AC_INDEX_GIFT_NUMBER bl {
                            $GIFT_NUMBER = $var
                            $GIFT_NUMBER += 0
                        }
                    }
                    //スイッチID、値段、特典の種類、特典の数値を入力する
                    @if selectIdx == $acIdx bl {
                        v[__id(targetAchieveId)..__id(targetGiftNumber)] = [$ACHIEVE_ID, $RECEIVE_ID, $GIFT_TYPE, $GIFT_NUMBER]
                    }
                }

                //説明文と景品の名前を入力する
                __loop AC_LIST $arr $acIdx bl {
                    __loop $arr $var $idx bl {
                        __if $idx == AC_INDEX_GIFT_NAME bl {
                            @if selectIdx == $acIdx bl {
                                strTargetGiftName.asg($var)
                            }
                        }
                        __if $idx == AC_INDEX_TEXT bl {
                            @if selectIdx == $acIdx bl {
                                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"
            }
        }

        //入力
        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 {
            //一覧を更新する
            bitOn(bitFlag, BIT_FLAG_SHOW)
            //選択対象が無効
            @if targetAchieveId <= 0 bl {
                //何もしない
            //達成していない
            } .elif s[targetAchieveId].isOff bl {
                @se.play "Cancel2" .opt(100, 100, 50)
            //既に取得している
            } .elif s[targetReceiveId].isOn bl {
                @se.play "Cancel2" .opt(100, 100, 50)
            //特典を得る
            } .else bl {
                s[targetReceiveId].on
                //PTを獲得
                @if targetGiftType == AC_GIFT_MONEY bl {
                    @party.money .add(targetGiftNumber)
                    @se.play "register" .opt(100, 100, 50)
                    @msg.show __str("\>PTを \c[2]\", targetGiftNumber, "\c[0] 貰った！\$")
                //ピンボールの玉を獲得
                } .elif targetGiftType == AC_GIFT_BALL bl {
                    pbBallPatternFlag |= targetGiftNumber
                    @se.play "Item1" .opt(90, 100, 50)
                    @msg.show __str("\>\c[2]「\", strTargetGiftName, "」\c[0]を貰った！")
                }
            }
        //上
        } .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_achieve = 0
    @loop AC_SIZE .dst(alpha) bl {
        alpha += AC_ACHIEVED_HEAD 
        @if s[alpha] .isOn bl {
            r_achieve += 1
        }
    }
    //合計特典取得数
    r_receive = 0
    @loop AC_SIZE .dst(alpha) bl {
        alpha += AC_RECEIVED_HEAD 
        @if s[alpha] .isOn bl {
            r_receive += 1
        }
    }
    //ピクチャを消去する
    erasePictures(PIC_CHOICES, PIC_TEXT)
    //変数を片付ける
    initArray(selectIdx, TV_NUMBER, 0)
    //文字列変数を初期化する
    strLine.asg("")
    strTargetGiftName.asg("")
}