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


cev[CEV_RAINBOW_PUSHER] .name("mg_レインボープッシャー") {
    //定数定義
    def {
        //使用する変数の個数
        NUM_OF_VAR = 64
        NUM_OF_STR = 0
        NUM_OF_PIC = 64

        //レイヤー
        BASE_LAYER = 6

        //ピクチャパス
        PATH_BACK      = "rp\ba"
        PATH_MEDAL_50  = "rp\md_50"
        PATH_MEDAL_5   = "rp\md_5"
        PATH_MEDAL_1   = "rp\md_1"
        PATH_SCATTER_1 = "rp\sc_1"
        PATH_PACKET    = "rp\sr"
        PAHT_BIGBOW    = "rp\br"
        PATH_WINDDIR   = "rp\wd"
        PATH_PUNCH     = "rp\pu"
        PATH_PORTRAIT  = "rp\rs"

        //ピクチャID
        PIC_HEAD       = 1
        PIC_BACK       = 2
        PIC_BIGBOW     = 3
        PIC_WINDDIR    = 4
        PIC_PACKET     = 5
        PIC_SCORE_PAC  = 6//+0_+2
        PIC_MEDAL_50   = 10//+0_+9 連番開始
        PIC_MEDAL_5    = 20//+0_+9
        PIC_MEDAL_1    = 30//+0_+5 連番終わり
        PIC_SCATTER_1  = 40//+0_+9
        PIC_BET_MULTI  = 50
        PIC_COMBO_POP  = 51
        PIC_PORTRAIT   = 52
        PIC_SCORE_BET  = 53
        PIC_SCORE_WON  = 54
        PIC_SCORE_OWN  = 55
        PIC_PUNCH      = 56
        PIC_DEBUG      = 57

        //実績
        ACHIEVE_MEDAL = 3000

        //定数
        SCORE_OWN_X   = 300
        SCORE_OWN_Y   = 180
        SCORE_MULTI_X = 300
        SCORE_MULTI_Y = 150
        SCORE_BET_X   = 160
        SCORE_BET_Y   = 24
        PACKET_MAX_X  = 7
        PACKET_SIZE   = 3
        PACKET_WIDTH  = 32
        COMBO_MAX     = 100
        SCATTER_MAX   = 10
        MEDAL_MAX     = 999999
        MEDAL_BASE_X  = 160
        MEDAL_BASE_Y  = 200
        MEDAL_DROP    = 120
        MEDAL_WIDTH   = 12
        MEDAL_HEIGHT  = 4
        MEDAL_DEPTH   = 8
        MEDAL_SET_500 = 500
        MEDAL_SET_50  = 50
        MEDAL_SET_5   = 5
        MEDAL_SET_1   = 1
        MEDAL_MAX_50  = 10
        MEDAL_MAX_5   = 10
        MEDAL_MAX_1   = 5

        //ビットフラグ
        BIT_UPDATE_NONE       = 0
        BIT_UPDATE_FIELD      = 1 << 1
        BIT_UPDATE_OWN        = 1 << 2
        BIT_UPDATE_MULTI      = 1 << 3
        BIT_CHECK_ACHIEVEMENT = 1 << 4
        
    }

    //ピクチャの共通コマンド
    def {
        basePicCmd = bl {
            .chromakey(1)
            .mapLayer(BASE_LAYER)
            .eraseWhenTransfer
            .affectedByTint
            .affectedByFlash
            .affectedByShake
        }

        scoreStrPicCmd = bl {
            .size(0, 0)
            .font("", 14) .bold
            .spacing(0, 4)
            .skin "" .nobg .noframe .noPadding
            basePicCmd
        }

        bgPicCmd = bl {
            .topLeft
            .scale(100)
            .trans(0)
            basePicCmd
        }

        windPicCmd = bl {
            PATH_WINDDIR
            .topLeft
            .pos(0, 0)
            .scale(100)
            .trans(0)
            .grid(3, 1)
            basePicCmd
        }

        readyPicCmd = bl {
            .topLeft
            .pos(0, 0)
            .scale(100)
            .trans(100)
            basePicCmd
        }
    }

    //変数定義
    defv {
        varHead = TV_MINIGAME
        
        input
        tm1
        tm2
        tm3
        tm4
        ax
        ay
        ang
        red
        green
        blue
        sat
        pid

        changedFlag
        fieldMedal
        medalsWon
        packetPos
        packetTimer
        packetSgn
        dropBias
        dropPos
        windDir
        portraitFlg
        bonusBowChance
        betBonus
        comboBonus
        nowMedal50
        nowMedal5
        nowMedal1
        pocket0
        pocket1
        pocket2

        varFoot

    }
    
    commentRangeOfVariables(varFoot, TV_MINIGAME, NUM_OF_VAR, NUM_OF_STR, NUM_OF_PIC)

    __fn _hideMedalPicures $head $num {
        @loop $num .dst(pid) {
            pid += $head
            hidePicture(pid)
        }
    }

    __fn _readyMedalPictures $head $path $num bl {
        @loop $num .dst(pid) bl {
            pid += $head
            @pic.show[pid] $path readyPicCmd
        }
    }

    //メダルの排出倍率を取得する
    __fn _getMedalMulti $d bl {
        v[__id($d)] = betBonus + comboBonus + (bonusBowChance > 0 ? 20 : 0) + 100
    }

    //グラデーションを取得する
    __fn _setRainbowColor $idx $v1 $v2 bl {
        red   = [$v1, $v1, $v2, $v2, $v2, $v1][$idx]
        green = [$v2, $v1, $v1, $v1, $v2, $v2][$idx]
        blue  = [$v2, $v2, $v2, $v1, $v1, $v1][$idx]
        sat   = 100
    }

    //------------------------------------------------------------------------------------
    //開始処理
    bl {
        initPicturesAndVariables(PIC_HEAD, NUM_OF_PIC, TV_MINIGAME, NUM_OF_VAR, 0, 0)
        msgBottom()
        
        //背景
        @pic.show[PIC_BACK] PATH_BACK .pos(0, 0) bgPicCmd

        //メダル
        _readyMedalPictures(PIC_MEDAL_50, PATH_MEDAL_50, MEDAL_MAX_50)
        _readyMedalPictures(PIC_MEDAL_5,  PATH_MEDAL_5,  MEDAL_MAX_5 )
        _readyMedalPictures(PIC_MEDAL_1,  PATH_MEDAL_1,  MEDAL_MAX_1 )
        _readyMedalPictures(PIC_SCATTER_1,  PATH_SCATTER_1,  SCATTER_MAX )

        @pic.show[PIC_BIGBOW]   PAHT_BIGBOW   readyPicCmd
        @pic.show[PIC_WINDDIR]  PATH_WINDDIR  readyPicCmd
        @pic.show[PIC_PACKET]   PATH_PACKET   readyPicCmd
        @pic.show[PIC_PUNCH]    PATH_PUNCH    readyPicCmd
        @pic.show[PIC_PORTRAIT] PATH_PORTRAIT readyPicCmd

        //ピクチャの初期位置
        @pic.move [PIC_PACKET] .pos(160, 142) .bottom .scale(100) .trans(0)
        @pic.show [PIC_WINDDIR] .cell(1) .rgbs(100, 100, 100, 100) windPicCmd

        //変数の初期状態
        packetPos   = 3//最初は中央固定
        packetSgn   = 1
        packetTimer = sys.frame

        changedFlag = BIT_UPDATE_NONE
        bitOn(changedFlag, BIT_UPDATE_FIELD | BIT_UPDATE_OWN | BIT_UPDATE_MULTI)

        //所持メダルが少ない場合、補充する
        //@if rainbowMedalNum < 100 bl {
        //    rainbowMedalNum = 100
        //}

        //暗転
        fastFadeInTintOnly(1)
        //ゲーム開始
        @label.jump "gameLoop"
    }

    //------------------------------------------------------------------------------------
    //ゲーム処理
    @label.set "gameLoop"
    bl {
        @loop bl {
            @wait(0)

            //----------------------------
            //ポーズ
            @key.input .dst(input) .cancel
            @if input != 0 bl {
                @se.play "Cancel2" .opt(100, 100, 50)

                @msg.choice bl {
                    .cancel(0)
                    .case "\>つづける" bl {
                    }
                    .case "\>\c[2]メダルを買う\c[0]" bl {
                        @label.set "medalShop"

                        $price = 200
                        $medal = 100

                        __str("\>\$メダル所持数 : \c[2]\", rainbowMedalNum, "\c[0]")
                        @msg.choice bl {
                            .cancel(1)
                            .case "\>メダル \c[2]100\c[0] 枚 (\c[2]200\c[0] PT)" bl {//書き換えが必要
                                //所持金をチェック
                                @if .money .geq($price) bl {
                                    //所持数をチェック
                                    @if rainbowMedalNum < MEDAL_MAX bl {
                                        @party.money .sub($price)
                                        rainbowMedalNum = min(rainbowMedalNum + $medal, MEDAL_MAX)
                                        bitOn(changedFlag, BIT_UPDATE_OWN | BIT_CHECK_ACHIEVEMENT)
                                        @se.play "register" .opt(100, 100, 50)

                                    } .else bl {
                                        //買いすぎ
                                        @se.play "Buzzer3" .opt(100, 100, 50)
                                        "\>これ以上メダルを持てません！アンタすごいよ！"
                                    }
                                } .else bl {
                                    //足りない
                                    @se.play "Buzzer3" .opt(100, 100, 50)
                                }

                                @label.jump "medalShop"
                            }
                            .case "\>買わない" bl {
                            }
                        }
                    }
                    .case "\>やめる" bl {
                        @label.jump "gameEnd"
                    }
                }
                //キャンセルキー押しっぱなしでまた選択肢が出るのを抑える
                @wait(3)
            }

            //----------------------------
            //場に投下する
            @key.input .dst(input) .down
            @if `input != 0 bl {
                //左右を押しながら入れると出し方が変わる
                @key.input .dst(input) {
                    .left
                    .right
                }

                //慎重に
                @if input == KEY_LEFT bl {
                    tm1 = 1
                //全力
                } .elif input == KEY_RIGHT bl {
                    @if `rainbowMedalNum >= 50 && nowMedal5 == 0 && nowMedal1 == 0 bl {
                        tm1 = 50
                    } .elif `rainbowMedalNum >= 5 && nowMedal1 == 0 {
                        tm1 = 5
                    } .else bl {
                        tm1 = 1
                    }
                //気まぐれで変わる
                } .else bl {
                    @if `rainbowMedalNum >= 50 && nowMedal5 == 0 && nowMedal1 == 0 && rnd(0,2) == 0 bl {
                        tm1 = 50
                    } .elif `rainbowMedalNum >= 5 && nowMedal1 == 0 && rnd(0,1) == 0 {
                        tm1 = 5
                    } .else bl {
                        tm1 = 1
                    }
                }

                //入れすぎ
                @if `fieldMedal + tm1 > MEDAL_SET_500 bl {
                    tm1 = MEDAL_SET_500 - fieldMedal
                }

                //入れない場合、足りない場合はスルーする
                @if `tm1 > 0 && rainbowMedalNum >= tm1 bl {
                    rainbowMedalNum -= tm1
                    fieldMedal += tm1

                    betBonus = fieldMedal * 1 / 20//20枚につき1％

                    changedFlag |= BIT_UPDATE_FIELD | BIT_UPDATE_OWN | BIT_UPDATE_MULTI
                }
            }
            
            //パケット移動
            tm1 = sys.frame - packetTimer
            @if `tm1 > 30 || tm1 < 0 bl {
                packetTimer = sys.frame

                //方向転換
                @if `(packetSgn > 0 && packetPos >= 6) || (packetSgn < 0 && packetPos <= 0) bl {
                    packetSgn *= -1
                }
                
                packetPos += packetSgn

                ax = 160 + (packetPos - 3) * PACKET_WIDTH
                ay = 142
                @pic.move [PIC_PACKET] .pos(ax, ay) .bottom .scale(100) .trans(0) .time(1)
            }

            //スコア更新
            @if `changedFlag & BIT_UPDATE_OWN bl {
                bitOff(changedFlag, BIT_UPDATE_OWN)

                @pic.strpic [PIC_SCORE_OWN] __str("\", rainbowMedalNum) .pos(SCORE_OWN_X, SCORE_OWN_Y) .topRight .scale2(200, 200) .trans(0) scoreStrPicCmd

            //せっかくなので七色に光らせてみる
            } .else bl {
                @if `!(sys.frame % 2) bl {
                    tm1 = abs(sys.frame / 2) % 6
                    _setRainbowColor(tm1, 100, 50)

                    @pic.move [PIC_SCORE_OWN] .relative .pos(0, 0) .scale(0) .trans(0) .rgbs(red, green, blue, sat)
                }
            }

            //実績チェック
            @if `changedFlag & BIT_CHECK_ACHIEVEMENT bl {
                bitOff(changedFlag, BIT_CHECK_ACHIEVEMENT)

                checkSetAchievement(achievedRainbow, rainbowMedalNum >= ACHIEVE_MEDAL)
            }

            //倍率更新
            @if `changedFlag & BIT_UPDATE_MULTI bl {
                bitOff(changedFlag, BIT_UPDATE_MULTI)

                _getMedalMulti(tm1)
                @pic.strpic [PIC_BET_MULTI] __str("\c[7]\", tm1, "%") .pos(SCORE_MULTI_X, SCORE_MULTI_Y) .topRight .scale2(200, 200) .trans(0) scoreStrPicCmd
            }

            //場に出ているメダルを更新する
            @if `changedFlag & BIT_UPDATE_FIELD bl {
                bitOff(changedFlag, BIT_UPDATE_FIELD)

                @loop {
                    def {
                        BIT_MD_NONE     = 0
                        BIT_MD_INSTANT  = 1 << 1
                        BIT_MD_DROP     = 1 << 2
                        BIT_MD_RESET_1  = 1 << 3
                        BIT_MD_RESET_5  = 1 << 4
                        BIT_MD_RESET_50 = 1 << 8
                        BIT_MD_ADD_1    = 1 << 9
                        BIT_MD_ADD_5    = 1 << 10
                        BIT_MD_ADD_50   = 1 << 11
                    }

                    //動作を選択する
                    tm1 = BIT_MD_NONE
                    //積むべき量
                    tm2 = fieldMedal - (nowMedal50 * MEDAL_SET_50 + nowMedal5 * MEDAL_SET_5 + nowMedal1)
                    //積みすぎている場合は一旦初期化する
                    @if `tm2 < 0 bl {
                        bitOn( tm1, BIT_MD_RESET_1 | BIT_MD_RESET_5 | BIT_MD_RESET_50 )
                    //限界まで積まれると何もしない
                    } .elif nowMedal50 >= MEDAL_MAX_50 bl {
                    //5 * 10 + 5 = 50
                    } .elif `MEDAL_SET_50 <= nowMedal5 * MEDAL_SET_5 + nowMedal1 bl {
                        bitOn( tm1, BIT_MD_ADD_50 | BIT_MD_INSTANT | BIT_MD_RESET_1 | BIT_MD_RESET_5 )
                    //1 * 5 = 5
                    } .elif `MEDAL_SET_5 <= nowMedal1 bl {
                        bitOn( tm1, BIT_MD_ADD_5 | BIT_MD_INSTANT | BIT_MD_RESET_1 )
                    //50
                    } .elif `MEDAL_SET_50 <= tm2 && nowMedal5 == 0 && nowMedal1 == 0 bl {
                        bitOn( tm1, BIT_MD_ADD_50 | BIT_MD_DROP )
                    //5
                    } .elif `MEDAL_SET_5 <= tm2 && nowMedal1 == 0 bl {
                        bitOn( tm1, BIT_MD_ADD_5 | BIT_MD_DROP )
                    //1
                    } .elif `MEDAL_SET_1 <= tm2 bl {
                        bitOn( tm1, BIT_MD_ADD_1 | BIT_MD_DROP )
                    }

                    //ループ終了
                    @if tm1 == BIT_MD_NONE bl {
                        @break
                    }

                    //ピクチャID、落下地点の座標
                    ax = MEDAL_BASE_X
                    ay = MEDAL_BASE_Y - nowMedal50 * MEDAL_SET_5 * MEDAL_HEIGHT
                    @if `(tm1 & BIT_MD_ADD_50) != BIT_MD_NONE bl {
                        pid = PIC_MEDAL_50 + nowMedal50

                    } .else bl {
                        ax += [-3,-1, 1, 3, -2, 0, 2, -1, 1,  0][nowMedal5] * MEDAL_WIDTH
                        ay += [-3,-3,-3,-3, -2,-2,-2, -1,-1,  0][nowMedal5] * MEDAL_DEPTH

                        @if `(tm1 & BIT_MD_ADD_5) != BIT_MD_NONE bl {
                            pid = PIC_MEDAL_5 + nowMedal5

                        } .else bl {
                            ax += 0
                            ay += -1 * nowMedal1 * MEDAL_HEIGHT

                            @if `(tm1 & BIT_MD_ADD_1) != 0 bl {
                                pid = PIC_MEDAL_1 + nowMedal1
                            }
                        }
                    }

                    //変数を更新する
                    @if `(tm1 & BIT_MD_ADD_1) != BIT_MD_NONE bl {
                        nowMedal1 += 1
                    }

                    @if `(tm1 & BIT_MD_ADD_5) != BIT_MD_NONE bl {
                        nowMedal5 += 1
                    }

                    @if `(tm1 & BIT_MD_ADD_50) != BIT_MD_NONE bl {
                        nowMedal50 += 1
                    }

                    //ピクチャの移動と待機
                    //瞬間移動
                    @if `(tm1 & BIT_MD_INSTANT) != BIT_MD_NONE bl {
                        @pic.move [pid] .pos(ax, ay) .bottom .scale(100) .trans(0)
                        @wait(0)

                    //落下
                    } .elif `(tm1 & BIT_MD_DROP) != BIT_MD_NONE bl {
                        tm2 = ay - MEDAL_DROP
                        @pic.move [pid] .pos(ax, tm2) .bottom .bottom .scale(100) .trans(0)
                        @wait(0)

                        //4f
                        $frame = 4
                        @loop $frame .dst(tm2) bl {
                            tm2 = lerp(ay - MEDAL_DROP, ay, tm2, $frame - 1)
                            @pic.move [pid] .pos(ax, tm2) .bottom .bottom .scale(100) .trans(0)
                            @wait(0)
                        }

                        //効果音
                        tm2 = rnd(10, 15) * 10
                        @se.play "money2" .opt(100, tm2, 50)
                    }

                    //変数とピクチャを初期化する
                    @if `(tm1 & BIT_MD_RESET_1) != BIT_MD_NONE bl {
                        nowMedal1 = 0
                        _hideMedalPicures(PIC_MEDAL_1, MEDAL_MAX_1)
                    }

                    @if `(tm1 & BIT_MD_RESET_5) != BIT_MD_NONE bl {
                        nowMedal5 = 0
                        _hideMedalPicures(PIC_MEDAL_5, MEDAL_MAX_5)
                    }

                    @if `(tm1 & BIT_MD_RESET_50) != BIT_MD_NONE bl {
                        nowMedal50 = 0
                        _hideMedalPicures(PIC_MEDAL_50, MEDAL_MAX_50)
                    }
                }
                //@pic.strpic [PIC_DEBUG] __str("\", fieldMedal, ", \", nowMedal50, ",\", nowMedal5, ",\", nowMedal1) .pos(8, 84) .topLeft .scale(100) .trans(0) scoreStrPicCmd
            }

            //----------------------------
            //掛ける
            @key.input .dst(input) {
                .up
            }
            @if input != 0 bl {
                //パンチ
                tm1 = rnd(85, 95)
                @se.play "voice_ora1" .opt(100, tm1, 50)
                @wait(1)
                @pic.move[PIC_PUNCH] .pos(500, 380) .bottomRight .scale(120) .trans(0)
                @wait(0)
                @pic.move[PIC_PUNCH] .pos(320, 240) .bottomRight .scale(100) .trans(0) .time(1)
                @wait(1)

                //何も出ていない
                @if fieldMedal <= 0 bl {
                    @pic.move[PIC_PUNCH] .pos(500, 380) .bottomRight .scale(120) .trans(0) .time(2)
                    @wait(2)

                //開始する
                } .else bl {
                    @se.play "Explosion7" .opt(100, 100, 50)
                    @se.play "money2" .opt(100, 80, 50)
                    @scr.shake .once(2) .value(5, 5)

                    //----------------------------
                    //ピクチャを散らす
                    $pictureNum = (25)//これがあるので、メダルのピクチャは連番でないといけない
                    $hidePictureNum = (25)
                    $moveAmount = (320)
                    $moveTime = (4)
                    $randX = (32)
                    $randY = (MEDAL_SET_5 * MEDAL_HEIGHT / 2)
                    $pocketHeight = 128

                    //散らす角度
                    ang = 0
                    //散らす数
                    tm2 = min( fieldMedal / MEDAL_SET_50, SCATTER_MAX )
                    //散らす範囲
                    tm3 = -1 * nowMedal50 * MEDAL_SET_5 * MEDAL_HEIGHT

                    @loop tm2 .dst(pid) {
                        pid += PIC_SCATTER_1
                        ax = MEDAL_BASE_X + rnd( -$randX, $randX )
                        ay = MEDAL_BASE_Y + rnd( $randY, tm3 + $randY )
                        @pic.move[pid] .pos(ax, ay) .center .scale(100) .trans(0) 
                    }

                    @wait(0)

                    @loop tm2 .dst(pid) {
                        pid += PIC_SCATTER_1
                        ang += rnd(90, 135)
                        ax = cos(ang, 1, $moveAmount) + 160
                        ay = sin(ang, 1, $moveAmount) + 120
                        @pic.move[pid] .pos(ax, ay) .center .scale(100) .scale(100) .trans(100) .time($moveTime)

                    }

                    //積んでいるピクチャもふっとばす
                    @loop $pictureNum .dst(pid) {
                        pid += PIC_MEDAL_50
                        ang += rnd(90, 135)
                        //ピクチャの座標がゼロでなければあると判断する
                        @pic.getInfo[pid] .currentRect(ax, ay, 0, 0) .xywh
                        @if ax != 0 bl {
                            ax = cos(ang, 1, $moveAmount) + 160
                            ay = sin(ang, 1, $moveAmount) + 120
                            @pic.move[pid] .pos(ax, ay) .center .scale(100) .trans(100) .time($moveTime)
                        }
                    }

                    @wait($moveTime)

                    //腕を引っ込める
                    @pic.move[PIC_PUNCH] .pos(500, 380) .bottomRight .scale(120) .trans(0) .time(2)

                    //----------------------------
                    //風向きをリセットする
                    @if windDir != 0 bl {
                        windDir = 0
                        @pic.show [PIC_WINDDIR] .cell(2) .rgbs(200, 200, 200, 100) windPicCmd
                        @pic.move [PIC_WINDDIR] .relative .pos(0, 0) .scale(0) .trans(0) .rgbs(100, 100, 100, 100) .time(2)
                    }

                    //----------------------------
                    //メダルが降る位置は少し偏る
                    //コンボを繋ぐほど外れやすくなる
                    //虹が出ている時は以上のペナルティは無くなる
                    @if `rnd(0, COMBO_MAX) < comboBonus && bonusBowChance <= 0 bl {
                        dropBias = rnd(0, 1)
                        dropBias = (packetPos + dropBias + PACKET_MAX_X / 2) % PACKET_MAX_X

                    } .else bl {
                        dropBias = rnd(0, PACKET_MAX_X - 1)
                    }

                    //落下位置と穴の中心位置が端の方で一致すると音が鳴る
                    @if `dropBias == packetPos && (dropBias <= 0 || dropBias >= PACKET_MAX_X - 1) bl {
                        @se.play "Magic2" .opt(100, 100, 50)
                        @scr.flash .once(2) .rgbv(31, 31, 31, 31)
                        @wait(4)
                    }

                    //抽選開始
                    pid = PIC_MEDAL_1
                    @loop fieldMedal .dst(tm1) bl {
                        //左右入力を受け付ける
                        @key.input .dst(input) {
                            .left
                            .right
                        }

                        @if input == KEY_LEFT bl {
                            tm2 = -1
                        } .elif input == KEY_RIGHT bl {
                            tm2 = 1
                        } .else bl {
                            tm2 = 0
                        }

                        //風見鶏の向きが変わる
                        @if `windDir != tm2 bl {
                            windDir = tm2

                            tm2 = windDir + 2
                            @pic.show [PIC_WINDDIR] .cell(tm2) .rgbs(200, 200, 200, 100) windPicCmd
                            @pic.move [PIC_WINDDIR] .relative .pos(0, 0) .scale(0) .trans(0) .rgbs(100, 100, 100, 100) .time(2)
                        }

                        //落下位置
                        //0.40*1/3+0.60*1/7
                        //約22%の確率で指定された場所に落ちる
                        //確率操作抜きで14%だと考えると、地味な偏りかもしれない
                        $rate = 40
                        $range = 1
                        dropPos = rnd(0, 99) < $rate ? (dropBias + rnd(-$range, $range)) : (rnd(0, PACKET_MAX_X - 1))
                        dropPos = clamp(dropPos, 0, PACKET_MAX_X - 1)

                        //ピクチャ番号
                        pid += 1
                        @if pid >= PIC_MEDAL_1 + MEDAL_MAX_1 bl {
                            pid = PIC_MEDAL_1
                        }

                        //ピクチャ設置
                        ang = rnd(0, 360)
                        ax = 160 + (dropPos - 3) * PACKET_WIDTH
                        ay = -16
                        @pic.move[pid] .pos(ax, ay) .center .scale(100) .trans(-300) .angle(ang, 1)
                        @wait(0)

                        //風向きで落下位置が変わる
                        @if `windDir != 0 bl { 
                            tm2 = 1
                            dropPos = clamp(dropPos + windDir * tm2, 0, PACKET_MAX_X - 1)
                        }

                        //ピクチャ移動開始
                        ax = 160 + (dropPos - 3) * PACKET_WIDTH
                        ay = $pocketHeight
                        @pic.move[pid] .pos(ax, ay) .center .scale(100) .trans(100) .angle(ang, 1) .time(1)
                        @wait(0)

                        //カウンター
                        tm2 = fieldMedal - tm1 - 1
                        @pic.strpic [PIC_SCORE_BET] __str("\c[7]\", tm2) .pos(SCORE_BET_X, SCORE_BET_Y) .top .scale2(200, 300) .trans(0) scoreStrPicCmd
                        @pic.move [PIC_SCORE_BET] .pos(SCORE_BET_X, SCORE_BET_Y) .top .scale2(100, 100) .trans(0) .time(1)

                        //効果音
                        tm2 = rnd(12, 13) * 10
                        @se.play "flipper2" .opt(80, tm2, 50)

                        //当たり穴に入った
                        $half = (PACKET_SIZE / 2)
                        @if `between(dropPos, packetPos - $half, packetPos + $half) &&
                            between(dropPos, 0, PACKET_MAX_X - 1) bl {
                            
                            //変数位置
                            tm2 = dropPos - (packetPos - $half) + __id(pocket0)
                            //ピクチャ番号
                            tm3 = dropPos - (packetPos - $half) + PIC_SCORE_PAC

                            //穴のカウンターを更新する
                            //中心ならば5倍、その隣は1倍、それ以外は0倍
                            @if dropPos == packetPos bl {
                                v[tm2] += 5
                            } .else bl {
                                v[tm2] += 1
                            }

                            ax = ax
                            ay = $pocketHeight
                            @pic.strpic [tm3] __str("\c[7]\v[\", tm2,"]") .pos(ax, ay) .center .scale2(200, 50) .trans(0) scoreStrPicCmd
                            @pic.move [tm3] .pos(ax, ay) .center .scale2(100, 100) .trans(0) .time(1)
                            @se.play "money2" .opt(100, 180, 50)
                        }
                    }
                    @wait(1)

                    //カウンターを削除
                    @pic.erase [PIC_SCORE_BET] 

                    //----------------------------
                    //集計
                    _getMedalMulti(tm1)
                    medalsWon = tm1 * (pocket0 + pocket1 + pocket2) / 100
                    @se.play "register" .opt(100, 100, 50)

                    //----------------------------
                    //コンボ判定
                    @if medalsWon > fieldMedal bl {
                        //コンボは最大100%
                        comboBonus = clamp(comboBonus + 2, 0, COMBO_MAX)

                        @pic.strpic [PIC_COMBO_POP] __str("\c[2]COMBO!! \", comboBonus,"%") .pos(SCORE_MULTI_X, SCORE_MULTI_Y - 24) .topRight .scale(100) .trans(-300) scoreStrPicCmd
                        @pic.move [PIC_COMBO_POP] .pos(SCORE_MULTI_X, SCORE_MULTI_Y - 24 - 16) .topRight .scale(100) .trans(100) .time(15)

                        @se.play "Item1" .opt(100, 130, 50)
                        @scr.flash .once(3) .rgbv(31, 31, 31, 31)

                    //持ち分が減るとコンボが途切れる
                    } .else bl {
                        comboBonus = 0
                    }

                    //----------------------------
                    //200枚賭けて、2倍以上増えたとき
                    @if `fieldMedal >= 200 && medalsWon >= fieldMedal * 2 bl {
                        //1/8の確率で虹が出る
                        //虹の持続は3,4回
                        @if `rnd(0, 7) == 0 bl {
                            bonusBowChance = rnd(3, 4) + 1

                            @pic.move[PIC_BIGBOW] .pos(0, 0) .topLeft .scale(100) .trans(0) .time(4)
                        }

                        //立ち絵を表示する
                        portraitFlg = TRUE

                        @pic.move[PIC_PORTRAIT] .pos(64, 64) .topLeft .scale(80) .trans(100) .time(0)
                        @wait(0)
                        @pic.move[PIC_PORTRAIT] .pos( 0,  0) .topLeft .scale(100) .trans(0) .time(2)
                        @wait(0)
                    }

                    //----------------------------
                    //七色カウンター + メダルの雨
                    @pic.strpic [PIC_SCORE_WON] __str("\c[7]\", medalsWon) .pos(160, 80) .center .scale2(200, 200) .trans(0) scoreStrPicCmd
                    @pic.move [PIC_SCORE_WON] .pos(160, 110) .center .scale2(400, 400) .trans(0) .time(1)
                    @wait(1)
                    @pic.move [PIC_SCORE_WON] .pos(160, 120) .center .scale2(600, 600) .trans(0) .time(1)

                    //稼ぎに応じて降り注ぐ
                    //25枚につき1回、3f
                    tm1 = min(medalsWon / 25, 60)
                    //点滅用カウンタ
                    tm2 = 0
                    tm3 = 0

                    pid = PIC_SCATTER_1
                    @loop tm1 {
                        //ピクチャ番号
                        pid += 1
                        @if pid >= PIC_SCATTER_1 + SCATTER_MAX bl {
                            pid = PIC_SCATTER_1
                        }

                        //ピクチャ設置
                        ang = rnd(-90,90)
                        ax = rnd(64, 320 - 64)
                        ay = -64

                        //メダルを虹色にする
                        tm3 = rnd(0, 5)
                        _setRainbowColor(tm3, 200, 100)

                        //ピクチャの移動中にさらに動かすと初期位置がずれるので、二重に掛けて一瞬だけ透明化する
                        @pic.move[pid] .pos(0, 0) .scale(100) .trans(100)
                        @wait(0)
                        @pic.move[pid] .pos(ax, ay) .scale(100) .angle(ang, 1) .trans(0) .rgbs(red, green, blue, sat)
                        @wait(0)

                        //ピクチャ移動開始
                        ax += rnd(-32, 32)
                        ay = 240 + 32

                        @pic.move[pid] .pos(ax, ay) .scale(100) .trans(0) .angle(ang, 1) .time(3)
                        @wait(0)

                        //降り注いでいる間は数値が輝く
                        tm2 += 1
                        @if `tm2 % 2 == 0 bl {
                            tm3 = (tm2 / 2) % 6
                            _setRainbowColor(tm3, 100, 50)

                            @pic.move [PIC_SCORE_WON] .relative .pos(0, 0) .scale(0) .trans(0) .rgbs(red, green, blue, sat)
                        }

                        //効果音
                        @se.play "money2" .opt(100, 100, 50)
                    }
                    @wait(4)

                    //ピクチャ消去
                    @pic.erase [PIC_SCORE_PAC..PIC_SCORE_PAC + PACKET_SIZE - 1]

                    //----------------------------
                    //加えに行く
                    @pic.move [PIC_SCORE_WON] .pos(SCORE_OWN_X, SCORE_OWN_Y) .topRight .scale2(100, 100) .trans(0) .rotate(6) .keepRgbs .time(2)
                    @wait(2)
                    @pic.erase [PIC_SCORE_WON]

                    //加算される速さは稼いだ量に関わらずほぼ一定
                    tm1 = clamp(medalsWon / 20, 1, MEDAL_MAX)
                    tm2 = medalsWon
                    @while tm2 > 0 {
                        @wait .frame(2)

                        @if tm2 < tm1 bl {
                            rainbowMedalNum += tm2
                            tm2 = 0

                        } .else bl {
                            rainbowMedalNum += tm1
                            tm2 -= tm1
                        }

                        //メダル所有数のリミッター
                        rainbowMedalNum = min(rainbowMedalNum, MEDAL_MAX)

                        @pic.strpic [PIC_SCORE_OWN] __str("\", rainbowMedalNum) .pos(SCORE_OWN_X, SCORE_OWN_Y) .topRight .scale2(300, 400) .trans(0) scoreStrPicCmd
                        @pic.move [PIC_SCORE_OWN] .pos(SCORE_OWN_X, SCORE_OWN_Y) .topRight .scale2(200, 200) .trans(0) .time(1)

                        @se.stop
                        @se.play "money1" .opt(100, 100, 50)
                    }

                    //----------------------------
                    //ボーナス虹を消す
                    @if bonusBowChance > 0 bl {
                        bonusBowChance -= 1

                        @if bonusBowChance <= 0 bl {
                            @pic.move[PIC_BIGBOW] .pos(0, 0) .topLeft .scale(100) .trans(100) .time(4)
                        }
                    }

                    //----------------------------
                    //立ち絵を消す
                    @if portraitFlg == TRUE bl {
                        portraitFlg = FALSE

                        @pic.move[PIC_PORTRAIT] .pos(-64,  -32) .topLeft .scale(150) .trans(100) .time(2)
                    }

                    //----------------------------
                    //初期化
                    @loop $hidePictureNum .dst(pid) {
                        pid += PIC_MEDAL_50
                        hidePicture(pid)
                    }
                    @wait(0)

                    v[__id(pocket0)..__id(pocket2)] = 0
                    fieldMedal = 0
                    medalsWon  = 0
                    betBonus   = 0
                    nowMedal1  = 0
                    nowMedal5  = 0
                    nowMedal50 = 0

                    //スコアを更新する
                    bitOn(changedFlag, BIT_UPDATE_OWN | BIT_UPDATE_MULTI | BIT_CHECK_ACHIEVEMENT)
                }
            }
        }
    }

    //----------------------------
    //終了する
    @label.set "gameEnd"
    bl {
        //場にあるメダルを回収する
        rainbowMedalNum = min(rainbowMedalNum + fieldMedal, MEDAL_MAX)

        initPicturesAndVariables(PIC_HEAD, NUM_OF_PIC, TV_MINIGAME, NUM_OF_VAR, 0, 0)
        fastFadeInTintOnly(1)
    }
}