import { BlockType } from "./Block";

// 主游戏控制类
const {ccclass, property} = cc._decorator;
@ccclass
export default class GameManager extends cc.Component {

    @property(cc.Node)
    Map: cc.Node = null;

    @property(cc.Prefab)
    Block: cc.Prefab = null;

    @property(cc.Label)
    Time: cc.Label = null;

    @property(cc.Label)
    Countdown: cc.Label = null;

    @property(cc.Node)
    Guide: cc.Node = null;

    step:number;            //引导步骤
    bgClick:boolean         //引导时Mask遮罩可不可以点击
    btnClick:boolean        //引导时，按钮可不可点击
    custom:number;          //当前难度随机地图ID
    countTime: number;      //总倒计时
    waterTime: number       //洪峰倒计时
    startTime: number;      //游戏开始计时
    replaceTime: number     //洪峰倒计时,当总剩余时间小于洪峰倒计时，用于替代
    finishiTime:number;     //提交时间
    scoreTime:number        //用于计算提交到洪峰来的时间差
    block_Array: any;       //所有块数组
    path_Array: any;        //修筑路径
    water_Array: any;       //水流路径
    map_Array: any;         //地图数组
    water_PathAray:any;     //洪峰路径
    tip_Array: any;         //引导数组
    map_Hight:number;       //地图高度
    map_Width:number;       //地图宽度
    min_Time:number;        //上一把地图结束时，距离洪峰来临时间 (>5秒是个分水岭)
    min_Steps:number;       //当前地图最优步数
    plan_over:boolean;      //是否修建完
    waterTween:cc.Tween;    //河水倒计时动画

    onLoad () {
    }
    start () {
        cc.fx.GameConfig.CLICK_init();
        this.fit();
        this.init();
    }

