diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 1d1d21ab8..b96cbf9b8 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -549,8 +549,8 @@ export class ComBattleHandler { let warInfo = getWarByBlueprtId(blueprtId); if (!warInfo) return resResult(STATUS.BATTLE_MISS_INFO); - const now = Date.now(); // 当前时间戳 - let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost); // 扣除体力 + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost, sid, funcs); // 扣除体力 if(!apJson) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); } diff --git a/game-server/app/servers/battle/handler/expeditionBattleHandler.ts b/game-server/app/servers/battle/handler/expeditionBattleHandler.ts index 2abe6e566..e52557bfb 100644 --- a/game-server/app/servers/battle/handler/expeditionBattleHandler.ts +++ b/game-server/app/servers/battle/handler/expeditionBattleHandler.ts @@ -123,7 +123,8 @@ export class ExpeditionBattleHandler { return resResult(STATUS.BATTLE_MISS_INFO); } - let apJson = await getAp(Date.now(), roleId); + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await getAp(roleId, role.lv); let { ap } = apJson; if (ap < warInfo.cost) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); @@ -165,8 +166,7 @@ export class ExpeditionBattleHandler { expeditionId, battleId, battleCode, - battleStatus: result.battleStatus, - apJson + battleStatus: result.battleStatus }); } @@ -202,8 +202,8 @@ export class ExpeditionBattleHandler { return resResult(STATUS.BATTLE_INFO_VALIDATE_ERR); } - const now = Date.now(); // 当前时间戳 - let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost); // 扣除体力 + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost, sid, funcs); // 扣除体力 if (!apJson) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); } @@ -224,7 +224,7 @@ export class ExpeditionBattleHandler { $set: { status: isSuccess ? 1 : 2, star } }, true); // 更新点数 - let role = await RoleModel.increaseExpeditionPoint(roleId, isSuccess ? EXPEDITION_CONST.INCREASE_POINT : 0); + role = await RoleModel.increaseExpeditionPoint(roleId, isSuccess ? EXPEDITION_CONST.INCREASE_POINT : 0); let { expeditionPoint = 0 } = role; // 关卡奖励 @@ -243,7 +243,6 @@ export class ExpeditionBattleHandler { battleCode, battleId, battleStatus: expeditionWarRecord.battleStatus, battleGoods: reward, - apJson, expeditionPoint, ...actordata }); diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index 60efdd9c1..a6537b35d 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -42,7 +42,8 @@ export class NormalBattleHandler { if (!warInfo) { return resResult(STATUS.BATTLE_MISS_INFO); } - let apJson = await getAp(Date.now(), roleId); + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await getAp(roleId, role.lv); let { ap } = apJson; if (ap < warInfo.cost) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); @@ -104,7 +105,7 @@ export class NormalBattleHandler { return resResult(STATUS.SUCCESS, { - battleId, battleCode, status, apJson, dailyNum, towerData, dungeonNum + battleId, battleCode, status, dailyNum, towerData, dungeonNum }); } @@ -153,8 +154,8 @@ export class NormalBattleHandler { return resResult(STATUS.BATTLE_INFO_VALIDATE_ERR); } - const now = Date.now(); // 当前时间戳 - let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost); // 扣除体力 + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost, sid, funcs); // 扣除体力 if (!apJson) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); } @@ -263,7 +264,6 @@ export class NormalBattleHandler { return resResult(STATUS.SUCCESS, { battleCode, battleId, status, battleGoods: reward, - apJson, towerStatus, dailyNum, dungeonNum, ...actordata }); @@ -288,8 +288,8 @@ export class NormalBattleHandler { } // 扣体力 - const now = Date.now(); // 当前时间戳 - let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost * count); // 扣除体力 + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost * count, sid, funcs); // 扣除体力 if (!apJson) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); } @@ -333,7 +333,6 @@ export class NormalBattleHandler { return resResult(STATUS.SUCCESS, { battleId, count, battleGoods: result, - apJson, dailyNum, dungeonNum, ...actordata }); diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index 1fc69a7b1..f318b2179 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -7,22 +7,20 @@ import { Application } from 'pinus'; import { FrontendSession } from 'pinus'; import { HeroModel } from './../../../db/Hero'; import { resResult } from '../../../pubUtils/util'; -import { COM_BTL_QUALITY, ROLE_SELECT, HERO_SELECT, GUILD_SELECT, USER_GUILD_SELECT, DEBUG_MAGIC_WORD, REDIS_KEY, TASK_TYPE } from '../../../consts'; +import { COM_BTL_QUALITY, HERO_SELECT, DEBUG_MAGIC_WORD, REDIS_KEY, TASK_TYPE, ENTERY_ROLE_PICK } from '../../../consts'; import { getAp } from '../../../services/actionPointService'; import { ItemModel } from '../../../db/Item'; import { chackFunOpenWhenLogin } from '../../../services/funcSwitchService'; import { loginRefresh } from '../../../services/playerEventService'; import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil'; import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin } from '../../../services/redisService'; -import { UserGuildModel } from '../../../db/UserGuild'; -import { GuildModel } from '../../../db/Guild'; -import { gameData } from '../../../pubUtils/data'; import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildChannel, leaveSysChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService'; import { reportOneOnline } from '../../../services/timeTaskService'; import { Rank } from '../../../services/rankService'; import { checkTaskWithRole, } from '../../../services/taskService'; import { pushData, everydayRefresh } from '../../../services/connectorService'; +import { pick } from 'lodash'; export default function (app: Application) { return new EntryHandler(app); @@ -95,7 +93,7 @@ export class EntryHandler { role['heros'] = heros; role['equips'] = equips; role['consumeGoods'] = items; - let apJson = await getAp(Date.now(), role.roleId); + let apJson = await getAp(role.roleId, role.lv); role['apJson'] = apJson; if (!role.showLineup) role.showLineup = role.topLineup.map(cur => cur.hid); @@ -110,7 +108,7 @@ export class EntryHandler { let todayZeroPoint = getZeroPoint(); role['todayZeroPoint'] = todayZeroPoint; - return resResult(STATUS.SUCCESS, { role }); + return resResult(STATUS.SUCCESS, { role: pick(role, ENTERY_ROLE_PICK) }); } diff --git a/game-server/app/servers/role/handler/itemHandler.ts b/game-server/app/servers/role/handler/itemHandler.ts index 1f45675b1..22925dcf8 100644 --- a/game-server/app/servers/role/handler/itemHandler.ts +++ b/game-server/app/servers/role/handler/itemHandler.ts @@ -6,7 +6,7 @@ import { resResult, parseGoodStr, getRandValueByMinMax, getRandEelm } from "../. import { addItems, handleCost, decreaseItems } from "../../../services/rewardService"; import Equip, { EquipModel, EquipType } from "../../../db/Equip"; import { HeroModel, EPlace } from "../../../db/Hero"; -import Role from "../../../db/Role"; +import Role, { RoleModel } from "../../../db/Role"; import { calPlayerCeAndSave } from "../../../services/playerCeService"; import { getHeroJob, getGoodById, gameData, getHeroEquipByClassId } from "../../../pubUtils/data"; import { EQUIP } from "../../../pubUtils/dicParam"; @@ -17,6 +17,7 @@ import { indexOf, findIndex } from 'underscore'; import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService"; import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService"; import { useGiftPackage } from "../../../services/activity/giftPackageService"; +import { getAp, setAp } from "../../../services/actionPointService"; export default function (app: Application) { return new ItemHandler(app); @@ -63,4 +64,57 @@ export class ItemHandler { } + // 使用体力道具 + public async useApItem(msg: { id: number, count: number }, session: BackendSession) { + let { id, count } = msg; + const roleId = session.get('roleId'); + const sid = session.get('sid'); + const funcs = session.get('funcs'); + + if (count > 0) { + let dicGoods = gameData.goods.get(id); + if (!dicGoods) { + return resResult(STATUS.DIC_DATA_NOT_FOUND); + } + let dicItid = ITID.get(dicGoods.itid); + if (!dicItid) return resResult(STATUS.DIC_DATA_NOT_FOUND); + if (dicItid.type != CONSUME_TYPE.AP) { + return resResult(STATUS.ROLE_METERIAL_ERROR); + } + + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let { isOver } = await getAp(roleId, role.lv); + if(isOver) return resResult(STATUS.AP_IS_FULL); + + let consumeResult = await handleCost(roleId, sid, [{ id: id, count: count }]); + if (!consumeResult) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + + let apJson = await setAp(roleId, role.lv, dicGoods.value * count, sid, funcs); + + return resResult(STATUS.SUCCESS, { + apJson + }); + } + + return resResult(STATUS.WRONG_PARMS); + + } + + public async debugIncAp(msg: { ap: number }, session: BackendSession) { + const roleId = session.get('roleId'); + const sid = session.get('sid'); + const funcs = session.get('funcs'); + + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await setAp(roleId, role.lv, msg.ap, sid, funcs); + if(!apJson) return resResult(STATUS.BATTLE_ACTION_POINT_LACK) + return resResult(STATUS.SUCCESS, { apJson }); + } + public async debugGetAp(msg: { }, session: BackendSession) { + let roleId = session.get('roleId'); + + let role = await RoleModel.findByRoleId(roleId, 'lv'); + let apJson = await getAp(roleId, role.lv); + return resResult(STATUS.SUCCESS, { apJson }); + } } \ No newline at end of file diff --git a/game-server/app/services/actionPointService.ts b/game-server/app/services/actionPointService.ts index 722dd333a..10eece1e7 100644 --- a/game-server/app/services/actionPointService.ts +++ b/game-server/app/services/actionPointService.ts @@ -3,48 +3,79 @@ */ import { ActionPointModel } from '../db/ActionPoint'; -import { ACTION_POIN, TASK_TYPE } from '../consts'; +import { TASK_TYPE, STATUS } from '../consts'; import { checkTask } from './taskService'; +import { getDicApByLv } from '../pubUtils/data'; +import { pinus } from 'pinus'; +import { resResult } from '../pubUtils/util'; -export async function getAp(now: number, roleId: string) { +/** + * 获取当前体力 + * @param roleId 玩家id + * @param lv 玩家等级 + */ +export async function getAp(roleId: string, lv: number) { + const now = Date.now(); + const dicAp = getDicApByLv(lv); let dataAp = await ActionPointModel.getAp(roleId); - const maxAp = ACTION_POIN.MAX; // 最大体力值 - const per = ACTION_POIN.PER; // 恢复时间(ms) + const maxAp = dicAp.maxAp; // 最大体力值 + const per = dicAp.perApRestoreTime * 1000; // 恢复时间(ms) let {ap, refTime} = dataAp; + if(ap >= maxAp) { // 体力溢出不需要做时间的处理 - return { ap, maxAp, refTime: now, apRemainTime:0, isOver: true } + return { ap, maxAp, refTime: now, apRemainTime:0, apMaxRemainTime: 0, isOver: true } } else { if(refTime > now) refTime = now; // refTime:每次记录时候最近的一个整的时间点,绝对不会大于now let n = Math.floor((now - refTime)/per); // 上次记录到现在可以增长多少体力 ap += n; // 增加上 if(ap >= maxAp) { // 加上后溢出了 ap = maxAp; - return { ap, maxAp, refTime: now, apRemainTime:0, isOver: true } + return { ap, maxAp, refTime: now, apRemainTime:0, apMaxRemainTime: 0, isOver: true } } else { refTime += n * per; // 更新refTime到离现在最近的一个整的时间点 let apRemainTime = Math.floor((refTime + per - now)/1000); // 恢复下一点需要多少时间 - - return { ap, maxAp, refTime, apRemainTime, isOver: false } + let apMaxRemainTime = (maxAp - ap - 1) * dicAp.perApRestoreTime + apRemainTime; + return { ap, maxAp, refTime, apRemainTime, apMaxRemainTime, isOver: false } } } } -export async function setAp(now: number, roleId: string, sid: string, funcs: number[], changeAp: number) { - let ApResult = await getAp(now, roleId); - let { ap, maxAp, refTime, apRemainTime, isOver } = ApResult; // 更新ap +/** + * 增加或减少体力 + * @param roleId 玩家id + * @param lv 玩家等级 + * @param changeAp 体力变化,正是加,负是减 + * @param sid + * @param funcs 开启的功能 + */ +export async function setAp(roleId: string, lv: number, changeAp: number, sid: string, funcs: number[]) { + const now = Date.now(); + const dicAp = getDicApByLv(lv); + let ApResult = await getAp(roleId, lv); + let { ap, maxAp, refTime, apRemainTime, apMaxRemainTime, isOver } = ApResult; // 更新ap ap += changeAp; if(ap >= maxAp) { // 溢出 refTime = now; apRemainTime = 0; + apMaxRemainTime = 0; } if(ap < 0) return null // 体力不足 await ActionPointModel.saveAp(roleId, ap, refTime); - if(isOver && ap < maxAp) apRemainTime = Math.floor(ACTION_POIN.PER / 1000); // 特殊处理 + if(isOver && ap < maxAp) { // 特殊处理,溢出之后做减少体力的操作时 + apRemainTime = dicAp.perApRestoreTime; + apMaxRemainTime = (maxAp - ap) * dicAp.perApRestoreTime; + } if(changeAp < 0) { await checkTask(roleId, sid, funcs, TASK_TYPE.BATTLE_COST_AP, -1 * changeAp, true, {}); } - return {ap, maxAp, refTime, apRemainTime} + let apJson = {ap, maxAp, refTime, apMaxRemainTime, apRemainTime}; + if(changeAp != 0) { + let uids = [{ uid: roleId, sid }]; + pinus.app.get('channelService').pushMessageByUids('onApUpdate', resResult(STATUS.SUCCESS, { apJson }), uids); + } + + return apJson } diff --git a/game-server/app/services/normalBattleService.ts b/game-server/app/services/normalBattleService.ts index 2f808df4b..43d76f1a5 100644 --- a/game-server/app/services/normalBattleService.ts +++ b/game-server/app/services/normalBattleService.ts @@ -1,7 +1,7 @@ import { HeroModel } from '../db/Hero'; import Role, { RoleModel, RoleType } from '../db/Role' -import { getLvByExp, getExpByLv, gameData } from '../pubUtils/data'; +import { getLvByExp, getExpByLv, gameData, getDicApByLv } from '../pubUtils/data'; import { updateUserInfo } from './redisService'; import { switchOnFunc } from './funcSwitchService'; import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE } from '../consts'; @@ -11,9 +11,12 @@ import { Rank } from './rankService'; import { checkActivityTask, checkTask } from './taskService'; import { accomplishTask } from '../pubUtils/taskUtil'; import { RScriptRecordModel } from '../db/RScriptRecord'; +import { setAp } from './actionPointService'; export async function roleLevelup(roleId: string, kingExp: number, session: BackendSession) { const serverId = session.get('serverId'); + const sid = session.get('sid'); + const funcs = session.get('funcs'); let role = await RoleModel.findByRoleId(roleId); let { lv = 1, exp = 0 } = role; let canGetExp = lv < gameData.maxPlayerLv.max; // 当主公超过最大级后,挑战结算不再获得经验值 @@ -57,7 +60,12 @@ export async function roleLevelup(roleId: string, kingExp: number, session: Back getExp: getExp > 0 ? getExp : 0, // 获得的经验 mostExp: cur }); + if(i != lv) { // 升级加体力 + let dicAp = getDicApByLv(i); + await setAp(roleId, i, dicAp.restoreAp, sid, funcs); + } } + return { actordata, lv: newLv, exp: newExp, kingExp: newExp - exp }; } diff --git a/game-server/app/services/rewardService.ts b/game-server/app/services/rewardService.ts index fe31def20..251ac549e 100644 --- a/game-server/app/services/rewardService.ts +++ b/game-server/app/services/rewardService.ts @@ -132,7 +132,7 @@ export async function addItems(roleId: string, roleName: string, sid: string, go let role = await RoleModel.findByRoleId(roleId); for (let key in currencysMap) { if (key == 'ap') { - let { ap } = await setAp(Date.now(), roleId, sid, null, currencysMap[key]); + let { ap } = await setAp(roleId, role.lv, currencysMap[key], sid, []); currencysMap.ap = ap; } else { currencysMap[key] += role[key]; diff --git a/shared/consts/constModules/itemConst.ts b/shared/consts/constModules/itemConst.ts index 4cb3de4c1..005958147 100644 --- a/shared/consts/constModules/itemConst.ts +++ b/shared/consts/constModules/itemConst.ts @@ -32,6 +32,7 @@ export const CONSUME_TYPE = { FRAME: 12, // 相框 SPINE: 13, // 形象 GIFT_PACKAGE: 14, // 礼包 + AP: 15, // 回复体力道具 }; export enum ROLE_TERAPH { @@ -142,7 +143,8 @@ const itid_array = [ { id: 50, name: '形象', table: 'role', type: CONSUME_TYPE.HEAD }, { id: 51, name: '相框', table: 'role', type: CONSUME_TYPE.FRAME }, { id: 52, name: '玩家形象', table: 'role', type: CONSUME_TYPE.SPINE }, - + { id: 55, name: '回复体力道具', table: 'item', type: CONSUME_TYPE.AP }, + ]; export const ITID = new Map(); diff --git a/shared/consts/constModules/selectConst.ts b/shared/consts/constModules/selectConst.ts index 743571837..20368109f 100644 --- a/shared/consts/constModules/selectConst.ts +++ b/shared/consts/constModules/selectConst.ts @@ -48,3 +48,5 @@ export enum GUILD_SELECT { export enum FRIEND_SHIP_SELECT { GET_FRIEND_VALUE = 'friendValue friendLv' } + +export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'equips', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson']; \ No newline at end of file diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 50390391b..e0ffa5d18 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -448,7 +448,8 @@ export const FILENAME = { DIC_GK_MJSD: 'dic_zyz_gk_activity_mjsd', DIC_SERVER_NAME: 'dic_zyz_serverName', DIC_SERVER_GROUP_NAME: 'dic_zyz_serverGropName', - DIC_GK_FES: 'dic_zyz_gk_activity_festival' + DIC_GK_FES: 'dic_zyz_gk_activity_festival', + DIC_AP: 'dic_zyz_ap' } export const WAR_RELATE_TABLES = [ diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 1c36835aa..b4136be1f 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -219,6 +219,7 @@ export const STATUS = { REWARD_CONDITION_NOT_REACH: { code: 30002, simStr: '未满足领取条件' }, REWARD_HAS_RECEIVED: { code: 30003, simStr: '奖励已领取' }, NOT_CONSUME_GOODS: { code: 30004, simStr: '非消耗品' }, + AP_IS_FULL: { code: 30005, simStr: '满体力不可使用道具' }, // 武将养成通用 30100 - 30199 diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index cfbe76fe0..52f819e65 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -85,6 +85,7 @@ import { loadRMB, dicRMB } from './dictionary/DicRMB'; import { dicActivityType, loadActivityType } from './dictionary/DicActivityType'; import { dicTaskTypeDesc, loadTaskType } from './dictionary/DicTaskType'; import { dicServerName, dicServerGroupName, loadServerName } from "./dictionary/DicServerName"; +import { dicAp, loadAp, dicApMaxLevel } from './dictionary/DicAp'; export const gameData = { blurprtCompose: dicBlueprtCompose, @@ -208,6 +209,8 @@ export const gameData = { taskTypeDesc: dicTaskTypeDesc, serverNames: dicServerName, serverGroupNames: dicServerGroupName, + ap: dicAp, + apMaxLevel: dicApMaxLevel }; // 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据 @@ -701,6 +704,14 @@ export function getServerName(id: number) { return name; } +export function getDicApByLv(level: number) { + if(level > gameData.apMaxLevel.max) { + return gameData.ap.get(gameData.apMaxLevel.max); + } else { + return gameData.ap.get(level); + } +} + // 初始加载 function initDatas() { parseDicParam(); @@ -799,6 +810,7 @@ function loadDatas() { loadActivityType(); loadTaskType(); loadServerName(); + loadAp(); } // 重载dicParam diff --git a/shared/pubUtils/dictionary/DicAp.ts b/shared/pubUtils/dictionary/DicAp.ts new file mode 100644 index 000000000..736cef12f --- /dev/null +++ b/shared/pubUtils/dictionary/DicAp.ts @@ -0,0 +1,36 @@ +import { readFileAndParse } from '../util' +import { FILENAME } from '../../consts' +type KeysEnum = { [P in keyof Required]: true }; +const _ = require('lodash'); + +export interface DicAp { + // 等级 + readonly level: number; + // 体力上限 + readonly maxAp: number; + // 升到这一级恢复的体力 + readonly restoreAp: number; + // 多少秒恢复1点体力 + readonly perApRestoreTime: number; +} + +const DicApKeys: KeysEnum = { + level: true, + maxAp: true, + restoreAp: true, + perApRestoreTime: true, +}; + +export const dicApMaxLevel = { max: 0 }; +export const dicAp = new Map(); +export function loadAp() { + let arr = readFileAndParse(FILENAME.DIC_AP); + arr.forEach(o => { + o.maxAp = o.maxAP; + o.restoreAp = o.restoreAP; + o.perApRestoreTime = o.perAPRestoreTime; + dicAp.set(o.level, _.pick(o, Object.keys(DicApKeys))); + if(o.level > dicApMaxLevel.max) dicApMaxLevel.max = o.level; + }); + arr = undefined; +} \ No newline at end of file