名将擂台:获取对手详细信息,结算

This commit is contained in:
luying
2022-07-15 21:13:37 +08:00
parent f56dbc29de
commit df8032cb06
9 changed files with 292 additions and 39 deletions

View File

@@ -1,18 +1,20 @@
import { Application, BackendSession, pinus, HandlerService, } from 'pinus';
import { uniq, findWhere, findIndex, pick } from 'underscore';
import { gameData, getDicLadderMatchByMyRank, getPvpBoxBySeasonNumAndIndex } from '../../../pubUtils/data';
import { RoleModel, RoleType } from '../../../db/Role';
import { pick } from 'underscore';
import { gameData } from '../../../pubUtils/data';
import { STATUS } from '../../../consts/statusCode';
import { resResult, genCode, checkRoleIsRobot, robotIdComBack } from '../../../pubUtils/util';
import { resResult } from '../../../pubUtils/util';
import { LadderMatchModel, LadderUpdateInter } from '../../../db/LadderMatch';
import { checkRank, generateInitRecInfo, getBuyCntCost, getLadderData, getLadderOppStatus, refreshLadderDaily, refreshLadderEnemies } from '../../../services/ladderService';
import { LadderDataReturn, LadderDefense, LadderDefenseHero, LadderOppLineupReturn, LadderOppPlayerInfo } from '../../../domain/battleField/ladder';
import { battleEndWhenChange, checkRank, generateInitRecInfo, getBuyCntCost, getLadderData, getLadderOppStatus, refreshLadderDaily, refreshLadderEnemies } from '../../../services/ladderService';
import { LadderDataReturn, LadderDefense, LadderDefenseHero, LadderOppDetailReturn, LadderOppLineupReturn, LadderOppPlayerHeroInfo, LadderOppPlayerReturn } from '../../../domain/battleField/ladder';
import { LadderMatchRecModel } from '../../../db/LadderMatchRec';
import { HeroModel, HeroType } from '../../../db/Hero';
import { HeroModel } from '../../../db/Hero';
import { LADDER } from '../../../pubUtils/dicParam';
import { handleCost } from '../../../services/role/rewardService';
import { ITEM_CHANGE_REASON, LADDER_CHECK_STOP_TIME, LADDER_OPP_STATUS, LADDER_STATUS } from '../../../consts';
import { ITEM_CHANGE_REASON, LADDER_OPP_STATUS, LADDER_STATUS, REDIS_KEY } from '../../../consts';
import { getHeroesAttributes } from '../../../services/playerCeService';
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
import { Rank } from '../../../services/rankService';
export default function (app: Application) {
new HandlerService(app, {});
@@ -62,7 +64,7 @@ export class LadderHandler {
let serverId = session.get('serverId');
let { roleId: targetRoleId, rank, myRank } = msg;
// 检查双方排名等,不行的刷新对手回去
let ladderData = await LadderMatchModel.findByRoleIdAndInclude(roleId);
let ladderData = await LadderMatchModel.findByRoleId(roleId);
if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN);
let { status, isRobot, hisLadderData } = await getLadderOppStatus(ladderData, targetRoleId, myRank, rank);
@@ -73,6 +75,20 @@ export class LadderHandler {
});
}
// 刷新次数
let refOppObj = refreshLadderDaily(ladderData);
let update: LadderUpdateInter = {};
if(refOppObj.shouldRefOpp) {
update = { ...refOppObj };
}
if(refOppObj.challengeCnt + 1 > LADDER.LADDER_CHALLENGE_FREE_TIMES + refOppObj.buyCnt) {
return resResult(STATUS.LADDER_CHALLENGE_CNT_MAX);
}
update.challengeCnt = refOppObj.challengeCnt + 1;
ladderData = await LadderMatchModel.updateByRoleIdAndInclude(roleId, update);
// 创建ladderMatchRec发行battleCode
let attackInfo = generateInitRecInfo(false, false, ladderData.rank, ladderData);
let defenseInfo = generateInitRecInfo(isRobot, true, rank, hisLadderData);
@@ -82,7 +98,9 @@ export class LadderHandler {
pinus.app.rpc.systimer.systimerRemote.setLadderCountDown.broadcast(rec.battleCode, rec.checkTime, LADDER_STATUS.CHECK);
return resResult(STATUS.SUCCESS, {
time: rec.checkTime + LADDER_CHECK_STOP_TIME,
status,
challengeCnt: ladderData.challengeCnt,
time: rec.checkTime + LADDER.LADDER_BATTLE_PREPARE_COUNTDOWN,
battleCode: rec.battleCode
});
}
@@ -105,11 +123,27 @@ export class LadderHandler {
let roleId = session.get('roleId');
let { battleCode } = msg;
let rec = await LadderMatchRecModel.findByBattleCode(battleCode);
if(!rec || rec.roleId1 != roleId) return resResult(STATUS.LADDER_REC_NOT_FOUND);
if(rec.status == LADDER_STATUS.COMPLETE || rec.status == LADDER_STATUS.NO) return resResult(STATUS.LADDER_REC_STATUS_IS_COMPLETE);
// 判断是机器人还是真人
let isRobot = rec.defenseInfo.isRobot;
let dicLadderDifficultRatio = gameData.ladderDifficultRatio.get(rec.defenseInfo.oldRank);
let result = new LadderOppDetailReturn(rec);
if(isRobot) {
result.setByRobot(dicLadderDifficultRatio);
} else {
let hisLadderData = await LadderMatchModel.findByRoleIdAndInclude(rec.roleId2);
let dicWarJson = gameData.warJson.get(dicLadderDifficultRatio.gkId)
result.setByPlayer(hisLadderData, dicWarJson);
let attrByHid = await getHeroesAttributes(rec.roleId2);
for(let [hid, attribute] of attrByHid) {
result.setAttribute(hid, attribute.getAttributesToString());
}
}
// 真人根据ladderMatch的defense和warId对应的出兵表生成heroes
return resResult(STATUS.SUCCESS);
return resResult(STATUS.SUCCESS, result);
}
// 6. 布完阵开始挑战
@@ -117,31 +151,63 @@ export class LadderHandler {
let roleId = session.get('roleId');
let { battleCode, heroes } = msg;
// 检查挑战次数
// 取消 chooseOpp 的倒计时
// 更新ladderMatchRec状态记录下出阵时候玩家选择的顺序
// 开始倒计时当时间到了还没battleEnd的时候算失败并发通知
let rec = await LadderMatchRecModel.findByBattleCode(battleCode);
if(!rec || rec.roleId1 != roleId) return resResult(STATUS.LADDER_REC_NOT_FOUND);
if(rec.status != LADDER_STATUS.CHECK) return resResult(STATUS.LADDER_REC_STATUS_ERR);
return resResult(STATUS.SUCCESS)
let { isOK, heroes: dbHeroes } = await checkBattleHeroesByHid(roleId, heroes.map(cur => cur.actorId));
if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
let attackHeroes = dbHeroes.map(hero => {
let heroInfo = new LadderOppPlayerHeroInfo();
heroInfo.setByDefenseHero(hero);
return heroInfo;
});
rec = await LadderMatchRecModel.startBattle(battleCode, attackHeroes);
pinus.app.rpc.systimer.systimerRemote.setLadderCountDown.broadcast(rec.battleCode, rec.battleTime, LADDER_STATUS.BATTLE);
return resResult(STATUS.SUCCESS, {
time: rec.battleTime + LADDER.LADDER_BATTLE_COUNTDOWN,
battleCode: rec.battleCode
})
}
// 7. 挑战结算
async battleEnd(msg: { battleCode: string, isSuccess: boolean }, session: BackendSession) {
let roleId = session.get('roleId');
let serverId = session.get('serverId');
let { battleCode, isSuccess } = msg;
let rec = await LadderMatchRecModel.findByBattleCode(battleCode);
if(!rec || rec.roleId1 != roleId) return resResult(STATUS.LADDER_REC_NOT_FOUND);
if(rec.status != LADDER_STATUS.BATTLE) return resResult(STATUS.LADDER_REC_STATUS_ERR);
let ladderData = await LadderMatchModel.findByRoleId(roleId);
if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN);
// 取消 checkBattle 的倒计时
pinus.app.rpc.systimer.systimerRemote.cancelLadderCountDown.broadcast(battleCode);
let result = new LadderDataReturn();
// 交换双方排名, transaction
// 更新redis
let { isChange, atkLadderMatch, defLadderMatch } = await LadderMatchModel.changeRank(isSuccess, rec.attackInfo, rec.defenseInfo);
// 更新ladderMatchRec状态并记录信息
if(isChange) {
let oppPlayers = await battleEndWhenChange(atkLadderMatch);
await battleEndWhenChange(defLadderMatch);
result.setOppPlayers(oppPlayers);
rec = await LadderMatchRecModel.battleEnd(battleCode, isSuccess, atkLadderMatch.rank, defLadderMatch? defLadderMatch.rank: rec.attackInfo.oldRank);
} else {
rec = await LadderMatchRecModel.battleEnd(battleCode, isSuccess);
}
// 刷新双方的对手并发通知
// 扣挑战次数
ladderData = await LadderMatchModel.updateByRoleId(roleId, { historyRank: atkLadderMatch.rank < ladderData.historyRank? atkLadderMatch.rank: ladderData.historyRank, locked: 0 });
result.setLadderData(ladderData, rec);
// 获取奖励
return resResult(STATUS.SUCCESS)
return resResult(STATUS.SUCCESS, result)
}
// 8. 战5次扫荡

