名将擂台:获取对手详细信息,结算
This commit is contained in:
@@ -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次(扫荡)
|
||||
|
||||
Reference in New Issue
Block a user