import fs = require('fs'); import path = require('path'); import { ABI_TYPE } from '../consts/abilityConst'; import { decodeIdCntArrayStr } 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(); const towerInfos = new Map(); const towerTaskInfos = new Map(); const heroInfos = new Map(); const jobInfos = new Map(); const levelInfos = new Map(); const starRatioInfo = new Map(); const heroSkillInfo = new Map() const seidInfo = new Map(); const olySeidInfo = new Map(); const expeditionInfo = new Map (); const comBtlInfo = new Map(); const btlBossHp = new Map(); const blueprtBossHp = new Map(); const goodInfo = new Map(); const blueprt = new Map>(); 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(); elem.baseAbilityUpArr = new Array(); 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(); 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 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(); } 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(); } 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 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); }