Files
ZYZ/shared/pubUtils/gamedata.ts
2020-11-27 23:27:35 +08:00

397 lines
11 KiB
TypeScript

import fs = require('fs');
import path = require('path');
import { ABI_TYPE } from '../consts/abilityConst';
import { decodeIdCntArrayStr, getRandEelm } from './util';
import { IT_TYPE } from '../consts/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']; // 关卡相关的表
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 levelInfos = new Map<number, {sum: number, cur: number}>();
const starRatioInfo = new Map<number, number>();
const heroSkillInfo = new Map<number, any>()
const seidInfo = new Map<number, any>();
const olySeidInfo = new Map<number, any>();
const expeditionInfo = new Map<number, any> ();
const comBtlInfo = new Map<number, {quality: number, name: string, assistanceTime: number, assistanceLevel: number}>();
const btlBossHp = new Map<number, number>();
const blueprtBossHp = new Map<number, number>();
const goodInfo = new Map<number, any>();
const blueprt = new Map<number, Array<number>>();
const blueprtCompose = new Map<number, any>();
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) {
jobInfos.set(elem.jobid, elem);
}
});
}
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 parseStarRatio() {
const file = 'dic_star_ratio';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem && elem.star) {
starRatioInfo.set(elem.star, elem.ratio);
}
});
}
function parseHeroSkill() {
const file = 'dic_zyz_heroskill';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem && elem.skillid) {
const seidLvUpArr = new Array<number>();
let skillArr = (elem.seid as string).split('&');
let lvUpArr = (elem.selv_up as string).split('&');
for(let i = 0;i < skillArr.length;i++){
if(skillArr[i]==="") continue;
seidLvUpArr.push(parseInt(skillArr[i]));
if(lvUpArr[i]){
seidLvUpArr.push(parseInt(lvUpArr[i]));
}
else{
seidLvUpArr.push(1000);
}
}
heroSkillInfo.set(elem.skillid, {seidLvUpArr});
}
});
}
function parseSeidList() {
const file = 'dic_zyz_se';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem && elem.id) {
let {gainvalue} = elem;
let gainValueArr = (gainvalue as string).split('&');
elem.gainValueArr = new Array();
for(let g of gainValueArr) {
if(g === "") continue;
elem.gainValueArr.push(parseInt(g));
}
seidInfo.set(elem.id, elem);
}
});
}
function parseOlySeidList() {
const file = 'dic_zyz_se_add';
const data = gamedata['jsons'][file] || [];
data.forEach(elem => {
if (elem && elem.type) {
olySeidInfo.set(elem.type, elem);
}
});
}
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 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 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()
);
} catch(e) {
console.error(e);
console.error('【文件错误】:' + file);
gamedata[folder][name] = [];
}
});
}
function parseData() {
parseWarData();
parseTowerData();
parseTowerTaskData();
parseHeroData();
parseJobData();
parseLevelInfo();
parseStarRatio();
parseHeroSkill();
parseSeidList();
parseOlySeidList();
parseExpedition();
parseComBtlData();
parseGood();
parseBlueprtCompose();
}
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 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 getStarRatio(star: number) {
return starRatioInfo.get(star);
}
export function getHeroSkillById(skillId: number) {
return heroSkillInfo.get(skillId);
}
export function getSeidById(id: number) {
return seidInfo.get(id);
}
export function getOlySeidByType(type: number) {
return olySeidInfo.get(type);
}
export function getExpeditionById(id: number) {
return expeditionInfo.get(id);
}
export function getRandExpedition(cnt = 1) {
const file = 'dic_expedition';
const data = gamedata['jsons'][file] || [];
return getRandEelm(data, cnt);
}
export function getComBtlSetByQuality(quality: number) {
return comBtlInfo.get(quality);
}
export function getBossHpByWarId(warId: number) {
let bossHp = btlBossHp.get(warId) || 0;
if (!bossHp) {
const warInfo = getWarJsons(warId).json;
if (warInfo && warInfo.length) {
warInfo.forEach(hero => {
if (hero.relation === 2) {
let { attribute } = hero;
let attriData = decodeIdCntArrayStr(attribute, 1);
const hp = parseInt(attriData.get('1'));
if (hp > 0) {
bossHp += hp;
}
}
})
}
btlBossHp.set(warId, bossHp);
}
return bossHp;
}
export function getBossHpByBlueprtId(blueprtId: number) {
let bossHp = blueprtBossHp.get(blueprtId) || 0;
if (!bossHp) {
const { specialAttr } = getGoodById(blueprtId);
const attrData = decodeIdCntArrayStr(specialAttr, 1);
const warId = parseInt(attrData.get('1'));
bossHp = getBossHpByWarId(warId);
blueprtBossHp.set(blueprtId, bossHp);
}
return bossHp;
}
export function hasExpeditionById(id: number) {
return expeditionInfo.has(id);
}
export function getBlueprtComposeByQuality(quality: number) {
return blueprtCompose.get(quality);
}