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


cev[CEV_OPPAI_CARD] .name("mg_おっぱいカード") {

    def {
        NUM_OF_VAR = 32
        NUM_OF_STR = 0
        NUM_OF_PIC = 4

        BASE_LAYER = 6

        PATH_CARD = "oc\ca"

        PIC_HEAD = 1
        PIC_TEXT = 2
        PIC_CARD = 3
        PIC_PART = 4

        //カードタイプ
        CARD_TYPE_WATER3 = 0
        CARD_TYPE_RICE
        CARD_TYPE_ALRAUNE
        CARD_TYPE_ERORIA
        CARD_TYPE_EMARI
        CARD_TYPE_ALEX
        CARD_TYPE_NUM

        //定数
        UNIT_POS = 10
        UNIT_ANG = 10
        CENTER_X = 160
        CENTER_Y = 120
        SLIDE_AMOUNT = 18
        SLIDE_SPEED  = 8

        ACHIEVE_OPPAI = 200
    }

    def {
        basePicCmd = bl {
            .chromakey(1)
            .mapLayer(BASE_LAYER)
            .eraseWhenTransfer
            .affectedByFlash
            .affectedByShake            
        }

        baseStrPicCmd = bl {
            .font("", 12)
            .spacing(0, 4)
            .skin ""
            basePicCmd
        }

        cardPicCmd = bl {
            PATH_CARD
            .grid(4, 3)
            basePicCmd
        }

    }

    defv {
        varHead = TV_MINIGAME

        input
        inputD

        cardType
        cardFlg

        cardPId
        cardCell
        cardX
        cardY
        cardVx
        cardVy
        cardTx
        cardTy

        partPId
        partCell
        partAng
        partX
        partY
        partVx
        partVy
        partSx
        partSy
        partSfX
        partSfY

        shakeCount

        oldVx
        oldVy
        ax
        ay

        varFoot

    }

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

    //------------------------------------------------------------------------------------
    //開始処理
    bl {
        initPicturesAndVariables(PIC_HEAD, NUM_OF_PIC, TV_MINIGAME, NUM_OF_VAR, 0, 0)
        msgBottom()
        @scr.tint .rgbs(50, 50, 50, 100) .time(1)
        @label.jump "gameLoop"
    }

    //------------------------------------------------------------------------------------
    //ゲーム処理
    @label.set "gameLoop"
    bl {
        //----------------------------
        //説明文
        @pic.strpic [PIC_TEXT] "\c[2]矢印\c[0]:動かす  \c[2]Z\c[0]:変える  \c[2]X\c[0]:終了" .pos(WINDOW_WIDTH / 2, WINDOW_HEIGHT) .bottom baseStrPicCmd
        //カードの種類
        cardType = CARD_TYPE_WATER3
        cardFlg = TRUE
        //決定キーの入力を抑える
        inputD = 2

        //----------------------------
        //ループ
        @loop bl {
            @wait(0)
            //----------------------------
            //実績
            checkSetAchievement(achievedOppai, shakeCount >= ACHIEVE_OPPAI)
            //----------------------------
            //入力状態を取得
            @key.input .dst(input) {
                .decision
                .cancel
            }
            //他のカードに変える
            inputD = input == KEY_DECISION ? inputD + 1 : 0
            @if inputD == 1 bl {
                @se.play "Bow2" .opt(80, 120, 50)
                cardType = (cardType + 1) % CARD_TYPE_NUM
                cardFlg = TRUE
            }
            //終了
            @if input == KEY_CANCEL bl {
                @se.play "Cancel2" .opt(100, 100, 50)
                @label.jump "gameEnd"
            }
            //上下左右
            V2_getInput(ax)
            V2_set(cardTx,
                (CENTER_X + ax * SLIDE_AMOUNT) * UNIT_POS,
                (CENTER_Y + ay * SLIDE_AMOUNT) * UNIT_POS
            )

            //----------------------------
            //カードを初期化する
            @if `cardFlg bl {
                cardFlg = FALSE
                //タイプ別
                cardPId  = [PIC_CARD, PIC_CARD, PIC_CARD, PIC_CARD, PIC_PART, PIC_CARD][cardType]
                partPId  = [PIC_PART, PIC_PART, PIC_PART, PIC_PART, PIC_CARD, PIC_PART][cardType]
                cardCell = [  1,  3,  5,  7,  9, 11][cardType]
                partCell = [  2,  4,  6,  8, 10, 12][cardType]
                partSfX  = [  0,  0,  0,-16,  0,  0][cardType] * UNIT_POS
                partSfY  = [ 36,  8, 32, 32,  0,  0][cardType] * UNIT_POS
                //共通
                V2_set(cardX,  CENTER_X * UNIT_POS, CENTER_Y * UNIT_POS)
                V2_copy(cardTx, cardX)
                V2_set(cardVx, 0, 0)
                V2_copy(partX, cardX)
                V2_set(partVx, 0, 0)
                V2_set(partSx, 100, 100)
                partAng = 0

                //ピクチャを設置する
                V2_divScalar(ax, cardX, UNIT_POS)
                @pic.show [cardPId] .pos(ax, ay) .center .scale2(100, 100) .trans(0) .cell(cardCell) cardPicCmd
                V2_add(ax, partX, partSfX)
                V2_asDivScalar(ax, UNIT_POS)
                @pic.show [partPId] .pos(ax, ay) .center .scale2(partSx, partSy) .trans(0) .cell(partCell) cardPicCmd
            }

            //----------------------------
            //下地
            V2_sub(ax, cardTx, cardX)
            updateSpeedToApproach(cardVx, ax, cardVx, SLIDE_SPEED)
            updateSpeedToApproach(cardVy, ay, cardVy, SLIDE_SPEED)
            V2_asAdd(cardX, cardVx)
            V2_divScalar(ax, cardX, UNIT_POS)
            @pic.move [cardPId] .pos(ax, ay) .scale(100) .trans(0)

            //----------------------------
            //可動部
            //ax,ay:可動部ピクチャの位置

            //パーツと原点の距離
            V2_sub(ax, cardX, partX)
            //前回の速度を記録
            V2_copy(oldVx, partVx)
            //ウォーター3
            @if cardType == CARD_TYPE_WATER3 bl {
                //速度を更新
                V2_set(partVx,
                    partVx * 5 / 6 + ax / 4,
                    partVy * 5 / 6 + ay / 4
                )

                //パーツの位置を更新
                V2_asAdd(partX, partVx)
                //左右や下に移動すると伸びる
                V2_set(partSx,
                    100 + abs(ax / 8),
                    100 + max(ay / -4, 0)
                )
                //速度が極端に変わると音が鳴る
                @if `( oldVx * partVx < 0 && abs( oldVx - partVx ) > 10 ) || ( oldVy * partVy < 0 && abs( oldVy - partVy ) > 10 ) bl {
                    @se.play "bubble1" .opt(50, 100, 50)
                    shakeCount += 1
                }
                //ピクチャの位置
                V2_copy(ax, partX)

            //ライスパーク
            } .elif cardType == CARD_TYPE_RICE bl {
                V2_set(partVx,
                    partVx * 3 / 6 + ax / 3,
                    partVy * 5 / 6 + ay / 3
                )
                V2_asAdd(partX, partVx)
                partAng = ay / 5 * UNIT_ANG

                @if `oldVy * partVy < 0 && abs(oldVy - partVy) > 12 bl {
                    @se.play "bubble1" .opt(50, 120, 50)
                }

                V2_copy(ax, partX)

            //アルラウネ
            } .elif cardType == CARD_TYPE_ALRAUNE bl {
                V2_set(partVx,
                    partVx * 8 / 9 + ax / 6,
                    partVy * 7 / 8 + ay / 4
                )
                V2_asAdd(partX, partVx)
                V2_set(partSx,
                    100 + ay / 10,
                    100 + ay / 10
                )
                partAng = partVx / 3 * UNIT_ANG

                @if `(oldVx * partVx < 0 && abs(oldVx - partVx) > 15) || (oldVy * partVy < 0 && abs(oldVy - partVy) > 15) bl {
                    @se.play "bubble1" .opt(50, 80, 50)
                    shakeCount += 1
                }
                
                V2_set(ax,
                    cardX,
                    partY - abs(partAng) / 6
                )

            //エロリア
            } .elif cardType == CARD_TYPE_ERORIA bl {
                V2_set(partVx,
                    partVx * 9 / 10 + ax / 2,
                    partVy * 9 / 10 + ay / 2
                )
                V2_asAdd(partX, partVx)
                V2_set(partSx,
                    100,
                    100 + max(ay / -4, 0)
                )

                @if `oldVy * partVy < 0 && abs(oldVy - partVy) > 5 bl {
                    @se.play "bubble1" .opt(30, 140, 50)
                    shakeCount += 1
                }

                V2_copy(ax, partX)

            //エマリー
            } .elif cardType == CARD_TYPE_EMARI bl {

                
                @if `ay > 16 * UNIT_POS bl {
                    partY = cardY - 16 * UNIT_POS

                    @if `cardVy - partVy > 10 bl {
                        @se.play "con2" .opt(40, 120, 50)
                        shakeCount += 1
                    }

                    partVy = max(cardVy - partVy, cardVy)

                } .elif `ay < - 16 * UNIT_POS bl {
                    partY = cardY + 16 * UNIT_POS

                    @if `cardVy - partVy < -10 bl {
                        @se.play "con2" .opt(100, 60, 50)
                        shakeCount += 1
                    }

                    partVy = min(cardVy - partVy, cardVy)

                } .else bl {
                    partVy = partVy * 9 / 10 + cardVy / 8
                }

                V2_copy(ax, partX)

                //X軸は動かない
                partX = cardX
                partY += partVy

            //アレックス
            } .elif cardType == CARD_TYPE_ALEX bl {
                V2_set(partVx,
                    partVx *  4 /  5 + ax / 6,
                    partVy * 19 / 20 + ay / 6
                )

                V2_asAdd(partX, partVx)

                V2_set(partSx,
                    100 - ay / 10,
                    100 - ay / 10
                )

                partAng = ax / 3 * UNIT_ANG
                partY = max(partY, cardY - 16 * UNIT_POS)

                @if `partVy > 0 && oldVy < 0 && abs(oldVy - partVy) > 20 bl {
                    @se.play "Slash7" .opt(80, 100, 50)
                    shakeCount += 1
                }

                V2_copy(ax, partX)
            }

            //パーツのピクチャを更新する
            V2_asAdd(ax, partSfX)
            V2_asDivScalar(ax, UNIT_POS)

            //.scale2を使うものと.angleを使うものに分かれる
            @if `partAng != 0 bl {
                @pic.move [partPId] .pos(ax, ay) .scale(partSx) .trans(0) .angle(partAng, UNIT_ANG)
            } .else bl {
                @pic.move [partPId] .pos(ax, ay) .scale2(partSx, partSy) .trans(0)
            }
        }
    }

    //------------------------------------------------------------------------------------
    //終了する
    @label.set "gameEnd"
    bl {
        initPicturesAndVariables(PIC_HEAD, NUM_OF_PIC, TV_MINIGAME, NUM_OF_VAR, 0, 0)
        @scr.tint .rgbs(100, 100, 100, 100) .time(1) .wait
    }
}