feat(gvg): 征战中原锁定对手

This commit is contained in:
luying
2023-02-01 09:45:05 +08:00
parent 4035645772
commit b727249106
12 changed files with 635 additions and 36 deletions

View File

@@ -1,12 +1,17 @@
import { Application, BackendSession, ChannelService, HandlerService } from "pinus";
import { GVG_PERIOD, STATUS } from "../../../consts";
import { GVG_ITEM, GVG_PERIOD, ITEM_CHANGE_REASON, STATUS, VESTIGE_OPP_STATUS } from "../../../consts";
import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGUserItemModel } from "../../../db/GVGUserItem";
import { GVGVestigeLockModel } from "../../../db/GVGVestigeLock";
import { GVGVestigeRankModel } from "../../../db/GVGVestigeRank";
import { GVGVestigeRecModel } from "../../../db/GVGVestigeRec";
import { HeroModel } from "../../../db/Hero";
import { RoleModel } from "../../../db/Role";
import { GVGVestigeOppLineup } from "../../../domain/gvgField/returnData";
import { gameData } from "../../../pubUtils/data";
import { resResult } from "../../../pubUtils/util";
import { checkVestige, getOppPlayerByRanks, refreshVestigeOppRanks } from "../../../services/gvg/gvgFightService";
import { checkVestige, checkVestigeOppStatus, checkVestigeRank, generateAttackInfo, generateDefenseInfo, getOppDetailData, getOppPlayerByRanks, getVestigeUsedHeroes, isRobot, refreshVestigeOppRanks } from "../../../services/gvg/gvgFightService";
import { addGVGReward, handleGVGCost } from "../../../services/gvg/gvgItemService";
import { getGroupIdOfServer, getGVGPeriodData } from "../../../services/gvg/gvgService";
import { getAllServerName } from "../../../services/redisService";
@@ -42,7 +47,7 @@ export class GVGProduceHandler {
let dicRankMap = gameData.gvgVestige.get(vestigeId);
if(!dicRankMap) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let myVestigateRank = await GVGVestigeRankModel.findRankByRole(vestigeId, roleId); // 我在这个遗迹的排名
let myVestigateRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
if(!myVestigateRank) {
let role = await RoleModel.findByRoleId(roleId, 'roleId');
let oppRanks = refreshVestigeOppRanks(-1);
@@ -53,6 +58,7 @@ export class GVGProduceHandler {
let lineupCe = lineup.reduce((pre, cur) => pre + cur.ce, 0);
let oppPlayers = await getOppPlayerByRanks(serverId, groupId, vestigeId, oppRanks);
let usedHeroes = await getVestigeUsedHeroes(roleId, vestigeId);
return resResult(STATUS.SUCCESS, {
vestigeId,
@@ -60,7 +66,8 @@ export class GVGProduceHandler {
score,
lineup, lineupCe,
oppPlayers,
refreshCnt
refreshCnt,
usedHeroes
})
}
@@ -75,7 +82,7 @@ export class GVGProduceHandler {
const serverId: number = session.get('serverId');
let { vestigeId, roleId: targetRoleId, rank } = msg;
let myVestigateRank = await GVGVestigeRankModel.findRankByRole(vestigeId, roleId); // 我在这个遗迹的排名
let myVestigateRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
const serverNames = await getAllServerName();
@@ -90,7 +97,7 @@ export class GVGProduceHandler {
let dicWarJson = gameData.warJson.get(dicWar.dispatchJsonId);
result.setRobot(dicGVGVestige, dicWarJson, serverNames[serverId]);
} else {
let hisVestigateRank = await GVGVestigeRankModel.findRankByRole(vestigeId, roleId); // 我在这个遗迹的排名
let hisVestigateRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId);
if(!hisVestigateRank) return resResult(STATUS.GVG_VESTIGE_TARGET_NOT_FOUND);
let role = await RoleModel.findByRoleId(hisVestigateRank.roleId, 'roleId roleName serverId guildName title lv heads head spines spine frames frame')
@@ -109,8 +116,57 @@ export class GVGProduceHandler {
}
// 选择对手
async chooseOpp(msg: { vestigeId: number, rank: number, myRank: number }, session: BackendSession) {
async chooseOpp(msg: { vestigeId: number, roleId: string, rank: number, myRank: number }, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let serverId = session.get('serverId');
let guildCode = session.get('guildCode');
let sid = session.get('sid');
let { vestigeId, roleId: targetRoleId, rank, myRank } = msg;
let { configId, period } = getGVGPeriodData();
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
let dicRank = gameData.gvgVestige.get(vestigeId)?.get(rank);
if(!dicRank) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
// 检查对手排名/自己排名
if(!checkVestigeRank(myRank, rank)) return resResult(STATUS.GVG_VESTIGE_RANK_ERR);
const hasItem = await GVGUserItemModel.checkItemCnt(configId, myLeague.leagueCode, roleId, GVG_ITEM.FIGHT_COIN, 1);
if(!hasItem) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
let groupId = await getGroupIdOfServer(serverId);
let status = await checkVestigeOppStatus(configId, groupId, vestigeId, roleId, myRank, targetRoleId, rank); // 锁
if(status != VESTIGE_OPP_STATUS.BATTLE) {
let oppRanks = refreshVestigeOppRanks(myRank);
let oppPlayers = await getOppPlayerByRanks(serverId, groupId, vestigeId, oppRanks);
return resResult(STATUS.SUCCESS, { status, oppPlayers });
}
// 扣征战令
const costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, [{ id: GVG_ITEM.FIGHT_COIN, count: 1 }], [], ITEM_CHANGE_REASON.GVG_VESTIGE_START);
if(!costResult) {
await GVGVestigeLockModel.releaseLock(groupId, vestigeId, rank);
return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
}
// 获取征战令对应奖励
const leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, dicRank.battleLeagueReward, dicRank.battleReward, ITEM_CHANGE_REASON.GVG_VESTIGE_START);
// 创建rec
const attackInfo = await generateAttackInfo(roleId, myRank);
const defenseInfo = await generateDefenseInfo(targetRoleId, vestigeId, rank);
const rec = await GVGVestigeRecModel.createRec(configId, vestigeId, groupId, attackInfo, defenseInfo, leagueGoods);
const oppDetail = await getOppDetailData(rec);
return resResult(STATUS.SUCCESS, {
battleCode: rec.battleCode,
time: rec.checkTime,
...oppDetail
});
}
// 出战界面撤退