View File

@@ -18,7 +18,7 @@ export function refreshLadderDaily(ladderData: LadderMatchType) {
let curTime = new Date();
let shouldRefOpp = shouldRefresh(refDaily, curTime);
if (shouldRefOpp) {
refOppCnt = 0; buyCnt = 0; challengeCnt =0; refDaily = curTime;
refOppCnt = 0; buyCnt = 0; challengeCnt = 0; refDaily = curTime;
}
return {
shouldRefOpp,
@@ -176,7 +176,10 @@ function isOver(isBefore: boolean, myRank: number, range: number, result: number
export function checkRank(myRank: number, targetRank: number) {
let dicLadderMatch = getDicLadderMatchByMyRank(myRank);
if(!dicLadderMatch && myRank != 0 && targetRank != 3001) return false;
if(!dicLadderMatch) {
if(myRank == 0 && targetRank == 3001) return true;
return false
}
if(myRank < targetRank) { // 向后打
if(myRank + dicLadderMatch.rangeAfterMax < targetRank) return false;
} else { // 向前打
@@ -263,3 +266,21 @@ export async function ladderTimeout(battleCode: string, status: LADDER_STATUS) {
await sendMessageToUserWithSuc(rec.roleId1, PUSH_ROUTE.LADDER_BATTLE_STOP, { battleCode });
}
}
export async function battleEndWhenChange(ladderMatch: LadderMatchType) {
if(!ladderMatch) return;
// 更新redis
let r = new Rank(REDIS_KEY.LADDER, { serverId: ladderMatch.serverId });
console.log('##### ladderMatch.roleId', ladderMatch.roleId)
r.setRankWithRoleInfo(ladderMatch.roleId, ladderMatch.rank, 0);
// 刷新对手
let oppPlayers = await refreshLadderEnemies(ladderMatch);
await sendMessageToUserWithSuc(ladderMatch.roleId, PUSH_ROUTE.LADDER_RANK_UPDATE, {
oldRank: ladderMatch.oldRank,
newRank: ladderMatch.rank,
oppPlayers
});
return oppPlayers
}

View File

@@ -5,7 +5,7 @@ import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil';
import { getTodayGuildActivity, gameData } from '../pubUtils/data';
import { pvpSeasonEnd } from './pvpService';
import { getAllOnlineRoles, getAllServers, delGuildActivityRank, getServerCreateTime } from './redisService';
import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_TIMER, ACTIVITY_TYPE, PUSH_ROUTE, STATUS, LADDER_STATUS, LADDER_CHECK_STOP_TIME, LADDER_BATTLE_STOP_TIME, LADDER_SERVER_GAP_TIME } from '../consts';
import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_TIMER, ACTIVITY_TYPE, PUSH_ROUTE, STATUS, LADDER_STATUS, LADDER_SERVER_GAP_TIME } from '../consts';
import { pinus } from 'pinus';
import { settleGuildWeekly } from './guildService';
import { SendMailFun, sendMailsByGmMail, } from './mailService';
@@ -17,7 +17,7 @@ import { createNewServer, initMarquee } from './gmService';
import moment = require('moment');
import { CounterModel } from '../db/Counter';
import { reportOneOnline } from './authenticateService';
import { PVP } from '../pubUtils/dicParam';
import { LADDER, PVP } from '../pubUtils/dicParam';
import { fetch37Words } from './sdkService';
import { GMMailModel, GMMailType } from '../db/GMMail';
import { Maintenance, ServerlistModel, ServerlistType } from '../db/Serverlist';
@@ -739,7 +739,7 @@ async function setTakeRankSnapshotSchedule(activityId: number, serverId: number,
// —————————————— 名将擂台 start —————————————— //
export async function setLadderCountDown(battleCode: string, time: number, status: LADDER_STATUS) {
let endTime = time + (status == LADDER_STATUS.CHECK? LADDER_CHECK_STOP_TIME: LADDER_BATTLE_STOP_TIME) + LADDER_SERVER_GAP_TIME;
let endTime = time + (status == LADDER_STATUS.CHECK? LADDER.LADDER_BATTLE_PREPARE_COUNTDOWN: LADDER.LADDER_BATTLE_COUNTDOWN) + LADDER_SERVER_GAP_TIME;
scheduleJob(`ladder${battleCode}`, endTime * 1000, async () => {
await ladderTimeout(battleCode, status);
})