    //处理地图数据 第一关完全随机，从第二关开始，赢了根据5秒洪峰来临增加难度步数，输了当前难度减步数
    getMap(){
        // var temp = [];
        // for(let k=0; k<cc.fx.GameConfig.LEVEL_INFO.length; k++){
        //     temp[k] = [];
        //     for(let j=0; j<cc.fx.GameConfig.LEVEL_INFO[k].length; j++){
        //         temp[k].push(cc.fx.GameConfig.LEVEL_INFO[k][j].min_steps);
        //     }
        // }
        // console.log(temp);

        var custom = 0;
        var map = [];
        if(cc.fx.GameConfig.GM_INFO.level == 1){
            custom = Math.floor(Math.random()* cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level].length);
        }
        else{
            var arr = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level];
            if(cc.fx.GameConfig.GM_INFO.min_Time == -1){
                map = this.getMapArray(arr,cc.fx.GameConfig.GM_INFO.min_Steps - 1,false);
            }
            else if(cc.fx.GameConfig.GM_INFO.min_Time >= 5){
                map = this.getMapArray(arr,cc.fx.GameConfig.GM_INFO.min_Steps + 2,true);
            }
            else{
                map = this.getMapArray(arr,cc.fx.GameConfig.GM_INFO.min_Steps + 1,true);
            }
            var random = Math.floor(Math.random()* map.length);
            custom = map[random];
            console.log(custom,map);
        }
        //记录当前最小步数
        cc.fx.GameConfig.GM_INFO.min_Steps = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][custom].min_steps;
        cc.fx.GameConfig.GM_INFO.min_Time = 0;
        return custom;
    }
    //获取下一关难度，步数增加2或者1，如果没有则降到有.
    getMapArray(arr,min_steps,type){
        var map = [];
        for(let i=0; i<arr.length; i++){
            if(arr[i].min_steps == min_steps){
                map.push(i);
            }
        }
        if(map.length == 0){
            if(type)  map = this.getMapArray(arr,min_steps - 1,type);
            else  map = this.getMapArray(arr,min_steps + 1,type);
        }
        return map;
    }

    //初始化数据
    init(){
        let name = cc.fx.GameConfig.GM_INFO.gameId + "_guide";
        var data = JSON.parse(localStorage.getItem(name));

        if(data != false){
            cc.fx.GameConfig.GM_INFO.guide = true;
            cc.fx.StorageMessage.setStorage(name,cc.fx.GameConfig.GM_INFO.guide);
        }
        else{
            cc.fx.GameConfig.GM_INFO.guide = cc.fx.StorageMessage.getStorage(name);
        }

        this.initMap(); 
        this.finishiTime = 0;
        this.scoreTime = 0;
        this.replaceTime = 0;
        this.startTime = cc.fx.GameTool.getTime();
        this.countTime = cc.fx.GameConfig.TIME_INFO.totalTime;
        this.waterTime = cc.fx.GameConfig.TIME_INFO.waterTime[cc.fx.GameConfig.GM_INFO.level];
        // if(this.countTime < this.waterTime) this.replaceTime = this.countTime;
        this.Time.string =  cc.fx.GameTool.getTimeMargin(this.countTime);    

        if(!cc.fx.GameConfig.GM_INFO.guide){
            this.Guide.active = false;
            this.step = 0;
            var head = this.node.getChildByName("Top").getChildByName("head");
            var progress = this.node.getChildByName("Top").getChildByName("progress").getComponent(cc.Sprite);
            head.runAction(cc.moveTo(this.waterTime,cc.v2(310,head.y)));

            this.waterTween = cc.tween(progress)
            .to(this.waterTime,{fillRange:1})
            .start();
            this.schedule(this.updateWaterTime,1);
            this.schedule(this.updateCountDownTime,1);
        }
        else{
            this.Guide.active = true;
            this.guideNext();
        }

    }
    //初始化地图
    initMap(){
        cc.fx.GameConfig.GM_INFO.round += 1;
        cc.fx.GameConfig.GM_INFO.fen = 0;
        this.block_Array = [];
        this.path_Array = [];
        this.water_Array = [];
        this.map_Array = [];
        this.tip_Array = [];
        this.plan_over = false;
        this.map_Hight = 0;
        this.map_Width = 0;
        this.step = 0;
        this.bgClick = false;
        this.btnClick = false;
        this.custom = 0; //9
        if(!cc.fx.GameConfig.GM_INFO.guide &&cc.fx.GameConfig.GM_INFO.level == 0 ){
            cc.fx.GameConfig.GM_INFO.level = 1;
            this.custom = this.getMap();
        }
        else if(!cc.fx.GameConfig.GM_INFO.guide){
            this.custom = this.getMap();
        }
        console.log(this.custom);

        let arr = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].map;
        if(cc.fx.GameConfig.GM_INFO.level == 0){
            this.Map.scale = 1.2;
        } 
        this.node.getChildByName("Top").getChildByName("id").getComponent(cc.Label).string = 
        cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].id;
        //将地图x,y轴切换
        this.map_Array = arr[0].map((item, i) => {
            return arr.map((val) => val[i])
        })
        this.map_Width = this.map_Array.length;
        this.map_Hight = this.map_Array[0].length;

        this.Map.x =(6 - this.map_Array.length)*48;
        this.Map.y = (this.map_Array[0].length - 6.5)*48;

        for(let i=0;i<this.map_Array.length;i++){
            for(let j=0; j<this.map_Array [i].length;j++){
                let block = cc.instantiate(this.Block);
                block.parent= this.Map;
                block.getComponent("Block").initData(this.map_Array [i][j],cc.v2(i,j),cc.v2(this.map_Width,this.map_Hight));
                if(this.map_Array [i][j] == cc.Enum(BlockType).Start){
                    this.path_Array.push(cc.v3(i,j,cc.Enum(BlockType).Nomal));
                    // this.water_Array.push(cc.v3(i,j,cc.Enum(BlockType).Nomal));
                } 
                block.setPosition(cc.v2(-block.width*2.5 + i*block.width,block.height*4 - j*block.height));
                this.block_Array.push(block);
            }
        }

    }

    //开始后，按玩家操作，将路径中地图块放入数组中
    setMap(data){
        for(let i=0; i<data.length; i++){
            let start = this.path_Array[this.path_Array.length-1];
            switch(data[i]){
                case "up":
                    this.path_Array.push(cc.v3(start.x,start.y-1,cc.Enum(BlockType).Nomal));
                    break;
                case "down":
                    this.path_Array.push(cc.v3(start.x,start.y+1,cc.Enum(BlockType).Nomal));
                    break;
                case "left":
                    this.path_Array.push(cc.v3(start.x-1,start.y,cc.Enum(BlockType).Nomal));
                    break;
                case "right":
                    this.path_Array.push(cc.v3(start.x+1,start.y,cc.Enum(BlockType).Nomal));
                    break;
                case "reinforce":
                    this.path_Array.push(cc.v3(start.x,start.y,cc.Enum(BlockType).Reinforce));
                    break;
                case "soil":
                    this.path_Array.push(cc.v3(start.x,start.y,cc.Enum(BlockType).Xi_Soil));
                    break;
            }
        }
        if(this.path_Array[this.path_Array.length-1].z != 0){
            this.path_Array.pop();
        }
        this.runRoad(0);
    }
    //开始执行洪峰来了的动画
    runRoad(order){
        order = parseInt(order);
        if(order > 0){
            if(this.path_Array[order-1].z == 0){
                //console.log("1正常放入",this.path_Array[order-1].x,this.path_Array[order-1].y,this.path_Array[order-1].z)
                this.changeWater(cc.v3(this.path_Array[order-1].x,this.path_Array[order-1].y,0));
                if(order == this.path_Array.length-1){
                    this.changeWater(cc.v3(this.path_Array[order].x,this.path_Array[order].y,0));
                    // console.log("最后放入",this.path_Array[order].x,this.path_Array[order].y)
                }
            }
            else{
                //console.log("2插入",this.path_Array[order].x,this.path_Array[order].y,this.path_Array[order].z)
                this.changeWater(cc.v3(this.path_Array[order].x,this.path_Array[order].y,0));
            }
        } 
        if(order <= this.path_Array.length-1){
            let i = this.path_Array[order].x*this.map_Array[0].length+this.path_Array[order].y;
            let direction = "";
            let circulate = true;
            //最后一步结束
            if(order == this.path_Array.length-1){
                circulate = false;
                direction = "End";
                // console.log("进入结束");
                if(this.path_Array.length > 1){
                    // console.log("准备出水");
                    setTimeout(() => {
                        if(!this.plan_over){
                            this.plan_over = true;
                            this.unschedule(this.updateWaterTime);
                            var head = this.node.getChildByName("Top").getChildByName("head");
                            var progress = this.node.getChildByName("Top").getChildByName("progress").getComponent(cc.Sprite);
                            head.stopAllActions();
                            head.setPosition(310,head.y);
                            if(this.waterTween) this.waterTween.stop();
                            progress.fillRange = 1;
                            cc.fx.GameConfig.GM_INFO.min_Time = this.waterTime;
                            this.runWater(0); 
                        }
                    }, 500);
                }
                else{
                    direction = "err";
                    console.log("进入结束err");
                }

            }
            else{
                if(this.path_Array[order].z == 6 && order + 1 < this.path_Array.length ) {
                    direction = "Reinforce";
                    i = this.path_Array[order+1].x*this.map_Array[0].length+this.path_Array[order+1].y;
                }
                else if(order+1 < this.path_Array.length){
                    if(this.path_Array[order+1].z == 5){
                        direction = "Xi_Soil";
                    }
                    else if(this.path_Array[order+1].z == 6 && order == 0 && order + 1 < this.path_Array.length){
                        direction = this.getDirection(order+1,this.path_Array);
                    }
                    else{
                        direction = this.getDirection(order,this.path_Array);
                    }
                }
                else{
                    direction = this.getDirection(order,this.path_Array);
                }
            }
            // console.log(order,this.path_Array[order].x,this.path_Array[order].y,i);
 
            // console.log("步骤:",order,"方向",direction);
            let jg = this.getBoundary(order,this.path_Array[order].x,this.path_Array[order].y,direction,this.path_Array);

            // if(direction == "" || jg == false) return;
            if(direction == "err" || direction == "" || jg == false){
                cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose");
                cc.fx.Notifications.emit(cc.fx.Message.setData,false);
                return;
            }
            let target = this.block_Array[i].getComponent("Block");
    
            target.setPath(direction);

            if(order > 0 && order < this.path_Array.length-1){
                if(this.path_Array[order+1].z == 5){
                    this.set_Soil(order+1,this.path_Array,"road");
                    circulate = false;
                    return;
 
                }
                else if(order == 1 && this.path_Array[order].z == 5){
                    this.set_Soil(order,this.path_Array,"road");
                    circulate = false;
                    return;
                }
            }
            let pos = cc.v2();
            if(direction == "End"){
                if(order > 0){
                    // if(this.path_Array[order-1].z == 0){
                        pos = cc.v2(this.path_Array[order-1].x, this.path_Array[order-1].y);
                    // }
                }
            }
            let data = {
                order:order,
                time:cc.fx.GameConfig.TIME_INFO.waterSpeed[cc.fx.GameConfig.GM_INFO.level],
                type:this.path_Array[order].z,
                circulate:circulate,
                last:pos
            };
        
            target.runRoad(data);
        }
    }
    //判断边界。或者撞山，或者湿地没有加固
    getBoundary(order,x,y,direction,road){
        let jg = true;
        if(x < 0 || x >= this.map_Width || y < 0 || y >= this.map_Hight){
            jg = false;
            // console.log("超过边界，游戏结束");
            // alert("超过边界，治水失败");
            cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose");
            cc.fx.Notifications.emit(cc.fx.Message.setData,false);
        }
        else {
            let i = road[order].x*this.map_Array[0].length+road[order].y;
            let target = this.block_Array[i].getComponent("Block");
            if(target.block_Type == 3){
                jg = false;
                // console.log("修筑山峰，游戏结束");
                // alert("修筑山峰，治水失败");
                cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose");
                cc.fx.Notifications.emit(cc.fx.Message.setData,false);
            }
            else if(target.block_Type == 2 && direction != "Reinforce"){
                jg = false;
                // console.log("修筑未加固湿地,游戏结束");
                // alert("修筑未加固湿地,游戏结束");
                cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose");
                cc.fx.Notifications.emit(cc.fx.Message.setData,false);
            }
        }
        return jg;
    }

    //开始执行洪峰来了的动画
    runWater(order){
        order = parseInt(order);
        
        if(order <= this.water_Array.length-1){
            let i = this.water_Array[order].x*this.map_Array[0].length+this.water_Array[order].y;
            let direction = "";
            let circulate = true;
            //最后一步结束
            if(order == this.water_Array.length-1){
                circulate = false;
                direction = "End";
            }
            else{
                if(this.water_Array[order].z == 6 && order + 1 < this.water_Array.length && order!=1) {
                    direction = "Reinforce";
                    i = this.water_Array[order+1].x*this.map_Array[0].length+this.water_Array[order+1].y;
                }
                else if(order+1 < this.water_Array.length){
                    if(this.water_Array[order+1].z == 5){
                        direction = "Xi_Soil";
                    }
                    else if(this.water_Array[order+1].z == 6 && order == 0){
                        direction = "Reinforce";
                    }
                    else{
                        direction = this.getDirection(order,this.water_Array);
                    }
                }
                else{
                    direction = this.getDirection(order,this.water_Array);
                }
            }
            let jg = this.getBoundary(order,this.water_Array[order].x,this.water_Array[order].y,direction,this.water_Array);
            if(direction == "" || jg == false || direction == "err"){
                cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose");
                cc.fx.Notifications.emit(cc.fx.Message.setData,false);
                return;
            }
            let target = this.block_Array[i].getComponent("Block");
            target.setPath(direction);

            if(order > 0 && order < this.water_Array.length-1){
                if(this.water_Array[order+1].z == 5){
                    this.set_Soil(order+1,this.water_Array,"water");
                    circulate = false;
                    return;
                }
                else if(order == 1 && this.water_Array[order].z == 5){
                    this.set_Soil(order,this.water_Array,"water");
                    circulate = false;
                    return;
                } 
            }

            let pos = cc.v2();
            if(direction == "End"){
                if(order > 0){
                    if(this.water_Array[order-1].z == 0){
                        pos = cc.v2(this.water_Array[order-1].x, this.water_Array[order-1].y);
                    }
                }
            }
            let data = {
                order:order,
                time:cc.fx.GameConfig.TIME_INFO.waterSpeed[cc.fx.GameConfig.GM_INFO.level],
                type:this.water_Array[order].z,
                circulate:circulate,
                last:pos
            };
            target.runWater(data);
        }
    }
    //获取息壤的格子的方向
    getXi_Soil(order,road){
        var direction = null;
        //如果息壤后面还有下一步的话
        if(order + 1 < road.length){
            direction = this.getDirection(order,road);
            if(direction == "up" || direction == "right_up" || direction == "left_up"){
                direction = "up";
            }
            else if(direction == "down" || direction == "left_down" || direction == "right_down"){
                direction = "down";
            }
            else if(direction == "left" || direction == "up_left" || direction == "down_left"){
                direction = "left";
            }
            else if(direction == "right" || direction == "up_right" || direction == "down_right"){
                direction = "right";
            }
        }  
        return direction;
    }
    //设置息壤
    set_Soil(order,road,name){
        var direction = this.getXi_Soil(order,road);
        var length = 0;
        if(direction == "right"){
            length = this.map_Width - 1;
            for(let i=road[order].x;i<=length;i++){
                let n = i*this.map_Array[0].length+road[order].y;
                let target = this.block_Array[n].getComponent("Block");
                if(target.block_Type == 3 || target.block_Type == 4){
                    length = i-1;
                    if(target.block_Type == 4){
                        length += 1;
                    }
                    i = 10000;
                    break;
                }
            }this.scheduleOnce
        } 
        else if(direction == "left"){
            length = 0;
            for(let i=road[order].x;i>=length;i--){
                let n = i*this.map_Array[0].length+road[order].y;
                let target = this.block_Array[n].getComponent("Block");
                if(target.block_Type == 3 || target.block_Type == 4){
                    length =  i + 1;
                    if(target.block_Type == 4){
                        length -= 1;
                    }
                    i = -1;
                    break;
                }
            }
        } 
        else if(direction == "up"){
            length = 0;
            for(let i=road[order].y;i>=length;i--){
                let n = road[order].x*this.map_Array[0].length + i;
                let target = this.block_Array[n].getComponent("Block");
   
                if(target.block_Type == 3 || target.block_Type == 4){
                    length = i + 1;
                    if(target.block_Type == 4){
                        length -= 1;
                    }
                    i = -1;
                    break;
                }
            }
        } 
        else if(direction == "down"){
            length = this.map_Hight - 1;
            for(let i=road[order].y;i<=length;i++){
                let n = road[order].x*this.map_Array[0].length + i;
                let target = this.block_Array[n].getComponent("Block");
    
                if(target.block_Type == 3 || target.block_Type == 4){
                    length = i-1;
                    if(target.block_Type == 4){
                        length += 1;
                    }
                    i = 10000;
                    break;
                }
            }
        } 
        // if(length == 0){
           
        // }

        this.soil_Find(direction,order,length,road,name);
    }
    //查找息壤蛮遗憾路径
    soil_Find(direction,order,length,road,name){
        let start = road[order].x;
        if(direction == "right"){
            for(let i = start; i<=length; i++){
                let n = i*this.map_Array[0].length+road[order].y;
                let target = this.block_Array[n].getComponent("Block");
                if(i == start){
                    if(i == start && i==length) target.set_Xi_SoilType(this.getDirection(order,road),order,name);
                    else target.set_Xi_SoilType(this.getDirection(order,road),null,name);
                    let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0);
                    if(this.water_Array[this.water_Array.length-1] != value){
                        // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
                        this.changeWater(value);
                    }
                }  
                else {
                    let jg = null;
                    if(i == length){
                        let number = i - start -1;
                        this.changePath(order,number,false,road);
                        jg = order;
                    } 
                    target.set_Xi_SoilType(direction,jg,name);
                }   
            }
        } 
        else if(direction == "left"){
            for(let i = start; i>=length; i--){
                let n = i*this.map_Array[0].length+road[order].y;
                let target = this.block_Array[n].getComponent("Block");
                if(i == start){
                    if(i == start && i==length) target.set_Xi_SoilType(this.getDirection(order,road),order,name);
                    else target.set_Xi_SoilType(this.getDirection(order,road),null,name);
                    let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0);
                    if(this.water_Array[this.water_Array.length-1] != value){
                        // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
                        this.changeWater(value);
                    }
                }  
                else {
                    let jg = null;
                    if(i == length){
                        let number = i - start + 1;
                        this.changePath(order,number,false,road);
                        jg = order;
                    } 
                    target.set_Xi_SoilType(direction,jg,name);
                }
            }
        } 
        else if(direction == "up"){
            start = road[order].y;
            for(let i = start; i>=length; i--){
                let n = road[order].x*this.map_Array[0].length+i;
                let target = this.block_Array[n].getComponent("Block");
                if(i == start){
                    if(i == start && i==length) target.set_Xi_SoilType(this.getDirection(order,road),order,name);
                    else target.set_Xi_SoilType(this.getDirection(order,road),null,name);
                    let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0);
                    if(this.water_Array[this.water_Array.length-1] != value){
                        // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
                        this.changeWater(value);
                    }
                }  
                else {
                    let jg = null;
                    if(i == length){
                        let number = i - start + 1;
                        this.changePath(order,number,true,road);
                        jg = order;
                    } 
                    // console.log("想上息壤插入:",this.path_Array[order].x,i);
                    target.set_Xi_SoilType(direction,jg,name);
                }
            }
        } 
        else if(direction == "down"){
            start = road[order].y;
            for(let i = start; i<=length; i++){
                let n = road[order].x*this.map_Array[0].length+i;
                let target = this.block_Array[n].getComponent("Block");
                if(i == start){
                    if(i == start && i==length) target.set_Xi_SoilType(this.getDirection(order,road),order,name);
                    else target.set_Xi_SoilType(this.getDirection(order,road),null,name);
                    let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0);
                    if(this.water_Array[this.water_Array.length-1] != value){
                        // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y);
                        this.changeWater(value);
                    }
                } 
                else {
                    let jg = null;
                    if(i == length){
                        let number = i - start - 1;
                        this.changePath(order,number,true,road);
                        jg = order;
                    } 
                    target.set_Xi_SoilType(direction,jg,name);
                }
            }
        } 
    }

    //改变水流地图
    changeWater(value){
        let jg = true;
        if(this.water_Array.length > 0){
            if(this.water_Array[this.water_Array.length-1].x == value.x && this.water_Array[this.water_Array.length-1].y == value.y){
                jg = false;
            }
        }
        if(jg) this.water_Array.push(value);
    }

    //息壤过后改变修筑路径
    changePath(order,number,direction,road){
  
        for(let i = (order+1); i<road.length; i++){
            if(!direction){
                road[i].x += (number);
            }
            else{
                road[i].y += (number);
            }
        }
        if(direction){
            if(number < 0){
                for(let n= -number; n>0; n--){
                    this.changeWater(cc.v3(this.path_Array[order+1].x,this.path_Array[order+1].y+n,0));
                    // console.log("1特殊放入:",this.path_Array[order+1].x,this.path_Array[order+1].y+n)
                }
            }
            else{ 
                for(let n=number; n>0; n--){
                    this.changeWater(cc.v3(this.path_Array[order+1].x,this.path_Array[order+1].y-n,0));
                    // console.log("2特殊放入:",this.path_Array[order+1].x,this.path_Array[order+1].y-n)
                }
            }
        }else{
            if(number < 0){
                for(let m= -number; m>0; m--){
                    this.changeWater(cc.v3(this.path_Array[order+1].x+m,this.path_Array[order+1].y,0));
                    // console.log("3特殊放入:",this.path_Array[order+1].x+m,this.path_Array[order+1].y)
                }
            }
            else{
                for(let m=number; m>0; m--){
                    this.changeWater(cc.v3(this.path_Array[order+1].x-m,this.path_Array[order+1].y,0));
                    // console.log("4特殊放入:",this.path_Array[order+1].x-m,this.path_Array[order+1].y)
                }
            }
        }
    }


    //获取洪峰方向
    getDirection(order,road){
        var name = "";
        //入海口比较复杂单独判断
        if(order == 0){
            let nextX = road[order+1].x - road[order].x;
            let nextY = road[order].y - road[order+1].y;
            //在底边
            if(road[order].y == this.map_Array[0].length-1){
                if(nextX == 0){
                    if(nextY == 1)name = "up";
                    else if(nextY == -1) name = "err";
                }
                else if(nextX == 1) name = "up_right";
                else if(nextX == -1) name = "up_left";
            }
            //在顶边
            else if(road[order].y == 0){
                if(nextX == 0){
                    if(nextY == 1)name = "err";
                    else if(nextY == -1) name = "down";
                }
                else if(nextX == 1) name = "down_right";
                else if(nextX == -1) name = "down_left";
            }
            //在左边
            else if(road[order].x == 0){
                if(nextX == 0){
                    if(nextY == 1)name = "right_up";
                    else if(nextY == -1) name = "right_down";
                }
                else if(nextX == 1) name = "right";
                else if(nextX == -1) name = "err";
            }
            //在右边
            else if(road[order].x == this.map_Array.length-1){
                if(nextX == 0){
                    if(nextY == 1)name = "left_up";
                    else if(nextY == -1) name = "left_down";
                }
                else if(nextX == 1) name = "err";
                else if(nextX == -1) name = "left";
            }
        }
        //不是第一步，已经走过一步
        else if(order > 0){
            var next = 1;
            if(order+2 < road.length){
                if(road[order+1].z == 6) next = 2;
            }
         
            //用于判断此点的上一个点，是为了判断当前方块洪水七点，以及下一个移动方向，判断洪终点方向
            let nextX = road[order+next].x - road[order].x;
            let nextY = road[order].y - road[order+next].y
            let previousX = road[order].x - road[order-1].x;
            let previousY = road[order-1].y - road[order].y;
            if(previousX == 0 && previousY == 0){
                if(order > 1){
                    previousX = road[order].x - road[order-2].x;
                    previousY = road[order-2].y - road[order].y;
                }
                else if(order + 1 < road.length){
                    previousX = road[order+1].x - road[order].x;
                    previousY = road[order].y - road[order+1].y;
                    // console.log("息壤，上下坐标差距",previousX,previousY);
                }
            }
            if(previousX == 0 && previousY >= 1){
                if(nextX == 0){
                    if(nextY == 1)name = "up";
                    else if(nextY == -1) name = "err";
                }
                else if(nextX == 1) name = "up_right";
                else if(nextX == -1) name = "up_left";
            }
            else if(previousX == 0 && previousY <= -1){
                if(nextX == 0){
                    if(nextY == 1)name = "err";
                    else if(nextY == -1) name = "down";
                }
                else if(nextX == 1) name = "down_right";
                else if(nextX == -1) name = "down_left";
            }
            else if(previousX >= 1 && previousY == 0){
                if(nextX == 0){
                    if(nextY == 1)name = "right_up";
                    else if(nextY == -1) name = "right_down";
                }
                else if(nextX == 1) name = "right";
                else if(nextX == -1) name = "err";
            }
            else if(previousX <= -1 && previousY == 0){
                if(nextX == 0){
                    if(nextY == 1)name = "left_up";
                    else if(nextY == -1) name = "left_down";
                }
                else if(nextX == 1) name = "err";
                else if(nextX == -1) name = "left";
            }
        }

        return name ;
    }

    //根据是否全面屏，做独立适配方面
    fit(){
        var jg = this.setFit();
        if(!jg){
            this.Map.scale = 1.2;
        }else{
            this.Map.scale = 1;
        }
    }
    //判断全面屏
    getSetScreenResolutionFlag () {
        let size = cc.winSize;
        let width = size.width;
        let height = size.height;
        if ((height / width) > (16.2 / 9)) return false;
        return true;
    }
    //判断全面屏适配
    setFit () {
        let flag = this.getSetScreenResolutionFlag();
        if (flag) {
        } else {
        }
        return flag;
    }
    //返回首页
    backScene(){
        cc.director.loadScene("LoadScene");
    }

    //开始游戏
    startGame(data){
        for(let i=0; i<this.block_Array.length;i++){
            this.block_Array[i].getChildByName("tipWin").active = false;
            this.block_Array[i].getChildByName("tipLose").active = false;
        }
        this.unschedule(this.updateCountDownTime);
        var now = cc.fx.GameTool.getTime();
        var finishi = now - this.finishiTime;
        var totalTime = now - this.startTime;
        this.scoreTime = this.waterTime;
        if(this.waterTime <= 0.5) finishi = -1;
        // console.log("submitTime:",finishi,this.finishiTime);
        cc.fx.GameConfig.CLICK_SET("submitTime",finishi);
        if(finishi == -1) 
            cc.fx.GameConfig.CLICK_SET("duration",cc.fx.GameConfig.TIME_INFO.waterTime[cc.fx.GameConfig.GM_INFO.level]);
        else 
            cc.fx.GameConfig.CLICK_SET("duration",totalTime);
            
        cc.fx.GameConfig.CLICK_SET("usedSteps",data.length);
        this.setMap(data);
  
        var arr = this.changeStep(data);
        cc.fx.GameConfig.CLICK_SET("stepList",arr);
    }

    //用于埋点记录
    changeStep(data){
        var arr = [];
        if(data.length > 0){
            for(let i=0; i<data.length; i++){
                if(data[i] == "up") arr[i] = "U";
                else if(data[i] == "down") arr[i] = "D";
                else if(data[i] == "left") arr[i] = "L";
                else if(data[i] == "right") arr[i] = "R";
                else if(data[i] == "soil") arr[i] = "X";
                else if(data[i] == "reinforce") arr[i] = "F";
            }
        }
        return arr;
    }
    //洪峰倒计时，计时器
    updateWaterTime(){
        if (this.waterTime > 0) {
            this.waterTime -= 1;
            this.Countdown.string =  cc.fx.GameTool.getTimeMargin(this.waterTime);
            if(this.waterTime <= 0){
                this.unschedule(this.updateWaterTime);
                if(!this.plan_over){
                    this.waterTime = 0;
                    this.plan_over = true;
                    setTimeout(() => {
                        if(this.water_Array.length == 0){
                            cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose");
                            cc.fx.Notifications.emit(cc.fx.Message.setData,false);
                        }         
                        else{
                            cc.fx.GameConfig.GM_INFO.min_Time = this.waterTime;
                            this.runWater(0); 
                        }   
                    }, 500);
                }
            }
        }
    }

    //如果是倒计时 调用此方法
    updateCountDownTime () {
        if (this.countTime > 0) {
            this.countTime -= 1;
            cc.fx.GameConfig.TIME_INFO.totalTime = this.countTime;
            this.Time.string =  cc.fx.GameTool.getTimeMargin(this.countTime);
            if(this.countTime < 5){
                let over = this.node.getChildByName("Over");
                cc.tween(over)
                .to(0.2,{opacity:255})
                .delay(0.1)
                .to(0.2,{opacity:0})
                .start();
            }
            if(this.countTime <= 0){
                this.countTime = 0;
                this.setData(false);
                this.unschedule(this.updateCountDownTime);
                this.gameOver();    
            }
        }
    }
    //上传每次操作数据
    setData(success){
        //设置埋点数据
        cc.fx.GameConfig.CLICK_SET("mapId",cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].id);
        cc.fx.GameConfig.CLICK_SET("difficulty",cc.fx.GameConfig.GM_INFO.level);
        cc.fx.GameConfig.CLICK_SET("optimizedSteps",cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].min_steps);
        cc.fx.GameConfig.CLICK_SET("round",cc.fx.GameConfig.GM_INFO.round);
        cc.fx.GameConfig.CLICK_SET("timer",cc.fx.GameConfig.TIME_INFO.totalTime);
        cc.fx.GameConfig.CLICK_SET("cumulativeScore",cc.fx.GameConfig.GM_INFO.score);
        if(success != null){
            cc.fx.GameConfig.CLICK_SET("success",success);
            cc.fx.GameConfig.GM_INFO.fen = this.getScore();
            if(!success) cc.fx.GameConfig.GM_INFO.fen = 0;
            cc.fx.GameConfig.CLICK_SET("getScore",cc.fx.GameConfig.GM_INFO.fen);
            cc.fx.GameConfig.GM_INFO.score += cc.fx.GameConfig.GM_INFO.fen;
            cc.fx.GameConfig.CLICK_SET("cumulativeScore",cc.fx.GameConfig.GM_INFO.score);
            if(this.countTime != 0)cc.fx.GameConfig.GM_INFO.successList.push(success);
        }
        cc.fx.GameTool.setGameData();
        
    }
    //计算得分
    getScore(){
        //最小步数
        let min = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].min_steps;
        //实际使用步数
        let now = this.path_Array.length-1;
        if(now <=0) now = 0;
        var x = (2.5*min - now) / min;
        let score = Math.pow(min,x) ** 0.5;
        score = score * (this.scoreTime + 10)*100;
        return Math.floor(score);
    }

    //上传排行榜数据
    gameOver(){
        var rate = 0;
        var successList = cc.fx.GameConfig.GM_INFO.successList;
        if(successList.length > 0){
            var success = 0;
            for(let i=0; i<successList.length; i++){
                if(successList[i] == true) success += 1;
            }
            rate = success/successList.length;
        }
        rate = Math.floor(rate * 1000)/10;
        let data = {
            score: cc.fx.GameConfig.GM_INFO.score,
            rate: rate
        }
        cc.fx.GameTool.setRank(data);
        this.node.getChildByName("GameOver").active = true;
        this.node.getChildByName("GameOver").opacity = 0;
        cc.tween(this.node.getChildByName("GameOver"))
        .to(0.4,{opacity:255})
        .delay(1)
        .to(0.4,{opacity:50})
        .call(() =>{
            cc.director.loadScene("OverScene");
        })
        .start()
    }
    //展示结果
    showResult(data){
        if(data == "lose"){
            cc.fx.AudioManager._instance.playEffect("lose",null);
            cc.fx.GameConfig.GM_INFO.min_Time = -1;
        } 
        else{
            cc.fx.AudioManager._instance.playEffect("win",null);
        }
        this.node.getChildByName("Window").active = true;
        this.node.getChildByName("Window").getComponent("Window").init(data);

    }
    //记录反应时长，以及做步骤提示
    clickSun(data){
        //如果没有记录过 回合开始到操作反应时长，则第一次记录， 后面不记录
        if(cc.fx.GameConfig.CLICK_DATA.startTime == 0){
            this.finishiTime = cc.fx.GameTool.getTime();
            var now  = this.finishiTime - this.startTime;
            // console.log("startTime:",now,this.startTime);
            cc.fx.GameConfig.CLICK_SET("startTime",now);
        }
        if(cc.fx.GameConfig.GM_INFO.level > 3) return;
        //步骤提示
        var nowPos = this.path_Array[0];
        if(this.tip_Array.length != 0){
            if(this.tip_Array[this.tip_Array.length-1] == null){
                this.tip_Array.push(null);
                return;
            }
            nowPos = this.tip_Array[this.tip_Array.length-1][this.tip_Array[this.tip_Array.length-1].length-1];
            if(nowPos){
                let n = nowPos.x*this.map_Array[0].length+nowPos.y;
                let targetNode = this.block_Array[n];
                if(targetNode.getChildByName("tipLose").active == true){
                    this.tip_Array.push(null);
                    return;
                }
            }
            else{
                return;
            }
        } 

        if(data == "up"){
            let n = cc.v2(nowPos.x,nowPos.y-1);
            this.tipCan(n,data);
        }
        else if(data == "down"){
            let n = cc.v2(nowPos.x,nowPos.y+1);
            this.tipCan(n,data);
        }
        else if(data == "left"){
            let n = cc.v2(nowPos.x-1,nowPos.y);
            this.tipCan(n,data);
        }
        else if(data == "right"){
            let n = cc.v2(nowPos.x+1,nowPos.y);
            this.tipCan(n,data);
        }
        else if(data == "reinforce"){
            let n = cc.v3(nowPos.x,nowPos.y,2);
            this.tip_Array.push([n]);
        }
        else if(data == "soil"){
            let n = cc.v3(nowPos.x,nowPos.y,3);
            this.tip_Array.push([n]);
        }
    
    }
    //提示是否错误
    tipCan(pos,data){
        
        //先判断是否出边界
        if(pos.x <0 || pos.x >this.map_Array.length-1 || pos.y <0 || pos.y > this.map_Array[0].length-1 ){
            this.tip_Array.push(null);
            return;
        }   
        let n = pos.x*this.map_Array[0].length+pos.y;
        let target = this.block_Array[n].getComponent("Block");
        target.node.getChildByName("tipWin").active = true;
        // target.node.getChildByName("tipWin").opacity = 255;
        // target.node.getChildByName("tipLose").opacity = 255;

        //重复路回头路，或者山峰
        if(target.repeatRoad(false,null) == true || target.block_Type == 3){
            target.node.getChildByName("tipLose").active = true;
            target.node.getChildByName("tipWin").active = false;
        }
        //湿地 上一步如果没用息壤或者加固
        else if(target.block_Type == 2){
            if(this.tip_Array.length > 1){
                if(this.tip_Array[this.tip_Array.length-1][0].z == 0){
                    target.node.getChildByName("tipLose").active = true;
                    target.node.getChildByName("tipWin").active = false;
                }
            }
        }

        if(this.tip_Array.length > 0){
            if(this.tip_Array[this.tip_Array.length-1][0].z == 3){
                if(data == "up"){
                    var arr = [];
                    for(let i=pos.y; i >=0;i--){
                        let block = this.block_Array[pos.x*this.map_Array[0].length+i].getComponent("Block");
                        if(block.block_Type == 3){
                            i = -10000;
                        }
                        else{
                            block.node.getChildByName("tipWin").active = true;
                            arr.push(cc.v3(pos.x,i,0));
                            if( block.block_Type == 4) i = -10000;
                        }
                    }
                    this.tip_Array.push(arr);
                }
                else if(data == "down"){
                    var arr = [];
                    for(let i=pos.y; i<this.map_Array[0].length;i++){
                        let block = this.block_Array[pos.x*this.map_Array[0].length+i].getComponent("Block");
                        if(block.block_Type == 3){
                            i = 10000;
                        }
                        else{
                            block.node.getChildByName("tipWin").active = true;
                            arr.push(cc.v3(pos.x,i,0));
                            if( block.block_Type == 4) i = 10000;
                        }
                    }
                    this.tip_Array.push(arr);
                }
                else if(data == "right"){
                    var arr = [];
                    for(let i=pos.x; i<this.map_Array.length;i++){
                        let block = this.block_Array[i*this.map_Array[0].length+pos.y].getComponent("Block");
                        if(block.block_Type == 3){
                            i = 10000;
                        }
                        else{
                            block.node.getChildByName("tipWin").active = true;
                            arr.push(cc.v3(i,pos.y,0));
                            if( block.block_Type == 4) i = 10000;
                        }
                    }
                    this.tip_Array.push(arr);
                }
                else if(data == "left"){
                    var arr = [];
                    for(let i=pos.x; i>=0 ;i--){
                        let block = this.block_Array[i*this.map_Array[0].length+pos.y].getComponent("Block");
                        if(block.block_Type == 3){
                            i = -10000;
                        }
                        else{
                            block.node.getChildByName("tipWin").active = true;
                            arr.push(cc.v3(i,pos.y,0));
                            if( block.block_Type == 4) i = -10000;
                        }
                    }
                    this.tip_Array.push(arr);
                }
            }
            else{
                let posJg = cc.v3(pos.x,pos.y,0);
                if(data == "reinforce") pos.z = 2;
                if(data == "soil") pos.z = 3; 
                this.tip_Array.push([posJg]);
            }
            // console.log(this.tip_Array);
            return;
        }

        let posJg = cc.v3(pos.x,pos.y,0);
        if(data == "reinforce") pos.z = 2;
        if(data == "soil") pos.z = 3; 
        this.tip_Array.push([posJg]);
        // console.log(this.tip_Array);
    }

    //移除提示
    removeTip(data){
        if(cc.fx.GameConfig.GM_INFO.level > 3) return;
        //分为撤回一步 和全部清空
        if(this.tip_Array.length > 0){
            if(data == "back"){
                let target = this.tip_Array[this.tip_Array.length-1];
                if(target == null){
                    this.tip_Array.pop();
                } 
                else{
                    this.tip_Array.pop();
                    for(let i=0; i<target.length;i++){
                        if(target[i]){
                            if( target[0].z == 0){
                                let n = target[i].x*this.map_Array[0].length+target[i].y;
                                let node = this.block_Array[n];
                                node.getChildByName("tipWin").active = false;
                                node.getChildByName("tipLose").active = false;
                            }

                        }
                    }
                }
            } 
            else if(data == "remove"){
                for(let j =0; j<this.tip_Array.length; j++){
                    let target = this.tip_Array[j];
                    if(target != null){
                        for(let i=0; i<target.length;i++){
                            if(target[i]){
                                let n = target[i].x*this.map_Array[0].length+target[i].y;
                                let node = this.block_Array[n];
                                node.getChildByName("tipWin").active = false;
                                node.getChildByName("tipLose").active = false;
                            }
                        }
                    }
                }
                this.tip_Array = [];
            } 
        }
    }

    //获取引导名字
    getGuideName(){
        var name = "one";
        switch(this.step){
            case 1:
                name = "one";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 2:
                name = "two";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 3:
                name = "three";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 4:
                name = "four";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 5:
                name = "five";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 6:
                name = "six";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 7:
                name = "seven";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 8:
                name = "eight";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 9:
                name = "nine";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 10:
                name = "ten";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 11:
                name = "eleven";
                this.btnClick = false;
                this.bgClick = true;
                break;
            case 12:
                name = "twelve";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 13:
                name = "thirteen";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 14:
                name = "fourteen";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 15:
                name = "fiveteen";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 16:
                name = "sixteen";
                this.btnClick = true;
                this.bgClick = false;
                break;
            case 17:
                name = "last";
                this.btnClick = true;
                this.bgClick = false;
                break;
        }

        return name;
    }
    //引导下一步
    guideNext(){
        //每次先把所有的
        console.log(this.step,this.Guide.children.length);
        if(this.step + 1  ==  this.Guide.children.length){
            cc.fx.GameConfig.GM_INFO.guide = false;
            // cc.director.loadScene("GameScene");
            let name = cc.fx.GameConfig.GM_INFO.gameId + "_guide";
            cc.fx.StorageMessage.setStorage(name,cc.fx.GameConfig.GM_INFO.guide);
        }
        if(this.step > 0) this.Guide.children[this.step-1].active = false;
        this.step += 1;
        let name = this.getGuideName();
   
        var target = this.Guide.getChildByName(name);
        target.active = true;
        let size = cc.winSize;

        if(size.height > 1334){
            let height = (size.height - 1334)/2;
            target.getChildByName("sp").height += height;
        }
    }

    onEnable () {
        cc.fx.Notifications.on(cc.fx.Message.control, this.clickSun, this);
        cc.fx.Notifications.on(cc.fx.Message.next, this.runRoad, this);
        cc.fx.Notifications.on(cc.fx.Message.nextWater, this.runWater, this);
        cc.fx.Notifications.on(cc.fx.Message.startGame, this.startGame, this);
        cc.fx.Notifications.on(cc.fx.Message.changePath, this.changePath, this);
        cc.fx.Notifications.on(cc.fx.Message.setData, this.setData, this);
        cc.fx.Notifications.on(cc.fx.Message.guideNext, this.guideNext, this);
        cc.fx.Notifications.on(cc.fx.Message.showResult, this.showResult, this);
        cc.fx.Notifications.on(cc.fx.Message.removeTip, this.removeTip, this);
    }
    onDisable () {
        cc.fx.Notifications.off(cc.fx.Message.control, this.clickSun);
        cc.fx.Notifications.off(cc.fx.Message.next, this.runRoad);
        cc.fx.Notifications.off(cc.fx.Message.nextWater, this.runWater);
        cc.fx.Notifications.off(cc.fx.Message.startGame, this.startGame);
        cc.fx.Notifications.off(cc.fx.Message.changePath, this.changePath);
        cc.fx.Notifications.off(cc.fx.Message.setData, this.setData);
        cc.fx.Notifications.off(cc.fx.Message.guideNext, this.guideNext);
        cc.fx.Notifications.off(cc.fx.Message.showResult, this.showResult);
        cc.fx.Notifications.off(cc.fx.Message.removeTip, this.removeTip);
    }
    update (dt) {

   
    }
}
