diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 037b18a13..30ef993c7 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -2,23 +2,25 @@ * @Author: 梁桐川 * @Date: 2020-11-30 15:05:48 * @Last Modified by: 梁桐川 - * @Last Modified time: 2020-12-02 00:51:27 + * @Last Modified time: 2020-12-02 13:08:30 */ import { COM_BATTLE_ASSIST_TIME, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO, COM_TEAM_STATUS } from './../../../consts/consts'; -import { IT_TYPE, GOLD_COST_RATIO, CURRENCY_BY_TYPE, CURRENCY_TYPE, COM_BATTLE_CAP_TIME, COM_BATTLE_TIME_LMT, COM_BATTLE_CAP_START_TIME } from './../../../consts/consts'; -import { getGoodById, getBossHpByBlueprtId, getComBtlSetByQuality, getBlueprtComposeByQuality, getBluePrtByQuality } from '../../../pubUtils/gamedata'; +import { IT_TYPE, GOLD_COST_RATIO, CURRENCY_BY_TYPE, CURRENCY_TYPE, COM_BATTLE_CAP_TIME, COM_BATTLE_TIME_LMT, COM_BATTLE_CAP_START_TIME, COM_BATTLE_ASSIST_REWARD_RATIO } from './../../../consts/consts'; +import { getGoodById, getBossHpByBlueprtId, getComBtlSetByQuality, getBlueprtComposeByQuality, getBluePrtByQuality, getWarById, getWarIdByBlueprtId } from '../../../pubUtils/gamedata'; import { COM_TEAM_ENABLE_LV } from '../../../consts/consts'; import { ComBattleTeamModel } from '../../../db/ComBattleTeam'; import Role, { RoleModel } from '../../../db/Role'; import { STATUS } from '../../../consts/statusCode'; import { Application, BackendSession } from 'pinus'; -import { resResult, getRandomByLen, calculateNum, getRandValue } from '../../../pubUtils/util'; +import { resResult, getRandomByLen, calculateNum, getRandValue, ratioReward } from '../../../pubUtils/util'; import { RoleStatus } from '../../../db/ComBattleTeam'; import { ItemModel } from '../../../db/Item'; -import { handleReward } from '../../../services/rewardService'; +import { handleFixedReward, handleReward } from '../../../services/rewardService'; import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; import { transBossHpArr } from '../../../services/battleService'; import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer } from '../../../services/comBattleService'; +import { setAp } from '../../../services/actionPointService'; +import { roleLevelup } from '../../../services/normalBattleService'; export default function(app: Application) { return new ComBattleHandler(app); @@ -381,7 +383,8 @@ export class ComBattleHandler { */ async setupHeroes(msg: {teamCode: string, heroes: Array, battleCode: string}, session: BackendSession) { let roleId = session.get('roleId'); - let { teamCode, heroes, battleCode } = msg; + let { teamCode, heroes, battleCode = 'default' } = msg; + if (!heroes || heroes.length === 0) return resResult(STATUS.COM_BATTLE_HEROES_ERR); let teamStatus = this.teamMap.get(teamCode); if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); @@ -532,8 +535,8 @@ export class ComBattleHandler { if (boss.curHp >= deltaHp) { totalHurtHp += deltaHp; boss.curHp -= deltaHp; - } else { - totalHurtHp += deltaHp; + } else if (boss.curHp > 0) { + totalHurtHp += boss.curHp; boss.curHp = 0; } } @@ -585,18 +588,13 @@ export class ComBattleHandler { let result = battleSt === COM_TEAM_STATUS.WIN; let team = await ComBattleTeamModel.syncTeamData({teamCode, status: battleSt, roleStatus: teamStatus.roleStatus}); if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR); - let battleCode = 'default'; - teamStatus.roleStatus.forEach(st => { - if (st.roleId === roleId) { - battleCode = st.battleCode; - } - }); + // 战斗胜利扣减藏宝图 if (result) { - let res = await ItemModel.decreaseItems(roleId, [{id: teamStatus.blueprtId, count: 1}]); + let res = await ItemModel.decreaseItems(teamStatus.capId, [{id: teamStatus.blueprtId, count: 1}]); if (!res) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH); } - channel.pushMessage('onTeamComplete', {teamCode, battleCode, result}); + channel.pushMessage('onTeamComplete', {teamCode, result}); } return resResult(STATUS.SUCCESS); } @@ -630,6 +628,53 @@ export class ComBattleHandler { return resResult(STATUS.SUCCESS, { bossCurHp: teamStatus.bossCurHp }); } + /** + * @description 寻宝结算 + * @param {{teamCode: string}} msg 寻宝队伍编号 + * @param {BackendSession} session + * @returns 掉落物品和玩家升级信息 + * @memberof ComBattleHandler + */ + async comBattleEnd(msg: {teamCode: string}, session: BackendSession) { + let roleId = session.get('roleId'); + let roleName = session.get('roleId'); + let { teamCode } = msg; + let team = await ComBattleTeamModel.getTeamByCode(teamCode); + if (!team || team.status !== COM_TEAM_STATUS.WIN) return resResult(STATUS.COM_BATTLE_REWARD_ERR); + let roleSt: RoleStatus = null; + team.roleStatus.forEach(st => { + if (st && st.roleId === roleId) { + roleSt = st; + } + }); + if (roleSt.gotReward) return resResult(STATUS.COM_BATTLE_REWARDED); + let warInfo = getWarById(getWarIdByBlueprtId(team.blueprtId)); + if (!warInfo) return resResult(STATUS.BATTLE_MISS_INFO); + + if(!warInfo.hasOwnProperty('cost')) { + warInfo['cost'] = 0; + } + + const now = Date.now(); // 当前时间戳 + let apJson = await setAp(now, roleId, -1 * warInfo.cost); // 扣除体力 + if(!apJson) { + return resResult(STATUS.BATTLE_ACTION_POINT_LACK); + } + let fixRewardStr = warInfo['fixReward']; + if (!roleSt.isCap) { + if (roleSt.isFrd) { + fixRewardStr = '&'; + } else { + fixRewardStr = ratioReward(fixRewardStr, COM_BATTLE_ASSIST_REWARD_RATIO); + } + } + await ComBattleTeamModel.updateRewardSt(roleId, true); + const goods = await handleFixedReward(roleId, roleName, fixRewardStr, 1); + let actordata = await roleLevelup(roleId, warInfo.kingExp, this.app, session);// 主公升级经验 + + return resResult(STATUS.SUCCESS, { ...goods, ...actordata }); + } + /** * @description 获取自己一段时间内的寻宝记录 * @param {{}} msg diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index ca54c0785..7f9f13e70 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -17,7 +17,6 @@ import { RScriptRecordModel } from '../../../db/RScriptRecord'; import { updateWarStar, checkBattleHeroes, roleLevelup } from '../../../services/normalBattleService'; import { checkDungeonNum, checkDungeonAndIncrease } from '../../../services/dungeonService'; import { switchOnFunc } from '../../../services/funcSwitchService'; -import { checkComBattleDrop } from '../../../services/comBattleService'; export default function(app: Application) { return new NormalBattleHandler(app); @@ -162,6 +161,10 @@ export class NormalBattleHandler { if(!warInfo) { return resResult(STATUS.BATTLE_MISS_INFO); } + // 寻宝不使用通用战斗模块结算 + if (warInfo.warType == WAR_TYPE.WARLOARDS) { + return resResult(STATUS.BATTLE_END_WRONG_TYPE); + } if(!warInfo.hasOwnProperty('cost')) { warInfo['cost'] = 0; } @@ -220,15 +223,6 @@ export class NormalBattleHandler { return checkResult.resResult; } dungeonNum = Object.assign(dungeonNum, checkResult.data) - } else if (warInfo.warType == WAR_TYPE.WARLOARDS) { - let checkResult = await checkComBattleDrop(roleId, battleCode); - if (checkResult.status === -1) { - return checkResult.resResult; - } - // 寻宝会根据是否队长重新计算掉落 - if (checkResult.fixReward) { - warReward.resetFixReward(checkResult.fixReward); - } } if(isSuccess) { // 挑战胜利 diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index 57cb6f3c0..a12f4530d 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -1,5 +1,5 @@ import { STATUS } from './../consts/statusCode'; -import { COM_BATTLE_ROBOT_ID_NAME, COM_BATTLE_ROBOT_CE_RATIO, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO, COM_TEAM_STATUS } from './../consts/consts'; +import { COM_BATTLE_ROBOT_ID_NAME, COM_BATTLE_ROBOT_CE_RATIO, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO, COM_TEAM_STATUS, COM_BATTLE_ASSIST_REWARD_RATIO } from './../consts/consts'; import { RoleStatus, ComBattleTeamModel } from './../db/ComBattleTeam'; import { getBluePrtByQuality, getRewardByBlueprtId } from "../pubUtils/gamedata"; import { getRandEelm, getRandValue, resResult, ratioReward } from "../pubUtils/util"; @@ -47,7 +47,8 @@ export function checkComBattleResult(teamStatus) { let robotRestHurt = 0; // 看看是否还有活人 teamStatus.roleStatus.forEach(st => { - if (!st.isRobot && st.killed.length < st.heroes.length) { + // 设置了阵容,且阵容人数和阵亡人数一样,说明玩家战败 + if (!st.isRobot && st.heroes && st.heroes.length > 0 && st.killed.length < st.heroes.length) { allPlayerKilled = false } }); @@ -73,6 +74,13 @@ export function checkComBattleResult(teamStatus) { return COM_TEAM_STATUS.FIGHTING; } +/** + * @description 计算寻宝结算-deprecated + * @export + * @param {string} roleId + * @param {string} battleCode + * @returns + */ export async function checkComBattleDrop(roleId: string, battleCode: string) { let team = await ComBattleTeamModel.getTeamByRoleAndBattleCode(roleId, battleCode); if (team.status !== COM_TEAM_STATUS.WIN) return { status: -1, resResult: resResult(STATUS.COM_BATTLE_REWARD_ERR) }; @@ -89,10 +97,10 @@ export async function checkComBattleDrop(roleId: string, battleCode: string) { fixReward = '&'; // TODO: 消耗品情谊点添加 } else { - fixReward = ratioReward(fixReward, COM_BATTLE_ROBOT_HURT_CH_RATIO); + fixReward = ratioReward(fixReward, COM_BATTLE_ASSIST_REWARD_RATIO); } } - await ComBattleTeamModel.updateRewardSt(roleId, battleCode, true); + await ComBattleTeamModel.updateRewardSt(roleId, true); return {status: 0, fixReward}; } diff --git a/game-server/app/services/rewardService.ts b/game-server/app/services/rewardService.ts index f0e1ff6d8..c91d68522 100644 --- a/game-server/app/services/rewardService.ts +++ b/game-server/app/services/rewardService.ts @@ -11,7 +11,7 @@ export async function handleFixedReward(roleId: string, roleName: string, reward let reward = decodeStr('fixReward', rewardStr); let rewards = []; for(let obj of reward) - rewards.push({ ...obj, count: obj.count * multi}); + rewards.push({ ...obj, count: Math.ceil(obj.count * multi)}); const result = await handleReward(roleId, roleName, reward); return result; } diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index b169875a0..5aeb9a414 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -22,6 +22,7 @@ export const STATUS = { BATTLE_STATUS_WRONG: { code: 20005, simStr: '关卡状态错误' }, BATTLE_HERO_NOT_FOUND: { code: 20006, simStr: '使用的武将不存在' }, BATTLE_CONSUMES_NOT_ENOUGH: { code: 20007, simStr: '道具不足' }, + BATTLE_END_WRONG_TYPE: { code: 20008, simStr: '此类型无法使用通用结算' }, // 主线 20100 - 20199 BATTLE_INFO_VALIDATE_ERR: { code: 20101, simStr: '关卡信息不同' }, @@ -99,6 +100,8 @@ export const STATUS = { COM_BATTLE_HURT_NUM_ERR: { code: 20625, simStr: '血量计算错误' }, COM_BATTLE_START_ERR: { code: 20626, simStr: '开始战斗失败' }, COM_BATTLE_REWARD_ERR: { code: 20627, simStr: '不能领取奖励' }, + COM_BATTLE_REWARDED: { code: 20628, simStr: '奖励已领取' }, + COM_BATTLE_HEROES_ERR: { code: 20629, simStr: '阵容异常' }, // 共斗藏宝图合成 COM_BLUEPRT_QUALITY_CANNOT_COMPOSE: { code: 20630, simStr: '该品质藏宝图不可合成' }, diff --git a/shared/db/ComBattleTeam.ts b/shared/db/ComBattleTeam.ts index 72b3c4c38..5fc2b6b99 100644 --- a/shared/db/ComBattleTeam.ts +++ b/shared/db/ComBattleTeam.ts @@ -133,8 +133,8 @@ export default class ComBattleTeam extends BaseModel { return team; } - public static async updateRewardSt(roleId: string, battleCode: string, gotReward: boolean, lean = true) { - const team = await ComBattleTeamModel.findOneAndUpdate({ roleIds: roleId, 'roleStatus.battleCode': battleCode}, {$set: {'roleStatus.$.gotReward': gotReward}}).lean(lean); + public static async updateRewardSt(roleId: string, gotReward: boolean, lean = true) { + const team = await ComBattleTeamModel.findOneAndUpdate({ roleIds: roleId, 'roleStatus.roleId': roleId}, {$set: {'roleStatus.$.gotReward': gotReward}}).lean(lean); return team; } @@ -224,6 +224,11 @@ export default class ComBattleTeam extends BaseModel { const team = await ComBattleTeamModel.findOne({roleIds: roleId, 'roleStatus.battleCode': battleCode}).lean(lean); return team; } + + public static async getTeamByCode(teamCode: string, lean = true) { + const team = await ComBattleTeamModel.findOne({teamCode}).lean(lean); + return team; + } } export const ComBattleTeamModel = getModelForClass(ComBattleTeam); \ No newline at end of file