diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index e1c62ce19..57ea10eb0 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -1,7 +1,7 @@ import {Application, BackendSession} from 'pinus'; const _ = require('underscore'); import { gameData, getPvpBoxs } from '../../../pubUtils/data'; -import { checkPvp, initPvpInfo, refreshEnemies, getEnemies, getPlusScore, getLvByScore, defaultHeroes, comsumeChallengeCnt, refresh, findPvpDefByRoleId, checkRoleIsRobot } from '../../../services/pvpService'; +import { checkPvp, initPvpInfo, refreshEnemies, getEnemies, getPlusScore, getLvByScore, defaultHeroes, comsumeChallengeCnt, refresh, findPvpDefByRoleId, checkRoleIsRobot, getRefOppCnt } from '../../../services/pvpService'; import { RoleModel, RoleType } from '../../../db/Role'; import { STATUS } from '../../../consts/statusCode'; import { resResult, reduceCe, genCode } from '../../../pubUtils/util'; @@ -19,6 +19,7 @@ import { BattleRecordModel } from '../../../db/BattleRecord'; import { PvpRecordModel, HeroesRecord } from '../../../db/PvpRecord'; import { setPvpDefResult } from '../../../services/timeTaskService'; import { existsRank, initRank, getRank, setRank, getMyRank } from '../../../services/redisService'; +import { handleCost } from '../../../services/rewardService'; export default function(app: Application) { return new PvpHandler(app); @@ -32,8 +33,8 @@ export class PvpHandler { let roleId = session.get('roleId'); let pvpDefense = await PvpDefenseModel.findByRoleIdIncludeAll(roleId); let oppPlayers = await getEnemies(pvpDefense.oppPlayers, pvpDefense.winStreakNum); - let { warId, seasonNum, seasonEndTime } = await SystemConfigModel.findSystemConfig(); - let { heroes, score, pLv, winStreakNum, refOppCnt, challengeCnt, challengeRefTime, receivedBox, hisScore, heroScores, isFirstEntry } = pvpDefense; + let {warId, seasonNum, seasonEndTime} = await SystemConfigModel.findSystemConfig(); + let {heroes, score, pLv, winStreakNum, challengeCnt, challengeRefTime, receivedBox, hisScore, heroScores, isFirstEntry} = pvpDefense; if (pvpDefense.seasonNum !== seasonNum) { let { score, pLv, winStreakNum, heroScores, refOppCnt, challengeCnt, challengeRefTime } = await setPvpDefResult(pvpDefense, seasonNum, seasonEndTime); } @@ -41,25 +42,37 @@ export class PvpHandler { await PvpDefenseModel.updateInfo(roleId, {isFirstEntry:false}); } let myRank = await getMyRank(REDIS_KEY.PVP_RANK, 0, roleId);//去redis中获取排名 + let { refOppCnt } = getRefOppCnt(pvpDefense.refOppCnt, pvpDefense.refOppTime); // 刷新次数 + let data = {warId, seasonNum, seasonEndTime, myRank, oppPlayers, heroes, score, pLv, winStreakNum, refOppCnt, challengeCnt, challengeRefTime, receivedBox, hisScore, heroScores, isFirstEntry} return resResult(STATUS.SUCCESS, data); } - // TODO 刷新 + // 刷新对手 async refreshOppPlayer (msg: {}, session: BackendSession) { let roleId = session.get('roleId'); + let sid = session.get('sid'); let pvpDefense = await PvpDefenseModel.findByRoleIdIncludeAll(roleId); + // 刷新次数及消耗 + let {refOppCnt, refOppTime, consume} = getRefOppCnt(pvpDefense.refOppCnt, pvpDefense.refOppTime); + if(refOppCnt >= gameData.maxPvpRefreshCnt) { + return resResult(STATUS.PVP_REFRESH_CNT_REACH_MAX); + } + + let costResult = await handleCost(roleId, sid, consume); + if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); + + // 刷新对手 let role = pvpDefense.role; let oppPlayers = await refreshEnemies(role, pvpDefense.score, pvpDefense.pLv); - pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { oppPlayers }); + pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { oppPlayers, refOppCnt: refOppCnt + 1, refOppTime }); let result = await getEnemies(pvpDefense.oppPlayers, pvpDefense.winStreakNum); - // TODO 刷新次数及消耗 - return resResult(STATUS.SUCCESS, { oppPlayers: result, refOppCnt: 0 }); + return resResult(STATUS.SUCCESS, { oppPlayers: result, refOppCnt: pvpDefense.refOppCnt }); } // 获取对手阵容具体信息 diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index 3dc0d4d57..743df5838 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -3,10 +3,10 @@ */ import { PvpDefenseModel, Heroes, OppPlayers, Robot, PvpDefenseType, HeroScores } from '../db/PvpDefense'; import { RoleType } from '../db/Role'; -import { PVP_HERO_POS, ROBOT_NAME, REDIS_KEY } from '../consts'; +import { PVP_HERO_POS, ROBOT_NAME, REDIS_KEY, PVP_CONST } from '../consts'; import { setPvpDefResult } from '../services/timeTaskService'; import { dicPvpOpponent, DicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent"; -import { getRandomIndexByLen, genCode, getRandomByLen } from '../pubUtils/util'; +import { getRandomIndexByLen, genCode, getRandomByLen, shouldRefresh } from '../pubUtils/util'; import { oppPlayersInter, RankParam } from '../pubUtils/interface'; import { gameData, getPLvByScore } from "../pubUtils/data"; import { PVP } from '../pubUtils/dicParam'; @@ -267,3 +267,15 @@ export async function findPvpDefByRoleId(roleId: string) { return {pvpDefense, warId}; } } + +// 获取刷新对手次数及消耗 +export function getRefOppCnt(refOppCnt: number, refOppTime: Date) { + let curTime = new Date(); + if(shouldRefresh(refOppTime, curTime, PVP_CONST.REFRESH_TIME)) { + refOppCnt = 0; refOppTime = curTime; + } + return { + refOppCnt, refOppTime, + consume: gameData.pvpRefreshConsume.get(refOppCnt + 1) + } +} \ No newline at end of file diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index abc4b7860..7d662d385 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -7,8 +7,11 @@ import { SystemConfigModel } from '../db/SystemConfig'; import PvpDefenseType,{ PvpDefenseModel } from '../db/PvpDefense'; import { PVP } from '../pubUtils/dicParam'; import { nowSeconds, getTodayZeroPoint } from '../pubUtils/timeUtil'; -import { getPvpGkWarIds, getPvpRankRewards, getPvpHeroRewards, getPLvByScore } from '../pubUtils/data'; +import { getPvpGkWarIds, getPvpRankRewards, getPvpHeroRewards } from '../pubUtils/data'; import { getRandomArr } from '../pubUtils/util'; +import { getLvByScore } from './pvpService'; +import { getMyRank } from './redisService'; +import { REDIS_KEY } from '../consts'; const _ = require('underscore'); const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -51,18 +54,22 @@ export async function setPvpDefResult(pvpDefense: PvpDefenseType, seasonNum: num let pvpRankRewards = getPvpRankRewards(); let pvpHeroRewards = getPvpHeroRewards(); let goods = []; - let rankLv = 0;//TODO 排行榜 + let rankLv = await getMyRank(REDIS_KEY.PVP_RANK, 0, pvpDefense.roleId);// 排行榜排名 let pvpRankReward = getScore(pvpRankRewards, rankLv); - goods = goods.concat(pvpRankReward.reward); + if(pvpRankReward) { + goods = goods.concat(pvpRankReward.reward); + } let score = 0 for (let i = 0; i < pvpDefense.heroScores.length; i++) { let heroScore = pvpDefense.heroScores[i]; let pvpHeroReward = getScore(pvpHeroRewards, heroScore.score); - goods = goods.concat(pvpHeroReward.reward); - heroScore.score = pvpHeroReward.heroscore; + if(pvpHeroReward) { + goods = goods.concat(pvpHeroReward.reward); + heroScore.score = pvpHeroReward.heroscore; + } score += heroScore.score; } - let pLv = getPLvByScore(score); + let pLv = getLvByScore(pvpDefense.heroScores); pvpDefense = await PvpDefenseModel.updateInfo(pvpDefense.roleId, {score:score, pLv, heroScores: pvpDefense.heroScores, winStreakNum:0, seasonNum, refOppCnt:0, challengeCnt:PVP.PVP_CHALLENGE_COUNTS, challengeRefTime:0, seasonEndTime}); //TODO 下发邮件 return pvpDefense; @@ -91,7 +98,7 @@ async function setNextPvpTime() { function getScore(arr, score) { for (let item of arr) { - if (item.max >= score && score < item.min) { + if ((item.max >= score||item.max == -1) && score >= item.min) { return item; } } diff --git a/shared/consts/constModules/battleConst.ts b/shared/consts/constModules/battleConst.ts index 413fa0307..46aee4442 100644 --- a/shared/consts/constModules/battleConst.ts +++ b/shared/consts/constModules/battleConst.ts @@ -104,6 +104,10 @@ export const DUNGEON_CONST = { MAX_BUY_CNT: 10 // 最大购买次数 } +export const PVP_CONST = { + REFRESH_TIME: 5, // 每天加点刷新 +} + export const EXPEDITION_CONST = { REFRESH_TIME: 5, // 重置次数刷新时间 INCREASE_POINT: 1, // 远征每成功一次累计的点数 diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 246c9f61b..d18708d38 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -293,7 +293,7 @@ export const FILENAME = { DIC_PVP_OPPONENT: 'dic_pvp_opponent', DIC_PVP_TEAM_LEVEL: 'dic_pvp_teamLevel', DIC_GK_PVP: 'dic_zyz_gk_pvp', - DIC_PVP_REFRESHCONSUME: 'dic_pvp_refreshConsume', + DIC_PVP_REFRESH_CONSUME: 'dic_pvp_refreshConsume', DIC_PVP_HERO_REWARD: 'dic_pvp_heroAccountReward', DIC_PVP_RANK_REWARD: 'dic_pvp_rankReward', DIC_PVP_BOX: 'dic_pvp_boxReward', diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 3920bd024..fd5f22830 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -108,6 +108,7 @@ export const STATUS = { // PVP 20700-20799 PVP_ROLE_NOT_FOUND: { code: 20700, simStr: '未找到该对手' }, PVP_NOT_OPEN: { code: 20701, simStr: 'pvp尚未开启' }, + PVP_REFRESH_CNT_REACH_MAX: { code: 20702, simStr: '刷新对手次数超过最大值' }, // 共斗藏宝图合成 COM_BLUEPRT_QUALITY_CANNOT_COMPOSE: { code: 20630, simStr: '该品质藏宝图不可合成' }, diff --git a/shared/db/PvpDefense.ts b/shared/db/PvpDefense.ts index bf8cbe258..37f81b767 100644 --- a/shared/db/PvpDefense.ts +++ b/shared/db/PvpDefense.ts @@ -16,6 +16,7 @@ interface pvpUpdateInter { heroes?: Array; seasonNum?: number; refOppCnt?:number; + refOppTime?: Date; challengeCnt?:number; challengeRefTime?:number; isFirstEntry?:boolean; @@ -126,13 +127,15 @@ export default class PvpDefense extends BaseModel { defCe: number; //防守ce @prop({ required: true, type: OppPlayers, default: getInitialOppPlayers(), _id: false }) oppPlayers: Array; - @prop({ required: true, type: HeroScores, default: [] }) + @prop({ required: true, type: HeroScores, default: [], _id: false }) heroScores: Array; @prop({ required: true, default: true }) isDefaultHero: boolean; @prop({ required: true, default: 0 }) refOppCnt: number; // 刷新对手总次数,消耗可根据消耗表算出 @prop({ required: true, default: 0 }) + refOppTime: Date; // 刷新对手时间 + @prop({ required: true, default: 0 }) challengeCnt: number; // 可挑战次数 @prop({ required: true, default: 0 }) challengeRefTime: number; // 上一次刷新的时间 diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 63293d116..b7ff4fe23 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -38,7 +38,7 @@ import { dicHeroScroll, preHeroScroll } from './dictionary/DicHeroScroll'; import { ABI_TYPE_TO_STAGE } from "../consts"; import { dicPvpOpponent } from './dictionary/DicPvpOpponent'; import { dicPvpTeamLevel } from './dictionary/DicPvpTeamLevel'; -import { dicPvpRefreshConsume } from './dictionary/DicPvpRefreshConsume'; +import { dicPvpRefreshConsume, maxPvpRefreshCnt } from './dictionary/DicPvpRefreshConsume'; import { dicGkPvp, dicGkPvps } from './dictionary/DicGkPvp'; import { dicHeroRewads } from './dictionary/DicPvpHeroReward'; import { dicRankRewads } from './dictionary/DicPvpRankReward'; @@ -95,6 +95,7 @@ export const gameData = { pvpTeamLevel: dicPvpTeamLevel, pvpWar: dicWarPvp, pvpRefreshConsume: dicPvpRefreshConsume, + maxPvpRefreshCnt: maxPvpRefreshCnt, pvpGk: dicGkPvp, pvpGks: dicGkPvps, pvpHeroRewards: dicHeroRewads, diff --git a/shared/pubUtils/dictionary/DicPvpHeroReward.ts b/shared/pubUtils/dictionary/DicPvpHeroReward.ts index f19fe4f0f..6bd320eac 100644 --- a/shared/pubUtils/dictionary/DicPvpHeroReward.ts +++ b/shared/pubUtils/dictionary/DicPvpHeroReward.ts @@ -11,7 +11,7 @@ export interface DicHeroRewads { } -const str = readJsonFile(FILENAME.DIC_PVP_RANK_REWARD); +const str = readJsonFile(FILENAME.DIC_PVP_HERO_REWARD); let arr = JSON.parse(str); export const dicHeroRewads = new Array(); diff --git a/shared/pubUtils/dictionary/DicPvpRefreshConsume.ts b/shared/pubUtils/dictionary/DicPvpRefreshConsume.ts index c9daeab11..1aff3ec42 100644 --- a/shared/pubUtils/dictionary/DicPvpRefreshConsume.ts +++ b/shared/pubUtils/dictionary/DicPvpRefreshConsume.ts @@ -12,14 +12,16 @@ export interface DicPvpRefreshConsume { readonly consume: RewardInter[] } -const str = readJsonFile(FILENAME.DIC_PVP_TEAM_LEVEL); +const str = readJsonFile(FILENAME.DIC_PVP_REFRESH_CONSUME); let arr = JSON.parse(str); -export const dicPvpRefreshConsume = new Map(); +export const dicPvpRefreshConsume = new Map(); +export let maxPvpRefreshCnt = 0; arr.forEach(o => { o.consume = parseGoodStr(o.consume); - dicPvpRefreshConsume.set(o.count, o); + if(o.count > maxPvpRefreshCnt) maxPvpRefreshCnt = o.count; + dicPvpRefreshConsume.set(o.count, o.consume); }); arr = undefined; \ No newline at end of file