全局:加载json方法全部改为最新
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { EXTERIOR } from '../pubUtils/dicParam';
|
||||
import { ItemReward } from '../domain/dbGeneral';
|
||||
|
||||
export class RoleStatus {
|
||||
@prop({ required: true })
|
||||
@@ -48,8 +49,8 @@ export class RoleStatus {
|
||||
@prop({ required: true, default: false })
|
||||
gotReward: boolean;
|
||||
// 固定奖励
|
||||
@prop({ required: true, default: '&' })
|
||||
fixReward: string;
|
||||
@prop({ required: true, default: [], type: ItemReward })
|
||||
fixReward: ItemReward[];
|
||||
// 好友间伤害加成
|
||||
@prop({ required: true, default: 0 })
|
||||
frdRatio: number = 0;
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { ItemReward } from '../domain/dbGeneral';
|
||||
|
||||
class Reward {
|
||||
@prop({ required: true })
|
||||
point: number;
|
||||
@prop({ required: true, type: ItemReward, default: [] })
|
||||
reward: ItemReward[];
|
||||
@prop({ required: true })
|
||||
received: boolean;
|
||||
@prop({ required: true })
|
||||
recTime: Date;
|
||||
}
|
||||
/**
|
||||
* 远征记录
|
||||
*/
|
||||
@@ -14,15 +25,15 @@ export default class ExpeditionPoint extends BaseModel {
|
||||
pointCost: number; // 消耗点数
|
||||
@prop({ required: true, default: false })
|
||||
completed: boolean; // 本轮奖励是否完成
|
||||
@prop({ required: true, default: [] })
|
||||
rewards: Array<{point: number, reward: string, received:boolean, recTime: Date}>; // 领取记录
|
||||
@prop({ required: true, type: Reward, default: [] })
|
||||
rewards: Reward[]; // 领取记录
|
||||
|
||||
public static async getExpeditionPoint(roleId: string, lean = true) {
|
||||
const result: ExpeditionPointType = await ExpeditionPointModel.findOne({ roleId, completed: false }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async updatePointStatus(roleId: string, point: number, reward: string, lean = true) {
|
||||
public static async updatePointStatus(roleId: string, point: number, reward: ItemReward[], lean = true) {
|
||||
const result: ExpeditionPointType = await ExpeditionPointModel.findOneAndUpdate(
|
||||
{ roleId, completed: false },
|
||||
{ $set: { pointCost: point }, $push: {rewards:{point, reward, received: true, recTime: new Date()}}},
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
import { ComBattleTeamParam } from './../../db/ComBattleTeam';
|
||||
export type MemComBtlTeam = ComBattleTeamParam & { bossCurHp: number; curRnd: number };
|
||||
export type MemComBtlTeam = ComBattleTeamParam & { bossCurHp: number; curRnd: number; bossHp: number };
|
||||
|
||||
+47
-3
@@ -15,10 +15,10 @@ import { dicQuestion } from "./dictionary/DicQuestion";
|
||||
import { dicSe } from "./dictionary/DicSe";
|
||||
import { dicTower } from "./dictionary/DicTower";
|
||||
import { dicTowerTask } from "./dictionary/DicTowerTask";
|
||||
import { dicWar, dicWarPvp } from "./dictionary/DicWar";
|
||||
import { dicWar, dicWarPvp, dicDailyWarByType } from "./dictionary/DicWar";
|
||||
import { dicWarJson } from "./dictionary/DicWarJson";
|
||||
import { dicXunbao } from "./dictionary/DicXunbao";
|
||||
import { SPECIAL_ATTR } from "../consts";
|
||||
import { SPECIAL_ATTR, COM_BTL_LV_RANGE } from "../consts";
|
||||
import { dicFashions } from "./dictionary/DicFashions";
|
||||
import { friendShips, friendShipHidAandIds } from "./dictionary/DicFriendShip";
|
||||
import { maxFriendShipLv, dicFriendShipLevelMap } from "./dictionary/DicFriendShipLevel";
|
||||
@@ -107,6 +107,7 @@ export const gameData = {
|
||||
towerTask: dicTowerTask,
|
||||
war: dicWar,
|
||||
warJson: dicWarJson,
|
||||
dailyWarByType: dicDailyWarByType,
|
||||
xunbao: dicXunbao,
|
||||
btlBossHpSum: new Map<number, number>(),
|
||||
btlBossHp: new Map<number, Array<{ dataId: number, hp: number, actorId: number }>>(),
|
||||
@@ -193,7 +194,8 @@ export const gameData = {
|
||||
gachaHope: getGachaHopePercent(),
|
||||
gachaTurntable: getGachaTurntablePercent(),
|
||||
heroTransPiece: getHeroTransPiece(),
|
||||
giftPackage: dicGiftPackage
|
||||
giftPackage: dicGiftPackage,
|
||||
comBtlLvRange: parseComBtlLvRange()
|
||||
};
|
||||
|
||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||
@@ -301,6 +303,48 @@ export function getWarIdByBlueprtId(blueprtId: number) {
|
||||
return warId;
|
||||
}
|
||||
|
||||
export function getBossHpByBlueprtId(blueprtId: number) {
|
||||
let { dispatchJsonId } = getWarByBlueprtId(blueprtId);
|
||||
let bossHpInfo = getBossHpByWarId(dispatchJsonId);
|
||||
return bossHpInfo;
|
||||
}
|
||||
|
||||
export function getWarByBlueprtId(blueprtId: number) {
|
||||
let warId = getWarIdByBlueprtId(blueprtId);
|
||||
return gameData.war.get(warId);
|
||||
}
|
||||
|
||||
export function getRewardByBlueprtId(blueprtId: number) {
|
||||
let { fixReward } = getWarByBlueprtId(blueprtId);
|
||||
return fixReward;
|
||||
}
|
||||
|
||||
function parseComBtlLvRange() {
|
||||
let map = new Map<number, Array<number>>()
|
||||
const lvRange = COM_BTL_LV_RANGE;
|
||||
lvRange.forEach(range => {
|
||||
const lvs = [];
|
||||
for (let lv = range.minLv; lv <= range.maxLv; lv++) {
|
||||
lvs.push(lv);
|
||||
}
|
||||
map.set(range.id, lvs);
|
||||
});
|
||||
return map
|
||||
}
|
||||
|
||||
export function comBtlRangeByLv(lv: number) {
|
||||
for (let [k, v] of gameData.comBtlLvRange) {
|
||||
if (v.indexOf(lv) !== -1) {
|
||||
return k;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function comBtlRanges() {
|
||||
return Array.from(gameData.comBtlLvRange.keys());
|
||||
}
|
||||
|
||||
|
||||
export function getHeroStarByQuality(quality: number, star: number) {
|
||||
return gameData.heroStar.get(`${quality}_${star}`);
|
||||
}
|
||||
|
||||
@@ -28,10 +28,15 @@ export interface DicWar {
|
||||
readonly dailyType: number;
|
||||
// 显示章节名
|
||||
readonly detailUIBg: string[];
|
||||
// 寻宝匹配json
|
||||
readonly dispatchJsonId: number;
|
||||
// 寻宝奖励
|
||||
readonly jackpotReward: Array<{id: number, weight: number}>;
|
||||
}
|
||||
|
||||
export const dicWar = new Map<number, DicWar>();
|
||||
export const dicWarPvp = new Array<DicWar>();
|
||||
export const dicDailyWarByType = new Map<number, DicWar[]>();
|
||||
|
||||
for(let filename of WAR_RELATE_TABLES) {
|
||||
const str = readJsonFile(filename);
|
||||
@@ -42,10 +47,16 @@ for(let filename of WAR_RELATE_TABLES) {
|
||||
o.conditionReward = parseConditionReward(o.conditionReward);
|
||||
o.parseRandomReward = parseRandomReward(o.parseRandomReward);
|
||||
o.detailUIBg = parseDetailUIBg(o.detailUIBg);
|
||||
o.jackpotReward = parseJackpotReward(o.jackpotReward);
|
||||
|
||||
dicWar.set(o.war_id, o);
|
||||
if(o.warType == WAR_TYPE.PVP) {
|
||||
dicWarPvp.push(o);
|
||||
} else if (o.warType == WAR_TYPE.DAILY) {
|
||||
if(!dicDailyWarByType.has(o.dailyType)) {
|
||||
dicDailyWarByType.set(o.dailyType, []);
|
||||
}
|
||||
dicDailyWarByType.get(o.dailyType).push(o);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -94,4 +105,17 @@ function parseDetailUIBg(str: string = '') {
|
||||
if(!str) return result;
|
||||
let decodeArr = decodeArrayStr(str, '_');
|
||||
return decodeArr;
|
||||
}
|
||||
|
||||
function parseJackpotReward(str: string = '') {
|
||||
let result = new Array<{id: number, weight: number}>();
|
||||
if(!str) return result;
|
||||
let decodeArr = decodeArrayListStr(str);
|
||||
for(let [id, weight] of decodeArr) {
|
||||
if(isNaN(parseInt(id)) || isNaN(parseInt(weight))) {
|
||||
throw new Error('data table format wrong');
|
||||
}
|
||||
result.push({id: parseInt(id), weight: parseInt(weight)});
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -1,416 +0,0 @@
|
||||
import fs = require('fs');
|
||||
import path = require('path');
|
||||
import { ABI_TYPE, COM_BTL_LV_RANGE } from '../consts';
|
||||
import { decodeIdCntArrayStr } from './util';
|
||||
import { IT_TYPE } from '../consts';
|
||||
|
||||
let gamedata = {};
|
||||
const wars = ['dic_zyz_gk_main', 'dic_zyz_gk_mainElite', 'dic_zyz_gk_daily', 'dic_zyz_gk_event', 'dic_zyz_gk_tower', 'dic_zyz_gk_expedition', 'dic_zyz_gk_dungeon','dic_zyz_gk_dungeonElite', 'dic_zyz_gk_Treasure','dic_zyz_gk_branch']; // 关卡相关的表
|
||||
const allWarInfos = new Map<number, any>();
|
||||
const towerInfos = new Map<number, any>();
|
||||
const towerTaskInfos = new Map<number, any>();
|
||||
const heroInfos = new Map<number, any>();
|
||||
const jobInfos = new Map<number, any>();
|
||||
const jobClassMaxGrades = new Map<number, {grade:number, jobid:number}>();
|
||||
const jobClassAndgrades = new Map<string, {jobid:number, unlockLevel:number}>();
|
||||
const levelInfos = new Map<number, {sum: number, cur: number}>();
|
||||
const heroLevelInfo = new Map<number, number>();
|
||||
const expeditionInfo = new Map<number, any> ();
|
||||
const comBtlInfo = new Map<number, {quality: number, name: string, assistanceTime: number}>();
|
||||
const btlBossHpSum = new Map<number, number>();
|
||||
const btlBossHp = new Map<number, Array<{dataId: number, hp: number, actorId: number}>>();
|
||||
const blueprtToWar = new Map<number, number>();
|
||||
const goodInfo = new Map<number, any>();
|
||||
const blueprt = new Map<number, Array<number>>();
|
||||
const blueprtCompose = new Map<number, any>();
|
||||
const fiendShips = new Map<string, any>();
|
||||
const comBtlLvRange = new Map<number, Array<number>>();
|
||||
|
||||
function parseWarData() {
|
||||
let result = null;
|
||||
for (let filename of wars) {
|
||||
let warInfo = gamedata['jsons'][filename]||[];
|
||||
for(let war of warInfo) {
|
||||
if(war.war_id) {
|
||||
allWarInfos.set(war.war_id, war);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function parseTowerData() {
|
||||
const towerFile = 'dic_zyz_tower';
|
||||
const towerData = gamedata['jsons'][towerFile] || [];
|
||||
towerData.forEach(elem => {
|
||||
if (elem.towerFloor) {
|
||||
towerInfos.set(elem.towerFloor, elem);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function parseTowerTaskData() {
|
||||
const towerTaskFile = 'dic_zyz_search';
|
||||
const towerTaskData = gamedata['jsons'][towerTaskFile] || [];
|
||||
towerTaskData.forEach(elem => {
|
||||
if (elem && elem.taskId) {
|
||||
towerTaskInfos.set(elem.taskId, elem);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function parseHeroData() {
|
||||
const heroFile = 'dic_zyz_hero';
|
||||
const heroesData = gamedata['jsons'][heroFile] || [];
|
||||
heroesData.forEach(elem => {
|
||||
if (elem && elem.heroId) {
|
||||
elem.baseAbilityArr = new Array<number>();
|
||||
elem.baseAbilityUpArr = new Array<number>();
|
||||
|
||||
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_HP] = elem.hp||0;
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_ATK] = elem.atk||0;
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_MATK] = elem.matk||0;
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_DEF] = elem.def||0;
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_MDEF] = elem.mdef||0;
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_AGI] = elem.agi||0;
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_LUK] = elem.luk||0;
|
||||
elem.baseAbilityArr[ABI_TYPE.ABI_SPEED] = elem.speed||0;
|
||||
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_HP] = elem.hp_up||0;
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_ATK] = elem.atk_up||0;
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_MATK] = elem.matk_up||0;
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_DEF] = elem.def_up||0;
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_MDEF] = elem.mdef_up||0;
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_AGI] = elem.agi_up||0;
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_LUK] = elem.luk_up||0;
|
||||
elem.baseAbilityUpArr[ABI_TYPE.ABI_SPEED] = elem.speed_up||0;
|
||||
|
||||
heroInfos.set(elem.heroId, elem);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function parseJobData() {
|
||||
const jobFile = 'dic_zyz_job';
|
||||
const jobsData = gamedata['jsons'][jobFile] || [];
|
||||
jobsData.forEach(elem => {
|
||||
if (elem && elem.jobid) {
|
||||
elem.seids = elem.seid.split('&');
|
||||
delete elem.seid;
|
||||
jobInfos.set(elem.jobid, elem);
|
||||
let jobClass = jobClassMaxGrades.get(elem.job_class);
|
||||
if (!!jobClass && jobClass.grade < elem.grade) {
|
||||
jobClassMaxGrades.set(elem.job_class, {grade: elem.grade,jobid: elem.jobid});
|
||||
}
|
||||
jobClassAndgrades.set(elem.job_class+'_'+elem.grade,{unlockLevel:elem.unlockLevel, jobid:elem.jobid});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function parseLevelInfo() {
|
||||
const jobFile = 'dic_zyz_kingexp';
|
||||
const levelData = gamedata['jsons'][jobFile] || [];
|
||||
let exp = 0;
|
||||
levelData.forEach(elem => {
|
||||
if (elem && elem.level) {
|
||||
exp += elem.exp;
|
||||
levelInfos.set(elem.level, { sum: exp, cur: elem.exp });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function parseHeroLevelInfo() {
|
||||
const jobFile = 'dic_zyz_charexp';
|
||||
const levelData = gamedata['jsons'][jobFile] || [];
|
||||
let exp = 0;
|
||||
levelData.forEach(elem => {
|
||||
if (elem && elem.level) {
|
||||
exp += elem.exp;
|
||||
heroLevelInfo.set(elem.level, exp);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function parseExpedition() {
|
||||
const file = 'dic_expedition';
|
||||
const data = gamedata['jsons'][file] || [];
|
||||
data.forEach(elem => {
|
||||
if (elem && elem.id) {
|
||||
expeditionInfo.set(elem.id, elem);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function parseComBtlData() {
|
||||
const file = 'dic_zyz_xunbao';
|
||||
const data = gamedata['jsons'][file] || [];
|
||||
data.forEach(elem => {
|
||||
if (elem && elem.quality) {
|
||||
comBtlInfo.set(elem.quality, elem);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function parseComBtlLvRange() {
|
||||
const lvRange = COM_BTL_LV_RANGE;
|
||||
lvRange.forEach(range => {
|
||||
const lvs = [];
|
||||
for (let lv = range.minLv; lv <= range.maxLv; lv++) {
|
||||
lvs.push(lv);
|
||||
}
|
||||
comBtlLvRange.set(range.id, lvs);
|
||||
});
|
||||
}
|
||||
|
||||
function parseGood() {
|
||||
const file = 'dic_goods';
|
||||
const data = gamedata['jsons'][file] || [];
|
||||
data.forEach(elem => {
|
||||
if (elem && elem.good_id) {
|
||||
goodInfo.set(elem.good_id, elem);
|
||||
if(elem.itid == IT_TYPE.BLUEPRT) {
|
||||
let arr = blueprt.get(elem.quality)||new Array();
|
||||
arr.push(elem.good_id);
|
||||
blueprt.set(elem.quality, arr);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function parseBlueprtCompose() {
|
||||
const file = 'dic_blueprt_compose';
|
||||
const data = gamedata['jsons'][file] || [];
|
||||
data.forEach(elem => {
|
||||
if (elem && elem.quality) {
|
||||
blueprtCompose.set(elem.quality, elem);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function parseFiendShipLevels() {
|
||||
const file = 'dic_zyz_friend_ship_level';
|
||||
const data = gamedata['jsons'][file] || [];
|
||||
data.sort(function(a, b) {
|
||||
return a.level - b.level;
|
||||
});
|
||||
}
|
||||
|
||||
function initData (folder: string) {
|
||||
if(!gamedata.hasOwnProperty(folder)) {
|
||||
gamedata[folder] = {};
|
||||
}
|
||||
fs.readdirSync(__dirname + '/../resource/' + folder)
|
||||
.filter(function(file) {
|
||||
return (file.indexOf(".") !== 0) && (file !== "index.js");
|
||||
})
|
||||
//筛选有文件名且不是index进行遍历
|
||||
.forEach(function(file) {
|
||||
var name = file.split('.')[0];
|
||||
try {
|
||||
gamedata[folder][name] = JSON.parse(
|
||||
fs.readFileSync(path.resolve(__dirname, "../resource/" + folder + "/" + file)).toString('utf8').replace(/^\uFEFF/, '')
|
||||
);
|
||||
} catch(e) {
|
||||
console.error(e);
|
||||
console.error('【文件错误】:' + file);
|
||||
gamedata[folder][name] = [];
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function parseData() {
|
||||
parseWarData();
|
||||
parseTowerData();
|
||||
parseTowerTaskData();
|
||||
parseHeroData();
|
||||
parseJobData();
|
||||
parseLevelInfo();
|
||||
parseHeroLevelInfo();
|
||||
parseExpedition();
|
||||
parseComBtlData();
|
||||
parseComBtlLvRange();
|
||||
parseGood();
|
||||
parseBlueprtCompose();
|
||||
parseFiendShipLevels();
|
||||
}
|
||||
|
||||
initData('jsons'); // 加载一般json
|
||||
initData('warJsons'); // 加载出兵表
|
||||
parseData();
|
||||
|
||||
export function getGamedata(key) {
|
||||
return gamedata['jsons'][key];
|
||||
}
|
||||
|
||||
// 获取出兵表
|
||||
export function getWarJsons(key: any) {
|
||||
key = key + '';
|
||||
let arr = key.split('&');
|
||||
let index = Math.floor(Math.random() * arr.length);
|
||||
key = arr[index];
|
||||
return {
|
||||
json: gamedata['warJsons'][key],
|
||||
fileName: key
|
||||
}
|
||||
}
|
||||
|
||||
export function getWarById(warid: number) {
|
||||
return allWarInfos.get(warid);
|
||||
}
|
||||
|
||||
export function getTowerDataByLv(lv: number) {
|
||||
return towerInfos.get(lv);
|
||||
}
|
||||
|
||||
export function getGoodById(gid) {
|
||||
return goodInfo.get(gid);
|
||||
}
|
||||
|
||||
export function getBluePrtByQuality(quality: number) {
|
||||
return blueprt.get(quality)|| new Array<number>();
|
||||
}
|
||||
|
||||
export function getTaskById(tid: number) {
|
||||
const taskInfo = towerTaskInfos.get(tid);
|
||||
return taskInfo;
|
||||
}
|
||||
|
||||
export function getHeroInfoById(hid: number) {
|
||||
const heroInfo = heroInfos.get(hid);
|
||||
return heroInfo;
|
||||
}
|
||||
|
||||
export function getJobInfoById(jid: number) {
|
||||
const jobInfo = jobInfos.get(jid);
|
||||
return jobInfo;
|
||||
}
|
||||
|
||||
export function getMaxGradeByjobClass(jobClass: number) {
|
||||
const job = jobClassMaxGrades.get(jobClass);
|
||||
return job?.jobid;
|
||||
}
|
||||
|
||||
export function getLvByExp(exp: number) {
|
||||
let curLv = 0;
|
||||
let entries = levelInfos.entries();
|
||||
for (let [lv, {sum}] of entries) {
|
||||
curLv = lv;
|
||||
if(exp < sum) break;
|
||||
}
|
||||
|
||||
return curLv;
|
||||
}
|
||||
|
||||
export function getExpByLv(lv: number) {
|
||||
return levelInfos.get(lv);
|
||||
}
|
||||
|
||||
export function getHeroLvByExp(exp: number) {
|
||||
let curLv = 0;
|
||||
let entries = heroLevelInfo.entries();
|
||||
for (let [lv, sum] of entries) {
|
||||
curLv = lv;
|
||||
if(exp < sum) break;
|
||||
}
|
||||
|
||||
return curLv;
|
||||
}
|
||||
|
||||
export function getHeroExpByLv(lv: number) {
|
||||
return heroLevelInfo.get(lv);
|
||||
}
|
||||
|
||||
export function getExpeditionById(id: number) {
|
||||
return expeditionInfo.get(id);
|
||||
}
|
||||
|
||||
export function getComBtlSetByQuality(quality: number) {
|
||||
return comBtlInfo.get(quality);
|
||||
}
|
||||
|
||||
export function comBtlRangeInfo(range: number) {
|
||||
return comBtlLvRange.get(range);
|
||||
}
|
||||
|
||||
export function comBtlRangeByLv(lv: number) {
|
||||
for (let [k, v] of comBtlLvRange) {
|
||||
if (v.indexOf(lv) !== -1) {
|
||||
return k;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function comBtlRanges() {
|
||||
return Array.from(comBtlLvRange.keys());
|
||||
}
|
||||
|
||||
export function getBossHpByWarId(warId: number) {
|
||||
let bossHpSum = btlBossHpSum.get(warId) || 0;
|
||||
let bossHpArr = btlBossHp.get(warId) || [];
|
||||
if (!bossHpSum || !bossHpArr) {
|
||||
const warInfo = getWarJsons(warId).json;
|
||||
if (warInfo && warInfo.length) {
|
||||
warInfo.forEach(hero => {
|
||||
let { attribute, dataId, relation, actorId } = hero;
|
||||
if (relation === 2) {
|
||||
let attriData = decodeIdCntArrayStr(attribute, 1);
|
||||
const hp = attriData.get('1');
|
||||
if (hp > 0) {
|
||||
bossHpArr.push({dataId, hp, actorId});
|
||||
bossHpSum += hp;
|
||||
}
|
||||
}
|
||||
})
|
||||
btlBossHp.set(warId, bossHpArr);
|
||||
btlBossHpSum.set(warId, bossHpSum);
|
||||
}
|
||||
}
|
||||
return { bossHpSum, bossHpArr };
|
||||
}
|
||||
|
||||
export function getWarIdByBlueprtId(blueprtId: number) {
|
||||
let warId = blueprtToWar.get(blueprtId);
|
||||
if (!warId) {
|
||||
const { specialAttr } = getGoodById(blueprtId);
|
||||
const attrData = decodeIdCntArrayStr(specialAttr, 1);
|
||||
warId = attrData.get('1');
|
||||
blueprtToWar.set(blueprtId, warId);
|
||||
}
|
||||
return warId;
|
||||
}
|
||||
|
||||
export function getBossHpByBlueprtId(blueprtId: number) {
|
||||
let warId = getWarIdByBlueprtId(blueprtId);
|
||||
let { dispatchJsonId } = getWarById(warId);
|
||||
let bossHpInfo = getBossHpByWarId(dispatchJsonId);
|
||||
return bossHpInfo;
|
||||
}
|
||||
|
||||
export function getRewardByBlueprtId(blueprtId: number) {
|
||||
let warId = getWarIdByBlueprtId(blueprtId);
|
||||
let { fixReward } = getWarById(warId);
|
||||
return fixReward;
|
||||
}
|
||||
|
||||
export function hasExpeditionById(id: number) {
|
||||
return expeditionInfo.has(id);
|
||||
}
|
||||
|
||||
export function getBlueprtComposeByQuality(quality: number) {
|
||||
return blueprtCompose.get(quality);
|
||||
}
|
||||
|
||||
export function getFriendShipById(shipId: number, level: number) {
|
||||
return fiendShips.get(shipId +'_' + level);
|
||||
}
|
||||
|
||||
export function getJobByGradeAndClass(jobClass: number, grade: number) {
|
||||
return jobClassAndgrades.get(jobClass +'_' + grade);
|
||||
}
|
||||
|
||||
+43
-150
@@ -65,103 +65,6 @@ export function generateNum(len: number) {
|
||||
return code;
|
||||
}
|
||||
|
||||
export function decodeStr(type, str, splitForm = '|') {
|
||||
if (str == '&' || !str) {
|
||||
return []
|
||||
} else {
|
||||
return str.split(splitForm).map(cur => {
|
||||
return decodeStrSingle(type, cur);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export function decodeStrSingle(type, str) { //单层,返回对象而不是数组
|
||||
let last = str.substr(str.length - 1, 1);
|
||||
if (last == '&') str = str.substr(0, str.length - 1);
|
||||
if (str == '&' || !str) {
|
||||
return {}
|
||||
} else {
|
||||
let arr = str.split('&');
|
||||
let result: any;
|
||||
switch (type) {
|
||||
case 'fixReward': {
|
||||
let [id, count] = arr;
|
||||
if (isNaN(id) || isNaN(count)) throw new Error('data table format wrong');
|
||||
result = { id: parseInt(id), count: parseInt(count) };
|
||||
break;
|
||||
}
|
||||
case 'conditionReward': {
|
||||
let [id, count, condition] = arr;
|
||||
if (isNaN(id) || isNaN(count)) throw new Error('data table format wrong');
|
||||
result = { id: parseInt(id), count: parseInt(count), condition: parseInt(condition) };
|
||||
break;
|
||||
}
|
||||
case 'randomReward': {
|
||||
let [id, count, frequency] = arr;
|
||||
if (isNaN(id) || isNaN(count)) throw new Error('data table format wrong');
|
||||
result = { id: parseInt(id), count: parseInt(count), frequency: parseInt(frequency) };
|
||||
break;
|
||||
}
|
||||
case 'suitLevel': {
|
||||
let [min, max] = arr;
|
||||
if (isNaN(min) || isNaN(max)) throw new Error('data table format wrong');
|
||||
result = { min: parseInt(min), max: parseInt(max) };
|
||||
break;
|
||||
}
|
||||
case 'suitLevelSingle': {
|
||||
let [min, max] = arr;
|
||||
if (max) {
|
||||
if (isNaN(min) || isNaN(max)) throw new Error('data table format wrong');
|
||||
result = { min: parseInt(min), max: parseInt(max) };
|
||||
break;
|
||||
} else {
|
||||
if (isNaN(min)) throw new Error('data table format wrong');
|
||||
result = { min: parseInt(min) };
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 'attribute': {
|
||||
let [id, value] = arr;
|
||||
if (isNaN(id) || isNaN(value)) throw new Error('data table format wrong');
|
||||
result = { id: parseInt(id), value: parseInt(value) };
|
||||
break;
|
||||
}
|
||||
case 'point': {
|
||||
let [x] = arr;
|
||||
if (isNaN(x)) throw new Error('data table format wrong');
|
||||
result = x;
|
||||
break;
|
||||
}
|
||||
case 'decimalReward': {
|
||||
let [id, count] = arr;
|
||||
if (isNaN(id) || isNaN(count)) throw new Error('data table format wrong');
|
||||
result = { id: parseInt(id), count: parseFloat(count) };
|
||||
break;
|
||||
}
|
||||
case 'towerTaskCondition': {
|
||||
let [type, param, cnt] = arr;
|
||||
if (isNaN(type) || isNaN(param) || isNaN(cnt)) throw new Error('data table format wrong');
|
||||
result = { type: parseInt(type), param: parseInt(param), cnt: parseInt(cnt) };
|
||||
break;
|
||||
}
|
||||
case 'possibility': {
|
||||
let [id, weight] = arr;
|
||||
if (isNaN(id) || isNaN(weight)) throw new Error('data table format wrong');
|
||||
result = { id: parseInt(id), weight: parseInt(weight) };
|
||||
break;
|
||||
}
|
||||
case 'cost': {
|
||||
let [id, count] = arr;
|
||||
if (isNaN(id) || isNaN(count)) throw new Error('data table format wrong');
|
||||
result = { id: parseInt(id), count: parseInt(count) };
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 将 | 分隔的字符串解析为数组,如:a|b|c 解析为[a, b, c]
|
||||
* @param str 要解析的字符串
|
||||
@@ -211,32 +114,6 @@ export async function calculateSumCE(roleId: string, type: number, param: { num?
|
||||
return sum;
|
||||
}
|
||||
|
||||
export function getRandomByLen(arr: Array<any>): any {
|
||||
let len = arr.length;
|
||||
return arr[Math.floor(Math.random() * len)]
|
||||
}
|
||||
|
||||
export function getRandomIndexByLen(len: number) {
|
||||
return Math.floor(Math.random() * len);
|
||||
}
|
||||
|
||||
export function getRandomWithWeight<T extends { weight: number }>(randomList: T[]): { dic: T, index: number } {
|
||||
let len = randomList.reduce((pre, cur) => {
|
||||
return pre + cur.weight || 1;
|
||||
}, 0);
|
||||
let index = Math.floor(Math.random() * len);
|
||||
let result = { dic: null, index: -1 };
|
||||
for (let i = 0; i < randomList.length; i++) {
|
||||
let { weight = 0 } = randomList[i];
|
||||
if (index < weight) {
|
||||
result.dic = randomList[i];
|
||||
result.index = i;
|
||||
break;
|
||||
}
|
||||
index -= weight;
|
||||
}
|
||||
return result
|
||||
}
|
||||
/**
|
||||
* 传入两个时间,返回按照时间差计算,第二个时间比第一个晚几天
|
||||
* @param preTime 之前的时间
|
||||
@@ -329,6 +206,45 @@ export function getRandEelm<T>(source: Array<T> = [], cnt = 1): Array<T> {
|
||||
return source.filter((_item, idx) => idxs.has(idx));
|
||||
}
|
||||
|
||||
/**
|
||||
* 从一个数组中随机返回1元素
|
||||
* @param source
|
||||
*/
|
||||
export function getRandSingleEelm<T>(source: Array<T>): T {
|
||||
let len = source.length;
|
||||
return source[Math.floor(Math.random() * len)]
|
||||
}
|
||||
|
||||
/**
|
||||
* 随机数组中一个index
|
||||
* @param len
|
||||
*/
|
||||
export function getRandSingleIndex(len: number) {
|
||||
return Math.floor(Math.random() * len);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从一个数组根据权重随机一个元素
|
||||
* @param randomList
|
||||
*/
|
||||
export function getRandEelmWithWeight<T extends { weight: number }>(randomList: T[]): { dic: T, index: number } {
|
||||
let len = randomList.reduce((pre, cur) => {
|
||||
return pre + cur.weight || 1;
|
||||
}, 0);
|
||||
let index = Math.floor(Math.random() * len);
|
||||
let result = { dic: null, index: -1 };
|
||||
for (let i = 0; i < randomList.length; i++) {
|
||||
let { weight = 0 } = randomList[i];
|
||||
if (index < weight) {
|
||||
result.dic = randomList[i];
|
||||
result.index = i;
|
||||
break;
|
||||
}
|
||||
index -= weight;
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* 不改变原数组长度,将内部元素打乱
|
||||
* @param source
|
||||
@@ -360,7 +276,6 @@ export function getRandValueByMinMax(min: number, max: number, decimal = 2): num
|
||||
|
||||
}
|
||||
|
||||
|
||||
export function resResult(status: { code: number, simStr: string }, data = null, customMsg = '') {
|
||||
const { code, simStr } = status;
|
||||
if (code !== STATUS.SUCCESS.code) {
|
||||
@@ -452,13 +367,10 @@ export function calculateNum(ratio: { A: number, B: number }, params: { num: num
|
||||
}
|
||||
}
|
||||
|
||||
export function ratioReward(rewardStr: string, ratio: number): string {
|
||||
let rewards = decodeIdCntArrayStr(rewardStr, ratio);
|
||||
let res = '';
|
||||
for (let [k, v] of rewards) {
|
||||
res += `${k}&${v}|`;
|
||||
}
|
||||
return res.substring(0, res.length - 1);
|
||||
export function ratioReward(reward: {id: number, count: number}[], ratio: number): {id: number, count: number}[] {
|
||||
return reward.map(cur => {
|
||||
return {id: cur.id, count: cur.count * ratio}
|
||||
});
|
||||
}
|
||||
|
||||
export function getItems(str: string) {
|
||||
@@ -606,25 +518,6 @@ export function reduceCe(ce: number = 0) {
|
||||
return Math.floor(ce / HERO_CE_RATIO / HERO_CE_RATIO)
|
||||
}
|
||||
|
||||
export function getRandNum(min, max) {
|
||||
let randNum = min + Math.floor(Math.random() * (max - min + 1));
|
||||
return randNum;
|
||||
}
|
||||
|
||||
export function getRandomArr(allarr, ranNum) {
|
||||
let arr = deepCopy(allarr);
|
||||
var result = [];
|
||||
if (arr.length <= ranNum) {
|
||||
result = result.concat(arr);
|
||||
return result;
|
||||
}
|
||||
for (var i = 0; i < ranNum; i++) {
|
||||
var ran = Math.floor(Math.random() * arr.length);
|
||||
result.push(arr.splice(ran, 1)[0]);
|
||||
};
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// 获取全部属性
|
||||
export function getAllAttrStage() {
|
||||
|
||||
Reference in New Issue
Block a user