diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 94ece7067..1431748cc 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -174,7 +174,6 @@ export class ComBattleHandler { */ async joinTeam(msg: {teamCode: string, isFrd: boolean}, session: BackendSession) { let roleId = session.get('roleId'); - let roleName = session.get('roleName'); let sid = session.get('sid'); let { teamCode, isFrd } = msg; let teamStatus = this.teamMap.get(teamCode); @@ -184,15 +183,11 @@ export class ComBattleHandler { if (teamStatus.roleIds.indexOf(roleId) !== -1) return resResult(STATUS.COM_BATTLE_DUP_ENTER); if (teamStatus.blacklist.indexOf(roleId) != -1) return resResult(STATUS.COM_BATTLE_BE_KICKED); - let { lv = 1, head = EXTERIOR.EXTERIOR_FACE, topLineupCe = 0, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE } = await Role.findByRoleId(roleId, null, true); + let role = await Role.findByRoleId(roleId, null, true); - if (lv < COM_BTL_CONST.ENABLE_LV) { - return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); - } else if (comBtlLvInvalid(lv, [teamStatus.lv])) { - return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH); - } else if (topLineupCe < teamStatus.ceLimit) { - return resResult(STATUS.COM_BATTLE_CE_LIMIT); - } + if (role.lv < COM_BTL_CONST.ENABLE_LV) return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); + if (comBtlLvInvalid(role.lv, [teamStatus.lv])) return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH); + if (role.topLineupCe < teamStatus.ceLimit) return resResult(STATUS.COM_BATTLE_CE_LIMIT); if (!isFrd) { isFrd = await getFrd(roleId); @@ -200,7 +195,7 @@ export class ComBattleHandler { // 加入队伍 if (!validToJoin(teamStatus, roleId)) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); - let roleStatus = new RoleStatus(roleId, roleName, false, isFrd, head, frame, spine, topLineupCe, lv); + let roleStatus = new RoleStatus(role, false, isFrd); const team = await ComBattleTeamModel.addRole(teamCode, roleStatus); if (!team) { return resResult(STATUS.COM_BATTLE_JOIN_ERR); @@ -243,51 +238,51 @@ export class ComBattleHandler { return resResult(STATUS.SUCCESS, { teamCode, isFrd }); } - /** - * ! 获取队伍列表-deprecated - * @param msg - * @param session - */ - async getTeams(msg: { blueprtIds: number[] }, session: BackendSession) { - let roleId = session.get('roleId'); - let { lv } = await Role.findByRoleId(roleId); - if (lv < COM_BTL_CONST.ENABLE_LV) return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); - const teams = await ComBattleTeamModel.getTeamByBlueprt(msg.blueprtIds, COM_TEAM_STATUS.DEFAULT, true); - if (!teams) return resResult(STATUS.COM_BATTLE_NO_VALID_TEAM); - return resResult(STATUS.SUCCESS, { teamInfos: teams}); - } + // /** + // * ! 获取队伍列表-deprecated + // * @param msg + // * @param session + // */ + // async getTeams(msg: { blueprtIds: number[] }, session: BackendSession) { + // let roleId = session.get('roleId'); + // let { lv } = await Role.findByRoleId(roleId); + // if (lv < COM_BTL_CONST.ENABLE_LV) return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); + // const teams = await ComBattleTeamModel.getTeamByBlueprt(msg.blueprtIds, COM_TEAM_STATUS.DEFAULT, true); + // if (!teams) return resResult(STATUS.COM_BATTLE_NO_VALID_TEAM); + // return resResult(STATUS.SUCCESS, { teamInfos: teams}); + // } - /** - * ! deprecate - * @description 队伍准备 - * @param {{teamCode: string, heroes: number[]}} msg - * @param {BackendSession} session - * @returns - * @memberof ComBattleHandler - */ - async teammateReady(msg: {teamCode: string, heroes: number[]}, session: BackendSession) { - let roleId = session.get('roleId'); - let { teamCode, heroes: hids } = msg; - let teamStatus = this.teamMap.get(teamCode); - if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); + // /** + // * ! deprecate + // * @description 队伍准备 + // * @param {{teamCode: string, heroes: number[]}} msg + // * @param {BackendSession} session + // * @returns + // * @memberof ComBattleHandler + // */ + // async teammateReady(msg: {teamCode: string, heroes: number[]}, session: BackendSession) { + // let roleId = session.get('roleId'); + // let { teamCode, heroes: hids } = msg; + // let teamStatus = this.teamMap.get(teamCode); + // if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); - const heroDBs = await HeroModel.findByHidRange(hids, roleId); - const heroes = heroDBs.map(hero => { - return new ComRoleStatusHero(hero); - }); + // const heroDBs = await HeroModel.findByHidRange(hids, roleId); + // const heroes = heroDBs.map(hero => { + // return new ComRoleStatusHero(hero); + // }); - let team = await ComBattleTeamModel.updateHeroes(teamCode, roleId, heroes); - if (!team) return resResult(STATUS.COM_BATTLE_UPDATE_HEROES_ERR); + // let team = await ComBattleTeamModel.updateHeroes(teamCode, roleId, heroes); + // if (!team) return resResult(STATUS.COM_BATTLE_UPDATE_HEROES_ERR); - teamStatus.roleStatus.forEach(st => { - if (st && st.roleId === roleId) { - st.heroes = heroes; - } - }); + // teamStatus.roleStatus.forEach(st => { + // if (st && st.roleId === roleId) { + // st.heroes = heroes; + // } + // }); - sendMessageToTeam(teamCode, PUSH_ROUTE.TEAMMATE_READY, {teamCode, roleId, heroes}); - return resResult(STATUS.SUCCESS); - } + // sendMessageToTeam(teamCode, PUSH_ROUTE.TEAMMATE_READY, {teamCode, roleId, heroes}); + // return resResult(STATUS.SUCCESS); + // } /** * @description 出兵时记录玩家阵容 @@ -409,10 +404,8 @@ export class ComBattleHandler { if (teamStatus.capId !== roleId && teamStatus.capId !== 'robot') return resResult(STATUS.COM_BATTLE_CAP_ONLY); if (teamStatus.status !== COM_TEAM_STATUS.DEFAULT) return resResult(STATUS.COM_BATTLE_ALREADY_START); - teamStatus.status = COM_TEAM_STATUS.FIGHTING; - teamStatus.endTime = nowSeconds() + COM_BTL_CONST.BTL_TIME_LMT/1000; - - let team = await ComBattleTeamModel.updateStatusByCode(teamCode, COM_TEAM_STATUS.FIGHTING); + teamStatus.startTeam(); + let team = await ComBattleTeamModel.updateStatusByCode(teamCode, teamStatus.status, teamStatus.startTime, teamStatus.endTime, teamStatus.hasTimeExtraReward); if (!team) return resResult(STATUS.COM_BATTLE_START_ERR); clearComBtlTimer(teamCode, this.teamDisTimer); // 战斗开始停止解散计时 @@ -426,8 +419,6 @@ export class ComBattleHandler { clearRobotHurtTimer(teamStatus, this.robotHurtTimer); let team = await ComBattleTeamModel.syncTeamData({teamCode, status: COM_TEAM_STATUS.LOOSE, roleStatus: teamStatus.roleStatus, bossHpArr: teamStatus.bossHpArr}, true); if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR); - // // 将藏宝图加回去 - // await addItems(roleId, roleName, sid, [{ id: team.blueprtId, count: 1 }]) teamStatus.timeout = true; sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_COMPLETE, {teamCode, result: false, timeout: true}); thiz.teamMap.delete(teamCode); @@ -507,32 +498,32 @@ export class ComBattleHandler { return resResult(STATUS.SUCCESS); } - /** - * ! 客户端给服务器的战斗结束通知-deprecated - * @param msg - * @param session - */ - async battleEnd(msg: {teamCode: string, isSuccess: boolean}, session: BackendSession) { - let roleId = session.get('roleId'); - let { teamCode, isSuccess } = msg; - let teamStatus = this.teamMap.get(teamCode); - if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); + // /** + // * ! 客户端给服务器的战斗结束通知-deprecated + // * @param msg + // * @param session + // */ + // async battleEnd(msg: {teamCode: string, isSuccess: boolean}, session: BackendSession) { + // let roleId = session.get('roleId'); + // let { teamCode, isSuccess } = msg; + // let teamStatus = this.teamMap.get(teamCode); + // if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); - if (isSuccess && teamStatus.bossCurHp <= 0) { - let team = await ComBattleTeamModel.updateResult(teamCode, roleId, isSuccess); - if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR); - sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_COMPLETE, {teamCode, result: isSuccess}); - } else if (!isSuccess) { - let team = await ComBattleTeamModel.updateResult(teamCode, roleId, isSuccess); - if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR); - if (team.status === COM_TEAM_STATUS.LOOSE) { - sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_COMPLETE, {teamCode, result: isSuccess}); - } else { - sendMessageToTeam(teamCode, PUSH_ROUTE.TEAMMATE_ACT, {teamCode, bossCurHp: teamStatus.bossCurHp, roleStatus: {roleId, battleStatus: 2}}); - } - } - return resResult(STATUS.SUCCESS, { bossCurHp: teamStatus.bossCurHp }); - } + // if (isSuccess && teamStatus.bossCurHp <= 0) { + // let team = await ComBattleTeamModel.updateResult(teamCode, roleId, isSuccess); + // if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR); + // sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_COMPLETE, {teamCode, result: isSuccess}); + // } else if (!isSuccess) { + // let team = await ComBattleTeamModel.updateResult(teamCode, roleId, isSuccess); + // if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR); + // if (team.status === COM_TEAM_STATUS.LOOSE) { + // sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_COMPLETE, {teamCode, result: isSuccess}); + // } else { + // sendMessageToTeam(teamCode, PUSH_ROUTE.TEAMMATE_ACT, {teamCode, bossCurHp: teamStatus.bossCurHp, roleStatus: {roleId, battleStatus: 2}}); + // } + // } + // return resResult(STATUS.SUCCESS, { bossCurHp: teamStatus.bossCurHp }); + // } /** * @description 寻宝结算 @@ -563,25 +554,10 @@ export class ComBattleHandler { let warInfo = getWarByBlueprtId(blueprtId); if (!warInfo) return resResult(STATUS.BATTLE_MISS_INFO); - let role = await RoleModel.findByRoleId(roleId, 'lv'); - let apJson = await setAp(serverId, roleId, ip, role.lv, -1 * warInfo.cost, sid, ITEM_CHANGE_REASON.COM_BATTLE_END); // 扣除体力 - if(!apJson) { - return resResult(STATUS.BATTLE_ACTION_POINT_LACK); - } - - // const { dropResult } = await incEquipPrintDrop(roleSt); - // if (dropResult) { - // const dropEquipId = randEquipPrintId(warInfo); - // if (dropEquipId) { - // roleSt.fixReward.push({ id: dropEquipId, count: 1 }); - // } - // } - await ComBattleTeamModel.updateRewardSt(teamCode, roleId, true); - const goods = await addItems(roleId, roleName, sid, roleSt.fixReward, ITEM_CHANGE_REASON.COM_BATTLE_END); - let actordata = await roleLevelup(KING_EXP_RATIO_TYPE.BATTLE, roleId, warInfo.kingExp, session);// 主公升级经验 + const goods = await addItems(roleId, roleName, sid, roleSt.rewards, ITEM_CHANGE_REASON.COM_BATTLE_END); - return resResult(STATUS.SUCCESS, { battleGoods: goods, ...actordata, teamInfo: {status, teamCode, roleStatus, bossHpArr} }); + return resResult(STATUS.SUCCESS, { teamInfo: {status, teamCode, roleStatus, bossHpArr} }); } async getComBtlStatus(msg: {teamCode: string}, session: BackendSession) { diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index 005dcec88..0bc6dad5f 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -155,7 +155,7 @@ export class NormalBattleHandler { return resResult(STATUS.BATTLE_MISS_INFO); } // 寻宝不使用通用战斗模块结算 - if (warInfo.warType == WAR_TYPE.WARLOARDS) { + if (warInfo.warType == WAR_TYPE.COM_BATTLE) { return resResult(STATUS.BATTLE_END_WRONG_TYPE); } diff --git a/game-server/app/services/battleService.ts b/game-server/app/services/battleService.ts index b3ded27eb..1df949c79 100644 --- a/game-server/app/services/battleService.ts +++ b/game-server/app/services/battleService.ts @@ -560,7 +560,7 @@ export function getRandRobot(cnt = 1, withAttr = false) { let setInfo = getRandExpedition(cnt); if (!setInfo || setInfo.length !== cnt) return null; - let robots = []; + let robots: ComRoleStatusHero[][] = []; for (let info of setInfo) { if (!info || !info.warId) continue; const warInfo = gameData.warJson.get(info.warId); diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index 4a39679dc..28d347ad7 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -1,12 +1,12 @@ import { MemComBtlTeam } from './../domain/battleField/ComBattleTeamField'; import { ItemModel } from './../db/Item'; -import { ITEM_CHANGE_REASON, IT_TYPE, PUSH_ROUTE } from './../consts'; +import { BATTLE_REWARD_TYPE, ITEM_CHANGE_REASON, IT_TYPE, PUSH_ROUTE } from './../consts'; import { FriendRelationModel } from './../db/FriendRelation'; import { RoleModel, RoleType } from './../db/Role'; import { EquipPrintDropType, EquipPrintDropModel } from './../db/EquipPrintDrop'; import { STATUS } from './../consts/statusCode'; import { COM_TEAM_STATUS, FRIEND_DROP_TYPE, COM_BTL_CONST, FRIEND_DROP_MAX } from './../consts'; -import { RoleStatus, ComBattleTeamModel, ComBattleTeamType } from './../db/ComBattleTeam'; +import { RoleStatus, ComBattleTeamModel, ComBattleTeamType, ComBattleReward } from './../db/ComBattleTeam'; import { getRandEelm, getRandValue, resResult, ratioReward, getRandValueByMinMax, getRandEelmWithWeight, getRobotInfo, getRandSingleEelm } from "../pubUtils/util"; import { getRandRobot } from "./battleService"; import { Channel, ChannelService, pinus } from 'pinus'; @@ -16,9 +16,11 @@ import { getRoleIds } from '../pubUtils/friendUtil'; import { getTeamSearchByLv, rmRoleFromQueue } from './redisService'; import { getRewardByBlueprtId, gameData, getBossHpByBlueprtId, getDicBlueprtById } from '../pubUtils/data'; import { getZeroPointD, nowSeconds } from '../pubUtils/timeUtil'; -import { handleCost } from './role/rewardService'; +import { getFriendPointObject, handleCost } from './role/rewardService'; import { addUserToTeamChannel, delTeamChannel, sendMessageToTeam, sendMessageToUsersWithSuc, sendMessageToUserWithSuc } from './pushService'; import { checkTaskInComBattleEnd } from './task/taskService'; +import moment = require('moment'); +import { RewardInter } from '../pubUtils/interface'; /** * 在给定的品质列表中随机返回一定数量的藏宝图Id @@ -59,7 +61,12 @@ export function getRandComBtlRobots(topLineupCe: number, ceLimit: number, lv: nu if(robotLv > gameData.maxPlayerLv.max) robotLv = gameData.maxPlayerLv.max; // const imgHid = robot[Math.floor(Math.random() * robot.length)]; const { robotRoleId, robotRoleName } = robotInfos[idx]; - let robotStatus = new RoleStatus(robotRoleId, robotRoleName, false, false, EXTERIOR.EXTERIOR_FACE, EXTERIOR.EXTERIOR_FACECASE, EXTERIOR.EXTERIOR_APPEARANCE, robotCe, robotLv, robot, true); + let robotStatus = new RoleStatus({ + roleId: robotRoleId, + roleName: robotRoleName, + ce: robotCe, + lv: robotLv + }, false, false, robot, true); robotStArr.push(robotStatus); robotIdArr.push(robotRoleId); }); @@ -104,35 +111,35 @@ export function checkComBattleResult(teamStatus) { return COM_TEAM_STATUS.FIGHTING; } -/** - * ! deprecated - * @description 计算寻宝结算 - * @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) }; - let roleSt = null; - team.roleStatus.forEach(st => { - if (st.roleId === roleId) { - roleSt = st; - } - }); - if (!roleSt || roleSt.gotReward) return { status: -1, resResult: resResult(STATUS.COM_BATTLE_REWARD_ERR) }; - let { fixReward, teammateReward } = getRewardByBlueprtId(team.blueprtId); - if (!roleSt.isCap) { - if (roleSt.isFrd) { - fixReward = []; - } else { - fixReward = teammateReward; - } - } - await ComBattleTeamModel.updateRewardSt(team.teamCode, roleId, true); - return { status: 0, fixReward }; -} +// /** +// * ! deprecated +// * @description 计算寻宝结算 +// * @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) }; +// let roleSt = null; +// team.roleStatus.forEach(st => { +// if (st.roleId === roleId) { +// roleSt = st; +// } +// }); +// if (!roleSt || roleSt.gotReward) return { status: -1, resResult: resResult(STATUS.COM_BATTLE_REWARD_ERR) }; +// let { fixReward, teammateReward } = getRewardByBlueprtId(team.blueprtId); +// if (!roleSt.isCap) { +// if (roleSt.isFrd) { +// fixReward = []; +// } else { +// fixReward = teammateReward; +// } +// } +// await ComBattleTeamModel.updateRewardSt(team.teamCode, roleId, true); +// return { status: 0, fixReward }; +// } export function clearComBtlTimer(teamCode: string, timerMap: Map) { let timer = timerMap.get(teamCode); @@ -149,16 +156,35 @@ export function setComBtlTimer(teamCode: string, timer: NodeJS.Timer, timerMap: timerMap.set(teamCode, timer); } -export async function getRealReward(blueprtId: number, roleSt: RoleStatus) { - let { fixReward, teammateReward } = getRewardByBlueprtId(blueprtId); - if (!roleSt.isCap) { +export async function getRealReward(blueprtId: number, roleSts: RoleStatus[], roleSt: RoleStatus, hasTimeExtraReward: boolean): Promise { + let dicReward = getRewardByBlueprtId(blueprtId); + if(!dicReward) return []; + + let fixRewards: RewardInter[], extraRewards: RewardInter[]; + if (roleSt.isCap) { + fixRewards.push(...dicReward.captainReward); + } else { if (roleSt.isFrd) { - fixReward = [] + fixRewards.push(getFriendPointObject(TREASURE.REWARD_FRIENDPOINT)); } else { - fixReward = teammateReward; + fixRewards.push(...dicReward.teammateReward) } } - return fixReward; + if(hasTimeExtraReward) { + let sameGuildCnt = roleSts.filter(cur => cur.guildCode == roleSt.guildCode && cur.roleId != roleSt.roleId).length; + if(sameGuildCnt > 0) { + let dicGuildReward = roleSt.isCap? dicReward.captainTimeGuildReward: dicReward.teammateTimeGuildReward; + let guildRewards = dicGuildReward.get(sameGuildCnt)||[] + extraRewards.push(...guildRewards); + } else { + let guildRewards = roleSt.isCap? dicReward.captainTimeReward: dicReward.teammateTimeReward; + extraRewards.push(...guildRewards); + } + } + return [ + ...fixRewards.map(reward => ({ type: BATTLE_REWARD_TYPE.FIX_REWARD, ...reward })), + ...extraRewards.map(reward => ({ type: BATTLE_REWARD_TYPE.EXTRA_REWARD, ...reward })) + ] } export async function getAllAssistCnt(roleId: string) { @@ -225,7 +251,7 @@ export async function handleComBtlProgress(teamStatus: MemComBtlTeam, robotHurtT bs.curHp = 0; }); for (let st of teamStatus.roleStatus) { - st.fixReward = await getRealReward(teamStatus.blueprtId, st); + st.rewards = await getRealReward(teamStatus.blueprtId, teamStatus.roleStatus, st, teamStatus.hasTimeExtraReward); }; await checkTaskInComBattleEnd(teamStatus.roleStatus, teamStatus.capId); } @@ -427,13 +453,12 @@ async function teammateValid(roleInfo: Partial, roleId: string, roleId */ export async function getValidTeammateRoleSt(roleId: string, roleIds: string[], ceLimit: number) { let roleInfo = await RoleModel.findByRoleId(roleId, null, true); - let { roleName, head = EXTERIOR.EXTERIOR_FACE, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE, topLineupCe, lv: playerLv } = roleInfo; const valid = await teammateValid(roleInfo, roleId, roleIds, ceLimit); if (!valid) return null; let isFrd = await getFrd(roleId); - const result = new RoleStatus(roleId, roleName, false, isFrd, head, frame, spine, topLineupCe, playerLv); + const result = new RoleStatus(roleInfo, false, isFrd); return result; } @@ -485,9 +510,7 @@ export async function hasEnoughBlueprt(roleId: string, sid: string, blueprtId: n * @param {boolean} isFrd */ export function addRoleToTeam(comTeam: MemComBtlTeam, roleInfo: RoleType, isCap: boolean, isFrd: boolean) { - const { roleId, roleName, head = EXTERIOR.EXTERIOR_FACE, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE, lv } = roleInfo; - let { topLineupCe = 1000 } = roleInfo; - const roleSt = new RoleStatus(roleId, roleName, isCap, isFrd, head, frame, spine, topLineupCe, lv); + const roleSt = new RoleStatus(roleInfo, isCap, isFrd); addRoleStToTeam(comTeam, roleSt); } diff --git a/shared/consts/constModules/battleConst.ts b/shared/consts/constModules/battleConst.ts index 54b73317e..da4048e3b 100644 --- a/shared/consts/constModules/battleConst.ts +++ b/shared/consts/constModules/battleConst.ts @@ -8,7 +8,8 @@ export const ACTION_POIN = { export const BATTLE_REWARD_TYPE = { FIX_REWARD: 1, CONDITION_REWARD: 2, - RANDOM_REWARD: 3 + RANDOM_REWARD: 3, + EXTRA_REWARD: 4, }; export const WAR_TYPE = { @@ -18,7 +19,7 @@ export const WAR_TYPE = { DAILY: 4, // 每日 EXPEDITION: 5, // 远征 MYSTERY: 6, // 秘境 - WARLOARDS: 7, // 群雄 + COM_BATTLE: 7, // 群雄 TOWER: 8, // 天梯 PVP: 9, // PVP GUILD_ACTIVITY: 10, // 军团活动 diff --git a/shared/db/ComBattleTeam.ts b/shared/db/ComBattleTeam.ts index 511ff7790..c68107094 100644 --- a/shared/db/ComBattleTeam.ts +++ b/shared/db/ComBattleTeam.ts @@ -1,8 +1,8 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { EXTERIOR } from '../pubUtils/dicParam'; -import { ItemReward } from '../domain/dbGeneral'; import { nowSeconds } from '../pubUtils/timeUtil'; +import { RoleUpdate } from './Role'; export class ComRoleStatusHero { @prop({ required: true }) @@ -33,12 +33,23 @@ export class ComRoleStatusHero { } } +export class ComBattleReward { + @prop({ required: true }) + type: number; + @prop({ required: true }) + id: number; + @prop({ required: true }) + count: number; +} + export class RoleStatus { @prop({ required: true }) roleId: string; @prop({ required: true }) roleName: string; @prop({ required: true }) + guildCode: string; + @prop({ required: true }) isCap: boolean; @prop({ required: true, default: 0 }) totalDmg: number; @@ -79,30 +90,30 @@ export class RoleStatus { @prop({ required: true, default: false }) gotReward: boolean; // 队长奖励 - @prop({ required: true, default: [], type: ItemReward }) - fixReward: ItemReward[]; - // 队友奖励 - @prop({ required: true, default: [], type: ItemReward }) - teammateReward: ItemReward[]; + @prop({ required: true, default: [], type: ComBattleReward, _id: false }) + rewards: ComBattleReward[]; // 好友间伤害加成 @prop({ required: true, default: 0 }) frdRatio: number = 0; - constructor(roleId: string, roleName: string, isCap: boolean, isFrd: boolean, head: number, frame: number, spine: number, topLineupCe: number, lv: number, heroes: ComRoleStatusHero[] = [], isRobot = false) { - this.roleId = roleId; - this.roleName = roleName; + constructor(role: RoleUpdate, isCap: boolean, isFrd: boolean, heroes: ComRoleStatusHero[] = [], isRobot = false) { + if(role) { + this.roleId = role.roleId||''; + this.roleName = role.roleName||''; + this.guildCode = role.guildCode||''; + this.head = role.head||EXTERIOR.EXTERIOR_FACE; + this.frame = role.frame||EXTERIOR.EXTERIOR_FACECASE; + this.spine = role.spine||EXTERIOR.EXTERIOR_APPEARANCE; + this.topLineupCe = role.topLineupCe||0; + this.lv = role.lv||1; + } this.isCap = isCap; this.totalDmg = 0; this.isFrd = isFrd; - this.head = head; - this.frame = frame; - this.spine = spine; - this.topLineupCe = topLineupCe; - this.lv = lv; this.heroes = heroes; this.killed = []; this.isRobot = isRobot; - this.fixReward = []; + this.rewards = []; } addFrdRatio(frdRatio: number) { @@ -162,7 +173,7 @@ export default class ComBattleTeam extends BaseModel { @prop({ required: true, default: 0 }) status: number; - @prop({ required: true, type: RoleStatus, default: [] }) + @prop({ required: true, type: RoleStatus, default: [], _id: false }) roleStatus: RoleStatus[]; // 队长 roleId @@ -178,7 +189,7 @@ export default class ComBattleTeam extends BaseModel { roleCnt: number; // 单个 boss 血量状态 - @prop({ required: false, type: BossHp, default: [] }) + @prop({ required: false, type: BossHp, default: [], _id: false }) bossHpArr: BossHp[]; // 队伍是否开放加入 @@ -188,6 +199,14 @@ export default class ComBattleTeam extends BaseModel { // 黑名单 blacklist: string[] = []; + // 开始时间 + @prop({ required: true, default: 0 }) + startTime: number = 0; + + // 是否有特殊时间奖励 + @prop({ required: true, default: 0 }) + hasTimeExtraReward: boolean = false; + // 结束时间 @prop({ required: true, default: 0 }) endTime: number = 0; @@ -255,8 +274,8 @@ export default class ComBattleTeam extends BaseModel { return team; } - public static async updateStatusByCode(teamCode: string, status: number, lean = true) { - const team: ComBattleTeamType = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamCode }, {status}, {new: true}).lean(lean); + public static async updateStatusByCode(teamCode: string, status: number, startTime: number, endTime: number, hasTimeExtraReward: boolean) { + const team: ComBattleTeamType = await ComBattleTeamModel.findOneAndUpdate({ teamCode: teamCode }, { $set: {status, startTime, endTime, hasTimeExtraReward }}, {new: true}).lean(); return team; } diff --git a/shared/db/FriendPoint.ts b/shared/db/FriendPoint.ts index 1e7806679..0add527e1 100644 --- a/shared/db/FriendPoint.ts +++ b/shared/db/FriendPoint.ts @@ -17,6 +17,8 @@ export default class FriendPoint extends BaseModel { @prop({ required: true, default: 0 }) sendCnt: number; // 当天赠送的点数 @prop({ required: true, default: 0 }) + comBattleCnt: number; // 今天在寻宝上获得的友情点 + @prop({ required: true, default: 0 }) type: number; // 情谊点统计的类型,不同功能都可能有每日获取上限 /** diff --git a/shared/domain/battleField/ComBattleTeamField.ts b/shared/domain/battleField/ComBattleTeamField.ts index c29c78fa7..606a04a12 100644 --- a/shared/domain/battleField/ComBattleTeamField.ts +++ b/shared/domain/battleField/ComBattleTeamField.ts @@ -1,8 +1,10 @@ -import { COM_TEAM_STATUS } from '../../consts'; -import { getBossHpByBlueprtId, getDicBlueprtById } from '../../pubUtils/data'; +import { COM_BTL_CONST, COM_TEAM_STATUS } from '../../consts'; +import { gameData, getBossHpByBlueprtId, getDicBlueprtById } from '../../pubUtils/data'; import ComBattleTeam from './../../db/ComBattleTeam'; import { cloneDeep } from 'lodash' import { FriendParams } from '../roleField/friend'; +import { nowSeconds } from '../../pubUtils/timeUtil'; +import moment = require('moment'); /** * 拷贝敌军数组并添加当前血量字段 @@ -48,6 +50,13 @@ export class MemComBtlTeam extends ComBattleTeam { findMemberByRoleId(roleId: string) { return this.roleStatus.find(cur => cur.roleId == roleId); } + + startTeam() { + this.status = COM_TEAM_STATUS.FIGHTING; + this.startTime = nowSeconds(); + this.endTime = nowSeconds() + COM_BTL_CONST.BTL_TIME_LMT/1000; + this.hasTimeExtraReward = isComBattleTimeLimit(); + } }; @@ -65,4 +74,19 @@ export class MemComBtlTeam extends ComBattleTeam { this.roleCnt = comBattle.roleCnt; this.status = comBattle.status; } - } \ No newline at end of file + } + + +/** + * 当前是否是有加成的特殊时间 + */ +export function isComBattleTimeLimit() { + let arr = gameData.comBattleRewardTime; + for(let { from, to } of arr) { + let fromTime = moment(moment().format(`YYYY-MM-DD ${from}`)).valueOf(); + let toTime = moment(moment().format(`YYYY-MM-DD ${to}`)).valueOf(); + let now = moment().valueOf(); + if(fromTime <= now && toTime >= now) return true; + } + return false; +} \ No newline at end of file diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 85e03a064..c743da70f 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -11,7 +11,7 @@ import { dicQuestion, loadQuestion } from "./dictionary/DicQuestion"; import { dicSe, loadSe } from "./dictionary/DicSe"; import { dicTower, loadTower } from "./dictionary/DicTower"; import { dicTowerTask, loadTowerTask } from "./dictionary/DicTowerTask"; -import { dicWar, dicWarPvp, dicDailyWarByType, loadWar, dicHeroIdByWar } from "./dictionary/DicWar"; +import { dicWar, dicWarPvp, dicDailyWarByType, loadWar, dicHeroIdByWar, dicComBattleReward } from "./dictionary/DicWar"; import { dicWarJson, loadWarJson } from "./dictionary/DicWarJson"; import { AUCTION_TIME } from "../consts"; import { dicFashions, dicFashionsByHeroId, loadFashions } from "./dictionary/DicFashions"; @@ -273,7 +273,9 @@ export const gameData = { ladderConsume: new Array<{id: number, count: number, times: number}>(), ladderMatch: dicLadderMatch, ladderDifficultRatio: dicLadderDifficultRatio, - ladderRankReward: dicLadderRankReward + ladderRankReward: dicLadderRankReward, + comBattleRewardTime: new Array<{from: string, to: string}>(), + comBattleReward: dicComBattleReward, }; // 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据 @@ -382,8 +384,8 @@ export function getWarByBlueprtId(blueprtId: number) { } export function getRewardByBlueprtId(blueprtId: number) { - let { fixReward, teammateReward } = getWarByBlueprtId(blueprtId); - return { fixReward, teammateReward }; + let { war_id } = getWarByBlueprtId(blueprtId); + return gameData.comBattleReward.get(war_id); } function parseComBtlLvRange() { @@ -1038,6 +1040,7 @@ function parseDicParam() { getCeRatio(); loadAuctionTime(); decodeLadderBuyCost(); + parseComBattleRewardTime(); } /** @@ -1090,6 +1093,17 @@ function treatTaskGroup() { } } +function parseComBattleRewardTime() { + let str = param.TREASURE.TIME_REWARD; + if (!str) return + let result: { from: string, to: string }[] = []; + let decodeArr = decodeArrayListStr(str); + for (let [from, to] of decodeArr) { + result.push({ from, to }); + } + gameData.comBattleRewardTime = result; +} + // 加载json function loadDatas() { loadHero(); diff --git a/shared/pubUtils/dictionary/DicWar.ts b/shared/pubUtils/dictionary/DicWar.ts index f3bea8330..59831287e 100644 --- a/shared/pubUtils/dictionary/DicWar.ts +++ b/shared/pubUtils/dictionary/DicWar.ts @@ -1,5 +1,5 @@ // 关卡表 -import {decodeArrayListStr, parseNumberList, readFileAndParse} from '../util' +import {decodeArrayListStr, parseGoodStr, parseNumberList, readFileAndParse} from '../util' import { TRAIN_REWARD_TYPE, WAR_RELATE_TABLES, WAR_TYPE } from '../../consts'; import { isString } from 'underscore' import { RewardInter } from '../interface'; @@ -33,10 +33,6 @@ export interface DicWar { readonly dailyType: number; // 寻宝匹配json readonly dispatchJsonId: number; - // 寻宝奖励 - readonly jackpotReward: Array<{id: number, weight: number}>; - // 寻宝队友奖励 - readonly teammateReward: Array<{id: number, count: number}>; // 镇念塔禁用角色 readonly fobiddenCharactor: Array<{type: number, id: number}>; // 推荐战力 @@ -59,15 +55,32 @@ export interface DicWar { readonly secondAttrLevel: number; } +export interface DicComBattleReward { + // 关卡固定奖励 + readonly captainReward: Array<{id: number, count: number}>; + // 队友奖励 + readonly teammateReward: Array<{id: number, count: number}>; + // 队长限时段增加奖励 + readonly captainTimeReward: Array<{id: number, count: number}>; + // 队友限时段增加奖励 + readonly teammateTimeReward: Array<{id: number, count: number}>; + // 队长军团加成奖励 + readonly captainTimeGuildReward: Map; + // 队友军团加成奖励 + readonly teammateTimeGuildReward: Map; +} export const dicWar = new Map(); export const dicWarPvp = new Array(); export const dicDailyWarByType = new Map(); export const dicHeroIdByWar = new Map(); +export const dicComBattleReward = new Map(); // warId => DicComBattleReward + export function loadWar() { dicWar.clear(); dicDailyWarByType.clear(); dicWarPvp.splice(0, dicWarPvp.length); dicHeroIdByWar.clear(); + dicComBattleReward.clear(); for(let filename of WAR_RELATE_TABLES) { let arr = readFileAndParse(filename); @@ -75,7 +88,6 @@ export function loadWar() { o.fixReward = parseFixReward(o.fixReward); o.conditionReward = parseConditionReward(o.conditionReward); o.randomReward = parseRandomReward(o.RandomReward||o.randomReward); - o.jackpotReward = parseJackpotReward(o.jackpotReward); o.teammateReward = parseFixReward(o.teammateReward); o.fobiddenCharactor = parseForbiddenChara(o.fobiddenCharactor); o.mapseid = parseNumberList(o.mapseid); @@ -100,6 +112,16 @@ export function loadWar() { } else if (o.warType == WAR_TYPE.GUILD_TRAIN) { o.winReward = parseTrainReward(o.winReward); o.failReward = parseTrainReward(o.failReward); + } else if (o.warType == WAR_TYPE.COM_BATTLE) { + let reward = { + captainReward: parseGoodStr(o.fixReward), + teammateReward: parseGoodStr(o.teammateReward), + captainTimeReward: parseGoodStr(o.time_captain_normalReward), + teammateTimeReward: parseGoodStr(o.time_normalReward), + captainTimeGuildReward: parseComBattleTimeReward(o.time_captain_guildReward), + teammateTimeGuildReward: parseComBattleTimeReward(o.time_captain_guildReward), + } + dicComBattleReward.set(o.war_id, reward); } dicWar.set(o.war_id, o); if(!!o.heroId) dicHeroIdByWar.set(o.war_id, o.heroId); @@ -147,18 +169,18 @@ function parseRandomReward(str: string = '') { return result } -function parseJackpotReward(str: string = '') { - let result = new Array<{id: number, weight: number}>(); - if(!str) return result; - let decodeArr = decodeArrayListStr(str); - for(let [id, weight] of decodeArr) { - if(isNaN(parseInt(id)) || isNaN(parseInt(weight))) { - throw new Error('data table format wrong'); - } - result.push({id: parseInt(id), weight: parseInt(weight)}); - } - return result -} +// function parseJackpotReward(str: string = '') { +// let result = new Array<{id: number, weight: number}>(); +// if(!str) return result; +// let decodeArr = decodeArrayListStr(str); +// for(let [id, weight] of decodeArr) { +// if(isNaN(parseInt(id)) || isNaN(parseInt(weight))) { +// throw new Error('data table format wrong'); +// } +// result.push({id: parseInt(id), weight: parseInt(weight)}); +// } +// return result +// } function parseForbiddenChara(str: string = '') { let result = new Array<{type: number, id: number}>(); @@ -196,4 +218,15 @@ function parseTrainReward(str: string) { } } return result +} + +function parseComBattleTimeReward(str: string) { + let result = new Map(); + if(!str) return result; + let decodeArr = decodeArrayListStr(str); + for(let i = 0; i < decodeArr.length; i++) { + let [id, count] = decodeArr[i] + result.set(i + 1, [{ id: parseInt(id), count: parseInt(count) }]); + } + return result; } \ No newline at end of file diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index f8bd9d286..b3a4abc1c 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -642,7 +642,7 @@ export function getReasonByWarType(warType: number) { return ITEM_CHANGE_REASON.EXPEDITION_BATTLE_END; case WAR_TYPE.MYSTERY: return ITEM_CHANGE_REASON.MYSTERY_BATTLE_END; - case WAR_TYPE.WARLOARDS: + case WAR_TYPE.COM_BATTLE: return ITEM_CHANGE_REASON.WARLOARDS_BATTLE_END; case WAR_TYPE.TOWER: return ITEM_CHANGE_REASON.TOWER_BATTLE_END; @@ -685,7 +685,7 @@ export function getWarTypeName(warType: number) { case WAR_TYPE.DAILY: return '每日'; case WAR_TYPE.EXPEDITION: return '远征'; case WAR_TYPE.MYSTERY: return '秘境'; - case WAR_TYPE.WARLOARDS: return '群雄'; + case WAR_TYPE.COM_BATTLE: return '寻宝'; case WAR_TYPE.TOWER: return '镇念塔'; case WAR_TYPE.PVP: return '竞技'; case WAR_TYPE.GUILD_ACTIVITY: return '军团活动';