✨ feat(gvg): 征战中原排行榜奖励
This commit is contained in:
@@ -11,7 +11,7 @@ export async function getGVGCities(league: GVGLeagueType) {
|
||||
|
||||
/**
|
||||
* TODO 获取当前城池状态
|
||||
* @returns [{cityId: number, guardLeagueName: string, teamCnt: number }]
|
||||
* @returns [{cityId: number, guardLeagueCode: string, guardLeagueName: string, teamCnt: number }]
|
||||
*/
|
||||
export async function getGVGCitiesInfo(league: GVGLeagueType): Promise<{cityId: number, guardLeagueName: string, teamCnt: number }[]> {
|
||||
return [];
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
// 征战中原相关
|
||||
|
||||
import { GVG_PERIOD, STATUS, VESTIGE_OPP_STATUS, VESTIGE_STATUS } from "../../consts";
|
||||
import moment = require("moment");
|
||||
import { GVG_PERIOD, REDIS_KEY, VESTIGE_OPP_STATUS, VESTIGE_STATUS } from "../../consts";
|
||||
import { ArtifactModel } from "../../db/Artifact";
|
||||
import { GVGLeagueModel, GVGLeagueType } from "../../db/GVGLeague";
|
||||
import { GVGVestigeModel } from "../../db/GVGVestige";
|
||||
import { GVGVestigeLeagueRankModel } from "../../db/GVGVestigeLeagueRank";
|
||||
import { GVGVestigeLockModel } from "../../db/GVGVestigeLock";
|
||||
import { GVGVestigeRankModel, GVGVestigeRankType, GVGVestigeRankUpdate } from "../../db/GVGVestigeRank";
|
||||
import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
|
||||
import { GVGVestigeSumRankModel } from "../../db/GVGVestigeSumRank";
|
||||
import { HeroModel, HeroType } from "../../db/Hero";
|
||||
import { RoleModel, RoleType } from "../../db/Role";
|
||||
import { OppDetailData, OppDetailHeroData, OppPlayerHeroInfo, OppPlayerInfo } from "../../domain/gvgField/gvgDb";
|
||||
import { RoleModel } from "../../db/Role";
|
||||
import { OppDetailData, OppPlayerHeroInfo, OppPlayerInfo } from "../../domain/gvgField/gvgDb";
|
||||
import { GVGVestigeOppPlayer } from "../../domain/gvgField/returnData";
|
||||
import { KeyNameParam, LeagueRankInfo, myIdInter, RoleRankInfo } from "../../domain/rank";
|
||||
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 { getRandEelm } from "../../pubUtils/util";
|
||||
import { getNumberArr, uniqueArr } from "../ladderService";
|
||||
import { getHeroesAttributes } from "../playerCeService";
|
||||
import { getAllServerName } from "../redisService";
|
||||
import { combineItems } from "../role/util";
|
||||
import { Rank } from "../rankService";
|
||||
import { findKeys, getAllServerName, redisClient } from "../redisService";
|
||||
import { combinePushItem } from "./gvgItemService";
|
||||
import { getGroupIdOfServer, getGVGServerType } from "./gvgService";
|
||||
|
||||
// 备战期的遗迹和激战期的开始结束战斗时间
|
||||
@@ -147,13 +153,8 @@ export function isRobot(roleId: string) {
|
||||
|
||||
export async function checkVestigeOppStatus(configId: number, groupId: number, serverType: 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, serverType, role, oppRanks );
|
||||
}
|
||||
if(myData?.rank != myRank) return VESTIGE_OPP_STATUS.MY_RANK_CHANGE;
|
||||
let myData = await getMyVestigeRank(configId, groupId, serverType, vestigeId, roleId);
|
||||
if(!myData || myData.rank != myRank) return VESTIGE_OPP_STATUS.MY_RANK_CHANGE;
|
||||
|
||||
if(isRobot(targetRoleId)) {
|
||||
let targetData = await GVGVestigeRankModel.findByRank(vestigeId, rank);
|
||||
@@ -196,16 +197,16 @@ export async function generateDefenseInfo(roleId: string, vestigeId: number, ran
|
||||
let heroes = await HeroModel.findByHidRange(hids, playerVestigeData.roleId, 'hid skinId lv star colorStar quality ce');
|
||||
|
||||
let info = new OppPlayerInfo();
|
||||
info.initByPlayer(playerVestigeData.rank, role, true);
|
||||
info.initByPlayer(playerVestigeData.rank, role, playerVestigeData.leagueCode, true);
|
||||
info.setPlayerHeroes(heroes, lineup);
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
||||
export async function generateAttackInfo(roleId: string, rank: number) {
|
||||
export async function generateAttackInfo(roleId: string, leagueCode: 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, leagueCode, false);
|
||||
return info;
|
||||
}
|
||||
|
||||
@@ -262,7 +263,7 @@ export async function updateMyVestigeRank(isChange: boolean, atkData: GVGVestige
|
||||
update.hasDefense = true;
|
||||
needUpdate = true;
|
||||
}
|
||||
if(atkData && atkData.rank > historyRank) { // 更新历史最高排名
|
||||
if(atkData && (historyRank == 0 || atkData.rank < historyRank)) { // 更新历史最高排名
|
||||
update.historyRank = atkData.rank;
|
||||
needUpdate = true;
|
||||
}
|
||||
@@ -285,22 +286,87 @@ export function calBreakGoods(vestige: number, historyRank: number, rank: number
|
||||
for(let i = historyRank + 1; i <= rank; i++) {
|
||||
let dicRank = dicRankMap.get(i);
|
||||
if(!dicRank) continue;
|
||||
for(let { id, count } of dicRank.onceReward) {
|
||||
let obj = rewards.find(obj => obj.id == id);
|
||||
if(!obj) {
|
||||
rewards.push({ id, count });
|
||||
} else {
|
||||
obj.count += count;
|
||||
}
|
||||
}
|
||||
for(let { id, count } of dicRank.onceLeagueReward) {
|
||||
let obj = leagueRewards.find(obj => obj.id == id);
|
||||
if(!obj) {
|
||||
leagueRewards.push({ id, count });
|
||||
} else {
|
||||
obj.count += count;
|
||||
}
|
||||
}
|
||||
combinePushItem(rewards, dicRank.onceReward);
|
||||
combinePushItem(leagueRewards, dicRank.onceLeagueReward);
|
||||
}
|
||||
return { rewards, leagueRewards }
|
||||
}
|
||||
|
||||
// 玩家当天的驻扎记录,没有的话就创建一个
|
||||
export async function getMyVestigeRank(configId: number, groupId: number, serverType: number, vestigeId: number, roleId: string, myLeague?: GVGLeagueType) {
|
||||
|
||||
let myVestigeRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
|
||||
if(!myVestigeRank) {
|
||||
let role = await RoleModel.findByRoleId(roleId, 'roleId guildCode');
|
||||
let oppRanks = refreshVestigeOppRanks(-1);
|
||||
if(!myLeague) {
|
||||
myLeague = await GVGLeagueModel.findLeagueByGuild(role.guildCode);
|
||||
if(!myLeague) return null
|
||||
}
|
||||
myVestigeRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, serverType, role, myLeague.leagueCode, oppRanks );
|
||||
}
|
||||
return myVestigeRank;
|
||||
}
|
||||
|
||||
// 保存排行榜
|
||||
export async function saveScoreToRank(rec: GVGVestigeRecType) {
|
||||
await savePlayerRank(rec.configId, rec.groupId, rec.serverType, rec.vestigeId, rec.attackInfo);
|
||||
await savePlayerRank(rec.configId, rec.groupId, rec.serverType, rec.vestigeId, rec.defenseInfo);
|
||||
}
|
||||
|
||||
export function getDayKeyInfo() {
|
||||
return moment().format('YYMMDD');
|
||||
}
|
||||
|
||||
async function savePlayerRank(configId: number, groupId: number, serverType: number, vestigeId: number, playerInfo: OppPlayerInfo) {
|
||||
if(playerInfo.isRobot) return
|
||||
let dicRankMap = gameData.gvgVestige.get(vestigeId);
|
||||
let newRank = dicRankMap?.get(playerInfo.newRank)?.score||0;
|
||||
let oldRank = dicRankMap?.get(playerInfo.oldRank)?.score||0;
|
||||
let myScore = await GVGVestigeSumRankModel.incScore(playerInfo.roleId, groupId, serverType, newRank - oldRank);
|
||||
let r1 = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, { serverType, groupId, day: getDayKeyInfo() });
|
||||
await r1.setRankWithRoleInfo(playerInfo.roleId, myScore.score, myScore.updatedAt.getTime());
|
||||
let leagueScore = await GVGVestigeLeagueRankModel.incScore(configId, playerInfo.leagueCode, groupId, serverType, newRank - oldRank);
|
||||
let r2 = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { serverType, groupId, day: getDayKeyInfo() });
|
||||
await r2.setRankWithLeagueInfo(playerInfo.leagueCode, leagueScore.score, leagueScore.updatedAt.getTime());
|
||||
}
|
||||
|
||||
export async function getVestigeRank(redisKey: REDIS_KEY, isSimple: boolean, keyParam: KeyNameParam, myId: myIdInter, serverNames?: any) {
|
||||
let r = new Rank(redisKey, keyParam);
|
||||
r.setGenerFieldsFun((obj => {
|
||||
if(redisKey == REDIS_KEY.GVG_VESTIGE_MEMBER_ALL && isSimple && obj instanceof RoleRankInfo) {
|
||||
return { rank: obj.rank, name: obj.roleName, serverName: serverNames[obj.serverId], score: obj.num }
|
||||
}
|
||||
if(redisKey == REDIS_KEY.GVG_VESTIGE_LEAGUE && obj instanceof LeagueRankInfo) {
|
||||
if(isSimple) {
|
||||
return { rank: obj.rank, name: obj.name, score: obj.num }
|
||||
} else {
|
||||
return { ...obj, leader: {...obj.leader, serverName: serverNames[obj.leader.serverId]}};
|
||||
}
|
||||
}
|
||||
return obj
|
||||
}));
|
||||
|
||||
let { ranks, myRank } = await r.getRankListWithMyRank(myId);
|
||||
if (!myRank) {
|
||||
if(redisKey == REDIS_KEY.GVG_VESTIGE_MEMBER_ALL) {
|
||||
myRank = await r.generMyRankWithRole(myId.roleId, 0, 0);
|
||||
} else if (redisKey == REDIS_KEY.GVG_VESTIGE_LEAGUE) {
|
||||
myRank = await r.generMyRankWithLeague(myId.leagueCode, 0, 0);
|
||||
}
|
||||
}
|
||||
return { ranks, myRank }
|
||||
}
|
||||
|
||||
export async function saveVestigeRankSchedule() {
|
||||
let day = getDayKeyInfo();
|
||||
let keys = await findKeys(`${REDIS_KEY.GVG_VESTIGE_LEAGUE}:${day}:`);
|
||||
for(let key of keys) {
|
||||
let [,, _groupId, _serverType] = key.split(':');
|
||||
let groupId = parseInt(_groupId);
|
||||
let serverType = parseInt(_serverType);
|
||||
let r = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { groupId, serverType, day});
|
||||
let ranks = await r.getRankByRangeRaw();
|
||||
await GVGVestigeLeagueRankModel.saveRank(groupId, serverType, ranks);
|
||||
}
|
||||
}
|
||||
@@ -82,4 +82,15 @@ export function getProduceCoinCnt(items: RewardInter[]) {
|
||||
}
|
||||
}
|
||||
return produceCoinCnt;
|
||||
}
|
||||
|
||||
export function combinePushItem(targetItems: RewardInter[], dicItems: RewardInter[]) {
|
||||
for(let { id, count } of dicItems) {
|
||||
let obj = targetItems.find(obj => obj.id == id);
|
||||
if(!obj) {
|
||||
targetItems.push({ id, count });
|
||||
} else {
|
||||
obj.count += count;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user