✨ feat(gvg): 开始挑战和结束挑战
This commit is contained in:
@@ -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