名将擂台:获取对手

This commit is contained in:
luying
2022-07-15 15:31:08 +08:00
parent 7394f14e9d
commit f56dbc29de
15 changed files with 1881 additions and 70 deletions

View File

@@ -1,18 +1,18 @@
import { Application, BackendSession, pinus, HandlerService, } from 'pinus';
import { uniq, findWhere, findIndex, pick } from 'underscore';
import { gameData, getPvpBoxBySeasonNumAndIndex } from '../../../pubUtils/data';
import { gameData, getDicLadderMatchByMyRank, getPvpBoxBySeasonNumAndIndex } from '../../../pubUtils/data';
import { RoleModel, RoleType } from '../../../db/Role';
import { STATUS } from '../../../consts/statusCode';
import { resResult, genCode, checkRoleIsRobot, robotIdComBack } from '../../../pubUtils/util';
import { LadderMatchModel, LadderUpdateInter } from '../../../db/LadderMatch';
import { getBuyCntCost, getLadderData, refreshLadderDaily } from '../../../services/ladderService';
import { LadderDataReturn, LadderDefense, LadderDefenseHero } from '../../../domain/battleField/ladder';
import { checkRank, generateInitRecInfo, getBuyCntCost, getLadderData, getLadderOppStatus, refreshLadderDaily, refreshLadderEnemies } from '../../../services/ladderService';
import { LadderDataReturn, LadderDefense, LadderDefenseHero, LadderOppLineupReturn, LadderOppPlayerInfo } from '../../../domain/battleField/ladder';
import { LadderMatchRecModel } from '../../../db/LadderMatchRec';
import { HeroModel, HeroType } from '../../../db/Hero';
import { LADDER } from '../../../pubUtils/dicParam';
import { handleCost } from '../../../services/role/rewardService';
import { ITEM_CHANGE_REASON } from '../../../consts';
import { ITEM_CHANGE_REASON, LADDER_CHECK_STOP_TIME, LADDER_OPP_STATUS, LADDER_STATUS } from '../../../consts';
export default function (app: Application) {
new HandlerService(app, {});
@@ -23,7 +23,7 @@ export class LadderHandler {
constructor(private app: Application) {
}
//1获取主界面
// 1. 获取主界面
async getData(msg: {}, session: BackendSession) {
let roleId = session.get('roleId');
@@ -31,7 +31,132 @@ export class LadderHandler {
return resResult(STATUS.SUCCESS, result);
}
// 8. 设置防守阵容
// 2. 获取对手阵容信息
async getOppLineup(msg: { roleId: string, rank: number }, session: BackendSession) {
let roleId = session.get('roleId');
let { roleId: targetRoleId, rank } = msg;
let ladderData = await LadderMatchModel.findByRoleId(roleId);
if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN);
if(!checkRank(ladderData.rank, rank)) return resResult(STATUS.LADDER_RANK_ERROR);
let { oppPlayers = [] } = ladderData;
let curOppPlayer = oppPlayers.find(cur => cur.roleId == targetRoleId);
let isRobot = curOppPlayer? curOppPlayer.isRobot: false;
let result = new LadderOppLineupReturn();
result.setMyRank(ladderData.rank);
if(isRobot) {
let dicLadderDifficultRatio = gameData.ladderDifficultRatio.get(rank);
let dicWarJson = gameData.warJson.get(dicLadderDifficultRatio.gkId);
result.setRobot(dicLadderDifficultRatio, dicWarJson);
} else {
let hisLadderData = await LadderMatchModel.findByRoleIdAndInclude(targetRoleId);
result.setPlayer(hisLadderData);
}
return resResult(STATUS.SUCCESS, result);
}
// 3. 点击挑战
async chooseOpp(msg: { roleId: string, rank: number, myRank: number }, session: BackendSession) {
let roleId = session.get('roleId');
let serverId = session.get('serverId');
let { roleId: targetRoleId, rank, myRank } = msg;
// 检查双方排名等,不行的刷新对手回去
let ladderData = await LadderMatchModel.findByRoleIdAndInclude(roleId);
if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN);
let { status, isRobot, hisLadderData } = await getLadderOppStatus(ladderData, targetRoleId, myRank, rank);
if(status != LADDER_OPP_STATUS.BATTLE) {
let oppPlayers = await refreshLadderEnemies(ladderData);
return resResult(STATUS.SUCCESS, {
status, oppPlayers
});
}
// 创建ladderMatchRec发行battleCode
let attackInfo = generateInitRecInfo(false, false, ladderData.rank, ladderData);
let defenseInfo = generateInitRecInfo(isRobot, true, rank, hisLadderData);
let rec = await LadderMatchRecModel.createRec(serverId, roleId, targetRoleId, hisLadderData?.defense, attackInfo, defenseInfo);
// 倒计时倒计时结束没有check设为失败并发失败通知
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,
battleCode: rec.battleCode
});
}
// 4. 出战撤退
async giveupCheck(msg: { battleCode: string }, session: BackendSession) {
let roleId = session.get('roleId');
let { battleCode } = msg;
// 更新ladderMatchRec
let rec = await LadderMatchRecModel.giveup(battleCode);
if(rec) {
pinus.app.rpc.systimer.systimerRemote.cancelLadderCountDown.broadcast(rec.battleCode);
}
return resResult(STATUS.SUCCESS, { status: 0, time: 0 });
}
// 5. 获取对手具体战场数据
async getOppData(msg: { battleCode: string }, session: BackendSession) {
let roleId = session.get('roleId');
let { battleCode } = msg;
// 判断是机器人还是真人
// 真人根据ladderMatch的defense和warId对应的出兵表生成heroes
return resResult(STATUS.SUCCESS);
}
// 6. 布完阵开始挑战
async checkBattle(msg: { battleCode: string, heroes: { actorId: number, order: number }[] }, session: BackendSession) {
let roleId = session.get('roleId');
let { battleCode, heroes } = msg;
// 检查挑战次数
// 取消 chooseOpp 的倒计时
// 更新ladderMatchRec状态记录下出阵时候玩家选择的顺序
// 开始倒计时当时间到了还没battleEnd的时候算失败并发通知
return resResult(STATUS.SUCCESS)
}
// 7. 挑战结算
async battleEnd(msg: { battleCode: string, isSuccess: boolean }, session: BackendSession) {
let roleId = session.get('roleId');
let { battleCode, isSuccess } = msg;
// 取消 checkBattle 的倒计时
// 交换双方排名, transaction
// 更新redis
// 更新ladderMatchRec状态并记录信息
// 刷新双方的对手并发通知
// 扣挑战次数
// 获取奖励
return resResult(STATUS.SUCCESS)
}
// 8. 战5次扫荡
async battleSweep(msg: { roleId: string, rank: number, count: number }, session: BackendSession) {
let roleId = session.get('roleId');
let { roleId: targetRoleId, rank, count } = msg;
// 检查是否可以扫荡对手
// 扣挑战次数
// 获取奖励
return resResult(STATUS.SUCCESS)
}
// 9. 设置防守阵容
async saveDefense(msg: { warId: number, heroes: { actorId: number, ai: number, dataId: number, order: number }[] }, session: BackendSession) {
let { warId, heroes } = msg;
let roleId = session.get('roleId');
@@ -55,6 +180,30 @@ export class LadderHandler {
return resResult(STATUS.SUCCESS, pick(result, 'defense'));
}
// 10. 刷新对手
async refreshOppPlayers(msg: {}, session: BackendSession) {
let roleId = session.get('roleId');
let sid = session.get('sid');
let ladderData = await LadderMatchModel.findByRoleId(roleId);
if(!ladderData) return resResult(STATUS.LADDER_NOT_OPEN);
let update: LadderUpdateInter = {};
// 刷新次数
let refOppObj = refreshLadderDaily(ladderData);
if(refOppObj.shouldRefOpp) {
update = { ...refOppObj };
}
if(refOppObj.refOppCnt + 1 > LADDER.LADDER_REFRESH_TIMES) {
return resResult(STATUS.LADDER_REFRESH_CNT_MAX);
}
update.refOppCnt = refOppObj.refOppCnt + 1;
let oppPlayers = await refreshLadderEnemies(ladderData, update);
// 返回
return resResult(STATUS.SUCCESS, { refOppCnt: update.refOppCnt, oppPlayers });
}
// 11. 购买次数
async buyCnt(msg: { count: number }, session: BackendSession) {
@@ -86,6 +235,6 @@ export class LadderHandler {
// 返回
let result = new LadderDataReturn();
result.setLadderData(ladderData);
return resResult(STATUS.SUCCESS, pick(result, 'buyCnt', 'challengeCnt'));
return resResult(STATUS.SUCCESS, pick(result, ['buyCnt', 'challengeCnt']));
}
}