games/FullFire/assets/scripts/Levellnfo.ts

258 lines
9.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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时显示为1k1480显示为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)
}
}