体力:修改体力逻辑
This commit is contained in:
@@ -549,8 +549,8 @@ export class ComBattleHandler {
|
|||||||
let warInfo = getWarByBlueprtId(blueprtId);
|
let warInfo = getWarByBlueprtId(blueprtId);
|
||||||
if (!warInfo) return resResult(STATUS.BATTLE_MISS_INFO);
|
if (!warInfo) return resResult(STATUS.BATTLE_MISS_INFO);
|
||||||
|
|
||||||
const now = Date.now(); // 当前时间戳
|
let role = await RoleModel.findByRoleId(roleId, 'lv');
|
||||||
let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost); // 扣除体力
|
let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost, sid, funcs); // 扣除体力
|
||||||
if(!apJson) {
|
if(!apJson) {
|
||||||
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,8 @@ export class ExpeditionBattleHandler {
|
|||||||
return resResult(STATUS.BATTLE_MISS_INFO);
|
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;
|
let { ap } = apJson;
|
||||||
if (ap < warInfo.cost) {
|
if (ap < warInfo.cost) {
|
||||||
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
||||||
@@ -165,8 +166,7 @@ export class ExpeditionBattleHandler {
|
|||||||
expeditionId,
|
expeditionId,
|
||||||
battleId,
|
battleId,
|
||||||
battleCode,
|
battleCode,
|
||||||
battleStatus: result.battleStatus,
|
battleStatus: result.battleStatus
|
||||||
apJson
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,8 +202,8 @@ export class ExpeditionBattleHandler {
|
|||||||
return resResult(STATUS.BATTLE_INFO_VALIDATE_ERR);
|
return resResult(STATUS.BATTLE_INFO_VALIDATE_ERR);
|
||||||
}
|
}
|
||||||
|
|
||||||
const now = Date.now(); // 当前时间戳
|
let role = await RoleModel.findByRoleId(roleId, 'lv');
|
||||||
let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost); // 扣除体力
|
let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost, sid, funcs); // 扣除体力
|
||||||
if (!apJson) {
|
if (!apJson) {
|
||||||
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
||||||
}
|
}
|
||||||
@@ -224,7 +224,7 @@ export class ExpeditionBattleHandler {
|
|||||||
$set: { status: isSuccess ? 1 : 2, star }
|
$set: { status: isSuccess ? 1 : 2, star }
|
||||||
}, true);
|
}, 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;
|
let { expeditionPoint = 0 } = role;
|
||||||
|
|
||||||
// 关卡奖励
|
// 关卡奖励
|
||||||
@@ -243,7 +243,6 @@ export class ExpeditionBattleHandler {
|
|||||||
battleCode, battleId,
|
battleCode, battleId,
|
||||||
battleStatus: expeditionWarRecord.battleStatus,
|
battleStatus: expeditionWarRecord.battleStatus,
|
||||||
battleGoods: reward,
|
battleGoods: reward,
|
||||||
apJson,
|
|
||||||
expeditionPoint,
|
expeditionPoint,
|
||||||
...actordata
|
...actordata
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ export class NormalBattleHandler {
|
|||||||
if (!warInfo) {
|
if (!warInfo) {
|
||||||
return resResult(STATUS.BATTLE_MISS_INFO);
|
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;
|
let { ap } = apJson;
|
||||||
if (ap < warInfo.cost) {
|
if (ap < warInfo.cost) {
|
||||||
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
||||||
@@ -104,7 +105,7 @@ export class NormalBattleHandler {
|
|||||||
|
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, {
|
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);
|
return resResult(STATUS.BATTLE_INFO_VALIDATE_ERR);
|
||||||
}
|
}
|
||||||
|
|
||||||
const now = Date.now(); // 当前时间戳
|
let role = await RoleModel.findByRoleId(roleId, 'lv');
|
||||||
let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost); // 扣除体力
|
let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost, sid, funcs); // 扣除体力
|
||||||
if (!apJson) {
|
if (!apJson) {
|
||||||
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
||||||
}
|
}
|
||||||
@@ -263,7 +264,6 @@ export class NormalBattleHandler {
|
|||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
battleCode, battleId, status,
|
battleCode, battleId, status,
|
||||||
battleGoods: reward,
|
battleGoods: reward,
|
||||||
apJson,
|
|
||||||
towerStatus, dailyNum, dungeonNum,
|
towerStatus, dailyNum, dungeonNum,
|
||||||
...actordata
|
...actordata
|
||||||
});
|
});
|
||||||
@@ -288,8 +288,8 @@ export class NormalBattleHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 扣体力
|
// 扣体力
|
||||||
const now = Date.now(); // 当前时间戳
|
let role = await RoleModel.findByRoleId(roleId, 'lv');
|
||||||
let apJson = await setAp(now, roleId, sid, funcs, -1 * warInfo.cost * count); // 扣除体力
|
let apJson = await setAp(roleId, role.lv, -1 * warInfo.cost * count, sid, funcs); // 扣除体力
|
||||||
if (!apJson) {
|
if (!apJson) {
|
||||||
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
|
||||||
}
|
}
|
||||||
@@ -333,7 +333,6 @@ export class NormalBattleHandler {
|
|||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
battleId, count,
|
battleId, count,
|
||||||
battleGoods: result,
|
battleGoods: result,
|
||||||
apJson,
|
|
||||||
dailyNum, dungeonNum,
|
dailyNum, dungeonNum,
|
||||||
...actordata
|
...actordata
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,22 +7,20 @@ import { Application } from 'pinus';
|
|||||||
import { FrontendSession } from 'pinus';
|
import { FrontendSession } from 'pinus';
|
||||||
import { HeroModel } from './../../../db/Hero';
|
import { HeroModel } from './../../../db/Hero';
|
||||||
import { resResult } from '../../../pubUtils/util';
|
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 { getAp } from '../../../services/actionPointService';
|
||||||
import { ItemModel } from '../../../db/Item';
|
import { ItemModel } from '../../../db/Item';
|
||||||
import { chackFunOpenWhenLogin } from '../../../services/funcSwitchService';
|
import { chackFunOpenWhenLogin } from '../../../services/funcSwitchService';
|
||||||
import { loginRefresh } from '../../../services/playerEventService';
|
import { loginRefresh } from '../../../services/playerEventService';
|
||||||
import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil';
|
import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil';
|
||||||
import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin } from '../../../services/redisService';
|
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 { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildChannel, leaveSysChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService';
|
||||||
import { reportOneOnline } from '../../../services/timeTaskService';
|
import { reportOneOnline } from '../../../services/timeTaskService';
|
||||||
import { Rank } from '../../../services/rankService';
|
import { Rank } from '../../../services/rankService';
|
||||||
import { checkTaskWithRole, } from '../../../services/taskService';
|
import { checkTaskWithRole, } from '../../../services/taskService';
|
||||||
import { pushData, everydayRefresh } from '../../../services/connectorService';
|
import { pushData, everydayRefresh } from '../../../services/connectorService';
|
||||||
|
import { pick } from 'lodash';
|
||||||
|
|
||||||
export default function (app: Application) {
|
export default function (app: Application) {
|
||||||
return new EntryHandler(app);
|
return new EntryHandler(app);
|
||||||
@@ -95,7 +93,7 @@ export class EntryHandler {
|
|||||||
role['heros'] = heros;
|
role['heros'] = heros;
|
||||||
role['equips'] = equips;
|
role['equips'] = equips;
|
||||||
role['consumeGoods'] = items;
|
role['consumeGoods'] = items;
|
||||||
let apJson = await getAp(Date.now(), role.roleId);
|
let apJson = await getAp(role.roleId, role.lv);
|
||||||
role['apJson'] = apJson;
|
role['apJson'] = apJson;
|
||||||
|
|
||||||
if (!role.showLineup) role.showLineup = role.topLineup.map(cur => cur.hid);
|
if (!role.showLineup) role.showLineup = role.topLineup.map(cur => cur.hid);
|
||||||
@@ -110,7 +108,7 @@ export class EntryHandler {
|
|||||||
let todayZeroPoint = getZeroPoint();
|
let todayZeroPoint = getZeroPoint();
|
||||||
role['todayZeroPoint'] = todayZeroPoint;
|
role['todayZeroPoint'] = todayZeroPoint;
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, { role });
|
return resResult(STATUS.SUCCESS, { role: pick(role, ENTERY_ROLE_PICK) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { resResult, parseGoodStr, getRandValueByMinMax, getRandEelm } from "../.
|
|||||||
import { addItems, handleCost, decreaseItems } from "../../../services/rewardService";
|
import { addItems, handleCost, decreaseItems } from "../../../services/rewardService";
|
||||||
import Equip, { EquipModel, EquipType } from "../../../db/Equip";
|
import Equip, { EquipModel, EquipType } from "../../../db/Equip";
|
||||||
import { HeroModel, EPlace } from "../../../db/Hero";
|
import { HeroModel, EPlace } from "../../../db/Hero";
|
||||||
import Role from "../../../db/Role";
|
import Role, { RoleModel } from "../../../db/Role";
|
||||||
import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
||||||
import { getHeroJob, getGoodById, gameData, getHeroEquipByClassId } from "../../../pubUtils/data";
|
import { getHeroJob, getGoodById, gameData, getHeroEquipByClassId } from "../../../pubUtils/data";
|
||||||
import { EQUIP } from "../../../pubUtils/dicParam";
|
import { EQUIP } from "../../../pubUtils/dicParam";
|
||||||
@@ -17,6 +17,7 @@ import { indexOf, findIndex } from 'underscore';
|
|||||||
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
|
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
|
||||||
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService";
|
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService";
|
||||||
import { useGiftPackage } from "../../../services/activity/giftPackageService";
|
import { useGiftPackage } from "../../../services/activity/giftPackageService";
|
||||||
|
import { getAp, setAp } from "../../../services/actionPointService";
|
||||||
|
|
||||||
export default function (app: Application) {
|
export default function (app: Application) {
|
||||||
return new ItemHandler(app);
|
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 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,48 +3,79 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { ActionPointModel } from '../db/ActionPoint';
|
import { ActionPointModel } from '../db/ActionPoint';
|
||||||
import { ACTION_POIN, TASK_TYPE } from '../consts';
|
import { TASK_TYPE, STATUS } from '../consts';
|
||||||
import { checkTask } from './taskService';
|
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);
|
let dataAp = await ActionPointModel.getAp(roleId);
|
||||||
const maxAp = ACTION_POIN.MAX; // 最大体力值
|
const maxAp = dicAp.maxAp; // 最大体力值
|
||||||
const per = ACTION_POIN.PER; // 恢复时间(ms)
|
const per = dicAp.perApRestoreTime * 1000; // 恢复时间(ms)
|
||||||
let {ap, refTime} = dataAp;
|
let {ap, refTime} = dataAp;
|
||||||
|
|
||||||
if(ap >= maxAp) {
|
if(ap >= maxAp) {
|
||||||
// 体力溢出不需要做时间的处理
|
// 体力溢出不需要做时间的处理
|
||||||
return { ap, maxAp, refTime: now, apRemainTime:0, isOver: true }
|
return { ap, maxAp, refTime: now, apRemainTime:0, apMaxRemainTime: 0, isOver: true }
|
||||||
} else {
|
} else {
|
||||||
if(refTime > now) refTime = now; // refTime:每次记录时候最近的一个整的时间点,绝对不会大于now
|
if(refTime > now) refTime = now; // refTime:每次记录时候最近的一个整的时间点,绝对不会大于now
|
||||||
let n = Math.floor((now - refTime)/per); // 上次记录到现在可以增长多少体力
|
let n = Math.floor((now - refTime)/per); // 上次记录到现在可以增长多少体力
|
||||||
ap += n; // 增加上
|
ap += n; // 增加上
|
||||||
if(ap >= maxAp) { // 加上后溢出了
|
if(ap >= maxAp) { // 加上后溢出了
|
||||||
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 {
|
} else {
|
||||||
refTime += n * per; // 更新refTime到离现在最近的一个整的时间点
|
refTime += n * per; // 更新refTime到离现在最近的一个整的时间点
|
||||||
let apRemainTime = Math.floor((refTime + per - now)/1000); // 恢复下一点需要多少时间
|
let apRemainTime = Math.floor((refTime + per - now)/1000); // 恢复下一点需要多少时间
|
||||||
|
let apMaxRemainTime = (maxAp - ap - 1) * dicAp.perApRestoreTime + apRemainTime;
|
||||||
return { ap, maxAp, refTime, apRemainTime, isOver: false }
|
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;
|
ap += changeAp;
|
||||||
if(ap >= maxAp) { // 溢出
|
if(ap >= maxAp) { // 溢出
|
||||||
refTime = now;
|
refTime = now;
|
||||||
apRemainTime = 0;
|
apRemainTime = 0;
|
||||||
|
apMaxRemainTime = 0;
|
||||||
}
|
}
|
||||||
if(ap < 0) return null // 体力不足
|
if(ap < 0) return null // 体力不足
|
||||||
await ActionPointModel.saveAp(roleId, ap, refTime);
|
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) {
|
if(changeAp < 0) {
|
||||||
await checkTask(roleId, sid, funcs, TASK_TYPE.BATTLE_COST_AP, -1 * changeAp, true, {});
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
import { HeroModel } from '../db/Hero';
|
import { HeroModel } from '../db/Hero';
|
||||||
import Role, { RoleModel, RoleType } from '../db/Role'
|
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 { updateUserInfo } from './redisService';
|
||||||
import { switchOnFunc } from './funcSwitchService';
|
import { switchOnFunc } from './funcSwitchService';
|
||||||
import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE } from '../consts';
|
import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE } from '../consts';
|
||||||
@@ -11,9 +11,12 @@ import { Rank } from './rankService';
|
|||||||
import { checkActivityTask, checkTask } from './taskService';
|
import { checkActivityTask, checkTask } from './taskService';
|
||||||
import { accomplishTask } from '../pubUtils/taskUtil';
|
import { accomplishTask } from '../pubUtils/taskUtil';
|
||||||
import { RScriptRecordModel } from '../db/RScriptRecord';
|
import { RScriptRecordModel } from '../db/RScriptRecord';
|
||||||
|
import { setAp } from './actionPointService';
|
||||||
|
|
||||||
export async function roleLevelup(roleId: string, kingExp: number, session: BackendSession) {
|
export async function roleLevelup(roleId: string, kingExp: number, session: BackendSession) {
|
||||||
const serverId = session.get('serverId');
|
const serverId = session.get('serverId');
|
||||||
|
const sid = session.get('sid');
|
||||||
|
const funcs = session.get('funcs');
|
||||||
let role = await RoleModel.findByRoleId(roleId);
|
let role = await RoleModel.findByRoleId(roleId);
|
||||||
let { lv = 1, exp = 0 } = role;
|
let { lv = 1, exp = 0 } = role;
|
||||||
let canGetExp = lv < gameData.maxPlayerLv.max; // 当主公超过最大级后,挑战结算不再获得经验值
|
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, // 获得的经验
|
getExp: getExp > 0 ? getExp : 0, // 获得的经验
|
||||||
mostExp: cur
|
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 };
|
return { actordata, lv: newLv, exp: newExp, kingExp: newExp - exp };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ export async function addItems(roleId: string, roleName: string, sid: string, go
|
|||||||
let role = await RoleModel.findByRoleId(roleId);
|
let role = await RoleModel.findByRoleId(roleId);
|
||||||
for (let key in currencysMap) {
|
for (let key in currencysMap) {
|
||||||
if (key == 'ap') {
|
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;
|
currencysMap.ap = ap;
|
||||||
} else {
|
} else {
|
||||||
currencysMap[key] += role[key];
|
currencysMap[key] += role[key];
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ export const CONSUME_TYPE = {
|
|||||||
FRAME: 12, // 相框
|
FRAME: 12, // 相框
|
||||||
SPINE: 13, // 形象
|
SPINE: 13, // 形象
|
||||||
GIFT_PACKAGE: 14, // 礼包
|
GIFT_PACKAGE: 14, // 礼包
|
||||||
|
AP: 15, // 回复体力道具
|
||||||
};
|
};
|
||||||
|
|
||||||
export enum ROLE_TERAPH {
|
export enum ROLE_TERAPH {
|
||||||
@@ -142,7 +143,8 @@ const itid_array = [
|
|||||||
{ id: 50, name: '形象', table: 'role', type: CONSUME_TYPE.HEAD },
|
{ id: 50, name: '形象', table: 'role', type: CONSUME_TYPE.HEAD },
|
||||||
{ id: 51, name: '相框', table: 'role', type: CONSUME_TYPE.FRAME },
|
{ id: 51, name: '相框', table: 'role', type: CONSUME_TYPE.FRAME },
|
||||||
{ id: 52, name: '玩家形象', table: 'role', type: CONSUME_TYPE.SPINE },
|
{ id: 52, name: '玩家形象', table: 'role', type: CONSUME_TYPE.SPINE },
|
||||||
|
{ id: 55, name: '回复体力道具', table: 'item', type: CONSUME_TYPE.AP },
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
export const ITID = new Map<number, { id: number, name: string, table: string, type?: number, isCurrency?: boolean, equipJewel?: number }>();
|
export const ITID = new Map<number, { id: number, name: string, table: string, type?: number, isCurrency?: boolean, equipJewel?: number }>();
|
||||||
|
|||||||
@@ -48,3 +48,5 @@ export enum GUILD_SELECT {
|
|||||||
export enum FRIEND_SHIP_SELECT {
|
export enum FRIEND_SHIP_SELECT {
|
||||||
GET_FRIEND_VALUE = 'friendValue friendLv'
|
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'];
|
||||||
@@ -448,7 +448,8 @@ export const FILENAME = {
|
|||||||
DIC_GK_MJSD: 'dic_zyz_gk_activity_mjsd',
|
DIC_GK_MJSD: 'dic_zyz_gk_activity_mjsd',
|
||||||
DIC_SERVER_NAME: 'dic_zyz_serverName',
|
DIC_SERVER_NAME: 'dic_zyz_serverName',
|
||||||
DIC_SERVER_GROUP_NAME: 'dic_zyz_serverGropName',
|
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 = [
|
export const WAR_RELATE_TABLES = [
|
||||||
|
|||||||
@@ -219,6 +219,7 @@ export const STATUS = {
|
|||||||
REWARD_CONDITION_NOT_REACH: { code: 30002, simStr: '未满足领取条件' },
|
REWARD_CONDITION_NOT_REACH: { code: 30002, simStr: '未满足领取条件' },
|
||||||
REWARD_HAS_RECEIVED: { code: 30003, simStr: '奖励已领取' },
|
REWARD_HAS_RECEIVED: { code: 30003, simStr: '奖励已领取' },
|
||||||
NOT_CONSUME_GOODS: { code: 30004, simStr: '非消耗品' },
|
NOT_CONSUME_GOODS: { code: 30004, simStr: '非消耗品' },
|
||||||
|
AP_IS_FULL: { code: 30005, simStr: '满体力不可使用道具' },
|
||||||
|
|
||||||
// 武将养成通用 30100 - 30199
|
// 武将养成通用 30100 - 30199
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ import { loadRMB, dicRMB } from './dictionary/DicRMB';
|
|||||||
import { dicActivityType, loadActivityType } from './dictionary/DicActivityType';
|
import { dicActivityType, loadActivityType } from './dictionary/DicActivityType';
|
||||||
import { dicTaskTypeDesc, loadTaskType } from './dictionary/DicTaskType';
|
import { dicTaskTypeDesc, loadTaskType } from './dictionary/DicTaskType';
|
||||||
import { dicServerName, dicServerGroupName, loadServerName } from "./dictionary/DicServerName";
|
import { dicServerName, dicServerGroupName, loadServerName } from "./dictionary/DicServerName";
|
||||||
|
import { dicAp, loadAp, dicApMaxLevel } from './dictionary/DicAp';
|
||||||
|
|
||||||
export const gameData = {
|
export const gameData = {
|
||||||
blurprtCompose: dicBlueprtCompose,
|
blurprtCompose: dicBlueprtCompose,
|
||||||
@@ -208,6 +209,8 @@ export const gameData = {
|
|||||||
taskTypeDesc: dicTaskTypeDesc,
|
taskTypeDesc: dicTaskTypeDesc,
|
||||||
serverNames: dicServerName,
|
serverNames: dicServerName,
|
||||||
serverGroupNames: dicServerGroupName,
|
serverGroupNames: dicServerGroupName,
|
||||||
|
ap: dicAp,
|
||||||
|
apMaxLevel: dicApMaxLevel
|
||||||
};
|
};
|
||||||
|
|
||||||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||||||
@@ -701,6 +704,14 @@ export function getServerName(id: number) {
|
|||||||
return name;
|
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() {
|
function initDatas() {
|
||||||
parseDicParam();
|
parseDicParam();
|
||||||
@@ -799,6 +810,7 @@ function loadDatas() {
|
|||||||
loadActivityType();
|
loadActivityType();
|
||||||
loadTaskType();
|
loadTaskType();
|
||||||
loadServerName();
|
loadServerName();
|
||||||
|
loadAp();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重载dicParam
|
// 重载dicParam
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import { readFileAndParse } from '../util'
|
||||||
|
import { FILENAME } from '../../consts'
|
||||||
|
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||||||
|
const _ = require('lodash');
|
||||||
|
|
||||||
|
export interface DicAp {
|
||||||
|
// 等级
|
||||||
|
readonly level: number;
|
||||||
|
// 体力上限
|
||||||
|
readonly maxAp: number;
|
||||||
|
// 升到这一级恢复的体力
|
||||||
|
readonly restoreAp: number;
|
||||||
|
// 多少秒恢复1点体力
|
||||||
|
readonly perApRestoreTime: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DicApKeys: KeysEnum<DicAp> = {
|
||||||
|
level: true,
|
||||||
|
maxAp: true,
|
||||||
|
restoreAp: true,
|
||||||
|
perApRestoreTime: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const dicApMaxLevel = { max: 0 };
|
||||||
|
export const dicAp = new Map<number, DicAp>();
|
||||||
|
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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user