feat(gvg): 征战中原动态、任务、贡献

This commit is contained in:
luying
2023-02-04 18:14:34 +08:00
parent 1f083dc0fa
commit e7a62c4e3e
12 changed files with 104 additions and 29 deletions

View File

@@ -106,6 +106,12 @@ export default class GVGUserData extends BaseModel {
return result;
}
public static async addVestigeScores(configId: number, memberScores: { leagueCode: string, roleId: string, score: number }[]) {
await GVGUserDataModel.bulkWrite(memberScores.map(({ leagueCode, roleId, score }) => {
return { updateOne: { filter: { configId, leagueCode, roleId }, update: { $inc: { 'distribute.score': score } } } }
}));
}
public static async receiveBox(configId: number, leagueCode: string, roleId: string, boxId: number) {
const result: GVGUserDataType = await GVGUserDataModel.findOneAndUpdate({ configId, leagueCode, roleId }, { $push: { box: boxId }}, { new: true }).lean();
return result;

View File

@@ -104,26 +104,28 @@ export default class GVGVestigeRank extends BaseModel {
await GVGVestigeRankModel.updateMany({ day: today, hasDefense: true, roleId, 'lineup.hid': hid }, { $set: { 'lineupCe.$.ce': ce } });
}
public static async changeRank(isSuccess: boolean, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, endTime: number }> {
public static async changeRank(isSuccess: boolean, vestigeId: number, attackInfo: { roleId: string }, defenseInfo: { isRobot: boolean, roleId: string, oldRank: number }): Promise<{ isChange: boolean, atkData?: GVGVestigeRankType, defData?: GVGVestigeRankType, endTime: number }> {
let today = getZeroPoint();
const session = await mongoose.connection.startSession();
session.startTransaction()
try {
let newAtkData: GVGVestigeRankType, newDefData: GVGVestigeRankType, isChange = false, endTime = Date.now();
if(defenseInfo.isRobot) {
let atkData = await GVGVestigeRankModel.findOne({ roleId: attackInfo.roleId }).lean();
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
if(isSuccess && atkData && (atkData.rank == 0 || atkData.rank > defenseInfo.oldRank)) {
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkData.rank } }, { new: true, session }).lean();
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkData.rank } }, { new: true, session }).lean();
isChange = true;
endTime = Date.now();
} else {
newAtkData = atkData;
}
} else {
let atkData = await GVGVestigeRankModel.findOne({ roleId: attackInfo.roleId }).lean();
let defData = await GVGVestigeRankModel.findOne({ roleId: defenseInfo.roleId }).lean();
let atkData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: attackInfo.roleId }).lean();
let defData = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId: defenseInfo.roleId }).lean();
if(isSuccess && atkData && defData && (atkData.rank == 0 || atkData.rank > defData.rank)) {
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defData.rank, oldRank: atkData.rank } }, { new: true, session }).lean();
newDefData = await GVGVestigeRankModel.findOneAndUpdate({ roleId: defenseInfo.roleId }, { $set: { rank: atkData.rank, oldRank: defData.rank } }, { new: true, session }).lean();
newAtkData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: attackInfo.roleId }, { $set: { rank: defData.rank, oldRank: atkData.rank } }, { new: true, session }).lean();
newDefData = await GVGVestigeRankModel.findOneAndUpdate({ day: today, vestigeId, roleId: defenseInfo.roleId }, { $set: { rank: atkData.rank, oldRank: defData.rank } }, { new: true, session }).lean();
isChange = true;
endTime = Date.now();
} else {

View File

@@ -12,6 +12,9 @@ export default class GVGVestigeSumRank extends BaseModel {
@prop({ required: true })
roleId: string; // 玩家id
@prop({ required: true })
leagueCode: string; // 联军id
@prop({ required: true })
groupId: number; // 战区id
@@ -21,26 +24,36 @@ export default class GVGVestigeSumRank extends BaseModel {
@prop({ required: true })
score: number; // 得分
public static async incScore(roleId: string, groupId: number, serverType: number, inc: number) {
public static async incScore(roleId: string, leagueCode: string, groupId: number, serverType: number, inc: number) {
let today = getZeroPoint();
let result: GVGVestigeSumRankType = await GVGVestigeSumRankModel.findOneAndUpdate({
day: today, groupId, serverType, roleId
day: today, groupId, serverType, roleId, leagueCode
}, { $inc: { score: inc } }, { new: true, upsert: true }).lean();
return result;
}
// 排行榜
public static async findRank(): Promise<{ _id: { groupId: number, serverType: number }, arr: { roleId: string, score: number, updatedAt: Date }[], roleIds: string[] }[]> {
public static async findRankByGroupId(): Promise<{ _id: { groupId: number, serverType: number }, arr: { roleId: string, score: number, updatedAt: Date }[], roleIds: string[] }[]> {
let today = getZeroPoint();
let ranks = await GVGVestigeSumRankModel.aggregate([
{ $match: { day: today } },
{ $group: {
_id: { groupId: "$groupId", serverType: "$serverType" },
arr: { $push: { roleId: "$roleId", score: "$score", updatedAt: "$updatedAt" } }, roleIds: { $addToSet: "$roleId" }
arr: { $push: { roleId: "$roleId", score: "$score", updatedAt: "$updatedAt", leagueCode: "$leagueCode" } }, roleIds: { $addToSet: "$roleId" }
}},
]);
return ranks;
}
// 用于快照玩家的得分
public static async findAllScores() {
let today = getZeroPoint();
let ranks: GVGVestigeSumRankType[] = await GVGVestigeSumRankModel.aggregate([
{ $match: { day: today } },
{ $project: { roleId: 1, score: 1, leagueCode: 1 } }
]);
return ranks;
}
}
export const GVGVestigeSumRankModel = getModelForClass(GVGVestigeSumRank);

View File

@@ -1,5 +1,6 @@
import { prop } from "@typegoose/typegoose";
import { ArtifactModelType } from "../../db/Artifact";
import { GVGLeagueType } from "../../db/GVGLeague";
import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
import { HeroType, Talent } from "../../db/Hero";
import { RoleType } from "../../db/Role";
@@ -75,6 +76,8 @@ export class OppPlayerInfo {
@prop({ required: true })
roleName: string = GVG.GVG_ROBOT_NAME; // 角色 名
@prop({ required: true })
leagueName: string = ''; // 联军名
@prop({ required: true })
leagueCode: string = ''; // 联军id
@prop({ required: true, default: 0 })
lv: number = 1; // 等级
@@ -95,7 +98,7 @@ export class OppPlayerInfo {
@prop({ required: true })
isRobot: boolean = false; // 原排名
initByPlayer(rank: number, role: RoleType, leagueCode: string, isSuccess: boolean ) {
initByPlayer(rank: number, role: RoleType, league: GVGLeagueType, isSuccess: boolean ) {
this.oldRank = rank;
this.newRank = rank;
this.roleId = role.roleId;
@@ -107,7 +110,8 @@ export class OppPlayerInfo {
this.lv = role.lv;
this.isSuccess = isSuccess;
this.isRobot = false;
this.leagueCode = leagueCode;
this.leagueCode = league.leagueCode;
this.leagueName = league.name;
}
setPlayerHeroes(heroes: HeroType[], lineup: {actorId: number, dataId: number, order: number}[]) {
@@ -228,6 +232,7 @@ export class OppDetailData{
setByPlayer(dicWarJson: DicWarJson[], defenseHeroes: OppPlayerHeroInfo[], heroes: HeroType[], artifacts: ArtifactModelType[]) {
for(let warJson of dicWarJson) {
let defenseHero = defenseHeroes.find(cur => cur.dataId == warJson.dataId);
if(!defenseHero) continue;
let curHero = heroes.find(cur => cur.hid == defenseHero.hid);
let hero = new OppDetailHeroData(warJson, defenseHero, curHero, artifacts);
this.heroes.push(hero);

View File

@@ -127,7 +127,7 @@ import { dicGVGContributeBox, loadGVGContributeBox } from './dictionary/DicGVGCo
import { dicGVGArea, dicGVGCity, loadGVGArea } from './dictionary/DicGVGArea';
import { dicGVGCityAdd, loadGVGCityAdd } from './dictionary/DicGVGCityAdd';
import { dicGVGTask, dicGVGTaskByType, loadGVGTask } from './dictionary/DicGVGTask';
import { dicGVGVestigeByType, loadGVGVestigeType } from './dictionary/DicGVGVestigeType';
import { dicGVGVestigeByType, dicGVGVestigeName, loadGVGVestigeType } from './dictionary/DicGVGVestigeType';
import { dicGVGVestige, loadGVGVestige } from './dictionary/DicGVGVestige';
import { DicGVGVestigeRange, dicGVGVestigeRange, loadGVGVestigeRange } from './dictionary/DicGVGVestigeRange';
import { DicGVGVestigeLeagueRank, dicGVGVestigeLeagueRank, loadGVGVestigeLeagueRank } from "./dictionary/DicGVGVestigeLeagueRank";
@@ -329,6 +329,7 @@ export const gameData = {
gvgVestige: dicGVGVestige,
gvgVestigeRange: dicGVGVestigeRange,
gvgVestigeLeagueRank: dicGVGVestigeLeagueRank,
gvgVestigeName: dicGVGVestigeName,
};
// 在此提供一些原先在gamedata中提供的方法以便更方便获取gameData数据

View File

@@ -376,7 +376,7 @@ export const GVG = {
GVG_LEAGUE_COMPOSE: 3, // 一个联军有最多多少军团组成
GVG_CROSS_SERVICE_STARTTIME: 4, // 开服几周后开始跨服玩法
GVG_ROLE_TOTAL_RATIO: 1.2, // 贤臣+猛将总人数上限系数
GVG_ROLE_RATIO: 1.2, // 贤臣/猛将各职能选择人数上限系数
GVG_ROLE_RATIO: 1, // 贤臣/猛将各职能选择人数上限系数
GVG_PRODUCER_GET: '10&4|11&2', // 贤臣每天发多少令
GVG_FIGHTER_GET: '10&2|11&4', // 猛将每天发多少令
GVG_LEAGUE_TECH_LIST: 3, // 科技树解锁队列数量
@@ -394,7 +394,9 @@ export const GVG = {
GVG_FIELD_TYPE_RATIO: '1&5%|2&10%|3&10%', // 全联盟的特殊格子上限百分比a%的格子为小麦这个1&a|2&b|3&c
GVG_SP_FIELD_RATIO: '10%&30%', // 分配给玩家的时候有多少特殊格子 min&max 填最大最小百分比即可
GVG_REFRESH_TIME: 5, // 0
GVG_ROBOT_NAME: '遗迹守护者', // 0,
GVG_VESTIGE_PREPARE_COUNTDOWN: 120, //
GVG_VESTIGE_BATTLE_COUNTDOWN: 300, //
GVG_ROBOT_NAME: '遗迹守', // 0
GVG_SINGLE_SERVICE_CITY: '1&2&3', // 单服城池
GVG_CROSS_SERVICE_CITY: '4&5&6&7&8&9&10&11&12&13', // 跨服城池
GVG_VESTIGE_PREPARE_COUNTDOWN: 120, // 遗迹准备界面倒计时(s)
GVG_VESTIGE_BATTLE_COUNTDOWN: 300, // 遗迹战斗界面倒计时(s)
};

View File

@@ -14,6 +14,7 @@ export interface DicGVGVestigeType {
}
export const dicGVGVestigeByType = new Map<number, DicGVGVestigeType[]>(); // 地图类型 => 遗迹id
export const dicGVGVestigeName = new Map<number, string>(); // 遗迹地图名
export function loadGVGVestigeType() {
dicGVGVestigeByType.clear();
@@ -26,6 +27,7 @@ export function loadGVGVestigeType() {
}
dicGVGVestigeByType.get(type)?.push(o);
}
dicGVGVestigeName.set(o.vestigeId, o.name);
});
arr = undefined;
}

View File

@@ -269,7 +269,7 @@
"id": 38,
"title": "&",
"sendName": "您忠诚的小跟班",
"content": "收",
"content": "亲爱的主公,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收",
"time": 720
}
]