/*
pF

u˃tOvɂ
 2i4rbg̃tOƂĎgpĂ܂B
 ʃrbguvuvuEvuv̕ǂӖAtOON(=1)ɂȂĂǂŔ˂܂B
 u=8vu=4vuE=2vu=1vƂāA˂ǂ̐v̂ɗ^ĂB
 Ⴆ4rbgׂĂONɂȂĂu15vƂė^ƑSĂ̕ǂŔ˂܂A
 4rbgׂĂOFFɂȂu0v^Ƃǂ̕ǂł˂܂B
 ܂A2rbgƑ3rbgONɂȂĂu6v^ƁAE̕ǂł̂ݔ˂܂B
*/

// ֐{
function CreateReflectShot02(PosX,PosY,Speed,Angle,Accelerate,MaxSpeed,Graphic,Delay,Wall,Count,Frame) {
    let Obj = Obj_Create(OBJ_SHOT);

    // IuWFNge̊{p[^ݒ肵܂B
    Obj_SetPosition(Obj,PosX,PosY);
    Obj_SetSpeed(Obj,Speed);
    Obj_SetAngle(Obj,Angle);
    ObjShot_SetGraphic(Obj,Graphic);
    ObjShot_SetDelay(Obj,Delay);
    //ObjShot_SetBombResist(Obj,true);

    // `̈𒴂Ă폜͍sȂ悤ɐݒ肵܂B
    Obj_SetAutoDelete(Obj,false);

    // ^XNĂяoĔːs܂B
    CreateReflectShot02Task(Obj,Accelerate,MaxSpeed,Wall,Count,Frame);

    // IuWFNglԂlɕԂ܂B
    return Obj;
}

// ːsTu^XN
task CreateReflectShot02Task(Obj,Accelerate,MaxSpeed,Wall,argCount,argFrame) {
    let Count = argCount;
    let CountFlag = (Count > 0);
    let Frame = argFrame;
    let FrameFlag = (Frame > 0);
    let Top = (floor(Wall / 8) == 1);
    let Left = (floor((Wall % 8) / 4) == 1);
    let Right = (floor((Wall % 4) / 2) == 1);
    let Bottom = (Wall % 2 == 1);
    let X = Obj_GetX(Obj);
    let Y = Obj_GetY(Obj);
    let Speed = Obj_GetSpeed(Obj);
    let Angle = Obj_GetAngle(Obj);

    // eʊOɐĂꍇA
    // @ȇxƊpxAeʓɓ邩ǂvZ܂B

    // XAYꂼ1t[ƂɐiޗʂvZ܂B
    let OneStepX = cos(Angle) * Speed;
    let OneStepY = sin(Angle) * Speed;

    // XŒeʓɓt[AʊOɏot[vZ܂B
    let InFrameX = (GetClipMinX - X) / OneStepX;
    let OutFrameX = (GetClipMaxX - X) / OneStepX;
    if (InFrameX > OutFrameX) {
        let Work = InFrameX;
        InFrameX = OutFrameX;
        OutFrameX = Work;
    }

    // YŒeʓɓt[AʊOɏot[vZ܂B
    let InFrameY = (GetClipMinY - Y) / OneStepY;
    let OutFrameY = (GetClipMaxY - Y) / OneStepY;
    if (InFrameY > OutFrameY) {
        let Work = InFrameY;
        InFrameY = OutFrameY;
        OutFrameY = Work;
    }

    // XɓOY甲Ă܂ꍇA
    // ܂YɓOX甲Ă܂ꍇA
    // e͉ʓɓeł͂Ȃ߁AeIuWFNg폜܂B
    if ((InFrameX > OutFrameY)||(InFrameY > OutFrameX)) {
        Obj_Delete(Obj);
    }

    // e폜邩Aʓɓ܂ő҂܂B
    while (Obj_BeDeleted(Obj) == false) {
        X = Obj_GetX(Obj);
        Y = Obj_GetY(Obj);
        Speed = Obj_GetSpeed(Obj);

        // eʓɓꍇA[v𔲂܂B
        if ((X >= GetClipMinX)&&(X <= GetClipMaxX)&&(Y >= GetClipMinY)&&(Y <= GetClipMaxY)) {
            break;
        }

        // ẻs܂B
        if (Accelerate > 0) {
            if (Speed + Accelerate < MaxSpeed) {
                Obj_SetSpeed(Obj,Speed + Accelerate);
            }
        } else if (Accelerate < 0) {
            if (Speed + Accelerate > MaxSpeed) {
                Obj_SetSpeed(Obj,Speed + Accelerate);
            }
        }

        yield;

        // t[tOIɂȂĂꍇA
        // @e̐t[XV܂B
        // @t[sꍇAIuWFNg폜܂B
        if (FrameFlag == true) {
            Frame -= 1;
            if (Frame <= 0) {
                ObjShot_FadeDelete(Obj);
            }
        }
    }

    // e폜܂ŁA˔ƔˏJԂ܂B
    while (Obj_BeDeleted(Obj) == false) {
        X = Obj_GetX(Obj);
        Y = Obj_GetY(Obj);
        Speed = Obj_GetSpeed(Obj);
        Angle = Obj_GetAngle(Obj);

        // ˂ǂ𔻒肵܂B
        // @@W`͈͂𒴂Ă邱ƁieǂzƁj
        // @AWzǂAˑΏۂɂȂĂ邱
        // @Bˉ񐔂cĂ邱ƁA܂͔ˉ񐔔tOItɂȂĂ邱
        // ̂Rׂ̏Ėꍇ̂݁Aˏs܂B
        if (Y < GetClipMinY) {
            if ((Top == true)&&((Count > 0)||(CountFlag == false))) {
                Y = (GetClipMinY * 2) - Y;
                Angle = 0 - Angle;
                Count -= 1;
            } else {
                ObjShot_FadeDelete(Obj);
            }
        }
        if (Y > GetClipMaxY) {
            if ((Bottom == true)&&((Count > 0)||(CountFlag == false))) {
                Y = (GetClipMaxY * 2) - Y;
                Angle = 0 - Angle;
                Count -= 1;
            } else {
                ObjShot_FadeDelete(Obj);
            }
        }
        if (X < GetClipMinX) {
            if ((Left == true)&&((Count > 0)||(CountFlag == false))) {
                X = (GetClipMinX * 2) - X;
                Angle = 180 - Angle;
                Count -= 1;
            } else {
                ObjShot_FadeDelete(Obj);
            }
        }
        if (X > GetClipMaxX) {
            if ((Right == true)&&((Count > 0)||(CountFlag == false))) {
                X = (GetClipMaxX * 2) - X;
                Angle = 180 - Angle;
                Count -= 1;
            } else {
                ObjShot_FadeDelete(Obj);
            }
        }

        // ẻs܂B
        if (Accelerate > 0) {
            if (Speed + Accelerate < MaxSpeed) {
                Obj_SetSpeed(Obj,Speed + Accelerate);
            }
        } else if (Accelerate < 0) {
            if (Speed + Accelerate > MaxSpeed) {
                Obj_SetSpeed(Obj,Speed + Accelerate);
            }
        }

        Obj_SetPosition(Obj,X,Y);
        Obj_SetAngle(Obj,Angle);

        yield;

        // t[tOIɂȂĂꍇA
        // @e̐t[XV܂B
        // @t[sꍇAIuWFNg폜܂B
        if (FrameFlag == true) {
            Frame -= 1;
            if (Frame <= 0) {
                ObjShot_FadeDelete(Obj);
            }
        }
    }
}

