✨ feat(gvg): 遗迹生成数据
This commit is contained in:
@@ -1,4 +1,14 @@
|
||||
import { Application, BackendSession, ChannelService, HandlerService } from "pinus";
|
||||
import { GVG_PERIOD, STATUS } from "../../../consts";
|
||||
import { GVGVestigeRankModel } from "../../../db/GVGVestigeRank";
|
||||
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 { getGroupIdOfServer, getGVGPeriodData } from "../../../services/gvg/gvgService";
|
||||
import { getAllServerName } from "../../../services/redisService";
|
||||
|
||||
export default function (app: Application) {
|
||||
new HandlerService(app, {});
|
||||
@@ -18,7 +28,40 @@ export class GVGProduceHandler {
|
||||
|
||||
// 遗迹页面
|
||||
async getVestige(msg: { vestigeId: number }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
const serverId = session.get('serverId');
|
||||
const { vestigeId } = msg;
|
||||
|
||||
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)) {
|
||||
return resResult(STATUS.GVG_VESTIGE_ERR);
|
||||
}
|
||||
let dicRankMap = gameData.gvgVestige.get(vestigeId);
|
||||
if(!dicRankMap) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let myVestigateRank = await GVGVestigeRankModel.findRankByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
if(!myVestigateRank) {
|
||||
let role = await RoleModel.findByRoleId(roleId, 'roleId');
|
||||
let oppRanks = refreshVestigeOppRanks(-1);
|
||||
myVestigateRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, role, oppRanks );
|
||||
}
|
||||
let { rank, lineup, oppRanks, refreshCnt } = myVestigateRank;
|
||||
let score = dicRankMap?.get(rank)||0;
|
||||
|
||||
let lineupCe = lineup.reduce((pre, cur) => pre + cur.ce, 0);
|
||||
let oppPlayers = await getOppPlayerByRanks(serverId, groupId, vestigeId, oppRanks);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
vestigeId,
|
||||
myRank: rank,
|
||||
score,
|
||||
lineup, lineupCe,
|
||||
oppPlayers,
|
||||
refreshCnt
|
||||
})
|
||||
}
|
||||
|
||||
// 编辑阵容
|
||||
@@ -28,7 +71,36 @@ export class GVGProduceHandler {
|
||||
|
||||
// 获取对手阵容消息
|
||||
async getOppLineup(msg: { vestigeId: number, roleId: string, rank: number }, session: BackendSession) {
|
||||
const roleId: string = session.get('roleId');
|
||||
const serverId: number = session.get('serverId');
|
||||
|
||||
let { vestigeId, roleId: targetRoleId, rank } = msg;
|
||||
let myVestigateRank = await GVGVestigeRankModel.findRankByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
|
||||
const serverNames = await getAllServerName();
|
||||
|
||||
let isRobot = targetRoleId.startsWith('robot');
|
||||
let result = new GVGVestigeOppLineup(vestigeId);
|
||||
result.setMyRank(myVestigateRank?.rank||0);
|
||||
let dicGVGVestige = gameData.gvgVestige.get(vestigeId)?.get(rank);
|
||||
if(!dicGVGVestige) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
if(isRobot) {
|
||||
let dicWar = gameData.war.get(dicGVGVestige?.warId);
|
||||
let dicWarJson = gameData.warJson.get(dicWar.dispatchJsonId);
|
||||
result.setRobot(dicGVGVestige, dicWarJson, serverNames[serverId]);
|
||||
} else {
|
||||
let hisVestigateRank = await GVGVestigeRankModel.findRankByRole(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')
|
||||
if(!hisVestigateRank) return resResult(STATUS.GVG_VESTIGE_TARGET_NOT_FOUND);
|
||||
|
||||
let hids = hisVestigateRank.lineup?.map(cur => cur.actorId)||[];
|
||||
let heroes = await HeroModel.findByHidRange(hids, roleId, 'hid skinId quality star colorStar lv');
|
||||
result.setPlayer(dicGVGVestige, role, heroes, serverNames);
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, result);
|
||||
}
|
||||
|
||||
// 刷新对手
|
||||
|
||||
@@ -2,9 +2,16 @@
|
||||
|
||||
import { GVG_PERIOD } from "../../consts";
|
||||
import { GVGVestigeModel } from "../../db/GVGVestige";
|
||||
import { gameData } from "../../pubUtils/data";
|
||||
import { GVGVestigeRankModel } from "../../db/GVGVestigeRank";
|
||||
import { HeroModel } from "../../db/Hero";
|
||||
import { RoleType } from "../../db/Role";
|
||||
import { GVGVestigeOppPlayer } from "../../domain/gvgField/returnData";
|
||||
import { gameData, getGVGVestigeRange } from "../../pubUtils/data";
|
||||
import { getTimeFun } from "../../pubUtils/timeUtil";
|
||||
import { getRandEelm } from "../../pubUtils/util";
|
||||
import { getRandEelm, getRandValueByMinMax } from "../../pubUtils/util";
|
||||
import { getNumberArr, uniqueArr } from "../ladderService";
|
||||
import { calLineupScore } from "../pvpService";
|
||||
import { getAllServerName } from "../redisService";
|
||||
import { getGroupIdOfServer, getGVGServerType } from "./gvgService";
|
||||
|
||||
// 备战期的遗迹和激战期的开始结束战斗时间
|
||||
@@ -30,4 +37,53 @@ export async function getVestiges(serverId: number) {
|
||||
vestige = await GVGVestigeModel.initTodayVestigate(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 function refreshVestigeOppRanks(rank: number) {
|
||||
let dicRange = getGVGVestigeRange(rank);
|
||||
if(!dicRange) return [];
|
||||
|
||||
let { rangeBeforeFrom, rangeBeforeTo, rangeBeforeNum, rangeAfterFrom, rangeAfterTo, rangeAfterNum } = dicRange;
|
||||
let beforeRanks = randomRank(rangeBeforeFrom == -1? rank: rangeBeforeFrom, rangeBeforeTo == -1? rank: rangeBeforeTo, rangeBeforeNum);
|
||||
let afterRanks = randomRank(rangeAfterFrom == -1? rank: rangeAfterFrom, rangeAfterTo == -1? rank: rangeAfterTo, rangeAfterNum);
|
||||
|
||||
let topRanks = getNumberArr(dicRange.topChallengeFrom + 1, dicRange.topChallengeTo);
|
||||
let ranks = [...topRanks, ...beforeRanks, ...afterRanks];
|
||||
return uniqueArr(ranks.sort((a, b) => a - b));
|
||||
}
|
||||
|
||||
function randomRank(min: number, max: number, len: number) {
|
||||
if(min == max || len == 0) return [];
|
||||
let arr = getNumberArr(min + 1, max);
|
||||
return getRandEelm(arr, len);
|
||||
}
|
||||
|
||||
export async function getOppPlayerByRanks(serverId: number, groupId: number, vestigeId: number, ranks: number[]) {
|
||||
let serverNames = await getAllServerName();
|
||||
let opps = await GVGVestigeRankModel.findByRanks(groupId, vestigeId, ranks);
|
||||
let dicRankMap = gameData.gvgVestige.get(vestigeId);
|
||||
if(!dicRankMap) return [];
|
||||
let result: GVGVestigeOppPlayer[] = [];
|
||||
for(let rank of ranks) {
|
||||
let obj = new GVGVestigeOppPlayer(rank);
|
||||
let opp = opps.find(cur => cur.rank == rank);
|
||||
let dicCurRank = dicRankMap.get(rank);
|
||||
if(opp) {
|
||||
let role = <RoleType>opp.role;
|
||||
let lineupce = opp.lineup.reduce((pre, cur) => pre + cur.ce, 0);
|
||||
obj.setByRole(role, serverNames, lineupce, dicCurRank?.score||0);
|
||||
} else {
|
||||
obj.setByDic(dicCurRank, serverNames[serverId]);
|
||||
}
|
||||
result.push(obj);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import { SkinType } from '../db/Skin';
|
||||
import { LadderMatchModel } from '../db/LadderMatch';
|
||||
import { ArtifactModelType } from '../db/Artifact';
|
||||
import { GVGLeagueModel } from '../db/GVGLeague';
|
||||
import { GVGVestigeRankModel } from '../db/GVGVestigeRank';
|
||||
|
||||
interface Param {
|
||||
isInitRole?: boolean,
|
||||
@@ -442,6 +443,7 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve
|
||||
let hero = await HeroModel.updateHeroInfo(roleId, hid, { ce });
|
||||
await PvpDefenseModel.updateCe(roleId, hid, ce); // 更新pvp防守阵战力
|
||||
await LadderMatchModel.updateCe(roleId, hid, ce);
|
||||
await GVGVestigeRankModel.updateCe(roleId, hid, ce);
|
||||
pushHeros.push({ hid, ce: hero.ce, incHeroCe: inc });
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user