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

//map id
def parentMap = MAP_RELAY

//event id
def {
    MEV_AUTO = 1
    MEV_THEATER_THREAD
    MEV_THEATER
    MEV_ALEX
    MEV_GOMEZ
    MEV_SPIN_LEFT
    MEV_SPIN_MIDDLE
    MEV_SPIN_RIGHT
}

//const
def {
    PATH_ACTOR = "pb_theater"
    PATH_IMAGE = "pb\bi__"

    MAX_THATER = 11
    MAX_IMAGE = 6

    PIC_IMAGE = 1//祝い画像
    PIC_RANKING//ランキング
}

defv {
    recordBreak = TV_MEV_1
}

deft {
    rankingStr = TS_MEV_1
    pbCurrentScoreStr
    pbBestScoreStr
    pbCurrentTimeStr
    pbBestTimeStr
}

//アーケードマップへ移動する
__fn _goToArcadeMap bl {
    @map[MAP_ARCADE].setPlayerPos .pos(4,22) .up
}

//--------------------------------
//auto
mev[MEV_AUTO] .map(parentMap) .name("auto") .pos(1,0)
mep[1] .auto bl {
    //変数の使用範囲を表示する
    commentRangeOfVariables(varFoot, TV_PINBALL, NUM_OF_VAR, NUM_OF_STR, NUM_OF_PIC)

    //スコアの登録と更新判定
    @if pbGameStart.isOff bl {
        //景品受け取りフラグ
        gotPinballPrize.off
        
        //スコアを移植する
        pbCurrentScore = score
        pbCurrentTime  = gameTimer

        //更新判定
        //スコアが並ぶと時間で比較する
        recordBreak = (pbCurrentScore > pbBestScore || (pbCurrentScore == pbBestScore && pbCurrentTime < pbBestTime)) ? TRUE : FALSE

        //実績
        checkSetAchievement(achievedPinballer1, pbCurrentScore >= ACHIEVE_SCORE_1)
        checkSetAchievement(achievedPinballer2, pbCurrentScore >= ACHIEVE_SCORE_2)
        checkSetAchievement(achievedPinballer3, pbCurrentScore >= ACHIEVE_SCORE_3)
    }

    //変数を初期化する
    initPicturesAndVariables(PIC_HEAD, NUM_OF_PIC, TV_PINBALL, NUM_OF_VAR, TS_MINIGAME, NUM_OF_STR)
    //ビデオゲームに使う変数も初期化する
    initPicturesAndVariables(0, 0, TV_MINIGAME, 30, 0, 0)
    //BGMを止める
    stopBGM()

    //ゲーム開始
    @if pbGameStart.isOn bl {
        @label.jump "startGame"
    //ゲーム終了 or 再開
    } .elif pbFirstPlay.isOn bl {
        @label.jump "afterFirstPlay"
    //結果を表示する
    } .else bl {
        @label.jump "showResult"
    }

    //--------------------------------
    //最初にゲームをプレイした時
    @label.set "afterFirstPlay"
    bl {
        //記録を無条件で更新する
        pbCurrentScore.copy(pbPreviousScore, 3)
        pbCurrentScore.copy(pbBestScore, 3)
        //結果表示なしでアーケードマップへ移動する
        @label.jump "gotoArcade"
    }
    @ev.abort

    //--------------------------------
    //ゲームの結果を表示する
    @label.set "showResult"
    bl {
        //変数はscore, time, titleの順に並んでいる
        //ピクチャを用意する
        @if `recordBreak bl {
            @pic[PIC_IMAGE].show {
                PATH_IMAGE .repl(2, pbRecordBreakPattern)
                .pos(-320, 0) .topLeft
                .chromakey(1)
                .scale(100)
                .trans(0)
                .rgbs(100, 100, 100, 100)
                .mapLayer(LAY_UI)
                .eraseWhenTransfer
                .affectedByTint
                .affectedByFlash
                .affectedByShake
            }

            //次の画像番号を指定する
            pbRecordBreakPattern = (pbRecordBreakPattern + 1) % MAX_IMAGE

        //アレックスとゴメス
        } .else bl {
            //演出のパターンを進める
            pbTheaterPattern = (pbTheaterPattern + 1) % MAX_THATER
        }

        //ランキングリスト
        pbGetRankingStr(__id(rankingStr), 3)

        @pic[PIC_RANKING].strpic {
            rankingStr
            .pos(0, 0) .topLeft
            .size(0, 0) .chromakey(1)
            .scale2(100, 10)
            .trans(100)
            .rgbs(100, 100, 100, 100)
            .font("", 12)
            .spacing(0, 4)
            .skin "" .nobg .noframe
            .mapLayer(LAY_UI)
            .eraseWhenTransfer
            .affectedByTint
            .affectedByFlash
            .affectedByShake
        }

        //表示準備
        @map.parallax "ranking" .hscroll(2) .vscroll(2)
        @player.trans .on

        //少しだけ待つ
        @wait .frame(5)

        //画面を表示する
        fastFadeIn(1)

        //スコア更新演出
        @if `recordBreak bl {
            @pic[PIC_IMAGE].move {
                .pos(0, 0) .topLeft
                .scale(100)
                .trans(0)
                .time(6) .wait
                .keepRgbs
            }

            @scr.flash .once(2) .rgbv(31, 31, 31, 31)
            @se.play "Holy5" .opt(100, 100, 50)

            //メッセージを作成する
            //空白を挿入したい
            pbCurrentScoreStr.asg(pbCurrentScore)
            pbCurrentScoreStr.asg(pbCurrentScoreStr .min(8))

            pbBestScoreStr.asg(pbBestScore)
            pbBestScoreStr.asg(pbBestScoreStr .min(8))

            getTimerString(0, __id(pbCurrentTimeStr), pbCurrentTime)
            getTimerString(0, __id(pbBestTimeStr), pbBestTime)

            @msg.show __str("\>ハイスコアだ！！！！やったな！！！！", NEWLINE,
"\>\c[0]SCORE: \c[2]   \", pbCurrentScoreStr, "\c[0] $v \c[5]   \", pbBestScoreStr, "\c[0]", NEWLINE,
"\>\c[0]TIME : \c[2]   \", pbCurrentTimeStr, "\c[0] $v \c[5]   \", pbBestTimeStr, "\c[0]")

            //ピクチャを暗くする
            @pic[PIC_IMAGE].move {
                .pos(0, 0) .topLeft
                .scale(100)
                .trans(0)
                .time(2)
                .rgbs(60,60,60,100)
            }
        }

        //ランキングを表示する
        @pic[PIC_RANKING].move {
            .pos(0, 0) .topLeft
            .scale2(100, 100)
            .trans(0)
            .time(1)
            .keepRgbs
        }

        //記録を更新する
        pbCurrentScore.copy(pbPreviousScore, 3)
        @if `recordBreak bl {
            pbCurrentScore.copy(pbBestScore, 3)
        }

        //文字列を初期化する
        assignStrUsingDeclared(rankingStr, pbBestTimeStr, "")

        //選択肢
        @msg.show "\>もう一度遊ぶ？"
        @msg.choice {
            .cancel(1)
            .case "\>遊ぶ" {
                @wait(2)
                @label.jump "startGame"
            }
            .case "\>遊ばない" {
                @wait(2)
                @label.jump "gotoArcade"
            }
        }
    }
    @ev.abort

    //--------------------------------
    //ゲームセンターへ移動する
    @label.set "gotoArcade"
    bl {
        @scr.hide(FADE_FLASH)
        _goToArcadeMap()
    }
    @ev.abort

    //--------------------------------
    //ゲームを開始する
    @label.set "startGame"
    bl {
        @scr.hide(FADE_FLASH)

        pbGameStart.off

        //プレイ回数を追加する
        pbPlayCount += 1
        //スコアを初期化
        v[__id(pbCurrentScore)..__id(pbCurrentParam)] = 0
        //初期残機数
        chance = INITAL_CHANCE
        //初期マルチプライヤ
        multiplier = 1
        //ゲーム開始シーン
        changeSceneState(SC_ST_ENTER)
        //マップ移動
        goToPinballStage(MAP_MAINSTAGE)
    }
    @ev.abort
}

//--------------------------------
//キャラクター
//標準速度、足踏みなし
mev[MEV_ALEX] .name("alex") .pos(1,1) {}
mep .action(.speed(4)) .id(1) {}

mev[MEV_GOMEZ] .name("gomez") .pos(2,1) {}
mep .action(.speed(4)) .id(1) {}

//標準速度、足踏みあり、回転アニメ
mev[MEV_SPIN_LEFT] .name("spin left") .pos(3,1) {}
mep .action(.speed(4)) .pattern(.left) .anim(.spin) .id(1) {}

mev[MEV_SPIN_MIDDLE] .name("spin middle") .pos(4,1) {}
mep .action(.speed(4)) .pattern(.middle) .anim(.spin) .id(1) {}

mev[MEV_SPIN_RIGHT] .name("spin right") .pos(5,1) {}
mep .action(.speed(4)) .pattern(.right) .anim(.spin) .id(1) {}

//--------------------------------
//動作指定
__fn _setAlexAndGomez $aX $aY $aP $aF  $gX $gY $gP $gF {
    @ev[MEV_ALEX].setPos .pos($aX, $aY) $aF
    @ev[MEV_GOMEZ].setPos .pos($gX, $gY) $gF
    @wait(0)

    @ev[MEV_ALEX].setAction .freq(8) .act {
        .fixDir
        .beginThrough
        .setBody(PATH_ACTOR, $aP)
    }
    @ev[MEV_GOMEZ].setAction .freq(8) .act {
        .fixDir
        .beginThrough
        .setBody(PATH_ACTOR, $gP)
    }

    @wait(0)

}

def THEATER_EVENT_ARR = [bl {
        @comment "疲れた"
        _setAlexAndGomez(10, 5, 0, .up,  9, 6, 5, .up)
    },
    bl {
        @comment "通常掘り"
        _setAlexAndGomez(10, 5, 0, .up,  10, 7, 4, .up)

        @ev[MEV_GOMEZ].setAction .freq(8) .repeat .act {
            .moveUp
            .moveDown
        }
    },
    bl {
        @comment "画面端掘り"
        _setAlexAndGomez(19, 5, 0, .left,  1, 5, 4, .left)

        @ev[MEV_GOMEZ].setAction .freq(8) .repeat .act {
            .moveLeft
            .moveRight
        }
    },
    bl {
        @comment "一人輪姦"
        _setAlexAndGomez(10, 5, 0, .left,  10, 7, 4, .up)

        @wait(0)

        @ev[MEV_ALEX].setAction .freq(4) .repeat .act {
            .turnRight
        }
        @ev[MEV_GOMEZ].setAction .freq(8) .repeat .act {
            .moveUp
            .speedUp
            .moveLowerLeft
            .faceRight
            .moveLeft
            .speedDown
            .moveRight
            .speedUp
            .moveUpperRight
            .faceDown
            .moveUp
            .speedDown
            .moveDown
            .speedUp
            .moveLowerRight
            .faceLeft
            .moveRight
            .speedDown
            .moveLeft
            .speedUp
            .moveUpperLeft
            .faceUp
            .moveDown
            .speedDown
        }
    },
    bl {
        @comment "ピングポング掘り"

        _setAlexAndGomez(10, 5, 0, .up,  9, 8, 4, .up)

        @ev[MEV_ALEX].setAction .freq(8) .repeat .act {
            .pauseAnim
            .moveDown
            .faceLeft
            .moveUp
            .faceDown
            .moveUp
            .faceRight
            .moveDown
            .faceUp
        }

        @loop {
            @ev[MEV_GOMEZ].setPos .pos(9, 8)
            @ev[MEV_GOMEZ].setAction .freq(8) .act {
                .faceUp
                .moveUpperRight
                .moveLowerRight
            }
            @wait .frame(16)

            @ev[MEV_GOMEZ].setPos .pos(11, 3)
            @ev[MEV_GOMEZ].setAction .freq(8) .act {
                .faceDown
                .moveUpperLeft
                .moveLowerLeft
            }
            @wait .frame(16)
        }
    },
    bl {
        @comment "バトルドーム掘り"

        _setAlexAndGomez(11, 6, 0, .up,  10, 9, 4, .up)

        @ev[MEV_ALEX].setAction .freq(8) .act {
            .speedUp
            .pauseAnim
        }
        @ev[MEV_GOMEZ].setAction .freq(8) .act {
            .speedUp
        }
        @wait(0)

        @ev[MEV_ALEX].setAction .freq(8) .repeat .act {
            .moveUpperLeft
            .faceRight
            .moveLowerLeft
            .moveLowerLeft
            .faceDown
            .moveUpperRight
            .moveUpperRight
            .faceLeft
            .moveLowerRight
            .moveLowerRight
            .faceUp
            .moveUpperLeft
        }

        @loop {
            @ev[MEV_GOMEZ].setPos .pos(10, 9)
            @ev[MEV_GOMEZ].setAction .freq(8) .skippable .act {
                .faceUp
                .moveUp
            }
            @wait .frame(8)
            @ev[MEV_GOMEZ].setPos .pos(6, 5)
            @ev[MEV_GOMEZ].setAction .freq(8) .skippable .act {
                .faceRight
                .moveRight
            }
            @wait .frame(8)
            @ev[MEV_GOMEZ].setPos .pos(10, 1)
            @ev[MEV_GOMEZ].setAction .freq(8) .skippable .act {
                .faceDown
                .moveDown
            }
            @wait .frame(8)
            @ev[MEV_GOMEZ].setPos .pos(14, 5)
            @ev[MEV_GOMEZ].setAction .freq(8) .skippable .act {
                .faceLeft
                .moveLeft
            }
            @wait .frame(8)
        }
    },
    bl {
        @comment "町の子供"

        _setAlexAndGomez(11, 6, 0, .right,  8, 4, 4, .left)

        @ev[MEV_ALEX].setAction .freq(8) .act {
            .speedUp
        }
        @ev[MEV_GOMEZ].setAction .freq(8) .act {
            .speedUp
        }
        @wait(0)

        @ev[MEV_ALEX].setAction .freq(8) .repeat .act {
            .faceLeft
            .moveLeft
            .moveLeft
            .moveLeft
            .faceUp
            .moveUp
            .moveUp
            .faceRight
            .moveRight
            .moveRight
            .moveRight
            .faceDown
            .moveDown
            .moveDown
        }
        @ev[MEV_GOMEZ].setAction .freq(8) .repeat .act {
            .faceRight
            .moveRight
            .moveRight
            .moveRight
            .faceDown
            .moveDown
            .moveDown
            .faceLeft
            .moveLeft
            .moveLeft
            .moveLeft
            .faceUp
            .moveUp
            .moveUp
        }
    },
    bl {
        @comment "ドン引き"

        _setAlexAndGomez(8, 5, 1, .up,  11, 5, 4, .left)

        @ev[MEV_ALEX].setAction .freq(5) .repeat .act {
            .turnRight
        }
    },
    bl {
        @comment "瞬間移動"

        _setAlexAndGomez(9, 5, 0, .down,  9, 5, 4, .up)

        @ev[MEV_ALEX].setAction .freq(8) .act {
            .speedUp
        }
        @ev[MEV_GOMEZ].setAction .freq(8) .act {
            .speedUp
        }
        @wait(0)

        @loop {
            // メインと重複すると危険
            defv {
                trX = TV_MEV_2
                trY
                trF
            }

            trX = rnd(7, 13)
            trY = 3 + rnd(0, 1) * 2
            trF = rnd(0, 1)
            @ev[MEV_ALEX].setPos .pos(trX, trY)
            @if trF == 0 {
                @ev[MEV_ALEX].setAction .freq(8) .act {
                    .faceDown
                    .moveRight
                    .moveRight
                }
            } .else bl {
                @ev[MEV_ALEX].setAction .freq(8) .act {
                    .faceUp
                    .moveLeft
                    .moveLeft
                }
            }
            @wait .frame(4)

            trX = rnd(7, 13)
            trY = 4 + rnd(0, 1) * 2
            trF = rnd(0, 1)
            @ev[MEV_GOMEZ].setPos .pos(trX, trY)
            @if trF == 0 {
                @ev[MEV_GOMEZ].setAction .freq(8) .act {
                    .faceUp
                    .moveLeft
                    .moveLeft
                }
            } .else bl {
                @ev[MEV_GOMEZ].setAction .freq(8) .act {
                    .faceDown
                    .moveRight
                    .moveRight
                }
            }
            @wait .frame(4)
        }
    },
    bl {
        @comment "逆転"

        _setAlexAndGomez(10, 5, 0, .down,  10, 6, 4, .down)

        @ev[MEV_ALEX].setAction .freq(8) .repeat .act {
            .moveUp
            .speedUp
            .moveDown
            .speedDown
        }

        @loop {
            @ev[MEV_GOMEZ].setPos .pos(10, 6)
            @wait .frame(10)

            @ev[MEV_GOMEZ].setAction .freq(8) .act {
                .pauseAnim
                .moveDown
            }
            @wait .frame(2)
        }
    },
    bl {
        @comment "餅つき"

        @ev[MEV_SPIN_LEFT].setPos .pos(8, 6) .up
        @ev[MEV_SPIN_MIDDLE].setPos .pos(9, 6) .up
        @ev[MEV_SPIN_RIGHT].setPos .pos(10, 6) .up
        @wait(0)

        __loop [MEV_SPIN_LEFT, MEV_SPIN_MIDDLE, MEV_SPIN_RIGHT] $mev {
            @ev[$mev].setAction .freq(8) .act {
                .setBody(PATH_ACTOR, 6)
            }
        }
    }
]

mev[MEV_THEATER_THREAD] .name("thater thread") .pos(2,0)
mep[1] .parallel bl {
    //2フレームだけ待つ
    @wait .frame(2)

    @if pbGameStart.isOn bl {
    } .elif pbFirstPlay.isOn bl {
    } .elif `recordBreak bl {
    } .else bl {
        //起動する
        localA = MEV_THEATER
        localB = pbTheaterPattern + 1
        @ev.call .mev(localA, localB)
    }
    @ev.erase
}

mev[MEV_THEATER] .name("thater") .pos(3,0)
__loop THEATER_EVENT_ARR $event $idx bl {
    mep {
        .id($idx + 1)
        .ev($event)
    }
}