import Common from "./common/Common"; import UserInfo from "./UserInfo"; import LDataStoneManager from "./datas/LDataStoneManager"; import LDataGoldManager from "./datas/LDataGoldManager"; // Learn TypeScript: // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/typescript.html // - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/typescript.html // Learn Attribute: // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html // - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/reference/attributes.html // Learn life-cycle callbacks: // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html // - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/life-cycle-callbacks.html export default class LevelInfo{ public static lastStoneId:number = 1; public static levelStoneInfo:number[] = []; //创建石头的次数 public static createStoneCount = 0; //金币掉落的概率 public static dropGoldRateArr:number[] = [] /* 第一关一共掉落5块石头。击碎5个石块,包括分裂的石块。则过关 之后每一关增加一个石块。当到达10个石头时,每6关增加一个石块 增加至15个石块不在增加*/ public static getCreateStoneCount(level:number):number{ let stoneCount = 4; if(level <= 5) { stoneCount = stoneCount + level;// 1 5 2 6 3 7 4 8 5 9 6 } else { stoneCount = 10; stoneCount = stoneCount + Math.floor(level/6) - 1; if(stoneCount > 15) { stoneCount = 15; } } return stoneCount; } /* 关卡初始时,刷新1个,3.5秒后再次刷新一个。最多同时出现4个。 当前一个刷新为4级石头时,暂停刷新。4级石头被击碎成时,刷新 当前一个刷新为3级石头是,下一个只能是低于他的等级 当前一个刷新为1或者2级石块时,下一个刷新可为任意等级石块 */ private static getRandomStoneId():number{ // 0 1 2 3 if(this.lastStoneId == 2){ return Common.getRandom(0,2); //当前一个刷新为3级石头是,下一个只能是低于他的等级 } else{ return Common.getRandom(0,4); //随机哪个 } } //初始关卡信息 public static InitLevelStoneInfo(){ this.levelStoneInfo = []; Common.maxLevelScore = 0; this.createStoneCount = 0; let count = this.getCreateStoneCount(UserInfo.curLevel); for (let index = 0; index < count; index++) { let tempStoneId = this.getRandomStoneId(); let tempData = LDataStoneManager.GetDataById(tempStoneId) Common.maxLevelScore = Common.maxLevelScore+tempData.stonscore; this.levelStoneInfo.push(tempStoneId); } } //获得一个石头的id public static getStoneId():number{ let stoneId = this.levelStoneInfo[this.createStoneCount]; this.createStoneCount++; return stoneId; } //是否可以创建石头 public static isCanCreateStone():boolean{ return this.levelStoneInfo.length >= this.createStoneCount; } //是否通关 public static isFinishLevel():boolean{ return Common.maxLevelScore == Common.curLevelScore; } /* 最小分数为=当前关卡数 正常分数=(每秒发射数量/10+火力/100)*关卡数 最大分数=正常分数*5 第一个出现的必须为最小分数 之后开始在下列范围内开始随机 分数范围 概率 最小分数——正常分数/5 10 正常分数/5——正常分数/2 45 正常分数/2——正常分数*2 95 正常分数*2——正常分数*4 98 正常分数*4——正常分数*5 100 当小于1时,显示为1 当出现小数点时, 向上取整 数字显示时,当数字超过三位数,即达到1000时,显示为1k,1480显示为1.48k */ public static getStoneScore(isFrist:boolean):number{ if(isFrist){ return UserInfo.curLevel; // 最小分数为=当前关卡数 }else{ //正常分数=(每秒发射数量/10+火力/100)*关卡数 let normalValue = (UserInfo.bulletShootMaxCount*0.1+UserInfo.firePower*0.1)*UserInfo.curLevel; let tempV1 = new cc.Vec2(UserInfo.curLevel,Math.ceil(normalValue/4)); let tempV2 = new cc.Vec2(Math.ceil(normalValue/4),Math.ceil(normalValue/3)); let tempV3 = new cc.Vec2(Math.ceil(normalValue/2),Math.ceil(normalValue)); let tempV4 = new cc.Vec2(Math.ceil(normalValue),Math.ceil(normalValue*2)); let tempV5 = new cc.Vec2(Math.ceil(normalValue*2),Math.ceil(normalValue*3)); let tempV6 = new cc.Vec2(Math.ceil(normalValue*3),Math.ceil(normalValue*4)); let tempv = null; let randomValue = Common.getRandom(0,100); if(randomValue > 99){ tempv = tempV6; }else if(randomValue > 96){ tempv = tempV5; }else if(randomValue > 66){ tempv = tempV4; }else if(randomValue > 31){ tempv = tempV3; }else if(randomValue > 11){ tempv = tempV2 } else{ tempv = tempV1; } return Math.ceil(Common.getRandom(tempv.x,tempv.y)); } } //当前关卡最大分数 public static getCurLevelMaxScore():number{ let normalValue = (UserInfo.bulletShootMaxCount*0.1+UserInfo.firePower+1)*UserInfo.curLevel; return normalValue*5; } public static getStoneInitY():number{ return Common.getRandom(550,1000); } /* 金币只有石块消除后才会出现,初始概率为50,掉落【1-2】个金币 随着关卡增加,掉落概率提升,每过一关提升1%,提升至80%不在增加 金币等级每升10级,掉落的金币随机上限增加1个。增加至5个不在提升 如:原本为200%,随机数量为【1-3】,当提升至300%时,上限加1.随机数量变为【1-4】 */ public static getDropGoldCount():number{ if(Common.curLevel == 1 || Common.curLevel == 2){ return Common.getRandom(1,3); } else if(Common.curLevel == 3){ return Common.getRandom(1,2); } //就算金币的最大数量 let maxDropCount = Math.floor(UserInfo.goldDropLevel*0.1) + 3; if(maxDropCount > 8){ maxDropCount = 8; } // 获得一个随机数量 let dropCount:number = Common.getRandom(1,maxDropCount); return dropCount } //返回掉落的id public static getDropGoldId():number{ let dataLenght = LDataGoldManager.dataList.length let randomValue = Common.getRandom(0,100+UserInfo.goldDropLevel) for (let index = 0; index < dataLenght; index++) { let goldData = LDataGoldManager.dataList[index]; if(randomValue > goldData.minprobability && randomValue <= goldData.maxprobability){ return goldData.goldId; } } return 0 } //获得金币掉落的id概率 public static getDropGoldRate():number[]{ let rateArr:number[] = []; let totalRate:number = 0; for (let index = 0; index < LDataGoldManager.dataList.length; index++) { let rate = 0; let data = LDataGoldManager.GetDataById(index); if(index == 0){ rate = data.maxprobability - UserInfo.goldDropLevel; if(rate < 10){ rate = 10; } } else{ rate = rate + UserInfo.goldDropLevel - totalRate; if(rate > data.maxprobability) { rate = data.maxprobability; } totalRate = totalRate + rate if(rate > 0){ rate = totalRate; } } if(rate < 0){ rate = 0 } rateArr.push(rate); } return rateArr; } /* 消耗所需金币=((1/(10/当前等级子弹数量)*当前子弹数量*(A)^2 A初始为1,根据等级超过20级会。之前一直以1,不变 当玩家等级超过30时,提升10%,即为1.1 之后每提升10级,都会提升10%*/ //获得升级需要的金币 public static getUpgradeNeedGold(skillLevel:number):number{ let rate:number = 1; if(skillLevel > 30){ rate = (skillLevel - 30) * 0.01 + rate } return Math.ceil((1/(10/skillLevel))*skillLevel*rate*rate) } /* // 离线金币每分钟可获得金币=(当前升级子弹所需金币*0.5+离线等级*50)/180 */ //获得离线金币奖励的数量 public static getOffLineRewardGoldCount():number{ if(UserInfo.offLineLevel <= 0){ return 0; } var testDate = new Date(); // 1000 let sTime = (testDate.getTime() - UserInfo.lastQuitTime)*0.001; // 秒 let maxTime = 43200 if(sTime > maxTime){ sTime = maxTime; } let spendGold = LevelInfo.getUpgradeNeedGold(UserInfo.bulletShootMaxCount - 2); return Math.ceil((spendGold*0.5+UserInfo.offLineLevel*50)/10800*sTime) } }