✨ feat(gvg): 开始挑战和结束挑战
This commit is contained in:
@@ -1,18 +1,23 @@
|
||||
import { Application, BackendSession, ChannelService, HandlerService } from "pinus";
|
||||
import { GVG_ITEM, GVG_PERIOD, ITEM_CHANGE_REASON, STATUS, VESTIGE_OPP_STATUS } from "../../../consts";
|
||||
import { GVG_ACTIVE_TYPE, GVG_ITEM, GVG_PERIOD, ITEM_CHANGE_REASON, STATUS, VESTIGE_OPP_STATUS, VESTIGE_STATUS } from "../../../consts";
|
||||
import { BattleRecordModel } from "../../../db/BattleRecord";
|
||||
import { GVGLeagueModel } from "../../../db/GVGLeague";
|
||||
import { GVGUserItemModel } from "../../../db/GVGUserItem";
|
||||
import { GVGVestigeLockModel } from "../../../db/GVGVestigeLock";
|
||||
import { GVGVestigeRankModel } from "../../../db/GVGVestigeRank";
|
||||
import { GVGVestigeRankModel, GVGVestigeRankType } 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 { GVG } from "../../../pubUtils/dicParam";
|
||||
import { resResult } from "../../../pubUtils/util";
|
||||
import { checkVestige, checkVestigeOppStatus, checkVestigeRank, generateAttackInfo, generateDefenseInfo, getOppDetailData, getOppPlayerByRanks, getVestigeUsedHeroes, isRobot, refreshVestigeOppRanks } from "../../../services/gvg/gvgFightService";
|
||||
import { isHeroHidden } from "../../../services/dataService";
|
||||
import { calBreakGoods, checkHeroIsUsedInOtherVestige, checkVestige, checkVestigeOppStatus, checkVestigeRank, generateAttackHeroInfo, generateAttackInfo, generateDefenseInfo, getOppDetailData, getOppPlayerByRanks, getVestigeRecStatus, getVestigeUsedHeroes, isRobot, refreshVestigeOppRanks, updateMyVestigeRank } from "../../../services/gvg/gvgFightService";
|
||||
import { addGVGReward, handleGVGCost } from "../../../services/gvg/gvgItemService";
|
||||
import { addGVGActive } from "../../../services/gvg/gvgPrepareService";
|
||||
import { getGroupIdOfServer, getGVGPeriodData } from "../../../services/gvg/gvgService";
|
||||
import { checkBattleHeroesByHid } from "../../../services/normalBattleService";
|
||||
import { getAllServerName } from "../../../services/redisService";
|
||||
|
||||
export default function (app: Application) {
|
||||
@@ -26,11 +31,6 @@ export class GVGProduceHandler {
|
||||
this.channelService = app.get('channelService');
|
||||
}
|
||||
|
||||
// 领取排行榜获得的每日奖励
|
||||
async receiveBox(msg: { vestigeId: number }, session: BackendSession) {
|
||||
|
||||
}
|
||||
|
||||
// 遗迹页面
|
||||
async getVestige(msg: { vestigeId: number }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
@@ -40,20 +40,20 @@ export class GVGProduceHandler {
|
||||
let { configId, period } = getGVGPeriodData();
|
||||
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
|
||||
|
||||
let groupId = await getGroupIdOfServer(serverId);
|
||||
if(!await checkVestige(groupId, vestigeId)) {
|
||||
if(!await checkVestige(serverId, vestigeId)) {
|
||||
return resResult(STATUS.GVG_VESTIGE_ERR);
|
||||
}
|
||||
let groupId = await getGroupIdOfServer(serverId);
|
||||
let dicRankMap = gameData.gvgVestige.get(vestigeId);
|
||||
if(!dicRankMap) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let myVestigateRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
if(!myVestigateRank) {
|
||||
let myVestigeRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
if(!myVestigeRank) {
|
||||
let role = await RoleModel.findByRoleId(roleId, 'roleId');
|
||||
let oppRanks = refreshVestigeOppRanks(-1);
|
||||
myVestigateRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, role, oppRanks );
|
||||
myVestigeRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, role, oppRanks );
|
||||
}
|
||||
let { rank, lineup, oppRanks, refreshCnt } = myVestigateRank;
|
||||
let { rank, lineup, oppRanks, refreshCnt } = myVestigeRank;
|
||||
let score = dicRankMap?.get(rank)||0;
|
||||
|
||||
let lineupCe = lineup.reduce((pre, cur) => pre + cur.ce, 0);
|
||||
@@ -82,13 +82,13 @@ export class GVGProduceHandler {
|
||||
const serverId: number = session.get('serverId');
|
||||
|
||||
let { vestigeId, roleId: targetRoleId, rank } = msg;
|
||||
let myVestigateRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
let myVestigeRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
|
||||
const serverNames = await getAllServerName();
|
||||
|
||||
let isRobot = targetRoleId.startsWith('robot');
|
||||
let result = new GVGVestigeOppLineup(vestigeId);
|
||||
result.setMyRank(myVestigateRank?.rank||0);
|
||||
result.setMyRank(myVestigeRank?.rank||0);
|
||||
let dicGVGVestige = gameData.gvgVestige.get(vestigeId)?.get(rank);
|
||||
if(!dicGVGVestige) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
@@ -97,13 +97,13 @@ export class GVGProduceHandler {
|
||||
let dicWarJson = gameData.warJson.get(dicWar.dispatchJsonId);
|
||||
result.setRobot(dicGVGVestige, dicWarJson, serverNames[serverId]);
|
||||
} else {
|
||||
let hisVestigateRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId);
|
||||
if(!hisVestigateRank) return resResult(STATUS.GVG_VESTIGE_TARGET_NOT_FOUND);
|
||||
let hisVestigeRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId);
|
||||
if(!hisVestigeRank) 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')
|
||||
if(!hisVestigateRank) return resResult(STATUS.GVG_VESTIGE_TARGET_NOT_FOUND);
|
||||
let role = await RoleModel.findByRoleId(hisVestigeRank.roleId, 'roleId roleName serverId guildName title lv heads head spines spine frames frame')
|
||||
if(!hisVestigeRank) return resResult(STATUS.GVG_VESTIGE_TARGET_NOT_FOUND);
|
||||
|
||||
let hids = hisVestigateRank.lineup?.map(cur => cur.actorId)||[];
|
||||
let hids = hisVestigeRank.lineup?.map(cur => cur.actorId)||[];
|
||||
let heroes = await HeroModel.findByHidRange(hids, roleId, 'hid skinId quality star colorStar lv');
|
||||
result.setPlayer(dicGVGVestige, role, heroes, serverNames);
|
||||
}
|
||||
@@ -139,7 +139,7 @@ export class GVGProduceHandler {
|
||||
|
||||
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);
|
||||
const groupId = await getGroupIdOfServer(serverId);
|
||||
|
||||
let status = await checkVestigeOppStatus(configId, groupId, vestigeId, roleId, myRank, targetRoleId, rank); // 锁
|
||||
if(status != VESTIGE_OPP_STATUS.BATTLE) {
|
||||
@@ -156,37 +156,143 @@ export class GVGProduceHandler {
|
||||
}
|
||||
// 获取征战令对应奖励
|
||||
const leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, dicRank.battleLeagueReward, dicRank.battleReward, ITEM_CHANGE_REASON.GVG_VESTIGE_START);
|
||||
// 消耗征战令的获得活跃
|
||||
let active = await addGVGActive(myLeague.leagueCode, roleId, GVG_ACTIVE_TYPE.COST_FIGHT_COIN);
|
||||
// 创建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 rec = await GVGVestigeRecModel.createRec(configId, vestigeId, groupId, dicRank.warId, attackInfo, defenseInfo, leagueGoods);
|
||||
const oppDetail = await getOppDetailData(rec);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
battleCode: rec.battleCode,
|
||||
time: rec.checkTime,
|
||||
time: Math.floor(rec.checkTime/100) + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN,
|
||||
active,
|
||||
...oppDetail
|
||||
});
|
||||
}
|
||||
|
||||
// 出战界面撤退
|
||||
async giveupCheck(msg: { battleCode: string }, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
let { battleCode } = msg;
|
||||
// 更新ladderMatchRec
|
||||
let rec = await GVGVestigeRecModel.giveup(roleId, battleCode);
|
||||
if(rec && rec.defenseInfo) {
|
||||
await GVGVestigeLockModel.releaseLock(rec.groupId, rec.vestigeId, rec.defenseInfo.oldRank);
|
||||
}
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
status: 0, time: 0,
|
||||
leagueGoods: rec.leagueGoods
|
||||
});
|
||||
}
|
||||
|
||||
// 获取对手具体战场数据
|
||||
async getOppData(msg: { battleCode: string }, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
let { battleCode } = msg;
|
||||
|
||||
let rec = await GVGVestigeRecModel.findByBattleCode(battleCode);
|
||||
if(!rec || rec.attackRoleId != roleId) return resResult(STATUS.LADDER_REC_NOT_FOUND);
|
||||
let status = getVestigeRecStatus(rec);
|
||||
if(status == VESTIGE_STATUS.COMPLETE || status == VESTIGE_STATUS.NO) return resResult(STATUS.LADDER_REC_STATUS_IS_COMPLETE);
|
||||
|
||||
let result = await getOppDetailData(rec);
|
||||
return resResult(STATUS.SUCCESS, result);
|
||||
}
|
||||
|
||||
// 布完阵开始挑战
|
||||
async checkBattle(msg: { battleCode: string, heroes: [{ actorId: number, dataId: number, order: number }] }, session: BackendSession) {
|
||||
|
||||
const roleId = session.get('roleId');
|
||||
const roleName = session.get('roleName');
|
||||
const serverId = session.get('serverId');
|
||||
const { battleCode, heroes } = msg;
|
||||
|
||||
let rec = await GVGVestigeRecModel.findByBattleCode(battleCode);
|
||||
if(!rec || rec.attackRoleId != roleId) return resResult(STATUS.GVG_VESTIGE_REC_NOT_FOUND);
|
||||
if(getVestigeRecStatus(rec) != VESTIGE_STATUS.CHECK) return resResult(STATUS.GVG_VESTIGE_CHECK_BATTLE_STATUS_ERR);
|
||||
const { vestigeId, defenseInfo: { oldRank: rank }, warId } = rec;
|
||||
|
||||
for(let { actorId } of heroes) {
|
||||
if(isHeroHidden(actorId)) return resResult(STATUS.HERO_IS_HIDDEN);
|
||||
}
|
||||
let { isOK, heroes: dbHeroes } = await checkBattleHeroesByHid(roleId, heroes.map(cur => cur.actorId));
|
||||
if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
|
||||
// 检查武将是否在其他遗迹中使用了
|
||||
if(await checkHeroIsUsedInOtherVestige(roleId, vestigeId, heroes)) return resResult(STATUS.GVG_VESTIGE_HERO_USED);
|
||||
|
||||
// 更新锁
|
||||
const groupId = await getGroupIdOfServer(serverId);
|
||||
let lock = await GVGVestigeLockModel.checkBattleLock(groupId, vestigeId, rank, roleId);
|
||||
if(!lock) return resResult(STATUS.GVG_VESTIGE_CHECK_BATTLE_STATUS_ERR);
|
||||
|
||||
// 向vestigerec保存阵容
|
||||
const attackHeroes = await generateAttackHeroInfo(heroes, dbHeroes);
|
||||
rec = await GVGVestigeRecModel.startBattle(battleCode, attackHeroes);
|
||||
|
||||
// 更新battleRecord
|
||||
let warInfo = gameData.war.get(warId);
|
||||
await BattleRecordModel.updateBattleRecordByCode(battleCode, {
|
||||
$set: { roleId, roleName, battleId: warId, status: 0, warName: warInfo?.gk_name, warType: warInfo?.warType, }
|
||||
});
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
time: Math.floor(rec.battleTime/1000) + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN,
|
||||
battleCode: rec.battleCode
|
||||
});
|
||||
}
|
||||
|
||||
// 挑战结算
|
||||
async battleEnd(msg: { battleCode: string, isSuccess: boolean }, session: BackendSession) {
|
||||
|
||||
const roleId = session.get('roleId');
|
||||
const roleName = session.get('roleName');
|
||||
const serverId = session.get('serverId');
|
||||
const sid = session.get('sid');
|
||||
const guildCode = session.get('guildCode');
|
||||
const { battleCode, isSuccess } = msg;
|
||||
|
||||
let rec = await GVGVestigeRecModel.findByBattleCode(battleCode);
|
||||
if(!rec || rec.attackRoleId != roleId) return resResult(STATUS.GVG_VESTIGE_REC_NOT_FOUND);
|
||||
if(getVestigeRecStatus(rec) != VESTIGE_STATUS.BATTLE) return resResult(STATUS.GVG_VESTIGE_BATTLE_END_STATUS_ERR);
|
||||
|
||||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||||
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
|
||||
|
||||
let historyData = await GVGVestigeRankModel.findByRole(rec.vestigeId, roleId);
|
||||
let historyRank = historyData?.rank||0;
|
||||
// 交换排名
|
||||
let { isChange, atkData, defData, endTime } = await GVGVestigeRankModel.changeRank(isSuccess, rec.attackInfo, rec.defenseInfo);
|
||||
atkData = await updateMyVestigeRank(isChange, atkData, historyRank, rec);
|
||||
// 更新vestigeRec
|
||||
rec = await GVGVestigeRecModel.battleEnd(battleCode, isSuccess, endTime, atkData?.rank, defData?.rank);
|
||||
// 更新锁
|
||||
await GVGVestigeLockModel.releaseLock(rec.groupId, rec.vestigeId, rec.defenseInfo.oldRank);
|
||||
// 更新battleRecord
|
||||
await BattleRecordModel.updateBattleRecordByCode(battleCode, { $set: { status: isSuccess? 1: 2 } });
|
||||
|
||||
// 突破排名奖励
|
||||
let { rewards, leagueRewards } = calBreakGoods(rec.vestigeId, historyRank, atkData.rank);
|
||||
let breakGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, leagueRewards, rewards, ITEM_CHANGE_REASON.GVG_VESTIGE_END);
|
||||
|
||||
// TODO 更新redis排行榜
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
vestigeId: rec.vestigeId,
|
||||
battleCode: rec.battleCode,
|
||||
leagueGoods: rec.leagueGoods,
|
||||
rank: atkData.rank,
|
||||
score: gameData.gvgVestige.get(rec.vestigeId)?.get(atkData.rank)?.score,
|
||||
historyRank: atkData.historyRank,
|
||||
status: getVestigeRecStatus(rec),
|
||||
time: endTime,
|
||||
oppPlayers: await getOppPlayerByRanks(serverId, rec.groupId, rec.vestigeId, atkData.oppRanks),
|
||||
breakGoods,
|
||||
lineup: atkData.lineup,
|
||||
lineupCe: atkData.lineup.reduce((pre, cur) => pre + cur.ce, 0),
|
||||
});
|
||||
}
|
||||
|
||||
// 征战中原简单小排行榜
|
||||
@@ -203,4 +309,9 @@ export class GVGProduceHandler {
|
||||
async getPlayerRank(msg: { vestigeId: number }, session: BackendSession) {
|
||||
|
||||
}
|
||||
|
||||
// 领取排行榜获得的每日奖励
|
||||
async receiveBox(msg: { vestigeId: number }, session: BackendSession) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,22 @@
|
||||
// 征战中原相关
|
||||
|
||||
import { GVG_PERIOD, STATUS, VESTIGE_OPP_STATUS } from "../../consts";
|
||||
import { GVG_PERIOD, STATUS, VESTIGE_OPP_STATUS, VESTIGE_STATUS } from "../../consts";
|
||||
import { ArtifactModel } from "../../db/Artifact";
|
||||
import { GVGVestigeModel } from "../../db/GVGVestige";
|
||||
import { GVGVestigeLockModel } from "../../db/GVGVestigeLock";
|
||||
import { GVGVestigeRankModel, GVGVestigeRankType } from "../../db/GVGVestigeRank";
|
||||
import { GVGVestigeRankModel, GVGVestigeRankType, GVGVestigeRankUpdate } from "../../db/GVGVestigeRank";
|
||||
import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
|
||||
import { HeroModel } from "../../db/Hero";
|
||||
import { HeroModel, HeroType } from "../../db/Hero";
|
||||
import { RoleModel, RoleType } from "../../db/Role";
|
||||
import { OppDetailData, OppDetailHeroData, OppPlayerHeroInfo, OppPlayerInfo } from "../../domain/gvgField/gvgDb";
|
||||
import { GVGVestigeOppPlayer } from "../../domain/gvgField/returnData";
|
||||
import { gameData, getGVGVestigeRange } from "../../pubUtils/data";
|
||||
import { GVG } from "../../pubUtils/dicParam";
|
||||
import { RewardInter } from "../../pubUtils/interface";
|
||||
import { getTimeFun } from "../../pubUtils/timeUtil";
|
||||
import { getRandEelm, getRandValueByMinMax, resResult } from "../../pubUtils/util";
|
||||
import { getNumberArr, uniqueArr } from "../ladderService";
|
||||
import { getHeroesAttributes } from "../playerCeService";
|
||||
import { calLineupScore } from "../pvpService";
|
||||
import { getAllServerName } from "../redisService";
|
||||
import { getGroupIdOfServer, getGVGServerType } from "./gvgService";
|
||||
|
||||
@@ -34,20 +35,19 @@ export function getFightTimeByPeriod(period: GVG_PERIOD) {
|
||||
export async function getVestiges(serverId: number) {
|
||||
let groupId = await getGroupIdOfServer(serverId);
|
||||
let serverType = await getGVGServerType(serverId);
|
||||
let vestige = await GVGVestigeModel.getVestigate(groupId);
|
||||
let vestige = await GVGVestigeModel.getVestige(groupId);
|
||||
if(!vestige) {
|
||||
let dicGVGVestige = gameData.gvgVestigeByServerType.get(serverType)||[];
|
||||
let cnt = gameData.gvgVestigeCntByServerType.get(serverType)||0;
|
||||
let randResult = getRandEelm(dicGVGVestige, cnt);
|
||||
vestige = await GVGVestigeModel.initTodayVestigate(groupId, serverType, randResult);
|
||||
vestige = await GVGVestigeModel.initTodayVestige(groupId, serverType, randResult);
|
||||
}
|
||||
return vestige.vestiges||[];
|
||||
}
|
||||
|
||||
export async function checkVestige(groupId: number, vestigeId: number) {
|
||||
let todayVestige = await GVGVestigeModel.getVestigate(groupId);
|
||||
if(!todayVestige) return false;
|
||||
return !!todayVestige.vestiges.find(cur => cur.vestigeId == vestigeId);
|
||||
export async function checkVestige(serverId: number, vestigeId: number) {
|
||||
let vestiges = await getVestiges(serverId);
|
||||
return !!vestiges.find(cur => cur.vestigeId == vestigeId);
|
||||
}
|
||||
|
||||
// 根据自己排名随机出对手排名
|
||||
@@ -105,6 +105,15 @@ export async function getVestigeUsedHeroes(roleId: string, curVestigeId: number)
|
||||
return result;
|
||||
}
|
||||
|
||||
// 是否在其他遗迹中使用过这个武将
|
||||
export async function checkHeroIsUsedInOtherVestige(roleId: string, curVestigeId: number, heroes: { actorId: number }[]) {
|
||||
let usedHeroes = await getVestigeUsedHeroes(roleId, curVestigeId);
|
||||
for(let { actorId } of heroes) {
|
||||
if(usedHeroes.indexOf(actorId) != -1) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查我的排名是否可以挑战对方的排名
|
||||
export function checkVestigeRank(myRank: number, targetRank: number) {
|
||||
let dicRange = getGVGVestigeRange(myRank);
|
||||
@@ -135,6 +144,11 @@ export function isRobot(roleId: string) {
|
||||
export async function checkVestigeOppStatus(configId: number, groupId: number, vestigeId: number, roleId: string, myRank: number, targetRoleId: string, rank: number) {
|
||||
|
||||
let myData = await GVGVestigeRankModel.findByRole(vestigeId, roleId);
|
||||
if(!myData) {
|
||||
let role = await RoleModel.findByRoleId(roleId, 'roleId');
|
||||
let oppRanks = refreshVestigeOppRanks(-1);
|
||||
myData = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, role, oppRanks );
|
||||
}
|
||||
if(myData?.rank != myRank) return VESTIGE_OPP_STATUS.MY_RANK_CHANGE;
|
||||
|
||||
if(isRobot(targetRoleId)) {
|
||||
@@ -175,10 +189,11 @@ export async function generateDefenseInfo(roleId: string, vestigeId: number, ran
|
||||
let lineup = playerVestigeData.lineup||[];
|
||||
let hids = lineup.map(cur => cur.actorId);
|
||||
let role = await RoleModel.findByRoleId(playerVestigeData.roleId, 'roleId roleName heads head frames frame spines spine title lv');
|
||||
let heroes = await HeroModel.findByHidRange(hids, playerVestigeData.roleId, 'hid skinId lv star colorStar quality');
|
||||
let heroes = await HeroModel.findByHidRange(hids, playerVestigeData.roleId, 'hid skinId lv star colorStar quality ce');
|
||||
|
||||
let info = new OppPlayerInfo();
|
||||
info.initByPlayer(playerVestigeData.rank, role, heroes, lineup, true);
|
||||
info.initByPlayer(playerVestigeData.rank, role, true);
|
||||
info.setPlayerHeroes(heroes, lineup);
|
||||
return info;
|
||||
}
|
||||
}
|
||||
@@ -186,10 +201,16 @@ export async function generateDefenseInfo(roleId: string, vestigeId: number, ran
|
||||
export async function generateAttackInfo(roleId: string, rank: number) {
|
||||
let role = await RoleModel.findByRoleId(roleId, 'roleId roleName heads head frames frame spines spine title lv');
|
||||
let info = new OppPlayerInfo();
|
||||
info.initByPlayer(rank, role, [], [], false);
|
||||
info.initByPlayer(rank, role, false);
|
||||
return info;
|
||||
}
|
||||
|
||||
export async function generateAttackHeroInfo(lineup: { actorId: number, dataId: number, order: number }[], dbHeroes: HeroType[]) {
|
||||
let info = new OppPlayerInfo();
|
||||
info.setPlayerHeroes(dbHeroes, lineup);
|
||||
return info.heroes;
|
||||
}
|
||||
|
||||
export async function getOppDetailData(rec: GVGVestigeRecType) {
|
||||
let isRobot = rec.defenseInfo.isRobot;
|
||||
let dicLadderDifficultRatio = gameData.ladderDifficultRatio.get(rec.defenseInfo.oldRank);
|
||||
@@ -212,3 +233,52 @@ export async function getOppDetailData(rec: GVGVestigeRecType) {
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
// 根据记录里的时间判断当前状态
|
||||
export function getVestigeRecStatus(rec: GVGVestigeRecType) {
|
||||
let { checkTime = 0, battleTime = 0, endTime = 0, cancel } = rec;
|
||||
if(cancel) return VESTIGE_STATUS.COMPLETE;
|
||||
if(endTime > 0 && endTime <= Date.now()) return VESTIGE_STATUS.COMPLETE;
|
||||
if(battleTime > 0 && battleTime <= Date.now() && battleTime + GVG.GVG_VESTIGE_BATTLE_COUNTDOWN * 1000 > Date.now()) return VESTIGE_STATUS.BATTLE;
|
||||
if(checkTime > 0 && checkTime <= Date.now() && checkTime + GVG.GVG_VESTIGE_PREPARE_COUNTDOWN * 1000 > Date.now()) return VESTIGE_STATUS.CHECK;
|
||||
|
||||
return VESTIGE_STATUS.NO;
|
||||
}
|
||||
|
||||
// 将开始战斗时候的阵容存到防守阵容
|
||||
export async function updateMyVestigeRank(isChange: boolean, atkData: GVGVestigeRankType, historyRank: number, rec: GVGVestigeRecType) {
|
||||
let update: GVGVestigeRankUpdate = {}, needUpdate = false;
|
||||
if(isChange) {
|
||||
if(atkData && !atkData.hasDefense) { // 只有第一次挑战且自己没有主动保存过阵容的时候才会这么保存
|
||||
let heroes = rec.attackInfo.heroes||[];
|
||||
let lineup = heroes.map(hero => ({ actorId: hero.hid, dataId: hero.dataId, order: hero.order, ce: hero.ce }));
|
||||
update.lineup = lineup;
|
||||
needUpdate = true;
|
||||
}
|
||||
if(atkData && atkData.rank > historyRank) { // 更新历史最高排名
|
||||
update.historyRank = atkData.rank;
|
||||
needUpdate = true;
|
||||
}
|
||||
if(atkData) { // 排名变化时刷新对手
|
||||
let oppRanks = refreshVestigeOppRanks(atkData.rank);
|
||||
update.oppRanks = oppRanks;
|
||||
}
|
||||
}
|
||||
if(needUpdate) {
|
||||
atkData = await GVGVestigeRankModel.updateByRoleId(atkData.vestigeId, atkData.roleId, update);
|
||||
}
|
||||
return atkData
|
||||
}
|
||||
|
||||
export function calBreakGoods(vestige: number, historyRank: number, rank: number) {
|
||||
let dicRankMap = gameData.gvgVestige.get(vestige);
|
||||
if(!dicRankMap) return { rewards: [], leagueRewards: [] };
|
||||
let rewards: RewardInter[] = [], leagueRewards: RewardInter[] = [];
|
||||
for(let i = historyRank + 1; i <= rank; i++) {
|
||||
let dicRank = dicRankMap.get(i);
|
||||
if(!dicRank) continue;
|
||||
rewards.push(...dicRank.onceReward);
|
||||
leagueRewards.push(...dicRank.onceLeagueReward);
|
||||
}
|
||||
return { rewards, leagueRewards }
|
||||
}
|
||||
Reference in New Issue
Block a user