    //ˋ̐E@ǔAєˏ̌B荞ݏ̉e󂯂B
    //gpO[oϐFListMirrors, x0Mirrors, y0Mirrors, ReflectOrder, LockMirror, SPModeMirror
    //o̓O[oϐFListMirrors, x0Mirrors, y0Mirrors, ReflectOrder, NumberOfReflect


    //ˋ
    //ϐFSWAAApxAOtBbNAx
    function PutMirror(X0, L, D, Ang, Img, time)
    {
        //WEpxݒ
        let obj = Obj_Create(OBJ_LASER);
        let X = [X0[0] - L * cos(Ang) / 2, X0[1] - L * sin(Ang) / 2];
        Obj_SetPosition(obj, X[0], X[1]);
        Obj_SetAngle(obj, Ang);

        //ȊȌ̐ݒ
        ObjLaser_SetLength(obj, L);
        ObjLaser_SetWidth(obj, D);
        ObjShot_SetDelay(obj, time);
        ObjShot_SetGraphic(obj, Img);
        ObjLaser_SetSource(obj, false);

        //O[oϐ
        ListMirrors = ListMirrors ~ [obj];
        x0Mirrors = x0Mirrors ~ [X0[0]];
        y0Mirrors = y0Mirrors ~ [X0[1]];
    }

    //ˋ̎@ǔ
    //ϐFIDApx
    task TLockOnPlayer(ID, dAng)	//ˋ̉]
    {
        //{f[^̌Ăяo
        let obj = ListMirrors[ID];
        let L = ObjLaser_GetLength(obj);

        yield;				//SĂ̔ˋݒû҂

        let n = length(ListMirrors);		//ˋ̐

        loop
        {
            loop
            {
                if( LockMirror || SPModeMirror) {break;}	//ǔ~

                let order = [n+1] ~ ReflectOrder ~ [n+2];	//ˏǂݍ(n+1, n+2FG@EoO)

                let IDList = [-1, ID, -1];		//ID̃Xg(From, Itself, Tȍ)
                IDList[0] = order[LookUp(order, ID) - 1];
                IDList[2] = order[LookUp(order, ID) + 1];

                //񃊃Xg(From, It, Tȍ)̒`EG@
                let xList = [0, 0, 0];		//WXgx
                let yList = [0, 0, 0];		//WXgy

                ascent( i in 0..3 )		 //ЂListB
                {
                    alternative( IDList[i] )
                    case(n, n + 2)		//@Eɐl
                    {
                        xList[i] = GetPlayerX;	
                        yList[i] = GetPlayerY;
                    }	
                    case(n + 1)		//G@
                    {
                        xList[i] = GetX;	
                        yList[i] = GetY;	
                    }
                    others			//ˋ
                    {
                        xList[i] = x0Mirrors[IDList[i]];
                        yList[i] = y0Mirrors[IDList[i]];
                    }
                }
 
                //˗\񐔂̃O[oϐo^
                NumberOfReflect = LookUp(order, n) - 1;

                let Ang = Obj_GetAngle( ListMirrors[IDList[1]] );	//ǧpx擾

                let AngTo = GetReflectAngle(xList, yList);	//ړIpx̌vZ
                Ang = CalMirrorAngleNextFlame(Ang, AngTo, dAng);	//]px̌vZ

                Obj_SetPosition(obj, xList[1] - L / 2 *cos(Ang), yList[1] - L / 2 *sin(Ang));
                Obj_SetAngle(obj, Ang);

                yield;				//[vh~
            }
            yield;				//[vh~
        }
    }


    function GetReflectAngle(xList, yList)	//ړIpx̌vZ
    {
        let AngFrom = atan2(yList[0] - yList[1], xList[0] - xList[1]);
        let AngTo = atan2(yList[2] - yList[1], xList[2] - xList[1]);
        
        let Ang = (AngFrom + AngTo) / 2 + 90;
        Ang = Angle180(Ang);
        return(Ang)
    }
 
    function CalMirrorAngleNextFlame(Ang, AngTo, dAng)	//]px̌vZ
    {
        let DiffAng = Ang - AngTo;		//px
        if(DiffAng > dAng)			//]px̌vZ
        {
            Ang -= dAng;
        } else if(DiffAng < -dAng)
        {
            Ang += dAng;
        } else
        {
            Ang = AngTo;
        }
        return(Angle180(Ang));
    }


